lodash.js ➔ ... ➔ template   F
last analyzed

Complexity

Conditions 11
Paths 256

Size

Total Lines 107

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 11
nc 256
dl 0
loc 107
rs 3.8181
c 0
b 0
f 0
nop 3

2 Functions

Rating   Name   Duplication   Size   Complexity  
A lodash.js ➔ ... ➔ attempt 0 4 1
B lodash.js ➔ ... ➔ string.replace 0 24 4

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like lodash.js ➔ ... ➔ template often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/**
2
 * @license
3
 * Lodash <https://lodash.com/>
4
 * Copyright JS Foundation and other contributors <https://js.foundation/>
5
 * Released under MIT license <https://lodash.com/license>
6
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
7
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
8
 */
9
;(function() {
10
11
  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
12
  var undefined;
13
14
  /** Used as the semantic version number. */
15
  var VERSION = '4.17.4';
16
17
  /** Used as the size to enable large array optimizations. */
18
  var LARGE_ARRAY_SIZE = 200;
19
20
  /** Error message constants. */
21
  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
22
      FUNC_ERROR_TEXT = 'Expected a function';
23
24
  /** Used to stand-in for `undefined` hash values. */
25
  var HASH_UNDEFINED = '__lodash_hash_undefined__';
26
27
  /** Used as the maximum memoize cache size. */
28
  var MAX_MEMOIZE_SIZE = 500;
29
30
  /** Used as the internal argument placeholder. */
31
  var PLACEHOLDER = '__lodash_placeholder__';
32
33
  /** Used to compose bitmasks for cloning. */
34
  var CLONE_DEEP_FLAG = 1,
35
      CLONE_FLAT_FLAG = 2,
36
      CLONE_SYMBOLS_FLAG = 4;
37
38
  /** Used to compose bitmasks for value comparisons. */
39
  var COMPARE_PARTIAL_FLAG = 1,
40
      COMPARE_UNORDERED_FLAG = 2;
41
42
  /** Used to compose bitmasks for function metadata. */
43
  var WRAP_BIND_FLAG = 1,
44
      WRAP_BIND_KEY_FLAG = 2,
45
      WRAP_CURRY_BOUND_FLAG = 4,
46
      WRAP_CURRY_FLAG = 8,
47
      WRAP_CURRY_RIGHT_FLAG = 16,
48
      WRAP_PARTIAL_FLAG = 32,
49
      WRAP_PARTIAL_RIGHT_FLAG = 64,
50
      WRAP_ARY_FLAG = 128,
51
      WRAP_REARG_FLAG = 256,
52
      WRAP_FLIP_FLAG = 512;
53
54
  /** Used as default options for `_.truncate`. */
55
  var DEFAULT_TRUNC_LENGTH = 30,
56
      DEFAULT_TRUNC_OMISSION = '...';
57
58
  /** Used to detect hot functions by number of calls within a span of milliseconds. */
59
  var HOT_COUNT = 800,
60
      HOT_SPAN = 16;
61
62
  /** Used to indicate the type of lazy iteratees. */
63
  var LAZY_FILTER_FLAG = 1,
64
      LAZY_MAP_FLAG = 2,
65
      LAZY_WHILE_FLAG = 3;
66
67
  /** Used as references for various `Number` constants. */
68
  var INFINITY = 1 / 0,
69
      MAX_SAFE_INTEGER = 9007199254740991,
70
      MAX_INTEGER = 1.7976931348623157e+308,
71
      NAN = 0 / 0;
72
73
  /** Used as references for the maximum length and index of an array. */
74
  var MAX_ARRAY_LENGTH = 4294967295,
75
      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
76
      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
77
78
  /** Used to associate wrap methods with their bit flags. */
79
  var wrapFlags = [
80
    ['ary', WRAP_ARY_FLAG],
81
    ['bind', WRAP_BIND_FLAG],
82
    ['bindKey', WRAP_BIND_KEY_FLAG],
83
    ['curry', WRAP_CURRY_FLAG],
84
    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
85
    ['flip', WRAP_FLIP_FLAG],
86
    ['partial', WRAP_PARTIAL_FLAG],
87
    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
88
    ['rearg', WRAP_REARG_FLAG]
89
  ];
90
91
  /** `Object#toString` result references. */
92
  var argsTag = '[object Arguments]',
93
      arrayTag = '[object Array]',
94
      asyncTag = '[object AsyncFunction]',
95
      boolTag = '[object Boolean]',
96
      dateTag = '[object Date]',
97
      domExcTag = '[object DOMException]',
98
      errorTag = '[object Error]',
99
      funcTag = '[object Function]',
100
      genTag = '[object GeneratorFunction]',
101
      mapTag = '[object Map]',
102
      numberTag = '[object Number]',
103
      nullTag = '[object Null]',
104
      objectTag = '[object Object]',
105
      promiseTag = '[object Promise]',
106
      proxyTag = '[object Proxy]',
107
      regexpTag = '[object RegExp]',
108
      setTag = '[object Set]',
109
      stringTag = '[object String]',
110
      symbolTag = '[object Symbol]',
111
      undefinedTag = '[object Undefined]',
112
      weakMapTag = '[object WeakMap]',
113
      weakSetTag = '[object WeakSet]';
114
115
  var arrayBufferTag = '[object ArrayBuffer]',
116
      dataViewTag = '[object DataView]',
117
      float32Tag = '[object Float32Array]',
118
      float64Tag = '[object Float64Array]',
119
      int8Tag = '[object Int8Array]',
120
      int16Tag = '[object Int16Array]',
121
      int32Tag = '[object Int32Array]',
122
      uint8Tag = '[object Uint8Array]',
123
      uint8ClampedTag = '[object Uint8ClampedArray]',
124
      uint16Tag = '[object Uint16Array]',
125
      uint32Tag = '[object Uint32Array]';
126
127
  /** Used to match empty string literals in compiled template source. */
128
  var reEmptyStringLeading = /\b__p \+= '';/g,
129
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
130
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
131
132
  /** Used to match HTML entities and HTML characters. */
133
  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
134
      reUnescapedHtml = /[&<>"']/g,
135
      reHasEscapedHtml = RegExp(reEscapedHtml.source),
136
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
137
138
  /** Used to match template delimiters. */
139
  var reEscape = /<%-([\s\S]+?)%>/g,
140
      reEvaluate = /<%([\s\S]+?)%>/g,
141
      reInterpolate = /<%=([\s\S]+?)%>/g;
142
143
  /** Used to match property names within property paths. */
144
  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
145
      reIsPlainProp = /^\w*$/,
146
      reLeadingDot = /^\./,
147
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
148
149
  /**
150
   * Used to match `RegExp`
151
   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
152
   */
153
  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
154
      reHasRegExpChar = RegExp(reRegExpChar.source);
155
156
  /** Used to match leading and trailing whitespace. */
157
  var reTrim = /^\s+|\s+$/g,
158
      reTrimStart = /^\s+/,
159
      reTrimEnd = /\s+$/;
160
161
  /** Used to match wrap detail comments. */
162
  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
163
      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
164
      reSplitDetails = /,? & /;
165
166
  /** Used to match words composed of alphanumeric characters. */
167
  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
168
169
  /** Used to match backslashes in property paths. */
170
  var reEscapeChar = /\\(\\)?/g;
171
172
  /**
173
   * Used to match
174
   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
175
   */
176
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
177
178
  /** Used to match `RegExp` flags from their coerced string values. */
179
  var reFlags = /\w*$/;
180
181
  /** Used to detect bad signed hexadecimal string values. */
182
  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
183
184
  /** Used to detect binary string values. */
185
  var reIsBinary = /^0b[01]+$/i;
186
187
  /** Used to detect host constructors (Safari). */
188
  var reIsHostCtor = /^\[object .+?Constructor\]$/;
189
190
  /** Used to detect octal string values. */
191
  var reIsOctal = /^0o[0-7]+$/i;
192
193
  /** Used to detect unsigned integer values. */
194
  var reIsUint = /^(?:0|[1-9]\d*)$/;
195
196
  /** Used to match Latin Unicode letters (excluding mathematical operators). */
197
  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
198
199
  /** Used to ensure capturing order of template delimiters. */
200
  var reNoMatch = /($^)/;
201
202
  /** Used to match unescaped characters in compiled string literals. */
203
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
204
205
  /** Used to compose unicode character classes. */
206
  var rsAstralRange = '\\ud800-\\udfff',
207
      rsComboMarksRange = '\\u0300-\\u036f',
208
      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
209
      rsComboSymbolsRange = '\\u20d0-\\u20ff',
210
      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
211
      rsDingbatRange = '\\u2700-\\u27bf',
212
      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
213
      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
214
      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
215
      rsPunctuationRange = '\\u2000-\\u206f',
216
      rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
217
      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
218
      rsVarRange = '\\ufe0e\\ufe0f',
219
      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
220
221
  /** Used to compose unicode capture groups. */
222
  var rsApos = "['\u2019]",
223
      rsAstral = '[' + rsAstralRange + ']',
224
      rsBreak = '[' + rsBreakRange + ']',
225
      rsCombo = '[' + rsComboRange + ']',
226
      rsDigits = '\\d+',
227
      rsDingbat = '[' + rsDingbatRange + ']',
228
      rsLower = '[' + rsLowerRange + ']',
229
      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
230
      rsFitz = '\\ud83c[\\udffb-\\udfff]',
231
      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
232
      rsNonAstral = '[^' + rsAstralRange + ']',
233
      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
234
      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
235
      rsUpper = '[' + rsUpperRange + ']',
236
      rsZWJ = '\\u200d';
237
238
  /** Used to compose unicode regexes. */
239
  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
240
      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
241
      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
242
      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
243
      reOptMod = rsModifier + '?',
244
      rsOptVar = '[' + rsVarRange + ']?',
245
      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
246
      rsOrdLower = '\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)',
247
      rsOrdUpper = '\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)',
248
      rsSeq = rsOptVar + reOptMod + rsOptJoin,
249
      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
250
      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
251
252
  /** Used to match apostrophes. */
253
  var reApos = RegExp(rsApos, 'g');
254
255
  /**
256
   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
257
   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
258
   */
259
  var reComboMark = RegExp(rsCombo, 'g');
260
261
  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
262
  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
263
264
  /** Used to match complex or compound words. */
265
  var reUnicodeWord = RegExp([
266
    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
267
    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
268
    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
269
    rsUpper + '+' + rsOptContrUpper,
270
    rsOrdUpper,
271
    rsOrdLower,
272
    rsDigits,
273
    rsEmoji
274
  ].join('|'), 'g');
275
276
  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
277
  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
278
279
  /** Used to detect strings that need a more robust regexp to match words. */
280
  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
281
282
  /** Used to assign default `context` object properties. */
283
  var contextProps = [
284
    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
285
    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
286
    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
287
    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
288
    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
289
  ];
290
291
  /** Used to make template sourceURLs easier to identify. */
292
  var templateCounter = -1;
293
294
  /** Used to identify `toStringTag` values of typed arrays. */
295
  var typedArrayTags = {};
296
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
297
  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
298
  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
299
  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
300
  typedArrayTags[uint32Tag] = true;
301
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
302
  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
303
  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
304
  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
305
  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
306
  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
307
  typedArrayTags[setTag] = typedArrayTags[stringTag] =
308
  typedArrayTags[weakMapTag] = false;
309
310
  /** Used to identify `toStringTag` values supported by `_.clone`. */
311
  var cloneableTags = {};
312
  cloneableTags[argsTag] = cloneableTags[arrayTag] =
313
  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
314
  cloneableTags[boolTag] = cloneableTags[dateTag] =
315
  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
316
  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
317
  cloneableTags[int32Tag] = cloneableTags[mapTag] =
318
  cloneableTags[numberTag] = cloneableTags[objectTag] =
319
  cloneableTags[regexpTag] = cloneableTags[setTag] =
320
  cloneableTags[stringTag] = cloneableTags[symbolTag] =
321
  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
322
  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
323
  cloneableTags[errorTag] = cloneableTags[funcTag] =
324
  cloneableTags[weakMapTag] = false;
325
326
  /** Used to map Latin Unicode letters to basic Latin letters. */
327
  var deburredLetters = {
328
    // Latin-1 Supplement block.
329
    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
330
    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
331
    '\xc7': 'C',  '\xe7': 'c',
332
    '\xd0': 'D',  '\xf0': 'd',
333
    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
334
    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
335
    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
336
    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
337
    '\xd1': 'N',  '\xf1': 'n',
338
    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
339
    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
340
    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
341
    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
342
    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
343
    '\xc6': 'Ae', '\xe6': 'ae',
344
    '\xde': 'Th', '\xfe': 'th',
345
    '\xdf': 'ss',
346
    // Latin Extended-A block.
347
    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
348
    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
349
    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
350
    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
351
    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
352
    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
353
    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
354
    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
355
    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
356
    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
357
    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
358
    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
359
    '\u0134': 'J',  '\u0135': 'j',
360
    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
361
    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
362
    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
363
    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
364
    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
365
    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
366
    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
367
    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
368
    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
369
    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
370
    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
371
    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
372
    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
373
    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
374
    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
375
    '\u0174': 'W',  '\u0175': 'w',
376
    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
377
    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
378
    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
379
    '\u0132': 'IJ', '\u0133': 'ij',
380
    '\u0152': 'Oe', '\u0153': 'oe',
381
    '\u0149': "'n", '\u017f': 's'
382
  };
383
384
  /** Used to map characters to HTML entities. */
385
  var htmlEscapes = {
386
    '&': '&amp;',
387
    '<': '&lt;',
388
    '>': '&gt;',
389
    '"': '&quot;',
390
    "'": '&#39;'
391
  };
392
393
  /** Used to map HTML entities to characters. */
394
  var htmlUnescapes = {
395
    '&amp;': '&',
396
    '&lt;': '<',
397
    '&gt;': '>',
398
    '&quot;': '"',
399
    '&#39;': "'"
400
  };
401
402
  /** Used to escape characters for inclusion in compiled string literals. */
403
  var stringEscapes = {
404
    '\\': '\\',
405
    "'": "'",
406
    '\n': 'n',
407
    '\r': 'r',
408
    '\u2028': 'u2028',
409
    '\u2029': 'u2029'
410
  };
411
412
  /** Built-in method references without a dependency on `root`. */
413
  var freeParseFloat = parseFloat,
414
      freeParseInt = parseInt;
415
416
  /** Detect free variable `global` from Node.js. */
417
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
418
419
  /** Detect free variable `self`. */
420
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
0 ignored issues
show
Best Practice introduced by
If you intend to check if the variable self is declared in the current environment, consider using typeof self === "undefined" instead. This is safe if the variable is not actually declared.
Loading history...
421
422
  /** Used as a reference to the global object. */
423
  var root = freeGlobal || freeSelf || Function('return this')();
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
424
425
  /** Detect free variable `exports`. */
426
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
427
428
  /** Detect free variable `module`. */
429
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
430
431
  /** Detect the popular CommonJS extension `module.exports`. */
432
  var moduleExports = freeModule && freeModule.exports === freeExports;
433
434
  /** Detect free variable `process` from Node.js. */
435
  var freeProcess = moduleExports && freeGlobal.process;
436
437
  /** Used to access faster Node.js helpers. */
438
  var nodeUtil = (function() {
439
    try {
440
      return freeProcess && freeProcess.binding && freeProcess.binding('util');
441
    } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
442
  }());
443
444
  /* Node.js helper references. */
445
  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
446
      nodeIsDate = nodeUtil && nodeUtil.isDate,
447
      nodeIsMap = nodeUtil && nodeUtil.isMap,
448
      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
449
      nodeIsSet = nodeUtil && nodeUtil.isSet,
450
      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
451
452
  /*--------------------------------------------------------------------------*/
453
454
  /**
455
   * Adds the key-value `pair` to `map`.
456
   *
457
   * @private
458
   * @param {Object} map The map to modify.
459
   * @param {Array} pair The key-value pair to add.
460
   * @returns {Object} Returns `map`.
461
   */
462
  function addMapEntry(map, pair) {
463
    // Don't return `map.set` because it's not chainable in IE 11.
464
    map.set(pair[0], pair[1]);
465
    return map;
466
  }
467
468
  /**
469
   * Adds `value` to `set`.
470
   *
471
   * @private
472
   * @param {Object} set The set to modify.
473
   * @param {*} value The value to add.
474
   * @returns {Object} Returns `set`.
475
   */
476
  function addSetEntry(set, value) {
477
    // Don't return `set.add` because it's not chainable in IE 11.
478
    set.add(value);
479
    return set;
480
  }
481
482
  /**
483
   * A faster alternative to `Function#apply`, this function invokes `func`
484
   * with the `this` binding of `thisArg` and the arguments of `args`.
485
   *
486
   * @private
487
   * @param {Function} func The function to invoke.
488
   * @param {*} thisArg The `this` binding of `func`.
489
   * @param {Array} args The arguments to invoke `func` with.
490
   * @returns {*} Returns the result of `func`.
491
   */
492
  function apply(func, thisArg, args) {
493
    switch (args.length) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
494
      case 0: return func.call(thisArg);
495
      case 1: return func.call(thisArg, args[0]);
496
      case 2: return func.call(thisArg, args[0], args[1]);
497
      case 3: return func.call(thisArg, args[0], args[1], args[2]);
498
    }
499
    return func.apply(thisArg, args);
500
  }
501
502
  /**
503
   * A specialized version of `baseAggregator` for arrays.
504
   *
505
   * @private
506
   * @param {Array} [array] The array to iterate over.
507
   * @param {Function} setter The function to set `accumulator` values.
508
   * @param {Function} iteratee The iteratee to transform keys.
509
   * @param {Object} accumulator The initial aggregated object.
510
   * @returns {Function} Returns `accumulator`.
511
   */
512
  function arrayAggregator(array, setter, iteratee, accumulator) {
513
    var index = -1,
514
        length = array == null ? 0 : array.length;
515
516
    while (++index < length) {
517
      var value = array[index];
518
      setter(accumulator, value, iteratee(value), array);
519
    }
520
    return accumulator;
521
  }
522
523
  /**
524
   * A specialized version of `_.forEach` for arrays without support for
525
   * iteratee shorthands.
526
   *
527
   * @private
528
   * @param {Array} [array] The array to iterate over.
529
   * @param {Function} iteratee The function invoked per iteration.
530
   * @returns {Array} Returns `array`.
531
   */
532
  function arrayEach(array, iteratee) {
533
    var index = -1,
534
        length = array == null ? 0 : array.length;
535
536
    while (++index < length) {
537
      if (iteratee(array[index], index, array) === false) {
538
        break;
539
      }
540
    }
541
    return array;
542
  }
543
544
  /**
545
   * A specialized version of `_.forEachRight` for arrays without support for
546
   * iteratee shorthands.
547
   *
548
   * @private
549
   * @param {Array} [array] The array to iterate over.
550
   * @param {Function} iteratee The function invoked per iteration.
551
   * @returns {Array} Returns `array`.
552
   */
553
  function arrayEachRight(array, iteratee) {
554
    var length = array == null ? 0 : array.length;
555
556
    while (length--) {
557
      if (iteratee(array[length], length, array) === false) {
558
        break;
559
      }
560
    }
561
    return array;
562
  }
563
564
  /**
565
   * A specialized version of `_.every` for arrays without support for
566
   * iteratee shorthands.
567
   *
568
   * @private
569
   * @param {Array} [array] The array to iterate over.
570
   * @param {Function} predicate The function invoked per iteration.
571
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
572
   *  else `false`.
573
   */
574
  function arrayEvery(array, predicate) {
575
    var index = -1,
576
        length = array == null ? 0 : array.length;
577
578
    while (++index < length) {
579
      if (!predicate(array[index], index, array)) {
580
        return false;
581
      }
582
    }
583
    return true;
584
  }
585
586
  /**
587
   * A specialized version of `_.filter` for arrays without support for
588
   * iteratee shorthands.
589
   *
590
   * @private
591
   * @param {Array} [array] The array to iterate over.
592
   * @param {Function} predicate The function invoked per iteration.
593
   * @returns {Array} Returns the new filtered array.
594
   */
595
  function arrayFilter(array, predicate) {
596
    var index = -1,
597
        length = array == null ? 0 : array.length,
598
        resIndex = 0,
599
        result = [];
600
601
    while (++index < length) {
602
      var value = array[index];
603
      if (predicate(value, index, array)) {
604
        result[resIndex++] = value;
605
      }
606
    }
607
    return result;
608
  }
609
610
  /**
611
   * A specialized version of `_.includes` for arrays without support for
612
   * specifying an index to search from.
613
   *
614
   * @private
615
   * @param {Array} [array] The array to inspect.
616
   * @param {*} target The value to search for.
617
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
618
   */
619
  function arrayIncludes(array, value) {
620
    var length = array == null ? 0 : array.length;
621
    return !!length && baseIndexOf(array, value, 0) > -1;
622
  }
623
624
  /**
625
   * This function is like `arrayIncludes` except that it accepts a comparator.
626
   *
627
   * @private
628
   * @param {Array} [array] The array to inspect.
629
   * @param {*} target The value to search for.
630
   * @param {Function} comparator The comparator invoked per element.
631
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
632
   */
633
  function arrayIncludesWith(array, value, comparator) {
634
    var index = -1,
635
        length = array == null ? 0 : array.length;
636
637
    while (++index < length) {
638
      if (comparator(value, array[index])) {
639
        return true;
640
      }
641
    }
642
    return false;
643
  }
644
645
  /**
646
   * A specialized version of `_.map` for arrays without support for iteratee
647
   * shorthands.
648
   *
649
   * @private
650
   * @param {Array} [array] The array to iterate over.
651
   * @param {Function} iteratee The function invoked per iteration.
652
   * @returns {Array} Returns the new mapped array.
653
   */
654
  function arrayMap(array, iteratee) {
655
    var index = -1,
656
        length = array == null ? 0 : array.length,
657
        result = Array(length);
658
659
    while (++index < length) {
660
      result[index] = iteratee(array[index], index, array);
661
    }
662
    return result;
663
  }
664
665
  /**
666
   * Appends the elements of `values` to `array`.
667
   *
668
   * @private
669
   * @param {Array} array The array to modify.
670
   * @param {Array} values The values to append.
671
   * @returns {Array} Returns `array`.
672
   */
673
  function arrayPush(array, values) {
674
    var index = -1,
675
        length = values.length,
676
        offset = array.length;
677
678
    while (++index < length) {
679
      array[offset + index] = values[index];
680
    }
681
    return array;
682
  }
683
684
  /**
685
   * A specialized version of `_.reduce` for arrays without support for
686
   * iteratee shorthands.
687
   *
688
   * @private
689
   * @param {Array} [array] The array to iterate over.
690
   * @param {Function} iteratee The function invoked per iteration.
691
   * @param {*} [accumulator] The initial value.
692
   * @param {boolean} [initAccum] Specify using the first element of `array` as
693
   *  the initial value.
694
   * @returns {*} Returns the accumulated value.
695
   */
696
  function arrayReduce(array, iteratee, accumulator, initAccum) {
697
    var index = -1,
698
        length = array == null ? 0 : array.length;
699
700
    if (initAccum && length) {
701
      accumulator = array[++index];
702
    }
703
    while (++index < length) {
704
      accumulator = iteratee(accumulator, array[index], index, array);
705
    }
706
    return accumulator;
707
  }
708
709
  /**
710
   * A specialized version of `_.reduceRight` for arrays without support for
711
   * iteratee shorthands.
712
   *
713
   * @private
714
   * @param {Array} [array] The array to iterate over.
715
   * @param {Function} iteratee The function invoked per iteration.
716
   * @param {*} [accumulator] The initial value.
717
   * @param {boolean} [initAccum] Specify using the last element of `array` as
718
   *  the initial value.
719
   * @returns {*} Returns the accumulated value.
720
   */
721
  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
722
    var length = array == null ? 0 : array.length;
723
    if (initAccum && length) {
724
      accumulator = array[--length];
725
    }
726
    while (length--) {
727
      accumulator = iteratee(accumulator, array[length], length, array);
728
    }
729
    return accumulator;
730
  }
731
732
  /**
733
   * A specialized version of `_.some` for arrays without support for iteratee
734
   * shorthands.
735
   *
736
   * @private
737
   * @param {Array} [array] The array to iterate over.
738
   * @param {Function} predicate The function invoked per iteration.
739
   * @returns {boolean} Returns `true` if any element passes the predicate check,
740
   *  else `false`.
741
   */
742
  function arraySome(array, predicate) {
743
    var index = -1,
744
        length = array == null ? 0 : array.length;
745
746
    while (++index < length) {
747
      if (predicate(array[index], index, array)) {
748
        return true;
749
      }
750
    }
751
    return false;
752
  }
753
754
  /**
755
   * Gets the size of an ASCII `string`.
756
   *
757
   * @private
758
   * @param {string} string The string inspect.
759
   * @returns {number} Returns the string size.
760
   */
761
  var asciiSize = baseProperty('length');
762
763
  /**
764
   * Converts an ASCII `string` to an array.
765
   *
766
   * @private
767
   * @param {string} string The string to convert.
768
   * @returns {Array} Returns the converted array.
769
   */
770
  function asciiToArray(string) {
771
    return string.split('');
772
  }
773
774
  /**
775
   * Splits an ASCII `string` into an array of its words.
776
   *
777
   * @private
778
   * @param {string} The string to inspect.
779
   * @returns {Array} Returns the words of `string`.
780
   */
781
  function asciiWords(string) {
782
    return string.match(reAsciiWord) || [];
783
  }
784
785
  /**
786
   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
787
   * without support for iteratee shorthands, which iterates over `collection`
788
   * using `eachFunc`.
789
   *
790
   * @private
791
   * @param {Array|Object} collection The collection to inspect.
792
   * @param {Function} predicate The function invoked per iteration.
793
   * @param {Function} eachFunc The function to iterate over `collection`.
794
   * @returns {*} Returns the found element or its key, else `undefined`.
795
   */
796
  function baseFindKey(collection, predicate, eachFunc) {
797
    var result;
798
    eachFunc(collection, function(value, key, collection) {
799
      if (predicate(value, key, collection)) {
800
        result = key;
801
        return false;
802
      }
803
    });
804
    return result;
805
  }
806
807
  /**
808
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
809
   * support for iteratee shorthands.
810
   *
811
   * @private
812
   * @param {Array} array The array to inspect.
813
   * @param {Function} predicate The function invoked per iteration.
814
   * @param {number} fromIndex The index to search from.
815
   * @param {boolean} [fromRight] Specify iterating from right to left.
816
   * @returns {number} Returns the index of the matched value, else `-1`.
817
   */
818
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
819
    var length = array.length,
820
        index = fromIndex + (fromRight ? 1 : -1);
821
822
    while ((fromRight ? index-- : ++index < length)) {
823
      if (predicate(array[index], index, array)) {
824
        return index;
825
      }
826
    }
827
    return -1;
828
  }
829
830
  /**
831
   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
832
   *
833
   * @private
834
   * @param {Array} array The array to inspect.
835
   * @param {*} value The value to search for.
836
   * @param {number} fromIndex The index to search from.
837
   * @returns {number} Returns the index of the matched value, else `-1`.
838
   */
839
  function baseIndexOf(array, value, fromIndex) {
840
    return value === value
841
      ? strictIndexOf(array, value, fromIndex)
842
      : baseFindIndex(array, baseIsNaN, fromIndex);
843
  }
844
845
  /**
846
   * This function is like `baseIndexOf` except that it accepts a comparator.
847
   *
848
   * @private
849
   * @param {Array} array The array to inspect.
850
   * @param {*} value The value to search for.
851
   * @param {number} fromIndex The index to search from.
852
   * @param {Function} comparator The comparator invoked per element.
853
   * @returns {number} Returns the index of the matched value, else `-1`.
854
   */
855
  function baseIndexOfWith(array, value, fromIndex, comparator) {
856
    var index = fromIndex - 1,
857
        length = array.length;
858
859
    while (++index < length) {
860
      if (comparator(array[index], value)) {
861
        return index;
862
      }
863
    }
864
    return -1;
865
  }
866
867
  /**
868
   * The base implementation of `_.isNaN` without support for number objects.
869
   *
870
   * @private
871
   * @param {*} value The value to check.
872
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
873
   */
874
  function baseIsNaN(value) {
875
    return value !== value;
876
  }
877
878
  /**
879
   * The base implementation of `_.mean` and `_.meanBy` without support for
880
   * iteratee shorthands.
881
   *
882
   * @private
883
   * @param {Array} array The array to iterate over.
884
   * @param {Function} iteratee The function invoked per iteration.
885
   * @returns {number} Returns the mean.
886
   */
887
  function baseMean(array, iteratee) {
888
    var length = array == null ? 0 : array.length;
889
    return length ? (baseSum(array, iteratee) / length) : NAN;
890
  }
891
892
  /**
893
   * The base implementation of `_.property` without support for deep paths.
894
   *
895
   * @private
896
   * @param {string} key The key of the property to get.
897
   * @returns {Function} Returns the new accessor function.
898
   */
899
  function baseProperty(key) {
900
    return function(object) {
901
      return object == null ? undefined : object[key];
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
902
    };
903
  }
904
905
  /**
906
   * The base implementation of `_.propertyOf` without support for deep paths.
907
   *
908
   * @private
909
   * @param {Object} object The object to query.
910
   * @returns {Function} Returns the new accessor function.
911
   */
912
  function basePropertyOf(object) {
913
    return function(key) {
914
      return object == null ? undefined : object[key];
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
915
    };
916
  }
917
918
  /**
919
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
920
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
921
   *
922
   * @private
923
   * @param {Array|Object} collection The collection to iterate over.
924
   * @param {Function} iteratee The function invoked per iteration.
925
   * @param {*} accumulator The initial value.
926
   * @param {boolean} initAccum Specify using the first or last element of
927
   *  `collection` as the initial value.
928
   * @param {Function} eachFunc The function to iterate over `collection`.
929
   * @returns {*} Returns the accumulated value.
930
   */
931
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
932
    eachFunc(collection, function(value, index, collection) {
933
      accumulator = initAccum
934
        ? (initAccum = false, value)
935
        : iteratee(accumulator, value, index, collection);
936
    });
937
    return accumulator;
938
  }
939
940
  /**
941
   * The base implementation of `_.sortBy` which uses `comparer` to define the
942
   * sort order of `array` and replaces criteria objects with their corresponding
943
   * values.
944
   *
945
   * @private
946
   * @param {Array} array The array to sort.
947
   * @param {Function} comparer The function to define sort order.
948
   * @returns {Array} Returns `array`.
949
   */
950
  function baseSortBy(array, comparer) {
951
    var length = array.length;
952
953
    array.sort(comparer);
954
    while (length--) {
955
      array[length] = array[length].value;
956
    }
957
    return array;
958
  }
959
960
  /**
961
   * The base implementation of `_.sum` and `_.sumBy` without support for
962
   * iteratee shorthands.
963
   *
964
   * @private
965
   * @param {Array} array The array to iterate over.
966
   * @param {Function} iteratee The function invoked per iteration.
967
   * @returns {number} Returns the sum.
968
   */
969
  function baseSum(array, iteratee) {
970
    var result,
971
        index = -1,
972
        length = array.length;
973
974
    while (++index < length) {
975
      var current = iteratee(array[index]);
976
      if (current !== undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
977
        result = result === undefined ? current : (result + current);
0 ignored issues
show
Bug introduced by
The variable result seems to not be initialized for all possible execution paths.
Loading history...
978
      }
979
    }
980
    return result;
981
  }
982
983
  /**
984
   * The base implementation of `_.times` without support for iteratee shorthands
985
   * or max array length checks.
986
   *
987
   * @private
988
   * @param {number} n The number of times to invoke `iteratee`.
989
   * @param {Function} iteratee The function invoked per iteration.
990
   * @returns {Array} Returns the array of results.
991
   */
992
  function baseTimes(n, iteratee) {
993
    var index = -1,
994
        result = Array(n);
995
996
    while (++index < n) {
997
      result[index] = iteratee(index);
998
    }
999
    return result;
1000
  }
1001
1002
  /**
1003
   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
1004
   * of key-value pairs for `object` corresponding to the property names of `props`.
1005
   *
1006
   * @private
1007
   * @param {Object} object The object to query.
1008
   * @param {Array} props The property names to get values for.
1009
   * @returns {Object} Returns the key-value pairs.
1010
   */
1011
  function baseToPairs(object, props) {
1012
    return arrayMap(props, function(key) {
1013
      return [key, object[key]];
1014
    });
1015
  }
1016
1017
  /**
1018
   * The base implementation of `_.unary` without support for storing metadata.
1019
   *
1020
   * @private
1021
   * @param {Function} func The function to cap arguments for.
1022
   * @returns {Function} Returns the new capped function.
1023
   */
1024
  function baseUnary(func) {
1025
    return function(value) {
1026
      return func(value);
1027
    };
1028
  }
1029
1030
  /**
1031
   * The base implementation of `_.values` and `_.valuesIn` which creates an
1032
   * array of `object` property values corresponding to the property names
1033
   * of `props`.
1034
   *
1035
   * @private
1036
   * @param {Object} object The object to query.
1037
   * @param {Array} props The property names to get values for.
1038
   * @returns {Object} Returns the array of property values.
1039
   */
1040
  function baseValues(object, props) {
1041
    return arrayMap(props, function(key) {
1042
      return object[key];
1043
    });
1044
  }
1045
1046
  /**
1047
   * Checks if a `cache` value for `key` exists.
1048
   *
1049
   * @private
1050
   * @param {Object} cache The cache to query.
1051
   * @param {string} key The key of the entry to check.
1052
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
1053
   */
1054
  function cacheHas(cache, key) {
1055
    return cache.has(key);
1056
  }
1057
1058
  /**
1059
   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
1060
   * that is not found in the character symbols.
1061
   *
1062
   * @private
1063
   * @param {Array} strSymbols The string symbols to inspect.
1064
   * @param {Array} chrSymbols The character symbols to find.
1065
   * @returns {number} Returns the index of the first unmatched string symbol.
1066
   */
1067
  function charsStartIndex(strSymbols, chrSymbols) {
1068
    var index = -1,
1069
        length = strSymbols.length;
1070
1071
    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
1072
    return index;
1073
  }
1074
1075
  /**
1076
   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
1077
   * that is not found in the character symbols.
1078
   *
1079
   * @private
1080
   * @param {Array} strSymbols The string symbols to inspect.
1081
   * @param {Array} chrSymbols The character symbols to find.
1082
   * @returns {number} Returns the index of the last unmatched string symbol.
1083
   */
1084
  function charsEndIndex(strSymbols, chrSymbols) {
1085
    var index = strSymbols.length;
1086
1087
    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
1088
    return index;
1089
  }
1090
1091
  /**
1092
   * Gets the number of `placeholder` occurrences in `array`.
1093
   *
1094
   * @private
1095
   * @param {Array} array The array to inspect.
1096
   * @param {*} placeholder The placeholder to search for.
1097
   * @returns {number} Returns the placeholder count.
1098
   */
1099
  function countHolders(array, placeholder) {
1100
    var length = array.length,
1101
        result = 0;
1102
1103
    while (length--) {
1104
      if (array[length] === placeholder) {
1105
        ++result;
1106
      }
1107
    }
1108
    return result;
1109
  }
1110
1111
  /**
1112
   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
1113
   * letters to basic Latin letters.
1114
   *
1115
   * @private
1116
   * @param {string} letter The matched letter to deburr.
1117
   * @returns {string} Returns the deburred letter.
1118
   */
1119
  var deburrLetter = basePropertyOf(deburredLetters);
1120
1121
  /**
1122
   * Used by `_.escape` to convert characters to HTML entities.
1123
   *
1124
   * @private
1125
   * @param {string} chr The matched character to escape.
1126
   * @returns {string} Returns the escaped character.
1127
   */
1128
  var escapeHtmlChar = basePropertyOf(htmlEscapes);
1129
1130
  /**
1131
   * Used by `_.template` to escape characters for inclusion in compiled string literals.
1132
   *
1133
   * @private
1134
   * @param {string} chr The matched character to escape.
1135
   * @returns {string} Returns the escaped character.
1136
   */
1137
  function escapeStringChar(chr) {
1138
    return '\\' + stringEscapes[chr];
1139
  }
1140
1141
  /**
1142
   * Gets the value at `key` of `object`.
1143
   *
1144
   * @private
1145
   * @param {Object} [object] The object to query.
1146
   * @param {string} key The key of the property to get.
1147
   * @returns {*} Returns the property value.
1148
   */
1149
  function getValue(object, key) {
1150
    return object == null ? undefined : object[key];
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1151
  }
1152
1153
  /**
1154
   * Checks if `string` contains Unicode symbols.
1155
   *
1156
   * @private
1157
   * @param {string} string The string to inspect.
1158
   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
1159
   */
1160
  function hasUnicode(string) {
1161
    return reHasUnicode.test(string);
1162
  }
1163
1164
  /**
1165
   * Checks if `string` contains a word composed of Unicode symbols.
1166
   *
1167
   * @private
1168
   * @param {string} string The string to inspect.
1169
   * @returns {boolean} Returns `true` if a word is found, else `false`.
1170
   */
1171
  function hasUnicodeWord(string) {
1172
    return reHasUnicodeWord.test(string);
1173
  }
1174
1175
  /**
1176
   * Converts `iterator` to an array.
1177
   *
1178
   * @private
1179
   * @param {Object} iterator The iterator to convert.
1180
   * @returns {Array} Returns the converted array.
1181
   */
1182
  function iteratorToArray(iterator) {
1183
    var data,
1184
        result = [];
1185
1186
    while (!(data = iterator.next()).done) {
1187
      result.push(data.value);
1188
    }
1189
    return result;
1190
  }
1191
1192
  /**
1193
   * Converts `map` to its key-value pairs.
1194
   *
1195
   * @private
1196
   * @param {Object} map The map to convert.
1197
   * @returns {Array} Returns the key-value pairs.
1198
   */
1199
  function mapToArray(map) {
1200
    var index = -1,
1201
        result = Array(map.size);
1202
1203
    map.forEach(function(value, key) {
1204
      result[++index] = [key, value];
1205
    });
1206
    return result;
1207
  }
1208
1209
  /**
1210
   * Creates a unary function that invokes `func` with its argument transformed.
1211
   *
1212
   * @private
1213
   * @param {Function} func The function to wrap.
1214
   * @param {Function} transform The argument transform.
1215
   * @returns {Function} Returns the new function.
1216
   */
1217
  function overArg(func, transform) {
1218
    return function(arg) {
1219
      return func(transform(arg));
1220
    };
1221
  }
1222
1223
  /**
1224
   * Replaces all `placeholder` elements in `array` with an internal placeholder
1225
   * and returns an array of their indexes.
1226
   *
1227
   * @private
1228
   * @param {Array} array The array to modify.
1229
   * @param {*} placeholder The placeholder to replace.
1230
   * @returns {Array} Returns the new array of placeholder indexes.
1231
   */
1232
  function replaceHolders(array, placeholder) {
1233
    var index = -1,
1234
        length = array.length,
1235
        resIndex = 0,
1236
        result = [];
1237
1238
    while (++index < length) {
1239
      var value = array[index];
1240
      if (value === placeholder || value === PLACEHOLDER) {
1241
        array[index] = PLACEHOLDER;
1242
        result[resIndex++] = index;
1243
      }
1244
    }
1245
    return result;
1246
  }
1247
1248
  /**
1249
   * Converts `set` to an array of its values.
1250
   *
1251
   * @private
1252
   * @param {Object} set The set to convert.
1253
   * @returns {Array} Returns the values.
1254
   */
1255
  function setToArray(set) {
1256
    var index = -1,
1257
        result = Array(set.size);
1258
1259
    set.forEach(function(value) {
1260
      result[++index] = value;
1261
    });
1262
    return result;
1263
  }
1264
1265
  /**
1266
   * Converts `set` to its value-value pairs.
1267
   *
1268
   * @private
1269
   * @param {Object} set The set to convert.
1270
   * @returns {Array} Returns the value-value pairs.
1271
   */
1272
  function setToPairs(set) {
1273
    var index = -1,
1274
        result = Array(set.size);
1275
1276
    set.forEach(function(value) {
1277
      result[++index] = [value, value];
1278
    });
1279
    return result;
1280
  }
1281
1282
  /**
1283
   * A specialized version of `_.indexOf` which performs strict equality
1284
   * comparisons of values, i.e. `===`.
1285
   *
1286
   * @private
1287
   * @param {Array} array The array to inspect.
1288
   * @param {*} value The value to search for.
1289
   * @param {number} fromIndex The index to search from.
1290
   * @returns {number} Returns the index of the matched value, else `-1`.
1291
   */
1292
  function strictIndexOf(array, value, fromIndex) {
1293
    var index = fromIndex - 1,
1294
        length = array.length;
1295
1296
    while (++index < length) {
1297
      if (array[index] === value) {
1298
        return index;
1299
      }
1300
    }
1301
    return -1;
1302
  }
1303
1304
  /**
1305
   * A specialized version of `_.lastIndexOf` which performs strict equality
1306
   * comparisons of values, i.e. `===`.
1307
   *
1308
   * @private
1309
   * @param {Array} array The array to inspect.
1310
   * @param {*} value The value to search for.
1311
   * @param {number} fromIndex The index to search from.
1312
   * @returns {number} Returns the index of the matched value, else `-1`.
1313
   */
1314
  function strictLastIndexOf(array, value, fromIndex) {
1315
    var index = fromIndex + 1;
1316
    while (index--) {
1317
      if (array[index] === value) {
1318
        return index;
1319
      }
1320
    }
1321
    return index;
1322
  }
1323
1324
  /**
1325
   * Gets the number of symbols in `string`.
1326
   *
1327
   * @private
1328
   * @param {string} string The string to inspect.
1329
   * @returns {number} Returns the string size.
1330
   */
1331
  function stringSize(string) {
1332
    return hasUnicode(string)
1333
      ? unicodeSize(string)
1334
      : asciiSize(string);
1335
  }
1336
1337
  /**
1338
   * Converts `string` to an array.
1339
   *
1340
   * @private
1341
   * @param {string} string The string to convert.
1342
   * @returns {Array} Returns the converted array.
1343
   */
1344
  function stringToArray(string) {
1345
    return hasUnicode(string)
1346
      ? unicodeToArray(string)
1347
      : asciiToArray(string);
1348
  }
1349
1350
  /**
1351
   * Used by `_.unescape` to convert HTML entities to characters.
1352
   *
1353
   * @private
1354
   * @param {string} chr The matched character to unescape.
1355
   * @returns {string} Returns the unescaped character.
1356
   */
1357
  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
1358
1359
  /**
1360
   * Gets the size of a Unicode `string`.
1361
   *
1362
   * @private
1363
   * @param {string} string The string inspect.
1364
   * @returns {number} Returns the string size.
1365
   */
1366
  function unicodeSize(string) {
1367
    var result = reUnicode.lastIndex = 0;
1368
    while (reUnicode.test(string)) {
1369
      ++result;
1370
    }
1371
    return result;
1372
  }
1373
1374
  /**
1375
   * Converts a Unicode `string` to an array.
1376
   *
1377
   * @private
1378
   * @param {string} string The string to convert.
1379
   * @returns {Array} Returns the converted array.
1380
   */
1381
  function unicodeToArray(string) {
1382
    return string.match(reUnicode) || [];
1383
  }
1384
1385
  /**
1386
   * Splits a Unicode `string` into an array of its words.
1387
   *
1388
   * @private
1389
   * @param {string} The string to inspect.
1390
   * @returns {Array} Returns the words of `string`.
1391
   */
1392
  function unicodeWords(string) {
1393
    return string.match(reUnicodeWord) || [];
1394
  }
1395
1396
  /*--------------------------------------------------------------------------*/
1397
1398
  /**
1399
   * Create a new pristine `lodash` function using the `context` object.
1400
   *
1401
   * @static
1402
   * @memberOf _
1403
   * @since 1.1.0
1404
   * @category Util
1405
   * @param {Object} [context=root] The context object.
1406
   * @returns {Function} Returns a new `lodash` function.
1407
   * @example
1408
   *
1409
   * _.mixin({ 'foo': _.constant('foo') });
1410
   *
1411
   * var lodash = _.runInContext();
1412
   * lodash.mixin({ 'bar': lodash.constant('bar') });
1413
   *
1414
   * _.isFunction(_.foo);
1415
   * // => true
1416
   * _.isFunction(_.bar);
1417
   * // => false
1418
   *
1419
   * lodash.isFunction(lodash.foo);
1420
   * // => false
1421
   * lodash.isFunction(lodash.bar);
1422
   * // => true
1423
   *
1424
   * // Create a suped-up `defer` in Node.js.
1425
   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
1426
   */
1427
  var runInContext = (function runInContext(context) {
1428
    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
1429
1430
    /** Built-in constructor references. */
1431
    var Array = context.Array,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Array. This makes code hard to read, consider using a different name.
Loading history...
1432
        Date = context.Date,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Date. This makes code hard to read, consider using a different name.
Loading history...
1433
        Error = context.Error,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Error. This makes code hard to read, consider using a different name.
Loading history...
1434
        Function = context.Function,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Function. This makes code hard to read, consider using a different name.
Loading history...
1435
        Math = context.Math,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Math. This makes code hard to read, consider using a different name.
Loading history...
1436
        Object = context.Object,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Object. This makes code hard to read, consider using a different name.
Loading history...
1437
        RegExp = context.RegExp,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type RegExp. This makes code hard to read, consider using a different name.
Loading history...
1438
        String = context.String,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type String. This makes code hard to read, consider using a different name.
Loading history...
1439
        TypeError = context.TypeError;
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type TypeError. This makes code hard to read, consider using a different name.
Loading history...
1440
1441
    /** Used for built-in method references. */
1442
    var arrayProto = Array.prototype,
1443
        funcProto = Function.prototype,
1444
        objectProto = Object.prototype;
1445
1446
    /** Used to detect overreaching core-js shims. */
1447
    var coreJsData = context['__core-js_shared__'];
1448
1449
    /** Used to resolve the decompiled source of functions. */
1450
    var funcToString = funcProto.toString;
1451
1452
    /** Used to check objects for own properties. */
1453
    var hasOwnProperty = objectProto.hasOwnProperty;
1454
1455
    /** Used to generate unique IDs. */
1456
    var idCounter = 0;
1457
1458
    /** Used to detect methods masquerading as native. */
1459
    var maskSrcKey = (function() {
1460
      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
1461
      return uid ? ('Symbol(src)_1.' + uid) : '';
1462
    }());
1463
1464
    /**
1465
     * Used to resolve the
1466
     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
1467
     * of values.
1468
     */
1469
    var nativeObjectToString = objectProto.toString;
1470
1471
    /** Used to infer the `Object` constructor. */
1472
    var objectCtorString = funcToString.call(Object);
1473
1474
    /** Used to restore the original `_` reference in `_.noConflict`. */
1475
    var oldDash = root._;
1476
1477
    /** Used to detect if a method is native. */
1478
    var reIsNative = RegExp('^' +
1479
      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
1480
      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
1481
    );
1482
1483
    /** Built-in value references. */
1484
    var Buffer = moduleExports ? context.Buffer : undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1485
        Symbol = context.Symbol,
1486
        Uint8Array = context.Uint8Array,
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Uint8Array. This makes code hard to read, consider using a different name.
Loading history...
1487
        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
1488
        getPrototype = overArg(Object.getPrototypeOf, Object),
1489
        objectCreate = Object.create,
1490
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
1491
        splice = arrayProto.splice,
1492
        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
1493
        symIterator = Symbol ? Symbol.iterator : undefined,
1494
        symToStringTag = Symbol ? Symbol.toStringTag : undefined;
1495
1496
    var defineProperty = (function() {
1497
      try {
1498
        var func = getNative(Object, 'defineProperty');
1499
        func({}, '', {});
1500
        return func;
1501
      } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
1502
    }());
1503
1504
    /** Mocked built-ins. */
1505
    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
1506
        ctxNow = Date && Date.now !== root.Date.now && Date.now,
1507
        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
1508
1509
    /* Built-in method references for those with the same name as other `lodash` methods. */
1510
    var nativeCeil = Math.ceil,
1511
        nativeFloor = Math.floor,
1512
        nativeGetSymbols = Object.getOwnPropertySymbols,
1513
        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1514
        nativeIsFinite = context.isFinite,
1515
        nativeJoin = arrayProto.join,
1516
        nativeKeys = overArg(Object.keys, Object),
1517
        nativeMax = Math.max,
1518
        nativeMin = Math.min,
1519
        nativeNow = Date.now,
1520
        nativeParseInt = context.parseInt,
1521
        nativeRandom = Math.random,
1522
        nativeReverse = arrayProto.reverse;
1523
1524
    /* Built-in method references that are verified to be native. */
1525
    var DataView = getNative(context, 'DataView'),
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type DataView. This makes code hard to read, consider using a different name.
Loading history...
1526
        Map = getNative(context, 'Map'),
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Map. This makes code hard to read, consider using a different name.
Loading history...
1527
        Promise = getNative(context, 'Promise'),
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Promise. This makes code hard to read, consider using a different name.
Loading history...
1528
        Set = getNative(context, 'Set'),
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Set. This makes code hard to read, consider using a different name.
Loading history...
1529
        WeakMap = getNative(context, 'WeakMap'),
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type WeakMap. This makes code hard to read, consider using a different name.
Loading history...
1530
        nativeCreate = getNative(Object, 'create');
1531
1532
    /** Used to store function metadata. */
1533
    var metaMap = WeakMap && new WeakMap;
1534
1535
    /** Used to lookup unminified function names. */
1536
    var realNames = {};
1537
1538
    /** Used to detect maps, sets, and weakmaps. */
1539
    var dataViewCtorString = toSource(DataView),
1540
        mapCtorString = toSource(Map),
1541
        promiseCtorString = toSource(Promise),
1542
        setCtorString = toSource(Set),
1543
        weakMapCtorString = toSource(WeakMap);
1544
1545
    /** Used to convert symbols to primitives and strings. */
1546
    var symbolProto = Symbol ? Symbol.prototype : undefined,
1547
        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
1548
        symbolToString = symbolProto ? symbolProto.toString : undefined;
1549
1550
    /*------------------------------------------------------------------------*/
1551
1552
    /**
1553
     * Creates a `lodash` object which wraps `value` to enable implicit method
1554
     * chain sequences. Methods that operate on and return arrays, collections,
1555
     * and functions can be chained together. Methods that retrieve a single value
1556
     * or may return a primitive value will automatically end the chain sequence
1557
     * and return the unwrapped value. Otherwise, the value must be unwrapped
1558
     * with `_#value`.
1559
     *
1560
     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
1561
     * enabled using `_.chain`.
1562
     *
1563
     * The execution of chained methods is lazy, that is, it's deferred until
1564
     * `_#value` is implicitly or explicitly called.
1565
     *
1566
     * Lazy evaluation allows several methods to support shortcut fusion.
1567
     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
1568
     * the creation of intermediate arrays and can greatly reduce the number of
1569
     * iteratee executions. Sections of a chain sequence qualify for shortcut
1570
     * fusion if the section is applied to an array and iteratees accept only
1571
     * one argument. The heuristic for whether a section qualifies for shortcut
1572
     * fusion is subject to change.
1573
     *
1574
     * Chaining is supported in custom builds as long as the `_#value` method is
1575
     * directly or indirectly included in the build.
1576
     *
1577
     * In addition to lodash methods, wrappers have `Array` and `String` methods.
1578
     *
1579
     * The wrapper `Array` methods are:
1580
     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
1581
     *
1582
     * The wrapper `String` methods are:
1583
     * `replace` and `split`
1584
     *
1585
     * The wrapper methods that support shortcut fusion are:
1586
     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
1587
     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
1588
     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
1589
     *
1590
     * The chainable wrapper methods are:
1591
     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
1592
     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
1593
     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
1594
     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
1595
     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
1596
     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
1597
     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
1598
     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
1599
     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
1600
     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
1601
     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
1602
     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
1603
     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
1604
     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
1605
     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
1606
     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
1607
     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
1608
     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
1609
     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
1610
     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
1611
     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
1612
     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
1613
     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
1614
     * `zipObject`, `zipObjectDeep`, and `zipWith`
1615
     *
1616
     * The wrapper methods that are **not** chainable by default are:
1617
     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
1618
     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
1619
     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
1620
     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
1621
     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
1622
     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
1623
     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
1624
     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
1625
     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
1626
     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
1627
     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
1628
     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
1629
     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
1630
     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
1631
     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
1632
     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
1633
     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
1634
     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
1635
     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
1636
     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
1637
     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
1638
     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
1639
     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
1640
     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
1641
     * `upperFirst`, `value`, and `words`
1642
     *
1643
     * @name _
1644
     * @constructor
1645
     * @category Seq
1646
     * @param {*} value The value to wrap in a `lodash` instance.
1647
     * @returns {Object} Returns the new `lodash` wrapper instance.
1648
     * @example
1649
     *
1650
     * function square(n) {
1651
     *   return n * n;
1652
     * }
1653
     *
1654
     * var wrapped = _([1, 2, 3]);
1655
     *
1656
     * // Returns an unwrapped value.
1657
     * wrapped.reduce(_.add);
1658
     * // => 6
1659
     *
1660
     * // Returns a wrapped value.
1661
     * var squares = wrapped.map(square);
1662
     *
1663
     * _.isArray(squares);
1664
     * // => false
1665
     *
1666
     * _.isArray(squares.value());
1667
     * // => true
1668
     */
1669
    function lodash(value) {
1670
      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
1671
        if (value instanceof LodashWrapper) {
1672
          return value;
1673
        }
1674
        if (hasOwnProperty.call(value, '__wrapped__')) {
1675
          return wrapperClone(value);
1676
        }
1677
      }
1678
      return new LodashWrapper(value);
1679
    }
1680
1681
    /**
1682
     * The base implementation of `_.create` without support for assigning
1683
     * properties to the created object.
1684
     *
1685
     * @private
1686
     * @param {Object} proto The object to inherit from.
1687
     * @returns {Object} Returns the new object.
1688
     */
1689
    var baseCreate = (function() {
1690
      function object() {}
1691
      return function(proto) {
1692
        if (!isObject(proto)) {
1693
          return {};
1694
        }
1695
        if (objectCreate) {
1696
          return objectCreate(proto);
1697
        }
1698
        object.prototype = proto;
1699
        var result = new object;
0 ignored issues
show
Coding Style Best Practice introduced by
By convention, constructors like object should be capitalized.
Loading history...
1700
        object.prototype = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1701
        return result;
1702
      };
1703
    }());
1704
1705
    /**
1706
     * The function whose prototype chain sequence wrappers inherit from.
1707
     *
1708
     * @private
1709
     */
1710
    function baseLodash() {
1711
      // No operation performed.
1712
    }
1713
1714
    /**
1715
     * The base constructor for creating `lodash` wrapper objects.
1716
     *
1717
     * @private
1718
     * @param {*} value The value to wrap.
1719
     * @param {boolean} [chainAll] Enable explicit method chain sequences.
1720
     */
1721
    function LodashWrapper(value, chainAll) {
1722
      this.__wrapped__ = value;
1723
      this.__actions__ = [];
1724
      this.__chain__ = !!chainAll;
1725
      this.__index__ = 0;
1726
      this.__values__ = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1727
    }
1728
1729
    /**
1730
     * By default, the template delimiters used by lodash are like those in
1731
     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
1732
     * following template settings to use alternative delimiters.
1733
     *
1734
     * @static
1735
     * @memberOf _
1736
     * @type {Object}
1737
     */
1738
    lodash.templateSettings = {
1739
1740
      /**
1741
       * Used to detect `data` property values to be HTML-escaped.
1742
       *
1743
       * @memberOf _.templateSettings
1744
       * @type {RegExp}
1745
       */
1746
      'escape': reEscape,
1747
1748
      /**
1749
       * Used to detect code to be evaluated.
1750
       *
1751
       * @memberOf _.templateSettings
1752
       * @type {RegExp}
1753
       */
1754
      'evaluate': reEvaluate,
1755
1756
      /**
1757
       * Used to detect `data` property values to inject.
1758
       *
1759
       * @memberOf _.templateSettings
1760
       * @type {RegExp}
1761
       */
1762
      'interpolate': reInterpolate,
1763
1764
      /**
1765
       * Used to reference the data object in the template text.
1766
       *
1767
       * @memberOf _.templateSettings
1768
       * @type {string}
1769
       */
1770
      'variable': '',
1771
1772
      /**
1773
       * Used to import variables into the compiled template.
1774
       *
1775
       * @memberOf _.templateSettings
1776
       * @type {Object}
1777
       */
1778
      'imports': {
1779
1780
        /**
1781
         * A reference to the `lodash` function.
1782
         *
1783
         * @memberOf _.templateSettings.imports
1784
         * @type {Function}
1785
         */
1786
        '_': lodash
1787
      }
1788
    };
1789
1790
    // Ensure wrappers are instances of `baseLodash`.
1791
    lodash.prototype = baseLodash.prototype;
1792
    lodash.prototype.constructor = lodash;
1793
1794
    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
1795
    LodashWrapper.prototype.constructor = LodashWrapper;
1796
1797
    /*------------------------------------------------------------------------*/
1798
1799
    /**
1800
     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
1801
     *
1802
     * @private
1803
     * @constructor
1804
     * @param {*} value The value to wrap.
1805
     */
1806
    function LazyWrapper(value) {
1807
      this.__wrapped__ = value;
1808
      this.__actions__ = [];
1809
      this.__dir__ = 1;
1810
      this.__filtered__ = false;
1811
      this.__iteratees__ = [];
1812
      this.__takeCount__ = MAX_ARRAY_LENGTH;
1813
      this.__views__ = [];
1814
    }
1815
1816
    /**
1817
     * Creates a clone of the lazy wrapper object.
1818
     *
1819
     * @private
1820
     * @name clone
1821
     * @memberOf LazyWrapper
1822
     * @returns {Object} Returns the cloned `LazyWrapper` object.
1823
     */
1824
    function lazyClone() {
1825
      var result = new LazyWrapper(this.__wrapped__);
1826
      result.__actions__ = copyArray(this.__actions__);
1827
      result.__dir__ = this.__dir__;
1828
      result.__filtered__ = this.__filtered__;
1829
      result.__iteratees__ = copyArray(this.__iteratees__);
1830
      result.__takeCount__ = this.__takeCount__;
1831
      result.__views__ = copyArray(this.__views__);
1832
      return result;
1833
    }
1834
1835
    /**
1836
     * Reverses the direction of lazy iteration.
1837
     *
1838
     * @private
1839
     * @name reverse
1840
     * @memberOf LazyWrapper
1841
     * @returns {Object} Returns the new reversed `LazyWrapper` object.
1842
     */
1843
    function lazyReverse() {
1844
      if (this.__filtered__) {
1845
        var result = new LazyWrapper(this);
1846
        result.__dir__ = -1;
1847
        result.__filtered__ = true;
1848
      } else {
1849
        result = this.clone();
1850
        result.__dir__ *= -1;
1851
      }
1852
      return result;
1853
    }
1854
1855
    /**
1856
     * Extracts the unwrapped value from its lazy wrapper.
1857
     *
1858
     * @private
1859
     * @name value
1860
     * @memberOf LazyWrapper
1861
     * @returns {*} Returns the unwrapped value.
1862
     */
1863
    function lazyValue() {
1864
      var array = this.__wrapped__.value(),
1865
          dir = this.__dir__,
1866
          isArr = isArray(array),
1867
          isRight = dir < 0,
1868
          arrLength = isArr ? array.length : 0,
1869
          view = getView(0, arrLength, this.__views__),
1870
          start = view.start,
1871
          end = view.end,
1872
          length = end - start,
1873
          index = isRight ? end : (start - 1),
1874
          iteratees = this.__iteratees__,
1875
          iterLength = iteratees.length,
1876
          resIndex = 0,
1877
          takeCount = nativeMin(length, this.__takeCount__);
1878
1879
      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
1880
        return baseWrapperValue(array, this.__actions__);
1881
      }
1882
      var result = [];
1883
1884
      outer:
1885
      while (length-- && resIndex < takeCount) {
1886
        index += dir;
1887
1888
        var iterIndex = -1,
1889
            value = array[index];
1890
1891
        while (++iterIndex < iterLength) {
1892
          var data = iteratees[iterIndex],
1893
              iteratee = data.iteratee,
1894
              type = data.type,
1895
              computed = iteratee(value);
1896
1897
          if (type == LAZY_MAP_FLAG) {
1898
            value = computed;
1899
          } else if (!computed) {
1900
            if (type == LAZY_FILTER_FLAG) {
1901
              continue outer;
1902
            } else {
1903
              break outer;
1904
            }
1905
          }
1906
        }
1907
        result[resIndex++] = value;
1908
      }
1909
      return result;
1910
    }
1911
1912
    // Ensure `LazyWrapper` is an instance of `baseLodash`.
1913
    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
1914
    LazyWrapper.prototype.constructor = LazyWrapper;
1915
1916
    /*------------------------------------------------------------------------*/
1917
1918
    /**
1919
     * Creates a hash object.
1920
     *
1921
     * @private
1922
     * @constructor
1923
     * @param {Array} [entries] The key-value pairs to cache.
1924
     */
1925
    function Hash(entries) {
1926
      var index = -1,
1927
          length = entries == null ? 0 : entries.length;
1928
1929
      this.clear();
1930
      while (++index < length) {
1931
        var entry = entries[index];
1932
        this.set(entry[0], entry[1]);
1933
      }
1934
    }
1935
1936
    /**
1937
     * Removes all key-value entries from the hash.
1938
     *
1939
     * @private
1940
     * @name clear
1941
     * @memberOf Hash
1942
     */
1943
    function hashClear() {
1944
      this.__data__ = nativeCreate ? nativeCreate(null) : {};
1945
      this.size = 0;
1946
    }
1947
1948
    /**
1949
     * Removes `key` and its value from the hash.
1950
     *
1951
     * @private
1952
     * @name delete
1953
     * @memberOf Hash
1954
     * @param {Object} hash The hash to modify.
1955
     * @param {string} key The key of the value to remove.
1956
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
1957
     */
1958
    function hashDelete(key) {
1959
      var result = this.has(key) && delete this.__data__[key];
1960
      this.size -= result ? 1 : 0;
1961
      return result;
1962
    }
1963
1964
    /**
1965
     * Gets the hash value for `key`.
1966
     *
1967
     * @private
1968
     * @name get
1969
     * @memberOf Hash
1970
     * @param {string} key The key of the value to get.
1971
     * @returns {*} Returns the entry value.
1972
     */
1973
    function hashGet(key) {
1974
      var data = this.__data__;
1975
      if (nativeCreate) {
1976
        var result = data[key];
1977
        return result === HASH_UNDEFINED ? undefined : result;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1978
      }
1979
      return hasOwnProperty.call(data, key) ? data[key] : undefined;
1980
    }
1981
1982
    /**
1983
     * Checks if a hash value for `key` exists.
1984
     *
1985
     * @private
1986
     * @name has
1987
     * @memberOf Hash
1988
     * @param {string} key The key of the entry to check.
1989
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
1990
     */
1991
    function hashHas(key) {
1992
      var data = this.__data__;
1993
      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
1994
    }
1995
1996
    /**
1997
     * Sets the hash `key` to `value`.
1998
     *
1999
     * @private
2000
     * @name set
2001
     * @memberOf Hash
2002
     * @param {string} key The key of the value to set.
2003
     * @param {*} value The value to set.
2004
     * @returns {Object} Returns the hash instance.
2005
     */
2006
    function hashSet(key, value) {
2007
      var data = this.__data__;
2008
      this.size += this.has(key) ? 0 : 1;
2009
      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2010
      return this;
2011
    }
2012
2013
    // Add methods to `Hash`.
2014
    Hash.prototype.clear = hashClear;
2015
    Hash.prototype['delete'] = hashDelete;
2016
    Hash.prototype.get = hashGet;
2017
    Hash.prototype.has = hashHas;
2018
    Hash.prototype.set = hashSet;
2019
2020
    /*------------------------------------------------------------------------*/
2021
2022
    /**
2023
     * Creates an list cache object.
2024
     *
2025
     * @private
2026
     * @constructor
2027
     * @param {Array} [entries] The key-value pairs to cache.
2028
     */
2029
    function ListCache(entries) {
2030
      var index = -1,
2031
          length = entries == null ? 0 : entries.length;
2032
2033
      this.clear();
2034
      while (++index < length) {
2035
        var entry = entries[index];
2036
        this.set(entry[0], entry[1]);
2037
      }
2038
    }
2039
2040
    /**
2041
     * Removes all key-value entries from the list cache.
2042
     *
2043
     * @private
2044
     * @name clear
2045
     * @memberOf ListCache
2046
     */
2047
    function listCacheClear() {
2048
      this.__data__ = [];
2049
      this.size = 0;
2050
    }
2051
2052
    /**
2053
     * Removes `key` and its value from the list cache.
2054
     *
2055
     * @private
2056
     * @name delete
2057
     * @memberOf ListCache
2058
     * @param {string} key The key of the value to remove.
2059
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2060
     */
2061
    function listCacheDelete(key) {
2062
      var data = this.__data__,
2063
          index = assocIndexOf(data, key);
2064
2065
      if (index < 0) {
2066
        return false;
2067
      }
2068
      var lastIndex = data.length - 1;
2069
      if (index == lastIndex) {
2070
        data.pop();
2071
      } else {
2072
        splice.call(data, index, 1);
2073
      }
2074
      --this.size;
2075
      return true;
2076
    }
2077
2078
    /**
2079
     * Gets the list cache value for `key`.
2080
     *
2081
     * @private
2082
     * @name get
2083
     * @memberOf ListCache
2084
     * @param {string} key The key of the value to get.
2085
     * @returns {*} Returns the entry value.
2086
     */
2087
    function listCacheGet(key) {
2088
      var data = this.__data__,
2089
          index = assocIndexOf(data, key);
2090
2091
      return index < 0 ? undefined : data[index][1];
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2092
    }
2093
2094
    /**
2095
     * Checks if a list cache value for `key` exists.
2096
     *
2097
     * @private
2098
     * @name has
2099
     * @memberOf ListCache
2100
     * @param {string} key The key of the entry to check.
2101
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2102
     */
2103
    function listCacheHas(key) {
2104
      return assocIndexOf(this.__data__, key) > -1;
2105
    }
2106
2107
    /**
2108
     * Sets the list cache `key` to `value`.
2109
     *
2110
     * @private
2111
     * @name set
2112
     * @memberOf ListCache
2113
     * @param {string} key The key of the value to set.
2114
     * @param {*} value The value to set.
2115
     * @returns {Object} Returns the list cache instance.
2116
     */
2117
    function listCacheSet(key, value) {
2118
      var data = this.__data__,
2119
          index = assocIndexOf(data, key);
2120
2121
      if (index < 0) {
2122
        ++this.size;
2123
        data.push([key, value]);
2124
      } else {
2125
        data[index][1] = value;
2126
      }
2127
      return this;
2128
    }
2129
2130
    // Add methods to `ListCache`.
2131
    ListCache.prototype.clear = listCacheClear;
2132
    ListCache.prototype['delete'] = listCacheDelete;
2133
    ListCache.prototype.get = listCacheGet;
2134
    ListCache.prototype.has = listCacheHas;
2135
    ListCache.prototype.set = listCacheSet;
2136
2137
    /*------------------------------------------------------------------------*/
2138
2139
    /**
2140
     * Creates a map cache object to store key-value pairs.
2141
     *
2142
     * @private
2143
     * @constructor
2144
     * @param {Array} [entries] The key-value pairs to cache.
2145
     */
2146
    function MapCache(entries) {
2147
      var index = -1,
2148
          length = entries == null ? 0 : entries.length;
2149
2150
      this.clear();
2151
      while (++index < length) {
2152
        var entry = entries[index];
2153
        this.set(entry[0], entry[1]);
2154
      }
2155
    }
2156
2157
    /**
2158
     * Removes all key-value entries from the map.
2159
     *
2160
     * @private
2161
     * @name clear
2162
     * @memberOf MapCache
2163
     */
2164
    function mapCacheClear() {
2165
      this.size = 0;
2166
      this.__data__ = {
2167
        'hash': new Hash,
2168
        'map': new (Map || ListCache),
2169
        'string': new Hash
2170
      };
2171
    }
2172
2173
    /**
2174
     * Removes `key` and its value from the map.
2175
     *
2176
     * @private
2177
     * @name delete
2178
     * @memberOf MapCache
2179
     * @param {string} key The key of the value to remove.
2180
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2181
     */
2182
    function mapCacheDelete(key) {
2183
      var result = getMapData(this, key)['delete'](key);
2184
      this.size -= result ? 1 : 0;
2185
      return result;
2186
    }
2187
2188
    /**
2189
     * Gets the map value for `key`.
2190
     *
2191
     * @private
2192
     * @name get
2193
     * @memberOf MapCache
2194
     * @param {string} key The key of the value to get.
2195
     * @returns {*} Returns the entry value.
2196
     */
2197
    function mapCacheGet(key) {
2198
      return getMapData(this, key).get(key);
2199
    }
2200
2201
    /**
2202
     * Checks if a map value for `key` exists.
2203
     *
2204
     * @private
2205
     * @name has
2206
     * @memberOf MapCache
2207
     * @param {string} key The key of the entry to check.
2208
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2209
     */
2210
    function mapCacheHas(key) {
2211
      return getMapData(this, key).has(key);
2212
    }
2213
2214
    /**
2215
     * Sets the map `key` to `value`.
2216
     *
2217
     * @private
2218
     * @name set
2219
     * @memberOf MapCache
2220
     * @param {string} key The key of the value to set.
2221
     * @param {*} value The value to set.
2222
     * @returns {Object} Returns the map cache instance.
2223
     */
2224
    function mapCacheSet(key, value) {
2225
      var data = getMapData(this, key),
2226
          size = data.size;
2227
2228
      data.set(key, value);
2229
      this.size += data.size == size ? 0 : 1;
2230
      return this;
2231
    }
2232
2233
    // Add methods to `MapCache`.
2234
    MapCache.prototype.clear = mapCacheClear;
2235
    MapCache.prototype['delete'] = mapCacheDelete;
2236
    MapCache.prototype.get = mapCacheGet;
2237
    MapCache.prototype.has = mapCacheHas;
2238
    MapCache.prototype.set = mapCacheSet;
2239
2240
    /*------------------------------------------------------------------------*/
2241
2242
    /**
2243
     *
2244
     * Creates an array cache object to store unique values.
2245
     *
2246
     * @private
2247
     * @constructor
2248
     * @param {Array} [values] The values to cache.
2249
     */
2250
    function SetCache(values) {
2251
      var index = -1,
2252
          length = values == null ? 0 : values.length;
2253
2254
      this.__data__ = new MapCache;
2255
      while (++index < length) {
2256
        this.add(values[index]);
2257
      }
2258
    }
2259
2260
    /**
2261
     * Adds `value` to the array cache.
2262
     *
2263
     * @private
2264
     * @name add
2265
     * @memberOf SetCache
2266
     * @alias push
2267
     * @param {*} value The value to cache.
2268
     * @returns {Object} Returns the cache instance.
2269
     */
2270
    function setCacheAdd(value) {
2271
      this.__data__.set(value, HASH_UNDEFINED);
2272
      return this;
2273
    }
2274
2275
    /**
2276
     * Checks if `value` is in the array cache.
2277
     *
2278
     * @private
2279
     * @name has
2280
     * @memberOf SetCache
2281
     * @param {*} value The value to search for.
2282
     * @returns {number} Returns `true` if `value` is found, else `false`.
2283
     */
2284
    function setCacheHas(value) {
2285
      return this.__data__.has(value);
2286
    }
2287
2288
    // Add methods to `SetCache`.
2289
    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
2290
    SetCache.prototype.has = setCacheHas;
2291
2292
    /*------------------------------------------------------------------------*/
2293
2294
    /**
2295
     * Creates a stack cache object to store key-value pairs.
2296
     *
2297
     * @private
2298
     * @constructor
2299
     * @param {Array} [entries] The key-value pairs to cache.
2300
     */
2301
    function Stack(entries) {
2302
      var data = this.__data__ = new ListCache(entries);
2303
      this.size = data.size;
2304
    }
2305
2306
    /**
2307
     * Removes all key-value entries from the stack.
2308
     *
2309
     * @private
2310
     * @name clear
2311
     * @memberOf Stack
2312
     */
2313
    function stackClear() {
2314
      this.__data__ = new ListCache;
2315
      this.size = 0;
2316
    }
2317
2318
    /**
2319
     * Removes `key` and its value from the stack.
2320
     *
2321
     * @private
2322
     * @name delete
2323
     * @memberOf Stack
2324
     * @param {string} key The key of the value to remove.
2325
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2326
     */
2327
    function stackDelete(key) {
2328
      var data = this.__data__,
2329
          result = data['delete'](key);
2330
2331
      this.size = data.size;
2332
      return result;
2333
    }
2334
2335
    /**
2336
     * Gets the stack value for `key`.
2337
     *
2338
     * @private
2339
     * @name get
2340
     * @memberOf Stack
2341
     * @param {string} key The key of the value to get.
2342
     * @returns {*} Returns the entry value.
2343
     */
2344
    function stackGet(key) {
2345
      return this.__data__.get(key);
2346
    }
2347
2348
    /**
2349
     * Checks if a stack value for `key` exists.
2350
     *
2351
     * @private
2352
     * @name has
2353
     * @memberOf Stack
2354
     * @param {string} key The key of the entry to check.
2355
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2356
     */
2357
    function stackHas(key) {
2358
      return this.__data__.has(key);
2359
    }
2360
2361
    /**
2362
     * Sets the stack `key` to `value`.
2363
     *
2364
     * @private
2365
     * @name set
2366
     * @memberOf Stack
2367
     * @param {string} key The key of the value to set.
2368
     * @param {*} value The value to set.
2369
     * @returns {Object} Returns the stack cache instance.
2370
     */
2371
    function stackSet(key, value) {
2372
      var data = this.__data__;
2373
      if (data instanceof ListCache) {
2374
        var pairs = data.__data__;
2375
        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
2376
          pairs.push([key, value]);
2377
          this.size = ++data.size;
2378
          return this;
2379
        }
2380
        data = this.__data__ = new MapCache(pairs);
2381
      }
2382
      data.set(key, value);
2383
      this.size = data.size;
2384
      return this;
2385
    }
2386
2387
    // Add methods to `Stack`.
2388
    Stack.prototype.clear = stackClear;
2389
    Stack.prototype['delete'] = stackDelete;
2390
    Stack.prototype.get = stackGet;
2391
    Stack.prototype.has = stackHas;
2392
    Stack.prototype.set = stackSet;
2393
2394
    /*------------------------------------------------------------------------*/
2395
2396
    /**
2397
     * Creates an array of the enumerable property names of the array-like `value`.
2398
     *
2399
     * @private
2400
     * @param {*} value The value to query.
2401
     * @param {boolean} inherited Specify returning inherited property names.
2402
     * @returns {Array} Returns the array of property names.
2403
     */
2404
    function arrayLikeKeys(value, inherited) {
2405
      var isArr = isArray(value),
2406
          isArg = !isArr && isArguments(value),
2407
          isBuff = !isArr && !isArg && isBuffer(value),
2408
          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
2409
          skipIndexes = isArr || isArg || isBuff || isType,
2410
          result = skipIndexes ? baseTimes(value.length, String) : [],
2411
          length = result.length;
2412
2413
      for (var key in value) {
2414
        if ((inherited || hasOwnProperty.call(value, key)) &&
2415
            !(skipIndexes && (
2416
               // Safari 9 has enumerable `arguments.length` in strict mode.
2417
               key == 'length' ||
2418
               // Node.js 0.10 has enumerable non-index properties on buffers.
2419
               (isBuff && (key == 'offset' || key == 'parent')) ||
2420
               // PhantomJS 2 has enumerable non-index properties on typed arrays.
2421
               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
2422
               // Skip index properties.
2423
               isIndex(key, length)
2424
            ))) {
2425
          result.push(key);
2426
        }
2427
      }
2428
      return result;
2429
    }
2430
2431
    /**
2432
     * A specialized version of `_.sample` for arrays.
2433
     *
2434
     * @private
2435
     * @param {Array} array The array to sample.
2436
     * @returns {*} Returns the random element.
2437
     */
2438
    function arraySample(array) {
2439
      var length = array.length;
2440
      return length ? array[baseRandom(0, length - 1)] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2441
    }
2442
2443
    /**
2444
     * A specialized version of `_.sampleSize` for arrays.
2445
     *
2446
     * @private
2447
     * @param {Array} array The array to sample.
2448
     * @param {number} n The number of elements to sample.
2449
     * @returns {Array} Returns the random elements.
2450
     */
2451
    function arraySampleSize(array, n) {
2452
      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
2453
    }
2454
2455
    /**
2456
     * A specialized version of `_.shuffle` for arrays.
2457
     *
2458
     * @private
2459
     * @param {Array} array The array to shuffle.
2460
     * @returns {Array} Returns the new shuffled array.
2461
     */
2462
    function arrayShuffle(array) {
2463
      return shuffleSelf(copyArray(array));
2464
    }
2465
2466
    /**
2467
     * This function is like `assignValue` except that it doesn't assign
2468
     * `undefined` values.
2469
     *
2470
     * @private
2471
     * @param {Object} object The object to modify.
2472
     * @param {string} key The key of the property to assign.
2473
     * @param {*} value The value to assign.
2474
     */
2475
    function assignMergeValue(object, key, value) {
2476
      if ((value !== undefined && !eq(object[key], value)) ||
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2477
          (value === undefined && !(key in object))) {
2478
        baseAssignValue(object, key, value);
2479
      }
2480
    }
2481
2482
    /**
2483
     * Assigns `value` to `key` of `object` if the existing value is not equivalent
2484
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2485
     * for equality comparisons.
2486
     *
2487
     * @private
2488
     * @param {Object} object The object to modify.
2489
     * @param {string} key The key of the property to assign.
2490
     * @param {*} value The value to assign.
2491
     */
2492
    function assignValue(object, key, value) {
2493
      var objValue = object[key];
2494
      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
2495
          (value === undefined && !(key in object))) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2496
        baseAssignValue(object, key, value);
2497
      }
2498
    }
2499
2500
    /**
2501
     * Gets the index at which the `key` is found in `array` of key-value pairs.
2502
     *
2503
     * @private
2504
     * @param {Array} array The array to inspect.
2505
     * @param {*} key The key to search for.
2506
     * @returns {number} Returns the index of the matched value, else `-1`.
2507
     */
2508
    function assocIndexOf(array, key) {
2509
      var length = array.length;
2510
      while (length--) {
2511
        if (eq(array[length][0], key)) {
2512
          return length;
2513
        }
2514
      }
2515
      return -1;
2516
    }
2517
2518
    /**
2519
     * Aggregates elements of `collection` on `accumulator` with keys transformed
2520
     * by `iteratee` and values set by `setter`.
2521
     *
2522
     * @private
2523
     * @param {Array|Object} collection The collection to iterate over.
2524
     * @param {Function} setter The function to set `accumulator` values.
2525
     * @param {Function} iteratee The iteratee to transform keys.
2526
     * @param {Object} accumulator The initial aggregated object.
2527
     * @returns {Function} Returns `accumulator`.
2528
     */
2529
    function baseAggregator(collection, setter, iteratee, accumulator) {
2530
      baseEach(collection, function(value, key, collection) {
2531
        setter(accumulator, value, iteratee(value), collection);
2532
      });
2533
      return accumulator;
2534
    }
2535
2536
    /**
2537
     * The base implementation of `_.assign` without support for multiple sources
2538
     * or `customizer` functions.
2539
     *
2540
     * @private
2541
     * @param {Object} object The destination object.
2542
     * @param {Object} source The source object.
2543
     * @returns {Object} Returns `object`.
2544
     */
2545
    function baseAssign(object, source) {
2546
      return object && copyObject(source, keys(source), object);
2547
    }
2548
2549
    /**
2550
     * The base implementation of `_.assignIn` without support for multiple sources
2551
     * or `customizer` functions.
2552
     *
2553
     * @private
2554
     * @param {Object} object The destination object.
2555
     * @param {Object} source The source object.
2556
     * @returns {Object} Returns `object`.
2557
     */
2558
    function baseAssignIn(object, source) {
2559
      return object && copyObject(source, keysIn(source), object);
2560
    }
2561
2562
    /**
2563
     * The base implementation of `assignValue` and `assignMergeValue` without
2564
     * value checks.
2565
     *
2566
     * @private
2567
     * @param {Object} object The object to modify.
2568
     * @param {string} key The key of the property to assign.
2569
     * @param {*} value The value to assign.
2570
     */
2571
    function baseAssignValue(object, key, value) {
2572
      if (key == '__proto__' && defineProperty) {
2573
        defineProperty(object, key, {
2574
          'configurable': true,
2575
          'enumerable': true,
2576
          'value': value,
2577
          'writable': true
2578
        });
2579
      } else {
2580
        object[key] = value;
2581
      }
2582
    }
2583
2584
    /**
2585
     * The base implementation of `_.at` without support for individual paths.
2586
     *
2587
     * @private
2588
     * @param {Object} object The object to iterate over.
2589
     * @param {string[]} paths The property paths to pick.
2590
     * @returns {Array} Returns the picked elements.
2591
     */
2592
    function baseAt(object, paths) {
2593
      var index = -1,
2594
          length = paths.length,
2595
          result = Array(length),
2596
          skip = object == null;
2597
2598
      while (++index < length) {
2599
        result[index] = skip ? undefined : get(object, paths[index]);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2600
      }
2601
      return result;
2602
    }
2603
2604
    /**
2605
     * The base implementation of `_.clamp` which doesn't coerce arguments.
2606
     *
2607
     * @private
2608
     * @param {number} number The number to clamp.
2609
     * @param {number} [lower] The lower bound.
2610
     * @param {number} upper The upper bound.
2611
     * @returns {number} Returns the clamped number.
2612
     */
2613
    function baseClamp(number, lower, upper) {
2614
      if (number === number) {
2615
        if (upper !== undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2616
          number = number <= upper ? number : upper;
2617
        }
2618
        if (lower !== undefined) {
2619
          number = number >= lower ? number : lower;
2620
        }
2621
      }
2622
      return number;
2623
    }
2624
2625
    /**
2626
     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
2627
     * traversed objects.
2628
     *
2629
     * @private
2630
     * @param {*} value The value to clone.
2631
     * @param {boolean} bitmask The bitmask flags.
2632
     *  1 - Deep clone
2633
     *  2 - Flatten inherited properties
2634
     *  4 - Clone symbols
2635
     * @param {Function} [customizer] The function to customize cloning.
2636
     * @param {string} [key] The key of `value`.
2637
     * @param {Object} [object] The parent object of `value`.
2638
     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
2639
     * @returns {*} Returns the cloned value.
2640
     */
2641
    function baseClone(value, bitmask, customizer, key, object, stack) {
2642
      var result,
2643
          isDeep = bitmask & CLONE_DEEP_FLAG,
2644
          isFlat = bitmask & CLONE_FLAT_FLAG,
2645
          isFull = bitmask & CLONE_SYMBOLS_FLAG;
2646
2647
      if (customizer) {
2648
        result = object ? customizer(value, key, object, stack) : customizer(value);
2649
      }
2650
      if (result !== undefined) {
0 ignored issues
show
Bug introduced by
The variable result does not seem to be initialized in case customizer on line 2647 is false. Are you sure this can never be the case?
Loading history...
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2651
        return result;
2652
      }
2653
      if (!isObject(value)) {
2654
        return value;
2655
      }
2656
      var isArr = isArray(value);
2657
      if (isArr) {
2658
        result = initCloneArray(value);
2659
        if (!isDeep) {
2660
          return copyArray(value, result);
2661
        }
2662
      } else {
2663
        var tag = getTag(value),
2664
            isFunc = tag == funcTag || tag == genTag;
2665
2666
        if (isBuffer(value)) {
2667
          return cloneBuffer(value, isDeep);
2668
        }
2669
        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
2670
          result = (isFlat || isFunc) ? {} : initCloneObject(value);
2671
          if (!isDeep) {
2672
            return isFlat
2673
              ? copySymbolsIn(value, baseAssignIn(result, value))
2674
              : copySymbols(value, baseAssign(result, value));
2675
          }
2676
        } else {
2677
          if (!cloneableTags[tag]) {
2678
            return object ? value : {};
2679
          }
2680
          result = initCloneByTag(value, tag, baseClone, isDeep);
2681
        }
2682
      }
2683
      // Check for circular references and return its corresponding clone.
2684
      stack || (stack = new Stack);
2685
      var stacked = stack.get(value);
2686
      if (stacked) {
2687
        return stacked;
2688
      }
2689
      stack.set(value, result);
2690
2691
      var keysFunc = isFull
2692
        ? (isFlat ? getAllKeysIn : getAllKeys)
2693
        : (isFlat ? keysIn : keys);
2694
2695
      var props = isArr ? undefined : keysFunc(value);
2696
      arrayEach(props || value, function(subValue, key) {
2697
        if (props) {
2698
          key = subValue;
2699
          subValue = value[key];
2700
        }
2701
        // Recursively populate clone (susceptible to call stack limits).
2702
        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
2703
      });
2704
      return result;
2705
    }
2706
2707
    /**
2708
     * The base implementation of `_.conforms` which doesn't clone `source`.
2709
     *
2710
     * @private
2711
     * @param {Object} source The object of property predicates to conform to.
2712
     * @returns {Function} Returns the new spec function.
2713
     */
2714
    function baseConforms(source) {
2715
      var props = keys(source);
2716
      return function(object) {
2717
        return baseConformsTo(object, source, props);
2718
      };
2719
    }
2720
2721
    /**
2722
     * The base implementation of `_.conformsTo` which accepts `props` to check.
2723
     *
2724
     * @private
2725
     * @param {Object} object The object to inspect.
2726
     * @param {Object} source The object of property predicates to conform to.
2727
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
2728
     */
2729
    function baseConformsTo(object, source, props) {
2730
      var length = props.length;
2731
      if (object == null) {
2732
        return !length;
2733
      }
2734
      object = Object(object);
2735
      while (length--) {
2736
        var key = props[length],
2737
            predicate = source[key],
2738
            value = object[key];
2739
2740
        if ((value === undefined && !(key in object)) || !predicate(value)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2741
          return false;
2742
        }
2743
      }
2744
      return true;
2745
    }
2746
2747
    /**
2748
     * The base implementation of `_.delay` and `_.defer` which accepts `args`
2749
     * to provide to `func`.
2750
     *
2751
     * @private
2752
     * @param {Function} func The function to delay.
2753
     * @param {number} wait The number of milliseconds to delay invocation.
2754
     * @param {Array} args The arguments to provide to `func`.
2755
     * @returns {number|Object} Returns the timer id or timeout object.
2756
     */
2757
    function baseDelay(func, wait, args) {
2758
      if (typeof func != 'function') {
2759
        throw new TypeError(FUNC_ERROR_TEXT);
2760
      }
2761
      return setTimeout(function() { func.apply(undefined, args); }, wait);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2762
    }
2763
2764
    /**
2765
     * The base implementation of methods like `_.difference` without support
2766
     * for excluding multiple arrays or iteratee shorthands.
2767
     *
2768
     * @private
2769
     * @param {Array} array The array to inspect.
2770
     * @param {Array} values The values to exclude.
2771
     * @param {Function} [iteratee] The iteratee invoked per element.
2772
     * @param {Function} [comparator] The comparator invoked per element.
2773
     * @returns {Array} Returns the new array of filtered values.
2774
     */
2775
    function baseDifference(array, values, iteratee, comparator) {
2776
      var index = -1,
2777
          includes = arrayIncludes,
2778
          isCommon = true,
2779
          length = array.length,
2780
          result = [],
2781
          valuesLength = values.length;
2782
2783
      if (!length) {
2784
        return result;
2785
      }
2786
      if (iteratee) {
2787
        values = arrayMap(values, baseUnary(iteratee));
2788
      }
2789
      if (comparator) {
2790
        includes = arrayIncludesWith;
2791
        isCommon = false;
2792
      }
2793
      else if (values.length >= LARGE_ARRAY_SIZE) {
2794
        includes = cacheHas;
2795
        isCommon = false;
2796
        values = new SetCache(values);
2797
      }
2798
      outer:
2799
      while (++index < length) {
2800
        var value = array[index],
2801
            computed = iteratee == null ? value : iteratee(value);
2802
2803
        value = (comparator || value !== 0) ? value : 0;
2804
        if (isCommon && computed === computed) {
2805
          var valuesIndex = valuesLength;
2806
          while (valuesIndex--) {
2807
            if (values[valuesIndex] === computed) {
2808
              continue outer;
2809
            }
2810
          }
2811
          result.push(value);
2812
        }
2813
        else if (!includes(values, computed, comparator)) {
2814
          result.push(value);
2815
        }
2816
      }
2817
      return result;
2818
    }
2819
2820
    /**
2821
     * The base implementation of `_.forEach` without support for iteratee shorthands.
2822
     *
2823
     * @private
2824
     * @param {Array|Object} collection The collection to iterate over.
2825
     * @param {Function} iteratee The function invoked per iteration.
2826
     * @returns {Array|Object} Returns `collection`.
2827
     */
2828
    var baseEach = createBaseEach(baseForOwn);
2829
2830
    /**
2831
     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
2832
     *
2833
     * @private
2834
     * @param {Array|Object} collection The collection to iterate over.
2835
     * @param {Function} iteratee The function invoked per iteration.
2836
     * @returns {Array|Object} Returns `collection`.
2837
     */
2838
    var baseEachRight = createBaseEach(baseForOwnRight, true);
2839
2840
    /**
2841
     * The base implementation of `_.every` without support for iteratee shorthands.
2842
     *
2843
     * @private
2844
     * @param {Array|Object} collection The collection to iterate over.
2845
     * @param {Function} predicate The function invoked per iteration.
2846
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
2847
     *  else `false`
2848
     */
2849
    function baseEvery(collection, predicate) {
2850
      var result = true;
2851
      baseEach(collection, function(value, index, collection) {
2852
        result = !!predicate(value, index, collection);
2853
        return result;
2854
      });
2855
      return result;
2856
    }
2857
2858
    /**
2859
     * The base implementation of methods like `_.max` and `_.min` which accepts a
2860
     * `comparator` to determine the extremum value.
2861
     *
2862
     * @private
2863
     * @param {Array} array The array to iterate over.
2864
     * @param {Function} iteratee The iteratee invoked per iteration.
2865
     * @param {Function} comparator The comparator used to compare values.
2866
     * @returns {*} Returns the extremum value.
2867
     */
2868
    function baseExtremum(array, iteratee, comparator) {
2869
      var index = -1,
2870
          length = array.length;
2871
2872
      while (++index < length) {
2873
        var value = array[index],
2874
            current = iteratee(value);
2875
2876
        if (current != null && (computed === undefined
0 ignored issues
show
Bug introduced by
The variable computed seems to not be initialized for all possible execution paths.
Loading history...
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2877
              ? (current === current && !isSymbol(current))
2878
              : comparator(current, computed)
2879
            )) {
2880
          var computed = current,
2881
              result = value;
2882
        }
2883
      }
2884
      return result;
0 ignored issues
show
Bug introduced by
The variable result seems to not be initialized for all possible execution paths.
Loading history...
2885
    }
2886
2887
    /**
2888
     * The base implementation of `_.fill` without an iteratee call guard.
2889
     *
2890
     * @private
2891
     * @param {Array} array The array to fill.
2892
     * @param {*} value The value to fill `array` with.
2893
     * @param {number} [start=0] The start position.
2894
     * @param {number} [end=array.length] The end position.
2895
     * @returns {Array} Returns `array`.
2896
     */
2897
    function baseFill(array, value, start, end) {
2898
      var length = array.length;
2899
2900
      start = toInteger(start);
2901
      if (start < 0) {
2902
        start = -start > length ? 0 : (length + start);
2903
      }
2904
      end = (end === undefined || end > length) ? length : toInteger(end);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
2905
      if (end < 0) {
2906
        end += length;
2907
      }
2908
      end = start > end ? 0 : toLength(end);
2909
      while (start < end) {
2910
        array[start++] = value;
2911
      }
2912
      return array;
2913
    }
2914
2915
    /**
2916
     * The base implementation of `_.filter` without support for iteratee shorthands.
2917
     *
2918
     * @private
2919
     * @param {Array|Object} collection The collection to iterate over.
2920
     * @param {Function} predicate The function invoked per iteration.
2921
     * @returns {Array} Returns the new filtered array.
2922
     */
2923
    function baseFilter(collection, predicate) {
2924
      var result = [];
2925
      baseEach(collection, function(value, index, collection) {
2926
        if (predicate(value, index, collection)) {
2927
          result.push(value);
2928
        }
2929
      });
2930
      return result;
2931
    }
2932
2933
    /**
2934
     * The base implementation of `_.flatten` with support for restricting flattening.
2935
     *
2936
     * @private
2937
     * @param {Array} array The array to flatten.
2938
     * @param {number} depth The maximum recursion depth.
2939
     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
2940
     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
2941
     * @param {Array} [result=[]] The initial result value.
2942
     * @returns {Array} Returns the new flattened array.
2943
     */
2944
    function baseFlatten(array, depth, predicate, isStrict, result) {
2945
      var index = -1,
2946
          length = array.length;
2947
2948
      predicate || (predicate = isFlattenable);
2949
      result || (result = []);
2950
2951
      while (++index < length) {
2952
        var value = array[index];
2953
        if (depth > 0 && predicate(value)) {
2954
          if (depth > 1) {
2955
            // Recursively flatten arrays (susceptible to call stack limits).
2956
            baseFlatten(value, depth - 1, predicate, isStrict, result);
2957
          } else {
2958
            arrayPush(result, value);
2959
          }
2960
        } else if (!isStrict) {
2961
          result[result.length] = value;
2962
        }
2963
      }
2964
      return result;
2965
    }
2966
2967
    /**
2968
     * The base implementation of `baseForOwn` which iterates over `object`
2969
     * properties returned by `keysFunc` and invokes `iteratee` for each property.
2970
     * Iteratee functions may exit iteration early by explicitly returning `false`.
2971
     *
2972
     * @private
2973
     * @param {Object} object The object to iterate over.
2974
     * @param {Function} iteratee The function invoked per iteration.
2975
     * @param {Function} keysFunc The function to get the keys of `object`.
2976
     * @returns {Object} Returns `object`.
2977
     */
2978
    var baseFor = createBaseFor();
2979
2980
    /**
2981
     * This function is like `baseFor` except that it iterates over properties
2982
     * in the opposite order.
2983
     *
2984
     * @private
2985
     * @param {Object} object The object to iterate over.
2986
     * @param {Function} iteratee The function invoked per iteration.
2987
     * @param {Function} keysFunc The function to get the keys of `object`.
2988
     * @returns {Object} Returns `object`.
2989
     */
2990
    var baseForRight = createBaseFor(true);
2991
2992
    /**
2993
     * The base implementation of `_.forOwn` without support for iteratee shorthands.
2994
     *
2995
     * @private
2996
     * @param {Object} object The object to iterate over.
2997
     * @param {Function} iteratee The function invoked per iteration.
2998
     * @returns {Object} Returns `object`.
2999
     */
3000
    function baseForOwn(object, iteratee) {
3001
      return object && baseFor(object, iteratee, keys);
3002
    }
3003
3004
    /**
3005
     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
3006
     *
3007
     * @private
3008
     * @param {Object} object The object to iterate over.
3009
     * @param {Function} iteratee The function invoked per iteration.
3010
     * @returns {Object} Returns `object`.
3011
     */
3012
    function baseForOwnRight(object, iteratee) {
3013
      return object && baseForRight(object, iteratee, keys);
3014
    }
3015
3016
    /**
3017
     * The base implementation of `_.functions` which creates an array of
3018
     * `object` function property names filtered from `props`.
3019
     *
3020
     * @private
3021
     * @param {Object} object The object to inspect.
3022
     * @param {Array} props The property names to filter.
3023
     * @returns {Array} Returns the function names.
3024
     */
3025
    function baseFunctions(object, props) {
3026
      return arrayFilter(props, function(key) {
3027
        return isFunction(object[key]);
3028
      });
3029
    }
3030
3031
    /**
3032
     * The base implementation of `_.get` without support for default values.
3033
     *
3034
     * @private
3035
     * @param {Object} object The object to query.
3036
     * @param {Array|string} path The path of the property to get.
3037
     * @returns {*} Returns the resolved value.
3038
     */
3039
    function baseGet(object, path) {
3040
      path = castPath(path, object);
3041
3042
      var index = 0,
3043
          length = path.length;
3044
3045
      while (object != null && index < length) {
3046
        object = object[toKey(path[index++])];
3047
      }
3048
      return (index && index == length) ? object : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3049
    }
3050
3051
    /**
3052
     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
3053
     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
3054
     * symbols of `object`.
3055
     *
3056
     * @private
3057
     * @param {Object} object The object to query.
3058
     * @param {Function} keysFunc The function to get the keys of `object`.
3059
     * @param {Function} symbolsFunc The function to get the symbols of `object`.
3060
     * @returns {Array} Returns the array of property names and symbols.
3061
     */
3062
    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
3063
      var result = keysFunc(object);
3064
      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
3065
    }
3066
3067
    /**
3068
     * The base implementation of `getTag` without fallbacks for buggy environments.
3069
     *
3070
     * @private
3071
     * @param {*} value The value to query.
3072
     * @returns {string} Returns the `toStringTag`.
3073
     */
3074
    function baseGetTag(value) {
3075
      if (value == null) {
3076
        return value === undefined ? undefinedTag : nullTag;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3077
      }
3078
      return (symToStringTag && symToStringTag in Object(value))
3079
        ? getRawTag(value)
3080
        : objectToString(value);
3081
    }
3082
3083
    /**
3084
     * The base implementation of `_.gt` which doesn't coerce arguments.
3085
     *
3086
     * @private
3087
     * @param {*} value The value to compare.
3088
     * @param {*} other The other value to compare.
3089
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
3090
     *  else `false`.
3091
     */
3092
    function baseGt(value, other) {
3093
      return value > other;
3094
    }
3095
3096
    /**
3097
     * The base implementation of `_.has` without support for deep paths.
3098
     *
3099
     * @private
3100
     * @param {Object} [object] The object to query.
3101
     * @param {Array|string} key The key to check.
3102
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
3103
     */
3104
    function baseHas(object, key) {
3105
      return object != null && hasOwnProperty.call(object, key);
3106
    }
3107
3108
    /**
3109
     * The base implementation of `_.hasIn` without support for deep paths.
3110
     *
3111
     * @private
3112
     * @param {Object} [object] The object to query.
3113
     * @param {Array|string} key The key to check.
3114
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
3115
     */
3116
    function baseHasIn(object, key) {
3117
      return object != null && key in Object(object);
3118
    }
3119
3120
    /**
3121
     * The base implementation of `_.inRange` which doesn't coerce arguments.
3122
     *
3123
     * @private
3124
     * @param {number} number The number to check.
3125
     * @param {number} start The start of the range.
3126
     * @param {number} end The end of the range.
3127
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
3128
     */
3129
    function baseInRange(number, start, end) {
3130
      return number >= nativeMin(start, end) && number < nativeMax(start, end);
3131
    }
3132
3133
    /**
3134
     * The base implementation of methods like `_.intersection`, without support
3135
     * for iteratee shorthands, that accepts an array of arrays to inspect.
3136
     *
3137
     * @private
3138
     * @param {Array} arrays The arrays to inspect.
3139
     * @param {Function} [iteratee] The iteratee invoked per element.
3140
     * @param {Function} [comparator] The comparator invoked per element.
3141
     * @returns {Array} Returns the new array of shared values.
3142
     */
3143
    function baseIntersection(arrays, iteratee, comparator) {
3144
      var includes = comparator ? arrayIncludesWith : arrayIncludes,
3145
          length = arrays[0].length,
3146
          othLength = arrays.length,
3147
          othIndex = othLength,
3148
          caches = Array(othLength),
3149
          maxLength = Infinity,
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Infinity as maxLength. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
3150
          result = [];
3151
3152
      while (othIndex--) {
3153
        var array = arrays[othIndex];
3154
        if (othIndex && iteratee) {
3155
          array = arrayMap(array, baseUnary(iteratee));
3156
        }
3157
        maxLength = nativeMin(array.length, maxLength);
3158
        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
3159
          ? new SetCache(othIndex && array)
3160
          : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3161
      }
3162
      array = arrays[0];
3163
3164
      var index = -1,
3165
          seen = caches[0];
3166
3167
      outer:
3168
      while (++index < length && result.length < maxLength) {
3169
        var value = array[index],
3170
            computed = iteratee ? iteratee(value) : value;
3171
3172
        value = (comparator || value !== 0) ? value : 0;
3173
        if (!(seen
3174
              ? cacheHas(seen, computed)
3175
              : includes(result, computed, comparator)
3176
            )) {
3177
          othIndex = othLength;
3178
          while (--othIndex) {
3179
            var cache = caches[othIndex];
3180
            if (!(cache
3181
                  ? cacheHas(cache, computed)
3182
                  : includes(arrays[othIndex], computed, comparator))
3183
                ) {
3184
              continue outer;
3185
            }
3186
          }
3187
          if (seen) {
3188
            seen.push(computed);
3189
          }
3190
          result.push(value);
3191
        }
3192
      }
3193
      return result;
3194
    }
3195
3196
    /**
3197
     * The base implementation of `_.invert` and `_.invertBy` which inverts
3198
     * `object` with values transformed by `iteratee` and set by `setter`.
3199
     *
3200
     * @private
3201
     * @param {Object} object The object to iterate over.
3202
     * @param {Function} setter The function to set `accumulator` values.
3203
     * @param {Function} iteratee The iteratee to transform values.
3204
     * @param {Object} accumulator The initial inverted object.
3205
     * @returns {Function} Returns `accumulator`.
3206
     */
3207
    function baseInverter(object, setter, iteratee, accumulator) {
3208
      baseForOwn(object, function(value, key, object) {
3209
        setter(accumulator, iteratee(value), key, object);
3210
      });
3211
      return accumulator;
3212
    }
3213
3214
    /**
3215
     * The base implementation of `_.invoke` without support for individual
3216
     * method arguments.
3217
     *
3218
     * @private
3219
     * @param {Object} object The object to query.
3220
     * @param {Array|string} path The path of the method to invoke.
3221
     * @param {Array} args The arguments to invoke the method with.
3222
     * @returns {*} Returns the result of the invoked method.
3223
     */
3224
    function baseInvoke(object, path, args) {
3225
      path = castPath(path, object);
3226
      object = parent(object, path);
3227
      var func = object == null ? object : object[toKey(last(path))];
3228
      return func == null ? undefined : apply(func, object, args);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3229
    }
3230
3231
    /**
3232
     * The base implementation of `_.isArguments`.
3233
     *
3234
     * @private
3235
     * @param {*} value The value to check.
3236
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
3237
     */
3238
    function baseIsArguments(value) {
3239
      return isObjectLike(value) && baseGetTag(value) == argsTag;
3240
    }
3241
3242
    /**
3243
     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
3244
     *
3245
     * @private
3246
     * @param {*} value The value to check.
3247
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
3248
     */
3249
    function baseIsArrayBuffer(value) {
3250
      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
3251
    }
3252
3253
    /**
3254
     * The base implementation of `_.isDate` without Node.js optimizations.
3255
     *
3256
     * @private
3257
     * @param {*} value The value to check.
3258
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
3259
     */
3260
    function baseIsDate(value) {
3261
      return isObjectLike(value) && baseGetTag(value) == dateTag;
3262
    }
3263
3264
    /**
3265
     * The base implementation of `_.isEqual` which supports partial comparisons
3266
     * and tracks traversed objects.
3267
     *
3268
     * @private
3269
     * @param {*} value The value to compare.
3270
     * @param {*} other The other value to compare.
3271
     * @param {boolean} bitmask The bitmask flags.
3272
     *  1 - Unordered comparison
3273
     *  2 - Partial comparison
3274
     * @param {Function} [customizer] The function to customize comparisons.
3275
     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
3276
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
3277
     */
3278
    function baseIsEqual(value, other, bitmask, customizer, stack) {
3279
      if (value === other) {
3280
        return true;
3281
      }
3282
      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
3283
        return value !== value && other !== other;
3284
      }
3285
      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
3286
    }
3287
3288
    /**
3289
     * A specialized version of `baseIsEqual` for arrays and objects which performs
3290
     * deep comparisons and tracks traversed objects enabling objects with circular
3291
     * references to be compared.
3292
     *
3293
     * @private
3294
     * @param {Object} object The object to compare.
3295
     * @param {Object} other The other object to compare.
3296
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
3297
     * @param {Function} customizer The function to customize comparisons.
3298
     * @param {Function} equalFunc The function to determine equivalents of values.
3299
     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
3300
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
3301
     */
3302
    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
3303
      var objIsArr = isArray(object),
3304
          othIsArr = isArray(other),
3305
          objTag = objIsArr ? arrayTag : getTag(object),
3306
          othTag = othIsArr ? arrayTag : getTag(other);
3307
3308
      objTag = objTag == argsTag ? objectTag : objTag;
3309
      othTag = othTag == argsTag ? objectTag : othTag;
3310
3311
      var objIsObj = objTag == objectTag,
3312
          othIsObj = othTag == objectTag,
3313
          isSameTag = objTag == othTag;
3314
3315
      if (isSameTag && isBuffer(object)) {
3316
        if (!isBuffer(other)) {
3317
          return false;
3318
        }
3319
        objIsArr = true;
3320
        objIsObj = false;
3321
      }
3322
      if (isSameTag && !objIsObj) {
3323
        stack || (stack = new Stack);
3324
        return (objIsArr || isTypedArray(object))
3325
          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
3326
          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
3327
      }
3328
      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
3329
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
3330
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
3331
3332
        if (objIsWrapped || othIsWrapped) {
3333
          var objUnwrapped = objIsWrapped ? object.value() : object,
3334
              othUnwrapped = othIsWrapped ? other.value() : other;
3335
3336
          stack || (stack = new Stack);
3337
          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
3338
        }
3339
      }
3340
      if (!isSameTag) {
3341
        return false;
3342
      }
3343
      stack || (stack = new Stack);
3344
      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
3345
    }
3346
3347
    /**
3348
     * The base implementation of `_.isMap` without Node.js optimizations.
3349
     *
3350
     * @private
3351
     * @param {*} value The value to check.
3352
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
3353
     */
3354
    function baseIsMap(value) {
3355
      return isObjectLike(value) && getTag(value) == mapTag;
3356
    }
3357
3358
    /**
3359
     * The base implementation of `_.isMatch` without support for iteratee shorthands.
3360
     *
3361
     * @private
3362
     * @param {Object} object The object to inspect.
3363
     * @param {Object} source The object of property values to match.
3364
     * @param {Array} matchData The property names, values, and compare flags to match.
3365
     * @param {Function} [customizer] The function to customize comparisons.
3366
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
3367
     */
3368
    function baseIsMatch(object, source, matchData, customizer) {
3369
      var index = matchData.length,
3370
          length = index,
3371
          noCustomizer = !customizer;
3372
3373
      if (object == null) {
3374
        return !length;
3375
      }
3376
      object = Object(object);
3377
      while (index--) {
3378
        var data = matchData[index];
3379
        if ((noCustomizer && data[2])
3380
              ? data[1] !== object[data[0]]
3381
              : !(data[0] in object)
3382
            ) {
3383
          return false;
3384
        }
3385
      }
3386
      while (++index < length) {
3387
        data = matchData[index];
3388
        var key = data[0],
3389
            objValue = object[key],
3390
            srcValue = data[1];
3391
3392
        if (noCustomizer && data[2]) {
3393
          if (objValue === undefined && !(key in object)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3394
            return false;
3395
          }
3396
        } else {
3397
          var stack = new Stack;
3398
          if (customizer) {
3399
            var result = customizer(objValue, srcValue, key, object, source, stack);
3400
          }
3401
          if (!(result === undefined
0 ignored issues
show
Bug introduced by
The variable result seems to not be initialized for all possible execution paths.
Loading history...
3402
                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
3403
                : result
3404
              )) {
3405
            return false;
3406
          }
3407
        }
3408
      }
3409
      return true;
3410
    }
3411
3412
    /**
3413
     * The base implementation of `_.isNative` without bad shim checks.
3414
     *
3415
     * @private
3416
     * @param {*} value The value to check.
3417
     * @returns {boolean} Returns `true` if `value` is a native function,
3418
     *  else `false`.
3419
     */
3420
    function baseIsNative(value) {
3421
      if (!isObject(value) || isMasked(value)) {
3422
        return false;
3423
      }
3424
      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
3425
      return pattern.test(toSource(value));
3426
    }
3427
3428
    /**
3429
     * The base implementation of `_.isRegExp` without Node.js optimizations.
3430
     *
3431
     * @private
3432
     * @param {*} value The value to check.
3433
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
3434
     */
3435
    function baseIsRegExp(value) {
3436
      return isObjectLike(value) && baseGetTag(value) == regexpTag;
3437
    }
3438
3439
    /**
3440
     * The base implementation of `_.isSet` without Node.js optimizations.
3441
     *
3442
     * @private
3443
     * @param {*} value The value to check.
3444
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
3445
     */
3446
    function baseIsSet(value) {
3447
      return isObjectLike(value) && getTag(value) == setTag;
3448
    }
3449
3450
    /**
3451
     * The base implementation of `_.isTypedArray` without Node.js optimizations.
3452
     *
3453
     * @private
3454
     * @param {*} value The value to check.
3455
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
3456
     */
3457
    function baseIsTypedArray(value) {
3458
      return isObjectLike(value) &&
3459
        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
3460
    }
3461
3462
    /**
3463
     * The base implementation of `_.iteratee`.
3464
     *
3465
     * @private
3466
     * @param {*} [value=_.identity] The value to convert to an iteratee.
3467
     * @returns {Function} Returns the iteratee.
3468
     */
3469
    function baseIteratee(value) {
3470
      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
3471
      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
3472
      if (typeof value == 'function') {
3473
        return value;
3474
      }
3475
      if (value == null) {
3476
        return identity;
3477
      }
3478
      if (typeof value == 'object') {
3479
        return isArray(value)
3480
          ? baseMatchesProperty(value[0], value[1])
3481
          : baseMatches(value);
3482
      }
3483
      return property(value);
3484
    }
3485
3486
    /**
3487
     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
3488
     *
3489
     * @private
3490
     * @param {Object} object The object to query.
3491
     * @returns {Array} Returns the array of property names.
3492
     */
3493
    function baseKeys(object) {
3494
      if (!isPrototype(object)) {
3495
        return nativeKeys(object);
3496
      }
3497
      var result = [];
3498
      for (var key in Object(object)) {
3499
        if (hasOwnProperty.call(object, key) && key != 'constructor') {
3500
          result.push(key);
3501
        }
3502
      }
3503
      return result;
3504
    }
3505
3506
    /**
3507
     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
3508
     *
3509
     * @private
3510
     * @param {Object} object The object to query.
3511
     * @returns {Array} Returns the array of property names.
3512
     */
3513
    function baseKeysIn(object) {
3514
      if (!isObject(object)) {
3515
        return nativeKeysIn(object);
3516
      }
3517
      var isProto = isPrototype(object),
3518
          result = [];
3519
3520
      for (var key in object) {
3521
        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
3522
          result.push(key);
3523
        }
3524
      }
3525
      return result;
3526
    }
3527
3528
    /**
3529
     * The base implementation of `_.lt` which doesn't coerce arguments.
3530
     *
3531
     * @private
3532
     * @param {*} value The value to compare.
3533
     * @param {*} other The other value to compare.
3534
     * @returns {boolean} Returns `true` if `value` is less than `other`,
3535
     *  else `false`.
3536
     */
3537
    function baseLt(value, other) {
3538
      return value < other;
3539
    }
3540
3541
    /**
3542
     * The base implementation of `_.map` without support for iteratee shorthands.
3543
     *
3544
     * @private
3545
     * @param {Array|Object} collection The collection to iterate over.
3546
     * @param {Function} iteratee The function invoked per iteration.
3547
     * @returns {Array} Returns the new mapped array.
3548
     */
3549
    function baseMap(collection, iteratee) {
3550
      var index = -1,
3551
          result = isArrayLike(collection) ? Array(collection.length) : [];
3552
3553
      baseEach(collection, function(value, key, collection) {
3554
        result[++index] = iteratee(value, key, collection);
3555
      });
3556
      return result;
3557
    }
3558
3559
    /**
3560
     * The base implementation of `_.matches` which doesn't clone `source`.
3561
     *
3562
     * @private
3563
     * @param {Object} source The object of property values to match.
3564
     * @returns {Function} Returns the new spec function.
3565
     */
3566
    function baseMatches(source) {
3567
      var matchData = getMatchData(source);
3568
      if (matchData.length == 1 && matchData[0][2]) {
3569
        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
3570
      }
3571
      return function(object) {
3572
        return object === source || baseIsMatch(object, source, matchData);
3573
      };
3574
    }
3575
3576
    /**
3577
     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
3578
     *
3579
     * @private
3580
     * @param {string} path The path of the property to get.
3581
     * @param {*} srcValue The value to match.
3582
     * @returns {Function} Returns the new spec function.
3583
     */
3584
    function baseMatchesProperty(path, srcValue) {
3585
      if (isKey(path) && isStrictComparable(srcValue)) {
3586
        return matchesStrictComparable(toKey(path), srcValue);
3587
      }
3588
      return function(object) {
3589
        var objValue = get(object, path);
3590
        return (objValue === undefined && objValue === srcValue)
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3591
          ? hasIn(object, path)
3592
          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
3593
      };
3594
    }
3595
3596
    /**
3597
     * The base implementation of `_.merge` without support for multiple sources.
3598
     *
3599
     * @private
3600
     * @param {Object} object The destination object.
3601
     * @param {Object} source The source object.
3602
     * @param {number} srcIndex The index of `source`.
3603
     * @param {Function} [customizer] The function to customize merged values.
3604
     * @param {Object} [stack] Tracks traversed source values and their merged
3605
     *  counterparts.
3606
     */
3607
    function baseMerge(object, source, srcIndex, customizer, stack) {
3608
      if (object === source) {
3609
        return;
3610
      }
3611
      baseFor(source, function(srcValue, key) {
3612
        if (isObject(srcValue)) {
3613
          stack || (stack = new Stack);
3614
          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
3615
        }
3616
        else {
3617
          var newValue = customizer
3618
            ? customizer(object[key], srcValue, (key + ''), object, source, stack)
3619
            : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3620
3621
          if (newValue === undefined) {
3622
            newValue = srcValue;
3623
          }
3624
          assignMergeValue(object, key, newValue);
3625
        }
3626
      }, keysIn);
3627
    }
3628
3629
    /**
3630
     * A specialized version of `baseMerge` for arrays and objects which performs
3631
     * deep merges and tracks traversed objects enabling objects with circular
3632
     * references to be merged.
3633
     *
3634
     * @private
3635
     * @param {Object} object The destination object.
3636
     * @param {Object} source The source object.
3637
     * @param {string} key The key of the value to merge.
3638
     * @param {number} srcIndex The index of `source`.
3639
     * @param {Function} mergeFunc The function to merge values.
3640
     * @param {Function} [customizer] The function to customize assigned values.
3641
     * @param {Object} [stack] Tracks traversed source values and their merged
3642
     *  counterparts.
3643
     */
3644
    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
3645
      var objValue = object[key],
3646
          srcValue = source[key],
3647
          stacked = stack.get(srcValue);
3648
3649
      if (stacked) {
3650
        assignMergeValue(object, key, stacked);
3651
        return;
3652
      }
3653
      var newValue = customizer
3654
        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
3655
        : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3656
3657
      var isCommon = newValue === undefined;
3658
3659
      if (isCommon) {
3660
        var isArr = isArray(srcValue),
3661
            isBuff = !isArr && isBuffer(srcValue),
3662
            isTyped = !isArr && !isBuff && isTypedArray(srcValue);
3663
3664
        newValue = srcValue;
3665
        if (isArr || isBuff || isTyped) {
3666
          if (isArray(objValue)) {
3667
            newValue = objValue;
3668
          }
3669
          else if (isArrayLikeObject(objValue)) {
3670
            newValue = copyArray(objValue);
3671
          }
3672
          else if (isBuff) {
3673
            isCommon = false;
3674
            newValue = cloneBuffer(srcValue, true);
3675
          }
3676
          else if (isTyped) {
3677
            isCommon = false;
3678
            newValue = cloneTypedArray(srcValue, true);
3679
          }
3680
          else {
3681
            newValue = [];
3682
          }
3683
        }
3684
        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
3685
          newValue = objValue;
3686
          if (isArguments(objValue)) {
3687
            newValue = toPlainObject(objValue);
3688
          }
3689
          else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
3690
            newValue = initCloneObject(srcValue);
3691
          }
3692
        }
3693
        else {
3694
          isCommon = false;
3695
        }
3696
      }
3697
      if (isCommon) {
3698
        // Recursively merge objects and arrays (susceptible to call stack limits).
3699
        stack.set(srcValue, newValue);
3700
        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
3701
        stack['delete'](srcValue);
3702
      }
3703
      assignMergeValue(object, key, newValue);
3704
    }
3705
3706
    /**
3707
     * The base implementation of `_.nth` which doesn't coerce arguments.
3708
     *
3709
     * @private
3710
     * @param {Array} array The array to query.
3711
     * @param {number} n The index of the element to return.
3712
     * @returns {*} Returns the nth element of `array`.
3713
     */
3714
    function baseNth(array, n) {
3715
      var length = array.length;
3716
      if (!length) {
3717
        return;
3718
      }
3719
      n += n < 0 ? length : 0;
3720
      return isIndex(n, length) ? array[n] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3721
    }
3722
3723
    /**
3724
     * The base implementation of `_.orderBy` without param guards.
3725
     *
3726
     * @private
3727
     * @param {Array|Object} collection The collection to iterate over.
3728
     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
3729
     * @param {string[]} orders The sort orders of `iteratees`.
3730
     * @returns {Array} Returns the new sorted array.
3731
     */
3732
    function baseOrderBy(collection, iteratees, orders) {
3733
      var index = -1;
3734
      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));
3735
3736
      var result = baseMap(collection, function(value, key, collection) {
3737
        var criteria = arrayMap(iteratees, function(iteratee) {
3738
          return iteratee(value);
3739
        });
3740
        return { 'criteria': criteria, 'index': ++index, 'value': value };
3741
      });
3742
3743
      return baseSortBy(result, function(object, other) {
3744
        return compareMultiple(object, other, orders);
3745
      });
3746
    }
3747
3748
    /**
3749
     * The base implementation of `_.pick` without support for individual
3750
     * property identifiers.
3751
     *
3752
     * @private
3753
     * @param {Object} object The source object.
3754
     * @param {string[]} paths The property paths to pick.
3755
     * @returns {Object} Returns the new object.
3756
     */
3757
    function basePick(object, paths) {
3758
      return basePickBy(object, paths, function(value, path) {
3759
        return hasIn(object, path);
3760
      });
3761
    }
3762
3763
    /**
3764
     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
3765
     *
3766
     * @private
3767
     * @param {Object} object The source object.
3768
     * @param {string[]} paths The property paths to pick.
3769
     * @param {Function} predicate The function invoked per property.
3770
     * @returns {Object} Returns the new object.
3771
     */
3772
    function basePickBy(object, paths, predicate) {
3773
      var index = -1,
3774
          length = paths.length,
3775
          result = {};
3776
3777
      while (++index < length) {
3778
        var path = paths[index],
3779
            value = baseGet(object, path);
3780
3781
        if (predicate(value, path)) {
3782
          baseSet(result, castPath(path, object), value);
3783
        }
3784
      }
3785
      return result;
3786
    }
3787
3788
    /**
3789
     * A specialized version of `baseProperty` which supports deep paths.
3790
     *
3791
     * @private
3792
     * @param {Array|string} path The path of the property to get.
3793
     * @returns {Function} Returns the new accessor function.
3794
     */
3795
    function basePropertyDeep(path) {
3796
      return function(object) {
3797
        return baseGet(object, path);
3798
      };
3799
    }
3800
3801
    /**
3802
     * The base implementation of `_.pullAllBy` without support for iteratee
3803
     * shorthands.
3804
     *
3805
     * @private
3806
     * @param {Array} array The array to modify.
3807
     * @param {Array} values The values to remove.
3808
     * @param {Function} [iteratee] The iteratee invoked per element.
3809
     * @param {Function} [comparator] The comparator invoked per element.
3810
     * @returns {Array} Returns `array`.
3811
     */
3812
    function basePullAll(array, values, iteratee, comparator) {
3813
      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
3814
          index = -1,
3815
          length = values.length,
3816
          seen = array;
3817
3818
      if (array === values) {
3819
        values = copyArray(values);
3820
      }
3821
      if (iteratee) {
3822
        seen = arrayMap(array, baseUnary(iteratee));
3823
      }
3824
      while (++index < length) {
3825
        var fromIndex = 0,
3826
            value = values[index],
3827
            computed = iteratee ? iteratee(value) : value;
3828
3829
        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
3830
          if (seen !== array) {
3831
            splice.call(seen, fromIndex, 1);
3832
          }
3833
          splice.call(array, fromIndex, 1);
3834
        }
3835
      }
3836
      return array;
3837
    }
3838
3839
    /**
3840
     * The base implementation of `_.pullAt` without support for individual
3841
     * indexes or capturing the removed elements.
3842
     *
3843
     * @private
3844
     * @param {Array} array The array to modify.
3845
     * @param {number[]} indexes The indexes of elements to remove.
3846
     * @returns {Array} Returns `array`.
3847
     */
3848
    function basePullAt(array, indexes) {
3849
      var length = array ? indexes.length : 0,
3850
          lastIndex = length - 1;
3851
3852
      while (length--) {
3853
        var index = indexes[length];
3854
        if (length == lastIndex || index !== previous) {
0 ignored issues
show
Bug introduced by
The variable previous seems to not be initialized for all possible execution paths.
Loading history...
3855
          var previous = index;
3856
          if (isIndex(index)) {
3857
            splice.call(array, index, 1);
3858
          } else {
3859
            baseUnset(array, index);
3860
          }
3861
        }
3862
      }
3863
      return array;
3864
    }
3865
3866
    /**
3867
     * The base implementation of `_.random` without support for returning
3868
     * floating-point numbers.
3869
     *
3870
     * @private
3871
     * @param {number} lower The lower bound.
3872
     * @param {number} upper The upper bound.
3873
     * @returns {number} Returns the random number.
3874
     */
3875
    function baseRandom(lower, upper) {
3876
      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
3877
    }
3878
3879
    /**
3880
     * The base implementation of `_.range` and `_.rangeRight` which doesn't
3881
     * coerce arguments.
3882
     *
3883
     * @private
3884
     * @param {number} start The start of the range.
3885
     * @param {number} end The end of the range.
3886
     * @param {number} step The value to increment or decrement by.
3887
     * @param {boolean} [fromRight] Specify iterating from right to left.
3888
     * @returns {Array} Returns the range of numbers.
3889
     */
3890
    function baseRange(start, end, step, fromRight) {
3891
      var index = -1,
3892
          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
3893
          result = Array(length);
3894
3895
      while (length--) {
3896
        result[fromRight ? length : ++index] = start;
3897
        start += step;
3898
      }
3899
      return result;
3900
    }
3901
3902
    /**
3903
     * The base implementation of `_.repeat` which doesn't coerce arguments.
3904
     *
3905
     * @private
3906
     * @param {string} string The string to repeat.
3907
     * @param {number} n The number of times to repeat the string.
3908
     * @returns {string} Returns the repeated string.
3909
     */
3910
    function baseRepeat(string, n) {
3911
      var result = '';
3912
      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
3913
        return result;
3914
      }
3915
      // Leverage the exponentiation by squaring algorithm for a faster repeat.
3916
      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
3917
      do {
3918
        if (n % 2) {
3919
          result += string;
3920
        }
3921
        n = nativeFloor(n / 2);
3922
        if (n) {
3923
          string += string;
3924
        }
3925
      } while (n);
3926
3927
      return result;
3928
    }
3929
3930
    /**
3931
     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
3932
     *
3933
     * @private
3934
     * @param {Function} func The function to apply a rest parameter to.
3935
     * @param {number} [start=func.length-1] The start position of the rest parameter.
3936
     * @returns {Function} Returns the new function.
3937
     */
3938
    function baseRest(func, start) {
3939
      return setToString(overRest(func, start, identity), func + '');
3940
    }
3941
3942
    /**
3943
     * The base implementation of `_.sample`.
3944
     *
3945
     * @private
3946
     * @param {Array|Object} collection The collection to sample.
3947
     * @returns {*} Returns the random element.
3948
     */
3949
    function baseSample(collection) {
3950
      return arraySample(values(collection));
3951
    }
3952
3953
    /**
3954
     * The base implementation of `_.sampleSize` without param guards.
3955
     *
3956
     * @private
3957
     * @param {Array|Object} collection The collection to sample.
3958
     * @param {number} n The number of elements to sample.
3959
     * @returns {Array} Returns the random elements.
3960
     */
3961
    function baseSampleSize(collection, n) {
3962
      var array = values(collection);
3963
      return shuffleSelf(array, baseClamp(n, 0, array.length));
3964
    }
3965
3966
    /**
3967
     * The base implementation of `_.set`.
3968
     *
3969
     * @private
3970
     * @param {Object} object The object to modify.
3971
     * @param {Array|string} path The path of the property to set.
3972
     * @param {*} value The value to set.
3973
     * @param {Function} [customizer] The function to customize path creation.
3974
     * @returns {Object} Returns `object`.
3975
     */
3976
    function baseSet(object, path, value, customizer) {
3977
      if (!isObject(object)) {
3978
        return object;
3979
      }
3980
      path = castPath(path, object);
3981
3982
      var index = -1,
3983
          length = path.length,
3984
          lastIndex = length - 1,
3985
          nested = object;
3986
3987
      while (nested != null && ++index < length) {
3988
        var key = toKey(path[index]),
3989
            newValue = value;
3990
3991
        if (index != lastIndex) {
3992
          var objValue = nested[key];
3993
          newValue = customizer ? customizer(objValue, key, nested) : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
3994
          if (newValue === undefined) {
3995
            newValue = isObject(objValue)
3996
              ? objValue
3997
              : (isIndex(path[index + 1]) ? [] : {});
3998
          }
3999
        }
4000
        assignValue(nested, key, newValue);
4001
        nested = nested[key];
4002
      }
4003
      return object;
4004
    }
4005
4006
    /**
4007
     * The base implementation of `setData` without support for hot loop shorting.
4008
     *
4009
     * @private
4010
     * @param {Function} func The function to associate metadata with.
4011
     * @param {*} data The metadata.
4012
     * @returns {Function} Returns `func`.
4013
     */
4014
    var baseSetData = !metaMap ? identity : function(func, data) {
4015
      metaMap.set(func, data);
4016
      return func;
4017
    };
4018
4019
    /**
4020
     * The base implementation of `setToString` without support for hot loop shorting.
4021
     *
4022
     * @private
4023
     * @param {Function} func The function to modify.
4024
     * @param {Function} string The `toString` result.
4025
     * @returns {Function} Returns `func`.
4026
     */
4027
    var baseSetToString = !defineProperty ? identity : function(func, string) {
4028
      return defineProperty(func, 'toString', {
4029
        'configurable': true,
4030
        'enumerable': false,
4031
        'value': constant(string),
4032
        'writable': true
4033
      });
4034
    };
4035
4036
    /**
4037
     * The base implementation of `_.shuffle`.
4038
     *
4039
     * @private
4040
     * @param {Array|Object} collection The collection to shuffle.
4041
     * @returns {Array} Returns the new shuffled array.
4042
     */
4043
    function baseShuffle(collection) {
4044
      return shuffleSelf(values(collection));
4045
    }
4046
4047
    /**
4048
     * The base implementation of `_.slice` without an iteratee call guard.
4049
     *
4050
     * @private
4051
     * @param {Array} array The array to slice.
4052
     * @param {number} [start=0] The start position.
4053
     * @param {number} [end=array.length] The end position.
4054
     * @returns {Array} Returns the slice of `array`.
4055
     */
4056
    function baseSlice(array, start, end) {
4057
      var index = -1,
4058
          length = array.length;
4059
4060
      if (start < 0) {
4061
        start = -start > length ? 0 : (length + start);
4062
      }
4063
      end = end > length ? length : end;
4064
      if (end < 0) {
4065
        end += length;
4066
      }
4067
      length = start > end ? 0 : ((end - start) >>> 0);
4068
      start >>>= 0;
4069
4070
      var result = Array(length);
4071
      while (++index < length) {
4072
        result[index] = array[index + start];
4073
      }
4074
      return result;
4075
    }
4076
4077
    /**
4078
     * The base implementation of `_.some` without support for iteratee shorthands.
4079
     *
4080
     * @private
4081
     * @param {Array|Object} collection The collection to iterate over.
4082
     * @param {Function} predicate The function invoked per iteration.
4083
     * @returns {boolean} Returns `true` if any element passes the predicate check,
4084
     *  else `false`.
4085
     */
4086
    function baseSome(collection, predicate) {
4087
      var result;
4088
4089
      baseEach(collection, function(value, index, collection) {
4090
        result = predicate(value, index, collection);
4091
        return !result;
4092
      });
4093
      return !!result;
4094
    }
4095
4096
    /**
4097
     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
4098
     * performs a binary search of `array` to determine the index at which `value`
4099
     * should be inserted into `array` in order to maintain its sort order.
4100
     *
4101
     * @private
4102
     * @param {Array} array The sorted array to inspect.
4103
     * @param {*} value The value to evaluate.
4104
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
4105
     * @returns {number} Returns the index at which `value` should be inserted
4106
     *  into `array`.
4107
     */
4108 View Code Duplication
    function baseSortedIndex(array, value, retHighest) {
4109
      var low = 0,
4110
          high = array == null ? low : array.length;
4111
4112
      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
4113
        while (low < high) {
4114
          var mid = (low + high) >>> 1,
4115
              computed = array[mid];
4116
4117
          if (computed !== null && !isSymbol(computed) &&
4118
              (retHighest ? (computed <= value) : (computed < value))) {
4119
            low = mid + 1;
4120
          } else {
4121
            high = mid;
4122
          }
4123
        }
4124
        return high;
4125
      }
4126
      return baseSortedIndexBy(array, value, identity, retHighest);
4127
    }
4128
4129
    /**
4130
     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
4131
     * which invokes `iteratee` for `value` and each element of `array` to compute
4132
     * their sort ranking. The iteratee is invoked with one argument; (value).
4133
     *
4134
     * @private
4135
     * @param {Array} array The sorted array to inspect.
4136
     * @param {*} value The value to evaluate.
4137
     * @param {Function} iteratee The iteratee invoked per element.
4138
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
4139
     * @returns {number} Returns the index at which `value` should be inserted
4140
     *  into `array`.
4141
     */
4142
    function baseSortedIndexBy(array, value, iteratee, retHighest) {
4143
      value = iteratee(value);
4144
4145
      var low = 0,
4146
          high = array == null ? 0 : array.length,
4147
          valIsNaN = value !== value,
4148
          valIsNull = value === null,
4149
          valIsSymbol = isSymbol(value),
4150
          valIsUndefined = value === undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4151
4152
      while (low < high) {
4153
        var mid = nativeFloor((low + high) / 2),
4154
            computed = iteratee(array[mid]),
4155
            othIsDefined = computed !== undefined,
4156
            othIsNull = computed === null,
4157
            othIsReflexive = computed === computed,
4158
            othIsSymbol = isSymbol(computed);
4159
4160
        if (valIsNaN) {
4161
          var setLow = retHighest || othIsReflexive;
4162
        } else if (valIsUndefined) {
4163
          setLow = othIsReflexive && (retHighest || othIsDefined);
4164
        } else if (valIsNull) {
4165
          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
4166
        } else if (valIsSymbol) {
4167
          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
4168
        } else if (othIsNull || othIsSymbol) {
4169
          setLow = false;
4170
        } else {
4171
          setLow = retHighest ? (computed <= value) : (computed < value);
4172
        }
4173
        if (setLow) {
4174
          low = mid + 1;
4175
        } else {
4176
          high = mid;
4177
        }
4178
      }
4179
      return nativeMin(high, MAX_ARRAY_INDEX);
4180
    }
4181
4182
    /**
4183
     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
4184
     * support for iteratee shorthands.
4185
     *
4186
     * @private
4187
     * @param {Array} array The array to inspect.
4188
     * @param {Function} [iteratee] The iteratee invoked per element.
4189
     * @returns {Array} Returns the new duplicate free array.
4190
     */
4191
    function baseSortedUniq(array, iteratee) {
4192
      var index = -1,
4193
          length = array.length,
4194
          resIndex = 0,
4195
          result = [];
4196
4197
      while (++index < length) {
4198
        var value = array[index],
4199
            computed = iteratee ? iteratee(value) : value;
4200
4201
        if (!index || !eq(computed, seen)) {
0 ignored issues
show
Bug introduced by
The variable seen seems to not be initialized for all possible execution paths. Are you sure eq handles undefined variables?
Loading history...
4202
          var seen = computed;
4203
          result[resIndex++] = value === 0 ? 0 : value;
4204
        }
4205
      }
4206
      return result;
4207
    }
4208
4209
    /**
4210
     * The base implementation of `_.toNumber` which doesn't ensure correct
4211
     * conversions of binary, hexadecimal, or octal string values.
4212
     *
4213
     * @private
4214
     * @param {*} value The value to process.
4215
     * @returns {number} Returns the number.
4216
     */
4217
    function baseToNumber(value) {
4218
      if (typeof value == 'number') {
4219
        return value;
4220
      }
4221
      if (isSymbol(value)) {
4222
        return NAN;
4223
      }
4224
      return +value;
4225
    }
4226
4227
    /**
4228
     * The base implementation of `_.toString` which doesn't convert nullish
4229
     * values to empty strings.
4230
     *
4231
     * @private
4232
     * @param {*} value The value to process.
4233
     * @returns {string} Returns the string.
4234
     */
4235
    function baseToString(value) {
4236
      // Exit early for strings to avoid a performance hit in some environments.
4237
      if (typeof value == 'string') {
4238
        return value;
4239
      }
4240
      if (isArray(value)) {
4241
        // Recursively convert values (susceptible to call stack limits).
4242
        return arrayMap(value, baseToString) + '';
4243
      }
4244
      if (isSymbol(value)) {
4245
        return symbolToString ? symbolToString.call(value) : '';
4246
      }
4247
      var result = (value + '');
4248
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
4249
    }
4250
4251
    /**
4252
     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
4253
     *
4254
     * @private
4255
     * @param {Array} array The array to inspect.
4256
     * @param {Function} [iteratee] The iteratee invoked per element.
4257
     * @param {Function} [comparator] The comparator invoked per element.
4258
     * @returns {Array} Returns the new duplicate free array.
4259
     */
4260
    function baseUniq(array, iteratee, comparator) {
4261
      var index = -1,
4262
          includes = arrayIncludes,
4263
          length = array.length,
4264
          isCommon = true,
4265
          result = [],
4266
          seen = result;
4267
4268
      if (comparator) {
4269
        isCommon = false;
4270
        includes = arrayIncludesWith;
4271
      }
4272
      else if (length >= LARGE_ARRAY_SIZE) {
4273
        var set = iteratee ? null : createSet(array);
4274
        if (set) {
4275
          return setToArray(set);
4276
        }
4277
        isCommon = false;
4278
        includes = cacheHas;
4279
        seen = new SetCache;
4280
      }
4281
      else {
4282
        seen = iteratee ? [] : result;
4283
      }
4284
      outer:
4285
      while (++index < length) {
4286
        var value = array[index],
4287
            computed = iteratee ? iteratee(value) : value;
4288
4289
        value = (comparator || value !== 0) ? value : 0;
4290
        if (isCommon && computed === computed) {
4291
          var seenIndex = seen.length;
4292
          while (seenIndex--) {
4293
            if (seen[seenIndex] === computed) {
4294
              continue outer;
4295
            }
4296
          }
4297
          if (iteratee) {
4298
            seen.push(computed);
4299
          }
4300
          result.push(value);
4301
        }
4302
        else if (!includes(seen, computed, comparator)) {
4303
          if (seen !== result) {
4304
            seen.push(computed);
4305
          }
4306
          result.push(value);
4307
        }
4308
      }
4309
      return result;
4310
    }
4311
4312
    /**
4313
     * The base implementation of `_.unset`.
4314
     *
4315
     * @private
4316
     * @param {Object} object The object to modify.
4317
     * @param {Array|string} path The property path to unset.
4318
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
4319
     */
4320
    function baseUnset(object, path) {
4321
      path = castPath(path, object);
4322
      object = parent(object, path);
4323
      return object == null || delete object[toKey(last(path))];
4324
    }
4325
4326
    /**
4327
     * The base implementation of `_.update`.
4328
     *
4329
     * @private
4330
     * @param {Object} object The object to modify.
4331
     * @param {Array|string} path The path of the property to update.
4332
     * @param {Function} updater The function to produce the updated value.
4333
     * @param {Function} [customizer] The function to customize path creation.
4334
     * @returns {Object} Returns `object`.
4335
     */
4336
    function baseUpdate(object, path, updater, customizer) {
4337
      return baseSet(object, path, updater(baseGet(object, path)), customizer);
4338
    }
4339
4340
    /**
4341
     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
4342
     * without support for iteratee shorthands.
4343
     *
4344
     * @private
4345
     * @param {Array} array The array to query.
4346
     * @param {Function} predicate The function invoked per iteration.
4347
     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
4348
     * @param {boolean} [fromRight] Specify iterating from right to left.
4349
     * @returns {Array} Returns the slice of `array`.
4350
     */
4351
    function baseWhile(array, predicate, isDrop, fromRight) {
4352
      var length = array.length,
4353
          index = fromRight ? length : -1;
4354
4355
      while ((fromRight ? index-- : ++index < length) &&
4356
        predicate(array[index], index, array)) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
4357
4358
      return isDrop
4359
        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
4360
        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
4361
    }
4362
4363
    /**
4364
     * The base implementation of `wrapperValue` which returns the result of
4365
     * performing a sequence of actions on the unwrapped `value`, where each
4366
     * successive action is supplied the return value of the previous.
4367
     *
4368
     * @private
4369
     * @param {*} value The unwrapped value.
4370
     * @param {Array} actions Actions to perform to resolve the unwrapped value.
4371
     * @returns {*} Returns the resolved value.
4372
     */
4373
    function baseWrapperValue(value, actions) {
4374
      var result = value;
4375
      if (result instanceof LazyWrapper) {
4376
        result = result.value();
4377
      }
4378
      return arrayReduce(actions, function(result, action) {
4379
        return action.func.apply(action.thisArg, arrayPush([result], action.args));
4380
      }, result);
4381
    }
4382
4383
    /**
4384
     * The base implementation of methods like `_.xor`, without support for
4385
     * iteratee shorthands, that accepts an array of arrays to inspect.
4386
     *
4387
     * @private
4388
     * @param {Array} arrays The arrays to inspect.
4389
     * @param {Function} [iteratee] The iteratee invoked per element.
4390
     * @param {Function} [comparator] The comparator invoked per element.
4391
     * @returns {Array} Returns the new array of values.
4392
     */
4393
    function baseXor(arrays, iteratee, comparator) {
4394
      var length = arrays.length;
4395
      if (length < 2) {
4396
        return length ? baseUniq(arrays[0]) : [];
4397
      }
4398
      var index = -1,
4399
          result = Array(length);
4400
4401
      while (++index < length) {
4402
        var array = arrays[index],
4403
            othIndex = -1;
4404
4405
        while (++othIndex < length) {
4406
          if (othIndex != index) {
4407
            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
4408
          }
4409
        }
4410
      }
4411
      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
4412
    }
4413
4414
    /**
4415
     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
4416
     *
4417
     * @private
4418
     * @param {Array} props The property identifiers.
4419
     * @param {Array} values The property values.
4420
     * @param {Function} assignFunc The function to assign values.
4421
     * @returns {Object} Returns the new object.
4422
     */
4423
    function baseZipObject(props, values, assignFunc) {
4424
      var index = -1,
4425
          length = props.length,
4426
          valsLength = values.length,
4427
          result = {};
4428
4429
      while (++index < length) {
4430
        var value = index < valsLength ? values[index] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4431
        assignFunc(result, props[index], value);
4432
      }
4433
      return result;
4434
    }
4435
4436
    /**
4437
     * Casts `value` to an empty array if it's not an array like object.
4438
     *
4439
     * @private
4440
     * @param {*} value The value to inspect.
4441
     * @returns {Array|Object} Returns the cast array-like object.
4442
     */
4443
    function castArrayLikeObject(value) {
4444
      return isArrayLikeObject(value) ? value : [];
4445
    }
4446
4447
    /**
4448
     * Casts `value` to `identity` if it's not a function.
4449
     *
4450
     * @private
4451
     * @param {*} value The value to inspect.
4452
     * @returns {Function} Returns cast function.
4453
     */
4454
    function castFunction(value) {
4455
      return typeof value == 'function' ? value : identity;
4456
    }
4457
4458
    /**
4459
     * Casts `value` to a path array if it's not one.
4460
     *
4461
     * @private
4462
     * @param {*} value The value to inspect.
4463
     * @param {Object} [object] The object to query keys on.
4464
     * @returns {Array} Returns the cast property path array.
4465
     */
4466
    function castPath(value, object) {
4467
      if (isArray(value)) {
4468
        return value;
4469
      }
4470
      return isKey(value, object) ? [value] : stringToPath(toString(value));
4471
    }
4472
4473
    /**
4474
     * A `baseRest` alias which can be replaced with `identity` by module
4475
     * replacement plugins.
4476
     *
4477
     * @private
4478
     * @type {Function}
4479
     * @param {Function} func The function to apply a rest parameter to.
4480
     * @returns {Function} Returns the new function.
4481
     */
4482
    var castRest = baseRest;
4483
4484
    /**
4485
     * Casts `array` to a slice if it's needed.
4486
     *
4487
     * @private
4488
     * @param {Array} array The array to inspect.
4489
     * @param {number} start The start position.
4490
     * @param {number} [end=array.length] The end position.
4491
     * @returns {Array} Returns the cast slice.
4492
     */
4493
    function castSlice(array, start, end) {
4494
      var length = array.length;
4495
      end = end === undefined ? length : end;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4496
      return (!start && end >= length) ? array : baseSlice(array, start, end);
4497
    }
4498
4499
    /**
4500
     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
4501
     *
4502
     * @private
4503
     * @param {number|Object} id The timer id or timeout object of the timer to clear.
4504
     */
4505
    var clearTimeout = ctxClearTimeout || function(id) {
4506
      return root.clearTimeout(id);
4507
    };
4508
4509
    /**
4510
     * Creates a clone of  `buffer`.
4511
     *
4512
     * @private
4513
     * @param {Buffer} buffer The buffer to clone.
4514
     * @param {boolean} [isDeep] Specify a deep clone.
4515
     * @returns {Buffer} Returns the cloned buffer.
4516
     */
4517
    function cloneBuffer(buffer, isDeep) {
4518
      if (isDeep) {
4519
        return buffer.slice();
4520
      }
4521
      var length = buffer.length,
4522
          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
4523
4524
      buffer.copy(result);
4525
      return result;
4526
    }
4527
4528
    /**
4529
     * Creates a clone of `arrayBuffer`.
4530
     *
4531
     * @private
4532
     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
4533
     * @returns {ArrayBuffer} Returns the cloned array buffer.
4534
     */
4535
    function cloneArrayBuffer(arrayBuffer) {
4536
      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
4537
      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
4538
      return result;
4539
    }
4540
4541
    /**
4542
     * Creates a clone of `dataView`.
4543
     *
4544
     * @private
4545
     * @param {Object} dataView The data view to clone.
4546
     * @param {boolean} [isDeep] Specify a deep clone.
4547
     * @returns {Object} Returns the cloned data view.
4548
     */
4549
    function cloneDataView(dataView, isDeep) {
4550
      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
4551
      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
4552
    }
4553
4554
    /**
4555
     * Creates a clone of `map`.
4556
     *
4557
     * @private
4558
     * @param {Object} map The map to clone.
4559
     * @param {Function} cloneFunc The function to clone values.
4560
     * @param {boolean} [isDeep] Specify a deep clone.
4561
     * @returns {Object} Returns the cloned map.
4562
     */
4563
    function cloneMap(map, isDeep, cloneFunc) {
4564
      var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);
4565
      return arrayReduce(array, addMapEntry, new map.constructor);
4566
    }
4567
4568
    /**
4569
     * Creates a clone of `regexp`.
4570
     *
4571
     * @private
4572
     * @param {Object} regexp The regexp to clone.
4573
     * @returns {Object} Returns the cloned regexp.
4574
     */
4575
    function cloneRegExp(regexp) {
4576
      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
4577
      result.lastIndex = regexp.lastIndex;
4578
      return result;
4579
    }
4580
4581
    /**
4582
     * Creates a clone of `set`.
4583
     *
4584
     * @private
4585
     * @param {Object} set The set to clone.
4586
     * @param {Function} cloneFunc The function to clone values.
4587
     * @param {boolean} [isDeep] Specify a deep clone.
4588
     * @returns {Object} Returns the cloned set.
4589
     */
4590
    function cloneSet(set, isDeep, cloneFunc) {
4591
      var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);
4592
      return arrayReduce(array, addSetEntry, new set.constructor);
4593
    }
4594
4595
    /**
4596
     * Creates a clone of the `symbol` object.
4597
     *
4598
     * @private
4599
     * @param {Object} symbol The symbol object to clone.
4600
     * @returns {Object} Returns the cloned symbol object.
4601
     */
4602
    function cloneSymbol(symbol) {
4603
      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
4604
    }
4605
4606
    /**
4607
     * Creates a clone of `typedArray`.
4608
     *
4609
     * @private
4610
     * @param {Object} typedArray The typed array to clone.
4611
     * @param {boolean} [isDeep] Specify a deep clone.
4612
     * @returns {Object} Returns the cloned typed array.
4613
     */
4614
    function cloneTypedArray(typedArray, isDeep) {
4615
      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
4616
      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
4617
    }
4618
4619
    /**
4620
     * Compares values to sort them in ascending order.
4621
     *
4622
     * @private
4623
     * @param {*} value The value to compare.
4624
     * @param {*} other The other value to compare.
4625
     * @returns {number} Returns the sort order indicator for `value`.
4626
     */
4627 View Code Duplication
    function compareAscending(value, other) {
4628
      if (value !== other) {
4629
        var valIsDefined = value !== undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4630
            valIsNull = value === null,
4631
            valIsReflexive = value === value,
4632
            valIsSymbol = isSymbol(value);
4633
4634
        var othIsDefined = other !== undefined,
4635
            othIsNull = other === null,
4636
            othIsReflexive = other === other,
4637
            othIsSymbol = isSymbol(other);
4638
4639
        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
4640
            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
4641
            (valIsNull && othIsDefined && othIsReflexive) ||
4642
            (!valIsDefined && othIsReflexive) ||
4643
            !valIsReflexive) {
4644
          return 1;
4645
        }
4646
        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
4647
            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
4648
            (othIsNull && valIsDefined && valIsReflexive) ||
4649
            (!othIsDefined && valIsReflexive) ||
4650
            !othIsReflexive) {
4651
          return -1;
4652
        }
4653
      }
4654
      return 0;
4655
    }
4656
4657
    /**
4658
     * Used by `_.orderBy` to compare multiple properties of a value to another
4659
     * and stable sort them.
4660
     *
4661
     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
4662
     * specify an order of "desc" for descending or "asc" for ascending sort order
4663
     * of corresponding values.
4664
     *
4665
     * @private
4666
     * @param {Object} object The object to compare.
4667
     * @param {Object} other The other object to compare.
4668
     * @param {boolean[]|string[]} orders The order to sort by for each property.
4669
     * @returns {number} Returns the sort order indicator for `object`.
4670
     */
4671
    function compareMultiple(object, other, orders) {
4672
      var index = -1,
4673
          objCriteria = object.criteria,
4674
          othCriteria = other.criteria,
4675
          length = objCriteria.length,
4676
          ordersLength = orders.length;
4677
4678
      while (++index < length) {
4679
        var result = compareAscending(objCriteria[index], othCriteria[index]);
4680
        if (result) {
4681
          if (index >= ordersLength) {
4682
            return result;
4683
          }
4684
          var order = orders[index];
4685
          return result * (order == 'desc' ? -1 : 1);
4686
        }
4687
      }
4688
      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
4689
      // that causes it, under certain circumstances, to provide the same value for
4690
      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
4691
      // for more details.
4692
      //
4693
      // This also ensures a stable sort in V8 and other engines.
4694
      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
4695
      return object.index - other.index;
4696
    }
4697
4698
    /**
4699
     * Creates an array that is the composition of partially applied arguments,
4700
     * placeholders, and provided arguments into a single array of arguments.
4701
     *
4702
     * @private
4703
     * @param {Array} args The provided arguments.
4704
     * @param {Array} partials The arguments to prepend to those provided.
4705
     * @param {Array} holders The `partials` placeholder indexes.
4706
     * @params {boolean} [isCurried] Specify composing for a curried function.
4707
     * @returns {Array} Returns the new array of composed arguments.
4708
     */
4709
    function composeArgs(args, partials, holders, isCurried) {
4710
      var argsIndex = -1,
4711
          argsLength = args.length,
4712
          holdersLength = holders.length,
4713
          leftIndex = -1,
4714
          leftLength = partials.length,
4715
          rangeLength = nativeMax(argsLength - holdersLength, 0),
4716
          result = Array(leftLength + rangeLength),
4717
          isUncurried = !isCurried;
4718
4719
      while (++leftIndex < leftLength) {
4720
        result[leftIndex] = partials[leftIndex];
4721
      }
4722
      while (++argsIndex < holdersLength) {
4723
        if (isUncurried || argsIndex < argsLength) {
4724
          result[holders[argsIndex]] = args[argsIndex];
4725
        }
4726
      }
4727
      while (rangeLength--) {
4728
        result[leftIndex++] = args[argsIndex++];
4729
      }
4730
      return result;
4731
    }
4732
4733
    /**
4734
     * This function is like `composeArgs` except that the arguments composition
4735
     * is tailored for `_.partialRight`.
4736
     *
4737
     * @private
4738
     * @param {Array} args The provided arguments.
4739
     * @param {Array} partials The arguments to append to those provided.
4740
     * @param {Array} holders The `partials` placeholder indexes.
4741
     * @params {boolean} [isCurried] Specify composing for a curried function.
4742
     * @returns {Array} Returns the new array of composed arguments.
4743
     */
4744
    function composeArgsRight(args, partials, holders, isCurried) {
4745
      var argsIndex = -1,
4746
          argsLength = args.length,
4747
          holdersIndex = -1,
4748
          holdersLength = holders.length,
4749
          rightIndex = -1,
4750
          rightLength = partials.length,
4751
          rangeLength = nativeMax(argsLength - holdersLength, 0),
4752
          result = Array(rangeLength + rightLength),
4753
          isUncurried = !isCurried;
4754
4755
      while (++argsIndex < rangeLength) {
4756
        result[argsIndex] = args[argsIndex];
4757
      }
4758
      var offset = argsIndex;
4759
      while (++rightIndex < rightLength) {
4760
        result[offset + rightIndex] = partials[rightIndex];
4761
      }
4762
      while (++holdersIndex < holdersLength) {
4763
        if (isUncurried || argsIndex < argsLength) {
4764
          result[offset + holders[holdersIndex]] = args[argsIndex++];
4765
        }
4766
      }
4767
      return result;
4768
    }
4769
4770
    /**
4771
     * Copies the values of `source` to `array`.
4772
     *
4773
     * @private
4774
     * @param {Array} source The array to copy values from.
4775
     * @param {Array} [array=[]] The array to copy values to.
4776
     * @returns {Array} Returns `array`.
4777
     */
4778
    function copyArray(source, array) {
4779
      var index = -1,
4780
          length = source.length;
4781
4782
      array || (array = Array(length));
4783
      while (++index < length) {
4784
        array[index] = source[index];
4785
      }
4786
      return array;
4787
    }
4788
4789
    /**
4790
     * Copies properties of `source` to `object`.
4791
     *
4792
     * @private
4793
     * @param {Object} source The object to copy properties from.
4794
     * @param {Array} props The property identifiers to copy.
4795
     * @param {Object} [object={}] The object to copy properties to.
4796
     * @param {Function} [customizer] The function to customize copied values.
4797
     * @returns {Object} Returns `object`.
4798
     */
4799
    function copyObject(source, props, object, customizer) {
4800
      var isNew = !object;
4801
      object || (object = {});
4802
4803
      var index = -1,
4804
          length = props.length;
4805
4806
      while (++index < length) {
4807
        var key = props[index];
4808
4809
        var newValue = customizer
4810
          ? customizer(object[key], source[key], key, object, source)
4811
          : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4812
4813
        if (newValue === undefined) {
4814
          newValue = source[key];
4815
        }
4816
        if (isNew) {
4817
          baseAssignValue(object, key, newValue);
4818
        } else {
4819
          assignValue(object, key, newValue);
4820
        }
4821
      }
4822
      return object;
4823
    }
4824
4825
    /**
4826
     * Copies own symbols of `source` to `object`.
4827
     *
4828
     * @private
4829
     * @param {Object} source The object to copy symbols from.
4830
     * @param {Object} [object={}] The object to copy symbols to.
4831
     * @returns {Object} Returns `object`.
4832
     */
4833
    function copySymbols(source, object) {
4834
      return copyObject(source, getSymbols(source), object);
4835
    }
4836
4837
    /**
4838
     * Copies own and inherited symbols of `source` to `object`.
4839
     *
4840
     * @private
4841
     * @param {Object} source The object to copy symbols from.
4842
     * @param {Object} [object={}] The object to copy symbols to.
4843
     * @returns {Object} Returns `object`.
4844
     */
4845
    function copySymbolsIn(source, object) {
4846
      return copyObject(source, getSymbolsIn(source), object);
4847
    }
4848
4849
    /**
4850
     * Creates a function like `_.groupBy`.
4851
     *
4852
     * @private
4853
     * @param {Function} setter The function to set accumulator values.
4854
     * @param {Function} [initializer] The accumulator object initializer.
4855
     * @returns {Function} Returns the new aggregator function.
4856
     */
4857
    function createAggregator(setter, initializer) {
4858
      return function(collection, iteratee) {
4859
        var func = isArray(collection) ? arrayAggregator : baseAggregator,
4860
            accumulator = initializer ? initializer() : {};
4861
4862
        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
4863
      };
4864
    }
4865
4866
    /**
4867
     * Creates a function like `_.assign`.
4868
     *
4869
     * @private
4870
     * @param {Function} assigner The function to assign values.
4871
     * @returns {Function} Returns the new assigner function.
4872
     */
4873
    function createAssigner(assigner) {
4874
      return baseRest(function(object, sources) {
4875
        var index = -1,
4876
            length = sources.length,
4877
            customizer = length > 1 ? sources[length - 1] : undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4878
            guard = length > 2 ? sources[2] : undefined;
4879
4880
        customizer = (assigner.length > 3 && typeof customizer == 'function')
4881
          ? (length--, customizer)
4882
          : undefined;
4883
4884
        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
4885
          customizer = length < 3 ? undefined : customizer;
4886
          length = 1;
4887
        }
4888
        object = Object(object);
4889
        while (++index < length) {
4890
          var source = sources[index];
4891
          if (source) {
4892
            assigner(object, source, index, customizer);
4893
          }
4894
        }
4895
        return object;
4896
      });
4897
    }
4898
4899
    /**
4900
     * Creates a `baseEach` or `baseEachRight` function.
4901
     *
4902
     * @private
4903
     * @param {Function} eachFunc The function to iterate over a collection.
4904
     * @param {boolean} [fromRight] Specify iterating from right to left.
4905
     * @returns {Function} Returns the new base function.
4906
     */
4907
    function createBaseEach(eachFunc, fromRight) {
4908
      return function(collection, iteratee) {
4909
        if (collection == null) {
4910
          return collection;
4911
        }
4912
        if (!isArrayLike(collection)) {
4913
          return eachFunc(collection, iteratee);
4914
        }
4915
        var length = collection.length,
4916
            index = fromRight ? length : -1,
4917
            iterable = Object(collection);
4918
4919
        while ((fromRight ? index-- : ++index < length)) {
4920
          if (iteratee(iterable[index], index, iterable) === false) {
4921
            break;
4922
          }
4923
        }
4924
        return collection;
4925
      };
4926
    }
4927
4928
    /**
4929
     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
4930
     *
4931
     * @private
4932
     * @param {boolean} [fromRight] Specify iterating from right to left.
4933
     * @returns {Function} Returns the new base function.
4934
     */
4935
    function createBaseFor(fromRight) {
4936
      return function(object, iteratee, keysFunc) {
4937
        var index = -1,
4938
            iterable = Object(object),
4939
            props = keysFunc(object),
4940
            length = props.length;
4941
4942
        while (length--) {
4943
          var key = props[fromRight ? length : ++index];
4944
          if (iteratee(iterable[key], key, iterable) === false) {
4945
            break;
4946
          }
4947
        }
4948
        return object;
4949
      };
4950
    }
4951
4952
    /**
4953
     * Creates a function that wraps `func` to invoke it with the optional `this`
4954
     * binding of `thisArg`.
4955
     *
4956
     * @private
4957
     * @param {Function} func The function to wrap.
4958
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
4959
     * @param {*} [thisArg] The `this` binding of `func`.
4960
     * @returns {Function} Returns the new wrapped function.
4961
     */
4962
    function createBind(func, bitmask, thisArg) {
4963
      var isBind = bitmask & WRAP_BIND_FLAG,
4964
          Ctor = createCtor(func);
4965
4966
      function wrapper() {
4967
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
4968
        return fn.apply(isBind ? thisArg : this, arguments);
4969
      }
4970
      return wrapper;
4971
    }
4972
4973
    /**
4974
     * Creates a function like `_.lowerFirst`.
4975
     *
4976
     * @private
4977
     * @param {string} methodName The name of the `String` case method to use.
4978
     * @returns {Function} Returns the new case function.
4979
     */
4980
    function createCaseFirst(methodName) {
4981
      return function(string) {
4982
        string = toString(string);
4983
4984
        var strSymbols = hasUnicode(string)
4985
          ? stringToArray(string)
4986
          : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
4987
4988
        var chr = strSymbols
4989
          ? strSymbols[0]
4990
          : string.charAt(0);
4991
4992
        var trailing = strSymbols
4993
          ? castSlice(strSymbols, 1).join('')
4994
          : string.slice(1);
4995
4996
        return chr[methodName]() + trailing;
4997
      };
4998
    }
4999
5000
    /**
5001
     * Creates a function like `_.camelCase`.
5002
     *
5003
     * @private
5004
     * @param {Function} callback The function to combine each word.
5005
     * @returns {Function} Returns the new compounder function.
5006
     */
5007
    function createCompounder(callback) {
5008
      return function(string) {
5009
        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
5010
      };
5011
    }
5012
5013
    /**
5014
     * Creates a function that produces an instance of `Ctor` regardless of
5015
     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
5016
     *
5017
     * @private
5018
     * @param {Function} Ctor The constructor to wrap.
5019
     * @returns {Function} Returns the new wrapped function.
5020
     */
5021
    function createCtor(Ctor) {
5022
      return function() {
5023
        // Use a `switch` statement to work with class constructors. See
5024
        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
5025
        // for more details.
5026
        var args = arguments;
5027
        switch (args.length) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
5028
          case 0: return new Ctor;
5029
          case 1: return new Ctor(args[0]);
5030
          case 2: return new Ctor(args[0], args[1]);
5031
          case 3: return new Ctor(args[0], args[1], args[2]);
5032
          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
5033
          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
5034
          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
5035
          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
5036
        }
5037
        var thisBinding = baseCreate(Ctor.prototype),
5038
            result = Ctor.apply(thisBinding, args);
5039
5040
        // Mimic the constructor's `return` behavior.
5041
        // See https://es5.github.io/#x13.2.2 for more details.
5042
        return isObject(result) ? result : thisBinding;
5043
      };
5044
    }
5045
5046
    /**
5047
     * Creates a function that wraps `func` to enable currying.
5048
     *
5049
     * @private
5050
     * @param {Function} func The function to wrap.
5051
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5052
     * @param {number} arity The arity of `func`.
5053
     * @returns {Function} Returns the new wrapped function.
5054
     */
5055
    function createCurry(func, bitmask, arity) {
5056
      var Ctor = createCtor(func);
5057
5058
      function wrapper() {
5059
        var length = arguments.length,
5060
            args = Array(length),
5061
            index = length,
5062
            placeholder = getHolder(wrapper);
5063
5064
        while (index--) {
5065
          args[index] = arguments[index];
5066
        }
5067
        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
5068
          ? []
5069
          : replaceHolders(args, placeholder);
5070
5071
        length -= holders.length;
5072
        if (length < arity) {
5073
          return createRecurry(
5074
            func, bitmask, createHybrid, wrapper.placeholder, undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5075
            args, holders, undefined, undefined, arity - length);
5076
        }
5077
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5078
        return apply(fn, this, args);
5079
      }
5080
      return wrapper;
5081
    }
5082
5083
    /**
5084
     * Creates a `_.find` or `_.findLast` function.
5085
     *
5086
     * @private
5087
     * @param {Function} findIndexFunc The function to find the collection index.
5088
     * @returns {Function} Returns the new find function.
5089
     */
5090
    function createFind(findIndexFunc) {
5091
      return function(collection, predicate, fromIndex) {
5092
        var iterable = Object(collection);
5093
        if (!isArrayLike(collection)) {
5094
          var iteratee = getIteratee(predicate, 3);
5095
          collection = keys(collection);
5096
          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
5097
        }
5098
        var index = findIndexFunc(collection, predicate, fromIndex);
5099
        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5100
      };
5101
    }
5102
5103
    /**
5104
     * Creates a `_.flow` or `_.flowRight` function.
5105
     *
5106
     * @private
5107
     * @param {boolean} [fromRight] Specify iterating from right to left.
5108
     * @returns {Function} Returns the new flow function.
5109
     */
5110
    function createFlow(fromRight) {
5111
      return flatRest(function(funcs) {
5112
        var length = funcs.length,
5113
            index = length,
5114
            prereq = LodashWrapper.prototype.thru;
5115
5116
        if (fromRight) {
5117
          funcs.reverse();
5118
        }
5119
        while (index--) {
5120
          var func = funcs[index];
5121
          if (typeof func != 'function') {
5122
            throw new TypeError(FUNC_ERROR_TEXT);
5123
          }
5124
          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
5125
            var wrapper = new LodashWrapper([], true);
5126
          }
5127
        }
5128
        index = wrapper ? index : length;
5129
        while (++index < length) {
5130
          func = funcs[index];
5131
5132
          var funcName = getFuncName(func),
5133
              data = funcName == 'wrapper' ? getData(func) : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5134
5135
          if (data && isLaziable(data[0]) &&
5136
                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
5137
                !data[4].length && data[9] == 1
5138
              ) {
5139
            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
5140
          } else {
5141
            wrapper = (func.length == 1 && isLaziable(func))
5142
              ? wrapper[funcName]()
5143
              : wrapper.thru(func);
5144
          }
5145
        }
5146
        return function() {
5147
          var args = arguments,
5148
              value = args[0];
5149
5150
          if (wrapper && args.length == 1 && isArray(value)) {
5151
            return wrapper.plant(value).value();
5152
          }
5153
          var index = 0,
5154
              result = length ? funcs[index].apply(this, args) : value;
5155
5156
          while (++index < length) {
5157
            result = funcs[index].call(this, result);
5158
          }
5159
          return result;
5160
        };
5161
      });
5162
    }
5163
5164
    /**
5165
     * Creates a function that wraps `func` to invoke it with optional `this`
5166
     * binding of `thisArg`, partial application, and currying.
5167
     *
5168
     * @private
5169
     * @param {Function|string} func The function or method name to wrap.
5170
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5171
     * @param {*} [thisArg] The `this` binding of `func`.
5172
     * @param {Array} [partials] The arguments to prepend to those provided to
5173
     *  the new function.
5174
     * @param {Array} [holders] The `partials` placeholder indexes.
5175
     * @param {Array} [partialsRight] The arguments to append to those provided
5176
     *  to the new function.
5177
     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
5178
     * @param {Array} [argPos] The argument positions of the new function.
5179
     * @param {number} [ary] The arity cap of `func`.
5180
     * @param {number} [arity] The arity of `func`.
5181
     * @returns {Function} Returns the new wrapped function.
5182
     */
5183
    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
5184
      var isAry = bitmask & WRAP_ARY_FLAG,
5185
          isBind = bitmask & WRAP_BIND_FLAG,
5186
          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
5187
          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
5188
          isFlip = bitmask & WRAP_FLIP_FLAG,
5189
          Ctor = isBindKey ? undefined : createCtor(func);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5190
5191
      function wrapper() {
5192
        var length = arguments.length,
5193
            args = Array(length),
5194
            index = length;
5195
5196
        while (index--) {
5197
          args[index] = arguments[index];
5198
        }
5199
        if (isCurried) {
5200
          var placeholder = getHolder(wrapper),
5201
              holdersCount = countHolders(args, placeholder);
5202
        }
5203
        if (partials) {
5204
          args = composeArgs(args, partials, holders, isCurried);
5205
        }
5206
        if (partialsRight) {
5207
          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
5208
        }
5209
        length -= holdersCount;
0 ignored issues
show
Bug introduced by
The variable holdersCount does not seem to be initialized in case isCurried on line 5199 is false. Are you sure this can never be the case?
Loading history...
5210
        if (isCurried && length < arity) {
5211
          var newHolders = replaceHolders(args, placeholder);
0 ignored issues
show
Bug introduced by
The variable placeholder does not seem to be initialized in case isCurried on line 5199 is false. Are you sure the function replaceHolders handles undefined variables?
Loading history...
5212
          return createRecurry(
5213
            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
5214
            args, newHolders, argPos, ary, arity - length
5215
          );
5216
        }
5217
        var thisBinding = isBind ? thisArg : this,
5218
            fn = isBindKey ? thisBinding[func] : func;
5219
5220
        length = args.length;
5221
        if (argPos) {
5222
          args = reorder(args, argPos);
5223
        } else if (isFlip && length > 1) {
5224
          args.reverse();
5225
        }
5226
        if (isAry && ary < length) {
5227
          args.length = ary;
5228
        }
5229
        if (this && this !== root && this instanceof wrapper) {
5230
          fn = Ctor || createCtor(fn);
5231
        }
5232
        return fn.apply(thisBinding, args);
5233
      }
5234
      return wrapper;
5235
    }
5236
5237
    /**
5238
     * Creates a function like `_.invertBy`.
5239
     *
5240
     * @private
5241
     * @param {Function} setter The function to set accumulator values.
5242
     * @param {Function} toIteratee The function to resolve iteratees.
5243
     * @returns {Function} Returns the new inverter function.
5244
     */
5245
    function createInverter(setter, toIteratee) {
5246
      return function(object, iteratee) {
5247
        return baseInverter(object, setter, toIteratee(iteratee), {});
5248
      };
5249
    }
5250
5251
    /**
5252
     * Creates a function that performs a mathematical operation on two values.
5253
     *
5254
     * @private
5255
     * @param {Function} operator The function to perform the operation.
5256
     * @param {number} [defaultValue] The value used for `undefined` arguments.
5257
     * @returns {Function} Returns the new mathematical operation function.
5258
     */
5259 View Code Duplication
    function createMathOperation(operator, defaultValue) {
5260
      return function(value, other) {
5261
        var result;
5262
        if (value === undefined && other === undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5263
          return defaultValue;
5264
        }
5265
        if (value !== undefined) {
5266
          result = value;
5267
        }
5268
        if (other !== undefined) {
5269
          if (result === undefined) {
0 ignored issues
show
Bug introduced by
The variable result does not seem to be initialized in case value !== undefined on line 5265 is false. Are you sure this can never be the case?
Loading history...
5270
            return other;
5271
          }
5272
          if (typeof value == 'string' || typeof other == 'string') {
5273
            value = baseToString(value);
5274
            other = baseToString(other);
5275
          } else {
5276
            value = baseToNumber(value);
5277
            other = baseToNumber(other);
5278
          }
5279
          result = operator(value, other);
5280
        }
5281
        return result;
5282
      };
5283
    }
5284
5285
    /**
5286
     * Creates a function like `_.over`.
5287
     *
5288
     * @private
5289
     * @param {Function} arrayFunc The function to iterate over iteratees.
5290
     * @returns {Function} Returns the new over function.
5291
     */
5292
    function createOver(arrayFunc) {
5293
      return flatRest(function(iteratees) {
5294
        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
5295
        return baseRest(function(args) {
5296
          var thisArg = this;
5297
          return arrayFunc(iteratees, function(iteratee) {
5298
            return apply(iteratee, thisArg, args);
5299
          });
5300
        });
5301
      });
5302
    }
5303
5304
    /**
5305
     * Creates the padding for `string` based on `length`. The `chars` string
5306
     * is truncated if the number of characters exceeds `length`.
5307
     *
5308
     * @private
5309
     * @param {number} length The padding length.
5310
     * @param {string} [chars=' '] The string used as padding.
5311
     * @returns {string} Returns the padding for `string`.
5312
     */
5313
    function createPadding(length, chars) {
5314
      chars = chars === undefined ? ' ' : baseToString(chars);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5315
5316
      var charsLength = chars.length;
5317
      if (charsLength < 2) {
5318
        return charsLength ? baseRepeat(chars, length) : chars;
5319
      }
5320
      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
5321
      return hasUnicode(chars)
5322
        ? castSlice(stringToArray(result), 0, length).join('')
5323
        : result.slice(0, length);
5324
    }
5325
5326
    /**
5327
     * Creates a function that wraps `func` to invoke it with the `this` binding
5328
     * of `thisArg` and `partials` prepended to the arguments it receives.
5329
     *
5330
     * @private
5331
     * @param {Function} func The function to wrap.
5332
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5333
     * @param {*} thisArg The `this` binding of `func`.
5334
     * @param {Array} partials The arguments to prepend to those provided to
5335
     *  the new function.
5336
     * @returns {Function} Returns the new wrapped function.
5337
     */
5338
    function createPartial(func, bitmask, thisArg, partials) {
5339
      var isBind = bitmask & WRAP_BIND_FLAG,
5340
          Ctor = createCtor(func);
5341
5342
      function wrapper() {
5343
        var argsIndex = -1,
5344
            argsLength = arguments.length,
5345
            leftIndex = -1,
5346
            leftLength = partials.length,
5347
            args = Array(leftLength + argsLength),
5348
            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5349
5350
        while (++leftIndex < leftLength) {
5351
          args[leftIndex] = partials[leftIndex];
5352
        }
5353
        while (argsLength--) {
5354
          args[leftIndex++] = arguments[++argsIndex];
5355
        }
5356
        return apply(fn, isBind ? thisArg : this, args);
5357
      }
5358
      return wrapper;
5359
    }
5360
5361
    /**
5362
     * Creates a `_.range` or `_.rangeRight` function.
5363
     *
5364
     * @private
5365
     * @param {boolean} [fromRight] Specify iterating from right to left.
5366
     * @returns {Function} Returns the new range function.
5367
     */
5368
    function createRange(fromRight) {
5369
      return function(start, end, step) {
5370
        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
5371
          end = step = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5372
        }
5373
        // Ensure the sign of `-0` is preserved.
5374
        start = toFinite(start);
5375
        if (end === undefined) {
5376
          end = start;
5377
          start = 0;
5378
        } else {
5379
          end = toFinite(end);
5380
        }
5381
        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
5382
        return baseRange(start, end, step, fromRight);
5383
      };
5384
    }
5385
5386
    /**
5387
     * Creates a function that performs a relational operation on two values.
5388
     *
5389
     * @private
5390
     * @param {Function} operator The function to perform the operation.
5391
     * @returns {Function} Returns the new relational operation function.
5392
     */
5393
    function createRelationalOperation(operator) {
5394
      return function(value, other) {
5395
        if (!(typeof value == 'string' && typeof other == 'string')) {
5396
          value = toNumber(value);
5397
          other = toNumber(other);
5398
        }
5399
        return operator(value, other);
5400
      };
5401
    }
5402
5403
    /**
5404
     * Creates a function that wraps `func` to continue currying.
5405
     *
5406
     * @private
5407
     * @param {Function} func The function to wrap.
5408
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5409
     * @param {Function} wrapFunc The function to create the `func` wrapper.
5410
     * @param {*} placeholder The placeholder value.
5411
     * @param {*} [thisArg] The `this` binding of `func`.
5412
     * @param {Array} [partials] The arguments to prepend to those provided to
5413
     *  the new function.
5414
     * @param {Array} [holders] The `partials` placeholder indexes.
5415
     * @param {Array} [argPos] The argument positions of the new function.
5416
     * @param {number} [ary] The arity cap of `func`.
5417
     * @param {number} [arity] The arity of `func`.
5418
     * @returns {Function} Returns the new wrapped function.
5419
     */
5420
    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
5421
      var isCurry = bitmask & WRAP_CURRY_FLAG,
5422
          newHolders = isCurry ? holders : undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5423
          newHoldersRight = isCurry ? undefined : holders,
5424
          newPartials = isCurry ? partials : undefined,
5425
          newPartialsRight = isCurry ? undefined : partials;
5426
5427
      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
5428
      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
5429
5430
      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
5431
        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
5432
      }
5433
      var newData = [
5434
        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
5435
        newHoldersRight, argPos, ary, arity
5436
      ];
5437
5438
      var result = wrapFunc.apply(undefined, newData);
5439
      if (isLaziable(func)) {
5440
        setData(result, newData);
5441
      }
5442
      result.placeholder = placeholder;
5443
      return setWrapToString(result, func, bitmask);
5444
    }
5445
5446
    /**
5447
     * Creates a function like `_.round`.
5448
     *
5449
     * @private
5450
     * @param {string} methodName The name of the `Math` method to use when rounding.
5451
     * @returns {Function} Returns the new round function.
5452
     */
5453
    function createRound(methodName) {
5454
      var func = Math[methodName];
5455
      return function(number, precision) {
5456
        number = toNumber(number);
5457
        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
5458
        if (precision) {
5459
          // Shift with exponential notation to avoid floating-point issues.
5460
          // See [MDN](https://mdn.io/round#Examples) for more details.
5461
          var pair = (toString(number) + 'e').split('e'),
5462
              value = func(pair[0] + 'e' + (+pair[1] + precision));
5463
5464
          pair = (toString(value) + 'e').split('e');
5465
          return +(pair[0] + 'e' + (+pair[1] - precision));
5466
        }
5467
        return func(number);
5468
      };
5469
    }
5470
5471
    /**
5472
     * Creates a set object of `values`.
5473
     *
5474
     * @private
5475
     * @param {Array} values The values to add to the set.
5476
     * @returns {Object} Returns the new set.
5477
     */
5478
    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
0 ignored issues
show
introduced by
There are two consecutive commas which insert an implicit undefined value. If this is indeed intended, consider adding undefined explicitly like so , undefined,.
Loading history...
5479
      return new Set(values);
5480
    };
5481
5482
    /**
5483
     * Creates a `_.toPairs` or `_.toPairsIn` function.
5484
     *
5485
     * @private
5486
     * @param {Function} keysFunc The function to get the keys of a given object.
5487
     * @returns {Function} Returns the new pairs function.
5488
     */
5489
    function createToPairs(keysFunc) {
5490
      return function(object) {
5491
        var tag = getTag(object);
5492
        if (tag == mapTag) {
5493
          return mapToArray(object);
5494
        }
5495
        if (tag == setTag) {
5496
          return setToPairs(object);
5497
        }
5498
        return baseToPairs(object, keysFunc(object));
5499
      };
5500
    }
5501
5502
    /**
5503
     * Creates a function that either curries or invokes `func` with optional
5504
     * `this` binding and partially applied arguments.
5505
     *
5506
     * @private
5507
     * @param {Function|string} func The function or method name to wrap.
5508
     * @param {number} bitmask The bitmask flags.
5509
     *    1 - `_.bind`
5510
     *    2 - `_.bindKey`
5511
     *    4 - `_.curry` or `_.curryRight` of a bound function
5512
     *    8 - `_.curry`
5513
     *   16 - `_.curryRight`
5514
     *   32 - `_.partial`
5515
     *   64 - `_.partialRight`
5516
     *  128 - `_.rearg`
5517
     *  256 - `_.ary`
5518
     *  512 - `_.flip`
5519
     * @param {*} [thisArg] The `this` binding of `func`.
5520
     * @param {Array} [partials] The arguments to be partially applied.
5521
     * @param {Array} [holders] The `partials` placeholder indexes.
5522
     * @param {Array} [argPos] The argument positions of the new function.
5523
     * @param {number} [ary] The arity cap of `func`.
5524
     * @param {number} [arity] The arity of `func`.
5525
     * @returns {Function} Returns the new wrapped function.
5526
     */
5527
    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
5528
      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
5529
      if (!isBindKey && typeof func != 'function') {
5530
        throw new TypeError(FUNC_ERROR_TEXT);
5531
      }
5532
      var length = partials ? partials.length : 0;
5533
      if (!length) {
5534
        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
5535
        partials = holders = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5536
      }
5537
      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
5538
      arity = arity === undefined ? arity : toInteger(arity);
5539
      length -= holders ? holders.length : 0;
5540
5541
      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
5542
        var partialsRight = partials,
5543
            holdersRight = holders;
5544
5545
        partials = holders = undefined;
5546
      }
5547
      var data = isBindKey ? undefined : getData(func);
5548
5549
      var newData = [
5550
        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
0 ignored issues
show
Bug introduced by
The variable partialsRight does not seem to be initialized in case bitmask & WRAP_PARTIAL_RIGHT_FLAG on line 5541 is false. Are you sure this can never be the case?
Loading history...
Bug introduced by
The variable holdersRight does not seem to be initialized in case bitmask & WRAP_PARTIAL_RIGHT_FLAG on line 5541 is false. Are you sure this can never be the case?
Loading history...
5551
        argPos, ary, arity
5552
      ];
5553
5554
      if (data) {
5555
        mergeData(newData, data);
5556
      }
5557
      func = newData[0];
5558
      bitmask = newData[1];
5559
      thisArg = newData[2];
5560
      partials = newData[3];
5561
      holders = newData[4];
5562
      arity = newData[9] = newData[9] === undefined
5563
        ? (isBindKey ? 0 : func.length)
5564
        : nativeMax(newData[9] - length, 0);
5565
5566
      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
5567
        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
5568
      }
5569
      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
5570
        var result = createBind(func, bitmask, thisArg);
5571
      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
5572
        result = createCurry(func, bitmask, arity);
5573
      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
5574
        result = createPartial(func, bitmask, thisArg, partials);
5575
      } else {
5576
        result = createHybrid.apply(undefined, newData);
5577
      }
5578
      var setter = data ? baseSetData : setData;
5579
      return setWrapToString(setter(result, newData), func, bitmask);
5580
    }
5581
5582
    /**
5583
     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
5584
     * of source objects to the destination object for all destination properties
5585
     * that resolve to `undefined`.
5586
     *
5587
     * @private
5588
     * @param {*} objValue The destination value.
5589
     * @param {*} srcValue The source value.
5590
     * @param {string} key The key of the property to assign.
5591
     * @param {Object} object The parent object of `objValue`.
5592
     * @returns {*} Returns the value to assign.
5593
     */
5594
    function customDefaultsAssignIn(objValue, srcValue, key, object) {
5595
      if (objValue === undefined ||
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5596
          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
5597
        return srcValue;
5598
      }
5599
      return objValue;
5600
    }
5601
5602
    /**
5603
     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
5604
     * objects into destination objects that are passed thru.
5605
     *
5606
     * @private
5607
     * @param {*} objValue The destination value.
5608
     * @param {*} srcValue The source value.
5609
     * @param {string} key The key of the property to merge.
5610
     * @param {Object} object The parent object of `objValue`.
5611
     * @param {Object} source The parent object of `srcValue`.
5612
     * @param {Object} [stack] Tracks traversed source values and their merged
5613
     *  counterparts.
5614
     * @returns {*} Returns the value to assign.
5615
     */
5616
    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
5617
      if (isObject(objValue) && isObject(srcValue)) {
5618
        // Recursively merge objects and arrays (susceptible to call stack limits).
5619
        stack.set(srcValue, objValue);
5620
        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5621
        stack['delete'](srcValue);
5622
      }
5623
      return objValue;
5624
    }
5625
5626
    /**
5627
     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
5628
     * objects.
5629
     *
5630
     * @private
5631
     * @param {*} value The value to inspect.
5632
     * @param {string} key The key of the property to inspect.
5633
     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
5634
     */
5635
    function customOmitClone(value) {
5636
      return isPlainObject(value) ? undefined : value;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5637
    }
5638
5639
    /**
5640
     * A specialized version of `baseIsEqualDeep` for arrays with support for
5641
     * partial deep comparisons.
5642
     *
5643
     * @private
5644
     * @param {Array} array The array to compare.
5645
     * @param {Array} other The other array to compare.
5646
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5647
     * @param {Function} customizer The function to customize comparisons.
5648
     * @param {Function} equalFunc The function to determine equivalents of values.
5649
     * @param {Object} stack Tracks traversed `array` and `other` objects.
5650
     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
5651
     */
5652
    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
5653
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5654
          arrLength = array.length,
5655
          othLength = other.length;
5656
5657
      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
5658
        return false;
5659
      }
5660
      // Assume cyclic values are equal.
5661
      var stacked = stack.get(array);
5662
      if (stacked && stack.get(other)) {
5663
        return stacked == other;
5664
      }
5665
      var index = -1,
5666
          result = true,
5667
          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
5668
5669
      stack.set(array, other);
5670
      stack.set(other, array);
5671
5672
      // Ignore non-index properties.
5673
      while (++index < arrLength) {
5674
        var arrValue = array[index],
5675
            othValue = other[index];
5676
5677
        if (customizer) {
5678
          var compared = isPartial
5679
            ? customizer(othValue, arrValue, index, other, array, stack)
5680
            : customizer(arrValue, othValue, index, array, other, stack);
5681
        }
5682
        if (compared !== undefined) {
0 ignored issues
show
Comprehensibility Bug introduced by
The variable compared does not seem to be initialized in case the while loop on line 5673 is not entered. Are you sure this can never be the case?
Loading history...
5683
          if (compared) {
5684
            continue;
5685
          }
5686
          result = false;
5687
          break;
5688
        }
5689
        // Recursively compare arrays (susceptible to call stack limits).
5690
        if (seen) {
5691
          if (!arraySome(other, function(othValue, othIndex) {
5692
                if (!cacheHas(seen, othIndex) &&
5693
                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
0 ignored issues
show
Bug introduced by
The variable arrValue is changed as part of the while loop for example by array.index on line 5674. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
5694
                  return seen.push(othIndex);
5695
                }
5696
              })) {
5697
            result = false;
5698
            break;
5699
          }
5700
        } else if (!(
5701
              arrValue === othValue ||
5702
                equalFunc(arrValue, othValue, bitmask, customizer, stack)
5703
            )) {
5704
          result = false;
5705
          break;
5706
        }
5707
      }
5708
      stack['delete'](array);
5709
      stack['delete'](other);
5710
      return result;
5711
    }
5712
5713
    /**
5714
     * A specialized version of `baseIsEqualDeep` for comparing objects of
5715
     * the same `toStringTag`.
5716
     *
5717
     * **Note:** This function only supports comparing values with tags of
5718
     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
5719
     *
5720
     * @private
5721
     * @param {Object} object The object to compare.
5722
     * @param {Object} other The other object to compare.
5723
     * @param {string} tag The `toStringTag` of the objects to compare.
5724
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5725
     * @param {Function} customizer The function to customize comparisons.
5726
     * @param {Function} equalFunc The function to determine equivalents of values.
5727
     * @param {Object} stack Tracks traversed `object` and `other` objects.
5728
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5729
     */
5730
    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
5731
      switch (tag) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
5732
        case dataViewTag:
5733
          if ((object.byteLength != other.byteLength) ||
5734
              (object.byteOffset != other.byteOffset)) {
5735
            return false;
5736
          }
5737
          object = object.buffer;
5738
          other = other.buffer;
5739
5740
        case arrayBufferTag:
5741
          if ((object.byteLength != other.byteLength) ||
5742
              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
5743
            return false;
5744
          }
5745
          return true;
5746
5747
        case boolTag:
5748
        case dateTag:
5749
        case numberTag:
5750
          // Coerce booleans to `1` or `0` and dates to milliseconds.
5751
          // Invalid dates are coerced to `NaN`.
5752
          return eq(+object, +other);
5753
5754
        case errorTag:
5755
          return object.name == other.name && object.message == other.message;
5756
5757
        case regexpTag:
5758
        case stringTag:
5759
          // Coerce regexes to strings and treat strings, primitives and objects,
5760
          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
5761
          // for more details.
5762
          return object == (other + '');
5763
5764
        case mapTag:
5765
          var convert = mapToArray;
5766
5767
        case setTag:
5768
          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
5769
          convert || (convert = setToArray);
5770
5771
          if (object.size != other.size && !isPartial) {
5772
            return false;
5773
          }
5774
          // Assume cyclic values are equal.
5775
          var stacked = stack.get(object);
5776
          if (stacked) {
5777
            return stacked == other;
5778
          }
5779
          bitmask |= COMPARE_UNORDERED_FLAG;
5780
5781
          // Recursively compare objects (susceptible to call stack limits).
5782
          stack.set(object, other);
5783
          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
5784
          stack['delete'](object);
5785
          return result;
5786
5787
        case symbolTag:
5788
          if (symbolValueOf) {
5789
            return symbolValueOf.call(object) == symbolValueOf.call(other);
5790
          }
5791
      }
5792
      return false;
5793
    }
5794
5795
    /**
5796
     * A specialized version of `baseIsEqualDeep` for objects with support for
5797
     * partial deep comparisons.
5798
     *
5799
     * @private
5800
     * @param {Object} object The object to compare.
5801
     * @param {Object} other The other object to compare.
5802
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5803
     * @param {Function} customizer The function to customize comparisons.
5804
     * @param {Function} equalFunc The function to determine equivalents of values.
5805
     * @param {Object} stack Tracks traversed `object` and `other` objects.
5806
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5807
     */
5808
    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
5809
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5810
          objProps = getAllKeys(object),
5811
          objLength = objProps.length,
5812
          othProps = getAllKeys(other),
5813
          othLength = othProps.length;
5814
5815
      if (objLength != othLength && !isPartial) {
5816
        return false;
5817
      }
5818
      var index = objLength;
5819
      while (index--) {
5820
        var key = objProps[index];
5821
        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
5822
          return false;
5823
        }
5824
      }
5825
      // Assume cyclic values are equal.
5826
      var stacked = stack.get(object);
5827
      if (stacked && stack.get(other)) {
5828
        return stacked == other;
5829
      }
5830
      var result = true;
5831
      stack.set(object, other);
5832
      stack.set(other, object);
5833
5834
      var skipCtor = isPartial;
5835
      while (++index < objLength) {
5836
        key = objProps[index];
5837
        var objValue = object[key],
5838
            othValue = other[key];
5839
5840
        if (customizer) {
5841
          var compared = isPartial
5842
            ? customizer(othValue, objValue, key, other, object, stack)
5843
            : customizer(objValue, othValue, key, object, other, stack);
5844
        }
5845
        // Recursively compare objects (susceptible to call stack limits).
5846
        if (!(compared === undefined
0 ignored issues
show
Bug introduced by
The variable compared seems to not be initialized for all possible execution paths.
Loading history...
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5847
              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
5848
              : compared
5849
            )) {
5850
          result = false;
5851
          break;
5852
        }
5853
        skipCtor || (skipCtor = key == 'constructor');
5854
      }
5855
      if (result && !skipCtor) {
5856
        var objCtor = object.constructor,
5857
            othCtor = other.constructor;
5858
5859
        // Non `Object` object instances with different constructors are not equal.
5860
        if (objCtor != othCtor &&
5861
            ('constructor' in object && 'constructor' in other) &&
5862
            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
5863
              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
5864
          result = false;
5865
        }
5866
      }
5867
      stack['delete'](object);
5868
      stack['delete'](other);
5869
      return result;
5870
    }
5871
5872
    /**
5873
     * A specialized version of `baseRest` which flattens the rest array.
5874
     *
5875
     * @private
5876
     * @param {Function} func The function to apply a rest parameter to.
5877
     * @returns {Function} Returns the new function.
5878
     */
5879
    function flatRest(func) {
5880
      return setToString(overRest(func, undefined, flatten), func + '');
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
5881
    }
5882
5883
    /**
5884
     * Creates an array of own enumerable property names and symbols of `object`.
5885
     *
5886
     * @private
5887
     * @param {Object} object The object to query.
5888
     * @returns {Array} Returns the array of property names and symbols.
5889
     */
5890
    function getAllKeys(object) {
5891
      return baseGetAllKeys(object, keys, getSymbols);
5892
    }
5893
5894
    /**
5895
     * Creates an array of own and inherited enumerable property names and
5896
     * symbols of `object`.
5897
     *
5898
     * @private
5899
     * @param {Object} object The object to query.
5900
     * @returns {Array} Returns the array of property names and symbols.
5901
     */
5902
    function getAllKeysIn(object) {
5903
      return baseGetAllKeys(object, keysIn, getSymbolsIn);
5904
    }
5905
5906
    /**
5907
     * Gets metadata for `func`.
5908
     *
5909
     * @private
5910
     * @param {Function} func The function to query.
5911
     * @returns {*} Returns the metadata for `func`.
5912
     */
5913
    var getData = !metaMap ? noop : function(func) {
5914
      return metaMap.get(func);
5915
    };
5916
5917
    /**
5918
     * Gets the name of `func`.
5919
     *
5920
     * @private
5921
     * @param {Function} func The function to query.
5922
     * @returns {string} Returns the function name.
5923
     */
5924
    function getFuncName(func) {
5925
      var result = (func.name + ''),
5926
          array = realNames[result],
5927
          length = hasOwnProperty.call(realNames, result) ? array.length : 0;
5928
5929
      while (length--) {
5930
        var data = array[length],
5931
            otherFunc = data.func;
5932
        if (otherFunc == null || otherFunc == func) {
5933
          return data.name;
5934
        }
5935
      }
5936
      return result;
5937
    }
5938
5939
    /**
5940
     * Gets the argument placeholder value for `func`.
5941
     *
5942
     * @private
5943
     * @param {Function} func The function to inspect.
5944
     * @returns {*} Returns the placeholder value.
5945
     */
5946
    function getHolder(func) {
5947
      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
5948
      return object.placeholder;
5949
    }
5950
5951
    /**
5952
     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
5953
     * this function returns the custom method, otherwise it returns `baseIteratee`.
5954
     * If arguments are provided, the chosen function is invoked with them and
5955
     * its result is returned.
5956
     *
5957
     * @private
5958
     * @param {*} [value] The value to convert to an iteratee.
5959
     * @param {number} [arity] The arity of the created iteratee.
5960
     * @returns {Function} Returns the chosen function or its result.
5961
     */
5962
    function getIteratee() {
5963
      var result = lodash.iteratee || iteratee;
5964
      result = result === iteratee ? baseIteratee : result;
5965
      return arguments.length ? result(arguments[0], arguments[1]) : result;
5966
    }
5967
5968
    /**
5969
     * Gets the data for `map`.
5970
     *
5971
     * @private
5972
     * @param {Object} map The map to query.
5973
     * @param {string} key The reference key.
5974
     * @returns {*} Returns the map data.
5975
     */
5976
    function getMapData(map, key) {
5977
      var data = map.__data__;
5978
      return isKeyable(key)
5979
        ? data[typeof key == 'string' ? 'string' : 'hash']
5980
        : data.map;
5981
    }
5982
5983
    /**
5984
     * Gets the property names, values, and compare flags of `object`.
5985
     *
5986
     * @private
5987
     * @param {Object} object The object to query.
5988
     * @returns {Array} Returns the match data of `object`.
5989
     */
5990
    function getMatchData(object) {
5991
      var result = keys(object),
5992
          length = result.length;
5993
5994
      while (length--) {
5995
        var key = result[length],
5996
            value = object[key];
5997
5998
        result[length] = [key, value, isStrictComparable(value)];
5999
      }
6000
      return result;
6001
    }
6002
6003
    /**
6004
     * Gets the native function at `key` of `object`.
6005
     *
6006
     * @private
6007
     * @param {Object} object The object to query.
6008
     * @param {string} key The key of the method to get.
6009
     * @returns {*} Returns the function if it's native, else `undefined`.
6010
     */
6011
    function getNative(object, key) {
6012
      var value = getValue(object, key);
6013
      return baseIsNative(value) ? value : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6014
    }
6015
6016
    /**
6017
     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
6018
     *
6019
     * @private
6020
     * @param {*} value The value to query.
6021
     * @returns {string} Returns the raw `toStringTag`.
6022
     */
6023
    function getRawTag(value) {
6024
      var isOwn = hasOwnProperty.call(value, symToStringTag),
6025
          tag = value[symToStringTag];
6026
6027
      try {
6028
        value[symToStringTag] = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6029
        var unmasked = true;
6030
      } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
6031
6032
      var result = nativeObjectToString.call(value);
6033
      if (unmasked) {
6034
        if (isOwn) {
6035
          value[symToStringTag] = tag;
6036
        } else {
6037
          delete value[symToStringTag];
6038
        }
6039
      }
6040
      return result;
6041
    }
6042
6043
    /**
6044
     * Creates an array of the own enumerable symbols of `object`.
6045
     *
6046
     * @private
6047
     * @param {Object} object The object to query.
6048
     * @returns {Array} Returns the array of symbols.
6049
     */
6050
    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
6051
      if (object == null) {
6052
        return [];
6053
      }
6054
      object = Object(object);
6055
      return arrayFilter(nativeGetSymbols(object), function(symbol) {
6056
        return propertyIsEnumerable.call(object, symbol);
6057
      });
6058
    };
6059
6060
    /**
6061
     * Creates an array of the own and inherited enumerable symbols of `object`.
6062
     *
6063
     * @private
6064
     * @param {Object} object The object to query.
6065
     * @returns {Array} Returns the array of symbols.
6066
     */
6067
    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
6068
      var result = [];
6069
      while (object) {
6070
        arrayPush(result, getSymbols(object));
6071
        object = getPrototype(object);
6072
      }
6073
      return result;
6074
    };
6075
6076
    /**
6077
     * Gets the `toStringTag` of `value`.
6078
     *
6079
     * @private
6080
     * @param {*} value The value to query.
6081
     * @returns {string} Returns the `toStringTag`.
6082
     */
6083
    var getTag = baseGetTag;
6084
6085
    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
6086
    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
6087
        (Map && getTag(new Map) != mapTag) ||
6088
        (Promise && getTag(Promise.resolve()) != promiseTag) ||
6089
        (Set && getTag(new Set) != setTag) ||
6090
        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
6091
      getTag = function(value) {
6092
        var result = baseGetTag(value),
6093
            Ctor = result == objectTag ? value.constructor : undefined,
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6094
            ctorString = Ctor ? toSource(Ctor) : '';
6095
6096
        if (ctorString) {
6097
          switch (ctorString) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
6098
            case dataViewCtorString: return dataViewTag;
6099
            case mapCtorString: return mapTag;
6100
            case promiseCtorString: return promiseTag;
6101
            case setCtorString: return setTag;
6102
            case weakMapCtorString: return weakMapTag;
6103
          }
6104
        }
6105
        return result;
6106
      };
6107
    }
6108
6109
    /**
6110
     * Gets the view, applying any `transforms` to the `start` and `end` positions.
6111
     *
6112
     * @private
6113
     * @param {number} start The start of the view.
6114
     * @param {number} end The end of the view.
6115
     * @param {Array} transforms The transformations to apply to the view.
6116
     * @returns {Object} Returns an object containing the `start` and `end`
6117
     *  positions of the view.
6118
     */
6119
    function getView(start, end, transforms) {
6120
      var index = -1,
6121
          length = transforms.length;
6122
6123
      while (++index < length) {
6124
        var data = transforms[index],
6125
            size = data.size;
6126
6127
        switch (data.type) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
6128
          case 'drop':      start += size; break;
6129
          case 'dropRight': end -= size; break;
6130
          case 'take':      end = nativeMin(end, start + size); break;
6131
          case 'takeRight': start = nativeMax(start, end - size); break;
6132
        }
6133
      }
6134
      return { 'start': start, 'end': end };
6135
    }
6136
6137
    /**
6138
     * Extracts wrapper details from the `source` body comment.
6139
     *
6140
     * @private
6141
     * @param {string} source The source to inspect.
6142
     * @returns {Array} Returns the wrapper details.
6143
     */
6144
    function getWrapDetails(source) {
6145
      var match = source.match(reWrapDetails);
6146
      return match ? match[1].split(reSplitDetails) : [];
6147
    }
6148
6149
    /**
6150
     * Checks if `path` exists on `object`.
6151
     *
6152
     * @private
6153
     * @param {Object} object The object to query.
6154
     * @param {Array|string} path The path to check.
6155
     * @param {Function} hasFunc The function to check properties.
6156
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
6157
     */
6158
    function hasPath(object, path, hasFunc) {
6159
      path = castPath(path, object);
6160
6161
      var index = -1,
6162
          length = path.length,
6163
          result = false;
6164
6165
      while (++index < length) {
6166
        var key = toKey(path[index]);
6167
        if (!(result = object != null && hasFunc(object, key))) {
6168
          break;
6169
        }
6170
        object = object[key];
6171
      }
6172
      if (result || ++index != length) {
6173
        return result;
6174
      }
6175
      length = object == null ? 0 : object.length;
6176
      return !!length && isLength(length) && isIndex(key, length) &&
0 ignored issues
show
introduced by
The variable key does not seem to be initialized in case the while loop on line 6165 is not entered. Are you sure the function isIndex handles undefined variables?
Loading history...
6177
        (isArray(object) || isArguments(object));
6178
    }
6179
6180
    /**
6181
     * Initializes an array clone.
6182
     *
6183
     * @private
6184
     * @param {Array} array The array to clone.
6185
     * @returns {Array} Returns the initialized clone.
6186
     */
6187
    function initCloneArray(array) {
6188
      var length = array.length,
6189
          result = array.constructor(length);
6190
6191
      // Add properties assigned by `RegExp#exec`.
6192
      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
6193
        result.index = array.index;
6194
        result.input = array.input;
6195
      }
6196
      return result;
6197
    }
6198
6199
    /**
6200
     * Initializes an object clone.
6201
     *
6202
     * @private
6203
     * @param {Object} object The object to clone.
6204
     * @returns {Object} Returns the initialized clone.
6205
     */
6206
    function initCloneObject(object) {
6207
      return (typeof object.constructor == 'function' && !isPrototype(object))
6208
        ? baseCreate(getPrototype(object))
6209
        : {};
6210
    }
6211
6212
    /**
6213
     * Initializes an object clone based on its `toStringTag`.
6214
     *
6215
     * **Note:** This function only supports cloning values with tags of
6216
     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
6217
     *
6218
     * @private
6219
     * @param {Object} object The object to clone.
6220
     * @param {string} tag The `toStringTag` of the object to clone.
6221
     * @param {Function} cloneFunc The function to clone values.
6222
     * @param {boolean} [isDeep] Specify a deep clone.
6223
     * @returns {Object} Returns the initialized clone.
6224
     */
6225
    function initCloneByTag(object, tag, cloneFunc, isDeep) {
6226
      var Ctor = object.constructor;
6227
      switch (tag) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
6228
        case arrayBufferTag:
6229
          return cloneArrayBuffer(object);
6230
6231
        case boolTag:
6232
        case dateTag:
6233
          return new Ctor(+object);
6234
6235
        case dataViewTag:
6236
          return cloneDataView(object, isDeep);
6237
6238
        case float32Tag: case float64Tag:
6239
        case int8Tag: case int16Tag: case int32Tag:
6240
        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
6241
          return cloneTypedArray(object, isDeep);
6242
6243
        case mapTag:
6244
          return cloneMap(object, isDeep, cloneFunc);
6245
6246
        case numberTag:
6247
        case stringTag:
6248
          return new Ctor(object);
6249
6250
        case regexpTag:
6251
          return cloneRegExp(object);
6252
6253
        case setTag:
6254
          return cloneSet(object, isDeep, cloneFunc);
6255
6256
        case symbolTag:
6257
          return cloneSymbol(object);
6258
      }
0 ignored issues
show
Comprehensibility introduced by
There is no default case in this switch, so nothing gets returned when all cases fail. You might want to consider adding a default or return undefined explicitly.
Loading history...
6259
    }
6260
6261
    /**
6262
     * Inserts wrapper `details` in a comment at the top of the `source` body.
6263
     *
6264
     * @private
6265
     * @param {string} source The source to modify.
6266
     * @returns {Array} details The details to insert.
6267
     * @returns {string} Returns the modified source.
6268
     */
6269
    function insertWrapDetails(source, details) {
6270
      var length = details.length;
6271
      if (!length) {
6272
        return source;
6273
      }
6274
      var lastIndex = length - 1;
6275
      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
6276
      details = details.join(length > 2 ? ', ' : ' ');
6277
      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
6278
    }
6279
6280
    /**
6281
     * Checks if `value` is a flattenable `arguments` object or array.
6282
     *
6283
     * @private
6284
     * @param {*} value The value to check.
6285
     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
6286
     */
6287
    function isFlattenable(value) {
6288
      return isArray(value) || isArguments(value) ||
6289
        !!(spreadableSymbol && value && value[spreadableSymbol]);
6290
    }
6291
6292
    /**
6293
     * Checks if `value` is a valid array-like index.
6294
     *
6295
     * @private
6296
     * @param {*} value The value to check.
6297
     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
6298
     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
6299
     */
6300
    function isIndex(value, length) {
6301
      length = length == null ? MAX_SAFE_INTEGER : length;
6302
      return !!length &&
6303
        (typeof value == 'number' || reIsUint.test(value)) &&
6304
        (value > -1 && value % 1 == 0 && value < length);
6305
    }
6306
6307
    /**
6308
     * Checks if the given arguments are from an iteratee call.
6309
     *
6310
     * @private
6311
     * @param {*} value The potential iteratee value argument.
6312
     * @param {*} index The potential iteratee index or key argument.
6313
     * @param {*} object The potential iteratee object argument.
6314
     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
6315
     *  else `false`.
6316
     */
6317
    function isIterateeCall(value, index, object) {
6318
      if (!isObject(object)) {
6319
        return false;
6320
      }
6321
      var type = typeof index;
6322
      if (type == 'number'
6323
            ? (isArrayLike(object) && isIndex(index, object.length))
6324
            : (type == 'string' && index in object)
6325
          ) {
6326
        return eq(object[index], value);
6327
      }
6328
      return false;
6329
    }
6330
6331
    /**
6332
     * Checks if `value` is a property name and not a property path.
6333
     *
6334
     * @private
6335
     * @param {*} value The value to check.
6336
     * @param {Object} [object] The object to query keys on.
6337
     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
6338
     */
6339
    function isKey(value, object) {
6340
      if (isArray(value)) {
6341
        return false;
6342
      }
6343
      var type = typeof value;
6344
      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
6345
          value == null || isSymbol(value)) {
6346
        return true;
6347
      }
6348
      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
6349
        (object != null && value in Object(object));
6350
    }
6351
6352
    /**
6353
     * Checks if `value` is suitable for use as unique object key.
6354
     *
6355
     * @private
6356
     * @param {*} value The value to check.
6357
     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
6358
     */
6359
    function isKeyable(value) {
6360
      var type = typeof value;
6361
      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
6362
        ? (value !== '__proto__')
6363
        : (value === null);
6364
    }
6365
6366
    /**
6367
     * Checks if `func` has a lazy counterpart.
6368
     *
6369
     * @private
6370
     * @param {Function} func The function to check.
6371
     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
6372
     *  else `false`.
6373
     */
6374
    function isLaziable(func) {
6375
      var funcName = getFuncName(func),
6376
          other = lodash[funcName];
6377
6378
      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
6379
        return false;
6380
      }
6381
      if (func === other) {
6382
        return true;
6383
      }
6384
      var data = getData(other);
6385
      return !!data && func === data[0];
6386
    }
6387
6388
    /**
6389
     * Checks if `func` has its source masked.
6390
     *
6391
     * @private
6392
     * @param {Function} func The function to check.
6393
     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
6394
     */
6395
    function isMasked(func) {
6396
      return !!maskSrcKey && (maskSrcKey in func);
6397
    }
6398
6399
    /**
6400
     * Checks if `func` is capable of being masked.
6401
     *
6402
     * @private
6403
     * @param {*} value The value to check.
6404
     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
6405
     */
6406
    var isMaskable = coreJsData ? isFunction : stubFalse;
6407
6408
    /**
6409
     * Checks if `value` is likely a prototype object.
6410
     *
6411
     * @private
6412
     * @param {*} value The value to check.
6413
     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
6414
     */
6415
    function isPrototype(value) {
6416
      var Ctor = value && value.constructor,
6417
          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
6418
6419
      return value === proto;
6420
    }
6421
6422
    /**
6423
     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
6424
     *
6425
     * @private
6426
     * @param {*} value The value to check.
6427
     * @returns {boolean} Returns `true` if `value` if suitable for strict
6428
     *  equality comparisons, else `false`.
6429
     */
6430
    function isStrictComparable(value) {
6431
      return value === value && !isObject(value);
6432
    }
6433
6434
    /**
6435
     * A specialized version of `matchesProperty` for source values suitable
6436
     * for strict equality comparisons, i.e. `===`.
6437
     *
6438
     * @private
6439
     * @param {string} key The key of the property to get.
6440
     * @param {*} srcValue The value to match.
6441
     * @returns {Function} Returns the new spec function.
6442
     */
6443
    function matchesStrictComparable(key, srcValue) {
6444
      return function(object) {
6445
        if (object == null) {
6446
          return false;
6447
        }
6448
        return object[key] === srcValue &&
6449
          (srcValue !== undefined || (key in Object(object)));
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6450
      };
6451
    }
6452
6453
    /**
6454
     * A specialized version of `_.memoize` which clears the memoized function's
6455
     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
6456
     *
6457
     * @private
6458
     * @param {Function} func The function to have its output memoized.
6459
     * @returns {Function} Returns the new memoized function.
6460
     */
6461
    function memoizeCapped(func) {
6462
      var result = memoize(func, function(key) {
6463
        if (cache.size === MAX_MEMOIZE_SIZE) {
6464
          cache.clear();
6465
        }
6466
        return key;
6467
      });
6468
6469
      var cache = result.cache;
6470
      return result;
6471
    }
6472
6473
    /**
6474
     * Merges the function metadata of `source` into `data`.
6475
     *
6476
     * Merging metadata reduces the number of wrappers used to invoke a function.
6477
     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
6478
     * may be applied regardless of execution order. Methods like `_.ary` and
6479
     * `_.rearg` modify function arguments, making the order in which they are
6480
     * executed important, preventing the merging of metadata. However, we make
6481
     * an exception for a safe combined case where curried functions have `_.ary`
6482
     * and or `_.rearg` applied.
6483
     *
6484
     * @private
6485
     * @param {Array} data The destination metadata.
6486
     * @param {Array} source The source metadata.
6487
     * @returns {Array} Returns `data`.
6488
     */
6489
    function mergeData(data, source) {
6490
      var bitmask = data[1],
6491
          srcBitmask = source[1],
6492
          newBitmask = bitmask | srcBitmask,
6493
          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
6494
6495
      var isCombo =
6496
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
6497
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
6498
        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
6499
6500
      // Exit early if metadata can't be merged.
6501
      if (!(isCommon || isCombo)) {
6502
        return data;
6503
      }
6504
      // Use source `thisArg` if available.
6505
      if (srcBitmask & WRAP_BIND_FLAG) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
6506
        data[2] = source[2];
6507
        // Set when currying a bound function.
6508
        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
6509
      }
6510
      // Compose partial arguments.
6511
      var value = source[3];
6512
      if (value) {
6513
        var partials = data[3];
6514
        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
6515
        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
6516
      }
6517
      // Compose partial right arguments.
6518
      value = source[5];
6519
      if (value) {
6520
        partials = data[5];
6521
        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
6522
        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
6523
      }
6524
      // Use source `argPos` if available.
6525
      value = source[7];
6526
      if (value) {
6527
        data[7] = value;
6528
      }
6529
      // Use source `ary` if it's smaller.
6530
      if (srcBitmask & WRAP_ARY_FLAG) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
6531
        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
6532
      }
6533
      // Use source `arity` if one is not provided.
6534
      if (data[9] == null) {
6535
        data[9] = source[9];
6536
      }
6537
      // Use source `func` and merge bitmasks.
6538
      data[0] = source[0];
6539
      data[1] = newBitmask;
6540
6541
      return data;
6542
    }
6543
6544
    /**
6545
     * This function is like
6546
     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
6547
     * except that it includes inherited enumerable properties.
6548
     *
6549
     * @private
6550
     * @param {Object} object The object to query.
6551
     * @returns {Array} Returns the array of property names.
6552
     */
6553
    function nativeKeysIn(object) {
6554
      var result = [];
6555
      if (object != null) {
6556
        for (var key in Object(object)) {
6557
          result.push(key);
6558
        }
6559
      }
6560
      return result;
6561
    }
6562
6563
    /**
6564
     * Converts `value` to a string using `Object.prototype.toString`.
6565
     *
6566
     * @private
6567
     * @param {*} value The value to convert.
6568
     * @returns {string} Returns the converted string.
6569
     */
6570
    function objectToString(value) {
6571
      return nativeObjectToString.call(value);
6572
    }
6573
6574
    /**
6575
     * A specialized version of `baseRest` which transforms the rest array.
6576
     *
6577
     * @private
6578
     * @param {Function} func The function to apply a rest parameter to.
6579
     * @param {number} [start=func.length-1] The start position of the rest parameter.
6580
     * @param {Function} transform The rest array transform.
6581
     * @returns {Function} Returns the new function.
6582
     */
6583
    function overRest(func, start, transform) {
6584
      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6585
      return function() {
6586
        var args = arguments,
6587
            index = -1,
6588
            length = nativeMax(args.length - start, 0),
6589
            array = Array(length);
6590
6591
        while (++index < length) {
6592
          array[index] = args[start + index];
6593
        }
6594
        index = -1;
6595
        var otherArgs = Array(start + 1);
6596
        while (++index < start) {
6597
          otherArgs[index] = args[index];
6598
        }
6599
        otherArgs[start] = transform(array);
6600
        return apply(func, this, otherArgs);
6601
      };
6602
    }
6603
6604
    /**
6605
     * Gets the parent value at `path` of `object`.
6606
     *
6607
     * @private
6608
     * @param {Object} object The object to query.
6609
     * @param {Array} path The path to get the parent value of.
6610
     * @returns {*} Returns the parent value.
6611
     */
6612
    function parent(object, path) {
6613
      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
6614
    }
6615
6616
    /**
6617
     * Reorder `array` according to the specified indexes where the element at
6618
     * the first index is assigned as the first element, the element at
6619
     * the second index is assigned as the second element, and so on.
6620
     *
6621
     * @private
6622
     * @param {Array} array The array to reorder.
6623
     * @param {Array} indexes The arranged array indexes.
6624
     * @returns {Array} Returns `array`.
6625
     */
6626
    function reorder(array, indexes) {
6627
      var arrLength = array.length,
6628
          length = nativeMin(indexes.length, arrLength),
6629
          oldArray = copyArray(array);
6630
6631
      while (length--) {
6632
        var index = indexes[length];
6633
        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6634
      }
6635
      return array;
6636
    }
6637
6638
    /**
6639
     * Sets metadata for `func`.
6640
     *
6641
     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
6642
     * period of time, it will trip its breaker and transition to an identity
6643
     * function to avoid garbage collection pauses in V8. See
6644
     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
6645
     * for more details.
6646
     *
6647
     * @private
6648
     * @param {Function} func The function to associate metadata with.
6649
     * @param {*} data The metadata.
6650
     * @returns {Function} Returns `func`.
6651
     */
6652
    var setData = shortOut(baseSetData);
6653
6654
    /**
6655
     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
6656
     *
6657
     * @private
6658
     * @param {Function} func The function to delay.
6659
     * @param {number} wait The number of milliseconds to delay invocation.
6660
     * @returns {number|Object} Returns the timer id or timeout object.
6661
     */
6662
    var setTimeout = ctxSetTimeout || function(func, wait) {
6663
      return root.setTimeout(func, wait);
6664
    };
6665
6666
    /**
6667
     * Sets the `toString` method of `func` to return `string`.
6668
     *
6669
     * @private
6670
     * @param {Function} func The function to modify.
6671
     * @param {Function} string The `toString` result.
6672
     * @returns {Function} Returns `func`.
6673
     */
6674
    var setToString = shortOut(baseSetToString);
6675
6676
    /**
6677
     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
6678
     * with wrapper details in a comment at the top of the source body.
6679
     *
6680
     * @private
6681
     * @param {Function} wrapper The function to modify.
6682
     * @param {Function} reference The reference function.
6683
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6684
     * @returns {Function} Returns `wrapper`.
6685
     */
6686
    function setWrapToString(wrapper, reference, bitmask) {
6687
      var source = (reference + '');
6688
      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
6689
    }
6690
6691
    /**
6692
     * Creates a function that'll short out and invoke `identity` instead
6693
     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
6694
     * milliseconds.
6695
     *
6696
     * @private
6697
     * @param {Function} func The function to restrict.
6698
     * @returns {Function} Returns the new shortable function.
6699
     */
6700
    function shortOut(func) {
6701
      var count = 0,
6702
          lastCalled = 0;
6703
6704
      return function() {
6705
        var stamp = nativeNow(),
6706
            remaining = HOT_SPAN - (stamp - lastCalled);
6707
6708
        lastCalled = stamp;
6709
        if (remaining > 0) {
6710
          if (++count >= HOT_COUNT) {
6711
            return arguments[0];
6712
          }
6713
        } else {
6714
          count = 0;
6715
        }
6716
        return func.apply(undefined, arguments);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6717
      };
6718
    }
6719
6720
    /**
6721
     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
6722
     *
6723
     * @private
6724
     * @param {Array} array The array to shuffle.
6725
     * @param {number} [size=array.length] The size of `array`.
6726
     * @returns {Array} Returns `array`.
6727
     */
6728
    function shuffleSelf(array, size) {
6729
      var index = -1,
6730
          length = array.length,
6731
          lastIndex = length - 1;
6732
6733
      size = size === undefined ? length : size;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6734
      while (++index < size) {
6735
        var rand = baseRandom(index, lastIndex),
6736
            value = array[rand];
6737
6738
        array[rand] = array[index];
6739
        array[index] = value;
6740
      }
6741
      array.length = size;
6742
      return array;
6743
    }
6744
6745
    /**
6746
     * Converts `string` to a property path array.
6747
     *
6748
     * @private
6749
     * @param {string} string The string to convert.
6750
     * @returns {Array} Returns the property path array.
6751
     */
6752
    var stringToPath = memoizeCapped(function(string) {
6753
      var result = [];
6754
      if (reLeadingDot.test(string)) {
6755
        result.push('');
6756
      }
6757
      string.replace(rePropName, function(match, number, quote, string) {
6758
        result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
6759
      });
6760
      return result;
6761
    });
6762
6763
    /**
6764
     * Converts `value` to a string key if it's not a string or symbol.
6765
     *
6766
     * @private
6767
     * @param {*} value The value to inspect.
6768
     * @returns {string|symbol} Returns the key.
6769
     */
6770
    function toKey(value) {
6771
      if (typeof value == 'string' || isSymbol(value)) {
6772
        return value;
6773
      }
6774
      var result = (value + '');
6775
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
6776
    }
6777
6778
    /**
6779
     * Converts `func` to its source code.
6780
     *
6781
     * @private
6782
     * @param {Function} func The function to convert.
6783
     * @returns {string} Returns the source code.
6784
     */
6785
    function toSource(func) {
6786
      if (func != null) {
6787
        try {
6788
          return funcToString.call(func);
6789
        } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
6790
        try {
6791
          return (func + '');
6792
        } catch (e) {}
0 ignored issues
show
introduced by
This code is unreachable and can thus be removed without consequences.
Loading history...
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
6793
      }
6794
      return '';
6795
    }
6796
6797
    /**
6798
     * Updates wrapper `details` based on `bitmask` flags.
6799
     *
6800
     * @private
6801
     * @returns {Array} details The details to modify.
6802
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6803
     * @returns {Array} Returns `details`.
6804
     */
6805
    function updateWrapDetails(details, bitmask) {
6806
      arrayEach(wrapFlags, function(pair) {
6807
        var value = '_.' + pair[0];
6808
        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
6809
          details.push(value);
6810
        }
6811
      });
6812
      return details.sort();
6813
    }
6814
6815
    /**
6816
     * Creates a clone of `wrapper`.
6817
     *
6818
     * @private
6819
     * @param {Object} wrapper The wrapper to clone.
6820
     * @returns {Object} Returns the cloned wrapper.
6821
     */
6822
    function wrapperClone(wrapper) {
6823
      if (wrapper instanceof LazyWrapper) {
6824
        return wrapper.clone();
6825
      }
6826
      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
6827
      result.__actions__ = copyArray(wrapper.__actions__);
6828
      result.__index__  = wrapper.__index__;
6829
      result.__values__ = wrapper.__values__;
6830
      return result;
6831
    }
6832
6833
    /*------------------------------------------------------------------------*/
6834
6835
    /**
6836
     * Creates an array of elements split into groups the length of `size`.
6837
     * If `array` can't be split evenly, the final chunk will be the remaining
6838
     * elements.
6839
     *
6840
     * @static
6841
     * @memberOf _
6842
     * @since 3.0.0
6843
     * @category Array
6844
     * @param {Array} array The array to process.
6845
     * @param {number} [size=1] The length of each chunk
6846
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
6847
     * @returns {Array} Returns the new array of chunks.
6848
     * @example
6849
     *
6850
     * _.chunk(['a', 'b', 'c', 'd'], 2);
6851
     * // => [['a', 'b'], ['c', 'd']]
6852
     *
6853
     * _.chunk(['a', 'b', 'c', 'd'], 3);
6854
     * // => [['a', 'b', 'c'], ['d']]
6855
     */
6856
    function chunk(array, size, guard) {
6857
      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
6858
        size = 1;
6859
      } else {
6860
        size = nativeMax(toInteger(size), 0);
6861
      }
6862
      var length = array == null ? 0 : array.length;
6863
      if (!length || size < 1) {
6864
        return [];
6865
      }
6866
      var index = 0,
6867
          resIndex = 0,
6868
          result = Array(nativeCeil(length / size));
6869
6870
      while (index < length) {
6871
        result[resIndex++] = baseSlice(array, index, (index += size));
6872
      }
6873
      return result;
6874
    }
6875
6876
    /**
6877
     * Creates an array with all falsey values removed. The values `false`, `null`,
6878
     * `0`, `""`, `undefined`, and `NaN` are falsey.
6879
     *
6880
     * @static
6881
     * @memberOf _
6882
     * @since 0.1.0
6883
     * @category Array
6884
     * @param {Array} array The array to compact.
6885
     * @returns {Array} Returns the new array of filtered values.
6886
     * @example
6887
     *
6888
     * _.compact([0, 1, false, 2, '', 3]);
6889
     * // => [1, 2, 3]
6890
     */
6891
    function compact(array) {
6892
      var index = -1,
6893
          length = array == null ? 0 : array.length,
6894
          resIndex = 0,
6895
          result = [];
6896
6897
      while (++index < length) {
6898
        var value = array[index];
6899
        if (value) {
6900
          result[resIndex++] = value;
6901
        }
6902
      }
6903
      return result;
6904
    }
6905
6906
    /**
6907
     * Creates a new array concatenating `array` with any additional arrays
6908
     * and/or values.
6909
     *
6910
     * @static
6911
     * @memberOf _
6912
     * @since 4.0.0
6913
     * @category Array
6914
     * @param {Array} array The array to concatenate.
6915
     * @param {...*} [values] The values to concatenate.
6916
     * @returns {Array} Returns the new concatenated array.
6917
     * @example
6918
     *
6919
     * var array = [1];
6920
     * var other = _.concat(array, 2, [3], [[4]]);
6921
     *
6922
     * console.log(other);
6923
     * // => [1, 2, 3, [4]]
6924
     *
6925
     * console.log(array);
6926
     * // => [1]
6927
     */
6928
    function concat() {
6929
      var length = arguments.length;
6930
      if (!length) {
6931
        return [];
6932
      }
6933
      var args = Array(length - 1),
6934
          array = arguments[0],
6935
          index = length;
6936
6937
      while (index--) {
6938
        args[index - 1] = arguments[index];
6939
      }
6940
      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
6941
    }
6942
6943
    /**
6944
     * Creates an array of `array` values not included in the other given arrays
6945
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
6946
     * for equality comparisons. The order and references of result values are
6947
     * determined by the first array.
6948
     *
6949
     * **Note:** Unlike `_.pullAll`, this method returns a new array.
6950
     *
6951
     * @static
6952
     * @memberOf _
6953
     * @since 0.1.0
6954
     * @category Array
6955
     * @param {Array} array The array to inspect.
6956
     * @param {...Array} [values] The values to exclude.
6957
     * @returns {Array} Returns the new array of filtered values.
6958
     * @see _.without, _.xor
6959
     * @example
6960
     *
6961
     * _.difference([2, 1], [2, 3]);
6962
     * // => [1]
6963
     */
6964
    var difference = baseRest(function(array, values) {
6965
      return isArrayLikeObject(array)
6966
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
6967
        : [];
6968
    });
6969
6970
    /**
6971
     * This method is like `_.difference` except that it accepts `iteratee` which
6972
     * is invoked for each element of `array` and `values` to generate the criterion
6973
     * by which they're compared. The order and references of result values are
6974
     * determined by the first array. The iteratee is invoked with one argument:
6975
     * (value).
6976
     *
6977
     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
6978
     *
6979
     * @static
6980
     * @memberOf _
6981
     * @since 4.0.0
6982
     * @category Array
6983
     * @param {Array} array The array to inspect.
6984
     * @param {...Array} [values] The values to exclude.
6985
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
6986
     * @returns {Array} Returns the new array of filtered values.
6987
     * @example
6988
     *
6989
     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
6990
     * // => [1.2]
6991
     *
6992
     * // The `_.property` iteratee shorthand.
6993
     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
6994
     * // => [{ 'x': 2 }]
6995
     */
6996
    var differenceBy = baseRest(function(array, values) {
6997
      var iteratee = last(values);
6998
      if (isArrayLikeObject(iteratee)) {
6999
        iteratee = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7000
      }
7001
      return isArrayLikeObject(array)
7002
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
7003
        : [];
7004
    });
7005
7006
    /**
7007
     * This method is like `_.difference` except that it accepts `comparator`
7008
     * which is invoked to compare elements of `array` to `values`. The order and
7009
     * references of result values are determined by the first array. The comparator
7010
     * is invoked with two arguments: (arrVal, othVal).
7011
     *
7012
     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
7013
     *
7014
     * @static
7015
     * @memberOf _
7016
     * @since 4.0.0
7017
     * @category Array
7018
     * @param {Array} array The array to inspect.
7019
     * @param {...Array} [values] The values to exclude.
7020
     * @param {Function} [comparator] The comparator invoked per element.
7021
     * @returns {Array} Returns the new array of filtered values.
7022
     * @example
7023
     *
7024
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7025
     *
7026
     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
7027
     * // => [{ 'x': 2, 'y': 1 }]
7028
     */
7029
    var differenceWith = baseRest(function(array, values) {
7030
      var comparator = last(values);
7031
      if (isArrayLikeObject(comparator)) {
7032
        comparator = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7033
      }
7034
      return isArrayLikeObject(array)
7035
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
7036
        : [];
7037
    });
7038
7039
    /**
7040
     * Creates a slice of `array` with `n` elements dropped from the beginning.
7041
     *
7042
     * @static
7043
     * @memberOf _
7044
     * @since 0.5.0
7045
     * @category Array
7046
     * @param {Array} array The array to query.
7047
     * @param {number} [n=1] The number of elements to drop.
7048
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7049
     * @returns {Array} Returns the slice of `array`.
7050
     * @example
7051
     *
7052
     * _.drop([1, 2, 3]);
7053
     * // => [2, 3]
7054
     *
7055
     * _.drop([1, 2, 3], 2);
7056
     * // => [3]
7057
     *
7058
     * _.drop([1, 2, 3], 5);
7059
     * // => []
7060
     *
7061
     * _.drop([1, 2, 3], 0);
7062
     * // => [1, 2, 3]
7063
     */
7064
    function drop(array, n, guard) {
7065
      var length = array == null ? 0 : array.length;
7066
      if (!length) {
7067
        return [];
7068
      }
7069
      n = (guard || n === undefined) ? 1 : toInteger(n);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7070
      return baseSlice(array, n < 0 ? 0 : n, length);
7071
    }
7072
7073
    /**
7074
     * Creates a slice of `array` with `n` elements dropped from the end.
7075
     *
7076
     * @static
7077
     * @memberOf _
7078
     * @since 3.0.0
7079
     * @category Array
7080
     * @param {Array} array The array to query.
7081
     * @param {number} [n=1] The number of elements to drop.
7082
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7083
     * @returns {Array} Returns the slice of `array`.
7084
     * @example
7085
     *
7086
     * _.dropRight([1, 2, 3]);
7087
     * // => [1, 2]
7088
     *
7089
     * _.dropRight([1, 2, 3], 2);
7090
     * // => [1]
7091
     *
7092
     * _.dropRight([1, 2, 3], 5);
7093
     * // => []
7094
     *
7095
     * _.dropRight([1, 2, 3], 0);
7096
     * // => [1, 2, 3]
7097
     */
7098
    function dropRight(array, n, guard) {
7099
      var length = array == null ? 0 : array.length;
7100
      if (!length) {
7101
        return [];
7102
      }
7103
      n = (guard || n === undefined) ? 1 : toInteger(n);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7104
      n = length - n;
7105
      return baseSlice(array, 0, n < 0 ? 0 : n);
7106
    }
7107
7108
    /**
7109
     * Creates a slice of `array` excluding elements dropped from the end.
7110
     * Elements are dropped until `predicate` returns falsey. The predicate is
7111
     * invoked with three arguments: (value, index, array).
7112
     *
7113
     * @static
7114
     * @memberOf _
7115
     * @since 3.0.0
7116
     * @category Array
7117
     * @param {Array} array The array to query.
7118
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7119
     * @returns {Array} Returns the slice of `array`.
7120
     * @example
7121
     *
7122
     * var users = [
7123
     *   { 'user': 'barney',  'active': true },
7124
     *   { 'user': 'fred',    'active': false },
7125
     *   { 'user': 'pebbles', 'active': false }
7126
     * ];
7127
     *
7128
     * _.dropRightWhile(users, function(o) { return !o.active; });
7129
     * // => objects for ['barney']
7130
     *
7131
     * // The `_.matches` iteratee shorthand.
7132
     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
7133
     * // => objects for ['barney', 'fred']
7134
     *
7135
     * // The `_.matchesProperty` iteratee shorthand.
7136
     * _.dropRightWhile(users, ['active', false]);
7137
     * // => objects for ['barney']
7138
     *
7139
     * // The `_.property` iteratee shorthand.
7140
     * _.dropRightWhile(users, 'active');
7141
     * // => objects for ['barney', 'fred', 'pebbles']
7142
     */
7143
    function dropRightWhile(array, predicate) {
7144
      return (array && array.length)
7145
        ? baseWhile(array, getIteratee(predicate, 3), true, true)
7146
        : [];
7147
    }
7148
7149
    /**
7150
     * Creates a slice of `array` excluding elements dropped from the beginning.
7151
     * Elements are dropped until `predicate` returns falsey. The predicate is
7152
     * invoked with three arguments: (value, index, array).
7153
     *
7154
     * @static
7155
     * @memberOf _
7156
     * @since 3.0.0
7157
     * @category Array
7158
     * @param {Array} array The array to query.
7159
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7160
     * @returns {Array} Returns the slice of `array`.
7161
     * @example
7162
     *
7163
     * var users = [
7164
     *   { 'user': 'barney',  'active': false },
7165
     *   { 'user': 'fred',    'active': false },
7166
     *   { 'user': 'pebbles', 'active': true }
7167
     * ];
7168
     *
7169
     * _.dropWhile(users, function(o) { return !o.active; });
7170
     * // => objects for ['pebbles']
7171
     *
7172
     * // The `_.matches` iteratee shorthand.
7173
     * _.dropWhile(users, { 'user': 'barney', 'active': false });
7174
     * // => objects for ['fred', 'pebbles']
7175
     *
7176
     * // The `_.matchesProperty` iteratee shorthand.
7177
     * _.dropWhile(users, ['active', false]);
7178
     * // => objects for ['pebbles']
7179
     *
7180
     * // The `_.property` iteratee shorthand.
7181
     * _.dropWhile(users, 'active');
7182
     * // => objects for ['barney', 'fred', 'pebbles']
7183
     */
7184
    function dropWhile(array, predicate) {
7185
      return (array && array.length)
7186
        ? baseWhile(array, getIteratee(predicate, 3), true)
7187
        : [];
7188
    }
7189
7190
    /**
7191
     * Fills elements of `array` with `value` from `start` up to, but not
7192
     * including, `end`.
7193
     *
7194
     * **Note:** This method mutates `array`.
7195
     *
7196
     * @static
7197
     * @memberOf _
7198
     * @since 3.2.0
7199
     * @category Array
7200
     * @param {Array} array The array to fill.
7201
     * @param {*} value The value to fill `array` with.
7202
     * @param {number} [start=0] The start position.
7203
     * @param {number} [end=array.length] The end position.
7204
     * @returns {Array} Returns `array`.
7205
     * @example
7206
     *
7207
     * var array = [1, 2, 3];
7208
     *
7209
     * _.fill(array, 'a');
7210
     * console.log(array);
7211
     * // => ['a', 'a', 'a']
7212
     *
7213
     * _.fill(Array(3), 2);
7214
     * // => [2, 2, 2]
7215
     *
7216
     * _.fill([4, 6, 8, 10], '*', 1, 3);
7217
     * // => [4, '*', '*', 10]
7218
     */
7219
    function fill(array, value, start, end) {
7220
      var length = array == null ? 0 : array.length;
7221
      if (!length) {
7222
        return [];
7223
      }
7224
      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
7225
        start = 0;
7226
        end = length;
7227
      }
7228
      return baseFill(array, value, start, end);
7229
    }
7230
7231
    /**
7232
     * This method is like `_.find` except that it returns the index of the first
7233
     * element `predicate` returns truthy for instead of the element itself.
7234
     *
7235
     * @static
7236
     * @memberOf _
7237
     * @since 1.1.0
7238
     * @category Array
7239
     * @param {Array} array The array to inspect.
7240
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7241
     * @param {number} [fromIndex=0] The index to search from.
7242
     * @returns {number} Returns the index of the found element, else `-1`.
7243
     * @example
7244
     *
7245
     * var users = [
7246
     *   { 'user': 'barney',  'active': false },
7247
     *   { 'user': 'fred',    'active': false },
7248
     *   { 'user': 'pebbles', 'active': true }
7249
     * ];
7250
     *
7251
     * _.findIndex(users, function(o) { return o.user == 'barney'; });
7252
     * // => 0
7253
     *
7254
     * // The `_.matches` iteratee shorthand.
7255
     * _.findIndex(users, { 'user': 'fred', 'active': false });
7256
     * // => 1
7257
     *
7258
     * // The `_.matchesProperty` iteratee shorthand.
7259
     * _.findIndex(users, ['active', false]);
7260
     * // => 0
7261
     *
7262
     * // The `_.property` iteratee shorthand.
7263
     * _.findIndex(users, 'active');
7264
     * // => 2
7265
     */
7266
    function findIndex(array, predicate, fromIndex) {
7267
      var length = array == null ? 0 : array.length;
7268
      if (!length) {
7269
        return -1;
7270
      }
7271
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
7272
      if (index < 0) {
7273
        index = nativeMax(length + index, 0);
7274
      }
7275
      return baseFindIndex(array, getIteratee(predicate, 3), index);
7276
    }
7277
7278
    /**
7279
     * This method is like `_.findIndex` except that it iterates over elements
7280
     * of `collection` from right to left.
7281
     *
7282
     * @static
7283
     * @memberOf _
7284
     * @since 2.0.0
7285
     * @category Array
7286
     * @param {Array} array The array to inspect.
7287
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7288
     * @param {number} [fromIndex=array.length-1] The index to search from.
7289
     * @returns {number} Returns the index of the found element, else `-1`.
7290
     * @example
7291
     *
7292
     * var users = [
7293
     *   { 'user': 'barney',  'active': true },
7294
     *   { 'user': 'fred',    'active': false },
7295
     *   { 'user': 'pebbles', 'active': false }
7296
     * ];
7297
     *
7298
     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
7299
     * // => 2
7300
     *
7301
     * // The `_.matches` iteratee shorthand.
7302
     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
7303
     * // => 0
7304
     *
7305
     * // The `_.matchesProperty` iteratee shorthand.
7306
     * _.findLastIndex(users, ['active', false]);
7307
     * // => 2
7308
     *
7309
     * // The `_.property` iteratee shorthand.
7310
     * _.findLastIndex(users, 'active');
7311
     * // => 0
7312
     */
7313
    function findLastIndex(array, predicate, fromIndex) {
7314
      var length = array == null ? 0 : array.length;
7315
      if (!length) {
7316
        return -1;
7317
      }
7318
      var index = length - 1;
7319
      if (fromIndex !== undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7320
        index = toInteger(fromIndex);
7321
        index = fromIndex < 0
7322
          ? nativeMax(length + index, 0)
7323
          : nativeMin(index, length - 1);
7324
      }
7325
      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
7326
    }
7327
7328
    /**
7329
     * Flattens `array` a single level deep.
7330
     *
7331
     * @static
7332
     * @memberOf _
7333
     * @since 0.1.0
7334
     * @category Array
7335
     * @param {Array} array The array to flatten.
7336
     * @returns {Array} Returns the new flattened array.
7337
     * @example
7338
     *
7339
     * _.flatten([1, [2, [3, [4]], 5]]);
7340
     * // => [1, 2, [3, [4]], 5]
7341
     */
7342
    function flatten(array) {
7343
      var length = array == null ? 0 : array.length;
7344
      return length ? baseFlatten(array, 1) : [];
7345
    }
7346
7347
    /**
7348
     * Recursively flattens `array`.
7349
     *
7350
     * @static
7351
     * @memberOf _
7352
     * @since 3.0.0
7353
     * @category Array
7354
     * @param {Array} array The array to flatten.
7355
     * @returns {Array} Returns the new flattened array.
7356
     * @example
7357
     *
7358
     * _.flattenDeep([1, [2, [3, [4]], 5]]);
7359
     * // => [1, 2, 3, 4, 5]
7360
     */
7361
    function flattenDeep(array) {
7362
      var length = array == null ? 0 : array.length;
7363
      return length ? baseFlatten(array, INFINITY) : [];
7364
    }
7365
7366
    /**
7367
     * Recursively flatten `array` up to `depth` times.
7368
     *
7369
     * @static
7370
     * @memberOf _
7371
     * @since 4.4.0
7372
     * @category Array
7373
     * @param {Array} array The array to flatten.
7374
     * @param {number} [depth=1] The maximum recursion depth.
7375
     * @returns {Array} Returns the new flattened array.
7376
     * @example
7377
     *
7378
     * var array = [1, [2, [3, [4]], 5]];
7379
     *
7380
     * _.flattenDepth(array, 1);
7381
     * // => [1, 2, [3, [4]], 5]
7382
     *
7383
     * _.flattenDepth(array, 2);
7384
     * // => [1, 2, 3, [4], 5]
7385
     */
7386
    function flattenDepth(array, depth) {
7387
      var length = array == null ? 0 : array.length;
7388
      if (!length) {
7389
        return [];
7390
      }
7391
      depth = depth === undefined ? 1 : toInteger(depth);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7392
      return baseFlatten(array, depth);
7393
    }
7394
7395
    /**
7396
     * The inverse of `_.toPairs`; this method returns an object composed
7397
     * from key-value `pairs`.
7398
     *
7399
     * @static
7400
     * @memberOf _
7401
     * @since 4.0.0
7402
     * @category Array
7403
     * @param {Array} pairs The key-value pairs.
7404
     * @returns {Object} Returns the new object.
7405
     * @example
7406
     *
7407
     * _.fromPairs([['a', 1], ['b', 2]]);
7408
     * // => { 'a': 1, 'b': 2 }
7409
     */
7410
    function fromPairs(pairs) {
7411
      var index = -1,
7412
          length = pairs == null ? 0 : pairs.length,
7413
          result = {};
7414
7415
      while (++index < length) {
7416
        var pair = pairs[index];
7417
        result[pair[0]] = pair[1];
7418
      }
7419
      return result;
7420
    }
7421
7422
    /**
7423
     * Gets the first element of `array`.
7424
     *
7425
     * @static
7426
     * @memberOf _
7427
     * @since 0.1.0
7428
     * @alias first
7429
     * @category Array
7430
     * @param {Array} array The array to query.
7431
     * @returns {*} Returns the first element of `array`.
7432
     * @example
7433
     *
7434
     * _.head([1, 2, 3]);
7435
     * // => 1
7436
     *
7437
     * _.head([]);
7438
     * // => undefined
7439
     */
7440
    function head(array) {
7441
      return (array && array.length) ? array[0] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7442
    }
7443
7444
    /**
7445
     * Gets the index at which the first occurrence of `value` is found in `array`
7446
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7447
     * for equality comparisons. If `fromIndex` is negative, it's used as the
7448
     * offset from the end of `array`.
7449
     *
7450
     * @static
7451
     * @memberOf _
7452
     * @since 0.1.0
7453
     * @category Array
7454
     * @param {Array} array The array to inspect.
7455
     * @param {*} value The value to search for.
7456
     * @param {number} [fromIndex=0] The index to search from.
7457
     * @returns {number} Returns the index of the matched value, else `-1`.
7458
     * @example
7459
     *
7460
     * _.indexOf([1, 2, 1, 2], 2);
7461
     * // => 1
7462
     *
7463
     * // Search from the `fromIndex`.
7464
     * _.indexOf([1, 2, 1, 2], 2, 2);
7465
     * // => 3
7466
     */
7467
    function indexOf(array, value, fromIndex) {
7468
      var length = array == null ? 0 : array.length;
7469
      if (!length) {
7470
        return -1;
7471
      }
7472
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
7473
      if (index < 0) {
7474
        index = nativeMax(length + index, 0);
7475
      }
7476
      return baseIndexOf(array, value, index);
7477
    }
7478
7479
    /**
7480
     * Gets all but the last element of `array`.
7481
     *
7482
     * @static
7483
     * @memberOf _
7484
     * @since 0.1.0
7485
     * @category Array
7486
     * @param {Array} array The array to query.
7487
     * @returns {Array} Returns the slice of `array`.
7488
     * @example
7489
     *
7490
     * _.initial([1, 2, 3]);
7491
     * // => [1, 2]
7492
     */
7493
    function initial(array) {
7494
      var length = array == null ? 0 : array.length;
7495
      return length ? baseSlice(array, 0, -1) : [];
7496
    }
7497
7498
    /**
7499
     * Creates an array of unique values that are included in all given arrays
7500
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7501
     * for equality comparisons. The order and references of result values are
7502
     * determined by the first array.
7503
     *
7504
     * @static
7505
     * @memberOf _
7506
     * @since 0.1.0
7507
     * @category Array
7508
     * @param {...Array} [arrays] The arrays to inspect.
7509
     * @returns {Array} Returns the new array of intersecting values.
7510
     * @example
7511
     *
7512
     * _.intersection([2, 1], [2, 3]);
7513
     * // => [2]
7514
     */
7515
    var intersection = baseRest(function(arrays) {
7516
      var mapped = arrayMap(arrays, castArrayLikeObject);
7517
      return (mapped.length && mapped[0] === arrays[0])
7518
        ? baseIntersection(mapped)
7519
        : [];
7520
    });
7521
7522
    /**
7523
     * This method is like `_.intersection` except that it accepts `iteratee`
7524
     * which is invoked for each element of each `arrays` to generate the criterion
7525
     * by which they're compared. The order and references of result values are
7526
     * determined by the first array. The iteratee is invoked with one argument:
7527
     * (value).
7528
     *
7529
     * @static
7530
     * @memberOf _
7531
     * @since 4.0.0
7532
     * @category Array
7533
     * @param {...Array} [arrays] The arrays to inspect.
7534
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7535
     * @returns {Array} Returns the new array of intersecting values.
7536
     * @example
7537
     *
7538
     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
7539
     * // => [2.1]
7540
     *
7541
     * // The `_.property` iteratee shorthand.
7542
     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
7543
     * // => [{ 'x': 1 }]
7544
     */
7545
    var intersectionBy = baseRest(function(arrays) {
7546
      var iteratee = last(arrays),
7547
          mapped = arrayMap(arrays, castArrayLikeObject);
7548
7549
      if (iteratee === last(mapped)) {
7550
        iteratee = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7551
      } else {
7552
        mapped.pop();
7553
      }
7554
      return (mapped.length && mapped[0] === arrays[0])
7555
        ? baseIntersection(mapped, getIteratee(iteratee, 2))
7556
        : [];
7557
    });
7558
7559
    /**
7560
     * This method is like `_.intersection` except that it accepts `comparator`
7561
     * which is invoked to compare elements of `arrays`. The order and references
7562
     * of result values are determined by the first array. The comparator is
7563
     * invoked with two arguments: (arrVal, othVal).
7564
     *
7565
     * @static
7566
     * @memberOf _
7567
     * @since 4.0.0
7568
     * @category Array
7569
     * @param {...Array} [arrays] The arrays to inspect.
7570
     * @param {Function} [comparator] The comparator invoked per element.
7571
     * @returns {Array} Returns the new array of intersecting values.
7572
     * @example
7573
     *
7574
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7575
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
7576
     *
7577
     * _.intersectionWith(objects, others, _.isEqual);
7578
     * // => [{ 'x': 1, 'y': 2 }]
7579
     */
7580
    var intersectionWith = baseRest(function(arrays) {
7581
      var comparator = last(arrays),
7582
          mapped = arrayMap(arrays, castArrayLikeObject);
7583
7584
      comparator = typeof comparator == 'function' ? comparator : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7585
      if (comparator) {
7586
        mapped.pop();
7587
      }
7588
      return (mapped.length && mapped[0] === arrays[0])
7589
        ? baseIntersection(mapped, undefined, comparator)
7590
        : [];
7591
    });
7592
7593
    /**
7594
     * Converts all elements in `array` into a string separated by `separator`.
7595
     *
7596
     * @static
7597
     * @memberOf _
7598
     * @since 4.0.0
7599
     * @category Array
7600
     * @param {Array} array The array to convert.
7601
     * @param {string} [separator=','] The element separator.
7602
     * @returns {string} Returns the joined string.
7603
     * @example
7604
     *
7605
     * _.join(['a', 'b', 'c'], '~');
7606
     * // => 'a~b~c'
7607
     */
7608
    function join(array, separator) {
7609
      return array == null ? '' : nativeJoin.call(array, separator);
7610
    }
7611
7612
    /**
7613
     * Gets the last element of `array`.
7614
     *
7615
     * @static
7616
     * @memberOf _
7617
     * @since 0.1.0
7618
     * @category Array
7619
     * @param {Array} array The array to query.
7620
     * @returns {*} Returns the last element of `array`.
7621
     * @example
7622
     *
7623
     * _.last([1, 2, 3]);
7624
     * // => 3
7625
     */
7626
    function last(array) {
7627
      var length = array == null ? 0 : array.length;
7628
      return length ? array[length - 1] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7629
    }
7630
7631
    /**
7632
     * This method is like `_.indexOf` except that it iterates over elements of
7633
     * `array` from right to left.
7634
     *
7635
     * @static
7636
     * @memberOf _
7637
     * @since 0.1.0
7638
     * @category Array
7639
     * @param {Array} array The array to inspect.
7640
     * @param {*} value The value to search for.
7641
     * @param {number} [fromIndex=array.length-1] The index to search from.
7642
     * @returns {number} Returns the index of the matched value, else `-1`.
7643
     * @example
7644
     *
7645
     * _.lastIndexOf([1, 2, 1, 2], 2);
7646
     * // => 3
7647
     *
7648
     * // Search from the `fromIndex`.
7649
     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
7650
     * // => 1
7651
     */
7652
    function lastIndexOf(array, value, fromIndex) {
7653
      var length = array == null ? 0 : array.length;
7654
      if (!length) {
7655
        return -1;
7656
      }
7657
      var index = length;
7658
      if (fromIndex !== undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7659
        index = toInteger(fromIndex);
7660
        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
7661
      }
7662
      return value === value
7663
        ? strictLastIndexOf(array, value, index)
7664
        : baseFindIndex(array, baseIsNaN, index, true);
7665
    }
7666
7667
    /**
7668
     * Gets the element at index `n` of `array`. If `n` is negative, the nth
7669
     * element from the end is returned.
7670
     *
7671
     * @static
7672
     * @memberOf _
7673
     * @since 4.11.0
7674
     * @category Array
7675
     * @param {Array} array The array to query.
7676
     * @param {number} [n=0] The index of the element to return.
7677
     * @returns {*} Returns the nth element of `array`.
7678
     * @example
7679
     *
7680
     * var array = ['a', 'b', 'c', 'd'];
7681
     *
7682
     * _.nth(array, 1);
7683
     * // => 'b'
7684
     *
7685
     * _.nth(array, -2);
7686
     * // => 'c';
7687
     */
7688
    function nth(array, n) {
7689
      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7690
    }
7691
7692
    /**
7693
     * Removes all given values from `array` using
7694
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7695
     * for equality comparisons.
7696
     *
7697
     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
7698
     * to remove elements from an array by predicate.
7699
     *
7700
     * @static
7701
     * @memberOf _
7702
     * @since 2.0.0
7703
     * @category Array
7704
     * @param {Array} array The array to modify.
7705
     * @param {...*} [values] The values to remove.
7706
     * @returns {Array} Returns `array`.
7707
     * @example
7708
     *
7709
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7710
     *
7711
     * _.pull(array, 'a', 'c');
7712
     * console.log(array);
7713
     * // => ['b', 'b']
7714
     */
7715
    var pull = baseRest(pullAll);
7716
7717
    /**
7718
     * This method is like `_.pull` except that it accepts an array of values to remove.
7719
     *
7720
     * **Note:** Unlike `_.difference`, this method mutates `array`.
7721
     *
7722
     * @static
7723
     * @memberOf _
7724
     * @since 4.0.0
7725
     * @category Array
7726
     * @param {Array} array The array to modify.
7727
     * @param {Array} values The values to remove.
7728
     * @returns {Array} Returns `array`.
7729
     * @example
7730
     *
7731
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7732
     *
7733
     * _.pullAll(array, ['a', 'c']);
7734
     * console.log(array);
7735
     * // => ['b', 'b']
7736
     */
7737
    function pullAll(array, values) {
7738
      return (array && array.length && values && values.length)
7739
        ? basePullAll(array, values)
7740
        : array;
7741
    }
7742
7743
    /**
7744
     * This method is like `_.pullAll` except that it accepts `iteratee` which is
7745
     * invoked for each element of `array` and `values` to generate the criterion
7746
     * by which they're compared. The iteratee is invoked with one argument: (value).
7747
     *
7748
     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
7749
     *
7750
     * @static
7751
     * @memberOf _
7752
     * @since 4.0.0
7753
     * @category Array
7754
     * @param {Array} array The array to modify.
7755
     * @param {Array} values The values to remove.
7756
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7757
     * @returns {Array} Returns `array`.
7758
     * @example
7759
     *
7760
     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
7761
     *
7762
     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
7763
     * console.log(array);
7764
     * // => [{ 'x': 2 }]
7765
     */
7766
    function pullAllBy(array, values, iteratee) {
7767
      return (array && array.length && values && values.length)
7768
        ? basePullAll(array, values, getIteratee(iteratee, 2))
7769
        : array;
7770
    }
7771
7772
    /**
7773
     * This method is like `_.pullAll` except that it accepts `comparator` which
7774
     * is invoked to compare elements of `array` to `values`. The comparator is
7775
     * invoked with two arguments: (arrVal, othVal).
7776
     *
7777
     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
7778
     *
7779
     * @static
7780
     * @memberOf _
7781
     * @since 4.6.0
7782
     * @category Array
7783
     * @param {Array} array The array to modify.
7784
     * @param {Array} values The values to remove.
7785
     * @param {Function} [comparator] The comparator invoked per element.
7786
     * @returns {Array} Returns `array`.
7787
     * @example
7788
     *
7789
     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
7790
     *
7791
     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
7792
     * console.log(array);
7793
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
7794
     */
7795
    function pullAllWith(array, values, comparator) {
7796
      return (array && array.length && values && values.length)
7797
        ? basePullAll(array, values, undefined, comparator)
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7798
        : array;
7799
    }
7800
7801
    /**
7802
     * Removes elements from `array` corresponding to `indexes` and returns an
7803
     * array of removed elements.
7804
     *
7805
     * **Note:** Unlike `_.at`, this method mutates `array`.
7806
     *
7807
     * @static
7808
     * @memberOf _
7809
     * @since 3.0.0
7810
     * @category Array
7811
     * @param {Array} array The array to modify.
7812
     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
7813
     * @returns {Array} Returns the new array of removed elements.
7814
     * @example
7815
     *
7816
     * var array = ['a', 'b', 'c', 'd'];
7817
     * var pulled = _.pullAt(array, [1, 3]);
7818
     *
7819
     * console.log(array);
7820
     * // => ['a', 'c']
7821
     *
7822
     * console.log(pulled);
7823
     * // => ['b', 'd']
7824
     */
7825
    var pullAt = flatRest(function(array, indexes) {
7826
      var length = array == null ? 0 : array.length,
7827
          result = baseAt(array, indexes);
7828
7829
      basePullAt(array, arrayMap(indexes, function(index) {
7830
        return isIndex(index, length) ? +index : index;
7831
      }).sort(compareAscending));
7832
7833
      return result;
7834
    });
7835
7836
    /**
7837
     * Removes all elements from `array` that `predicate` returns truthy for
7838
     * and returns an array of the removed elements. The predicate is invoked
7839
     * with three arguments: (value, index, array).
7840
     *
7841
     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
7842
     * to pull elements from an array by value.
7843
     *
7844
     * @static
7845
     * @memberOf _
7846
     * @since 2.0.0
7847
     * @category Array
7848
     * @param {Array} array The array to modify.
7849
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7850
     * @returns {Array} Returns the new array of removed elements.
7851
     * @example
7852
     *
7853
     * var array = [1, 2, 3, 4];
7854
     * var evens = _.remove(array, function(n) {
7855
     *   return n % 2 == 0;
7856
     * });
7857
     *
7858
     * console.log(array);
7859
     * // => [1, 3]
7860
     *
7861
     * console.log(evens);
7862
     * // => [2, 4]
7863
     */
7864
    function remove(array, predicate) {
7865
      var result = [];
7866
      if (!(array && array.length)) {
7867
        return result;
7868
      }
7869
      var index = -1,
7870
          indexes = [],
7871
          length = array.length;
7872
7873
      predicate = getIteratee(predicate, 3);
7874
      while (++index < length) {
7875
        var value = array[index];
7876
        if (predicate(value, index, array)) {
7877
          result.push(value);
7878
          indexes.push(index);
7879
        }
7880
      }
7881
      basePullAt(array, indexes);
7882
      return result;
7883
    }
7884
7885
    /**
7886
     * Reverses `array` so that the first element becomes the last, the second
7887
     * element becomes the second to last, and so on.
7888
     *
7889
     * **Note:** This method mutates `array` and is based on
7890
     * [`Array#reverse`](https://mdn.io/Array/reverse).
7891
     *
7892
     * @static
7893
     * @memberOf _
7894
     * @since 4.0.0
7895
     * @category Array
7896
     * @param {Array} array The array to modify.
7897
     * @returns {Array} Returns `array`.
7898
     * @example
7899
     *
7900
     * var array = [1, 2, 3];
7901
     *
7902
     * _.reverse(array);
7903
     * // => [3, 2, 1]
7904
     *
7905
     * console.log(array);
7906
     * // => [3, 2, 1]
7907
     */
7908
    function reverse(array) {
7909
      return array == null ? array : nativeReverse.call(array);
7910
    }
7911
7912
    /**
7913
     * Creates a slice of `array` from `start` up to, but not including, `end`.
7914
     *
7915
     * **Note:** This method is used instead of
7916
     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
7917
     * returned.
7918
     *
7919
     * @static
7920
     * @memberOf _
7921
     * @since 3.0.0
7922
     * @category Array
7923
     * @param {Array} array The array to slice.
7924
     * @param {number} [start=0] The start position.
7925
     * @param {number} [end=array.length] The end position.
7926
     * @returns {Array} Returns the slice of `array`.
7927
     */
7928
    function slice(array, start, end) {
7929
      var length = array == null ? 0 : array.length;
7930
      if (!length) {
7931
        return [];
7932
      }
7933
      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
7934
        start = 0;
7935
        end = length;
7936
      }
7937
      else {
7938
        start = start == null ? 0 : toInteger(start);
7939
        end = end === undefined ? length : toInteger(end);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
7940
      }
7941
      return baseSlice(array, start, end);
7942
    }
7943
7944
    /**
7945
     * Uses a binary search to determine the lowest index at which `value`
7946
     * should be inserted into `array` in order to maintain its sort order.
7947
     *
7948
     * @static
7949
     * @memberOf _
7950
     * @since 0.1.0
7951
     * @category Array
7952
     * @param {Array} array The sorted array to inspect.
7953
     * @param {*} value The value to evaluate.
7954
     * @returns {number} Returns the index at which `value` should be inserted
7955
     *  into `array`.
7956
     * @example
7957
     *
7958
     * _.sortedIndex([30, 50], 40);
7959
     * // => 1
7960
     */
7961
    function sortedIndex(array, value) {
7962
      return baseSortedIndex(array, value);
7963
    }
7964
7965
    /**
7966
     * This method is like `_.sortedIndex` except that it accepts `iteratee`
7967
     * which is invoked for `value` and each element of `array` to compute their
7968
     * sort ranking. The iteratee is invoked with one argument: (value).
7969
     *
7970
     * @static
7971
     * @memberOf _
7972
     * @since 4.0.0
7973
     * @category Array
7974
     * @param {Array} array The sorted array to inspect.
7975
     * @param {*} value The value to evaluate.
7976
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7977
     * @returns {number} Returns the index at which `value` should be inserted
7978
     *  into `array`.
7979
     * @example
7980
     *
7981
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
7982
     *
7983
     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
7984
     * // => 0
7985
     *
7986
     * // The `_.property` iteratee shorthand.
7987
     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
7988
     * // => 0
7989
     */
7990
    function sortedIndexBy(array, value, iteratee) {
7991
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
7992
    }
7993
7994
    /**
7995
     * This method is like `_.indexOf` except that it performs a binary
7996
     * search on a sorted `array`.
7997
     *
7998
     * @static
7999
     * @memberOf _
8000
     * @since 4.0.0
8001
     * @category Array
8002
     * @param {Array} array The array to inspect.
8003
     * @param {*} value The value to search for.
8004
     * @returns {number} Returns the index of the matched value, else `-1`.
8005
     * @example
8006
     *
8007
     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
8008
     * // => 1
8009
     */
8010
    function sortedIndexOf(array, value) {
8011
      var length = array == null ? 0 : array.length;
8012
      if (length) {
8013
        var index = baseSortedIndex(array, value);
8014
        if (index < length && eq(array[index], value)) {
8015
          return index;
8016
        }
8017
      }
8018
      return -1;
8019
    }
8020
8021
    /**
8022
     * This method is like `_.sortedIndex` except that it returns the highest
8023
     * index at which `value` should be inserted into `array` in order to
8024
     * maintain its sort order.
8025
     *
8026
     * @static
8027
     * @memberOf _
8028
     * @since 3.0.0
8029
     * @category Array
8030
     * @param {Array} array The sorted array to inspect.
8031
     * @param {*} value The value to evaluate.
8032
     * @returns {number} Returns the index at which `value` should be inserted
8033
     *  into `array`.
8034
     * @example
8035
     *
8036
     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
8037
     * // => 4
8038
     */
8039
    function sortedLastIndex(array, value) {
8040
      return baseSortedIndex(array, value, true);
8041
    }
8042
8043
    /**
8044
     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
8045
     * which is invoked for `value` and each element of `array` to compute their
8046
     * sort ranking. The iteratee is invoked with one argument: (value).
8047
     *
8048
     * @static
8049
     * @memberOf _
8050
     * @since 4.0.0
8051
     * @category Array
8052
     * @param {Array} array The sorted array to inspect.
8053
     * @param {*} value The value to evaluate.
8054
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8055
     * @returns {number} Returns the index at which `value` should be inserted
8056
     *  into `array`.
8057
     * @example
8058
     *
8059
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
8060
     *
8061
     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
8062
     * // => 1
8063
     *
8064
     * // The `_.property` iteratee shorthand.
8065
     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
8066
     * // => 1
8067
     */
8068
    function sortedLastIndexBy(array, value, iteratee) {
8069
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
8070
    }
8071
8072
    /**
8073
     * This method is like `_.lastIndexOf` except that it performs a binary
8074
     * search on a sorted `array`.
8075
     *
8076
     * @static
8077
     * @memberOf _
8078
     * @since 4.0.0
8079
     * @category Array
8080
     * @param {Array} array The array to inspect.
8081
     * @param {*} value The value to search for.
8082
     * @returns {number} Returns the index of the matched value, else `-1`.
8083
     * @example
8084
     *
8085
     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
8086
     * // => 3
8087
     */
8088
    function sortedLastIndexOf(array, value) {
8089
      var length = array == null ? 0 : array.length;
8090
      if (length) {
8091
        var index = baseSortedIndex(array, value, true) - 1;
8092
        if (eq(array[index], value)) {
8093
          return index;
8094
        }
8095
      }
8096
      return -1;
8097
    }
8098
8099
    /**
8100
     * This method is like `_.uniq` except that it's designed and optimized
8101
     * for sorted arrays.
8102
     *
8103
     * @static
8104
     * @memberOf _
8105
     * @since 4.0.0
8106
     * @category Array
8107
     * @param {Array} array The array to inspect.
8108
     * @returns {Array} Returns the new duplicate free array.
8109
     * @example
8110
     *
8111
     * _.sortedUniq([1, 1, 2]);
8112
     * // => [1, 2]
8113
     */
8114
    function sortedUniq(array) {
8115
      return (array && array.length)
8116
        ? baseSortedUniq(array)
8117
        : [];
8118
    }
8119
8120
    /**
8121
     * This method is like `_.uniqBy` except that it's designed and optimized
8122
     * for sorted arrays.
8123
     *
8124
     * @static
8125
     * @memberOf _
8126
     * @since 4.0.0
8127
     * @category Array
8128
     * @param {Array} array The array to inspect.
8129
     * @param {Function} [iteratee] The iteratee invoked per element.
8130
     * @returns {Array} Returns the new duplicate free array.
8131
     * @example
8132
     *
8133
     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
8134
     * // => [1.1, 2.3]
8135
     */
8136
    function sortedUniqBy(array, iteratee) {
8137
      return (array && array.length)
8138
        ? baseSortedUniq(array, getIteratee(iteratee, 2))
8139
        : [];
8140
    }
8141
8142
    /**
8143
     * Gets all but the first element of `array`.
8144
     *
8145
     * @static
8146
     * @memberOf _
8147
     * @since 4.0.0
8148
     * @category Array
8149
     * @param {Array} array The array to query.
8150
     * @returns {Array} Returns the slice of `array`.
8151
     * @example
8152
     *
8153
     * _.tail([1, 2, 3]);
8154
     * // => [2, 3]
8155
     */
8156
    function tail(array) {
8157
      var length = array == null ? 0 : array.length;
8158
      return length ? baseSlice(array, 1, length) : [];
8159
    }
8160
8161
    /**
8162
     * Creates a slice of `array` with `n` elements taken from the beginning.
8163
     *
8164
     * @static
8165
     * @memberOf _
8166
     * @since 0.1.0
8167
     * @category Array
8168
     * @param {Array} array The array to query.
8169
     * @param {number} [n=1] The number of elements to take.
8170
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8171
     * @returns {Array} Returns the slice of `array`.
8172
     * @example
8173
     *
8174
     * _.take([1, 2, 3]);
8175
     * // => [1]
8176
     *
8177
     * _.take([1, 2, 3], 2);
8178
     * // => [1, 2]
8179
     *
8180
     * _.take([1, 2, 3], 5);
8181
     * // => [1, 2, 3]
8182
     *
8183
     * _.take([1, 2, 3], 0);
8184
     * // => []
8185
     */
8186
    function take(array, n, guard) {
8187
      if (!(array && array.length)) {
8188
        return [];
8189
      }
8190
      n = (guard || n === undefined) ? 1 : toInteger(n);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8191
      return baseSlice(array, 0, n < 0 ? 0 : n);
8192
    }
8193
8194
    /**
8195
     * Creates a slice of `array` with `n` elements taken from the end.
8196
     *
8197
     * @static
8198
     * @memberOf _
8199
     * @since 3.0.0
8200
     * @category Array
8201
     * @param {Array} array The array to query.
8202
     * @param {number} [n=1] The number of elements to take.
8203
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8204
     * @returns {Array} Returns the slice of `array`.
8205
     * @example
8206
     *
8207
     * _.takeRight([1, 2, 3]);
8208
     * // => [3]
8209
     *
8210
     * _.takeRight([1, 2, 3], 2);
8211
     * // => [2, 3]
8212
     *
8213
     * _.takeRight([1, 2, 3], 5);
8214
     * // => [1, 2, 3]
8215
     *
8216
     * _.takeRight([1, 2, 3], 0);
8217
     * // => []
8218
     */
8219
    function takeRight(array, n, guard) {
8220
      var length = array == null ? 0 : array.length;
8221
      if (!length) {
8222
        return [];
8223
      }
8224
      n = (guard || n === undefined) ? 1 : toInteger(n);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8225
      n = length - n;
8226
      return baseSlice(array, n < 0 ? 0 : n, length);
8227
    }
8228
8229
    /**
8230
     * Creates a slice of `array` with elements taken from the end. Elements are
8231
     * taken until `predicate` returns falsey. The predicate is invoked with
8232
     * three arguments: (value, index, array).
8233
     *
8234
     * @static
8235
     * @memberOf _
8236
     * @since 3.0.0
8237
     * @category Array
8238
     * @param {Array} array The array to query.
8239
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
8240
     * @returns {Array} Returns the slice of `array`.
8241
     * @example
8242
     *
8243
     * var users = [
8244
     *   { 'user': 'barney',  'active': true },
8245
     *   { 'user': 'fred',    'active': false },
8246
     *   { 'user': 'pebbles', 'active': false }
8247
     * ];
8248
     *
8249
     * _.takeRightWhile(users, function(o) { return !o.active; });
8250
     * // => objects for ['fred', 'pebbles']
8251
     *
8252
     * // The `_.matches` iteratee shorthand.
8253
     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
8254
     * // => objects for ['pebbles']
8255
     *
8256
     * // The `_.matchesProperty` iteratee shorthand.
8257
     * _.takeRightWhile(users, ['active', false]);
8258
     * // => objects for ['fred', 'pebbles']
8259
     *
8260
     * // The `_.property` iteratee shorthand.
8261
     * _.takeRightWhile(users, 'active');
8262
     * // => []
8263
     */
8264
    function takeRightWhile(array, predicate) {
8265
      return (array && array.length)
8266
        ? baseWhile(array, getIteratee(predicate, 3), false, true)
8267
        : [];
8268
    }
8269
8270
    /**
8271
     * Creates a slice of `array` with elements taken from the beginning. Elements
8272
     * are taken until `predicate` returns falsey. The predicate is invoked with
8273
     * three arguments: (value, index, array).
8274
     *
8275
     * @static
8276
     * @memberOf _
8277
     * @since 3.0.0
8278
     * @category Array
8279
     * @param {Array} array The array to query.
8280
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
8281
     * @returns {Array} Returns the slice of `array`.
8282
     * @example
8283
     *
8284
     * var users = [
8285
     *   { 'user': 'barney',  'active': false },
8286
     *   { 'user': 'fred',    'active': false },
8287
     *   { 'user': 'pebbles', 'active': true }
8288
     * ];
8289
     *
8290
     * _.takeWhile(users, function(o) { return !o.active; });
8291
     * // => objects for ['barney', 'fred']
8292
     *
8293
     * // The `_.matches` iteratee shorthand.
8294
     * _.takeWhile(users, { 'user': 'barney', 'active': false });
8295
     * // => objects for ['barney']
8296
     *
8297
     * // The `_.matchesProperty` iteratee shorthand.
8298
     * _.takeWhile(users, ['active', false]);
8299
     * // => objects for ['barney', 'fred']
8300
     *
8301
     * // The `_.property` iteratee shorthand.
8302
     * _.takeWhile(users, 'active');
8303
     * // => []
8304
     */
8305
    function takeWhile(array, predicate) {
8306
      return (array && array.length)
8307
        ? baseWhile(array, getIteratee(predicate, 3))
8308
        : [];
8309
    }
8310
8311
    /**
8312
     * Creates an array of unique values, in order, from all given arrays using
8313
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8314
     * for equality comparisons.
8315
     *
8316
     * @static
8317
     * @memberOf _
8318
     * @since 0.1.0
8319
     * @category Array
8320
     * @param {...Array} [arrays] The arrays to inspect.
8321
     * @returns {Array} Returns the new array of combined values.
8322
     * @example
8323
     *
8324
     * _.union([2], [1, 2]);
8325
     * // => [2, 1]
8326
     */
8327
    var union = baseRest(function(arrays) {
8328
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
8329
    });
8330
8331
    /**
8332
     * This method is like `_.union` except that it accepts `iteratee` which is
8333
     * invoked for each element of each `arrays` to generate the criterion by
8334
     * which uniqueness is computed. Result values are chosen from the first
8335
     * array in which the value occurs. The iteratee is invoked with one argument:
8336
     * (value).
8337
     *
8338
     * @static
8339
     * @memberOf _
8340
     * @since 4.0.0
8341
     * @category Array
8342
     * @param {...Array} [arrays] The arrays to inspect.
8343
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8344
     * @returns {Array} Returns the new array of combined values.
8345
     * @example
8346
     *
8347
     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
8348
     * // => [2.1, 1.2]
8349
     *
8350
     * // The `_.property` iteratee shorthand.
8351
     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8352
     * // => [{ 'x': 1 }, { 'x': 2 }]
8353
     */
8354
    var unionBy = baseRest(function(arrays) {
8355
      var iteratee = last(arrays);
8356
      if (isArrayLikeObject(iteratee)) {
8357
        iteratee = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8358
      }
8359
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
8360
    });
8361
8362
    /**
8363
     * This method is like `_.union` except that it accepts `comparator` which
8364
     * is invoked to compare elements of `arrays`. Result values are chosen from
8365
     * the first array in which the value occurs. The comparator is invoked
8366
     * with two arguments: (arrVal, othVal).
8367
     *
8368
     * @static
8369
     * @memberOf _
8370
     * @since 4.0.0
8371
     * @category Array
8372
     * @param {...Array} [arrays] The arrays to inspect.
8373
     * @param {Function} [comparator] The comparator invoked per element.
8374
     * @returns {Array} Returns the new array of combined values.
8375
     * @example
8376
     *
8377
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8378
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8379
     *
8380
     * _.unionWith(objects, others, _.isEqual);
8381
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8382
     */
8383
    var unionWith = baseRest(function(arrays) {
8384
      var comparator = last(arrays);
8385
      comparator = typeof comparator == 'function' ? comparator : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8386
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
8387
    });
8388
8389
    /**
8390
     * Creates a duplicate-free version of an array, using
8391
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8392
     * for equality comparisons, in which only the first occurrence of each element
8393
     * is kept. The order of result values is determined by the order they occur
8394
     * in the array.
8395
     *
8396
     * @static
8397
     * @memberOf _
8398
     * @since 0.1.0
8399
     * @category Array
8400
     * @param {Array} array The array to inspect.
8401
     * @returns {Array} Returns the new duplicate free array.
8402
     * @example
8403
     *
8404
     * _.uniq([2, 1, 2]);
8405
     * // => [2, 1]
8406
     */
8407
    function uniq(array) {
8408
      return (array && array.length) ? baseUniq(array) : [];
8409
    }
8410
8411
    /**
8412
     * This method is like `_.uniq` except that it accepts `iteratee` which is
8413
     * invoked for each element in `array` to generate the criterion by which
8414
     * uniqueness is computed. The order of result values is determined by the
8415
     * order they occur in the array. The iteratee is invoked with one argument:
8416
     * (value).
8417
     *
8418
     * @static
8419
     * @memberOf _
8420
     * @since 4.0.0
8421
     * @category Array
8422
     * @param {Array} array The array to inspect.
8423
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8424
     * @returns {Array} Returns the new duplicate free array.
8425
     * @example
8426
     *
8427
     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
8428
     * // => [2.1, 1.2]
8429
     *
8430
     * // The `_.property` iteratee shorthand.
8431
     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
8432
     * // => [{ 'x': 1 }, { 'x': 2 }]
8433
     */
8434
    function uniqBy(array, iteratee) {
8435
      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
8436
    }
8437
8438
    /**
8439
     * This method is like `_.uniq` except that it accepts `comparator` which
8440
     * is invoked to compare elements of `array`. The order of result values is
8441
     * determined by the order they occur in the array.The comparator is invoked
8442
     * with two arguments: (arrVal, othVal).
8443
     *
8444
     * @static
8445
     * @memberOf _
8446
     * @since 4.0.0
8447
     * @category Array
8448
     * @param {Array} array The array to inspect.
8449
     * @param {Function} [comparator] The comparator invoked per element.
8450
     * @returns {Array} Returns the new duplicate free array.
8451
     * @example
8452
     *
8453
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
8454
     *
8455
     * _.uniqWith(objects, _.isEqual);
8456
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
8457
     */
8458
    function uniqWith(array, comparator) {
8459
      comparator = typeof comparator == 'function' ? comparator : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8460
      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
8461
    }
8462
8463
    /**
8464
     * This method is like `_.zip` except that it accepts an array of grouped
8465
     * elements and creates an array regrouping the elements to their pre-zip
8466
     * configuration.
8467
     *
8468
     * @static
8469
     * @memberOf _
8470
     * @since 1.2.0
8471
     * @category Array
8472
     * @param {Array} array The array of grouped elements to process.
8473
     * @returns {Array} Returns the new array of regrouped elements.
8474
     * @example
8475
     *
8476
     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
8477
     * // => [['a', 1, true], ['b', 2, false]]
8478
     *
8479
     * _.unzip(zipped);
8480
     * // => [['a', 'b'], [1, 2], [true, false]]
8481
     */
8482
    function unzip(array) {
8483
      if (!(array && array.length)) {
8484
        return [];
8485
      }
8486
      var length = 0;
8487
      array = arrayFilter(array, function(group) {
8488
        if (isArrayLikeObject(group)) {
8489
          length = nativeMax(group.length, length);
8490
          return true;
8491
        }
8492
      });
8493
      return baseTimes(length, function(index) {
8494
        return arrayMap(array, baseProperty(index));
8495
      });
8496
    }
8497
8498
    /**
8499
     * This method is like `_.unzip` except that it accepts `iteratee` to specify
8500
     * how regrouped values should be combined. The iteratee is invoked with the
8501
     * elements of each group: (...group).
8502
     *
8503
     * @static
8504
     * @memberOf _
8505
     * @since 3.8.0
8506
     * @category Array
8507
     * @param {Array} array The array of grouped elements to process.
8508
     * @param {Function} [iteratee=_.identity] The function to combine
8509
     *  regrouped values.
8510
     * @returns {Array} Returns the new array of regrouped elements.
8511
     * @example
8512
     *
8513
     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
8514
     * // => [[1, 10, 100], [2, 20, 200]]
8515
     *
8516
     * _.unzipWith(zipped, _.add);
8517
     * // => [3, 30, 300]
8518
     */
8519
    function unzipWith(array, iteratee) {
8520
      if (!(array && array.length)) {
8521
        return [];
8522
      }
8523
      var result = unzip(array);
8524
      if (iteratee == null) {
8525
        return result;
8526
      }
8527
      return arrayMap(result, function(group) {
8528
        return apply(iteratee, undefined, group);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8529
      });
8530
    }
8531
8532
    /**
8533
     * Creates an array excluding all given values using
8534
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8535
     * for equality comparisons.
8536
     *
8537
     * **Note:** Unlike `_.pull`, this method returns a new array.
8538
     *
8539
     * @static
8540
     * @memberOf _
8541
     * @since 0.1.0
8542
     * @category Array
8543
     * @param {Array} array The array to inspect.
8544
     * @param {...*} [values] The values to exclude.
8545
     * @returns {Array} Returns the new array of filtered values.
8546
     * @see _.difference, _.xor
8547
     * @example
8548
     *
8549
     * _.without([2, 1, 2, 3], 1, 2);
8550
     * // => [3]
8551
     */
8552
    var without = baseRest(function(array, values) {
8553
      return isArrayLikeObject(array)
8554
        ? baseDifference(array, values)
8555
        : [];
8556
    });
8557
8558
    /**
8559
     * Creates an array of unique values that is the
8560
     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
8561
     * of the given arrays. The order of result values is determined by the order
8562
     * they occur in the arrays.
8563
     *
8564
     * @static
8565
     * @memberOf _
8566
     * @since 2.4.0
8567
     * @category Array
8568
     * @param {...Array} [arrays] The arrays to inspect.
8569
     * @returns {Array} Returns the new array of filtered values.
8570
     * @see _.difference, _.without
8571
     * @example
8572
     *
8573
     * _.xor([2, 1], [2, 3]);
8574
     * // => [1, 3]
8575
     */
8576
    var xor = baseRest(function(arrays) {
8577
      return baseXor(arrayFilter(arrays, isArrayLikeObject));
8578
    });
8579
8580
    /**
8581
     * This method is like `_.xor` except that it accepts `iteratee` which is
8582
     * invoked for each element of each `arrays` to generate the criterion by
8583
     * which by which they're compared. The order of result values is determined
8584
     * by the order they occur in the arrays. The iteratee is invoked with one
8585
     * argument: (value).
8586
     *
8587
     * @static
8588
     * @memberOf _
8589
     * @since 4.0.0
8590
     * @category Array
8591
     * @param {...Array} [arrays] The arrays to inspect.
8592
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8593
     * @returns {Array} Returns the new array of filtered values.
8594
     * @example
8595
     *
8596
     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
8597
     * // => [1.2, 3.4]
8598
     *
8599
     * // The `_.property` iteratee shorthand.
8600
     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8601
     * // => [{ 'x': 2 }]
8602
     */
8603
    var xorBy = baseRest(function(arrays) {
8604
      var iteratee = last(arrays);
8605
      if (isArrayLikeObject(iteratee)) {
8606
        iteratee = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8607
      }
8608
      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
8609
    });
8610
8611
    /**
8612
     * This method is like `_.xor` except that it accepts `comparator` which is
8613
     * invoked to compare elements of `arrays`. The order of result values is
8614
     * determined by the order they occur in the arrays. The comparator is invoked
8615
     * with two arguments: (arrVal, othVal).
8616
     *
8617
     * @static
8618
     * @memberOf _
8619
     * @since 4.0.0
8620
     * @category Array
8621
     * @param {...Array} [arrays] The arrays to inspect.
8622
     * @param {Function} [comparator] The comparator invoked per element.
8623
     * @returns {Array} Returns the new array of filtered values.
8624
     * @example
8625
     *
8626
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8627
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8628
     *
8629
     * _.xorWith(objects, others, _.isEqual);
8630
     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8631
     */
8632
    var xorWith = baseRest(function(arrays) {
8633
      var comparator = last(arrays);
8634
      comparator = typeof comparator == 'function' ? comparator : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8635
      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
8636
    });
8637
8638
    /**
8639
     * Creates an array of grouped elements, the first of which contains the
8640
     * first elements of the given arrays, the second of which contains the
8641
     * second elements of the given arrays, and so on.
8642
     *
8643
     * @static
8644
     * @memberOf _
8645
     * @since 0.1.0
8646
     * @category Array
8647
     * @param {...Array} [arrays] The arrays to process.
8648
     * @returns {Array} Returns the new array of grouped elements.
8649
     * @example
8650
     *
8651
     * _.zip(['a', 'b'], [1, 2], [true, false]);
8652
     * // => [['a', 1, true], ['b', 2, false]]
8653
     */
8654
    var zip = baseRest(unzip);
8655
8656
    /**
8657
     * This method is like `_.fromPairs` except that it accepts two arrays,
8658
     * one of property identifiers and one of corresponding values.
8659
     *
8660
     * @static
8661
     * @memberOf _
8662
     * @since 0.4.0
8663
     * @category Array
8664
     * @param {Array} [props=[]] The property identifiers.
8665
     * @param {Array} [values=[]] The property values.
8666
     * @returns {Object} Returns the new object.
8667
     * @example
8668
     *
8669
     * _.zipObject(['a', 'b'], [1, 2]);
8670
     * // => { 'a': 1, 'b': 2 }
8671
     */
8672
    function zipObject(props, values) {
8673
      return baseZipObject(props || [], values || [], assignValue);
8674
    }
8675
8676
    /**
8677
     * This method is like `_.zipObject` except that it supports property paths.
8678
     *
8679
     * @static
8680
     * @memberOf _
8681
     * @since 4.1.0
8682
     * @category Array
8683
     * @param {Array} [props=[]] The property identifiers.
8684
     * @param {Array} [values=[]] The property values.
8685
     * @returns {Object} Returns the new object.
8686
     * @example
8687
     *
8688
     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
8689
     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
8690
     */
8691
    function zipObjectDeep(props, values) {
8692
      return baseZipObject(props || [], values || [], baseSet);
8693
    }
8694
8695
    /**
8696
     * This method is like `_.zip` except that it accepts `iteratee` to specify
8697
     * how grouped values should be combined. The iteratee is invoked with the
8698
     * elements of each group: (...group).
8699
     *
8700
     * @static
8701
     * @memberOf _
8702
     * @since 3.8.0
8703
     * @category Array
8704
     * @param {...Array} [arrays] The arrays to process.
8705
     * @param {Function} [iteratee=_.identity] The function to combine
8706
     *  grouped values.
8707
     * @returns {Array} Returns the new array of grouped elements.
8708
     * @example
8709
     *
8710
     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
8711
     *   return a + b + c;
8712
     * });
8713
     * // => [111, 222]
8714
     */
8715
    var zipWith = baseRest(function(arrays) {
8716
      var length = arrays.length,
8717
          iteratee = length > 1 ? arrays[length - 1] : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8718
8719
      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
8720
      return unzipWith(arrays, iteratee);
8721
    });
8722
8723
    /*------------------------------------------------------------------------*/
8724
8725
    /**
8726
     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
8727
     * chain sequences enabled. The result of such sequences must be unwrapped
8728
     * with `_#value`.
8729
     *
8730
     * @static
8731
     * @memberOf _
8732
     * @since 1.3.0
8733
     * @category Seq
8734
     * @param {*} value The value to wrap.
8735
     * @returns {Object} Returns the new `lodash` wrapper instance.
8736
     * @example
8737
     *
8738
     * var users = [
8739
     *   { 'user': 'barney',  'age': 36 },
8740
     *   { 'user': 'fred',    'age': 40 },
8741
     *   { 'user': 'pebbles', 'age': 1 }
8742
     * ];
8743
     *
8744
     * var youngest = _
8745
     *   .chain(users)
8746
     *   .sortBy('age')
8747
     *   .map(function(o) {
8748
     *     return o.user + ' is ' + o.age;
8749
     *   })
8750
     *   .head()
8751
     *   .value();
8752
     * // => 'pebbles is 1'
8753
     */
8754
    function chain(value) {
8755
      var result = lodash(value);
8756
      result.__chain__ = true;
8757
      return result;
8758
    }
8759
8760
    /**
8761
     * This method invokes `interceptor` and returns `value`. The interceptor
8762
     * is invoked with one argument; (value). The purpose of this method is to
8763
     * "tap into" a method chain sequence in order to modify intermediate results.
8764
     *
8765
     * @static
8766
     * @memberOf _
8767
     * @since 0.1.0
8768
     * @category Seq
8769
     * @param {*} value The value to provide to `interceptor`.
8770
     * @param {Function} interceptor The function to invoke.
8771
     * @returns {*} Returns `value`.
8772
     * @example
8773
     *
8774
     * _([1, 2, 3])
8775
     *  .tap(function(array) {
8776
     *    // Mutate input array.
8777
     *    array.pop();
8778
     *  })
8779
     *  .reverse()
8780
     *  .value();
8781
     * // => [2, 1]
8782
     */
8783
    function tap(value, interceptor) {
8784
      interceptor(value);
8785
      return value;
8786
    }
8787
8788
    /**
8789
     * This method is like `_.tap` except that it returns the result of `interceptor`.
8790
     * The purpose of this method is to "pass thru" values replacing intermediate
8791
     * results in a method chain sequence.
8792
     *
8793
     * @static
8794
     * @memberOf _
8795
     * @since 3.0.0
8796
     * @category Seq
8797
     * @param {*} value The value to provide to `interceptor`.
8798
     * @param {Function} interceptor The function to invoke.
8799
     * @returns {*} Returns the result of `interceptor`.
8800
     * @example
8801
     *
8802
     * _('  abc  ')
8803
     *  .chain()
8804
     *  .trim()
8805
     *  .thru(function(value) {
8806
     *    return [value];
8807
     *  })
8808
     *  .value();
8809
     * // => ['abc']
8810
     */
8811
    function thru(value, interceptor) {
8812
      return interceptor(value);
8813
    }
8814
8815
    /**
8816
     * This method is the wrapper version of `_.at`.
8817
     *
8818
     * @name at
8819
     * @memberOf _
8820
     * @since 1.0.0
8821
     * @category Seq
8822
     * @param {...(string|string[])} [paths] The property paths to pick.
8823
     * @returns {Object} Returns the new `lodash` wrapper instance.
8824
     * @example
8825
     *
8826
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
8827
     *
8828
     * _(object).at(['a[0].b.c', 'a[1]']).value();
8829
     * // => [3, 4]
8830
     */
8831
    var wrapperAt = flatRest(function(paths) {
8832
      var length = paths.length,
8833
          start = length ? paths[0] : 0,
8834
          value = this.__wrapped__,
8835
          interceptor = function(object) { return baseAt(object, paths); };
8836
8837
      if (length > 1 || this.__actions__.length ||
8838
          !(value instanceof LazyWrapper) || !isIndex(start)) {
8839
        return this.thru(interceptor);
8840
      }
8841
      value = value.slice(start, +start + (length ? 1 : 0));
8842
      value.__actions__.push({
8843
        'func': thru,
8844
        'args': [interceptor],
8845
        'thisArg': undefined
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8846
      });
8847
      return new LodashWrapper(value, this.__chain__).thru(function(array) {
8848
        if (length && !array.length) {
8849
          array.push(undefined);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8850
        }
8851
        return array;
8852
      });
8853
    });
8854
8855
    /**
8856
     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
8857
     *
8858
     * @name chain
8859
     * @memberOf _
8860
     * @since 0.1.0
8861
     * @category Seq
8862
     * @returns {Object} Returns the new `lodash` wrapper instance.
8863
     * @example
8864
     *
8865
     * var users = [
8866
     *   { 'user': 'barney', 'age': 36 },
8867
     *   { 'user': 'fred',   'age': 40 }
8868
     * ];
8869
     *
8870
     * // A sequence without explicit chaining.
8871
     * _(users).head();
8872
     * // => { 'user': 'barney', 'age': 36 }
8873
     *
8874
     * // A sequence with explicit chaining.
8875
     * _(users)
8876
     *   .chain()
8877
     *   .head()
8878
     *   .pick('user')
8879
     *   .value();
8880
     * // => { 'user': 'barney' }
8881
     */
8882
    function wrapperChain() {
8883
      return chain(this);
8884
    }
8885
8886
    /**
8887
     * Executes the chain sequence and returns the wrapped result.
8888
     *
8889
     * @name commit
8890
     * @memberOf _
8891
     * @since 3.2.0
8892
     * @category Seq
8893
     * @returns {Object} Returns the new `lodash` wrapper instance.
8894
     * @example
8895
     *
8896
     * var array = [1, 2];
8897
     * var wrapped = _(array).push(3);
8898
     *
8899
     * console.log(array);
8900
     * // => [1, 2]
8901
     *
8902
     * wrapped = wrapped.commit();
8903
     * console.log(array);
8904
     * // => [1, 2, 3]
8905
     *
8906
     * wrapped.last();
8907
     * // => 3
8908
     *
8909
     * console.log(array);
8910
     * // => [1, 2, 3]
8911
     */
8912
    function wrapperCommit() {
8913
      return new LodashWrapper(this.value(), this.__chain__);
8914
    }
8915
8916
    /**
8917
     * Gets the next value on a wrapped object following the
8918
     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
8919
     *
8920
     * @name next
8921
     * @memberOf _
8922
     * @since 4.0.0
8923
     * @category Seq
8924
     * @returns {Object} Returns the next iterator value.
8925
     * @example
8926
     *
8927
     * var wrapped = _([1, 2]);
8928
     *
8929
     * wrapped.next();
8930
     * // => { 'done': false, 'value': 1 }
8931
     *
8932
     * wrapped.next();
8933
     * // => { 'done': false, 'value': 2 }
8934
     *
8935
     * wrapped.next();
8936
     * // => { 'done': true, 'value': undefined }
8937
     */
8938
    function wrapperNext() {
8939
      if (this.__values__ === undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
8940
        this.__values__ = toArray(this.value());
8941
      }
8942
      var done = this.__index__ >= this.__values__.length,
8943
          value = done ? undefined : this.__values__[this.__index__++];
8944
8945
      return { 'done': done, 'value': value };
8946
    }
8947
8948
    /**
8949
     * Enables the wrapper to be iterable.
8950
     *
8951
     * @name Symbol.iterator
8952
     * @memberOf _
8953
     * @since 4.0.0
8954
     * @category Seq
8955
     * @returns {Object} Returns the wrapper object.
8956
     * @example
8957
     *
8958
     * var wrapped = _([1, 2]);
8959
     *
8960
     * wrapped[Symbol.iterator]() === wrapped;
8961
     * // => true
8962
     *
8963
     * Array.from(wrapped);
8964
     * // => [1, 2]
8965
     */
8966
    function wrapperToIterator() {
8967
      return this;
8968
    }
8969
8970
    /**
8971
     * Creates a clone of the chain sequence planting `value` as the wrapped value.
8972
     *
8973
     * @name plant
8974
     * @memberOf _
8975
     * @since 3.2.0
8976
     * @category Seq
8977
     * @param {*} value The value to plant.
8978
     * @returns {Object} Returns the new `lodash` wrapper instance.
8979
     * @example
8980
     *
8981
     * function square(n) {
8982
     *   return n * n;
8983
     * }
8984
     *
8985
     * var wrapped = _([1, 2]).map(square);
8986
     * var other = wrapped.plant([3, 4]);
8987
     *
8988
     * other.value();
8989
     * // => [9, 16]
8990
     *
8991
     * wrapped.value();
8992
     * // => [1, 4]
8993
     */
8994
    function wrapperPlant(value) {
8995
      var result,
8996
          parent = this;
8997
8998
      while (parent instanceof baseLodash) {
8999
        var clone = wrapperClone(parent);
9000
        clone.__index__ = 0;
9001
        clone.__values__ = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9002
        if (result) {
9003
          previous.__wrapped__ = clone;
0 ignored issues
show
Comprehensibility Bug introduced by
The variable previous does not seem to be initialized in case the while loop on line 8998 is not entered. Are you sure this can never be the case?
Loading history...
9004
        } else {
9005
          result = clone;
9006
        }
9007
        var previous = clone;
9008
        parent = parent.__wrapped__;
9009
      }
9010
      previous.__wrapped__ = value;
9011
      return result;
0 ignored issues
show
Comprehensibility Bug introduced by
The variable result does not seem to be initialized in case the while loop on line 8998 is not entered. Are you sure this can never be the case?
Loading history...
9012
    }
9013
9014
    /**
9015
     * This method is the wrapper version of `_.reverse`.
9016
     *
9017
     * **Note:** This method mutates the wrapped array.
9018
     *
9019
     * @name reverse
9020
     * @memberOf _
9021
     * @since 0.1.0
9022
     * @category Seq
9023
     * @returns {Object} Returns the new `lodash` wrapper instance.
9024
     * @example
9025
     *
9026
     * var array = [1, 2, 3];
9027
     *
9028
     * _(array).reverse().value()
9029
     * // => [3, 2, 1]
9030
     *
9031
     * console.log(array);
9032
     * // => [3, 2, 1]
9033
     */
9034
    function wrapperReverse() {
9035
      var value = this.__wrapped__;
9036
      if (value instanceof LazyWrapper) {
9037
        var wrapped = value;
9038
        if (this.__actions__.length) {
9039
          wrapped = new LazyWrapper(this);
9040
        }
9041
        wrapped = wrapped.reverse();
9042
        wrapped.__actions__.push({
9043
          'func': thru,
9044
          'args': [reverse],
9045
          'thisArg': undefined
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9046
        });
9047
        return new LodashWrapper(wrapped, this.__chain__);
9048
      }
9049
      return this.thru(reverse);
9050
    }
9051
9052
    /**
9053
     * Executes the chain sequence to resolve the unwrapped value.
9054
     *
9055
     * @name value
9056
     * @memberOf _
9057
     * @since 0.1.0
9058
     * @alias toJSON, valueOf
9059
     * @category Seq
9060
     * @returns {*} Returns the resolved unwrapped value.
9061
     * @example
9062
     *
9063
     * _([1, 2, 3]).value();
9064
     * // => [1, 2, 3]
9065
     */
9066
    function wrapperValue() {
9067
      return baseWrapperValue(this.__wrapped__, this.__actions__);
9068
    }
9069
9070
    /*------------------------------------------------------------------------*/
9071
9072
    /**
9073
     * Creates an object composed of keys generated from the results of running
9074
     * each element of `collection` thru `iteratee`. The corresponding value of
9075
     * each key is the number of times the key was returned by `iteratee`. The
9076
     * iteratee is invoked with one argument: (value).
9077
     *
9078
     * @static
9079
     * @memberOf _
9080
     * @since 0.5.0
9081
     * @category Collection
9082
     * @param {Array|Object} collection The collection to iterate over.
9083
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9084
     * @returns {Object} Returns the composed aggregate object.
9085
     * @example
9086
     *
9087
     * _.countBy([6.1, 4.2, 6.3], Math.floor);
9088
     * // => { '4': 1, '6': 2 }
9089
     *
9090
     * // The `_.property` iteratee shorthand.
9091
     * _.countBy(['one', 'two', 'three'], 'length');
9092
     * // => { '3': 2, '5': 1 }
9093
     */
9094
    var countBy = createAggregator(function(result, value, key) {
9095
      if (hasOwnProperty.call(result, key)) {
9096
        ++result[key];
9097
      } else {
9098
        baseAssignValue(result, key, 1);
9099
      }
9100
    });
9101
9102
    /**
9103
     * Checks if `predicate` returns truthy for **all** elements of `collection`.
9104
     * Iteration is stopped once `predicate` returns falsey. The predicate is
9105
     * invoked with three arguments: (value, index|key, collection).
9106
     *
9107
     * **Note:** This method returns `true` for
9108
     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
9109
     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
9110
     * elements of empty collections.
9111
     *
9112
     * @static
9113
     * @memberOf _
9114
     * @since 0.1.0
9115
     * @category Collection
9116
     * @param {Array|Object} collection The collection to iterate over.
9117
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9118
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9119
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
9120
     *  else `false`.
9121
     * @example
9122
     *
9123
     * _.every([true, 1, null, 'yes'], Boolean);
9124
     * // => false
9125
     *
9126
     * var users = [
9127
     *   { 'user': 'barney', 'age': 36, 'active': false },
9128
     *   { 'user': 'fred',   'age': 40, 'active': false }
9129
     * ];
9130
     *
9131
     * // The `_.matches` iteratee shorthand.
9132
     * _.every(users, { 'user': 'barney', 'active': false });
9133
     * // => false
9134
     *
9135
     * // The `_.matchesProperty` iteratee shorthand.
9136
     * _.every(users, ['active', false]);
9137
     * // => true
9138
     *
9139
     * // The `_.property` iteratee shorthand.
9140
     * _.every(users, 'active');
9141
     * // => false
9142
     */
9143
    function every(collection, predicate, guard) {
9144
      var func = isArray(collection) ? arrayEvery : baseEvery;
9145
      if (guard && isIterateeCall(collection, predicate, guard)) {
9146
        predicate = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9147
      }
9148
      return func(collection, getIteratee(predicate, 3));
9149
    }
9150
9151
    /**
9152
     * Iterates over elements of `collection`, returning an array of all elements
9153
     * `predicate` returns truthy for. The predicate is invoked with three
9154
     * arguments: (value, index|key, collection).
9155
     *
9156
     * **Note:** Unlike `_.remove`, this method returns a new array.
9157
     *
9158
     * @static
9159
     * @memberOf _
9160
     * @since 0.1.0
9161
     * @category Collection
9162
     * @param {Array|Object} collection The collection to iterate over.
9163
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9164
     * @returns {Array} Returns the new filtered array.
9165
     * @see _.reject
9166
     * @example
9167
     *
9168
     * var users = [
9169
     *   { 'user': 'barney', 'age': 36, 'active': true },
9170
     *   { 'user': 'fred',   'age': 40, 'active': false }
9171
     * ];
9172
     *
9173
     * _.filter(users, function(o) { return !o.active; });
9174
     * // => objects for ['fred']
9175
     *
9176
     * // The `_.matches` iteratee shorthand.
9177
     * _.filter(users, { 'age': 36, 'active': true });
9178
     * // => objects for ['barney']
9179
     *
9180
     * // The `_.matchesProperty` iteratee shorthand.
9181
     * _.filter(users, ['active', false]);
9182
     * // => objects for ['fred']
9183
     *
9184
     * // The `_.property` iteratee shorthand.
9185
     * _.filter(users, 'active');
9186
     * // => objects for ['barney']
9187
     */
9188
    function filter(collection, predicate) {
9189
      var func = isArray(collection) ? arrayFilter : baseFilter;
9190
      return func(collection, getIteratee(predicate, 3));
9191
    }
9192
9193
    /**
9194
     * Iterates over elements of `collection`, returning the first element
9195
     * `predicate` returns truthy for. The predicate is invoked with three
9196
     * arguments: (value, index|key, collection).
9197
     *
9198
     * @static
9199
     * @memberOf _
9200
     * @since 0.1.0
9201
     * @category Collection
9202
     * @param {Array|Object} collection The collection to inspect.
9203
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9204
     * @param {number} [fromIndex=0] The index to search from.
9205
     * @returns {*} Returns the matched element, else `undefined`.
9206
     * @example
9207
     *
9208
     * var users = [
9209
     *   { 'user': 'barney',  'age': 36, 'active': true },
9210
     *   { 'user': 'fred',    'age': 40, 'active': false },
9211
     *   { 'user': 'pebbles', 'age': 1,  'active': true }
9212
     * ];
9213
     *
9214
     * _.find(users, function(o) { return o.age < 40; });
9215
     * // => object for 'barney'
9216
     *
9217
     * // The `_.matches` iteratee shorthand.
9218
     * _.find(users, { 'age': 1, 'active': true });
9219
     * // => object for 'pebbles'
9220
     *
9221
     * // The `_.matchesProperty` iteratee shorthand.
9222
     * _.find(users, ['active', false]);
9223
     * // => object for 'fred'
9224
     *
9225
     * // The `_.property` iteratee shorthand.
9226
     * _.find(users, 'active');
9227
     * // => object for 'barney'
9228
     */
9229
    var find = createFind(findIndex);
9230
9231
    /**
9232
     * This method is like `_.find` except that it iterates over elements of
9233
     * `collection` from right to left.
9234
     *
9235
     * @static
9236
     * @memberOf _
9237
     * @since 2.0.0
9238
     * @category Collection
9239
     * @param {Array|Object} collection The collection to inspect.
9240
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9241
     * @param {number} [fromIndex=collection.length-1] The index to search from.
9242
     * @returns {*} Returns the matched element, else `undefined`.
9243
     * @example
9244
     *
9245
     * _.findLast([1, 2, 3, 4], function(n) {
9246
     *   return n % 2 == 1;
9247
     * });
9248
     * // => 3
9249
     */
9250
    var findLast = createFind(findLastIndex);
9251
9252
    /**
9253
     * Creates a flattened array of values by running each element in `collection`
9254
     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
9255
     * with three arguments: (value, index|key, collection).
9256
     *
9257
     * @static
9258
     * @memberOf _
9259
     * @since 4.0.0
9260
     * @category Collection
9261
     * @param {Array|Object} collection The collection to iterate over.
9262
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9263
     * @returns {Array} Returns the new flattened array.
9264
     * @example
9265
     *
9266
     * function duplicate(n) {
9267
     *   return [n, n];
9268
     * }
9269
     *
9270
     * _.flatMap([1, 2], duplicate);
9271
     * // => [1, 1, 2, 2]
9272
     */
9273
    function flatMap(collection, iteratee) {
9274
      return baseFlatten(map(collection, iteratee), 1);
9275
    }
9276
9277
    /**
9278
     * This method is like `_.flatMap` except that it recursively flattens the
9279
     * mapped results.
9280
     *
9281
     * @static
9282
     * @memberOf _
9283
     * @since 4.7.0
9284
     * @category Collection
9285
     * @param {Array|Object} collection The collection to iterate over.
9286
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9287
     * @returns {Array} Returns the new flattened array.
9288
     * @example
9289
     *
9290
     * function duplicate(n) {
9291
     *   return [[[n, n]]];
9292
     * }
9293
     *
9294
     * _.flatMapDeep([1, 2], duplicate);
9295
     * // => [1, 1, 2, 2]
9296
     */
9297
    function flatMapDeep(collection, iteratee) {
9298
      return baseFlatten(map(collection, iteratee), INFINITY);
9299
    }
9300
9301
    /**
9302
     * This method is like `_.flatMap` except that it recursively flattens the
9303
     * mapped results up to `depth` times.
9304
     *
9305
     * @static
9306
     * @memberOf _
9307
     * @since 4.7.0
9308
     * @category Collection
9309
     * @param {Array|Object} collection The collection to iterate over.
9310
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9311
     * @param {number} [depth=1] The maximum recursion depth.
9312
     * @returns {Array} Returns the new flattened array.
9313
     * @example
9314
     *
9315
     * function duplicate(n) {
9316
     *   return [[[n, n]]];
9317
     * }
9318
     *
9319
     * _.flatMapDepth([1, 2], duplicate, 2);
9320
     * // => [[1, 1], [2, 2]]
9321
     */
9322
    function flatMapDepth(collection, iteratee, depth) {
9323
      depth = depth === undefined ? 1 : toInteger(depth);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9324
      return baseFlatten(map(collection, iteratee), depth);
9325
    }
9326
9327
    /**
9328
     * Iterates over elements of `collection` and invokes `iteratee` for each element.
9329
     * The iteratee is invoked with three arguments: (value, index|key, collection).
9330
     * Iteratee functions may exit iteration early by explicitly returning `false`.
9331
     *
9332
     * **Note:** As with other "Collections" methods, objects with a "length"
9333
     * property are iterated like arrays. To avoid this behavior use `_.forIn`
9334
     * or `_.forOwn` for object iteration.
9335
     *
9336
     * @static
9337
     * @memberOf _
9338
     * @since 0.1.0
9339
     * @alias each
9340
     * @category Collection
9341
     * @param {Array|Object} collection The collection to iterate over.
9342
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9343
     * @returns {Array|Object} Returns `collection`.
9344
     * @see _.forEachRight
9345
     * @example
9346
     *
9347
     * _.forEach([1, 2], function(value) {
9348
     *   console.log(value);
9349
     * });
9350
     * // => Logs `1` then `2`.
9351
     *
9352
     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
9353
     *   console.log(key);
9354
     * });
9355
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
9356
     */
9357
    function forEach(collection, iteratee) {
9358
      var func = isArray(collection) ? arrayEach : baseEach;
9359
      return func(collection, getIteratee(iteratee, 3));
9360
    }
9361
9362
    /**
9363
     * This method is like `_.forEach` except that it iterates over elements of
9364
     * `collection` from right to left.
9365
     *
9366
     * @static
9367
     * @memberOf _
9368
     * @since 2.0.0
9369
     * @alias eachRight
9370
     * @category Collection
9371
     * @param {Array|Object} collection The collection to iterate over.
9372
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9373
     * @returns {Array|Object} Returns `collection`.
9374
     * @see _.forEach
9375
     * @example
9376
     *
9377
     * _.forEachRight([1, 2], function(value) {
9378
     *   console.log(value);
9379
     * });
9380
     * // => Logs `2` then `1`.
9381
     */
9382
    function forEachRight(collection, iteratee) {
9383
      var func = isArray(collection) ? arrayEachRight : baseEachRight;
9384
      return func(collection, getIteratee(iteratee, 3));
9385
    }
9386
9387
    /**
9388
     * Creates an object composed of keys generated from the results of running
9389
     * each element of `collection` thru `iteratee`. The order of grouped values
9390
     * is determined by the order they occur in `collection`. The corresponding
9391
     * value of each key is an array of elements responsible for generating the
9392
     * key. The iteratee is invoked with one argument: (value).
9393
     *
9394
     * @static
9395
     * @memberOf _
9396
     * @since 0.1.0
9397
     * @category Collection
9398
     * @param {Array|Object} collection The collection to iterate over.
9399
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9400
     * @returns {Object} Returns the composed aggregate object.
9401
     * @example
9402
     *
9403
     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
9404
     * // => { '4': [4.2], '6': [6.1, 6.3] }
9405
     *
9406
     * // The `_.property` iteratee shorthand.
9407
     * _.groupBy(['one', 'two', 'three'], 'length');
9408
     * // => { '3': ['one', 'two'], '5': ['three'] }
9409
     */
9410
    var groupBy = createAggregator(function(result, value, key) {
9411
      if (hasOwnProperty.call(result, key)) {
9412
        result[key].push(value);
9413
      } else {
9414
        baseAssignValue(result, key, [value]);
9415
      }
9416
    });
9417
9418
    /**
9419
     * Checks if `value` is in `collection`. If `collection` is a string, it's
9420
     * checked for a substring of `value`, otherwise
9421
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9422
     * is used for equality comparisons. If `fromIndex` is negative, it's used as
9423
     * the offset from the end of `collection`.
9424
     *
9425
     * @static
9426
     * @memberOf _
9427
     * @since 0.1.0
9428
     * @category Collection
9429
     * @param {Array|Object|string} collection The collection to inspect.
9430
     * @param {*} value The value to search for.
9431
     * @param {number} [fromIndex=0] The index to search from.
9432
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9433
     * @returns {boolean} Returns `true` if `value` is found, else `false`.
9434
     * @example
9435
     *
9436
     * _.includes([1, 2, 3], 1);
9437
     * // => true
9438
     *
9439
     * _.includes([1, 2, 3], 1, 2);
9440
     * // => false
9441
     *
9442
     * _.includes({ 'a': 1, 'b': 2 }, 1);
9443
     * // => true
9444
     *
9445
     * _.includes('abcd', 'bc');
9446
     * // => true
9447
     */
9448
    function includes(collection, value, fromIndex, guard) {
9449
      collection = isArrayLike(collection) ? collection : values(collection);
9450
      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
9451
9452
      var length = collection.length;
9453
      if (fromIndex < 0) {
9454
        fromIndex = nativeMax(length + fromIndex, 0);
9455
      }
9456
      return isString(collection)
9457
        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
9458
        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
9459
    }
9460
9461
    /**
9462
     * Invokes the method at `path` of each element in `collection`, returning
9463
     * an array of the results of each invoked method. Any additional arguments
9464
     * are provided to each invoked method. If `path` is a function, it's invoked
9465
     * for, and `this` bound to, each element in `collection`.
9466
     *
9467
     * @static
9468
     * @memberOf _
9469
     * @since 4.0.0
9470
     * @category Collection
9471
     * @param {Array|Object} collection The collection to iterate over.
9472
     * @param {Array|Function|string} path The path of the method to invoke or
9473
     *  the function invoked per iteration.
9474
     * @param {...*} [args] The arguments to invoke each method with.
9475
     * @returns {Array} Returns the array of results.
9476
     * @example
9477
     *
9478
     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
9479
     * // => [[1, 5, 7], [1, 2, 3]]
9480
     *
9481
     * _.invokeMap([123, 456], String.prototype.split, '');
9482
     * // => [['1', '2', '3'], ['4', '5', '6']]
9483
     */
9484
    var invokeMap = baseRest(function(collection, path, args) {
9485
      var index = -1,
9486
          isFunc = typeof path == 'function',
9487
          result = isArrayLike(collection) ? Array(collection.length) : [];
9488
9489
      baseEach(collection, function(value) {
9490
        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
9491
      });
9492
      return result;
9493
    });
9494
9495
    /**
9496
     * Creates an object composed of keys generated from the results of running
9497
     * each element of `collection` thru `iteratee`. The corresponding value of
9498
     * each key is the last element responsible for generating the key. The
9499
     * iteratee is invoked with one argument: (value).
9500
     *
9501
     * @static
9502
     * @memberOf _
9503
     * @since 4.0.0
9504
     * @category Collection
9505
     * @param {Array|Object} collection The collection to iterate over.
9506
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9507
     * @returns {Object} Returns the composed aggregate object.
9508
     * @example
9509
     *
9510
     * var array = [
9511
     *   { 'dir': 'left', 'code': 97 },
9512
     *   { 'dir': 'right', 'code': 100 }
9513
     * ];
9514
     *
9515
     * _.keyBy(array, function(o) {
9516
     *   return String.fromCharCode(o.code);
9517
     * });
9518
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
9519
     *
9520
     * _.keyBy(array, 'dir');
9521
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
9522
     */
9523
    var keyBy = createAggregator(function(result, value, key) {
9524
      baseAssignValue(result, key, value);
9525
    });
9526
9527
    /**
9528
     * Creates an array of values by running each element in `collection` thru
9529
     * `iteratee`. The iteratee is invoked with three arguments:
9530
     * (value, index|key, collection).
9531
     *
9532
     * Many lodash methods are guarded to work as iteratees for methods like
9533
     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
9534
     *
9535
     * The guarded methods are:
9536
     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
9537
     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
9538
     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
9539
     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
9540
     *
9541
     * @static
9542
     * @memberOf _
9543
     * @since 0.1.0
9544
     * @category Collection
9545
     * @param {Array|Object} collection The collection to iterate over.
9546
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9547
     * @returns {Array} Returns the new mapped array.
9548
     * @example
9549
     *
9550
     * function square(n) {
9551
     *   return n * n;
9552
     * }
9553
     *
9554
     * _.map([4, 8], square);
9555
     * // => [16, 64]
9556
     *
9557
     * _.map({ 'a': 4, 'b': 8 }, square);
9558
     * // => [16, 64] (iteration order is not guaranteed)
9559
     *
9560
     * var users = [
9561
     *   { 'user': 'barney' },
9562
     *   { 'user': 'fred' }
9563
     * ];
9564
     *
9565
     * // The `_.property` iteratee shorthand.
9566
     * _.map(users, 'user');
9567
     * // => ['barney', 'fred']
9568
     */
9569
    function map(collection, iteratee) {
9570
      var func = isArray(collection) ? arrayMap : baseMap;
9571
      return func(collection, getIteratee(iteratee, 3));
9572
    }
9573
9574
    /**
9575
     * This method is like `_.sortBy` except that it allows specifying the sort
9576
     * orders of the iteratees to sort by. If `orders` is unspecified, all values
9577
     * are sorted in ascending order. Otherwise, specify an order of "desc" for
9578
     * descending or "asc" for ascending sort order of corresponding values.
9579
     *
9580
     * @static
9581
     * @memberOf _
9582
     * @since 4.0.0
9583
     * @category Collection
9584
     * @param {Array|Object} collection The collection to iterate over.
9585
     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
9586
     *  The iteratees to sort by.
9587
     * @param {string[]} [orders] The sort orders of `iteratees`.
9588
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9589
     * @returns {Array} Returns the new sorted array.
9590
     * @example
9591
     *
9592
     * var users = [
9593
     *   { 'user': 'fred',   'age': 48 },
9594
     *   { 'user': 'barney', 'age': 34 },
9595
     *   { 'user': 'fred',   'age': 40 },
9596
     *   { 'user': 'barney', 'age': 36 }
9597
     * ];
9598
     *
9599
     * // Sort by `user` in ascending order and by `age` in descending order.
9600
     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
9601
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
9602
     */
9603
    function orderBy(collection, iteratees, orders, guard) {
9604
      if (collection == null) {
9605
        return [];
9606
      }
9607
      if (!isArray(iteratees)) {
9608
        iteratees = iteratees == null ? [] : [iteratees];
9609
      }
9610
      orders = guard ? undefined : orders;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9611
      if (!isArray(orders)) {
9612
        orders = orders == null ? [] : [orders];
9613
      }
9614
      return baseOrderBy(collection, iteratees, orders);
9615
    }
9616
9617
    /**
9618
     * Creates an array of elements split into two groups, the first of which
9619
     * contains elements `predicate` returns truthy for, the second of which
9620
     * contains elements `predicate` returns falsey for. The predicate is
9621
     * invoked with one argument: (value).
9622
     *
9623
     * @static
9624
     * @memberOf _
9625
     * @since 3.0.0
9626
     * @category Collection
9627
     * @param {Array|Object} collection The collection to iterate over.
9628
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9629
     * @returns {Array} Returns the array of grouped elements.
9630
     * @example
9631
     *
9632
     * var users = [
9633
     *   { 'user': 'barney',  'age': 36, 'active': false },
9634
     *   { 'user': 'fred',    'age': 40, 'active': true },
9635
     *   { 'user': 'pebbles', 'age': 1,  'active': false }
9636
     * ];
9637
     *
9638
     * _.partition(users, function(o) { return o.active; });
9639
     * // => objects for [['fred'], ['barney', 'pebbles']]
9640
     *
9641
     * // The `_.matches` iteratee shorthand.
9642
     * _.partition(users, { 'age': 1, 'active': false });
9643
     * // => objects for [['pebbles'], ['barney', 'fred']]
9644
     *
9645
     * // The `_.matchesProperty` iteratee shorthand.
9646
     * _.partition(users, ['active', false]);
9647
     * // => objects for [['barney', 'pebbles'], ['fred']]
9648
     *
9649
     * // The `_.property` iteratee shorthand.
9650
     * _.partition(users, 'active');
9651
     * // => objects for [['fred'], ['barney', 'pebbles']]
9652
     */
9653
    var partition = createAggregator(function(result, value, key) {
9654
      result[key ? 0 : 1].push(value);
9655
    }, function() { return [[], []]; });
9656
9657
    /**
9658
     * Reduces `collection` to a value which is the accumulated result of running
9659
     * each element in `collection` thru `iteratee`, where each successive
9660
     * invocation is supplied the return value of the previous. If `accumulator`
9661
     * is not given, the first element of `collection` is used as the initial
9662
     * value. The iteratee is invoked with four arguments:
9663
     * (accumulator, value, index|key, collection).
9664
     *
9665
     * Many lodash methods are guarded to work as iteratees for methods like
9666
     * `_.reduce`, `_.reduceRight`, and `_.transform`.
9667
     *
9668
     * The guarded methods are:
9669
     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
9670
     * and `sortBy`
9671
     *
9672
     * @static
9673
     * @memberOf _
9674
     * @since 0.1.0
9675
     * @category Collection
9676
     * @param {Array|Object} collection The collection to iterate over.
9677
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9678
     * @param {*} [accumulator] The initial value.
9679
     * @returns {*} Returns the accumulated value.
9680
     * @see _.reduceRight
9681
     * @example
9682
     *
9683
     * _.reduce([1, 2], function(sum, n) {
9684
     *   return sum + n;
9685
     * }, 0);
9686
     * // => 3
9687
     *
9688
     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
9689
     *   (result[value] || (result[value] = [])).push(key);
9690
     *   return result;
9691
     * }, {});
9692
     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
9693
     */
9694
    function reduce(collection, iteratee, accumulator) {
9695
      var func = isArray(collection) ? arrayReduce : baseReduce,
9696
          initAccum = arguments.length < 3;
9697
9698
      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
9699
    }
9700
9701
    /**
9702
     * This method is like `_.reduce` except that it iterates over elements of
9703
     * `collection` from right to left.
9704
     *
9705
     * @static
9706
     * @memberOf _
9707
     * @since 0.1.0
9708
     * @category Collection
9709
     * @param {Array|Object} collection The collection to iterate over.
9710
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9711
     * @param {*} [accumulator] The initial value.
9712
     * @returns {*} Returns the accumulated value.
9713
     * @see _.reduce
9714
     * @example
9715
     *
9716
     * var array = [[0, 1], [2, 3], [4, 5]];
9717
     *
9718
     * _.reduceRight(array, function(flattened, other) {
9719
     *   return flattened.concat(other);
9720
     * }, []);
9721
     * // => [4, 5, 2, 3, 0, 1]
9722
     */
9723
    function reduceRight(collection, iteratee, accumulator) {
9724
      var func = isArray(collection) ? arrayReduceRight : baseReduce,
9725
          initAccum = arguments.length < 3;
9726
9727
      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
9728
    }
9729
9730
    /**
9731
     * The opposite of `_.filter`; this method returns the elements of `collection`
9732
     * that `predicate` does **not** return truthy for.
9733
     *
9734
     * @static
9735
     * @memberOf _
9736
     * @since 0.1.0
9737
     * @category Collection
9738
     * @param {Array|Object} collection The collection to iterate over.
9739
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9740
     * @returns {Array} Returns the new filtered array.
9741
     * @see _.filter
9742
     * @example
9743
     *
9744
     * var users = [
9745
     *   { 'user': 'barney', 'age': 36, 'active': false },
9746
     *   { 'user': 'fred',   'age': 40, 'active': true }
9747
     * ];
9748
     *
9749
     * _.reject(users, function(o) { return !o.active; });
9750
     * // => objects for ['fred']
9751
     *
9752
     * // The `_.matches` iteratee shorthand.
9753
     * _.reject(users, { 'age': 40, 'active': true });
9754
     * // => objects for ['barney']
9755
     *
9756
     * // The `_.matchesProperty` iteratee shorthand.
9757
     * _.reject(users, ['active', false]);
9758
     * // => objects for ['fred']
9759
     *
9760
     * // The `_.property` iteratee shorthand.
9761
     * _.reject(users, 'active');
9762
     * // => objects for ['barney']
9763
     */
9764
    function reject(collection, predicate) {
9765
      var func = isArray(collection) ? arrayFilter : baseFilter;
9766
      return func(collection, negate(getIteratee(predicate, 3)));
9767
    }
9768
9769
    /**
9770
     * Gets a random element from `collection`.
9771
     *
9772
     * @static
9773
     * @memberOf _
9774
     * @since 2.0.0
9775
     * @category Collection
9776
     * @param {Array|Object} collection The collection to sample.
9777
     * @returns {*} Returns the random element.
9778
     * @example
9779
     *
9780
     * _.sample([1, 2, 3, 4]);
9781
     * // => 2
9782
     */
9783
    function sample(collection) {
9784
      var func = isArray(collection) ? arraySample : baseSample;
9785
      return func(collection);
9786
    }
9787
9788
    /**
9789
     * Gets `n` random elements at unique keys from `collection` up to the
9790
     * size of `collection`.
9791
     *
9792
     * @static
9793
     * @memberOf _
9794
     * @since 4.0.0
9795
     * @category Collection
9796
     * @param {Array|Object} collection The collection to sample.
9797
     * @param {number} [n=1] The number of elements to sample.
9798
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9799
     * @returns {Array} Returns the random elements.
9800
     * @example
9801
     *
9802
     * _.sampleSize([1, 2, 3], 2);
9803
     * // => [3, 1]
9804
     *
9805
     * _.sampleSize([1, 2, 3], 4);
9806
     * // => [2, 3, 1]
9807
     */
9808
    function sampleSize(collection, n, guard) {
9809
      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9810
        n = 1;
9811
      } else {
9812
        n = toInteger(n);
9813
      }
9814
      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
9815
      return func(collection, n);
9816
    }
9817
9818
    /**
9819
     * Creates an array of shuffled values, using a version of the
9820
     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
9821
     *
9822
     * @static
9823
     * @memberOf _
9824
     * @since 0.1.0
9825
     * @category Collection
9826
     * @param {Array|Object} collection The collection to shuffle.
9827
     * @returns {Array} Returns the new shuffled array.
9828
     * @example
9829
     *
9830
     * _.shuffle([1, 2, 3, 4]);
9831
     * // => [4, 1, 3, 2]
9832
     */
9833
    function shuffle(collection) {
9834
      var func = isArray(collection) ? arrayShuffle : baseShuffle;
9835
      return func(collection);
9836
    }
9837
9838
    /**
9839
     * Gets the size of `collection` by returning its length for array-like
9840
     * values or the number of own enumerable string keyed properties for objects.
9841
     *
9842
     * @static
9843
     * @memberOf _
9844
     * @since 0.1.0
9845
     * @category Collection
9846
     * @param {Array|Object|string} collection The collection to inspect.
9847
     * @returns {number} Returns the collection size.
9848
     * @example
9849
     *
9850
     * _.size([1, 2, 3]);
9851
     * // => 3
9852
     *
9853
     * _.size({ 'a': 1, 'b': 2 });
9854
     * // => 2
9855
     *
9856
     * _.size('pebbles');
9857
     * // => 7
9858
     */
9859
    function size(collection) {
9860
      if (collection == null) {
9861
        return 0;
9862
      }
9863
      if (isArrayLike(collection)) {
9864
        return isString(collection) ? stringSize(collection) : collection.length;
9865
      }
9866
      var tag = getTag(collection);
9867
      if (tag == mapTag || tag == setTag) {
9868
        return collection.size;
9869
      }
9870
      return baseKeys(collection).length;
9871
    }
9872
9873
    /**
9874
     * Checks if `predicate` returns truthy for **any** element of `collection`.
9875
     * Iteration is stopped once `predicate` returns truthy. The predicate is
9876
     * invoked with three arguments: (value, index|key, collection).
9877
     *
9878
     * @static
9879
     * @memberOf _
9880
     * @since 0.1.0
9881
     * @category Collection
9882
     * @param {Array|Object} collection The collection to iterate over.
9883
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9884
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9885
     * @returns {boolean} Returns `true` if any element passes the predicate check,
9886
     *  else `false`.
9887
     * @example
9888
     *
9889
     * _.some([null, 0, 'yes', false], Boolean);
9890
     * // => true
9891
     *
9892
     * var users = [
9893
     *   { 'user': 'barney', 'active': true },
9894
     *   { 'user': 'fred',   'active': false }
9895
     * ];
9896
     *
9897
     * // The `_.matches` iteratee shorthand.
9898
     * _.some(users, { 'user': 'barney', 'active': false });
9899
     * // => false
9900
     *
9901
     * // The `_.matchesProperty` iteratee shorthand.
9902
     * _.some(users, ['active', false]);
9903
     * // => true
9904
     *
9905
     * // The `_.property` iteratee shorthand.
9906
     * _.some(users, 'active');
9907
     * // => true
9908
     */
9909
    function some(collection, predicate, guard) {
9910
      var func = isArray(collection) ? arraySome : baseSome;
9911
      if (guard && isIterateeCall(collection, predicate, guard)) {
9912
        predicate = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
9913
      }
9914
      return func(collection, getIteratee(predicate, 3));
9915
    }
9916
9917
    /**
9918
     * Creates an array of elements, sorted in ascending order by the results of
9919
     * running each element in a collection thru each iteratee. This method
9920
     * performs a stable sort, that is, it preserves the original sort order of
9921
     * equal elements. The iteratees are invoked with one argument: (value).
9922
     *
9923
     * @static
9924
     * @memberOf _
9925
     * @since 0.1.0
9926
     * @category Collection
9927
     * @param {Array|Object} collection The collection to iterate over.
9928
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
9929
     *  The iteratees to sort by.
9930
     * @returns {Array} Returns the new sorted array.
9931
     * @example
9932
     *
9933
     * var users = [
9934
     *   { 'user': 'fred',   'age': 48 },
9935
     *   { 'user': 'barney', 'age': 36 },
9936
     *   { 'user': 'fred',   'age': 40 },
9937
     *   { 'user': 'barney', 'age': 34 }
9938
     * ];
9939
     *
9940
     * _.sortBy(users, [function(o) { return o.user; }]);
9941
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
9942
     *
9943
     * _.sortBy(users, ['user', 'age']);
9944
     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
9945
     */
9946
    var sortBy = baseRest(function(collection, iteratees) {
9947
      if (collection == null) {
9948
        return [];
9949
      }
9950
      var length = iteratees.length;
9951
      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
9952
        iteratees = [];
9953
      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
9954
        iteratees = [iteratees[0]];
9955
      }
9956
      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
9957
    });
9958
9959
    /*------------------------------------------------------------------------*/
9960
9961
    /**
9962
     * Gets the timestamp of the number of milliseconds that have elapsed since
9963
     * the Unix epoch (1 January 1970 00:00:00 UTC).
9964
     *
9965
     * @static
9966
     * @memberOf _
9967
     * @since 2.4.0
9968
     * @category Date
9969
     * @returns {number} Returns the timestamp.
9970
     * @example
9971
     *
9972
     * _.defer(function(stamp) {
9973
     *   console.log(_.now() - stamp);
9974
     * }, _.now());
9975
     * // => Logs the number of milliseconds it took for the deferred invocation.
9976
     */
9977
    var now = ctxNow || function() {
9978
      return root.Date.now();
9979
    };
9980
9981
    /*------------------------------------------------------------------------*/
9982
9983
    /**
9984
     * The opposite of `_.before`; this method creates a function that invokes
9985
     * `func` once it's called `n` or more times.
9986
     *
9987
     * @static
9988
     * @memberOf _
9989
     * @since 0.1.0
9990
     * @category Function
9991
     * @param {number} n The number of calls before `func` is invoked.
9992
     * @param {Function} func The function to restrict.
9993
     * @returns {Function} Returns the new restricted function.
9994
     * @example
9995
     *
9996
     * var saves = ['profile', 'settings'];
9997
     *
9998
     * var done = _.after(saves.length, function() {
9999
     *   console.log('done saving!');
10000
     * });
10001
     *
10002
     * _.forEach(saves, function(type) {
10003
     *   asyncSave({ 'type': type, 'complete': done });
10004
     * });
10005
     * // => Logs 'done saving!' after the two async saves have completed.
10006
     */
10007
    function after(n, func) {
10008
      if (typeof func != 'function') {
10009
        throw new TypeError(FUNC_ERROR_TEXT);
10010
      }
10011
      n = toInteger(n);
10012
      return function() {
10013
        if (--n < 1) {
10014
          return func.apply(this, arguments);
10015
        }
10016
      };
10017
    }
10018
10019
    /**
10020
     * Creates a function that invokes `func`, with up to `n` arguments,
10021
     * ignoring any additional arguments.
10022
     *
10023
     * @static
10024
     * @memberOf _
10025
     * @since 3.0.0
10026
     * @category Function
10027
     * @param {Function} func The function to cap arguments for.
10028
     * @param {number} [n=func.length] The arity cap.
10029
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10030
     * @returns {Function} Returns the new capped function.
10031
     * @example
10032
     *
10033
     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
10034
     * // => [6, 8, 10]
10035
     */
10036
    function ary(func, n, guard) {
10037
      n = guard ? undefined : n;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10038
      n = (func && n == null) ? func.length : n;
10039
      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
10040
    }
10041
10042
    /**
10043
     * Creates a function that invokes `func`, with the `this` binding and arguments
10044
     * of the created function, while it's called less than `n` times. Subsequent
10045
     * calls to the created function return the result of the last `func` invocation.
10046
     *
10047
     * @static
10048
     * @memberOf _
10049
     * @since 3.0.0
10050
     * @category Function
10051
     * @param {number} n The number of calls at which `func` is no longer invoked.
10052
     * @param {Function} func The function to restrict.
10053
     * @returns {Function} Returns the new restricted function.
10054
     * @example
10055
     *
10056
     * jQuery(element).on('click', _.before(5, addContactToList));
10057
     * // => Allows adding up to 4 contacts to the list.
10058
     */
10059
    function before(n, func) {
10060
      var result;
10061
      if (typeof func != 'function') {
10062
        throw new TypeError(FUNC_ERROR_TEXT);
10063
      }
10064
      n = toInteger(n);
10065
      return function() {
10066
        if (--n > 0) {
10067
          result = func.apply(this, arguments);
10068
        }
10069
        if (n <= 1) {
10070
          func = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10071
        }
10072
        return result;
0 ignored issues
show
Bug introduced by
The variable result does not seem to be initialized in case --n > 0 on line 10066 is false. Are you sure this can never be the case?
Loading history...
10073
      };
10074
    }
10075
10076
    /**
10077
     * Creates a function that invokes `func` with the `this` binding of `thisArg`
10078
     * and `partials` prepended to the arguments it receives.
10079
     *
10080
     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
10081
     * may be used as a placeholder for partially applied arguments.
10082
     *
10083
     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
10084
     * property of bound functions.
10085
     *
10086
     * @static
10087
     * @memberOf _
10088
     * @since 0.1.0
10089
     * @category Function
10090
     * @param {Function} func The function to bind.
10091
     * @param {*} thisArg The `this` binding of `func`.
10092
     * @param {...*} [partials] The arguments to be partially applied.
10093
     * @returns {Function} Returns the new bound function.
10094
     * @example
10095
     *
10096
     * function greet(greeting, punctuation) {
10097
     *   return greeting + ' ' + this.user + punctuation;
10098
     * }
10099
     *
10100
     * var object = { 'user': 'fred' };
10101
     *
10102
     * var bound = _.bind(greet, object, 'hi');
10103
     * bound('!');
10104
     * // => 'hi fred!'
10105
     *
10106
     * // Bound with placeholders.
10107
     * var bound = _.bind(greet, object, _, '!');
10108
     * bound('hi');
10109
     * // => 'hi fred!'
10110
     */
10111
    var bind = baseRest(function(func, thisArg, partials) {
10112
      var bitmask = WRAP_BIND_FLAG;
10113
      if (partials.length) {
10114
        var holders = replaceHolders(partials, getHolder(bind));
10115
        bitmask |= WRAP_PARTIAL_FLAG;
10116
      }
10117
      return createWrap(func, bitmask, thisArg, partials, holders);
0 ignored issues
show
Bug introduced by
The variable holders does not seem to be initialized in case partials.length on line 10113 is false. Are you sure the function createWrap handles undefined variables?
Loading history...
10118
    });
10119
10120
    /**
10121
     * Creates a function that invokes the method at `object[key]` with `partials`
10122
     * prepended to the arguments it receives.
10123
     *
10124
     * This method differs from `_.bind` by allowing bound functions to reference
10125
     * methods that may be redefined or don't yet exist. See
10126
     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
10127
     * for more details.
10128
     *
10129
     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
10130
     * builds, may be used as a placeholder for partially applied arguments.
10131
     *
10132
     * @static
10133
     * @memberOf _
10134
     * @since 0.10.0
10135
     * @category Function
10136
     * @param {Object} object The object to invoke the method on.
10137
     * @param {string} key The key of the method.
10138
     * @param {...*} [partials] The arguments to be partially applied.
10139
     * @returns {Function} Returns the new bound function.
10140
     * @example
10141
     *
10142
     * var object = {
10143
     *   'user': 'fred',
10144
     *   'greet': function(greeting, punctuation) {
10145
     *     return greeting + ' ' + this.user + punctuation;
10146
     *   }
10147
     * };
10148
     *
10149
     * var bound = _.bindKey(object, 'greet', 'hi');
10150
     * bound('!');
10151
     * // => 'hi fred!'
10152
     *
10153
     * object.greet = function(greeting, punctuation) {
10154
     *   return greeting + 'ya ' + this.user + punctuation;
10155
     * };
10156
     *
10157
     * bound('!');
10158
     * // => 'hiya fred!'
10159
     *
10160
     * // Bound with placeholders.
10161
     * var bound = _.bindKey(object, 'greet', _, '!');
10162
     * bound('hi');
10163
     * // => 'hiya fred!'
10164
     */
10165
    var bindKey = baseRest(function(object, key, partials) {
10166
      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
10167
      if (partials.length) {
10168
        var holders = replaceHolders(partials, getHolder(bindKey));
10169
        bitmask |= WRAP_PARTIAL_FLAG;
10170
      }
10171
      return createWrap(key, bitmask, object, partials, holders);
0 ignored issues
show
Bug introduced by
The variable holders does not seem to be initialized in case partials.length on line 10167 is false. Are you sure the function createWrap handles undefined variables?
Loading history...
10172
    });
10173
10174
    /**
10175
     * Creates a function that accepts arguments of `func` and either invokes
10176
     * `func` returning its result, if at least `arity` number of arguments have
10177
     * been provided, or returns a function that accepts the remaining `func`
10178
     * arguments, and so on. The arity of `func` may be specified if `func.length`
10179
     * is not sufficient.
10180
     *
10181
     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
10182
     * may be used as a placeholder for provided arguments.
10183
     *
10184
     * **Note:** This method doesn't set the "length" property of curried functions.
10185
     *
10186
     * @static
10187
     * @memberOf _
10188
     * @since 2.0.0
10189
     * @category Function
10190
     * @param {Function} func The function to curry.
10191
     * @param {number} [arity=func.length] The arity of `func`.
10192
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10193
     * @returns {Function} Returns the new curried function.
10194
     * @example
10195
     *
10196
     * var abc = function(a, b, c) {
10197
     *   return [a, b, c];
10198
     * };
10199
     *
10200
     * var curried = _.curry(abc);
10201
     *
10202
     * curried(1)(2)(3);
10203
     * // => [1, 2, 3]
10204
     *
10205
     * curried(1, 2)(3);
10206
     * // => [1, 2, 3]
10207
     *
10208
     * curried(1, 2, 3);
10209
     * // => [1, 2, 3]
10210
     *
10211
     * // Curried with placeholders.
10212
     * curried(1)(_, 3)(2);
10213
     * // => [1, 2, 3]
10214
     */
10215
    function curry(func, arity, guard) {
10216
      arity = guard ? undefined : arity;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10217
      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10218
      result.placeholder = curry.placeholder;
10219
      return result;
10220
    }
10221
10222
    /**
10223
     * This method is like `_.curry` except that arguments are applied to `func`
10224
     * in the manner of `_.partialRight` instead of `_.partial`.
10225
     *
10226
     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
10227
     * builds, may be used as a placeholder for provided arguments.
10228
     *
10229
     * **Note:** This method doesn't set the "length" property of curried functions.
10230
     *
10231
     * @static
10232
     * @memberOf _
10233
     * @since 3.0.0
10234
     * @category Function
10235
     * @param {Function} func The function to curry.
10236
     * @param {number} [arity=func.length] The arity of `func`.
10237
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10238
     * @returns {Function} Returns the new curried function.
10239
     * @example
10240
     *
10241
     * var abc = function(a, b, c) {
10242
     *   return [a, b, c];
10243
     * };
10244
     *
10245
     * var curried = _.curryRight(abc);
10246
     *
10247
     * curried(3)(2)(1);
10248
     * // => [1, 2, 3]
10249
     *
10250
     * curried(2, 3)(1);
10251
     * // => [1, 2, 3]
10252
     *
10253
     * curried(1, 2, 3);
10254
     * // => [1, 2, 3]
10255
     *
10256
     * // Curried with placeholders.
10257
     * curried(3)(1, _)(2);
10258
     * // => [1, 2, 3]
10259
     */
10260
    function curryRight(func, arity, guard) {
10261
      arity = guard ? undefined : arity;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10262
      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10263
      result.placeholder = curryRight.placeholder;
10264
      return result;
10265
    }
10266
10267
    /**
10268
     * Creates a debounced function that delays invoking `func` until after `wait`
10269
     * milliseconds have elapsed since the last time the debounced function was
10270
     * invoked. The debounced function comes with a `cancel` method to cancel
10271
     * delayed `func` invocations and a `flush` method to immediately invoke them.
10272
     * Provide `options` to indicate whether `func` should be invoked on the
10273
     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
10274
     * with the last arguments provided to the debounced function. Subsequent
10275
     * calls to the debounced function return the result of the last `func`
10276
     * invocation.
10277
     *
10278
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
10279
     * invoked on the trailing edge of the timeout only if the debounced function
10280
     * is invoked more than once during the `wait` timeout.
10281
     *
10282
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10283
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10284
     *
10285
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10286
     * for details over the differences between `_.debounce` and `_.throttle`.
10287
     *
10288
     * @static
10289
     * @memberOf _
10290
     * @since 0.1.0
10291
     * @category Function
10292
     * @param {Function} func The function to debounce.
10293
     * @param {number} [wait=0] The number of milliseconds to delay.
10294
     * @param {Object} [options={}] The options object.
10295
     * @param {boolean} [options.leading=false]
10296
     *  Specify invoking on the leading edge of the timeout.
10297
     * @param {number} [options.maxWait]
10298
     *  The maximum time `func` is allowed to be delayed before it's invoked.
10299
     * @param {boolean} [options.trailing=true]
10300
     *  Specify invoking on the trailing edge of the timeout.
10301
     * @returns {Function} Returns the new debounced function.
10302
     * @example
10303
     *
10304
     * // Avoid costly calculations while the window size is in flux.
10305
     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
10306
     *
10307
     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
10308
     * jQuery(element).on('click', _.debounce(sendMail, 300, {
10309
     *   'leading': true,
10310
     *   'trailing': false
10311
     * }));
10312
     *
10313
     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
10314
     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
10315
     * var source = new EventSource('/stream');
10316
     * jQuery(source).on('message', debounced);
10317
     *
10318
     * // Cancel the trailing debounced invocation.
10319
     * jQuery(window).on('popstate', debounced.cancel);
10320
     */
10321
    function debounce(func, wait, options) {
10322
      var lastArgs,
10323
          lastThis,
10324
          maxWait,
10325
          result,
10326
          timerId,
10327
          lastCallTime,
10328
          lastInvokeTime = 0,
10329
          leading = false,
10330
          maxing = false,
10331
          trailing = true;
10332
10333
      if (typeof func != 'function') {
10334
        throw new TypeError(FUNC_ERROR_TEXT);
10335
      }
10336
      wait = toNumber(wait) || 0;
10337
      if (isObject(options)) {
10338
        leading = !!options.leading;
10339
        maxing = 'maxWait' in options;
10340
        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
0 ignored issues
show
Bug introduced by
The variable maxWait seems to be never initialized.
Loading history...
10341
        trailing = 'trailing' in options ? !!options.trailing : trailing;
10342
      }
10343
10344
      function invokeFunc(time) {
10345
        var args = lastArgs,
10346
            thisArg = lastThis;
10347
10348
        lastArgs = lastThis = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10349
        lastInvokeTime = time;
10350
        result = func.apply(thisArg, args);
10351
        return result;
10352
      }
10353
10354
      function leadingEdge(time) {
10355
        // Reset any `maxWait` timer.
10356
        lastInvokeTime = time;
10357
        // Start the timer for the trailing edge.
10358
        timerId = setTimeout(timerExpired, wait);
10359
        // Invoke the leading edge.
10360
        return leading ? invokeFunc(time) : result;
10361
      }
10362
10363
      function remainingWait(time) {
10364
        var timeSinceLastCall = time - lastCallTime,
10365
            timeSinceLastInvoke = time - lastInvokeTime,
10366
            result = wait - timeSinceLastCall;
10367
10368
        return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
0 ignored issues
show
Bug introduced by
The variable maxWait does not seem to be initialized in case isObject(options) on line 10337 is false. Are you sure this can never be the case?
Loading history...
10369
      }
10370
10371
      function shouldInvoke(time) {
10372
        var timeSinceLastCall = time - lastCallTime,
10373
            timeSinceLastInvoke = time - lastInvokeTime;
10374
10375
        // Either this is the first call, activity has stopped and we're at the
10376
        // trailing edge, the system time has gone backwards and we're treating
10377
        // it as the trailing edge, or we've hit the `maxWait` limit.
10378
        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10379
          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
0 ignored issues
show
Bug introduced by
The variable maxWait does not seem to be initialized in case isObject(options) on line 10337 is false. Are you sure this can never be the case?
Loading history...
10380
      }
10381
10382
      function timerExpired() {
10383
        var time = now();
10384
        if (shouldInvoke(time)) {
10385
          return trailingEdge(time);
10386
        }
10387
        // Restart the timer.
10388
        timerId = setTimeout(timerExpired, remainingWait(time));
10389
      }
10390
10391
      function trailingEdge(time) {
10392
        timerId = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10393
10394
        // Only invoke if we have `lastArgs` which means `func` has been
10395
        // debounced at least once.
10396
        if (trailing && lastArgs) {
10397
          return invokeFunc(time);
10398
        }
10399
        lastArgs = lastThis = undefined;
10400
        return result;
10401
      }
10402
10403
      function cancel() {
10404
        if (timerId !== undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10405
          clearTimeout(timerId);
10406
        }
10407
        lastInvokeTime = 0;
10408
        lastArgs = lastCallTime = lastThis = timerId = undefined;
10409
      }
10410
10411
      function flush() {
10412
        return timerId === undefined ? result : trailingEdge(now());
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10413
      }
10414
10415
      function debounced() {
10416
        var time = now(),
10417
            isInvoking = shouldInvoke(time);
10418
10419
        lastArgs = arguments;
10420
        lastThis = this;
10421
        lastCallTime = time;
10422
10423
        if (isInvoking) {
10424
          if (timerId === undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10425
            return leadingEdge(lastCallTime);
10426
          }
10427
          if (maxing) {
10428
            // Handle invocations in a tight loop.
10429
            timerId = setTimeout(timerExpired, wait);
10430
            return invokeFunc(lastCallTime);
10431
          }
10432
        }
10433
        if (timerId === undefined) {
10434
          timerId = setTimeout(timerExpired, wait);
10435
        }
10436
        return result;
10437
      }
10438
      debounced.cancel = cancel;
10439
      debounced.flush = flush;
10440
      return debounced;
10441
    }
10442
10443
    /**
10444
     * Defers invoking the `func` until the current call stack has cleared. Any
10445
     * additional arguments are provided to `func` when it's invoked.
10446
     *
10447
     * @static
10448
     * @memberOf _
10449
     * @since 0.1.0
10450
     * @category Function
10451
     * @param {Function} func The function to defer.
10452
     * @param {...*} [args] The arguments to invoke `func` with.
10453
     * @returns {number} Returns the timer id.
10454
     * @example
10455
     *
10456
     * _.defer(function(text) {
10457
     *   console.log(text);
10458
     * }, 'deferred');
10459
     * // => Logs 'deferred' after one millisecond.
10460
     */
10461
    var defer = baseRest(function(func, args) {
10462
      return baseDelay(func, 1, args);
10463
    });
10464
10465
    /**
10466
     * Invokes `func` after `wait` milliseconds. Any additional arguments are
10467
     * provided to `func` when it's invoked.
10468
     *
10469
     * @static
10470
     * @memberOf _
10471
     * @since 0.1.0
10472
     * @category Function
10473
     * @param {Function} func The function to delay.
10474
     * @param {number} wait The number of milliseconds to delay invocation.
10475
     * @param {...*} [args] The arguments to invoke `func` with.
10476
     * @returns {number} Returns the timer id.
10477
     * @example
10478
     *
10479
     * _.delay(function(text) {
10480
     *   console.log(text);
10481
     * }, 1000, 'later');
10482
     * // => Logs 'later' after one second.
10483
     */
10484
    var delay = baseRest(function(func, wait, args) {
10485
      return baseDelay(func, toNumber(wait) || 0, args);
10486
    });
10487
10488
    /**
10489
     * Creates a function that invokes `func` with arguments reversed.
10490
     *
10491
     * @static
10492
     * @memberOf _
10493
     * @since 4.0.0
10494
     * @category Function
10495
     * @param {Function} func The function to flip arguments for.
10496
     * @returns {Function} Returns the new flipped function.
10497
     * @example
10498
     *
10499
     * var flipped = _.flip(function() {
10500
     *   return _.toArray(arguments);
10501
     * });
10502
     *
10503
     * flipped('a', 'b', 'c', 'd');
10504
     * // => ['d', 'c', 'b', 'a']
10505
     */
10506
    function flip(func) {
10507
      return createWrap(func, WRAP_FLIP_FLAG);
10508
    }
10509
10510
    /**
10511
     * Creates a function that memoizes the result of `func`. If `resolver` is
10512
     * provided, it determines the cache key for storing the result based on the
10513
     * arguments provided to the memoized function. By default, the first argument
10514
     * provided to the memoized function is used as the map cache key. The `func`
10515
     * is invoked with the `this` binding of the memoized function.
10516
     *
10517
     * **Note:** The cache is exposed as the `cache` property on the memoized
10518
     * function. Its creation may be customized by replacing the `_.memoize.Cache`
10519
     * constructor with one whose instances implement the
10520
     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
10521
     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
10522
     *
10523
     * @static
10524
     * @memberOf _
10525
     * @since 0.1.0
10526
     * @category Function
10527
     * @param {Function} func The function to have its output memoized.
10528
     * @param {Function} [resolver] The function to resolve the cache key.
10529
     * @returns {Function} Returns the new memoized function.
10530
     * @example
10531
     *
10532
     * var object = { 'a': 1, 'b': 2 };
10533
     * var other = { 'c': 3, 'd': 4 };
10534
     *
10535
     * var values = _.memoize(_.values);
10536
     * values(object);
10537
     * // => [1, 2]
10538
     *
10539
     * values(other);
10540
     * // => [3, 4]
10541
     *
10542
     * object.a = 2;
10543
     * values(object);
10544
     * // => [1, 2]
10545
     *
10546
     * // Modify the result cache.
10547
     * values.cache.set(object, ['a', 'b']);
10548
     * values(object);
10549
     * // => ['a', 'b']
10550
     *
10551
     * // Replace `_.memoize.Cache`.
10552
     * _.memoize.Cache = WeakMap;
10553
     */
10554
    function memoize(func, resolver) {
10555
      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
10556
        throw new TypeError(FUNC_ERROR_TEXT);
10557
      }
10558
      var memoized = function() {
10559
        var args = arguments,
10560
            key = resolver ? resolver.apply(this, args) : args[0],
10561
            cache = memoized.cache;
10562
10563
        if (cache.has(key)) {
10564
          return cache.get(key);
10565
        }
10566
        var result = func.apply(this, args);
10567
        memoized.cache = cache.set(key, result) || cache;
10568
        return result;
10569
      };
10570
      memoized.cache = new (memoize.Cache || MapCache);
10571
      return memoized;
10572
    }
10573
10574
    // Expose `MapCache`.
10575
    memoize.Cache = MapCache;
10576
10577
    /**
10578
     * Creates a function that negates the result of the predicate `func`. The
10579
     * `func` predicate is invoked with the `this` binding and arguments of the
10580
     * created function.
10581
     *
10582
     * @static
10583
     * @memberOf _
10584
     * @since 3.0.0
10585
     * @category Function
10586
     * @param {Function} predicate The predicate to negate.
10587
     * @returns {Function} Returns the new negated function.
10588
     * @example
10589
     *
10590
     * function isEven(n) {
10591
     *   return n % 2 == 0;
10592
     * }
10593
     *
10594
     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
10595
     * // => [1, 3, 5]
10596
     */
10597
    function negate(predicate) {
10598
      if (typeof predicate != 'function') {
10599
        throw new TypeError(FUNC_ERROR_TEXT);
10600
      }
10601
      return function() {
10602
        var args = arguments;
10603
        switch (args.length) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
10604
          case 0: return !predicate.call(this);
10605
          case 1: return !predicate.call(this, args[0]);
10606
          case 2: return !predicate.call(this, args[0], args[1]);
10607
          case 3: return !predicate.call(this, args[0], args[1], args[2]);
10608
        }
10609
        return !predicate.apply(this, args);
10610
      };
10611
    }
10612
10613
    /**
10614
     * Creates a function that is restricted to invoking `func` once. Repeat calls
10615
     * to the function return the value of the first invocation. The `func` is
10616
     * invoked with the `this` binding and arguments of the created function.
10617
     *
10618
     * @static
10619
     * @memberOf _
10620
     * @since 0.1.0
10621
     * @category Function
10622
     * @param {Function} func The function to restrict.
10623
     * @returns {Function} Returns the new restricted function.
10624
     * @example
10625
     *
10626
     * var initialize = _.once(createApplication);
10627
     * initialize();
10628
     * initialize();
10629
     * // => `createApplication` is invoked once
10630
     */
10631
    function once(func) {
10632
      return before(2, func);
10633
    }
10634
10635
    /**
10636
     * Creates a function that invokes `func` with its arguments transformed.
10637
     *
10638
     * @static
10639
     * @since 4.0.0
10640
     * @memberOf _
10641
     * @category Function
10642
     * @param {Function} func The function to wrap.
10643
     * @param {...(Function|Function[])} [transforms=[_.identity]]
10644
     *  The argument transforms.
10645
     * @returns {Function} Returns the new function.
10646
     * @example
10647
     *
10648
     * function doubled(n) {
10649
     *   return n * 2;
10650
     * }
10651
     *
10652
     * function square(n) {
10653
     *   return n * n;
10654
     * }
10655
     *
10656
     * var func = _.overArgs(function(x, y) {
10657
     *   return [x, y];
10658
     * }, [square, doubled]);
10659
     *
10660
     * func(9, 3);
10661
     * // => [81, 6]
10662
     *
10663
     * func(10, 5);
10664
     * // => [100, 10]
10665
     */
10666
    var overArgs = castRest(function(func, transforms) {
10667
      transforms = (transforms.length == 1 && isArray(transforms[0]))
10668
        ? arrayMap(transforms[0], baseUnary(getIteratee()))
10669
        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
10670
10671
      var funcsLength = transforms.length;
10672
      return baseRest(function(args) {
10673
        var index = -1,
10674
            length = nativeMin(args.length, funcsLength);
10675
10676
        while (++index < length) {
10677
          args[index] = transforms[index].call(this, args[index]);
10678
        }
10679
        return apply(func, this, args);
10680
      });
10681
    });
10682
10683
    /**
10684
     * Creates a function that invokes `func` with `partials` prepended to the
10685
     * arguments it receives. This method is like `_.bind` except it does **not**
10686
     * alter the `this` binding.
10687
     *
10688
     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
10689
     * builds, may be used as a placeholder for partially applied arguments.
10690
     *
10691
     * **Note:** This method doesn't set the "length" property of partially
10692
     * applied functions.
10693
     *
10694
     * @static
10695
     * @memberOf _
10696
     * @since 0.2.0
10697
     * @category Function
10698
     * @param {Function} func The function to partially apply arguments to.
10699
     * @param {...*} [partials] The arguments to be partially applied.
10700
     * @returns {Function} Returns the new partially applied function.
10701
     * @example
10702
     *
10703
     * function greet(greeting, name) {
10704
     *   return greeting + ' ' + name;
10705
     * }
10706
     *
10707
     * var sayHelloTo = _.partial(greet, 'hello');
10708
     * sayHelloTo('fred');
10709
     * // => 'hello fred'
10710
     *
10711
     * // Partially applied with placeholders.
10712
     * var greetFred = _.partial(greet, _, 'fred');
10713
     * greetFred('hi');
10714
     * // => 'hi fred'
10715
     */
10716
    var partial = baseRest(function(func, partials) {
10717
      var holders = replaceHolders(partials, getHolder(partial));
10718
      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10719
    });
10720
10721
    /**
10722
     * This method is like `_.partial` except that partially applied arguments
10723
     * are appended to the arguments it receives.
10724
     *
10725
     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
10726
     * builds, may be used as a placeholder for partially applied arguments.
10727
     *
10728
     * **Note:** This method doesn't set the "length" property of partially
10729
     * applied functions.
10730
     *
10731
     * @static
10732
     * @memberOf _
10733
     * @since 1.0.0
10734
     * @category Function
10735
     * @param {Function} func The function to partially apply arguments to.
10736
     * @param {...*} [partials] The arguments to be partially applied.
10737
     * @returns {Function} Returns the new partially applied function.
10738
     * @example
10739
     *
10740
     * function greet(greeting, name) {
10741
     *   return greeting + ' ' + name;
10742
     * }
10743
     *
10744
     * var greetFred = _.partialRight(greet, 'fred');
10745
     * greetFred('hi');
10746
     * // => 'hi fred'
10747
     *
10748
     * // Partially applied with placeholders.
10749
     * var sayHelloTo = _.partialRight(greet, 'hello', _);
10750
     * sayHelloTo('fred');
10751
     * // => 'hello fred'
10752
     */
10753
    var partialRight = baseRest(function(func, partials) {
10754
      var holders = replaceHolders(partials, getHolder(partialRight));
10755
      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10756
    });
10757
10758
    /**
10759
     * Creates a function that invokes `func` with arguments arranged according
10760
     * to the specified `indexes` where the argument value at the first index is
10761
     * provided as the first argument, the argument value at the second index is
10762
     * provided as the second argument, and so on.
10763
     *
10764
     * @static
10765
     * @memberOf _
10766
     * @since 3.0.0
10767
     * @category Function
10768
     * @param {Function} func The function to rearrange arguments for.
10769
     * @param {...(number|number[])} indexes The arranged argument indexes.
10770
     * @returns {Function} Returns the new function.
10771
     * @example
10772
     *
10773
     * var rearged = _.rearg(function(a, b, c) {
10774
     *   return [a, b, c];
10775
     * }, [2, 0, 1]);
10776
     *
10777
     * rearged('b', 'c', 'a')
10778
     * // => ['a', 'b', 'c']
10779
     */
10780
    var rearg = flatRest(function(func, indexes) {
10781
      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10782
    });
10783
10784
    /**
10785
     * Creates a function that invokes `func` with the `this` binding of the
10786
     * created function and arguments from `start` and beyond provided as
10787
     * an array.
10788
     *
10789
     * **Note:** This method is based on the
10790
     * [rest parameter](https://mdn.io/rest_parameters).
10791
     *
10792
     * @static
10793
     * @memberOf _
10794
     * @since 4.0.0
10795
     * @category Function
10796
     * @param {Function} func The function to apply a rest parameter to.
10797
     * @param {number} [start=func.length-1] The start position of the rest parameter.
10798
     * @returns {Function} Returns the new function.
10799
     * @example
10800
     *
10801
     * var say = _.rest(function(what, names) {
10802
     *   return what + ' ' + _.initial(names).join(', ') +
10803
     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
10804
     * });
10805
     *
10806
     * say('hello', 'fred', 'barney', 'pebbles');
10807
     * // => 'hello fred, barney, & pebbles'
10808
     */
10809
    function rest(func, start) {
10810
      if (typeof func != 'function') {
10811
        throw new TypeError(FUNC_ERROR_TEXT);
10812
      }
10813
      start = start === undefined ? start : toInteger(start);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
10814
      return baseRest(func, start);
10815
    }
10816
10817
    /**
10818
     * Creates a function that invokes `func` with the `this` binding of the
10819
     * create function and an array of arguments much like
10820
     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
10821
     *
10822
     * **Note:** This method is based on the
10823
     * [spread operator](https://mdn.io/spread_operator).
10824
     *
10825
     * @static
10826
     * @memberOf _
10827
     * @since 3.2.0
10828
     * @category Function
10829
     * @param {Function} func The function to spread arguments over.
10830
     * @param {number} [start=0] The start position of the spread.
10831
     * @returns {Function} Returns the new function.
10832
     * @example
10833
     *
10834
     * var say = _.spread(function(who, what) {
10835
     *   return who + ' says ' + what;
10836
     * });
10837
     *
10838
     * say(['fred', 'hello']);
10839
     * // => 'fred says hello'
10840
     *
10841
     * var numbers = Promise.all([
10842
     *   Promise.resolve(40),
10843
     *   Promise.resolve(36)
10844
     * ]);
10845
     *
10846
     * numbers.then(_.spread(function(x, y) {
10847
     *   return x + y;
10848
     * }));
10849
     * // => a Promise of 76
10850
     */
10851
    function spread(func, start) {
10852
      if (typeof func != 'function') {
10853
        throw new TypeError(FUNC_ERROR_TEXT);
10854
      }
10855
      start = start == null ? 0 : nativeMax(toInteger(start), 0);
10856
      return baseRest(function(args) {
10857
        var array = args[start],
10858
            otherArgs = castSlice(args, 0, start);
10859
10860
        if (array) {
10861
          arrayPush(otherArgs, array);
10862
        }
10863
        return apply(func, this, otherArgs);
10864
      });
10865
    }
10866
10867
    /**
10868
     * Creates a throttled function that only invokes `func` at most once per
10869
     * every `wait` milliseconds. The throttled function comes with a `cancel`
10870
     * method to cancel delayed `func` invocations and a `flush` method to
10871
     * immediately invoke them. Provide `options` to indicate whether `func`
10872
     * should be invoked on the leading and/or trailing edge of the `wait`
10873
     * timeout. The `func` is invoked with the last arguments provided to the
10874
     * throttled function. Subsequent calls to the throttled function return the
10875
     * result of the last `func` invocation.
10876
     *
10877
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
10878
     * invoked on the trailing edge of the timeout only if the throttled function
10879
     * is invoked more than once during the `wait` timeout.
10880
     *
10881
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10882
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10883
     *
10884
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10885
     * for details over the differences between `_.throttle` and `_.debounce`.
10886
     *
10887
     * @static
10888
     * @memberOf _
10889
     * @since 0.1.0
10890
     * @category Function
10891
     * @param {Function} func The function to throttle.
10892
     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
10893
     * @param {Object} [options={}] The options object.
10894
     * @param {boolean} [options.leading=true]
10895
     *  Specify invoking on the leading edge of the timeout.
10896
     * @param {boolean} [options.trailing=true]
10897
     *  Specify invoking on the trailing edge of the timeout.
10898
     * @returns {Function} Returns the new throttled function.
10899
     * @example
10900
     *
10901
     * // Avoid excessively updating the position while scrolling.
10902
     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
10903
     *
10904
     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
10905
     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
10906
     * jQuery(element).on('click', throttled);
10907
     *
10908
     * // Cancel the trailing throttled invocation.
10909
     * jQuery(window).on('popstate', throttled.cancel);
10910
     */
10911
    function throttle(func, wait, options) {
10912
      var leading = true,
10913
          trailing = true;
10914
10915
      if (typeof func != 'function') {
10916
        throw new TypeError(FUNC_ERROR_TEXT);
10917
      }
10918
      if (isObject(options)) {
10919
        leading = 'leading' in options ? !!options.leading : leading;
10920
        trailing = 'trailing' in options ? !!options.trailing : trailing;
10921
      }
10922
      return debounce(func, wait, {
10923
        'leading': leading,
10924
        'maxWait': wait,
10925
        'trailing': trailing
10926
      });
10927
    }
10928
10929
    /**
10930
     * Creates a function that accepts up to one argument, ignoring any
10931
     * additional arguments.
10932
     *
10933
     * @static
10934
     * @memberOf _
10935
     * @since 4.0.0
10936
     * @category Function
10937
     * @param {Function} func The function to cap arguments for.
10938
     * @returns {Function} Returns the new capped function.
10939
     * @example
10940
     *
10941
     * _.map(['6', '8', '10'], _.unary(parseInt));
10942
     * // => [6, 8, 10]
10943
     */
10944
    function unary(func) {
10945
      return ary(func, 1);
10946
    }
10947
10948
    /**
10949
     * Creates a function that provides `value` to `wrapper` as its first
10950
     * argument. Any additional arguments provided to the function are appended
10951
     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
10952
     * binding of the created function.
10953
     *
10954
     * @static
10955
     * @memberOf _
10956
     * @since 0.1.0
10957
     * @category Function
10958
     * @param {*} value The value to wrap.
10959
     * @param {Function} [wrapper=identity] The wrapper function.
10960
     * @returns {Function} Returns the new function.
10961
     * @example
10962
     *
10963
     * var p = _.wrap(_.escape, function(func, text) {
10964
     *   return '<p>' + func(text) + '</p>';
10965
     * });
10966
     *
10967
     * p('fred, barney, & pebbles');
10968
     * // => '<p>fred, barney, &amp; pebbles</p>'
10969
     */
10970
    function wrap(value, wrapper) {
10971
      return partial(castFunction(wrapper), value);
10972
    }
10973
10974
    /*------------------------------------------------------------------------*/
10975
10976
    /**
10977
     * Casts `value` as an array if it's not one.
10978
     *
10979
     * @static
10980
     * @memberOf _
10981
     * @since 4.4.0
10982
     * @category Lang
10983
     * @param {*} value The value to inspect.
10984
     * @returns {Array} Returns the cast array.
10985
     * @example
10986
     *
10987
     * _.castArray(1);
10988
     * // => [1]
10989
     *
10990
     * _.castArray({ 'a': 1 });
10991
     * // => [{ 'a': 1 }]
10992
     *
10993
     * _.castArray('abc');
10994
     * // => ['abc']
10995
     *
10996
     * _.castArray(null);
10997
     * // => [null]
10998
     *
10999
     * _.castArray(undefined);
11000
     * // => [undefined]
11001
     *
11002
     * _.castArray();
11003
     * // => []
11004
     *
11005
     * var array = [1, 2, 3];
11006
     * console.log(_.castArray(array) === array);
11007
     * // => true
11008
     */
11009
    function castArray() {
11010
      if (!arguments.length) {
11011
        return [];
11012
      }
11013
      var value = arguments[0];
11014
      return isArray(value) ? value : [value];
11015
    }
11016
11017
    /**
11018
     * Creates a shallow clone of `value`.
11019
     *
11020
     * **Note:** This method is loosely based on the
11021
     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
11022
     * and supports cloning arrays, array buffers, booleans, date objects, maps,
11023
     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
11024
     * arrays. The own enumerable properties of `arguments` objects are cloned
11025
     * as plain objects. An empty object is returned for uncloneable values such
11026
     * as error objects, functions, DOM nodes, and WeakMaps.
11027
     *
11028
     * @static
11029
     * @memberOf _
11030
     * @since 0.1.0
11031
     * @category Lang
11032
     * @param {*} value The value to clone.
11033
     * @returns {*} Returns the cloned value.
11034
     * @see _.cloneDeep
11035
     * @example
11036
     *
11037
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
11038
     *
11039
     * var shallow = _.clone(objects);
11040
     * console.log(shallow[0] === objects[0]);
11041
     * // => true
11042
     */
11043
    function clone(value) {
11044
      return baseClone(value, CLONE_SYMBOLS_FLAG);
11045
    }
11046
11047
    /**
11048
     * This method is like `_.clone` except that it accepts `customizer` which
11049
     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
11050
     * cloning is handled by the method instead. The `customizer` is invoked with
11051
     * up to four arguments; (value [, index|key, object, stack]).
11052
     *
11053
     * @static
11054
     * @memberOf _
11055
     * @since 4.0.0
11056
     * @category Lang
11057
     * @param {*} value The value to clone.
11058
     * @param {Function} [customizer] The function to customize cloning.
11059
     * @returns {*} Returns the cloned value.
11060
     * @see _.cloneDeepWith
11061
     * @example
11062
     *
11063
     * function customizer(value) {
11064
     *   if (_.isElement(value)) {
11065
     *     return value.cloneNode(false);
11066
     *   }
11067
     * }
11068
     *
11069
     * var el = _.cloneWith(document.body, customizer);
11070
     *
11071
     * console.log(el === document.body);
11072
     * // => false
11073
     * console.log(el.nodeName);
11074
     * // => 'BODY'
11075
     * console.log(el.childNodes.length);
11076
     * // => 0
11077
     */
11078
    function cloneWith(value, customizer) {
11079
      customizer = typeof customizer == 'function' ? customizer : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
11080
      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
11081
    }
11082
11083
    /**
11084
     * This method is like `_.clone` except that it recursively clones `value`.
11085
     *
11086
     * @static
11087
     * @memberOf _
11088
     * @since 1.0.0
11089
     * @category Lang
11090
     * @param {*} value The value to recursively clone.
11091
     * @returns {*} Returns the deep cloned value.
11092
     * @see _.clone
11093
     * @example
11094
     *
11095
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
11096
     *
11097
     * var deep = _.cloneDeep(objects);
11098
     * console.log(deep[0] === objects[0]);
11099
     * // => false
11100
     */
11101
    function cloneDeep(value) {
11102
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
11103
    }
11104
11105
    /**
11106
     * This method is like `_.cloneWith` except that it recursively clones `value`.
11107
     *
11108
     * @static
11109
     * @memberOf _
11110
     * @since 4.0.0
11111
     * @category Lang
11112
     * @param {*} value The value to recursively clone.
11113
     * @param {Function} [customizer] The function to customize cloning.
11114
     * @returns {*} Returns the deep cloned value.
11115
     * @see _.cloneWith
11116
     * @example
11117
     *
11118
     * function customizer(value) {
11119
     *   if (_.isElement(value)) {
11120
     *     return value.cloneNode(true);
11121
     *   }
11122
     * }
11123
     *
11124
     * var el = _.cloneDeepWith(document.body, customizer);
11125
     *
11126
     * console.log(el === document.body);
11127
     * // => false
11128
     * console.log(el.nodeName);
11129
     * // => 'BODY'
11130
     * console.log(el.childNodes.length);
11131
     * // => 20
11132
     */
11133
    function cloneDeepWith(value, customizer) {
11134
      customizer = typeof customizer == 'function' ? customizer : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
11135
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
11136
    }
11137
11138
    /**
11139
     * Checks if `object` conforms to `source` by invoking the predicate
11140
     * properties of `source` with the corresponding property values of `object`.
11141
     *
11142
     * **Note:** This method is equivalent to `_.conforms` when `source` is
11143
     * partially applied.
11144
     *
11145
     * @static
11146
     * @memberOf _
11147
     * @since 4.14.0
11148
     * @category Lang
11149
     * @param {Object} object The object to inspect.
11150
     * @param {Object} source The object of property predicates to conform to.
11151
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
11152
     * @example
11153
     *
11154
     * var object = { 'a': 1, 'b': 2 };
11155
     *
11156
     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
11157
     * // => true
11158
     *
11159
     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
11160
     * // => false
11161
     */
11162
    function conformsTo(object, source) {
11163
      return source == null || baseConformsTo(object, source, keys(source));
11164
    }
11165
11166
    /**
11167
     * Performs a
11168
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
11169
     * comparison between two values to determine if they are equivalent.
11170
     *
11171
     * @static
11172
     * @memberOf _
11173
     * @since 4.0.0
11174
     * @category Lang
11175
     * @param {*} value The value to compare.
11176
     * @param {*} other The other value to compare.
11177
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11178
     * @example
11179
     *
11180
     * var object = { 'a': 1 };
11181
     * var other = { 'a': 1 };
11182
     *
11183
     * _.eq(object, object);
11184
     * // => true
11185
     *
11186
     * _.eq(object, other);
11187
     * // => false
11188
     *
11189
     * _.eq('a', 'a');
11190
     * // => true
11191
     *
11192
     * _.eq('a', Object('a'));
11193
     * // => false
11194
     *
11195
     * _.eq(NaN, NaN);
11196
     * // => true
11197
     */
11198
    function eq(value, other) {
11199
      return value === other || (value !== value && other !== other);
11200
    }
11201
11202
    /**
11203
     * Checks if `value` is greater than `other`.
11204
     *
11205
     * @static
11206
     * @memberOf _
11207
     * @since 3.9.0
11208
     * @category Lang
11209
     * @param {*} value The value to compare.
11210
     * @param {*} other The other value to compare.
11211
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
11212
     *  else `false`.
11213
     * @see _.lt
11214
     * @example
11215
     *
11216
     * _.gt(3, 1);
11217
     * // => true
11218
     *
11219
     * _.gt(3, 3);
11220
     * // => false
11221
     *
11222
     * _.gt(1, 3);
11223
     * // => false
11224
     */
11225
    var gt = createRelationalOperation(baseGt);
11226
11227
    /**
11228
     * Checks if `value` is greater than or equal to `other`.
11229
     *
11230
     * @static
11231
     * @memberOf _
11232
     * @since 3.9.0
11233
     * @category Lang
11234
     * @param {*} value The value to compare.
11235
     * @param {*} other The other value to compare.
11236
     * @returns {boolean} Returns `true` if `value` is greater than or equal to
11237
     *  `other`, else `false`.
11238
     * @see _.lte
11239
     * @example
11240
     *
11241
     * _.gte(3, 1);
11242
     * // => true
11243
     *
11244
     * _.gte(3, 3);
11245
     * // => true
11246
     *
11247
     * _.gte(1, 3);
11248
     * // => false
11249
     */
11250
    var gte = createRelationalOperation(function(value, other) {
11251
      return value >= other;
11252
    });
11253
11254
    /**
11255
     * Checks if `value` is likely an `arguments` object.
11256
     *
11257
     * @static
11258
     * @memberOf _
11259
     * @since 0.1.0
11260
     * @category Lang
11261
     * @param {*} value The value to check.
11262
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
11263
     *  else `false`.
11264
     * @example
11265
     *
11266
     * _.isArguments(function() { return arguments; }());
11267
     * // => true
11268
     *
11269
     * _.isArguments([1, 2, 3]);
11270
     * // => false
11271
     */
11272
    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
11273
      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
11274
        !propertyIsEnumerable.call(value, 'callee');
11275
    };
11276
11277
    /**
11278
     * Checks if `value` is classified as an `Array` object.
11279
     *
11280
     * @static
11281
     * @memberOf _
11282
     * @since 0.1.0
11283
     * @category Lang
11284
     * @param {*} value The value to check.
11285
     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
11286
     * @example
11287
     *
11288
     * _.isArray([1, 2, 3]);
11289
     * // => true
11290
     *
11291
     * _.isArray(document.body.children);
11292
     * // => false
11293
     *
11294
     * _.isArray('abc');
11295
     * // => false
11296
     *
11297
     * _.isArray(_.noop);
11298
     * // => false
11299
     */
11300
    var isArray = Array.isArray;
11301
11302
    /**
11303
     * Checks if `value` is classified as an `ArrayBuffer` object.
11304
     *
11305
     * @static
11306
     * @memberOf _
11307
     * @since 4.3.0
11308
     * @category Lang
11309
     * @param {*} value The value to check.
11310
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
11311
     * @example
11312
     *
11313
     * _.isArrayBuffer(new ArrayBuffer(2));
11314
     * // => true
11315
     *
11316
     * _.isArrayBuffer(new Array(2));
11317
     * // => false
11318
     */
11319
    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
11320
11321
    /**
11322
     * Checks if `value` is array-like. A value is considered array-like if it's
11323
     * not a function and has a `value.length` that's an integer greater than or
11324
     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
11325
     *
11326
     * @static
11327
     * @memberOf _
11328
     * @since 4.0.0
11329
     * @category Lang
11330
     * @param {*} value The value to check.
11331
     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
11332
     * @example
11333
     *
11334
     * _.isArrayLike([1, 2, 3]);
11335
     * // => true
11336
     *
11337
     * _.isArrayLike(document.body.children);
11338
     * // => true
11339
     *
11340
     * _.isArrayLike('abc');
11341
     * // => true
11342
     *
11343
     * _.isArrayLike(_.noop);
11344
     * // => false
11345
     */
11346
    function isArrayLike(value) {
11347
      return value != null && isLength(value.length) && !isFunction(value);
11348
    }
11349
11350
    /**
11351
     * This method is like `_.isArrayLike` except that it also checks if `value`
11352
     * is an object.
11353
     *
11354
     * @static
11355
     * @memberOf _
11356
     * @since 4.0.0
11357
     * @category Lang
11358
     * @param {*} value The value to check.
11359
     * @returns {boolean} Returns `true` if `value` is an array-like object,
11360
     *  else `false`.
11361
     * @example
11362
     *
11363
     * _.isArrayLikeObject([1, 2, 3]);
11364
     * // => true
11365
     *
11366
     * _.isArrayLikeObject(document.body.children);
11367
     * // => true
11368
     *
11369
     * _.isArrayLikeObject('abc');
11370
     * // => false
11371
     *
11372
     * _.isArrayLikeObject(_.noop);
11373
     * // => false
11374
     */
11375
    function isArrayLikeObject(value) {
11376
      return isObjectLike(value) && isArrayLike(value);
11377
    }
11378
11379
    /**
11380
     * Checks if `value` is classified as a boolean primitive or object.
11381
     *
11382
     * @static
11383
     * @memberOf _
11384
     * @since 0.1.0
11385
     * @category Lang
11386
     * @param {*} value The value to check.
11387
     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
11388
     * @example
11389
     *
11390
     * _.isBoolean(false);
11391
     * // => true
11392
     *
11393
     * _.isBoolean(null);
11394
     * // => false
11395
     */
11396
    function isBoolean(value) {
11397
      return value === true || value === false ||
11398
        (isObjectLike(value) && baseGetTag(value) == boolTag);
11399
    }
11400
11401
    /**
11402
     * Checks if `value` is a buffer.
11403
     *
11404
     * @static
11405
     * @memberOf _
11406
     * @since 4.3.0
11407
     * @category Lang
11408
     * @param {*} value The value to check.
11409
     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
11410
     * @example
11411
     *
11412
     * _.isBuffer(new Buffer(2));
11413
     * // => true
11414
     *
11415
     * _.isBuffer(new Uint8Array(2));
11416
     * // => false
11417
     */
11418
    var isBuffer = nativeIsBuffer || stubFalse;
11419
11420
    /**
11421
     * Checks if `value` is classified as a `Date` object.
11422
     *
11423
     * @static
11424
     * @memberOf _
11425
     * @since 0.1.0
11426
     * @category Lang
11427
     * @param {*} value The value to check.
11428
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
11429
     * @example
11430
     *
11431
     * _.isDate(new Date);
11432
     * // => true
11433
     *
11434
     * _.isDate('Mon April 23 2012');
11435
     * // => false
11436
     */
11437
    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
11438
11439
    /**
11440
     * Checks if `value` is likely a DOM element.
11441
     *
11442
     * @static
11443
     * @memberOf _
11444
     * @since 0.1.0
11445
     * @category Lang
11446
     * @param {*} value The value to check.
11447
     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
11448
     * @example
11449
     *
11450
     * _.isElement(document.body);
11451
     * // => true
11452
     *
11453
     * _.isElement('<body>');
11454
     * // => false
11455
     */
11456
    function isElement(value) {
11457
      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
11458
    }
11459
11460
    /**
11461
     * Checks if `value` is an empty object, collection, map, or set.
11462
     *
11463
     * Objects are considered empty if they have no own enumerable string keyed
11464
     * properties.
11465
     *
11466
     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
11467
     * jQuery-like collections are considered empty if they have a `length` of `0`.
11468
     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
11469
     *
11470
     * @static
11471
     * @memberOf _
11472
     * @since 0.1.0
11473
     * @category Lang
11474
     * @param {*} value The value to check.
11475
     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
11476
     * @example
11477
     *
11478
     * _.isEmpty(null);
11479
     * // => true
11480
     *
11481
     * _.isEmpty(true);
11482
     * // => true
11483
     *
11484
     * _.isEmpty(1);
11485
     * // => true
11486
     *
11487
     * _.isEmpty([1, 2, 3]);
11488
     * // => false
11489
     *
11490
     * _.isEmpty({ 'a': 1 });
11491
     * // => false
11492
     */
11493
    function isEmpty(value) {
11494
      if (value == null) {
11495
        return true;
11496
      }
11497
      if (isArrayLike(value) &&
11498
          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
11499
            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
11500
        return !value.length;
11501
      }
11502
      var tag = getTag(value);
11503
      if (tag == mapTag || tag == setTag) {
11504
        return !value.size;
11505
      }
11506
      if (isPrototype(value)) {
11507
        return !baseKeys(value).length;
11508
      }
11509
      for (var key in value) {
11510
        if (hasOwnProperty.call(value, key)) {
11511
          return false;
11512
        }
11513
      }
11514
      return true;
11515
    }
11516
11517
    /**
11518
     * Performs a deep comparison between two values to determine if they are
11519
     * equivalent.
11520
     *
11521
     * **Note:** This method supports comparing arrays, array buffers, booleans,
11522
     * date objects, error objects, maps, numbers, `Object` objects, regexes,
11523
     * sets, strings, symbols, and typed arrays. `Object` objects are compared
11524
     * by their own, not inherited, enumerable properties. Functions and DOM
11525
     * nodes are compared by strict equality, i.e. `===`.
11526
     *
11527
     * @static
11528
     * @memberOf _
11529
     * @since 0.1.0
11530
     * @category Lang
11531
     * @param {*} value The value to compare.
11532
     * @param {*} other The other value to compare.
11533
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11534
     * @example
11535
     *
11536
     * var object = { 'a': 1 };
11537
     * var other = { 'a': 1 };
11538
     *
11539
     * _.isEqual(object, other);
11540
     * // => true
11541
     *
11542
     * object === other;
11543
     * // => false
11544
     */
11545
    function isEqual(value, other) {
11546
      return baseIsEqual(value, other);
11547
    }
11548
11549
    /**
11550
     * This method is like `_.isEqual` except that it accepts `customizer` which
11551
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11552
     * are handled by the method instead. The `customizer` is invoked with up to
11553
     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
11554
     *
11555
     * @static
11556
     * @memberOf _
11557
     * @since 4.0.0
11558
     * @category Lang
11559
     * @param {*} value The value to compare.
11560
     * @param {*} other The other value to compare.
11561
     * @param {Function} [customizer] The function to customize comparisons.
11562
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11563
     * @example
11564
     *
11565
     * function isGreeting(value) {
11566
     *   return /^h(?:i|ello)$/.test(value);
11567
     * }
11568
     *
11569
     * function customizer(objValue, othValue) {
11570
     *   if (isGreeting(objValue) && isGreeting(othValue)) {
11571
     *     return true;
11572
     *   }
11573
     * }
11574
     *
11575
     * var array = ['hello', 'goodbye'];
11576
     * var other = ['hi', 'goodbye'];
11577
     *
11578
     * _.isEqualWith(array, other, customizer);
11579
     * // => true
11580
     */
11581
    function isEqualWith(value, other, customizer) {
11582
      customizer = typeof customizer == 'function' ? customizer : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
11583
      var result = customizer ? customizer(value, other) : undefined;
11584
      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
11585
    }
11586
11587
    /**
11588
     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
11589
     * `SyntaxError`, `TypeError`, or `URIError` object.
11590
     *
11591
     * @static
11592
     * @memberOf _
11593
     * @since 3.0.0
11594
     * @category Lang
11595
     * @param {*} value The value to check.
11596
     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
11597
     * @example
11598
     *
11599
     * _.isError(new Error);
11600
     * // => true
11601
     *
11602
     * _.isError(Error);
11603
     * // => false
11604
     */
11605
    function isError(value) {
11606
      if (!isObjectLike(value)) {
11607
        return false;
11608
      }
11609
      var tag = baseGetTag(value);
11610
      return tag == errorTag || tag == domExcTag ||
11611
        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
11612
    }
11613
11614
    /**
11615
     * Checks if `value` is a finite primitive number.
11616
     *
11617
     * **Note:** This method is based on
11618
     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
11619
     *
11620
     * @static
11621
     * @memberOf _
11622
     * @since 0.1.0
11623
     * @category Lang
11624
     * @param {*} value The value to check.
11625
     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
11626
     * @example
11627
     *
11628
     * _.isFinite(3);
11629
     * // => true
11630
     *
11631
     * _.isFinite(Number.MIN_VALUE);
11632
     * // => true
11633
     *
11634
     * _.isFinite(Infinity);
11635
     * // => false
11636
     *
11637
     * _.isFinite('3');
11638
     * // => false
11639
     */
11640
    function isFinite(value) {
11641
      return typeof value == 'number' && nativeIsFinite(value);
11642
    }
11643
11644
    /**
11645
     * Checks if `value` is classified as a `Function` object.
11646
     *
11647
     * @static
11648
     * @memberOf _
11649
     * @since 0.1.0
11650
     * @category Lang
11651
     * @param {*} value The value to check.
11652
     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
11653
     * @example
11654
     *
11655
     * _.isFunction(_);
11656
     * // => true
11657
     *
11658
     * _.isFunction(/abc/);
11659
     * // => false
11660
     */
11661
    function isFunction(value) {
11662
      if (!isObject(value)) {
11663
        return false;
11664
      }
11665
      // The use of `Object#toString` avoids issues with the `typeof` operator
11666
      // in Safari 9 which returns 'object' for typed arrays and other constructors.
11667
      var tag = baseGetTag(value);
11668
      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
11669
    }
11670
11671
    /**
11672
     * Checks if `value` is an integer.
11673
     *
11674
     * **Note:** This method is based on
11675
     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
11676
     *
11677
     * @static
11678
     * @memberOf _
11679
     * @since 4.0.0
11680
     * @category Lang
11681
     * @param {*} value The value to check.
11682
     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
11683
     * @example
11684
     *
11685
     * _.isInteger(3);
11686
     * // => true
11687
     *
11688
     * _.isInteger(Number.MIN_VALUE);
11689
     * // => false
11690
     *
11691
     * _.isInteger(Infinity);
11692
     * // => false
11693
     *
11694
     * _.isInteger('3');
11695
     * // => false
11696
     */
11697
    function isInteger(value) {
11698
      return typeof value == 'number' && value == toInteger(value);
11699
    }
11700
11701
    /**
11702
     * Checks if `value` is a valid array-like length.
11703
     *
11704
     * **Note:** This method is loosely based on
11705
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
11706
     *
11707
     * @static
11708
     * @memberOf _
11709
     * @since 4.0.0
11710
     * @category Lang
11711
     * @param {*} value The value to check.
11712
     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
11713
     * @example
11714
     *
11715
     * _.isLength(3);
11716
     * // => true
11717
     *
11718
     * _.isLength(Number.MIN_VALUE);
11719
     * // => false
11720
     *
11721
     * _.isLength(Infinity);
11722
     * // => false
11723
     *
11724
     * _.isLength('3');
11725
     * // => false
11726
     */
11727
    function isLength(value) {
11728
      return typeof value == 'number' &&
11729
        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
11730
    }
11731
11732
    /**
11733
     * Checks if `value` is the
11734
     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
11735
     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
11736
     *
11737
     * @static
11738
     * @memberOf _
11739
     * @since 0.1.0
11740
     * @category Lang
11741
     * @param {*} value The value to check.
11742
     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
11743
     * @example
11744
     *
11745
     * _.isObject({});
11746
     * // => true
11747
     *
11748
     * _.isObject([1, 2, 3]);
11749
     * // => true
11750
     *
11751
     * _.isObject(_.noop);
11752
     * // => true
11753
     *
11754
     * _.isObject(null);
11755
     * // => false
11756
     */
11757
    function isObject(value) {
11758
      var type = typeof value;
11759
      return value != null && (type == 'object' || type == 'function');
11760
    }
11761
11762
    /**
11763
     * Checks if `value` is object-like. A value is object-like if it's not `null`
11764
     * and has a `typeof` result of "object".
11765
     *
11766
     * @static
11767
     * @memberOf _
11768
     * @since 4.0.0
11769
     * @category Lang
11770
     * @param {*} value The value to check.
11771
     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
11772
     * @example
11773
     *
11774
     * _.isObjectLike({});
11775
     * // => true
11776
     *
11777
     * _.isObjectLike([1, 2, 3]);
11778
     * // => true
11779
     *
11780
     * _.isObjectLike(_.noop);
11781
     * // => false
11782
     *
11783
     * _.isObjectLike(null);
11784
     * // => false
11785
     */
11786
    function isObjectLike(value) {
11787
      return value != null && typeof value == 'object';
11788
    }
11789
11790
    /**
11791
     * Checks if `value` is classified as a `Map` object.
11792
     *
11793
     * @static
11794
     * @memberOf _
11795
     * @since 4.3.0
11796
     * @category Lang
11797
     * @param {*} value The value to check.
11798
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
11799
     * @example
11800
     *
11801
     * _.isMap(new Map);
11802
     * // => true
11803
     *
11804
     * _.isMap(new WeakMap);
11805
     * // => false
11806
     */
11807
    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
11808
11809
    /**
11810
     * Performs a partial deep comparison between `object` and `source` to
11811
     * determine if `object` contains equivalent property values.
11812
     *
11813
     * **Note:** This method is equivalent to `_.matches` when `source` is
11814
     * partially applied.
11815
     *
11816
     * Partial comparisons will match empty array and empty object `source`
11817
     * values against any array or object value, respectively. See `_.isEqual`
11818
     * for a list of supported value comparisons.
11819
     *
11820
     * @static
11821
     * @memberOf _
11822
     * @since 3.0.0
11823
     * @category Lang
11824
     * @param {Object} object The object to inspect.
11825
     * @param {Object} source The object of property values to match.
11826
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11827
     * @example
11828
     *
11829
     * var object = { 'a': 1, 'b': 2 };
11830
     *
11831
     * _.isMatch(object, { 'b': 2 });
11832
     * // => true
11833
     *
11834
     * _.isMatch(object, { 'b': 1 });
11835
     * // => false
11836
     */
11837
    function isMatch(object, source) {
11838
      return object === source || baseIsMatch(object, source, getMatchData(source));
11839
    }
11840
11841
    /**
11842
     * This method is like `_.isMatch` except that it accepts `customizer` which
11843
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11844
     * are handled by the method instead. The `customizer` is invoked with five
11845
     * arguments: (objValue, srcValue, index|key, object, source).
11846
     *
11847
     * @static
11848
     * @memberOf _
11849
     * @since 4.0.0
11850
     * @category Lang
11851
     * @param {Object} object The object to inspect.
11852
     * @param {Object} source The object of property values to match.
11853
     * @param {Function} [customizer] The function to customize comparisons.
11854
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11855
     * @example
11856
     *
11857
     * function isGreeting(value) {
11858
     *   return /^h(?:i|ello)$/.test(value);
11859
     * }
11860
     *
11861
     * function customizer(objValue, srcValue) {
11862
     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
11863
     *     return true;
11864
     *   }
11865
     * }
11866
     *
11867
     * var object = { 'greeting': 'hello' };
11868
     * var source = { 'greeting': 'hi' };
11869
     *
11870
     * _.isMatchWith(object, source, customizer);
11871
     * // => true
11872
     */
11873
    function isMatchWith(object, source, customizer) {
11874
      customizer = typeof customizer == 'function' ? customizer : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
11875
      return baseIsMatch(object, source, getMatchData(source), customizer);
11876
    }
11877
11878
    /**
11879
     * Checks if `value` is `NaN`.
11880
     *
11881
     * **Note:** This method is based on
11882
     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
11883
     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
11884
     * `undefined` and other non-number values.
11885
     *
11886
     * @static
11887
     * @memberOf _
11888
     * @since 0.1.0
11889
     * @category Lang
11890
     * @param {*} value The value to check.
11891
     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
11892
     * @example
11893
     *
11894
     * _.isNaN(NaN);
11895
     * // => true
11896
     *
11897
     * _.isNaN(new Number(NaN));
11898
     * // => true
11899
     *
11900
     * isNaN(undefined);
11901
     * // => true
11902
     *
11903
     * _.isNaN(undefined);
11904
     * // => false
11905
     */
11906
    function isNaN(value) {
11907
      // An `NaN` primitive is the only value that is not equal to itself.
11908
      // Perform the `toStringTag` check first to avoid errors with some
11909
      // ActiveX objects in IE.
11910
      return isNumber(value) && value != +value;
11911
    }
11912
11913
    /**
11914
     * Checks if `value` is a pristine native function.
11915
     *
11916
     * **Note:** This method can't reliably detect native functions in the presence
11917
     * of the core-js package because core-js circumvents this kind of detection.
11918
     * Despite multiple requests, the core-js maintainer has made it clear: any
11919
     * attempt to fix the detection will be obstructed. As a result, we're left
11920
     * with little choice but to throw an error. Unfortunately, this also affects
11921
     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
11922
     * which rely on core-js.
11923
     *
11924
     * @static
11925
     * @memberOf _
11926
     * @since 3.0.0
11927
     * @category Lang
11928
     * @param {*} value The value to check.
11929
     * @returns {boolean} Returns `true` if `value` is a native function,
11930
     *  else `false`.
11931
     * @example
11932
     *
11933
     * _.isNative(Array.prototype.push);
11934
     * // => true
11935
     *
11936
     * _.isNative(_);
11937
     * // => false
11938
     */
11939
    function isNative(value) {
11940
      if (isMaskable(value)) {
11941
        throw new Error(CORE_ERROR_TEXT);
11942
      }
11943
      return baseIsNative(value);
11944
    }
11945
11946
    /**
11947
     * Checks if `value` is `null`.
11948
     *
11949
     * @static
11950
     * @memberOf _
11951
     * @since 0.1.0
11952
     * @category Lang
11953
     * @param {*} value The value to check.
11954
     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
11955
     * @example
11956
     *
11957
     * _.isNull(null);
11958
     * // => true
11959
     *
11960
     * _.isNull(void 0);
11961
     * // => false
11962
     */
11963
    function isNull(value) {
11964
      return value === null;
11965
    }
11966
11967
    /**
11968
     * Checks if `value` is `null` or `undefined`.
11969
     *
11970
     * @static
11971
     * @memberOf _
11972
     * @since 4.0.0
11973
     * @category Lang
11974
     * @param {*} value The value to check.
11975
     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
11976
     * @example
11977
     *
11978
     * _.isNil(null);
11979
     * // => true
11980
     *
11981
     * _.isNil(void 0);
11982
     * // => true
11983
     *
11984
     * _.isNil(NaN);
11985
     * // => false
11986
     */
11987
    function isNil(value) {
11988
      return value == null;
11989
    }
11990
11991
    /**
11992
     * Checks if `value` is classified as a `Number` primitive or object.
11993
     *
11994
     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
11995
     * classified as numbers, use the `_.isFinite` method.
11996
     *
11997
     * @static
11998
     * @memberOf _
11999
     * @since 0.1.0
12000
     * @category Lang
12001
     * @param {*} value The value to check.
12002
     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
12003
     * @example
12004
     *
12005
     * _.isNumber(3);
12006
     * // => true
12007
     *
12008
     * _.isNumber(Number.MIN_VALUE);
12009
     * // => true
12010
     *
12011
     * _.isNumber(Infinity);
12012
     * // => true
12013
     *
12014
     * _.isNumber('3');
12015
     * // => false
12016
     */
12017
    function isNumber(value) {
12018
      return typeof value == 'number' ||
12019
        (isObjectLike(value) && baseGetTag(value) == numberTag);
12020
    }
12021
12022
    /**
12023
     * Checks if `value` is a plain object, that is, an object created by the
12024
     * `Object` constructor or one with a `[[Prototype]]` of `null`.
12025
     *
12026
     * @static
12027
     * @memberOf _
12028
     * @since 0.8.0
12029
     * @category Lang
12030
     * @param {*} value The value to check.
12031
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
12032
     * @example
12033
     *
12034
     * function Foo() {
12035
     *   this.a = 1;
12036
     * }
12037
     *
12038
     * _.isPlainObject(new Foo);
12039
     * // => false
12040
     *
12041
     * _.isPlainObject([1, 2, 3]);
12042
     * // => false
12043
     *
12044
     * _.isPlainObject({ 'x': 0, 'y': 0 });
12045
     * // => true
12046
     *
12047
     * _.isPlainObject(Object.create(null));
12048
     * // => true
12049
     */
12050
    function isPlainObject(value) {
12051
      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
12052
        return false;
12053
      }
12054
      var proto = getPrototype(value);
12055
      if (proto === null) {
12056
        return true;
12057
      }
12058
      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
12059
      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
12060
        funcToString.call(Ctor) == objectCtorString;
12061
    }
12062
12063
    /**
12064
     * Checks if `value` is classified as a `RegExp` object.
12065
     *
12066
     * @static
12067
     * @memberOf _
12068
     * @since 0.1.0
12069
     * @category Lang
12070
     * @param {*} value The value to check.
12071
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
12072
     * @example
12073
     *
12074
     * _.isRegExp(/abc/);
12075
     * // => true
12076
     *
12077
     * _.isRegExp('/abc/');
12078
     * // => false
12079
     */
12080
    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
12081
12082
    /**
12083
     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
12084
     * double precision number which isn't the result of a rounded unsafe integer.
12085
     *
12086
     * **Note:** This method is based on
12087
     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
12088
     *
12089
     * @static
12090
     * @memberOf _
12091
     * @since 4.0.0
12092
     * @category Lang
12093
     * @param {*} value The value to check.
12094
     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
12095
     * @example
12096
     *
12097
     * _.isSafeInteger(3);
12098
     * // => true
12099
     *
12100
     * _.isSafeInteger(Number.MIN_VALUE);
12101
     * // => false
12102
     *
12103
     * _.isSafeInteger(Infinity);
12104
     * // => false
12105
     *
12106
     * _.isSafeInteger('3');
12107
     * // => false
12108
     */
12109
    function isSafeInteger(value) {
12110
      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
12111
    }
12112
12113
    /**
12114
     * Checks if `value` is classified as a `Set` object.
12115
     *
12116
     * @static
12117
     * @memberOf _
12118
     * @since 4.3.0
12119
     * @category Lang
12120
     * @param {*} value The value to check.
12121
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
12122
     * @example
12123
     *
12124
     * _.isSet(new Set);
12125
     * // => true
12126
     *
12127
     * _.isSet(new WeakSet);
12128
     * // => false
12129
     */
12130
    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
12131
12132
    /**
12133
     * Checks if `value` is classified as a `String` primitive or object.
12134
     *
12135
     * @static
12136
     * @since 0.1.0
12137
     * @memberOf _
12138
     * @category Lang
12139
     * @param {*} value The value to check.
12140
     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
12141
     * @example
12142
     *
12143
     * _.isString('abc');
12144
     * // => true
12145
     *
12146
     * _.isString(1);
12147
     * // => false
12148
     */
12149
    function isString(value) {
12150
      return typeof value == 'string' ||
12151
        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
12152
    }
12153
12154
    /**
12155
     * Checks if `value` is classified as a `Symbol` primitive or object.
12156
     *
12157
     * @static
12158
     * @memberOf _
12159
     * @since 4.0.0
12160
     * @category Lang
12161
     * @param {*} value The value to check.
12162
     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
12163
     * @example
12164
     *
12165
     * _.isSymbol(Symbol.iterator);
12166
     * // => true
12167
     *
12168
     * _.isSymbol('abc');
12169
     * // => false
12170
     */
12171
    function isSymbol(value) {
12172
      return typeof value == 'symbol' ||
12173
        (isObjectLike(value) && baseGetTag(value) == symbolTag);
12174
    }
12175
12176
    /**
12177
     * Checks if `value` is classified as a typed array.
12178
     *
12179
     * @static
12180
     * @memberOf _
12181
     * @since 3.0.0
12182
     * @category Lang
12183
     * @param {*} value The value to check.
12184
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
12185
     * @example
12186
     *
12187
     * _.isTypedArray(new Uint8Array);
12188
     * // => true
12189
     *
12190
     * _.isTypedArray([]);
12191
     * // => false
12192
     */
12193
    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
12194
12195
    /**
12196
     * Checks if `value` is `undefined`.
12197
     *
12198
     * @static
12199
     * @since 0.1.0
12200
     * @memberOf _
12201
     * @category Lang
12202
     * @param {*} value The value to check.
12203
     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
12204
     * @example
12205
     *
12206
     * _.isUndefined(void 0);
12207
     * // => true
12208
     *
12209
     * _.isUndefined(null);
12210
     * // => false
12211
     */
12212
    function isUndefined(value) {
12213
      return value === undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
12214
    }
12215
12216
    /**
12217
     * Checks if `value` is classified as a `WeakMap` object.
12218
     *
12219
     * @static
12220
     * @memberOf _
12221
     * @since 4.3.0
12222
     * @category Lang
12223
     * @param {*} value The value to check.
12224
     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
12225
     * @example
12226
     *
12227
     * _.isWeakMap(new WeakMap);
12228
     * // => true
12229
     *
12230
     * _.isWeakMap(new Map);
12231
     * // => false
12232
     */
12233
    function isWeakMap(value) {
12234
      return isObjectLike(value) && getTag(value) == weakMapTag;
12235
    }
12236
12237
    /**
12238
     * Checks if `value` is classified as a `WeakSet` object.
12239
     *
12240
     * @static
12241
     * @memberOf _
12242
     * @since 4.3.0
12243
     * @category Lang
12244
     * @param {*} value The value to check.
12245
     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
12246
     * @example
12247
     *
12248
     * _.isWeakSet(new WeakSet);
12249
     * // => true
12250
     *
12251
     * _.isWeakSet(new Set);
12252
     * // => false
12253
     */
12254
    function isWeakSet(value) {
12255
      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
12256
    }
12257
12258
    /**
12259
     * Checks if `value` is less than `other`.
12260
     *
12261
     * @static
12262
     * @memberOf _
12263
     * @since 3.9.0
12264
     * @category Lang
12265
     * @param {*} value The value to compare.
12266
     * @param {*} other The other value to compare.
12267
     * @returns {boolean} Returns `true` if `value` is less than `other`,
12268
     *  else `false`.
12269
     * @see _.gt
12270
     * @example
12271
     *
12272
     * _.lt(1, 3);
12273
     * // => true
12274
     *
12275
     * _.lt(3, 3);
12276
     * // => false
12277
     *
12278
     * _.lt(3, 1);
12279
     * // => false
12280
     */
12281
    var lt = createRelationalOperation(baseLt);
12282
12283
    /**
12284
     * Checks if `value` is less than or equal to `other`.
12285
     *
12286
     * @static
12287
     * @memberOf _
12288
     * @since 3.9.0
12289
     * @category Lang
12290
     * @param {*} value The value to compare.
12291
     * @param {*} other The other value to compare.
12292
     * @returns {boolean} Returns `true` if `value` is less than or equal to
12293
     *  `other`, else `false`.
12294
     * @see _.gte
12295
     * @example
12296
     *
12297
     * _.lte(1, 3);
12298
     * // => true
12299
     *
12300
     * _.lte(3, 3);
12301
     * // => true
12302
     *
12303
     * _.lte(3, 1);
12304
     * // => false
12305
     */
12306
    var lte = createRelationalOperation(function(value, other) {
12307
      return value <= other;
12308
    });
12309
12310
    /**
12311
     * Converts `value` to an array.
12312
     *
12313
     * @static
12314
     * @since 0.1.0
12315
     * @memberOf _
12316
     * @category Lang
12317
     * @param {*} value The value to convert.
12318
     * @returns {Array} Returns the converted array.
12319
     * @example
12320
     *
12321
     * _.toArray({ 'a': 1, 'b': 2 });
12322
     * // => [1, 2]
12323
     *
12324
     * _.toArray('abc');
12325
     * // => ['a', 'b', 'c']
12326
     *
12327
     * _.toArray(1);
12328
     * // => []
12329
     *
12330
     * _.toArray(null);
12331
     * // => []
12332
     */
12333
    function toArray(value) {
12334
      if (!value) {
12335
        return [];
12336
      }
12337
      if (isArrayLike(value)) {
12338
        return isString(value) ? stringToArray(value) : copyArray(value);
12339
      }
12340
      if (symIterator && value[symIterator]) {
12341
        return iteratorToArray(value[symIterator]());
12342
      }
12343
      var tag = getTag(value),
12344
          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
12345
12346
      return func(value);
12347
    }
12348
12349
    /**
12350
     * Converts `value` to a finite number.
12351
     *
12352
     * @static
12353
     * @memberOf _
12354
     * @since 4.12.0
12355
     * @category Lang
12356
     * @param {*} value The value to convert.
12357
     * @returns {number} Returns the converted number.
12358
     * @example
12359
     *
12360
     * _.toFinite(3.2);
12361
     * // => 3.2
12362
     *
12363
     * _.toFinite(Number.MIN_VALUE);
12364
     * // => 5e-324
12365
     *
12366
     * _.toFinite(Infinity);
12367
     * // => 1.7976931348623157e+308
12368
     *
12369
     * _.toFinite('3.2');
12370
     * // => 3.2
12371
     */
12372
    function toFinite(value) {
12373
      if (!value) {
12374
        return value === 0 ? value : 0;
12375
      }
12376
      value = toNumber(value);
12377
      if (value === INFINITY || value === -INFINITY) {
12378
        var sign = (value < 0 ? -1 : 1);
12379
        return sign * MAX_INTEGER;
12380
      }
12381
      return value === value ? value : 0;
12382
    }
12383
12384
    /**
12385
     * Converts `value` to an integer.
12386
     *
12387
     * **Note:** This method is loosely based on
12388
     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
12389
     *
12390
     * @static
12391
     * @memberOf _
12392
     * @since 4.0.0
12393
     * @category Lang
12394
     * @param {*} value The value to convert.
12395
     * @returns {number} Returns the converted integer.
12396
     * @example
12397
     *
12398
     * _.toInteger(3.2);
12399
     * // => 3
12400
     *
12401
     * _.toInteger(Number.MIN_VALUE);
12402
     * // => 0
12403
     *
12404
     * _.toInteger(Infinity);
12405
     * // => 1.7976931348623157e+308
12406
     *
12407
     * _.toInteger('3.2');
12408
     * // => 3
12409
     */
12410
    function toInteger(value) {
12411
      var result = toFinite(value),
12412
          remainder = result % 1;
12413
12414
      return result === result ? (remainder ? result - remainder : result) : 0;
12415
    }
12416
12417
    /**
12418
     * Converts `value` to an integer suitable for use as the length of an
12419
     * array-like object.
12420
     *
12421
     * **Note:** This method is based on
12422
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
12423
     *
12424
     * @static
12425
     * @memberOf _
12426
     * @since 4.0.0
12427
     * @category Lang
12428
     * @param {*} value The value to convert.
12429
     * @returns {number} Returns the converted integer.
12430
     * @example
12431
     *
12432
     * _.toLength(3.2);
12433
     * // => 3
12434
     *
12435
     * _.toLength(Number.MIN_VALUE);
12436
     * // => 0
12437
     *
12438
     * _.toLength(Infinity);
12439
     * // => 4294967295
12440
     *
12441
     * _.toLength('3.2');
12442
     * // => 3
12443
     */
12444
    function toLength(value) {
12445
      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
12446
    }
12447
12448
    /**
12449
     * Converts `value` to a number.
12450
     *
12451
     * @static
12452
     * @memberOf _
12453
     * @since 4.0.0
12454
     * @category Lang
12455
     * @param {*} value The value to process.
12456
     * @returns {number} Returns the number.
12457
     * @example
12458
     *
12459
     * _.toNumber(3.2);
12460
     * // => 3.2
12461
     *
12462
     * _.toNumber(Number.MIN_VALUE);
12463
     * // => 5e-324
12464
     *
12465
     * _.toNumber(Infinity);
12466
     * // => Infinity
12467
     *
12468
     * _.toNumber('3.2');
12469
     * // => 3.2
12470
     */
12471
    function toNumber(value) {
12472
      if (typeof value == 'number') {
12473
        return value;
12474
      }
12475
      if (isSymbol(value)) {
12476
        return NAN;
12477
      }
12478
      if (isObject(value)) {
12479
        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
12480
        value = isObject(other) ? (other + '') : other;
12481
      }
12482
      if (typeof value != 'string') {
12483
        return value === 0 ? value : +value;
12484
      }
12485
      value = value.replace(reTrim, '');
12486
      var isBinary = reIsBinary.test(value);
12487
      return (isBinary || reIsOctal.test(value))
12488
        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
12489
        : (reIsBadHex.test(value) ? NAN : +value);
12490
    }
12491
12492
    /**
12493
     * Converts `value` to a plain object flattening inherited enumerable string
12494
     * keyed properties of `value` to own properties of the plain object.
12495
     *
12496
     * @static
12497
     * @memberOf _
12498
     * @since 3.0.0
12499
     * @category Lang
12500
     * @param {*} value The value to convert.
12501
     * @returns {Object} Returns the converted plain object.
12502
     * @example
12503
     *
12504
     * function Foo() {
12505
     *   this.b = 2;
12506
     * }
12507
     *
12508
     * Foo.prototype.c = 3;
12509
     *
12510
     * _.assign({ 'a': 1 }, new Foo);
12511
     * // => { 'a': 1, 'b': 2 }
12512
     *
12513
     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
12514
     * // => { 'a': 1, 'b': 2, 'c': 3 }
12515
     */
12516
    function toPlainObject(value) {
12517
      return copyObject(value, keysIn(value));
12518
    }
12519
12520
    /**
12521
     * Converts `value` to a safe integer. A safe integer can be compared and
12522
     * represented correctly.
12523
     *
12524
     * @static
12525
     * @memberOf _
12526
     * @since 4.0.0
12527
     * @category Lang
12528
     * @param {*} value The value to convert.
12529
     * @returns {number} Returns the converted integer.
12530
     * @example
12531
     *
12532
     * _.toSafeInteger(3.2);
12533
     * // => 3
12534
     *
12535
     * _.toSafeInteger(Number.MIN_VALUE);
12536
     * // => 0
12537
     *
12538
     * _.toSafeInteger(Infinity);
12539
     * // => 9007199254740991
12540
     *
12541
     * _.toSafeInteger('3.2');
12542
     * // => 3
12543
     */
12544
    function toSafeInteger(value) {
12545
      return value
12546
        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
12547
        : (value === 0 ? value : 0);
12548
    }
12549
12550
    /**
12551
     * Converts `value` to a string. An empty string is returned for `null`
12552
     * and `undefined` values. The sign of `-0` is preserved.
12553
     *
12554
     * @static
12555
     * @memberOf _
12556
     * @since 4.0.0
12557
     * @category Lang
12558
     * @param {*} value The value to convert.
12559
     * @returns {string} Returns the converted string.
12560
     * @example
12561
     *
12562
     * _.toString(null);
12563
     * // => ''
12564
     *
12565
     * _.toString(-0);
12566
     * // => '-0'
12567
     *
12568
     * _.toString([1, 2, 3]);
12569
     * // => '1,2,3'
12570
     */
12571
    function toString(value) {
12572
      return value == null ? '' : baseToString(value);
12573
    }
12574
12575
    /*------------------------------------------------------------------------*/
12576
12577
    /**
12578
     * Assigns own enumerable string keyed properties of source objects to the
12579
     * destination object. Source objects are applied from left to right.
12580
     * Subsequent sources overwrite property assignments of previous sources.
12581
     *
12582
     * **Note:** This method mutates `object` and is loosely based on
12583
     * [`Object.assign`](https://mdn.io/Object/assign).
12584
     *
12585
     * @static
12586
     * @memberOf _
12587
     * @since 0.10.0
12588
     * @category Object
12589
     * @param {Object} object The destination object.
12590
     * @param {...Object} [sources] The source objects.
12591
     * @returns {Object} Returns `object`.
12592
     * @see _.assignIn
12593
     * @example
12594
     *
12595
     * function Foo() {
12596
     *   this.a = 1;
12597
     * }
12598
     *
12599
     * function Bar() {
12600
     *   this.c = 3;
12601
     * }
12602
     *
12603
     * Foo.prototype.b = 2;
12604
     * Bar.prototype.d = 4;
12605
     *
12606
     * _.assign({ 'a': 0 }, new Foo, new Bar);
12607
     * // => { 'a': 1, 'c': 3 }
12608
     */
12609
    var assign = createAssigner(function(object, source) {
12610
      if (isPrototype(source) || isArrayLike(source)) {
12611
        copyObject(source, keys(source), object);
12612
        return;
12613
      }
12614
      for (var key in source) {
12615
        if (hasOwnProperty.call(source, key)) {
12616
          assignValue(object, key, source[key]);
12617
        }
12618
      }
12619
    });
12620
12621
    /**
12622
     * This method is like `_.assign` except that it iterates over own and
12623
     * inherited source properties.
12624
     *
12625
     * **Note:** This method mutates `object`.
12626
     *
12627
     * @static
12628
     * @memberOf _
12629
     * @since 4.0.0
12630
     * @alias extend
12631
     * @category Object
12632
     * @param {Object} object The destination object.
12633
     * @param {...Object} [sources] The source objects.
12634
     * @returns {Object} Returns `object`.
12635
     * @see _.assign
12636
     * @example
12637
     *
12638
     * function Foo() {
12639
     *   this.a = 1;
12640
     * }
12641
     *
12642
     * function Bar() {
12643
     *   this.c = 3;
12644
     * }
12645
     *
12646
     * Foo.prototype.b = 2;
12647
     * Bar.prototype.d = 4;
12648
     *
12649
     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
12650
     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
12651
     */
12652
    var assignIn = createAssigner(function(object, source) {
12653
      copyObject(source, keysIn(source), object);
12654
    });
12655
12656
    /**
12657
     * This method is like `_.assignIn` except that it accepts `customizer`
12658
     * which is invoked to produce the assigned values. If `customizer` returns
12659
     * `undefined`, assignment is handled by the method instead. The `customizer`
12660
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
12661
     *
12662
     * **Note:** This method mutates `object`.
12663
     *
12664
     * @static
12665
     * @memberOf _
12666
     * @since 4.0.0
12667
     * @alias extendWith
12668
     * @category Object
12669
     * @param {Object} object The destination object.
12670
     * @param {...Object} sources The source objects.
12671
     * @param {Function} [customizer] The function to customize assigned values.
12672
     * @returns {Object} Returns `object`.
12673
     * @see _.assignWith
12674
     * @example
12675
     *
12676
     * function customizer(objValue, srcValue) {
12677
     *   return _.isUndefined(objValue) ? srcValue : objValue;
12678
     * }
12679
     *
12680
     * var defaults = _.partialRight(_.assignInWith, customizer);
12681
     *
12682
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12683
     * // => { 'a': 1, 'b': 2 }
12684
     */
12685
    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
12686
      copyObject(source, keysIn(source), object, customizer);
12687
    });
12688
12689
    /**
12690
     * This method is like `_.assign` except that it accepts `customizer`
12691
     * which is invoked to produce the assigned values. If `customizer` returns
12692
     * `undefined`, assignment is handled by the method instead. The `customizer`
12693
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
12694
     *
12695
     * **Note:** This method mutates `object`.
12696
     *
12697
     * @static
12698
     * @memberOf _
12699
     * @since 4.0.0
12700
     * @category Object
12701
     * @param {Object} object The destination object.
12702
     * @param {...Object} sources The source objects.
12703
     * @param {Function} [customizer] The function to customize assigned values.
12704
     * @returns {Object} Returns `object`.
12705
     * @see _.assignInWith
12706
     * @example
12707
     *
12708
     * function customizer(objValue, srcValue) {
12709
     *   return _.isUndefined(objValue) ? srcValue : objValue;
12710
     * }
12711
     *
12712
     * var defaults = _.partialRight(_.assignWith, customizer);
12713
     *
12714
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12715
     * // => { 'a': 1, 'b': 2 }
12716
     */
12717
    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
12718
      copyObject(source, keys(source), object, customizer);
12719
    });
12720
12721
    /**
12722
     * Creates an array of values corresponding to `paths` of `object`.
12723
     *
12724
     * @static
12725
     * @memberOf _
12726
     * @since 1.0.0
12727
     * @category Object
12728
     * @param {Object} object The object to iterate over.
12729
     * @param {...(string|string[])} [paths] The property paths to pick.
12730
     * @returns {Array} Returns the picked values.
12731
     * @example
12732
     *
12733
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
12734
     *
12735
     * _.at(object, ['a[0].b.c', 'a[1]']);
12736
     * // => [3, 4]
12737
     */
12738
    var at = flatRest(baseAt);
12739
12740
    /**
12741
     * Creates an object that inherits from the `prototype` object. If a
12742
     * `properties` object is given, its own enumerable string keyed properties
12743
     * are assigned to the created object.
12744
     *
12745
     * @static
12746
     * @memberOf _
12747
     * @since 2.3.0
12748
     * @category Object
12749
     * @param {Object} prototype The object to inherit from.
12750
     * @param {Object} [properties] The properties to assign to the object.
12751
     * @returns {Object} Returns the new object.
12752
     * @example
12753
     *
12754
     * function Shape() {
12755
     *   this.x = 0;
12756
     *   this.y = 0;
12757
     * }
12758
     *
12759
     * function Circle() {
12760
     *   Shape.call(this);
12761
     * }
12762
     *
12763
     * Circle.prototype = _.create(Shape.prototype, {
12764
     *   'constructor': Circle
12765
     * });
12766
     *
12767
     * var circle = new Circle;
12768
     * circle instanceof Circle;
12769
     * // => true
12770
     *
12771
     * circle instanceof Shape;
12772
     * // => true
12773
     */
12774
    function create(prototype, properties) {
12775
      var result = baseCreate(prototype);
12776
      return properties == null ? result : baseAssign(result, properties);
12777
    }
12778
12779
    /**
12780
     * Assigns own and inherited enumerable string keyed properties of source
12781
     * objects to the destination object for all destination properties that
12782
     * resolve to `undefined`. Source objects are applied from left to right.
12783
     * Once a property is set, additional values of the same property are ignored.
12784
     *
12785
     * **Note:** This method mutates `object`.
12786
     *
12787
     * @static
12788
     * @since 0.1.0
12789
     * @memberOf _
12790
     * @category Object
12791
     * @param {Object} object The destination object.
12792
     * @param {...Object} [sources] The source objects.
12793
     * @returns {Object} Returns `object`.
12794
     * @see _.defaultsDeep
12795
     * @example
12796
     *
12797
     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12798
     * // => { 'a': 1, 'b': 2 }
12799
     */
12800
    var defaults = baseRest(function(args) {
12801
      args.push(undefined, customDefaultsAssignIn);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
12802
      return apply(assignInWith, undefined, args);
12803
    });
12804
12805
    /**
12806
     * This method is like `_.defaults` except that it recursively assigns
12807
     * default properties.
12808
     *
12809
     * **Note:** This method mutates `object`.
12810
     *
12811
     * @static
12812
     * @memberOf _
12813
     * @since 3.10.0
12814
     * @category Object
12815
     * @param {Object} object The destination object.
12816
     * @param {...Object} [sources] The source objects.
12817
     * @returns {Object} Returns `object`.
12818
     * @see _.defaults
12819
     * @example
12820
     *
12821
     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
12822
     * // => { 'a': { 'b': 2, 'c': 3 } }
12823
     */
12824
    var defaultsDeep = baseRest(function(args) {
12825
      args.push(undefined, customDefaultsMerge);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
12826
      return apply(mergeWith, undefined, args);
12827
    });
12828
12829
    /**
12830
     * This method is like `_.find` except that it returns the key of the first
12831
     * element `predicate` returns truthy for instead of the element itself.
12832
     *
12833
     * @static
12834
     * @memberOf _
12835
     * @since 1.1.0
12836
     * @category Object
12837
     * @param {Object} object The object to inspect.
12838
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
12839
     * @returns {string|undefined} Returns the key of the matched element,
12840
     *  else `undefined`.
12841
     * @example
12842
     *
12843
     * var users = {
12844
     *   'barney':  { 'age': 36, 'active': true },
12845
     *   'fred':    { 'age': 40, 'active': false },
12846
     *   'pebbles': { 'age': 1,  'active': true }
12847
     * };
12848
     *
12849
     * _.findKey(users, function(o) { return o.age < 40; });
12850
     * // => 'barney' (iteration order is not guaranteed)
12851
     *
12852
     * // The `_.matches` iteratee shorthand.
12853
     * _.findKey(users, { 'age': 1, 'active': true });
12854
     * // => 'pebbles'
12855
     *
12856
     * // The `_.matchesProperty` iteratee shorthand.
12857
     * _.findKey(users, ['active', false]);
12858
     * // => 'fred'
12859
     *
12860
     * // The `_.property` iteratee shorthand.
12861
     * _.findKey(users, 'active');
12862
     * // => 'barney'
12863
     */
12864
    function findKey(object, predicate) {
12865
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
12866
    }
12867
12868
    /**
12869
     * This method is like `_.findKey` except that it iterates over elements of
12870
     * a collection in the opposite order.
12871
     *
12872
     * @static
12873
     * @memberOf _
12874
     * @since 2.0.0
12875
     * @category Object
12876
     * @param {Object} object The object to inspect.
12877
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
12878
     * @returns {string|undefined} Returns the key of the matched element,
12879
     *  else `undefined`.
12880
     * @example
12881
     *
12882
     * var users = {
12883
     *   'barney':  { 'age': 36, 'active': true },
12884
     *   'fred':    { 'age': 40, 'active': false },
12885
     *   'pebbles': { 'age': 1,  'active': true }
12886
     * };
12887
     *
12888
     * _.findLastKey(users, function(o) { return o.age < 40; });
12889
     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
12890
     *
12891
     * // The `_.matches` iteratee shorthand.
12892
     * _.findLastKey(users, { 'age': 36, 'active': true });
12893
     * // => 'barney'
12894
     *
12895
     * // The `_.matchesProperty` iteratee shorthand.
12896
     * _.findLastKey(users, ['active', false]);
12897
     * // => 'fred'
12898
     *
12899
     * // The `_.property` iteratee shorthand.
12900
     * _.findLastKey(users, 'active');
12901
     * // => 'pebbles'
12902
     */
12903
    function findLastKey(object, predicate) {
12904
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
12905
    }
12906
12907
    /**
12908
     * Iterates over own and inherited enumerable string keyed properties of an
12909
     * object and invokes `iteratee` for each property. The iteratee is invoked
12910
     * with three arguments: (value, key, object). Iteratee functions may exit
12911
     * iteration early by explicitly returning `false`.
12912
     *
12913
     * @static
12914
     * @memberOf _
12915
     * @since 0.3.0
12916
     * @category Object
12917
     * @param {Object} object The object to iterate over.
12918
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12919
     * @returns {Object} Returns `object`.
12920
     * @see _.forInRight
12921
     * @example
12922
     *
12923
     * function Foo() {
12924
     *   this.a = 1;
12925
     *   this.b = 2;
12926
     * }
12927
     *
12928
     * Foo.prototype.c = 3;
12929
     *
12930
     * _.forIn(new Foo, function(value, key) {
12931
     *   console.log(key);
12932
     * });
12933
     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
12934
     */
12935
    function forIn(object, iteratee) {
12936
      return object == null
12937
        ? object
12938
        : baseFor(object, getIteratee(iteratee, 3), keysIn);
12939
    }
12940
12941
    /**
12942
     * This method is like `_.forIn` except that it iterates over properties of
12943
     * `object` in the opposite order.
12944
     *
12945
     * @static
12946
     * @memberOf _
12947
     * @since 2.0.0
12948
     * @category Object
12949
     * @param {Object} object The object to iterate over.
12950
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12951
     * @returns {Object} Returns `object`.
12952
     * @see _.forIn
12953
     * @example
12954
     *
12955
     * function Foo() {
12956
     *   this.a = 1;
12957
     *   this.b = 2;
12958
     * }
12959
     *
12960
     * Foo.prototype.c = 3;
12961
     *
12962
     * _.forInRight(new Foo, function(value, key) {
12963
     *   console.log(key);
12964
     * });
12965
     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
12966
     */
12967
    function forInRight(object, iteratee) {
12968
      return object == null
12969
        ? object
12970
        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
12971
    }
12972
12973
    /**
12974
     * Iterates over own enumerable string keyed properties of an object and
12975
     * invokes `iteratee` for each property. The iteratee is invoked with three
12976
     * arguments: (value, key, object). Iteratee functions may exit iteration
12977
     * early by explicitly returning `false`.
12978
     *
12979
     * @static
12980
     * @memberOf _
12981
     * @since 0.3.0
12982
     * @category Object
12983
     * @param {Object} object The object to iterate over.
12984
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12985
     * @returns {Object} Returns `object`.
12986
     * @see _.forOwnRight
12987
     * @example
12988
     *
12989
     * function Foo() {
12990
     *   this.a = 1;
12991
     *   this.b = 2;
12992
     * }
12993
     *
12994
     * Foo.prototype.c = 3;
12995
     *
12996
     * _.forOwn(new Foo, function(value, key) {
12997
     *   console.log(key);
12998
     * });
12999
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
13000
     */
13001
    function forOwn(object, iteratee) {
13002
      return object && baseForOwn(object, getIteratee(iteratee, 3));
13003
    }
13004
13005
    /**
13006
     * This method is like `_.forOwn` except that it iterates over properties of
13007
     * `object` in the opposite order.
13008
     *
13009
     * @static
13010
     * @memberOf _
13011
     * @since 2.0.0
13012
     * @category Object
13013
     * @param {Object} object The object to iterate over.
13014
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13015
     * @returns {Object} Returns `object`.
13016
     * @see _.forOwn
13017
     * @example
13018
     *
13019
     * function Foo() {
13020
     *   this.a = 1;
13021
     *   this.b = 2;
13022
     * }
13023
     *
13024
     * Foo.prototype.c = 3;
13025
     *
13026
     * _.forOwnRight(new Foo, function(value, key) {
13027
     *   console.log(key);
13028
     * });
13029
     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
13030
     */
13031
    function forOwnRight(object, iteratee) {
13032
      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
13033
    }
13034
13035
    /**
13036
     * Creates an array of function property names from own enumerable properties
13037
     * of `object`.
13038
     *
13039
     * @static
13040
     * @since 0.1.0
13041
     * @memberOf _
13042
     * @category Object
13043
     * @param {Object} object The object to inspect.
13044
     * @returns {Array} Returns the function names.
13045
     * @see _.functionsIn
13046
     * @example
13047
     *
13048
     * function Foo() {
13049
     *   this.a = _.constant('a');
13050
     *   this.b = _.constant('b');
13051
     * }
13052
     *
13053
     * Foo.prototype.c = _.constant('c');
13054
     *
13055
     * _.functions(new Foo);
13056
     * // => ['a', 'b']
13057
     */
13058
    function functions(object) {
13059
      return object == null ? [] : baseFunctions(object, keys(object));
13060
    }
13061
13062
    /**
13063
     * Creates an array of function property names from own and inherited
13064
     * enumerable properties of `object`.
13065
     *
13066
     * @static
13067
     * @memberOf _
13068
     * @since 4.0.0
13069
     * @category Object
13070
     * @param {Object} object The object to inspect.
13071
     * @returns {Array} Returns the function names.
13072
     * @see _.functions
13073
     * @example
13074
     *
13075
     * function Foo() {
13076
     *   this.a = _.constant('a');
13077
     *   this.b = _.constant('b');
13078
     * }
13079
     *
13080
     * Foo.prototype.c = _.constant('c');
13081
     *
13082
     * _.functionsIn(new Foo);
13083
     * // => ['a', 'b', 'c']
13084
     */
13085
    function functionsIn(object) {
13086
      return object == null ? [] : baseFunctions(object, keysIn(object));
13087
    }
13088
13089
    /**
13090
     * Gets the value at `path` of `object`. If the resolved value is
13091
     * `undefined`, the `defaultValue` is returned in its place.
13092
     *
13093
     * @static
13094
     * @memberOf _
13095
     * @since 3.7.0
13096
     * @category Object
13097
     * @param {Object} object The object to query.
13098
     * @param {Array|string} path The path of the property to get.
13099
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13100
     * @returns {*} Returns the resolved value.
13101
     * @example
13102
     *
13103
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13104
     *
13105
     * _.get(object, 'a[0].b.c');
13106
     * // => 3
13107
     *
13108
     * _.get(object, ['a', '0', 'b', 'c']);
13109
     * // => 3
13110
     *
13111
     * _.get(object, 'a.b.c', 'default');
13112
     * // => 'default'
13113
     */
13114
    function get(object, path, defaultValue) {
13115
      var result = object == null ? undefined : baseGet(object, path);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
13116
      return result === undefined ? defaultValue : result;
13117
    }
13118
13119
    /**
13120
     * Checks if `path` is a direct property of `object`.
13121
     *
13122
     * @static
13123
     * @since 0.1.0
13124
     * @memberOf _
13125
     * @category Object
13126
     * @param {Object} object The object to query.
13127
     * @param {Array|string} path The path to check.
13128
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
13129
     * @example
13130
     *
13131
     * var object = { 'a': { 'b': 2 } };
13132
     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
13133
     *
13134
     * _.has(object, 'a');
13135
     * // => true
13136
     *
13137
     * _.has(object, 'a.b');
13138
     * // => true
13139
     *
13140
     * _.has(object, ['a', 'b']);
13141
     * // => true
13142
     *
13143
     * _.has(other, 'a');
13144
     * // => false
13145
     */
13146
    function has(object, path) {
13147
      return object != null && hasPath(object, path, baseHas);
13148
    }
13149
13150
    /**
13151
     * Checks if `path` is a direct or inherited property of `object`.
13152
     *
13153
     * @static
13154
     * @memberOf _
13155
     * @since 4.0.0
13156
     * @category Object
13157
     * @param {Object} object The object to query.
13158
     * @param {Array|string} path The path to check.
13159
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
13160
     * @example
13161
     *
13162
     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
13163
     *
13164
     * _.hasIn(object, 'a');
13165
     * // => true
13166
     *
13167
     * _.hasIn(object, 'a.b');
13168
     * // => true
13169
     *
13170
     * _.hasIn(object, ['a', 'b']);
13171
     * // => true
13172
     *
13173
     * _.hasIn(object, 'b');
13174
     * // => false
13175
     */
13176
    function hasIn(object, path) {
13177
      return object != null && hasPath(object, path, baseHasIn);
13178
    }
13179
13180
    /**
13181
     * Creates an object composed of the inverted keys and values of `object`.
13182
     * If `object` contains duplicate values, subsequent values overwrite
13183
     * property assignments of previous values.
13184
     *
13185
     * @static
13186
     * @memberOf _
13187
     * @since 0.7.0
13188
     * @category Object
13189
     * @param {Object} object The object to invert.
13190
     * @returns {Object} Returns the new inverted object.
13191
     * @example
13192
     *
13193
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
13194
     *
13195
     * _.invert(object);
13196
     * // => { '1': 'c', '2': 'b' }
13197
     */
13198
    var invert = createInverter(function(result, value, key) {
13199
      result[value] = key;
13200
    }, constant(identity));
13201
13202
    /**
13203
     * This method is like `_.invert` except that the inverted object is generated
13204
     * from the results of running each element of `object` thru `iteratee`. The
13205
     * corresponding inverted value of each inverted key is an array of keys
13206
     * responsible for generating the inverted value. The iteratee is invoked
13207
     * with one argument: (value).
13208
     *
13209
     * @static
13210
     * @memberOf _
13211
     * @since 4.1.0
13212
     * @category Object
13213
     * @param {Object} object The object to invert.
13214
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
13215
     * @returns {Object} Returns the new inverted object.
13216
     * @example
13217
     *
13218
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
13219
     *
13220
     * _.invertBy(object);
13221
     * // => { '1': ['a', 'c'], '2': ['b'] }
13222
     *
13223
     * _.invertBy(object, function(value) {
13224
     *   return 'group' + value;
13225
     * });
13226
     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
13227
     */
13228
    var invertBy = createInverter(function(result, value, key) {
13229
      if (hasOwnProperty.call(result, value)) {
13230
        result[value].push(key);
13231
      } else {
13232
        result[value] = [key];
13233
      }
13234
    }, getIteratee);
13235
13236
    /**
13237
     * Invokes the method at `path` of `object`.
13238
     *
13239
     * @static
13240
     * @memberOf _
13241
     * @since 4.0.0
13242
     * @category Object
13243
     * @param {Object} object The object to query.
13244
     * @param {Array|string} path The path of the method to invoke.
13245
     * @param {...*} [args] The arguments to invoke the method with.
13246
     * @returns {*} Returns the result of the invoked method.
13247
     * @example
13248
     *
13249
     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
13250
     *
13251
     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
13252
     * // => [2, 3]
13253
     */
13254
    var invoke = baseRest(baseInvoke);
13255
13256
    /**
13257
     * Creates an array of the own enumerable property names of `object`.
13258
     *
13259
     * **Note:** Non-object values are coerced to objects. See the
13260
     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
13261
     * for more details.
13262
     *
13263
     * @static
13264
     * @since 0.1.0
13265
     * @memberOf _
13266
     * @category Object
13267
     * @param {Object} object The object to query.
13268
     * @returns {Array} Returns the array of property names.
13269
     * @example
13270
     *
13271
     * function Foo() {
13272
     *   this.a = 1;
13273
     *   this.b = 2;
13274
     * }
13275
     *
13276
     * Foo.prototype.c = 3;
13277
     *
13278
     * _.keys(new Foo);
13279
     * // => ['a', 'b'] (iteration order is not guaranteed)
13280
     *
13281
     * _.keys('hi');
13282
     * // => ['0', '1']
13283
     */
13284
    function keys(object) {
13285
      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
13286
    }
13287
13288
    /**
13289
     * Creates an array of the own and inherited enumerable property names of `object`.
13290
     *
13291
     * **Note:** Non-object values are coerced to objects.
13292
     *
13293
     * @static
13294
     * @memberOf _
13295
     * @since 3.0.0
13296
     * @category Object
13297
     * @param {Object} object The object to query.
13298
     * @returns {Array} Returns the array of property names.
13299
     * @example
13300
     *
13301
     * function Foo() {
13302
     *   this.a = 1;
13303
     *   this.b = 2;
13304
     * }
13305
     *
13306
     * Foo.prototype.c = 3;
13307
     *
13308
     * _.keysIn(new Foo);
13309
     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
13310
     */
13311
    function keysIn(object) {
13312
      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
13313
    }
13314
13315
    /**
13316
     * The opposite of `_.mapValues`; this method creates an object with the
13317
     * same values as `object` and keys generated by running each own enumerable
13318
     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
13319
     * with three arguments: (value, key, object).
13320
     *
13321
     * @static
13322
     * @memberOf _
13323
     * @since 3.8.0
13324
     * @category Object
13325
     * @param {Object} object The object to iterate over.
13326
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13327
     * @returns {Object} Returns the new mapped object.
13328
     * @see _.mapValues
13329
     * @example
13330
     *
13331
     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
13332
     *   return key + value;
13333
     * });
13334
     * // => { 'a1': 1, 'b2': 2 }
13335
     */
13336
    function mapKeys(object, iteratee) {
13337
      var result = {};
13338
      iteratee = getIteratee(iteratee, 3);
13339
13340
      baseForOwn(object, function(value, key, object) {
13341
        baseAssignValue(result, iteratee(value, key, object), value);
13342
      });
13343
      return result;
13344
    }
13345
13346
    /**
13347
     * Creates an object with the same keys as `object` and values generated
13348
     * by running each own enumerable string keyed property of `object` thru
13349
     * `iteratee`. The iteratee is invoked with three arguments:
13350
     * (value, key, object).
13351
     *
13352
     * @static
13353
     * @memberOf _
13354
     * @since 2.4.0
13355
     * @category Object
13356
     * @param {Object} object The object to iterate over.
13357
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13358
     * @returns {Object} Returns the new mapped object.
13359
     * @see _.mapKeys
13360
     * @example
13361
     *
13362
     * var users = {
13363
     *   'fred':    { 'user': 'fred',    'age': 40 },
13364
     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
13365
     * };
13366
     *
13367
     * _.mapValues(users, function(o) { return o.age; });
13368
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13369
     *
13370
     * // The `_.property` iteratee shorthand.
13371
     * _.mapValues(users, 'age');
13372
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13373
     */
13374
    function mapValues(object, iteratee) {
13375
      var result = {};
13376
      iteratee = getIteratee(iteratee, 3);
13377
13378
      baseForOwn(object, function(value, key, object) {
13379
        baseAssignValue(result, key, iteratee(value, key, object));
13380
      });
13381
      return result;
13382
    }
13383
13384
    /**
13385
     * This method is like `_.assign` except that it recursively merges own and
13386
     * inherited enumerable string keyed properties of source objects into the
13387
     * destination object. Source properties that resolve to `undefined` are
13388
     * skipped if a destination value exists. Array and plain object properties
13389
     * are merged recursively. Other objects and value types are overridden by
13390
     * assignment. Source objects are applied from left to right. Subsequent
13391
     * sources overwrite property assignments of previous sources.
13392
     *
13393
     * **Note:** This method mutates `object`.
13394
     *
13395
     * @static
13396
     * @memberOf _
13397
     * @since 0.5.0
13398
     * @category Object
13399
     * @param {Object} object The destination object.
13400
     * @param {...Object} [sources] The source objects.
13401
     * @returns {Object} Returns `object`.
13402
     * @example
13403
     *
13404
     * var object = {
13405
     *   'a': [{ 'b': 2 }, { 'd': 4 }]
13406
     * };
13407
     *
13408
     * var other = {
13409
     *   'a': [{ 'c': 3 }, { 'e': 5 }]
13410
     * };
13411
     *
13412
     * _.merge(object, other);
13413
     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
13414
     */
13415
    var merge = createAssigner(function(object, source, srcIndex) {
13416
      baseMerge(object, source, srcIndex);
13417
    });
13418
13419
    /**
13420
     * This method is like `_.merge` except that it accepts `customizer` which
13421
     * is invoked to produce the merged values of the destination and source
13422
     * properties. If `customizer` returns `undefined`, merging is handled by the
13423
     * method instead. The `customizer` is invoked with six arguments:
13424
     * (objValue, srcValue, key, object, source, stack).
13425
     *
13426
     * **Note:** This method mutates `object`.
13427
     *
13428
     * @static
13429
     * @memberOf _
13430
     * @since 4.0.0
13431
     * @category Object
13432
     * @param {Object} object The destination object.
13433
     * @param {...Object} sources The source objects.
13434
     * @param {Function} customizer The function to customize assigned values.
13435
     * @returns {Object} Returns `object`.
13436
     * @example
13437
     *
13438
     * function customizer(objValue, srcValue) {
13439
     *   if (_.isArray(objValue)) {
13440
     *     return objValue.concat(srcValue);
13441
     *   }
13442
     * }
13443
     *
13444
     * var object = { 'a': [1], 'b': [2] };
13445
     * var other = { 'a': [3], 'b': [4] };
13446
     *
13447
     * _.mergeWith(object, other, customizer);
13448
     * // => { 'a': [1, 3], 'b': [2, 4] }
13449
     */
13450
    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
13451
      baseMerge(object, source, srcIndex, customizer);
13452
    });
13453
13454
    /**
13455
     * The opposite of `_.pick`; this method creates an object composed of the
13456
     * own and inherited enumerable property paths of `object` that are not omitted.
13457
     *
13458
     * **Note:** This method is considerably slower than `_.pick`.
13459
     *
13460
     * @static
13461
     * @since 0.1.0
13462
     * @memberOf _
13463
     * @category Object
13464
     * @param {Object} object The source object.
13465
     * @param {...(string|string[])} [paths] The property paths to omit.
13466
     * @returns {Object} Returns the new object.
13467
     * @example
13468
     *
13469
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13470
     *
13471
     * _.omit(object, ['a', 'c']);
13472
     * // => { 'b': '2' }
13473
     */
13474
    var omit = flatRest(function(object, paths) {
13475
      var result = {};
13476
      if (object == null) {
13477
        return result;
13478
      }
13479
      var isDeep = false;
13480
      paths = arrayMap(paths, function(path) {
13481
        path = castPath(path, object);
13482
        isDeep || (isDeep = path.length > 1);
13483
        return path;
13484
      });
13485
      copyObject(object, getAllKeysIn(object), result);
13486
      if (isDeep) {
13487
        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
13488
      }
13489
      var length = paths.length;
13490
      while (length--) {
13491
        baseUnset(result, paths[length]);
13492
      }
13493
      return result;
13494
    });
13495
13496
    /**
13497
     * The opposite of `_.pickBy`; this method creates an object composed of
13498
     * the own and inherited enumerable string keyed properties of `object` that
13499
     * `predicate` doesn't return truthy for. The predicate is invoked with two
13500
     * arguments: (value, key).
13501
     *
13502
     * @static
13503
     * @memberOf _
13504
     * @since 4.0.0
13505
     * @category Object
13506
     * @param {Object} object The source object.
13507
     * @param {Function} [predicate=_.identity] The function invoked per property.
13508
     * @returns {Object} Returns the new object.
13509
     * @example
13510
     *
13511
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13512
     *
13513
     * _.omitBy(object, _.isNumber);
13514
     * // => { 'b': '2' }
13515
     */
13516
    function omitBy(object, predicate) {
13517
      return pickBy(object, negate(getIteratee(predicate)));
13518
    }
13519
13520
    /**
13521
     * Creates an object composed of the picked `object` properties.
13522
     *
13523
     * @static
13524
     * @since 0.1.0
13525
     * @memberOf _
13526
     * @category Object
13527
     * @param {Object} object The source object.
13528
     * @param {...(string|string[])} [paths] The property paths to pick.
13529
     * @returns {Object} Returns the new object.
13530
     * @example
13531
     *
13532
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13533
     *
13534
     * _.pick(object, ['a', 'c']);
13535
     * // => { 'a': 1, 'c': 3 }
13536
     */
13537
    var pick = flatRest(function(object, paths) {
13538
      return object == null ? {} : basePick(object, paths);
13539
    });
13540
13541
    /**
13542
     * Creates an object composed of the `object` properties `predicate` returns
13543
     * truthy for. The predicate is invoked with two arguments: (value, key).
13544
     *
13545
     * @static
13546
     * @memberOf _
13547
     * @since 4.0.0
13548
     * @category Object
13549
     * @param {Object} object The source object.
13550
     * @param {Function} [predicate=_.identity] The function invoked per property.
13551
     * @returns {Object} Returns the new object.
13552
     * @example
13553
     *
13554
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13555
     *
13556
     * _.pickBy(object, _.isNumber);
13557
     * // => { 'a': 1, 'c': 3 }
13558
     */
13559
    function pickBy(object, predicate) {
13560
      if (object == null) {
13561
        return {};
13562
      }
13563
      var props = arrayMap(getAllKeysIn(object), function(prop) {
13564
        return [prop];
13565
      });
13566
      predicate = getIteratee(predicate);
13567
      return basePickBy(object, props, function(value, path) {
13568
        return predicate(value, path[0]);
13569
      });
13570
    }
13571
13572
    /**
13573
     * This method is like `_.get` except that if the resolved value is a
13574
     * function it's invoked with the `this` binding of its parent object and
13575
     * its result is returned.
13576
     *
13577
     * @static
13578
     * @since 0.1.0
13579
     * @memberOf _
13580
     * @category Object
13581
     * @param {Object} object The object to query.
13582
     * @param {Array|string} path The path of the property to resolve.
13583
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13584
     * @returns {*} Returns the resolved value.
13585
     * @example
13586
     *
13587
     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
13588
     *
13589
     * _.result(object, 'a[0].b.c1');
13590
     * // => 3
13591
     *
13592
     * _.result(object, 'a[0].b.c2');
13593
     * // => 4
13594
     *
13595
     * _.result(object, 'a[0].b.c3', 'default');
13596
     * // => 'default'
13597
     *
13598
     * _.result(object, 'a[0].b.c3', _.constant('default'));
13599
     * // => 'default'
13600
     */
13601
    function result(object, path, defaultValue) {
13602
      path = castPath(path, object);
13603
13604
      var index = -1,
13605
          length = path.length;
13606
13607
      // Ensure the loop is entered when path is empty.
13608
      if (!length) {
13609
        length = 1;
13610
        object = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
13611
      }
13612
      while (++index < length) {
13613
        var value = object == null ? undefined : object[toKey(path[index])];
13614
        if (value === undefined) {
13615
          index = length;
13616
          value = defaultValue;
13617
        }
13618
        object = isFunction(value) ? value.call(object) : value;
13619
      }
13620
      return object;
13621
    }
13622
13623
    /**
13624
     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
13625
     * it's created. Arrays are created for missing index properties while objects
13626
     * are created for all other missing properties. Use `_.setWith` to customize
13627
     * `path` creation.
13628
     *
13629
     * **Note:** This method mutates `object`.
13630
     *
13631
     * @static
13632
     * @memberOf _
13633
     * @since 3.7.0
13634
     * @category Object
13635
     * @param {Object} object The object to modify.
13636
     * @param {Array|string} path The path of the property to set.
13637
     * @param {*} value The value to set.
13638
     * @returns {Object} Returns `object`.
13639
     * @example
13640
     *
13641
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13642
     *
13643
     * _.set(object, 'a[0].b.c', 4);
13644
     * console.log(object.a[0].b.c);
13645
     * // => 4
13646
     *
13647
     * _.set(object, ['x', '0', 'y', 'z'], 5);
13648
     * console.log(object.x[0].y.z);
13649
     * // => 5
13650
     */
13651
    function set(object, path, value) {
13652
      return object == null ? object : baseSet(object, path, value);
13653
    }
13654
13655
    /**
13656
     * This method is like `_.set` except that it accepts `customizer` which is
13657
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13658
     * path creation is handled by the method instead. The `customizer` is invoked
13659
     * with three arguments: (nsValue, key, nsObject).
13660
     *
13661
     * **Note:** This method mutates `object`.
13662
     *
13663
     * @static
13664
     * @memberOf _
13665
     * @since 4.0.0
13666
     * @category Object
13667
     * @param {Object} object The object to modify.
13668
     * @param {Array|string} path The path of the property to set.
13669
     * @param {*} value The value to set.
13670
     * @param {Function} [customizer] The function to customize assigned values.
13671
     * @returns {Object} Returns `object`.
13672
     * @example
13673
     *
13674
     * var object = {};
13675
     *
13676
     * _.setWith(object, '[0][1]', 'a', Object);
13677
     * // => { '0': { '1': 'a' } }
13678
     */
13679
    function setWith(object, path, value, customizer) {
13680
      customizer = typeof customizer == 'function' ? customizer : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
13681
      return object == null ? object : baseSet(object, path, value, customizer);
13682
    }
13683
13684
    /**
13685
     * Creates an array of own enumerable string keyed-value pairs for `object`
13686
     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
13687
     * entries are returned.
13688
     *
13689
     * @static
13690
     * @memberOf _
13691
     * @since 4.0.0
13692
     * @alias entries
13693
     * @category Object
13694
     * @param {Object} object The object to query.
13695
     * @returns {Array} Returns the key-value pairs.
13696
     * @example
13697
     *
13698
     * function Foo() {
13699
     *   this.a = 1;
13700
     *   this.b = 2;
13701
     * }
13702
     *
13703
     * Foo.prototype.c = 3;
13704
     *
13705
     * _.toPairs(new Foo);
13706
     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
13707
     */
13708
    var toPairs = createToPairs(keys);
13709
13710
    /**
13711
     * Creates an array of own and inherited enumerable string keyed-value pairs
13712
     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
13713
     * or set, its entries are returned.
13714
     *
13715
     * @static
13716
     * @memberOf _
13717
     * @since 4.0.0
13718
     * @alias entriesIn
13719
     * @category Object
13720
     * @param {Object} object The object to query.
13721
     * @returns {Array} Returns the key-value pairs.
13722
     * @example
13723
     *
13724
     * function Foo() {
13725
     *   this.a = 1;
13726
     *   this.b = 2;
13727
     * }
13728
     *
13729
     * Foo.prototype.c = 3;
13730
     *
13731
     * _.toPairsIn(new Foo);
13732
     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
13733
     */
13734
    var toPairsIn = createToPairs(keysIn);
13735
13736
    /**
13737
     * An alternative to `_.reduce`; this method transforms `object` to a new
13738
     * `accumulator` object which is the result of running each of its own
13739
     * enumerable string keyed properties thru `iteratee`, with each invocation
13740
     * potentially mutating the `accumulator` object. If `accumulator` is not
13741
     * provided, a new object with the same `[[Prototype]]` will be used. The
13742
     * iteratee is invoked with four arguments: (accumulator, value, key, object).
13743
     * Iteratee functions may exit iteration early by explicitly returning `false`.
13744
     *
13745
     * @static
13746
     * @memberOf _
13747
     * @since 1.3.0
13748
     * @category Object
13749
     * @param {Object} object The object to iterate over.
13750
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13751
     * @param {*} [accumulator] The custom accumulator value.
13752
     * @returns {*} Returns the accumulated value.
13753
     * @example
13754
     *
13755
     * _.transform([2, 3, 4], function(result, n) {
13756
     *   result.push(n *= n);
13757
     *   return n % 2 == 0;
13758
     * }, []);
13759
     * // => [4, 9]
13760
     *
13761
     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
13762
     *   (result[value] || (result[value] = [])).push(key);
13763
     * }, {});
13764
     * // => { '1': ['a', 'c'], '2': ['b'] }
13765
     */
13766
    function transform(object, iteratee, accumulator) {
13767
      var isArr = isArray(object),
13768
          isArrLike = isArr || isBuffer(object) || isTypedArray(object);
13769
13770
      iteratee = getIteratee(iteratee, 4);
13771
      if (accumulator == null) {
13772
        var Ctor = object && object.constructor;
13773
        if (isArrLike) {
13774
          accumulator = isArr ? new Ctor : [];
13775
        }
13776
        else if (isObject(object)) {
13777
          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
13778
        }
13779
        else {
13780
          accumulator = {};
13781
        }
13782
      }
13783
      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
13784
        return iteratee(accumulator, value, index, object);
13785
      });
13786
      return accumulator;
13787
    }
13788
13789
    /**
13790
     * Removes the property at `path` of `object`.
13791
     *
13792
     * **Note:** This method mutates `object`.
13793
     *
13794
     * @static
13795
     * @memberOf _
13796
     * @since 4.0.0
13797
     * @category Object
13798
     * @param {Object} object The object to modify.
13799
     * @param {Array|string} path The path of the property to unset.
13800
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
13801
     * @example
13802
     *
13803
     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
13804
     * _.unset(object, 'a[0].b.c');
13805
     * // => true
13806
     *
13807
     * console.log(object);
13808
     * // => { 'a': [{ 'b': {} }] };
13809
     *
13810
     * _.unset(object, ['a', '0', 'b', 'c']);
13811
     * // => true
13812
     *
13813
     * console.log(object);
13814
     * // => { 'a': [{ 'b': {} }] };
13815
     */
13816
    function unset(object, path) {
13817
      return object == null ? true : baseUnset(object, path);
13818
    }
13819
13820
    /**
13821
     * This method is like `_.set` except that accepts `updater` to produce the
13822
     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
13823
     * is invoked with one argument: (value).
13824
     *
13825
     * **Note:** This method mutates `object`.
13826
     *
13827
     * @static
13828
     * @memberOf _
13829
     * @since 4.6.0
13830
     * @category Object
13831
     * @param {Object} object The object to modify.
13832
     * @param {Array|string} path The path of the property to set.
13833
     * @param {Function} updater The function to produce the updated value.
13834
     * @returns {Object} Returns `object`.
13835
     * @example
13836
     *
13837
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13838
     *
13839
     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
13840
     * console.log(object.a[0].b.c);
13841
     * // => 9
13842
     *
13843
     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
13844
     * console.log(object.x[0].y.z);
13845
     * // => 0
13846
     */
13847
    function update(object, path, updater) {
13848
      return object == null ? object : baseUpdate(object, path, castFunction(updater));
13849
    }
13850
13851
    /**
13852
     * This method is like `_.update` except that it accepts `customizer` which is
13853
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13854
     * path creation is handled by the method instead. The `customizer` is invoked
13855
     * with three arguments: (nsValue, key, nsObject).
13856
     *
13857
     * **Note:** This method mutates `object`.
13858
     *
13859
     * @static
13860
     * @memberOf _
13861
     * @since 4.6.0
13862
     * @category Object
13863
     * @param {Object} object The object to modify.
13864
     * @param {Array|string} path The path of the property to set.
13865
     * @param {Function} updater The function to produce the updated value.
13866
     * @param {Function} [customizer] The function to customize assigned values.
13867
     * @returns {Object} Returns `object`.
13868
     * @example
13869
     *
13870
     * var object = {};
13871
     *
13872
     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
13873
     * // => { '0': { '1': 'a' } }
13874
     */
13875
    function updateWith(object, path, updater, customizer) {
13876
      customizer = typeof customizer == 'function' ? customizer : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
13877
      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
13878
    }
13879
13880
    /**
13881
     * Creates an array of the own enumerable string keyed property values of `object`.
13882
     *
13883
     * **Note:** Non-object values are coerced to objects.
13884
     *
13885
     * @static
13886
     * @since 0.1.0
13887
     * @memberOf _
13888
     * @category Object
13889
     * @param {Object} object The object to query.
13890
     * @returns {Array} Returns the array of property values.
13891
     * @example
13892
     *
13893
     * function Foo() {
13894
     *   this.a = 1;
13895
     *   this.b = 2;
13896
     * }
13897
     *
13898
     * Foo.prototype.c = 3;
13899
     *
13900
     * _.values(new Foo);
13901
     * // => [1, 2] (iteration order is not guaranteed)
13902
     *
13903
     * _.values('hi');
13904
     * // => ['h', 'i']
13905
     */
13906
    function values(object) {
13907
      return object == null ? [] : baseValues(object, keys(object));
13908
    }
13909
13910
    /**
13911
     * Creates an array of the own and inherited enumerable string keyed property
13912
     * values of `object`.
13913
     *
13914
     * **Note:** Non-object values are coerced to objects.
13915
     *
13916
     * @static
13917
     * @memberOf _
13918
     * @since 3.0.0
13919
     * @category Object
13920
     * @param {Object} object The object to query.
13921
     * @returns {Array} Returns the array of property values.
13922
     * @example
13923
     *
13924
     * function Foo() {
13925
     *   this.a = 1;
13926
     *   this.b = 2;
13927
     * }
13928
     *
13929
     * Foo.prototype.c = 3;
13930
     *
13931
     * _.valuesIn(new Foo);
13932
     * // => [1, 2, 3] (iteration order is not guaranteed)
13933
     */
13934
    function valuesIn(object) {
13935
      return object == null ? [] : baseValues(object, keysIn(object));
13936
    }
13937
13938
    /*------------------------------------------------------------------------*/
13939
13940
    /**
13941
     * Clamps `number` within the inclusive `lower` and `upper` bounds.
13942
     *
13943
     * @static
13944
     * @memberOf _
13945
     * @since 4.0.0
13946
     * @category Number
13947
     * @param {number} number The number to clamp.
13948
     * @param {number} [lower] The lower bound.
13949
     * @param {number} upper The upper bound.
13950
     * @returns {number} Returns the clamped number.
13951
     * @example
13952
     *
13953
     * _.clamp(-10, -5, 5);
13954
     * // => -5
13955
     *
13956
     * _.clamp(10, -5, 5);
13957
     * // => 5
13958
     */
13959
    function clamp(number, lower, upper) {
13960
      if (upper === undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
13961
        upper = lower;
13962
        lower = undefined;
13963
      }
13964
      if (upper !== undefined) {
13965
        upper = toNumber(upper);
13966
        upper = upper === upper ? upper : 0;
13967
      }
13968
      if (lower !== undefined) {
13969
        lower = toNumber(lower);
13970
        lower = lower === lower ? lower : 0;
13971
      }
13972
      return baseClamp(toNumber(number), lower, upper);
13973
    }
13974
13975
    /**
13976
     * Checks if `n` is between `start` and up to, but not including, `end`. If
13977
     * `end` is not specified, it's set to `start` with `start` then set to `0`.
13978
     * If `start` is greater than `end` the params are swapped to support
13979
     * negative ranges.
13980
     *
13981
     * @static
13982
     * @memberOf _
13983
     * @since 3.3.0
13984
     * @category Number
13985
     * @param {number} number The number to check.
13986
     * @param {number} [start=0] The start of the range.
13987
     * @param {number} end The end of the range.
13988
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
13989
     * @see _.range, _.rangeRight
13990
     * @example
13991
     *
13992
     * _.inRange(3, 2, 4);
13993
     * // => true
13994
     *
13995
     * _.inRange(4, 8);
13996
     * // => true
13997
     *
13998
     * _.inRange(4, 2);
13999
     * // => false
14000
     *
14001
     * _.inRange(2, 2);
14002
     * // => false
14003
     *
14004
     * _.inRange(1.2, 2);
14005
     * // => true
14006
     *
14007
     * _.inRange(5.2, 4);
14008
     * // => false
14009
     *
14010
     * _.inRange(-3, -2, -6);
14011
     * // => true
14012
     */
14013
    function inRange(number, start, end) {
14014
      start = toFinite(start);
14015
      if (end === undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14016
        end = start;
14017
        start = 0;
14018
      } else {
14019
        end = toFinite(end);
14020
      }
14021
      number = toNumber(number);
14022
      return baseInRange(number, start, end);
14023
    }
14024
14025
    /**
14026
     * Produces a random number between the inclusive `lower` and `upper` bounds.
14027
     * If only one argument is provided a number between `0` and the given number
14028
     * is returned. If `floating` is `true`, or either `lower` or `upper` are
14029
     * floats, a floating-point number is returned instead of an integer.
14030
     *
14031
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
14032
     * floating-point values which can produce unexpected results.
14033
     *
14034
     * @static
14035
     * @memberOf _
14036
     * @since 0.7.0
14037
     * @category Number
14038
     * @param {number} [lower=0] The lower bound.
14039
     * @param {number} [upper=1] The upper bound.
14040
     * @param {boolean} [floating] Specify returning a floating-point number.
14041
     * @returns {number} Returns the random number.
14042
     * @example
14043
     *
14044
     * _.random(0, 5);
14045
     * // => an integer between 0 and 5
14046
     *
14047
     * _.random(5);
14048
     * // => also an integer between 0 and 5
14049
     *
14050
     * _.random(5, true);
14051
     * // => a floating-point number between 0 and 5
14052
     *
14053
     * _.random(1.2, 5.2);
14054
     * // => a floating-point number between 1.2 and 5.2
14055
     */
14056
    function random(lower, upper, floating) {
14057
      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
14058
        upper = floating = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14059
      }
14060
      if (floating === undefined) {
14061
        if (typeof upper == 'boolean') {
14062
          floating = upper;
14063
          upper = undefined;
14064
        }
14065
        else if (typeof lower == 'boolean') {
14066
          floating = lower;
14067
          lower = undefined;
14068
        }
14069
      }
14070
      if (lower === undefined && upper === undefined) {
14071
        lower = 0;
14072
        upper = 1;
14073
      }
14074
      else {
14075
        lower = toFinite(lower);
14076
        if (upper === undefined) {
14077
          upper = lower;
14078
          lower = 0;
14079
        } else {
14080
          upper = toFinite(upper);
14081
        }
14082
      }
14083
      if (lower > upper) {
14084
        var temp = lower;
14085
        lower = upper;
14086
        upper = temp;
14087
      }
14088
      if (floating || lower % 1 || upper % 1) {
14089
        var rand = nativeRandom();
14090
        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
14091
      }
14092
      return baseRandom(lower, upper);
14093
    }
14094
14095
    /*------------------------------------------------------------------------*/
14096
14097
    /**
14098
     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
14099
     *
14100
     * @static
14101
     * @memberOf _
14102
     * @since 3.0.0
14103
     * @category String
14104
     * @param {string} [string=''] The string to convert.
14105
     * @returns {string} Returns the camel cased string.
14106
     * @example
14107
     *
14108
     * _.camelCase('Foo Bar');
14109
     * // => 'fooBar'
14110
     *
14111
     * _.camelCase('--foo-bar--');
14112
     * // => 'fooBar'
14113
     *
14114
     * _.camelCase('__FOO_BAR__');
14115
     * // => 'fooBar'
14116
     */
14117
    var camelCase = createCompounder(function(result, word, index) {
14118
      word = word.toLowerCase();
14119
      return result + (index ? capitalize(word) : word);
14120
    });
14121
14122
    /**
14123
     * Converts the first character of `string` to upper case and the remaining
14124
     * to lower case.
14125
     *
14126
     * @static
14127
     * @memberOf _
14128
     * @since 3.0.0
14129
     * @category String
14130
     * @param {string} [string=''] The string to capitalize.
14131
     * @returns {string} Returns the capitalized string.
14132
     * @example
14133
     *
14134
     * _.capitalize('FRED');
14135
     * // => 'Fred'
14136
     */
14137
    function capitalize(string) {
14138
      return upperFirst(toString(string).toLowerCase());
14139
    }
14140
14141
    /**
14142
     * Deburrs `string` by converting
14143
     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
14144
     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
14145
     * letters to basic Latin letters and removing
14146
     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
14147
     *
14148
     * @static
14149
     * @memberOf _
14150
     * @since 3.0.0
14151
     * @category String
14152
     * @param {string} [string=''] The string to deburr.
14153
     * @returns {string} Returns the deburred string.
14154
     * @example
14155
     *
14156
     * _.deburr('déjà vu');
14157
     * // => 'deja vu'
14158
     */
14159
    function deburr(string) {
14160
      string = toString(string);
14161
      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
14162
    }
14163
14164
    /**
14165
     * Checks if `string` ends with the given target string.
14166
     *
14167
     * @static
14168
     * @memberOf _
14169
     * @since 3.0.0
14170
     * @category String
14171
     * @param {string} [string=''] The string to inspect.
14172
     * @param {string} [target] The string to search for.
14173
     * @param {number} [position=string.length] The position to search up to.
14174
     * @returns {boolean} Returns `true` if `string` ends with `target`,
14175
     *  else `false`.
14176
     * @example
14177
     *
14178
     * _.endsWith('abc', 'c');
14179
     * // => true
14180
     *
14181
     * _.endsWith('abc', 'b');
14182
     * // => false
14183
     *
14184
     * _.endsWith('abc', 'b', 2);
14185
     * // => true
14186
     */
14187
    function endsWith(string, target, position) {
14188
      string = toString(string);
14189
      target = baseToString(target);
14190
14191
      var length = string.length;
14192
      position = position === undefined
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14193
        ? length
14194
        : baseClamp(toInteger(position), 0, length);
14195
14196
      var end = position;
14197
      position -= target.length;
14198
      return position >= 0 && string.slice(position, end) == target;
14199
    }
14200
14201
    /**
14202
     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
14203
     * corresponding HTML entities.
14204
     *
14205
     * **Note:** No other characters are escaped. To escape additional
14206
     * characters use a third-party library like [_he_](https://mths.be/he).
14207
     *
14208
     * Though the ">" character is escaped for symmetry, characters like
14209
     * ">" and "/" don't need escaping in HTML and have no special meaning
14210
     * unless they're part of a tag or unquoted attribute value. See
14211
     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
14212
     * (under "semi-related fun fact") for more details.
14213
     *
14214
     * When working with HTML you should always
14215
     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
14216
     * XSS vectors.
14217
     *
14218
     * @static
14219
     * @since 0.1.0
14220
     * @memberOf _
14221
     * @category String
14222
     * @param {string} [string=''] The string to escape.
14223
     * @returns {string} Returns the escaped string.
14224
     * @example
14225
     *
14226
     * _.escape('fred, barney, & pebbles');
14227
     * // => 'fred, barney, &amp; pebbles'
14228
     */
14229
    function escape(string) {
14230
      string = toString(string);
14231
      return (string && reHasUnescapedHtml.test(string))
14232
        ? string.replace(reUnescapedHtml, escapeHtmlChar)
14233
        : string;
14234
    }
14235
14236
    /**
14237
     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
14238
     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
14239
     *
14240
     * @static
14241
     * @memberOf _
14242
     * @since 3.0.0
14243
     * @category String
14244
     * @param {string} [string=''] The string to escape.
14245
     * @returns {string} Returns the escaped string.
14246
     * @example
14247
     *
14248
     * _.escapeRegExp('[lodash](https://lodash.com/)');
14249
     * // => '\[lodash\]\(https://lodash\.com/\)'
14250
     */
14251
    function escapeRegExp(string) {
14252
      string = toString(string);
14253
      return (string && reHasRegExpChar.test(string))
14254
        ? string.replace(reRegExpChar, '\\$&')
14255
        : string;
14256
    }
14257
14258
    /**
14259
     * Converts `string` to
14260
     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
14261
     *
14262
     * @static
14263
     * @memberOf _
14264
     * @since 3.0.0
14265
     * @category String
14266
     * @param {string} [string=''] The string to convert.
14267
     * @returns {string} Returns the kebab cased string.
14268
     * @example
14269
     *
14270
     * _.kebabCase('Foo Bar');
14271
     * // => 'foo-bar'
14272
     *
14273
     * _.kebabCase('fooBar');
14274
     * // => 'foo-bar'
14275
     *
14276
     * _.kebabCase('__FOO_BAR__');
14277
     * // => 'foo-bar'
14278
     */
14279
    var kebabCase = createCompounder(function(result, word, index) {
14280
      return result + (index ? '-' : '') + word.toLowerCase();
14281
    });
14282
14283
    /**
14284
     * Converts `string`, as space separated words, to lower case.
14285
     *
14286
     * @static
14287
     * @memberOf _
14288
     * @since 4.0.0
14289
     * @category String
14290
     * @param {string} [string=''] The string to convert.
14291
     * @returns {string} Returns the lower cased string.
14292
     * @example
14293
     *
14294
     * _.lowerCase('--Foo-Bar--');
14295
     * // => 'foo bar'
14296
     *
14297
     * _.lowerCase('fooBar');
14298
     * // => 'foo bar'
14299
     *
14300
     * _.lowerCase('__FOO_BAR__');
14301
     * // => 'foo bar'
14302
     */
14303
    var lowerCase = createCompounder(function(result, word, index) {
14304
      return result + (index ? ' ' : '') + word.toLowerCase();
14305
    });
14306
14307
    /**
14308
     * Converts the first character of `string` to lower case.
14309
     *
14310
     * @static
14311
     * @memberOf _
14312
     * @since 4.0.0
14313
     * @category String
14314
     * @param {string} [string=''] The string to convert.
14315
     * @returns {string} Returns the converted string.
14316
     * @example
14317
     *
14318
     * _.lowerFirst('Fred');
14319
     * // => 'fred'
14320
     *
14321
     * _.lowerFirst('FRED');
14322
     * // => 'fRED'
14323
     */
14324
    var lowerFirst = createCaseFirst('toLowerCase');
14325
14326
    /**
14327
     * Pads `string` on the left and right sides if it's shorter than `length`.
14328
     * Padding characters are truncated if they can't be evenly divided by `length`.
14329
     *
14330
     * @static
14331
     * @memberOf _
14332
     * @since 3.0.0
14333
     * @category String
14334
     * @param {string} [string=''] The string to pad.
14335
     * @param {number} [length=0] The padding length.
14336
     * @param {string} [chars=' '] The string used as padding.
14337
     * @returns {string} Returns the padded string.
14338
     * @example
14339
     *
14340
     * _.pad('abc', 8);
14341
     * // => '  abc   '
14342
     *
14343
     * _.pad('abc', 8, '_-');
14344
     * // => '_-abc_-_'
14345
     *
14346
     * _.pad('abc', 3);
14347
     * // => 'abc'
14348
     */
14349
    function pad(string, length, chars) {
14350
      string = toString(string);
14351
      length = toInteger(length);
14352
14353
      var strLength = length ? stringSize(string) : 0;
14354
      if (!length || strLength >= length) {
14355
        return string;
14356
      }
14357
      var mid = (length - strLength) / 2;
14358
      return (
14359
        createPadding(nativeFloor(mid), chars) +
14360
        string +
14361
        createPadding(nativeCeil(mid), chars)
14362
      );
14363
    }
14364
14365
    /**
14366
     * Pads `string` on the right side if it's shorter than `length`. Padding
14367
     * characters are truncated if they exceed `length`.
14368
     *
14369
     * @static
14370
     * @memberOf _
14371
     * @since 4.0.0
14372
     * @category String
14373
     * @param {string} [string=''] The string to pad.
14374
     * @param {number} [length=0] The padding length.
14375
     * @param {string} [chars=' '] The string used as padding.
14376
     * @returns {string} Returns the padded string.
14377
     * @example
14378
     *
14379
     * _.padEnd('abc', 6);
14380
     * // => 'abc   '
14381
     *
14382
     * _.padEnd('abc', 6, '_-');
14383
     * // => 'abc_-_'
14384
     *
14385
     * _.padEnd('abc', 3);
14386
     * // => 'abc'
14387
     */
14388
    function padEnd(string, length, chars) {
14389
      string = toString(string);
14390
      length = toInteger(length);
14391
14392
      var strLength = length ? stringSize(string) : 0;
14393
      return (length && strLength < length)
14394
        ? (string + createPadding(length - strLength, chars))
14395
        : string;
14396
    }
14397
14398
    /**
14399
     * Pads `string` on the left side if it's shorter than `length`. Padding
14400
     * characters are truncated if they exceed `length`.
14401
     *
14402
     * @static
14403
     * @memberOf _
14404
     * @since 4.0.0
14405
     * @category String
14406
     * @param {string} [string=''] The string to pad.
14407
     * @param {number} [length=0] The padding length.
14408
     * @param {string} [chars=' '] The string used as padding.
14409
     * @returns {string} Returns the padded string.
14410
     * @example
14411
     *
14412
     * _.padStart('abc', 6);
14413
     * // => '   abc'
14414
     *
14415
     * _.padStart('abc', 6, '_-');
14416
     * // => '_-_abc'
14417
     *
14418
     * _.padStart('abc', 3);
14419
     * // => 'abc'
14420
     */
14421
    function padStart(string, length, chars) {
14422
      string = toString(string);
14423
      length = toInteger(length);
14424
14425
      var strLength = length ? stringSize(string) : 0;
14426
      return (length && strLength < length)
14427
        ? (createPadding(length - strLength, chars) + string)
14428
        : string;
14429
    }
14430
14431
    /**
14432
     * Converts `string` to an integer of the specified radix. If `radix` is
14433
     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
14434
     * hexadecimal, in which case a `radix` of `16` is used.
14435
     *
14436
     * **Note:** This method aligns with the
14437
     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
14438
     *
14439
     * @static
14440
     * @memberOf _
14441
     * @since 1.1.0
14442
     * @category String
14443
     * @param {string} string The string to convert.
14444
     * @param {number} [radix=10] The radix to interpret `value` by.
14445
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14446
     * @returns {number} Returns the converted integer.
14447
     * @example
14448
     *
14449
     * _.parseInt('08');
14450
     * // => 8
14451
     *
14452
     * _.map(['6', '08', '10'], _.parseInt);
14453
     * // => [6, 8, 10]
14454
     */
14455
    function parseInt(string, radix, guard) {
14456
      if (guard || radix == null) {
14457
        radix = 0;
14458
      } else if (radix) {
14459
        radix = +radix;
14460
      }
14461
      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
14462
    }
14463
14464
    /**
14465
     * Repeats the given string `n` times.
14466
     *
14467
     * @static
14468
     * @memberOf _
14469
     * @since 3.0.0
14470
     * @category String
14471
     * @param {string} [string=''] The string to repeat.
14472
     * @param {number} [n=1] The number of times to repeat the string.
14473
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14474
     * @returns {string} Returns the repeated string.
14475
     * @example
14476
     *
14477
     * _.repeat('*', 3);
14478
     * // => '***'
14479
     *
14480
     * _.repeat('abc', 2);
14481
     * // => 'abcabc'
14482
     *
14483
     * _.repeat('abc', 0);
14484
     * // => ''
14485
     */
14486
    function repeat(string, n, guard) {
14487
      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14488
        n = 1;
14489
      } else {
14490
        n = toInteger(n);
14491
      }
14492
      return baseRepeat(toString(string), n);
14493
    }
14494
14495
    /**
14496
     * Replaces matches for `pattern` in `string` with `replacement`.
14497
     *
14498
     * **Note:** This method is based on
14499
     * [`String#replace`](https://mdn.io/String/replace).
14500
     *
14501
     * @static
14502
     * @memberOf _
14503
     * @since 4.0.0
14504
     * @category String
14505
     * @param {string} [string=''] The string to modify.
14506
     * @param {RegExp|string} pattern The pattern to replace.
14507
     * @param {Function|string} replacement The match replacement.
14508
     * @returns {string} Returns the modified string.
14509
     * @example
14510
     *
14511
     * _.replace('Hi Fred', 'Fred', 'Barney');
14512
     * // => 'Hi Barney'
14513
     */
14514
    function replace() {
14515
      var args = arguments,
14516
          string = toString(args[0]);
14517
14518
      return args.length < 3 ? string : string.replace(args[1], args[2]);
14519
    }
14520
14521
    /**
14522
     * Converts `string` to
14523
     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
14524
     *
14525
     * @static
14526
     * @memberOf _
14527
     * @since 3.0.0
14528
     * @category String
14529
     * @param {string} [string=''] The string to convert.
14530
     * @returns {string} Returns the snake cased string.
14531
     * @example
14532
     *
14533
     * _.snakeCase('Foo Bar');
14534
     * // => 'foo_bar'
14535
     *
14536
     * _.snakeCase('fooBar');
14537
     * // => 'foo_bar'
14538
     *
14539
     * _.snakeCase('--FOO-BAR--');
14540
     * // => 'foo_bar'
14541
     */
14542
    var snakeCase = createCompounder(function(result, word, index) {
14543
      return result + (index ? '_' : '') + word.toLowerCase();
14544
    });
14545
14546
    /**
14547
     * Splits `string` by `separator`.
14548
     *
14549
     * **Note:** This method is based on
14550
     * [`String#split`](https://mdn.io/String/split).
14551
     *
14552
     * @static
14553
     * @memberOf _
14554
     * @since 4.0.0
14555
     * @category String
14556
     * @param {string} [string=''] The string to split.
14557
     * @param {RegExp|string} separator The separator pattern to split by.
14558
     * @param {number} [limit] The length to truncate results to.
14559
     * @returns {Array} Returns the string segments.
14560
     * @example
14561
     *
14562
     * _.split('a-b-c', '-', 2);
14563
     * // => ['a', 'b']
14564
     */
14565
    function split(string, separator, limit) {
14566
      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
14567
        separator = limit = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14568
      }
14569
      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
14570
      if (!limit) {
14571
        return [];
14572
      }
14573
      string = toString(string);
14574
      if (string && (
14575
            typeof separator == 'string' ||
14576
            (separator != null && !isRegExp(separator))
14577
          )) {
14578
        separator = baseToString(separator);
14579
        if (!separator && hasUnicode(string)) {
14580
          return castSlice(stringToArray(string), 0, limit);
14581
        }
14582
      }
14583
      return string.split(separator, limit);
14584
    }
14585
14586
    /**
14587
     * Converts `string` to
14588
     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
14589
     *
14590
     * @static
14591
     * @memberOf _
14592
     * @since 3.1.0
14593
     * @category String
14594
     * @param {string} [string=''] The string to convert.
14595
     * @returns {string} Returns the start cased string.
14596
     * @example
14597
     *
14598
     * _.startCase('--foo-bar--');
14599
     * // => 'Foo Bar'
14600
     *
14601
     * _.startCase('fooBar');
14602
     * // => 'Foo Bar'
14603
     *
14604
     * _.startCase('__FOO_BAR__');
14605
     * // => 'FOO BAR'
14606
     */
14607
    var startCase = createCompounder(function(result, word, index) {
14608
      return result + (index ? ' ' : '') + upperFirst(word);
14609
    });
14610
14611
    /**
14612
     * Checks if `string` starts with the given target string.
14613
     *
14614
     * @static
14615
     * @memberOf _
14616
     * @since 3.0.0
14617
     * @category String
14618
     * @param {string} [string=''] The string to inspect.
14619
     * @param {string} [target] The string to search for.
14620
     * @param {number} [position=0] The position to search from.
14621
     * @returns {boolean} Returns `true` if `string` starts with `target`,
14622
     *  else `false`.
14623
     * @example
14624
     *
14625
     * _.startsWith('abc', 'a');
14626
     * // => true
14627
     *
14628
     * _.startsWith('abc', 'b');
14629
     * // => false
14630
     *
14631
     * _.startsWith('abc', 'b', 1);
14632
     * // => true
14633
     */
14634
    function startsWith(string, target, position) {
14635
      string = toString(string);
14636
      position = position == null
14637
        ? 0
14638
        : baseClamp(toInteger(position), 0, string.length);
14639
14640
      target = baseToString(target);
14641
      return string.slice(position, position + target.length) == target;
14642
    }
14643
14644
    /**
14645
     * Creates a compiled template function that can interpolate data properties
14646
     * in "interpolate" delimiters, HTML-escape interpolated data properties in
14647
     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
14648
     * properties may be accessed as free variables in the template. If a setting
14649
     * object is given, it takes precedence over `_.templateSettings` values.
14650
     *
14651
     * **Note:** In the development build `_.template` utilizes
14652
     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
14653
     * for easier debugging.
14654
     *
14655
     * For more information on precompiling templates see
14656
     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
14657
     *
14658
     * For more information on Chrome extension sandboxes see
14659
     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
14660
     *
14661
     * @static
14662
     * @since 0.1.0
14663
     * @memberOf _
14664
     * @category String
14665
     * @param {string} [string=''] The template string.
14666
     * @param {Object} [options={}] The options object.
14667
     * @param {RegExp} [options.escape=_.templateSettings.escape]
14668
     *  The HTML "escape" delimiter.
14669
     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
14670
     *  The "evaluate" delimiter.
14671
     * @param {Object} [options.imports=_.templateSettings.imports]
14672
     *  An object to import into the template as free variables.
14673
     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
14674
     *  The "interpolate" delimiter.
14675
     * @param {string} [options.sourceURL='lodash.templateSources[n]']
14676
     *  The sourceURL of the compiled template.
14677
     * @param {string} [options.variable='obj']
14678
     *  The data object variable name.
14679
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14680
     * @returns {Function} Returns the compiled template function.
14681
     * @example
14682
     *
14683
     * // Use the "interpolate" delimiter to create a compiled template.
14684
     * var compiled = _.template('hello <%= user %>!');
14685
     * compiled({ 'user': 'fred' });
14686
     * // => 'hello fred!'
14687
     *
14688
     * // Use the HTML "escape" delimiter to escape data property values.
14689
     * var compiled = _.template('<b><%- value %></b>');
14690
     * compiled({ 'value': '<script>' });
14691
     * // => '<b>&lt;script&gt;</b>'
14692
     *
14693
     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
14694
     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
14695
     * compiled({ 'users': ['fred', 'barney'] });
14696
     * // => '<li>fred</li><li>barney</li>'
14697
     *
14698
     * // Use the internal `print` function in "evaluate" delimiters.
14699
     * var compiled = _.template('<% print("hello " + user); %>!');
14700
     * compiled({ 'user': 'barney' });
14701
     * // => 'hello barney!'
14702
     *
14703
     * // Use the ES template literal delimiter as an "interpolate" delimiter.
14704
     * // Disable support by replacing the "interpolate" delimiter.
14705
     * var compiled = _.template('hello ${ user }!');
14706
     * compiled({ 'user': 'pebbles' });
14707
     * // => 'hello pebbles!'
14708
     *
14709
     * // Use backslashes to treat delimiters as plain text.
14710
     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
14711
     * compiled({ 'value': 'ignored' });
14712
     * // => '<%- value %>'
14713
     *
14714
     * // Use the `imports` option to import `jQuery` as `jq`.
14715
     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
14716
     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
14717
     * compiled({ 'users': ['fred', 'barney'] });
14718
     * // => '<li>fred</li><li>barney</li>'
14719
     *
14720
     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
14721
     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
14722
     * compiled(data);
14723
     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
14724
     *
14725
     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
14726
     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
14727
     * compiled.source;
14728
     * // => function(data) {
14729
     * //   var __t, __p = '';
14730
     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
14731
     * //   return __p;
14732
     * // }
14733
     *
14734
     * // Use custom template delimiters.
14735
     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
14736
     * var compiled = _.template('hello {{ user }}!');
14737
     * compiled({ 'user': 'mustache' });
14738
     * // => 'hello mustache!'
14739
     *
14740
     * // Use the `source` property to inline compiled templates for meaningful
14741
     * // line numbers in error messages and stack traces.
14742
     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
14743
     *   var JST = {\
14744
     *     "main": ' + _.template(mainText).source + '\
14745
     *   };\
14746
     * ');
14747
     */
14748
    function template(string, options, guard) {
14749
      // Based on John Resig's `tmpl` implementation
14750
      // (http://ejohn.org/blog/javascript-micro-templating/)
14751
      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
14752
      var settings = lodash.templateSettings;
14753
14754
      if (guard && isIterateeCall(string, options, guard)) {
14755
        options = undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14756
      }
14757
      string = toString(string);
14758
      options = assignInWith({}, options, settings, customDefaultsAssignIn);
14759
14760
      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
14761
          importsKeys = keys(imports),
14762
          importsValues = baseValues(imports, importsKeys);
14763
14764
      var isEscaping,
14765
          isEvaluating,
14766
          index = 0,
14767
          interpolate = options.interpolate || reNoMatch,
14768
          source = "__p += '";
14769
14770
      // Compile the regexp to match each delimiter.
14771
      var reDelimiters = RegExp(
14772
        (options.escape || reNoMatch).source + '|' +
14773
        interpolate.source + '|' +
14774
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
14775
        (options.evaluate || reNoMatch).source + '|$'
14776
      , 'g');
14777
14778
      // Use a sourceURL for easier debugging.
14779
      var sourceURL = '//# sourceURL=' +
14780
        ('sourceURL' in options
14781
          ? options.sourceURL
14782
          : ('lodash.templateSources[' + (++templateCounter) + ']')
14783
        ) + '\n';
14784
14785
      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
14786
        interpolateValue || (interpolateValue = esTemplateValue);
14787
14788
        // Escape characters that can't be included in string literals.
14789
        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
14790
14791
        // Replace delimiters with snippets.
14792
        if (escapeValue) {
14793
          isEscaping = true;
14794
          source += "' +\n__e(" + escapeValue + ") +\n'";
14795
        }
14796
        if (evaluateValue) {
14797
          isEvaluating = true;
14798
          source += "';\n" + evaluateValue + ";\n__p += '";
14799
        }
14800
        if (interpolateValue) {
14801
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
14802
        }
14803
        index = offset + match.length;
14804
14805
        // The JS engine embedded in Adobe products needs `match` returned in
14806
        // order to produce the correct `offset` value.
14807
        return match;
14808
      });
14809
14810
      source += "';\n";
14811
14812
      // If `variable` is not specified wrap a with-statement around the generated
14813
      // code to add the data object to the top of the scope chain.
14814
      var variable = options.variable;
14815
      if (!variable) {
14816
        source = 'with (obj) {\n' + source + '\n}\n';
14817
      }
14818
      // Cleanup code by stripping empty strings.
14819
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
14820
        .replace(reEmptyStringMiddle, '$1')
14821
        .replace(reEmptyStringTrailing, '$1;');
14822
14823
      // Frame code as the function body.
14824
      source = 'function(' + (variable || 'obj') + ') {\n' +
14825
        (variable
14826
          ? ''
14827
          : 'obj || (obj = {});\n'
14828
        ) +
14829
        "var __t, __p = ''" +
14830
        (isEscaping
14831
           ? ', __e = _.escape'
14832
           : ''
14833
        ) +
14834
        (isEvaluating
14835
          ? ', __j = Array.prototype.join;\n' +
14836
            "function print() { __p += __j.call(arguments, '') }\n"
14837
          : ';\n'
14838
        ) +
14839
        source +
14840
        'return __p\n}';
14841
14842
      var result = attempt(function() {
14843
        return Function(importsKeys, sourceURL + 'return ' + source)
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
14844
          .apply(undefined, importsValues);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14845
      });
14846
14847
      // Provide the compiled function's source by its `toString` method or
14848
      // the `source` property as a convenience for inlining compiled templates.
14849
      result.source = source;
14850
      if (isError(result)) {
14851
        throw result;
14852
      }
14853
      return result;
14854
    }
14855
14856
    /**
14857
     * Converts `string`, as a whole, to lower case just like
14858
     * [String#toLowerCase](https://mdn.io/toLowerCase).
14859
     *
14860
     * @static
14861
     * @memberOf _
14862
     * @since 4.0.0
14863
     * @category String
14864
     * @param {string} [string=''] The string to convert.
14865
     * @returns {string} Returns the lower cased string.
14866
     * @example
14867
     *
14868
     * _.toLower('--Foo-Bar--');
14869
     * // => '--foo-bar--'
14870
     *
14871
     * _.toLower('fooBar');
14872
     * // => 'foobar'
14873
     *
14874
     * _.toLower('__FOO_BAR__');
14875
     * // => '__foo_bar__'
14876
     */
14877
    function toLower(value) {
14878
      return toString(value).toLowerCase();
14879
    }
14880
14881
    /**
14882
     * Converts `string`, as a whole, to upper case just like
14883
     * [String#toUpperCase](https://mdn.io/toUpperCase).
14884
     *
14885
     * @static
14886
     * @memberOf _
14887
     * @since 4.0.0
14888
     * @category String
14889
     * @param {string} [string=''] The string to convert.
14890
     * @returns {string} Returns the upper cased string.
14891
     * @example
14892
     *
14893
     * _.toUpper('--foo-bar--');
14894
     * // => '--FOO-BAR--'
14895
     *
14896
     * _.toUpper('fooBar');
14897
     * // => 'FOOBAR'
14898
     *
14899
     * _.toUpper('__foo_bar__');
14900
     * // => '__FOO_BAR__'
14901
     */
14902
    function toUpper(value) {
14903
      return toString(value).toUpperCase();
14904
    }
14905
14906
    /**
14907
     * Removes leading and trailing whitespace or specified characters from `string`.
14908
     *
14909
     * @static
14910
     * @memberOf _
14911
     * @since 3.0.0
14912
     * @category String
14913
     * @param {string} [string=''] The string to trim.
14914
     * @param {string} [chars=whitespace] The characters to trim.
14915
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14916
     * @returns {string} Returns the trimmed string.
14917
     * @example
14918
     *
14919
     * _.trim('  abc  ');
14920
     * // => 'abc'
14921
     *
14922
     * _.trim('-_-abc-_-', '_-');
14923
     * // => 'abc'
14924
     *
14925
     * _.map(['  foo  ', '  bar  '], _.trim);
14926
     * // => ['foo', 'bar']
14927
     */
14928
    function trim(string, chars, guard) {
14929
      string = toString(string);
14930
      if (string && (guard || chars === undefined)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14931
        return string.replace(reTrim, '');
14932
      }
14933
      if (!string || !(chars = baseToString(chars))) {
14934
        return string;
14935
      }
14936
      var strSymbols = stringToArray(string),
14937
          chrSymbols = stringToArray(chars),
14938
          start = charsStartIndex(strSymbols, chrSymbols),
14939
          end = charsEndIndex(strSymbols, chrSymbols) + 1;
14940
14941
      return castSlice(strSymbols, start, end).join('');
14942
    }
14943
14944
    /**
14945
     * Removes trailing whitespace or specified characters from `string`.
14946
     *
14947
     * @static
14948
     * @memberOf _
14949
     * @since 4.0.0
14950
     * @category String
14951
     * @param {string} [string=''] The string to trim.
14952
     * @param {string} [chars=whitespace] The characters to trim.
14953
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14954
     * @returns {string} Returns the trimmed string.
14955
     * @example
14956
     *
14957
     * _.trimEnd('  abc  ');
14958
     * // => '  abc'
14959
     *
14960
     * _.trimEnd('-_-abc-_-', '_-');
14961
     * // => '-_-abc'
14962
     */
14963
    function trimEnd(string, chars, guard) {
14964
      string = toString(string);
14965
      if (string && (guard || chars === undefined)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14966
        return string.replace(reTrimEnd, '');
14967
      }
14968
      if (!string || !(chars = baseToString(chars))) {
14969
        return string;
14970
      }
14971
      var strSymbols = stringToArray(string),
14972
          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
14973
14974
      return castSlice(strSymbols, 0, end).join('');
14975
    }
14976
14977
    /**
14978
     * Removes leading whitespace or specified characters from `string`.
14979
     *
14980
     * @static
14981
     * @memberOf _
14982
     * @since 4.0.0
14983
     * @category String
14984
     * @param {string} [string=''] The string to trim.
14985
     * @param {string} [chars=whitespace] The characters to trim.
14986
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14987
     * @returns {string} Returns the trimmed string.
14988
     * @example
14989
     *
14990
     * _.trimStart('  abc  ');
14991
     * // => 'abc  '
14992
     *
14993
     * _.trimStart('-_-abc-_-', '_-');
14994
     * // => 'abc-_-'
14995
     */
14996
    function trimStart(string, chars, guard) {
14997
      string = toString(string);
14998
      if (string && (guard || chars === undefined)) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
14999
        return string.replace(reTrimStart, '');
15000
      }
15001
      if (!string || !(chars = baseToString(chars))) {
15002
        return string;
15003
      }
15004
      var strSymbols = stringToArray(string),
15005
          start = charsStartIndex(strSymbols, stringToArray(chars));
15006
15007
      return castSlice(strSymbols, start).join('');
15008
    }
15009
15010
    /**
15011
     * Truncates `string` if it's longer than the given maximum string length.
15012
     * The last characters of the truncated string are replaced with the omission
15013
     * string which defaults to "...".
15014
     *
15015
     * @static
15016
     * @memberOf _
15017
     * @since 4.0.0
15018
     * @category String
15019
     * @param {string} [string=''] The string to truncate.
15020
     * @param {Object} [options={}] The options object.
15021
     * @param {number} [options.length=30] The maximum string length.
15022
     * @param {string} [options.omission='...'] The string to indicate text is omitted.
15023
     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
15024
     * @returns {string} Returns the truncated string.
15025
     * @example
15026
     *
15027
     * _.truncate('hi-diddly-ho there, neighborino');
15028
     * // => 'hi-diddly-ho there, neighbo...'
15029
     *
15030
     * _.truncate('hi-diddly-ho there, neighborino', {
15031
     *   'length': 24,
15032
     *   'separator': ' '
15033
     * });
15034
     * // => 'hi-diddly-ho there,...'
15035
     *
15036
     * _.truncate('hi-diddly-ho there, neighborino', {
15037
     *   'length': 24,
15038
     *   'separator': /,? +/
15039
     * });
15040
     * // => 'hi-diddly-ho there...'
15041
     *
15042
     * _.truncate('hi-diddly-ho there, neighborino', {
15043
     *   'omission': ' [...]'
15044
     * });
15045
     * // => 'hi-diddly-ho there, neig [...]'
15046
     */
15047
    function truncate(string, options) {
15048
      var length = DEFAULT_TRUNC_LENGTH,
15049
          omission = DEFAULT_TRUNC_OMISSION;
15050
15051
      if (isObject(options)) {
15052
        var separator = 'separator' in options ? options.separator : separator;
0 ignored issues
show
Bug introduced by
The variable separator seems to be never initialized.
Loading history...
15053
        length = 'length' in options ? toInteger(options.length) : length;
15054
        omission = 'omission' in options ? baseToString(options.omission) : omission;
15055
      }
15056
      string = toString(string);
15057
15058
      var strLength = string.length;
15059
      if (hasUnicode(string)) {
15060
        var strSymbols = stringToArray(string);
15061
        strLength = strSymbols.length;
15062
      }
15063
      if (length >= strLength) {
15064
        return string;
15065
      }
15066
      var end = length - stringSize(omission);
15067
      if (end < 1) {
15068
        return omission;
15069
      }
15070
      var result = strSymbols
15071
        ? castSlice(strSymbols, 0, end).join('')
15072
        : string.slice(0, end);
15073
15074
      if (separator === undefined) {
0 ignored issues
show
Bug introduced by
The variable separator does not seem to be initialized in case isObject(options) on line 15051 is false. Are you sure this can never be the case?
Loading history...
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
15075
        return result + omission;
15076
      }
15077
      if (strSymbols) {
15078
        end += (result.length - end);
15079
      }
15080
      if (isRegExp(separator)) {
15081
        if (string.slice(end).search(separator)) {
15082
          var match,
15083
              substring = result;
15084
15085
          if (!separator.global) {
15086
            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
15087
          }
15088
          separator.lastIndex = 0;
15089
          while ((match = separator.exec(substring))) {
15090
            var newEnd = match.index;
15091
          }
15092
          result = result.slice(0, newEnd === undefined ? end : newEnd);
0 ignored issues
show
Comprehensibility Bug introduced by
The variable newEnd does not seem to be initialized in case the while loop on line 15089 is not entered. Are you sure this can never be the case?
Loading history...
15093
        }
15094
      } else if (string.indexOf(baseToString(separator), end) != end) {
15095
        var index = result.lastIndexOf(separator);
15096
        if (index > -1) {
15097
          result = result.slice(0, index);
15098
        }
15099
      }
15100
      return result + omission;
15101
    }
15102
15103
    /**
15104
     * The inverse of `_.escape`; this method converts the HTML entities
15105
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
15106
     * their corresponding characters.
15107
     *
15108
     * **Note:** No other HTML entities are unescaped. To unescape additional
15109
     * HTML entities use a third-party library like [_he_](https://mths.be/he).
15110
     *
15111
     * @static
15112
     * @memberOf _
15113
     * @since 0.6.0
15114
     * @category String
15115
     * @param {string} [string=''] The string to unescape.
15116
     * @returns {string} Returns the unescaped string.
15117
     * @example
15118
     *
15119
     * _.unescape('fred, barney, &amp; pebbles');
15120
     * // => 'fred, barney, & pebbles'
15121
     */
15122
    function unescape(string) {
15123
      string = toString(string);
15124
      return (string && reHasEscapedHtml.test(string))
15125
        ? string.replace(reEscapedHtml, unescapeHtmlChar)
15126
        : string;
15127
    }
15128
15129
    /**
15130
     * Converts `string`, as space separated words, to upper case.
15131
     *
15132
     * @static
15133
     * @memberOf _
15134
     * @since 4.0.0
15135
     * @category String
15136
     * @param {string} [string=''] The string to convert.
15137
     * @returns {string} Returns the upper cased string.
15138
     * @example
15139
     *
15140
     * _.upperCase('--foo-bar');
15141
     * // => 'FOO BAR'
15142
     *
15143
     * _.upperCase('fooBar');
15144
     * // => 'FOO BAR'
15145
     *
15146
     * _.upperCase('__foo_bar__');
15147
     * // => 'FOO BAR'
15148
     */
15149
    var upperCase = createCompounder(function(result, word, index) {
15150
      return result + (index ? ' ' : '') + word.toUpperCase();
15151
    });
15152
15153
    /**
15154
     * Converts the first character of `string` to upper case.
15155
     *
15156
     * @static
15157
     * @memberOf _
15158
     * @since 4.0.0
15159
     * @category String
15160
     * @param {string} [string=''] The string to convert.
15161
     * @returns {string} Returns the converted string.
15162
     * @example
15163
     *
15164
     * _.upperFirst('fred');
15165
     * // => 'Fred'
15166
     *
15167
     * _.upperFirst('FRED');
15168
     * // => 'FRED'
15169
     */
15170
    var upperFirst = createCaseFirst('toUpperCase');
15171
15172
    /**
15173
     * Splits `string` into an array of its words.
15174
     *
15175
     * @static
15176
     * @memberOf _
15177
     * @since 3.0.0
15178
     * @category String
15179
     * @param {string} [string=''] The string to inspect.
15180
     * @param {RegExp|string} [pattern] The pattern to match words.
15181
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15182
     * @returns {Array} Returns the words of `string`.
15183
     * @example
15184
     *
15185
     * _.words('fred, barney, & pebbles');
15186
     * // => ['fred', 'barney', 'pebbles']
15187
     *
15188
     * _.words('fred, barney, & pebbles', /[^, ]+/g);
15189
     * // => ['fred', 'barney', '&', 'pebbles']
15190
     */
15191
    function words(string, pattern, guard) {
15192
      string = toString(string);
15193
      pattern = guard ? undefined : pattern;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
15194
15195
      if (pattern === undefined) {
15196
        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
15197
      }
15198
      return string.match(pattern) || [];
15199
    }
15200
15201
    /*------------------------------------------------------------------------*/
15202
15203
    /**
15204
     * Attempts to invoke `func`, returning either the result or the caught error
15205
     * object. Any additional arguments are provided to `func` when it's invoked.
15206
     *
15207
     * @static
15208
     * @memberOf _
15209
     * @since 3.0.0
15210
     * @category Util
15211
     * @param {Function} func The function to attempt.
15212
     * @param {...*} [args] The arguments to invoke `func` with.
15213
     * @returns {*} Returns the `func` result or error object.
15214
     * @example
15215
     *
15216
     * // Avoid throwing errors for invalid selectors.
15217
     * var elements = _.attempt(function(selector) {
15218
     *   return document.querySelectorAll(selector);
15219
     * }, '>_>');
15220
     *
15221
     * if (_.isError(elements)) {
15222
     *   elements = [];
15223
     * }
15224
     */
15225
    var attempt = baseRest(function(func, args) {
15226
      try {
15227
        return apply(func, undefined, args);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
15228
      } catch (e) {
15229
        return isError(e) ? e : new Error(e);
15230
      }
15231
    });
15232
15233
    /**
15234
     * Binds methods of an object to the object itself, overwriting the existing
15235
     * method.
15236
     *
15237
     * **Note:** This method doesn't set the "length" property of bound functions.
15238
     *
15239
     * @static
15240
     * @since 0.1.0
15241
     * @memberOf _
15242
     * @category Util
15243
     * @param {Object} object The object to bind and assign the bound methods to.
15244
     * @param {...(string|string[])} methodNames The object method names to bind.
15245
     * @returns {Object} Returns `object`.
15246
     * @example
15247
     *
15248
     * var view = {
15249
     *   'label': 'docs',
15250
     *   'click': function() {
15251
     *     console.log('clicked ' + this.label);
15252
     *   }
15253
     * };
15254
     *
15255
     * _.bindAll(view, ['click']);
15256
     * jQuery(element).on('click', view.click);
15257
     * // => Logs 'clicked docs' when clicked.
15258
     */
15259
    var bindAll = flatRest(function(object, methodNames) {
15260
      arrayEach(methodNames, function(key) {
15261
        key = toKey(key);
15262
        baseAssignValue(object, key, bind(object[key], object));
15263
      });
15264
      return object;
15265
    });
15266
15267
    /**
15268
     * Creates a function that iterates over `pairs` and invokes the corresponding
15269
     * function of the first predicate to return truthy. The predicate-function
15270
     * pairs are invoked with the `this` binding and arguments of the created
15271
     * function.
15272
     *
15273
     * @static
15274
     * @memberOf _
15275
     * @since 4.0.0
15276
     * @category Util
15277
     * @param {Array} pairs The predicate-function pairs.
15278
     * @returns {Function} Returns the new composite function.
15279
     * @example
15280
     *
15281
     * var func = _.cond([
15282
     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
15283
     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
15284
     *   [_.stubTrue,                      _.constant('no match')]
15285
     * ]);
15286
     *
15287
     * func({ 'a': 1, 'b': 2 });
15288
     * // => 'matches A'
15289
     *
15290
     * func({ 'a': 0, 'b': 1 });
15291
     * // => 'matches B'
15292
     *
15293
     * func({ 'a': '1', 'b': '2' });
15294
     * // => 'no match'
15295
     */
15296
    function cond(pairs) {
15297
      var length = pairs == null ? 0 : pairs.length,
15298
          toIteratee = getIteratee();
15299
15300
      pairs = !length ? [] : arrayMap(pairs, function(pair) {
15301
        if (typeof pair[1] != 'function') {
15302
          throw new TypeError(FUNC_ERROR_TEXT);
15303
        }
15304
        return [toIteratee(pair[0]), pair[1]];
15305
      });
15306
15307
      return baseRest(function(args) {
15308
        var index = -1;
15309
        while (++index < length) {
15310
          var pair = pairs[index];
15311
          if (apply(pair[0], this, args)) {
15312
            return apply(pair[1], this, args);
15313
          }
15314
        }
15315
      });
15316
    }
15317
15318
    /**
15319
     * Creates a function that invokes the predicate properties of `source` with
15320
     * the corresponding property values of a given object, returning `true` if
15321
     * all predicates return truthy, else `false`.
15322
     *
15323
     * **Note:** The created function is equivalent to `_.conformsTo` with
15324
     * `source` partially applied.
15325
     *
15326
     * @static
15327
     * @memberOf _
15328
     * @since 4.0.0
15329
     * @category Util
15330
     * @param {Object} source The object of property predicates to conform to.
15331
     * @returns {Function} Returns the new spec function.
15332
     * @example
15333
     *
15334
     * var objects = [
15335
     *   { 'a': 2, 'b': 1 },
15336
     *   { 'a': 1, 'b': 2 }
15337
     * ];
15338
     *
15339
     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
15340
     * // => [{ 'a': 1, 'b': 2 }]
15341
     */
15342
    function conforms(source) {
15343
      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
15344
    }
15345
15346
    /**
15347
     * Creates a function that returns `value`.
15348
     *
15349
     * @static
15350
     * @memberOf _
15351
     * @since 2.4.0
15352
     * @category Util
15353
     * @param {*} value The value to return from the new function.
15354
     * @returns {Function} Returns the new constant function.
15355
     * @example
15356
     *
15357
     * var objects = _.times(2, _.constant({ 'a': 1 }));
15358
     *
15359
     * console.log(objects);
15360
     * // => [{ 'a': 1 }, { 'a': 1 }]
15361
     *
15362
     * console.log(objects[0] === objects[1]);
15363
     * // => true
15364
     */
15365
    function constant(value) {
15366
      return function() {
15367
        return value;
15368
      };
15369
    }
15370
15371
    /**
15372
     * Checks `value` to determine whether a default value should be returned in
15373
     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
15374
     * or `undefined`.
15375
     *
15376
     * @static
15377
     * @memberOf _
15378
     * @since 4.14.0
15379
     * @category Util
15380
     * @param {*} value The value to check.
15381
     * @param {*} defaultValue The default value.
15382
     * @returns {*} Returns the resolved value.
15383
     * @example
15384
     *
15385
     * _.defaultTo(1, 10);
15386
     * // => 1
15387
     *
15388
     * _.defaultTo(undefined, 10);
15389
     * // => 10
15390
     */
15391
    function defaultTo(value, defaultValue) {
15392
      return (value == null || value !== value) ? defaultValue : value;
15393
    }
15394
15395
    /**
15396
     * Creates a function that returns the result of invoking the given functions
15397
     * with the `this` binding of the created function, where each successive
15398
     * invocation is supplied the return value of the previous.
15399
     *
15400
     * @static
15401
     * @memberOf _
15402
     * @since 3.0.0
15403
     * @category Util
15404
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
15405
     * @returns {Function} Returns the new composite function.
15406
     * @see _.flowRight
15407
     * @example
15408
     *
15409
     * function square(n) {
15410
     *   return n * n;
15411
     * }
15412
     *
15413
     * var addSquare = _.flow([_.add, square]);
15414
     * addSquare(1, 2);
15415
     * // => 9
15416
     */
15417
    var flow = createFlow();
15418
15419
    /**
15420
     * This method is like `_.flow` except that it creates a function that
15421
     * invokes the given functions from right to left.
15422
     *
15423
     * @static
15424
     * @since 3.0.0
15425
     * @memberOf _
15426
     * @category Util
15427
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
15428
     * @returns {Function} Returns the new composite function.
15429
     * @see _.flow
15430
     * @example
15431
     *
15432
     * function square(n) {
15433
     *   return n * n;
15434
     * }
15435
     *
15436
     * var addSquare = _.flowRight([square, _.add]);
15437
     * addSquare(1, 2);
15438
     * // => 9
15439
     */
15440
    var flowRight = createFlow(true);
15441
15442
    /**
15443
     * This method returns the first argument it receives.
15444
     *
15445
     * @static
15446
     * @since 0.1.0
15447
     * @memberOf _
15448
     * @category Util
15449
     * @param {*} value Any value.
15450
     * @returns {*} Returns `value`.
15451
     * @example
15452
     *
15453
     * var object = { 'a': 1 };
15454
     *
15455
     * console.log(_.identity(object) === object);
15456
     * // => true
15457
     */
15458
    function identity(value) {
15459
      return value;
15460
    }
15461
15462
    /**
15463
     * Creates a function that invokes `func` with the arguments of the created
15464
     * function. If `func` is a property name, the created function returns the
15465
     * property value for a given element. If `func` is an array or object, the
15466
     * created function returns `true` for elements that contain the equivalent
15467
     * source properties, otherwise it returns `false`.
15468
     *
15469
     * @static
15470
     * @since 4.0.0
15471
     * @memberOf _
15472
     * @category Util
15473
     * @param {*} [func=_.identity] The value to convert to a callback.
15474
     * @returns {Function} Returns the callback.
15475
     * @example
15476
     *
15477
     * var users = [
15478
     *   { 'user': 'barney', 'age': 36, 'active': true },
15479
     *   { 'user': 'fred',   'age': 40, 'active': false }
15480
     * ];
15481
     *
15482
     * // The `_.matches` iteratee shorthand.
15483
     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
15484
     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
15485
     *
15486
     * // The `_.matchesProperty` iteratee shorthand.
15487
     * _.filter(users, _.iteratee(['user', 'fred']));
15488
     * // => [{ 'user': 'fred', 'age': 40 }]
15489
     *
15490
     * // The `_.property` iteratee shorthand.
15491
     * _.map(users, _.iteratee('user'));
15492
     * // => ['barney', 'fred']
15493
     *
15494
     * // Create custom iteratee shorthands.
15495
     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
15496
     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
15497
     *     return func.test(string);
15498
     *   };
15499
     * });
15500
     *
15501
     * _.filter(['abc', 'def'], /ef/);
15502
     * // => ['def']
15503
     */
15504
    function iteratee(func) {
15505
      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
15506
    }
15507
15508
    /**
15509
     * Creates a function that performs a partial deep comparison between a given
15510
     * object and `source`, returning `true` if the given object has equivalent
15511
     * property values, else `false`.
15512
     *
15513
     * **Note:** The created function is equivalent to `_.isMatch` with `source`
15514
     * partially applied.
15515
     *
15516
     * Partial comparisons will match empty array and empty object `source`
15517
     * values against any array or object value, respectively. See `_.isEqual`
15518
     * for a list of supported value comparisons.
15519
     *
15520
     * @static
15521
     * @memberOf _
15522
     * @since 3.0.0
15523
     * @category Util
15524
     * @param {Object} source The object of property values to match.
15525
     * @returns {Function} Returns the new spec function.
15526
     * @example
15527
     *
15528
     * var objects = [
15529
     *   { 'a': 1, 'b': 2, 'c': 3 },
15530
     *   { 'a': 4, 'b': 5, 'c': 6 }
15531
     * ];
15532
     *
15533
     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
15534
     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
15535
     */
15536
    function matches(source) {
15537
      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
15538
    }
15539
15540
    /**
15541
     * Creates a function that performs a partial deep comparison between the
15542
     * value at `path` of a given object to `srcValue`, returning `true` if the
15543
     * object value is equivalent, else `false`.
15544
     *
15545
     * **Note:** Partial comparisons will match empty array and empty object
15546
     * `srcValue` values against any array or object value, respectively. See
15547
     * `_.isEqual` for a list of supported value comparisons.
15548
     *
15549
     * @static
15550
     * @memberOf _
15551
     * @since 3.2.0
15552
     * @category Util
15553
     * @param {Array|string} path The path of the property to get.
15554
     * @param {*} srcValue The value to match.
15555
     * @returns {Function} Returns the new spec function.
15556
     * @example
15557
     *
15558
     * var objects = [
15559
     *   { 'a': 1, 'b': 2, 'c': 3 },
15560
     *   { 'a': 4, 'b': 5, 'c': 6 }
15561
     * ];
15562
     *
15563
     * _.find(objects, _.matchesProperty('a', 4));
15564
     * // => { 'a': 4, 'b': 5, 'c': 6 }
15565
     */
15566
    function matchesProperty(path, srcValue) {
15567
      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
15568
    }
15569
15570
    /**
15571
     * Creates a function that invokes the method at `path` of a given object.
15572
     * Any additional arguments are provided to the invoked method.
15573
     *
15574
     * @static
15575
     * @memberOf _
15576
     * @since 3.7.0
15577
     * @category Util
15578
     * @param {Array|string} path The path of the method to invoke.
15579
     * @param {...*} [args] The arguments to invoke the method with.
15580
     * @returns {Function} Returns the new invoker function.
15581
     * @example
15582
     *
15583
     * var objects = [
15584
     *   { 'a': { 'b': _.constant(2) } },
15585
     *   { 'a': { 'b': _.constant(1) } }
15586
     * ];
15587
     *
15588
     * _.map(objects, _.method('a.b'));
15589
     * // => [2, 1]
15590
     *
15591
     * _.map(objects, _.method(['a', 'b']));
15592
     * // => [2, 1]
15593
     */
15594
    var method = baseRest(function(path, args) {
15595
      return function(object) {
15596
        return baseInvoke(object, path, args);
15597
      };
15598
    });
15599
15600
    /**
15601
     * The opposite of `_.method`; this method creates a function that invokes
15602
     * the method at a given path of `object`. Any additional arguments are
15603
     * provided to the invoked method.
15604
     *
15605
     * @static
15606
     * @memberOf _
15607
     * @since 3.7.0
15608
     * @category Util
15609
     * @param {Object} object The object to query.
15610
     * @param {...*} [args] The arguments to invoke the method with.
15611
     * @returns {Function} Returns the new invoker function.
15612
     * @example
15613
     *
15614
     * var array = _.times(3, _.constant),
15615
     *     object = { 'a': array, 'b': array, 'c': array };
15616
     *
15617
     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
15618
     * // => [2, 0]
15619
     *
15620
     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
15621
     * // => [2, 0]
15622
     */
15623
    var methodOf = baseRest(function(object, args) {
15624
      return function(path) {
15625
        return baseInvoke(object, path, args);
15626
      };
15627
    });
15628
15629
    /**
15630
     * Adds all own enumerable string keyed function properties of a source
15631
     * object to the destination object. If `object` is a function, then methods
15632
     * are added to its prototype as well.
15633
     *
15634
     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
15635
     * avoid conflicts caused by modifying the original.
15636
     *
15637
     * @static
15638
     * @since 0.1.0
15639
     * @memberOf _
15640
     * @category Util
15641
     * @param {Function|Object} [object=lodash] The destination object.
15642
     * @param {Object} source The object of functions to add.
15643
     * @param {Object} [options={}] The options object.
15644
     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
15645
     * @returns {Function|Object} Returns `object`.
15646
     * @example
15647
     *
15648
     * function vowels(string) {
15649
     *   return _.filter(string, function(v) {
15650
     *     return /[aeiou]/i.test(v);
15651
     *   });
15652
     * }
15653
     *
15654
     * _.mixin({ 'vowels': vowels });
15655
     * _.vowels('fred');
15656
     * // => ['e']
15657
     *
15658
     * _('fred').vowels().value();
15659
     * // => ['e']
15660
     *
15661
     * _.mixin({ 'vowels': vowels }, { 'chain': false });
15662
     * _('fred').vowels();
15663
     * // => ['e']
15664
     */
15665
    function mixin(object, source, options) {
15666
      var props = keys(source),
15667
          methodNames = baseFunctions(source, props);
15668
15669
      if (options == null &&
15670
          !(isObject(source) && (methodNames.length || !props.length))) {
15671
        options = source;
15672
        source = object;
15673
        object = this;
15674
        methodNames = baseFunctions(source, keys(source));
15675
      }
15676
      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
15677
          isFunc = isFunction(object);
15678
15679
      arrayEach(methodNames, function(methodName) {
15680
        var func = source[methodName];
15681
        object[methodName] = func;
15682
        if (isFunc) {
15683
          object.prototype[methodName] = function() {
15684
            var chainAll = this.__chain__;
15685
            if (chain || chainAll) {
15686
              var result = object(this.__wrapped__),
15687
                  actions = result.__actions__ = copyArray(this.__actions__);
15688
15689
              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
15690
              result.__chain__ = chainAll;
15691
              return result;
15692
            }
15693
            return func.apply(object, arrayPush([this.value()], arguments));
15694
          };
15695
        }
15696
      });
15697
15698
      return object;
15699
    }
15700
15701
    /**
15702
     * Reverts the `_` variable to its previous value and returns a reference to
15703
     * the `lodash` function.
15704
     *
15705
     * @static
15706
     * @since 0.1.0
15707
     * @memberOf _
15708
     * @category Util
15709
     * @returns {Function} Returns the `lodash` function.
15710
     * @example
15711
     *
15712
     * var lodash = _.noConflict();
15713
     */
15714
    function noConflict() {
15715
      if (root._ === this) {
15716
        root._ = oldDash;
15717
      }
15718
      return this;
15719
    }
15720
15721
    /**
15722
     * This method returns `undefined`.
15723
     *
15724
     * @static
15725
     * @memberOf _
15726
     * @since 2.3.0
15727
     * @category Util
15728
     * @example
15729
     *
15730
     * _.times(2, _.noop);
15731
     * // => [undefined, undefined]
15732
     */
15733
    function noop() {
15734
      // No operation performed.
15735
    }
15736
15737
    /**
15738
     * Creates a function that gets the argument at index `n`. If `n` is negative,
15739
     * the nth argument from the end is returned.
15740
     *
15741
     * @static
15742
     * @memberOf _
15743
     * @since 4.0.0
15744
     * @category Util
15745
     * @param {number} [n=0] The index of the argument to return.
15746
     * @returns {Function} Returns the new pass-thru function.
15747
     * @example
15748
     *
15749
     * var func = _.nthArg(1);
15750
     * func('a', 'b', 'c', 'd');
15751
     * // => 'b'
15752
     *
15753
     * var func = _.nthArg(-2);
15754
     * func('a', 'b', 'c', 'd');
15755
     * // => 'c'
15756
     */
15757
    function nthArg(n) {
15758
      n = toInteger(n);
15759
      return baseRest(function(args) {
15760
        return baseNth(args, n);
15761
      });
15762
    }
15763
15764
    /**
15765
     * Creates a function that invokes `iteratees` with the arguments it receives
15766
     * and returns their results.
15767
     *
15768
     * @static
15769
     * @memberOf _
15770
     * @since 4.0.0
15771
     * @category Util
15772
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
15773
     *  The iteratees to invoke.
15774
     * @returns {Function} Returns the new function.
15775
     * @example
15776
     *
15777
     * var func = _.over([Math.max, Math.min]);
15778
     *
15779
     * func(1, 2, 3, 4);
15780
     * // => [4, 1]
15781
     */
15782
    var over = createOver(arrayMap);
15783
15784
    /**
15785
     * Creates a function that checks if **all** of the `predicates` return
15786
     * truthy when invoked with the arguments it receives.
15787
     *
15788
     * @static
15789
     * @memberOf _
15790
     * @since 4.0.0
15791
     * @category Util
15792
     * @param {...(Function|Function[])} [predicates=[_.identity]]
15793
     *  The predicates to check.
15794
     * @returns {Function} Returns the new function.
15795
     * @example
15796
     *
15797
     * var func = _.overEvery([Boolean, isFinite]);
15798
     *
15799
     * func('1');
15800
     * // => true
15801
     *
15802
     * func(null);
15803
     * // => false
15804
     *
15805
     * func(NaN);
15806
     * // => false
15807
     */
15808
    var overEvery = createOver(arrayEvery);
15809
15810
    /**
15811
     * Creates a function that checks if **any** of the `predicates` return
15812
     * truthy when invoked with the arguments it receives.
15813
     *
15814
     * @static
15815
     * @memberOf _
15816
     * @since 4.0.0
15817
     * @category Util
15818
     * @param {...(Function|Function[])} [predicates=[_.identity]]
15819
     *  The predicates to check.
15820
     * @returns {Function} Returns the new function.
15821
     * @example
15822
     *
15823
     * var func = _.overSome([Boolean, isFinite]);
15824
     *
15825
     * func('1');
15826
     * // => true
15827
     *
15828
     * func(null);
15829
     * // => true
15830
     *
15831
     * func(NaN);
15832
     * // => false
15833
     */
15834
    var overSome = createOver(arraySome);
15835
15836
    /**
15837
     * Creates a function that returns the value at `path` of a given object.
15838
     *
15839
     * @static
15840
     * @memberOf _
15841
     * @since 2.4.0
15842
     * @category Util
15843
     * @param {Array|string} path The path of the property to get.
15844
     * @returns {Function} Returns the new accessor function.
15845
     * @example
15846
     *
15847
     * var objects = [
15848
     *   { 'a': { 'b': 2 } },
15849
     *   { 'a': { 'b': 1 } }
15850
     * ];
15851
     *
15852
     * _.map(objects, _.property('a.b'));
15853
     * // => [2, 1]
15854
     *
15855
     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
15856
     * // => [1, 2]
15857
     */
15858
    function property(path) {
15859
      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
15860
    }
15861
15862
    /**
15863
     * The opposite of `_.property`; this method creates a function that returns
15864
     * the value at a given path of `object`.
15865
     *
15866
     * @static
15867
     * @memberOf _
15868
     * @since 3.0.0
15869
     * @category Util
15870
     * @param {Object} object The object to query.
15871
     * @returns {Function} Returns the new accessor function.
15872
     * @example
15873
     *
15874
     * var array = [0, 1, 2],
15875
     *     object = { 'a': array, 'b': array, 'c': array };
15876
     *
15877
     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
15878
     * // => [2, 0]
15879
     *
15880
     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
15881
     * // => [2, 0]
15882
     */
15883
    function propertyOf(object) {
15884
      return function(path) {
15885
        return object == null ? undefined : baseGet(object, path);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
15886
      };
15887
    }
15888
15889
    /**
15890
     * Creates an array of numbers (positive and/or negative) progressing from
15891
     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
15892
     * `start` is specified without an `end` or `step`. If `end` is not specified,
15893
     * it's set to `start` with `start` then set to `0`.
15894
     *
15895
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
15896
     * floating-point values which can produce unexpected results.
15897
     *
15898
     * @static
15899
     * @since 0.1.0
15900
     * @memberOf _
15901
     * @category Util
15902
     * @param {number} [start=0] The start of the range.
15903
     * @param {number} end The end of the range.
15904
     * @param {number} [step=1] The value to increment or decrement by.
15905
     * @returns {Array} Returns the range of numbers.
15906
     * @see _.inRange, _.rangeRight
15907
     * @example
15908
     *
15909
     * _.range(4);
15910
     * // => [0, 1, 2, 3]
15911
     *
15912
     * _.range(-4);
15913
     * // => [0, -1, -2, -3]
15914
     *
15915
     * _.range(1, 5);
15916
     * // => [1, 2, 3, 4]
15917
     *
15918
     * _.range(0, 20, 5);
15919
     * // => [0, 5, 10, 15]
15920
     *
15921
     * _.range(0, -4, -1);
15922
     * // => [0, -1, -2, -3]
15923
     *
15924
     * _.range(1, 4, 0);
15925
     * // => [1, 1, 1]
15926
     *
15927
     * _.range(0);
15928
     * // => []
15929
     */
15930
    var range = createRange();
15931
15932
    /**
15933
     * This method is like `_.range` except that it populates values in
15934
     * descending order.
15935
     *
15936
     * @static
15937
     * @memberOf _
15938
     * @since 4.0.0
15939
     * @category Util
15940
     * @param {number} [start=0] The start of the range.
15941
     * @param {number} end The end of the range.
15942
     * @param {number} [step=1] The value to increment or decrement by.
15943
     * @returns {Array} Returns the range of numbers.
15944
     * @see _.inRange, _.range
15945
     * @example
15946
     *
15947
     * _.rangeRight(4);
15948
     * // => [3, 2, 1, 0]
15949
     *
15950
     * _.rangeRight(-4);
15951
     * // => [-3, -2, -1, 0]
15952
     *
15953
     * _.rangeRight(1, 5);
15954
     * // => [4, 3, 2, 1]
15955
     *
15956
     * _.rangeRight(0, 20, 5);
15957
     * // => [15, 10, 5, 0]
15958
     *
15959
     * _.rangeRight(0, -4, -1);
15960
     * // => [-3, -2, -1, 0]
15961
     *
15962
     * _.rangeRight(1, 4, 0);
15963
     * // => [1, 1, 1]
15964
     *
15965
     * _.rangeRight(0);
15966
     * // => []
15967
     */
15968
    var rangeRight = createRange(true);
15969
15970
    /**
15971
     * This method returns a new empty array.
15972
     *
15973
     * @static
15974
     * @memberOf _
15975
     * @since 4.13.0
15976
     * @category Util
15977
     * @returns {Array} Returns the new empty array.
15978
     * @example
15979
     *
15980
     * var arrays = _.times(2, _.stubArray);
15981
     *
15982
     * console.log(arrays);
15983
     * // => [[], []]
15984
     *
15985
     * console.log(arrays[0] === arrays[1]);
15986
     * // => false
15987
     */
15988
    function stubArray() {
15989
      return [];
15990
    }
15991
15992
    /**
15993
     * This method returns `false`.
15994
     *
15995
     * @static
15996
     * @memberOf _
15997
     * @since 4.13.0
15998
     * @category Util
15999
     * @returns {boolean} Returns `false`.
16000
     * @example
16001
     *
16002
     * _.times(2, _.stubFalse);
16003
     * // => [false, false]
16004
     */
16005
    function stubFalse() {
16006
      return false;
16007
    }
16008
16009
    /**
16010
     * This method returns a new empty object.
16011
     *
16012
     * @static
16013
     * @memberOf _
16014
     * @since 4.13.0
16015
     * @category Util
16016
     * @returns {Object} Returns the new empty object.
16017
     * @example
16018
     *
16019
     * var objects = _.times(2, _.stubObject);
16020
     *
16021
     * console.log(objects);
16022
     * // => [{}, {}]
16023
     *
16024
     * console.log(objects[0] === objects[1]);
16025
     * // => false
16026
     */
16027
    function stubObject() {
16028
      return {};
16029
    }
16030
16031
    /**
16032
     * This method returns an empty string.
16033
     *
16034
     * @static
16035
     * @memberOf _
16036
     * @since 4.13.0
16037
     * @category Util
16038
     * @returns {string} Returns the empty string.
16039
     * @example
16040
     *
16041
     * _.times(2, _.stubString);
16042
     * // => ['', '']
16043
     */
16044
    function stubString() {
16045
      return '';
16046
    }
16047
16048
    /**
16049
     * This method returns `true`.
16050
     *
16051
     * @static
16052
     * @memberOf _
16053
     * @since 4.13.0
16054
     * @category Util
16055
     * @returns {boolean} Returns `true`.
16056
     * @example
16057
     *
16058
     * _.times(2, _.stubTrue);
16059
     * // => [true, true]
16060
     */
16061
    function stubTrue() {
16062
      return true;
16063
    }
16064
16065
    /**
16066
     * Invokes the iteratee `n` times, returning an array of the results of
16067
     * each invocation. The iteratee is invoked with one argument; (index).
16068
     *
16069
     * @static
16070
     * @since 0.1.0
16071
     * @memberOf _
16072
     * @category Util
16073
     * @param {number} n The number of times to invoke `iteratee`.
16074
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
16075
     * @returns {Array} Returns the array of results.
16076
     * @example
16077
     *
16078
     * _.times(3, String);
16079
     * // => ['0', '1', '2']
16080
     *
16081
     *  _.times(4, _.constant(0));
16082
     * // => [0, 0, 0, 0]
16083
     */
16084
    function times(n, iteratee) {
16085
      n = toInteger(n);
16086
      if (n < 1 || n > MAX_SAFE_INTEGER) {
16087
        return [];
16088
      }
16089
      var index = MAX_ARRAY_LENGTH,
16090
          length = nativeMin(n, MAX_ARRAY_LENGTH);
16091
16092
      iteratee = getIteratee(iteratee);
16093
      n -= MAX_ARRAY_LENGTH;
16094
16095
      var result = baseTimes(length, iteratee);
16096
      while (++index < n) {
16097
        iteratee(index);
16098
      }
16099
      return result;
16100
    }
16101
16102
    /**
16103
     * Converts `value` to a property path array.
16104
     *
16105
     * @static
16106
     * @memberOf _
16107
     * @since 4.0.0
16108
     * @category Util
16109
     * @param {*} value The value to convert.
16110
     * @returns {Array} Returns the new property path array.
16111
     * @example
16112
     *
16113
     * _.toPath('a.b.c');
16114
     * // => ['a', 'b', 'c']
16115
     *
16116
     * _.toPath('a[0].b.c');
16117
     * // => ['a', '0', 'b', 'c']
16118
     */
16119
    function toPath(value) {
16120
      if (isArray(value)) {
16121
        return arrayMap(value, toKey);
16122
      }
16123
      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
16124
    }
16125
16126
    /**
16127
     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
16128
     *
16129
     * @static
16130
     * @since 0.1.0
16131
     * @memberOf _
16132
     * @category Util
16133
     * @param {string} [prefix=''] The value to prefix the ID with.
16134
     * @returns {string} Returns the unique ID.
16135
     * @example
16136
     *
16137
     * _.uniqueId('contact_');
16138
     * // => 'contact_104'
16139
     *
16140
     * _.uniqueId();
16141
     * // => '105'
16142
     */
16143
    function uniqueId(prefix) {
16144
      var id = ++idCounter;
16145
      return toString(prefix) + id;
16146
    }
16147
16148
    /*------------------------------------------------------------------------*/
16149
16150
    /**
16151
     * Adds two numbers.
16152
     *
16153
     * @static
16154
     * @memberOf _
16155
     * @since 3.4.0
16156
     * @category Math
16157
     * @param {number} augend The first number in an addition.
16158
     * @param {number} addend The second number in an addition.
16159
     * @returns {number} Returns the total.
16160
     * @example
16161
     *
16162
     * _.add(6, 4);
16163
     * // => 10
16164
     */
16165
    var add = createMathOperation(function(augend, addend) {
16166
      return augend + addend;
16167
    }, 0);
16168
16169
    /**
16170
     * Computes `number` rounded up to `precision`.
16171
     *
16172
     * @static
16173
     * @memberOf _
16174
     * @since 3.10.0
16175
     * @category Math
16176
     * @param {number} number The number to round up.
16177
     * @param {number} [precision=0] The precision to round up to.
16178
     * @returns {number} Returns the rounded up number.
16179
     * @example
16180
     *
16181
     * _.ceil(4.006);
16182
     * // => 5
16183
     *
16184
     * _.ceil(6.004, 2);
16185
     * // => 6.01
16186
     *
16187
     * _.ceil(6040, -2);
16188
     * // => 6100
16189
     */
16190
    var ceil = createRound('ceil');
16191
16192
    /**
16193
     * Divide two numbers.
16194
     *
16195
     * @static
16196
     * @memberOf _
16197
     * @since 4.7.0
16198
     * @category Math
16199
     * @param {number} dividend The first number in a division.
16200
     * @param {number} divisor The second number in a division.
16201
     * @returns {number} Returns the quotient.
16202
     * @example
16203
     *
16204
     * _.divide(6, 4);
16205
     * // => 1.5
16206
     */
16207
    var divide = createMathOperation(function(dividend, divisor) {
16208
      return dividend / divisor;
16209
    }, 1);
16210
16211
    /**
16212
     * Computes `number` rounded down to `precision`.
16213
     *
16214
     * @static
16215
     * @memberOf _
16216
     * @since 3.10.0
16217
     * @category Math
16218
     * @param {number} number The number to round down.
16219
     * @param {number} [precision=0] The precision to round down to.
16220
     * @returns {number} Returns the rounded down number.
16221
     * @example
16222
     *
16223
     * _.floor(4.006);
16224
     * // => 4
16225
     *
16226
     * _.floor(0.046, 2);
16227
     * // => 0.04
16228
     *
16229
     * _.floor(4060, -2);
16230
     * // => 4000
16231
     */
16232
    var floor = createRound('floor');
16233
16234
    /**
16235
     * Computes the maximum value of `array`. If `array` is empty or falsey,
16236
     * `undefined` is returned.
16237
     *
16238
     * @static
16239
     * @since 0.1.0
16240
     * @memberOf _
16241
     * @category Math
16242
     * @param {Array} array The array to iterate over.
16243
     * @returns {*} Returns the maximum value.
16244
     * @example
16245
     *
16246
     * _.max([4, 2, 8, 6]);
16247
     * // => 8
16248
     *
16249
     * _.max([]);
16250
     * // => undefined
16251
     */
16252
    function max(array) {
16253
      return (array && array.length)
16254
        ? baseExtremum(array, identity, baseGt)
16255
        : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16256
    }
16257
16258
    /**
16259
     * This method is like `_.max` except that it accepts `iteratee` which is
16260
     * invoked for each element in `array` to generate the criterion by which
16261
     * the value is ranked. The iteratee is invoked with one argument: (value).
16262
     *
16263
     * @static
16264
     * @memberOf _
16265
     * @since 4.0.0
16266
     * @category Math
16267
     * @param {Array} array The array to iterate over.
16268
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16269
     * @returns {*} Returns the maximum value.
16270
     * @example
16271
     *
16272
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
16273
     *
16274
     * _.maxBy(objects, function(o) { return o.n; });
16275
     * // => { 'n': 2 }
16276
     *
16277
     * // The `_.property` iteratee shorthand.
16278
     * _.maxBy(objects, 'n');
16279
     * // => { 'n': 2 }
16280
     */
16281
    function maxBy(array, iteratee) {
16282
      return (array && array.length)
16283
        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
16284
        : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16285
    }
16286
16287
    /**
16288
     * Computes the mean of the values in `array`.
16289
     *
16290
     * @static
16291
     * @memberOf _
16292
     * @since 4.0.0
16293
     * @category Math
16294
     * @param {Array} array The array to iterate over.
16295
     * @returns {number} Returns the mean.
16296
     * @example
16297
     *
16298
     * _.mean([4, 2, 8, 6]);
16299
     * // => 5
16300
     */
16301
    function mean(array) {
16302
      return baseMean(array, identity);
16303
    }
16304
16305
    /**
16306
     * This method is like `_.mean` except that it accepts `iteratee` which is
16307
     * invoked for each element in `array` to generate the value to be averaged.
16308
     * The iteratee is invoked with one argument: (value).
16309
     *
16310
     * @static
16311
     * @memberOf _
16312
     * @since 4.7.0
16313
     * @category Math
16314
     * @param {Array} array The array to iterate over.
16315
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16316
     * @returns {number} Returns the mean.
16317
     * @example
16318
     *
16319
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16320
     *
16321
     * _.meanBy(objects, function(o) { return o.n; });
16322
     * // => 5
16323
     *
16324
     * // The `_.property` iteratee shorthand.
16325
     * _.meanBy(objects, 'n');
16326
     * // => 5
16327
     */
16328
    function meanBy(array, iteratee) {
16329
      return baseMean(array, getIteratee(iteratee, 2));
16330
    }
16331
16332
    /**
16333
     * Computes the minimum value of `array`. If `array` is empty or falsey,
16334
     * `undefined` is returned.
16335
     *
16336
     * @static
16337
     * @since 0.1.0
16338
     * @memberOf _
16339
     * @category Math
16340
     * @param {Array} array The array to iterate over.
16341
     * @returns {*} Returns the minimum value.
16342
     * @example
16343
     *
16344
     * _.min([4, 2, 8, 6]);
16345
     * // => 2
16346
     *
16347
     * _.min([]);
16348
     * // => undefined
16349
     */
16350
    function min(array) {
16351
      return (array && array.length)
16352
        ? baseExtremum(array, identity, baseLt)
16353
        : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16354
    }
16355
16356
    /**
16357
     * This method is like `_.min` except that it accepts `iteratee` which is
16358
     * invoked for each element in `array` to generate the criterion by which
16359
     * the value is ranked. The iteratee is invoked with one argument: (value).
16360
     *
16361
     * @static
16362
     * @memberOf _
16363
     * @since 4.0.0
16364
     * @category Math
16365
     * @param {Array} array The array to iterate over.
16366
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16367
     * @returns {*} Returns the minimum value.
16368
     * @example
16369
     *
16370
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
16371
     *
16372
     * _.minBy(objects, function(o) { return o.n; });
16373
     * // => { 'n': 1 }
16374
     *
16375
     * // The `_.property` iteratee shorthand.
16376
     * _.minBy(objects, 'n');
16377
     * // => { 'n': 1 }
16378
     */
16379
    function minBy(array, iteratee) {
16380
      return (array && array.length)
16381
        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
16382
        : undefined;
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16383
    }
16384
16385
    /**
16386
     * Multiply two numbers.
16387
     *
16388
     * @static
16389
     * @memberOf _
16390
     * @since 4.7.0
16391
     * @category Math
16392
     * @param {number} multiplier The first number in a multiplication.
16393
     * @param {number} multiplicand The second number in a multiplication.
16394
     * @returns {number} Returns the product.
16395
     * @example
16396
     *
16397
     * _.multiply(6, 4);
16398
     * // => 24
16399
     */
16400
    var multiply = createMathOperation(function(multiplier, multiplicand) {
16401
      return multiplier * multiplicand;
16402
    }, 1);
16403
16404
    /**
16405
     * Computes `number` rounded to `precision`.
16406
     *
16407
     * @static
16408
     * @memberOf _
16409
     * @since 3.10.0
16410
     * @category Math
16411
     * @param {number} number The number to round.
16412
     * @param {number} [precision=0] The precision to round to.
16413
     * @returns {number} Returns the rounded number.
16414
     * @example
16415
     *
16416
     * _.round(4.006);
16417
     * // => 4
16418
     *
16419
     * _.round(4.006, 2);
16420
     * // => 4.01
16421
     *
16422
     * _.round(4060, -2);
16423
     * // => 4100
16424
     */
16425
    var round = createRound('round');
16426
16427
    /**
16428
     * Subtract two numbers.
16429
     *
16430
     * @static
16431
     * @memberOf _
16432
     * @since 4.0.0
16433
     * @category Math
16434
     * @param {number} minuend The first number in a subtraction.
16435
     * @param {number} subtrahend The second number in a subtraction.
16436
     * @returns {number} Returns the difference.
16437
     * @example
16438
     *
16439
     * _.subtract(6, 4);
16440
     * // => 2
16441
     */
16442
    var subtract = createMathOperation(function(minuend, subtrahend) {
16443
      return minuend - subtrahend;
16444
    }, 0);
16445
16446
    /**
16447
     * Computes the sum of the values in `array`.
16448
     *
16449
     * @static
16450
     * @memberOf _
16451
     * @since 3.4.0
16452
     * @category Math
16453
     * @param {Array} array The array to iterate over.
16454
     * @returns {number} Returns the sum.
16455
     * @example
16456
     *
16457
     * _.sum([4, 2, 8, 6]);
16458
     * // => 20
16459
     */
16460
    function sum(array) {
16461
      return (array && array.length)
16462
        ? baseSum(array, identity)
16463
        : 0;
16464
    }
16465
16466
    /**
16467
     * This method is like `_.sum` except that it accepts `iteratee` which is
16468
     * invoked for each element in `array` to generate the value to be summed.
16469
     * The iteratee is invoked with one argument: (value).
16470
     *
16471
     * @static
16472
     * @memberOf _
16473
     * @since 4.0.0
16474
     * @category Math
16475
     * @param {Array} array The array to iterate over.
16476
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16477
     * @returns {number} Returns the sum.
16478
     * @example
16479
     *
16480
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16481
     *
16482
     * _.sumBy(objects, function(o) { return o.n; });
16483
     * // => 20
16484
     *
16485
     * // The `_.property` iteratee shorthand.
16486
     * _.sumBy(objects, 'n');
16487
     * // => 20
16488
     */
16489
    function sumBy(array, iteratee) {
16490
      return (array && array.length)
16491
        ? baseSum(array, getIteratee(iteratee, 2))
16492
        : 0;
16493
    }
16494
16495
    /*------------------------------------------------------------------------*/
16496
16497
    // Add methods that return wrapped values in chain sequences.
16498
    lodash.after = after;
16499
    lodash.ary = ary;
16500
    lodash.assign = assign;
16501
    lodash.assignIn = assignIn;
16502
    lodash.assignInWith = assignInWith;
16503
    lodash.assignWith = assignWith;
16504
    lodash.at = at;
16505
    lodash.before = before;
16506
    lodash.bind = bind;
16507
    lodash.bindAll = bindAll;
16508
    lodash.bindKey = bindKey;
16509
    lodash.castArray = castArray;
16510
    lodash.chain = chain;
16511
    lodash.chunk = chunk;
16512
    lodash.compact = compact;
16513
    lodash.concat = concat;
16514
    lodash.cond = cond;
16515
    lodash.conforms = conforms;
16516
    lodash.constant = constant;
16517
    lodash.countBy = countBy;
16518
    lodash.create = create;
16519
    lodash.curry = curry;
16520
    lodash.curryRight = curryRight;
16521
    lodash.debounce = debounce;
16522
    lodash.defaults = defaults;
16523
    lodash.defaultsDeep = defaultsDeep;
16524
    lodash.defer = defer;
16525
    lodash.delay = delay;
16526
    lodash.difference = difference;
16527
    lodash.differenceBy = differenceBy;
16528
    lodash.differenceWith = differenceWith;
16529
    lodash.drop = drop;
16530
    lodash.dropRight = dropRight;
16531
    lodash.dropRightWhile = dropRightWhile;
16532
    lodash.dropWhile = dropWhile;
16533
    lodash.fill = fill;
16534
    lodash.filter = filter;
16535
    lodash.flatMap = flatMap;
16536
    lodash.flatMapDeep = flatMapDeep;
16537
    lodash.flatMapDepth = flatMapDepth;
16538
    lodash.flatten = flatten;
16539
    lodash.flattenDeep = flattenDeep;
16540
    lodash.flattenDepth = flattenDepth;
16541
    lodash.flip = flip;
16542
    lodash.flow = flow;
16543
    lodash.flowRight = flowRight;
16544
    lodash.fromPairs = fromPairs;
16545
    lodash.functions = functions;
16546
    lodash.functionsIn = functionsIn;
16547
    lodash.groupBy = groupBy;
16548
    lodash.initial = initial;
16549
    lodash.intersection = intersection;
16550
    lodash.intersectionBy = intersectionBy;
16551
    lodash.intersectionWith = intersectionWith;
16552
    lodash.invert = invert;
16553
    lodash.invertBy = invertBy;
16554
    lodash.invokeMap = invokeMap;
16555
    lodash.iteratee = iteratee;
16556
    lodash.keyBy = keyBy;
16557
    lodash.keys = keys;
16558
    lodash.keysIn = keysIn;
16559
    lodash.map = map;
16560
    lodash.mapKeys = mapKeys;
16561
    lodash.mapValues = mapValues;
16562
    lodash.matches = matches;
16563
    lodash.matchesProperty = matchesProperty;
16564
    lodash.memoize = memoize;
16565
    lodash.merge = merge;
16566
    lodash.mergeWith = mergeWith;
16567
    lodash.method = method;
16568
    lodash.methodOf = methodOf;
16569
    lodash.mixin = mixin;
16570
    lodash.negate = negate;
16571
    lodash.nthArg = nthArg;
16572
    lodash.omit = omit;
16573
    lodash.omitBy = omitBy;
16574
    lodash.once = once;
16575
    lodash.orderBy = orderBy;
16576
    lodash.over = over;
16577
    lodash.overArgs = overArgs;
16578
    lodash.overEvery = overEvery;
16579
    lodash.overSome = overSome;
16580
    lodash.partial = partial;
16581
    lodash.partialRight = partialRight;
16582
    lodash.partition = partition;
16583
    lodash.pick = pick;
16584
    lodash.pickBy = pickBy;
16585
    lodash.property = property;
16586
    lodash.propertyOf = propertyOf;
16587
    lodash.pull = pull;
16588
    lodash.pullAll = pullAll;
16589
    lodash.pullAllBy = pullAllBy;
16590
    lodash.pullAllWith = pullAllWith;
16591
    lodash.pullAt = pullAt;
16592
    lodash.range = range;
16593
    lodash.rangeRight = rangeRight;
16594
    lodash.rearg = rearg;
16595
    lodash.reject = reject;
16596
    lodash.remove = remove;
16597
    lodash.rest = rest;
16598
    lodash.reverse = reverse;
16599
    lodash.sampleSize = sampleSize;
16600
    lodash.set = set;
16601
    lodash.setWith = setWith;
16602
    lodash.shuffle = shuffle;
16603
    lodash.slice = slice;
16604
    lodash.sortBy = sortBy;
16605
    lodash.sortedUniq = sortedUniq;
16606
    lodash.sortedUniqBy = sortedUniqBy;
16607
    lodash.split = split;
16608
    lodash.spread = spread;
16609
    lodash.tail = tail;
16610
    lodash.take = take;
16611
    lodash.takeRight = takeRight;
16612
    lodash.takeRightWhile = takeRightWhile;
16613
    lodash.takeWhile = takeWhile;
16614
    lodash.tap = tap;
16615
    lodash.throttle = throttle;
16616
    lodash.thru = thru;
16617
    lodash.toArray = toArray;
16618
    lodash.toPairs = toPairs;
16619
    lodash.toPairsIn = toPairsIn;
16620
    lodash.toPath = toPath;
16621
    lodash.toPlainObject = toPlainObject;
16622
    lodash.transform = transform;
16623
    lodash.unary = unary;
16624
    lodash.union = union;
16625
    lodash.unionBy = unionBy;
16626
    lodash.unionWith = unionWith;
16627
    lodash.uniq = uniq;
16628
    lodash.uniqBy = uniqBy;
16629
    lodash.uniqWith = uniqWith;
16630
    lodash.unset = unset;
16631
    lodash.unzip = unzip;
16632
    lodash.unzipWith = unzipWith;
16633
    lodash.update = update;
16634
    lodash.updateWith = updateWith;
16635
    lodash.values = values;
16636
    lodash.valuesIn = valuesIn;
16637
    lodash.without = without;
16638
    lodash.words = words;
16639
    lodash.wrap = wrap;
16640
    lodash.xor = xor;
16641
    lodash.xorBy = xorBy;
16642
    lodash.xorWith = xorWith;
16643
    lodash.zip = zip;
16644
    lodash.zipObject = zipObject;
16645
    lodash.zipObjectDeep = zipObjectDeep;
16646
    lodash.zipWith = zipWith;
16647
16648
    // Add aliases.
16649
    lodash.entries = toPairs;
16650
    lodash.entriesIn = toPairsIn;
16651
    lodash.extend = assignIn;
16652
    lodash.extendWith = assignInWith;
16653
16654
    // Add methods to `lodash.prototype`.
16655
    mixin(lodash, lodash);
16656
16657
    /*------------------------------------------------------------------------*/
16658
16659
    // Add methods that return unwrapped values in chain sequences.
16660
    lodash.add = add;
16661
    lodash.attempt = attempt;
16662
    lodash.camelCase = camelCase;
16663
    lodash.capitalize = capitalize;
16664
    lodash.ceil = ceil;
16665
    lodash.clamp = clamp;
16666
    lodash.clone = clone;
16667
    lodash.cloneDeep = cloneDeep;
16668
    lodash.cloneDeepWith = cloneDeepWith;
16669
    lodash.cloneWith = cloneWith;
16670
    lodash.conformsTo = conformsTo;
16671
    lodash.deburr = deburr;
16672
    lodash.defaultTo = defaultTo;
16673
    lodash.divide = divide;
16674
    lodash.endsWith = endsWith;
16675
    lodash.eq = eq;
16676
    lodash.escape = escape;
16677
    lodash.escapeRegExp = escapeRegExp;
16678
    lodash.every = every;
16679
    lodash.find = find;
16680
    lodash.findIndex = findIndex;
16681
    lodash.findKey = findKey;
16682
    lodash.findLast = findLast;
16683
    lodash.findLastIndex = findLastIndex;
16684
    lodash.findLastKey = findLastKey;
16685
    lodash.floor = floor;
16686
    lodash.forEach = forEach;
16687
    lodash.forEachRight = forEachRight;
16688
    lodash.forIn = forIn;
16689
    lodash.forInRight = forInRight;
16690
    lodash.forOwn = forOwn;
16691
    lodash.forOwnRight = forOwnRight;
16692
    lodash.get = get;
16693
    lodash.gt = gt;
16694
    lodash.gte = gte;
16695
    lodash.has = has;
16696
    lodash.hasIn = hasIn;
16697
    lodash.head = head;
16698
    lodash.identity = identity;
16699
    lodash.includes = includes;
16700
    lodash.indexOf = indexOf;
16701
    lodash.inRange = inRange;
16702
    lodash.invoke = invoke;
16703
    lodash.isArguments = isArguments;
16704
    lodash.isArray = isArray;
16705
    lodash.isArrayBuffer = isArrayBuffer;
16706
    lodash.isArrayLike = isArrayLike;
16707
    lodash.isArrayLikeObject = isArrayLikeObject;
16708
    lodash.isBoolean = isBoolean;
16709
    lodash.isBuffer = isBuffer;
16710
    lodash.isDate = isDate;
16711
    lodash.isElement = isElement;
16712
    lodash.isEmpty = isEmpty;
16713
    lodash.isEqual = isEqual;
16714
    lodash.isEqualWith = isEqualWith;
16715
    lodash.isError = isError;
16716
    lodash.isFinite = isFinite;
16717
    lodash.isFunction = isFunction;
16718
    lodash.isInteger = isInteger;
16719
    lodash.isLength = isLength;
16720
    lodash.isMap = isMap;
16721
    lodash.isMatch = isMatch;
16722
    lodash.isMatchWith = isMatchWith;
16723
    lodash.isNaN = isNaN;
16724
    lodash.isNative = isNative;
16725
    lodash.isNil = isNil;
16726
    lodash.isNull = isNull;
16727
    lodash.isNumber = isNumber;
16728
    lodash.isObject = isObject;
16729
    lodash.isObjectLike = isObjectLike;
16730
    lodash.isPlainObject = isPlainObject;
16731
    lodash.isRegExp = isRegExp;
16732
    lodash.isSafeInteger = isSafeInteger;
16733
    lodash.isSet = isSet;
16734
    lodash.isString = isString;
16735
    lodash.isSymbol = isSymbol;
16736
    lodash.isTypedArray = isTypedArray;
16737
    lodash.isUndefined = isUndefined;
16738
    lodash.isWeakMap = isWeakMap;
16739
    lodash.isWeakSet = isWeakSet;
16740
    lodash.join = join;
16741
    lodash.kebabCase = kebabCase;
16742
    lodash.last = last;
16743
    lodash.lastIndexOf = lastIndexOf;
16744
    lodash.lowerCase = lowerCase;
16745
    lodash.lowerFirst = lowerFirst;
16746
    lodash.lt = lt;
16747
    lodash.lte = lte;
16748
    lodash.max = max;
16749
    lodash.maxBy = maxBy;
16750
    lodash.mean = mean;
16751
    lodash.meanBy = meanBy;
16752
    lodash.min = min;
16753
    lodash.minBy = minBy;
16754
    lodash.stubArray = stubArray;
16755
    lodash.stubFalse = stubFalse;
16756
    lodash.stubObject = stubObject;
16757
    lodash.stubString = stubString;
16758
    lodash.stubTrue = stubTrue;
16759
    lodash.multiply = multiply;
16760
    lodash.nth = nth;
16761
    lodash.noConflict = noConflict;
16762
    lodash.noop = noop;
16763
    lodash.now = now;
16764
    lodash.pad = pad;
16765
    lodash.padEnd = padEnd;
16766
    lodash.padStart = padStart;
16767
    lodash.parseInt = parseInt;
16768
    lodash.random = random;
16769
    lodash.reduce = reduce;
16770
    lodash.reduceRight = reduceRight;
16771
    lodash.repeat = repeat;
16772
    lodash.replace = replace;
16773
    lodash.result = result;
16774
    lodash.round = round;
16775
    lodash.runInContext = runInContext;
16776
    lodash.sample = sample;
16777
    lodash.size = size;
16778
    lodash.snakeCase = snakeCase;
16779
    lodash.some = some;
16780
    lodash.sortedIndex = sortedIndex;
16781
    lodash.sortedIndexBy = sortedIndexBy;
16782
    lodash.sortedIndexOf = sortedIndexOf;
16783
    lodash.sortedLastIndex = sortedLastIndex;
16784
    lodash.sortedLastIndexBy = sortedLastIndexBy;
16785
    lodash.sortedLastIndexOf = sortedLastIndexOf;
16786
    lodash.startCase = startCase;
16787
    lodash.startsWith = startsWith;
16788
    lodash.subtract = subtract;
16789
    lodash.sum = sum;
16790
    lodash.sumBy = sumBy;
16791
    lodash.template = template;
16792
    lodash.times = times;
16793
    lodash.toFinite = toFinite;
16794
    lodash.toInteger = toInteger;
16795
    lodash.toLength = toLength;
16796
    lodash.toLower = toLower;
16797
    lodash.toNumber = toNumber;
16798
    lodash.toSafeInteger = toSafeInteger;
16799
    lodash.toString = toString;
16800
    lodash.toUpper = toUpper;
16801
    lodash.trim = trim;
16802
    lodash.trimEnd = trimEnd;
16803
    lodash.trimStart = trimStart;
16804
    lodash.truncate = truncate;
16805
    lodash.unescape = unescape;
16806
    lodash.uniqueId = uniqueId;
16807
    lodash.upperCase = upperCase;
16808
    lodash.upperFirst = upperFirst;
16809
16810
    // Add aliases.
16811
    lodash.each = forEach;
16812
    lodash.eachRight = forEachRight;
16813
    lodash.first = head;
16814
16815
    mixin(lodash, (function() {
16816
      var source = {};
16817
      baseForOwn(lodash, function(func, methodName) {
16818
        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
16819
          source[methodName] = func;
16820
        }
16821
      });
16822
      return source;
16823
    }()), { 'chain': false });
16824
16825
    /*------------------------------------------------------------------------*/
16826
16827
    /**
16828
     * The semantic version number.
16829
     *
16830
     * @static
16831
     * @memberOf _
16832
     * @type {string}
16833
     */
16834
    lodash.VERSION = VERSION;
16835
16836
    // Assign default placeholders.
16837
    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
16838
      lodash[methodName].placeholder = lodash;
16839
    });
16840
16841
    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
16842
    arrayEach(['drop', 'take'], function(methodName, index) {
16843
      LazyWrapper.prototype[methodName] = function(n) {
16844
        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16845
16846
        var result = (this.__filtered__ && !index)
16847
          ? new LazyWrapper(this)
16848
          : this.clone();
16849
16850
        if (result.__filtered__) {
16851
          result.__takeCount__ = nativeMin(n, result.__takeCount__);
16852
        } else {
16853
          result.__views__.push({
16854
            'size': nativeMin(n, MAX_ARRAY_LENGTH),
16855
            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
16856
          });
16857
        }
16858
        return result;
16859
      };
16860
16861
      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
16862
        return this.reverse()[methodName](n).reverse();
16863
      };
16864
    });
16865
16866
    // Add `LazyWrapper` methods that accept an `iteratee` value.
16867
    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
16868
      var type = index + 1,
16869
          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
16870
16871
      LazyWrapper.prototype[methodName] = function(iteratee) {
16872
        var result = this.clone();
16873
        result.__iteratees__.push({
16874
          'iteratee': getIteratee(iteratee, 3),
16875
          'type': type
16876
        });
16877
        result.__filtered__ = result.__filtered__ || isFilter;
16878
        return result;
16879
      };
16880
    });
16881
16882
    // Add `LazyWrapper` methods for `_.head` and `_.last`.
16883
    arrayEach(['head', 'last'], function(methodName, index) {
16884
      var takeName = 'take' + (index ? 'Right' : '');
16885
16886
      LazyWrapper.prototype[methodName] = function() {
16887
        return this[takeName](1).value()[0];
16888
      };
16889
    });
16890
16891
    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
16892
    arrayEach(['initial', 'tail'], function(methodName, index) {
16893
      var dropName = 'drop' + (index ? '' : 'Right');
16894
16895
      LazyWrapper.prototype[methodName] = function() {
16896
        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
16897
      };
16898
    });
16899
16900
    LazyWrapper.prototype.compact = function() {
16901
      return this.filter(identity);
16902
    };
16903
16904
    LazyWrapper.prototype.find = function(predicate) {
16905
      return this.filter(predicate).head();
16906
    };
16907
16908
    LazyWrapper.prototype.findLast = function(predicate) {
16909
      return this.reverse().find(predicate);
16910
    };
16911
16912
    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
16913
      if (typeof path == 'function') {
16914
        return new LazyWrapper(this);
16915
      }
16916
      return this.map(function(value) {
16917
        return baseInvoke(value, path, args);
16918
      });
16919
    });
16920
16921
    LazyWrapper.prototype.reject = function(predicate) {
16922
      return this.filter(negate(getIteratee(predicate)));
16923
    };
16924
16925 View Code Duplication
    LazyWrapper.prototype.slice = function(start, end) {
16926
      start = toInteger(start);
16927
16928
      var result = this;
16929
      if (result.__filtered__ && (start > 0 || end < 0)) {
16930
        return new LazyWrapper(result);
16931
      }
16932
      if (start < 0) {
16933
        result = result.takeRight(-start);
16934
      } else if (start) {
16935
        result = result.drop(start);
16936
      }
16937
      if (end !== undefined) {
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16938
        end = toInteger(end);
16939
        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
16940
      }
16941
      return result;
16942
    };
16943
16944
    LazyWrapper.prototype.takeRightWhile = function(predicate) {
16945
      return this.reverse().takeWhile(predicate).reverse();
16946
    };
16947
16948
    LazyWrapper.prototype.toArray = function() {
16949
      return this.take(MAX_ARRAY_LENGTH);
16950
    };
16951
16952
    // Add `LazyWrapper` methods to `lodash.prototype`.
16953 View Code Duplication
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
16954
      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
16955
          isTaker = /^(?:head|last)$/.test(methodName),
16956
          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
16957
          retUnwrapped = isTaker || /^find/.test(methodName);
16958
16959
      if (!lodashFunc) {
16960
        return;
16961
      }
16962
      lodash.prototype[methodName] = function() {
16963
        var value = this.__wrapped__,
16964
            args = isTaker ? [1] : arguments,
16965
            isLazy = value instanceof LazyWrapper,
16966
            iteratee = args[0],
16967
            useLazy = isLazy || isArray(value);
16968
16969
        var interceptor = function(value) {
16970
          var result = lodashFunc.apply(lodash, arrayPush([value], args));
16971
          return (isTaker && chainAll) ? result[0] : result;
16972
        };
16973
16974
        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
16975
          // Avoid lazy use if the iteratee has a "length" value other than `1`.
16976
          isLazy = useLazy = false;
16977
        }
16978
        var chainAll = this.__chain__,
16979
            isHybrid = !!this.__actions__.length,
16980
            isUnwrapped = retUnwrapped && !chainAll,
16981
            onlyLazy = isLazy && !isHybrid;
16982
16983
        if (!retUnwrapped && useLazy) {
16984
          value = onlyLazy ? value : new LazyWrapper(this);
16985
          var result = func.apply(value, args);
16986
          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
16987
          return new LodashWrapper(result, chainAll);
16988
        }
16989
        if (isUnwrapped && onlyLazy) {
16990
          return func.apply(this, args);
16991
        }
16992
        result = this.thru(interceptor);
16993
        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
16994
      };
16995
    });
16996
16997
    // Add `Array` methods to `lodash.prototype`.
16998
    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
16999
      var func = arrayProto[methodName],
17000
          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
17001
          retUnwrapped = /^(?:pop|shift)$/.test(methodName);
17002
17003
      lodash.prototype[methodName] = function() {
17004
        var args = arguments;
17005
        if (retUnwrapped && !this.__chain__) {
17006
          var value = this.value();
17007
          return func.apply(isArray(value) ? value : [], args);
17008
        }
17009
        return this[chainName](function(value) {
17010
          return func.apply(isArray(value) ? value : [], args);
17011
        });
17012
      };
17013
    });
17014
17015
    // Map minified method names to their real names.
17016
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
17017
      var lodashFunc = lodash[methodName];
17018
      if (lodashFunc) {
17019
        var key = (lodashFunc.name + ''),
17020
            names = realNames[key] || (realNames[key] = []);
17021
17022
        names.push({ 'name': methodName, 'func': lodashFunc });
17023
      }
17024
    });
17025
17026
    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
0 ignored issues
show
Bug introduced by
The variable undefined seems to be never initialized.
Loading history...
17027
      'name': 'wrapper',
17028
      'func': undefined
17029
    }];
17030
17031
    // Add methods to `LazyWrapper`.
17032
    LazyWrapper.prototype.clone = lazyClone;
17033
    LazyWrapper.prototype.reverse = lazyReverse;
17034
    LazyWrapper.prototype.value = lazyValue;
17035
17036
    // Add chain sequence methods to the `lodash` wrapper.
17037
    lodash.prototype.at = wrapperAt;
17038
    lodash.prototype.chain = wrapperChain;
17039
    lodash.prototype.commit = wrapperCommit;
17040
    lodash.prototype.next = wrapperNext;
17041
    lodash.prototype.plant = wrapperPlant;
17042
    lodash.prototype.reverse = wrapperReverse;
17043
    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
17044
17045
    // Add lazy aliases.
17046
    lodash.prototype.first = lodash.prototype.head;
17047
17048
    if (symIterator) {
17049
      lodash.prototype[symIterator] = wrapperToIterator;
17050
    }
17051
    return lodash;
17052
  });
17053
17054
  /*--------------------------------------------------------------------------*/
17055
17056
  // Export lodash.
17057
  var _ = runInContext();
17058
17059
  // Some AMD build optimizers, like r.js, check for condition patterns like:
17060
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
17061
    // Expose Lodash on the global object to prevent errors when Lodash is
17062
    // loaded by a script tag in the presence of an AMD loader.
17063
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
17064
    // Use `_.noConflict` to remove Lodash from the global object.
17065
    root._ = _;
17066
17067
    // Define as an anonymous module so, through path mapping, it can be
17068
    // referenced as the "underscore" module.
17069
    define(function() {
17070
      return _;
17071
    });
17072
  }
17073
  // Check for `exports` after `define` in case a build optimizer adds it.
17074
  else if (freeModule) {
17075
    // Export for Node.js.
17076
    (freeModule.exports = _)._ = _;
17077
    // Export for CommonJS support.
17078
    freeExports._ = _;
17079
  }
17080
  else {
17081
    // Export to the global object.
17082
    root._ = _;
17083
  }
17084
}.call(this));
17085