프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / lodash / lodash.js

이력 | 보기 | 이력해설 | 다운로드 (527 KB)

1 39 HKM
/**
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.5';
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
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
147
148
  /**
149
   * Used to match `RegExp`
150
   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
151
   */
152
  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
153
      reHasRegExpChar = RegExp(reRegExpChar.source);
154
155
  /** Used to match leading and trailing whitespace. */
156
  var reTrim = /^\s+|\s+$/g,
157
      reTrimStart = /^\s+/,
158
      reTrimEnd = /\s+$/;
159
160
  /** Used to match wrap detail comments. */
161
  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
162
      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
163
      reSplitDetails = /,? & /;
164
165
  /** Used to match words composed of alphanumeric characters. */
166
  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
167
168
  /** Used to match backslashes in property paths. */
169
  var reEscapeChar = /\\(\\)?/g;
170
171
  /**
172
   * Used to match
173
   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
174
   */
175
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
176
177
  /** Used to match `RegExp` flags from their coerced string values. */
178
  var reFlags = /\w*$/;
179
180
  /** Used to detect bad signed hexadecimal string values. */
181
  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
182
183
  /** Used to detect binary string values. */
184
  var reIsBinary = /^0b[01]+$/i;
185
186
  /** Used to detect host constructors (Safari). */
187
  var reIsHostCtor = /^\[object .+?Constructor\]$/;
188
189
  /** Used to detect octal string values. */
190
  var reIsOctal = /^0o[0-7]+$/i;
191
192
  /** Used to detect unsigned integer values. */
193
  var reIsUint = /^(?:0|[1-9]\d*)$/;
194
195
  /** Used to match Latin Unicode letters (excluding mathematical operators). */
196
  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
197
198
  /** Used to ensure capturing order of template delimiters. */
199
  var reNoMatch = /($^)/;
200
201
  /** Used to match unescaped characters in compiled string literals. */
202
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
203
204
  /** Used to compose unicode character classes. */
205
  var rsAstralRange = '\\ud800-\\udfff',
206
      rsComboMarksRange = '\\u0300-\\u036f',
207
      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
208
      rsComboSymbolsRange = '\\u20d0-\\u20ff',
209
      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
210
      rsDingbatRange = '\\u2700-\\u27bf',
211
      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
212
      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
213
      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
214
      rsPunctuationRange = '\\u2000-\\u206f',
215
      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',
216
      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
217
      rsVarRange = '\\ufe0e\\ufe0f',
218
      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
219
220
  /** Used to compose unicode capture groups. */
221
  var rsApos = "['\u2019]",
222
      rsAstral = '[' + rsAstralRange + ']',
223
      rsBreak = '[' + rsBreakRange + ']',
224
      rsCombo = '[' + rsComboRange + ']',
225
      rsDigits = '\\d+',
226
      rsDingbat = '[' + rsDingbatRange + ']',
227
      rsLower = '[' + rsLowerRange + ']',
228
      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
229
      rsFitz = '\\ud83c[\\udffb-\\udfff]',
230
      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
231
      rsNonAstral = '[^' + rsAstralRange + ']',
232
      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
233
      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
234
      rsUpper = '[' + rsUpperRange + ']',
235
      rsZWJ = '\\u200d';
236
237
  /** Used to compose unicode regexes. */
238
  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
239
      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
240
      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
241
      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
242
      reOptMod = rsModifier + '?',
243
      rsOptVar = '[' + rsVarRange + ']?',
244
      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
245
      rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
246
      rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
247
      rsSeq = rsOptVar + reOptMod + rsOptJoin,
248
      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
249
      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
250
251
  /** Used to match apostrophes. */
252
  var reApos = RegExp(rsApos, 'g');
253
254
  /**
255
   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
256
   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
257
   */
258
  var reComboMark = RegExp(rsCombo, 'g');
259
260
  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
261
  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
262
263
  /** Used to match complex or compound words. */
264
  var reUnicodeWord = RegExp([
265
    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
266
    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
267
    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
268
    rsUpper + '+' + rsOptContrUpper,
269
    rsOrdUpper,
270
    rsOrdLower,
271
    rsDigits,
272
    rsEmoji
273
  ].join('|'), 'g');
274
275
  /** 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/). */
276
  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
277
278
  /** Used to detect strings that need a more robust regexp to match words. */
279
  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 ]/;
280
281
  /** Used to assign default `context` object properties. */
282
  var contextProps = [
283
    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
284
    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
285
    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
286
    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
287
    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
288
  ];
289
290
  /** Used to make template sourceURLs easier to identify. */
291
  var templateCounter = -1;
292
293
  /** Used to identify `toStringTag` values of typed arrays. */
294
  var typedArrayTags = {};
295
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
296
  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
297
  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
298
  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
299
  typedArrayTags[uint32Tag] = true;
300
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
301
  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
302
  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
303
  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
304
  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
305
  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
306
  typedArrayTags[setTag] = typedArrayTags[stringTag] =
307
  typedArrayTags[weakMapTag] = false;
308
309
  /** Used to identify `toStringTag` values supported by `_.clone`. */
310
  var cloneableTags = {};
311
  cloneableTags[argsTag] = cloneableTags[arrayTag] =
312
  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
313
  cloneableTags[boolTag] = cloneableTags[dateTag] =
314
  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
315
  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
316
  cloneableTags[int32Tag] = cloneableTags[mapTag] =
317
  cloneableTags[numberTag] = cloneableTags[objectTag] =
318
  cloneableTags[regexpTag] = cloneableTags[setTag] =
319
  cloneableTags[stringTag] = cloneableTags[symbolTag] =
320
  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
321
  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
322
  cloneableTags[errorTag] = cloneableTags[funcTag] =
323
  cloneableTags[weakMapTag] = false;
324
325
  /** Used to map Latin Unicode letters to basic Latin letters. */
326
  var deburredLetters = {
327
    // Latin-1 Supplement block.
328
    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
329
    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
330
    '\xc7': 'C',  '\xe7': 'c',
331
    '\xd0': 'D',  '\xf0': 'd',
332
    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
333
    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
334
    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
335
    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
336
    '\xd1': 'N',  '\xf1': 'n',
337
    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
338
    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
339
    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
340
    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
341
    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
342
    '\xc6': 'Ae', '\xe6': 'ae',
343
    '\xde': 'Th', '\xfe': 'th',
344
    '\xdf': 'ss',
345
    // Latin Extended-A block.
346
    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
347
    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
348
    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
349
    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
350
    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
351
    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
352
    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
353
    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
354
    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
355
    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
356
    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
357
    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
358
    '\u0134': 'J',  '\u0135': 'j',
359
    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
360
    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
361
    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
362
    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
363
    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
364
    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
365
    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
366
    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
367
    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
368
    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
369
    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
370
    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
371
    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
372
    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
373
    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
374
    '\u0174': 'W',  '\u0175': 'w',
375
    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
376
    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
377
    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
378
    '\u0132': 'IJ', '\u0133': 'ij',
379
    '\u0152': 'Oe', '\u0153': 'oe',
380
    '\u0149': "'n", '\u017f': 's'
381
  };
382
383
  /** Used to map characters to HTML entities. */
384
  var htmlEscapes = {
385
    '&': '&amp;',
386
    '<': '&lt;',
387
    '>': '&gt;',
388
    '"': '&quot;',
389
    "'": '&#39;'
390
  };
391
392
  /** Used to map HTML entities to characters. */
393
  var htmlUnescapes = {
394
    '&amp;': '&',
395
    '&lt;': '<',
396
    '&gt;': '>',
397
    '&quot;': '"',
398
    '&#39;': "'"
399
  };
400
401
  /** Used to escape characters for inclusion in compiled string literals. */
402
  var stringEscapes = {
403
    '\\': '\\',
404
    "'": "'",
405
    '\n': 'n',
406
    '\r': 'r',
407
    '\u2028': 'u2028',
408
    '\u2029': 'u2029'
409
  };
410
411
  /** Built-in method references without a dependency on `root`. */
412
  var freeParseFloat = parseFloat,
413
      freeParseInt = parseInt;
414
415
  /** Detect free variable `global` from Node.js. */
416
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
417
418
  /** Detect free variable `self`. */
419
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
420
421
  /** Used as a reference to the global object. */
422
  var root = freeGlobal || freeSelf || Function('return this')();
423
424
  /** Detect free variable `exports`. */
425
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
426
427
  /** Detect free variable `module`. */
428
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
429
430
  /** Detect the popular CommonJS extension `module.exports`. */
431
  var moduleExports = freeModule && freeModule.exports === freeExports;
432
433
  /** Detect free variable `process` from Node.js. */
434
  var freeProcess = moduleExports && freeGlobal.process;
435
436
  /** Used to access faster Node.js helpers. */
437
  var nodeUtil = (function() {
438
    try {
439
      return freeProcess && freeProcess.binding && freeProcess.binding('util');
440
    } catch (e) {}
441
  }());
442
443
  /* Node.js helper references. */
444
  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
445
      nodeIsDate = nodeUtil && nodeUtil.isDate,
446
      nodeIsMap = nodeUtil && nodeUtil.isMap,
447
      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
448
      nodeIsSet = nodeUtil && nodeUtil.isSet,
449
      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
450
451
  /*--------------------------------------------------------------------------*/
452
453
  /**
454
   * A faster alternative to `Function#apply`, this function invokes `func`
455
   * with the `this` binding of `thisArg` and the arguments of `args`.
456
   *
457
   * @private
458
   * @param {Function} func The function to invoke.
459
   * @param {*} thisArg The `this` binding of `func`.
460
   * @param {Array} args The arguments to invoke `func` with.
461
   * @returns {*} Returns the result of `func`.
462
   */
463
  function apply(func, thisArg, args) {
464
    switch (args.length) {
465
      case 0: return func.call(thisArg);
466
      case 1: return func.call(thisArg, args[0]);
467
      case 2: return func.call(thisArg, args[0], args[1]);
468
      case 3: return func.call(thisArg, args[0], args[1], args[2]);
469
    }
470
    return func.apply(thisArg, args);
471
  }
472
473
  /**
474
   * A specialized version of `baseAggregator` for arrays.
475
   *
476
   * @private
477
   * @param {Array} [array] The array to iterate over.
478
   * @param {Function} setter The function to set `accumulator` values.
479
   * @param {Function} iteratee The iteratee to transform keys.
480
   * @param {Object} accumulator The initial aggregated object.
481
   * @returns {Function} Returns `accumulator`.
482
   */
483
  function arrayAggregator(array, setter, iteratee, accumulator) {
484
    var index = -1,
485
        length = array == null ? 0 : array.length;
486
487
    while (++index < length) {
488
      var value = array[index];
489
      setter(accumulator, value, iteratee(value), array);
490
    }
491
    return accumulator;
492
  }
493
494
  /**
495
   * A specialized version of `_.forEach` for arrays without support for
496
   * iteratee shorthands.
497
   *
498
   * @private
499
   * @param {Array} [array] The array to iterate over.
500
   * @param {Function} iteratee The function invoked per iteration.
501
   * @returns {Array} Returns `array`.
502
   */
503
  function arrayEach(array, iteratee) {
504
    var index = -1,
505
        length = array == null ? 0 : array.length;
506
507
    while (++index < length) {
508
      if (iteratee(array[index], index, array) === false) {
509
        break;
510
      }
511
    }
512
    return array;
513
  }
514
515
  /**
516
   * A specialized version of `_.forEachRight` for arrays without support for
517
   * iteratee shorthands.
518
   *
519
   * @private
520
   * @param {Array} [array] The array to iterate over.
521
   * @param {Function} iteratee The function invoked per iteration.
522
   * @returns {Array} Returns `array`.
523
   */
524
  function arrayEachRight(array, iteratee) {
525
    var length = array == null ? 0 : array.length;
526
527
    while (length--) {
528
      if (iteratee(array[length], length, array) === false) {
529
        break;
530
      }
531
    }
532
    return array;
533
  }
534
535
  /**
536
   * A specialized version of `_.every` for arrays without support for
537
   * iteratee shorthands.
538
   *
539
   * @private
540
   * @param {Array} [array] The array to iterate over.
541
   * @param {Function} predicate The function invoked per iteration.
542
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
543
   *  else `false`.
544
   */
545
  function arrayEvery(array, predicate) {
546
    var index = -1,
547
        length = array == null ? 0 : array.length;
548
549
    while (++index < length) {
550
      if (!predicate(array[index], index, array)) {
551
        return false;
552
      }
553
    }
554
    return true;
555
  }
556
557
  /**
558
   * A specialized version of `_.filter` for arrays without support for
559
   * iteratee shorthands.
560
   *
561
   * @private
562
   * @param {Array} [array] The array to iterate over.
563
   * @param {Function} predicate The function invoked per iteration.
564
   * @returns {Array} Returns the new filtered array.
565
   */
566
  function arrayFilter(array, predicate) {
567
    var index = -1,
568
        length = array == null ? 0 : array.length,
569
        resIndex = 0,
570
        result = [];
571
572
    while (++index < length) {
573
      var value = array[index];
574
      if (predicate(value, index, array)) {
575
        result[resIndex++] = value;
576
      }
577
    }
578
    return result;
579
  }
580
581
  /**
582
   * A specialized version of `_.includes` for arrays without support for
583
   * specifying an index to search from.
584
   *
585
   * @private
586
   * @param {Array} [array] The array to inspect.
587
   * @param {*} target The value to search for.
588
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
589
   */
590
  function arrayIncludes(array, value) {
591
    var length = array == null ? 0 : array.length;
592
    return !!length && baseIndexOf(array, value, 0) > -1;
593
  }
594
595
  /**
596
   * This function is like `arrayIncludes` except that it accepts a comparator.
597
   *
598
   * @private
599
   * @param {Array} [array] The array to inspect.
600
   * @param {*} target The value to search for.
601
   * @param {Function} comparator The comparator invoked per element.
602
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
603
   */
604
  function arrayIncludesWith(array, value, comparator) {
605
    var index = -1,
606
        length = array == null ? 0 : array.length;
607
608
    while (++index < length) {
609
      if (comparator(value, array[index])) {
610
        return true;
611
      }
612
    }
613
    return false;
614
  }
615
616
  /**
617
   * A specialized version of `_.map` for arrays without support for iteratee
618
   * shorthands.
619
   *
620
   * @private
621
   * @param {Array} [array] The array to iterate over.
622
   * @param {Function} iteratee The function invoked per iteration.
623
   * @returns {Array} Returns the new mapped array.
624
   */
625
  function arrayMap(array, iteratee) {
626
    var index = -1,
627
        length = array == null ? 0 : array.length,
628
        result = Array(length);
629
630
    while (++index < length) {
631
      result[index] = iteratee(array[index], index, array);
632
    }
633
    return result;
634
  }
635
636
  /**
637
   * Appends the elements of `values` to `array`.
638
   *
639
   * @private
640
   * @param {Array} array The array to modify.
641
   * @param {Array} values The values to append.
642
   * @returns {Array} Returns `array`.
643
   */
644
  function arrayPush(array, values) {
645
    var index = -1,
646
        length = values.length,
647
        offset = array.length;
648
649
    while (++index < length) {
650
      array[offset + index] = values[index];
651
    }
652
    return array;
653
  }
654
655
  /**
656
   * A specialized version of `_.reduce` for arrays without support for
657
   * iteratee shorthands.
658
   *
659
   * @private
660
   * @param {Array} [array] The array to iterate over.
661
   * @param {Function} iteratee The function invoked per iteration.
662
   * @param {*} [accumulator] The initial value.
663
   * @param {boolean} [initAccum] Specify using the first element of `array` as
664
   *  the initial value.
665
   * @returns {*} Returns the accumulated value.
666
   */
667
  function arrayReduce(array, iteratee, accumulator, initAccum) {
668
    var index = -1,
669
        length = array == null ? 0 : array.length;
670
671
    if (initAccum && length) {
672
      accumulator = array[++index];
673
    }
674
    while (++index < length) {
675
      accumulator = iteratee(accumulator, array[index], index, array);
676
    }
677
    return accumulator;
678
  }
679
680
  /**
681
   * A specialized version of `_.reduceRight` for arrays without support for
682
   * iteratee shorthands.
683
   *
684
   * @private
685
   * @param {Array} [array] The array to iterate over.
686
   * @param {Function} iteratee The function invoked per iteration.
687
   * @param {*} [accumulator] The initial value.
688
   * @param {boolean} [initAccum] Specify using the last element of `array` as
689
   *  the initial value.
690
   * @returns {*} Returns the accumulated value.
691
   */
692
  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
693
    var length = array == null ? 0 : array.length;
694
    if (initAccum && length) {
695
      accumulator = array[--length];
696
    }
697
    while (length--) {
698
      accumulator = iteratee(accumulator, array[length], length, array);
699
    }
700
    return accumulator;
701
  }
702
703
  /**
704
   * A specialized version of `_.some` for arrays without support for iteratee
705
   * shorthands.
706
   *
707
   * @private
708
   * @param {Array} [array] The array to iterate over.
709
   * @param {Function} predicate The function invoked per iteration.
710
   * @returns {boolean} Returns `true` if any element passes the predicate check,
711
   *  else `false`.
712
   */
713
  function arraySome(array, predicate) {
714
    var index = -1,
715
        length = array == null ? 0 : array.length;
716
717
    while (++index < length) {
718
      if (predicate(array[index], index, array)) {
719
        return true;
720
      }
721
    }
722
    return false;
723
  }
724
725
  /**
726
   * Gets the size of an ASCII `string`.
727
   *
728
   * @private
729
   * @param {string} string The string inspect.
730
   * @returns {number} Returns the string size.
731
   */
732
  var asciiSize = baseProperty('length');
733
734
  /**
735
   * Converts an ASCII `string` to an array.
736
   *
737
   * @private
738
   * @param {string} string The string to convert.
739
   * @returns {Array} Returns the converted array.
740
   */
741
  function asciiToArray(string) {
742
    return string.split('');
743
  }
744
745
  /**
746
   * Splits an ASCII `string` into an array of its words.
747
   *
748
   * @private
749
   * @param {string} The string to inspect.
750
   * @returns {Array} Returns the words of `string`.
751
   */
752
  function asciiWords(string) {
753
    return string.match(reAsciiWord) || [];
754
  }
755
756
  /**
757
   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
758
   * without support for iteratee shorthands, which iterates over `collection`
759
   * using `eachFunc`.
760
   *
761
   * @private
762
   * @param {Array|Object} collection The collection to inspect.
763
   * @param {Function} predicate The function invoked per iteration.
764
   * @param {Function} eachFunc The function to iterate over `collection`.
765
   * @returns {*} Returns the found element or its key, else `undefined`.
766
   */
767
  function baseFindKey(collection, predicate, eachFunc) {
768
    var result;
769
    eachFunc(collection, function(value, key, collection) {
770
      if (predicate(value, key, collection)) {
771
        result = key;
772
        return false;
773
      }
774
    });
775
    return result;
776
  }
777
778
  /**
779
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
780
   * support for iteratee shorthands.
781
   *
782
   * @private
783
   * @param {Array} array The array to inspect.
784
   * @param {Function} predicate The function invoked per iteration.
785
   * @param {number} fromIndex The index to search from.
786
   * @param {boolean} [fromRight] Specify iterating from right to left.
787
   * @returns {number} Returns the index of the matched value, else `-1`.
788
   */
789
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
790
    var length = array.length,
791
        index = fromIndex + (fromRight ? 1 : -1);
792
793
    while ((fromRight ? index-- : ++index < length)) {
794
      if (predicate(array[index], index, array)) {
795
        return index;
796
      }
797
    }
798
    return -1;
799
  }
800
801
  /**
802
   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
803
   *
804
   * @private
805
   * @param {Array} array The array to inspect.
806
   * @param {*} value The value to search for.
807
   * @param {number} fromIndex The index to search from.
808
   * @returns {number} Returns the index of the matched value, else `-1`.
809
   */
810
  function baseIndexOf(array, value, fromIndex) {
811
    return value === value
812
      ? strictIndexOf(array, value, fromIndex)
813
      : baseFindIndex(array, baseIsNaN, fromIndex);
814
  }
815
816
  /**
817
   * This function is like `baseIndexOf` except that it accepts a comparator.
818
   *
819
   * @private
820
   * @param {Array} array The array to inspect.
821
   * @param {*} value The value to search for.
822
   * @param {number} fromIndex The index to search from.
823
   * @param {Function} comparator The comparator invoked per element.
824
   * @returns {number} Returns the index of the matched value, else `-1`.
825
   */
826
  function baseIndexOfWith(array, value, fromIndex, comparator) {
827
    var index = fromIndex - 1,
828
        length = array.length;
829
830
    while (++index < length) {
831
      if (comparator(array[index], value)) {
832
        return index;
833
      }
834
    }
835
    return -1;
836
  }
837
838
  /**
839
   * The base implementation of `_.isNaN` without support for number objects.
840
   *
841
   * @private
842
   * @param {*} value The value to check.
843
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
844
   */
845
  function baseIsNaN(value) {
846
    return value !== value;
847
  }
848
849
  /**
850
   * The base implementation of `_.mean` and `_.meanBy` without support for
851
   * iteratee shorthands.
852
   *
853
   * @private
854
   * @param {Array} array The array to iterate over.
855
   * @param {Function} iteratee The function invoked per iteration.
856
   * @returns {number} Returns the mean.
857
   */
858
  function baseMean(array, iteratee) {
859
    var length = array == null ? 0 : array.length;
860
    return length ? (baseSum(array, iteratee) / length) : NAN;
861
  }
862
863
  /**
864
   * The base implementation of `_.property` without support for deep paths.
865
   *
866
   * @private
867
   * @param {string} key The key of the property to get.
868
   * @returns {Function} Returns the new accessor function.
869
   */
870
  function baseProperty(key) {
871
    return function(object) {
872
      return object == null ? undefined : object[key];
873
    };
874
  }
875
876
  /**
877
   * The base implementation of `_.propertyOf` without support for deep paths.
878
   *
879
   * @private
880
   * @param {Object} object The object to query.
881
   * @returns {Function} Returns the new accessor function.
882
   */
883
  function basePropertyOf(object) {
884
    return function(key) {
885
      return object == null ? undefined : object[key];
886
    };
887
  }
888
889
  /**
890
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
891
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
892
   *
893
   * @private
894
   * @param {Array|Object} collection The collection to iterate over.
895
   * @param {Function} iteratee The function invoked per iteration.
896
   * @param {*} accumulator The initial value.
897
   * @param {boolean} initAccum Specify using the first or last element of
898
   *  `collection` as the initial value.
899
   * @param {Function} eachFunc The function to iterate over `collection`.
900
   * @returns {*} Returns the accumulated value.
901
   */
902
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
903
    eachFunc(collection, function(value, index, collection) {
904
      accumulator = initAccum
905
        ? (initAccum = false, value)
906
        : iteratee(accumulator, value, index, collection);
907
    });
908
    return accumulator;
909
  }
910
911
  /**
912
   * The base implementation of `_.sortBy` which uses `comparer` to define the
913
   * sort order of `array` and replaces criteria objects with their corresponding
914
   * values.
915
   *
916
   * @private
917
   * @param {Array} array The array to sort.
918
   * @param {Function} comparer The function to define sort order.
919
   * @returns {Array} Returns `array`.
920
   */
921
  function baseSortBy(array, comparer) {
922
    var length = array.length;
923
924
    array.sort(comparer);
925
    while (length--) {
926
      array[length] = array[length].value;
927
    }
928
    return array;
929
  }
930
931
  /**
932
   * The base implementation of `_.sum` and `_.sumBy` without support for
933
   * iteratee shorthands.
934
   *
935
   * @private
936
   * @param {Array} array The array to iterate over.
937
   * @param {Function} iteratee The function invoked per iteration.
938
   * @returns {number} Returns the sum.
939
   */
940
  function baseSum(array, iteratee) {
941
    var result,
942
        index = -1,
943
        length = array.length;
944
945
    while (++index < length) {
946
      var current = iteratee(array[index]);
947
      if (current !== undefined) {
948
        result = result === undefined ? current : (result + current);
949
      }
950
    }
951
    return result;
952
  }
953
954
  /**
955
   * The base implementation of `_.times` without support for iteratee shorthands
956
   * or max array length checks.
957
   *
958
   * @private
959
   * @param {number} n The number of times to invoke `iteratee`.
960
   * @param {Function} iteratee The function invoked per iteration.
961
   * @returns {Array} Returns the array of results.
962
   */
963
  function baseTimes(n, iteratee) {
964
    var index = -1,
965
        result = Array(n);
966
967
    while (++index < n) {
968
      result[index] = iteratee(index);
969
    }
970
    return result;
971
  }
972
973
  /**
974
   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
975
   * of key-value pairs for `object` corresponding to the property names of `props`.
976
   *
977
   * @private
978
   * @param {Object} object The object to query.
979
   * @param {Array} props The property names to get values for.
980
   * @returns {Object} Returns the key-value pairs.
981
   */
982
  function baseToPairs(object, props) {
983
    return arrayMap(props, function(key) {
984
      return [key, object[key]];
985
    });
986
  }
987
988
  /**
989
   * The base implementation of `_.unary` without support for storing metadata.
990
   *
991
   * @private
992
   * @param {Function} func The function to cap arguments for.
993
   * @returns {Function} Returns the new capped function.
994
   */
995
  function baseUnary(func) {
996
    return function(value) {
997
      return func(value);
998
    };
999
  }
1000
1001
  /**
1002
   * The base implementation of `_.values` and `_.valuesIn` which creates an
1003
   * array of `object` property values corresponding to the property names
1004
   * 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 array of property values.
1010
   */
1011
  function baseValues(object, props) {
1012
    return arrayMap(props, function(key) {
1013
      return object[key];
1014
    });
1015
  }
1016
1017
  /**
1018
   * Checks if a `cache` value for `key` exists.
1019
   *
1020
   * @private
1021
   * @param {Object} cache The cache to query.
1022
   * @param {string} key The key of the entry to check.
1023
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
1024
   */
1025
  function cacheHas(cache, key) {
1026
    return cache.has(key);
1027
  }
1028
1029
  /**
1030
   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
1031
   * that is not found in the character symbols.
1032
   *
1033
   * @private
1034
   * @param {Array} strSymbols The string symbols to inspect.
1035
   * @param {Array} chrSymbols The character symbols to find.
1036
   * @returns {number} Returns the index of the first unmatched string symbol.
1037
   */
1038
  function charsStartIndex(strSymbols, chrSymbols) {
1039
    var index = -1,
1040
        length = strSymbols.length;
1041
1042
    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
1043
    return index;
1044
  }
1045
1046
  /**
1047
   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
1048
   * that is not found in the character symbols.
1049
   *
1050
   * @private
1051
   * @param {Array} strSymbols The string symbols to inspect.
1052
   * @param {Array} chrSymbols The character symbols to find.
1053
   * @returns {number} Returns the index of the last unmatched string symbol.
1054
   */
1055
  function charsEndIndex(strSymbols, chrSymbols) {
1056
    var index = strSymbols.length;
1057
1058
    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
1059
    return index;
1060
  }
1061
1062
  /**
1063
   * Gets the number of `placeholder` occurrences in `array`.
1064
   *
1065
   * @private
1066
   * @param {Array} array The array to inspect.
1067
   * @param {*} placeholder The placeholder to search for.
1068
   * @returns {number} Returns the placeholder count.
1069
   */
1070
  function countHolders(array, placeholder) {
1071
    var length = array.length,
1072
        result = 0;
1073
1074
    while (length--) {
1075
      if (array[length] === placeholder) {
1076
        ++result;
1077
      }
1078
    }
1079
    return result;
1080
  }
1081
1082
  /**
1083
   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
1084
   * letters to basic Latin letters.
1085
   *
1086
   * @private
1087
   * @param {string} letter The matched letter to deburr.
1088
   * @returns {string} Returns the deburred letter.
1089
   */
1090
  var deburrLetter = basePropertyOf(deburredLetters);
1091
1092
  /**
1093
   * Used by `_.escape` to convert characters to HTML entities.
1094
   *
1095
   * @private
1096
   * @param {string} chr The matched character to escape.
1097
   * @returns {string} Returns the escaped character.
1098
   */
1099
  var escapeHtmlChar = basePropertyOf(htmlEscapes);
1100
1101
  /**
1102
   * Used by `_.template` to escape characters for inclusion in compiled string literals.
1103
   *
1104
   * @private
1105
   * @param {string} chr The matched character to escape.
1106
   * @returns {string} Returns the escaped character.
1107
   */
1108
  function escapeStringChar(chr) {
1109
    return '\\' + stringEscapes[chr];
1110
  }
1111
1112
  /**
1113
   * Gets the value at `key` of `object`.
1114
   *
1115
   * @private
1116
   * @param {Object} [object] The object to query.
1117
   * @param {string} key The key of the property to get.
1118
   * @returns {*} Returns the property value.
1119
   */
1120
  function getValue(object, key) {
1121
    return object == null ? undefined : object[key];
1122
  }
1123
1124
  /**
1125
   * Checks if `string` contains Unicode symbols.
1126
   *
1127
   * @private
1128
   * @param {string} string The string to inspect.
1129
   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
1130
   */
1131
  function hasUnicode(string) {
1132
    return reHasUnicode.test(string);
1133
  }
1134
1135
  /**
1136
   * Checks if `string` contains a word composed of Unicode symbols.
1137
   *
1138
   * @private
1139
   * @param {string} string The string to inspect.
1140
   * @returns {boolean} Returns `true` if a word is found, else `false`.
1141
   */
1142
  function hasUnicodeWord(string) {
1143
    return reHasUnicodeWord.test(string);
1144
  }
1145
1146
  /**
1147
   * Converts `iterator` to an array.
1148
   *
1149
   * @private
1150
   * @param {Object} iterator The iterator to convert.
1151
   * @returns {Array} Returns the converted array.
1152
   */
1153
  function iteratorToArray(iterator) {
1154
    var data,
1155
        result = [];
1156
1157
    while (!(data = iterator.next()).done) {
1158
      result.push(data.value);
1159
    }
1160
    return result;
1161
  }
1162
1163
  /**
1164
   * Converts `map` to its key-value pairs.
1165
   *
1166
   * @private
1167
   * @param {Object} map The map to convert.
1168
   * @returns {Array} Returns the key-value pairs.
1169
   */
1170
  function mapToArray(map) {
1171
    var index = -1,
1172
        result = Array(map.size);
1173
1174
    map.forEach(function(value, key) {
1175
      result[++index] = [key, value];
1176
    });
1177
    return result;
1178
  }
1179
1180
  /**
1181
   * Creates a unary function that invokes `func` with its argument transformed.
1182
   *
1183
   * @private
1184
   * @param {Function} func The function to wrap.
1185
   * @param {Function} transform The argument transform.
1186
   * @returns {Function} Returns the new function.
1187
   */
1188
  function overArg(func, transform) {
1189
    return function(arg) {
1190
      return func(transform(arg));
1191
    };
1192
  }
1193
1194
  /**
1195
   * Replaces all `placeholder` elements in `array` with an internal placeholder
1196
   * and returns an array of their indexes.
1197
   *
1198
   * @private
1199
   * @param {Array} array The array to modify.
1200
   * @param {*} placeholder The placeholder to replace.
1201
   * @returns {Array} Returns the new array of placeholder indexes.
1202
   */
1203
  function replaceHolders(array, placeholder) {
1204
    var index = -1,
1205
        length = array.length,
1206
        resIndex = 0,
1207
        result = [];
1208
1209
    while (++index < length) {
1210
      var value = array[index];
1211
      if (value === placeholder || value === PLACEHOLDER) {
1212
        array[index] = PLACEHOLDER;
1213
        result[resIndex++] = index;
1214
      }
1215
    }
1216
    return result;
1217
  }
1218
1219
  /**
1220
   * Gets the value at `key`, unless `key` is "__proto__".
1221
   *
1222
   * @private
1223
   * @param {Object} object The object to query.
1224
   * @param {string} key The key of the property to get.
1225
   * @returns {*} Returns the property value.
1226
   */
1227
  function safeGet(object, key) {
1228
    return key == '__proto__'
1229
      ? undefined
1230
      : object[key];
1231
  }
1232
1233
  /**
1234
   * Converts `set` to an array of its values.
1235
   *
1236
   * @private
1237
   * @param {Object} set The set to convert.
1238
   * @returns {Array} Returns the values.
1239
   */
1240
  function setToArray(set) {
1241
    var index = -1,
1242
        result = Array(set.size);
1243
1244
    set.forEach(function(value) {
1245
      result[++index] = value;
1246
    });
1247
    return result;
1248
  }
1249
1250
  /**
1251
   * Converts `set` to its value-value pairs.
1252
   *
1253
   * @private
1254
   * @param {Object} set The set to convert.
1255
   * @returns {Array} Returns the value-value pairs.
1256
   */
1257
  function setToPairs(set) {
1258
    var index = -1,
1259
        result = Array(set.size);
1260
1261
    set.forEach(function(value) {
1262
      result[++index] = [value, value];
1263
    });
1264
    return result;
1265
  }
1266
1267
  /**
1268
   * A specialized version of `_.indexOf` which performs strict equality
1269
   * comparisons of values, i.e. `===`.
1270
   *
1271
   * @private
1272
   * @param {Array} array The array to inspect.
1273
   * @param {*} value The value to search for.
1274
   * @param {number} fromIndex The index to search from.
1275
   * @returns {number} Returns the index of the matched value, else `-1`.
1276
   */
1277
  function strictIndexOf(array, value, fromIndex) {
1278
    var index = fromIndex - 1,
1279
        length = array.length;
1280
1281
    while (++index < length) {
1282
      if (array[index] === value) {
1283
        return index;
1284
      }
1285
    }
1286
    return -1;
1287
  }
1288
1289
  /**
1290
   * A specialized version of `_.lastIndexOf` which performs strict equality
1291
   * comparisons of values, i.e. `===`.
1292
   *
1293
   * @private
1294
   * @param {Array} array The array to inspect.
1295
   * @param {*} value The value to search for.
1296
   * @param {number} fromIndex The index to search from.
1297
   * @returns {number} Returns the index of the matched value, else `-1`.
1298
   */
1299
  function strictLastIndexOf(array, value, fromIndex) {
1300
    var index = fromIndex + 1;
1301
    while (index--) {
1302
      if (array[index] === value) {
1303
        return index;
1304
      }
1305
    }
1306
    return index;
1307
  }
1308
1309
  /**
1310
   * Gets the number of symbols in `string`.
1311
   *
1312
   * @private
1313
   * @param {string} string The string to inspect.
1314
   * @returns {number} Returns the string size.
1315
   */
1316
  function stringSize(string) {
1317
    return hasUnicode(string)
1318
      ? unicodeSize(string)
1319
      : asciiSize(string);
1320
  }
1321
1322
  /**
1323
   * Converts `string` to an array.
1324
   *
1325
   * @private
1326
   * @param {string} string The string to convert.
1327
   * @returns {Array} Returns the converted array.
1328
   */
1329
  function stringToArray(string) {
1330
    return hasUnicode(string)
1331
      ? unicodeToArray(string)
1332
      : asciiToArray(string);
1333
  }
1334
1335
  /**
1336
   * Used by `_.unescape` to convert HTML entities to characters.
1337
   *
1338
   * @private
1339
   * @param {string} chr The matched character to unescape.
1340
   * @returns {string} Returns the unescaped character.
1341
   */
1342
  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
1343
1344
  /**
1345
   * Gets the size of a Unicode `string`.
1346
   *
1347
   * @private
1348
   * @param {string} string The string inspect.
1349
   * @returns {number} Returns the string size.
1350
   */
1351
  function unicodeSize(string) {
1352
    var result = reUnicode.lastIndex = 0;
1353
    while (reUnicode.test(string)) {
1354
      ++result;
1355
    }
1356
    return result;
1357
  }
1358
1359
  /**
1360
   * Converts a Unicode `string` to an array.
1361
   *
1362
   * @private
1363
   * @param {string} string The string to convert.
1364
   * @returns {Array} Returns the converted array.
1365
   */
1366
  function unicodeToArray(string) {
1367
    return string.match(reUnicode) || [];
1368
  }
1369
1370
  /**
1371
   * Splits a Unicode `string` into an array of its words.
1372
   *
1373
   * @private
1374
   * @param {string} The string to inspect.
1375
   * @returns {Array} Returns the words of `string`.
1376
   */
1377
  function unicodeWords(string) {
1378
    return string.match(reUnicodeWord) || [];
1379
  }
1380
1381
  /*--------------------------------------------------------------------------*/
1382
1383
  /**
1384
   * Create a new pristine `lodash` function using the `context` object.
1385
   *
1386
   * @static
1387
   * @memberOf _
1388
   * @since 1.1.0
1389
   * @category Util
1390
   * @param {Object} [context=root] The context object.
1391
   * @returns {Function} Returns a new `lodash` function.
1392
   * @example
1393
   *
1394
   * _.mixin({ 'foo': _.constant('foo') });
1395
   *
1396
   * var lodash = _.runInContext();
1397
   * lodash.mixin({ 'bar': lodash.constant('bar') });
1398
   *
1399
   * _.isFunction(_.foo);
1400
   * // => true
1401
   * _.isFunction(_.bar);
1402
   * // => false
1403
   *
1404
   * lodash.isFunction(lodash.foo);
1405
   * // => false
1406
   * lodash.isFunction(lodash.bar);
1407
   * // => true
1408
   *
1409
   * // Create a suped-up `defer` in Node.js.
1410
   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
1411
   */
1412
  var runInContext = (function runInContext(context) {
1413
    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
1414
1415
    /** Built-in constructor references. */
1416
    var Array = context.Array,
1417
        Date = context.Date,
1418
        Error = context.Error,
1419
        Function = context.Function,
1420
        Math = context.Math,
1421
        Object = context.Object,
1422
        RegExp = context.RegExp,
1423
        String = context.String,
1424
        TypeError = context.TypeError;
1425
1426
    /** Used for built-in method references. */
1427
    var arrayProto = Array.prototype,
1428
        funcProto = Function.prototype,
1429
        objectProto = Object.prototype;
1430
1431
    /** Used to detect overreaching core-js shims. */
1432
    var coreJsData = context['__core-js_shared__'];
1433
1434
    /** Used to resolve the decompiled source of functions. */
1435
    var funcToString = funcProto.toString;
1436
1437
    /** Used to check objects for own properties. */
1438
    var hasOwnProperty = objectProto.hasOwnProperty;
1439
1440
    /** Used to generate unique IDs. */
1441
    var idCounter = 0;
1442
1443
    /** Used to detect methods masquerading as native. */
1444
    var maskSrcKey = (function() {
1445
      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
1446
      return uid ? ('Symbol(src)_1.' + uid) : '';
1447
    }());
1448
1449
    /**
1450
     * Used to resolve the
1451
     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
1452
     * of values.
1453
     */
1454
    var nativeObjectToString = objectProto.toString;
1455
1456
    /** Used to infer the `Object` constructor. */
1457
    var objectCtorString = funcToString.call(Object);
1458
1459
    /** Used to restore the original `_` reference in `_.noConflict`. */
1460
    var oldDash = root._;
1461
1462
    /** Used to detect if a method is native. */
1463
    var reIsNative = RegExp('^' +
1464
      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
1465
      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
1466
    );
1467
1468
    /** Built-in value references. */
1469
    var Buffer = moduleExports ? context.Buffer : undefined,
1470
        Symbol = context.Symbol,
1471
        Uint8Array = context.Uint8Array,
1472
        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
1473
        getPrototype = overArg(Object.getPrototypeOf, Object),
1474
        objectCreate = Object.create,
1475
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
1476
        splice = arrayProto.splice,
1477
        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
1478
        symIterator = Symbol ? Symbol.iterator : undefined,
1479
        symToStringTag = Symbol ? Symbol.toStringTag : undefined;
1480
1481
    var defineProperty = (function() {
1482
      try {
1483
        var func = getNative(Object, 'defineProperty');
1484
        func({}, '', {});
1485
        return func;
1486
      } catch (e) {}
1487
    }());
1488
1489
    /** Mocked built-ins. */
1490
    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
1491
        ctxNow = Date && Date.now !== root.Date.now && Date.now,
1492
        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
1493
1494
    /* Built-in method references for those with the same name as other `lodash` methods. */
1495
    var nativeCeil = Math.ceil,
1496
        nativeFloor = Math.floor,
1497
        nativeGetSymbols = Object.getOwnPropertySymbols,
1498
        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
1499
        nativeIsFinite = context.isFinite,
1500
        nativeJoin = arrayProto.join,
1501
        nativeKeys = overArg(Object.keys, Object),
1502
        nativeMax = Math.max,
1503
        nativeMin = Math.min,
1504
        nativeNow = Date.now,
1505
        nativeParseInt = context.parseInt,
1506
        nativeRandom = Math.random,
1507
        nativeReverse = arrayProto.reverse;
1508
1509
    /* Built-in method references that are verified to be native. */
1510
    var DataView = getNative(context, 'DataView'),
1511
        Map = getNative(context, 'Map'),
1512
        Promise = getNative(context, 'Promise'),
1513
        Set = getNative(context, 'Set'),
1514
        WeakMap = getNative(context, 'WeakMap'),
1515
        nativeCreate = getNative(Object, 'create');
1516
1517
    /** Used to store function metadata. */
1518
    var metaMap = WeakMap && new WeakMap;
1519
1520
    /** Used to lookup unminified function names. */
1521
    var realNames = {};
1522
1523
    /** Used to detect maps, sets, and weakmaps. */
1524
    var dataViewCtorString = toSource(DataView),
1525
        mapCtorString = toSource(Map),
1526
        promiseCtorString = toSource(Promise),
1527
        setCtorString = toSource(Set),
1528
        weakMapCtorString = toSource(WeakMap);
1529
1530
    /** Used to convert symbols to primitives and strings. */
1531
    var symbolProto = Symbol ? Symbol.prototype : undefined,
1532
        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
1533
        symbolToString = symbolProto ? symbolProto.toString : undefined;
1534
1535
    /*------------------------------------------------------------------------*/
1536
1537
    /**
1538
     * Creates a `lodash` object which wraps `value` to enable implicit method
1539
     * chain sequences. Methods that operate on and return arrays, collections,
1540
     * and functions can be chained together. Methods that retrieve a single value
1541
     * or may return a primitive value will automatically end the chain sequence
1542
     * and return the unwrapped value. Otherwise, the value must be unwrapped
1543
     * with `_#value`.
1544
     *
1545
     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
1546
     * enabled using `_.chain`.
1547
     *
1548
     * The execution of chained methods is lazy, that is, it's deferred until
1549
     * `_#value` is implicitly or explicitly called.
1550
     *
1551
     * Lazy evaluation allows several methods to support shortcut fusion.
1552
     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
1553
     * the creation of intermediate arrays and can greatly reduce the number of
1554
     * iteratee executions. Sections of a chain sequence qualify for shortcut
1555
     * fusion if the section is applied to an array and iteratees accept only
1556
     * one argument. The heuristic for whether a section qualifies for shortcut
1557
     * fusion is subject to change.
1558
     *
1559
     * Chaining is supported in custom builds as long as the `_#value` method is
1560
     * directly or indirectly included in the build.
1561
     *
1562
     * In addition to lodash methods, wrappers have `Array` and `String` methods.
1563
     *
1564
     * The wrapper `Array` methods are:
1565
     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
1566
     *
1567
     * The wrapper `String` methods are:
1568
     * `replace` and `split`
1569
     *
1570
     * The wrapper methods that support shortcut fusion are:
1571
     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
1572
     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
1573
     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
1574
     *
1575
     * The chainable wrapper methods are:
1576
     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
1577
     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
1578
     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
1579
     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
1580
     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
1581
     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
1582
     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
1583
     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
1584
     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
1585
     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
1586
     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
1587
     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
1588
     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
1589
     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
1590
     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
1591
     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
1592
     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
1593
     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
1594
     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
1595
     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
1596
     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
1597
     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
1598
     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
1599
     * `zipObject`, `zipObjectDeep`, and `zipWith`
1600
     *
1601
     * The wrapper methods that are **not** chainable by default are:
1602
     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
1603
     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
1604
     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
1605
     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
1606
     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
1607
     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
1608
     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
1609
     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
1610
     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
1611
     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
1612
     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
1613
     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
1614
     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
1615
     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
1616
     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
1617
     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
1618
     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
1619
     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
1620
     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
1621
     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
1622
     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
1623
     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
1624
     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
1625
     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
1626
     * `upperFirst`, `value`, and `words`
1627
     *
1628
     * @name _
1629
     * @constructor
1630
     * @category Seq
1631
     * @param {*} value The value to wrap in a `lodash` instance.
1632
     * @returns {Object} Returns the new `lodash` wrapper instance.
1633
     * @example
1634
     *
1635
     * function square(n) {
1636
     *   return n * n;
1637
     * }
1638
     *
1639
     * var wrapped = _([1, 2, 3]);
1640
     *
1641
     * // Returns an unwrapped value.
1642
     * wrapped.reduce(_.add);
1643
     * // => 6
1644
     *
1645
     * // Returns a wrapped value.
1646
     * var squares = wrapped.map(square);
1647
     *
1648
     * _.isArray(squares);
1649
     * // => false
1650
     *
1651
     * _.isArray(squares.value());
1652
     * // => true
1653
     */
1654
    function lodash(value) {
1655
      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
1656
        if (value instanceof LodashWrapper) {
1657
          return value;
1658
        }
1659
        if (hasOwnProperty.call(value, '__wrapped__')) {
1660
          return wrapperClone(value);
1661
        }
1662
      }
1663
      return new LodashWrapper(value);
1664
    }
1665
1666
    /**
1667
     * The base implementation of `_.create` without support for assigning
1668
     * properties to the created object.
1669
     *
1670
     * @private
1671
     * @param {Object} proto The object to inherit from.
1672
     * @returns {Object} Returns the new object.
1673
     */
1674
    var baseCreate = (function() {
1675
      function object() {}
1676
      return function(proto) {
1677
        if (!isObject(proto)) {
1678
          return {};
1679
        }
1680
        if (objectCreate) {
1681
          return objectCreate(proto);
1682
        }
1683
        object.prototype = proto;
1684
        var result = new object;
1685
        object.prototype = undefined;
1686
        return result;
1687
      };
1688
    }());
1689
1690
    /**
1691
     * The function whose prototype chain sequence wrappers inherit from.
1692
     *
1693
     * @private
1694
     */
1695
    function baseLodash() {
1696
      // No operation performed.
1697
    }
1698
1699
    /**
1700
     * The base constructor for creating `lodash` wrapper objects.
1701
     *
1702
     * @private
1703
     * @param {*} value The value to wrap.
1704
     * @param {boolean} [chainAll] Enable explicit method chain sequences.
1705
     */
1706
    function LodashWrapper(value, chainAll) {
1707
      this.__wrapped__ = value;
1708
      this.__actions__ = [];
1709
      this.__chain__ = !!chainAll;
1710
      this.__index__ = 0;
1711
      this.__values__ = undefined;
1712
    }
1713
1714
    /**
1715
     * By default, the template delimiters used by lodash are like those in
1716
     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
1717
     * following template settings to use alternative delimiters.
1718
     *
1719
     * @static
1720
     * @memberOf _
1721
     * @type {Object}
1722
     */
1723
    lodash.templateSettings = {
1724
1725
      /**
1726
       * Used to detect `data` property values to be HTML-escaped.
1727
       *
1728
       * @memberOf _.templateSettings
1729
       * @type {RegExp}
1730
       */
1731
      'escape': reEscape,
1732
1733
      /**
1734
       * Used to detect code to be evaluated.
1735
       *
1736
       * @memberOf _.templateSettings
1737
       * @type {RegExp}
1738
       */
1739
      'evaluate': reEvaluate,
1740
1741
      /**
1742
       * Used to detect `data` property values to inject.
1743
       *
1744
       * @memberOf _.templateSettings
1745
       * @type {RegExp}
1746
       */
1747
      'interpolate': reInterpolate,
1748
1749
      /**
1750
       * Used to reference the data object in the template text.
1751
       *
1752
       * @memberOf _.templateSettings
1753
       * @type {string}
1754
       */
1755
      'variable': '',
1756
1757
      /**
1758
       * Used to import variables into the compiled template.
1759
       *
1760
       * @memberOf _.templateSettings
1761
       * @type {Object}
1762
       */
1763
      'imports': {
1764
1765
        /**
1766
         * A reference to the `lodash` function.
1767
         *
1768
         * @memberOf _.templateSettings.imports
1769
         * @type {Function}
1770
         */
1771
        '_': lodash
1772
      }
1773
    };
1774
1775
    // Ensure wrappers are instances of `baseLodash`.
1776
    lodash.prototype = baseLodash.prototype;
1777
    lodash.prototype.constructor = lodash;
1778
1779
    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
1780
    LodashWrapper.prototype.constructor = LodashWrapper;
1781
1782
    /*------------------------------------------------------------------------*/
1783
1784
    /**
1785
     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
1786
     *
1787
     * @private
1788
     * @constructor
1789
     * @param {*} value The value to wrap.
1790
     */
1791
    function LazyWrapper(value) {
1792
      this.__wrapped__ = value;
1793
      this.__actions__ = [];
1794
      this.__dir__ = 1;
1795
      this.__filtered__ = false;
1796
      this.__iteratees__ = [];
1797
      this.__takeCount__ = MAX_ARRAY_LENGTH;
1798
      this.__views__ = [];
1799
    }
1800
1801
    /**
1802
     * Creates a clone of the lazy wrapper object.
1803
     *
1804
     * @private
1805
     * @name clone
1806
     * @memberOf LazyWrapper
1807
     * @returns {Object} Returns the cloned `LazyWrapper` object.
1808
     */
1809
    function lazyClone() {
1810
      var result = new LazyWrapper(this.__wrapped__);
1811
      result.__actions__ = copyArray(this.__actions__);
1812
      result.__dir__ = this.__dir__;
1813
      result.__filtered__ = this.__filtered__;
1814
      result.__iteratees__ = copyArray(this.__iteratees__);
1815
      result.__takeCount__ = this.__takeCount__;
1816
      result.__views__ = copyArray(this.__views__);
1817
      return result;
1818
    }
1819
1820
    /**
1821
     * Reverses the direction of lazy iteration.
1822
     *
1823
     * @private
1824
     * @name reverse
1825
     * @memberOf LazyWrapper
1826
     * @returns {Object} Returns the new reversed `LazyWrapper` object.
1827
     */
1828
    function lazyReverse() {
1829
      if (this.__filtered__) {
1830
        var result = new LazyWrapper(this);
1831
        result.__dir__ = -1;
1832
        result.__filtered__ = true;
1833
      } else {
1834
        result = this.clone();
1835
        result.__dir__ *= -1;
1836
      }
1837
      return result;
1838
    }
1839
1840
    /**
1841
     * Extracts the unwrapped value from its lazy wrapper.
1842
     *
1843
     * @private
1844
     * @name value
1845
     * @memberOf LazyWrapper
1846
     * @returns {*} Returns the unwrapped value.
1847
     */
1848
    function lazyValue() {
1849
      var array = this.__wrapped__.value(),
1850
          dir = this.__dir__,
1851
          isArr = isArray(array),
1852
          isRight = dir < 0,
1853
          arrLength = isArr ? array.length : 0,
1854
          view = getView(0, arrLength, this.__views__),
1855
          start = view.start,
1856
          end = view.end,
1857
          length = end - start,
1858
          index = isRight ? end : (start - 1),
1859
          iteratees = this.__iteratees__,
1860
          iterLength = iteratees.length,
1861
          resIndex = 0,
1862
          takeCount = nativeMin(length, this.__takeCount__);
1863
1864
      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
1865
        return baseWrapperValue(array, this.__actions__);
1866
      }
1867
      var result = [];
1868
1869
      outer:
1870
      while (length-- && resIndex < takeCount) {
1871
        index += dir;
1872
1873
        var iterIndex = -1,
1874
            value = array[index];
1875
1876
        while (++iterIndex < iterLength) {
1877
          var data = iteratees[iterIndex],
1878
              iteratee = data.iteratee,
1879
              type = data.type,
1880
              computed = iteratee(value);
1881
1882
          if (type == LAZY_MAP_FLAG) {
1883
            value = computed;
1884
          } else if (!computed) {
1885
            if (type == LAZY_FILTER_FLAG) {
1886
              continue outer;
1887
            } else {
1888
              break outer;
1889
            }
1890
          }
1891
        }
1892
        result[resIndex++] = value;
1893
      }
1894
      return result;
1895
    }
1896
1897
    // Ensure `LazyWrapper` is an instance of `baseLodash`.
1898
    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
1899
    LazyWrapper.prototype.constructor = LazyWrapper;
1900
1901
    /*------------------------------------------------------------------------*/
1902
1903
    /**
1904
     * Creates a hash object.
1905
     *
1906
     * @private
1907
     * @constructor
1908
     * @param {Array} [entries] The key-value pairs to cache.
1909
     */
1910
    function Hash(entries) {
1911
      var index = -1,
1912
          length = entries == null ? 0 : entries.length;
1913
1914
      this.clear();
1915
      while (++index < length) {
1916
        var entry = entries[index];
1917
        this.set(entry[0], entry[1]);
1918
      }
1919
    }
1920
1921
    /**
1922
     * Removes all key-value entries from the hash.
1923
     *
1924
     * @private
1925
     * @name clear
1926
     * @memberOf Hash
1927
     */
1928
    function hashClear() {
1929
      this.__data__ = nativeCreate ? nativeCreate(null) : {};
1930
      this.size = 0;
1931
    }
1932
1933
    /**
1934
     * Removes `key` and its value from the hash.
1935
     *
1936
     * @private
1937
     * @name delete
1938
     * @memberOf Hash
1939
     * @param {Object} hash The hash to modify.
1940
     * @param {string} key The key of the value to remove.
1941
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
1942
     */
1943
    function hashDelete(key) {
1944
      var result = this.has(key) && delete this.__data__[key];
1945
      this.size -= result ? 1 : 0;
1946
      return result;
1947
    }
1948
1949
    /**
1950
     * Gets the hash value for `key`.
1951
     *
1952
     * @private
1953
     * @name get
1954
     * @memberOf Hash
1955
     * @param {string} key The key of the value to get.
1956
     * @returns {*} Returns the entry value.
1957
     */
1958
    function hashGet(key) {
1959
      var data = this.__data__;
1960
      if (nativeCreate) {
1961
        var result = data[key];
1962
        return result === HASH_UNDEFINED ? undefined : result;
1963
      }
1964
      return hasOwnProperty.call(data, key) ? data[key] : undefined;
1965
    }
1966
1967
    /**
1968
     * Checks if a hash value for `key` exists.
1969
     *
1970
     * @private
1971
     * @name has
1972
     * @memberOf Hash
1973
     * @param {string} key The key of the entry to check.
1974
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
1975
     */
1976
    function hashHas(key) {
1977
      var data = this.__data__;
1978
      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
1979
    }
1980
1981
    /**
1982
     * Sets the hash `key` to `value`.
1983
     *
1984
     * @private
1985
     * @name set
1986
     * @memberOf Hash
1987
     * @param {string} key The key of the value to set.
1988
     * @param {*} value The value to set.
1989
     * @returns {Object} Returns the hash instance.
1990
     */
1991
    function hashSet(key, value) {
1992
      var data = this.__data__;
1993
      this.size += this.has(key) ? 0 : 1;
1994
      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
1995
      return this;
1996
    }
1997
1998
    // Add methods to `Hash`.
1999
    Hash.prototype.clear = hashClear;
2000
    Hash.prototype['delete'] = hashDelete;
2001
    Hash.prototype.get = hashGet;
2002
    Hash.prototype.has = hashHas;
2003
    Hash.prototype.set = hashSet;
2004
2005
    /*------------------------------------------------------------------------*/
2006
2007
    /**
2008
     * Creates an list cache object.
2009
     *
2010
     * @private
2011
     * @constructor
2012
     * @param {Array} [entries] The key-value pairs to cache.
2013
     */
2014
    function ListCache(entries) {
2015
      var index = -1,
2016
          length = entries == null ? 0 : entries.length;
2017
2018
      this.clear();
2019
      while (++index < length) {
2020
        var entry = entries[index];
2021
        this.set(entry[0], entry[1]);
2022
      }
2023
    }
2024
2025
    /**
2026
     * Removes all key-value entries from the list cache.
2027
     *
2028
     * @private
2029
     * @name clear
2030
     * @memberOf ListCache
2031
     */
2032
    function listCacheClear() {
2033
      this.__data__ = [];
2034
      this.size = 0;
2035
    }
2036
2037
    /**
2038
     * Removes `key` and its value from the list cache.
2039
     *
2040
     * @private
2041
     * @name delete
2042
     * @memberOf ListCache
2043
     * @param {string} key The key of the value to remove.
2044
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2045
     */
2046
    function listCacheDelete(key) {
2047
      var data = this.__data__,
2048
          index = assocIndexOf(data, key);
2049
2050
      if (index < 0) {
2051
        return false;
2052
      }
2053
      var lastIndex = data.length - 1;
2054
      if (index == lastIndex) {
2055
        data.pop();
2056
      } else {
2057
        splice.call(data, index, 1);
2058
      }
2059
      --this.size;
2060
      return true;
2061
    }
2062
2063
    /**
2064
     * Gets the list cache value for `key`.
2065
     *
2066
     * @private
2067
     * @name get
2068
     * @memberOf ListCache
2069
     * @param {string} key The key of the value to get.
2070
     * @returns {*} Returns the entry value.
2071
     */
2072
    function listCacheGet(key) {
2073
      var data = this.__data__,
2074
          index = assocIndexOf(data, key);
2075
2076
      return index < 0 ? undefined : data[index][1];
2077
    }
2078
2079
    /**
2080
     * Checks if a list cache value for `key` exists.
2081
     *
2082
     * @private
2083
     * @name has
2084
     * @memberOf ListCache
2085
     * @param {string} key The key of the entry to check.
2086
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2087
     */
2088
    function listCacheHas(key) {
2089
      return assocIndexOf(this.__data__, key) > -1;
2090
    }
2091
2092
    /**
2093
     * Sets the list cache `key` to `value`.
2094
     *
2095
     * @private
2096
     * @name set
2097
     * @memberOf ListCache
2098
     * @param {string} key The key of the value to set.
2099
     * @param {*} value The value to set.
2100
     * @returns {Object} Returns the list cache instance.
2101
     */
2102
    function listCacheSet(key, value) {
2103
      var data = this.__data__,
2104
          index = assocIndexOf(data, key);
2105
2106
      if (index < 0) {
2107
        ++this.size;
2108
        data.push([key, value]);
2109
      } else {
2110
        data[index][1] = value;
2111
      }
2112
      return this;
2113
    }
2114
2115
    // Add methods to `ListCache`.
2116
    ListCache.prototype.clear = listCacheClear;
2117
    ListCache.prototype['delete'] = listCacheDelete;
2118
    ListCache.prototype.get = listCacheGet;
2119
    ListCache.prototype.has = listCacheHas;
2120
    ListCache.prototype.set = listCacheSet;
2121
2122
    /*------------------------------------------------------------------------*/
2123
2124
    /**
2125
     * Creates a map cache object to store key-value pairs.
2126
     *
2127
     * @private
2128
     * @constructor
2129
     * @param {Array} [entries] The key-value pairs to cache.
2130
     */
2131
    function MapCache(entries) {
2132
      var index = -1,
2133
          length = entries == null ? 0 : entries.length;
2134
2135
      this.clear();
2136
      while (++index < length) {
2137
        var entry = entries[index];
2138
        this.set(entry[0], entry[1]);
2139
      }
2140
    }
2141
2142
    /**
2143
     * Removes all key-value entries from the map.
2144
     *
2145
     * @private
2146
     * @name clear
2147
     * @memberOf MapCache
2148
     */
2149
    function mapCacheClear() {
2150
      this.size = 0;
2151
      this.__data__ = {
2152
        'hash': new Hash,
2153
        'map': new (Map || ListCache),
2154
        'string': new Hash
2155
      };
2156
    }
2157
2158
    /**
2159
     * Removes `key` and its value from the map.
2160
     *
2161
     * @private
2162
     * @name delete
2163
     * @memberOf MapCache
2164
     * @param {string} key The key of the value to remove.
2165
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2166
     */
2167
    function mapCacheDelete(key) {
2168
      var result = getMapData(this, key)['delete'](key);
2169
      this.size -= result ? 1 : 0;
2170
      return result;
2171
    }
2172
2173
    /**
2174
     * Gets the map value for `key`.
2175
     *
2176
     * @private
2177
     * @name get
2178
     * @memberOf MapCache
2179
     * @param {string} key The key of the value to get.
2180
     * @returns {*} Returns the entry value.
2181
     */
2182
    function mapCacheGet(key) {
2183
      return getMapData(this, key).get(key);
2184
    }
2185
2186
    /**
2187
     * Checks if a map value for `key` exists.
2188
     *
2189
     * @private
2190
     * @name has
2191
     * @memberOf MapCache
2192
     * @param {string} key The key of the entry to check.
2193
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2194
     */
2195
    function mapCacheHas(key) {
2196
      return getMapData(this, key).has(key);
2197
    }
2198
2199
    /**
2200
     * Sets the map `key` to `value`.
2201
     *
2202
     * @private
2203
     * @name set
2204
     * @memberOf MapCache
2205
     * @param {string} key The key of the value to set.
2206
     * @param {*} value The value to set.
2207
     * @returns {Object} Returns the map cache instance.
2208
     */
2209
    function mapCacheSet(key, value) {
2210
      var data = getMapData(this, key),
2211
          size = data.size;
2212
2213
      data.set(key, value);
2214
      this.size += data.size == size ? 0 : 1;
2215
      return this;
2216
    }
2217
2218
    // Add methods to `MapCache`.
2219
    MapCache.prototype.clear = mapCacheClear;
2220
    MapCache.prototype['delete'] = mapCacheDelete;
2221
    MapCache.prototype.get = mapCacheGet;
2222
    MapCache.prototype.has = mapCacheHas;
2223
    MapCache.prototype.set = mapCacheSet;
2224
2225
    /*------------------------------------------------------------------------*/
2226
2227
    /**
2228
     *
2229
     * Creates an array cache object to store unique values.
2230
     *
2231
     * @private
2232
     * @constructor
2233
     * @param {Array} [values] The values to cache.
2234
     */
2235
    function SetCache(values) {
2236
      var index = -1,
2237
          length = values == null ? 0 : values.length;
2238
2239
      this.__data__ = new MapCache;
2240
      while (++index < length) {
2241
        this.add(values[index]);
2242
      }
2243
    }
2244
2245
    /**
2246
     * Adds `value` to the array cache.
2247
     *
2248
     * @private
2249
     * @name add
2250
     * @memberOf SetCache
2251
     * @alias push
2252
     * @param {*} value The value to cache.
2253
     * @returns {Object} Returns the cache instance.
2254
     */
2255
    function setCacheAdd(value) {
2256
      this.__data__.set(value, HASH_UNDEFINED);
2257
      return this;
2258
    }
2259
2260
    /**
2261
     * Checks if `value` is in the array cache.
2262
     *
2263
     * @private
2264
     * @name has
2265
     * @memberOf SetCache
2266
     * @param {*} value The value to search for.
2267
     * @returns {number} Returns `true` if `value` is found, else `false`.
2268
     */
2269
    function setCacheHas(value) {
2270
      return this.__data__.has(value);
2271
    }
2272
2273
    // Add methods to `SetCache`.
2274
    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
2275
    SetCache.prototype.has = setCacheHas;
2276
2277
    /*------------------------------------------------------------------------*/
2278
2279
    /**
2280
     * Creates a stack cache object to store key-value pairs.
2281
     *
2282
     * @private
2283
     * @constructor
2284
     * @param {Array} [entries] The key-value pairs to cache.
2285
     */
2286
    function Stack(entries) {
2287
      var data = this.__data__ = new ListCache(entries);
2288
      this.size = data.size;
2289
    }
2290
2291
    /**
2292
     * Removes all key-value entries from the stack.
2293
     *
2294
     * @private
2295
     * @name clear
2296
     * @memberOf Stack
2297
     */
2298
    function stackClear() {
2299
      this.__data__ = new ListCache;
2300
      this.size = 0;
2301
    }
2302
2303
    /**
2304
     * Removes `key` and its value from the stack.
2305
     *
2306
     * @private
2307
     * @name delete
2308
     * @memberOf Stack
2309
     * @param {string} key The key of the value to remove.
2310
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2311
     */
2312
    function stackDelete(key) {
2313
      var data = this.__data__,
2314
          result = data['delete'](key);
2315
2316
      this.size = data.size;
2317
      return result;
2318
    }
2319
2320
    /**
2321
     * Gets the stack value for `key`.
2322
     *
2323
     * @private
2324
     * @name get
2325
     * @memberOf Stack
2326
     * @param {string} key The key of the value to get.
2327
     * @returns {*} Returns the entry value.
2328
     */
2329
    function stackGet(key) {
2330
      return this.__data__.get(key);
2331
    }
2332
2333
    /**
2334
     * Checks if a stack value for `key` exists.
2335
     *
2336
     * @private
2337
     * @name has
2338
     * @memberOf Stack
2339
     * @param {string} key The key of the entry to check.
2340
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2341
     */
2342
    function stackHas(key) {
2343
      return this.__data__.has(key);
2344
    }
2345
2346
    /**
2347
     * Sets the stack `key` to `value`.
2348
     *
2349
     * @private
2350
     * @name set
2351
     * @memberOf Stack
2352
     * @param {string} key The key of the value to set.
2353
     * @param {*} value The value to set.
2354
     * @returns {Object} Returns the stack cache instance.
2355
     */
2356
    function stackSet(key, value) {
2357
      var data = this.__data__;
2358
      if (data instanceof ListCache) {
2359
        var pairs = data.__data__;
2360
        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
2361
          pairs.push([key, value]);
2362
          this.size = ++data.size;
2363
          return this;
2364
        }
2365
        data = this.__data__ = new MapCache(pairs);
2366
      }
2367
      data.set(key, value);
2368
      this.size = data.size;
2369
      return this;
2370
    }
2371
2372
    // Add methods to `Stack`.
2373
    Stack.prototype.clear = stackClear;
2374
    Stack.prototype['delete'] = stackDelete;
2375
    Stack.prototype.get = stackGet;
2376
    Stack.prototype.has = stackHas;
2377
    Stack.prototype.set = stackSet;
2378
2379
    /*------------------------------------------------------------------------*/
2380
2381
    /**
2382
     * Creates an array of the enumerable property names of the array-like `value`.
2383
     *
2384
     * @private
2385
     * @param {*} value The value to query.
2386
     * @param {boolean} inherited Specify returning inherited property names.
2387
     * @returns {Array} Returns the array of property names.
2388
     */
2389
    function arrayLikeKeys(value, inherited) {
2390
      var isArr = isArray(value),
2391
          isArg = !isArr && isArguments(value),
2392
          isBuff = !isArr && !isArg && isBuffer(value),
2393
          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
2394
          skipIndexes = isArr || isArg || isBuff || isType,
2395
          result = skipIndexes ? baseTimes(value.length, String) : [],
2396
          length = result.length;
2397
2398
      for (var key in value) {
2399
        if ((inherited || hasOwnProperty.call(value, key)) &&
2400
            !(skipIndexes && (
2401
               // Safari 9 has enumerable `arguments.length` in strict mode.
2402
               key == 'length' ||
2403
               // Node.js 0.10 has enumerable non-index properties on buffers.
2404
               (isBuff && (key == 'offset' || key == 'parent')) ||
2405
               // PhantomJS 2 has enumerable non-index properties on typed arrays.
2406
               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
2407
               // Skip index properties.
2408
               isIndex(key, length)
2409
            ))) {
2410
          result.push(key);
2411
        }
2412
      }
2413
      return result;
2414
    }
2415
2416
    /**
2417
     * A specialized version of `_.sample` for arrays.
2418
     *
2419
     * @private
2420
     * @param {Array} array The array to sample.
2421
     * @returns {*} Returns the random element.
2422
     */
2423
    function arraySample(array) {
2424
      var length = array.length;
2425
      return length ? array[baseRandom(0, length - 1)] : undefined;
2426
    }
2427
2428
    /**
2429
     * A specialized version of `_.sampleSize` for arrays.
2430
     *
2431
     * @private
2432
     * @param {Array} array The array to sample.
2433
     * @param {number} n The number of elements to sample.
2434
     * @returns {Array} Returns the random elements.
2435
     */
2436
    function arraySampleSize(array, n) {
2437
      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
2438
    }
2439
2440
    /**
2441
     * A specialized version of `_.shuffle` for arrays.
2442
     *
2443
     * @private
2444
     * @param {Array} array The array to shuffle.
2445
     * @returns {Array} Returns the new shuffled array.
2446
     */
2447
    function arrayShuffle(array) {
2448
      return shuffleSelf(copyArray(array));
2449
    }
2450
2451
    /**
2452
     * This function is like `assignValue` except that it doesn't assign
2453
     * `undefined` values.
2454
     *
2455
     * @private
2456
     * @param {Object} object The object to modify.
2457
     * @param {string} key The key of the property to assign.
2458
     * @param {*} value The value to assign.
2459
     */
2460
    function assignMergeValue(object, key, value) {
2461
      if ((value !== undefined && !eq(object[key], value)) ||
2462
          (value === undefined && !(key in object))) {
2463
        baseAssignValue(object, key, value);
2464
      }
2465
    }
2466
2467
    /**
2468
     * Assigns `value` to `key` of `object` if the existing value is not equivalent
2469
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2470
     * for equality comparisons.
2471
     *
2472
     * @private
2473
     * @param {Object} object The object to modify.
2474
     * @param {string} key The key of the property to assign.
2475
     * @param {*} value The value to assign.
2476
     */
2477
    function assignValue(object, key, value) {
2478
      var objValue = object[key];
2479
      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
2480
          (value === undefined && !(key in object))) {
2481
        baseAssignValue(object, key, value);
2482
      }
2483
    }
2484
2485
    /**
2486
     * Gets the index at which the `key` is found in `array` of key-value pairs.
2487
     *
2488
     * @private
2489
     * @param {Array} array The array to inspect.
2490
     * @param {*} key The key to search for.
2491
     * @returns {number} Returns the index of the matched value, else `-1`.
2492
     */
2493
    function assocIndexOf(array, key) {
2494
      var length = array.length;
2495
      while (length--) {
2496
        if (eq(array[length][0], key)) {
2497
          return length;
2498
        }
2499
      }
2500
      return -1;
2501
    }
2502
2503
    /**
2504
     * Aggregates elements of `collection` on `accumulator` with keys transformed
2505
     * by `iteratee` and values set by `setter`.
2506
     *
2507
     * @private
2508
     * @param {Array|Object} collection The collection to iterate over.
2509
     * @param {Function} setter The function to set `accumulator` values.
2510
     * @param {Function} iteratee The iteratee to transform keys.
2511
     * @param {Object} accumulator The initial aggregated object.
2512
     * @returns {Function} Returns `accumulator`.
2513
     */
2514
    function baseAggregator(collection, setter, iteratee, accumulator) {
2515
      baseEach(collection, function(value, key, collection) {
2516
        setter(accumulator, value, iteratee(value), collection);
2517
      });
2518
      return accumulator;
2519
    }
2520
2521
    /**
2522
     * The base implementation of `_.assign` without support for multiple sources
2523
     * or `customizer` functions.
2524
     *
2525
     * @private
2526
     * @param {Object} object The destination object.
2527
     * @param {Object} source The source object.
2528
     * @returns {Object} Returns `object`.
2529
     */
2530
    function baseAssign(object, source) {
2531
      return object && copyObject(source, keys(source), object);
2532
    }
2533
2534
    /**
2535
     * The base implementation of `_.assignIn` without support for multiple sources
2536
     * or `customizer` functions.
2537
     *
2538
     * @private
2539
     * @param {Object} object The destination object.
2540
     * @param {Object} source The source object.
2541
     * @returns {Object} Returns `object`.
2542
     */
2543
    function baseAssignIn(object, source) {
2544
      return object && copyObject(source, keysIn(source), object);
2545
    }
2546
2547
    /**
2548
     * The base implementation of `assignValue` and `assignMergeValue` without
2549
     * value checks.
2550
     *
2551
     * @private
2552
     * @param {Object} object The object to modify.
2553
     * @param {string} key The key of the property to assign.
2554
     * @param {*} value The value to assign.
2555
     */
2556
    function baseAssignValue(object, key, value) {
2557
      if (key == '__proto__' && defineProperty) {
2558
        defineProperty(object, key, {
2559
          'configurable': true,
2560
          'enumerable': true,
2561
          'value': value,
2562
          'writable': true
2563
        });
2564
      } else {
2565
        object[key] = value;
2566
      }
2567
    }
2568
2569
    /**
2570
     * The base implementation of `_.at` without support for individual paths.
2571
     *
2572
     * @private
2573
     * @param {Object} object The object to iterate over.
2574
     * @param {string[]} paths The property paths to pick.
2575
     * @returns {Array} Returns the picked elements.
2576
     */
2577
    function baseAt(object, paths) {
2578
      var index = -1,
2579
          length = paths.length,
2580
          result = Array(length),
2581
          skip = object == null;
2582
2583
      while (++index < length) {
2584
        result[index] = skip ? undefined : get(object, paths[index]);
2585
      }
2586
      return result;
2587
    }
2588
2589
    /**
2590
     * The base implementation of `_.clamp` which doesn't coerce arguments.
2591
     *
2592
     * @private
2593
     * @param {number} number The number to clamp.
2594
     * @param {number} [lower] The lower bound.
2595
     * @param {number} upper The upper bound.
2596
     * @returns {number} Returns the clamped number.
2597
     */
2598
    function baseClamp(number, lower, upper) {
2599
      if (number === number) {
2600
        if (upper !== undefined) {
2601
          number = number <= upper ? number : upper;
2602
        }
2603
        if (lower !== undefined) {
2604
          number = number >= lower ? number : lower;
2605
        }
2606
      }
2607
      return number;
2608
    }
2609
2610
    /**
2611
     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
2612
     * traversed objects.
2613
     *
2614
     * @private
2615
     * @param {*} value The value to clone.
2616
     * @param {boolean} bitmask The bitmask flags.
2617
     *  1 - Deep clone
2618
     *  2 - Flatten inherited properties
2619
     *  4 - Clone symbols
2620
     * @param {Function} [customizer] The function to customize cloning.
2621
     * @param {string} [key] The key of `value`.
2622
     * @param {Object} [object] The parent object of `value`.
2623
     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
2624
     * @returns {*} Returns the cloned value.
2625
     */
2626
    function baseClone(value, bitmask, customizer, key, object, stack) {
2627
      var result,
2628
          isDeep = bitmask & CLONE_DEEP_FLAG,
2629
          isFlat = bitmask & CLONE_FLAT_FLAG,
2630
          isFull = bitmask & CLONE_SYMBOLS_FLAG;
2631
2632
      if (customizer) {
2633
        result = object ? customizer(value, key, object, stack) : customizer(value);
2634
      }
2635
      if (result !== undefined) {
2636
        return result;
2637
      }
2638
      if (!isObject(value)) {
2639
        return value;
2640
      }
2641
      var isArr = isArray(value);
2642
      if (isArr) {
2643
        result = initCloneArray(value);
2644
        if (!isDeep) {
2645
          return copyArray(value, result);
2646
        }
2647
      } else {
2648
        var tag = getTag(value),
2649
            isFunc = tag == funcTag || tag == genTag;
2650
2651
        if (isBuffer(value)) {
2652
          return cloneBuffer(value, isDeep);
2653
        }
2654
        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
2655
          result = (isFlat || isFunc) ? {} : initCloneObject(value);
2656
          if (!isDeep) {
2657
            return isFlat
2658
              ? copySymbolsIn(value, baseAssignIn(result, value))
2659
              : copySymbols(value, baseAssign(result, value));
2660
          }
2661
        } else {
2662
          if (!cloneableTags[tag]) {
2663
            return object ? value : {};
2664
          }
2665
          result = initCloneByTag(value, tag, isDeep);
2666
        }
2667
      }
2668
      // Check for circular references and return its corresponding clone.
2669
      stack || (stack = new Stack);
2670
      var stacked = stack.get(value);
2671
      if (stacked) {
2672
        return stacked;
2673
      }
2674
      stack.set(value, result);
2675
2676
      if (isSet(value)) {
2677
        value.forEach(function(subValue) {
2678
          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
2679
        });
2680
2681
        return result;
2682
      }
2683
2684
      if (isMap(value)) {
2685
        value.forEach(function(subValue, key) {
2686
          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
2687
        });
2688
2689
        return result;
2690
      }
2691
2692
      var keysFunc = isFull
2693
        ? (isFlat ? getAllKeysIn : getAllKeys)
2694
        : (isFlat ? keysIn : keys);
2695
2696
      var props = isArr ? undefined : keysFunc(value);
2697
      arrayEach(props || value, function(subValue, key) {
2698
        if (props) {
2699
          key = subValue;
2700
          subValue = value[key];
2701
        }
2702
        // Recursively populate clone (susceptible to call stack limits).
2703
        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
2704
      });
2705
      return result;
2706
    }
2707
2708
    /**
2709
     * The base implementation of `_.conforms` which doesn't clone `source`.
2710
     *
2711
     * @private
2712
     * @param {Object} source The object of property predicates to conform to.
2713
     * @returns {Function} Returns the new spec function.
2714
     */
2715
    function baseConforms(source) {
2716
      var props = keys(source);
2717
      return function(object) {
2718
        return baseConformsTo(object, source, props);
2719
      };
2720
    }
2721
2722
    /**
2723
     * The base implementation of `_.conformsTo` which accepts `props` to check.
2724
     *
2725
     * @private
2726
     * @param {Object} object The object to inspect.
2727
     * @param {Object} source The object of property predicates to conform to.
2728
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
2729
     */
2730
    function baseConformsTo(object, source, props) {
2731
      var length = props.length;
2732
      if (object == null) {
2733
        return !length;
2734
      }
2735
      object = Object(object);
2736
      while (length--) {
2737
        var key = props[length],
2738
            predicate = source[key],
2739
            value = object[key];
2740
2741
        if ((value === undefined && !(key in object)) || !predicate(value)) {
2742
          return false;
2743
        }
2744
      }
2745
      return true;
2746
    }
2747
2748
    /**
2749
     * The base implementation of `_.delay` and `_.defer` which accepts `args`
2750
     * to provide to `func`.
2751
     *
2752
     * @private
2753
     * @param {Function} func The function to delay.
2754
     * @param {number} wait The number of milliseconds to delay invocation.
2755
     * @param {Array} args The arguments to provide to `func`.
2756
     * @returns {number|Object} Returns the timer id or timeout object.
2757
     */
2758
    function baseDelay(func, wait, args) {
2759
      if (typeof func != 'function') {
2760
        throw new TypeError(FUNC_ERROR_TEXT);
2761
      }
2762
      return setTimeout(function() { func.apply(undefined, args); }, wait);
2763
    }
2764
2765
    /**
2766
     * The base implementation of methods like `_.difference` without support
2767
     * for excluding multiple arrays or iteratee shorthands.
2768
     *
2769
     * @private
2770
     * @param {Array} array The array to inspect.
2771
     * @param {Array} values The values to exclude.
2772
     * @param {Function} [iteratee] The iteratee invoked per element.
2773
     * @param {Function} [comparator] The comparator invoked per element.
2774
     * @returns {Array} Returns the new array of filtered values.
2775
     */
2776
    function baseDifference(array, values, iteratee, comparator) {
2777
      var index = -1,
2778
          includes = arrayIncludes,
2779
          isCommon = true,
2780
          length = array.length,
2781
          result = [],
2782
          valuesLength = values.length;
2783
2784
      if (!length) {
2785
        return result;
2786
      }
2787
      if (iteratee) {
2788
        values = arrayMap(values, baseUnary(iteratee));
2789
      }
2790
      if (comparator) {
2791
        includes = arrayIncludesWith;
2792
        isCommon = false;
2793
      }
2794
      else if (values.length >= LARGE_ARRAY_SIZE) {
2795
        includes = cacheHas;
2796
        isCommon = false;
2797
        values = new SetCache(values);
2798
      }
2799
      outer:
2800
      while (++index < length) {
2801
        var value = array[index],
2802
            computed = iteratee == null ? value : iteratee(value);
2803
2804
        value = (comparator || value !== 0) ? value : 0;
2805
        if (isCommon && computed === computed) {
2806
          var valuesIndex = valuesLength;
2807
          while (valuesIndex--) {
2808
            if (values[valuesIndex] === computed) {
2809
              continue outer;
2810
            }
2811
          }
2812
          result.push(value);
2813
        }
2814
        else if (!includes(values, computed, comparator)) {
2815
          result.push(value);
2816
        }
2817
      }
2818
      return result;
2819
    }
2820
2821
    /**
2822
     * The base implementation of `_.forEach` without support for iteratee shorthands.
2823
     *
2824
     * @private
2825
     * @param {Array|Object} collection The collection to iterate over.
2826
     * @param {Function} iteratee The function invoked per iteration.
2827
     * @returns {Array|Object} Returns `collection`.
2828
     */
2829
    var baseEach = createBaseEach(baseForOwn);
2830
2831
    /**
2832
     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
2833
     *
2834
     * @private
2835
     * @param {Array|Object} collection The collection to iterate over.
2836
     * @param {Function} iteratee The function invoked per iteration.
2837
     * @returns {Array|Object} Returns `collection`.
2838
     */
2839
    var baseEachRight = createBaseEach(baseForOwnRight, true);
2840
2841
    /**
2842
     * The base implementation of `_.every` without support for iteratee shorthands.
2843
     *
2844
     * @private
2845
     * @param {Array|Object} collection The collection to iterate over.
2846
     * @param {Function} predicate The function invoked per iteration.
2847
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
2848
     *  else `false`
2849
     */
2850
    function baseEvery(collection, predicate) {
2851
      var result = true;
2852
      baseEach(collection, function(value, index, collection) {
2853
        result = !!predicate(value, index, collection);
2854
        return result;
2855
      });
2856
      return result;
2857
    }
2858
2859
    /**
2860
     * The base implementation of methods like `_.max` and `_.min` which accepts a
2861
     * `comparator` to determine the extremum value.
2862
     *
2863
     * @private
2864
     * @param {Array} array The array to iterate over.
2865
     * @param {Function} iteratee The iteratee invoked per iteration.
2866
     * @param {Function} comparator The comparator used to compare values.
2867
     * @returns {*} Returns the extremum value.
2868
     */
2869
    function baseExtremum(array, iteratee, comparator) {
2870
      var index = -1,
2871
          length = array.length;
2872
2873
      while (++index < length) {
2874
        var value = array[index],
2875
            current = iteratee(value);
2876
2877
        if (current != null && (computed === undefined
2878
              ? (current === current && !isSymbol(current))
2879
              : comparator(current, computed)
2880
            )) {
2881
          var computed = current,
2882
              result = value;
2883
        }
2884
      }
2885
      return result;
2886
    }
2887
2888
    /**
2889
     * The base implementation of `_.fill` without an iteratee call guard.
2890
     *
2891
     * @private
2892
     * @param {Array} array The array to fill.
2893
     * @param {*} value The value to fill `array` with.
2894
     * @param {number} [start=0] The start position.
2895
     * @param {number} [end=array.length] The end position.
2896
     * @returns {Array} Returns `array`.
2897
     */
2898
    function baseFill(array, value, start, end) {
2899
      var length = array.length;
2900
2901
      start = toInteger(start);
2902
      if (start < 0) {
2903
        start = -start > length ? 0 : (length + start);
2904
      }
2905
      end = (end === undefined || end > length) ? length : toInteger(end);
2906
      if (end < 0) {
2907
        end += length;
2908
      }
2909
      end = start > end ? 0 : toLength(end);
2910
      while (start < end) {
2911
        array[start++] = value;
2912
      }
2913
      return array;
2914
    }
2915
2916
    /**
2917
     * The base implementation of `_.filter` without support for iteratee shorthands.
2918
     *
2919
     * @private
2920
     * @param {Array|Object} collection The collection to iterate over.
2921
     * @param {Function} predicate The function invoked per iteration.
2922
     * @returns {Array} Returns the new filtered array.
2923
     */
2924
    function baseFilter(collection, predicate) {
2925
      var result = [];
2926
      baseEach(collection, function(value, index, collection) {
2927
        if (predicate(value, index, collection)) {
2928
          result.push(value);
2929
        }
2930
      });
2931
      return result;
2932
    }
2933
2934
    /**
2935
     * The base implementation of `_.flatten` with support for restricting flattening.
2936
     *
2937
     * @private
2938
     * @param {Array} array The array to flatten.
2939
     * @param {number} depth The maximum recursion depth.
2940
     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
2941
     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
2942
     * @param {Array} [result=[]] The initial result value.
2943
     * @returns {Array} Returns the new flattened array.
2944
     */
2945
    function baseFlatten(array, depth, predicate, isStrict, result) {
2946
      var index = -1,
2947
          length = array.length;
2948
2949
      predicate || (predicate = isFlattenable);
2950
      result || (result = []);
2951
2952
      while (++index < length) {
2953
        var value = array[index];
2954
        if (depth > 0 && predicate(value)) {
2955
          if (depth > 1) {
2956
            // Recursively flatten arrays (susceptible to call stack limits).
2957
            baseFlatten(value, depth - 1, predicate, isStrict, result);
2958
          } else {
2959
            arrayPush(result, value);
2960
          }
2961
        } else if (!isStrict) {
2962
          result[result.length] = value;
2963
        }
2964
      }
2965
      return result;
2966
    }
2967
2968
    /**
2969
     * The base implementation of `baseForOwn` which iterates over `object`
2970
     * properties returned by `keysFunc` and invokes `iteratee` for each property.
2971
     * Iteratee functions may exit iteration early by explicitly returning `false`.
2972
     *
2973
     * @private
2974
     * @param {Object} object The object to iterate over.
2975
     * @param {Function} iteratee The function invoked per iteration.
2976
     * @param {Function} keysFunc The function to get the keys of `object`.
2977
     * @returns {Object} Returns `object`.
2978
     */
2979
    var baseFor = createBaseFor();
2980
2981
    /**
2982
     * This function is like `baseFor` except that it iterates over properties
2983
     * in the opposite order.
2984
     *
2985
     * @private
2986
     * @param {Object} object The object to iterate over.
2987
     * @param {Function} iteratee The function invoked per iteration.
2988
     * @param {Function} keysFunc The function to get the keys of `object`.
2989
     * @returns {Object} Returns `object`.
2990
     */
2991
    var baseForRight = createBaseFor(true);
2992
2993
    /**
2994
     * The base implementation of `_.forOwn` without support for iteratee shorthands.
2995
     *
2996
     * @private
2997
     * @param {Object} object The object to iterate over.
2998
     * @param {Function} iteratee The function invoked per iteration.
2999
     * @returns {Object} Returns `object`.
3000
     */
3001
    function baseForOwn(object, iteratee) {
3002
      return object && baseFor(object, iteratee, keys);
3003
    }
3004
3005
    /**
3006
     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
3007
     *
3008
     * @private
3009
     * @param {Object} object The object to iterate over.
3010
     * @param {Function} iteratee The function invoked per iteration.
3011
     * @returns {Object} Returns `object`.
3012
     */
3013
    function baseForOwnRight(object, iteratee) {
3014
      return object && baseForRight(object, iteratee, keys);
3015
    }
3016
3017
    /**
3018
     * The base implementation of `_.functions` which creates an array of
3019
     * `object` function property names filtered from `props`.
3020
     *
3021
     * @private
3022
     * @param {Object} object The object to inspect.
3023
     * @param {Array} props The property names to filter.
3024
     * @returns {Array} Returns the function names.
3025
     */
3026
    function baseFunctions(object, props) {
3027
      return arrayFilter(props, function(key) {
3028
        return isFunction(object[key]);
3029
      });
3030
    }
3031
3032
    /**
3033
     * The base implementation of `_.get` without support for default values.
3034
     *
3035
     * @private
3036
     * @param {Object} object The object to query.
3037
     * @param {Array|string} path The path of the property to get.
3038
     * @returns {*} Returns the resolved value.
3039
     */
3040
    function baseGet(object, path) {
3041
      path = castPath(path, object);
3042
3043
      var index = 0,
3044
          length = path.length;
3045
3046
      while (object != null && index < length) {
3047
        object = object[toKey(path[index++])];
3048
      }
3049
      return (index && index == length) ? object : undefined;
3050
    }
3051
3052
    /**
3053
     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
3054
     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
3055
     * symbols of `object`.
3056
     *
3057
     * @private
3058
     * @param {Object} object The object to query.
3059
     * @param {Function} keysFunc The function to get the keys of `object`.
3060
     * @param {Function} symbolsFunc The function to get the symbols of `object`.
3061
     * @returns {Array} Returns the array of property names and symbols.
3062
     */
3063
    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
3064
      var result = keysFunc(object);
3065
      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
3066
    }
3067
3068
    /**
3069
     * The base implementation of `getTag` without fallbacks for buggy environments.
3070
     *
3071
     * @private
3072
     * @param {*} value The value to query.
3073
     * @returns {string} Returns the `toStringTag`.
3074
     */
3075
    function baseGetTag(value) {
3076
      if (value == null) {
3077
        return value === undefined ? undefinedTag : nullTag;
3078
      }
3079
      return (symToStringTag && symToStringTag in Object(value))
3080
        ? getRawTag(value)
3081
        : objectToString(value);
3082
    }
3083
3084
    /**
3085
     * The base implementation of `_.gt` which doesn't coerce arguments.
3086
     *
3087
     * @private
3088
     * @param {*} value The value to compare.
3089
     * @param {*} other The other value to compare.
3090
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
3091
     *  else `false`.
3092
     */
3093
    function baseGt(value, other) {
3094
      return value > other;
3095
    }
3096
3097
    /**
3098
     * The base implementation of `_.has` without support for deep paths.
3099
     *
3100
     * @private
3101
     * @param {Object} [object] The object to query.
3102
     * @param {Array|string} key The key to check.
3103
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
3104
     */
3105
    function baseHas(object, key) {
3106
      return object != null && hasOwnProperty.call(object, key);
3107
    }
3108
3109
    /**
3110
     * The base implementation of `_.hasIn` without support for deep paths.
3111
     *
3112
     * @private
3113
     * @param {Object} [object] The object to query.
3114
     * @param {Array|string} key The key to check.
3115
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
3116
     */
3117
    function baseHasIn(object, key) {
3118
      return object != null && key in Object(object);
3119
    }
3120
3121
    /**
3122
     * The base implementation of `_.inRange` which doesn't coerce arguments.
3123
     *
3124
     * @private
3125
     * @param {number} number The number to check.
3126
     * @param {number} start The start of the range.
3127
     * @param {number} end The end of the range.
3128
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
3129
     */
3130
    function baseInRange(number, start, end) {
3131
      return number >= nativeMin(start, end) && number < nativeMax(start, end);
3132
    }
3133
3134
    /**
3135
     * The base implementation of methods like `_.intersection`, without support
3136
     * for iteratee shorthands, that accepts an array of arrays to inspect.
3137
     *
3138
     * @private
3139
     * @param {Array} arrays The arrays to inspect.
3140
     * @param {Function} [iteratee] The iteratee invoked per element.
3141
     * @param {Function} [comparator] The comparator invoked per element.
3142
     * @returns {Array} Returns the new array of shared values.
3143
     */
3144
    function baseIntersection(arrays, iteratee, comparator) {
3145
      var includes = comparator ? arrayIncludesWith : arrayIncludes,
3146
          length = arrays[0].length,
3147
          othLength = arrays.length,
3148
          othIndex = othLength,
3149
          caches = Array(othLength),
3150
          maxLength = Infinity,
3151
          result = [];
3152
3153
      while (othIndex--) {
3154
        var array = arrays[othIndex];
3155
        if (othIndex && iteratee) {
3156
          array = arrayMap(array, baseUnary(iteratee));
3157
        }
3158
        maxLength = nativeMin(array.length, maxLength);
3159
        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
3160
          ? new SetCache(othIndex && array)
3161
          : undefined;
3162
      }
3163
      array = arrays[0];
3164
3165
      var index = -1,
3166
          seen = caches[0];
3167
3168
      outer:
3169
      while (++index < length && result.length < maxLength) {
3170
        var value = array[index],
3171
            computed = iteratee ? iteratee(value) : value;
3172
3173
        value = (comparator || value !== 0) ? value : 0;
3174
        if (!(seen
3175
              ? cacheHas(seen, computed)
3176
              : includes(result, computed, comparator)
3177
            )) {
3178
          othIndex = othLength;
3179
          while (--othIndex) {
3180
            var cache = caches[othIndex];
3181
            if (!(cache
3182
                  ? cacheHas(cache, computed)
3183
                  : includes(arrays[othIndex], computed, comparator))
3184
                ) {
3185
              continue outer;
3186
            }
3187
          }
3188
          if (seen) {
3189
            seen.push(computed);
3190
          }
3191
          result.push(value);
3192
        }
3193
      }
3194
      return result;
3195
    }
3196
3197
    /**
3198
     * The base implementation of `_.invert` and `_.invertBy` which inverts
3199
     * `object` with values transformed by `iteratee` and set by `setter`.
3200
     *
3201
     * @private
3202
     * @param {Object} object The object to iterate over.
3203
     * @param {Function} setter The function to set `accumulator` values.
3204
     * @param {Function} iteratee The iteratee to transform values.
3205
     * @param {Object} accumulator The initial inverted object.
3206
     * @returns {Function} Returns `accumulator`.
3207
     */
3208
    function baseInverter(object, setter, iteratee, accumulator) {
3209
      baseForOwn(object, function(value, key, object) {
3210
        setter(accumulator, iteratee(value), key, object);
3211
      });
3212
      return accumulator;
3213
    }
3214
3215
    /**
3216
     * The base implementation of `_.invoke` without support for individual
3217
     * method arguments.
3218
     *
3219
     * @private
3220
     * @param {Object} object The object to query.
3221
     * @param {Array|string} path The path of the method to invoke.
3222
     * @param {Array} args The arguments to invoke the method with.
3223
     * @returns {*} Returns the result of the invoked method.
3224
     */
3225
    function baseInvoke(object, path, args) {
3226
      path = castPath(path, object);
3227
      object = parent(object, path);
3228
      var func = object == null ? object : object[toKey(last(path))];
3229
      return func == null ? undefined : apply(func, object, args);
3230
    }
3231
3232
    /**
3233
     * The base implementation of `_.isArguments`.
3234
     *
3235
     * @private
3236
     * @param {*} value The value to check.
3237
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
3238
     */
3239
    function baseIsArguments(value) {
3240
      return isObjectLike(value) && baseGetTag(value) == argsTag;
3241
    }
3242
3243
    /**
3244
     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
3245
     *
3246
     * @private
3247
     * @param {*} value The value to check.
3248
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
3249
     */
3250
    function baseIsArrayBuffer(value) {
3251
      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
3252
    }
3253
3254
    /**
3255
     * The base implementation of `_.isDate` without Node.js optimizations.
3256
     *
3257
     * @private
3258
     * @param {*} value The value to check.
3259
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
3260
     */
3261
    function baseIsDate(value) {
3262
      return isObjectLike(value) && baseGetTag(value) == dateTag;
3263
    }
3264
3265
    /**
3266
     * The base implementation of `_.isEqual` which supports partial comparisons
3267
     * and tracks traversed objects.
3268
     *
3269
     * @private
3270
     * @param {*} value The value to compare.
3271
     * @param {*} other The other value to compare.
3272
     * @param {boolean} bitmask The bitmask flags.
3273
     *  1 - Unordered comparison
3274
     *  2 - Partial comparison
3275
     * @param {Function} [customizer] The function to customize comparisons.
3276
     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
3277
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
3278
     */
3279
    function baseIsEqual(value, other, bitmask, customizer, stack) {
3280
      if (value === other) {
3281
        return true;
3282
      }
3283
      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
3284
        return value !== value && other !== other;
3285
      }
3286
      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
3287
    }
3288
3289
    /**
3290
     * A specialized version of `baseIsEqual` for arrays and objects which performs
3291
     * deep comparisons and tracks traversed objects enabling objects with circular
3292
     * references to be compared.
3293
     *
3294
     * @private
3295
     * @param {Object} object The object to compare.
3296
     * @param {Object} other The other object to compare.
3297
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
3298
     * @param {Function} customizer The function to customize comparisons.
3299
     * @param {Function} equalFunc The function to determine equivalents of values.
3300
     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
3301
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
3302
     */
3303
    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
3304
      var objIsArr = isArray(object),
3305
          othIsArr = isArray(other),
3306
          objTag = objIsArr ? arrayTag : getTag(object),
3307
          othTag = othIsArr ? arrayTag : getTag(other);
3308
3309
      objTag = objTag == argsTag ? objectTag : objTag;
3310
      othTag = othTag == argsTag ? objectTag : othTag;
3311
3312
      var objIsObj = objTag == objectTag,
3313
          othIsObj = othTag == objectTag,
3314
          isSameTag = objTag == othTag;
3315
3316
      if (isSameTag && isBuffer(object)) {
3317
        if (!isBuffer(other)) {
3318
          return false;
3319
        }
3320
        objIsArr = true;
3321
        objIsObj = false;
3322
      }
3323
      if (isSameTag && !objIsObj) {
3324
        stack || (stack = new Stack);
3325
        return (objIsArr || isTypedArray(object))
3326
          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
3327
          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
3328
      }
3329
      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
3330
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
3331
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
3332
3333
        if (objIsWrapped || othIsWrapped) {
3334
          var objUnwrapped = objIsWrapped ? object.value() : object,
3335
              othUnwrapped = othIsWrapped ? other.value() : other;
3336
3337
          stack || (stack = new Stack);
3338
          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
3339
        }
3340
      }
3341
      if (!isSameTag) {
3342
        return false;
3343
      }
3344
      stack || (stack = new Stack);
3345
      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
3346
    }
3347
3348
    /**
3349
     * The base implementation of `_.isMap` without Node.js optimizations.
3350
     *
3351
     * @private
3352
     * @param {*} value The value to check.
3353
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
3354
     */
3355
    function baseIsMap(value) {
3356
      return isObjectLike(value) && getTag(value) == mapTag;
3357
    }
3358
3359
    /**
3360
     * The base implementation of `_.isMatch` without support for iteratee shorthands.
3361
     *
3362
     * @private
3363
     * @param {Object} object The object to inspect.
3364
     * @param {Object} source The object of property values to match.
3365
     * @param {Array} matchData The property names, values, and compare flags to match.
3366
     * @param {Function} [customizer] The function to customize comparisons.
3367
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
3368
     */
3369
    function baseIsMatch(object, source, matchData, customizer) {
3370
      var index = matchData.length,
3371
          length = index,
3372
          noCustomizer = !customizer;
3373
3374
      if (object == null) {
3375
        return !length;
3376
      }
3377
      object = Object(object);
3378
      while (index--) {
3379
        var data = matchData[index];
3380
        if ((noCustomizer && data[2])
3381
              ? data[1] !== object[data[0]]
3382
              : !(data[0] in object)
3383
            ) {
3384
          return false;
3385
        }
3386
      }
3387
      while (++index < length) {
3388
        data = matchData[index];
3389
        var key = data[0],
3390
            objValue = object[key],
3391
            srcValue = data[1];
3392
3393
        if (noCustomizer && data[2]) {
3394
          if (objValue === undefined && !(key in object)) {
3395
            return false;
3396
          }
3397
        } else {
3398
          var stack = new Stack;
3399
          if (customizer) {
3400
            var result = customizer(objValue, srcValue, key, object, source, stack);
3401
          }
3402
          if (!(result === undefined
3403
                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
3404
                : result
3405
              )) {
3406
            return false;
3407
          }
3408
        }
3409
      }
3410
      return true;
3411
    }
3412
3413
    /**
3414
     * The base implementation of `_.isNative` without bad shim checks.
3415
     *
3416
     * @private
3417
     * @param {*} value The value to check.
3418
     * @returns {boolean} Returns `true` if `value` is a native function,
3419
     *  else `false`.
3420
     */
3421
    function baseIsNative(value) {
3422
      if (!isObject(value) || isMasked(value)) {
3423
        return false;
3424
      }
3425
      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
3426
      return pattern.test(toSource(value));
3427
    }
3428
3429
    /**
3430
     * The base implementation of `_.isRegExp` without Node.js optimizations.
3431
     *
3432
     * @private
3433
     * @param {*} value The value to check.
3434
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
3435
     */
3436
    function baseIsRegExp(value) {
3437
      return isObjectLike(value) && baseGetTag(value) == regexpTag;
3438
    }
3439
3440
    /**
3441
     * The base implementation of `_.isSet` without Node.js optimizations.
3442
     *
3443
     * @private
3444
     * @param {*} value The value to check.
3445
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
3446
     */
3447
    function baseIsSet(value) {
3448
      return isObjectLike(value) && getTag(value) == setTag;
3449
    }
3450
3451
    /**
3452
     * The base implementation of `_.isTypedArray` without Node.js optimizations.
3453
     *
3454
     * @private
3455
     * @param {*} value The value to check.
3456
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
3457
     */
3458
    function baseIsTypedArray(value) {
3459
      return isObjectLike(value) &&
3460
        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
3461
    }
3462
3463
    /**
3464
     * The base implementation of `_.iteratee`.
3465
     *
3466
     * @private
3467
     * @param {*} [value=_.identity] The value to convert to an iteratee.
3468
     * @returns {Function} Returns the iteratee.
3469
     */
3470
    function baseIteratee(value) {
3471
      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
3472
      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
3473
      if (typeof value == 'function') {
3474
        return value;
3475
      }
3476
      if (value == null) {
3477
        return identity;
3478
      }
3479
      if (typeof value == 'object') {
3480
        return isArray(value)
3481
          ? baseMatchesProperty(value[0], value[1])
3482
          : baseMatches(value);
3483
      }
3484
      return property(value);
3485
    }
3486
3487
    /**
3488
     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
3489
     *
3490
     * @private
3491
     * @param {Object} object The object to query.
3492
     * @returns {Array} Returns the array of property names.
3493
     */
3494
    function baseKeys(object) {
3495
      if (!isPrototype(object)) {
3496
        return nativeKeys(object);
3497
      }
3498
      var result = [];
3499
      for (var key in Object(object)) {
3500
        if (hasOwnProperty.call(object, key) && key != 'constructor') {
3501
          result.push(key);
3502
        }
3503
      }
3504
      return result;
3505
    }
3506
3507
    /**
3508
     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
3509
     *
3510
     * @private
3511
     * @param {Object} object The object to query.
3512
     * @returns {Array} Returns the array of property names.
3513
     */
3514
    function baseKeysIn(object) {
3515
      if (!isObject(object)) {
3516
        return nativeKeysIn(object);
3517
      }
3518
      var isProto = isPrototype(object),
3519
          result = [];
3520
3521
      for (var key in object) {
3522
        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
3523
          result.push(key);
3524
        }
3525
      }
3526
      return result;
3527
    }
3528
3529
    /**
3530
     * The base implementation of `_.lt` which doesn't coerce arguments.
3531
     *
3532
     * @private
3533
     * @param {*} value The value to compare.
3534
     * @param {*} other The other value to compare.
3535
     * @returns {boolean} Returns `true` if `value` is less than `other`,
3536
     *  else `false`.
3537
     */
3538
    function baseLt(value, other) {
3539
      return value < other;
3540
    }
3541
3542
    /**
3543
     * The base implementation of `_.map` without support for iteratee shorthands.
3544
     *
3545
     * @private
3546
     * @param {Array|Object} collection The collection to iterate over.
3547
     * @param {Function} iteratee The function invoked per iteration.
3548
     * @returns {Array} Returns the new mapped array.
3549
     */
3550
    function baseMap(collection, iteratee) {
3551
      var index = -1,
3552
          result = isArrayLike(collection) ? Array(collection.length) : [];
3553
3554
      baseEach(collection, function(value, key, collection) {
3555
        result[++index] = iteratee(value, key, collection);
3556
      });
3557
      return result;
3558
    }
3559
3560
    /**
3561
     * The base implementation of `_.matches` which doesn't clone `source`.
3562
     *
3563
     * @private
3564
     * @param {Object} source The object of property values to match.
3565
     * @returns {Function} Returns the new spec function.
3566
     */
3567
    function baseMatches(source) {
3568
      var matchData = getMatchData(source);
3569
      if (matchData.length == 1 && matchData[0][2]) {
3570
        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
3571
      }
3572
      return function(object) {
3573
        return object === source || baseIsMatch(object, source, matchData);
3574
      };
3575
    }
3576
3577
    /**
3578
     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
3579
     *
3580
     * @private
3581
     * @param {string} path The path of the property to get.
3582
     * @param {*} srcValue The value to match.
3583
     * @returns {Function} Returns the new spec function.
3584
     */
3585
    function baseMatchesProperty(path, srcValue) {
3586
      if (isKey(path) && isStrictComparable(srcValue)) {
3587
        return matchesStrictComparable(toKey(path), srcValue);
3588
      }
3589
      return function(object) {
3590
        var objValue = get(object, path);
3591
        return (objValue === undefined && objValue === srcValue)
3592
          ? hasIn(object, path)
3593
          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
3594
      };
3595
    }
3596
3597
    /**
3598
     * The base implementation of `_.merge` without support for multiple sources.
3599
     *
3600
     * @private
3601
     * @param {Object} object The destination object.
3602
     * @param {Object} source The source object.
3603
     * @param {number} srcIndex The index of `source`.
3604
     * @param {Function} [customizer] The function to customize merged values.
3605
     * @param {Object} [stack] Tracks traversed source values and their merged
3606
     *  counterparts.
3607
     */
3608
    function baseMerge(object, source, srcIndex, customizer, stack) {
3609
      if (object === source) {
3610
        return;
3611
      }
3612
      baseFor(source, function(srcValue, key) {
3613
        if (isObject(srcValue)) {
3614
          stack || (stack = new Stack);
3615
          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
3616
        }
3617
        else {
3618
          var newValue = customizer
3619
            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
3620
            : undefined;
3621
3622
          if (newValue === undefined) {
3623
            newValue = srcValue;
3624
          }
3625
          assignMergeValue(object, key, newValue);
3626
        }
3627
      }, keysIn);
3628
    }
3629
3630
    /**
3631
     * A specialized version of `baseMerge` for arrays and objects which performs
3632
     * deep merges and tracks traversed objects enabling objects with circular
3633
     * references to be merged.
3634
     *
3635
     * @private
3636
     * @param {Object} object The destination object.
3637
     * @param {Object} source The source object.
3638
     * @param {string} key The key of the value to merge.
3639
     * @param {number} srcIndex The index of `source`.
3640
     * @param {Function} mergeFunc The function to merge values.
3641
     * @param {Function} [customizer] The function to customize assigned values.
3642
     * @param {Object} [stack] Tracks traversed source values and their merged
3643
     *  counterparts.
3644
     */
3645
    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
3646
      var objValue = safeGet(object, key),
3647
          srcValue = safeGet(source, key),
3648
          stacked = stack.get(srcValue);
3649
3650
      if (stacked) {
3651
        assignMergeValue(object, key, stacked);
3652
        return;
3653
      }
3654
      var newValue = customizer
3655
        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
3656
        : undefined;
3657
3658
      var isCommon = newValue === undefined;
3659
3660
      if (isCommon) {
3661
        var isArr = isArray(srcValue),
3662
            isBuff = !isArr && isBuffer(srcValue),
3663
            isTyped = !isArr && !isBuff && isTypedArray(srcValue);
3664
3665
        newValue = srcValue;
3666
        if (isArr || isBuff || isTyped) {
3667
          if (isArray(objValue)) {
3668
            newValue = objValue;
3669
          }
3670
          else if (isArrayLikeObject(objValue)) {
3671
            newValue = copyArray(objValue);
3672
          }
3673
          else if (isBuff) {
3674
            isCommon = false;
3675
            newValue = cloneBuffer(srcValue, true);
3676
          }
3677
          else if (isTyped) {
3678
            isCommon = false;
3679
            newValue = cloneTypedArray(srcValue, true);
3680
          }
3681
          else {
3682
            newValue = [];
3683
          }
3684
        }
3685
        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
3686
          newValue = objValue;
3687
          if (isArguments(objValue)) {
3688
            newValue = toPlainObject(objValue);
3689
          }
3690
          else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
3691
            newValue = initCloneObject(srcValue);
3692
          }
3693
        }
3694
        else {
3695
          isCommon = false;
3696
        }
3697
      }
3698
      if (isCommon) {
3699
        // Recursively merge objects and arrays (susceptible to call stack limits).
3700
        stack.set(srcValue, newValue);
3701
        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
3702
        stack['delete'](srcValue);
3703
      }
3704
      assignMergeValue(object, key, newValue);
3705
    }
3706
3707
    /**
3708
     * The base implementation of `_.nth` which doesn't coerce arguments.
3709
     *
3710
     * @private
3711
     * @param {Array} array The array to query.
3712
     * @param {number} n The index of the element to return.
3713
     * @returns {*} Returns the nth element of `array`.
3714
     */
3715
    function baseNth(array, n) {
3716
      var length = array.length;
3717
      if (!length) {
3718
        return;
3719
      }
3720
      n += n < 0 ? length : 0;
3721
      return isIndex(n, length) ? array[n] : undefined;
3722
    }
3723
3724
    /**
3725
     * The base implementation of `_.orderBy` without param guards.
3726
     *
3727
     * @private
3728
     * @param {Array|Object} collection The collection to iterate over.
3729
     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
3730
     * @param {string[]} orders The sort orders of `iteratees`.
3731
     * @returns {Array} Returns the new sorted array.
3732
     */
3733
    function baseOrderBy(collection, iteratees, orders) {
3734
      var index = -1;
3735
      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));
3736
3737
      var result = baseMap(collection, function(value, key, collection) {
3738
        var criteria = arrayMap(iteratees, function(iteratee) {
3739
          return iteratee(value);
3740
        });
3741
        return { 'criteria': criteria, 'index': ++index, 'value': value };
3742
      });
3743
3744
      return baseSortBy(result, function(object, other) {
3745
        return compareMultiple(object, other, orders);
3746
      });
3747
    }
3748
3749
    /**
3750
     * The base implementation of `_.pick` without support for individual
3751
     * property identifiers.
3752
     *
3753
     * @private
3754
     * @param {Object} object The source object.
3755
     * @param {string[]} paths The property paths to pick.
3756
     * @returns {Object} Returns the new object.
3757
     */
3758
    function basePick(object, paths) {
3759
      return basePickBy(object, paths, function(value, path) {
3760
        return hasIn(object, path);
3761
      });
3762
    }
3763
3764
    /**
3765
     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
3766
     *
3767
     * @private
3768
     * @param {Object} object The source object.
3769
     * @param {string[]} paths The property paths to pick.
3770
     * @param {Function} predicate The function invoked per property.
3771
     * @returns {Object} Returns the new object.
3772
     */
3773
    function basePickBy(object, paths, predicate) {
3774
      var index = -1,
3775
          length = paths.length,
3776
          result = {};
3777
3778
      while (++index < length) {
3779
        var path = paths[index],
3780
            value = baseGet(object, path);
3781
3782
        if (predicate(value, path)) {
3783
          baseSet(result, castPath(path, object), value);
3784
        }
3785
      }
3786
      return result;
3787
    }
3788
3789
    /**
3790
     * A specialized version of `baseProperty` which supports deep paths.
3791
     *
3792
     * @private
3793
     * @param {Array|string} path The path of the property to get.
3794
     * @returns {Function} Returns the new accessor function.
3795
     */
3796
    function basePropertyDeep(path) {
3797
      return function(object) {
3798
        return baseGet(object, path);
3799
      };
3800
    }
3801
3802
    /**
3803
     * The base implementation of `_.pullAllBy` without support for iteratee
3804
     * shorthands.
3805
     *
3806
     * @private
3807
     * @param {Array} array The array to modify.
3808
     * @param {Array} values The values to remove.
3809
     * @param {Function} [iteratee] The iteratee invoked per element.
3810
     * @param {Function} [comparator] The comparator invoked per element.
3811
     * @returns {Array} Returns `array`.
3812
     */
3813
    function basePullAll(array, values, iteratee, comparator) {
3814
      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
3815
          index = -1,
3816
          length = values.length,
3817
          seen = array;
3818
3819
      if (array === values) {
3820
        values = copyArray(values);
3821
      }
3822
      if (iteratee) {
3823
        seen = arrayMap(array, baseUnary(iteratee));
3824
      }
3825
      while (++index < length) {
3826
        var fromIndex = 0,
3827
            value = values[index],
3828
            computed = iteratee ? iteratee(value) : value;
3829
3830
        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
3831
          if (seen !== array) {
3832
            splice.call(seen, fromIndex, 1);
3833
          }
3834
          splice.call(array, fromIndex, 1);
3835
        }
3836
      }
3837
      return array;
3838
    }
3839
3840
    /**
3841
     * The base implementation of `_.pullAt` without support for individual
3842
     * indexes or capturing the removed elements.
3843
     *
3844
     * @private
3845
     * @param {Array} array The array to modify.
3846
     * @param {number[]} indexes The indexes of elements to remove.
3847
     * @returns {Array} Returns `array`.
3848
     */
3849
    function basePullAt(array, indexes) {
3850
      var length = array ? indexes.length : 0,
3851
          lastIndex = length - 1;
3852
3853
      while (length--) {
3854
        var index = indexes[length];
3855
        if (length == lastIndex || index !== previous) {
3856
          var previous = index;
3857
          if (isIndex(index)) {
3858
            splice.call(array, index, 1);
3859
          } else {
3860
            baseUnset(array, index);
3861
          }
3862
        }
3863
      }
3864
      return array;
3865
    }
3866
3867
    /**
3868
     * The base implementation of `_.random` without support for returning
3869
     * floating-point numbers.
3870
     *
3871
     * @private
3872
     * @param {number} lower The lower bound.
3873
     * @param {number} upper The upper bound.
3874
     * @returns {number} Returns the random number.
3875
     */
3876
    function baseRandom(lower, upper) {
3877
      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
3878
    }
3879
3880
    /**
3881
     * The base implementation of `_.range` and `_.rangeRight` which doesn't
3882
     * coerce arguments.
3883
     *
3884
     * @private
3885
     * @param {number} start The start of the range.
3886
     * @param {number} end The end of the range.
3887
     * @param {number} step The value to increment or decrement by.
3888
     * @param {boolean} [fromRight] Specify iterating from right to left.
3889
     * @returns {Array} Returns the range of numbers.
3890
     */
3891
    function baseRange(start, end, step, fromRight) {
3892
      var index = -1,
3893
          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
3894
          result = Array(length);
3895
3896
      while (length--) {
3897
        result[fromRight ? length : ++index] = start;
3898
        start += step;
3899
      }
3900
      return result;
3901
    }
3902
3903
    /**
3904
     * The base implementation of `_.repeat` which doesn't coerce arguments.
3905
     *
3906
     * @private
3907
     * @param {string} string The string to repeat.
3908
     * @param {number} n The number of times to repeat the string.
3909
     * @returns {string} Returns the repeated string.
3910
     */
3911
    function baseRepeat(string, n) {
3912
      var result = '';
3913
      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
3914
        return result;
3915
      }
3916
      // Leverage the exponentiation by squaring algorithm for a faster repeat.
3917
      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
3918
      do {
3919
        if (n % 2) {
3920
          result += string;
3921
        }
3922
        n = nativeFloor(n / 2);
3923
        if (n) {
3924
          string += string;
3925
        }
3926
      } while (n);
3927
3928
      return result;
3929
    }
3930
3931
    /**
3932
     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
3933
     *
3934
     * @private
3935
     * @param {Function} func The function to apply a rest parameter to.
3936
     * @param {number} [start=func.length-1] The start position of the rest parameter.
3937
     * @returns {Function} Returns the new function.
3938
     */
3939
    function baseRest(func, start) {
3940
      return setToString(overRest(func, start, identity), func + '');
3941
    }
3942
3943
    /**
3944
     * The base implementation of `_.sample`.
3945
     *
3946
     * @private
3947
     * @param {Array|Object} collection The collection to sample.
3948
     * @returns {*} Returns the random element.
3949
     */
3950
    function baseSample(collection) {
3951
      return arraySample(values(collection));
3952
    }
3953
3954
    /**
3955
     * The base implementation of `_.sampleSize` without param guards.
3956
     *
3957
     * @private
3958
     * @param {Array|Object} collection The collection to sample.
3959
     * @param {number} n The number of elements to sample.
3960
     * @returns {Array} Returns the random elements.
3961
     */
3962
    function baseSampleSize(collection, n) {
3963
      var array = values(collection);
3964
      return shuffleSelf(array, baseClamp(n, 0, array.length));
3965
    }
3966
3967
    /**
3968
     * The base implementation of `_.set`.
3969
     *
3970
     * @private
3971
     * @param {Object} object The object to modify.
3972
     * @param {Array|string} path The path of the property to set.
3973
     * @param {*} value The value to set.
3974
     * @param {Function} [customizer] The function to customize path creation.
3975
     * @returns {Object} Returns `object`.
3976
     */
3977
    function baseSet(object, path, value, customizer) {
3978
      if (!isObject(object)) {
3979
        return object;
3980
      }
3981
      path = castPath(path, object);
3982
3983
      var index = -1,
3984
          length = path.length,
3985
          lastIndex = length - 1,
3986
          nested = object;
3987
3988
      while (nested != null && ++index < length) {
3989
        var key = toKey(path[index]),
3990
            newValue = value;
3991
3992
        if (index != lastIndex) {
3993
          var objValue = nested[key];
3994
          newValue = customizer ? customizer(objValue, key, nested) : undefined;
3995
          if (newValue === undefined) {
3996
            newValue = isObject(objValue)
3997
              ? objValue
3998
              : (isIndex(path[index + 1]) ? [] : {});
3999
          }
4000
        }
4001
        assignValue(nested, key, newValue);
4002
        nested = nested[key];
4003
      }
4004
      return object;
4005
    }
4006
4007
    /**
4008
     * The base implementation of `setData` without support for hot loop shorting.
4009
     *
4010
     * @private
4011
     * @param {Function} func The function to associate metadata with.
4012
     * @param {*} data The metadata.
4013
     * @returns {Function} Returns `func`.
4014
     */
4015
    var baseSetData = !metaMap ? identity : function(func, data) {
4016
      metaMap.set(func, data);
4017
      return func;
4018
    };
4019
4020
    /**
4021
     * The base implementation of `setToString` without support for hot loop shorting.
4022
     *
4023
     * @private
4024
     * @param {Function} func The function to modify.
4025
     * @param {Function} string The `toString` result.
4026
     * @returns {Function} Returns `func`.
4027
     */
4028
    var baseSetToString = !defineProperty ? identity : function(func, string) {
4029
      return defineProperty(func, 'toString', {
4030
        'configurable': true,
4031
        'enumerable': false,
4032
        'value': constant(string),
4033
        'writable': true
4034
      });
4035
    };
4036
4037
    /**
4038
     * The base implementation of `_.shuffle`.
4039
     *
4040
     * @private
4041
     * @param {Array|Object} collection The collection to shuffle.
4042
     * @returns {Array} Returns the new shuffled array.
4043
     */
4044
    function baseShuffle(collection) {
4045
      return shuffleSelf(values(collection));
4046
    }
4047
4048
    /**
4049
     * The base implementation of `_.slice` without an iteratee call guard.
4050
     *
4051
     * @private
4052
     * @param {Array} array The array to slice.
4053
     * @param {number} [start=0] The start position.
4054
     * @param {number} [end=array.length] The end position.
4055
     * @returns {Array} Returns the slice of `array`.
4056
     */
4057
    function baseSlice(array, start, end) {
4058
      var index = -1,
4059
          length = array.length;
4060
4061
      if (start < 0) {
4062
        start = -start > length ? 0 : (length + start);
4063
      }
4064
      end = end > length ? length : end;
4065
      if (end < 0) {
4066
        end += length;
4067
      }
4068
      length = start > end ? 0 : ((end - start) >>> 0);
4069
      start >>>= 0;
4070
4071
      var result = Array(length);
4072
      while (++index < length) {
4073
        result[index] = array[index + start];
4074
      }
4075
      return result;
4076
    }
4077
4078
    /**
4079
     * The base implementation of `_.some` without support for iteratee shorthands.
4080
     *
4081
     * @private
4082
     * @param {Array|Object} collection The collection to iterate over.
4083
     * @param {Function} predicate The function invoked per iteration.
4084
     * @returns {boolean} Returns `true` if any element passes the predicate check,
4085
     *  else `false`.
4086
     */
4087
    function baseSome(collection, predicate) {
4088
      var result;
4089
4090
      baseEach(collection, function(value, index, collection) {
4091
        result = predicate(value, index, collection);
4092
        return !result;
4093
      });
4094
      return !!result;
4095
    }
4096
4097
    /**
4098
     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
4099
     * performs a binary search of `array` to determine the index at which `value`
4100
     * should be inserted into `array` in order to maintain its sort order.
4101
     *
4102
     * @private
4103
     * @param {Array} array The sorted array to inspect.
4104
     * @param {*} value The value to evaluate.
4105
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
4106
     * @returns {number} Returns the index at which `value` should be inserted
4107
     *  into `array`.
4108
     */
4109
    function baseSortedIndex(array, value, retHighest) {
4110
      var low = 0,
4111
          high = array == null ? low : array.length;
4112
4113
      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
4114
        while (low < high) {
4115
          var mid = (low + high) >>> 1,
4116
              computed = array[mid];
4117
4118
          if (computed !== null && !isSymbol(computed) &&
4119
              (retHighest ? (computed <= value) : (computed < value))) {
4120
            low = mid + 1;
4121
          } else {
4122
            high = mid;
4123
          }
4124
        }
4125
        return high;
4126
      }
4127
      return baseSortedIndexBy(array, value, identity, retHighest);
4128
    }
4129
4130
    /**
4131
     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
4132
     * which invokes `iteratee` for `value` and each element of `array` to compute
4133
     * their sort ranking. The iteratee is invoked with one argument; (value).
4134
     *
4135
     * @private
4136
     * @param {Array} array The sorted array to inspect.
4137
     * @param {*} value The value to evaluate.
4138
     * @param {Function} iteratee The iteratee invoked per element.
4139
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
4140
     * @returns {number} Returns the index at which `value` should be inserted
4141
     *  into `array`.
4142
     */
4143
    function baseSortedIndexBy(array, value, iteratee, retHighest) {
4144
      value = iteratee(value);
4145
4146
      var low = 0,
4147
          high = array == null ? 0 : array.length,
4148
          valIsNaN = value !== value,
4149
          valIsNull = value === null,
4150
          valIsSymbol = isSymbol(value),
4151
          valIsUndefined = value === undefined;
4152
4153
      while (low < high) {
4154
        var mid = nativeFloor((low + high) / 2),
4155
            computed = iteratee(array[mid]),
4156
            othIsDefined = computed !== undefined,
4157
            othIsNull = computed === null,
4158
            othIsReflexive = computed === computed,
4159
            othIsSymbol = isSymbol(computed);
4160
4161
        if (valIsNaN) {
4162
          var setLow = retHighest || othIsReflexive;
4163
        } else if (valIsUndefined) {
4164
          setLow = othIsReflexive && (retHighest || othIsDefined);
4165
        } else if (valIsNull) {
4166
          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
4167
        } else if (valIsSymbol) {
4168
          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
4169
        } else if (othIsNull || othIsSymbol) {
4170
          setLow = false;
4171
        } else {
4172
          setLow = retHighest ? (computed <= value) : (computed < value);
4173
        }
4174
        if (setLow) {
4175
          low = mid + 1;
4176
        } else {
4177
          high = mid;
4178
        }
4179
      }
4180
      return nativeMin(high, MAX_ARRAY_INDEX);
4181
    }
4182
4183
    /**
4184
     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
4185
     * support for iteratee shorthands.
4186
     *
4187
     * @private
4188
     * @param {Array} array The array to inspect.
4189
     * @param {Function} [iteratee] The iteratee invoked per element.
4190
     * @returns {Array} Returns the new duplicate free array.
4191
     */
4192
    function baseSortedUniq(array, iteratee) {
4193
      var index = -1,
4194
          length = array.length,
4195
          resIndex = 0,
4196
          result = [];
4197
4198
      while (++index < length) {
4199
        var value = array[index],
4200
            computed = iteratee ? iteratee(value) : value;
4201
4202
        if (!index || !eq(computed, seen)) {
4203
          var seen = computed;
4204
          result[resIndex++] = value === 0 ? 0 : value;
4205
        }
4206
      }
4207
      return result;
4208
    }
4209
4210
    /**
4211
     * The base implementation of `_.toNumber` which doesn't ensure correct
4212
     * conversions of binary, hexadecimal, or octal string values.
4213
     *
4214
     * @private
4215
     * @param {*} value The value to process.
4216
     * @returns {number} Returns the number.
4217
     */
4218
    function baseToNumber(value) {
4219
      if (typeof value == 'number') {
4220
        return value;
4221
      }
4222
      if (isSymbol(value)) {
4223
        return NAN;
4224
      }
4225
      return +value;
4226
    }
4227
4228
    /**
4229
     * The base implementation of `_.toString` which doesn't convert nullish
4230
     * values to empty strings.
4231
     *
4232
     * @private
4233
     * @param {*} value The value to process.
4234
     * @returns {string} Returns the string.
4235
     */
4236
    function baseToString(value) {
4237
      // Exit early for strings to avoid a performance hit in some environments.
4238
      if (typeof value == 'string') {
4239
        return value;
4240
      }
4241
      if (isArray(value)) {
4242
        // Recursively convert values (susceptible to call stack limits).
4243
        return arrayMap(value, baseToString) + '';
4244
      }
4245
      if (isSymbol(value)) {
4246
        return symbolToString ? symbolToString.call(value) : '';
4247
      }
4248
      var result = (value + '');
4249
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
4250
    }
4251
4252
    /**
4253
     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
4254
     *
4255
     * @private
4256
     * @param {Array} array The array to inspect.
4257
     * @param {Function} [iteratee] The iteratee invoked per element.
4258
     * @param {Function} [comparator] The comparator invoked per element.
4259
     * @returns {Array} Returns the new duplicate free array.
4260
     */
4261
    function baseUniq(array, iteratee, comparator) {
4262
      var index = -1,
4263
          includes = arrayIncludes,
4264
          length = array.length,
4265
          isCommon = true,
4266
          result = [],
4267
          seen = result;
4268
4269
      if (comparator) {
4270
        isCommon = false;
4271
        includes = arrayIncludesWith;
4272
      }
4273
      else if (length >= LARGE_ARRAY_SIZE) {
4274
        var set = iteratee ? null : createSet(array);
4275
        if (set) {
4276
          return setToArray(set);
4277
        }
4278
        isCommon = false;
4279
        includes = cacheHas;
4280
        seen = new SetCache;
4281
      }
4282
      else {
4283
        seen = iteratee ? [] : result;
4284
      }
4285
      outer:
4286
      while (++index < length) {
4287
        var value = array[index],
4288
            computed = iteratee ? iteratee(value) : value;
4289
4290
        value = (comparator || value !== 0) ? value : 0;
4291
        if (isCommon && computed === computed) {
4292
          var seenIndex = seen.length;
4293
          while (seenIndex--) {
4294
            if (seen[seenIndex] === computed) {
4295
              continue outer;
4296
            }
4297
          }
4298
          if (iteratee) {
4299
            seen.push(computed);
4300
          }
4301
          result.push(value);
4302
        }
4303
        else if (!includes(seen, computed, comparator)) {
4304
          if (seen !== result) {
4305
            seen.push(computed);
4306
          }
4307
          result.push(value);
4308
        }
4309
      }
4310
      return result;
4311
    }
4312
4313
    /**
4314
     * The base implementation of `_.unset`.
4315
     *
4316
     * @private
4317
     * @param {Object} object The object to modify.
4318
     * @param {Array|string} path The property path to unset.
4319
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
4320
     */
4321
    function baseUnset(object, path) {
4322
      path = castPath(path, object);
4323
      object = parent(object, path);
4324
      return object == null || delete object[toKey(last(path))];
4325
    }
4326
4327
    /**
4328
     * The base implementation of `_.update`.
4329
     *
4330
     * @private
4331
     * @param {Object} object The object to modify.
4332
     * @param {Array|string} path The path of the property to update.
4333
     * @param {Function} updater The function to produce the updated value.
4334
     * @param {Function} [customizer] The function to customize path creation.
4335
     * @returns {Object} Returns `object`.
4336
     */
4337
    function baseUpdate(object, path, updater, customizer) {
4338
      return baseSet(object, path, updater(baseGet(object, path)), customizer);
4339
    }
4340
4341
    /**
4342
     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
4343
     * without support for iteratee shorthands.
4344
     *
4345
     * @private
4346
     * @param {Array} array The array to query.
4347
     * @param {Function} predicate The function invoked per iteration.
4348
     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
4349
     * @param {boolean} [fromRight] Specify iterating from right to left.
4350
     * @returns {Array} Returns the slice of `array`.
4351
     */
4352
    function baseWhile(array, predicate, isDrop, fromRight) {
4353
      var length = array.length,
4354
          index = fromRight ? length : -1;
4355
4356
      while ((fromRight ? index-- : ++index < length) &&
4357
        predicate(array[index], index, array)) {}
4358
4359
      return isDrop
4360
        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
4361
        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
4362
    }
4363
4364
    /**
4365
     * The base implementation of `wrapperValue` which returns the result of
4366
     * performing a sequence of actions on the unwrapped `value`, where each
4367
     * successive action is supplied the return value of the previous.
4368
     *
4369
     * @private
4370
     * @param {*} value The unwrapped value.
4371
     * @param {Array} actions Actions to perform to resolve the unwrapped value.
4372
     * @returns {*} Returns the resolved value.
4373
     */
4374
    function baseWrapperValue(value, actions) {
4375
      var result = value;
4376
      if (result instanceof LazyWrapper) {
4377
        result = result.value();
4378
      }
4379
      return arrayReduce(actions, function(result, action) {
4380
        return action.func.apply(action.thisArg, arrayPush([result], action.args));
4381
      }, result);
4382
    }
4383
4384
    /**
4385
     * The base implementation of methods like `_.xor`, without support for
4386
     * iteratee shorthands, that accepts an array of arrays to inspect.
4387
     *
4388
     * @private
4389
     * @param {Array} arrays The arrays to inspect.
4390
     * @param {Function} [iteratee] The iteratee invoked per element.
4391
     * @param {Function} [comparator] The comparator invoked per element.
4392
     * @returns {Array} Returns the new array of values.
4393
     */
4394
    function baseXor(arrays, iteratee, comparator) {
4395
      var length = arrays.length;
4396
      if (length < 2) {
4397
        return length ? baseUniq(arrays[0]) : [];
4398
      }
4399
      var index = -1,
4400
          result = Array(length);
4401
4402
      while (++index < length) {
4403
        var array = arrays[index],
4404
            othIndex = -1;
4405
4406
        while (++othIndex < length) {
4407
          if (othIndex != index) {
4408
            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
4409
          }
4410
        }
4411
      }
4412
      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
4413
    }
4414
4415
    /**
4416
     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
4417
     *
4418
     * @private
4419
     * @param {Array} props The property identifiers.
4420
     * @param {Array} values The property values.
4421
     * @param {Function} assignFunc The function to assign values.
4422
     * @returns {Object} Returns the new object.
4423
     */
4424
    function baseZipObject(props, values, assignFunc) {
4425
      var index = -1,
4426
          length = props.length,
4427
          valsLength = values.length,
4428
          result = {};
4429
4430
      while (++index < length) {
4431
        var value = index < valsLength ? values[index] : undefined;
4432
        assignFunc(result, props[index], value);
4433
      }
4434
      return result;
4435
    }
4436
4437
    /**
4438
     * Casts `value` to an empty array if it's not an array like object.
4439
     *
4440
     * @private
4441
     * @param {*} value The value to inspect.
4442
     * @returns {Array|Object} Returns the cast array-like object.
4443
     */
4444
    function castArrayLikeObject(value) {
4445
      return isArrayLikeObject(value) ? value : [];
4446
    }
4447
4448
    /**
4449
     * Casts `value` to `identity` if it's not a function.
4450
     *
4451
     * @private
4452
     * @param {*} value The value to inspect.
4453
     * @returns {Function} Returns cast function.
4454
     */
4455
    function castFunction(value) {
4456
      return typeof value == 'function' ? value : identity;
4457
    }
4458
4459
    /**
4460
     * Casts `value` to a path array if it's not one.
4461
     *
4462
     * @private
4463
     * @param {*} value The value to inspect.
4464
     * @param {Object} [object] The object to query keys on.
4465
     * @returns {Array} Returns the cast property path array.
4466
     */
4467
    function castPath(value, object) {
4468
      if (isArray(value)) {
4469
        return value;
4470
      }
4471
      return isKey(value, object) ? [value] : stringToPath(toString(value));
4472
    }
4473
4474
    /**
4475
     * A `baseRest` alias which can be replaced with `identity` by module
4476
     * replacement plugins.
4477
     *
4478
     * @private
4479
     * @type {Function}
4480
     * @param {Function} func The function to apply a rest parameter to.
4481
     * @returns {Function} Returns the new function.
4482
     */
4483
    var castRest = baseRest;
4484
4485
    /**
4486
     * Casts `array` to a slice if it's needed.
4487
     *
4488
     * @private
4489
     * @param {Array} array The array to inspect.
4490
     * @param {number} start The start position.
4491
     * @param {number} [end=array.length] The end position.
4492
     * @returns {Array} Returns the cast slice.
4493
     */
4494
    function castSlice(array, start, end) {
4495
      var length = array.length;
4496
      end = end === undefined ? length : end;
4497
      return (!start && end >= length) ? array : baseSlice(array, start, end);
4498
    }
4499
4500
    /**
4501
     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
4502
     *
4503
     * @private
4504
     * @param {number|Object} id The timer id or timeout object of the timer to clear.
4505
     */
4506
    var clearTimeout = ctxClearTimeout || function(id) {
4507
      return root.clearTimeout(id);
4508
    };
4509
4510
    /**
4511
     * Creates a clone of  `buffer`.
4512
     *
4513
     * @private
4514
     * @param {Buffer} buffer The buffer to clone.
4515
     * @param {boolean} [isDeep] Specify a deep clone.
4516
     * @returns {Buffer} Returns the cloned buffer.
4517
     */
4518
    function cloneBuffer(buffer, isDeep) {
4519
      if (isDeep) {
4520
        return buffer.slice();
4521
      }
4522
      var length = buffer.length,
4523
          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
4524
4525
      buffer.copy(result);
4526
      return result;
4527
    }
4528
4529
    /**
4530
     * Creates a clone of `arrayBuffer`.
4531
     *
4532
     * @private
4533
     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
4534
     * @returns {ArrayBuffer} Returns the cloned array buffer.
4535
     */
4536
    function cloneArrayBuffer(arrayBuffer) {
4537
      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
4538
      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
4539
      return result;
4540
    }
4541
4542
    /**
4543
     * Creates a clone of `dataView`.
4544
     *
4545
     * @private
4546
     * @param {Object} dataView The data view to clone.
4547
     * @param {boolean} [isDeep] Specify a deep clone.
4548
     * @returns {Object} Returns the cloned data view.
4549
     */
4550
    function cloneDataView(dataView, isDeep) {
4551
      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
4552
      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
4553
    }
4554
4555
    /**
4556
     * Creates a clone of `regexp`.
4557
     *
4558
     * @private
4559
     * @param {Object} regexp The regexp to clone.
4560
     * @returns {Object} Returns the cloned regexp.
4561
     */
4562
    function cloneRegExp(regexp) {
4563
      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
4564
      result.lastIndex = regexp.lastIndex;
4565
      return result;
4566
    }
4567
4568
    /**
4569
     * Creates a clone of the `symbol` object.
4570
     *
4571
     * @private
4572
     * @param {Object} symbol The symbol object to clone.
4573
     * @returns {Object} Returns the cloned symbol object.
4574
     */
4575
    function cloneSymbol(symbol) {
4576
      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
4577
    }
4578
4579
    /**
4580
     * Creates a clone of `typedArray`.
4581
     *
4582
     * @private
4583
     * @param {Object} typedArray The typed array to clone.
4584
     * @param {boolean} [isDeep] Specify a deep clone.
4585
     * @returns {Object} Returns the cloned typed array.
4586
     */
4587
    function cloneTypedArray(typedArray, isDeep) {
4588
      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
4589
      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
4590
    }
4591
4592
    /**
4593
     * Compares values to sort them in ascending order.
4594
     *
4595
     * @private
4596
     * @param {*} value The value to compare.
4597
     * @param {*} other The other value to compare.
4598
     * @returns {number} Returns the sort order indicator for `value`.
4599
     */
4600
    function compareAscending(value, other) {
4601
      if (value !== other) {
4602
        var valIsDefined = value !== undefined,
4603
            valIsNull = value === null,
4604
            valIsReflexive = value === value,
4605
            valIsSymbol = isSymbol(value);
4606
4607
        var othIsDefined = other !== undefined,
4608
            othIsNull = other === null,
4609
            othIsReflexive = other === other,
4610
            othIsSymbol = isSymbol(other);
4611
4612
        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
4613
            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
4614
            (valIsNull && othIsDefined && othIsReflexive) ||
4615
            (!valIsDefined && othIsReflexive) ||
4616
            !valIsReflexive) {
4617
          return 1;
4618
        }
4619
        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
4620
            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
4621
            (othIsNull && valIsDefined && valIsReflexive) ||
4622
            (!othIsDefined && valIsReflexive) ||
4623
            !othIsReflexive) {
4624
          return -1;
4625
        }
4626
      }
4627
      return 0;
4628
    }
4629
4630
    /**
4631
     * Used by `_.orderBy` to compare multiple properties of a value to another
4632
     * and stable sort them.
4633
     *
4634
     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
4635
     * specify an order of "desc" for descending or "asc" for ascending sort order
4636
     * of corresponding values.
4637
     *
4638
     * @private
4639
     * @param {Object} object The object to compare.
4640
     * @param {Object} other The other object to compare.
4641
     * @param {boolean[]|string[]} orders The order to sort by for each property.
4642
     * @returns {number} Returns the sort order indicator for `object`.
4643
     */
4644
    function compareMultiple(object, other, orders) {
4645
      var index = -1,
4646
          objCriteria = object.criteria,
4647
          othCriteria = other.criteria,
4648
          length = objCriteria.length,
4649
          ordersLength = orders.length;
4650
4651
      while (++index < length) {
4652
        var result = compareAscending(objCriteria[index], othCriteria[index]);
4653
        if (result) {
4654
          if (index >= ordersLength) {
4655
            return result;
4656
          }
4657
          var order = orders[index];
4658
          return result * (order == 'desc' ? -1 : 1);
4659
        }
4660
      }
4661
      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
4662
      // that causes it, under certain circumstances, to provide the same value for
4663
      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
4664
      // for more details.
4665
      //
4666
      // This also ensures a stable sort in V8 and other engines.
4667
      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
4668
      return object.index - other.index;
4669
    }
4670
4671
    /**
4672
     * Creates an array that is the composition of partially applied arguments,
4673
     * placeholders, and provided arguments into a single array of arguments.
4674
     *
4675
     * @private
4676
     * @param {Array} args The provided arguments.
4677
     * @param {Array} partials The arguments to prepend to those provided.
4678
     * @param {Array} holders The `partials` placeholder indexes.
4679
     * @params {boolean} [isCurried] Specify composing for a curried function.
4680
     * @returns {Array} Returns the new array of composed arguments.
4681
     */
4682
    function composeArgs(args, partials, holders, isCurried) {
4683
      var argsIndex = -1,
4684
          argsLength = args.length,
4685
          holdersLength = holders.length,
4686
          leftIndex = -1,
4687
          leftLength = partials.length,
4688
          rangeLength = nativeMax(argsLength - holdersLength, 0),
4689
          result = Array(leftLength + rangeLength),
4690
          isUncurried = !isCurried;
4691
4692
      while (++leftIndex < leftLength) {
4693
        result[leftIndex] = partials[leftIndex];
4694
      }
4695
      while (++argsIndex < holdersLength) {
4696
        if (isUncurried || argsIndex < argsLength) {
4697
          result[holders[argsIndex]] = args[argsIndex];
4698
        }
4699
      }
4700
      while (rangeLength--) {
4701
        result[leftIndex++] = args[argsIndex++];
4702
      }
4703
      return result;
4704
    }
4705
4706
    /**
4707
     * This function is like `composeArgs` except that the arguments composition
4708
     * is tailored for `_.partialRight`.
4709
     *
4710
     * @private
4711
     * @param {Array} args The provided arguments.
4712
     * @param {Array} partials The arguments to append to those provided.
4713
     * @param {Array} holders The `partials` placeholder indexes.
4714
     * @params {boolean} [isCurried] Specify composing for a curried function.
4715
     * @returns {Array} Returns the new array of composed arguments.
4716
     */
4717
    function composeArgsRight(args, partials, holders, isCurried) {
4718
      var argsIndex = -1,
4719
          argsLength = args.length,
4720
          holdersIndex = -1,
4721
          holdersLength = holders.length,
4722
          rightIndex = -1,
4723
          rightLength = partials.length,
4724
          rangeLength = nativeMax(argsLength - holdersLength, 0),
4725
          result = Array(rangeLength + rightLength),
4726
          isUncurried = !isCurried;
4727
4728
      while (++argsIndex < rangeLength) {
4729
        result[argsIndex] = args[argsIndex];
4730
      }
4731
      var offset = argsIndex;
4732
      while (++rightIndex < rightLength) {
4733
        result[offset + rightIndex] = partials[rightIndex];
4734
      }
4735
      while (++holdersIndex < holdersLength) {
4736
        if (isUncurried || argsIndex < argsLength) {
4737
          result[offset + holders[holdersIndex]] = args[argsIndex++];
4738
        }
4739
      }
4740
      return result;
4741
    }
4742
4743
    /**
4744
     * Copies the values of `source` to `array`.
4745
     *
4746
     * @private
4747
     * @param {Array} source The array to copy values from.
4748
     * @param {Array} [array=[]] The array to copy values to.
4749
     * @returns {Array} Returns `array`.
4750
     */
4751
    function copyArray(source, array) {
4752
      var index = -1,
4753
          length = source.length;
4754
4755
      array || (array = Array(length));
4756
      while (++index < length) {
4757
        array[index] = source[index];
4758
      }
4759
      return array;
4760
    }
4761
4762
    /**
4763
     * Copies properties of `source` to `object`.
4764
     *
4765
     * @private
4766
     * @param {Object} source The object to copy properties from.
4767
     * @param {Array} props The property identifiers to copy.
4768
     * @param {Object} [object={}] The object to copy properties to.
4769
     * @param {Function} [customizer] The function to customize copied values.
4770
     * @returns {Object} Returns `object`.
4771
     */
4772
    function copyObject(source, props, object, customizer) {
4773
      var isNew = !object;
4774
      object || (object = {});
4775
4776
      var index = -1,
4777
          length = props.length;
4778
4779
      while (++index < length) {
4780
        var key = props[index];
4781
4782
        var newValue = customizer
4783
          ? customizer(object[key], source[key], key, object, source)
4784
          : undefined;
4785
4786
        if (newValue === undefined) {
4787
          newValue = source[key];
4788
        }
4789
        if (isNew) {
4790
          baseAssignValue(object, key, newValue);
4791
        } else {
4792
          assignValue(object, key, newValue);
4793
        }
4794
      }
4795
      return object;
4796
    }
4797
4798
    /**
4799
     * Copies own symbols of `source` to `object`.
4800
     *
4801
     * @private
4802
     * @param {Object} source The object to copy symbols from.
4803
     * @param {Object} [object={}] The object to copy symbols to.
4804
     * @returns {Object} Returns `object`.
4805
     */
4806
    function copySymbols(source, object) {
4807
      return copyObject(source, getSymbols(source), object);
4808
    }
4809
4810
    /**
4811
     * Copies own and inherited symbols of `source` to `object`.
4812
     *
4813
     * @private
4814
     * @param {Object} source The object to copy symbols from.
4815
     * @param {Object} [object={}] The object to copy symbols to.
4816
     * @returns {Object} Returns `object`.
4817
     */
4818
    function copySymbolsIn(source, object) {
4819
      return copyObject(source, getSymbolsIn(source), object);
4820
    }
4821
4822
    /**
4823
     * Creates a function like `_.groupBy`.
4824
     *
4825
     * @private
4826
     * @param {Function} setter The function to set accumulator values.
4827
     * @param {Function} [initializer] The accumulator object initializer.
4828
     * @returns {Function} Returns the new aggregator function.
4829
     */
4830
    function createAggregator(setter, initializer) {
4831
      return function(collection, iteratee) {
4832
        var func = isArray(collection) ? arrayAggregator : baseAggregator,
4833
            accumulator = initializer ? initializer() : {};
4834
4835
        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
4836
      };
4837
    }
4838
4839
    /**
4840
     * Creates a function like `_.assign`.
4841
     *
4842
     * @private
4843
     * @param {Function} assigner The function to assign values.
4844
     * @returns {Function} Returns the new assigner function.
4845
     */
4846
    function createAssigner(assigner) {
4847
      return baseRest(function(object, sources) {
4848
        var index = -1,
4849
            length = sources.length,
4850
            customizer = length > 1 ? sources[length - 1] : undefined,
4851
            guard = length > 2 ? sources[2] : undefined;
4852
4853
        customizer = (assigner.length > 3 && typeof customizer == 'function')
4854
          ? (length--, customizer)
4855
          : undefined;
4856
4857
        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
4858
          customizer = length < 3 ? undefined : customizer;
4859
          length = 1;
4860
        }
4861
        object = Object(object);
4862
        while (++index < length) {
4863
          var source = sources[index];
4864
          if (source) {
4865
            assigner(object, source, index, customizer);
4866
          }
4867
        }
4868
        return object;
4869
      });
4870
    }
4871
4872
    /**
4873
     * Creates a `baseEach` or `baseEachRight` function.
4874
     *
4875
     * @private
4876
     * @param {Function} eachFunc The function to iterate over a collection.
4877
     * @param {boolean} [fromRight] Specify iterating from right to left.
4878
     * @returns {Function} Returns the new base function.
4879
     */
4880
    function createBaseEach(eachFunc, fromRight) {
4881
      return function(collection, iteratee) {
4882
        if (collection == null) {
4883
          return collection;
4884
        }
4885
        if (!isArrayLike(collection)) {
4886
          return eachFunc(collection, iteratee);
4887
        }
4888
        var length = collection.length,
4889
            index = fromRight ? length : -1,
4890
            iterable = Object(collection);
4891
4892
        while ((fromRight ? index-- : ++index < length)) {
4893
          if (iteratee(iterable[index], index, iterable) === false) {
4894
            break;
4895
          }
4896
        }
4897
        return collection;
4898
      };
4899
    }
4900
4901
    /**
4902
     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
4903
     *
4904
     * @private
4905
     * @param {boolean} [fromRight] Specify iterating from right to left.
4906
     * @returns {Function} Returns the new base function.
4907
     */
4908
    function createBaseFor(fromRight) {
4909
      return function(object, iteratee, keysFunc) {
4910
        var index = -1,
4911
            iterable = Object(object),
4912
            props = keysFunc(object),
4913
            length = props.length;
4914
4915
        while (length--) {
4916
          var key = props[fromRight ? length : ++index];
4917
          if (iteratee(iterable[key], key, iterable) === false) {
4918
            break;
4919
          }
4920
        }
4921
        return object;
4922
      };
4923
    }
4924
4925
    /**
4926
     * Creates a function that wraps `func` to invoke it with the optional `this`
4927
     * binding of `thisArg`.
4928
     *
4929
     * @private
4930
     * @param {Function} func The function to wrap.
4931
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
4932
     * @param {*} [thisArg] The `this` binding of `func`.
4933
     * @returns {Function} Returns the new wrapped function.
4934
     */
4935
    function createBind(func, bitmask, thisArg) {
4936
      var isBind = bitmask & WRAP_BIND_FLAG,
4937
          Ctor = createCtor(func);
4938
4939
      function wrapper() {
4940
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
4941
        return fn.apply(isBind ? thisArg : this, arguments);
4942
      }
4943
      return wrapper;
4944
    }
4945
4946
    /**
4947
     * Creates a function like `_.lowerFirst`.
4948
     *
4949
     * @private
4950
     * @param {string} methodName The name of the `String` case method to use.
4951
     * @returns {Function} Returns the new case function.
4952
     */
4953
    function createCaseFirst(methodName) {
4954
      return function(string) {
4955
        string = toString(string);
4956
4957
        var strSymbols = hasUnicode(string)
4958
          ? stringToArray(string)
4959
          : undefined;
4960
4961
        var chr = strSymbols
4962
          ? strSymbols[0]
4963
          : string.charAt(0);
4964
4965
        var trailing = strSymbols
4966
          ? castSlice(strSymbols, 1).join('')
4967
          : string.slice(1);
4968
4969
        return chr[methodName]() + trailing;
4970
      };
4971
    }
4972
4973
    /**
4974
     * Creates a function like `_.camelCase`.
4975
     *
4976
     * @private
4977
     * @param {Function} callback The function to combine each word.
4978
     * @returns {Function} Returns the new compounder function.
4979
     */
4980
    function createCompounder(callback) {
4981
      return function(string) {
4982
        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
4983
      };
4984
    }
4985
4986
    /**
4987
     * Creates a function that produces an instance of `Ctor` regardless of
4988
     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
4989
     *
4990
     * @private
4991
     * @param {Function} Ctor The constructor to wrap.
4992
     * @returns {Function} Returns the new wrapped function.
4993
     */
4994
    function createCtor(Ctor) {
4995
      return function() {
4996
        // Use a `switch` statement to work with class constructors. See
4997
        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
4998
        // for more details.
4999
        var args = arguments;
5000
        switch (args.length) {
5001
          case 0: return new Ctor;
5002
          case 1: return new Ctor(args[0]);
5003
          case 2: return new Ctor(args[0], args[1]);
5004
          case 3: return new Ctor(args[0], args[1], args[2]);
5005
          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
5006
          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
5007
          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
5008
          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
5009
        }
5010
        var thisBinding = baseCreate(Ctor.prototype),
5011
            result = Ctor.apply(thisBinding, args);
5012
5013
        // Mimic the constructor's `return` behavior.
5014
        // See https://es5.github.io/#x13.2.2 for more details.
5015
        return isObject(result) ? result : thisBinding;
5016
      };
5017
    }
5018
5019
    /**
5020
     * Creates a function that wraps `func` to enable currying.
5021
     *
5022
     * @private
5023
     * @param {Function} func The function to wrap.
5024
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5025
     * @param {number} arity The arity of `func`.
5026
     * @returns {Function} Returns the new wrapped function.
5027
     */
5028
    function createCurry(func, bitmask, arity) {
5029
      var Ctor = createCtor(func);
5030
5031
      function wrapper() {
5032
        var length = arguments.length,
5033
            args = Array(length),
5034
            index = length,
5035
            placeholder = getHolder(wrapper);
5036
5037
        while (index--) {
5038
          args[index] = arguments[index];
5039
        }
5040
        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
5041
          ? []
5042
          : replaceHolders(args, placeholder);
5043
5044
        length -= holders.length;
5045
        if (length < arity) {
5046
          return createRecurry(
5047
            func, bitmask, createHybrid, wrapper.placeholder, undefined,
5048
            args, holders, undefined, undefined, arity - length);
5049
        }
5050
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5051
        return apply(fn, this, args);
5052
      }
5053
      return wrapper;
5054
    }
5055
5056
    /**
5057
     * Creates a `_.find` or `_.findLast` function.
5058
     *
5059
     * @private
5060
     * @param {Function} findIndexFunc The function to find the collection index.
5061
     * @returns {Function} Returns the new find function.
5062
     */
5063
    function createFind(findIndexFunc) {
5064
      return function(collection, predicate, fromIndex) {
5065
        var iterable = Object(collection);
5066
        if (!isArrayLike(collection)) {
5067
          var iteratee = getIteratee(predicate, 3);
5068
          collection = keys(collection);
5069
          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
5070
        }
5071
        var index = findIndexFunc(collection, predicate, fromIndex);
5072
        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
5073
      };
5074
    }
5075
5076
    /**
5077
     * Creates a `_.flow` or `_.flowRight` function.
5078
     *
5079
     * @private
5080
     * @param {boolean} [fromRight] Specify iterating from right to left.
5081
     * @returns {Function} Returns the new flow function.
5082
     */
5083
    function createFlow(fromRight) {
5084
      return flatRest(function(funcs) {
5085
        var length = funcs.length,
5086
            index = length,
5087
            prereq = LodashWrapper.prototype.thru;
5088
5089
        if (fromRight) {
5090
          funcs.reverse();
5091
        }
5092
        while (index--) {
5093
          var func = funcs[index];
5094
          if (typeof func != 'function') {
5095
            throw new TypeError(FUNC_ERROR_TEXT);
5096
          }
5097
          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
5098
            var wrapper = new LodashWrapper([], true);
5099
          }
5100
        }
5101
        index = wrapper ? index : length;
5102
        while (++index < length) {
5103
          func = funcs[index];
5104
5105
          var funcName = getFuncName(func),
5106
              data = funcName == 'wrapper' ? getData(func) : undefined;
5107
5108
          if (data && isLaziable(data[0]) &&
5109
                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
5110
                !data[4].length && data[9] == 1
5111
              ) {
5112
            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
5113
          } else {
5114
            wrapper = (func.length == 1 && isLaziable(func))
5115
              ? wrapper[funcName]()
5116
              : wrapper.thru(func);
5117
          }
5118
        }
5119
        return function() {
5120
          var args = arguments,
5121
              value = args[0];
5122
5123
          if (wrapper && args.length == 1 && isArray(value)) {
5124
            return wrapper.plant(value).value();
5125
          }
5126
          var index = 0,
5127
              result = length ? funcs[index].apply(this, args) : value;
5128
5129
          while (++index < length) {
5130
            result = funcs[index].call(this, result);
5131
          }
5132
          return result;
5133
        };
5134
      });
5135
    }
5136
5137
    /**
5138
     * Creates a function that wraps `func` to invoke it with optional `this`
5139
     * binding of `thisArg`, partial application, and currying.
5140
     *
5141
     * @private
5142
     * @param {Function|string} func The function or method name to wrap.
5143
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5144
     * @param {*} [thisArg] The `this` binding of `func`.
5145
     * @param {Array} [partials] The arguments to prepend to those provided to
5146
     *  the new function.
5147
     * @param {Array} [holders] The `partials` placeholder indexes.
5148
     * @param {Array} [partialsRight] The arguments to append to those provided
5149
     *  to the new function.
5150
     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
5151
     * @param {Array} [argPos] The argument positions of the new function.
5152
     * @param {number} [ary] The arity cap of `func`.
5153
     * @param {number} [arity] The arity of `func`.
5154
     * @returns {Function} Returns the new wrapped function.
5155
     */
5156
    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
5157
      var isAry = bitmask & WRAP_ARY_FLAG,
5158
          isBind = bitmask & WRAP_BIND_FLAG,
5159
          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
5160
          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
5161
          isFlip = bitmask & WRAP_FLIP_FLAG,
5162
          Ctor = isBindKey ? undefined : createCtor(func);
5163
5164
      function wrapper() {
5165
        var length = arguments.length,
5166
            args = Array(length),
5167
            index = length;
5168
5169
        while (index--) {
5170
          args[index] = arguments[index];
5171
        }
5172
        if (isCurried) {
5173
          var placeholder = getHolder(wrapper),
5174
              holdersCount = countHolders(args, placeholder);
5175
        }
5176
        if (partials) {
5177
          args = composeArgs(args, partials, holders, isCurried);
5178
        }
5179
        if (partialsRight) {
5180
          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
5181
        }
5182
        length -= holdersCount;
5183
        if (isCurried && length < arity) {
5184
          var newHolders = replaceHolders(args, placeholder);
5185
          return createRecurry(
5186
            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
5187
            args, newHolders, argPos, ary, arity - length
5188
          );
5189
        }
5190
        var thisBinding = isBind ? thisArg : this,
5191
            fn = isBindKey ? thisBinding[func] : func;
5192
5193
        length = args.length;
5194
        if (argPos) {
5195
          args = reorder(args, argPos);
5196
        } else if (isFlip && length > 1) {
5197
          args.reverse();
5198
        }
5199
        if (isAry && ary < length) {
5200
          args.length = ary;
5201
        }
5202
        if (this && this !== root && this instanceof wrapper) {
5203
          fn = Ctor || createCtor(fn);
5204
        }
5205
        return fn.apply(thisBinding, args);
5206
      }
5207
      return wrapper;
5208
    }
5209
5210
    /**
5211
     * Creates a function like `_.invertBy`.
5212
     *
5213
     * @private
5214
     * @param {Function} setter The function to set accumulator values.
5215
     * @param {Function} toIteratee The function to resolve iteratees.
5216
     * @returns {Function} Returns the new inverter function.
5217
     */
5218
    function createInverter(setter, toIteratee) {
5219
      return function(object, iteratee) {
5220
        return baseInverter(object, setter, toIteratee(iteratee), {});
5221
      };
5222
    }
5223
5224
    /**
5225
     * Creates a function that performs a mathematical operation on two values.
5226
     *
5227
     * @private
5228
     * @param {Function} operator The function to perform the operation.
5229
     * @param {number} [defaultValue] The value used for `undefined` arguments.
5230
     * @returns {Function} Returns the new mathematical operation function.
5231
     */
5232
    function createMathOperation(operator, defaultValue) {
5233
      return function(value, other) {
5234
        var result;
5235
        if (value === undefined && other === undefined) {
5236
          return defaultValue;
5237
        }
5238
        if (value !== undefined) {
5239
          result = value;
5240
        }
5241
        if (other !== undefined) {
5242
          if (result === undefined) {
5243
            return other;
5244
          }
5245
          if (typeof value == 'string' || typeof other == 'string') {
5246
            value = baseToString(value);
5247
            other = baseToString(other);
5248
          } else {
5249
            value = baseToNumber(value);
5250
            other = baseToNumber(other);
5251
          }
5252
          result = operator(value, other);
5253
        }
5254
        return result;
5255
      };
5256
    }
5257
5258
    /**
5259
     * Creates a function like `_.over`.
5260
     *
5261
     * @private
5262
     * @param {Function} arrayFunc The function to iterate over iteratees.
5263
     * @returns {Function} Returns the new over function.
5264
     */
5265
    function createOver(arrayFunc) {
5266
      return flatRest(function(iteratees) {
5267
        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
5268
        return baseRest(function(args) {
5269
          var thisArg = this;
5270
          return arrayFunc(iteratees, function(iteratee) {
5271
            return apply(iteratee, thisArg, args);
5272
          });
5273
        });
5274
      });
5275
    }
5276
5277
    /**
5278
     * Creates the padding for `string` based on `length`. The `chars` string
5279
     * is truncated if the number of characters exceeds `length`.
5280
     *
5281
     * @private
5282
     * @param {number} length The padding length.
5283
     * @param {string} [chars=' '] The string used as padding.
5284
     * @returns {string} Returns the padding for `string`.
5285
     */
5286
    function createPadding(length, chars) {
5287
      chars = chars === undefined ? ' ' : baseToString(chars);
5288
5289
      var charsLength = chars.length;
5290
      if (charsLength < 2) {
5291
        return charsLength ? baseRepeat(chars, length) : chars;
5292
      }
5293
      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
5294
      return hasUnicode(chars)
5295
        ? castSlice(stringToArray(result), 0, length).join('')
5296
        : result.slice(0, length);
5297
    }
5298
5299
    /**
5300
     * Creates a function that wraps `func` to invoke it with the `this` binding
5301
     * of `thisArg` and `partials` prepended to the arguments it receives.
5302
     *
5303
     * @private
5304
     * @param {Function} func The function to wrap.
5305
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5306
     * @param {*} thisArg The `this` binding of `func`.
5307
     * @param {Array} partials The arguments to prepend to those provided to
5308
     *  the new function.
5309
     * @returns {Function} Returns the new wrapped function.
5310
     */
5311
    function createPartial(func, bitmask, thisArg, partials) {
5312
      var isBind = bitmask & WRAP_BIND_FLAG,
5313
          Ctor = createCtor(func);
5314
5315
      function wrapper() {
5316
        var argsIndex = -1,
5317
            argsLength = arguments.length,
5318
            leftIndex = -1,
5319
            leftLength = partials.length,
5320
            args = Array(leftLength + argsLength),
5321
            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5322
5323
        while (++leftIndex < leftLength) {
5324
          args[leftIndex] = partials[leftIndex];
5325
        }
5326
        while (argsLength--) {
5327
          args[leftIndex++] = arguments[++argsIndex];
5328
        }
5329
        return apply(fn, isBind ? thisArg : this, args);
5330
      }
5331
      return wrapper;
5332
    }
5333
5334
    /**
5335
     * Creates a `_.range` or `_.rangeRight` function.
5336
     *
5337
     * @private
5338
     * @param {boolean} [fromRight] Specify iterating from right to left.
5339
     * @returns {Function} Returns the new range function.
5340
     */
5341
    function createRange(fromRight) {
5342
      return function(start, end, step) {
5343
        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
5344
          end = step = undefined;
5345
        }
5346
        // Ensure the sign of `-0` is preserved.
5347
        start = toFinite(start);
5348
        if (end === undefined) {
5349
          end = start;
5350
          start = 0;
5351
        } else {
5352
          end = toFinite(end);
5353
        }
5354
        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
5355
        return baseRange(start, end, step, fromRight);
5356
      };
5357
    }
5358
5359
    /**
5360
     * Creates a function that performs a relational operation on two values.
5361
     *
5362
     * @private
5363
     * @param {Function} operator The function to perform the operation.
5364
     * @returns {Function} Returns the new relational operation function.
5365
     */
5366
    function createRelationalOperation(operator) {
5367
      return function(value, other) {
5368
        if (!(typeof value == 'string' && typeof other == 'string')) {
5369
          value = toNumber(value);
5370
          other = toNumber(other);
5371
        }
5372
        return operator(value, other);
5373
      };
5374
    }
5375
5376
    /**
5377
     * Creates a function that wraps `func` to continue currying.
5378
     *
5379
     * @private
5380
     * @param {Function} func The function to wrap.
5381
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5382
     * @param {Function} wrapFunc The function to create the `func` wrapper.
5383
     * @param {*} placeholder The placeholder value.
5384
     * @param {*} [thisArg] The `this` binding of `func`.
5385
     * @param {Array} [partials] The arguments to prepend to those provided to
5386
     *  the new function.
5387
     * @param {Array} [holders] The `partials` placeholder indexes.
5388
     * @param {Array} [argPos] The argument positions of the new function.
5389
     * @param {number} [ary] The arity cap of `func`.
5390
     * @param {number} [arity] The arity of `func`.
5391
     * @returns {Function} Returns the new wrapped function.
5392
     */
5393
    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
5394
      var isCurry = bitmask & WRAP_CURRY_FLAG,
5395
          newHolders = isCurry ? holders : undefined,
5396
          newHoldersRight = isCurry ? undefined : holders,
5397
          newPartials = isCurry ? partials : undefined,
5398
          newPartialsRight = isCurry ? undefined : partials;
5399
5400
      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
5401
      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
5402
5403
      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
5404
        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
5405
      }
5406
      var newData = [
5407
        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
5408
        newHoldersRight, argPos, ary, arity
5409
      ];
5410
5411
      var result = wrapFunc.apply(undefined, newData);
5412
      if (isLaziable(func)) {
5413
        setData(result, newData);
5414
      }
5415
      result.placeholder = placeholder;
5416
      return setWrapToString(result, func, bitmask);
5417
    }
5418
5419
    /**
5420
     * Creates a function like `_.round`.
5421
     *
5422
     * @private
5423
     * @param {string} methodName The name of the `Math` method to use when rounding.
5424
     * @returns {Function} Returns the new round function.
5425
     */
5426
    function createRound(methodName) {
5427
      var func = Math[methodName];
5428
      return function(number, precision) {
5429
        number = toNumber(number);
5430
        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
5431
        if (precision) {
5432
          // Shift with exponential notation to avoid floating-point issues.
5433
          // See [MDN](https://mdn.io/round#Examples) for more details.
5434
          var pair = (toString(number) + 'e').split('e'),
5435
              value = func(pair[0] + 'e' + (+pair[1] + precision));
5436
5437
          pair = (toString(value) + 'e').split('e');
5438
          return +(pair[0] + 'e' + (+pair[1] - precision));
5439
        }
5440
        return func(number);
5441
      };
5442
    }
5443
5444
    /**
5445
     * Creates a set object of `values`.
5446
     *
5447
     * @private
5448
     * @param {Array} values The values to add to the set.
5449
     * @returns {Object} Returns the new set.
5450
     */
5451
    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
5452
      return new Set(values);
5453
    };
5454
5455
    /**
5456
     * Creates a `_.toPairs` or `_.toPairsIn` function.
5457
     *
5458
     * @private
5459
     * @param {Function} keysFunc The function to get the keys of a given object.
5460
     * @returns {Function} Returns the new pairs function.
5461
     */
5462
    function createToPairs(keysFunc) {
5463
      return function(object) {
5464
        var tag = getTag(object);
5465
        if (tag == mapTag) {
5466
          return mapToArray(object);
5467
        }
5468
        if (tag == setTag) {
5469
          return setToPairs(object);
5470
        }
5471
        return baseToPairs(object, keysFunc(object));
5472
      };
5473
    }
5474
5475
    /**
5476
     * Creates a function that either curries or invokes `func` with optional
5477
     * `this` binding and partially applied arguments.
5478
     *
5479
     * @private
5480
     * @param {Function|string} func The function or method name to wrap.
5481
     * @param {number} bitmask The bitmask flags.
5482
     *    1 - `_.bind`
5483
     *    2 - `_.bindKey`
5484
     *    4 - `_.curry` or `_.curryRight` of a bound function
5485
     *    8 - `_.curry`
5486
     *   16 - `_.curryRight`
5487
     *   32 - `_.partial`
5488
     *   64 - `_.partialRight`
5489
     *  128 - `_.rearg`
5490
     *  256 - `_.ary`
5491
     *  512 - `_.flip`
5492
     * @param {*} [thisArg] The `this` binding of `func`.
5493
     * @param {Array} [partials] The arguments to be partially applied.
5494
     * @param {Array} [holders] The `partials` placeholder indexes.
5495
     * @param {Array} [argPos] The argument positions of the new function.
5496
     * @param {number} [ary] The arity cap of `func`.
5497
     * @param {number} [arity] The arity of `func`.
5498
     * @returns {Function} Returns the new wrapped function.
5499
     */
5500
    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
5501
      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
5502
      if (!isBindKey && typeof func != 'function') {
5503
        throw new TypeError(FUNC_ERROR_TEXT);
5504
      }
5505
      var length = partials ? partials.length : 0;
5506
      if (!length) {
5507
        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
5508
        partials = holders = undefined;
5509
      }
5510
      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
5511
      arity = arity === undefined ? arity : toInteger(arity);
5512
      length -= holders ? holders.length : 0;
5513
5514
      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
5515
        var partialsRight = partials,
5516
            holdersRight = holders;
5517
5518
        partials = holders = undefined;
5519
      }
5520
      var data = isBindKey ? undefined : getData(func);
5521
5522
      var newData = [
5523
        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
5524
        argPos, ary, arity
5525
      ];
5526
5527
      if (data) {
5528
        mergeData(newData, data);
5529
      }
5530
      func = newData[0];
5531
      bitmask = newData[1];
5532
      thisArg = newData[2];
5533
      partials = newData[3];
5534
      holders = newData[4];
5535
      arity = newData[9] = newData[9] === undefined
5536
        ? (isBindKey ? 0 : func.length)
5537
        : nativeMax(newData[9] - length, 0);
5538
5539
      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
5540
        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
5541
      }
5542
      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
5543
        var result = createBind(func, bitmask, thisArg);
5544
      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
5545
        result = createCurry(func, bitmask, arity);
5546
      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
5547
        result = createPartial(func, bitmask, thisArg, partials);
5548
      } else {
5549
        result = createHybrid.apply(undefined, newData);
5550
      }
5551
      var setter = data ? baseSetData : setData;
5552
      return setWrapToString(setter(result, newData), func, bitmask);
5553
    }
5554
5555
    /**
5556
     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
5557
     * of source objects to the destination object for all destination properties
5558
     * that resolve to `undefined`.
5559
     *
5560
     * @private
5561
     * @param {*} objValue The destination value.
5562
     * @param {*} srcValue The source value.
5563
     * @param {string} key The key of the property to assign.
5564
     * @param {Object} object The parent object of `objValue`.
5565
     * @returns {*} Returns the value to assign.
5566
     */
5567
    function customDefaultsAssignIn(objValue, srcValue, key, object) {
5568
      if (objValue === undefined ||
5569
          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
5570
        return srcValue;
5571
      }
5572
      return objValue;
5573
    }
5574
5575
    /**
5576
     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
5577
     * objects into destination objects that are passed thru.
5578
     *
5579
     * @private
5580
     * @param {*} objValue The destination value.
5581
     * @param {*} srcValue The source value.
5582
     * @param {string} key The key of the property to merge.
5583
     * @param {Object} object The parent object of `objValue`.
5584
     * @param {Object} source The parent object of `srcValue`.
5585
     * @param {Object} [stack] Tracks traversed source values and their merged
5586
     *  counterparts.
5587
     * @returns {*} Returns the value to assign.
5588
     */
5589
    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
5590
      if (isObject(objValue) && isObject(srcValue)) {
5591
        // Recursively merge objects and arrays (susceptible to call stack limits).
5592
        stack.set(srcValue, objValue);
5593
        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
5594
        stack['delete'](srcValue);
5595
      }
5596
      return objValue;
5597
    }
5598
5599
    /**
5600
     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
5601
     * objects.
5602
     *
5603
     * @private
5604
     * @param {*} value The value to inspect.
5605
     * @param {string} key The key of the property to inspect.
5606
     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
5607
     */
5608
    function customOmitClone(value) {
5609
      return isPlainObject(value) ? undefined : value;
5610
    }
5611
5612
    /**
5613
     * A specialized version of `baseIsEqualDeep` for arrays with support for
5614
     * partial deep comparisons.
5615
     *
5616
     * @private
5617
     * @param {Array} array The array to compare.
5618
     * @param {Array} other The other array to compare.
5619
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5620
     * @param {Function} customizer The function to customize comparisons.
5621
     * @param {Function} equalFunc The function to determine equivalents of values.
5622
     * @param {Object} stack Tracks traversed `array` and `other` objects.
5623
     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
5624
     */
5625
    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
5626
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5627
          arrLength = array.length,
5628
          othLength = other.length;
5629
5630
      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
5631
        return false;
5632
      }
5633
      // Assume cyclic values are equal.
5634
      var stacked = stack.get(array);
5635
      if (stacked && stack.get(other)) {
5636
        return stacked == other;
5637
      }
5638
      var index = -1,
5639
          result = true,
5640
          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
5641
5642
      stack.set(array, other);
5643
      stack.set(other, array);
5644
5645
      // Ignore non-index properties.
5646
      while (++index < arrLength) {
5647
        var arrValue = array[index],
5648
            othValue = other[index];
5649
5650
        if (customizer) {
5651
          var compared = isPartial
5652
            ? customizer(othValue, arrValue, index, other, array, stack)
5653
            : customizer(arrValue, othValue, index, array, other, stack);
5654
        }
5655
        if (compared !== undefined) {
5656
          if (compared) {
5657
            continue;
5658
          }
5659
          result = false;
5660
          break;
5661
        }
5662
        // Recursively compare arrays (susceptible to call stack limits).
5663
        if (seen) {
5664
          if (!arraySome(other, function(othValue, othIndex) {
5665
                if (!cacheHas(seen, othIndex) &&
5666
                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
5667
                  return seen.push(othIndex);
5668
                }
5669
              })) {
5670
            result = false;
5671
            break;
5672
          }
5673
        } else if (!(
5674
              arrValue === othValue ||
5675
                equalFunc(arrValue, othValue, bitmask, customizer, stack)
5676
            )) {
5677
          result = false;
5678
          break;
5679
        }
5680
      }
5681
      stack['delete'](array);
5682
      stack['delete'](other);
5683
      return result;
5684
    }
5685
5686
    /**
5687
     * A specialized version of `baseIsEqualDeep` for comparing objects of
5688
     * the same `toStringTag`.
5689
     *
5690
     * **Note:** This function only supports comparing values with tags of
5691
     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
5692
     *
5693
     * @private
5694
     * @param {Object} object The object to compare.
5695
     * @param {Object} other The other object to compare.
5696
     * @param {string} tag The `toStringTag` of the objects to compare.
5697
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5698
     * @param {Function} customizer The function to customize comparisons.
5699
     * @param {Function} equalFunc The function to determine equivalents of values.
5700
     * @param {Object} stack Tracks traversed `object` and `other` objects.
5701
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5702
     */
5703
    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
5704
      switch (tag) {
5705
        case dataViewTag:
5706
          if ((object.byteLength != other.byteLength) ||
5707
              (object.byteOffset != other.byteOffset)) {
5708
            return false;
5709
          }
5710
          object = object.buffer;
5711
          other = other.buffer;
5712
5713
        case arrayBufferTag:
5714
          if ((object.byteLength != other.byteLength) ||
5715
              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
5716
            return false;
5717
          }
5718
          return true;
5719
5720
        case boolTag:
5721
        case dateTag:
5722
        case numberTag:
5723
          // Coerce booleans to `1` or `0` and dates to milliseconds.
5724
          // Invalid dates are coerced to `NaN`.
5725
          return eq(+object, +other);
5726
5727
        case errorTag:
5728
          return object.name == other.name && object.message == other.message;
5729
5730
        case regexpTag:
5731
        case stringTag:
5732
          // Coerce regexes to strings and treat strings, primitives and objects,
5733
          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
5734
          // for more details.
5735
          return object == (other + '');
5736
5737
        case mapTag:
5738
          var convert = mapToArray;
5739
5740
        case setTag:
5741
          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
5742
          convert || (convert = setToArray);
5743
5744
          if (object.size != other.size && !isPartial) {
5745
            return false;
5746
          }
5747
          // Assume cyclic values are equal.
5748
          var stacked = stack.get(object);
5749
          if (stacked) {
5750
            return stacked == other;
5751
          }
5752
          bitmask |= COMPARE_UNORDERED_FLAG;
5753
5754
          // Recursively compare objects (susceptible to call stack limits).
5755
          stack.set(object, other);
5756
          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
5757
          stack['delete'](object);
5758
          return result;
5759
5760
        case symbolTag:
5761
          if (symbolValueOf) {
5762
            return symbolValueOf.call(object) == symbolValueOf.call(other);
5763
          }
5764
      }
5765
      return false;
5766
    }
5767
5768
    /**
5769
     * A specialized version of `baseIsEqualDeep` for objects with support for
5770
     * partial deep comparisons.
5771
     *
5772
     * @private
5773
     * @param {Object} object The object to compare.
5774
     * @param {Object} other The other object to compare.
5775
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5776
     * @param {Function} customizer The function to customize comparisons.
5777
     * @param {Function} equalFunc The function to determine equivalents of values.
5778
     * @param {Object} stack Tracks traversed `object` and `other` objects.
5779
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5780
     */
5781
    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
5782
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5783
          objProps = getAllKeys(object),
5784
          objLength = objProps.length,
5785
          othProps = getAllKeys(other),
5786
          othLength = othProps.length;
5787
5788
      if (objLength != othLength && !isPartial) {
5789
        return false;
5790
      }
5791
      var index = objLength;
5792
      while (index--) {
5793
        var key = objProps[index];
5794
        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
5795
          return false;
5796
        }
5797
      }
5798
      // Assume cyclic values are equal.
5799
      var stacked = stack.get(object);
5800
      if (stacked && stack.get(other)) {
5801
        return stacked == other;
5802
      }
5803
      var result = true;
5804
      stack.set(object, other);
5805
      stack.set(other, object);
5806
5807
      var skipCtor = isPartial;
5808
      while (++index < objLength) {
5809
        key = objProps[index];
5810
        var objValue = object[key],
5811
            othValue = other[key];
5812
5813
        if (customizer) {
5814
          var compared = isPartial
5815
            ? customizer(othValue, objValue, key, other, object, stack)
5816
            : customizer(objValue, othValue, key, object, other, stack);
5817
        }
5818
        // Recursively compare objects (susceptible to call stack limits).
5819
        if (!(compared === undefined
5820
              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
5821
              : compared
5822
            )) {
5823
          result = false;
5824
          break;
5825
        }
5826
        skipCtor || (skipCtor = key == 'constructor');
5827
      }
5828
      if (result && !skipCtor) {
5829
        var objCtor = object.constructor,
5830
            othCtor = other.constructor;
5831
5832
        // Non `Object` object instances with different constructors are not equal.
5833
        if (objCtor != othCtor &&
5834
            ('constructor' in object && 'constructor' in other) &&
5835
            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
5836
              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
5837
          result = false;
5838
        }
5839
      }
5840
      stack['delete'](object);
5841
      stack['delete'](other);
5842
      return result;
5843
    }
5844
5845
    /**
5846
     * A specialized version of `baseRest` which flattens the rest array.
5847
     *
5848
     * @private
5849
     * @param {Function} func The function to apply a rest parameter to.
5850
     * @returns {Function} Returns the new function.
5851
     */
5852
    function flatRest(func) {
5853
      return setToString(overRest(func, undefined, flatten), func + '');
5854
    }
5855
5856
    /**
5857
     * Creates an array of own enumerable property names and symbols of `object`.
5858
     *
5859
     * @private
5860
     * @param {Object} object The object to query.
5861
     * @returns {Array} Returns the array of property names and symbols.
5862
     */
5863
    function getAllKeys(object) {
5864
      return baseGetAllKeys(object, keys, getSymbols);
5865
    }
5866
5867
    /**
5868
     * Creates an array of own and inherited enumerable property names and
5869
     * symbols of `object`.
5870
     *
5871
     * @private
5872
     * @param {Object} object The object to query.
5873
     * @returns {Array} Returns the array of property names and symbols.
5874
     */
5875
    function getAllKeysIn(object) {
5876
      return baseGetAllKeys(object, keysIn, getSymbolsIn);
5877
    }
5878
5879
    /**
5880
     * Gets metadata for `func`.
5881
     *
5882
     * @private
5883
     * @param {Function} func The function to query.
5884
     * @returns {*} Returns the metadata for `func`.
5885
     */
5886
    var getData = !metaMap ? noop : function(func) {
5887
      return metaMap.get(func);
5888
    };
5889
5890
    /**
5891
     * Gets the name of `func`.
5892
     *
5893
     * @private
5894
     * @param {Function} func The function to query.
5895
     * @returns {string} Returns the function name.
5896
     */
5897
    function getFuncName(func) {
5898
      var result = (func.name + ''),
5899
          array = realNames[result],
5900
          length = hasOwnProperty.call(realNames, result) ? array.length : 0;
5901
5902
      while (length--) {
5903
        var data = array[length],
5904
            otherFunc = data.func;
5905
        if (otherFunc == null || otherFunc == func) {
5906
          return data.name;
5907
        }
5908
      }
5909
      return result;
5910
    }
5911
5912
    /**
5913
     * Gets the argument placeholder value for `func`.
5914
     *
5915
     * @private
5916
     * @param {Function} func The function to inspect.
5917
     * @returns {*} Returns the placeholder value.
5918
     */
5919
    function getHolder(func) {
5920
      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
5921
      return object.placeholder;
5922
    }
5923
5924
    /**
5925
     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
5926
     * this function returns the custom method, otherwise it returns `baseIteratee`.
5927
     * If arguments are provided, the chosen function is invoked with them and
5928
     * its result is returned.
5929
     *
5930
     * @private
5931
     * @param {*} [value] The value to convert to an iteratee.
5932
     * @param {number} [arity] The arity of the created iteratee.
5933
     * @returns {Function} Returns the chosen function or its result.
5934
     */
5935
    function getIteratee() {
5936
      var result = lodash.iteratee || iteratee;
5937
      result = result === iteratee ? baseIteratee : result;
5938
      return arguments.length ? result(arguments[0], arguments[1]) : result;
5939
    }
5940
5941
    /**
5942
     * Gets the data for `map`.
5943
     *
5944
     * @private
5945
     * @param {Object} map The map to query.
5946
     * @param {string} key The reference key.
5947
     * @returns {*} Returns the map data.
5948
     */
5949
    function getMapData(map, key) {
5950
      var data = map.__data__;
5951
      return isKeyable(key)
5952
        ? data[typeof key == 'string' ? 'string' : 'hash']
5953
        : data.map;
5954
    }
5955
5956
    /**
5957
     * Gets the property names, values, and compare flags of `object`.
5958
     *
5959
     * @private
5960
     * @param {Object} object The object to query.
5961
     * @returns {Array} Returns the match data of `object`.
5962
     */
5963
    function getMatchData(object) {
5964
      var result = keys(object),
5965
          length = result.length;
5966
5967
      while (length--) {
5968
        var key = result[length],
5969
            value = object[key];
5970
5971
        result[length] = [key, value, isStrictComparable(value)];
5972
      }
5973
      return result;
5974
    }
5975
5976
    /**
5977
     * Gets the native function at `key` of `object`.
5978
     *
5979
     * @private
5980
     * @param {Object} object The object to query.
5981
     * @param {string} key The key of the method to get.
5982
     * @returns {*} Returns the function if it's native, else `undefined`.
5983
     */
5984
    function getNative(object, key) {
5985
      var value = getValue(object, key);
5986
      return baseIsNative(value) ? value : undefined;
5987
    }
5988
5989
    /**
5990
     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
5991
     *
5992
     * @private
5993
     * @param {*} value The value to query.
5994
     * @returns {string} Returns the raw `toStringTag`.
5995
     */
5996
    function getRawTag(value) {
5997
      var isOwn = hasOwnProperty.call(value, symToStringTag),
5998
          tag = value[symToStringTag];
5999
6000
      try {
6001
        value[symToStringTag] = undefined;
6002
        var unmasked = true;
6003
      } catch (e) {}
6004
6005
      var result = nativeObjectToString.call(value);
6006
      if (unmasked) {
6007
        if (isOwn) {
6008
          value[symToStringTag] = tag;
6009
        } else {
6010
          delete value[symToStringTag];
6011
        }
6012
      }
6013
      return result;
6014
    }
6015
6016
    /**
6017
     * Creates an array of the own enumerable symbols of `object`.
6018
     *
6019
     * @private
6020
     * @param {Object} object The object to query.
6021
     * @returns {Array} Returns the array of symbols.
6022
     */
6023
    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
6024
      if (object == null) {
6025
        return [];
6026
      }
6027
      object = Object(object);
6028
      return arrayFilter(nativeGetSymbols(object), function(symbol) {
6029
        return propertyIsEnumerable.call(object, symbol);
6030
      });
6031
    };
6032
6033
    /**
6034
     * Creates an array of the own and inherited enumerable symbols of `object`.
6035
     *
6036
     * @private
6037
     * @param {Object} object The object to query.
6038
     * @returns {Array} Returns the array of symbols.
6039
     */
6040
    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
6041
      var result = [];
6042
      while (object) {
6043
        arrayPush(result, getSymbols(object));
6044
        object = getPrototype(object);
6045
      }
6046
      return result;
6047
    };
6048
6049
    /**
6050
     * Gets the `toStringTag` of `value`.
6051
     *
6052
     * @private
6053
     * @param {*} value The value to query.
6054
     * @returns {string} Returns the `toStringTag`.
6055
     */
6056
    var getTag = baseGetTag;
6057
6058
    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
6059
    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
6060
        (Map && getTag(new Map) != mapTag) ||
6061
        (Promise && getTag(Promise.resolve()) != promiseTag) ||
6062
        (Set && getTag(new Set) != setTag) ||
6063
        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
6064
      getTag = function(value) {
6065
        var result = baseGetTag(value),
6066
            Ctor = result == objectTag ? value.constructor : undefined,
6067
            ctorString = Ctor ? toSource(Ctor) : '';
6068
6069
        if (ctorString) {
6070
          switch (ctorString) {
6071
            case dataViewCtorString: return dataViewTag;
6072
            case mapCtorString: return mapTag;
6073
            case promiseCtorString: return promiseTag;
6074
            case setCtorString: return setTag;
6075
            case weakMapCtorString: return weakMapTag;
6076
          }
6077
        }
6078
        return result;
6079
      };
6080
    }
6081
6082
    /**
6083
     * Gets the view, applying any `transforms` to the `start` and `end` positions.
6084
     *
6085
     * @private
6086
     * @param {number} start The start of the view.
6087
     * @param {number} end The end of the view.
6088
     * @param {Array} transforms The transformations to apply to the view.
6089
     * @returns {Object} Returns an object containing the `start` and `end`
6090
     *  positions of the view.
6091
     */
6092
    function getView(start, end, transforms) {
6093
      var index = -1,
6094
          length = transforms.length;
6095
6096
      while (++index < length) {
6097
        var data = transforms[index],
6098
            size = data.size;
6099
6100
        switch (data.type) {
6101
          case 'drop':      start += size; break;
6102
          case 'dropRight': end -= size; break;
6103
          case 'take':      end = nativeMin(end, start + size); break;
6104
          case 'takeRight': start = nativeMax(start, end - size); break;
6105
        }
6106
      }
6107
      return { 'start': start, 'end': end };
6108
    }
6109
6110
    /**
6111
     * Extracts wrapper details from the `source` body comment.
6112
     *
6113
     * @private
6114
     * @param {string} source The source to inspect.
6115
     * @returns {Array} Returns the wrapper details.
6116
     */
6117
    function getWrapDetails(source) {
6118
      var match = source.match(reWrapDetails);
6119
      return match ? match[1].split(reSplitDetails) : [];
6120
    }
6121
6122
    /**
6123
     * Checks if `path` exists on `object`.
6124
     *
6125
     * @private
6126
     * @param {Object} object The object to query.
6127
     * @param {Array|string} path The path to check.
6128
     * @param {Function} hasFunc The function to check properties.
6129
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
6130
     */
6131
    function hasPath(object, path, hasFunc) {
6132
      path = castPath(path, object);
6133
6134
      var index = -1,
6135
          length = path.length,
6136
          result = false;
6137
6138
      while (++index < length) {
6139
        var key = toKey(path[index]);
6140
        if (!(result = object != null && hasFunc(object, key))) {
6141
          break;
6142
        }
6143
        object = object[key];
6144
      }
6145
      if (result || ++index != length) {
6146
        return result;
6147
      }
6148
      length = object == null ? 0 : object.length;
6149
      return !!length && isLength(length) && isIndex(key, length) &&
6150
        (isArray(object) || isArguments(object));
6151
    }
6152
6153
    /**
6154
     * Initializes an array clone.
6155
     *
6156
     * @private
6157
     * @param {Array} array The array to clone.
6158
     * @returns {Array} Returns the initialized clone.
6159
     */
6160
    function initCloneArray(array) {
6161
      var length = array.length,
6162
          result = new array.constructor(length);
6163
6164
      // Add properties assigned by `RegExp#exec`.
6165
      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
6166
        result.index = array.index;
6167
        result.input = array.input;
6168
      }
6169
      return result;
6170
    }
6171
6172
    /**
6173
     * Initializes an object clone.
6174
     *
6175
     * @private
6176
     * @param {Object} object The object to clone.
6177
     * @returns {Object} Returns the initialized clone.
6178
     */
6179
    function initCloneObject(object) {
6180
      return (typeof object.constructor == 'function' && !isPrototype(object))
6181
        ? baseCreate(getPrototype(object))
6182
        : {};
6183
    }
6184
6185
    /**
6186
     * Initializes an object clone based on its `toStringTag`.
6187
     *
6188
     * **Note:** This function only supports cloning values with tags of
6189
     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
6190
     *
6191
     * @private
6192
     * @param {Object} object The object to clone.
6193
     * @param {string} tag The `toStringTag` of the object to clone.
6194
     * @param {boolean} [isDeep] Specify a deep clone.
6195
     * @returns {Object} Returns the initialized clone.
6196
     */
6197
    function initCloneByTag(object, tag, isDeep) {
6198
      var Ctor = object.constructor;
6199
      switch (tag) {
6200
        case arrayBufferTag:
6201
          return cloneArrayBuffer(object);
6202
6203
        case boolTag:
6204
        case dateTag:
6205
          return new Ctor(+object);
6206
6207
        case dataViewTag:
6208
          return cloneDataView(object, isDeep);
6209
6210
        case float32Tag: case float64Tag:
6211
        case int8Tag: case int16Tag: case int32Tag:
6212
        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
6213
          return cloneTypedArray(object, isDeep);
6214
6215
        case mapTag:
6216
          return new Ctor;
6217
6218
        case numberTag:
6219
        case stringTag:
6220
          return new Ctor(object);
6221
6222
        case regexpTag:
6223
          return cloneRegExp(object);
6224
6225
        case setTag:
6226
          return new Ctor;
6227
6228
        case symbolTag:
6229
          return cloneSymbol(object);
6230
      }
6231
    }
6232
6233
    /**
6234
     * Inserts wrapper `details` in a comment at the top of the `source` body.
6235
     *
6236
     * @private
6237
     * @param {string} source The source to modify.
6238
     * @returns {Array} details The details to insert.
6239
     * @returns {string} Returns the modified source.
6240
     */
6241
    function insertWrapDetails(source, details) {
6242
      var length = details.length;
6243
      if (!length) {
6244
        return source;
6245
      }
6246
      var lastIndex = length - 1;
6247
      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
6248
      details = details.join(length > 2 ? ', ' : ' ');
6249
      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
6250
    }
6251
6252
    /**
6253
     * Checks if `value` is a flattenable `arguments` object or array.
6254
     *
6255
     * @private
6256
     * @param {*} value The value to check.
6257
     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
6258
     */
6259
    function isFlattenable(value) {
6260
      return isArray(value) || isArguments(value) ||
6261
        !!(spreadableSymbol && value && value[spreadableSymbol]);
6262
    }
6263
6264
    /**
6265
     * Checks if `value` is a valid array-like index.
6266
     *
6267
     * @private
6268
     * @param {*} value The value to check.
6269
     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
6270
     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
6271
     */
6272
    function isIndex(value, length) {
6273
      var type = typeof value;
6274
      length = length == null ? MAX_SAFE_INTEGER : length;
6275
6276
      return !!length &&
6277
        (type == 'number' ||
6278
          (type != 'symbol' && reIsUint.test(value))) &&
6279
            (value > -1 && value % 1 == 0 && value < length);
6280
    }
6281
6282
    /**
6283
     * Checks if the given arguments are from an iteratee call.
6284
     *
6285
     * @private
6286
     * @param {*} value The potential iteratee value argument.
6287
     * @param {*} index The potential iteratee index or key argument.
6288
     * @param {*} object The potential iteratee object argument.
6289
     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
6290
     *  else `false`.
6291
     */
6292
    function isIterateeCall(value, index, object) {
6293
      if (!isObject(object)) {
6294
        return false;
6295
      }
6296
      var type = typeof index;
6297
      if (type == 'number'
6298
            ? (isArrayLike(object) && isIndex(index, object.length))
6299
            : (type == 'string' && index in object)
6300
          ) {
6301
        return eq(object[index], value);
6302
      }
6303
      return false;
6304
    }
6305
6306
    /**
6307
     * Checks if `value` is a property name and not a property path.
6308
     *
6309
     * @private
6310
     * @param {*} value The value to check.
6311
     * @param {Object} [object] The object to query keys on.
6312
     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
6313
     */
6314
    function isKey(value, object) {
6315
      if (isArray(value)) {
6316
        return false;
6317
      }
6318
      var type = typeof value;
6319
      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
6320
          value == null || isSymbol(value)) {
6321
        return true;
6322
      }
6323
      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
6324
        (object != null && value in Object(object));
6325
    }
6326
6327
    /**
6328
     * Checks if `value` is suitable for use as unique object key.
6329
     *
6330
     * @private
6331
     * @param {*} value The value to check.
6332
     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
6333
     */
6334
    function isKeyable(value) {
6335
      var type = typeof value;
6336
      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
6337
        ? (value !== '__proto__')
6338
        : (value === null);
6339
    }
6340
6341
    /**
6342
     * Checks if `func` has a lazy counterpart.
6343
     *
6344
     * @private
6345
     * @param {Function} func The function to check.
6346
     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
6347
     *  else `false`.
6348
     */
6349
    function isLaziable(func) {
6350
      var funcName = getFuncName(func),
6351
          other = lodash[funcName];
6352
6353
      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
6354
        return false;
6355
      }
6356
      if (func === other) {
6357
        return true;
6358
      }
6359
      var data = getData(other);
6360
      return !!data && func === data[0];
6361
    }
6362
6363
    /**
6364
     * Checks if `func` has its source masked.
6365
     *
6366
     * @private
6367
     * @param {Function} func The function to check.
6368
     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
6369
     */
6370
    function isMasked(func) {
6371
      return !!maskSrcKey && (maskSrcKey in func);
6372
    }
6373
6374
    /**
6375
     * Checks if `func` is capable of being masked.
6376
     *
6377
     * @private
6378
     * @param {*} value The value to check.
6379
     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
6380
     */
6381
    var isMaskable = coreJsData ? isFunction : stubFalse;
6382
6383
    /**
6384
     * Checks if `value` is likely a prototype object.
6385
     *
6386
     * @private
6387
     * @param {*} value The value to check.
6388
     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
6389
     */
6390
    function isPrototype(value) {
6391
      var Ctor = value && value.constructor,
6392
          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
6393
6394
      return value === proto;
6395
    }
6396
6397
    /**
6398
     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
6399
     *
6400
     * @private
6401
     * @param {*} value The value to check.
6402
     * @returns {boolean} Returns `true` if `value` if suitable for strict
6403
     *  equality comparisons, else `false`.
6404
     */
6405
    function isStrictComparable(value) {
6406
      return value === value && !isObject(value);
6407
    }
6408
6409
    /**
6410
     * A specialized version of `matchesProperty` for source values suitable
6411
     * for strict equality comparisons, i.e. `===`.
6412
     *
6413
     * @private
6414
     * @param {string} key The key of the property to get.
6415
     * @param {*} srcValue The value to match.
6416
     * @returns {Function} Returns the new spec function.
6417
     */
6418
    function matchesStrictComparable(key, srcValue) {
6419
      return function(object) {
6420
        if (object == null) {
6421
          return false;
6422
        }
6423
        return object[key] === srcValue &&
6424
          (srcValue !== undefined || (key in Object(object)));
6425
      };
6426
    }
6427
6428
    /**
6429
     * A specialized version of `_.memoize` which clears the memoized function's
6430
     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
6431
     *
6432
     * @private
6433
     * @param {Function} func The function to have its output memoized.
6434
     * @returns {Function} Returns the new memoized function.
6435
     */
6436
    function memoizeCapped(func) {
6437
      var result = memoize(func, function(key) {
6438
        if (cache.size === MAX_MEMOIZE_SIZE) {
6439
          cache.clear();
6440
        }
6441
        return key;
6442
      });
6443
6444
      var cache = result.cache;
6445
      return result;
6446
    }
6447
6448
    /**
6449
     * Merges the function metadata of `source` into `data`.
6450
     *
6451
     * Merging metadata reduces the number of wrappers used to invoke a function.
6452
     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
6453
     * may be applied regardless of execution order. Methods like `_.ary` and
6454
     * `_.rearg` modify function arguments, making the order in which they are
6455
     * executed important, preventing the merging of metadata. However, we make
6456
     * an exception for a safe combined case where curried functions have `_.ary`
6457
     * and or `_.rearg` applied.
6458
     *
6459
     * @private
6460
     * @param {Array} data The destination metadata.
6461
     * @param {Array} source The source metadata.
6462
     * @returns {Array} Returns `data`.
6463
     */
6464
    function mergeData(data, source) {
6465
      var bitmask = data[1],
6466
          srcBitmask = source[1],
6467
          newBitmask = bitmask | srcBitmask,
6468
          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
6469
6470
      var isCombo =
6471
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
6472
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
6473
        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
6474
6475
      // Exit early if metadata can't be merged.
6476
      if (!(isCommon || isCombo)) {
6477
        return data;
6478
      }
6479
      // Use source `thisArg` if available.
6480
      if (srcBitmask & WRAP_BIND_FLAG) {
6481
        data[2] = source[2];
6482
        // Set when currying a bound function.
6483
        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
6484
      }
6485
      // Compose partial arguments.
6486
      var value = source[3];
6487
      if (value) {
6488
        var partials = data[3];
6489
        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
6490
        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
6491
      }
6492
      // Compose partial right arguments.
6493
      value = source[5];
6494
      if (value) {
6495
        partials = data[5];
6496
        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
6497
        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
6498
      }
6499
      // Use source `argPos` if available.
6500
      value = source[7];
6501
      if (value) {
6502
        data[7] = value;
6503
      }
6504
      // Use source `ary` if it's smaller.
6505
      if (srcBitmask & WRAP_ARY_FLAG) {
6506
        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
6507
      }
6508
      // Use source `arity` if one is not provided.
6509
      if (data[9] == null) {
6510
        data[9] = source[9];
6511
      }
6512
      // Use source `func` and merge bitmasks.
6513
      data[0] = source[0];
6514
      data[1] = newBitmask;
6515
6516
      return data;
6517
    }
6518
6519
    /**
6520
     * This function is like
6521
     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
6522
     * except that it includes inherited enumerable properties.
6523
     *
6524
     * @private
6525
     * @param {Object} object The object to query.
6526
     * @returns {Array} Returns the array of property names.
6527
     */
6528
    function nativeKeysIn(object) {
6529
      var result = [];
6530
      if (object != null) {
6531
        for (var key in Object(object)) {
6532
          result.push(key);
6533
        }
6534
      }
6535
      return result;
6536
    }
6537
6538
    /**
6539
     * Converts `value` to a string using `Object.prototype.toString`.
6540
     *
6541
     * @private
6542
     * @param {*} value The value to convert.
6543
     * @returns {string} Returns the converted string.
6544
     */
6545
    function objectToString(value) {
6546
      return nativeObjectToString.call(value);
6547
    }
6548
6549
    /**
6550
     * A specialized version of `baseRest` which transforms the rest array.
6551
     *
6552
     * @private
6553
     * @param {Function} func The function to apply a rest parameter to.
6554
     * @param {number} [start=func.length-1] The start position of the rest parameter.
6555
     * @param {Function} transform The rest array transform.
6556
     * @returns {Function} Returns the new function.
6557
     */
6558
    function overRest(func, start, transform) {
6559
      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
6560
      return function() {
6561
        var args = arguments,
6562
            index = -1,
6563
            length = nativeMax(args.length - start, 0),
6564
            array = Array(length);
6565
6566
        while (++index < length) {
6567
          array[index] = args[start + index];
6568
        }
6569
        index = -1;
6570
        var otherArgs = Array(start + 1);
6571
        while (++index < start) {
6572
          otherArgs[index] = args[index];
6573
        }
6574
        otherArgs[start] = transform(array);
6575
        return apply(func, this, otherArgs);
6576
      };
6577
    }
6578
6579
    /**
6580
     * Gets the parent value at `path` of `object`.
6581
     *
6582
     * @private
6583
     * @param {Object} object The object to query.
6584
     * @param {Array} path The path to get the parent value of.
6585
     * @returns {*} Returns the parent value.
6586
     */
6587
    function parent(object, path) {
6588
      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
6589
    }
6590
6591
    /**
6592
     * Reorder `array` according to the specified indexes where the element at
6593
     * the first index is assigned as the first element, the element at
6594
     * the second index is assigned as the second element, and so on.
6595
     *
6596
     * @private
6597
     * @param {Array} array The array to reorder.
6598
     * @param {Array} indexes The arranged array indexes.
6599
     * @returns {Array} Returns `array`.
6600
     */
6601
    function reorder(array, indexes) {
6602
      var arrLength = array.length,
6603
          length = nativeMin(indexes.length, arrLength),
6604
          oldArray = copyArray(array);
6605
6606
      while (length--) {
6607
        var index = indexes[length];
6608
        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
6609
      }
6610
      return array;
6611
    }
6612
6613
    /**
6614
     * Sets metadata for `func`.
6615
     *
6616
     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
6617
     * period of time, it will trip its breaker and transition to an identity
6618
     * function to avoid garbage collection pauses in V8. See
6619
     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
6620
     * for more details.
6621
     *
6622
     * @private
6623
     * @param {Function} func The function to associate metadata with.
6624
     * @param {*} data The metadata.
6625
     * @returns {Function} Returns `func`.
6626
     */
6627
    var setData = shortOut(baseSetData);
6628
6629
    /**
6630
     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
6631
     *
6632
     * @private
6633
     * @param {Function} func The function to delay.
6634
     * @param {number} wait The number of milliseconds to delay invocation.
6635
     * @returns {number|Object} Returns the timer id or timeout object.
6636
     */
6637
    var setTimeout = ctxSetTimeout || function(func, wait) {
6638
      return root.setTimeout(func, wait);
6639
    };
6640
6641
    /**
6642
     * Sets the `toString` method of `func` to return `string`.
6643
     *
6644
     * @private
6645
     * @param {Function} func The function to modify.
6646
     * @param {Function} string The `toString` result.
6647
     * @returns {Function} Returns `func`.
6648
     */
6649
    var setToString = shortOut(baseSetToString);
6650
6651
    /**
6652
     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
6653
     * with wrapper details in a comment at the top of the source body.
6654
     *
6655
     * @private
6656
     * @param {Function} wrapper The function to modify.
6657
     * @param {Function} reference The reference function.
6658
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6659
     * @returns {Function} Returns `wrapper`.
6660
     */
6661
    function setWrapToString(wrapper, reference, bitmask) {
6662
      var source = (reference + '');
6663
      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
6664
    }
6665
6666
    /**
6667
     * Creates a function that'll short out and invoke `identity` instead
6668
     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
6669
     * milliseconds.
6670
     *
6671
     * @private
6672
     * @param {Function} func The function to restrict.
6673
     * @returns {Function} Returns the new shortable function.
6674
     */
6675
    function shortOut(func) {
6676
      var count = 0,
6677
          lastCalled = 0;
6678
6679
      return function() {
6680
        var stamp = nativeNow(),
6681
            remaining = HOT_SPAN - (stamp - lastCalled);
6682
6683
        lastCalled = stamp;
6684
        if (remaining > 0) {
6685
          if (++count >= HOT_COUNT) {
6686
            return arguments[0];
6687
          }
6688
        } else {
6689
          count = 0;
6690
        }
6691
        return func.apply(undefined, arguments);
6692
      };
6693
    }
6694
6695
    /**
6696
     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
6697
     *
6698
     * @private
6699
     * @param {Array} array The array to shuffle.
6700
     * @param {number} [size=array.length] The size of `array`.
6701
     * @returns {Array} Returns `array`.
6702
     */
6703
    function shuffleSelf(array, size) {
6704
      var index = -1,
6705
          length = array.length,
6706
          lastIndex = length - 1;
6707
6708
      size = size === undefined ? length : size;
6709
      while (++index < size) {
6710
        var rand = baseRandom(index, lastIndex),
6711
            value = array[rand];
6712
6713
        array[rand] = array[index];
6714
        array[index] = value;
6715
      }
6716
      array.length = size;
6717
      return array;
6718
    }
6719
6720
    /**
6721
     * Converts `string` to a property path array.
6722
     *
6723
     * @private
6724
     * @param {string} string The string to convert.
6725
     * @returns {Array} Returns the property path array.
6726
     */
6727
    var stringToPath = memoizeCapped(function(string) {
6728
      var result = [];
6729
      if (string.charCodeAt(0) === 46 /* . */) {
6730
        result.push('');
6731
      }
6732
      string.replace(rePropName, function(match, number, quote, subString) {
6733
        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
6734
      });
6735
      return result;
6736
    });
6737
6738
    /**
6739
     * Converts `value` to a string key if it's not a string or symbol.
6740
     *
6741
     * @private
6742
     * @param {*} value The value to inspect.
6743
     * @returns {string|symbol} Returns the key.
6744
     */
6745
    function toKey(value) {
6746
      if (typeof value == 'string' || isSymbol(value)) {
6747
        return value;
6748
      }
6749
      var result = (value + '');
6750
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
6751
    }
6752
6753
    /**
6754
     * Converts `func` to its source code.
6755
     *
6756
     * @private
6757
     * @param {Function} func The function to convert.
6758
     * @returns {string} Returns the source code.
6759
     */
6760
    function toSource(func) {
6761
      if (func != null) {
6762
        try {
6763
          return funcToString.call(func);
6764
        } catch (e) {}
6765
        try {
6766
          return (func + '');
6767
        } catch (e) {}
6768
      }
6769
      return '';
6770
    }
6771
6772
    /**
6773
     * Updates wrapper `details` based on `bitmask` flags.
6774
     *
6775
     * @private
6776
     * @returns {Array} details The details to modify.
6777
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6778
     * @returns {Array} Returns `details`.
6779
     */
6780
    function updateWrapDetails(details, bitmask) {
6781
      arrayEach(wrapFlags, function(pair) {
6782
        var value = '_.' + pair[0];
6783
        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
6784
          details.push(value);
6785
        }
6786
      });
6787
      return details.sort();
6788
    }
6789
6790
    /**
6791
     * Creates a clone of `wrapper`.
6792
     *
6793
     * @private
6794
     * @param {Object} wrapper The wrapper to clone.
6795
     * @returns {Object} Returns the cloned wrapper.
6796
     */
6797
    function wrapperClone(wrapper) {
6798
      if (wrapper instanceof LazyWrapper) {
6799
        return wrapper.clone();
6800
      }
6801
      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
6802
      result.__actions__ = copyArray(wrapper.__actions__);
6803
      result.__index__  = wrapper.__index__;
6804
      result.__values__ = wrapper.__values__;
6805
      return result;
6806
    }
6807
6808
    /*------------------------------------------------------------------------*/
6809
6810
    /**
6811
     * Creates an array of elements split into groups the length of `size`.
6812
     * If `array` can't be split evenly, the final chunk will be the remaining
6813
     * elements.
6814
     *
6815
     * @static
6816
     * @memberOf _
6817
     * @since 3.0.0
6818
     * @category Array
6819
     * @param {Array} array The array to process.
6820
     * @param {number} [size=1] The length of each chunk
6821
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
6822
     * @returns {Array} Returns the new array of chunks.
6823
     * @example
6824
     *
6825
     * _.chunk(['a', 'b', 'c', 'd'], 2);
6826
     * // => [['a', 'b'], ['c', 'd']]
6827
     *
6828
     * _.chunk(['a', 'b', 'c', 'd'], 3);
6829
     * // => [['a', 'b', 'c'], ['d']]
6830
     */
6831
    function chunk(array, size, guard) {
6832
      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
6833
        size = 1;
6834
      } else {
6835
        size = nativeMax(toInteger(size), 0);
6836
      }
6837
      var length = array == null ? 0 : array.length;
6838
      if (!length || size < 1) {
6839
        return [];
6840
      }
6841
      var index = 0,
6842
          resIndex = 0,
6843
          result = Array(nativeCeil(length / size));
6844
6845
      while (index < length) {
6846
        result[resIndex++] = baseSlice(array, index, (index += size));
6847
      }
6848
      return result;
6849
    }
6850
6851
    /**
6852
     * Creates an array with all falsey values removed. The values `false`, `null`,
6853
     * `0`, `""`, `undefined`, and `NaN` are falsey.
6854
     *
6855
     * @static
6856
     * @memberOf _
6857
     * @since 0.1.0
6858
     * @category Array
6859
     * @param {Array} array The array to compact.
6860
     * @returns {Array} Returns the new array of filtered values.
6861
     * @example
6862
     *
6863
     * _.compact([0, 1, false, 2, '', 3]);
6864
     * // => [1, 2, 3]
6865
     */
6866
    function compact(array) {
6867
      var index = -1,
6868
          length = array == null ? 0 : array.length,
6869
          resIndex = 0,
6870
          result = [];
6871
6872
      while (++index < length) {
6873
        var value = array[index];
6874
        if (value) {
6875
          result[resIndex++] = value;
6876
        }
6877
      }
6878
      return result;
6879
    }
6880
6881
    /**
6882
     * Creates a new array concatenating `array` with any additional arrays
6883
     * and/or values.
6884
     *
6885
     * @static
6886
     * @memberOf _
6887
     * @since 4.0.0
6888
     * @category Array
6889
     * @param {Array} array The array to concatenate.
6890
     * @param {...*} [values] The values to concatenate.
6891
     * @returns {Array} Returns the new concatenated array.
6892
     * @example
6893
     *
6894
     * var array = [1];
6895
     * var other = _.concat(array, 2, [3], [[4]]);
6896
     *
6897
     * console.log(other);
6898
     * // => [1, 2, 3, [4]]
6899
     *
6900
     * console.log(array);
6901
     * // => [1]
6902
     */
6903
    function concat() {
6904
      var length = arguments.length;
6905
      if (!length) {
6906
        return [];
6907
      }
6908
      var args = Array(length - 1),
6909
          array = arguments[0],
6910
          index = length;
6911
6912
      while (index--) {
6913
        args[index - 1] = arguments[index];
6914
      }
6915
      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
6916
    }
6917
6918
    /**
6919
     * Creates an array of `array` values not included in the other given arrays
6920
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
6921
     * for equality comparisons. The order and references of result values are
6922
     * determined by the first array.
6923
     *
6924
     * **Note:** Unlike `_.pullAll`, this method returns a new array.
6925
     *
6926
     * @static
6927
     * @memberOf _
6928
     * @since 0.1.0
6929
     * @category Array
6930
     * @param {Array} array The array to inspect.
6931
     * @param {...Array} [values] The values to exclude.
6932
     * @returns {Array} Returns the new array of filtered values.
6933
     * @see _.without, _.xor
6934
     * @example
6935
     *
6936
     * _.difference([2, 1], [2, 3]);
6937
     * // => [1]
6938
     */
6939
    var difference = baseRest(function(array, values) {
6940
      return isArrayLikeObject(array)
6941
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
6942
        : [];
6943
    });
6944
6945
    /**
6946
     * This method is like `_.difference` except that it accepts `iteratee` which
6947
     * is invoked for each element of `array` and `values` to generate the criterion
6948
     * by which they're compared. The order and references of result values are
6949
     * determined by the first array. The iteratee is invoked with one argument:
6950
     * (value).
6951
     *
6952
     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
6953
     *
6954
     * @static
6955
     * @memberOf _
6956
     * @since 4.0.0
6957
     * @category Array
6958
     * @param {Array} array The array to inspect.
6959
     * @param {...Array} [values] The values to exclude.
6960
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
6961
     * @returns {Array} Returns the new array of filtered values.
6962
     * @example
6963
     *
6964
     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
6965
     * // => [1.2]
6966
     *
6967
     * // The `_.property` iteratee shorthand.
6968
     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
6969
     * // => [{ 'x': 2 }]
6970
     */
6971
    var differenceBy = baseRest(function(array, values) {
6972
      var iteratee = last(values);
6973
      if (isArrayLikeObject(iteratee)) {
6974
        iteratee = undefined;
6975
      }
6976
      return isArrayLikeObject(array)
6977
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
6978
        : [];
6979
    });
6980
6981
    /**
6982
     * This method is like `_.difference` except that it accepts `comparator`
6983
     * which is invoked to compare elements of `array` to `values`. The order and
6984
     * references of result values are determined by the first array. The comparator
6985
     * is invoked with two arguments: (arrVal, othVal).
6986
     *
6987
     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
6988
     *
6989
     * @static
6990
     * @memberOf _
6991
     * @since 4.0.0
6992
     * @category Array
6993
     * @param {Array} array The array to inspect.
6994
     * @param {...Array} [values] The values to exclude.
6995
     * @param {Function} [comparator] The comparator invoked per element.
6996
     * @returns {Array} Returns the new array of filtered values.
6997
     * @example
6998
     *
6999
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7000
     *
7001
     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
7002
     * // => [{ 'x': 2, 'y': 1 }]
7003
     */
7004
    var differenceWith = baseRest(function(array, values) {
7005
      var comparator = last(values);
7006
      if (isArrayLikeObject(comparator)) {
7007
        comparator = undefined;
7008
      }
7009
      return isArrayLikeObject(array)
7010
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
7011
        : [];
7012
    });
7013
7014
    /**
7015
     * Creates a slice of `array` with `n` elements dropped from the beginning.
7016
     *
7017
     * @static
7018
     * @memberOf _
7019
     * @since 0.5.0
7020
     * @category Array
7021
     * @param {Array} array The array to query.
7022
     * @param {number} [n=1] The number of elements to drop.
7023
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7024
     * @returns {Array} Returns the slice of `array`.
7025
     * @example
7026
     *
7027
     * _.drop([1, 2, 3]);
7028
     * // => [2, 3]
7029
     *
7030
     * _.drop([1, 2, 3], 2);
7031
     * // => [3]
7032
     *
7033
     * _.drop([1, 2, 3], 5);
7034
     * // => []
7035
     *
7036
     * _.drop([1, 2, 3], 0);
7037
     * // => [1, 2, 3]
7038
     */
7039
    function drop(array, n, guard) {
7040
      var length = array == null ? 0 : array.length;
7041
      if (!length) {
7042
        return [];
7043
      }
7044
      n = (guard || n === undefined) ? 1 : toInteger(n);
7045
      return baseSlice(array, n < 0 ? 0 : n, length);
7046
    }
7047
7048
    /**
7049
     * Creates a slice of `array` with `n` elements dropped from the end.
7050
     *
7051
     * @static
7052
     * @memberOf _
7053
     * @since 3.0.0
7054
     * @category Array
7055
     * @param {Array} array The array to query.
7056
     * @param {number} [n=1] The number of elements to drop.
7057
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7058
     * @returns {Array} Returns the slice of `array`.
7059
     * @example
7060
     *
7061
     * _.dropRight([1, 2, 3]);
7062
     * // => [1, 2]
7063
     *
7064
     * _.dropRight([1, 2, 3], 2);
7065
     * // => [1]
7066
     *
7067
     * _.dropRight([1, 2, 3], 5);
7068
     * // => []
7069
     *
7070
     * _.dropRight([1, 2, 3], 0);
7071
     * // => [1, 2, 3]
7072
     */
7073
    function dropRight(array, n, guard) {
7074
      var length = array == null ? 0 : array.length;
7075
      if (!length) {
7076
        return [];
7077
      }
7078
      n = (guard || n === undefined) ? 1 : toInteger(n);
7079
      n = length - n;
7080
      return baseSlice(array, 0, n < 0 ? 0 : n);
7081
    }
7082
7083
    /**
7084
     * Creates a slice of `array` excluding elements dropped from the end.
7085
     * Elements are dropped until `predicate` returns falsey. The predicate is
7086
     * invoked with three arguments: (value, index, array).
7087
     *
7088
     * @static
7089
     * @memberOf _
7090
     * @since 3.0.0
7091
     * @category Array
7092
     * @param {Array} array The array to query.
7093
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7094
     * @returns {Array} Returns the slice of `array`.
7095
     * @example
7096
     *
7097
     * var users = [
7098
     *   { 'user': 'barney',  'active': true },
7099
     *   { 'user': 'fred',    'active': false },
7100
     *   { 'user': 'pebbles', 'active': false }
7101
     * ];
7102
     *
7103
     * _.dropRightWhile(users, function(o) { return !o.active; });
7104
     * // => objects for ['barney']
7105
     *
7106
     * // The `_.matches` iteratee shorthand.
7107
     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
7108
     * // => objects for ['barney', 'fred']
7109
     *
7110
     * // The `_.matchesProperty` iteratee shorthand.
7111
     * _.dropRightWhile(users, ['active', false]);
7112
     * // => objects for ['barney']
7113
     *
7114
     * // The `_.property` iteratee shorthand.
7115
     * _.dropRightWhile(users, 'active');
7116
     * // => objects for ['barney', 'fred', 'pebbles']
7117
     */
7118
    function dropRightWhile(array, predicate) {
7119
      return (array && array.length)
7120
        ? baseWhile(array, getIteratee(predicate, 3), true, true)
7121
        : [];
7122
    }
7123
7124
    /**
7125
     * Creates a slice of `array` excluding elements dropped from the beginning.
7126
     * Elements are dropped until `predicate` returns falsey. The predicate is
7127
     * invoked with three arguments: (value, index, array).
7128
     *
7129
     * @static
7130
     * @memberOf _
7131
     * @since 3.0.0
7132
     * @category Array
7133
     * @param {Array} array The array to query.
7134
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7135
     * @returns {Array} Returns the slice of `array`.
7136
     * @example
7137
     *
7138
     * var users = [
7139
     *   { 'user': 'barney',  'active': false },
7140
     *   { 'user': 'fred',    'active': false },
7141
     *   { 'user': 'pebbles', 'active': true }
7142
     * ];
7143
     *
7144
     * _.dropWhile(users, function(o) { return !o.active; });
7145
     * // => objects for ['pebbles']
7146
     *
7147
     * // The `_.matches` iteratee shorthand.
7148
     * _.dropWhile(users, { 'user': 'barney', 'active': false });
7149
     * // => objects for ['fred', 'pebbles']
7150
     *
7151
     * // The `_.matchesProperty` iteratee shorthand.
7152
     * _.dropWhile(users, ['active', false]);
7153
     * // => objects for ['pebbles']
7154
     *
7155
     * // The `_.property` iteratee shorthand.
7156
     * _.dropWhile(users, 'active');
7157
     * // => objects for ['barney', 'fred', 'pebbles']
7158
     */
7159
    function dropWhile(array, predicate) {
7160
      return (array && array.length)
7161
        ? baseWhile(array, getIteratee(predicate, 3), true)
7162
        : [];
7163
    }
7164
7165
    /**
7166
     * Fills elements of `array` with `value` from `start` up to, but not
7167
     * including, `end`.
7168
     *
7169
     * **Note:** This method mutates `array`.
7170
     *
7171
     * @static
7172
     * @memberOf _
7173
     * @since 3.2.0
7174
     * @category Array
7175
     * @param {Array} array The array to fill.
7176
     * @param {*} value The value to fill `array` with.
7177
     * @param {number} [start=0] The start position.
7178
     * @param {number} [end=array.length] The end position.
7179
     * @returns {Array} Returns `array`.
7180
     * @example
7181
     *
7182
     * var array = [1, 2, 3];
7183
     *
7184
     * _.fill(array, 'a');
7185
     * console.log(array);
7186
     * // => ['a', 'a', 'a']
7187
     *
7188
     * _.fill(Array(3), 2);
7189
     * // => [2, 2, 2]
7190
     *
7191
     * _.fill([4, 6, 8, 10], '*', 1, 3);
7192
     * // => [4, '*', '*', 10]
7193
     */
7194
    function fill(array, value, start, end) {
7195
      var length = array == null ? 0 : array.length;
7196
      if (!length) {
7197
        return [];
7198
      }
7199
      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
7200
        start = 0;
7201
        end = length;
7202
      }
7203
      return baseFill(array, value, start, end);
7204
    }
7205
7206
    /**
7207
     * This method is like `_.find` except that it returns the index of the first
7208
     * element `predicate` returns truthy for instead of the element itself.
7209
     *
7210
     * @static
7211
     * @memberOf _
7212
     * @since 1.1.0
7213
     * @category Array
7214
     * @param {Array} array The array to inspect.
7215
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7216
     * @param {number} [fromIndex=0] The index to search from.
7217
     * @returns {number} Returns the index of the found element, else `-1`.
7218
     * @example
7219
     *
7220
     * var users = [
7221
     *   { 'user': 'barney',  'active': false },
7222
     *   { 'user': 'fred',    'active': false },
7223
     *   { 'user': 'pebbles', 'active': true }
7224
     * ];
7225
     *
7226
     * _.findIndex(users, function(o) { return o.user == 'barney'; });
7227
     * // => 0
7228
     *
7229
     * // The `_.matches` iteratee shorthand.
7230
     * _.findIndex(users, { 'user': 'fred', 'active': false });
7231
     * // => 1
7232
     *
7233
     * // The `_.matchesProperty` iteratee shorthand.
7234
     * _.findIndex(users, ['active', false]);
7235
     * // => 0
7236
     *
7237
     * // The `_.property` iteratee shorthand.
7238
     * _.findIndex(users, 'active');
7239
     * // => 2
7240
     */
7241
    function findIndex(array, predicate, fromIndex) {
7242
      var length = array == null ? 0 : array.length;
7243
      if (!length) {
7244
        return -1;
7245
      }
7246
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
7247
      if (index < 0) {
7248
        index = nativeMax(length + index, 0);
7249
      }
7250
      return baseFindIndex(array, getIteratee(predicate, 3), index);
7251
    }
7252
7253
    /**
7254
     * This method is like `_.findIndex` except that it iterates over elements
7255
     * of `collection` from right to left.
7256
     *
7257
     * @static
7258
     * @memberOf _
7259
     * @since 2.0.0
7260
     * @category Array
7261
     * @param {Array} array The array to inspect.
7262
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7263
     * @param {number} [fromIndex=array.length-1] The index to search from.
7264
     * @returns {number} Returns the index of the found element, else `-1`.
7265
     * @example
7266
     *
7267
     * var users = [
7268
     *   { 'user': 'barney',  'active': true },
7269
     *   { 'user': 'fred',    'active': false },
7270
     *   { 'user': 'pebbles', 'active': false }
7271
     * ];
7272
     *
7273
     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
7274
     * // => 2
7275
     *
7276
     * // The `_.matches` iteratee shorthand.
7277
     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
7278
     * // => 0
7279
     *
7280
     * // The `_.matchesProperty` iteratee shorthand.
7281
     * _.findLastIndex(users, ['active', false]);
7282
     * // => 2
7283
     *
7284
     * // The `_.property` iteratee shorthand.
7285
     * _.findLastIndex(users, 'active');
7286
     * // => 0
7287
     */
7288
    function findLastIndex(array, predicate, fromIndex) {
7289
      var length = array == null ? 0 : array.length;
7290
      if (!length) {
7291
        return -1;
7292
      }
7293
      var index = length - 1;
7294
      if (fromIndex !== undefined) {
7295
        index = toInteger(fromIndex);
7296
        index = fromIndex < 0
7297
          ? nativeMax(length + index, 0)
7298
          : nativeMin(index, length - 1);
7299
      }
7300
      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
7301
    }
7302
7303
    /**
7304
     * Flattens `array` a single level deep.
7305
     *
7306
     * @static
7307
     * @memberOf _
7308
     * @since 0.1.0
7309
     * @category Array
7310
     * @param {Array} array The array to flatten.
7311
     * @returns {Array} Returns the new flattened array.
7312
     * @example
7313
     *
7314
     * _.flatten([1, [2, [3, [4]], 5]]);
7315
     * // => [1, 2, [3, [4]], 5]
7316
     */
7317
    function flatten(array) {
7318
      var length = array == null ? 0 : array.length;
7319
      return length ? baseFlatten(array, 1) : [];
7320
    }
7321
7322
    /**
7323
     * Recursively flattens `array`.
7324
     *
7325
     * @static
7326
     * @memberOf _
7327
     * @since 3.0.0
7328
     * @category Array
7329
     * @param {Array} array The array to flatten.
7330
     * @returns {Array} Returns the new flattened array.
7331
     * @example
7332
     *
7333
     * _.flattenDeep([1, [2, [3, [4]], 5]]);
7334
     * // => [1, 2, 3, 4, 5]
7335
     */
7336
    function flattenDeep(array) {
7337
      var length = array == null ? 0 : array.length;
7338
      return length ? baseFlatten(array, INFINITY) : [];
7339
    }
7340
7341
    /**
7342
     * Recursively flatten `array` up to `depth` times.
7343
     *
7344
     * @static
7345
     * @memberOf _
7346
     * @since 4.4.0
7347
     * @category Array
7348
     * @param {Array} array The array to flatten.
7349
     * @param {number} [depth=1] The maximum recursion depth.
7350
     * @returns {Array} Returns the new flattened array.
7351
     * @example
7352
     *
7353
     * var array = [1, [2, [3, [4]], 5]];
7354
     *
7355
     * _.flattenDepth(array, 1);
7356
     * // => [1, 2, [3, [4]], 5]
7357
     *
7358
     * _.flattenDepth(array, 2);
7359
     * // => [1, 2, 3, [4], 5]
7360
     */
7361
    function flattenDepth(array, depth) {
7362
      var length = array == null ? 0 : array.length;
7363
      if (!length) {
7364
        return [];
7365
      }
7366
      depth = depth === undefined ? 1 : toInteger(depth);
7367
      return baseFlatten(array, depth);
7368
    }
7369
7370
    /**
7371
     * The inverse of `_.toPairs`; this method returns an object composed
7372
     * from key-value `pairs`.
7373
     *
7374
     * @static
7375
     * @memberOf _
7376
     * @since 4.0.0
7377
     * @category Array
7378
     * @param {Array} pairs The key-value pairs.
7379
     * @returns {Object} Returns the new object.
7380
     * @example
7381
     *
7382
     * _.fromPairs([['a', 1], ['b', 2]]);
7383
     * // => { 'a': 1, 'b': 2 }
7384
     */
7385
    function fromPairs(pairs) {
7386
      var index = -1,
7387
          length = pairs == null ? 0 : pairs.length,
7388
          result = {};
7389
7390
      while (++index < length) {
7391
        var pair = pairs[index];
7392
        result[pair[0]] = pair[1];
7393
      }
7394
      return result;
7395
    }
7396
7397
    /**
7398
     * Gets the first element of `array`.
7399
     *
7400
     * @static
7401
     * @memberOf _
7402
     * @since 0.1.0
7403
     * @alias first
7404
     * @category Array
7405
     * @param {Array} array The array to query.
7406
     * @returns {*} Returns the first element of `array`.
7407
     * @example
7408
     *
7409
     * _.head([1, 2, 3]);
7410
     * // => 1
7411
     *
7412
     * _.head([]);
7413
     * // => undefined
7414
     */
7415
    function head(array) {
7416
      return (array && array.length) ? array[0] : undefined;
7417
    }
7418
7419
    /**
7420
     * Gets the index at which the first occurrence of `value` is found in `array`
7421
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7422
     * for equality comparisons. If `fromIndex` is negative, it's used as the
7423
     * offset from the end of `array`.
7424
     *
7425
     * @static
7426
     * @memberOf _
7427
     * @since 0.1.0
7428
     * @category Array
7429
     * @param {Array} array The array to inspect.
7430
     * @param {*} value The value to search for.
7431
     * @param {number} [fromIndex=0] The index to search from.
7432
     * @returns {number} Returns the index of the matched value, else `-1`.
7433
     * @example
7434
     *
7435
     * _.indexOf([1, 2, 1, 2], 2);
7436
     * // => 1
7437
     *
7438
     * // Search from the `fromIndex`.
7439
     * _.indexOf([1, 2, 1, 2], 2, 2);
7440
     * // => 3
7441
     */
7442
    function indexOf(array, value, fromIndex) {
7443
      var length = array == null ? 0 : array.length;
7444
      if (!length) {
7445
        return -1;
7446
      }
7447
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
7448
      if (index < 0) {
7449
        index = nativeMax(length + index, 0);
7450
      }
7451
      return baseIndexOf(array, value, index);
7452
    }
7453
7454
    /**
7455
     * Gets all but the last element of `array`.
7456
     *
7457
     * @static
7458
     * @memberOf _
7459
     * @since 0.1.0
7460
     * @category Array
7461
     * @param {Array} array The array to query.
7462
     * @returns {Array} Returns the slice of `array`.
7463
     * @example
7464
     *
7465
     * _.initial([1, 2, 3]);
7466
     * // => [1, 2]
7467
     */
7468
    function initial(array) {
7469
      var length = array == null ? 0 : array.length;
7470
      return length ? baseSlice(array, 0, -1) : [];
7471
    }
7472
7473
    /**
7474
     * Creates an array of unique values that are included in all given arrays
7475
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7476
     * for equality comparisons. The order and references of result values are
7477
     * determined by the first array.
7478
     *
7479
     * @static
7480
     * @memberOf _
7481
     * @since 0.1.0
7482
     * @category Array
7483
     * @param {...Array} [arrays] The arrays to inspect.
7484
     * @returns {Array} Returns the new array of intersecting values.
7485
     * @example
7486
     *
7487
     * _.intersection([2, 1], [2, 3]);
7488
     * // => [2]
7489
     */
7490
    var intersection = baseRest(function(arrays) {
7491
      var mapped = arrayMap(arrays, castArrayLikeObject);
7492
      return (mapped.length && mapped[0] === arrays[0])
7493
        ? baseIntersection(mapped)
7494
        : [];
7495
    });
7496
7497
    /**
7498
     * This method is like `_.intersection` except that it accepts `iteratee`
7499
     * which is invoked for each element of each `arrays` to generate the criterion
7500
     * by which they're compared. The order and references of result values are
7501
     * determined by the first array. The iteratee is invoked with one argument:
7502
     * (value).
7503
     *
7504
     * @static
7505
     * @memberOf _
7506
     * @since 4.0.0
7507
     * @category Array
7508
     * @param {...Array} [arrays] The arrays to inspect.
7509
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7510
     * @returns {Array} Returns the new array of intersecting values.
7511
     * @example
7512
     *
7513
     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
7514
     * // => [2.1]
7515
     *
7516
     * // The `_.property` iteratee shorthand.
7517
     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
7518
     * // => [{ 'x': 1 }]
7519
     */
7520
    var intersectionBy = baseRest(function(arrays) {
7521
      var iteratee = last(arrays),
7522
          mapped = arrayMap(arrays, castArrayLikeObject);
7523
7524
      if (iteratee === last(mapped)) {
7525
        iteratee = undefined;
7526
      } else {
7527
        mapped.pop();
7528
      }
7529
      return (mapped.length && mapped[0] === arrays[0])
7530
        ? baseIntersection(mapped, getIteratee(iteratee, 2))
7531
        : [];
7532
    });
7533
7534
    /**
7535
     * This method is like `_.intersection` except that it accepts `comparator`
7536
     * which is invoked to compare elements of `arrays`. The order and references
7537
     * of result values are determined by the first array. The comparator is
7538
     * invoked with two arguments: (arrVal, othVal).
7539
     *
7540
     * @static
7541
     * @memberOf _
7542
     * @since 4.0.0
7543
     * @category Array
7544
     * @param {...Array} [arrays] The arrays to inspect.
7545
     * @param {Function} [comparator] The comparator invoked per element.
7546
     * @returns {Array} Returns the new array of intersecting values.
7547
     * @example
7548
     *
7549
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7550
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
7551
     *
7552
     * _.intersectionWith(objects, others, _.isEqual);
7553
     * // => [{ 'x': 1, 'y': 2 }]
7554
     */
7555
    var intersectionWith = baseRest(function(arrays) {
7556
      var comparator = last(arrays),
7557
          mapped = arrayMap(arrays, castArrayLikeObject);
7558
7559
      comparator = typeof comparator == 'function' ? comparator : undefined;
7560
      if (comparator) {
7561
        mapped.pop();
7562
      }
7563
      return (mapped.length && mapped[0] === arrays[0])
7564
        ? baseIntersection(mapped, undefined, comparator)
7565
        : [];
7566
    });
7567
7568
    /**
7569
     * Converts all elements in `array` into a string separated by `separator`.
7570
     *
7571
     * @static
7572
     * @memberOf _
7573
     * @since 4.0.0
7574
     * @category Array
7575
     * @param {Array} array The array to convert.
7576
     * @param {string} [separator=','] The element separator.
7577
     * @returns {string} Returns the joined string.
7578
     * @example
7579
     *
7580
     * _.join(['a', 'b', 'c'], '~');
7581
     * // => 'a~b~c'
7582
     */
7583
    function join(array, separator) {
7584
      return array == null ? '' : nativeJoin.call(array, separator);
7585
    }
7586
7587
    /**
7588
     * Gets the last element of `array`.
7589
     *
7590
     * @static
7591
     * @memberOf _
7592
     * @since 0.1.0
7593
     * @category Array
7594
     * @param {Array} array The array to query.
7595
     * @returns {*} Returns the last element of `array`.
7596
     * @example
7597
     *
7598
     * _.last([1, 2, 3]);
7599
     * // => 3
7600
     */
7601
    function last(array) {
7602
      var length = array == null ? 0 : array.length;
7603
      return length ? array[length - 1] : undefined;
7604
    }
7605
7606
    /**
7607
     * This method is like `_.indexOf` except that it iterates over elements of
7608
     * `array` from right to left.
7609
     *
7610
     * @static
7611
     * @memberOf _
7612
     * @since 0.1.0
7613
     * @category Array
7614
     * @param {Array} array The array to inspect.
7615
     * @param {*} value The value to search for.
7616
     * @param {number} [fromIndex=array.length-1] The index to search from.
7617
     * @returns {number} Returns the index of the matched value, else `-1`.
7618
     * @example
7619
     *
7620
     * _.lastIndexOf([1, 2, 1, 2], 2);
7621
     * // => 3
7622
     *
7623
     * // Search from the `fromIndex`.
7624
     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
7625
     * // => 1
7626
     */
7627
    function lastIndexOf(array, value, fromIndex) {
7628
      var length = array == null ? 0 : array.length;
7629
      if (!length) {
7630
        return -1;
7631
      }
7632
      var index = length;
7633
      if (fromIndex !== undefined) {
7634
        index = toInteger(fromIndex);
7635
        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
7636
      }
7637
      return value === value
7638
        ? strictLastIndexOf(array, value, index)
7639
        : baseFindIndex(array, baseIsNaN, index, true);
7640
    }
7641
7642
    /**
7643
     * Gets the element at index `n` of `array`. If `n` is negative, the nth
7644
     * element from the end is returned.
7645
     *
7646
     * @static
7647
     * @memberOf _
7648
     * @since 4.11.0
7649
     * @category Array
7650
     * @param {Array} array The array to query.
7651
     * @param {number} [n=0] The index of the element to return.
7652
     * @returns {*} Returns the nth element of `array`.
7653
     * @example
7654
     *
7655
     * var array = ['a', 'b', 'c', 'd'];
7656
     *
7657
     * _.nth(array, 1);
7658
     * // => 'b'
7659
     *
7660
     * _.nth(array, -2);
7661
     * // => 'c';
7662
     */
7663
    function nth(array, n) {
7664
      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
7665
    }
7666
7667
    /**
7668
     * Removes all given values from `array` using
7669
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7670
     * for equality comparisons.
7671
     *
7672
     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
7673
     * to remove elements from an array by predicate.
7674
     *
7675
     * @static
7676
     * @memberOf _
7677
     * @since 2.0.0
7678
     * @category Array
7679
     * @param {Array} array The array to modify.
7680
     * @param {...*} [values] The values to remove.
7681
     * @returns {Array} Returns `array`.
7682
     * @example
7683
     *
7684
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7685
     *
7686
     * _.pull(array, 'a', 'c');
7687
     * console.log(array);
7688
     * // => ['b', 'b']
7689
     */
7690
    var pull = baseRest(pullAll);
7691
7692
    /**
7693
     * This method is like `_.pull` except that it accepts an array of values to remove.
7694
     *
7695
     * **Note:** Unlike `_.difference`, this method mutates `array`.
7696
     *
7697
     * @static
7698
     * @memberOf _
7699
     * @since 4.0.0
7700
     * @category Array
7701
     * @param {Array} array The array to modify.
7702
     * @param {Array} values The values to remove.
7703
     * @returns {Array} Returns `array`.
7704
     * @example
7705
     *
7706
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7707
     *
7708
     * _.pullAll(array, ['a', 'c']);
7709
     * console.log(array);
7710
     * // => ['b', 'b']
7711
     */
7712
    function pullAll(array, values) {
7713
      return (array && array.length && values && values.length)
7714
        ? basePullAll(array, values)
7715
        : array;
7716
    }
7717
7718
    /**
7719
     * This method is like `_.pullAll` except that it accepts `iteratee` which is
7720
     * invoked for each element of `array` and `values` to generate the criterion
7721
     * by which they're compared. The iteratee is invoked with one argument: (value).
7722
     *
7723
     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
7724
     *
7725
     * @static
7726
     * @memberOf _
7727
     * @since 4.0.0
7728
     * @category Array
7729
     * @param {Array} array The array to modify.
7730
     * @param {Array} values The values to remove.
7731
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7732
     * @returns {Array} Returns `array`.
7733
     * @example
7734
     *
7735
     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
7736
     *
7737
     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
7738
     * console.log(array);
7739
     * // => [{ 'x': 2 }]
7740
     */
7741
    function pullAllBy(array, values, iteratee) {
7742
      return (array && array.length && values && values.length)
7743
        ? basePullAll(array, values, getIteratee(iteratee, 2))
7744
        : array;
7745
    }
7746
7747
    /**
7748
     * This method is like `_.pullAll` except that it accepts `comparator` which
7749
     * is invoked to compare elements of `array` to `values`. The comparator is
7750
     * invoked with two arguments: (arrVal, othVal).
7751
     *
7752
     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
7753
     *
7754
     * @static
7755
     * @memberOf _
7756
     * @since 4.6.0
7757
     * @category Array
7758
     * @param {Array} array The array to modify.
7759
     * @param {Array} values The values to remove.
7760
     * @param {Function} [comparator] The comparator invoked per element.
7761
     * @returns {Array} Returns `array`.
7762
     * @example
7763
     *
7764
     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
7765
     *
7766
     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
7767
     * console.log(array);
7768
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
7769
     */
7770
    function pullAllWith(array, values, comparator) {
7771
      return (array && array.length && values && values.length)
7772
        ? basePullAll(array, values, undefined, comparator)
7773
        : array;
7774
    }
7775
7776
    /**
7777
     * Removes elements from `array` corresponding to `indexes` and returns an
7778
     * array of removed elements.
7779
     *
7780
     * **Note:** Unlike `_.at`, this method mutates `array`.
7781
     *
7782
     * @static
7783
     * @memberOf _
7784
     * @since 3.0.0
7785
     * @category Array
7786
     * @param {Array} array The array to modify.
7787
     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
7788
     * @returns {Array} Returns the new array of removed elements.
7789
     * @example
7790
     *
7791
     * var array = ['a', 'b', 'c', 'd'];
7792
     * var pulled = _.pullAt(array, [1, 3]);
7793
     *
7794
     * console.log(array);
7795
     * // => ['a', 'c']
7796
     *
7797
     * console.log(pulled);
7798
     * // => ['b', 'd']
7799
     */
7800
    var pullAt = flatRest(function(array, indexes) {
7801
      var length = array == null ? 0 : array.length,
7802
          result = baseAt(array, indexes);
7803
7804
      basePullAt(array, arrayMap(indexes, function(index) {
7805
        return isIndex(index, length) ? +index : index;
7806
      }).sort(compareAscending));
7807
7808
      return result;
7809
    });
7810
7811
    /**
7812
     * Removes all elements from `array` that `predicate` returns truthy for
7813
     * and returns an array of the removed elements. The predicate is invoked
7814
     * with three arguments: (value, index, array).
7815
     *
7816
     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
7817
     * to pull elements from an array by value.
7818
     *
7819
     * @static
7820
     * @memberOf _
7821
     * @since 2.0.0
7822
     * @category Array
7823
     * @param {Array} array The array to modify.
7824
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7825
     * @returns {Array} Returns the new array of removed elements.
7826
     * @example
7827
     *
7828
     * var array = [1, 2, 3, 4];
7829
     * var evens = _.remove(array, function(n) {
7830
     *   return n % 2 == 0;
7831
     * });
7832
     *
7833
     * console.log(array);
7834
     * // => [1, 3]
7835
     *
7836
     * console.log(evens);
7837
     * // => [2, 4]
7838
     */
7839
    function remove(array, predicate) {
7840
      var result = [];
7841
      if (!(array && array.length)) {
7842
        return result;
7843
      }
7844
      var index = -1,
7845
          indexes = [],
7846
          length = array.length;
7847
7848
      predicate = getIteratee(predicate, 3);
7849
      while (++index < length) {
7850
        var value = array[index];
7851
        if (predicate(value, index, array)) {
7852
          result.push(value);
7853
          indexes.push(index);
7854
        }
7855
      }
7856
      basePullAt(array, indexes);
7857
      return result;
7858
    }
7859
7860
    /**
7861
     * Reverses `array` so that the first element becomes the last, the second
7862
     * element becomes the second to last, and so on.
7863
     *
7864
     * **Note:** This method mutates `array` and is based on
7865
     * [`Array#reverse`](https://mdn.io/Array/reverse).
7866
     *
7867
     * @static
7868
     * @memberOf _
7869
     * @since 4.0.0
7870
     * @category Array
7871
     * @param {Array} array The array to modify.
7872
     * @returns {Array} Returns `array`.
7873
     * @example
7874
     *
7875
     * var array = [1, 2, 3];
7876
     *
7877
     * _.reverse(array);
7878
     * // => [3, 2, 1]
7879
     *
7880
     * console.log(array);
7881
     * // => [3, 2, 1]
7882
     */
7883
    function reverse(array) {
7884
      return array == null ? array : nativeReverse.call(array);
7885
    }
7886
7887
    /**
7888
     * Creates a slice of `array` from `start` up to, but not including, `end`.
7889
     *
7890
     * **Note:** This method is used instead of
7891
     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
7892
     * returned.
7893
     *
7894
     * @static
7895
     * @memberOf _
7896
     * @since 3.0.0
7897
     * @category Array
7898
     * @param {Array} array The array to slice.
7899
     * @param {number} [start=0] The start position.
7900
     * @param {number} [end=array.length] The end position.
7901
     * @returns {Array} Returns the slice of `array`.
7902
     */
7903
    function slice(array, start, end) {
7904
      var length = array == null ? 0 : array.length;
7905
      if (!length) {
7906
        return [];
7907
      }
7908
      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
7909
        start = 0;
7910
        end = length;
7911
      }
7912
      else {
7913
        start = start == null ? 0 : toInteger(start);
7914
        end = end === undefined ? length : toInteger(end);
7915
      }
7916
      return baseSlice(array, start, end);
7917
    }
7918
7919
    /**
7920
     * Uses a binary search to determine the lowest index at which `value`
7921
     * should be inserted into `array` in order to maintain its sort order.
7922
     *
7923
     * @static
7924
     * @memberOf _
7925
     * @since 0.1.0
7926
     * @category Array
7927
     * @param {Array} array The sorted array to inspect.
7928
     * @param {*} value The value to evaluate.
7929
     * @returns {number} Returns the index at which `value` should be inserted
7930
     *  into `array`.
7931
     * @example
7932
     *
7933
     * _.sortedIndex([30, 50], 40);
7934
     * // => 1
7935
     */
7936
    function sortedIndex(array, value) {
7937
      return baseSortedIndex(array, value);
7938
    }
7939
7940
    /**
7941
     * This method is like `_.sortedIndex` except that it accepts `iteratee`
7942
     * which is invoked for `value` and each element of `array` to compute their
7943
     * sort ranking. The iteratee is invoked with one argument: (value).
7944
     *
7945
     * @static
7946
     * @memberOf _
7947
     * @since 4.0.0
7948
     * @category Array
7949
     * @param {Array} array The sorted array to inspect.
7950
     * @param {*} value The value to evaluate.
7951
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7952
     * @returns {number} Returns the index at which `value` should be inserted
7953
     *  into `array`.
7954
     * @example
7955
     *
7956
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
7957
     *
7958
     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
7959
     * // => 0
7960
     *
7961
     * // The `_.property` iteratee shorthand.
7962
     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
7963
     * // => 0
7964
     */
7965
    function sortedIndexBy(array, value, iteratee) {
7966
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
7967
    }
7968
7969
    /**
7970
     * This method is like `_.indexOf` except that it performs a binary
7971
     * search on a sorted `array`.
7972
     *
7973
     * @static
7974
     * @memberOf _
7975
     * @since 4.0.0
7976
     * @category Array
7977
     * @param {Array} array The array to inspect.
7978
     * @param {*} value The value to search for.
7979
     * @returns {number} Returns the index of the matched value, else `-1`.
7980
     * @example
7981
     *
7982
     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
7983
     * // => 1
7984
     */
7985
    function sortedIndexOf(array, value) {
7986
      var length = array == null ? 0 : array.length;
7987
      if (length) {
7988
        var index = baseSortedIndex(array, value);
7989
        if (index < length && eq(array[index], value)) {
7990
          return index;
7991
        }
7992
      }
7993
      return -1;
7994
    }
7995
7996
    /**
7997
     * This method is like `_.sortedIndex` except that it returns the highest
7998
     * index at which `value` should be inserted into `array` in order to
7999
     * maintain its sort order.
8000
     *
8001
     * @static
8002
     * @memberOf _
8003
     * @since 3.0.0
8004
     * @category Array
8005
     * @param {Array} array The sorted array to inspect.
8006
     * @param {*} value The value to evaluate.
8007
     * @returns {number} Returns the index at which `value` should be inserted
8008
     *  into `array`.
8009
     * @example
8010
     *
8011
     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
8012
     * // => 4
8013
     */
8014
    function sortedLastIndex(array, value) {
8015
      return baseSortedIndex(array, value, true);
8016
    }
8017
8018
    /**
8019
     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
8020
     * which is invoked for `value` and each element of `array` to compute their
8021
     * sort ranking. The iteratee is invoked with one argument: (value).
8022
     *
8023
     * @static
8024
     * @memberOf _
8025
     * @since 4.0.0
8026
     * @category Array
8027
     * @param {Array} array The sorted array to inspect.
8028
     * @param {*} value The value to evaluate.
8029
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8030
     * @returns {number} Returns the index at which `value` should be inserted
8031
     *  into `array`.
8032
     * @example
8033
     *
8034
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
8035
     *
8036
     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
8037
     * // => 1
8038
     *
8039
     * // The `_.property` iteratee shorthand.
8040
     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
8041
     * // => 1
8042
     */
8043
    function sortedLastIndexBy(array, value, iteratee) {
8044
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
8045
    }
8046
8047
    /**
8048
     * This method is like `_.lastIndexOf` except that it performs a binary
8049
     * search on a sorted `array`.
8050
     *
8051
     * @static
8052
     * @memberOf _
8053
     * @since 4.0.0
8054
     * @category Array
8055
     * @param {Array} array The array to inspect.
8056
     * @param {*} value The value to search for.
8057
     * @returns {number} Returns the index of the matched value, else `-1`.
8058
     * @example
8059
     *
8060
     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
8061
     * // => 3
8062
     */
8063
    function sortedLastIndexOf(array, value) {
8064
      var length = array == null ? 0 : array.length;
8065
      if (length) {
8066
        var index = baseSortedIndex(array, value, true) - 1;
8067
        if (eq(array[index], value)) {
8068
          return index;
8069
        }
8070
      }
8071
      return -1;
8072
    }
8073
8074
    /**
8075
     * This method is like `_.uniq` except that it's designed and optimized
8076
     * for sorted arrays.
8077
     *
8078
     * @static
8079
     * @memberOf _
8080
     * @since 4.0.0
8081
     * @category Array
8082
     * @param {Array} array The array to inspect.
8083
     * @returns {Array} Returns the new duplicate free array.
8084
     * @example
8085
     *
8086
     * _.sortedUniq([1, 1, 2]);
8087
     * // => [1, 2]
8088
     */
8089
    function sortedUniq(array) {
8090
      return (array && array.length)
8091
        ? baseSortedUniq(array)
8092
        : [];
8093
    }
8094
8095
    /**
8096
     * This method is like `_.uniqBy` except that it's designed and optimized
8097
     * for sorted arrays.
8098
     *
8099
     * @static
8100
     * @memberOf _
8101
     * @since 4.0.0
8102
     * @category Array
8103
     * @param {Array} array The array to inspect.
8104
     * @param {Function} [iteratee] The iteratee invoked per element.
8105
     * @returns {Array} Returns the new duplicate free array.
8106
     * @example
8107
     *
8108
     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
8109
     * // => [1.1, 2.3]
8110
     */
8111
    function sortedUniqBy(array, iteratee) {
8112
      return (array && array.length)
8113
        ? baseSortedUniq(array, getIteratee(iteratee, 2))
8114
        : [];
8115
    }
8116
8117
    /**
8118
     * Gets all but the first element of `array`.
8119
     *
8120
     * @static
8121
     * @memberOf _
8122
     * @since 4.0.0
8123
     * @category Array
8124
     * @param {Array} array The array to query.
8125
     * @returns {Array} Returns the slice of `array`.
8126
     * @example
8127
     *
8128
     * _.tail([1, 2, 3]);
8129
     * // => [2, 3]
8130
     */
8131
    function tail(array) {
8132
      var length = array == null ? 0 : array.length;
8133
      return length ? baseSlice(array, 1, length) : [];
8134
    }
8135
8136
    /**
8137
     * Creates a slice of `array` with `n` elements taken from the beginning.
8138
     *
8139
     * @static
8140
     * @memberOf _
8141
     * @since 0.1.0
8142
     * @category Array
8143
     * @param {Array} array The array to query.
8144
     * @param {number} [n=1] The number of elements to take.
8145
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8146
     * @returns {Array} Returns the slice of `array`.
8147
     * @example
8148
     *
8149
     * _.take([1, 2, 3]);
8150
     * // => [1]
8151
     *
8152
     * _.take([1, 2, 3], 2);
8153
     * // => [1, 2]
8154
     *
8155
     * _.take([1, 2, 3], 5);
8156
     * // => [1, 2, 3]
8157
     *
8158
     * _.take([1, 2, 3], 0);
8159
     * // => []
8160
     */
8161
    function take(array, n, guard) {
8162
      if (!(array && array.length)) {
8163
        return [];
8164
      }
8165
      n = (guard || n === undefined) ? 1 : toInteger(n);
8166
      return baseSlice(array, 0, n < 0 ? 0 : n);
8167
    }
8168
8169
    /**
8170
     * Creates a slice of `array` with `n` elements taken from the end.
8171
     *
8172
     * @static
8173
     * @memberOf _
8174
     * @since 3.0.0
8175
     * @category Array
8176
     * @param {Array} array The array to query.
8177
     * @param {number} [n=1] The number of elements to take.
8178
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8179
     * @returns {Array} Returns the slice of `array`.
8180
     * @example
8181
     *
8182
     * _.takeRight([1, 2, 3]);
8183
     * // => [3]
8184
     *
8185
     * _.takeRight([1, 2, 3], 2);
8186
     * // => [2, 3]
8187
     *
8188
     * _.takeRight([1, 2, 3], 5);
8189
     * // => [1, 2, 3]
8190
     *
8191
     * _.takeRight([1, 2, 3], 0);
8192
     * // => []
8193
     */
8194
    function takeRight(array, n, guard) {
8195
      var length = array == null ? 0 : array.length;
8196
      if (!length) {
8197
        return [];
8198
      }
8199
      n = (guard || n === undefined) ? 1 : toInteger(n);
8200
      n = length - n;
8201
      return baseSlice(array, n < 0 ? 0 : n, length);
8202
    }
8203
8204
    /**
8205
     * Creates a slice of `array` with elements taken from the end. Elements are
8206
     * taken until `predicate` returns falsey. The predicate is invoked with
8207
     * three arguments: (value, index, array).
8208
     *
8209
     * @static
8210
     * @memberOf _
8211
     * @since 3.0.0
8212
     * @category Array
8213
     * @param {Array} array The array to query.
8214
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
8215
     * @returns {Array} Returns the slice of `array`.
8216
     * @example
8217
     *
8218
     * var users = [
8219
     *   { 'user': 'barney',  'active': true },
8220
     *   { 'user': 'fred',    'active': false },
8221
     *   { 'user': 'pebbles', 'active': false }
8222
     * ];
8223
     *
8224
     * _.takeRightWhile(users, function(o) { return !o.active; });
8225
     * // => objects for ['fred', 'pebbles']
8226
     *
8227
     * // The `_.matches` iteratee shorthand.
8228
     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
8229
     * // => objects for ['pebbles']
8230
     *
8231
     * // The `_.matchesProperty` iteratee shorthand.
8232
     * _.takeRightWhile(users, ['active', false]);
8233
     * // => objects for ['fred', 'pebbles']
8234
     *
8235
     * // The `_.property` iteratee shorthand.
8236
     * _.takeRightWhile(users, 'active');
8237
     * // => []
8238
     */
8239
    function takeRightWhile(array, predicate) {
8240
      return (array && array.length)
8241
        ? baseWhile(array, getIteratee(predicate, 3), false, true)
8242
        : [];
8243
    }
8244
8245
    /**
8246
     * Creates a slice of `array` with elements taken from the beginning. Elements
8247
     * are taken until `predicate` returns falsey. The predicate is invoked with
8248
     * three arguments: (value, index, array).
8249
     *
8250
     * @static
8251
     * @memberOf _
8252
     * @since 3.0.0
8253
     * @category Array
8254
     * @param {Array} array The array to query.
8255
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
8256
     * @returns {Array} Returns the slice of `array`.
8257
     * @example
8258
     *
8259
     * var users = [
8260
     *   { 'user': 'barney',  'active': false },
8261
     *   { 'user': 'fred',    'active': false },
8262
     *   { 'user': 'pebbles', 'active': true }
8263
     * ];
8264
     *
8265
     * _.takeWhile(users, function(o) { return !o.active; });
8266
     * // => objects for ['barney', 'fred']
8267
     *
8268
     * // The `_.matches` iteratee shorthand.
8269
     * _.takeWhile(users, { 'user': 'barney', 'active': false });
8270
     * // => objects for ['barney']
8271
     *
8272
     * // The `_.matchesProperty` iteratee shorthand.
8273
     * _.takeWhile(users, ['active', false]);
8274
     * // => objects for ['barney', 'fred']
8275
     *
8276
     * // The `_.property` iteratee shorthand.
8277
     * _.takeWhile(users, 'active');
8278
     * // => []
8279
     */
8280
    function takeWhile(array, predicate) {
8281
      return (array && array.length)
8282
        ? baseWhile(array, getIteratee(predicate, 3))
8283
        : [];
8284
    }
8285
8286
    /**
8287
     * Creates an array of unique values, in order, from all given arrays using
8288
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8289
     * for equality comparisons.
8290
     *
8291
     * @static
8292
     * @memberOf _
8293
     * @since 0.1.0
8294
     * @category Array
8295
     * @param {...Array} [arrays] The arrays to inspect.
8296
     * @returns {Array} Returns the new array of combined values.
8297
     * @example
8298
     *
8299
     * _.union([2], [1, 2]);
8300
     * // => [2, 1]
8301
     */
8302
    var union = baseRest(function(arrays) {
8303
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
8304
    });
8305
8306
    /**
8307
     * This method is like `_.union` except that it accepts `iteratee` which is
8308
     * invoked for each element of each `arrays` to generate the criterion by
8309
     * which uniqueness is computed. Result values are chosen from the first
8310
     * array in which the value occurs. The iteratee is invoked with one argument:
8311
     * (value).
8312
     *
8313
     * @static
8314
     * @memberOf _
8315
     * @since 4.0.0
8316
     * @category Array
8317
     * @param {...Array} [arrays] The arrays to inspect.
8318
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8319
     * @returns {Array} Returns the new array of combined values.
8320
     * @example
8321
     *
8322
     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
8323
     * // => [2.1, 1.2]
8324
     *
8325
     * // The `_.property` iteratee shorthand.
8326
     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8327
     * // => [{ 'x': 1 }, { 'x': 2 }]
8328
     */
8329
    var unionBy = baseRest(function(arrays) {
8330
      var iteratee = last(arrays);
8331
      if (isArrayLikeObject(iteratee)) {
8332
        iteratee = undefined;
8333
      }
8334
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
8335
    });
8336
8337
    /**
8338
     * This method is like `_.union` except that it accepts `comparator` which
8339
     * is invoked to compare elements of `arrays`. Result values are chosen from
8340
     * the first array in which the value occurs. The comparator is invoked
8341
     * with two arguments: (arrVal, othVal).
8342
     *
8343
     * @static
8344
     * @memberOf _
8345
     * @since 4.0.0
8346
     * @category Array
8347
     * @param {...Array} [arrays] The arrays to inspect.
8348
     * @param {Function} [comparator] The comparator invoked per element.
8349
     * @returns {Array} Returns the new array of combined values.
8350
     * @example
8351
     *
8352
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8353
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8354
     *
8355
     * _.unionWith(objects, others, _.isEqual);
8356
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8357
     */
8358
    var unionWith = baseRest(function(arrays) {
8359
      var comparator = last(arrays);
8360
      comparator = typeof comparator == 'function' ? comparator : undefined;
8361
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
8362
    });
8363
8364
    /**
8365
     * Creates a duplicate-free version of an array, using
8366
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8367
     * for equality comparisons, in which only the first occurrence of each element
8368
     * is kept. The order of result values is determined by the order they occur
8369
     * in the array.
8370
     *
8371
     * @static
8372
     * @memberOf _
8373
     * @since 0.1.0
8374
     * @category Array
8375
     * @param {Array} array The array to inspect.
8376
     * @returns {Array} Returns the new duplicate free array.
8377
     * @example
8378
     *
8379
     * _.uniq([2, 1, 2]);
8380
     * // => [2, 1]
8381
     */
8382
    function uniq(array) {
8383
      return (array && array.length) ? baseUniq(array) : [];
8384
    }
8385
8386
    /**
8387
     * This method is like `_.uniq` except that it accepts `iteratee` which is
8388
     * invoked for each element in `array` to generate the criterion by which
8389
     * uniqueness is computed. The order of result values is determined by the
8390
     * order they occur in the array. The iteratee is invoked with one argument:
8391
     * (value).
8392
     *
8393
     * @static
8394
     * @memberOf _
8395
     * @since 4.0.0
8396
     * @category Array
8397
     * @param {Array} array The array to inspect.
8398
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8399
     * @returns {Array} Returns the new duplicate free array.
8400
     * @example
8401
     *
8402
     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
8403
     * // => [2.1, 1.2]
8404
     *
8405
     * // The `_.property` iteratee shorthand.
8406
     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
8407
     * // => [{ 'x': 1 }, { 'x': 2 }]
8408
     */
8409
    function uniqBy(array, iteratee) {
8410
      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
8411
    }
8412
8413
    /**
8414
     * This method is like `_.uniq` except that it accepts `comparator` which
8415
     * is invoked to compare elements of `array`. The order of result values is
8416
     * determined by the order they occur in the array.The comparator is invoked
8417
     * with two arguments: (arrVal, othVal).
8418
     *
8419
     * @static
8420
     * @memberOf _
8421
     * @since 4.0.0
8422
     * @category Array
8423
     * @param {Array} array The array to inspect.
8424
     * @param {Function} [comparator] The comparator invoked per element.
8425
     * @returns {Array} Returns the new duplicate free array.
8426
     * @example
8427
     *
8428
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
8429
     *
8430
     * _.uniqWith(objects, _.isEqual);
8431
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
8432
     */
8433
    function uniqWith(array, comparator) {
8434
      comparator = typeof comparator == 'function' ? comparator : undefined;
8435
      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
8436
    }
8437
8438
    /**
8439
     * This method is like `_.zip` except that it accepts an array of grouped
8440
     * elements and creates an array regrouping the elements to their pre-zip
8441
     * configuration.
8442
     *
8443
     * @static
8444
     * @memberOf _
8445
     * @since 1.2.0
8446
     * @category Array
8447
     * @param {Array} array The array of grouped elements to process.
8448
     * @returns {Array} Returns the new array of regrouped elements.
8449
     * @example
8450
     *
8451
     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
8452
     * // => [['a', 1, true], ['b', 2, false]]
8453
     *
8454
     * _.unzip(zipped);
8455
     * // => [['a', 'b'], [1, 2], [true, false]]
8456
     */
8457
    function unzip(array) {
8458
      if (!(array && array.length)) {
8459
        return [];
8460
      }
8461
      var length = 0;
8462
      array = arrayFilter(array, function(group) {
8463
        if (isArrayLikeObject(group)) {
8464
          length = nativeMax(group.length, length);
8465
          return true;
8466
        }
8467
      });
8468
      return baseTimes(length, function(index) {
8469
        return arrayMap(array, baseProperty(index));
8470
      });
8471
    }
8472
8473
    /**
8474
     * This method is like `_.unzip` except that it accepts `iteratee` to specify
8475
     * how regrouped values should be combined. The iteratee is invoked with the
8476
     * elements of each group: (...group).
8477
     *
8478
     * @static
8479
     * @memberOf _
8480
     * @since 3.8.0
8481
     * @category Array
8482
     * @param {Array} array The array of grouped elements to process.
8483
     * @param {Function} [iteratee=_.identity] The function to combine
8484
     *  regrouped values.
8485
     * @returns {Array} Returns the new array of regrouped elements.
8486
     * @example
8487
     *
8488
     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
8489
     * // => [[1, 10, 100], [2, 20, 200]]
8490
     *
8491
     * _.unzipWith(zipped, _.add);
8492
     * // => [3, 30, 300]
8493
     */
8494
    function unzipWith(array, iteratee) {
8495
      if (!(array && array.length)) {
8496
        return [];
8497
      }
8498
      var result = unzip(array);
8499
      if (iteratee == null) {
8500
        return result;
8501
      }
8502
      return arrayMap(result, function(group) {
8503
        return apply(iteratee, undefined, group);
8504
      });
8505
    }
8506
8507
    /**
8508
     * Creates an array excluding all given values using
8509
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8510
     * for equality comparisons.
8511
     *
8512
     * **Note:** Unlike `_.pull`, this method returns a new array.
8513
     *
8514
     * @static
8515
     * @memberOf _
8516
     * @since 0.1.0
8517
     * @category Array
8518
     * @param {Array} array The array to inspect.
8519
     * @param {...*} [values] The values to exclude.
8520
     * @returns {Array} Returns the new array of filtered values.
8521
     * @see _.difference, _.xor
8522
     * @example
8523
     *
8524
     * _.without([2, 1, 2, 3], 1, 2);
8525
     * // => [3]
8526
     */
8527
    var without = baseRest(function(array, values) {
8528
      return isArrayLikeObject(array)
8529
        ? baseDifference(array, values)
8530
        : [];
8531
    });
8532
8533
    /**
8534
     * Creates an array of unique values that is the
8535
     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
8536
     * of the given arrays. The order of result values is determined by the order
8537
     * they occur in the arrays.
8538
     *
8539
     * @static
8540
     * @memberOf _
8541
     * @since 2.4.0
8542
     * @category Array
8543
     * @param {...Array} [arrays] The arrays to inspect.
8544
     * @returns {Array} Returns the new array of filtered values.
8545
     * @see _.difference, _.without
8546
     * @example
8547
     *
8548
     * _.xor([2, 1], [2, 3]);
8549
     * // => [1, 3]
8550
     */
8551
    var xor = baseRest(function(arrays) {
8552
      return baseXor(arrayFilter(arrays, isArrayLikeObject));
8553
    });
8554
8555
    /**
8556
     * This method is like `_.xor` except that it accepts `iteratee` which is
8557
     * invoked for each element of each `arrays` to generate the criterion by
8558
     * which by which they're compared. The order of result values is determined
8559
     * by the order they occur in the arrays. The iteratee is invoked with one
8560
     * argument: (value).
8561
     *
8562
     * @static
8563
     * @memberOf _
8564
     * @since 4.0.0
8565
     * @category Array
8566
     * @param {...Array} [arrays] The arrays to inspect.
8567
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8568
     * @returns {Array} Returns the new array of filtered values.
8569
     * @example
8570
     *
8571
     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
8572
     * // => [1.2, 3.4]
8573
     *
8574
     * // The `_.property` iteratee shorthand.
8575
     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8576
     * // => [{ 'x': 2 }]
8577
     */
8578
    var xorBy = baseRest(function(arrays) {
8579
      var iteratee = last(arrays);
8580
      if (isArrayLikeObject(iteratee)) {
8581
        iteratee = undefined;
8582
      }
8583
      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
8584
    });
8585
8586
    /**
8587
     * This method is like `_.xor` except that it accepts `comparator` which is
8588
     * invoked to compare elements of `arrays`. The order of result values is
8589
     * determined by the order they occur in the arrays. The comparator is invoked
8590
     * with two arguments: (arrVal, othVal).
8591
     *
8592
     * @static
8593
     * @memberOf _
8594
     * @since 4.0.0
8595
     * @category Array
8596
     * @param {...Array} [arrays] The arrays to inspect.
8597
     * @param {Function} [comparator] The comparator invoked per element.
8598
     * @returns {Array} Returns the new array of filtered values.
8599
     * @example
8600
     *
8601
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8602
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8603
     *
8604
     * _.xorWith(objects, others, _.isEqual);
8605
     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8606
     */
8607
    var xorWith = baseRest(function(arrays) {
8608
      var comparator = last(arrays);
8609
      comparator = typeof comparator == 'function' ? comparator : undefined;
8610
      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
8611
    });
8612
8613
    /**
8614
     * Creates an array of grouped elements, the first of which contains the
8615
     * first elements of the given arrays, the second of which contains the
8616
     * second elements of the given arrays, and so on.
8617
     *
8618
     * @static
8619
     * @memberOf _
8620
     * @since 0.1.0
8621
     * @category Array
8622
     * @param {...Array} [arrays] The arrays to process.
8623
     * @returns {Array} Returns the new array of grouped elements.
8624
     * @example
8625
     *
8626
     * _.zip(['a', 'b'], [1, 2], [true, false]);
8627
     * // => [['a', 1, true], ['b', 2, false]]
8628
     */
8629
    var zip = baseRest(unzip);
8630
8631
    /**
8632
     * This method is like `_.fromPairs` except that it accepts two arrays,
8633
     * one of property identifiers and one of corresponding values.
8634
     *
8635
     * @static
8636
     * @memberOf _
8637
     * @since 0.4.0
8638
     * @category Array
8639
     * @param {Array} [props=[]] The property identifiers.
8640
     * @param {Array} [values=[]] The property values.
8641
     * @returns {Object} Returns the new object.
8642
     * @example
8643
     *
8644
     * _.zipObject(['a', 'b'], [1, 2]);
8645
     * // => { 'a': 1, 'b': 2 }
8646
     */
8647
    function zipObject(props, values) {
8648
      return baseZipObject(props || [], values || [], assignValue);
8649
    }
8650
8651
    /**
8652
     * This method is like `_.zipObject` except that it supports property paths.
8653
     *
8654
     * @static
8655
     * @memberOf _
8656
     * @since 4.1.0
8657
     * @category Array
8658
     * @param {Array} [props=[]] The property identifiers.
8659
     * @param {Array} [values=[]] The property values.
8660
     * @returns {Object} Returns the new object.
8661
     * @example
8662
     *
8663
     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
8664
     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
8665
     */
8666
    function zipObjectDeep(props, values) {
8667
      return baseZipObject(props || [], values || [], baseSet);
8668
    }
8669
8670
    /**
8671
     * This method is like `_.zip` except that it accepts `iteratee` to specify
8672
     * how grouped values should be combined. The iteratee is invoked with the
8673
     * elements of each group: (...group).
8674
     *
8675
     * @static
8676
     * @memberOf _
8677
     * @since 3.8.0
8678
     * @category Array
8679
     * @param {...Array} [arrays] The arrays to process.
8680
     * @param {Function} [iteratee=_.identity] The function to combine
8681
     *  grouped values.
8682
     * @returns {Array} Returns the new array of grouped elements.
8683
     * @example
8684
     *
8685
     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
8686
     *   return a + b + c;
8687
     * });
8688
     * // => [111, 222]
8689
     */
8690
    var zipWith = baseRest(function(arrays) {
8691
      var length = arrays.length,
8692
          iteratee = length > 1 ? arrays[length - 1] : undefined;
8693
8694
      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
8695
      return unzipWith(arrays, iteratee);
8696
    });
8697
8698
    /*------------------------------------------------------------------------*/
8699
8700
    /**
8701
     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
8702
     * chain sequences enabled. The result of such sequences must be unwrapped
8703
     * with `_#value`.
8704
     *
8705
     * @static
8706
     * @memberOf _
8707
     * @since 1.3.0
8708
     * @category Seq
8709
     * @param {*} value The value to wrap.
8710
     * @returns {Object} Returns the new `lodash` wrapper instance.
8711
     * @example
8712
     *
8713
     * var users = [
8714
     *   { 'user': 'barney',  'age': 36 },
8715
     *   { 'user': 'fred',    'age': 40 },
8716
     *   { 'user': 'pebbles', 'age': 1 }
8717
     * ];
8718
     *
8719
     * var youngest = _
8720
     *   .chain(users)
8721
     *   .sortBy('age')
8722
     *   .map(function(o) {
8723
     *     return o.user + ' is ' + o.age;
8724
     *   })
8725
     *   .head()
8726
     *   .value();
8727
     * // => 'pebbles is 1'
8728
     */
8729
    function chain(value) {
8730
      var result = lodash(value);
8731
      result.__chain__ = true;
8732
      return result;
8733
    }
8734
8735
    /**
8736
     * This method invokes `interceptor` and returns `value`. The interceptor
8737
     * is invoked with one argument; (value). The purpose of this method is to
8738
     * "tap into" a method chain sequence in order to modify intermediate results.
8739
     *
8740
     * @static
8741
     * @memberOf _
8742
     * @since 0.1.0
8743
     * @category Seq
8744
     * @param {*} value The value to provide to `interceptor`.
8745
     * @param {Function} interceptor The function to invoke.
8746
     * @returns {*} Returns `value`.
8747
     * @example
8748
     *
8749
     * _([1, 2, 3])
8750
     *  .tap(function(array) {
8751
     *    // Mutate input array.
8752
     *    array.pop();
8753
     *  })
8754
     *  .reverse()
8755
     *  .value();
8756
     * // => [2, 1]
8757
     */
8758
    function tap(value, interceptor) {
8759
      interceptor(value);
8760
      return value;
8761
    }
8762
8763
    /**
8764
     * This method is like `_.tap` except that it returns the result of `interceptor`.
8765
     * The purpose of this method is to "pass thru" values replacing intermediate
8766
     * results in a method chain sequence.
8767
     *
8768
     * @static
8769
     * @memberOf _
8770
     * @since 3.0.0
8771
     * @category Seq
8772
     * @param {*} value The value to provide to `interceptor`.
8773
     * @param {Function} interceptor The function to invoke.
8774
     * @returns {*} Returns the result of `interceptor`.
8775
     * @example
8776
     *
8777
     * _('  abc  ')
8778
     *  .chain()
8779
     *  .trim()
8780
     *  .thru(function(value) {
8781
     *    return [value];
8782
     *  })
8783
     *  .value();
8784
     * // => ['abc']
8785
     */
8786
    function thru(value, interceptor) {
8787
      return interceptor(value);
8788
    }
8789
8790
    /**
8791
     * This method is the wrapper version of `_.at`.
8792
     *
8793
     * @name at
8794
     * @memberOf _
8795
     * @since 1.0.0
8796
     * @category Seq
8797
     * @param {...(string|string[])} [paths] The property paths to pick.
8798
     * @returns {Object} Returns the new `lodash` wrapper instance.
8799
     * @example
8800
     *
8801
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
8802
     *
8803
     * _(object).at(['a[0].b.c', 'a[1]']).value();
8804
     * // => [3, 4]
8805
     */
8806
    var wrapperAt = flatRest(function(paths) {
8807
      var length = paths.length,
8808
          start = length ? paths[0] : 0,
8809
          value = this.__wrapped__,
8810
          interceptor = function(object) { return baseAt(object, paths); };
8811
8812
      if (length > 1 || this.__actions__.length ||
8813
          !(value instanceof LazyWrapper) || !isIndex(start)) {
8814
        return this.thru(interceptor);
8815
      }
8816
      value = value.slice(start, +start + (length ? 1 : 0));
8817
      value.__actions__.push({
8818
        'func': thru,
8819
        'args': [interceptor],
8820
        'thisArg': undefined
8821
      });
8822
      return new LodashWrapper(value, this.__chain__).thru(function(array) {
8823
        if (length && !array.length) {
8824
          array.push(undefined);
8825
        }
8826
        return array;
8827
      });
8828
    });
8829
8830
    /**
8831
     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
8832
     *
8833
     * @name chain
8834
     * @memberOf _
8835
     * @since 0.1.0
8836
     * @category Seq
8837
     * @returns {Object} Returns the new `lodash` wrapper instance.
8838
     * @example
8839
     *
8840
     * var users = [
8841
     *   { 'user': 'barney', 'age': 36 },
8842
     *   { 'user': 'fred',   'age': 40 }
8843
     * ];
8844
     *
8845
     * // A sequence without explicit chaining.
8846
     * _(users).head();
8847
     * // => { 'user': 'barney', 'age': 36 }
8848
     *
8849
     * // A sequence with explicit chaining.
8850
     * _(users)
8851
     *   .chain()
8852
     *   .head()
8853
     *   .pick('user')
8854
     *   .value();
8855
     * // => { 'user': 'barney' }
8856
     */
8857
    function wrapperChain() {
8858
      return chain(this);
8859
    }
8860
8861
    /**
8862
     * Executes the chain sequence and returns the wrapped result.
8863
     *
8864
     * @name commit
8865
     * @memberOf _
8866
     * @since 3.2.0
8867
     * @category Seq
8868
     * @returns {Object} Returns the new `lodash` wrapper instance.
8869
     * @example
8870
     *
8871
     * var array = [1, 2];
8872
     * var wrapped = _(array).push(3);
8873
     *
8874
     * console.log(array);
8875
     * // => [1, 2]
8876
     *
8877
     * wrapped = wrapped.commit();
8878
     * console.log(array);
8879
     * // => [1, 2, 3]
8880
     *
8881
     * wrapped.last();
8882
     * // => 3
8883
     *
8884
     * console.log(array);
8885
     * // => [1, 2, 3]
8886
     */
8887
    function wrapperCommit() {
8888
      return new LodashWrapper(this.value(), this.__chain__);
8889
    }
8890
8891
    /**
8892
     * Gets the next value on a wrapped object following the
8893
     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
8894
     *
8895
     * @name next
8896
     * @memberOf _
8897
     * @since 4.0.0
8898
     * @category Seq
8899
     * @returns {Object} Returns the next iterator value.
8900
     * @example
8901
     *
8902
     * var wrapped = _([1, 2]);
8903
     *
8904
     * wrapped.next();
8905
     * // => { 'done': false, 'value': 1 }
8906
     *
8907
     * wrapped.next();
8908
     * // => { 'done': false, 'value': 2 }
8909
     *
8910
     * wrapped.next();
8911
     * // => { 'done': true, 'value': undefined }
8912
     */
8913
    function wrapperNext() {
8914
      if (this.__values__ === undefined) {
8915
        this.__values__ = toArray(this.value());
8916
      }
8917
      var done = this.__index__ >= this.__values__.length,
8918
          value = done ? undefined : this.__values__[this.__index__++];
8919
8920
      return { 'done': done, 'value': value };
8921
    }
8922
8923
    /**
8924
     * Enables the wrapper to be iterable.
8925
     *
8926
     * @name Symbol.iterator
8927
     * @memberOf _
8928
     * @since 4.0.0
8929
     * @category Seq
8930
     * @returns {Object} Returns the wrapper object.
8931
     * @example
8932
     *
8933
     * var wrapped = _([1, 2]);
8934
     *
8935
     * wrapped[Symbol.iterator]() === wrapped;
8936
     * // => true
8937
     *
8938
     * Array.from(wrapped);
8939
     * // => [1, 2]
8940
     */
8941
    function wrapperToIterator() {
8942
      return this;
8943
    }
8944
8945
    /**
8946
     * Creates a clone of the chain sequence planting `value` as the wrapped value.
8947
     *
8948
     * @name plant
8949
     * @memberOf _
8950
     * @since 3.2.0
8951
     * @category Seq
8952
     * @param {*} value The value to plant.
8953
     * @returns {Object} Returns the new `lodash` wrapper instance.
8954
     * @example
8955
     *
8956
     * function square(n) {
8957
     *   return n * n;
8958
     * }
8959
     *
8960
     * var wrapped = _([1, 2]).map(square);
8961
     * var other = wrapped.plant([3, 4]);
8962
     *
8963
     * other.value();
8964
     * // => [9, 16]
8965
     *
8966
     * wrapped.value();
8967
     * // => [1, 4]
8968
     */
8969
    function wrapperPlant(value) {
8970
      var result,
8971
          parent = this;
8972
8973
      while (parent instanceof baseLodash) {
8974
        var clone = wrapperClone(parent);
8975
        clone.__index__ = 0;
8976
        clone.__values__ = undefined;
8977
        if (result) {
8978
          previous.__wrapped__ = clone;
8979
        } else {
8980
          result = clone;
8981
        }
8982
        var previous = clone;
8983
        parent = parent.__wrapped__;
8984
      }
8985
      previous.__wrapped__ = value;
8986
      return result;
8987
    }
8988
8989
    /**
8990
     * This method is the wrapper version of `_.reverse`.
8991
     *
8992
     * **Note:** This method mutates the wrapped array.
8993
     *
8994
     * @name reverse
8995
     * @memberOf _
8996
     * @since 0.1.0
8997
     * @category Seq
8998
     * @returns {Object} Returns the new `lodash` wrapper instance.
8999
     * @example
9000
     *
9001
     * var array = [1, 2, 3];
9002
     *
9003
     * _(array).reverse().value()
9004
     * // => [3, 2, 1]
9005
     *
9006
     * console.log(array);
9007
     * // => [3, 2, 1]
9008
     */
9009
    function wrapperReverse() {
9010
      var value = this.__wrapped__;
9011
      if (value instanceof LazyWrapper) {
9012
        var wrapped = value;
9013
        if (this.__actions__.length) {
9014
          wrapped = new LazyWrapper(this);
9015
        }
9016
        wrapped = wrapped.reverse();
9017
        wrapped.__actions__.push({
9018
          'func': thru,
9019
          'args': [reverse],
9020
          'thisArg': undefined
9021
        });
9022
        return new LodashWrapper(wrapped, this.__chain__);
9023
      }
9024
      return this.thru(reverse);
9025
    }
9026
9027
    /**
9028
     * Executes the chain sequence to resolve the unwrapped value.
9029
     *
9030
     * @name value
9031
     * @memberOf _
9032
     * @since 0.1.0
9033
     * @alias toJSON, valueOf
9034
     * @category Seq
9035
     * @returns {*} Returns the resolved unwrapped value.
9036
     * @example
9037
     *
9038
     * _([1, 2, 3]).value();
9039
     * // => [1, 2, 3]
9040
     */
9041
    function wrapperValue() {
9042
      return baseWrapperValue(this.__wrapped__, this.__actions__);
9043
    }
9044
9045
    /*------------------------------------------------------------------------*/
9046
9047
    /**
9048
     * Creates an object composed of keys generated from the results of running
9049
     * each element of `collection` thru `iteratee`. The corresponding value of
9050
     * each key is the number of times the key was returned by `iteratee`. The
9051
     * iteratee is invoked with one argument: (value).
9052
     *
9053
     * @static
9054
     * @memberOf _
9055
     * @since 0.5.0
9056
     * @category Collection
9057
     * @param {Array|Object} collection The collection to iterate over.
9058
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9059
     * @returns {Object} Returns the composed aggregate object.
9060
     * @example
9061
     *
9062
     * _.countBy([6.1, 4.2, 6.3], Math.floor);
9063
     * // => { '4': 1, '6': 2 }
9064
     *
9065
     * // The `_.property` iteratee shorthand.
9066
     * _.countBy(['one', 'two', 'three'], 'length');
9067
     * // => { '3': 2, '5': 1 }
9068
     */
9069
    var countBy = createAggregator(function(result, value, key) {
9070
      if (hasOwnProperty.call(result, key)) {
9071
        ++result[key];
9072
      } else {
9073
        baseAssignValue(result, key, 1);
9074
      }
9075
    });
9076
9077
    /**
9078
     * Checks if `predicate` returns truthy for **all** elements of `collection`.
9079
     * Iteration is stopped once `predicate` returns falsey. The predicate is
9080
     * invoked with three arguments: (value, index|key, collection).
9081
     *
9082
     * **Note:** This method returns `true` for
9083
     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
9084
     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
9085
     * elements of empty collections.
9086
     *
9087
     * @static
9088
     * @memberOf _
9089
     * @since 0.1.0
9090
     * @category Collection
9091
     * @param {Array|Object} collection The collection to iterate over.
9092
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9093
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9094
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
9095
     *  else `false`.
9096
     * @example
9097
     *
9098
     * _.every([true, 1, null, 'yes'], Boolean);
9099
     * // => false
9100
     *
9101
     * var users = [
9102
     *   { 'user': 'barney', 'age': 36, 'active': false },
9103
     *   { 'user': 'fred',   'age': 40, 'active': false }
9104
     * ];
9105
     *
9106
     * // The `_.matches` iteratee shorthand.
9107
     * _.every(users, { 'user': 'barney', 'active': false });
9108
     * // => false
9109
     *
9110
     * // The `_.matchesProperty` iteratee shorthand.
9111
     * _.every(users, ['active', false]);
9112
     * // => true
9113
     *
9114
     * // The `_.property` iteratee shorthand.
9115
     * _.every(users, 'active');
9116
     * // => false
9117
     */
9118
    function every(collection, predicate, guard) {
9119
      var func = isArray(collection) ? arrayEvery : baseEvery;
9120
      if (guard && isIterateeCall(collection, predicate, guard)) {
9121
        predicate = undefined;
9122
      }
9123
      return func(collection, getIteratee(predicate, 3));
9124
    }
9125
9126
    /**
9127
     * Iterates over elements of `collection`, returning an array of all elements
9128
     * `predicate` returns truthy for. The predicate is invoked with three
9129
     * arguments: (value, index|key, collection).
9130
     *
9131
     * **Note:** Unlike `_.remove`, this method returns a new array.
9132
     *
9133
     * @static
9134
     * @memberOf _
9135
     * @since 0.1.0
9136
     * @category Collection
9137
     * @param {Array|Object} collection The collection to iterate over.
9138
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9139
     * @returns {Array} Returns the new filtered array.
9140
     * @see _.reject
9141
     * @example
9142
     *
9143
     * var users = [
9144
     *   { 'user': 'barney', 'age': 36, 'active': true },
9145
     *   { 'user': 'fred',   'age': 40, 'active': false }
9146
     * ];
9147
     *
9148
     * _.filter(users, function(o) { return !o.active; });
9149
     * // => objects for ['fred']
9150
     *
9151
     * // The `_.matches` iteratee shorthand.
9152
     * _.filter(users, { 'age': 36, 'active': true });
9153
     * // => objects for ['barney']
9154
     *
9155
     * // The `_.matchesProperty` iteratee shorthand.
9156
     * _.filter(users, ['active', false]);
9157
     * // => objects for ['fred']
9158
     *
9159
     * // The `_.property` iteratee shorthand.
9160
     * _.filter(users, 'active');
9161
     * // => objects for ['barney']
9162
     */
9163
    function filter(collection, predicate) {
9164
      var func = isArray(collection) ? arrayFilter : baseFilter;
9165
      return func(collection, getIteratee(predicate, 3));
9166
    }
9167
9168
    /**
9169
     * Iterates over elements of `collection`, returning the first element
9170
     * `predicate` returns truthy for. The predicate is invoked with three
9171
     * arguments: (value, index|key, collection).
9172
     *
9173
     * @static
9174
     * @memberOf _
9175
     * @since 0.1.0
9176
     * @category Collection
9177
     * @param {Array|Object} collection The collection to inspect.
9178
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9179
     * @param {number} [fromIndex=0] The index to search from.
9180
     * @returns {*} Returns the matched element, else `undefined`.
9181
     * @example
9182
     *
9183
     * var users = [
9184
     *   { 'user': 'barney',  'age': 36, 'active': true },
9185
     *   { 'user': 'fred',    'age': 40, 'active': false },
9186
     *   { 'user': 'pebbles', 'age': 1,  'active': true }
9187
     * ];
9188
     *
9189
     * _.find(users, function(o) { return o.age < 40; });
9190
     * // => object for 'barney'
9191
     *
9192
     * // The `_.matches` iteratee shorthand.
9193
     * _.find(users, { 'age': 1, 'active': true });
9194
     * // => object for 'pebbles'
9195
     *
9196
     * // The `_.matchesProperty` iteratee shorthand.
9197
     * _.find(users, ['active', false]);
9198
     * // => object for 'fred'
9199
     *
9200
     * // The `_.property` iteratee shorthand.
9201
     * _.find(users, 'active');
9202
     * // => object for 'barney'
9203
     */
9204
    var find = createFind(findIndex);
9205
9206
    /**
9207
     * This method is like `_.find` except that it iterates over elements of
9208
     * `collection` from right to left.
9209
     *
9210
     * @static
9211
     * @memberOf _
9212
     * @since 2.0.0
9213
     * @category Collection
9214
     * @param {Array|Object} collection The collection to inspect.
9215
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9216
     * @param {number} [fromIndex=collection.length-1] The index to search from.
9217
     * @returns {*} Returns the matched element, else `undefined`.
9218
     * @example
9219
     *
9220
     * _.findLast([1, 2, 3, 4], function(n) {
9221
     *   return n % 2 == 1;
9222
     * });
9223
     * // => 3
9224
     */
9225
    var findLast = createFind(findLastIndex);
9226
9227
    /**
9228
     * Creates a flattened array of values by running each element in `collection`
9229
     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
9230
     * with three arguments: (value, index|key, collection).
9231
     *
9232
     * @static
9233
     * @memberOf _
9234
     * @since 4.0.0
9235
     * @category Collection
9236
     * @param {Array|Object} collection The collection to iterate over.
9237
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9238
     * @returns {Array} Returns the new flattened array.
9239
     * @example
9240
     *
9241
     * function duplicate(n) {
9242
     *   return [n, n];
9243
     * }
9244
     *
9245
     * _.flatMap([1, 2], duplicate);
9246
     * // => [1, 1, 2, 2]
9247
     */
9248
    function flatMap(collection, iteratee) {
9249
      return baseFlatten(map(collection, iteratee), 1);
9250
    }
9251
9252
    /**
9253
     * This method is like `_.flatMap` except that it recursively flattens the
9254
     * mapped results.
9255
     *
9256
     * @static
9257
     * @memberOf _
9258
     * @since 4.7.0
9259
     * @category Collection
9260
     * @param {Array|Object} collection The collection to iterate over.
9261
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9262
     * @returns {Array} Returns the new flattened array.
9263
     * @example
9264
     *
9265
     * function duplicate(n) {
9266
     *   return [[[n, n]]];
9267
     * }
9268
     *
9269
     * _.flatMapDeep([1, 2], duplicate);
9270
     * // => [1, 1, 2, 2]
9271
     */
9272
    function flatMapDeep(collection, iteratee) {
9273
      return baseFlatten(map(collection, iteratee), INFINITY);
9274
    }
9275
9276
    /**
9277
     * This method is like `_.flatMap` except that it recursively flattens the
9278
     * mapped results up to `depth` times.
9279
     *
9280
     * @static
9281
     * @memberOf _
9282
     * @since 4.7.0
9283
     * @category Collection
9284
     * @param {Array|Object} collection The collection to iterate over.
9285
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9286
     * @param {number} [depth=1] The maximum recursion depth.
9287
     * @returns {Array} Returns the new flattened array.
9288
     * @example
9289
     *
9290
     * function duplicate(n) {
9291
     *   return [[[n, n]]];
9292
     * }
9293
     *
9294
     * _.flatMapDepth([1, 2], duplicate, 2);
9295
     * // => [[1, 1], [2, 2]]
9296
     */
9297
    function flatMapDepth(collection, iteratee, depth) {
9298
      depth = depth === undefined ? 1 : toInteger(depth);
9299
      return baseFlatten(map(collection, iteratee), depth);
9300
    }
9301
9302
    /**
9303
     * Iterates over elements of `collection` and invokes `iteratee` for each element.
9304
     * The iteratee is invoked with three arguments: (value, index|key, collection).
9305
     * Iteratee functions may exit iteration early by explicitly returning `false`.
9306
     *
9307
     * **Note:** As with other "Collections" methods, objects with a "length"
9308
     * property are iterated like arrays. To avoid this behavior use `_.forIn`
9309
     * or `_.forOwn` for object iteration.
9310
     *
9311
     * @static
9312
     * @memberOf _
9313
     * @since 0.1.0
9314
     * @alias each
9315
     * @category Collection
9316
     * @param {Array|Object} collection The collection to iterate over.
9317
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9318
     * @returns {Array|Object} Returns `collection`.
9319
     * @see _.forEachRight
9320
     * @example
9321
     *
9322
     * _.forEach([1, 2], function(value) {
9323
     *   console.log(value);
9324
     * });
9325
     * // => Logs `1` then `2`.
9326
     *
9327
     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
9328
     *   console.log(key);
9329
     * });
9330
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
9331
     */
9332
    function forEach(collection, iteratee) {
9333
      var func = isArray(collection) ? arrayEach : baseEach;
9334
      return func(collection, getIteratee(iteratee, 3));
9335
    }
9336
9337
    /**
9338
     * This method is like `_.forEach` except that it iterates over elements of
9339
     * `collection` from right to left.
9340
     *
9341
     * @static
9342
     * @memberOf _
9343
     * @since 2.0.0
9344
     * @alias eachRight
9345
     * @category Collection
9346
     * @param {Array|Object} collection The collection to iterate over.
9347
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9348
     * @returns {Array|Object} Returns `collection`.
9349
     * @see _.forEach
9350
     * @example
9351
     *
9352
     * _.forEachRight([1, 2], function(value) {
9353
     *   console.log(value);
9354
     * });
9355
     * // => Logs `2` then `1`.
9356
     */
9357
    function forEachRight(collection, iteratee) {
9358
      var func = isArray(collection) ? arrayEachRight : baseEachRight;
9359
      return func(collection, getIteratee(iteratee, 3));
9360
    }
9361
9362
    /**
9363
     * Creates an object composed of keys generated from the results of running
9364
     * each element of `collection` thru `iteratee`. The order of grouped values
9365
     * is determined by the order they occur in `collection`. The corresponding
9366
     * value of each key is an array of elements responsible for generating the
9367
     * key. The iteratee is invoked with one argument: (value).
9368
     *
9369
     * @static
9370
     * @memberOf _
9371
     * @since 0.1.0
9372
     * @category Collection
9373
     * @param {Array|Object} collection The collection to iterate over.
9374
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9375
     * @returns {Object} Returns the composed aggregate object.
9376
     * @example
9377
     *
9378
     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
9379
     * // => { '4': [4.2], '6': [6.1, 6.3] }
9380
     *
9381
     * // The `_.property` iteratee shorthand.
9382
     * _.groupBy(['one', 'two', 'three'], 'length');
9383
     * // => { '3': ['one', 'two'], '5': ['three'] }
9384
     */
9385
    var groupBy = createAggregator(function(result, value, key) {
9386
      if (hasOwnProperty.call(result, key)) {
9387
        result[key].push(value);
9388
      } else {
9389
        baseAssignValue(result, key, [value]);
9390
      }
9391
    });
9392
9393
    /**
9394
     * Checks if `value` is in `collection`. If `collection` is a string, it's
9395
     * checked for a substring of `value`, otherwise
9396
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9397
     * is used for equality comparisons. If `fromIndex` is negative, it's used as
9398
     * the offset from the end of `collection`.
9399
     *
9400
     * @static
9401
     * @memberOf _
9402
     * @since 0.1.0
9403
     * @category Collection
9404
     * @param {Array|Object|string} collection The collection to inspect.
9405
     * @param {*} value The value to search for.
9406
     * @param {number} [fromIndex=0] The index to search from.
9407
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9408
     * @returns {boolean} Returns `true` if `value` is found, else `false`.
9409
     * @example
9410
     *
9411
     * _.includes([1, 2, 3], 1);
9412
     * // => true
9413
     *
9414
     * _.includes([1, 2, 3], 1, 2);
9415
     * // => false
9416
     *
9417
     * _.includes({ 'a': 1, 'b': 2 }, 1);
9418
     * // => true
9419
     *
9420
     * _.includes('abcd', 'bc');
9421
     * // => true
9422
     */
9423
    function includes(collection, value, fromIndex, guard) {
9424
      collection = isArrayLike(collection) ? collection : values(collection);
9425
      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
9426
9427
      var length = collection.length;
9428
      if (fromIndex < 0) {
9429
        fromIndex = nativeMax(length + fromIndex, 0);
9430
      }
9431
      return isString(collection)
9432
        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
9433
        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
9434
    }
9435
9436
    /**
9437
     * Invokes the method at `path` of each element in `collection`, returning
9438
     * an array of the results of each invoked method. Any additional arguments
9439
     * are provided to each invoked method. If `path` is a function, it's invoked
9440
     * for, and `this` bound to, each element in `collection`.
9441
     *
9442
     * @static
9443
     * @memberOf _
9444
     * @since 4.0.0
9445
     * @category Collection
9446
     * @param {Array|Object} collection The collection to iterate over.
9447
     * @param {Array|Function|string} path The path of the method to invoke or
9448
     *  the function invoked per iteration.
9449
     * @param {...*} [args] The arguments to invoke each method with.
9450
     * @returns {Array} Returns the array of results.
9451
     * @example
9452
     *
9453
     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
9454
     * // => [[1, 5, 7], [1, 2, 3]]
9455
     *
9456
     * _.invokeMap([123, 456], String.prototype.split, '');
9457
     * // => [['1', '2', '3'], ['4', '5', '6']]
9458
     */
9459
    var invokeMap = baseRest(function(collection, path, args) {
9460
      var index = -1,
9461
          isFunc = typeof path == 'function',
9462
          result = isArrayLike(collection) ? Array(collection.length) : [];
9463
9464
      baseEach(collection, function(value) {
9465
        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
9466
      });
9467
      return result;
9468
    });
9469
9470
    /**
9471
     * Creates an object composed of keys generated from the results of running
9472
     * each element of `collection` thru `iteratee`. The corresponding value of
9473
     * each key is the last element responsible for generating the key. The
9474
     * iteratee is invoked with one argument: (value).
9475
     *
9476
     * @static
9477
     * @memberOf _
9478
     * @since 4.0.0
9479
     * @category Collection
9480
     * @param {Array|Object} collection The collection to iterate over.
9481
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9482
     * @returns {Object} Returns the composed aggregate object.
9483
     * @example
9484
     *
9485
     * var array = [
9486
     *   { 'dir': 'left', 'code': 97 },
9487
     *   { 'dir': 'right', 'code': 100 }
9488
     * ];
9489
     *
9490
     * _.keyBy(array, function(o) {
9491
     *   return String.fromCharCode(o.code);
9492
     * });
9493
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
9494
     *
9495
     * _.keyBy(array, 'dir');
9496
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
9497
     */
9498
    var keyBy = createAggregator(function(result, value, key) {
9499
      baseAssignValue(result, key, value);
9500
    });
9501
9502
    /**
9503
     * Creates an array of values by running each element in `collection` thru
9504
     * `iteratee`. The iteratee is invoked with three arguments:
9505
     * (value, index|key, collection).
9506
     *
9507
     * Many lodash methods are guarded to work as iteratees for methods like
9508
     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
9509
     *
9510
     * The guarded methods are:
9511
     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
9512
     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
9513
     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
9514
     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
9515
     *
9516
     * @static
9517
     * @memberOf _
9518
     * @since 0.1.0
9519
     * @category Collection
9520
     * @param {Array|Object} collection The collection to iterate over.
9521
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9522
     * @returns {Array} Returns the new mapped array.
9523
     * @example
9524
     *
9525
     * function square(n) {
9526
     *   return n * n;
9527
     * }
9528
     *
9529
     * _.map([4, 8], square);
9530
     * // => [16, 64]
9531
     *
9532
     * _.map({ 'a': 4, 'b': 8 }, square);
9533
     * // => [16, 64] (iteration order is not guaranteed)
9534
     *
9535
     * var users = [
9536
     *   { 'user': 'barney' },
9537
     *   { 'user': 'fred' }
9538
     * ];
9539
     *
9540
     * // The `_.property` iteratee shorthand.
9541
     * _.map(users, 'user');
9542
     * // => ['barney', 'fred']
9543
     */
9544
    function map(collection, iteratee) {
9545
      var func = isArray(collection) ? arrayMap : baseMap;
9546
      return func(collection, getIteratee(iteratee, 3));
9547
    }
9548
9549
    /**
9550
     * This method is like `_.sortBy` except that it allows specifying the sort
9551
     * orders of the iteratees to sort by. If `orders` is unspecified, all values
9552
     * are sorted in ascending order. Otherwise, specify an order of "desc" for
9553
     * descending or "asc" for ascending sort order of corresponding values.
9554
     *
9555
     * @static
9556
     * @memberOf _
9557
     * @since 4.0.0
9558
     * @category Collection
9559
     * @param {Array|Object} collection The collection to iterate over.
9560
     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
9561
     *  The iteratees to sort by.
9562
     * @param {string[]} [orders] The sort orders of `iteratees`.
9563
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9564
     * @returns {Array} Returns the new sorted array.
9565
     * @example
9566
     *
9567
     * var users = [
9568
     *   { 'user': 'fred',   'age': 48 },
9569
     *   { 'user': 'barney', 'age': 34 },
9570
     *   { 'user': 'fred',   'age': 40 },
9571
     *   { 'user': 'barney', 'age': 36 }
9572
     * ];
9573
     *
9574
     * // Sort by `user` in ascending order and by `age` in descending order.
9575
     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
9576
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
9577
     */
9578
    function orderBy(collection, iteratees, orders, guard) {
9579
      if (collection == null) {
9580
        return [];
9581
      }
9582
      if (!isArray(iteratees)) {
9583
        iteratees = iteratees == null ? [] : [iteratees];
9584
      }
9585
      orders = guard ? undefined : orders;
9586
      if (!isArray(orders)) {
9587
        orders = orders == null ? [] : [orders];
9588
      }
9589
      return baseOrderBy(collection, iteratees, orders);
9590
    }
9591
9592
    /**
9593
     * Creates an array of elements split into two groups, the first of which
9594
     * contains elements `predicate` returns truthy for, the second of which
9595
     * contains elements `predicate` returns falsey for. The predicate is
9596
     * invoked with one argument: (value).
9597
     *
9598
     * @static
9599
     * @memberOf _
9600
     * @since 3.0.0
9601
     * @category Collection
9602
     * @param {Array|Object} collection The collection to iterate over.
9603
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9604
     * @returns {Array} Returns the array of grouped elements.
9605
     * @example
9606
     *
9607
     * var users = [
9608
     *   { 'user': 'barney',  'age': 36, 'active': false },
9609
     *   { 'user': 'fred',    'age': 40, 'active': true },
9610
     *   { 'user': 'pebbles', 'age': 1,  'active': false }
9611
     * ];
9612
     *
9613
     * _.partition(users, function(o) { return o.active; });
9614
     * // => objects for [['fred'], ['barney', 'pebbles']]
9615
     *
9616
     * // The `_.matches` iteratee shorthand.
9617
     * _.partition(users, { 'age': 1, 'active': false });
9618
     * // => objects for [['pebbles'], ['barney', 'fred']]
9619
     *
9620
     * // The `_.matchesProperty` iteratee shorthand.
9621
     * _.partition(users, ['active', false]);
9622
     * // => objects for [['barney', 'pebbles'], ['fred']]
9623
     *
9624
     * // The `_.property` iteratee shorthand.
9625
     * _.partition(users, 'active');
9626
     * // => objects for [['fred'], ['barney', 'pebbles']]
9627
     */
9628
    var partition = createAggregator(function(result, value, key) {
9629
      result[key ? 0 : 1].push(value);
9630
    }, function() { return [[], []]; });
9631
9632
    /**
9633
     * Reduces `collection` to a value which is the accumulated result of running
9634
     * each element in `collection` thru `iteratee`, where each successive
9635
     * invocation is supplied the return value of the previous. If `accumulator`
9636
     * is not given, the first element of `collection` is used as the initial
9637
     * value. The iteratee is invoked with four arguments:
9638
     * (accumulator, value, index|key, collection).
9639
     *
9640
     * Many lodash methods are guarded to work as iteratees for methods like
9641
     * `_.reduce`, `_.reduceRight`, and `_.transform`.
9642
     *
9643
     * The guarded methods are:
9644
     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
9645
     * and `sortBy`
9646
     *
9647
     * @static
9648
     * @memberOf _
9649
     * @since 0.1.0
9650
     * @category Collection
9651
     * @param {Array|Object} collection The collection to iterate over.
9652
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9653
     * @param {*} [accumulator] The initial value.
9654
     * @returns {*} Returns the accumulated value.
9655
     * @see _.reduceRight
9656
     * @example
9657
     *
9658
     * _.reduce([1, 2], function(sum, n) {
9659
     *   return sum + n;
9660
     * }, 0);
9661
     * // => 3
9662
     *
9663
     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
9664
     *   (result[value] || (result[value] = [])).push(key);
9665
     *   return result;
9666
     * }, {});
9667
     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
9668
     */
9669
    function reduce(collection, iteratee, accumulator) {
9670
      var func = isArray(collection) ? arrayReduce : baseReduce,
9671
          initAccum = arguments.length < 3;
9672
9673
      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
9674
    }
9675
9676
    /**
9677
     * This method is like `_.reduce` except that it iterates over elements of
9678
     * `collection` from right to left.
9679
     *
9680
     * @static
9681
     * @memberOf _
9682
     * @since 0.1.0
9683
     * @category Collection
9684
     * @param {Array|Object} collection The collection to iterate over.
9685
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9686
     * @param {*} [accumulator] The initial value.
9687
     * @returns {*} Returns the accumulated value.
9688
     * @see _.reduce
9689
     * @example
9690
     *
9691
     * var array = [[0, 1], [2, 3], [4, 5]];
9692
     *
9693
     * _.reduceRight(array, function(flattened, other) {
9694
     *   return flattened.concat(other);
9695
     * }, []);
9696
     * // => [4, 5, 2, 3, 0, 1]
9697
     */
9698
    function reduceRight(collection, iteratee, accumulator) {
9699
      var func = isArray(collection) ? arrayReduceRight : baseReduce,
9700
          initAccum = arguments.length < 3;
9701
9702
      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
9703
    }
9704
9705
    /**
9706
     * The opposite of `_.filter`; this method returns the elements of `collection`
9707
     * that `predicate` does **not** return truthy for.
9708
     *
9709
     * @static
9710
     * @memberOf _
9711
     * @since 0.1.0
9712
     * @category Collection
9713
     * @param {Array|Object} collection The collection to iterate over.
9714
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9715
     * @returns {Array} Returns the new filtered array.
9716
     * @see _.filter
9717
     * @example
9718
     *
9719
     * var users = [
9720
     *   { 'user': 'barney', 'age': 36, 'active': false },
9721
     *   { 'user': 'fred',   'age': 40, 'active': true }
9722
     * ];
9723
     *
9724
     * _.reject(users, function(o) { return !o.active; });
9725
     * // => objects for ['fred']
9726
     *
9727
     * // The `_.matches` iteratee shorthand.
9728
     * _.reject(users, { 'age': 40, 'active': true });
9729
     * // => objects for ['barney']
9730
     *
9731
     * // The `_.matchesProperty` iteratee shorthand.
9732
     * _.reject(users, ['active', false]);
9733
     * // => objects for ['fred']
9734
     *
9735
     * // The `_.property` iteratee shorthand.
9736
     * _.reject(users, 'active');
9737
     * // => objects for ['barney']
9738
     */
9739
    function reject(collection, predicate) {
9740
      var func = isArray(collection) ? arrayFilter : baseFilter;
9741
      return func(collection, negate(getIteratee(predicate, 3)));
9742
    }
9743
9744
    /**
9745
     * Gets a random element from `collection`.
9746
     *
9747
     * @static
9748
     * @memberOf _
9749
     * @since 2.0.0
9750
     * @category Collection
9751
     * @param {Array|Object} collection The collection to sample.
9752
     * @returns {*} Returns the random element.
9753
     * @example
9754
     *
9755
     * _.sample([1, 2, 3, 4]);
9756
     * // => 2
9757
     */
9758
    function sample(collection) {
9759
      var func = isArray(collection) ? arraySample : baseSample;
9760
      return func(collection);
9761
    }
9762
9763
    /**
9764
     * Gets `n` random elements at unique keys from `collection` up to the
9765
     * size of `collection`.
9766
     *
9767
     * @static
9768
     * @memberOf _
9769
     * @since 4.0.0
9770
     * @category Collection
9771
     * @param {Array|Object} collection The collection to sample.
9772
     * @param {number} [n=1] The number of elements to sample.
9773
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9774
     * @returns {Array} Returns the random elements.
9775
     * @example
9776
     *
9777
     * _.sampleSize([1, 2, 3], 2);
9778
     * // => [3, 1]
9779
     *
9780
     * _.sampleSize([1, 2, 3], 4);
9781
     * // => [2, 3, 1]
9782
     */
9783
    function sampleSize(collection, n, guard) {
9784
      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
9785
        n = 1;
9786
      } else {
9787
        n = toInteger(n);
9788
      }
9789
      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
9790
      return func(collection, n);
9791
    }
9792
9793
    /**
9794
     * Creates an array of shuffled values, using a version of the
9795
     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
9796
     *
9797
     * @static
9798
     * @memberOf _
9799
     * @since 0.1.0
9800
     * @category Collection
9801
     * @param {Array|Object} collection The collection to shuffle.
9802
     * @returns {Array} Returns the new shuffled array.
9803
     * @example
9804
     *
9805
     * _.shuffle([1, 2, 3, 4]);
9806
     * // => [4, 1, 3, 2]
9807
     */
9808
    function shuffle(collection) {
9809
      var func = isArray(collection) ? arrayShuffle : baseShuffle;
9810
      return func(collection);
9811
    }
9812
9813
    /**
9814
     * Gets the size of `collection` by returning its length for array-like
9815
     * values or the number of own enumerable string keyed properties for objects.
9816
     *
9817
     * @static
9818
     * @memberOf _
9819
     * @since 0.1.0
9820
     * @category Collection
9821
     * @param {Array|Object|string} collection The collection to inspect.
9822
     * @returns {number} Returns the collection size.
9823
     * @example
9824
     *
9825
     * _.size([1, 2, 3]);
9826
     * // => 3
9827
     *
9828
     * _.size({ 'a': 1, 'b': 2 });
9829
     * // => 2
9830
     *
9831
     * _.size('pebbles');
9832
     * // => 7
9833
     */
9834
    function size(collection) {
9835
      if (collection == null) {
9836
        return 0;
9837
      }
9838
      if (isArrayLike(collection)) {
9839
        return isString(collection) ? stringSize(collection) : collection.length;
9840
      }
9841
      var tag = getTag(collection);
9842
      if (tag == mapTag || tag == setTag) {
9843
        return collection.size;
9844
      }
9845
      return baseKeys(collection).length;
9846
    }
9847
9848
    /**
9849
     * Checks if `predicate` returns truthy for **any** element of `collection`.
9850
     * Iteration is stopped once `predicate` returns truthy. The predicate is
9851
     * invoked with three arguments: (value, index|key, collection).
9852
     *
9853
     * @static
9854
     * @memberOf _
9855
     * @since 0.1.0
9856
     * @category Collection
9857
     * @param {Array|Object} collection The collection to iterate over.
9858
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9859
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9860
     * @returns {boolean} Returns `true` if any element passes the predicate check,
9861
     *  else `false`.
9862
     * @example
9863
     *
9864
     * _.some([null, 0, 'yes', false], Boolean);
9865
     * // => true
9866
     *
9867
     * var users = [
9868
     *   { 'user': 'barney', 'active': true },
9869
     *   { 'user': 'fred',   'active': false }
9870
     * ];
9871
     *
9872
     * // The `_.matches` iteratee shorthand.
9873
     * _.some(users, { 'user': 'barney', 'active': false });
9874
     * // => false
9875
     *
9876
     * // The `_.matchesProperty` iteratee shorthand.
9877
     * _.some(users, ['active', false]);
9878
     * // => true
9879
     *
9880
     * // The `_.property` iteratee shorthand.
9881
     * _.some(users, 'active');
9882
     * // => true
9883
     */
9884
    function some(collection, predicate, guard) {
9885
      var func = isArray(collection) ? arraySome : baseSome;
9886
      if (guard && isIterateeCall(collection, predicate, guard)) {
9887
        predicate = undefined;
9888
      }
9889
      return func(collection, getIteratee(predicate, 3));
9890
    }
9891
9892
    /**
9893
     * Creates an array of elements, sorted in ascending order by the results of
9894
     * running each element in a collection thru each iteratee. This method
9895
     * performs a stable sort, that is, it preserves the original sort order of
9896
     * equal elements. The iteratees are invoked with one argument: (value).
9897
     *
9898
     * @static
9899
     * @memberOf _
9900
     * @since 0.1.0
9901
     * @category Collection
9902
     * @param {Array|Object} collection The collection to iterate over.
9903
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
9904
     *  The iteratees to sort by.
9905
     * @returns {Array} Returns the new sorted array.
9906
     * @example
9907
     *
9908
     * var users = [
9909
     *   { 'user': 'fred',   'age': 48 },
9910
     *   { 'user': 'barney', 'age': 36 },
9911
     *   { 'user': 'fred',   'age': 40 },
9912
     *   { 'user': 'barney', 'age': 34 }
9913
     * ];
9914
     *
9915
     * _.sortBy(users, [function(o) { return o.user; }]);
9916
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
9917
     *
9918
     * _.sortBy(users, ['user', 'age']);
9919
     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
9920
     */
9921
    var sortBy = baseRest(function(collection, iteratees) {
9922
      if (collection == null) {
9923
        return [];
9924
      }
9925
      var length = iteratees.length;
9926
      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
9927
        iteratees = [];
9928
      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
9929
        iteratees = [iteratees[0]];
9930
      }
9931
      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
9932
    });
9933
9934
    /*------------------------------------------------------------------------*/
9935
9936
    /**
9937
     * Gets the timestamp of the number of milliseconds that have elapsed since
9938
     * the Unix epoch (1 January 1970 00:00:00 UTC).
9939
     *
9940
     * @static
9941
     * @memberOf _
9942
     * @since 2.4.0
9943
     * @category Date
9944
     * @returns {number} Returns the timestamp.
9945
     * @example
9946
     *
9947
     * _.defer(function(stamp) {
9948
     *   console.log(_.now() - stamp);
9949
     * }, _.now());
9950
     * // => Logs the number of milliseconds it took for the deferred invocation.
9951
     */
9952
    var now = ctxNow || function() {
9953
      return root.Date.now();
9954
    };
9955
9956
    /*------------------------------------------------------------------------*/
9957
9958
    /**
9959
     * The opposite of `_.before`; this method creates a function that invokes
9960
     * `func` once it's called `n` or more times.
9961
     *
9962
     * @static
9963
     * @memberOf _
9964
     * @since 0.1.0
9965
     * @category Function
9966
     * @param {number} n The number of calls before `func` is invoked.
9967
     * @param {Function} func The function to restrict.
9968
     * @returns {Function} Returns the new restricted function.
9969
     * @example
9970
     *
9971
     * var saves = ['profile', 'settings'];
9972
     *
9973
     * var done = _.after(saves.length, function() {
9974
     *   console.log('done saving!');
9975
     * });
9976
     *
9977
     * _.forEach(saves, function(type) {
9978
     *   asyncSave({ 'type': type, 'complete': done });
9979
     * });
9980
     * // => Logs 'done saving!' after the two async saves have completed.
9981
     */
9982
    function after(n, func) {
9983
      if (typeof func != 'function') {
9984
        throw new TypeError(FUNC_ERROR_TEXT);
9985
      }
9986
      n = toInteger(n);
9987
      return function() {
9988
        if (--n < 1) {
9989
          return func.apply(this, arguments);
9990
        }
9991
      };
9992
    }
9993
9994
    /**
9995
     * Creates a function that invokes `func`, with up to `n` arguments,
9996
     * ignoring any additional arguments.
9997
     *
9998
     * @static
9999
     * @memberOf _
10000
     * @since 3.0.0
10001
     * @category Function
10002
     * @param {Function} func The function to cap arguments for.
10003
     * @param {number} [n=func.length] The arity cap.
10004
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10005
     * @returns {Function} Returns the new capped function.
10006
     * @example
10007
     *
10008
     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
10009
     * // => [6, 8, 10]
10010
     */
10011
    function ary(func, n, guard) {
10012
      n = guard ? undefined : n;
10013
      n = (func && n == null) ? func.length : n;
10014
      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
10015
    }
10016
10017
    /**
10018
     * Creates a function that invokes `func`, with the `this` binding and arguments
10019
     * of the created function, while it's called less than `n` times. Subsequent
10020
     * calls to the created function return the result of the last `func` invocation.
10021
     *
10022
     * @static
10023
     * @memberOf _
10024
     * @since 3.0.0
10025
     * @category Function
10026
     * @param {number} n The number of calls at which `func` is no longer invoked.
10027
     * @param {Function} func The function to restrict.
10028
     * @returns {Function} Returns the new restricted function.
10029
     * @example
10030
     *
10031
     * jQuery(element).on('click', _.before(5, addContactToList));
10032
     * // => Allows adding up to 4 contacts to the list.
10033
     */
10034
    function before(n, func) {
10035
      var result;
10036
      if (typeof func != 'function') {
10037
        throw new TypeError(FUNC_ERROR_TEXT);
10038
      }
10039
      n = toInteger(n);
10040
      return function() {
10041
        if (--n > 0) {
10042
          result = func.apply(this, arguments);
10043
        }
10044
        if (n <= 1) {
10045
          func = undefined;
10046
        }
10047
        return result;
10048
      };
10049
    }
10050
10051
    /**
10052
     * Creates a function that invokes `func` with the `this` binding of `thisArg`
10053
     * and `partials` prepended to the arguments it receives.
10054
     *
10055
     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
10056
     * may be used as a placeholder for partially applied arguments.
10057
     *
10058
     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
10059
     * property of bound functions.
10060
     *
10061
     * @static
10062
     * @memberOf _
10063
     * @since 0.1.0
10064
     * @category Function
10065
     * @param {Function} func The function to bind.
10066
     * @param {*} thisArg The `this` binding of `func`.
10067
     * @param {...*} [partials] The arguments to be partially applied.
10068
     * @returns {Function} Returns the new bound function.
10069
     * @example
10070
     *
10071
     * function greet(greeting, punctuation) {
10072
     *   return greeting + ' ' + this.user + punctuation;
10073
     * }
10074
     *
10075
     * var object = { 'user': 'fred' };
10076
     *
10077
     * var bound = _.bind(greet, object, 'hi');
10078
     * bound('!');
10079
     * // => 'hi fred!'
10080
     *
10081
     * // Bound with placeholders.
10082
     * var bound = _.bind(greet, object, _, '!');
10083
     * bound('hi');
10084
     * // => 'hi fred!'
10085
     */
10086
    var bind = baseRest(function(func, thisArg, partials) {
10087
      var bitmask = WRAP_BIND_FLAG;
10088
      if (partials.length) {
10089
        var holders = replaceHolders(partials, getHolder(bind));
10090
        bitmask |= WRAP_PARTIAL_FLAG;
10091
      }
10092
      return createWrap(func, bitmask, thisArg, partials, holders);
10093
    });
10094
10095
    /**
10096
     * Creates a function that invokes the method at `object[key]` with `partials`
10097
     * prepended to the arguments it receives.
10098
     *
10099
     * This method differs from `_.bind` by allowing bound functions to reference
10100
     * methods that may be redefined or don't yet exist. See
10101
     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
10102
     * for more details.
10103
     *
10104
     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
10105
     * builds, may be used as a placeholder for partially applied arguments.
10106
     *
10107
     * @static
10108
     * @memberOf _
10109
     * @since 0.10.0
10110
     * @category Function
10111
     * @param {Object} object The object to invoke the method on.
10112
     * @param {string} key The key of the method.
10113
     * @param {...*} [partials] The arguments to be partially applied.
10114
     * @returns {Function} Returns the new bound function.
10115
     * @example
10116
     *
10117
     * var object = {
10118
     *   'user': 'fred',
10119
     *   'greet': function(greeting, punctuation) {
10120
     *     return greeting + ' ' + this.user + punctuation;
10121
     *   }
10122
     * };
10123
     *
10124
     * var bound = _.bindKey(object, 'greet', 'hi');
10125
     * bound('!');
10126
     * // => 'hi fred!'
10127
     *
10128
     * object.greet = function(greeting, punctuation) {
10129
     *   return greeting + 'ya ' + this.user + punctuation;
10130
     * };
10131
     *
10132
     * bound('!');
10133
     * // => 'hiya fred!'
10134
     *
10135
     * // Bound with placeholders.
10136
     * var bound = _.bindKey(object, 'greet', _, '!');
10137
     * bound('hi');
10138
     * // => 'hiya fred!'
10139
     */
10140
    var bindKey = baseRest(function(object, key, partials) {
10141
      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
10142
      if (partials.length) {
10143
        var holders = replaceHolders(partials, getHolder(bindKey));
10144
        bitmask |= WRAP_PARTIAL_FLAG;
10145
      }
10146
      return createWrap(key, bitmask, object, partials, holders);
10147
    });
10148
10149
    /**
10150
     * Creates a function that accepts arguments of `func` and either invokes
10151
     * `func` returning its result, if at least `arity` number of arguments have
10152
     * been provided, or returns a function that accepts the remaining `func`
10153
     * arguments, and so on. The arity of `func` may be specified if `func.length`
10154
     * is not sufficient.
10155
     *
10156
     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
10157
     * may be used as a placeholder for provided arguments.
10158
     *
10159
     * **Note:** This method doesn't set the "length" property of curried functions.
10160
     *
10161
     * @static
10162
     * @memberOf _
10163
     * @since 2.0.0
10164
     * @category Function
10165
     * @param {Function} func The function to curry.
10166
     * @param {number} [arity=func.length] The arity of `func`.
10167
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10168
     * @returns {Function} Returns the new curried function.
10169
     * @example
10170
     *
10171
     * var abc = function(a, b, c) {
10172
     *   return [a, b, c];
10173
     * };
10174
     *
10175
     * var curried = _.curry(abc);
10176
     *
10177
     * curried(1)(2)(3);
10178
     * // => [1, 2, 3]
10179
     *
10180
     * curried(1, 2)(3);
10181
     * // => [1, 2, 3]
10182
     *
10183
     * curried(1, 2, 3);
10184
     * // => [1, 2, 3]
10185
     *
10186
     * // Curried with placeholders.
10187
     * curried(1)(_, 3)(2);
10188
     * // => [1, 2, 3]
10189
     */
10190
    function curry(func, arity, guard) {
10191
      arity = guard ? undefined : arity;
10192
      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10193
      result.placeholder = curry.placeholder;
10194
      return result;
10195
    }
10196
10197
    /**
10198
     * This method is like `_.curry` except that arguments are applied to `func`
10199
     * in the manner of `_.partialRight` instead of `_.partial`.
10200
     *
10201
     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
10202
     * builds, may be used as a placeholder for provided arguments.
10203
     *
10204
     * **Note:** This method doesn't set the "length" property of curried functions.
10205
     *
10206
     * @static
10207
     * @memberOf _
10208
     * @since 3.0.0
10209
     * @category Function
10210
     * @param {Function} func The function to curry.
10211
     * @param {number} [arity=func.length] The arity of `func`.
10212
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10213
     * @returns {Function} Returns the new curried function.
10214
     * @example
10215
     *
10216
     * var abc = function(a, b, c) {
10217
     *   return [a, b, c];
10218
     * };
10219
     *
10220
     * var curried = _.curryRight(abc);
10221
     *
10222
     * curried(3)(2)(1);
10223
     * // => [1, 2, 3]
10224
     *
10225
     * curried(2, 3)(1);
10226
     * // => [1, 2, 3]
10227
     *
10228
     * curried(1, 2, 3);
10229
     * // => [1, 2, 3]
10230
     *
10231
     * // Curried with placeholders.
10232
     * curried(3)(1, _)(2);
10233
     * // => [1, 2, 3]
10234
     */
10235
    function curryRight(func, arity, guard) {
10236
      arity = guard ? undefined : arity;
10237
      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10238
      result.placeholder = curryRight.placeholder;
10239
      return result;
10240
    }
10241
10242
    /**
10243
     * Creates a debounced function that delays invoking `func` until after `wait`
10244
     * milliseconds have elapsed since the last time the debounced function was
10245
     * invoked. The debounced function comes with a `cancel` method to cancel
10246
     * delayed `func` invocations and a `flush` method to immediately invoke them.
10247
     * Provide `options` to indicate whether `func` should be invoked on the
10248
     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
10249
     * with the last arguments provided to the debounced function. Subsequent
10250
     * calls to the debounced function return the result of the last `func`
10251
     * invocation.
10252
     *
10253
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
10254
     * invoked on the trailing edge of the timeout only if the debounced function
10255
     * is invoked more than once during the `wait` timeout.
10256
     *
10257
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10258
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10259
     *
10260
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10261
     * for details over the differences between `_.debounce` and `_.throttle`.
10262
     *
10263
     * @static
10264
     * @memberOf _
10265
     * @since 0.1.0
10266
     * @category Function
10267
     * @param {Function} func The function to debounce.
10268
     * @param {number} [wait=0] The number of milliseconds to delay.
10269
     * @param {Object} [options={}] The options object.
10270
     * @param {boolean} [options.leading=false]
10271
     *  Specify invoking on the leading edge of the timeout.
10272
     * @param {number} [options.maxWait]
10273
     *  The maximum time `func` is allowed to be delayed before it's invoked.
10274
     * @param {boolean} [options.trailing=true]
10275
     *  Specify invoking on the trailing edge of the timeout.
10276
     * @returns {Function} Returns the new debounced function.
10277
     * @example
10278
     *
10279
     * // Avoid costly calculations while the window size is in flux.
10280
     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
10281
     *
10282
     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
10283
     * jQuery(element).on('click', _.debounce(sendMail, 300, {
10284
     *   'leading': true,
10285
     *   'trailing': false
10286
     * }));
10287
     *
10288
     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
10289
     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
10290
     * var source = new EventSource('/stream');
10291
     * jQuery(source).on('message', debounced);
10292
     *
10293
     * // Cancel the trailing debounced invocation.
10294
     * jQuery(window).on('popstate', debounced.cancel);
10295
     */
10296
    function debounce(func, wait, options) {
10297
      var lastArgs,
10298
          lastThis,
10299
          maxWait,
10300
          result,
10301
          timerId,
10302
          lastCallTime,
10303
          lastInvokeTime = 0,
10304
          leading = false,
10305
          maxing = false,
10306
          trailing = true;
10307
10308
      if (typeof func != 'function') {
10309
        throw new TypeError(FUNC_ERROR_TEXT);
10310
      }
10311
      wait = toNumber(wait) || 0;
10312
      if (isObject(options)) {
10313
        leading = !!options.leading;
10314
        maxing = 'maxWait' in options;
10315
        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
10316
        trailing = 'trailing' in options ? !!options.trailing : trailing;
10317
      }
10318
10319
      function invokeFunc(time) {
10320
        var args = lastArgs,
10321
            thisArg = lastThis;
10322
10323
        lastArgs = lastThis = undefined;
10324
        lastInvokeTime = time;
10325
        result = func.apply(thisArg, args);
10326
        return result;
10327
      }
10328
10329
      function leadingEdge(time) {
10330
        // Reset any `maxWait` timer.
10331
        lastInvokeTime = time;
10332
        // Start the timer for the trailing edge.
10333
        timerId = setTimeout(timerExpired, wait);
10334
        // Invoke the leading edge.
10335
        return leading ? invokeFunc(time) : result;
10336
      }
10337
10338
      function remainingWait(time) {
10339
        var timeSinceLastCall = time - lastCallTime,
10340
            timeSinceLastInvoke = time - lastInvokeTime,
10341
            timeWaiting = wait - timeSinceLastCall;
10342
10343
        return maxing
10344
          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
10345
          : timeWaiting;
10346
      }
10347
10348
      function shouldInvoke(time) {
10349
        var timeSinceLastCall = time - lastCallTime,
10350
            timeSinceLastInvoke = time - lastInvokeTime;
10351
10352
        // Either this is the first call, activity has stopped and we're at the
10353
        // trailing edge, the system time has gone backwards and we're treating
10354
        // it as the trailing edge, or we've hit the `maxWait` limit.
10355
        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
10356
          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
10357
      }
10358
10359
      function timerExpired() {
10360
        var time = now();
10361
        if (shouldInvoke(time)) {
10362
          return trailingEdge(time);
10363
        }
10364
        // Restart the timer.
10365
        timerId = setTimeout(timerExpired, remainingWait(time));
10366
      }
10367
10368
      function trailingEdge(time) {
10369
        timerId = undefined;
10370
10371
        // Only invoke if we have `lastArgs` which means `func` has been
10372
        // debounced at least once.
10373
        if (trailing && lastArgs) {
10374
          return invokeFunc(time);
10375
        }
10376
        lastArgs = lastThis = undefined;
10377
        return result;
10378
      }
10379
10380
      function cancel() {
10381
        if (timerId !== undefined) {
10382
          clearTimeout(timerId);
10383
        }
10384
        lastInvokeTime = 0;
10385
        lastArgs = lastCallTime = lastThis = timerId = undefined;
10386
      }
10387
10388
      function flush() {
10389
        return timerId === undefined ? result : trailingEdge(now());
10390
      }
10391
10392
      function debounced() {
10393
        var time = now(),
10394
            isInvoking = shouldInvoke(time);
10395
10396
        lastArgs = arguments;
10397
        lastThis = this;
10398
        lastCallTime = time;
10399
10400
        if (isInvoking) {
10401
          if (timerId === undefined) {
10402
            return leadingEdge(lastCallTime);
10403
          }
10404
          if (maxing) {
10405
            // Handle invocations in a tight loop.
10406
            timerId = setTimeout(timerExpired, wait);
10407
            return invokeFunc(lastCallTime);
10408
          }
10409
        }
10410
        if (timerId === undefined) {
10411
          timerId = setTimeout(timerExpired, wait);
10412
        }
10413
        return result;
10414
      }
10415
      debounced.cancel = cancel;
10416
      debounced.flush = flush;
10417
      return debounced;
10418
    }
10419
10420
    /**
10421
     * Defers invoking the `func` until the current call stack has cleared. Any
10422
     * additional arguments are provided to `func` when it's invoked.
10423
     *
10424
     * @static
10425
     * @memberOf _
10426
     * @since 0.1.0
10427
     * @category Function
10428
     * @param {Function} func The function to defer.
10429
     * @param {...*} [args] The arguments to invoke `func` with.
10430
     * @returns {number} Returns the timer id.
10431
     * @example
10432
     *
10433
     * _.defer(function(text) {
10434
     *   console.log(text);
10435
     * }, 'deferred');
10436
     * // => Logs 'deferred' after one millisecond.
10437
     */
10438
    var defer = baseRest(function(func, args) {
10439
      return baseDelay(func, 1, args);
10440
    });
10441
10442
    /**
10443
     * Invokes `func` after `wait` milliseconds. Any additional arguments are
10444
     * provided to `func` when it's invoked.
10445
     *
10446
     * @static
10447
     * @memberOf _
10448
     * @since 0.1.0
10449
     * @category Function
10450
     * @param {Function} func The function to delay.
10451
     * @param {number} wait The number of milliseconds to delay invocation.
10452
     * @param {...*} [args] The arguments to invoke `func` with.
10453
     * @returns {number} Returns the timer id.
10454
     * @example
10455
     *
10456
     * _.delay(function(text) {
10457
     *   console.log(text);
10458
     * }, 1000, 'later');
10459
     * // => Logs 'later' after one second.
10460
     */
10461
    var delay = baseRest(function(func, wait, args) {
10462
      return baseDelay(func, toNumber(wait) || 0, args);
10463
    });
10464
10465
    /**
10466
     * Creates a function that invokes `func` with arguments reversed.
10467
     *
10468
     * @static
10469
     * @memberOf _
10470
     * @since 4.0.0
10471
     * @category Function
10472
     * @param {Function} func The function to flip arguments for.
10473
     * @returns {Function} Returns the new flipped function.
10474
     * @example
10475
     *
10476
     * var flipped = _.flip(function() {
10477
     *   return _.toArray(arguments);
10478
     * });
10479
     *
10480
     * flipped('a', 'b', 'c', 'd');
10481
     * // => ['d', 'c', 'b', 'a']
10482
     */
10483
    function flip(func) {
10484
      return createWrap(func, WRAP_FLIP_FLAG);
10485
    }
10486
10487
    /**
10488
     * Creates a function that memoizes the result of `func`. If `resolver` is
10489
     * provided, it determines the cache key for storing the result based on the
10490
     * arguments provided to the memoized function. By default, the first argument
10491
     * provided to the memoized function is used as the map cache key. The `func`
10492
     * is invoked with the `this` binding of the memoized function.
10493
     *
10494
     * **Note:** The cache is exposed as the `cache` property on the memoized
10495
     * function. Its creation may be customized by replacing the `_.memoize.Cache`
10496
     * constructor with one whose instances implement the
10497
     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
10498
     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
10499
     *
10500
     * @static
10501
     * @memberOf _
10502
     * @since 0.1.0
10503
     * @category Function
10504
     * @param {Function} func The function to have its output memoized.
10505
     * @param {Function} [resolver] The function to resolve the cache key.
10506
     * @returns {Function} Returns the new memoized function.
10507
     * @example
10508
     *
10509
     * var object = { 'a': 1, 'b': 2 };
10510
     * var other = { 'c': 3, 'd': 4 };
10511
     *
10512
     * var values = _.memoize(_.values);
10513
     * values(object);
10514
     * // => [1, 2]
10515
     *
10516
     * values(other);
10517
     * // => [3, 4]
10518
     *
10519
     * object.a = 2;
10520
     * values(object);
10521
     * // => [1, 2]
10522
     *
10523
     * // Modify the result cache.
10524
     * values.cache.set(object, ['a', 'b']);
10525
     * values(object);
10526
     * // => ['a', 'b']
10527
     *
10528
     * // Replace `_.memoize.Cache`.
10529
     * _.memoize.Cache = WeakMap;
10530
     */
10531
    function memoize(func, resolver) {
10532
      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
10533
        throw new TypeError(FUNC_ERROR_TEXT);
10534
      }
10535
      var memoized = function() {
10536
        var args = arguments,
10537
            key = resolver ? resolver.apply(this, args) : args[0],
10538
            cache = memoized.cache;
10539
10540
        if (cache.has(key)) {
10541
          return cache.get(key);
10542
        }
10543
        var result = func.apply(this, args);
10544
        memoized.cache = cache.set(key, result) || cache;
10545
        return result;
10546
      };
10547
      memoized.cache = new (memoize.Cache || MapCache);
10548
      return memoized;
10549
    }
10550
10551
    // Expose `MapCache`.
10552
    memoize.Cache = MapCache;
10553
10554
    /**
10555
     * Creates a function that negates the result of the predicate `func`. The
10556
     * `func` predicate is invoked with the `this` binding and arguments of the
10557
     * created function.
10558
     *
10559
     * @static
10560
     * @memberOf _
10561
     * @since 3.0.0
10562
     * @category Function
10563
     * @param {Function} predicate The predicate to negate.
10564
     * @returns {Function} Returns the new negated function.
10565
     * @example
10566
     *
10567
     * function isEven(n) {
10568
     *   return n % 2 == 0;
10569
     * }
10570
     *
10571
     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
10572
     * // => [1, 3, 5]
10573
     */
10574
    function negate(predicate) {
10575
      if (typeof predicate != 'function') {
10576
        throw new TypeError(FUNC_ERROR_TEXT);
10577
      }
10578
      return function() {
10579
        var args = arguments;
10580
        switch (args.length) {
10581
          case 0: return !predicate.call(this);
10582
          case 1: return !predicate.call(this, args[0]);
10583
          case 2: return !predicate.call(this, args[0], args[1]);
10584
          case 3: return !predicate.call(this, args[0], args[1], args[2]);
10585
        }
10586
        return !predicate.apply(this, args);
10587
      };
10588
    }
10589
10590
    /**
10591
     * Creates a function that is restricted to invoking `func` once. Repeat calls
10592
     * to the function return the value of the first invocation. The `func` is
10593
     * invoked with the `this` binding and arguments of the created function.
10594
     *
10595
     * @static
10596
     * @memberOf _
10597
     * @since 0.1.0
10598
     * @category Function
10599
     * @param {Function} func The function to restrict.
10600
     * @returns {Function} Returns the new restricted function.
10601
     * @example
10602
     *
10603
     * var initialize = _.once(createApplication);
10604
     * initialize();
10605
     * initialize();
10606
     * // => `createApplication` is invoked once
10607
     */
10608
    function once(func) {
10609
      return before(2, func);
10610
    }
10611
10612
    /**
10613
     * Creates a function that invokes `func` with its arguments transformed.
10614
     *
10615
     * @static
10616
     * @since 4.0.0
10617
     * @memberOf _
10618
     * @category Function
10619
     * @param {Function} func The function to wrap.
10620
     * @param {...(Function|Function[])} [transforms=[_.identity]]
10621
     *  The argument transforms.
10622
     * @returns {Function} Returns the new function.
10623
     * @example
10624
     *
10625
     * function doubled(n) {
10626
     *   return n * 2;
10627
     * }
10628
     *
10629
     * function square(n) {
10630
     *   return n * n;
10631
     * }
10632
     *
10633
     * var func = _.overArgs(function(x, y) {
10634
     *   return [x, y];
10635
     * }, [square, doubled]);
10636
     *
10637
     * func(9, 3);
10638
     * // => [81, 6]
10639
     *
10640
     * func(10, 5);
10641
     * // => [100, 10]
10642
     */
10643
    var overArgs = castRest(function(func, transforms) {
10644
      transforms = (transforms.length == 1 && isArray(transforms[0]))
10645
        ? arrayMap(transforms[0], baseUnary(getIteratee()))
10646
        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
10647
10648
      var funcsLength = transforms.length;
10649
      return baseRest(function(args) {
10650
        var index = -1,
10651
            length = nativeMin(args.length, funcsLength);
10652
10653
        while (++index < length) {
10654
          args[index] = transforms[index].call(this, args[index]);
10655
        }
10656
        return apply(func, this, args);
10657
      });
10658
    });
10659
10660
    /**
10661
     * Creates a function that invokes `func` with `partials` prepended to the
10662
     * arguments it receives. This method is like `_.bind` except it does **not**
10663
     * alter the `this` binding.
10664
     *
10665
     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
10666
     * builds, may be used as a placeholder for partially applied arguments.
10667
     *
10668
     * **Note:** This method doesn't set the "length" property of partially
10669
     * applied functions.
10670
     *
10671
     * @static
10672
     * @memberOf _
10673
     * @since 0.2.0
10674
     * @category Function
10675
     * @param {Function} func The function to partially apply arguments to.
10676
     * @param {...*} [partials] The arguments to be partially applied.
10677
     * @returns {Function} Returns the new partially applied function.
10678
     * @example
10679
     *
10680
     * function greet(greeting, name) {
10681
     *   return greeting + ' ' + name;
10682
     * }
10683
     *
10684
     * var sayHelloTo = _.partial(greet, 'hello');
10685
     * sayHelloTo('fred');
10686
     * // => 'hello fred'
10687
     *
10688
     * // Partially applied with placeholders.
10689
     * var greetFred = _.partial(greet, _, 'fred');
10690
     * greetFred('hi');
10691
     * // => 'hi fred'
10692
     */
10693
    var partial = baseRest(function(func, partials) {
10694
      var holders = replaceHolders(partials, getHolder(partial));
10695
      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
10696
    });
10697
10698
    /**
10699
     * This method is like `_.partial` except that partially applied arguments
10700
     * are appended to the arguments it receives.
10701
     *
10702
     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
10703
     * builds, may be used as a placeholder for partially applied arguments.
10704
     *
10705
     * **Note:** This method doesn't set the "length" property of partially
10706
     * applied functions.
10707
     *
10708
     * @static
10709
     * @memberOf _
10710
     * @since 1.0.0
10711
     * @category Function
10712
     * @param {Function} func The function to partially apply arguments to.
10713
     * @param {...*} [partials] The arguments to be partially applied.
10714
     * @returns {Function} Returns the new partially applied function.
10715
     * @example
10716
     *
10717
     * function greet(greeting, name) {
10718
     *   return greeting + ' ' + name;
10719
     * }
10720
     *
10721
     * var greetFred = _.partialRight(greet, 'fred');
10722
     * greetFred('hi');
10723
     * // => 'hi fred'
10724
     *
10725
     * // Partially applied with placeholders.
10726
     * var sayHelloTo = _.partialRight(greet, 'hello', _);
10727
     * sayHelloTo('fred');
10728
     * // => 'hello fred'
10729
     */
10730
    var partialRight = baseRest(function(func, partials) {
10731
      var holders = replaceHolders(partials, getHolder(partialRight));
10732
      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
10733
    });
10734
10735
    /**
10736
     * Creates a function that invokes `func` with arguments arranged according
10737
     * to the specified `indexes` where the argument value at the first index is
10738
     * provided as the first argument, the argument value at the second index is
10739
     * provided as the second argument, and so on.
10740
     *
10741
     * @static
10742
     * @memberOf _
10743
     * @since 3.0.0
10744
     * @category Function
10745
     * @param {Function} func The function to rearrange arguments for.
10746
     * @param {...(number|number[])} indexes The arranged argument indexes.
10747
     * @returns {Function} Returns the new function.
10748
     * @example
10749
     *
10750
     * var rearged = _.rearg(function(a, b, c) {
10751
     *   return [a, b, c];
10752
     * }, [2, 0, 1]);
10753
     *
10754
     * rearged('b', 'c', 'a')
10755
     * // => ['a', 'b', 'c']
10756
     */
10757
    var rearg = flatRest(function(func, indexes) {
10758
      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
10759
    });
10760
10761
    /**
10762
     * Creates a function that invokes `func` with the `this` binding of the
10763
     * created function and arguments from `start` and beyond provided as
10764
     * an array.
10765
     *
10766
     * **Note:** This method is based on the
10767
     * [rest parameter](https://mdn.io/rest_parameters).
10768
     *
10769
     * @static
10770
     * @memberOf _
10771
     * @since 4.0.0
10772
     * @category Function
10773
     * @param {Function} func The function to apply a rest parameter to.
10774
     * @param {number} [start=func.length-1] The start position of the rest parameter.
10775
     * @returns {Function} Returns the new function.
10776
     * @example
10777
     *
10778
     * var say = _.rest(function(what, names) {
10779
     *   return what + ' ' + _.initial(names).join(', ') +
10780
     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
10781
     * });
10782
     *
10783
     * say('hello', 'fred', 'barney', 'pebbles');
10784
     * // => 'hello fred, barney, & pebbles'
10785
     */
10786
    function rest(func, start) {
10787
      if (typeof func != 'function') {
10788
        throw new TypeError(FUNC_ERROR_TEXT);
10789
      }
10790
      start = start === undefined ? start : toInteger(start);
10791
      return baseRest(func, start);
10792
    }
10793
10794
    /**
10795
     * Creates a function that invokes `func` with the `this` binding of the
10796
     * create function and an array of arguments much like
10797
     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
10798
     *
10799
     * **Note:** This method is based on the
10800
     * [spread operator](https://mdn.io/spread_operator).
10801
     *
10802
     * @static
10803
     * @memberOf _
10804
     * @since 3.2.0
10805
     * @category Function
10806
     * @param {Function} func The function to spread arguments over.
10807
     * @param {number} [start=0] The start position of the spread.
10808
     * @returns {Function} Returns the new function.
10809
     * @example
10810
     *
10811
     * var say = _.spread(function(who, what) {
10812
     *   return who + ' says ' + what;
10813
     * });
10814
     *
10815
     * say(['fred', 'hello']);
10816
     * // => 'fred says hello'
10817
     *
10818
     * var numbers = Promise.all([
10819
     *   Promise.resolve(40),
10820
     *   Promise.resolve(36)
10821
     * ]);
10822
     *
10823
     * numbers.then(_.spread(function(x, y) {
10824
     *   return x + y;
10825
     * }));
10826
     * // => a Promise of 76
10827
     */
10828
    function spread(func, start) {
10829
      if (typeof func != 'function') {
10830
        throw new TypeError(FUNC_ERROR_TEXT);
10831
      }
10832
      start = start == null ? 0 : nativeMax(toInteger(start), 0);
10833
      return baseRest(function(args) {
10834
        var array = args[start],
10835
            otherArgs = castSlice(args, 0, start);
10836
10837
        if (array) {
10838
          arrayPush(otherArgs, array);
10839
        }
10840
        return apply(func, this, otherArgs);
10841
      });
10842
    }
10843
10844
    /**
10845
     * Creates a throttled function that only invokes `func` at most once per
10846
     * every `wait` milliseconds. The throttled function comes with a `cancel`
10847
     * method to cancel delayed `func` invocations and a `flush` method to
10848
     * immediately invoke them. Provide `options` to indicate whether `func`
10849
     * should be invoked on the leading and/or trailing edge of the `wait`
10850
     * timeout. The `func` is invoked with the last arguments provided to the
10851
     * throttled function. Subsequent calls to the throttled function return the
10852
     * result of the last `func` invocation.
10853
     *
10854
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
10855
     * invoked on the trailing edge of the timeout only if the throttled function
10856
     * is invoked more than once during the `wait` timeout.
10857
     *
10858
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10859
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10860
     *
10861
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10862
     * for details over the differences between `_.throttle` and `_.debounce`.
10863
     *
10864
     * @static
10865
     * @memberOf _
10866
     * @since 0.1.0
10867
     * @category Function
10868
     * @param {Function} func The function to throttle.
10869
     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
10870
     * @param {Object} [options={}] The options object.
10871
     * @param {boolean} [options.leading=true]
10872
     *  Specify invoking on the leading edge of the timeout.
10873
     * @param {boolean} [options.trailing=true]
10874
     *  Specify invoking on the trailing edge of the timeout.
10875
     * @returns {Function} Returns the new throttled function.
10876
     * @example
10877
     *
10878
     * // Avoid excessively updating the position while scrolling.
10879
     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
10880
     *
10881
     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
10882
     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
10883
     * jQuery(element).on('click', throttled);
10884
     *
10885
     * // Cancel the trailing throttled invocation.
10886
     * jQuery(window).on('popstate', throttled.cancel);
10887
     */
10888
    function throttle(func, wait, options) {
10889
      var leading = true,
10890
          trailing = true;
10891
10892
      if (typeof func != 'function') {
10893
        throw new TypeError(FUNC_ERROR_TEXT);
10894
      }
10895
      if (isObject(options)) {
10896
        leading = 'leading' in options ? !!options.leading : leading;
10897
        trailing = 'trailing' in options ? !!options.trailing : trailing;
10898
      }
10899
      return debounce(func, wait, {
10900
        'leading': leading,
10901
        'maxWait': wait,
10902
        'trailing': trailing
10903
      });
10904
    }
10905
10906
    /**
10907
     * Creates a function that accepts up to one argument, ignoring any
10908
     * additional arguments.
10909
     *
10910
     * @static
10911
     * @memberOf _
10912
     * @since 4.0.0
10913
     * @category Function
10914
     * @param {Function} func The function to cap arguments for.
10915
     * @returns {Function} Returns the new capped function.
10916
     * @example
10917
     *
10918
     * _.map(['6', '8', '10'], _.unary(parseInt));
10919
     * // => [6, 8, 10]
10920
     */
10921
    function unary(func) {
10922
      return ary(func, 1);
10923
    }
10924
10925
    /**
10926
     * Creates a function that provides `value` to `wrapper` as its first
10927
     * argument. Any additional arguments provided to the function are appended
10928
     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
10929
     * binding of the created function.
10930
     *
10931
     * @static
10932
     * @memberOf _
10933
     * @since 0.1.0
10934
     * @category Function
10935
     * @param {*} value The value to wrap.
10936
     * @param {Function} [wrapper=identity] The wrapper function.
10937
     * @returns {Function} Returns the new function.
10938
     * @example
10939
     *
10940
     * var p = _.wrap(_.escape, function(func, text) {
10941
     *   return '<p>' + func(text) + '</p>';
10942
     * });
10943
     *
10944
     * p('fred, barney, & pebbles');
10945
     * // => '<p>fred, barney, &amp; pebbles</p>'
10946
     */
10947
    function wrap(value, wrapper) {
10948
      return partial(castFunction(wrapper), value);
10949
    }
10950
10951
    /*------------------------------------------------------------------------*/
10952
10953
    /**
10954
     * Casts `value` as an array if it's not one.
10955
     *
10956
     * @static
10957
     * @memberOf _
10958
     * @since 4.4.0
10959
     * @category Lang
10960
     * @param {*} value The value to inspect.
10961
     * @returns {Array} Returns the cast array.
10962
     * @example
10963
     *
10964
     * _.castArray(1);
10965
     * // => [1]
10966
     *
10967
     * _.castArray({ 'a': 1 });
10968
     * // => [{ 'a': 1 }]
10969
     *
10970
     * _.castArray('abc');
10971
     * // => ['abc']
10972
     *
10973
     * _.castArray(null);
10974
     * // => [null]
10975
     *
10976
     * _.castArray(undefined);
10977
     * // => [undefined]
10978
     *
10979
     * _.castArray();
10980
     * // => []
10981
     *
10982
     * var array = [1, 2, 3];
10983
     * console.log(_.castArray(array) === array);
10984
     * // => true
10985
     */
10986
    function castArray() {
10987
      if (!arguments.length) {
10988
        return [];
10989
      }
10990
      var value = arguments[0];
10991
      return isArray(value) ? value : [value];
10992
    }
10993
10994
    /**
10995
     * Creates a shallow clone of `value`.
10996
     *
10997
     * **Note:** This method is loosely based on the
10998
     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
10999
     * and supports cloning arrays, array buffers, booleans, date objects, maps,
11000
     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
11001
     * arrays. The own enumerable properties of `arguments` objects are cloned
11002
     * as plain objects. An empty object is returned for uncloneable values such
11003
     * as error objects, functions, DOM nodes, and WeakMaps.
11004
     *
11005
     * @static
11006
     * @memberOf _
11007
     * @since 0.1.0
11008
     * @category Lang
11009
     * @param {*} value The value to clone.
11010
     * @returns {*} Returns the cloned value.
11011
     * @see _.cloneDeep
11012
     * @example
11013
     *
11014
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
11015
     *
11016
     * var shallow = _.clone(objects);
11017
     * console.log(shallow[0] === objects[0]);
11018
     * // => true
11019
     */
11020
    function clone(value) {
11021
      return baseClone(value, CLONE_SYMBOLS_FLAG);
11022
    }
11023
11024
    /**
11025
     * This method is like `_.clone` except that it accepts `customizer` which
11026
     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
11027
     * cloning is handled by the method instead. The `customizer` is invoked with
11028
     * up to four arguments; (value [, index|key, object, stack]).
11029
     *
11030
     * @static
11031
     * @memberOf _
11032
     * @since 4.0.0
11033
     * @category Lang
11034
     * @param {*} value The value to clone.
11035
     * @param {Function} [customizer] The function to customize cloning.
11036
     * @returns {*} Returns the cloned value.
11037
     * @see _.cloneDeepWith
11038
     * @example
11039
     *
11040
     * function customizer(value) {
11041
     *   if (_.isElement(value)) {
11042
     *     return value.cloneNode(false);
11043
     *   }
11044
     * }
11045
     *
11046
     * var el = _.cloneWith(document.body, customizer);
11047
     *
11048
     * console.log(el === document.body);
11049
     * // => false
11050
     * console.log(el.nodeName);
11051
     * // => 'BODY'
11052
     * console.log(el.childNodes.length);
11053
     * // => 0
11054
     */
11055
    function cloneWith(value, customizer) {
11056
      customizer = typeof customizer == 'function' ? customizer : undefined;
11057
      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
11058
    }
11059
11060
    /**
11061
     * This method is like `_.clone` except that it recursively clones `value`.
11062
     *
11063
     * @static
11064
     * @memberOf _
11065
     * @since 1.0.0
11066
     * @category Lang
11067
     * @param {*} value The value to recursively clone.
11068
     * @returns {*} Returns the deep cloned value.
11069
     * @see _.clone
11070
     * @example
11071
     *
11072
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
11073
     *
11074
     * var deep = _.cloneDeep(objects);
11075
     * console.log(deep[0] === objects[0]);
11076
     * // => false
11077
     */
11078
    function cloneDeep(value) {
11079
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
11080
    }
11081
11082
    /**
11083
     * This method is like `_.cloneWith` except that it recursively clones `value`.
11084
     *
11085
     * @static
11086
     * @memberOf _
11087
     * @since 4.0.0
11088
     * @category Lang
11089
     * @param {*} value The value to recursively clone.
11090
     * @param {Function} [customizer] The function to customize cloning.
11091
     * @returns {*} Returns the deep cloned value.
11092
     * @see _.cloneWith
11093
     * @example
11094
     *
11095
     * function customizer(value) {
11096
     *   if (_.isElement(value)) {
11097
     *     return value.cloneNode(true);
11098
     *   }
11099
     * }
11100
     *
11101
     * var el = _.cloneDeepWith(document.body, customizer);
11102
     *
11103
     * console.log(el === document.body);
11104
     * // => false
11105
     * console.log(el.nodeName);
11106
     * // => 'BODY'
11107
     * console.log(el.childNodes.length);
11108
     * // => 20
11109
     */
11110
    function cloneDeepWith(value, customizer) {
11111
      customizer = typeof customizer == 'function' ? customizer : undefined;
11112
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
11113
    }
11114
11115
    /**
11116
     * Checks if `object` conforms to `source` by invoking the predicate
11117
     * properties of `source` with the corresponding property values of `object`.
11118
     *
11119
     * **Note:** This method is equivalent to `_.conforms` when `source` is
11120
     * partially applied.
11121
     *
11122
     * @static
11123
     * @memberOf _
11124
     * @since 4.14.0
11125
     * @category Lang
11126
     * @param {Object} object The object to inspect.
11127
     * @param {Object} source The object of property predicates to conform to.
11128
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
11129
     * @example
11130
     *
11131
     * var object = { 'a': 1, 'b': 2 };
11132
     *
11133
     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
11134
     * // => true
11135
     *
11136
     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
11137
     * // => false
11138
     */
11139
    function conformsTo(object, source) {
11140
      return source == null || baseConformsTo(object, source, keys(source));
11141
    }
11142
11143
    /**
11144
     * Performs a
11145
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
11146
     * comparison between two values to determine if they are equivalent.
11147
     *
11148
     * @static
11149
     * @memberOf _
11150
     * @since 4.0.0
11151
     * @category Lang
11152
     * @param {*} value The value to compare.
11153
     * @param {*} other The other value to compare.
11154
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11155
     * @example
11156
     *
11157
     * var object = { 'a': 1 };
11158
     * var other = { 'a': 1 };
11159
     *
11160
     * _.eq(object, object);
11161
     * // => true
11162
     *
11163
     * _.eq(object, other);
11164
     * // => false
11165
     *
11166
     * _.eq('a', 'a');
11167
     * // => true
11168
     *
11169
     * _.eq('a', Object('a'));
11170
     * // => false
11171
     *
11172
     * _.eq(NaN, NaN);
11173
     * // => true
11174
     */
11175
    function eq(value, other) {
11176
      return value === other || (value !== value && other !== other);
11177
    }
11178
11179
    /**
11180
     * Checks if `value` is greater than `other`.
11181
     *
11182
     * @static
11183
     * @memberOf _
11184
     * @since 3.9.0
11185
     * @category Lang
11186
     * @param {*} value The value to compare.
11187
     * @param {*} other The other value to compare.
11188
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
11189
     *  else `false`.
11190
     * @see _.lt
11191
     * @example
11192
     *
11193
     * _.gt(3, 1);
11194
     * // => true
11195
     *
11196
     * _.gt(3, 3);
11197
     * // => false
11198
     *
11199
     * _.gt(1, 3);
11200
     * // => false
11201
     */
11202
    var gt = createRelationalOperation(baseGt);
11203
11204
    /**
11205
     * Checks if `value` is greater than or equal to `other`.
11206
     *
11207
     * @static
11208
     * @memberOf _
11209
     * @since 3.9.0
11210
     * @category Lang
11211
     * @param {*} value The value to compare.
11212
     * @param {*} other The other value to compare.
11213
     * @returns {boolean} Returns `true` if `value` is greater than or equal to
11214
     *  `other`, else `false`.
11215
     * @see _.lte
11216
     * @example
11217
     *
11218
     * _.gte(3, 1);
11219
     * // => true
11220
     *
11221
     * _.gte(3, 3);
11222
     * // => true
11223
     *
11224
     * _.gte(1, 3);
11225
     * // => false
11226
     */
11227
    var gte = createRelationalOperation(function(value, other) {
11228
      return value >= other;
11229
    });
11230
11231
    /**
11232
     * Checks if `value` is likely an `arguments` object.
11233
     *
11234
     * @static
11235
     * @memberOf _
11236
     * @since 0.1.0
11237
     * @category Lang
11238
     * @param {*} value The value to check.
11239
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
11240
     *  else `false`.
11241
     * @example
11242
     *
11243
     * _.isArguments(function() { return arguments; }());
11244
     * // => true
11245
     *
11246
     * _.isArguments([1, 2, 3]);
11247
     * // => false
11248
     */
11249
    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
11250
      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
11251
        !propertyIsEnumerable.call(value, 'callee');
11252
    };
11253
11254
    /**
11255
     * Checks if `value` is classified as an `Array` 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 array, else `false`.
11263
     * @example
11264
     *
11265
     * _.isArray([1, 2, 3]);
11266
     * // => true
11267
     *
11268
     * _.isArray(document.body.children);
11269
     * // => false
11270
     *
11271
     * _.isArray('abc');
11272
     * // => false
11273
     *
11274
     * _.isArray(_.noop);
11275
     * // => false
11276
     */
11277
    var isArray = Array.isArray;
11278
11279
    /**
11280
     * Checks if `value` is classified as an `ArrayBuffer` object.
11281
     *
11282
     * @static
11283
     * @memberOf _
11284
     * @since 4.3.0
11285
     * @category Lang
11286
     * @param {*} value The value to check.
11287
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
11288
     * @example
11289
     *
11290
     * _.isArrayBuffer(new ArrayBuffer(2));
11291
     * // => true
11292
     *
11293
     * _.isArrayBuffer(new Array(2));
11294
     * // => false
11295
     */
11296
    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
11297
11298
    /**
11299
     * Checks if `value` is array-like. A value is considered array-like if it's
11300
     * not a function and has a `value.length` that's an integer greater than or
11301
     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
11302
     *
11303
     * @static
11304
     * @memberOf _
11305
     * @since 4.0.0
11306
     * @category Lang
11307
     * @param {*} value The value to check.
11308
     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
11309
     * @example
11310
     *
11311
     * _.isArrayLike([1, 2, 3]);
11312
     * // => true
11313
     *
11314
     * _.isArrayLike(document.body.children);
11315
     * // => true
11316
     *
11317
     * _.isArrayLike('abc');
11318
     * // => true
11319
     *
11320
     * _.isArrayLike(_.noop);
11321
     * // => false
11322
     */
11323
    function isArrayLike(value) {
11324
      return value != null && isLength(value.length) && !isFunction(value);
11325
    }
11326
11327
    /**
11328
     * This method is like `_.isArrayLike` except that it also checks if `value`
11329
     * is an object.
11330
     *
11331
     * @static
11332
     * @memberOf _
11333
     * @since 4.0.0
11334
     * @category Lang
11335
     * @param {*} value The value to check.
11336
     * @returns {boolean} Returns `true` if `value` is an array-like object,
11337
     *  else `false`.
11338
     * @example
11339
     *
11340
     * _.isArrayLikeObject([1, 2, 3]);
11341
     * // => true
11342
     *
11343
     * _.isArrayLikeObject(document.body.children);
11344
     * // => true
11345
     *
11346
     * _.isArrayLikeObject('abc');
11347
     * // => false
11348
     *
11349
     * _.isArrayLikeObject(_.noop);
11350
     * // => false
11351
     */
11352
    function isArrayLikeObject(value) {
11353
      return isObjectLike(value) && isArrayLike(value);
11354
    }
11355
11356
    /**
11357
     * Checks if `value` is classified as a boolean primitive or object.
11358
     *
11359
     * @static
11360
     * @memberOf _
11361
     * @since 0.1.0
11362
     * @category Lang
11363
     * @param {*} value The value to check.
11364
     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
11365
     * @example
11366
     *
11367
     * _.isBoolean(false);
11368
     * // => true
11369
     *
11370
     * _.isBoolean(null);
11371
     * // => false
11372
     */
11373
    function isBoolean(value) {
11374
      return value === true || value === false ||
11375
        (isObjectLike(value) && baseGetTag(value) == boolTag);
11376
    }
11377
11378
    /**
11379
     * Checks if `value` is a buffer.
11380
     *
11381
     * @static
11382
     * @memberOf _
11383
     * @since 4.3.0
11384
     * @category Lang
11385
     * @param {*} value The value to check.
11386
     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
11387
     * @example
11388
     *
11389
     * _.isBuffer(new Buffer(2));
11390
     * // => true
11391
     *
11392
     * _.isBuffer(new Uint8Array(2));
11393
     * // => false
11394
     */
11395
    var isBuffer = nativeIsBuffer || stubFalse;
11396
11397
    /**
11398
     * Checks if `value` is classified as a `Date` object.
11399
     *
11400
     * @static
11401
     * @memberOf _
11402
     * @since 0.1.0
11403
     * @category Lang
11404
     * @param {*} value The value to check.
11405
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
11406
     * @example
11407
     *
11408
     * _.isDate(new Date);
11409
     * // => true
11410
     *
11411
     * _.isDate('Mon April 23 2012');
11412
     * // => false
11413
     */
11414
    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
11415
11416
    /**
11417
     * Checks if `value` is likely a DOM element.
11418
     *
11419
     * @static
11420
     * @memberOf _
11421
     * @since 0.1.0
11422
     * @category Lang
11423
     * @param {*} value The value to check.
11424
     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
11425
     * @example
11426
     *
11427
     * _.isElement(document.body);
11428
     * // => true
11429
     *
11430
     * _.isElement('<body>');
11431
     * // => false
11432
     */
11433
    function isElement(value) {
11434
      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
11435
    }
11436
11437
    /**
11438
     * Checks if `value` is an empty object, collection, map, or set.
11439
     *
11440
     * Objects are considered empty if they have no own enumerable string keyed
11441
     * properties.
11442
     *
11443
     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
11444
     * jQuery-like collections are considered empty if they have a `length` of `0`.
11445
     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
11446
     *
11447
     * @static
11448
     * @memberOf _
11449
     * @since 0.1.0
11450
     * @category Lang
11451
     * @param {*} value The value to check.
11452
     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
11453
     * @example
11454
     *
11455
     * _.isEmpty(null);
11456
     * // => true
11457
     *
11458
     * _.isEmpty(true);
11459
     * // => true
11460
     *
11461
     * _.isEmpty(1);
11462
     * // => true
11463
     *
11464
     * _.isEmpty([1, 2, 3]);
11465
     * // => false
11466
     *
11467
     * _.isEmpty({ 'a': 1 });
11468
     * // => false
11469
     */
11470
    function isEmpty(value) {
11471
      if (value == null) {
11472
        return true;
11473
      }
11474
      if (isArrayLike(value) &&
11475
          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
11476
            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
11477
        return !value.length;
11478
      }
11479
      var tag = getTag(value);
11480
      if (tag == mapTag || tag == setTag) {
11481
        return !value.size;
11482
      }
11483
      if (isPrototype(value)) {
11484
        return !baseKeys(value).length;
11485
      }
11486
      for (var key in value) {
11487
        if (hasOwnProperty.call(value, key)) {
11488
          return false;
11489
        }
11490
      }
11491
      return true;
11492
    }
11493
11494
    /**
11495
     * Performs a deep comparison between two values to determine if they are
11496
     * equivalent.
11497
     *
11498
     * **Note:** This method supports comparing arrays, array buffers, booleans,
11499
     * date objects, error objects, maps, numbers, `Object` objects, regexes,
11500
     * sets, strings, symbols, and typed arrays. `Object` objects are compared
11501
     * by their own, not inherited, enumerable properties. Functions and DOM
11502
     * nodes are compared by strict equality, i.e. `===`.
11503
     *
11504
     * @static
11505
     * @memberOf _
11506
     * @since 0.1.0
11507
     * @category Lang
11508
     * @param {*} value The value to compare.
11509
     * @param {*} other The other value to compare.
11510
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11511
     * @example
11512
     *
11513
     * var object = { 'a': 1 };
11514
     * var other = { 'a': 1 };
11515
     *
11516
     * _.isEqual(object, other);
11517
     * // => true
11518
     *
11519
     * object === other;
11520
     * // => false
11521
     */
11522
    function isEqual(value, other) {
11523
      return baseIsEqual(value, other);
11524
    }
11525
11526
    /**
11527
     * This method is like `_.isEqual` except that it accepts `customizer` which
11528
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11529
     * are handled by the method instead. The `customizer` is invoked with up to
11530
     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
11531
     *
11532
     * @static
11533
     * @memberOf _
11534
     * @since 4.0.0
11535
     * @category Lang
11536
     * @param {*} value The value to compare.
11537
     * @param {*} other The other value to compare.
11538
     * @param {Function} [customizer] The function to customize comparisons.
11539
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11540
     * @example
11541
     *
11542
     * function isGreeting(value) {
11543
     *   return /^h(?:i|ello)$/.test(value);
11544
     * }
11545
     *
11546
     * function customizer(objValue, othValue) {
11547
     *   if (isGreeting(objValue) && isGreeting(othValue)) {
11548
     *     return true;
11549
     *   }
11550
     * }
11551
     *
11552
     * var array = ['hello', 'goodbye'];
11553
     * var other = ['hi', 'goodbye'];
11554
     *
11555
     * _.isEqualWith(array, other, customizer);
11556
     * // => true
11557
     */
11558
    function isEqualWith(value, other, customizer) {
11559
      customizer = typeof customizer == 'function' ? customizer : undefined;
11560
      var result = customizer ? customizer(value, other) : undefined;
11561
      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
11562
    }
11563
11564
    /**
11565
     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
11566
     * `SyntaxError`, `TypeError`, or `URIError` object.
11567
     *
11568
     * @static
11569
     * @memberOf _
11570
     * @since 3.0.0
11571
     * @category Lang
11572
     * @param {*} value The value to check.
11573
     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
11574
     * @example
11575
     *
11576
     * _.isError(new Error);
11577
     * // => true
11578
     *
11579
     * _.isError(Error);
11580
     * // => false
11581
     */
11582
    function isError(value) {
11583
      if (!isObjectLike(value)) {
11584
        return false;
11585
      }
11586
      var tag = baseGetTag(value);
11587
      return tag == errorTag || tag == domExcTag ||
11588
        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
11589
    }
11590
11591
    /**
11592
     * Checks if `value` is a finite primitive number.
11593
     *
11594
     * **Note:** This method is based on
11595
     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
11596
     *
11597
     * @static
11598
     * @memberOf _
11599
     * @since 0.1.0
11600
     * @category Lang
11601
     * @param {*} value The value to check.
11602
     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
11603
     * @example
11604
     *
11605
     * _.isFinite(3);
11606
     * // => true
11607
     *
11608
     * _.isFinite(Number.MIN_VALUE);
11609
     * // => true
11610
     *
11611
     * _.isFinite(Infinity);
11612
     * // => false
11613
     *
11614
     * _.isFinite('3');
11615
     * // => false
11616
     */
11617
    function isFinite(value) {
11618
      return typeof value == 'number' && nativeIsFinite(value);
11619
    }
11620
11621
    /**
11622
     * Checks if `value` is classified as a `Function` object.
11623
     *
11624
     * @static
11625
     * @memberOf _
11626
     * @since 0.1.0
11627
     * @category Lang
11628
     * @param {*} value The value to check.
11629
     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
11630
     * @example
11631
     *
11632
     * _.isFunction(_);
11633
     * // => true
11634
     *
11635
     * _.isFunction(/abc/);
11636
     * // => false
11637
     */
11638
    function isFunction(value) {
11639
      if (!isObject(value)) {
11640
        return false;
11641
      }
11642
      // The use of `Object#toString` avoids issues with the `typeof` operator
11643
      // in Safari 9 which returns 'object' for typed arrays and other constructors.
11644
      var tag = baseGetTag(value);
11645
      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
11646
    }
11647
11648
    /**
11649
     * Checks if `value` is an integer.
11650
     *
11651
     * **Note:** This method is based on
11652
     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
11653
     *
11654
     * @static
11655
     * @memberOf _
11656
     * @since 4.0.0
11657
     * @category Lang
11658
     * @param {*} value The value to check.
11659
     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
11660
     * @example
11661
     *
11662
     * _.isInteger(3);
11663
     * // => true
11664
     *
11665
     * _.isInteger(Number.MIN_VALUE);
11666
     * // => false
11667
     *
11668
     * _.isInteger(Infinity);
11669
     * // => false
11670
     *
11671
     * _.isInteger('3');
11672
     * // => false
11673
     */
11674
    function isInteger(value) {
11675
      return typeof value == 'number' && value == toInteger(value);
11676
    }
11677
11678
    /**
11679
     * Checks if `value` is a valid array-like length.
11680
     *
11681
     * **Note:** This method is loosely based on
11682
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
11683
     *
11684
     * @static
11685
     * @memberOf _
11686
     * @since 4.0.0
11687
     * @category Lang
11688
     * @param {*} value The value to check.
11689
     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
11690
     * @example
11691
     *
11692
     * _.isLength(3);
11693
     * // => true
11694
     *
11695
     * _.isLength(Number.MIN_VALUE);
11696
     * // => false
11697
     *
11698
     * _.isLength(Infinity);
11699
     * // => false
11700
     *
11701
     * _.isLength('3');
11702
     * // => false
11703
     */
11704
    function isLength(value) {
11705
      return typeof value == 'number' &&
11706
        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
11707
    }
11708
11709
    /**
11710
     * Checks if `value` is the
11711
     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
11712
     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
11713
     *
11714
     * @static
11715
     * @memberOf _
11716
     * @since 0.1.0
11717
     * @category Lang
11718
     * @param {*} value The value to check.
11719
     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
11720
     * @example
11721
     *
11722
     * _.isObject({});
11723
     * // => true
11724
     *
11725
     * _.isObject([1, 2, 3]);
11726
     * // => true
11727
     *
11728
     * _.isObject(_.noop);
11729
     * // => true
11730
     *
11731
     * _.isObject(null);
11732
     * // => false
11733
     */
11734
    function isObject(value) {
11735
      var type = typeof value;
11736
      return value != null && (type == 'object' || type == 'function');
11737
    }
11738
11739
    /**
11740
     * Checks if `value` is object-like. A value is object-like if it's not `null`
11741
     * and has a `typeof` result of "object".
11742
     *
11743
     * @static
11744
     * @memberOf _
11745
     * @since 4.0.0
11746
     * @category Lang
11747
     * @param {*} value The value to check.
11748
     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
11749
     * @example
11750
     *
11751
     * _.isObjectLike({});
11752
     * // => true
11753
     *
11754
     * _.isObjectLike([1, 2, 3]);
11755
     * // => true
11756
     *
11757
     * _.isObjectLike(_.noop);
11758
     * // => false
11759
     *
11760
     * _.isObjectLike(null);
11761
     * // => false
11762
     */
11763
    function isObjectLike(value) {
11764
      return value != null && typeof value == 'object';
11765
    }
11766
11767
    /**
11768
     * Checks if `value` is classified as a `Map` object.
11769
     *
11770
     * @static
11771
     * @memberOf _
11772
     * @since 4.3.0
11773
     * @category Lang
11774
     * @param {*} value The value to check.
11775
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
11776
     * @example
11777
     *
11778
     * _.isMap(new Map);
11779
     * // => true
11780
     *
11781
     * _.isMap(new WeakMap);
11782
     * // => false
11783
     */
11784
    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
11785
11786
    /**
11787
     * Performs a partial deep comparison between `object` and `source` to
11788
     * determine if `object` contains equivalent property values.
11789
     *
11790
     * **Note:** This method is equivalent to `_.matches` when `source` is
11791
     * partially applied.
11792
     *
11793
     * Partial comparisons will match empty array and empty object `source`
11794
     * values against any array or object value, respectively. See `_.isEqual`
11795
     * for a list of supported value comparisons.
11796
     *
11797
     * @static
11798
     * @memberOf _
11799
     * @since 3.0.0
11800
     * @category Lang
11801
     * @param {Object} object The object to inspect.
11802
     * @param {Object} source The object of property values to match.
11803
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11804
     * @example
11805
     *
11806
     * var object = { 'a': 1, 'b': 2 };
11807
     *
11808
     * _.isMatch(object, { 'b': 2 });
11809
     * // => true
11810
     *
11811
     * _.isMatch(object, { 'b': 1 });
11812
     * // => false
11813
     */
11814
    function isMatch(object, source) {
11815
      return object === source || baseIsMatch(object, source, getMatchData(source));
11816
    }
11817
11818
    /**
11819
     * This method is like `_.isMatch` except that it accepts `customizer` which
11820
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11821
     * are handled by the method instead. The `customizer` is invoked with five
11822
     * arguments: (objValue, srcValue, index|key, object, source).
11823
     *
11824
     * @static
11825
     * @memberOf _
11826
     * @since 4.0.0
11827
     * @category Lang
11828
     * @param {Object} object The object to inspect.
11829
     * @param {Object} source The object of property values to match.
11830
     * @param {Function} [customizer] The function to customize comparisons.
11831
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11832
     * @example
11833
     *
11834
     * function isGreeting(value) {
11835
     *   return /^h(?:i|ello)$/.test(value);
11836
     * }
11837
     *
11838
     * function customizer(objValue, srcValue) {
11839
     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
11840
     *     return true;
11841
     *   }
11842
     * }
11843
     *
11844
     * var object = { 'greeting': 'hello' };
11845
     * var source = { 'greeting': 'hi' };
11846
     *
11847
     * _.isMatchWith(object, source, customizer);
11848
     * // => true
11849
     */
11850
    function isMatchWith(object, source, customizer) {
11851
      customizer = typeof customizer == 'function' ? customizer : undefined;
11852
      return baseIsMatch(object, source, getMatchData(source), customizer);
11853
    }
11854
11855
    /**
11856
     * Checks if `value` is `NaN`.
11857
     *
11858
     * **Note:** This method is based on
11859
     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
11860
     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
11861
     * `undefined` and other non-number values.
11862
     *
11863
     * @static
11864
     * @memberOf _
11865
     * @since 0.1.0
11866
     * @category Lang
11867
     * @param {*} value The value to check.
11868
     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
11869
     * @example
11870
     *
11871
     * _.isNaN(NaN);
11872
     * // => true
11873
     *
11874
     * _.isNaN(new Number(NaN));
11875
     * // => true
11876
     *
11877
     * isNaN(undefined);
11878
     * // => true
11879
     *
11880
     * _.isNaN(undefined);
11881
     * // => false
11882
     */
11883
    function isNaN(value) {
11884
      // An `NaN` primitive is the only value that is not equal to itself.
11885
      // Perform the `toStringTag` check first to avoid errors with some
11886
      // ActiveX objects in IE.
11887
      return isNumber(value) && value != +value;
11888
    }
11889
11890
    /**
11891
     * Checks if `value` is a pristine native function.
11892
     *
11893
     * **Note:** This method can't reliably detect native functions in the presence
11894
     * of the core-js package because core-js circumvents this kind of detection.
11895
     * Despite multiple requests, the core-js maintainer has made it clear: any
11896
     * attempt to fix the detection will be obstructed. As a result, we're left
11897
     * with little choice but to throw an error. Unfortunately, this also affects
11898
     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
11899
     * which rely on core-js.
11900
     *
11901
     * @static
11902
     * @memberOf _
11903
     * @since 3.0.0
11904
     * @category Lang
11905
     * @param {*} value The value to check.
11906
     * @returns {boolean} Returns `true` if `value` is a native function,
11907
     *  else `false`.
11908
     * @example
11909
     *
11910
     * _.isNative(Array.prototype.push);
11911
     * // => true
11912
     *
11913
     * _.isNative(_);
11914
     * // => false
11915
     */
11916
    function isNative(value) {
11917
      if (isMaskable(value)) {
11918
        throw new Error(CORE_ERROR_TEXT);
11919
      }
11920
      return baseIsNative(value);
11921
    }
11922
11923
    /**
11924
     * Checks if `value` is `null`.
11925
     *
11926
     * @static
11927
     * @memberOf _
11928
     * @since 0.1.0
11929
     * @category Lang
11930
     * @param {*} value The value to check.
11931
     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
11932
     * @example
11933
     *
11934
     * _.isNull(null);
11935
     * // => true
11936
     *
11937
     * _.isNull(void 0);
11938
     * // => false
11939
     */
11940
    function isNull(value) {
11941
      return value === null;
11942
    }
11943
11944
    /**
11945
     * Checks if `value` is `null` or `undefined`.
11946
     *
11947
     * @static
11948
     * @memberOf _
11949
     * @since 4.0.0
11950
     * @category Lang
11951
     * @param {*} value The value to check.
11952
     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
11953
     * @example
11954
     *
11955
     * _.isNil(null);
11956
     * // => true
11957
     *
11958
     * _.isNil(void 0);
11959
     * // => true
11960
     *
11961
     * _.isNil(NaN);
11962
     * // => false
11963
     */
11964
    function isNil(value) {
11965
      return value == null;
11966
    }
11967
11968
    /**
11969
     * Checks if `value` is classified as a `Number` primitive or object.
11970
     *
11971
     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
11972
     * classified as numbers, use the `_.isFinite` method.
11973
     *
11974
     * @static
11975
     * @memberOf _
11976
     * @since 0.1.0
11977
     * @category Lang
11978
     * @param {*} value The value to check.
11979
     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
11980
     * @example
11981
     *
11982
     * _.isNumber(3);
11983
     * // => true
11984
     *
11985
     * _.isNumber(Number.MIN_VALUE);
11986
     * // => true
11987
     *
11988
     * _.isNumber(Infinity);
11989
     * // => true
11990
     *
11991
     * _.isNumber('3');
11992
     * // => false
11993
     */
11994
    function isNumber(value) {
11995
      return typeof value == 'number' ||
11996
        (isObjectLike(value) && baseGetTag(value) == numberTag);
11997
    }
11998
11999
    /**
12000
     * Checks if `value` is a plain object, that is, an object created by the
12001
     * `Object` constructor or one with a `[[Prototype]]` of `null`.
12002
     *
12003
     * @static
12004
     * @memberOf _
12005
     * @since 0.8.0
12006
     * @category Lang
12007
     * @param {*} value The value to check.
12008
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
12009
     * @example
12010
     *
12011
     * function Foo() {
12012
     *   this.a = 1;
12013
     * }
12014
     *
12015
     * _.isPlainObject(new Foo);
12016
     * // => false
12017
     *
12018
     * _.isPlainObject([1, 2, 3]);
12019
     * // => false
12020
     *
12021
     * _.isPlainObject({ 'x': 0, 'y': 0 });
12022
     * // => true
12023
     *
12024
     * _.isPlainObject(Object.create(null));
12025
     * // => true
12026
     */
12027
    function isPlainObject(value) {
12028
      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
12029
        return false;
12030
      }
12031
      var proto = getPrototype(value);
12032
      if (proto === null) {
12033
        return true;
12034
      }
12035
      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
12036
      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
12037
        funcToString.call(Ctor) == objectCtorString;
12038
    }
12039
12040
    /**
12041
     * Checks if `value` is classified as a `RegExp` object.
12042
     *
12043
     * @static
12044
     * @memberOf _
12045
     * @since 0.1.0
12046
     * @category Lang
12047
     * @param {*} value The value to check.
12048
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
12049
     * @example
12050
     *
12051
     * _.isRegExp(/abc/);
12052
     * // => true
12053
     *
12054
     * _.isRegExp('/abc/');
12055
     * // => false
12056
     */
12057
    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
12058
12059
    /**
12060
     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
12061
     * double precision number which isn't the result of a rounded unsafe integer.
12062
     *
12063
     * **Note:** This method is based on
12064
     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
12065
     *
12066
     * @static
12067
     * @memberOf _
12068
     * @since 4.0.0
12069
     * @category Lang
12070
     * @param {*} value The value to check.
12071
     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
12072
     * @example
12073
     *
12074
     * _.isSafeInteger(3);
12075
     * // => true
12076
     *
12077
     * _.isSafeInteger(Number.MIN_VALUE);
12078
     * // => false
12079
     *
12080
     * _.isSafeInteger(Infinity);
12081
     * // => false
12082
     *
12083
     * _.isSafeInteger('3');
12084
     * // => false
12085
     */
12086
    function isSafeInteger(value) {
12087
      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
12088
    }
12089
12090
    /**
12091
     * Checks if `value` is classified as a `Set` object.
12092
     *
12093
     * @static
12094
     * @memberOf _
12095
     * @since 4.3.0
12096
     * @category Lang
12097
     * @param {*} value The value to check.
12098
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
12099
     * @example
12100
     *
12101
     * _.isSet(new Set);
12102
     * // => true
12103
     *
12104
     * _.isSet(new WeakSet);
12105
     * // => false
12106
     */
12107
    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
12108
12109
    /**
12110
     * Checks if `value` is classified as a `String` primitive or object.
12111
     *
12112
     * @static
12113
     * @since 0.1.0
12114
     * @memberOf _
12115
     * @category Lang
12116
     * @param {*} value The value to check.
12117
     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
12118
     * @example
12119
     *
12120
     * _.isString('abc');
12121
     * // => true
12122
     *
12123
     * _.isString(1);
12124
     * // => false
12125
     */
12126
    function isString(value) {
12127
      return typeof value == 'string' ||
12128
        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
12129
    }
12130
12131
    /**
12132
     * Checks if `value` is classified as a `Symbol` primitive or object.
12133
     *
12134
     * @static
12135
     * @memberOf _
12136
     * @since 4.0.0
12137
     * @category Lang
12138
     * @param {*} value The value to check.
12139
     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
12140
     * @example
12141
     *
12142
     * _.isSymbol(Symbol.iterator);
12143
     * // => true
12144
     *
12145
     * _.isSymbol('abc');
12146
     * // => false
12147
     */
12148
    function isSymbol(value) {
12149
      return typeof value == 'symbol' ||
12150
        (isObjectLike(value) && baseGetTag(value) == symbolTag);
12151
    }
12152
12153
    /**
12154
     * Checks if `value` is classified as a typed array.
12155
     *
12156
     * @static
12157
     * @memberOf _
12158
     * @since 3.0.0
12159
     * @category Lang
12160
     * @param {*} value The value to check.
12161
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
12162
     * @example
12163
     *
12164
     * _.isTypedArray(new Uint8Array);
12165
     * // => true
12166
     *
12167
     * _.isTypedArray([]);
12168
     * // => false
12169
     */
12170
    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
12171
12172
    /**
12173
     * Checks if `value` is `undefined`.
12174
     *
12175
     * @static
12176
     * @since 0.1.0
12177
     * @memberOf _
12178
     * @category Lang
12179
     * @param {*} value The value to check.
12180
     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
12181
     * @example
12182
     *
12183
     * _.isUndefined(void 0);
12184
     * // => true
12185
     *
12186
     * _.isUndefined(null);
12187
     * // => false
12188
     */
12189
    function isUndefined(value) {
12190
      return value === undefined;
12191
    }
12192
12193
    /**
12194
     * Checks if `value` is classified as a `WeakMap` object.
12195
     *
12196
     * @static
12197
     * @memberOf _
12198
     * @since 4.3.0
12199
     * @category Lang
12200
     * @param {*} value The value to check.
12201
     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
12202
     * @example
12203
     *
12204
     * _.isWeakMap(new WeakMap);
12205
     * // => true
12206
     *
12207
     * _.isWeakMap(new Map);
12208
     * // => false
12209
     */
12210
    function isWeakMap(value) {
12211
      return isObjectLike(value) && getTag(value) == weakMapTag;
12212
    }
12213
12214
    /**
12215
     * Checks if `value` is classified as a `WeakSet` object.
12216
     *
12217
     * @static
12218
     * @memberOf _
12219
     * @since 4.3.0
12220
     * @category Lang
12221
     * @param {*} value The value to check.
12222
     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
12223
     * @example
12224
     *
12225
     * _.isWeakSet(new WeakSet);
12226
     * // => true
12227
     *
12228
     * _.isWeakSet(new Set);
12229
     * // => false
12230
     */
12231
    function isWeakSet(value) {
12232
      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
12233
    }
12234
12235
    /**
12236
     * Checks if `value` is less than `other`.
12237
     *
12238
     * @static
12239
     * @memberOf _
12240
     * @since 3.9.0
12241
     * @category Lang
12242
     * @param {*} value The value to compare.
12243
     * @param {*} other The other value to compare.
12244
     * @returns {boolean} Returns `true` if `value` is less than `other`,
12245
     *  else `false`.
12246
     * @see _.gt
12247
     * @example
12248
     *
12249
     * _.lt(1, 3);
12250
     * // => true
12251
     *
12252
     * _.lt(3, 3);
12253
     * // => false
12254
     *
12255
     * _.lt(3, 1);
12256
     * // => false
12257
     */
12258
    var lt = createRelationalOperation(baseLt);
12259
12260
    /**
12261
     * Checks if `value` is less than or equal to `other`.
12262
     *
12263
     * @static
12264
     * @memberOf _
12265
     * @since 3.9.0
12266
     * @category Lang
12267
     * @param {*} value The value to compare.
12268
     * @param {*} other The other value to compare.
12269
     * @returns {boolean} Returns `true` if `value` is less than or equal to
12270
     *  `other`, else `false`.
12271
     * @see _.gte
12272
     * @example
12273
     *
12274
     * _.lte(1, 3);
12275
     * // => true
12276
     *
12277
     * _.lte(3, 3);
12278
     * // => true
12279
     *
12280
     * _.lte(3, 1);
12281
     * // => false
12282
     */
12283
    var lte = createRelationalOperation(function(value, other) {
12284
      return value <= other;
12285
    });
12286
12287
    /**
12288
     * Converts `value` to an array.
12289
     *
12290
     * @static
12291
     * @since 0.1.0
12292
     * @memberOf _
12293
     * @category Lang
12294
     * @param {*} value The value to convert.
12295
     * @returns {Array} Returns the converted array.
12296
     * @example
12297
     *
12298
     * _.toArray({ 'a': 1, 'b': 2 });
12299
     * // => [1, 2]
12300
     *
12301
     * _.toArray('abc');
12302
     * // => ['a', 'b', 'c']
12303
     *
12304
     * _.toArray(1);
12305
     * // => []
12306
     *
12307
     * _.toArray(null);
12308
     * // => []
12309
     */
12310
    function toArray(value) {
12311
      if (!value) {
12312
        return [];
12313
      }
12314
      if (isArrayLike(value)) {
12315
        return isString(value) ? stringToArray(value) : copyArray(value);
12316
      }
12317
      if (symIterator && value[symIterator]) {
12318
        return iteratorToArray(value[symIterator]());
12319
      }
12320
      var tag = getTag(value),
12321
          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
12322
12323
      return func(value);
12324
    }
12325
12326
    /**
12327
     * Converts `value` to a finite number.
12328
     *
12329
     * @static
12330
     * @memberOf _
12331
     * @since 4.12.0
12332
     * @category Lang
12333
     * @param {*} value The value to convert.
12334
     * @returns {number} Returns the converted number.
12335
     * @example
12336
     *
12337
     * _.toFinite(3.2);
12338
     * // => 3.2
12339
     *
12340
     * _.toFinite(Number.MIN_VALUE);
12341
     * // => 5e-324
12342
     *
12343
     * _.toFinite(Infinity);
12344
     * // => 1.7976931348623157e+308
12345
     *
12346
     * _.toFinite('3.2');
12347
     * // => 3.2
12348
     */
12349
    function toFinite(value) {
12350
      if (!value) {
12351
        return value === 0 ? value : 0;
12352
      }
12353
      value = toNumber(value);
12354
      if (value === INFINITY || value === -INFINITY) {
12355
        var sign = (value < 0 ? -1 : 1);
12356
        return sign * MAX_INTEGER;
12357
      }
12358
      return value === value ? value : 0;
12359
    }
12360
12361
    /**
12362
     * Converts `value` to an integer.
12363
     *
12364
     * **Note:** This method is loosely based on
12365
     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
12366
     *
12367
     * @static
12368
     * @memberOf _
12369
     * @since 4.0.0
12370
     * @category Lang
12371
     * @param {*} value The value to convert.
12372
     * @returns {number} Returns the converted integer.
12373
     * @example
12374
     *
12375
     * _.toInteger(3.2);
12376
     * // => 3
12377
     *
12378
     * _.toInteger(Number.MIN_VALUE);
12379
     * // => 0
12380
     *
12381
     * _.toInteger(Infinity);
12382
     * // => 1.7976931348623157e+308
12383
     *
12384
     * _.toInteger('3.2');
12385
     * // => 3
12386
     */
12387
    function toInteger(value) {
12388
      var result = toFinite(value),
12389
          remainder = result % 1;
12390
12391
      return result === result ? (remainder ? result - remainder : result) : 0;
12392
    }
12393
12394
    /**
12395
     * Converts `value` to an integer suitable for use as the length of an
12396
     * array-like object.
12397
     *
12398
     * **Note:** This method is based on
12399
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
12400
     *
12401
     * @static
12402
     * @memberOf _
12403
     * @since 4.0.0
12404
     * @category Lang
12405
     * @param {*} value The value to convert.
12406
     * @returns {number} Returns the converted integer.
12407
     * @example
12408
     *
12409
     * _.toLength(3.2);
12410
     * // => 3
12411
     *
12412
     * _.toLength(Number.MIN_VALUE);
12413
     * // => 0
12414
     *
12415
     * _.toLength(Infinity);
12416
     * // => 4294967295
12417
     *
12418
     * _.toLength('3.2');
12419
     * // => 3
12420
     */
12421
    function toLength(value) {
12422
      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
12423
    }
12424
12425
    /**
12426
     * Converts `value` to a number.
12427
     *
12428
     * @static
12429
     * @memberOf _
12430
     * @since 4.0.0
12431
     * @category Lang
12432
     * @param {*} value The value to process.
12433
     * @returns {number} Returns the number.
12434
     * @example
12435
     *
12436
     * _.toNumber(3.2);
12437
     * // => 3.2
12438
     *
12439
     * _.toNumber(Number.MIN_VALUE);
12440
     * // => 5e-324
12441
     *
12442
     * _.toNumber(Infinity);
12443
     * // => Infinity
12444
     *
12445
     * _.toNumber('3.2');
12446
     * // => 3.2
12447
     */
12448
    function toNumber(value) {
12449
      if (typeof value == 'number') {
12450
        return value;
12451
      }
12452
      if (isSymbol(value)) {
12453
        return NAN;
12454
      }
12455
      if (isObject(value)) {
12456
        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
12457
        value = isObject(other) ? (other + '') : other;
12458
      }
12459
      if (typeof value != 'string') {
12460
        return value === 0 ? value : +value;
12461
      }
12462
      value = value.replace(reTrim, '');
12463
      var isBinary = reIsBinary.test(value);
12464
      return (isBinary || reIsOctal.test(value))
12465
        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
12466
        : (reIsBadHex.test(value) ? NAN : +value);
12467
    }
12468
12469
    /**
12470
     * Converts `value` to a plain object flattening inherited enumerable string
12471
     * keyed properties of `value` to own properties of the plain object.
12472
     *
12473
     * @static
12474
     * @memberOf _
12475
     * @since 3.0.0
12476
     * @category Lang
12477
     * @param {*} value The value to convert.
12478
     * @returns {Object} Returns the converted plain object.
12479
     * @example
12480
     *
12481
     * function Foo() {
12482
     *   this.b = 2;
12483
     * }
12484
     *
12485
     * Foo.prototype.c = 3;
12486
     *
12487
     * _.assign({ 'a': 1 }, new Foo);
12488
     * // => { 'a': 1, 'b': 2 }
12489
     *
12490
     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
12491
     * // => { 'a': 1, 'b': 2, 'c': 3 }
12492
     */
12493
    function toPlainObject(value) {
12494
      return copyObject(value, keysIn(value));
12495
    }
12496
12497
    /**
12498
     * Converts `value` to a safe integer. A safe integer can be compared and
12499
     * represented correctly.
12500
     *
12501
     * @static
12502
     * @memberOf _
12503
     * @since 4.0.0
12504
     * @category Lang
12505
     * @param {*} value The value to convert.
12506
     * @returns {number} Returns the converted integer.
12507
     * @example
12508
     *
12509
     * _.toSafeInteger(3.2);
12510
     * // => 3
12511
     *
12512
     * _.toSafeInteger(Number.MIN_VALUE);
12513
     * // => 0
12514
     *
12515
     * _.toSafeInteger(Infinity);
12516
     * // => 9007199254740991
12517
     *
12518
     * _.toSafeInteger('3.2');
12519
     * // => 3
12520
     */
12521
    function toSafeInteger(value) {
12522
      return value
12523
        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
12524
        : (value === 0 ? value : 0);
12525
    }
12526
12527
    /**
12528
     * Converts `value` to a string. An empty string is returned for `null`
12529
     * and `undefined` values. The sign of `-0` is preserved.
12530
     *
12531
     * @static
12532
     * @memberOf _
12533
     * @since 4.0.0
12534
     * @category Lang
12535
     * @param {*} value The value to convert.
12536
     * @returns {string} Returns the converted string.
12537
     * @example
12538
     *
12539
     * _.toString(null);
12540
     * // => ''
12541
     *
12542
     * _.toString(-0);
12543
     * // => '-0'
12544
     *
12545
     * _.toString([1, 2, 3]);
12546
     * // => '1,2,3'
12547
     */
12548
    function toString(value) {
12549
      return value == null ? '' : baseToString(value);
12550
    }
12551
12552
    /*------------------------------------------------------------------------*/
12553
12554
    /**
12555
     * Assigns own enumerable string keyed properties of source objects to the
12556
     * destination object. Source objects are applied from left to right.
12557
     * Subsequent sources overwrite property assignments of previous sources.
12558
     *
12559
     * **Note:** This method mutates `object` and is loosely based on
12560
     * [`Object.assign`](https://mdn.io/Object/assign).
12561
     *
12562
     * @static
12563
     * @memberOf _
12564
     * @since 0.10.0
12565
     * @category Object
12566
     * @param {Object} object The destination object.
12567
     * @param {...Object} [sources] The source objects.
12568
     * @returns {Object} Returns `object`.
12569
     * @see _.assignIn
12570
     * @example
12571
     *
12572
     * function Foo() {
12573
     *   this.a = 1;
12574
     * }
12575
     *
12576
     * function Bar() {
12577
     *   this.c = 3;
12578
     * }
12579
     *
12580
     * Foo.prototype.b = 2;
12581
     * Bar.prototype.d = 4;
12582
     *
12583
     * _.assign({ 'a': 0 }, new Foo, new Bar);
12584
     * // => { 'a': 1, 'c': 3 }
12585
     */
12586
    var assign = createAssigner(function(object, source) {
12587
      if (isPrototype(source) || isArrayLike(source)) {
12588
        copyObject(source, keys(source), object);
12589
        return;
12590
      }
12591
      for (var key in source) {
12592
        if (hasOwnProperty.call(source, key)) {
12593
          assignValue(object, key, source[key]);
12594
        }
12595
      }
12596
    });
12597
12598
    /**
12599
     * This method is like `_.assign` except that it iterates over own and
12600
     * inherited source properties.
12601
     *
12602
     * **Note:** This method mutates `object`.
12603
     *
12604
     * @static
12605
     * @memberOf _
12606
     * @since 4.0.0
12607
     * @alias extend
12608
     * @category Object
12609
     * @param {Object} object The destination object.
12610
     * @param {...Object} [sources] The source objects.
12611
     * @returns {Object} Returns `object`.
12612
     * @see _.assign
12613
     * @example
12614
     *
12615
     * function Foo() {
12616
     *   this.a = 1;
12617
     * }
12618
     *
12619
     * function Bar() {
12620
     *   this.c = 3;
12621
     * }
12622
     *
12623
     * Foo.prototype.b = 2;
12624
     * Bar.prototype.d = 4;
12625
     *
12626
     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
12627
     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
12628
     */
12629
    var assignIn = createAssigner(function(object, source) {
12630
      copyObject(source, keysIn(source), object);
12631
    });
12632
12633
    /**
12634
     * This method is like `_.assignIn` except that it accepts `customizer`
12635
     * which is invoked to produce the assigned values. If `customizer` returns
12636
     * `undefined`, assignment is handled by the method instead. The `customizer`
12637
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
12638
     *
12639
     * **Note:** This method mutates `object`.
12640
     *
12641
     * @static
12642
     * @memberOf _
12643
     * @since 4.0.0
12644
     * @alias extendWith
12645
     * @category Object
12646
     * @param {Object} object The destination object.
12647
     * @param {...Object} sources The source objects.
12648
     * @param {Function} [customizer] The function to customize assigned values.
12649
     * @returns {Object} Returns `object`.
12650
     * @see _.assignWith
12651
     * @example
12652
     *
12653
     * function customizer(objValue, srcValue) {
12654
     *   return _.isUndefined(objValue) ? srcValue : objValue;
12655
     * }
12656
     *
12657
     * var defaults = _.partialRight(_.assignInWith, customizer);
12658
     *
12659
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12660
     * // => { 'a': 1, 'b': 2 }
12661
     */
12662
    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
12663
      copyObject(source, keysIn(source), object, customizer);
12664
    });
12665
12666
    /**
12667
     * This method is like `_.assign` except that it accepts `customizer`
12668
     * which is invoked to produce the assigned values. If `customizer` returns
12669
     * `undefined`, assignment is handled by the method instead. The `customizer`
12670
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
12671
     *
12672
     * **Note:** This method mutates `object`.
12673
     *
12674
     * @static
12675
     * @memberOf _
12676
     * @since 4.0.0
12677
     * @category Object
12678
     * @param {Object} object The destination object.
12679
     * @param {...Object} sources The source objects.
12680
     * @param {Function} [customizer] The function to customize assigned values.
12681
     * @returns {Object} Returns `object`.
12682
     * @see _.assignInWith
12683
     * @example
12684
     *
12685
     * function customizer(objValue, srcValue) {
12686
     *   return _.isUndefined(objValue) ? srcValue : objValue;
12687
     * }
12688
     *
12689
     * var defaults = _.partialRight(_.assignWith, customizer);
12690
     *
12691
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12692
     * // => { 'a': 1, 'b': 2 }
12693
     */
12694
    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
12695
      copyObject(source, keys(source), object, customizer);
12696
    });
12697
12698
    /**
12699
     * Creates an array of values corresponding to `paths` of `object`.
12700
     *
12701
     * @static
12702
     * @memberOf _
12703
     * @since 1.0.0
12704
     * @category Object
12705
     * @param {Object} object The object to iterate over.
12706
     * @param {...(string|string[])} [paths] The property paths to pick.
12707
     * @returns {Array} Returns the picked values.
12708
     * @example
12709
     *
12710
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
12711
     *
12712
     * _.at(object, ['a[0].b.c', 'a[1]']);
12713
     * // => [3, 4]
12714
     */
12715
    var at = flatRest(baseAt);
12716
12717
    /**
12718
     * Creates an object that inherits from the `prototype` object. If a
12719
     * `properties` object is given, its own enumerable string keyed properties
12720
     * are assigned to the created object.
12721
     *
12722
     * @static
12723
     * @memberOf _
12724
     * @since 2.3.0
12725
     * @category Object
12726
     * @param {Object} prototype The object to inherit from.
12727
     * @param {Object} [properties] The properties to assign to the object.
12728
     * @returns {Object} Returns the new object.
12729
     * @example
12730
     *
12731
     * function Shape() {
12732
     *   this.x = 0;
12733
     *   this.y = 0;
12734
     * }
12735
     *
12736
     * function Circle() {
12737
     *   Shape.call(this);
12738
     * }
12739
     *
12740
     * Circle.prototype = _.create(Shape.prototype, {
12741
     *   'constructor': Circle
12742
     * });
12743
     *
12744
     * var circle = new Circle;
12745
     * circle instanceof Circle;
12746
     * // => true
12747
     *
12748
     * circle instanceof Shape;
12749
     * // => true
12750
     */
12751
    function create(prototype, properties) {
12752
      var result = baseCreate(prototype);
12753
      return properties == null ? result : baseAssign(result, properties);
12754
    }
12755
12756
    /**
12757
     * Assigns own and inherited enumerable string keyed properties of source
12758
     * objects to the destination object for all destination properties that
12759
     * resolve to `undefined`. Source objects are applied from left to right.
12760
     * Once a property is set, additional values of the same property are ignored.
12761
     *
12762
     * **Note:** This method mutates `object`.
12763
     *
12764
     * @static
12765
     * @since 0.1.0
12766
     * @memberOf _
12767
     * @category Object
12768
     * @param {Object} object The destination object.
12769
     * @param {...Object} [sources] The source objects.
12770
     * @returns {Object} Returns `object`.
12771
     * @see _.defaultsDeep
12772
     * @example
12773
     *
12774
     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12775
     * // => { 'a': 1, 'b': 2 }
12776
     */
12777
    var defaults = baseRest(function(object, sources) {
12778
      object = Object(object);
12779
12780
      var index = -1;
12781
      var length = sources.length;
12782
      var guard = length > 2 ? sources[2] : undefined;
12783
12784
      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
12785
        length = 1;
12786
      }
12787
12788
      while (++index < length) {
12789
        var source = sources[index];
12790
        var props = keysIn(source);
12791
        var propsIndex = -1;
12792
        var propsLength = props.length;
12793
12794
        while (++propsIndex < propsLength) {
12795
          var key = props[propsIndex];
12796
          var value = object[key];
12797
12798
          if (value === undefined ||
12799
              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
12800
            object[key] = source[key];
12801
          }
12802
        }
12803
      }
12804
12805
      return object;
12806
    });
12807
12808
    /**
12809
     * This method is like `_.defaults` except that it recursively assigns
12810
     * default properties.
12811
     *
12812
     * **Note:** This method mutates `object`.
12813
     *
12814
     * @static
12815
     * @memberOf _
12816
     * @since 3.10.0
12817
     * @category Object
12818
     * @param {Object} object The destination object.
12819
     * @param {...Object} [sources] The source objects.
12820
     * @returns {Object} Returns `object`.
12821
     * @see _.defaults
12822
     * @example
12823
     *
12824
     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
12825
     * // => { 'a': { 'b': 2, 'c': 3 } }
12826
     */
12827
    var defaultsDeep = baseRest(function(args) {
12828
      args.push(undefined, customDefaultsMerge);
12829
      return apply(mergeWith, undefined, args);
12830
    });
12831
12832
    /**
12833
     * This method is like `_.find` except that it returns the key of the first
12834
     * element `predicate` returns truthy for instead of the element itself.
12835
     *
12836
     * @static
12837
     * @memberOf _
12838
     * @since 1.1.0
12839
     * @category Object
12840
     * @param {Object} object The object to inspect.
12841
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
12842
     * @returns {string|undefined} Returns the key of the matched element,
12843
     *  else `undefined`.
12844
     * @example
12845
     *
12846
     * var users = {
12847
     *   'barney':  { 'age': 36, 'active': true },
12848
     *   'fred':    { 'age': 40, 'active': false },
12849
     *   'pebbles': { 'age': 1,  'active': true }
12850
     * };
12851
     *
12852
     * _.findKey(users, function(o) { return o.age < 40; });
12853
     * // => 'barney' (iteration order is not guaranteed)
12854
     *
12855
     * // The `_.matches` iteratee shorthand.
12856
     * _.findKey(users, { 'age': 1, 'active': true });
12857
     * // => 'pebbles'
12858
     *
12859
     * // The `_.matchesProperty` iteratee shorthand.
12860
     * _.findKey(users, ['active', false]);
12861
     * // => 'fred'
12862
     *
12863
     * // The `_.property` iteratee shorthand.
12864
     * _.findKey(users, 'active');
12865
     * // => 'barney'
12866
     */
12867
    function findKey(object, predicate) {
12868
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
12869
    }
12870
12871
    /**
12872
     * This method is like `_.findKey` except that it iterates over elements of
12873
     * a collection in the opposite order.
12874
     *
12875
     * @static
12876
     * @memberOf _
12877
     * @since 2.0.0
12878
     * @category Object
12879
     * @param {Object} object The object to inspect.
12880
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
12881
     * @returns {string|undefined} Returns the key of the matched element,
12882
     *  else `undefined`.
12883
     * @example
12884
     *
12885
     * var users = {
12886
     *   'barney':  { 'age': 36, 'active': true },
12887
     *   'fred':    { 'age': 40, 'active': false },
12888
     *   'pebbles': { 'age': 1,  'active': true }
12889
     * };
12890
     *
12891
     * _.findLastKey(users, function(o) { return o.age < 40; });
12892
     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
12893
     *
12894
     * // The `_.matches` iteratee shorthand.
12895
     * _.findLastKey(users, { 'age': 36, 'active': true });
12896
     * // => 'barney'
12897
     *
12898
     * // The `_.matchesProperty` iteratee shorthand.
12899
     * _.findLastKey(users, ['active', false]);
12900
     * // => 'fred'
12901
     *
12902
     * // The `_.property` iteratee shorthand.
12903
     * _.findLastKey(users, 'active');
12904
     * // => 'pebbles'
12905
     */
12906
    function findLastKey(object, predicate) {
12907
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
12908
    }
12909
12910
    /**
12911
     * Iterates over own and inherited enumerable string keyed properties of an
12912
     * object and invokes `iteratee` for each property. The iteratee is invoked
12913
     * with three arguments: (value, key, object). Iteratee functions may exit
12914
     * iteration early by explicitly returning `false`.
12915
     *
12916
     * @static
12917
     * @memberOf _
12918
     * @since 0.3.0
12919
     * @category Object
12920
     * @param {Object} object The object to iterate over.
12921
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12922
     * @returns {Object} Returns `object`.
12923
     * @see _.forInRight
12924
     * @example
12925
     *
12926
     * function Foo() {
12927
     *   this.a = 1;
12928
     *   this.b = 2;
12929
     * }
12930
     *
12931
     * Foo.prototype.c = 3;
12932
     *
12933
     * _.forIn(new Foo, function(value, key) {
12934
     *   console.log(key);
12935
     * });
12936
     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
12937
     */
12938
    function forIn(object, iteratee) {
12939
      return object == null
12940
        ? object
12941
        : baseFor(object, getIteratee(iteratee, 3), keysIn);
12942
    }
12943
12944
    /**
12945
     * This method is like `_.forIn` except that it iterates over properties of
12946
     * `object` in the opposite order.
12947
     *
12948
     * @static
12949
     * @memberOf _
12950
     * @since 2.0.0
12951
     * @category Object
12952
     * @param {Object} object The object to iterate over.
12953
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12954
     * @returns {Object} Returns `object`.
12955
     * @see _.forIn
12956
     * @example
12957
     *
12958
     * function Foo() {
12959
     *   this.a = 1;
12960
     *   this.b = 2;
12961
     * }
12962
     *
12963
     * Foo.prototype.c = 3;
12964
     *
12965
     * _.forInRight(new Foo, function(value, key) {
12966
     *   console.log(key);
12967
     * });
12968
     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
12969
     */
12970
    function forInRight(object, iteratee) {
12971
      return object == null
12972
        ? object
12973
        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
12974
    }
12975
12976
    /**
12977
     * Iterates over own enumerable string keyed properties of an object and
12978
     * invokes `iteratee` for each property. The iteratee is invoked with three
12979
     * arguments: (value, key, object). Iteratee functions may exit iteration
12980
     * early by explicitly returning `false`.
12981
     *
12982
     * @static
12983
     * @memberOf _
12984
     * @since 0.3.0
12985
     * @category Object
12986
     * @param {Object} object The object to iterate over.
12987
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12988
     * @returns {Object} Returns `object`.
12989
     * @see _.forOwnRight
12990
     * @example
12991
     *
12992
     * function Foo() {
12993
     *   this.a = 1;
12994
     *   this.b = 2;
12995
     * }
12996
     *
12997
     * Foo.prototype.c = 3;
12998
     *
12999
     * _.forOwn(new Foo, function(value, key) {
13000
     *   console.log(key);
13001
     * });
13002
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
13003
     */
13004
    function forOwn(object, iteratee) {
13005
      return object && baseForOwn(object, getIteratee(iteratee, 3));
13006
    }
13007
13008
    /**
13009
     * This method is like `_.forOwn` except that it iterates over properties of
13010
     * `object` in the opposite order.
13011
     *
13012
     * @static
13013
     * @memberOf _
13014
     * @since 2.0.0
13015
     * @category Object
13016
     * @param {Object} object The object to iterate over.
13017
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13018
     * @returns {Object} Returns `object`.
13019
     * @see _.forOwn
13020
     * @example
13021
     *
13022
     * function Foo() {
13023
     *   this.a = 1;
13024
     *   this.b = 2;
13025
     * }
13026
     *
13027
     * Foo.prototype.c = 3;
13028
     *
13029
     * _.forOwnRight(new Foo, function(value, key) {
13030
     *   console.log(key);
13031
     * });
13032
     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
13033
     */
13034
    function forOwnRight(object, iteratee) {
13035
      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
13036
    }
13037
13038
    /**
13039
     * Creates an array of function property names from own enumerable properties
13040
     * of `object`.
13041
     *
13042
     * @static
13043
     * @since 0.1.0
13044
     * @memberOf _
13045
     * @category Object
13046
     * @param {Object} object The object to inspect.
13047
     * @returns {Array} Returns the function names.
13048
     * @see _.functionsIn
13049
     * @example
13050
     *
13051
     * function Foo() {
13052
     *   this.a = _.constant('a');
13053
     *   this.b = _.constant('b');
13054
     * }
13055
     *
13056
     * Foo.prototype.c = _.constant('c');
13057
     *
13058
     * _.functions(new Foo);
13059
     * // => ['a', 'b']
13060
     */
13061
    function functions(object) {
13062
      return object == null ? [] : baseFunctions(object, keys(object));
13063
    }
13064
13065
    /**
13066
     * Creates an array of function property names from own and inherited
13067
     * enumerable properties of `object`.
13068
     *
13069
     * @static
13070
     * @memberOf _
13071
     * @since 4.0.0
13072
     * @category Object
13073
     * @param {Object} object The object to inspect.
13074
     * @returns {Array} Returns the function names.
13075
     * @see _.functions
13076
     * @example
13077
     *
13078
     * function Foo() {
13079
     *   this.a = _.constant('a');
13080
     *   this.b = _.constant('b');
13081
     * }
13082
     *
13083
     * Foo.prototype.c = _.constant('c');
13084
     *
13085
     * _.functionsIn(new Foo);
13086
     * // => ['a', 'b', 'c']
13087
     */
13088
    function functionsIn(object) {
13089
      return object == null ? [] : baseFunctions(object, keysIn(object));
13090
    }
13091
13092
    /**
13093
     * Gets the value at `path` of `object`. If the resolved value is
13094
     * `undefined`, the `defaultValue` is returned in its place.
13095
     *
13096
     * @static
13097
     * @memberOf _
13098
     * @since 3.7.0
13099
     * @category Object
13100
     * @param {Object} object The object to query.
13101
     * @param {Array|string} path The path of the property to get.
13102
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13103
     * @returns {*} Returns the resolved value.
13104
     * @example
13105
     *
13106
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13107
     *
13108
     * _.get(object, 'a[0].b.c');
13109
     * // => 3
13110
     *
13111
     * _.get(object, ['a', '0', 'b', 'c']);
13112
     * // => 3
13113
     *
13114
     * _.get(object, 'a.b.c', 'default');
13115
     * // => 'default'
13116
     */
13117
    function get(object, path, defaultValue) {
13118
      var result = object == null ? undefined : baseGet(object, path);
13119
      return result === undefined ? defaultValue : result;
13120
    }
13121
13122
    /**
13123
     * Checks if `path` is a direct property of `object`.
13124
     *
13125
     * @static
13126
     * @since 0.1.0
13127
     * @memberOf _
13128
     * @category Object
13129
     * @param {Object} object The object to query.
13130
     * @param {Array|string} path The path to check.
13131
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
13132
     * @example
13133
     *
13134
     * var object = { 'a': { 'b': 2 } };
13135
     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
13136
     *
13137
     * _.has(object, 'a');
13138
     * // => true
13139
     *
13140
     * _.has(object, 'a.b');
13141
     * // => true
13142
     *
13143
     * _.has(object, ['a', 'b']);
13144
     * // => true
13145
     *
13146
     * _.has(other, 'a');
13147
     * // => false
13148
     */
13149
    function has(object, path) {
13150
      return object != null && hasPath(object, path, baseHas);
13151
    }
13152
13153
    /**
13154
     * Checks if `path` is a direct or inherited property of `object`.
13155
     *
13156
     * @static
13157
     * @memberOf _
13158
     * @since 4.0.0
13159
     * @category Object
13160
     * @param {Object} object The object to query.
13161
     * @param {Array|string} path The path to check.
13162
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
13163
     * @example
13164
     *
13165
     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
13166
     *
13167
     * _.hasIn(object, 'a');
13168
     * // => true
13169
     *
13170
     * _.hasIn(object, 'a.b');
13171
     * // => true
13172
     *
13173
     * _.hasIn(object, ['a', 'b']);
13174
     * // => true
13175
     *
13176
     * _.hasIn(object, 'b');
13177
     * // => false
13178
     */
13179
    function hasIn(object, path) {
13180
      return object != null && hasPath(object, path, baseHasIn);
13181
    }
13182
13183
    /**
13184
     * Creates an object composed of the inverted keys and values of `object`.
13185
     * If `object` contains duplicate values, subsequent values overwrite
13186
     * property assignments of previous values.
13187
     *
13188
     * @static
13189
     * @memberOf _
13190
     * @since 0.7.0
13191
     * @category Object
13192
     * @param {Object} object The object to invert.
13193
     * @returns {Object} Returns the new inverted object.
13194
     * @example
13195
     *
13196
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
13197
     *
13198
     * _.invert(object);
13199
     * // => { '1': 'c', '2': 'b' }
13200
     */
13201
    var invert = createInverter(function(result, value, key) {
13202
      if (value != null &&
13203
          typeof value.toString != 'function') {
13204
        value = nativeObjectToString.call(value);
13205
      }
13206
13207
      result[value] = key;
13208
    }, constant(identity));
13209
13210
    /**
13211
     * This method is like `_.invert` except that the inverted object is generated
13212
     * from the results of running each element of `object` thru `iteratee`. The
13213
     * corresponding inverted value of each inverted key is an array of keys
13214
     * responsible for generating the inverted value. The iteratee is invoked
13215
     * with one argument: (value).
13216
     *
13217
     * @static
13218
     * @memberOf _
13219
     * @since 4.1.0
13220
     * @category Object
13221
     * @param {Object} object The object to invert.
13222
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
13223
     * @returns {Object} Returns the new inverted object.
13224
     * @example
13225
     *
13226
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
13227
     *
13228
     * _.invertBy(object);
13229
     * // => { '1': ['a', 'c'], '2': ['b'] }
13230
     *
13231
     * _.invertBy(object, function(value) {
13232
     *   return 'group' + value;
13233
     * });
13234
     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
13235
     */
13236
    var invertBy = createInverter(function(result, value, key) {
13237
      if (value != null &&
13238
          typeof value.toString != 'function') {
13239
        value = nativeObjectToString.call(value);
13240
      }
13241
13242
      if (hasOwnProperty.call(result, value)) {
13243
        result[value].push(key);
13244
      } else {
13245
        result[value] = [key];
13246
      }
13247
    }, getIteratee);
13248
13249
    /**
13250
     * Invokes the method at `path` of `object`.
13251
     *
13252
     * @static
13253
     * @memberOf _
13254
     * @since 4.0.0
13255
     * @category Object
13256
     * @param {Object} object The object to query.
13257
     * @param {Array|string} path The path of the method to invoke.
13258
     * @param {...*} [args] The arguments to invoke the method with.
13259
     * @returns {*} Returns the result of the invoked method.
13260
     * @example
13261
     *
13262
     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
13263
     *
13264
     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
13265
     * // => [2, 3]
13266
     */
13267
    var invoke = baseRest(baseInvoke);
13268
13269
    /**
13270
     * Creates an array of the own enumerable property names of `object`.
13271
     *
13272
     * **Note:** Non-object values are coerced to objects. See the
13273
     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
13274
     * for more details.
13275
     *
13276
     * @static
13277
     * @since 0.1.0
13278
     * @memberOf _
13279
     * @category Object
13280
     * @param {Object} object The object to query.
13281
     * @returns {Array} Returns the array of property names.
13282
     * @example
13283
     *
13284
     * function Foo() {
13285
     *   this.a = 1;
13286
     *   this.b = 2;
13287
     * }
13288
     *
13289
     * Foo.prototype.c = 3;
13290
     *
13291
     * _.keys(new Foo);
13292
     * // => ['a', 'b'] (iteration order is not guaranteed)
13293
     *
13294
     * _.keys('hi');
13295
     * // => ['0', '1']
13296
     */
13297
    function keys(object) {
13298
      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
13299
    }
13300
13301
    /**
13302
     * Creates an array of the own and inherited enumerable property names of `object`.
13303
     *
13304
     * **Note:** Non-object values are coerced to objects.
13305
     *
13306
     * @static
13307
     * @memberOf _
13308
     * @since 3.0.0
13309
     * @category Object
13310
     * @param {Object} object The object to query.
13311
     * @returns {Array} Returns the array of property names.
13312
     * @example
13313
     *
13314
     * function Foo() {
13315
     *   this.a = 1;
13316
     *   this.b = 2;
13317
     * }
13318
     *
13319
     * Foo.prototype.c = 3;
13320
     *
13321
     * _.keysIn(new Foo);
13322
     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
13323
     */
13324
    function keysIn(object) {
13325
      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
13326
    }
13327
13328
    /**
13329
     * The opposite of `_.mapValues`; this method creates an object with the
13330
     * same values as `object` and keys generated by running each own enumerable
13331
     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
13332
     * with three arguments: (value, key, object).
13333
     *
13334
     * @static
13335
     * @memberOf _
13336
     * @since 3.8.0
13337
     * @category Object
13338
     * @param {Object} object The object to iterate over.
13339
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13340
     * @returns {Object} Returns the new mapped object.
13341
     * @see _.mapValues
13342
     * @example
13343
     *
13344
     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
13345
     *   return key + value;
13346
     * });
13347
     * // => { 'a1': 1, 'b2': 2 }
13348
     */
13349
    function mapKeys(object, iteratee) {
13350
      var result = {};
13351
      iteratee = getIteratee(iteratee, 3);
13352
13353
      baseForOwn(object, function(value, key, object) {
13354
        baseAssignValue(result, iteratee(value, key, object), value);
13355
      });
13356
      return result;
13357
    }
13358
13359
    /**
13360
     * Creates an object with the same keys as `object` and values generated
13361
     * by running each own enumerable string keyed property of `object` thru
13362
     * `iteratee`. The iteratee is invoked with three arguments:
13363
     * (value, key, object).
13364
     *
13365
     * @static
13366
     * @memberOf _
13367
     * @since 2.4.0
13368
     * @category Object
13369
     * @param {Object} object The object to iterate over.
13370
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13371
     * @returns {Object} Returns the new mapped object.
13372
     * @see _.mapKeys
13373
     * @example
13374
     *
13375
     * var users = {
13376
     *   'fred':    { 'user': 'fred',    'age': 40 },
13377
     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
13378
     * };
13379
     *
13380
     * _.mapValues(users, function(o) { return o.age; });
13381
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13382
     *
13383
     * // The `_.property` iteratee shorthand.
13384
     * _.mapValues(users, 'age');
13385
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13386
     */
13387
    function mapValues(object, iteratee) {
13388
      var result = {};
13389
      iteratee = getIteratee(iteratee, 3);
13390
13391
      baseForOwn(object, function(value, key, object) {
13392
        baseAssignValue(result, key, iteratee(value, key, object));
13393
      });
13394
      return result;
13395
    }
13396
13397
    /**
13398
     * This method is like `_.assign` except that it recursively merges own and
13399
     * inherited enumerable string keyed properties of source objects into the
13400
     * destination object. Source properties that resolve to `undefined` are
13401
     * skipped if a destination value exists. Array and plain object properties
13402
     * are merged recursively. Other objects and value types are overridden by
13403
     * assignment. Source objects are applied from left to right. Subsequent
13404
     * sources overwrite property assignments of previous sources.
13405
     *
13406
     * **Note:** This method mutates `object`.
13407
     *
13408
     * @static
13409
     * @memberOf _
13410
     * @since 0.5.0
13411
     * @category Object
13412
     * @param {Object} object The destination object.
13413
     * @param {...Object} [sources] The source objects.
13414
     * @returns {Object} Returns `object`.
13415
     * @example
13416
     *
13417
     * var object = {
13418
     *   'a': [{ 'b': 2 }, { 'd': 4 }]
13419
     * };
13420
     *
13421
     * var other = {
13422
     *   'a': [{ 'c': 3 }, { 'e': 5 }]
13423
     * };
13424
     *
13425
     * _.merge(object, other);
13426
     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
13427
     */
13428
    var merge = createAssigner(function(object, source, srcIndex) {
13429
      baseMerge(object, source, srcIndex);
13430
    });
13431
13432
    /**
13433
     * This method is like `_.merge` except that it accepts `customizer` which
13434
     * is invoked to produce the merged values of the destination and source
13435
     * properties. If `customizer` returns `undefined`, merging is handled by the
13436
     * method instead. The `customizer` is invoked with six arguments:
13437
     * (objValue, srcValue, key, object, source, stack).
13438
     *
13439
     * **Note:** This method mutates `object`.
13440
     *
13441
     * @static
13442
     * @memberOf _
13443
     * @since 4.0.0
13444
     * @category Object
13445
     * @param {Object} object The destination object.
13446
     * @param {...Object} sources The source objects.
13447
     * @param {Function} customizer The function to customize assigned values.
13448
     * @returns {Object} Returns `object`.
13449
     * @example
13450
     *
13451
     * function customizer(objValue, srcValue) {
13452
     *   if (_.isArray(objValue)) {
13453
     *     return objValue.concat(srcValue);
13454
     *   }
13455
     * }
13456
     *
13457
     * var object = { 'a': [1], 'b': [2] };
13458
     * var other = { 'a': [3], 'b': [4] };
13459
     *
13460
     * _.mergeWith(object, other, customizer);
13461
     * // => { 'a': [1, 3], 'b': [2, 4] }
13462
     */
13463
    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
13464
      baseMerge(object, source, srcIndex, customizer);
13465
    });
13466
13467
    /**
13468
     * The opposite of `_.pick`; this method creates an object composed of the
13469
     * own and inherited enumerable property paths of `object` that are not omitted.
13470
     *
13471
     * **Note:** This method is considerably slower than `_.pick`.
13472
     *
13473
     * @static
13474
     * @since 0.1.0
13475
     * @memberOf _
13476
     * @category Object
13477
     * @param {Object} object The source object.
13478
     * @param {...(string|string[])} [paths] The property paths to omit.
13479
     * @returns {Object} Returns the new object.
13480
     * @example
13481
     *
13482
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13483
     *
13484
     * _.omit(object, ['a', 'c']);
13485
     * // => { 'b': '2' }
13486
     */
13487
    var omit = flatRest(function(object, paths) {
13488
      var result = {};
13489
      if (object == null) {
13490
        return result;
13491
      }
13492
      var isDeep = false;
13493
      paths = arrayMap(paths, function(path) {
13494
        path = castPath(path, object);
13495
        isDeep || (isDeep = path.length > 1);
13496
        return path;
13497
      });
13498
      copyObject(object, getAllKeysIn(object), result);
13499
      if (isDeep) {
13500
        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
13501
      }
13502
      var length = paths.length;
13503
      while (length--) {
13504
        baseUnset(result, paths[length]);
13505
      }
13506
      return result;
13507
    });
13508
13509
    /**
13510
     * The opposite of `_.pickBy`; this method creates an object composed of
13511
     * the own and inherited enumerable string keyed properties of `object` that
13512
     * `predicate` doesn't return truthy for. The predicate is invoked with two
13513
     * arguments: (value, key).
13514
     *
13515
     * @static
13516
     * @memberOf _
13517
     * @since 4.0.0
13518
     * @category Object
13519
     * @param {Object} object The source object.
13520
     * @param {Function} [predicate=_.identity] The function invoked per property.
13521
     * @returns {Object} Returns the new object.
13522
     * @example
13523
     *
13524
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13525
     *
13526
     * _.omitBy(object, _.isNumber);
13527
     * // => { 'b': '2' }
13528
     */
13529
    function omitBy(object, predicate) {
13530
      return pickBy(object, negate(getIteratee(predicate)));
13531
    }
13532
13533
    /**
13534
     * Creates an object composed of the picked `object` properties.
13535
     *
13536
     * @static
13537
     * @since 0.1.0
13538
     * @memberOf _
13539
     * @category Object
13540
     * @param {Object} object The source object.
13541
     * @param {...(string|string[])} [paths] The property paths to pick.
13542
     * @returns {Object} Returns the new object.
13543
     * @example
13544
     *
13545
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13546
     *
13547
     * _.pick(object, ['a', 'c']);
13548
     * // => { 'a': 1, 'c': 3 }
13549
     */
13550
    var pick = flatRest(function(object, paths) {
13551
      return object == null ? {} : basePick(object, paths);
13552
    });
13553
13554
    /**
13555
     * Creates an object composed of the `object` properties `predicate` returns
13556
     * truthy for. The predicate is invoked with two arguments: (value, key).
13557
     *
13558
     * @static
13559
     * @memberOf _
13560
     * @since 4.0.0
13561
     * @category Object
13562
     * @param {Object} object The source object.
13563
     * @param {Function} [predicate=_.identity] The function invoked per property.
13564
     * @returns {Object} Returns the new object.
13565
     * @example
13566
     *
13567
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13568
     *
13569
     * _.pickBy(object, _.isNumber);
13570
     * // => { 'a': 1, 'c': 3 }
13571
     */
13572
    function pickBy(object, predicate) {
13573
      if (object == null) {
13574
        return {};
13575
      }
13576
      var props = arrayMap(getAllKeysIn(object), function(prop) {
13577
        return [prop];
13578
      });
13579
      predicate = getIteratee(predicate);
13580
      return basePickBy(object, props, function(value, path) {
13581
        return predicate(value, path[0]);
13582
      });
13583
    }
13584
13585
    /**
13586
     * This method is like `_.get` except that if the resolved value is a
13587
     * function it's invoked with the `this` binding of its parent object and
13588
     * its result is returned.
13589
     *
13590
     * @static
13591
     * @since 0.1.0
13592
     * @memberOf _
13593
     * @category Object
13594
     * @param {Object} object The object to query.
13595
     * @param {Array|string} path The path of the property to resolve.
13596
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13597
     * @returns {*} Returns the resolved value.
13598
     * @example
13599
     *
13600
     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
13601
     *
13602
     * _.result(object, 'a[0].b.c1');
13603
     * // => 3
13604
     *
13605
     * _.result(object, 'a[0].b.c2');
13606
     * // => 4
13607
     *
13608
     * _.result(object, 'a[0].b.c3', 'default');
13609
     * // => 'default'
13610
     *
13611
     * _.result(object, 'a[0].b.c3', _.constant('default'));
13612
     * // => 'default'
13613
     */
13614
    function result(object, path, defaultValue) {
13615
      path = castPath(path, object);
13616
13617
      var index = -1,
13618
          length = path.length;
13619
13620
      // Ensure the loop is entered when path is empty.
13621
      if (!length) {
13622
        length = 1;
13623
        object = undefined;
13624
      }
13625
      while (++index < length) {
13626
        var value = object == null ? undefined : object[toKey(path[index])];
13627
        if (value === undefined) {
13628
          index = length;
13629
          value = defaultValue;
13630
        }
13631
        object = isFunction(value) ? value.call(object) : value;
13632
      }
13633
      return object;
13634
    }
13635
13636
    /**
13637
     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
13638
     * it's created. Arrays are created for missing index properties while objects
13639
     * are created for all other missing properties. Use `_.setWith` to customize
13640
     * `path` creation.
13641
     *
13642
     * **Note:** This method mutates `object`.
13643
     *
13644
     * @static
13645
     * @memberOf _
13646
     * @since 3.7.0
13647
     * @category Object
13648
     * @param {Object} object The object to modify.
13649
     * @param {Array|string} path The path of the property to set.
13650
     * @param {*} value The value to set.
13651
     * @returns {Object} Returns `object`.
13652
     * @example
13653
     *
13654
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13655
     *
13656
     * _.set(object, 'a[0].b.c', 4);
13657
     * console.log(object.a[0].b.c);
13658
     * // => 4
13659
     *
13660
     * _.set(object, ['x', '0', 'y', 'z'], 5);
13661
     * console.log(object.x[0].y.z);
13662
     * // => 5
13663
     */
13664
    function set(object, path, value) {
13665
      return object == null ? object : baseSet(object, path, value);
13666
    }
13667
13668
    /**
13669
     * This method is like `_.set` except that it accepts `customizer` which is
13670
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13671
     * path creation is handled by the method instead. The `customizer` is invoked
13672
     * with three arguments: (nsValue, key, nsObject).
13673
     *
13674
     * **Note:** This method mutates `object`.
13675
     *
13676
     * @static
13677
     * @memberOf _
13678
     * @since 4.0.0
13679
     * @category Object
13680
     * @param {Object} object The object to modify.
13681
     * @param {Array|string} path The path of the property to set.
13682
     * @param {*} value The value to set.
13683
     * @param {Function} [customizer] The function to customize assigned values.
13684
     * @returns {Object} Returns `object`.
13685
     * @example
13686
     *
13687
     * var object = {};
13688
     *
13689
     * _.setWith(object, '[0][1]', 'a', Object);
13690
     * // => { '0': { '1': 'a' } }
13691
     */
13692
    function setWith(object, path, value, customizer) {
13693
      customizer = typeof customizer == 'function' ? customizer : undefined;
13694
      return object == null ? object : baseSet(object, path, value, customizer);
13695
    }
13696
13697
    /**
13698
     * Creates an array of own enumerable string keyed-value pairs for `object`
13699
     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
13700
     * entries are returned.
13701
     *
13702
     * @static
13703
     * @memberOf _
13704
     * @since 4.0.0
13705
     * @alias entries
13706
     * @category Object
13707
     * @param {Object} object The object to query.
13708
     * @returns {Array} Returns the key-value pairs.
13709
     * @example
13710
     *
13711
     * function Foo() {
13712
     *   this.a = 1;
13713
     *   this.b = 2;
13714
     * }
13715
     *
13716
     * Foo.prototype.c = 3;
13717
     *
13718
     * _.toPairs(new Foo);
13719
     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
13720
     */
13721
    var toPairs = createToPairs(keys);
13722
13723
    /**
13724
     * Creates an array of own and inherited enumerable string keyed-value pairs
13725
     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
13726
     * or set, its entries are returned.
13727
     *
13728
     * @static
13729
     * @memberOf _
13730
     * @since 4.0.0
13731
     * @alias entriesIn
13732
     * @category Object
13733
     * @param {Object} object The object to query.
13734
     * @returns {Array} Returns the key-value pairs.
13735
     * @example
13736
     *
13737
     * function Foo() {
13738
     *   this.a = 1;
13739
     *   this.b = 2;
13740
     * }
13741
     *
13742
     * Foo.prototype.c = 3;
13743
     *
13744
     * _.toPairsIn(new Foo);
13745
     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
13746
     */
13747
    var toPairsIn = createToPairs(keysIn);
13748
13749
    /**
13750
     * An alternative to `_.reduce`; this method transforms `object` to a new
13751
     * `accumulator` object which is the result of running each of its own
13752
     * enumerable string keyed properties thru `iteratee`, with each invocation
13753
     * potentially mutating the `accumulator` object. If `accumulator` is not
13754
     * provided, a new object with the same `[[Prototype]]` will be used. The
13755
     * iteratee is invoked with four arguments: (accumulator, value, key, object).
13756
     * Iteratee functions may exit iteration early by explicitly returning `false`.
13757
     *
13758
     * @static
13759
     * @memberOf _
13760
     * @since 1.3.0
13761
     * @category Object
13762
     * @param {Object} object The object to iterate over.
13763
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13764
     * @param {*} [accumulator] The custom accumulator value.
13765
     * @returns {*} Returns the accumulated value.
13766
     * @example
13767
     *
13768
     * _.transform([2, 3, 4], function(result, n) {
13769
     *   result.push(n *= n);
13770
     *   return n % 2 == 0;
13771
     * }, []);
13772
     * // => [4, 9]
13773
     *
13774
     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
13775
     *   (result[value] || (result[value] = [])).push(key);
13776
     * }, {});
13777
     * // => { '1': ['a', 'c'], '2': ['b'] }
13778
     */
13779
    function transform(object, iteratee, accumulator) {
13780
      var isArr = isArray(object),
13781
          isArrLike = isArr || isBuffer(object) || isTypedArray(object);
13782
13783
      iteratee = getIteratee(iteratee, 4);
13784
      if (accumulator == null) {
13785
        var Ctor = object && object.constructor;
13786
        if (isArrLike) {
13787
          accumulator = isArr ? new Ctor : [];
13788
        }
13789
        else if (isObject(object)) {
13790
          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
13791
        }
13792
        else {
13793
          accumulator = {};
13794
        }
13795
      }
13796
      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
13797
        return iteratee(accumulator, value, index, object);
13798
      });
13799
      return accumulator;
13800
    }
13801
13802
    /**
13803
     * Removes the property at `path` of `object`.
13804
     *
13805
     * **Note:** This method mutates `object`.
13806
     *
13807
     * @static
13808
     * @memberOf _
13809
     * @since 4.0.0
13810
     * @category Object
13811
     * @param {Object} object The object to modify.
13812
     * @param {Array|string} path The path of the property to unset.
13813
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
13814
     * @example
13815
     *
13816
     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
13817
     * _.unset(object, 'a[0].b.c');
13818
     * // => true
13819
     *
13820
     * console.log(object);
13821
     * // => { 'a': [{ 'b': {} }] };
13822
     *
13823
     * _.unset(object, ['a', '0', 'b', 'c']);
13824
     * // => true
13825
     *
13826
     * console.log(object);
13827
     * // => { 'a': [{ 'b': {} }] };
13828
     */
13829
    function unset(object, path) {
13830
      return object == null ? true : baseUnset(object, path);
13831
    }
13832
13833
    /**
13834
     * This method is like `_.set` except that accepts `updater` to produce the
13835
     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
13836
     * is invoked with one argument: (value).
13837
     *
13838
     * **Note:** This method mutates `object`.
13839
     *
13840
     * @static
13841
     * @memberOf _
13842
     * @since 4.6.0
13843
     * @category Object
13844
     * @param {Object} object The object to modify.
13845
     * @param {Array|string} path The path of the property to set.
13846
     * @param {Function} updater The function to produce the updated value.
13847
     * @returns {Object} Returns `object`.
13848
     * @example
13849
     *
13850
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13851
     *
13852
     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
13853
     * console.log(object.a[0].b.c);
13854
     * // => 9
13855
     *
13856
     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
13857
     * console.log(object.x[0].y.z);
13858
     * // => 0
13859
     */
13860
    function update(object, path, updater) {
13861
      return object == null ? object : baseUpdate(object, path, castFunction(updater));
13862
    }
13863
13864
    /**
13865
     * This method is like `_.update` except that it accepts `customizer` which is
13866
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13867
     * path creation is handled by the method instead. The `customizer` is invoked
13868
     * with three arguments: (nsValue, key, nsObject).
13869
     *
13870
     * **Note:** This method mutates `object`.
13871
     *
13872
     * @static
13873
     * @memberOf _
13874
     * @since 4.6.0
13875
     * @category Object
13876
     * @param {Object} object The object to modify.
13877
     * @param {Array|string} path The path of the property to set.
13878
     * @param {Function} updater The function to produce the updated value.
13879
     * @param {Function} [customizer] The function to customize assigned values.
13880
     * @returns {Object} Returns `object`.
13881
     * @example
13882
     *
13883
     * var object = {};
13884
     *
13885
     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
13886
     * // => { '0': { '1': 'a' } }
13887
     */
13888
    function updateWith(object, path, updater, customizer) {
13889
      customizer = typeof customizer == 'function' ? customizer : undefined;
13890
      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
13891
    }
13892
13893
    /**
13894
     * Creates an array of the own enumerable string keyed property values of `object`.
13895
     *
13896
     * **Note:** Non-object values are coerced to objects.
13897
     *
13898
     * @static
13899
     * @since 0.1.0
13900
     * @memberOf _
13901
     * @category Object
13902
     * @param {Object} object The object to query.
13903
     * @returns {Array} Returns the array of property values.
13904
     * @example
13905
     *
13906
     * function Foo() {
13907
     *   this.a = 1;
13908
     *   this.b = 2;
13909
     * }
13910
     *
13911
     * Foo.prototype.c = 3;
13912
     *
13913
     * _.values(new Foo);
13914
     * // => [1, 2] (iteration order is not guaranteed)
13915
     *
13916
     * _.values('hi');
13917
     * // => ['h', 'i']
13918
     */
13919
    function values(object) {
13920
      return object == null ? [] : baseValues(object, keys(object));
13921
    }
13922
13923
    /**
13924
     * Creates an array of the own and inherited enumerable string keyed property
13925
     * values of `object`.
13926
     *
13927
     * **Note:** Non-object values are coerced to objects.
13928
     *
13929
     * @static
13930
     * @memberOf _
13931
     * @since 3.0.0
13932
     * @category Object
13933
     * @param {Object} object The object to query.
13934
     * @returns {Array} Returns the array of property values.
13935
     * @example
13936
     *
13937
     * function Foo() {
13938
     *   this.a = 1;
13939
     *   this.b = 2;
13940
     * }
13941
     *
13942
     * Foo.prototype.c = 3;
13943
     *
13944
     * _.valuesIn(new Foo);
13945
     * // => [1, 2, 3] (iteration order is not guaranteed)
13946
     */
13947
    function valuesIn(object) {
13948
      return object == null ? [] : baseValues(object, keysIn(object));
13949
    }
13950
13951
    /*------------------------------------------------------------------------*/
13952
13953
    /**
13954
     * Clamps `number` within the inclusive `lower` and `upper` bounds.
13955
     *
13956
     * @static
13957
     * @memberOf _
13958
     * @since 4.0.0
13959
     * @category Number
13960
     * @param {number} number The number to clamp.
13961
     * @param {number} [lower] The lower bound.
13962
     * @param {number} upper The upper bound.
13963
     * @returns {number} Returns the clamped number.
13964
     * @example
13965
     *
13966
     * _.clamp(-10, -5, 5);
13967
     * // => -5
13968
     *
13969
     * _.clamp(10, -5, 5);
13970
     * // => 5
13971
     */
13972
    function clamp(number, lower, upper) {
13973
      if (upper === undefined) {
13974
        upper = lower;
13975
        lower = undefined;
13976
      }
13977
      if (upper !== undefined) {
13978
        upper = toNumber(upper);
13979
        upper = upper === upper ? upper : 0;
13980
      }
13981
      if (lower !== undefined) {
13982
        lower = toNumber(lower);
13983
        lower = lower === lower ? lower : 0;
13984
      }
13985
      return baseClamp(toNumber(number), lower, upper);
13986
    }
13987
13988
    /**
13989
     * Checks if `n` is between `start` and up to, but not including, `end`. If
13990
     * `end` is not specified, it's set to `start` with `start` then set to `0`.
13991
     * If `start` is greater than `end` the params are swapped to support
13992
     * negative ranges.
13993
     *
13994
     * @static
13995
     * @memberOf _
13996
     * @since 3.3.0
13997
     * @category Number
13998
     * @param {number} number The number to check.
13999
     * @param {number} [start=0] The start of the range.
14000
     * @param {number} end The end of the range.
14001
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
14002
     * @see _.range, _.rangeRight
14003
     * @example
14004
     *
14005
     * _.inRange(3, 2, 4);
14006
     * // => true
14007
     *
14008
     * _.inRange(4, 8);
14009
     * // => true
14010
     *
14011
     * _.inRange(4, 2);
14012
     * // => false
14013
     *
14014
     * _.inRange(2, 2);
14015
     * // => false
14016
     *
14017
     * _.inRange(1.2, 2);
14018
     * // => true
14019
     *
14020
     * _.inRange(5.2, 4);
14021
     * // => false
14022
     *
14023
     * _.inRange(-3, -2, -6);
14024
     * // => true
14025
     */
14026
    function inRange(number, start, end) {
14027
      start = toFinite(start);
14028
      if (end === undefined) {
14029
        end = start;
14030
        start = 0;
14031
      } else {
14032
        end = toFinite(end);
14033
      }
14034
      number = toNumber(number);
14035
      return baseInRange(number, start, end);
14036
    }
14037
14038
    /**
14039
     * Produces a random number between the inclusive `lower` and `upper` bounds.
14040
     * If only one argument is provided a number between `0` and the given number
14041
     * is returned. If `floating` is `true`, or either `lower` or `upper` are
14042
     * floats, a floating-point number is returned instead of an integer.
14043
     *
14044
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
14045
     * floating-point values which can produce unexpected results.
14046
     *
14047
     * @static
14048
     * @memberOf _
14049
     * @since 0.7.0
14050
     * @category Number
14051
     * @param {number} [lower=0] The lower bound.
14052
     * @param {number} [upper=1] The upper bound.
14053
     * @param {boolean} [floating] Specify returning a floating-point number.
14054
     * @returns {number} Returns the random number.
14055
     * @example
14056
     *
14057
     * _.random(0, 5);
14058
     * // => an integer between 0 and 5
14059
     *
14060
     * _.random(5);
14061
     * // => also an integer between 0 and 5
14062
     *
14063
     * _.random(5, true);
14064
     * // => a floating-point number between 0 and 5
14065
     *
14066
     * _.random(1.2, 5.2);
14067
     * // => a floating-point number between 1.2 and 5.2
14068
     */
14069
    function random(lower, upper, floating) {
14070
      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
14071
        upper = floating = undefined;
14072
      }
14073
      if (floating === undefined) {
14074
        if (typeof upper == 'boolean') {
14075
          floating = upper;
14076
          upper = undefined;
14077
        }
14078
        else if (typeof lower == 'boolean') {
14079
          floating = lower;
14080
          lower = undefined;
14081
        }
14082
      }
14083
      if (lower === undefined && upper === undefined) {
14084
        lower = 0;
14085
        upper = 1;
14086
      }
14087
      else {
14088
        lower = toFinite(lower);
14089
        if (upper === undefined) {
14090
          upper = lower;
14091
          lower = 0;
14092
        } else {
14093
          upper = toFinite(upper);
14094
        }
14095
      }
14096
      if (lower > upper) {
14097
        var temp = lower;
14098
        lower = upper;
14099
        upper = temp;
14100
      }
14101
      if (floating || lower % 1 || upper % 1) {
14102
        var rand = nativeRandom();
14103
        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
14104
      }
14105
      return baseRandom(lower, upper);
14106
    }
14107
14108
    /*------------------------------------------------------------------------*/
14109
14110
    /**
14111
     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
14112
     *
14113
     * @static
14114
     * @memberOf _
14115
     * @since 3.0.0
14116
     * @category String
14117
     * @param {string} [string=''] The string to convert.
14118
     * @returns {string} Returns the camel cased string.
14119
     * @example
14120
     *
14121
     * _.camelCase('Foo Bar');
14122
     * // => 'fooBar'
14123
     *
14124
     * _.camelCase('--foo-bar--');
14125
     * // => 'fooBar'
14126
     *
14127
     * _.camelCase('__FOO_BAR__');
14128
     * // => 'fooBar'
14129
     */
14130
    var camelCase = createCompounder(function(result, word, index) {
14131
      word = word.toLowerCase();
14132
      return result + (index ? capitalize(word) : word);
14133
    });
14134
14135
    /**
14136
     * Converts the first character of `string` to upper case and the remaining
14137
     * to lower case.
14138
     *
14139
     * @static
14140
     * @memberOf _
14141
     * @since 3.0.0
14142
     * @category String
14143
     * @param {string} [string=''] The string to capitalize.
14144
     * @returns {string} Returns the capitalized string.
14145
     * @example
14146
     *
14147
     * _.capitalize('FRED');
14148
     * // => 'Fred'
14149
     */
14150
    function capitalize(string) {
14151
      return upperFirst(toString(string).toLowerCase());
14152
    }
14153
14154
    /**
14155
     * Deburrs `string` by converting
14156
     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
14157
     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
14158
     * letters to basic Latin letters and removing
14159
     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
14160
     *
14161
     * @static
14162
     * @memberOf _
14163
     * @since 3.0.0
14164
     * @category String
14165
     * @param {string} [string=''] The string to deburr.
14166
     * @returns {string} Returns the deburred string.
14167
     * @example
14168
     *
14169
     * _.deburr('déjà vu');
14170
     * // => 'deja vu'
14171
     */
14172
    function deburr(string) {
14173
      string = toString(string);
14174
      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
14175
    }
14176
14177
    /**
14178
     * Checks if `string` ends with the given target string.
14179
     *
14180
     * @static
14181
     * @memberOf _
14182
     * @since 3.0.0
14183
     * @category String
14184
     * @param {string} [string=''] The string to inspect.
14185
     * @param {string} [target] The string to search for.
14186
     * @param {number} [position=string.length] The position to search up to.
14187
     * @returns {boolean} Returns `true` if `string` ends with `target`,
14188
     *  else `false`.
14189
     * @example
14190
     *
14191
     * _.endsWith('abc', 'c');
14192
     * // => true
14193
     *
14194
     * _.endsWith('abc', 'b');
14195
     * // => false
14196
     *
14197
     * _.endsWith('abc', 'b', 2);
14198
     * // => true
14199
     */
14200
    function endsWith(string, target, position) {
14201
      string = toString(string);
14202
      target = baseToString(target);
14203
14204
      var length = string.length;
14205
      position = position === undefined
14206
        ? length
14207
        : baseClamp(toInteger(position), 0, length);
14208
14209
      var end = position;
14210
      position -= target.length;
14211
      return position >= 0 && string.slice(position, end) == target;
14212
    }
14213
14214
    /**
14215
     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
14216
     * corresponding HTML entities.
14217
     *
14218
     * **Note:** No other characters are escaped. To escape additional
14219
     * characters use a third-party library like [_he_](https://mths.be/he).
14220
     *
14221
     * Though the ">" character is escaped for symmetry, characters like
14222
     * ">" and "/" don't need escaping in HTML and have no special meaning
14223
     * unless they're part of a tag or unquoted attribute value. See
14224
     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
14225
     * (under "semi-related fun fact") for more details.
14226
     *
14227
     * When working with HTML you should always
14228
     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
14229
     * XSS vectors.
14230
     *
14231
     * @static
14232
     * @since 0.1.0
14233
     * @memberOf _
14234
     * @category String
14235
     * @param {string} [string=''] The string to escape.
14236
     * @returns {string} Returns the escaped string.
14237
     * @example
14238
     *
14239
     * _.escape('fred, barney, & pebbles');
14240
     * // => 'fred, barney, &amp; pebbles'
14241
     */
14242
    function escape(string) {
14243
      string = toString(string);
14244
      return (string && reHasUnescapedHtml.test(string))
14245
        ? string.replace(reUnescapedHtml, escapeHtmlChar)
14246
        : string;
14247
    }
14248
14249
    /**
14250
     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
14251
     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
14252
     *
14253
     * @static
14254
     * @memberOf _
14255
     * @since 3.0.0
14256
     * @category String
14257
     * @param {string} [string=''] The string to escape.
14258
     * @returns {string} Returns the escaped string.
14259
     * @example
14260
     *
14261
     * _.escapeRegExp('[lodash](https://lodash.com/)');
14262
     * // => '\[lodash\]\(https://lodash\.com/\)'
14263
     */
14264
    function escapeRegExp(string) {
14265
      string = toString(string);
14266
      return (string && reHasRegExpChar.test(string))
14267
        ? string.replace(reRegExpChar, '\\$&')
14268
        : string;
14269
    }
14270
14271
    /**
14272
     * Converts `string` to
14273
     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
14274
     *
14275
     * @static
14276
     * @memberOf _
14277
     * @since 3.0.0
14278
     * @category String
14279
     * @param {string} [string=''] The string to convert.
14280
     * @returns {string} Returns the kebab cased string.
14281
     * @example
14282
     *
14283
     * _.kebabCase('Foo Bar');
14284
     * // => 'foo-bar'
14285
     *
14286
     * _.kebabCase('fooBar');
14287
     * // => 'foo-bar'
14288
     *
14289
     * _.kebabCase('__FOO_BAR__');
14290
     * // => 'foo-bar'
14291
     */
14292
    var kebabCase = createCompounder(function(result, word, index) {
14293
      return result + (index ? '-' : '') + word.toLowerCase();
14294
    });
14295
14296
    /**
14297
     * Converts `string`, as space separated words, to lower case.
14298
     *
14299
     * @static
14300
     * @memberOf _
14301
     * @since 4.0.0
14302
     * @category String
14303
     * @param {string} [string=''] The string to convert.
14304
     * @returns {string} Returns the lower cased string.
14305
     * @example
14306
     *
14307
     * _.lowerCase('--Foo-Bar--');
14308
     * // => 'foo bar'
14309
     *
14310
     * _.lowerCase('fooBar');
14311
     * // => 'foo bar'
14312
     *
14313
     * _.lowerCase('__FOO_BAR__');
14314
     * // => 'foo bar'
14315
     */
14316
    var lowerCase = createCompounder(function(result, word, index) {
14317
      return result + (index ? ' ' : '') + word.toLowerCase();
14318
    });
14319
14320
    /**
14321
     * Converts the first character of `string` to lower case.
14322
     *
14323
     * @static
14324
     * @memberOf _
14325
     * @since 4.0.0
14326
     * @category String
14327
     * @param {string} [string=''] The string to convert.
14328
     * @returns {string} Returns the converted string.
14329
     * @example
14330
     *
14331
     * _.lowerFirst('Fred');
14332
     * // => 'fred'
14333
     *
14334
     * _.lowerFirst('FRED');
14335
     * // => 'fRED'
14336
     */
14337
    var lowerFirst = createCaseFirst('toLowerCase');
14338
14339
    /**
14340
     * Pads `string` on the left and right sides if it's shorter than `length`.
14341
     * Padding characters are truncated if they can't be evenly divided by `length`.
14342
     *
14343
     * @static
14344
     * @memberOf _
14345
     * @since 3.0.0
14346
     * @category String
14347
     * @param {string} [string=''] The string to pad.
14348
     * @param {number} [length=0] The padding length.
14349
     * @param {string} [chars=' '] The string used as padding.
14350
     * @returns {string} Returns the padded string.
14351
     * @example
14352
     *
14353
     * _.pad('abc', 8);
14354
     * // => '  abc   '
14355
     *
14356
     * _.pad('abc', 8, '_-');
14357
     * // => '_-abc_-_'
14358
     *
14359
     * _.pad('abc', 3);
14360
     * // => 'abc'
14361
     */
14362
    function pad(string, length, chars) {
14363
      string = toString(string);
14364
      length = toInteger(length);
14365
14366
      var strLength = length ? stringSize(string) : 0;
14367
      if (!length || strLength >= length) {
14368
        return string;
14369
      }
14370
      var mid = (length - strLength) / 2;
14371
      return (
14372
        createPadding(nativeFloor(mid), chars) +
14373
        string +
14374
        createPadding(nativeCeil(mid), chars)
14375
      );
14376
    }
14377
14378
    /**
14379
     * Pads `string` on the right side if it's shorter than `length`. Padding
14380
     * characters are truncated if they exceed `length`.
14381
     *
14382
     * @static
14383
     * @memberOf _
14384
     * @since 4.0.0
14385
     * @category String
14386
     * @param {string} [string=''] The string to pad.
14387
     * @param {number} [length=0] The padding length.
14388
     * @param {string} [chars=' '] The string used as padding.
14389
     * @returns {string} Returns the padded string.
14390
     * @example
14391
     *
14392
     * _.padEnd('abc', 6);
14393
     * // => 'abc   '
14394
     *
14395
     * _.padEnd('abc', 6, '_-');
14396
     * // => 'abc_-_'
14397
     *
14398
     * _.padEnd('abc', 3);
14399
     * // => 'abc'
14400
     */
14401
    function padEnd(string, length, chars) {
14402
      string = toString(string);
14403
      length = toInteger(length);
14404
14405
      var strLength = length ? stringSize(string) : 0;
14406
      return (length && strLength < length)
14407
        ? (string + createPadding(length - strLength, chars))
14408
        : string;
14409
    }
14410
14411
    /**
14412
     * Pads `string` on the left side if it's shorter than `length`. Padding
14413
     * characters are truncated if they exceed `length`.
14414
     *
14415
     * @static
14416
     * @memberOf _
14417
     * @since 4.0.0
14418
     * @category String
14419
     * @param {string} [string=''] The string to pad.
14420
     * @param {number} [length=0] The padding length.
14421
     * @param {string} [chars=' '] The string used as padding.
14422
     * @returns {string} Returns the padded string.
14423
     * @example
14424
     *
14425
     * _.padStart('abc', 6);
14426
     * // => '   abc'
14427
     *
14428
     * _.padStart('abc', 6, '_-');
14429
     * // => '_-_abc'
14430
     *
14431
     * _.padStart('abc', 3);
14432
     * // => 'abc'
14433
     */
14434
    function padStart(string, length, chars) {
14435
      string = toString(string);
14436
      length = toInteger(length);
14437
14438
      var strLength = length ? stringSize(string) : 0;
14439
      return (length && strLength < length)
14440
        ? (createPadding(length - strLength, chars) + string)
14441
        : string;
14442
    }
14443
14444
    /**
14445
     * Converts `string` to an integer of the specified radix. If `radix` is
14446
     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
14447
     * hexadecimal, in which case a `radix` of `16` is used.
14448
     *
14449
     * **Note:** This method aligns with the
14450
     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
14451
     *
14452
     * @static
14453
     * @memberOf _
14454
     * @since 1.1.0
14455
     * @category String
14456
     * @param {string} string The string to convert.
14457
     * @param {number} [radix=10] The radix to interpret `value` by.
14458
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14459
     * @returns {number} Returns the converted integer.
14460
     * @example
14461
     *
14462
     * _.parseInt('08');
14463
     * // => 8
14464
     *
14465
     * _.map(['6', '08', '10'], _.parseInt);
14466
     * // => [6, 8, 10]
14467
     */
14468
    function parseInt(string, radix, guard) {
14469
      if (guard || radix == null) {
14470
        radix = 0;
14471
      } else if (radix) {
14472
        radix = +radix;
14473
      }
14474
      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
14475
    }
14476
14477
    /**
14478
     * Repeats the given string `n` times.
14479
     *
14480
     * @static
14481
     * @memberOf _
14482
     * @since 3.0.0
14483
     * @category String
14484
     * @param {string} [string=''] The string to repeat.
14485
     * @param {number} [n=1] The number of times to repeat the string.
14486
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14487
     * @returns {string} Returns the repeated string.
14488
     * @example
14489
     *
14490
     * _.repeat('*', 3);
14491
     * // => '***'
14492
     *
14493
     * _.repeat('abc', 2);
14494
     * // => 'abcabc'
14495
     *
14496
     * _.repeat('abc', 0);
14497
     * // => ''
14498
     */
14499
    function repeat(string, n, guard) {
14500
      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
14501
        n = 1;
14502
      } else {
14503
        n = toInteger(n);
14504
      }
14505
      return baseRepeat(toString(string), n);
14506
    }
14507
14508
    /**
14509
     * Replaces matches for `pattern` in `string` with `replacement`.
14510
     *
14511
     * **Note:** This method is based on
14512
     * [`String#replace`](https://mdn.io/String/replace).
14513
     *
14514
     * @static
14515
     * @memberOf _
14516
     * @since 4.0.0
14517
     * @category String
14518
     * @param {string} [string=''] The string to modify.
14519
     * @param {RegExp|string} pattern The pattern to replace.
14520
     * @param {Function|string} replacement The match replacement.
14521
     * @returns {string} Returns the modified string.
14522
     * @example
14523
     *
14524
     * _.replace('Hi Fred', 'Fred', 'Barney');
14525
     * // => 'Hi Barney'
14526
     */
14527
    function replace() {
14528
      var args = arguments,
14529
          string = toString(args[0]);
14530
14531
      return args.length < 3 ? string : string.replace(args[1], args[2]);
14532
    }
14533
14534
    /**
14535
     * Converts `string` to
14536
     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
14537
     *
14538
     * @static
14539
     * @memberOf _
14540
     * @since 3.0.0
14541
     * @category String
14542
     * @param {string} [string=''] The string to convert.
14543
     * @returns {string} Returns the snake cased string.
14544
     * @example
14545
     *
14546
     * _.snakeCase('Foo Bar');
14547
     * // => 'foo_bar'
14548
     *
14549
     * _.snakeCase('fooBar');
14550
     * // => 'foo_bar'
14551
     *
14552
     * _.snakeCase('--FOO-BAR--');
14553
     * // => 'foo_bar'
14554
     */
14555
    var snakeCase = createCompounder(function(result, word, index) {
14556
      return result + (index ? '_' : '') + word.toLowerCase();
14557
    });
14558
14559
    /**
14560
     * Splits `string` by `separator`.
14561
     *
14562
     * **Note:** This method is based on
14563
     * [`String#split`](https://mdn.io/String/split).
14564
     *
14565
     * @static
14566
     * @memberOf _
14567
     * @since 4.0.0
14568
     * @category String
14569
     * @param {string} [string=''] The string to split.
14570
     * @param {RegExp|string} separator The separator pattern to split by.
14571
     * @param {number} [limit] The length to truncate results to.
14572
     * @returns {Array} Returns the string segments.
14573
     * @example
14574
     *
14575
     * _.split('a-b-c', '-', 2);
14576
     * // => ['a', 'b']
14577
     */
14578
    function split(string, separator, limit) {
14579
      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
14580
        separator = limit = undefined;
14581
      }
14582
      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
14583
      if (!limit) {
14584
        return [];
14585
      }
14586
      string = toString(string);
14587
      if (string && (
14588
            typeof separator == 'string' ||
14589
            (separator != null && !isRegExp(separator))
14590
          )) {
14591
        separator = baseToString(separator);
14592
        if (!separator && hasUnicode(string)) {
14593
          return castSlice(stringToArray(string), 0, limit);
14594
        }
14595
      }
14596
      return string.split(separator, limit);
14597
    }
14598
14599
    /**
14600
     * Converts `string` to
14601
     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
14602
     *
14603
     * @static
14604
     * @memberOf _
14605
     * @since 3.1.0
14606
     * @category String
14607
     * @param {string} [string=''] The string to convert.
14608
     * @returns {string} Returns the start cased string.
14609
     * @example
14610
     *
14611
     * _.startCase('--foo-bar--');
14612
     * // => 'Foo Bar'
14613
     *
14614
     * _.startCase('fooBar');
14615
     * // => 'Foo Bar'
14616
     *
14617
     * _.startCase('__FOO_BAR__');
14618
     * // => 'FOO BAR'
14619
     */
14620
    var startCase = createCompounder(function(result, word, index) {
14621
      return result + (index ? ' ' : '') + upperFirst(word);
14622
    });
14623
14624
    /**
14625
     * Checks if `string` starts with the given target string.
14626
     *
14627
     * @static
14628
     * @memberOf _
14629
     * @since 3.0.0
14630
     * @category String
14631
     * @param {string} [string=''] The string to inspect.
14632
     * @param {string} [target] The string to search for.
14633
     * @param {number} [position=0] The position to search from.
14634
     * @returns {boolean} Returns `true` if `string` starts with `target`,
14635
     *  else `false`.
14636
     * @example
14637
     *
14638
     * _.startsWith('abc', 'a');
14639
     * // => true
14640
     *
14641
     * _.startsWith('abc', 'b');
14642
     * // => false
14643
     *
14644
     * _.startsWith('abc', 'b', 1);
14645
     * // => true
14646
     */
14647
    function startsWith(string, target, position) {
14648
      string = toString(string);
14649
      position = position == null
14650
        ? 0
14651
        : baseClamp(toInteger(position), 0, string.length);
14652
14653
      target = baseToString(target);
14654
      return string.slice(position, position + target.length) == target;
14655
    }
14656
14657
    /**
14658
     * Creates a compiled template function that can interpolate data properties
14659
     * in "interpolate" delimiters, HTML-escape interpolated data properties in
14660
     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
14661
     * properties may be accessed as free variables in the template. If a setting
14662
     * object is given, it takes precedence over `_.templateSettings` values.
14663
     *
14664
     * **Note:** In the development build `_.template` utilizes
14665
     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
14666
     * for easier debugging.
14667
     *
14668
     * For more information on precompiling templates see
14669
     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
14670
     *
14671
     * For more information on Chrome extension sandboxes see
14672
     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
14673
     *
14674
     * @static
14675
     * @since 0.1.0
14676
     * @memberOf _
14677
     * @category String
14678
     * @param {string} [string=''] The template string.
14679
     * @param {Object} [options={}] The options object.
14680
     * @param {RegExp} [options.escape=_.templateSettings.escape]
14681
     *  The HTML "escape" delimiter.
14682
     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
14683
     *  The "evaluate" delimiter.
14684
     * @param {Object} [options.imports=_.templateSettings.imports]
14685
     *  An object to import into the template as free variables.
14686
     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
14687
     *  The "interpolate" delimiter.
14688
     * @param {string} [options.sourceURL='lodash.templateSources[n]']
14689
     *  The sourceURL of the compiled template.
14690
     * @param {string} [options.variable='obj']
14691
     *  The data object variable name.
14692
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14693
     * @returns {Function} Returns the compiled template function.
14694
     * @example
14695
     *
14696
     * // Use the "interpolate" delimiter to create a compiled template.
14697
     * var compiled = _.template('hello <%= user %>!');
14698
     * compiled({ 'user': 'fred' });
14699
     * // => 'hello fred!'
14700
     *
14701
     * // Use the HTML "escape" delimiter to escape data property values.
14702
     * var compiled = _.template('<b><%- value %></b>');
14703
     * compiled({ 'value': '<script>' });
14704
     * // => '<b>&lt;script&gt;</b>'
14705
     *
14706
     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
14707
     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
14708
     * compiled({ 'users': ['fred', 'barney'] });
14709
     * // => '<li>fred</li><li>barney</li>'
14710
     *
14711
     * // Use the internal `print` function in "evaluate" delimiters.
14712
     * var compiled = _.template('<% print("hello " + user); %>!');
14713
     * compiled({ 'user': 'barney' });
14714
     * // => 'hello barney!'
14715
     *
14716
     * // Use the ES template literal delimiter as an "interpolate" delimiter.
14717
     * // Disable support by replacing the "interpolate" delimiter.
14718
     * var compiled = _.template('hello ${ user }!');
14719
     * compiled({ 'user': 'pebbles' });
14720
     * // => 'hello pebbles!'
14721
     *
14722
     * // Use backslashes to treat delimiters as plain text.
14723
     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
14724
     * compiled({ 'value': 'ignored' });
14725
     * // => '<%- value %>'
14726
     *
14727
     * // Use the `imports` option to import `jQuery` as `jq`.
14728
     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
14729
     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
14730
     * compiled({ 'users': ['fred', 'barney'] });
14731
     * // => '<li>fred</li><li>barney</li>'
14732
     *
14733
     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
14734
     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
14735
     * compiled(data);
14736
     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
14737
     *
14738
     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
14739
     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
14740
     * compiled.source;
14741
     * // => function(data) {
14742
     * //   var __t, __p = '';
14743
     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
14744
     * //   return __p;
14745
     * // }
14746
     *
14747
     * // Use custom template delimiters.
14748
     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
14749
     * var compiled = _.template('hello {{ user }}!');
14750
     * compiled({ 'user': 'mustache' });
14751
     * // => 'hello mustache!'
14752
     *
14753
     * // Use the `source` property to inline compiled templates for meaningful
14754
     * // line numbers in error messages and stack traces.
14755
     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
14756
     *   var JST = {\
14757
     *     "main": ' + _.template(mainText).source + '\
14758
     *   };\
14759
     * ');
14760
     */
14761
    function template(string, options, guard) {
14762
      // Based on John Resig's `tmpl` implementation
14763
      // (http://ejohn.org/blog/javascript-micro-templating/)
14764
      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
14765
      var settings = lodash.templateSettings;
14766
14767
      if (guard && isIterateeCall(string, options, guard)) {
14768
        options = undefined;
14769
      }
14770
      string = toString(string);
14771
      options = assignInWith({}, options, settings, customDefaultsAssignIn);
14772
14773
      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
14774
          importsKeys = keys(imports),
14775
          importsValues = baseValues(imports, importsKeys);
14776
14777
      var isEscaping,
14778
          isEvaluating,
14779
          index = 0,
14780
          interpolate = options.interpolate || reNoMatch,
14781
          source = "__p += '";
14782
14783
      // Compile the regexp to match each delimiter.
14784
      var reDelimiters = RegExp(
14785
        (options.escape || reNoMatch).source + '|' +
14786
        interpolate.source + '|' +
14787
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
14788
        (options.evaluate || reNoMatch).source + '|$'
14789
      , 'g');
14790
14791
      // Use a sourceURL for easier debugging.
14792
      var sourceURL = '//# sourceURL=' +
14793
        ('sourceURL' in options
14794
          ? options.sourceURL
14795
          : ('lodash.templateSources[' + (++templateCounter) + ']')
14796
        ) + '\n';
14797
14798
      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
14799
        interpolateValue || (interpolateValue = esTemplateValue);
14800
14801
        // Escape characters that can't be included in string literals.
14802
        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
14803
14804
        // Replace delimiters with snippets.
14805
        if (escapeValue) {
14806
          isEscaping = true;
14807
          source += "' +\n__e(" + escapeValue + ") +\n'";
14808
        }
14809
        if (evaluateValue) {
14810
          isEvaluating = true;
14811
          source += "';\n" + evaluateValue + ";\n__p += '";
14812
        }
14813
        if (interpolateValue) {
14814
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
14815
        }
14816
        index = offset + match.length;
14817
14818
        // The JS engine embedded in Adobe products needs `match` returned in
14819
        // order to produce the correct `offset` value.
14820
        return match;
14821
      });
14822
14823
      source += "';\n";
14824
14825
      // If `variable` is not specified wrap a with-statement around the generated
14826
      // code to add the data object to the top of the scope chain.
14827
      var variable = options.variable;
14828
      if (!variable) {
14829
        source = 'with (obj) {\n' + source + '\n}\n';
14830
      }
14831
      // Cleanup code by stripping empty strings.
14832
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
14833
        .replace(reEmptyStringMiddle, '$1')
14834
        .replace(reEmptyStringTrailing, '$1;');
14835
14836
      // Frame code as the function body.
14837
      source = 'function(' + (variable || 'obj') + ') {\n' +
14838
        (variable
14839
          ? ''
14840
          : 'obj || (obj = {});\n'
14841
        ) +
14842
        "var __t, __p = ''" +
14843
        (isEscaping
14844
           ? ', __e = _.escape'
14845
           : ''
14846
        ) +
14847
        (isEvaluating
14848
          ? ', __j = Array.prototype.join;\n' +
14849
            "function print() { __p += __j.call(arguments, '') }\n"
14850
          : ';\n'
14851
        ) +
14852
        source +
14853
        'return __p\n}';
14854
14855
      var result = attempt(function() {
14856
        return Function(importsKeys, sourceURL + 'return ' + source)
14857
          .apply(undefined, importsValues);
14858
      });
14859
14860
      // Provide the compiled function's source by its `toString` method or
14861
      // the `source` property as a convenience for inlining compiled templates.
14862
      result.source = source;
14863
      if (isError(result)) {
14864
        throw result;
14865
      }
14866
      return result;
14867
    }
14868
14869
    /**
14870
     * Converts `string`, as a whole, to lower case just like
14871
     * [String#toLowerCase](https://mdn.io/toLowerCase).
14872
     *
14873
     * @static
14874
     * @memberOf _
14875
     * @since 4.0.0
14876
     * @category String
14877
     * @param {string} [string=''] The string to convert.
14878
     * @returns {string} Returns the lower cased string.
14879
     * @example
14880
     *
14881
     * _.toLower('--Foo-Bar--');
14882
     * // => '--foo-bar--'
14883
     *
14884
     * _.toLower('fooBar');
14885
     * // => 'foobar'
14886
     *
14887
     * _.toLower('__FOO_BAR__');
14888
     * // => '__foo_bar__'
14889
     */
14890
    function toLower(value) {
14891
      return toString(value).toLowerCase();
14892
    }
14893
14894
    /**
14895
     * Converts `string`, as a whole, to upper case just like
14896
     * [String#toUpperCase](https://mdn.io/toUpperCase).
14897
     *
14898
     * @static
14899
     * @memberOf _
14900
     * @since 4.0.0
14901
     * @category String
14902
     * @param {string} [string=''] The string to convert.
14903
     * @returns {string} Returns the upper cased string.
14904
     * @example
14905
     *
14906
     * _.toUpper('--foo-bar--');
14907
     * // => '--FOO-BAR--'
14908
     *
14909
     * _.toUpper('fooBar');
14910
     * // => 'FOOBAR'
14911
     *
14912
     * _.toUpper('__foo_bar__');
14913
     * // => '__FOO_BAR__'
14914
     */
14915
    function toUpper(value) {
14916
      return toString(value).toUpperCase();
14917
    }
14918
14919
    /**
14920
     * Removes leading and trailing whitespace or specified characters from `string`.
14921
     *
14922
     * @static
14923
     * @memberOf _
14924
     * @since 3.0.0
14925
     * @category String
14926
     * @param {string} [string=''] The string to trim.
14927
     * @param {string} [chars=whitespace] The characters to trim.
14928
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14929
     * @returns {string} Returns the trimmed string.
14930
     * @example
14931
     *
14932
     * _.trim('  abc  ');
14933
     * // => 'abc'
14934
     *
14935
     * _.trim('-_-abc-_-', '_-');
14936
     * // => 'abc'
14937
     *
14938
     * _.map(['  foo  ', '  bar  '], _.trim);
14939
     * // => ['foo', 'bar']
14940
     */
14941
    function trim(string, chars, guard) {
14942
      string = toString(string);
14943
      if (string && (guard || chars === undefined)) {
14944
        return string.replace(reTrim, '');
14945
      }
14946
      if (!string || !(chars = baseToString(chars))) {
14947
        return string;
14948
      }
14949
      var strSymbols = stringToArray(string),
14950
          chrSymbols = stringToArray(chars),
14951
          start = charsStartIndex(strSymbols, chrSymbols),
14952
          end = charsEndIndex(strSymbols, chrSymbols) + 1;
14953
14954
      return castSlice(strSymbols, start, end).join('');
14955
    }
14956
14957
    /**
14958
     * Removes trailing whitespace or specified characters from `string`.
14959
     *
14960
     * @static
14961
     * @memberOf _
14962
     * @since 4.0.0
14963
     * @category String
14964
     * @param {string} [string=''] The string to trim.
14965
     * @param {string} [chars=whitespace] The characters to trim.
14966
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14967
     * @returns {string} Returns the trimmed string.
14968
     * @example
14969
     *
14970
     * _.trimEnd('  abc  ');
14971
     * // => '  abc'
14972
     *
14973
     * _.trimEnd('-_-abc-_-', '_-');
14974
     * // => '-_-abc'
14975
     */
14976
    function trimEnd(string, chars, guard) {
14977
      string = toString(string);
14978
      if (string && (guard || chars === undefined)) {
14979
        return string.replace(reTrimEnd, '');
14980
      }
14981
      if (!string || !(chars = baseToString(chars))) {
14982
        return string;
14983
      }
14984
      var strSymbols = stringToArray(string),
14985
          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
14986
14987
      return castSlice(strSymbols, 0, end).join('');
14988
    }
14989
14990
    /**
14991
     * Removes leading whitespace or specified characters from `string`.
14992
     *
14993
     * @static
14994
     * @memberOf _
14995
     * @since 4.0.0
14996
     * @category String
14997
     * @param {string} [string=''] The string to trim.
14998
     * @param {string} [chars=whitespace] The characters to trim.
14999
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15000
     * @returns {string} Returns the trimmed string.
15001
     * @example
15002
     *
15003
     * _.trimStart('  abc  ');
15004
     * // => 'abc  '
15005
     *
15006
     * _.trimStart('-_-abc-_-', '_-');
15007
     * // => 'abc-_-'
15008
     */
15009
    function trimStart(string, chars, guard) {
15010
      string = toString(string);
15011
      if (string && (guard || chars === undefined)) {
15012
        return string.replace(reTrimStart, '');
15013
      }
15014
      if (!string || !(chars = baseToString(chars))) {
15015
        return string;
15016
      }
15017
      var strSymbols = stringToArray(string),
15018
          start = charsStartIndex(strSymbols, stringToArray(chars));
15019
15020
      return castSlice(strSymbols, start).join('');
15021
    }
15022
15023
    /**
15024
     * Truncates `string` if it's longer than the given maximum string length.
15025
     * The last characters of the truncated string are replaced with the omission
15026
     * string which defaults to "...".
15027
     *
15028
     * @static
15029
     * @memberOf _
15030
     * @since 4.0.0
15031
     * @category String
15032
     * @param {string} [string=''] The string to truncate.
15033
     * @param {Object} [options={}] The options object.
15034
     * @param {number} [options.length=30] The maximum string length.
15035
     * @param {string} [options.omission='...'] The string to indicate text is omitted.
15036
     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
15037
     * @returns {string} Returns the truncated string.
15038
     * @example
15039
     *
15040
     * _.truncate('hi-diddly-ho there, neighborino');
15041
     * // => 'hi-diddly-ho there, neighbo...'
15042
     *
15043
     * _.truncate('hi-diddly-ho there, neighborino', {
15044
     *   'length': 24,
15045
     *   'separator': ' '
15046
     * });
15047
     * // => 'hi-diddly-ho there,...'
15048
     *
15049
     * _.truncate('hi-diddly-ho there, neighborino', {
15050
     *   'length': 24,
15051
     *   'separator': /,? +/
15052
     * });
15053
     * // => 'hi-diddly-ho there...'
15054
     *
15055
     * _.truncate('hi-diddly-ho there, neighborino', {
15056
     *   'omission': ' [...]'
15057
     * });
15058
     * // => 'hi-diddly-ho there, neig [...]'
15059
     */
15060
    function truncate(string, options) {
15061
      var length = DEFAULT_TRUNC_LENGTH,
15062
          omission = DEFAULT_TRUNC_OMISSION;
15063
15064
      if (isObject(options)) {
15065
        var separator = 'separator' in options ? options.separator : separator;
15066
        length = 'length' in options ? toInteger(options.length) : length;
15067
        omission = 'omission' in options ? baseToString(options.omission) : omission;
15068
      }
15069
      string = toString(string);
15070
15071
      var strLength = string.length;
15072
      if (hasUnicode(string)) {
15073
        var strSymbols = stringToArray(string);
15074
        strLength = strSymbols.length;
15075
      }
15076
      if (length >= strLength) {
15077
        return string;
15078
      }
15079
      var end = length - stringSize(omission);
15080
      if (end < 1) {
15081
        return omission;
15082
      }
15083
      var result = strSymbols
15084
        ? castSlice(strSymbols, 0, end).join('')
15085
        : string.slice(0, end);
15086
15087
      if (separator === undefined) {
15088
        return result + omission;
15089
      }
15090
      if (strSymbols) {
15091
        end += (result.length - end);
15092
      }
15093
      if (isRegExp(separator)) {
15094
        if (string.slice(end).search(separator)) {
15095
          var match,
15096
              substring = result;
15097
15098
          if (!separator.global) {
15099
            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
15100
          }
15101
          separator.lastIndex = 0;
15102
          while ((match = separator.exec(substring))) {
15103
            var newEnd = match.index;
15104
          }
15105
          result = result.slice(0, newEnd === undefined ? end : newEnd);
15106
        }
15107
      } else if (string.indexOf(baseToString(separator), end) != end) {
15108
        var index = result.lastIndexOf(separator);
15109
        if (index > -1) {
15110
          result = result.slice(0, index);
15111
        }
15112
      }
15113
      return result + omission;
15114
    }
15115
15116
    /**
15117
     * The inverse of `_.escape`; this method converts the HTML entities
15118
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
15119
     * their corresponding characters.
15120
     *
15121
     * **Note:** No other HTML entities are unescaped. To unescape additional
15122
     * HTML entities use a third-party library like [_he_](https://mths.be/he).
15123
     *
15124
     * @static
15125
     * @memberOf _
15126
     * @since 0.6.0
15127
     * @category String
15128
     * @param {string} [string=''] The string to unescape.
15129
     * @returns {string} Returns the unescaped string.
15130
     * @example
15131
     *
15132
     * _.unescape('fred, barney, &amp; pebbles');
15133
     * // => 'fred, barney, & pebbles'
15134
     */
15135
    function unescape(string) {
15136
      string = toString(string);
15137
      return (string && reHasEscapedHtml.test(string))
15138
        ? string.replace(reEscapedHtml, unescapeHtmlChar)
15139
        : string;
15140
    }
15141
15142
    /**
15143
     * Converts `string`, as space separated words, to upper case.
15144
     *
15145
     * @static
15146
     * @memberOf _
15147
     * @since 4.0.0
15148
     * @category String
15149
     * @param {string} [string=''] The string to convert.
15150
     * @returns {string} Returns the upper cased string.
15151
     * @example
15152
     *
15153
     * _.upperCase('--foo-bar');
15154
     * // => 'FOO BAR'
15155
     *
15156
     * _.upperCase('fooBar');
15157
     * // => 'FOO BAR'
15158
     *
15159
     * _.upperCase('__foo_bar__');
15160
     * // => 'FOO BAR'
15161
     */
15162
    var upperCase = createCompounder(function(result, word, index) {
15163
      return result + (index ? ' ' : '') + word.toUpperCase();
15164
    });
15165
15166
    /**
15167
     * Converts the first character of `string` to upper case.
15168
     *
15169
     * @static
15170
     * @memberOf _
15171
     * @since 4.0.0
15172
     * @category String
15173
     * @param {string} [string=''] The string to convert.
15174
     * @returns {string} Returns the converted string.
15175
     * @example
15176
     *
15177
     * _.upperFirst('fred');
15178
     * // => 'Fred'
15179
     *
15180
     * _.upperFirst('FRED');
15181
     * // => 'FRED'
15182
     */
15183
    var upperFirst = createCaseFirst('toUpperCase');
15184
15185
    /**
15186
     * Splits `string` into an array of its words.
15187
     *
15188
     * @static
15189
     * @memberOf _
15190
     * @since 3.0.0
15191
     * @category String
15192
     * @param {string} [string=''] The string to inspect.
15193
     * @param {RegExp|string} [pattern] The pattern to match words.
15194
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15195
     * @returns {Array} Returns the words of `string`.
15196
     * @example
15197
     *
15198
     * _.words('fred, barney, & pebbles');
15199
     * // => ['fred', 'barney', 'pebbles']
15200
     *
15201
     * _.words('fred, barney, & pebbles', /[^, ]+/g);
15202
     * // => ['fred', 'barney', '&', 'pebbles']
15203
     */
15204
    function words(string, pattern, guard) {
15205
      string = toString(string);
15206
      pattern = guard ? undefined : pattern;
15207
15208
      if (pattern === undefined) {
15209
        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
15210
      }
15211
      return string.match(pattern) || [];
15212
    }
15213
15214
    /*------------------------------------------------------------------------*/
15215
15216
    /**
15217
     * Attempts to invoke `func`, returning either the result or the caught error
15218
     * object. Any additional arguments are provided to `func` when it's invoked.
15219
     *
15220
     * @static
15221
     * @memberOf _
15222
     * @since 3.0.0
15223
     * @category Util
15224
     * @param {Function} func The function to attempt.
15225
     * @param {...*} [args] The arguments to invoke `func` with.
15226
     * @returns {*} Returns the `func` result or error object.
15227
     * @example
15228
     *
15229
     * // Avoid throwing errors for invalid selectors.
15230
     * var elements = _.attempt(function(selector) {
15231
     *   return document.querySelectorAll(selector);
15232
     * }, '>_>');
15233
     *
15234
     * if (_.isError(elements)) {
15235
     *   elements = [];
15236
     * }
15237
     */
15238
    var attempt = baseRest(function(func, args) {
15239
      try {
15240
        return apply(func, undefined, args);
15241
      } catch (e) {
15242
        return isError(e) ? e : new Error(e);
15243
      }
15244
    });
15245
15246
    /**
15247
     * Binds methods of an object to the object itself, overwriting the existing
15248
     * method.
15249
     *
15250
     * **Note:** This method doesn't set the "length" property of bound functions.
15251
     *
15252
     * @static
15253
     * @since 0.1.0
15254
     * @memberOf _
15255
     * @category Util
15256
     * @param {Object} object The object to bind and assign the bound methods to.
15257
     * @param {...(string|string[])} methodNames The object method names to bind.
15258
     * @returns {Object} Returns `object`.
15259
     * @example
15260
     *
15261
     * var view = {
15262
     *   'label': 'docs',
15263
     *   'click': function() {
15264
     *     console.log('clicked ' + this.label);
15265
     *   }
15266
     * };
15267
     *
15268
     * _.bindAll(view, ['click']);
15269
     * jQuery(element).on('click', view.click);
15270
     * // => Logs 'clicked docs' when clicked.
15271
     */
15272
    var bindAll = flatRest(function(object, methodNames) {
15273
      arrayEach(methodNames, function(key) {
15274
        key = toKey(key);
15275
        baseAssignValue(object, key, bind(object[key], object));
15276
      });
15277
      return object;
15278
    });
15279
15280
    /**
15281
     * Creates a function that iterates over `pairs` and invokes the corresponding
15282
     * function of the first predicate to return truthy. The predicate-function
15283
     * pairs are invoked with the `this` binding and arguments of the created
15284
     * function.
15285
     *
15286
     * @static
15287
     * @memberOf _
15288
     * @since 4.0.0
15289
     * @category Util
15290
     * @param {Array} pairs The predicate-function pairs.
15291
     * @returns {Function} Returns the new composite function.
15292
     * @example
15293
     *
15294
     * var func = _.cond([
15295
     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
15296
     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
15297
     *   [_.stubTrue,                      _.constant('no match')]
15298
     * ]);
15299
     *
15300
     * func({ 'a': 1, 'b': 2 });
15301
     * // => 'matches A'
15302
     *
15303
     * func({ 'a': 0, 'b': 1 });
15304
     * // => 'matches B'
15305
     *
15306
     * func({ 'a': '1', 'b': '2' });
15307
     * // => 'no match'
15308
     */
15309
    function cond(pairs) {
15310
      var length = pairs == null ? 0 : pairs.length,
15311
          toIteratee = getIteratee();
15312
15313
      pairs = !length ? [] : arrayMap(pairs, function(pair) {
15314
        if (typeof pair[1] != 'function') {
15315
          throw new TypeError(FUNC_ERROR_TEXT);
15316
        }
15317
        return [toIteratee(pair[0]), pair[1]];
15318
      });
15319
15320
      return baseRest(function(args) {
15321
        var index = -1;
15322
        while (++index < length) {
15323
          var pair = pairs[index];
15324
          if (apply(pair[0], this, args)) {
15325
            return apply(pair[1], this, args);
15326
          }
15327
        }
15328
      });
15329
    }
15330
15331
    /**
15332
     * Creates a function that invokes the predicate properties of `source` with
15333
     * the corresponding property values of a given object, returning `true` if
15334
     * all predicates return truthy, else `false`.
15335
     *
15336
     * **Note:** The created function is equivalent to `_.conformsTo` with
15337
     * `source` partially applied.
15338
     *
15339
     * @static
15340
     * @memberOf _
15341
     * @since 4.0.0
15342
     * @category Util
15343
     * @param {Object} source The object of property predicates to conform to.
15344
     * @returns {Function} Returns the new spec function.
15345
     * @example
15346
     *
15347
     * var objects = [
15348
     *   { 'a': 2, 'b': 1 },
15349
     *   { 'a': 1, 'b': 2 }
15350
     * ];
15351
     *
15352
     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
15353
     * // => [{ 'a': 1, 'b': 2 }]
15354
     */
15355
    function conforms(source) {
15356
      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
15357
    }
15358
15359
    /**
15360
     * Creates a function that returns `value`.
15361
     *
15362
     * @static
15363
     * @memberOf _
15364
     * @since 2.4.0
15365
     * @category Util
15366
     * @param {*} value The value to return from the new function.
15367
     * @returns {Function} Returns the new constant function.
15368
     * @example
15369
     *
15370
     * var objects = _.times(2, _.constant({ 'a': 1 }));
15371
     *
15372
     * console.log(objects);
15373
     * // => [{ 'a': 1 }, { 'a': 1 }]
15374
     *
15375
     * console.log(objects[0] === objects[1]);
15376
     * // => true
15377
     */
15378
    function constant(value) {
15379
      return function() {
15380
        return value;
15381
      };
15382
    }
15383
15384
    /**
15385
     * Checks `value` to determine whether a default value should be returned in
15386
     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
15387
     * or `undefined`.
15388
     *
15389
     * @static
15390
     * @memberOf _
15391
     * @since 4.14.0
15392
     * @category Util
15393
     * @param {*} value The value to check.
15394
     * @param {*} defaultValue The default value.
15395
     * @returns {*} Returns the resolved value.
15396
     * @example
15397
     *
15398
     * _.defaultTo(1, 10);
15399
     * // => 1
15400
     *
15401
     * _.defaultTo(undefined, 10);
15402
     * // => 10
15403
     */
15404
    function defaultTo(value, defaultValue) {
15405
      return (value == null || value !== value) ? defaultValue : value;
15406
    }
15407
15408
    /**
15409
     * Creates a function that returns the result of invoking the given functions
15410
     * with the `this` binding of the created function, where each successive
15411
     * invocation is supplied the return value of the previous.
15412
     *
15413
     * @static
15414
     * @memberOf _
15415
     * @since 3.0.0
15416
     * @category Util
15417
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
15418
     * @returns {Function} Returns the new composite function.
15419
     * @see _.flowRight
15420
     * @example
15421
     *
15422
     * function square(n) {
15423
     *   return n * n;
15424
     * }
15425
     *
15426
     * var addSquare = _.flow([_.add, square]);
15427
     * addSquare(1, 2);
15428
     * // => 9
15429
     */
15430
    var flow = createFlow();
15431
15432
    /**
15433
     * This method is like `_.flow` except that it creates a function that
15434
     * invokes the given functions from right to left.
15435
     *
15436
     * @static
15437
     * @since 3.0.0
15438
     * @memberOf _
15439
     * @category Util
15440
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
15441
     * @returns {Function} Returns the new composite function.
15442
     * @see _.flow
15443
     * @example
15444
     *
15445
     * function square(n) {
15446
     *   return n * n;
15447
     * }
15448
     *
15449
     * var addSquare = _.flowRight([square, _.add]);
15450
     * addSquare(1, 2);
15451
     * // => 9
15452
     */
15453
    var flowRight = createFlow(true);
15454
15455
    /**
15456
     * This method returns the first argument it receives.
15457
     *
15458
     * @static
15459
     * @since 0.1.0
15460
     * @memberOf _
15461
     * @category Util
15462
     * @param {*} value Any value.
15463
     * @returns {*} Returns `value`.
15464
     * @example
15465
     *
15466
     * var object = { 'a': 1 };
15467
     *
15468
     * console.log(_.identity(object) === object);
15469
     * // => true
15470
     */
15471
    function identity(value) {
15472
      return value;
15473
    }
15474
15475
    /**
15476
     * Creates a function that invokes `func` with the arguments of the created
15477
     * function. If `func` is a property name, the created function returns the
15478
     * property value for a given element. If `func` is an array or object, the
15479
     * created function returns `true` for elements that contain the equivalent
15480
     * source properties, otherwise it returns `false`.
15481
     *
15482
     * @static
15483
     * @since 4.0.0
15484
     * @memberOf _
15485
     * @category Util
15486
     * @param {*} [func=_.identity] The value to convert to a callback.
15487
     * @returns {Function} Returns the callback.
15488
     * @example
15489
     *
15490
     * var users = [
15491
     *   { 'user': 'barney', 'age': 36, 'active': true },
15492
     *   { 'user': 'fred',   'age': 40, 'active': false }
15493
     * ];
15494
     *
15495
     * // The `_.matches` iteratee shorthand.
15496
     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
15497
     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
15498
     *
15499
     * // The `_.matchesProperty` iteratee shorthand.
15500
     * _.filter(users, _.iteratee(['user', 'fred']));
15501
     * // => [{ 'user': 'fred', 'age': 40 }]
15502
     *
15503
     * // The `_.property` iteratee shorthand.
15504
     * _.map(users, _.iteratee('user'));
15505
     * // => ['barney', 'fred']
15506
     *
15507
     * // Create custom iteratee shorthands.
15508
     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
15509
     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
15510
     *     return func.test(string);
15511
     *   };
15512
     * });
15513
     *
15514
     * _.filter(['abc', 'def'], /ef/);
15515
     * // => ['def']
15516
     */
15517
    function iteratee(func) {
15518
      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
15519
    }
15520
15521
    /**
15522
     * Creates a function that performs a partial deep comparison between a given
15523
     * object and `source`, returning `true` if the given object has equivalent
15524
     * property values, else `false`.
15525
     *
15526
     * **Note:** The created function is equivalent to `_.isMatch` with `source`
15527
     * partially applied.
15528
     *
15529
     * Partial comparisons will match empty array and empty object `source`
15530
     * values against any array or object value, respectively. See `_.isEqual`
15531
     * for a list of supported value comparisons.
15532
     *
15533
     * @static
15534
     * @memberOf _
15535
     * @since 3.0.0
15536
     * @category Util
15537
     * @param {Object} source The object of property values to match.
15538
     * @returns {Function} Returns the new spec function.
15539
     * @example
15540
     *
15541
     * var objects = [
15542
     *   { 'a': 1, 'b': 2, 'c': 3 },
15543
     *   { 'a': 4, 'b': 5, 'c': 6 }
15544
     * ];
15545
     *
15546
     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
15547
     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
15548
     */
15549
    function matches(source) {
15550
      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
15551
    }
15552
15553
    /**
15554
     * Creates a function that performs a partial deep comparison between the
15555
     * value at `path` of a given object to `srcValue`, returning `true` if the
15556
     * object value is equivalent, else `false`.
15557
     *
15558
     * **Note:** Partial comparisons will match empty array and empty object
15559
     * `srcValue` values against any array or object value, respectively. See
15560
     * `_.isEqual` for a list of supported value comparisons.
15561
     *
15562
     * @static
15563
     * @memberOf _
15564
     * @since 3.2.0
15565
     * @category Util
15566
     * @param {Array|string} path The path of the property to get.
15567
     * @param {*} srcValue The value to match.
15568
     * @returns {Function} Returns the new spec function.
15569
     * @example
15570
     *
15571
     * var objects = [
15572
     *   { 'a': 1, 'b': 2, 'c': 3 },
15573
     *   { 'a': 4, 'b': 5, 'c': 6 }
15574
     * ];
15575
     *
15576
     * _.find(objects, _.matchesProperty('a', 4));
15577
     * // => { 'a': 4, 'b': 5, 'c': 6 }
15578
     */
15579
    function matchesProperty(path, srcValue) {
15580
      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
15581
    }
15582
15583
    /**
15584
     * Creates a function that invokes the method at `path` of a given object.
15585
     * Any additional arguments are provided to the invoked method.
15586
     *
15587
     * @static
15588
     * @memberOf _
15589
     * @since 3.7.0
15590
     * @category Util
15591
     * @param {Array|string} path The path of the method to invoke.
15592
     * @param {...*} [args] The arguments to invoke the method with.
15593
     * @returns {Function} Returns the new invoker function.
15594
     * @example
15595
     *
15596
     * var objects = [
15597
     *   { 'a': { 'b': _.constant(2) } },
15598
     *   { 'a': { 'b': _.constant(1) } }
15599
     * ];
15600
     *
15601
     * _.map(objects, _.method('a.b'));
15602
     * // => [2, 1]
15603
     *
15604
     * _.map(objects, _.method(['a', 'b']));
15605
     * // => [2, 1]
15606
     */
15607
    var method = baseRest(function(path, args) {
15608
      return function(object) {
15609
        return baseInvoke(object, path, args);
15610
      };
15611
    });
15612
15613
    /**
15614
     * The opposite of `_.method`; this method creates a function that invokes
15615
     * the method at a given path of `object`. Any additional arguments are
15616
     * provided to the invoked method.
15617
     *
15618
     * @static
15619
     * @memberOf _
15620
     * @since 3.7.0
15621
     * @category Util
15622
     * @param {Object} object The object to query.
15623
     * @param {...*} [args] The arguments to invoke the method with.
15624
     * @returns {Function} Returns the new invoker function.
15625
     * @example
15626
     *
15627
     * var array = _.times(3, _.constant),
15628
     *     object = { 'a': array, 'b': array, 'c': array };
15629
     *
15630
     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
15631
     * // => [2, 0]
15632
     *
15633
     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
15634
     * // => [2, 0]
15635
     */
15636
    var methodOf = baseRest(function(object, args) {
15637
      return function(path) {
15638
        return baseInvoke(object, path, args);
15639
      };
15640
    });
15641
15642
    /**
15643
     * Adds all own enumerable string keyed function properties of a source
15644
     * object to the destination object. If `object` is a function, then methods
15645
     * are added to its prototype as well.
15646
     *
15647
     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
15648
     * avoid conflicts caused by modifying the original.
15649
     *
15650
     * @static
15651
     * @since 0.1.0
15652
     * @memberOf _
15653
     * @category Util
15654
     * @param {Function|Object} [object=lodash] The destination object.
15655
     * @param {Object} source The object of functions to add.
15656
     * @param {Object} [options={}] The options object.
15657
     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
15658
     * @returns {Function|Object} Returns `object`.
15659
     * @example
15660
     *
15661
     * function vowels(string) {
15662
     *   return _.filter(string, function(v) {
15663
     *     return /[aeiou]/i.test(v);
15664
     *   });
15665
     * }
15666
     *
15667
     * _.mixin({ 'vowels': vowels });
15668
     * _.vowels('fred');
15669
     * // => ['e']
15670
     *
15671
     * _('fred').vowels().value();
15672
     * // => ['e']
15673
     *
15674
     * _.mixin({ 'vowels': vowels }, { 'chain': false });
15675
     * _('fred').vowels();
15676
     * // => ['e']
15677
     */
15678
    function mixin(object, source, options) {
15679
      var props = keys(source),
15680
          methodNames = baseFunctions(source, props);
15681
15682
      if (options == null &&
15683
          !(isObject(source) && (methodNames.length || !props.length))) {
15684
        options = source;
15685
        source = object;
15686
        object = this;
15687
        methodNames = baseFunctions(source, keys(source));
15688
      }
15689
      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
15690
          isFunc = isFunction(object);
15691
15692
      arrayEach(methodNames, function(methodName) {
15693
        var func = source[methodName];
15694
        object[methodName] = func;
15695
        if (isFunc) {
15696
          object.prototype[methodName] = function() {
15697
            var chainAll = this.__chain__;
15698
            if (chain || chainAll) {
15699
              var result = object(this.__wrapped__),
15700
                  actions = result.__actions__ = copyArray(this.__actions__);
15701
15702
              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
15703
              result.__chain__ = chainAll;
15704
              return result;
15705
            }
15706
            return func.apply(object, arrayPush([this.value()], arguments));
15707
          };
15708
        }
15709
      });
15710
15711
      return object;
15712
    }
15713
15714
    /**
15715
     * Reverts the `_` variable to its previous value and returns a reference to
15716
     * the `lodash` function.
15717
     *
15718
     * @static
15719
     * @since 0.1.0
15720
     * @memberOf _
15721
     * @category Util
15722
     * @returns {Function} Returns the `lodash` function.
15723
     * @example
15724
     *
15725
     * var lodash = _.noConflict();
15726
     */
15727
    function noConflict() {
15728
      if (root._ === this) {
15729
        root._ = oldDash;
15730
      }
15731
      return this;
15732
    }
15733
15734
    /**
15735
     * This method returns `undefined`.
15736
     *
15737
     * @static
15738
     * @memberOf _
15739
     * @since 2.3.0
15740
     * @category Util
15741
     * @example
15742
     *
15743
     * _.times(2, _.noop);
15744
     * // => [undefined, undefined]
15745
     */
15746
    function noop() {
15747
      // No operation performed.
15748
    }
15749
15750
    /**
15751
     * Creates a function that gets the argument at index `n`. If `n` is negative,
15752
     * the nth argument from the end is returned.
15753
     *
15754
     * @static
15755
     * @memberOf _
15756
     * @since 4.0.0
15757
     * @category Util
15758
     * @param {number} [n=0] The index of the argument to return.
15759
     * @returns {Function} Returns the new pass-thru function.
15760
     * @example
15761
     *
15762
     * var func = _.nthArg(1);
15763
     * func('a', 'b', 'c', 'd');
15764
     * // => 'b'
15765
     *
15766
     * var func = _.nthArg(-2);
15767
     * func('a', 'b', 'c', 'd');
15768
     * // => 'c'
15769
     */
15770
    function nthArg(n) {
15771
      n = toInteger(n);
15772
      return baseRest(function(args) {
15773
        return baseNth(args, n);
15774
      });
15775
    }
15776
15777
    /**
15778
     * Creates a function that invokes `iteratees` with the arguments it receives
15779
     * and returns their results.
15780
     *
15781
     * @static
15782
     * @memberOf _
15783
     * @since 4.0.0
15784
     * @category Util
15785
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
15786
     *  The iteratees to invoke.
15787
     * @returns {Function} Returns the new function.
15788
     * @example
15789
     *
15790
     * var func = _.over([Math.max, Math.min]);
15791
     *
15792
     * func(1, 2, 3, 4);
15793
     * // => [4, 1]
15794
     */
15795
    var over = createOver(arrayMap);
15796
15797
    /**
15798
     * Creates a function that checks if **all** of the `predicates` return
15799
     * truthy when invoked with the arguments it receives.
15800
     *
15801
     * @static
15802
     * @memberOf _
15803
     * @since 4.0.0
15804
     * @category Util
15805
     * @param {...(Function|Function[])} [predicates=[_.identity]]
15806
     *  The predicates to check.
15807
     * @returns {Function} Returns the new function.
15808
     * @example
15809
     *
15810
     * var func = _.overEvery([Boolean, isFinite]);
15811
     *
15812
     * func('1');
15813
     * // => true
15814
     *
15815
     * func(null);
15816
     * // => false
15817
     *
15818
     * func(NaN);
15819
     * // => false
15820
     */
15821
    var overEvery = createOver(arrayEvery);
15822
15823
    /**
15824
     * Creates a function that checks if **any** of the `predicates` return
15825
     * truthy when invoked with the arguments it receives.
15826
     *
15827
     * @static
15828
     * @memberOf _
15829
     * @since 4.0.0
15830
     * @category Util
15831
     * @param {...(Function|Function[])} [predicates=[_.identity]]
15832
     *  The predicates to check.
15833
     * @returns {Function} Returns the new function.
15834
     * @example
15835
     *
15836
     * var func = _.overSome([Boolean, isFinite]);
15837
     *
15838
     * func('1');
15839
     * // => true
15840
     *
15841
     * func(null);
15842
     * // => true
15843
     *
15844
     * func(NaN);
15845
     * // => false
15846
     */
15847
    var overSome = createOver(arraySome);
15848
15849
    /**
15850
     * Creates a function that returns the value at `path` of a given object.
15851
     *
15852
     * @static
15853
     * @memberOf _
15854
     * @since 2.4.0
15855
     * @category Util
15856
     * @param {Array|string} path The path of the property to get.
15857
     * @returns {Function} Returns the new accessor function.
15858
     * @example
15859
     *
15860
     * var objects = [
15861
     *   { 'a': { 'b': 2 } },
15862
     *   { 'a': { 'b': 1 } }
15863
     * ];
15864
     *
15865
     * _.map(objects, _.property('a.b'));
15866
     * // => [2, 1]
15867
     *
15868
     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
15869
     * // => [1, 2]
15870
     */
15871
    function property(path) {
15872
      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
15873
    }
15874
15875
    /**
15876
     * The opposite of `_.property`; this method creates a function that returns
15877
     * the value at a given path of `object`.
15878
     *
15879
     * @static
15880
     * @memberOf _
15881
     * @since 3.0.0
15882
     * @category Util
15883
     * @param {Object} object The object to query.
15884
     * @returns {Function} Returns the new accessor function.
15885
     * @example
15886
     *
15887
     * var array = [0, 1, 2],
15888
     *     object = { 'a': array, 'b': array, 'c': array };
15889
     *
15890
     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
15891
     * // => [2, 0]
15892
     *
15893
     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
15894
     * // => [2, 0]
15895
     */
15896
    function propertyOf(object) {
15897
      return function(path) {
15898
        return object == null ? undefined : baseGet(object, path);
15899
      };
15900
    }
15901
15902
    /**
15903
     * Creates an array of numbers (positive and/or negative) progressing from
15904
     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
15905
     * `start` is specified without an `end` or `step`. If `end` is not specified,
15906
     * it's set to `start` with `start` then set to `0`.
15907
     *
15908
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
15909
     * floating-point values which can produce unexpected results.
15910
     *
15911
     * @static
15912
     * @since 0.1.0
15913
     * @memberOf _
15914
     * @category Util
15915
     * @param {number} [start=0] The start of the range.
15916
     * @param {number} end The end of the range.
15917
     * @param {number} [step=1] The value to increment or decrement by.
15918
     * @returns {Array} Returns the range of numbers.
15919
     * @see _.inRange, _.rangeRight
15920
     * @example
15921
     *
15922
     * _.range(4);
15923
     * // => [0, 1, 2, 3]
15924
     *
15925
     * _.range(-4);
15926
     * // => [0, -1, -2, -3]
15927
     *
15928
     * _.range(1, 5);
15929
     * // => [1, 2, 3, 4]
15930
     *
15931
     * _.range(0, 20, 5);
15932
     * // => [0, 5, 10, 15]
15933
     *
15934
     * _.range(0, -4, -1);
15935
     * // => [0, -1, -2, -3]
15936
     *
15937
     * _.range(1, 4, 0);
15938
     * // => [1, 1, 1]
15939
     *
15940
     * _.range(0);
15941
     * // => []
15942
     */
15943
    var range = createRange();
15944
15945
    /**
15946
     * This method is like `_.range` except that it populates values in
15947
     * descending order.
15948
     *
15949
     * @static
15950
     * @memberOf _
15951
     * @since 4.0.0
15952
     * @category Util
15953
     * @param {number} [start=0] The start of the range.
15954
     * @param {number} end The end of the range.
15955
     * @param {number} [step=1] The value to increment or decrement by.
15956
     * @returns {Array} Returns the range of numbers.
15957
     * @see _.inRange, _.range
15958
     * @example
15959
     *
15960
     * _.rangeRight(4);
15961
     * // => [3, 2, 1, 0]
15962
     *
15963
     * _.rangeRight(-4);
15964
     * // => [-3, -2, -1, 0]
15965
     *
15966
     * _.rangeRight(1, 5);
15967
     * // => [4, 3, 2, 1]
15968
     *
15969
     * _.rangeRight(0, 20, 5);
15970
     * // => [15, 10, 5, 0]
15971
     *
15972
     * _.rangeRight(0, -4, -1);
15973
     * // => [-3, -2, -1, 0]
15974
     *
15975
     * _.rangeRight(1, 4, 0);
15976
     * // => [1, 1, 1]
15977
     *
15978
     * _.rangeRight(0);
15979
     * // => []
15980
     */
15981
    var rangeRight = createRange(true);
15982
15983
    /**
15984
     * This method returns a new empty array.
15985
     *
15986
     * @static
15987
     * @memberOf _
15988
     * @since 4.13.0
15989
     * @category Util
15990
     * @returns {Array} Returns the new empty array.
15991
     * @example
15992
     *
15993
     * var arrays = _.times(2, _.stubArray);
15994
     *
15995
     * console.log(arrays);
15996
     * // => [[], []]
15997
     *
15998
     * console.log(arrays[0] === arrays[1]);
15999
     * // => false
16000
     */
16001
    function stubArray() {
16002
      return [];
16003
    }
16004
16005
    /**
16006
     * This method returns `false`.
16007
     *
16008
     * @static
16009
     * @memberOf _
16010
     * @since 4.13.0
16011
     * @category Util
16012
     * @returns {boolean} Returns `false`.
16013
     * @example
16014
     *
16015
     * _.times(2, _.stubFalse);
16016
     * // => [false, false]
16017
     */
16018
    function stubFalse() {
16019
      return false;
16020
    }
16021
16022
    /**
16023
     * This method returns a new empty object.
16024
     *
16025
     * @static
16026
     * @memberOf _
16027
     * @since 4.13.0
16028
     * @category Util
16029
     * @returns {Object} Returns the new empty object.
16030
     * @example
16031
     *
16032
     * var objects = _.times(2, _.stubObject);
16033
     *
16034
     * console.log(objects);
16035
     * // => [{}, {}]
16036
     *
16037
     * console.log(objects[0] === objects[1]);
16038
     * // => false
16039
     */
16040
    function stubObject() {
16041
      return {};
16042
    }
16043
16044
    /**
16045
     * This method returns an empty string.
16046
     *
16047
     * @static
16048
     * @memberOf _
16049
     * @since 4.13.0
16050
     * @category Util
16051
     * @returns {string} Returns the empty string.
16052
     * @example
16053
     *
16054
     * _.times(2, _.stubString);
16055
     * // => ['', '']
16056
     */
16057
    function stubString() {
16058
      return '';
16059
    }
16060
16061
    /**
16062
     * This method returns `true`.
16063
     *
16064
     * @static
16065
     * @memberOf _
16066
     * @since 4.13.0
16067
     * @category Util
16068
     * @returns {boolean} Returns `true`.
16069
     * @example
16070
     *
16071
     * _.times(2, _.stubTrue);
16072
     * // => [true, true]
16073
     */
16074
    function stubTrue() {
16075
      return true;
16076
    }
16077
16078
    /**
16079
     * Invokes the iteratee `n` times, returning an array of the results of
16080
     * each invocation. The iteratee is invoked with one argument; (index).
16081
     *
16082
     * @static
16083
     * @since 0.1.0
16084
     * @memberOf _
16085
     * @category Util
16086
     * @param {number} n The number of times to invoke `iteratee`.
16087
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
16088
     * @returns {Array} Returns the array of results.
16089
     * @example
16090
     *
16091
     * _.times(3, String);
16092
     * // => ['0', '1', '2']
16093
     *
16094
     *  _.times(4, _.constant(0));
16095
     * // => [0, 0, 0, 0]
16096
     */
16097
    function times(n, iteratee) {
16098
      n = toInteger(n);
16099
      if (n < 1 || n > MAX_SAFE_INTEGER) {
16100
        return [];
16101
      }
16102
      var index = MAX_ARRAY_LENGTH,
16103
          length = nativeMin(n, MAX_ARRAY_LENGTH);
16104
16105
      iteratee = getIteratee(iteratee);
16106
      n -= MAX_ARRAY_LENGTH;
16107
16108
      var result = baseTimes(length, iteratee);
16109
      while (++index < n) {
16110
        iteratee(index);
16111
      }
16112
      return result;
16113
    }
16114
16115
    /**
16116
     * Converts `value` to a property path array.
16117
     *
16118
     * @static
16119
     * @memberOf _
16120
     * @since 4.0.0
16121
     * @category Util
16122
     * @param {*} value The value to convert.
16123
     * @returns {Array} Returns the new property path array.
16124
     * @example
16125
     *
16126
     * _.toPath('a.b.c');
16127
     * // => ['a', 'b', 'c']
16128
     *
16129
     * _.toPath('a[0].b.c');
16130
     * // => ['a', '0', 'b', 'c']
16131
     */
16132
    function toPath(value) {
16133
      if (isArray(value)) {
16134
        return arrayMap(value, toKey);
16135
      }
16136
      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
16137
    }
16138
16139
    /**
16140
     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
16141
     *
16142
     * @static
16143
     * @since 0.1.0
16144
     * @memberOf _
16145
     * @category Util
16146
     * @param {string} [prefix=''] The value to prefix the ID with.
16147
     * @returns {string} Returns the unique ID.
16148
     * @example
16149
     *
16150
     * _.uniqueId('contact_');
16151
     * // => 'contact_104'
16152
     *
16153
     * _.uniqueId();
16154
     * // => '105'
16155
     */
16156
    function uniqueId(prefix) {
16157
      var id = ++idCounter;
16158
      return toString(prefix) + id;
16159
    }
16160
16161
    /*------------------------------------------------------------------------*/
16162
16163
    /**
16164
     * Adds two numbers.
16165
     *
16166
     * @static
16167
     * @memberOf _
16168
     * @since 3.4.0
16169
     * @category Math
16170
     * @param {number} augend The first number in an addition.
16171
     * @param {number} addend The second number in an addition.
16172
     * @returns {number} Returns the total.
16173
     * @example
16174
     *
16175
     * _.add(6, 4);
16176
     * // => 10
16177
     */
16178
    var add = createMathOperation(function(augend, addend) {
16179
      return augend + addend;
16180
    }, 0);
16181
16182
    /**
16183
     * Computes `number` rounded up to `precision`.
16184
     *
16185
     * @static
16186
     * @memberOf _
16187
     * @since 3.10.0
16188
     * @category Math
16189
     * @param {number} number The number to round up.
16190
     * @param {number} [precision=0] The precision to round up to.
16191
     * @returns {number} Returns the rounded up number.
16192
     * @example
16193
     *
16194
     * _.ceil(4.006);
16195
     * // => 5
16196
     *
16197
     * _.ceil(6.004, 2);
16198
     * // => 6.01
16199
     *
16200
     * _.ceil(6040, -2);
16201
     * // => 6100
16202
     */
16203
    var ceil = createRound('ceil');
16204
16205
    /**
16206
     * Divide two numbers.
16207
     *
16208
     * @static
16209
     * @memberOf _
16210
     * @since 4.7.0
16211
     * @category Math
16212
     * @param {number} dividend The first number in a division.
16213
     * @param {number} divisor The second number in a division.
16214
     * @returns {number} Returns the quotient.
16215
     * @example
16216
     *
16217
     * _.divide(6, 4);
16218
     * // => 1.5
16219
     */
16220
    var divide = createMathOperation(function(dividend, divisor) {
16221
      return dividend / divisor;
16222
    }, 1);
16223
16224
    /**
16225
     * Computes `number` rounded down to `precision`.
16226
     *
16227
     * @static
16228
     * @memberOf _
16229
     * @since 3.10.0
16230
     * @category Math
16231
     * @param {number} number The number to round down.
16232
     * @param {number} [precision=0] The precision to round down to.
16233
     * @returns {number} Returns the rounded down number.
16234
     * @example
16235
     *
16236
     * _.floor(4.006);
16237
     * // => 4
16238
     *
16239
     * _.floor(0.046, 2);
16240
     * // => 0.04
16241
     *
16242
     * _.floor(4060, -2);
16243
     * // => 4000
16244
     */
16245
    var floor = createRound('floor');
16246
16247
    /**
16248
     * Computes the maximum value of `array`. If `array` is empty or falsey,
16249
     * `undefined` is returned.
16250
     *
16251
     * @static
16252
     * @since 0.1.0
16253
     * @memberOf _
16254
     * @category Math
16255
     * @param {Array} array The array to iterate over.
16256
     * @returns {*} Returns the maximum value.
16257
     * @example
16258
     *
16259
     * _.max([4, 2, 8, 6]);
16260
     * // => 8
16261
     *
16262
     * _.max([]);
16263
     * // => undefined
16264
     */
16265
    function max(array) {
16266
      return (array && array.length)
16267
        ? baseExtremum(array, identity, baseGt)
16268
        : undefined;
16269
    }
16270
16271
    /**
16272
     * This method is like `_.max` except that it accepts `iteratee` which is
16273
     * invoked for each element in `array` to generate the criterion by which
16274
     * the value is ranked. The iteratee is invoked with one argument: (value).
16275
     *
16276
     * @static
16277
     * @memberOf _
16278
     * @since 4.0.0
16279
     * @category Math
16280
     * @param {Array} array The array to iterate over.
16281
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16282
     * @returns {*} Returns the maximum value.
16283
     * @example
16284
     *
16285
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
16286
     *
16287
     * _.maxBy(objects, function(o) { return o.n; });
16288
     * // => { 'n': 2 }
16289
     *
16290
     * // The `_.property` iteratee shorthand.
16291
     * _.maxBy(objects, 'n');
16292
     * // => { 'n': 2 }
16293
     */
16294
    function maxBy(array, iteratee) {
16295
      return (array && array.length)
16296
        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
16297
        : undefined;
16298
    }
16299
16300
    /**
16301
     * Computes the mean of the values in `array`.
16302
     *
16303
     * @static
16304
     * @memberOf _
16305
     * @since 4.0.0
16306
     * @category Math
16307
     * @param {Array} array The array to iterate over.
16308
     * @returns {number} Returns the mean.
16309
     * @example
16310
     *
16311
     * _.mean([4, 2, 8, 6]);
16312
     * // => 5
16313
     */
16314
    function mean(array) {
16315
      return baseMean(array, identity);
16316
    }
16317
16318
    /**
16319
     * This method is like `_.mean` except that it accepts `iteratee` which is
16320
     * invoked for each element in `array` to generate the value to be averaged.
16321
     * The iteratee is invoked with one argument: (value).
16322
     *
16323
     * @static
16324
     * @memberOf _
16325
     * @since 4.7.0
16326
     * @category Math
16327
     * @param {Array} array The array to iterate over.
16328
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16329
     * @returns {number} Returns the mean.
16330
     * @example
16331
     *
16332
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16333
     *
16334
     * _.meanBy(objects, function(o) { return o.n; });
16335
     * // => 5
16336
     *
16337
     * // The `_.property` iteratee shorthand.
16338
     * _.meanBy(objects, 'n');
16339
     * // => 5
16340
     */
16341
    function meanBy(array, iteratee) {
16342
      return baseMean(array, getIteratee(iteratee, 2));
16343
    }
16344
16345
    /**
16346
     * Computes the minimum value of `array`. If `array` is empty or falsey,
16347
     * `undefined` is returned.
16348
     *
16349
     * @static
16350
     * @since 0.1.0
16351
     * @memberOf _
16352
     * @category Math
16353
     * @param {Array} array The array to iterate over.
16354
     * @returns {*} Returns the minimum value.
16355
     * @example
16356
     *
16357
     * _.min([4, 2, 8, 6]);
16358
     * // => 2
16359
     *
16360
     * _.min([]);
16361
     * // => undefined
16362
     */
16363
    function min(array) {
16364
      return (array && array.length)
16365
        ? baseExtremum(array, identity, baseLt)
16366
        : undefined;
16367
    }
16368
16369
    /**
16370
     * This method is like `_.min` except that it accepts `iteratee` which is
16371
     * invoked for each element in `array` to generate the criterion by which
16372
     * the value is ranked. The iteratee is invoked with one argument: (value).
16373
     *
16374
     * @static
16375
     * @memberOf _
16376
     * @since 4.0.0
16377
     * @category Math
16378
     * @param {Array} array The array to iterate over.
16379
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16380
     * @returns {*} Returns the minimum value.
16381
     * @example
16382
     *
16383
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
16384
     *
16385
     * _.minBy(objects, function(o) { return o.n; });
16386
     * // => { 'n': 1 }
16387
     *
16388
     * // The `_.property` iteratee shorthand.
16389
     * _.minBy(objects, 'n');
16390
     * // => { 'n': 1 }
16391
     */
16392
    function minBy(array, iteratee) {
16393
      return (array && array.length)
16394
        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
16395
        : undefined;
16396
    }
16397
16398
    /**
16399
     * Multiply two numbers.
16400
     *
16401
     * @static
16402
     * @memberOf _
16403
     * @since 4.7.0
16404
     * @category Math
16405
     * @param {number} multiplier The first number in a multiplication.
16406
     * @param {number} multiplicand The second number in a multiplication.
16407
     * @returns {number} Returns the product.
16408
     * @example
16409
     *
16410
     * _.multiply(6, 4);
16411
     * // => 24
16412
     */
16413
    var multiply = createMathOperation(function(multiplier, multiplicand) {
16414
      return multiplier * multiplicand;
16415
    }, 1);
16416
16417
    /**
16418
     * Computes `number` rounded to `precision`.
16419
     *
16420
     * @static
16421
     * @memberOf _
16422
     * @since 3.10.0
16423
     * @category Math
16424
     * @param {number} number The number to round.
16425
     * @param {number} [precision=0] The precision to round to.
16426
     * @returns {number} Returns the rounded number.
16427
     * @example
16428
     *
16429
     * _.round(4.006);
16430
     * // => 4
16431
     *
16432
     * _.round(4.006, 2);
16433
     * // => 4.01
16434
     *
16435
     * _.round(4060, -2);
16436
     * // => 4100
16437
     */
16438
    var round = createRound('round');
16439
16440
    /**
16441
     * Subtract two numbers.
16442
     *
16443
     * @static
16444
     * @memberOf _
16445
     * @since 4.0.0
16446
     * @category Math
16447
     * @param {number} minuend The first number in a subtraction.
16448
     * @param {number} subtrahend The second number in a subtraction.
16449
     * @returns {number} Returns the difference.
16450
     * @example
16451
     *
16452
     * _.subtract(6, 4);
16453
     * // => 2
16454
     */
16455
    var subtract = createMathOperation(function(minuend, subtrahend) {
16456
      return minuend - subtrahend;
16457
    }, 0);
16458
16459
    /**
16460
     * Computes the sum of the values in `array`.
16461
     *
16462
     * @static
16463
     * @memberOf _
16464
     * @since 3.4.0
16465
     * @category Math
16466
     * @param {Array} array The array to iterate over.
16467
     * @returns {number} Returns the sum.
16468
     * @example
16469
     *
16470
     * _.sum([4, 2, 8, 6]);
16471
     * // => 20
16472
     */
16473
    function sum(array) {
16474
      return (array && array.length)
16475
        ? baseSum(array, identity)
16476
        : 0;
16477
    }
16478
16479
    /**
16480
     * This method is like `_.sum` except that it accepts `iteratee` which is
16481
     * invoked for each element in `array` to generate the value to be summed.
16482
     * The iteratee is invoked with one argument: (value).
16483
     *
16484
     * @static
16485
     * @memberOf _
16486
     * @since 4.0.0
16487
     * @category Math
16488
     * @param {Array} array The array to iterate over.
16489
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16490
     * @returns {number} Returns the sum.
16491
     * @example
16492
     *
16493
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16494
     *
16495
     * _.sumBy(objects, function(o) { return o.n; });
16496
     * // => 20
16497
     *
16498
     * // The `_.property` iteratee shorthand.
16499
     * _.sumBy(objects, 'n');
16500
     * // => 20
16501
     */
16502
    function sumBy(array, iteratee) {
16503
      return (array && array.length)
16504
        ? baseSum(array, getIteratee(iteratee, 2))
16505
        : 0;
16506
    }
16507
16508
    /*------------------------------------------------------------------------*/
16509
16510
    // Add methods that return wrapped values in chain sequences.
16511
    lodash.after = after;
16512
    lodash.ary = ary;
16513
    lodash.assign = assign;
16514
    lodash.assignIn = assignIn;
16515
    lodash.assignInWith = assignInWith;
16516
    lodash.assignWith = assignWith;
16517
    lodash.at = at;
16518
    lodash.before = before;
16519
    lodash.bind = bind;
16520
    lodash.bindAll = bindAll;
16521
    lodash.bindKey = bindKey;
16522
    lodash.castArray = castArray;
16523
    lodash.chain = chain;
16524
    lodash.chunk = chunk;
16525
    lodash.compact = compact;
16526
    lodash.concat = concat;
16527
    lodash.cond = cond;
16528
    lodash.conforms = conforms;
16529
    lodash.constant = constant;
16530
    lodash.countBy = countBy;
16531
    lodash.create = create;
16532
    lodash.curry = curry;
16533
    lodash.curryRight = curryRight;
16534
    lodash.debounce = debounce;
16535
    lodash.defaults = defaults;
16536
    lodash.defaultsDeep = defaultsDeep;
16537
    lodash.defer = defer;
16538
    lodash.delay = delay;
16539
    lodash.difference = difference;
16540
    lodash.differenceBy = differenceBy;
16541
    lodash.differenceWith = differenceWith;
16542
    lodash.drop = drop;
16543
    lodash.dropRight = dropRight;
16544
    lodash.dropRightWhile = dropRightWhile;
16545
    lodash.dropWhile = dropWhile;
16546
    lodash.fill = fill;
16547
    lodash.filter = filter;
16548
    lodash.flatMap = flatMap;
16549
    lodash.flatMapDeep = flatMapDeep;
16550
    lodash.flatMapDepth = flatMapDepth;
16551
    lodash.flatten = flatten;
16552
    lodash.flattenDeep = flattenDeep;
16553
    lodash.flattenDepth = flattenDepth;
16554
    lodash.flip = flip;
16555
    lodash.flow = flow;
16556
    lodash.flowRight = flowRight;
16557
    lodash.fromPairs = fromPairs;
16558
    lodash.functions = functions;
16559
    lodash.functionsIn = functionsIn;
16560
    lodash.groupBy = groupBy;
16561
    lodash.initial = initial;
16562
    lodash.intersection = intersection;
16563
    lodash.intersectionBy = intersectionBy;
16564
    lodash.intersectionWith = intersectionWith;
16565
    lodash.invert = invert;
16566
    lodash.invertBy = invertBy;
16567
    lodash.invokeMap = invokeMap;
16568
    lodash.iteratee = iteratee;
16569
    lodash.keyBy = keyBy;
16570
    lodash.keys = keys;
16571
    lodash.keysIn = keysIn;
16572
    lodash.map = map;
16573
    lodash.mapKeys = mapKeys;
16574
    lodash.mapValues = mapValues;
16575
    lodash.matches = matches;
16576
    lodash.matchesProperty = matchesProperty;
16577
    lodash.memoize = memoize;
16578
    lodash.merge = merge;
16579
    lodash.mergeWith = mergeWith;
16580
    lodash.method = method;
16581
    lodash.methodOf = methodOf;
16582
    lodash.mixin = mixin;
16583
    lodash.negate = negate;
16584
    lodash.nthArg = nthArg;
16585
    lodash.omit = omit;
16586
    lodash.omitBy = omitBy;
16587
    lodash.once = once;
16588
    lodash.orderBy = orderBy;
16589
    lodash.over = over;
16590
    lodash.overArgs = overArgs;
16591
    lodash.overEvery = overEvery;
16592
    lodash.overSome = overSome;
16593
    lodash.partial = partial;
16594
    lodash.partialRight = partialRight;
16595
    lodash.partition = partition;
16596
    lodash.pick = pick;
16597
    lodash.pickBy = pickBy;
16598
    lodash.property = property;
16599
    lodash.propertyOf = propertyOf;
16600
    lodash.pull = pull;
16601
    lodash.pullAll = pullAll;
16602
    lodash.pullAllBy = pullAllBy;
16603
    lodash.pullAllWith = pullAllWith;
16604
    lodash.pullAt = pullAt;
16605
    lodash.range = range;
16606
    lodash.rangeRight = rangeRight;
16607
    lodash.rearg = rearg;
16608
    lodash.reject = reject;
16609
    lodash.remove = remove;
16610
    lodash.rest = rest;
16611
    lodash.reverse = reverse;
16612
    lodash.sampleSize = sampleSize;
16613
    lodash.set = set;
16614
    lodash.setWith = setWith;
16615
    lodash.shuffle = shuffle;
16616
    lodash.slice = slice;
16617
    lodash.sortBy = sortBy;
16618
    lodash.sortedUniq = sortedUniq;
16619
    lodash.sortedUniqBy = sortedUniqBy;
16620
    lodash.split = split;
16621
    lodash.spread = spread;
16622
    lodash.tail = tail;
16623
    lodash.take = take;
16624
    lodash.takeRight = takeRight;
16625
    lodash.takeRightWhile = takeRightWhile;
16626
    lodash.takeWhile = takeWhile;
16627
    lodash.tap = tap;
16628
    lodash.throttle = throttle;
16629
    lodash.thru = thru;
16630
    lodash.toArray = toArray;
16631
    lodash.toPairs = toPairs;
16632
    lodash.toPairsIn = toPairsIn;
16633
    lodash.toPath = toPath;
16634
    lodash.toPlainObject = toPlainObject;
16635
    lodash.transform = transform;
16636
    lodash.unary = unary;
16637
    lodash.union = union;
16638
    lodash.unionBy = unionBy;
16639
    lodash.unionWith = unionWith;
16640
    lodash.uniq = uniq;
16641
    lodash.uniqBy = uniqBy;
16642
    lodash.uniqWith = uniqWith;
16643
    lodash.unset = unset;
16644
    lodash.unzip = unzip;
16645
    lodash.unzipWith = unzipWith;
16646
    lodash.update = update;
16647
    lodash.updateWith = updateWith;
16648
    lodash.values = values;
16649
    lodash.valuesIn = valuesIn;
16650
    lodash.without = without;
16651
    lodash.words = words;
16652
    lodash.wrap = wrap;
16653
    lodash.xor = xor;
16654
    lodash.xorBy = xorBy;
16655
    lodash.xorWith = xorWith;
16656
    lodash.zip = zip;
16657
    lodash.zipObject = zipObject;
16658
    lodash.zipObjectDeep = zipObjectDeep;
16659
    lodash.zipWith = zipWith;
16660
16661
    // Add aliases.
16662
    lodash.entries = toPairs;
16663
    lodash.entriesIn = toPairsIn;
16664
    lodash.extend = assignIn;
16665
    lodash.extendWith = assignInWith;
16666
16667
    // Add methods to `lodash.prototype`.
16668
    mixin(lodash, lodash);
16669
16670
    /*------------------------------------------------------------------------*/
16671
16672
    // Add methods that return unwrapped values in chain sequences.
16673
    lodash.add = add;
16674
    lodash.attempt = attempt;
16675
    lodash.camelCase = camelCase;
16676
    lodash.capitalize = capitalize;
16677
    lodash.ceil = ceil;
16678
    lodash.clamp = clamp;
16679
    lodash.clone = clone;
16680
    lodash.cloneDeep = cloneDeep;
16681
    lodash.cloneDeepWith = cloneDeepWith;
16682
    lodash.cloneWith = cloneWith;
16683
    lodash.conformsTo = conformsTo;
16684
    lodash.deburr = deburr;
16685
    lodash.defaultTo = defaultTo;
16686
    lodash.divide = divide;
16687
    lodash.endsWith = endsWith;
16688
    lodash.eq = eq;
16689
    lodash.escape = escape;
16690
    lodash.escapeRegExp = escapeRegExp;
16691
    lodash.every = every;
16692
    lodash.find = find;
16693
    lodash.findIndex = findIndex;
16694
    lodash.findKey = findKey;
16695
    lodash.findLast = findLast;
16696
    lodash.findLastIndex = findLastIndex;
16697
    lodash.findLastKey = findLastKey;
16698
    lodash.floor = floor;
16699
    lodash.forEach = forEach;
16700
    lodash.forEachRight = forEachRight;
16701
    lodash.forIn = forIn;
16702
    lodash.forInRight = forInRight;
16703
    lodash.forOwn = forOwn;
16704
    lodash.forOwnRight = forOwnRight;
16705
    lodash.get = get;
16706
    lodash.gt = gt;
16707
    lodash.gte = gte;
16708
    lodash.has = has;
16709
    lodash.hasIn = hasIn;
16710
    lodash.head = head;
16711
    lodash.identity = identity;
16712
    lodash.includes = includes;
16713
    lodash.indexOf = indexOf;
16714
    lodash.inRange = inRange;
16715
    lodash.invoke = invoke;
16716
    lodash.isArguments = isArguments;
16717
    lodash.isArray = isArray;
16718
    lodash.isArrayBuffer = isArrayBuffer;
16719
    lodash.isArrayLike = isArrayLike;
16720
    lodash.isArrayLikeObject = isArrayLikeObject;
16721
    lodash.isBoolean = isBoolean;
16722
    lodash.isBuffer = isBuffer;
16723
    lodash.isDate = isDate;
16724
    lodash.isElement = isElement;
16725
    lodash.isEmpty = isEmpty;
16726
    lodash.isEqual = isEqual;
16727
    lodash.isEqualWith = isEqualWith;
16728
    lodash.isError = isError;
16729
    lodash.isFinite = isFinite;
16730
    lodash.isFunction = isFunction;
16731
    lodash.isInteger = isInteger;
16732
    lodash.isLength = isLength;
16733
    lodash.isMap = isMap;
16734
    lodash.isMatch = isMatch;
16735
    lodash.isMatchWith = isMatchWith;
16736
    lodash.isNaN = isNaN;
16737
    lodash.isNative = isNative;
16738
    lodash.isNil = isNil;
16739
    lodash.isNull = isNull;
16740
    lodash.isNumber = isNumber;
16741
    lodash.isObject = isObject;
16742
    lodash.isObjectLike = isObjectLike;
16743
    lodash.isPlainObject = isPlainObject;
16744
    lodash.isRegExp = isRegExp;
16745
    lodash.isSafeInteger = isSafeInteger;
16746
    lodash.isSet = isSet;
16747
    lodash.isString = isString;
16748
    lodash.isSymbol = isSymbol;
16749
    lodash.isTypedArray = isTypedArray;
16750
    lodash.isUndefined = isUndefined;
16751
    lodash.isWeakMap = isWeakMap;
16752
    lodash.isWeakSet = isWeakSet;
16753
    lodash.join = join;
16754
    lodash.kebabCase = kebabCase;
16755
    lodash.last = last;
16756
    lodash.lastIndexOf = lastIndexOf;
16757
    lodash.lowerCase = lowerCase;
16758
    lodash.lowerFirst = lowerFirst;
16759
    lodash.lt = lt;
16760
    lodash.lte = lte;
16761
    lodash.max = max;
16762
    lodash.maxBy = maxBy;
16763
    lodash.mean = mean;
16764
    lodash.meanBy = meanBy;
16765
    lodash.min = min;
16766
    lodash.minBy = minBy;
16767
    lodash.stubArray = stubArray;
16768
    lodash.stubFalse = stubFalse;
16769
    lodash.stubObject = stubObject;
16770
    lodash.stubString = stubString;
16771
    lodash.stubTrue = stubTrue;
16772
    lodash.multiply = multiply;
16773
    lodash.nth = nth;
16774
    lodash.noConflict = noConflict;
16775
    lodash.noop = noop;
16776
    lodash.now = now;
16777
    lodash.pad = pad;
16778
    lodash.padEnd = padEnd;
16779
    lodash.padStart = padStart;
16780
    lodash.parseInt = parseInt;
16781
    lodash.random = random;
16782
    lodash.reduce = reduce;
16783
    lodash.reduceRight = reduceRight;
16784
    lodash.repeat = repeat;
16785
    lodash.replace = replace;
16786
    lodash.result = result;
16787
    lodash.round = round;
16788
    lodash.runInContext = runInContext;
16789
    lodash.sample = sample;
16790
    lodash.size = size;
16791
    lodash.snakeCase = snakeCase;
16792
    lodash.some = some;
16793
    lodash.sortedIndex = sortedIndex;
16794
    lodash.sortedIndexBy = sortedIndexBy;
16795
    lodash.sortedIndexOf = sortedIndexOf;
16796
    lodash.sortedLastIndex = sortedLastIndex;
16797
    lodash.sortedLastIndexBy = sortedLastIndexBy;
16798
    lodash.sortedLastIndexOf = sortedLastIndexOf;
16799
    lodash.startCase = startCase;
16800
    lodash.startsWith = startsWith;
16801
    lodash.subtract = subtract;
16802
    lodash.sum = sum;
16803
    lodash.sumBy = sumBy;
16804
    lodash.template = template;
16805
    lodash.times = times;
16806
    lodash.toFinite = toFinite;
16807
    lodash.toInteger = toInteger;
16808
    lodash.toLength = toLength;
16809
    lodash.toLower = toLower;
16810
    lodash.toNumber = toNumber;
16811
    lodash.toSafeInteger = toSafeInteger;
16812
    lodash.toString = toString;
16813
    lodash.toUpper = toUpper;
16814
    lodash.trim = trim;
16815
    lodash.trimEnd = trimEnd;
16816
    lodash.trimStart = trimStart;
16817
    lodash.truncate = truncate;
16818
    lodash.unescape = unescape;
16819
    lodash.uniqueId = uniqueId;
16820
    lodash.upperCase = upperCase;
16821
    lodash.upperFirst = upperFirst;
16822
16823
    // Add aliases.
16824
    lodash.each = forEach;
16825
    lodash.eachRight = forEachRight;
16826
    lodash.first = head;
16827
16828
    mixin(lodash, (function() {
16829
      var source = {};
16830
      baseForOwn(lodash, function(func, methodName) {
16831
        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
16832
          source[methodName] = func;
16833
        }
16834
      });
16835
      return source;
16836
    }()), { 'chain': false });
16837
16838
    /*------------------------------------------------------------------------*/
16839
16840
    /**
16841
     * The semantic version number.
16842
     *
16843
     * @static
16844
     * @memberOf _
16845
     * @type {string}
16846
     */
16847
    lodash.VERSION = VERSION;
16848
16849
    // Assign default placeholders.
16850
    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
16851
      lodash[methodName].placeholder = lodash;
16852
    });
16853
16854
    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
16855
    arrayEach(['drop', 'take'], function(methodName, index) {
16856
      LazyWrapper.prototype[methodName] = function(n) {
16857
        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
16858
16859
        var result = (this.__filtered__ && !index)
16860
          ? new LazyWrapper(this)
16861
          : this.clone();
16862
16863
        if (result.__filtered__) {
16864
          result.__takeCount__ = nativeMin(n, result.__takeCount__);
16865
        } else {
16866
          result.__views__.push({
16867
            'size': nativeMin(n, MAX_ARRAY_LENGTH),
16868
            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
16869
          });
16870
        }
16871
        return result;
16872
      };
16873
16874
      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
16875
        return this.reverse()[methodName](n).reverse();
16876
      };
16877
    });
16878
16879
    // Add `LazyWrapper` methods that accept an `iteratee` value.
16880
    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
16881
      var type = index + 1,
16882
          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
16883
16884
      LazyWrapper.prototype[methodName] = function(iteratee) {
16885
        var result = this.clone();
16886
        result.__iteratees__.push({
16887
          'iteratee': getIteratee(iteratee, 3),
16888
          'type': type
16889
        });
16890
        result.__filtered__ = result.__filtered__ || isFilter;
16891
        return result;
16892
      };
16893
    });
16894
16895
    // Add `LazyWrapper` methods for `_.head` and `_.last`.
16896
    arrayEach(['head', 'last'], function(methodName, index) {
16897
      var takeName = 'take' + (index ? 'Right' : '');
16898
16899
      LazyWrapper.prototype[methodName] = function() {
16900
        return this[takeName](1).value()[0];
16901
      };
16902
    });
16903
16904
    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
16905
    arrayEach(['initial', 'tail'], function(methodName, index) {
16906
      var dropName = 'drop' + (index ? '' : 'Right');
16907
16908
      LazyWrapper.prototype[methodName] = function() {
16909
        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
16910
      };
16911
    });
16912
16913
    LazyWrapper.prototype.compact = function() {
16914
      return this.filter(identity);
16915
    };
16916
16917
    LazyWrapper.prototype.find = function(predicate) {
16918
      return this.filter(predicate).head();
16919
    };
16920
16921
    LazyWrapper.prototype.findLast = function(predicate) {
16922
      return this.reverse().find(predicate);
16923
    };
16924
16925
    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
16926
      if (typeof path == 'function') {
16927
        return new LazyWrapper(this);
16928
      }
16929
      return this.map(function(value) {
16930
        return baseInvoke(value, path, args);
16931
      });
16932
    });
16933
16934
    LazyWrapper.prototype.reject = function(predicate) {
16935
      return this.filter(negate(getIteratee(predicate)));
16936
    };
16937
16938
    LazyWrapper.prototype.slice = function(start, end) {
16939
      start = toInteger(start);
16940
16941
      var result = this;
16942
      if (result.__filtered__ && (start > 0 || end < 0)) {
16943
        return new LazyWrapper(result);
16944
      }
16945
      if (start < 0) {
16946
        result = result.takeRight(-start);
16947
      } else if (start) {
16948
        result = result.drop(start);
16949
      }
16950
      if (end !== undefined) {
16951
        end = toInteger(end);
16952
        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
16953
      }
16954
      return result;
16955
    };
16956
16957
    LazyWrapper.prototype.takeRightWhile = function(predicate) {
16958
      return this.reverse().takeWhile(predicate).reverse();
16959
    };
16960
16961
    LazyWrapper.prototype.toArray = function() {
16962
      return this.take(MAX_ARRAY_LENGTH);
16963
    };
16964
16965
    // Add `LazyWrapper` methods to `lodash.prototype`.
16966
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
16967
      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
16968
          isTaker = /^(?:head|last)$/.test(methodName),
16969
          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
16970
          retUnwrapped = isTaker || /^find/.test(methodName);
16971
16972
      if (!lodashFunc) {
16973
        return;
16974
      }
16975
      lodash.prototype[methodName] = function() {
16976
        var value = this.__wrapped__,
16977
            args = isTaker ? [1] : arguments,
16978
            isLazy = value instanceof LazyWrapper,
16979
            iteratee = args[0],
16980
            useLazy = isLazy || isArray(value);
16981
16982
        var interceptor = function(value) {
16983
          var result = lodashFunc.apply(lodash, arrayPush([value], args));
16984
          return (isTaker && chainAll) ? result[0] : result;
16985
        };
16986
16987
        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
16988
          // Avoid lazy use if the iteratee has a "length" value other than `1`.
16989
          isLazy = useLazy = false;
16990
        }
16991
        var chainAll = this.__chain__,
16992
            isHybrid = !!this.__actions__.length,
16993
            isUnwrapped = retUnwrapped && !chainAll,
16994
            onlyLazy = isLazy && !isHybrid;
16995
16996
        if (!retUnwrapped && useLazy) {
16997
          value = onlyLazy ? value : new LazyWrapper(this);
16998
          var result = func.apply(value, args);
16999
          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
17000
          return new LodashWrapper(result, chainAll);
17001
        }
17002
        if (isUnwrapped && onlyLazy) {
17003
          return func.apply(this, args);
17004
        }
17005
        result = this.thru(interceptor);
17006
        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
17007
      };
17008
    });
17009
17010
    // Add `Array` methods to `lodash.prototype`.
17011
    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
17012
      var func = arrayProto[methodName],
17013
          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
17014
          retUnwrapped = /^(?:pop|shift)$/.test(methodName);
17015
17016
      lodash.prototype[methodName] = function() {
17017
        var args = arguments;
17018
        if (retUnwrapped && !this.__chain__) {
17019
          var value = this.value();
17020
          return func.apply(isArray(value) ? value : [], args);
17021
        }
17022
        return this[chainName](function(value) {
17023
          return func.apply(isArray(value) ? value : [], args);
17024
        });
17025
      };
17026
    });
17027
17028
    // Map minified method names to their real names.
17029
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
17030
      var lodashFunc = lodash[methodName];
17031
      if (lodashFunc) {
17032
        var key = (lodashFunc.name + ''),
17033
            names = realNames[key] || (realNames[key] = []);
17034
17035
        names.push({ 'name': methodName, 'func': lodashFunc });
17036
      }
17037
    });
17038
17039
    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
17040
      'name': 'wrapper',
17041
      'func': undefined
17042
    }];
17043
17044
    // Add methods to `LazyWrapper`.
17045
    LazyWrapper.prototype.clone = lazyClone;
17046
    LazyWrapper.prototype.reverse = lazyReverse;
17047
    LazyWrapper.prototype.value = lazyValue;
17048
17049
    // Add chain sequence methods to the `lodash` wrapper.
17050
    lodash.prototype.at = wrapperAt;
17051
    lodash.prototype.chain = wrapperChain;
17052
    lodash.prototype.commit = wrapperCommit;
17053
    lodash.prototype.next = wrapperNext;
17054
    lodash.prototype.plant = wrapperPlant;
17055
    lodash.prototype.reverse = wrapperReverse;
17056
    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
17057
17058
    // Add lazy aliases.
17059
    lodash.prototype.first = lodash.prototype.head;
17060
17061
    if (symIterator) {
17062
      lodash.prototype[symIterator] = wrapperToIterator;
17063
    }
17064
    return lodash;
17065
  });
17066
17067
  /*--------------------------------------------------------------------------*/
17068
17069
  // Export lodash.
17070
  var _ = runInContext();
17071
17072
  // Some AMD build optimizers, like r.js, check for condition patterns like:
17073
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
17074
    // Expose Lodash on the global object to prevent errors when Lodash is
17075
    // loaded by a script tag in the presence of an AMD loader.
17076
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
17077
    // Use `_.noConflict` to remove Lodash from the global object.
17078
    root._ = _;
17079
17080
    // Define as an anonymous module so, through path mapping, it can be
17081
    // referenced as the "underscore" module.
17082
    define(function() {
17083
      return _;
17084
    });
17085
  }
17086
  // Check for `exports` after `define` in case a build optimizer adds it.
17087
  else if (freeModule) {
17088
    // Export for Node.js.
17089
    (freeModule.exports = _)._ = _;
17090
    // Export for CommonJS support.
17091
    freeExports._ = _;
17092
  }
17093
  else {
17094
    // Export to the global object.
17095
    root._ = _;
17096
  }
17097
}.call(this));