comparison env/lib/python3.9/site-packages/cwltool/jshint/jshint.js @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 /*! 2.12.0 */
2 var JSHINT;
3 if (typeof window === 'undefined') window = {};
4 (function () {
5 var require;
6 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
7 var identifierStartTable = [];
8
9 for (var i = 0; i < 128; i++) {
10 identifierStartTable[i] =
11 i === 36 || // $
12 i >= 65 && i <= 90 || // A-Z
13 i === 95 || // _
14 i >= 97 && i <= 122; // a-z
15 }
16
17 var identifierPartTable = [];
18
19 for (var i = 0; i < 128; i++) {
20 identifierPartTable[i] =
21 identifierStartTable[i] || // $, _, A-Z, a-z
22 i >= 48 && i <= 57; // 0-9
23 }
24
25 module.exports = {
26 asciiIdentifierStartTable: identifierStartTable,
27 asciiIdentifierPartTable: identifierPartTable
28 };
29
30 },{}],2:[function(require,module,exports){
31 module.exports = /^(?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0525\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0621-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971\u0972\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3D\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC\u0EDD\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8B\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u2094\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCB\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA65F\uA662-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B\uA78C\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA2D\uFA30-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC])(?:[\$0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0525\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0621-\u065E\u0660-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0900-\u0939\u093C-\u094E\u0950-\u0955\u0958-\u0963\u0966-\u096F\u0971\u0972\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC\u0EDD\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BAA\u1BAE-\u1BB9\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF2\u1D00-\u1DE6\u1DFD-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u2094\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF1\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCB\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA65F\uA662-\uA66F\uA67C\uA67D\uA67F-\uA697\uA6A0-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B\uA78C\uA7FB-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA2D\uFA30-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC])*$/;
32 },{}],3:[function(require,module,exports){
33 var str = '183,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,903,1155,1156,1157,1158,1159,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1648,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1767,1768,1770,1771,1772,1773,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,2027,2028,2029,2030,2031,2032,2033,2034,2035,2045,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2137,2138,2139,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2362,2363,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2385,2386,2387,2388,2389,2390,2391,2402,2403,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2433,2434,2435,2492,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2509,2519,2530,2531,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2558,2561,2562,2563,2620,2622,2623,2624,2625,2626,2631,2632,2635,2636,2637,2641,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2677,2689,2690,2691,2748,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2765,2786,2787,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2810,2811,2812,2813,2814,2815,2817,2818,2819,2876,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2893,2902,2903,2914,2915,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2946,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3021,3031,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3072,3073,3074,3075,3076,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3149,3157,3158,3170,3171,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3201,3202,3203,3260,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3277,3285,3286,3298,3299,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3328,3329,3330,3331,3387,3388,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3405,3415,3426,3427,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3458,3459,3530,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3570,3571,3633,3636,3637,3638,3639,3640,3641,3642,3655,3656,3657,3658,3659,3660,3661,3662,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3761,3764,3765,3766,3767,3768,3769,3771,3772,3784,3785,3786,3787,3788,3789,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3864,3865,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3893,3895,3897,3902,3903,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3974,3975,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,4158,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4182,4183,4184,4185,4190,4191,4192,4194,4195,4196,4199,4200,4201,4202,4203,4204,4205,4209,4210,4211,4212,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4957,4958,4959,4969,4970,4971,4972,4973,4974,4975,4976,4977,5906,5907,5908,5938,5939,5940,5970,5971,6002,6003,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6109,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6155,6156,6157,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6313,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6618,6679,6680,6681,6682,6683,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6912,6913,6914,6915,6916,6964,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7042,7073,7074,7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,7155,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7405,7410,7411,7412,7415,7416,7417,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7675,7676,7677,7678,7679,8204,8205,8255,8256,8276,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,11503,11504,11505,11647,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12330,12331,12332,12333,12334,12335,12441,12442,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,42607,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42654,42655,42736,42737,43010,43014,43019,43043,43044,43045,43046,43047,43136,43137,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43204,43205,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43263,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43302,43303,43304,43305,43306,43307,43308,43309,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43347,43392,43393,43394,43395,43443,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43456,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43493,43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43587,43596,43597,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,43643,43644,43645,43696,43698,43699,43700,43703,43704,43710,43711,43713,43755,43756,43757,43758,43759,43765,43766,44003,44004,44005,44006,44007,44008,44009,44010,44012,44013,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,64286,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65075,65076,65101,65102,65103,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65343';
34 var arr = str.split(',').map(function(code) {
35 return parseInt(code, 10);
36 });
37 module.exports = arr;
38 },{}],4:[function(require,module,exports){
39 var str = '170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,880,881,882,883,884,886,887,890,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1765,1766,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2230,2231,2232,2233,2234,2235,2236,2237,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2556,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2809,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3160,3161,3162,3168,3169,3200,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3294,3296,3297,3313,3314,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3412,3413,3414,3423,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3648,3649,3650,3651,3652,3653,3654,3713,3714,3716,3719,3720,3722,3725,3732,3733,3734,3735,3737,3738,3739,3740,3741,3742,3743,3745,3746,3747,3749,3751,3754,3755,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3782,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5902,5903,5904,5905,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6103,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6823,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7401,7402,7403,7404,7406,7407,7408,7409,7413,7414,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12443,12444,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43261,43262,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43471,43488,43489,43490,43491,43492,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43763,43764,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500';
40 var arr = str.split(',').map(function(code) {
41 return parseInt(code, 10);
42 });
43 module.exports = arr;
44 },{}],5:[function(require,module,exports){
45 // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
46 //
47 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
48 //
49 // Originally from narwhal.js (http://narwhaljs.org)
50 // Copyright (c) 2009 Thomas Robinson <280north.com>
51 //
52 // Permission is hereby granted, free of charge, to any person obtaining a copy
53 // of this software and associated documentation files (the 'Software'), to
54 // deal in the Software without restriction, including without limitation the
55 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
56 // sell copies of the Software, and to permit persons to whom the Software is
57 // furnished to do so, subject to the following conditions:
58 //
59 // The above copyright notice and this permission notice shall be included in
60 // all copies or substantial portions of the Software.
61 //
62 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
66 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
67 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
68
69 // when used in node, this will actually load the util module we depend on
70 // versus loading the builtin util module as happens otherwise
71 // this is a bug in node module loading as far as I am concerned
72 var util = require('util/');
73
74 var pSlice = Array.prototype.slice;
75 var hasOwn = Object.prototype.hasOwnProperty;
76
77 // 1. The assert module provides functions that throw
78 // AssertionError's when particular conditions are not met. The
79 // assert module must conform to the following interface.
80
81 var assert = module.exports = ok;
82
83 // 2. The AssertionError is defined in assert.
84 // new assert.AssertionError({ message: message,
85 // actual: actual,
86 // expected: expected })
87
88 assert.AssertionError = function AssertionError(options) {
89 this.name = 'AssertionError';
90 this.actual = options.actual;
91 this.expected = options.expected;
92 this.operator = options.operator;
93 if (options.message) {
94 this.message = options.message;
95 this.generatedMessage = false;
96 } else {
97 this.message = getMessage(this);
98 this.generatedMessage = true;
99 }
100 var stackStartFunction = options.stackStartFunction || fail;
101
102 if (Error.captureStackTrace) {
103 Error.captureStackTrace(this, stackStartFunction);
104 }
105 else {
106 // non v8 browsers so we can have a stacktrace
107 var err = new Error();
108 if (err.stack) {
109 var out = err.stack;
110
111 // try to strip useless frames
112 var fn_name = stackStartFunction.name;
113 var idx = out.indexOf('\n' + fn_name);
114 if (idx >= 0) {
115 // once we have located the function frame
116 // we need to strip out everything before it (and its line)
117 var next_line = out.indexOf('\n', idx + 1);
118 out = out.substring(next_line + 1);
119 }
120
121 this.stack = out;
122 }
123 }
124 };
125
126 // assert.AssertionError instanceof Error
127 util.inherits(assert.AssertionError, Error);
128
129 function replacer(key, value) {
130 if (util.isUndefined(value)) {
131 return '' + value;
132 }
133 if (util.isNumber(value) && !isFinite(value)) {
134 return value.toString();
135 }
136 if (util.isFunction(value) || util.isRegExp(value)) {
137 return value.toString();
138 }
139 return value;
140 }
141
142 function truncate(s, n) {
143 if (util.isString(s)) {
144 return s.length < n ? s : s.slice(0, n);
145 } else {
146 return s;
147 }
148 }
149
150 function getMessage(self) {
151 return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
152 self.operator + ' ' +
153 truncate(JSON.stringify(self.expected, replacer), 128);
154 }
155
156 // At present only the three keys mentioned above are used and
157 // understood by the spec. Implementations or sub modules can pass
158 // other keys to the AssertionError's constructor - they will be
159 // ignored.
160
161 // 3. All of the following functions must throw an AssertionError
162 // when a corresponding condition is not met, with a message that
163 // may be undefined if not provided. All assertion methods provide
164 // both the actual and expected values to the assertion error for
165 // display purposes.
166
167 function fail(actual, expected, message, operator, stackStartFunction) {
168 throw new assert.AssertionError({
169 message: message,
170 actual: actual,
171 expected: expected,
172 operator: operator,
173 stackStartFunction: stackStartFunction
174 });
175 }
176
177 // EXTENSION! allows for well behaved errors defined elsewhere.
178 assert.fail = fail;
179
180 // 4. Pure assertion tests whether a value is truthy, as determined
181 // by !!guard.
182 // assert.ok(guard, message_opt);
183 // This statement is equivalent to assert.equal(true, !!guard,
184 // message_opt);. To test strictly for the value true, use
185 // assert.strictEqual(true, guard, message_opt);.
186
187 function ok(value, message) {
188 if (!value) fail(value, true, message, '==', assert.ok);
189 }
190 assert.ok = ok;
191
192 // 5. The equality assertion tests shallow, coercive equality with
193 // ==.
194 // assert.equal(actual, expected, message_opt);
195
196 assert.equal = function equal(actual, expected, message) {
197 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
198 };
199
200 // 6. The non-equality assertion tests for whether two objects are not equal
201 // with != assert.notEqual(actual, expected, message_opt);
202
203 assert.notEqual = function notEqual(actual, expected, message) {
204 if (actual == expected) {
205 fail(actual, expected, message, '!=', assert.notEqual);
206 }
207 };
208
209 // 7. The equivalence assertion tests a deep equality relation.
210 // assert.deepEqual(actual, expected, message_opt);
211
212 assert.deepEqual = function deepEqual(actual, expected, message) {
213 if (!_deepEqual(actual, expected)) {
214 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
215 }
216 };
217
218 function _deepEqual(actual, expected) {
219 // 7.1. All identical values are equivalent, as determined by ===.
220 if (actual === expected) {
221 return true;
222
223 } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
224 if (actual.length != expected.length) return false;
225
226 for (var i = 0; i < actual.length; i++) {
227 if (actual[i] !== expected[i]) return false;
228 }
229
230 return true;
231
232 // 7.2. If the expected value is a Date object, the actual value is
233 // equivalent if it is also a Date object that refers to the same time.
234 } else if (util.isDate(actual) && util.isDate(expected)) {
235 return actual.getTime() === expected.getTime();
236
237 // 7.3 If the expected value is a RegExp object, the actual value is
238 // equivalent if it is also a RegExp object with the same source and
239 // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
240 } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
241 return actual.source === expected.source &&
242 actual.global === expected.global &&
243 actual.multiline === expected.multiline &&
244 actual.lastIndex === expected.lastIndex &&
245 actual.ignoreCase === expected.ignoreCase;
246
247 // 7.4. Other pairs that do not both pass typeof value == 'object',
248 // equivalence is determined by ==.
249 } else if (!util.isObject(actual) && !util.isObject(expected)) {
250 return actual == expected;
251
252 // 7.5 For all other Object pairs, including Array objects, equivalence is
253 // determined by having the same number of owned properties (as verified
254 // with Object.prototype.hasOwnProperty.call), the same set of keys
255 // (although not necessarily the same order), equivalent values for every
256 // corresponding key, and an identical 'prototype' property. Note: this
257 // accounts for both named and indexed properties on Arrays.
258 } else {
259 return objEquiv(actual, expected);
260 }
261 }
262
263 function isArguments(object) {
264 return Object.prototype.toString.call(object) == '[object Arguments]';
265 }
266
267 function objEquiv(a, b) {
268 if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
269 return false;
270 // an identical 'prototype' property.
271 if (a.prototype !== b.prototype) return false;
272 // if one is a primitive, the other must be same
273 if (util.isPrimitive(a) || util.isPrimitive(b)) {
274 return a === b;
275 }
276 var aIsArgs = isArguments(a),
277 bIsArgs = isArguments(b);
278 if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
279 return false;
280 if (aIsArgs) {
281 a = pSlice.call(a);
282 b = pSlice.call(b);
283 return _deepEqual(a, b);
284 }
285 var ka = objectKeys(a),
286 kb = objectKeys(b),
287 key, i;
288 // having the same number of owned properties (keys incorporates
289 // hasOwnProperty)
290 if (ka.length != kb.length)
291 return false;
292 //the same set of keys (although not necessarily the same order),
293 ka.sort();
294 kb.sort();
295 //~~~cheap key test
296 for (i = ka.length - 1; i >= 0; i--) {
297 if (ka[i] != kb[i])
298 return false;
299 }
300 //equivalent values for every corresponding key, and
301 //~~~possibly expensive deep test
302 for (i = ka.length - 1; i >= 0; i--) {
303 key = ka[i];
304 if (!_deepEqual(a[key], b[key])) return false;
305 }
306 return true;
307 }
308
309 // 8. The non-equivalence assertion tests for any deep inequality.
310 // assert.notDeepEqual(actual, expected, message_opt);
311
312 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
313 if (_deepEqual(actual, expected)) {
314 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
315 }
316 };
317
318 // 9. The strict equality assertion tests strict equality, as determined by ===.
319 // assert.strictEqual(actual, expected, message_opt);
320
321 assert.strictEqual = function strictEqual(actual, expected, message) {
322 if (actual !== expected) {
323 fail(actual, expected, message, '===', assert.strictEqual);
324 }
325 };
326
327 // 10. The strict non-equality assertion tests for strict inequality, as
328 // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
329
330 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
331 if (actual === expected) {
332 fail(actual, expected, message, '!==', assert.notStrictEqual);
333 }
334 };
335
336 function expectedException(actual, expected) {
337 if (!actual || !expected) {
338 return false;
339 }
340
341 if (Object.prototype.toString.call(expected) == '[object RegExp]') {
342 return expected.test(actual);
343 } else if (actual instanceof expected) {
344 return true;
345 } else if (expected.call({}, actual) === true) {
346 return true;
347 }
348
349 return false;
350 }
351
352 function _throws(shouldThrow, block, expected, message) {
353 var actual;
354
355 if (util.isString(expected)) {
356 message = expected;
357 expected = null;
358 }
359
360 try {
361 block();
362 } catch (e) {
363 actual = e;
364 }
365
366 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
367 (message ? ' ' + message : '.');
368
369 if (shouldThrow && !actual) {
370 fail(actual, expected, 'Missing expected exception' + message);
371 }
372
373 if (!shouldThrow && expectedException(actual, expected)) {
374 fail(actual, expected, 'Got unwanted exception' + message);
375 }
376
377 if ((shouldThrow && actual && expected &&
378 !expectedException(actual, expected)) || (!shouldThrow && actual)) {
379 throw actual;
380 }
381 }
382
383 // 11. Expected to throw an error:
384 // assert.throws(block, Error_opt, message_opt);
385
386 assert.throws = function(block, /*optional*/error, /*optional*/message) {
387 _throws.apply(this, [true].concat(pSlice.call(arguments)));
388 };
389
390 // EXTENSION! This is annoying to write outside this module.
391 assert.doesNotThrow = function(block, /*optional*/message) {
392 _throws.apply(this, [false].concat(pSlice.call(arguments)));
393 };
394
395 assert.ifError = function(err) { if (err) {throw err;}};
396
397 var objectKeys = Object.keys || function (obj) {
398 var keys = [];
399 for (var key in obj) {
400 if (hasOwn.call(obj, key)) keys.push(key);
401 }
402 return keys;
403 };
404
405 },{"util/":8}],6:[function(require,module,exports){
406 if (typeof Object.create === 'function') {
407 // implementation from standard node.js 'util' module
408 module.exports = function inherits(ctor, superCtor) {
409 ctor.super_ = superCtor
410 ctor.prototype = Object.create(superCtor.prototype, {
411 constructor: {
412 value: ctor,
413 enumerable: false,
414 writable: true,
415 configurable: true
416 }
417 });
418 };
419 } else {
420 // old school shim for old browsers
421 module.exports = function inherits(ctor, superCtor) {
422 ctor.super_ = superCtor
423 var TempCtor = function () {}
424 TempCtor.prototype = superCtor.prototype
425 ctor.prototype = new TempCtor()
426 ctor.prototype.constructor = ctor
427 }
428 }
429
430 },{}],7:[function(require,module,exports){
431 module.exports = function isBuffer(arg) {
432 return arg && typeof arg === 'object'
433 && typeof arg.copy === 'function'
434 && typeof arg.fill === 'function'
435 && typeof arg.readUInt8 === 'function';
436 }
437 },{}],8:[function(require,module,exports){
438 (function (process,global){
439 // Copyright Joyent, Inc. and other Node contributors.
440 //
441 // Permission is hereby granted, free of charge, to any person obtaining a
442 // copy of this software and associated documentation files (the
443 // "Software"), to deal in the Software without restriction, including
444 // without limitation the rights to use, copy, modify, merge, publish,
445 // distribute, sublicense, and/or sell copies of the Software, and to permit
446 // persons to whom the Software is furnished to do so, subject to the
447 // following conditions:
448 //
449 // The above copyright notice and this permission notice shall be included
450 // in all copies or substantial portions of the Software.
451 //
452 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
453 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
454 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
455 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
456 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
457 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
458 // USE OR OTHER DEALINGS IN THE SOFTWARE.
459
460 var formatRegExp = /%[sdj%]/g;
461 exports.format = function(f) {
462 if (!isString(f)) {
463 var objects = [];
464 for (var i = 0; i < arguments.length; i++) {
465 objects.push(inspect(arguments[i]));
466 }
467 return objects.join(' ');
468 }
469
470 var i = 1;
471 var args = arguments;
472 var len = args.length;
473 var str = String(f).replace(formatRegExp, function(x) {
474 if (x === '%%') return '%';
475 if (i >= len) return x;
476 switch (x) {
477 case '%s': return String(args[i++]);
478 case '%d': return Number(args[i++]);
479 case '%j':
480 try {
481 return JSON.stringify(args[i++]);
482 } catch (_) {
483 return '[Circular]';
484 }
485 default:
486 return x;
487 }
488 });
489 for (var x = args[i]; i < len; x = args[++i]) {
490 if (isNull(x) || !isObject(x)) {
491 str += ' ' + x;
492 } else {
493 str += ' ' + inspect(x);
494 }
495 }
496 return str;
497 };
498
499
500 // Mark that a method should not be used.
501 // Returns a modified function which warns once by default.
502 // If --no-deprecation is set, then it is a no-op.
503 exports.deprecate = function(fn, msg) {
504 // Allow for deprecating things in the process of starting up.
505 if (isUndefined(global.process)) {
506 return function() {
507 return exports.deprecate(fn, msg).apply(this, arguments);
508 };
509 }
510
511 if (process.noDeprecation === true) {
512 return fn;
513 }
514
515 var warned = false;
516 function deprecated() {
517 if (!warned) {
518 if (process.throwDeprecation) {
519 throw new Error(msg);
520 } else if (process.traceDeprecation) {
521 console.trace(msg);
522 } else {
523 console.error(msg);
524 }
525 warned = true;
526 }
527 return fn.apply(this, arguments);
528 }
529
530 return deprecated;
531 };
532
533
534 var debugs = {};
535 var debugEnviron;
536 exports.debuglog = function(set) {
537 if (isUndefined(debugEnviron))
538 debugEnviron = process.env.NODE_DEBUG || '';
539 set = set.toUpperCase();
540 if (!debugs[set]) {
541 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
542 var pid = process.pid;
543 debugs[set] = function() {
544 var msg = exports.format.apply(exports, arguments);
545 console.error('%s %d: %s', set, pid, msg);
546 };
547 } else {
548 debugs[set] = function() {};
549 }
550 }
551 return debugs[set];
552 };
553
554
555 /**
556 * Echos the value of a value. Trys to print the value out
557 * in the best way possible given the different types.
558 *
559 * @param {Object} obj The object to print out.
560 * @param {Object} opts Optional options object that alters the output.
561 */
562 /* legacy: obj, showHidden, depth, colors*/
563 function inspect(obj, opts) {
564 // default options
565 var ctx = {
566 seen: [],
567 stylize: stylizeNoColor
568 };
569 // legacy...
570 if (arguments.length >= 3) ctx.depth = arguments[2];
571 if (arguments.length >= 4) ctx.colors = arguments[3];
572 if (isBoolean(opts)) {
573 // legacy...
574 ctx.showHidden = opts;
575 } else if (opts) {
576 // got an "options" object
577 exports._extend(ctx, opts);
578 }
579 // set default options
580 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
581 if (isUndefined(ctx.depth)) ctx.depth = 2;
582 if (isUndefined(ctx.colors)) ctx.colors = false;
583 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
584 if (ctx.colors) ctx.stylize = stylizeWithColor;
585 return formatValue(ctx, obj, ctx.depth);
586 }
587 exports.inspect = inspect;
588
589
590 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
591 inspect.colors = {
592 'bold' : [1, 22],
593 'italic' : [3, 23],
594 'underline' : [4, 24],
595 'inverse' : [7, 27],
596 'white' : [37, 39],
597 'grey' : [90, 39],
598 'black' : [30, 39],
599 'blue' : [34, 39],
600 'cyan' : [36, 39],
601 'green' : [32, 39],
602 'magenta' : [35, 39],
603 'red' : [31, 39],
604 'yellow' : [33, 39]
605 };
606
607 // Don't use 'blue' not visible on cmd.exe
608 inspect.styles = {
609 'special': 'cyan',
610 'number': 'yellow',
611 'boolean': 'yellow',
612 'undefined': 'grey',
613 'null': 'bold',
614 'string': 'green',
615 'date': 'magenta',
616 // "name": intentionally not styling
617 'regexp': 'red'
618 };
619
620
621 function stylizeWithColor(str, styleType) {
622 var style = inspect.styles[styleType];
623
624 if (style) {
625 return '\u001b[' + inspect.colors[style][0] + 'm' + str +
626 '\u001b[' + inspect.colors[style][1] + 'm';
627 } else {
628 return str;
629 }
630 }
631
632
633 function stylizeNoColor(str, styleType) {
634 return str;
635 }
636
637
638 function arrayToHash(array) {
639 var hash = {};
640
641 array.forEach(function(val, idx) {
642 hash[val] = true;
643 });
644
645 return hash;
646 }
647
648
649 function formatValue(ctx, value, recurseTimes) {
650 // Provide a hook for user-specified inspect functions.
651 // Check that value is an object with an inspect function on it
652 if (ctx.customInspect &&
653 value &&
654 isFunction(value.inspect) &&
655 // Filter out the util module, it's inspect function is special
656 value.inspect !== exports.inspect &&
657 // Also filter out any prototype objects using the circular check.
658 !(value.constructor && value.constructor.prototype === value)) {
659 var ret = value.inspect(recurseTimes, ctx);
660 if (!isString(ret)) {
661 ret = formatValue(ctx, ret, recurseTimes);
662 }
663 return ret;
664 }
665
666 // Primitive types cannot have properties
667 var primitive = formatPrimitive(ctx, value);
668 if (primitive) {
669 return primitive;
670 }
671
672 // Look up the keys of the object.
673 var keys = Object.keys(value);
674 var visibleKeys = arrayToHash(keys);
675
676 if (ctx.showHidden) {
677 keys = Object.getOwnPropertyNames(value);
678 }
679
680 // IE doesn't make error fields non-enumerable
681 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
682 if (isError(value)
683 && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
684 return formatError(value);
685 }
686
687 // Some type of object without properties can be shortcutted.
688 if (keys.length === 0) {
689 if (isFunction(value)) {
690 var name = value.name ? ': ' + value.name : '';
691 return ctx.stylize('[Function' + name + ']', 'special');
692 }
693 if (isRegExp(value)) {
694 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
695 }
696 if (isDate(value)) {
697 return ctx.stylize(Date.prototype.toString.call(value), 'date');
698 }
699 if (isError(value)) {
700 return formatError(value);
701 }
702 }
703
704 var base = '', array = false, braces = ['{', '}'];
705
706 // Make Array say that they are Array
707 if (isArray(value)) {
708 array = true;
709 braces = ['[', ']'];
710 }
711
712 // Make functions say that they are functions
713 if (isFunction(value)) {
714 var n = value.name ? ': ' + value.name : '';
715 base = ' [Function' + n + ']';
716 }
717
718 // Make RegExps say that they are RegExps
719 if (isRegExp(value)) {
720 base = ' ' + RegExp.prototype.toString.call(value);
721 }
722
723 // Make dates with properties first say the date
724 if (isDate(value)) {
725 base = ' ' + Date.prototype.toUTCString.call(value);
726 }
727
728 // Make error with message first say the error
729 if (isError(value)) {
730 base = ' ' + formatError(value);
731 }
732
733 if (keys.length === 0 && (!array || value.length == 0)) {
734 return braces[0] + base + braces[1];
735 }
736
737 if (recurseTimes < 0) {
738 if (isRegExp(value)) {
739 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
740 } else {
741 return ctx.stylize('[Object]', 'special');
742 }
743 }
744
745 ctx.seen.push(value);
746
747 var output;
748 if (array) {
749 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
750 } else {
751 output = keys.map(function(key) {
752 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
753 });
754 }
755
756 ctx.seen.pop();
757
758 return reduceToSingleString(output, base, braces);
759 }
760
761
762 function formatPrimitive(ctx, value) {
763 if (isUndefined(value))
764 return ctx.stylize('undefined', 'undefined');
765 if (isString(value)) {
766 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
767 .replace(/'/g, "\\'")
768 .replace(/\\"/g, '"') + '\'';
769 return ctx.stylize(simple, 'string');
770 }
771 if (isNumber(value))
772 return ctx.stylize('' + value, 'number');
773 if (isBoolean(value))
774 return ctx.stylize('' + value, 'boolean');
775 // For some reason typeof null is "object", so special case here.
776 if (isNull(value))
777 return ctx.stylize('null', 'null');
778 }
779
780
781 function formatError(value) {
782 return '[' + Error.prototype.toString.call(value) + ']';
783 }
784
785
786 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
787 var output = [];
788 for (var i = 0, l = value.length; i < l; ++i) {
789 if (hasOwnProperty(value, String(i))) {
790 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
791 String(i), true));
792 } else {
793 output.push('');
794 }
795 }
796 keys.forEach(function(key) {
797 if (!key.match(/^\d+$/)) {
798 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
799 key, true));
800 }
801 });
802 return output;
803 }
804
805
806 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
807 var name, str, desc;
808 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
809 if (desc.get) {
810 if (desc.set) {
811 str = ctx.stylize('[Getter/Setter]', 'special');
812 } else {
813 str = ctx.stylize('[Getter]', 'special');
814 }
815 } else {
816 if (desc.set) {
817 str = ctx.stylize('[Setter]', 'special');
818 }
819 }
820 if (!hasOwnProperty(visibleKeys, key)) {
821 name = '[' + key + ']';
822 }
823 if (!str) {
824 if (ctx.seen.indexOf(desc.value) < 0) {
825 if (isNull(recurseTimes)) {
826 str = formatValue(ctx, desc.value, null);
827 } else {
828 str = formatValue(ctx, desc.value, recurseTimes - 1);
829 }
830 if (str.indexOf('\n') > -1) {
831 if (array) {
832 str = str.split('\n').map(function(line) {
833 return ' ' + line;
834 }).join('\n').substr(2);
835 } else {
836 str = '\n' + str.split('\n').map(function(line) {
837 return ' ' + line;
838 }).join('\n');
839 }
840 }
841 } else {
842 str = ctx.stylize('[Circular]', 'special');
843 }
844 }
845 if (isUndefined(name)) {
846 if (array && key.match(/^\d+$/)) {
847 return str;
848 }
849 name = JSON.stringify('' + key);
850 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
851 name = name.substr(1, name.length - 2);
852 name = ctx.stylize(name, 'name');
853 } else {
854 name = name.replace(/'/g, "\\'")
855 .replace(/\\"/g, '"')
856 .replace(/(^"|"$)/g, "'");
857 name = ctx.stylize(name, 'string');
858 }
859 }
860
861 return name + ': ' + str;
862 }
863
864
865 function reduceToSingleString(output, base, braces) {
866 var numLinesEst = 0;
867 var length = output.reduce(function(prev, cur) {
868 numLinesEst++;
869 if (cur.indexOf('\n') >= 0) numLinesEst++;
870 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
871 }, 0);
872
873 if (length > 60) {
874 return braces[0] +
875 (base === '' ? '' : base + '\n ') +
876 ' ' +
877 output.join(',\n ') +
878 ' ' +
879 braces[1];
880 }
881
882 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
883 }
884
885
886 // NOTE: These type checking functions intentionally don't use `instanceof`
887 // because it is fragile and can be easily faked with `Object.create()`.
888 function isArray(ar) {
889 return Array.isArray(ar);
890 }
891 exports.isArray = isArray;
892
893 function isBoolean(arg) {
894 return typeof arg === 'boolean';
895 }
896 exports.isBoolean = isBoolean;
897
898 function isNull(arg) {
899 return arg === null;
900 }
901 exports.isNull = isNull;
902
903 function isNullOrUndefined(arg) {
904 return arg == null;
905 }
906 exports.isNullOrUndefined = isNullOrUndefined;
907
908 function isNumber(arg) {
909 return typeof arg === 'number';
910 }
911 exports.isNumber = isNumber;
912
913 function isString(arg) {
914 return typeof arg === 'string';
915 }
916 exports.isString = isString;
917
918 function isSymbol(arg) {
919 return typeof arg === 'symbol';
920 }
921 exports.isSymbol = isSymbol;
922
923 function isUndefined(arg) {
924 return arg === void 0;
925 }
926 exports.isUndefined = isUndefined;
927
928 function isRegExp(re) {
929 return isObject(re) && objectToString(re) === '[object RegExp]';
930 }
931 exports.isRegExp = isRegExp;
932
933 function isObject(arg) {
934 return typeof arg === 'object' && arg !== null;
935 }
936 exports.isObject = isObject;
937
938 function isDate(d) {
939 return isObject(d) && objectToString(d) === '[object Date]';
940 }
941 exports.isDate = isDate;
942
943 function isError(e) {
944 return isObject(e) &&
945 (objectToString(e) === '[object Error]' || e instanceof Error);
946 }
947 exports.isError = isError;
948
949 function isFunction(arg) {
950 return typeof arg === 'function';
951 }
952 exports.isFunction = isFunction;
953
954 function isPrimitive(arg) {
955 return arg === null ||
956 typeof arg === 'boolean' ||
957 typeof arg === 'number' ||
958 typeof arg === 'string' ||
959 typeof arg === 'symbol' || // ES6 symbol
960 typeof arg === 'undefined';
961 }
962 exports.isPrimitive = isPrimitive;
963
964 exports.isBuffer = require('./support/isBuffer');
965
966 function objectToString(o) {
967 return Object.prototype.toString.call(o);
968 }
969
970
971 function pad(n) {
972 return n < 10 ? '0' + n.toString(10) : n.toString(10);
973 }
974
975
976 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
977 'Oct', 'Nov', 'Dec'];
978
979 // 26 Feb 16:19:34
980 function timestamp() {
981 var d = new Date();
982 var time = [pad(d.getHours()),
983 pad(d.getMinutes()),
984 pad(d.getSeconds())].join(':');
985 return [d.getDate(), months[d.getMonth()], time].join(' ');
986 }
987
988
989 // log is just a thin wrapper to console.log that prepends a timestamp
990 exports.log = function() {
991 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
992 };
993
994
995 /**
996 * Inherit the prototype methods from one constructor into another.
997 *
998 * The Function.prototype.inherits from lang.js rewritten as a standalone
999 * function (not on Function.prototype). NOTE: If this file is to be loaded
1000 * during bootstrapping this function needs to be rewritten using some native
1001 * functions as prototype setup using normal JavaScript does not work as
1002 * expected during bootstrapping (see mirror.js in r114903).
1003 *
1004 * @param {function} ctor Constructor function which needs to inherit the
1005 * prototype.
1006 * @param {function} superCtor Constructor function to inherit prototype from.
1007 */
1008 exports.inherits = require('inherits');
1009
1010 exports._extend = function(origin, add) {
1011 // Don't do anything if add isn't an object
1012 if (!add || !isObject(add)) return origin;
1013
1014 var keys = Object.keys(add);
1015 var i = keys.length;
1016 while (i--) {
1017 origin[keys[i]] = add[keys[i]];
1018 }
1019 return origin;
1020 };
1021
1022 function hasOwnProperty(obj, prop) {
1023 return Object.prototype.hasOwnProperty.call(obj, prop);
1024 }
1025
1026 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1027 },{"./support/isBuffer":7,"_process":11,"inherits":6}],9:[function(require,module,exports){
1028 // Copyright Joyent, Inc. and other Node contributors.
1029 //
1030 // Permission is hereby granted, free of charge, to any person obtaining a
1031 // copy of this software and associated documentation files (the
1032 // "Software"), to deal in the Software without restriction, including
1033 // without limitation the rights to use, copy, modify, merge, publish,
1034 // distribute, sublicense, and/or sell copies of the Software, and to permit
1035 // persons to whom the Software is furnished to do so, subject to the
1036 // following conditions:
1037 //
1038 // The above copyright notice and this permission notice shall be included
1039 // in all copies or substantial portions of the Software.
1040 //
1041 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1042 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1043 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
1044 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
1045 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
1046 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
1047 // USE OR OTHER DEALINGS IN THE SOFTWARE.
1048
1049 function EventEmitter() {
1050 this._events = this._events || {};
1051 this._maxListeners = this._maxListeners || undefined;
1052 }
1053 module.exports = EventEmitter;
1054
1055 // Backwards-compat with node 0.10.x
1056 EventEmitter.EventEmitter = EventEmitter;
1057
1058 EventEmitter.prototype._events = undefined;
1059 EventEmitter.prototype._maxListeners = undefined;
1060
1061 // By default EventEmitters will print a warning if more than 10 listeners are
1062 // added to it. This is a useful default which helps finding memory leaks.
1063 EventEmitter.defaultMaxListeners = 10;
1064
1065 // Obviously not all Emitters should be limited to 10. This function allows
1066 // that to be increased. Set to zero for unlimited.
1067 EventEmitter.prototype.setMaxListeners = function(n) {
1068 if (!isNumber(n) || n < 0 || isNaN(n))
1069 throw TypeError('n must be a positive number');
1070 this._maxListeners = n;
1071 return this;
1072 };
1073
1074 EventEmitter.prototype.emit = function(type) {
1075 var er, handler, len, args, i, listeners;
1076
1077 if (!this._events)
1078 this._events = {};
1079
1080 // If there is no 'error' event listener then throw.
1081 if (type === 'error') {
1082 if (!this._events.error ||
1083 (isObject(this._events.error) && !this._events.error.length)) {
1084 er = arguments[1];
1085 if (er instanceof Error) {
1086 throw er; // Unhandled 'error' event
1087 }
1088 throw TypeError('Uncaught, unspecified "error" event.');
1089 }
1090 }
1091
1092 handler = this._events[type];
1093
1094 if (isUndefined(handler))
1095 return false;
1096
1097 if (isFunction(handler)) {
1098 switch (arguments.length) {
1099 // fast cases
1100 case 1:
1101 handler.call(this);
1102 break;
1103 case 2:
1104 handler.call(this, arguments[1]);
1105 break;
1106 case 3:
1107 handler.call(this, arguments[1], arguments[2]);
1108 break;
1109 // slower
1110 default:
1111 len = arguments.length;
1112 args = new Array(len - 1);
1113 for (i = 1; i < len; i++)
1114 args[i - 1] = arguments[i];
1115 handler.apply(this, args);
1116 }
1117 } else if (isObject(handler)) {
1118 len = arguments.length;
1119 args = new Array(len - 1);
1120 for (i = 1; i < len; i++)
1121 args[i - 1] = arguments[i];
1122
1123 listeners = handler.slice();
1124 len = listeners.length;
1125 for (i = 0; i < len; i++)
1126 listeners[i].apply(this, args);
1127 }
1128
1129 return true;
1130 };
1131
1132 EventEmitter.prototype.addListener = function(type, listener) {
1133 var m;
1134
1135 if (!isFunction(listener))
1136 throw TypeError('listener must be a function');
1137
1138 if (!this._events)
1139 this._events = {};
1140
1141 // To avoid recursion in the case that type === "newListener"! Before
1142 // adding it to the listeners, first emit "newListener".
1143 if (this._events.newListener)
1144 this.emit('newListener', type,
1145 isFunction(listener.listener) ?
1146 listener.listener : listener);
1147
1148 if (!this._events[type])
1149 // Optimize the case of one listener. Don't need the extra array object.
1150 this._events[type] = listener;
1151 else if (isObject(this._events[type]))
1152 // If we've already got an array, just append.
1153 this._events[type].push(listener);
1154 else
1155 // Adding the second element, need to change to array.
1156 this._events[type] = [this._events[type], listener];
1157
1158 // Check for listener leak
1159 if (isObject(this._events[type]) && !this._events[type].warned) {
1160 var m;
1161 if (!isUndefined(this._maxListeners)) {
1162 m = this._maxListeners;
1163 } else {
1164 m = EventEmitter.defaultMaxListeners;
1165 }
1166
1167 if (m && m > 0 && this._events[type].length > m) {
1168 this._events[type].warned = true;
1169 console.error('(node) warning: possible EventEmitter memory ' +
1170 'leak detected. %d listeners added. ' +
1171 'Use emitter.setMaxListeners() to increase limit.',
1172 this._events[type].length);
1173 if (typeof console.trace === 'function') {
1174 // not supported in IE 10
1175 console.trace();
1176 }
1177 }
1178 }
1179
1180 return this;
1181 };
1182
1183 EventEmitter.prototype.on = EventEmitter.prototype.addListener;
1184
1185 EventEmitter.prototype.once = function(type, listener) {
1186 if (!isFunction(listener))
1187 throw TypeError('listener must be a function');
1188
1189 var fired = false;
1190
1191 function g() {
1192 this.removeListener(type, g);
1193
1194 if (!fired) {
1195 fired = true;
1196 listener.apply(this, arguments);
1197 }
1198 }
1199
1200 g.listener = listener;
1201 this.on(type, g);
1202
1203 return this;
1204 };
1205
1206 // emits a 'removeListener' event iff the listener was removed
1207 EventEmitter.prototype.removeListener = function(type, listener) {
1208 var list, position, length, i;
1209
1210 if (!isFunction(listener))
1211 throw TypeError('listener must be a function');
1212
1213 if (!this._events || !this._events[type])
1214 return this;
1215
1216 list = this._events[type];
1217 length = list.length;
1218 position = -1;
1219
1220 if (list === listener ||
1221 (isFunction(list.listener) && list.listener === listener)) {
1222 delete this._events[type];
1223 if (this._events.removeListener)
1224 this.emit('removeListener', type, listener);
1225
1226 } else if (isObject(list)) {
1227 for (i = length; i-- > 0;) {
1228 if (list[i] === listener ||
1229 (list[i].listener && list[i].listener === listener)) {
1230 position = i;
1231 break;
1232 }
1233 }
1234
1235 if (position < 0)
1236 return this;
1237
1238 if (list.length === 1) {
1239 list.length = 0;
1240 delete this._events[type];
1241 } else {
1242 list.splice(position, 1);
1243 }
1244
1245 if (this._events.removeListener)
1246 this.emit('removeListener', type, listener);
1247 }
1248
1249 return this;
1250 };
1251
1252 EventEmitter.prototype.removeAllListeners = function(type) {
1253 var key, listeners;
1254
1255 if (!this._events)
1256 return this;
1257
1258 // not listening for removeListener, no need to emit
1259 if (!this._events.removeListener) {
1260 if (arguments.length === 0)
1261 this._events = {};
1262 else if (this._events[type])
1263 delete this._events[type];
1264 return this;
1265 }
1266
1267 // emit removeListener for all listeners on all events
1268 if (arguments.length === 0) {
1269 for (key in this._events) {
1270 if (key === 'removeListener') continue;
1271 this.removeAllListeners(key);
1272 }
1273 this.removeAllListeners('removeListener');
1274 this._events = {};
1275 return this;
1276 }
1277
1278 listeners = this._events[type];
1279
1280 if (isFunction(listeners)) {
1281 this.removeListener(type, listeners);
1282 } else {
1283 // LIFO order
1284 while (listeners.length)
1285 this.removeListener(type, listeners[listeners.length - 1]);
1286 }
1287 delete this._events[type];
1288
1289 return this;
1290 };
1291
1292 EventEmitter.prototype.listeners = function(type) {
1293 var ret;
1294 if (!this._events || !this._events[type])
1295 ret = [];
1296 else if (isFunction(this._events[type]))
1297 ret = [this._events[type]];
1298 else
1299 ret = this._events[type].slice();
1300 return ret;
1301 };
1302
1303 EventEmitter.listenerCount = function(emitter, type) {
1304 var ret;
1305 if (!emitter._events || !emitter._events[type])
1306 ret = 0;
1307 else if (isFunction(emitter._events[type]))
1308 ret = 1;
1309 else
1310 ret = emitter._events[type].length;
1311 return ret;
1312 };
1313
1314 function isFunction(arg) {
1315 return typeof arg === 'function';
1316 }
1317
1318 function isNumber(arg) {
1319 return typeof arg === 'number';
1320 }
1321
1322 function isObject(arg) {
1323 return typeof arg === 'object' && arg !== null;
1324 }
1325
1326 function isUndefined(arg) {
1327 return arg === void 0;
1328 }
1329
1330 },{}],10:[function(require,module,exports){
1331 arguments[4][6][0].apply(exports,arguments)
1332 },{"dup":6}],11:[function(require,module,exports){
1333 // shim for using process in browser
1334
1335 var process = module.exports = {};
1336 var queue = [];
1337 var draining = false;
1338
1339 function drainQueue() {
1340 if (draining) {
1341 return;
1342 }
1343 draining = true;
1344 var currentQueue;
1345 var len = queue.length;
1346 while(len) {
1347 currentQueue = queue;
1348 queue = [];
1349 var i = -1;
1350 while (++i < len) {
1351 currentQueue[i]();
1352 }
1353 len = queue.length;
1354 }
1355 draining = false;
1356 }
1357 process.nextTick = function (fun) {
1358 queue.push(fun);
1359 if (!draining) {
1360 setTimeout(drainQueue, 0);
1361 }
1362 };
1363
1364 process.title = 'browser';
1365 process.browser = true;
1366 process.env = {};
1367 process.argv = [];
1368 process.version = ''; // empty string to avoid regexp issues
1369 process.versions = {};
1370
1371 function noop() {}
1372
1373 process.on = noop;
1374 process.addListener = noop;
1375 process.once = noop;
1376 process.off = noop;
1377 process.removeListener = noop;
1378 process.removeAllListeners = noop;
1379 process.emit = noop;
1380
1381 process.binding = function (name) {
1382 throw new Error('process.binding is not supported');
1383 };
1384
1385 // TODO(shtylman)
1386 process.cwd = function () { return '/' };
1387 process.chdir = function (dir) {
1388 throw new Error('process.chdir is not supported');
1389 };
1390 process.umask = function() { return 0; };
1391
1392 },{}],12:[function(require,module,exports){
1393 arguments[4][7][0].apply(exports,arguments)
1394 },{"dup":7}],13:[function(require,module,exports){
1395 arguments[4][8][0].apply(exports,arguments)
1396 },{"./support/isBuffer":12,"_process":11,"dup":8,"inherits":10}],14:[function(require,module,exports){
1397 (function (global){
1398 /*global window, global*/
1399 var util = require("util")
1400 var assert = require("assert")
1401 var now = require("date-now")
1402
1403 var slice = Array.prototype.slice
1404 var console
1405 var times = {}
1406
1407 if (typeof global !== "undefined" && global.console) {
1408 console = global.console
1409 } else if (typeof window !== "undefined" && window.console) {
1410 console = window.console
1411 } else {
1412 console = {}
1413 }
1414
1415 var functions = [
1416 [log, "log"],
1417 [info, "info"],
1418 [warn, "warn"],
1419 [error, "error"],
1420 [time, "time"],
1421 [timeEnd, "timeEnd"],
1422 [trace, "trace"],
1423 [dir, "dir"],
1424 [consoleAssert, "assert"]
1425 ]
1426
1427 for (var i = 0; i < functions.length; i++) {
1428 var tuple = functions[i]
1429 var f = tuple[0]
1430 var name = tuple[1]
1431
1432 if (!console[name]) {
1433 console[name] = f
1434 }
1435 }
1436
1437 module.exports = console
1438
1439 function log() {}
1440
1441 function info() {
1442 console.log.apply(console, arguments)
1443 }
1444
1445 function warn() {
1446 console.log.apply(console, arguments)
1447 }
1448
1449 function error() {
1450 console.warn.apply(console, arguments)
1451 }
1452
1453 function time(label) {
1454 times[label] = now()
1455 }
1456
1457 function timeEnd(label) {
1458 var time = times[label]
1459 if (!time) {
1460 throw new Error("No such label: " + label)
1461 }
1462
1463 var duration = now() - time
1464 console.log(label + ": " + duration + "ms")
1465 }
1466
1467 function trace() {
1468 var err = new Error()
1469 err.name = "Trace"
1470 err.message = util.format.apply(null, arguments)
1471 console.error(err.stack)
1472 }
1473
1474 function dir(object) {
1475 console.log(util.inspect(object) + "\n")
1476 }
1477
1478 function consoleAssert(expression) {
1479 if (!expression) {
1480 var arr = slice.call(arguments, 1)
1481 assert.ok(false, util.format.apply(null, arr))
1482 }
1483 }
1484
1485 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1486 },{"assert":5,"date-now":15,"util":13}],15:[function(require,module,exports){
1487 module.exports = now
1488
1489 function now() {
1490 return new Date().getTime()
1491 }
1492
1493 },{}],16:[function(require,module,exports){
1494 (function (global){
1495 /**
1496 * @license
1497 * Lodash <https://lodash.com/>
1498 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
1499 * Released under MIT license <https://lodash.com/license>
1500 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
1501 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
1502 */
1503 ;(function() {
1504
1505 /** Used as a safe reference for `undefined` in pre-ES5 environments. */
1506 var undefined;
1507
1508 /** Used as the semantic version number. */
1509 var VERSION = '4.17.19';
1510
1511 /** Used as the size to enable large array optimizations. */
1512 var LARGE_ARRAY_SIZE = 200;
1513
1514 /** Error message constants. */
1515 var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
1516 FUNC_ERROR_TEXT = 'Expected a function';
1517
1518 /** Used to stand-in for `undefined` hash values. */
1519 var HASH_UNDEFINED = '__lodash_hash_undefined__';
1520
1521 /** Used as the maximum memoize cache size. */
1522 var MAX_MEMOIZE_SIZE = 500;
1523
1524 /** Used as the internal argument placeholder. */
1525 var PLACEHOLDER = '__lodash_placeholder__';
1526
1527 /** Used to compose bitmasks for cloning. */
1528 var CLONE_DEEP_FLAG = 1,
1529 CLONE_FLAT_FLAG = 2,
1530 CLONE_SYMBOLS_FLAG = 4;
1531
1532 /** Used to compose bitmasks for value comparisons. */
1533 var COMPARE_PARTIAL_FLAG = 1,
1534 COMPARE_UNORDERED_FLAG = 2;
1535
1536 /** Used to compose bitmasks for function metadata. */
1537 var WRAP_BIND_FLAG = 1,
1538 WRAP_BIND_KEY_FLAG = 2,
1539 WRAP_CURRY_BOUND_FLAG = 4,
1540 WRAP_CURRY_FLAG = 8,
1541 WRAP_CURRY_RIGHT_FLAG = 16,
1542 WRAP_PARTIAL_FLAG = 32,
1543 WRAP_PARTIAL_RIGHT_FLAG = 64,
1544 WRAP_ARY_FLAG = 128,
1545 WRAP_REARG_FLAG = 256,
1546 WRAP_FLIP_FLAG = 512;
1547
1548 /** Used as default options for `_.truncate`. */
1549 var DEFAULT_TRUNC_LENGTH = 30,
1550 DEFAULT_TRUNC_OMISSION = '...';
1551
1552 /** Used to detect hot functions by number of calls within a span of milliseconds. */
1553 var HOT_COUNT = 800,
1554 HOT_SPAN = 16;
1555
1556 /** Used to indicate the type of lazy iteratees. */
1557 var LAZY_FILTER_FLAG = 1,
1558 LAZY_MAP_FLAG = 2,
1559 LAZY_WHILE_FLAG = 3;
1560
1561 /** Used as references for various `Number` constants. */
1562 var INFINITY = 1 / 0,
1563 MAX_SAFE_INTEGER = 9007199254740991,
1564 MAX_INTEGER = 1.7976931348623157e+308,
1565 NAN = 0 / 0;
1566
1567 /** Used as references for the maximum length and index of an array. */
1568 var MAX_ARRAY_LENGTH = 4294967295,
1569 MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
1570 HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
1571
1572 /** Used to associate wrap methods with their bit flags. */
1573 var wrapFlags = [
1574 ['ary', WRAP_ARY_FLAG],
1575 ['bind', WRAP_BIND_FLAG],
1576 ['bindKey', WRAP_BIND_KEY_FLAG],
1577 ['curry', WRAP_CURRY_FLAG],
1578 ['curryRight', WRAP_CURRY_RIGHT_FLAG],
1579 ['flip', WRAP_FLIP_FLAG],
1580 ['partial', WRAP_PARTIAL_FLAG],
1581 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
1582 ['rearg', WRAP_REARG_FLAG]
1583 ];
1584
1585 /** `Object#toString` result references. */
1586 var argsTag = '[object Arguments]',
1587 arrayTag = '[object Array]',
1588 asyncTag = '[object AsyncFunction]',
1589 boolTag = '[object Boolean]',
1590 dateTag = '[object Date]',
1591 domExcTag = '[object DOMException]',
1592 errorTag = '[object Error]',
1593 funcTag = '[object Function]',
1594 genTag = '[object GeneratorFunction]',
1595 mapTag = '[object Map]',
1596 numberTag = '[object Number]',
1597 nullTag = '[object Null]',
1598 objectTag = '[object Object]',
1599 promiseTag = '[object Promise]',
1600 proxyTag = '[object Proxy]',
1601 regexpTag = '[object RegExp]',
1602 setTag = '[object Set]',
1603 stringTag = '[object String]',
1604 symbolTag = '[object Symbol]',
1605 undefinedTag = '[object Undefined]',
1606 weakMapTag = '[object WeakMap]',
1607 weakSetTag = '[object WeakSet]';
1608
1609 var arrayBufferTag = '[object ArrayBuffer]',
1610 dataViewTag = '[object DataView]',
1611 float32Tag = '[object Float32Array]',
1612 float64Tag = '[object Float64Array]',
1613 int8Tag = '[object Int8Array]',
1614 int16Tag = '[object Int16Array]',
1615 int32Tag = '[object Int32Array]',
1616 uint8Tag = '[object Uint8Array]',
1617 uint8ClampedTag = '[object Uint8ClampedArray]',
1618 uint16Tag = '[object Uint16Array]',
1619 uint32Tag = '[object Uint32Array]';
1620
1621 /** Used to match empty string literals in compiled template source. */
1622 var reEmptyStringLeading = /\b__p \+= '';/g,
1623 reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
1624 reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
1625
1626 /** Used to match HTML entities and HTML characters. */
1627 var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
1628 reUnescapedHtml = /[&<>"']/g,
1629 reHasEscapedHtml = RegExp(reEscapedHtml.source),
1630 reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
1631
1632 /** Used to match template delimiters. */
1633 var reEscape = /<%-([\s\S]+?)%>/g,
1634 reEvaluate = /<%([\s\S]+?)%>/g,
1635 reInterpolate = /<%=([\s\S]+?)%>/g;
1636
1637 /** Used to match property names within property paths. */
1638 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
1639 reIsPlainProp = /^\w*$/,
1640 rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
1641
1642 /**
1643 * Used to match `RegExp`
1644 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
1645 */
1646 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
1647 reHasRegExpChar = RegExp(reRegExpChar.source);
1648
1649 /** Used to match leading and trailing whitespace. */
1650 var reTrim = /^\s+|\s+$/g,
1651 reTrimStart = /^\s+/,
1652 reTrimEnd = /\s+$/;
1653
1654 /** Used to match wrap detail comments. */
1655 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
1656 reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
1657 reSplitDetails = /,? & /;
1658
1659 /** Used to match words composed of alphanumeric characters. */
1660 var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
1661
1662 /** Used to match backslashes in property paths. */
1663 var reEscapeChar = /\\(\\)?/g;
1664
1665 /**
1666 * Used to match
1667 * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
1668 */
1669 var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
1670
1671 /** Used to match `RegExp` flags from their coerced string values. */
1672 var reFlags = /\w*$/;
1673
1674 /** Used to detect bad signed hexadecimal string values. */
1675 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
1676
1677 /** Used to detect binary string values. */
1678 var reIsBinary = /^0b[01]+$/i;
1679
1680 /** Used to detect host constructors (Safari). */
1681 var reIsHostCtor = /^\[object .+?Constructor\]$/;
1682
1683 /** Used to detect octal string values. */
1684 var reIsOctal = /^0o[0-7]+$/i;
1685
1686 /** Used to detect unsigned integer values. */
1687 var reIsUint = /^(?:0|[1-9]\d*)$/;
1688
1689 /** Used to match Latin Unicode letters (excluding mathematical operators). */
1690 var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
1691
1692 /** Used to ensure capturing order of template delimiters. */
1693 var reNoMatch = /($^)/;
1694
1695 /** Used to match unescaped characters in compiled string literals. */
1696 var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
1697
1698 /** Used to compose unicode character classes. */
1699 var rsAstralRange = '\\ud800-\\udfff',
1700 rsComboMarksRange = '\\u0300-\\u036f',
1701 reComboHalfMarksRange = '\\ufe20-\\ufe2f',
1702 rsComboSymbolsRange = '\\u20d0-\\u20ff',
1703 rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
1704 rsDingbatRange = '\\u2700-\\u27bf',
1705 rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
1706 rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
1707 rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
1708 rsPunctuationRange = '\\u2000-\\u206f',
1709 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',
1710 rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
1711 rsVarRange = '\\ufe0e\\ufe0f',
1712 rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
1713
1714 /** Used to compose unicode capture groups. */
1715 var rsApos = "['\u2019]",
1716 rsAstral = '[' + rsAstralRange + ']',
1717 rsBreak = '[' + rsBreakRange + ']',
1718 rsCombo = '[' + rsComboRange + ']',
1719 rsDigits = '\\d+',
1720 rsDingbat = '[' + rsDingbatRange + ']',
1721 rsLower = '[' + rsLowerRange + ']',
1722 rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
1723 rsFitz = '\\ud83c[\\udffb-\\udfff]',
1724 rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
1725 rsNonAstral = '[^' + rsAstralRange + ']',
1726 rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
1727 rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
1728 rsUpper = '[' + rsUpperRange + ']',
1729 rsZWJ = '\\u200d';
1730
1731 /** Used to compose unicode regexes. */
1732 var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
1733 rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
1734 rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
1735 rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
1736 reOptMod = rsModifier + '?',
1737 rsOptVar = '[' + rsVarRange + ']?',
1738 rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
1739 rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
1740 rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
1741 rsSeq = rsOptVar + reOptMod + rsOptJoin,
1742 rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
1743 rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
1744
1745 /** Used to match apostrophes. */
1746 var reApos = RegExp(rsApos, 'g');
1747
1748 /**
1749 * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
1750 * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
1751 */
1752 var reComboMark = RegExp(rsCombo, 'g');
1753
1754 /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
1755 var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
1756
1757 /** Used to match complex or compound words. */
1758 var reUnicodeWord = RegExp([
1759 rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
1760 rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
1761 rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
1762 rsUpper + '+' + rsOptContrUpper,
1763 rsOrdUpper,
1764 rsOrdLower,
1765 rsDigits,
1766 rsEmoji
1767 ].join('|'), 'g');
1768
1769 /** 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/). */
1770 var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
1771
1772 /** Used to detect strings that need a more robust regexp to match words. */
1773 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 ]/;
1774
1775 /** Used to assign default `context` object properties. */
1776 var contextProps = [
1777 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
1778 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
1779 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
1780 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
1781 '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
1782 ];
1783
1784 /** Used to make template sourceURLs easier to identify. */
1785 var templateCounter = -1;
1786
1787 /** Used to identify `toStringTag` values of typed arrays. */
1788 var typedArrayTags = {};
1789 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
1790 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
1791 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
1792 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
1793 typedArrayTags[uint32Tag] = true;
1794 typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
1795 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
1796 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
1797 typedArrayTags[errorTag] = typedArrayTags[funcTag] =
1798 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
1799 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
1800 typedArrayTags[setTag] = typedArrayTags[stringTag] =
1801 typedArrayTags[weakMapTag] = false;
1802
1803 /** Used to identify `toStringTag` values supported by `_.clone`. */
1804 var cloneableTags = {};
1805 cloneableTags[argsTag] = cloneableTags[arrayTag] =
1806 cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
1807 cloneableTags[boolTag] = cloneableTags[dateTag] =
1808 cloneableTags[float32Tag] = cloneableTags[float64Tag] =
1809 cloneableTags[int8Tag] = cloneableTags[int16Tag] =
1810 cloneableTags[int32Tag] = cloneableTags[mapTag] =
1811 cloneableTags[numberTag] = cloneableTags[objectTag] =
1812 cloneableTags[regexpTag] = cloneableTags[setTag] =
1813 cloneableTags[stringTag] = cloneableTags[symbolTag] =
1814 cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
1815 cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
1816 cloneableTags[errorTag] = cloneableTags[funcTag] =
1817 cloneableTags[weakMapTag] = false;
1818
1819 /** Used to map Latin Unicode letters to basic Latin letters. */
1820 var deburredLetters = {
1821 // Latin-1 Supplement block.
1822 '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
1823 '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
1824 '\xc7': 'C', '\xe7': 'c',
1825 '\xd0': 'D', '\xf0': 'd',
1826 '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
1827 '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
1828 '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
1829 '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
1830 '\xd1': 'N', '\xf1': 'n',
1831 '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
1832 '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
1833 '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
1834 '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
1835 '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
1836 '\xc6': 'Ae', '\xe6': 'ae',
1837 '\xde': 'Th', '\xfe': 'th',
1838 '\xdf': 'ss',
1839 // Latin Extended-A block.
1840 '\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
1841 '\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
1842 '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
1843 '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
1844 '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
1845 '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
1846 '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
1847 '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
1848 '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
1849 '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
1850 '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
1851 '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
1852 '\u0134': 'J', '\u0135': 'j',
1853 '\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
1854 '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
1855 '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
1856 '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
1857 '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
1858 '\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
1859 '\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
1860 '\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
1861 '\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
1862 '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
1863 '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
1864 '\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
1865 '\u0163': 't', '\u0165': 't', '\u0167': 't',
1866 '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
1867 '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
1868 '\u0174': 'W', '\u0175': 'w',
1869 '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
1870 '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
1871 '\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
1872 '\u0132': 'IJ', '\u0133': 'ij',
1873 '\u0152': 'Oe', '\u0153': 'oe',
1874 '\u0149': "'n", '\u017f': 's'
1875 };
1876
1877 /** Used to map characters to HTML entities. */
1878 var htmlEscapes = {
1879 '&': '&amp;',
1880 '<': '&lt;',
1881 '>': '&gt;',
1882 '"': '&quot;',
1883 "'": '&#39;'
1884 };
1885
1886 /** Used to map HTML entities to characters. */
1887 var htmlUnescapes = {
1888 '&amp;': '&',
1889 '&lt;': '<',
1890 '&gt;': '>',
1891 '&quot;': '"',
1892 '&#39;': "'"
1893 };
1894
1895 /** Used to escape characters for inclusion in compiled string literals. */
1896 var stringEscapes = {
1897 '\\': '\\',
1898 "'": "'",
1899 '\n': 'n',
1900 '\r': 'r',
1901 '\u2028': 'u2028',
1902 '\u2029': 'u2029'
1903 };
1904
1905 /** Built-in method references without a dependency on `root`. */
1906 var freeParseFloat = parseFloat,
1907 freeParseInt = parseInt;
1908
1909 /** Detect free variable `global` from Node.js. */
1910 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
1911
1912 /** Detect free variable `self`. */
1913 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
1914
1915 /** Used as a reference to the global object. */
1916 var root = freeGlobal || freeSelf || Function('return this')();
1917
1918 /** Detect free variable `exports`. */
1919 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
1920
1921 /** Detect free variable `module`. */
1922 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
1923
1924 /** Detect the popular CommonJS extension `module.exports`. */
1925 var moduleExports = freeModule && freeModule.exports === freeExports;
1926
1927 /** Detect free variable `process` from Node.js. */
1928 var freeProcess = moduleExports && freeGlobal.process;
1929
1930 /** Used to access faster Node.js helpers. */
1931 var nodeUtil = (function() {
1932 try {
1933 // Use `util.types` for Node.js 10+.
1934 var types = freeModule && freeModule.require && freeModule.require('util').types;
1935
1936 if (types) {
1937 return types;
1938 }
1939
1940 // Legacy `process.binding('util')` for Node.js < 10.
1941 return freeProcess && freeProcess.binding && freeProcess.binding('util');
1942 } catch (e) {}
1943 }());
1944
1945 /* Node.js helper references. */
1946 var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
1947 nodeIsDate = nodeUtil && nodeUtil.isDate,
1948 nodeIsMap = nodeUtil && nodeUtil.isMap,
1949 nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
1950 nodeIsSet = nodeUtil && nodeUtil.isSet,
1951 nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
1952
1953 /*--------------------------------------------------------------------------*/
1954
1955 /**
1956 * A faster alternative to `Function#apply`, this function invokes `func`
1957 * with the `this` binding of `thisArg` and the arguments of `args`.
1958 *
1959 * @private
1960 * @param {Function} func The function to invoke.
1961 * @param {*} thisArg The `this` binding of `func`.
1962 * @param {Array} args The arguments to invoke `func` with.
1963 * @returns {*} Returns the result of `func`.
1964 */
1965 function apply(func, thisArg, args) {
1966 switch (args.length) {
1967 case 0: return func.call(thisArg);
1968 case 1: return func.call(thisArg, args[0]);
1969 case 2: return func.call(thisArg, args[0], args[1]);
1970 case 3: return func.call(thisArg, args[0], args[1], args[2]);
1971 }
1972 return func.apply(thisArg, args);
1973 }
1974
1975 /**
1976 * A specialized version of `baseAggregator` for arrays.
1977 *
1978 * @private
1979 * @param {Array} [array] The array to iterate over.
1980 * @param {Function} setter The function to set `accumulator` values.
1981 * @param {Function} iteratee The iteratee to transform keys.
1982 * @param {Object} accumulator The initial aggregated object.
1983 * @returns {Function} Returns `accumulator`.
1984 */
1985 function arrayAggregator(array, setter, iteratee, accumulator) {
1986 var index = -1,
1987 length = array == null ? 0 : array.length;
1988
1989 while (++index < length) {
1990 var value = array[index];
1991 setter(accumulator, value, iteratee(value), array);
1992 }
1993 return accumulator;
1994 }
1995
1996 /**
1997 * A specialized version of `_.forEach` for arrays without support for
1998 * iteratee shorthands.
1999 *
2000 * @private
2001 * @param {Array} [array] The array to iterate over.
2002 * @param {Function} iteratee The function invoked per iteration.
2003 * @returns {Array} Returns `array`.
2004 */
2005 function arrayEach(array, iteratee) {
2006 var index = -1,
2007 length = array == null ? 0 : array.length;
2008
2009 while (++index < length) {
2010 if (iteratee(array[index], index, array) === false) {
2011 break;
2012 }
2013 }
2014 return array;
2015 }
2016
2017 /**
2018 * A specialized version of `_.forEachRight` for arrays without support for
2019 * iteratee shorthands.
2020 *
2021 * @private
2022 * @param {Array} [array] The array to iterate over.
2023 * @param {Function} iteratee The function invoked per iteration.
2024 * @returns {Array} Returns `array`.
2025 */
2026 function arrayEachRight(array, iteratee) {
2027 var length = array == null ? 0 : array.length;
2028
2029 while (length--) {
2030 if (iteratee(array[length], length, array) === false) {
2031 break;
2032 }
2033 }
2034 return array;
2035 }
2036
2037 /**
2038 * A specialized version of `_.every` for arrays without support for
2039 * iteratee shorthands.
2040 *
2041 * @private
2042 * @param {Array} [array] The array to iterate over.
2043 * @param {Function} predicate The function invoked per iteration.
2044 * @returns {boolean} Returns `true` if all elements pass the predicate check,
2045 * else `false`.
2046 */
2047 function arrayEvery(array, predicate) {
2048 var index = -1,
2049 length = array == null ? 0 : array.length;
2050
2051 while (++index < length) {
2052 if (!predicate(array[index], index, array)) {
2053 return false;
2054 }
2055 }
2056 return true;
2057 }
2058
2059 /**
2060 * A specialized version of `_.filter` for arrays without support for
2061 * iteratee shorthands.
2062 *
2063 * @private
2064 * @param {Array} [array] The array to iterate over.
2065 * @param {Function} predicate The function invoked per iteration.
2066 * @returns {Array} Returns the new filtered array.
2067 */
2068 function arrayFilter(array, predicate) {
2069 var index = -1,
2070 length = array == null ? 0 : array.length,
2071 resIndex = 0,
2072 result = [];
2073
2074 while (++index < length) {
2075 var value = array[index];
2076 if (predicate(value, index, array)) {
2077 result[resIndex++] = value;
2078 }
2079 }
2080 return result;
2081 }
2082
2083 /**
2084 * A specialized version of `_.includes` for arrays without support for
2085 * specifying an index to search from.
2086 *
2087 * @private
2088 * @param {Array} [array] The array to inspect.
2089 * @param {*} target The value to search for.
2090 * @returns {boolean} Returns `true` if `target` is found, else `false`.
2091 */
2092 function arrayIncludes(array, value) {
2093 var length = array == null ? 0 : array.length;
2094 return !!length && baseIndexOf(array, value, 0) > -1;
2095 }
2096
2097 /**
2098 * This function is like `arrayIncludes` except that it accepts a comparator.
2099 *
2100 * @private
2101 * @param {Array} [array] The array to inspect.
2102 * @param {*} target The value to search for.
2103 * @param {Function} comparator The comparator invoked per element.
2104 * @returns {boolean} Returns `true` if `target` is found, else `false`.
2105 */
2106 function arrayIncludesWith(array, value, comparator) {
2107 var index = -1,
2108 length = array == null ? 0 : array.length;
2109
2110 while (++index < length) {
2111 if (comparator(value, array[index])) {
2112 return true;
2113 }
2114 }
2115 return false;
2116 }
2117
2118 /**
2119 * A specialized version of `_.map` for arrays without support for iteratee
2120 * shorthands.
2121 *
2122 * @private
2123 * @param {Array} [array] The array to iterate over.
2124 * @param {Function} iteratee The function invoked per iteration.
2125 * @returns {Array} Returns the new mapped array.
2126 */
2127 function arrayMap(array, iteratee) {
2128 var index = -1,
2129 length = array == null ? 0 : array.length,
2130 result = Array(length);
2131
2132 while (++index < length) {
2133 result[index] = iteratee(array[index], index, array);
2134 }
2135 return result;
2136 }
2137
2138 /**
2139 * Appends the elements of `values` to `array`.
2140 *
2141 * @private
2142 * @param {Array} array The array to modify.
2143 * @param {Array} values The values to append.
2144 * @returns {Array} Returns `array`.
2145 */
2146 function arrayPush(array, values) {
2147 var index = -1,
2148 length = values.length,
2149 offset = array.length;
2150
2151 while (++index < length) {
2152 array[offset + index] = values[index];
2153 }
2154 return array;
2155 }
2156
2157 /**
2158 * A specialized version of `_.reduce` for arrays without support for
2159 * iteratee shorthands.
2160 *
2161 * @private
2162 * @param {Array} [array] The array to iterate over.
2163 * @param {Function} iteratee The function invoked per iteration.
2164 * @param {*} [accumulator] The initial value.
2165 * @param {boolean} [initAccum] Specify using the first element of `array` as
2166 * the initial value.
2167 * @returns {*} Returns the accumulated value.
2168 */
2169 function arrayReduce(array, iteratee, accumulator, initAccum) {
2170 var index = -1,
2171 length = array == null ? 0 : array.length;
2172
2173 if (initAccum && length) {
2174 accumulator = array[++index];
2175 }
2176 while (++index < length) {
2177 accumulator = iteratee(accumulator, array[index], index, array);
2178 }
2179 return accumulator;
2180 }
2181
2182 /**
2183 * A specialized version of `_.reduceRight` for arrays without support for
2184 * iteratee shorthands.
2185 *
2186 * @private
2187 * @param {Array} [array] The array to iterate over.
2188 * @param {Function} iteratee The function invoked per iteration.
2189 * @param {*} [accumulator] The initial value.
2190 * @param {boolean} [initAccum] Specify using the last element of `array` as
2191 * the initial value.
2192 * @returns {*} Returns the accumulated value.
2193 */
2194 function arrayReduceRight(array, iteratee, accumulator, initAccum) {
2195 var length = array == null ? 0 : array.length;
2196 if (initAccum && length) {
2197 accumulator = array[--length];
2198 }
2199 while (length--) {
2200 accumulator = iteratee(accumulator, array[length], length, array);
2201 }
2202 return accumulator;
2203 }
2204
2205 /**
2206 * A specialized version of `_.some` for arrays without support for iteratee
2207 * shorthands.
2208 *
2209 * @private
2210 * @param {Array} [array] The array to iterate over.
2211 * @param {Function} predicate The function invoked per iteration.
2212 * @returns {boolean} Returns `true` if any element passes the predicate check,
2213 * else `false`.
2214 */
2215 function arraySome(array, predicate) {
2216 var index = -1,
2217 length = array == null ? 0 : array.length;
2218
2219 while (++index < length) {
2220 if (predicate(array[index], index, array)) {
2221 return true;
2222 }
2223 }
2224 return false;
2225 }
2226
2227 /**
2228 * Gets the size of an ASCII `string`.
2229 *
2230 * @private
2231 * @param {string} string The string inspect.
2232 * @returns {number} Returns the string size.
2233 */
2234 var asciiSize = baseProperty('length');
2235
2236 /**
2237 * Converts an ASCII `string` to an array.
2238 *
2239 * @private
2240 * @param {string} string The string to convert.
2241 * @returns {Array} Returns the converted array.
2242 */
2243 function asciiToArray(string) {
2244 return string.split('');
2245 }
2246
2247 /**
2248 * Splits an ASCII `string` into an array of its words.
2249 *
2250 * @private
2251 * @param {string} The string to inspect.
2252 * @returns {Array} Returns the words of `string`.
2253 */
2254 function asciiWords(string) {
2255 return string.match(reAsciiWord) || [];
2256 }
2257
2258 /**
2259 * The base implementation of methods like `_.findKey` and `_.findLastKey`,
2260 * without support for iteratee shorthands, which iterates over `collection`
2261 * using `eachFunc`.
2262 *
2263 * @private
2264 * @param {Array|Object} collection The collection to inspect.
2265 * @param {Function} predicate The function invoked per iteration.
2266 * @param {Function} eachFunc The function to iterate over `collection`.
2267 * @returns {*} Returns the found element or its key, else `undefined`.
2268 */
2269 function baseFindKey(collection, predicate, eachFunc) {
2270 var result;
2271 eachFunc(collection, function(value, key, collection) {
2272 if (predicate(value, key, collection)) {
2273 result = key;
2274 return false;
2275 }
2276 });
2277 return result;
2278 }
2279
2280 /**
2281 * The base implementation of `_.findIndex` and `_.findLastIndex` without
2282 * support for iteratee shorthands.
2283 *
2284 * @private
2285 * @param {Array} array The array to inspect.
2286 * @param {Function} predicate The function invoked per iteration.
2287 * @param {number} fromIndex The index to search from.
2288 * @param {boolean} [fromRight] Specify iterating from right to left.
2289 * @returns {number} Returns the index of the matched value, else `-1`.
2290 */
2291 function baseFindIndex(array, predicate, fromIndex, fromRight) {
2292 var length = array.length,
2293 index = fromIndex + (fromRight ? 1 : -1);
2294
2295 while ((fromRight ? index-- : ++index < length)) {
2296 if (predicate(array[index], index, array)) {
2297 return index;
2298 }
2299 }
2300 return -1;
2301 }
2302
2303 /**
2304 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
2305 *
2306 * @private
2307 * @param {Array} array The array to inspect.
2308 * @param {*} value The value to search for.
2309 * @param {number} fromIndex The index to search from.
2310 * @returns {number} Returns the index of the matched value, else `-1`.
2311 */
2312 function baseIndexOf(array, value, fromIndex) {
2313 return value === value
2314 ? strictIndexOf(array, value, fromIndex)
2315 : baseFindIndex(array, baseIsNaN, fromIndex);
2316 }
2317
2318 /**
2319 * This function is like `baseIndexOf` except that it accepts a comparator.
2320 *
2321 * @private
2322 * @param {Array} array The array to inspect.
2323 * @param {*} value The value to search for.
2324 * @param {number} fromIndex The index to search from.
2325 * @param {Function} comparator The comparator invoked per element.
2326 * @returns {number} Returns the index of the matched value, else `-1`.
2327 */
2328 function baseIndexOfWith(array, value, fromIndex, comparator) {
2329 var index = fromIndex - 1,
2330 length = array.length;
2331
2332 while (++index < length) {
2333 if (comparator(array[index], value)) {
2334 return index;
2335 }
2336 }
2337 return -1;
2338 }
2339
2340 /**
2341 * The base implementation of `_.isNaN` without support for number objects.
2342 *
2343 * @private
2344 * @param {*} value The value to check.
2345 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2346 */
2347 function baseIsNaN(value) {
2348 return value !== value;
2349 }
2350
2351 /**
2352 * The base implementation of `_.mean` and `_.meanBy` without support for
2353 * iteratee shorthands.
2354 *
2355 * @private
2356 * @param {Array} array The array to iterate over.
2357 * @param {Function} iteratee The function invoked per iteration.
2358 * @returns {number} Returns the mean.
2359 */
2360 function baseMean(array, iteratee) {
2361 var length = array == null ? 0 : array.length;
2362 return length ? (baseSum(array, iteratee) / length) : NAN;
2363 }
2364
2365 /**
2366 * The base implementation of `_.property` without support for deep paths.
2367 *
2368 * @private
2369 * @param {string} key The key of the property to get.
2370 * @returns {Function} Returns the new accessor function.
2371 */
2372 function baseProperty(key) {
2373 return function(object) {
2374 return object == null ? undefined : object[key];
2375 };
2376 }
2377
2378 /**
2379 * The base implementation of `_.propertyOf` without support for deep paths.
2380 *
2381 * @private
2382 * @param {Object} object The object to query.
2383 * @returns {Function} Returns the new accessor function.
2384 */
2385 function basePropertyOf(object) {
2386 return function(key) {
2387 return object == null ? undefined : object[key];
2388 };
2389 }
2390
2391 /**
2392 * The base implementation of `_.reduce` and `_.reduceRight`, without support
2393 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
2394 *
2395 * @private
2396 * @param {Array|Object} collection The collection to iterate over.
2397 * @param {Function} iteratee The function invoked per iteration.
2398 * @param {*} accumulator The initial value.
2399 * @param {boolean} initAccum Specify using the first or last element of
2400 * `collection` as the initial value.
2401 * @param {Function} eachFunc The function to iterate over `collection`.
2402 * @returns {*} Returns the accumulated value.
2403 */
2404 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
2405 eachFunc(collection, function(value, index, collection) {
2406 accumulator = initAccum
2407 ? (initAccum = false, value)
2408 : iteratee(accumulator, value, index, collection);
2409 });
2410 return accumulator;
2411 }
2412
2413 /**
2414 * The base implementation of `_.sortBy` which uses `comparer` to define the
2415 * sort order of `array` and replaces criteria objects with their corresponding
2416 * values.
2417 *
2418 * @private
2419 * @param {Array} array The array to sort.
2420 * @param {Function} comparer The function to define sort order.
2421 * @returns {Array} Returns `array`.
2422 */
2423 function baseSortBy(array, comparer) {
2424 var length = array.length;
2425
2426 array.sort(comparer);
2427 while (length--) {
2428 array[length] = array[length].value;
2429 }
2430 return array;
2431 }
2432
2433 /**
2434 * The base implementation of `_.sum` and `_.sumBy` without support for
2435 * iteratee shorthands.
2436 *
2437 * @private
2438 * @param {Array} array The array to iterate over.
2439 * @param {Function} iteratee The function invoked per iteration.
2440 * @returns {number} Returns the sum.
2441 */
2442 function baseSum(array, iteratee) {
2443 var result,
2444 index = -1,
2445 length = array.length;
2446
2447 while (++index < length) {
2448 var current = iteratee(array[index]);
2449 if (current !== undefined) {
2450 result = result === undefined ? current : (result + current);
2451 }
2452 }
2453 return result;
2454 }
2455
2456 /**
2457 * The base implementation of `_.times` without support for iteratee shorthands
2458 * or max array length checks.
2459 *
2460 * @private
2461 * @param {number} n The number of times to invoke `iteratee`.
2462 * @param {Function} iteratee The function invoked per iteration.
2463 * @returns {Array} Returns the array of results.
2464 */
2465 function baseTimes(n, iteratee) {
2466 var index = -1,
2467 result = Array(n);
2468
2469 while (++index < n) {
2470 result[index] = iteratee(index);
2471 }
2472 return result;
2473 }
2474
2475 /**
2476 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
2477 * of key-value pairs for `object` corresponding to the property names of `props`.
2478 *
2479 * @private
2480 * @param {Object} object The object to query.
2481 * @param {Array} props The property names to get values for.
2482 * @returns {Object} Returns the key-value pairs.
2483 */
2484 function baseToPairs(object, props) {
2485 return arrayMap(props, function(key) {
2486 return [key, object[key]];
2487 });
2488 }
2489
2490 /**
2491 * The base implementation of `_.unary` without support for storing metadata.
2492 *
2493 * @private
2494 * @param {Function} func The function to cap arguments for.
2495 * @returns {Function} Returns the new capped function.
2496 */
2497 function baseUnary(func) {
2498 return function(value) {
2499 return func(value);
2500 };
2501 }
2502
2503 /**
2504 * The base implementation of `_.values` and `_.valuesIn` which creates an
2505 * array of `object` property values corresponding to the property names
2506 * of `props`.
2507 *
2508 * @private
2509 * @param {Object} object The object to query.
2510 * @param {Array} props The property names to get values for.
2511 * @returns {Object} Returns the array of property values.
2512 */
2513 function baseValues(object, props) {
2514 return arrayMap(props, function(key) {
2515 return object[key];
2516 });
2517 }
2518
2519 /**
2520 * Checks if a `cache` value for `key` exists.
2521 *
2522 * @private
2523 * @param {Object} cache The cache to query.
2524 * @param {string} key The key of the entry to check.
2525 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2526 */
2527 function cacheHas(cache, key) {
2528 return cache.has(key);
2529 }
2530
2531 /**
2532 * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
2533 * that is not found in the character symbols.
2534 *
2535 * @private
2536 * @param {Array} strSymbols The string symbols to inspect.
2537 * @param {Array} chrSymbols The character symbols to find.
2538 * @returns {number} Returns the index of the first unmatched string symbol.
2539 */
2540 function charsStartIndex(strSymbols, chrSymbols) {
2541 var index = -1,
2542 length = strSymbols.length;
2543
2544 while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
2545 return index;
2546 }
2547
2548 /**
2549 * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
2550 * that is not found in the character symbols.
2551 *
2552 * @private
2553 * @param {Array} strSymbols The string symbols to inspect.
2554 * @param {Array} chrSymbols The character symbols to find.
2555 * @returns {number} Returns the index of the last unmatched string symbol.
2556 */
2557 function charsEndIndex(strSymbols, chrSymbols) {
2558 var index = strSymbols.length;
2559
2560 while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
2561 return index;
2562 }
2563
2564 /**
2565 * Gets the number of `placeholder` occurrences in `array`.
2566 *
2567 * @private
2568 * @param {Array} array The array to inspect.
2569 * @param {*} placeholder The placeholder to search for.
2570 * @returns {number} Returns the placeholder count.
2571 */
2572 function countHolders(array, placeholder) {
2573 var length = array.length,
2574 result = 0;
2575
2576 while (length--) {
2577 if (array[length] === placeholder) {
2578 ++result;
2579 }
2580 }
2581 return result;
2582 }
2583
2584 /**
2585 * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
2586 * letters to basic Latin letters.
2587 *
2588 * @private
2589 * @param {string} letter The matched letter to deburr.
2590 * @returns {string} Returns the deburred letter.
2591 */
2592 var deburrLetter = basePropertyOf(deburredLetters);
2593
2594 /**
2595 * Used by `_.escape` to convert characters to HTML entities.
2596 *
2597 * @private
2598 * @param {string} chr The matched character to escape.
2599 * @returns {string} Returns the escaped character.
2600 */
2601 var escapeHtmlChar = basePropertyOf(htmlEscapes);
2602
2603 /**
2604 * Used by `_.template` to escape characters for inclusion in compiled string literals.
2605 *
2606 * @private
2607 * @param {string} chr The matched character to escape.
2608 * @returns {string} Returns the escaped character.
2609 */
2610 function escapeStringChar(chr) {
2611 return '\\' + stringEscapes[chr];
2612 }
2613
2614 /**
2615 * Gets the value at `key` of `object`.
2616 *
2617 * @private
2618 * @param {Object} [object] The object to query.
2619 * @param {string} key The key of the property to get.
2620 * @returns {*} Returns the property value.
2621 */
2622 function getValue(object, key) {
2623 return object == null ? undefined : object[key];
2624 }
2625
2626 /**
2627 * Checks if `string` contains Unicode symbols.
2628 *
2629 * @private
2630 * @param {string} string The string to inspect.
2631 * @returns {boolean} Returns `true` if a symbol is found, else `false`.
2632 */
2633 function hasUnicode(string) {
2634 return reHasUnicode.test(string);
2635 }
2636
2637 /**
2638 * Checks if `string` contains a word composed of Unicode symbols.
2639 *
2640 * @private
2641 * @param {string} string The string to inspect.
2642 * @returns {boolean} Returns `true` if a word is found, else `false`.
2643 */
2644 function hasUnicodeWord(string) {
2645 return reHasUnicodeWord.test(string);
2646 }
2647
2648 /**
2649 * Converts `iterator` to an array.
2650 *
2651 * @private
2652 * @param {Object} iterator The iterator to convert.
2653 * @returns {Array} Returns the converted array.
2654 */
2655 function iteratorToArray(iterator) {
2656 var data,
2657 result = [];
2658
2659 while (!(data = iterator.next()).done) {
2660 result.push(data.value);
2661 }
2662 return result;
2663 }
2664
2665 /**
2666 * Converts `map` to its key-value pairs.
2667 *
2668 * @private
2669 * @param {Object} map The map to convert.
2670 * @returns {Array} Returns the key-value pairs.
2671 */
2672 function mapToArray(map) {
2673 var index = -1,
2674 result = Array(map.size);
2675
2676 map.forEach(function(value, key) {
2677 result[++index] = [key, value];
2678 });
2679 return result;
2680 }
2681
2682 /**
2683 * Creates a unary function that invokes `func` with its argument transformed.
2684 *
2685 * @private
2686 * @param {Function} func The function to wrap.
2687 * @param {Function} transform The argument transform.
2688 * @returns {Function} Returns the new function.
2689 */
2690 function overArg(func, transform) {
2691 return function(arg) {
2692 return func(transform(arg));
2693 };
2694 }
2695
2696 /**
2697 * Replaces all `placeholder` elements in `array` with an internal placeholder
2698 * and returns an array of their indexes.
2699 *
2700 * @private
2701 * @param {Array} array The array to modify.
2702 * @param {*} placeholder The placeholder to replace.
2703 * @returns {Array} Returns the new array of placeholder indexes.
2704 */
2705 function replaceHolders(array, placeholder) {
2706 var index = -1,
2707 length = array.length,
2708 resIndex = 0,
2709 result = [];
2710
2711 while (++index < length) {
2712 var value = array[index];
2713 if (value === placeholder || value === PLACEHOLDER) {
2714 array[index] = PLACEHOLDER;
2715 result[resIndex++] = index;
2716 }
2717 }
2718 return result;
2719 }
2720
2721 /**
2722 * Converts `set` to an array of its values.
2723 *
2724 * @private
2725 * @param {Object} set The set to convert.
2726 * @returns {Array} Returns the values.
2727 */
2728 function setToArray(set) {
2729 var index = -1,
2730 result = Array(set.size);
2731
2732 set.forEach(function(value) {
2733 result[++index] = value;
2734 });
2735 return result;
2736 }
2737
2738 /**
2739 * Converts `set` to its value-value pairs.
2740 *
2741 * @private
2742 * @param {Object} set The set to convert.
2743 * @returns {Array} Returns the value-value pairs.
2744 */
2745 function setToPairs(set) {
2746 var index = -1,
2747 result = Array(set.size);
2748
2749 set.forEach(function(value) {
2750 result[++index] = [value, value];
2751 });
2752 return result;
2753 }
2754
2755 /**
2756 * A specialized version of `_.indexOf` which performs strict equality
2757 * comparisons of values, i.e. `===`.
2758 *
2759 * @private
2760 * @param {Array} array The array to inspect.
2761 * @param {*} value The value to search for.
2762 * @param {number} fromIndex The index to search from.
2763 * @returns {number} Returns the index of the matched value, else `-1`.
2764 */
2765 function strictIndexOf(array, value, fromIndex) {
2766 var index = fromIndex - 1,
2767 length = array.length;
2768
2769 while (++index < length) {
2770 if (array[index] === value) {
2771 return index;
2772 }
2773 }
2774 return -1;
2775 }
2776
2777 /**
2778 * A specialized version of `_.lastIndexOf` which performs strict equality
2779 * comparisons of values, i.e. `===`.
2780 *
2781 * @private
2782 * @param {Array} array The array to inspect.
2783 * @param {*} value The value to search for.
2784 * @param {number} fromIndex The index to search from.
2785 * @returns {number} Returns the index of the matched value, else `-1`.
2786 */
2787 function strictLastIndexOf(array, value, fromIndex) {
2788 var index = fromIndex + 1;
2789 while (index--) {
2790 if (array[index] === value) {
2791 return index;
2792 }
2793 }
2794 return index;
2795 }
2796
2797 /**
2798 * Gets the number of symbols in `string`.
2799 *
2800 * @private
2801 * @param {string} string The string to inspect.
2802 * @returns {number} Returns the string size.
2803 */
2804 function stringSize(string) {
2805 return hasUnicode(string)
2806 ? unicodeSize(string)
2807 : asciiSize(string);
2808 }
2809
2810 /**
2811 * Converts `string` to an array.
2812 *
2813 * @private
2814 * @param {string} string The string to convert.
2815 * @returns {Array} Returns the converted array.
2816 */
2817 function stringToArray(string) {
2818 return hasUnicode(string)
2819 ? unicodeToArray(string)
2820 : asciiToArray(string);
2821 }
2822
2823 /**
2824 * Used by `_.unescape` to convert HTML entities to characters.
2825 *
2826 * @private
2827 * @param {string} chr The matched character to unescape.
2828 * @returns {string} Returns the unescaped character.
2829 */
2830 var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
2831
2832 /**
2833 * Gets the size of a Unicode `string`.
2834 *
2835 * @private
2836 * @param {string} string The string inspect.
2837 * @returns {number} Returns the string size.
2838 */
2839 function unicodeSize(string) {
2840 var result = reUnicode.lastIndex = 0;
2841 while (reUnicode.test(string)) {
2842 ++result;
2843 }
2844 return result;
2845 }
2846
2847 /**
2848 * Converts a Unicode `string` to an array.
2849 *
2850 * @private
2851 * @param {string} string The string to convert.
2852 * @returns {Array} Returns the converted array.
2853 */
2854 function unicodeToArray(string) {
2855 return string.match(reUnicode) || [];
2856 }
2857
2858 /**
2859 * Splits a Unicode `string` into an array of its words.
2860 *
2861 * @private
2862 * @param {string} The string to inspect.
2863 * @returns {Array} Returns the words of `string`.
2864 */
2865 function unicodeWords(string) {
2866 return string.match(reUnicodeWord) || [];
2867 }
2868
2869 /*--------------------------------------------------------------------------*/
2870
2871 /**
2872 * Create a new pristine `lodash` function using the `context` object.
2873 *
2874 * @static
2875 * @memberOf _
2876 * @since 1.1.0
2877 * @category Util
2878 * @param {Object} [context=root] The context object.
2879 * @returns {Function} Returns a new `lodash` function.
2880 * @example
2881 *
2882 * _.mixin({ 'foo': _.constant('foo') });
2883 *
2884 * var lodash = _.runInContext();
2885 * lodash.mixin({ 'bar': lodash.constant('bar') });
2886 *
2887 * _.isFunction(_.foo);
2888 * // => true
2889 * _.isFunction(_.bar);
2890 * // => false
2891 *
2892 * lodash.isFunction(lodash.foo);
2893 * // => false
2894 * lodash.isFunction(lodash.bar);
2895 * // => true
2896 *
2897 * // Create a suped-up `defer` in Node.js.
2898 * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
2899 */
2900 var runInContext = (function runInContext(context) {
2901 context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
2902
2903 /** Built-in constructor references. */
2904 var Array = context.Array,
2905 Date = context.Date,
2906 Error = context.Error,
2907 Function = context.Function,
2908 Math = context.Math,
2909 Object = context.Object,
2910 RegExp = context.RegExp,
2911 String = context.String,
2912 TypeError = context.TypeError;
2913
2914 /** Used for built-in method references. */
2915 var arrayProto = Array.prototype,
2916 funcProto = Function.prototype,
2917 objectProto = Object.prototype;
2918
2919 /** Used to detect overreaching core-js shims. */
2920 var coreJsData = context['__core-js_shared__'];
2921
2922 /** Used to resolve the decompiled source of functions. */
2923 var funcToString = funcProto.toString;
2924
2925 /** Used to check objects for own properties. */
2926 var hasOwnProperty = objectProto.hasOwnProperty;
2927
2928 /** Used to generate unique IDs. */
2929 var idCounter = 0;
2930
2931 /** Used to detect methods masquerading as native. */
2932 var maskSrcKey = (function() {
2933 var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
2934 return uid ? ('Symbol(src)_1.' + uid) : '';
2935 }());
2936
2937 /**
2938 * Used to resolve the
2939 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
2940 * of values.
2941 */
2942 var nativeObjectToString = objectProto.toString;
2943
2944 /** Used to infer the `Object` constructor. */
2945 var objectCtorString = funcToString.call(Object);
2946
2947 /** Used to restore the original `_` reference in `_.noConflict`. */
2948 var oldDash = root._;
2949
2950 /** Used to detect if a method is native. */
2951 var reIsNative = RegExp('^' +
2952 funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
2953 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
2954 );
2955
2956 /** Built-in value references. */
2957 var Buffer = moduleExports ? context.Buffer : undefined,
2958 Symbol = context.Symbol,
2959 Uint8Array = context.Uint8Array,
2960 allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
2961 getPrototype = overArg(Object.getPrototypeOf, Object),
2962 objectCreate = Object.create,
2963 propertyIsEnumerable = objectProto.propertyIsEnumerable,
2964 splice = arrayProto.splice,
2965 spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
2966 symIterator = Symbol ? Symbol.iterator : undefined,
2967 symToStringTag = Symbol ? Symbol.toStringTag : undefined;
2968
2969 var defineProperty = (function() {
2970 try {
2971 var func = getNative(Object, 'defineProperty');
2972 func({}, '', {});
2973 return func;
2974 } catch (e) {}
2975 }());
2976
2977 /** Mocked built-ins. */
2978 var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
2979 ctxNow = Date && Date.now !== root.Date.now && Date.now,
2980 ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
2981
2982 /* Built-in method references for those with the same name as other `lodash` methods. */
2983 var nativeCeil = Math.ceil,
2984 nativeFloor = Math.floor,
2985 nativeGetSymbols = Object.getOwnPropertySymbols,
2986 nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
2987 nativeIsFinite = context.isFinite,
2988 nativeJoin = arrayProto.join,
2989 nativeKeys = overArg(Object.keys, Object),
2990 nativeMax = Math.max,
2991 nativeMin = Math.min,
2992 nativeNow = Date.now,
2993 nativeParseInt = context.parseInt,
2994 nativeRandom = Math.random,
2995 nativeReverse = arrayProto.reverse;
2996
2997 /* Built-in method references that are verified to be native. */
2998 var DataView = getNative(context, 'DataView'),
2999 Map = getNative(context, 'Map'),
3000 Promise = getNative(context, 'Promise'),
3001 Set = getNative(context, 'Set'),
3002 WeakMap = getNative(context, 'WeakMap'),
3003 nativeCreate = getNative(Object, 'create');
3004
3005 /** Used to store function metadata. */
3006 var metaMap = WeakMap && new WeakMap;
3007
3008 /** Used to lookup unminified function names. */
3009 var realNames = {};
3010
3011 /** Used to detect maps, sets, and weakmaps. */
3012 var dataViewCtorString = toSource(DataView),
3013 mapCtorString = toSource(Map),
3014 promiseCtorString = toSource(Promise),
3015 setCtorString = toSource(Set),
3016 weakMapCtorString = toSource(WeakMap);
3017
3018 /** Used to convert symbols to primitives and strings. */
3019 var symbolProto = Symbol ? Symbol.prototype : undefined,
3020 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
3021 symbolToString = symbolProto ? symbolProto.toString : undefined;
3022
3023 /*------------------------------------------------------------------------*/
3024
3025 /**
3026 * Creates a `lodash` object which wraps `value` to enable implicit method
3027 * chain sequences. Methods that operate on and return arrays, collections,
3028 * and functions can be chained together. Methods that retrieve a single value
3029 * or may return a primitive value will automatically end the chain sequence
3030 * and return the unwrapped value. Otherwise, the value must be unwrapped
3031 * with `_#value`.
3032 *
3033 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
3034 * enabled using `_.chain`.
3035 *
3036 * The execution of chained methods is lazy, that is, it's deferred until
3037 * `_#value` is implicitly or explicitly called.
3038 *
3039 * Lazy evaluation allows several methods to support shortcut fusion.
3040 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
3041 * the creation of intermediate arrays and can greatly reduce the number of
3042 * iteratee executions. Sections of a chain sequence qualify for shortcut
3043 * fusion if the section is applied to an array and iteratees accept only
3044 * one argument. The heuristic for whether a section qualifies for shortcut
3045 * fusion is subject to change.
3046 *
3047 * Chaining is supported in custom builds as long as the `_#value` method is
3048 * directly or indirectly included in the build.
3049 *
3050 * In addition to lodash methods, wrappers have `Array` and `String` methods.
3051 *
3052 * The wrapper `Array` methods are:
3053 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
3054 *
3055 * The wrapper `String` methods are:
3056 * `replace` and `split`
3057 *
3058 * The wrapper methods that support shortcut fusion are:
3059 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
3060 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
3061 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
3062 *
3063 * The chainable wrapper methods are:
3064 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
3065 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
3066 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
3067 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
3068 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
3069 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
3070 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
3071 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
3072 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
3073 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
3074 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
3075 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
3076 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
3077 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
3078 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
3079 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
3080 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
3081 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
3082 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
3083 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
3084 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
3085 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
3086 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
3087 * `zipObject`, `zipObjectDeep`, and `zipWith`
3088 *
3089 * The wrapper methods that are **not** chainable by default are:
3090 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
3091 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
3092 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
3093 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
3094 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
3095 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
3096 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
3097 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
3098 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
3099 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
3100 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
3101 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
3102 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
3103 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
3104 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
3105 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
3106 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
3107 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
3108 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
3109 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
3110 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
3111 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
3112 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
3113 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
3114 * `upperFirst`, `value`, and `words`
3115 *
3116 * @name _
3117 * @constructor
3118 * @category Seq
3119 * @param {*} value The value to wrap in a `lodash` instance.
3120 * @returns {Object} Returns the new `lodash` wrapper instance.
3121 * @example
3122 *
3123 * function square(n) {
3124 * return n * n;
3125 * }
3126 *
3127 * var wrapped = _([1, 2, 3]);
3128 *
3129 * // Returns an unwrapped value.
3130 * wrapped.reduce(_.add);
3131 * // => 6
3132 *
3133 * // Returns a wrapped value.
3134 * var squares = wrapped.map(square);
3135 *
3136 * _.isArray(squares);
3137 * // => false
3138 *
3139 * _.isArray(squares.value());
3140 * // => true
3141 */
3142 function lodash(value) {
3143 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
3144 if (value instanceof LodashWrapper) {
3145 return value;
3146 }
3147 if (hasOwnProperty.call(value, '__wrapped__')) {
3148 return wrapperClone(value);
3149 }
3150 }
3151 return new LodashWrapper(value);
3152 }
3153
3154 /**
3155 * The base implementation of `_.create` without support for assigning
3156 * properties to the created object.
3157 *
3158 * @private
3159 * @param {Object} proto The object to inherit from.
3160 * @returns {Object} Returns the new object.
3161 */
3162 var baseCreate = (function() {
3163 function object() {}
3164 return function(proto) {
3165 if (!isObject(proto)) {
3166 return {};
3167 }
3168 if (objectCreate) {
3169 return objectCreate(proto);
3170 }
3171 object.prototype = proto;
3172 var result = new object;
3173 object.prototype = undefined;
3174 return result;
3175 };
3176 }());
3177
3178 /**
3179 * The function whose prototype chain sequence wrappers inherit from.
3180 *
3181 * @private
3182 */
3183 function baseLodash() {
3184 // No operation performed.
3185 }
3186
3187 /**
3188 * The base constructor for creating `lodash` wrapper objects.
3189 *
3190 * @private
3191 * @param {*} value The value to wrap.
3192 * @param {boolean} [chainAll] Enable explicit method chain sequences.
3193 */
3194 function LodashWrapper(value, chainAll) {
3195 this.__wrapped__ = value;
3196 this.__actions__ = [];
3197 this.__chain__ = !!chainAll;
3198 this.__index__ = 0;
3199 this.__values__ = undefined;
3200 }
3201
3202 /**
3203 * By default, the template delimiters used by lodash are like those in
3204 * embedded Ruby (ERB) as well as ES2015 template strings. Change the
3205 * following template settings to use alternative delimiters.
3206 *
3207 * @static
3208 * @memberOf _
3209 * @type {Object}
3210 */
3211 lodash.templateSettings = {
3212
3213 /**
3214 * Used to detect `data` property values to be HTML-escaped.
3215 *
3216 * @memberOf _.templateSettings
3217 * @type {RegExp}
3218 */
3219 'escape': reEscape,
3220
3221 /**
3222 * Used to detect code to be evaluated.
3223 *
3224 * @memberOf _.templateSettings
3225 * @type {RegExp}
3226 */
3227 'evaluate': reEvaluate,
3228
3229 /**
3230 * Used to detect `data` property values to inject.
3231 *
3232 * @memberOf _.templateSettings
3233 * @type {RegExp}
3234 */
3235 'interpolate': reInterpolate,
3236
3237 /**
3238 * Used to reference the data object in the template text.
3239 *
3240 * @memberOf _.templateSettings
3241 * @type {string}
3242 */
3243 'variable': '',
3244
3245 /**
3246 * Used to import variables into the compiled template.
3247 *
3248 * @memberOf _.templateSettings
3249 * @type {Object}
3250 */
3251 'imports': {
3252
3253 /**
3254 * A reference to the `lodash` function.
3255 *
3256 * @memberOf _.templateSettings.imports
3257 * @type {Function}
3258 */
3259 '_': lodash
3260 }
3261 };
3262
3263 // Ensure wrappers are instances of `baseLodash`.
3264 lodash.prototype = baseLodash.prototype;
3265 lodash.prototype.constructor = lodash;
3266
3267 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
3268 LodashWrapper.prototype.constructor = LodashWrapper;
3269
3270 /*------------------------------------------------------------------------*/
3271
3272 /**
3273 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
3274 *
3275 * @private
3276 * @constructor
3277 * @param {*} value The value to wrap.
3278 */
3279 function LazyWrapper(value) {
3280 this.__wrapped__ = value;
3281 this.__actions__ = [];
3282 this.__dir__ = 1;
3283 this.__filtered__ = false;
3284 this.__iteratees__ = [];
3285 this.__takeCount__ = MAX_ARRAY_LENGTH;
3286 this.__views__ = [];
3287 }
3288
3289 /**
3290 * Creates a clone of the lazy wrapper object.
3291 *
3292 * @private
3293 * @name clone
3294 * @memberOf LazyWrapper
3295 * @returns {Object} Returns the cloned `LazyWrapper` object.
3296 */
3297 function lazyClone() {
3298 var result = new LazyWrapper(this.__wrapped__);
3299 result.__actions__ = copyArray(this.__actions__);
3300 result.__dir__ = this.__dir__;
3301 result.__filtered__ = this.__filtered__;
3302 result.__iteratees__ = copyArray(this.__iteratees__);
3303 result.__takeCount__ = this.__takeCount__;
3304 result.__views__ = copyArray(this.__views__);
3305 return result;
3306 }
3307
3308 /**
3309 * Reverses the direction of lazy iteration.
3310 *
3311 * @private
3312 * @name reverse
3313 * @memberOf LazyWrapper
3314 * @returns {Object} Returns the new reversed `LazyWrapper` object.
3315 */
3316 function lazyReverse() {
3317 if (this.__filtered__) {
3318 var result = new LazyWrapper(this);
3319 result.__dir__ = -1;
3320 result.__filtered__ = true;
3321 } else {
3322 result = this.clone();
3323 result.__dir__ *= -1;
3324 }
3325 return result;
3326 }
3327
3328 /**
3329 * Extracts the unwrapped value from its lazy wrapper.
3330 *
3331 * @private
3332 * @name value
3333 * @memberOf LazyWrapper
3334 * @returns {*} Returns the unwrapped value.
3335 */
3336 function lazyValue() {
3337 var array = this.__wrapped__.value(),
3338 dir = this.__dir__,
3339 isArr = isArray(array),
3340 isRight = dir < 0,
3341 arrLength = isArr ? array.length : 0,
3342 view = getView(0, arrLength, this.__views__),
3343 start = view.start,
3344 end = view.end,
3345 length = end - start,
3346 index = isRight ? end : (start - 1),
3347 iteratees = this.__iteratees__,
3348 iterLength = iteratees.length,
3349 resIndex = 0,
3350 takeCount = nativeMin(length, this.__takeCount__);
3351
3352 if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
3353 return baseWrapperValue(array, this.__actions__);
3354 }
3355 var result = [];
3356
3357 outer:
3358 while (length-- && resIndex < takeCount) {
3359 index += dir;
3360
3361 var iterIndex = -1,
3362 value = array[index];
3363
3364 while (++iterIndex < iterLength) {
3365 var data = iteratees[iterIndex],
3366 iteratee = data.iteratee,
3367 type = data.type,
3368 computed = iteratee(value);
3369
3370 if (type == LAZY_MAP_FLAG) {
3371 value = computed;
3372 } else if (!computed) {
3373 if (type == LAZY_FILTER_FLAG) {
3374 continue outer;
3375 } else {
3376 break outer;
3377 }
3378 }
3379 }
3380 result[resIndex++] = value;
3381 }
3382 return result;
3383 }
3384
3385 // Ensure `LazyWrapper` is an instance of `baseLodash`.
3386 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
3387 LazyWrapper.prototype.constructor = LazyWrapper;
3388
3389 /*------------------------------------------------------------------------*/
3390
3391 /**
3392 * Creates a hash object.
3393 *
3394 * @private
3395 * @constructor
3396 * @param {Array} [entries] The key-value pairs to cache.
3397 */
3398 function Hash(entries) {
3399 var index = -1,
3400 length = entries == null ? 0 : entries.length;
3401
3402 this.clear();
3403 while (++index < length) {
3404 var entry = entries[index];
3405 this.set(entry[0], entry[1]);
3406 }
3407 }
3408
3409 /**
3410 * Removes all key-value entries from the hash.
3411 *
3412 * @private
3413 * @name clear
3414 * @memberOf Hash
3415 */
3416 function hashClear() {
3417 this.__data__ = nativeCreate ? nativeCreate(null) : {};
3418 this.size = 0;
3419 }
3420
3421 /**
3422 * Removes `key` and its value from the hash.
3423 *
3424 * @private
3425 * @name delete
3426 * @memberOf Hash
3427 * @param {Object} hash The hash to modify.
3428 * @param {string} key The key of the value to remove.
3429 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3430 */
3431 function hashDelete(key) {
3432 var result = this.has(key) && delete this.__data__[key];
3433 this.size -= result ? 1 : 0;
3434 return result;
3435 }
3436
3437 /**
3438 * Gets the hash value for `key`.
3439 *
3440 * @private
3441 * @name get
3442 * @memberOf Hash
3443 * @param {string} key The key of the value to get.
3444 * @returns {*} Returns the entry value.
3445 */
3446 function hashGet(key) {
3447 var data = this.__data__;
3448 if (nativeCreate) {
3449 var result = data[key];
3450 return result === HASH_UNDEFINED ? undefined : result;
3451 }
3452 return hasOwnProperty.call(data, key) ? data[key] : undefined;
3453 }
3454
3455 /**
3456 * Checks if a hash value for `key` exists.
3457 *
3458 * @private
3459 * @name has
3460 * @memberOf Hash
3461 * @param {string} key The key of the entry to check.
3462 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3463 */
3464 function hashHas(key) {
3465 var data = this.__data__;
3466 return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
3467 }
3468
3469 /**
3470 * Sets the hash `key` to `value`.
3471 *
3472 * @private
3473 * @name set
3474 * @memberOf Hash
3475 * @param {string} key The key of the value to set.
3476 * @param {*} value The value to set.
3477 * @returns {Object} Returns the hash instance.
3478 */
3479 function hashSet(key, value) {
3480 var data = this.__data__;
3481 this.size += this.has(key) ? 0 : 1;
3482 data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
3483 return this;
3484 }
3485
3486 // Add methods to `Hash`.
3487 Hash.prototype.clear = hashClear;
3488 Hash.prototype['delete'] = hashDelete;
3489 Hash.prototype.get = hashGet;
3490 Hash.prototype.has = hashHas;
3491 Hash.prototype.set = hashSet;
3492
3493 /*------------------------------------------------------------------------*/
3494
3495 /**
3496 * Creates an list cache object.
3497 *
3498 * @private
3499 * @constructor
3500 * @param {Array} [entries] The key-value pairs to cache.
3501 */
3502 function ListCache(entries) {
3503 var index = -1,
3504 length = entries == null ? 0 : entries.length;
3505
3506 this.clear();
3507 while (++index < length) {
3508 var entry = entries[index];
3509 this.set(entry[0], entry[1]);
3510 }
3511 }
3512
3513 /**
3514 * Removes all key-value entries from the list cache.
3515 *
3516 * @private
3517 * @name clear
3518 * @memberOf ListCache
3519 */
3520 function listCacheClear() {
3521 this.__data__ = [];
3522 this.size = 0;
3523 }
3524
3525 /**
3526 * Removes `key` and its value from the list cache.
3527 *
3528 * @private
3529 * @name delete
3530 * @memberOf ListCache
3531 * @param {string} key The key of the value to remove.
3532 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3533 */
3534 function listCacheDelete(key) {
3535 var data = this.__data__,
3536 index = assocIndexOf(data, key);
3537
3538 if (index < 0) {
3539 return false;
3540 }
3541 var lastIndex = data.length - 1;
3542 if (index == lastIndex) {
3543 data.pop();
3544 } else {
3545 splice.call(data, index, 1);
3546 }
3547 --this.size;
3548 return true;
3549 }
3550
3551 /**
3552 * Gets the list cache value for `key`.
3553 *
3554 * @private
3555 * @name get
3556 * @memberOf ListCache
3557 * @param {string} key The key of the value to get.
3558 * @returns {*} Returns the entry value.
3559 */
3560 function listCacheGet(key) {
3561 var data = this.__data__,
3562 index = assocIndexOf(data, key);
3563
3564 return index < 0 ? undefined : data[index][1];
3565 }
3566
3567 /**
3568 * Checks if a list cache value for `key` exists.
3569 *
3570 * @private
3571 * @name has
3572 * @memberOf ListCache
3573 * @param {string} key The key of the entry to check.
3574 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3575 */
3576 function listCacheHas(key) {
3577 return assocIndexOf(this.__data__, key) > -1;
3578 }
3579
3580 /**
3581 * Sets the list cache `key` to `value`.
3582 *
3583 * @private
3584 * @name set
3585 * @memberOf ListCache
3586 * @param {string} key The key of the value to set.
3587 * @param {*} value The value to set.
3588 * @returns {Object} Returns the list cache instance.
3589 */
3590 function listCacheSet(key, value) {
3591 var data = this.__data__,
3592 index = assocIndexOf(data, key);
3593
3594 if (index < 0) {
3595 ++this.size;
3596 data.push([key, value]);
3597 } else {
3598 data[index][1] = value;
3599 }
3600 return this;
3601 }
3602
3603 // Add methods to `ListCache`.
3604 ListCache.prototype.clear = listCacheClear;
3605 ListCache.prototype['delete'] = listCacheDelete;
3606 ListCache.prototype.get = listCacheGet;
3607 ListCache.prototype.has = listCacheHas;
3608 ListCache.prototype.set = listCacheSet;
3609
3610 /*------------------------------------------------------------------------*/
3611
3612 /**
3613 * Creates a map cache object to store key-value pairs.
3614 *
3615 * @private
3616 * @constructor
3617 * @param {Array} [entries] The key-value pairs to cache.
3618 */
3619 function MapCache(entries) {
3620 var index = -1,
3621 length = entries == null ? 0 : entries.length;
3622
3623 this.clear();
3624 while (++index < length) {
3625 var entry = entries[index];
3626 this.set(entry[0], entry[1]);
3627 }
3628 }
3629
3630 /**
3631 * Removes all key-value entries from the map.
3632 *
3633 * @private
3634 * @name clear
3635 * @memberOf MapCache
3636 */
3637 function mapCacheClear() {
3638 this.size = 0;
3639 this.__data__ = {
3640 'hash': new Hash,
3641 'map': new (Map || ListCache),
3642 'string': new Hash
3643 };
3644 }
3645
3646 /**
3647 * Removes `key` and its value from the map.
3648 *
3649 * @private
3650 * @name delete
3651 * @memberOf MapCache
3652 * @param {string} key The key of the value to remove.
3653 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3654 */
3655 function mapCacheDelete(key) {
3656 var result = getMapData(this, key)['delete'](key);
3657 this.size -= result ? 1 : 0;
3658 return result;
3659 }
3660
3661 /**
3662 * Gets the map value for `key`.
3663 *
3664 * @private
3665 * @name get
3666 * @memberOf MapCache
3667 * @param {string} key The key of the value to get.
3668 * @returns {*} Returns the entry value.
3669 */
3670 function mapCacheGet(key) {
3671 return getMapData(this, key).get(key);
3672 }
3673
3674 /**
3675 * Checks if a map value for `key` exists.
3676 *
3677 * @private
3678 * @name has
3679 * @memberOf MapCache
3680 * @param {string} key The key of the entry to check.
3681 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3682 */
3683 function mapCacheHas(key) {
3684 return getMapData(this, key).has(key);
3685 }
3686
3687 /**
3688 * Sets the map `key` to `value`.
3689 *
3690 * @private
3691 * @name set
3692 * @memberOf MapCache
3693 * @param {string} key The key of the value to set.
3694 * @param {*} value The value to set.
3695 * @returns {Object} Returns the map cache instance.
3696 */
3697 function mapCacheSet(key, value) {
3698 var data = getMapData(this, key),
3699 size = data.size;
3700
3701 data.set(key, value);
3702 this.size += data.size == size ? 0 : 1;
3703 return this;
3704 }
3705
3706 // Add methods to `MapCache`.
3707 MapCache.prototype.clear = mapCacheClear;
3708 MapCache.prototype['delete'] = mapCacheDelete;
3709 MapCache.prototype.get = mapCacheGet;
3710 MapCache.prototype.has = mapCacheHas;
3711 MapCache.prototype.set = mapCacheSet;
3712
3713 /*------------------------------------------------------------------------*/
3714
3715 /**
3716 *
3717 * Creates an array cache object to store unique values.
3718 *
3719 * @private
3720 * @constructor
3721 * @param {Array} [values] The values to cache.
3722 */
3723 function SetCache(values) {
3724 var index = -1,
3725 length = values == null ? 0 : values.length;
3726
3727 this.__data__ = new MapCache;
3728 while (++index < length) {
3729 this.add(values[index]);
3730 }
3731 }
3732
3733 /**
3734 * Adds `value` to the array cache.
3735 *
3736 * @private
3737 * @name add
3738 * @memberOf SetCache
3739 * @alias push
3740 * @param {*} value The value to cache.
3741 * @returns {Object} Returns the cache instance.
3742 */
3743 function setCacheAdd(value) {
3744 this.__data__.set(value, HASH_UNDEFINED);
3745 return this;
3746 }
3747
3748 /**
3749 * Checks if `value` is in the array cache.
3750 *
3751 * @private
3752 * @name has
3753 * @memberOf SetCache
3754 * @param {*} value The value to search for.
3755 * @returns {number} Returns `true` if `value` is found, else `false`.
3756 */
3757 function setCacheHas(value) {
3758 return this.__data__.has(value);
3759 }
3760
3761 // Add methods to `SetCache`.
3762 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
3763 SetCache.prototype.has = setCacheHas;
3764
3765 /*------------------------------------------------------------------------*/
3766
3767 /**
3768 * Creates a stack cache object to store key-value pairs.
3769 *
3770 * @private
3771 * @constructor
3772 * @param {Array} [entries] The key-value pairs to cache.
3773 */
3774 function Stack(entries) {
3775 var data = this.__data__ = new ListCache(entries);
3776 this.size = data.size;
3777 }
3778
3779 /**
3780 * Removes all key-value entries from the stack.
3781 *
3782 * @private
3783 * @name clear
3784 * @memberOf Stack
3785 */
3786 function stackClear() {
3787 this.__data__ = new ListCache;
3788 this.size = 0;
3789 }
3790
3791 /**
3792 * Removes `key` and its value from the stack.
3793 *
3794 * @private
3795 * @name delete
3796 * @memberOf Stack
3797 * @param {string} key The key of the value to remove.
3798 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3799 */
3800 function stackDelete(key) {
3801 var data = this.__data__,
3802 result = data['delete'](key);
3803
3804 this.size = data.size;
3805 return result;
3806 }
3807
3808 /**
3809 * Gets the stack value for `key`.
3810 *
3811 * @private
3812 * @name get
3813 * @memberOf Stack
3814 * @param {string} key The key of the value to get.
3815 * @returns {*} Returns the entry value.
3816 */
3817 function stackGet(key) {
3818 return this.__data__.get(key);
3819 }
3820
3821 /**
3822 * Checks if a stack value for `key` exists.
3823 *
3824 * @private
3825 * @name has
3826 * @memberOf Stack
3827 * @param {string} key The key of the entry to check.
3828 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3829 */
3830 function stackHas(key) {
3831 return this.__data__.has(key);
3832 }
3833
3834 /**
3835 * Sets the stack `key` to `value`.
3836 *
3837 * @private
3838 * @name set
3839 * @memberOf Stack
3840 * @param {string} key The key of the value to set.
3841 * @param {*} value The value to set.
3842 * @returns {Object} Returns the stack cache instance.
3843 */
3844 function stackSet(key, value) {
3845 var data = this.__data__;
3846 if (data instanceof ListCache) {
3847 var pairs = data.__data__;
3848 if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
3849 pairs.push([key, value]);
3850 this.size = ++data.size;
3851 return this;
3852 }
3853 data = this.__data__ = new MapCache(pairs);
3854 }
3855 data.set(key, value);
3856 this.size = data.size;
3857 return this;
3858 }
3859
3860 // Add methods to `Stack`.
3861 Stack.prototype.clear = stackClear;
3862 Stack.prototype['delete'] = stackDelete;
3863 Stack.prototype.get = stackGet;
3864 Stack.prototype.has = stackHas;
3865 Stack.prototype.set = stackSet;
3866
3867 /*------------------------------------------------------------------------*/
3868
3869 /**
3870 * Creates an array of the enumerable property names of the array-like `value`.
3871 *
3872 * @private
3873 * @param {*} value The value to query.
3874 * @param {boolean} inherited Specify returning inherited property names.
3875 * @returns {Array} Returns the array of property names.
3876 */
3877 function arrayLikeKeys(value, inherited) {
3878 var isArr = isArray(value),
3879 isArg = !isArr && isArguments(value),
3880 isBuff = !isArr && !isArg && isBuffer(value),
3881 isType = !isArr && !isArg && !isBuff && isTypedArray(value),
3882 skipIndexes = isArr || isArg || isBuff || isType,
3883 result = skipIndexes ? baseTimes(value.length, String) : [],
3884 length = result.length;
3885
3886 for (var key in value) {
3887 if ((inherited || hasOwnProperty.call(value, key)) &&
3888 !(skipIndexes && (
3889 // Safari 9 has enumerable `arguments.length` in strict mode.
3890 key == 'length' ||
3891 // Node.js 0.10 has enumerable non-index properties on buffers.
3892 (isBuff && (key == 'offset' || key == 'parent')) ||
3893 // PhantomJS 2 has enumerable non-index properties on typed arrays.
3894 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
3895 // Skip index properties.
3896 isIndex(key, length)
3897 ))) {
3898 result.push(key);
3899 }
3900 }
3901 return result;
3902 }
3903
3904 /**
3905 * A specialized version of `_.sample` for arrays.
3906 *
3907 * @private
3908 * @param {Array} array The array to sample.
3909 * @returns {*} Returns the random element.
3910 */
3911 function arraySample(array) {
3912 var length = array.length;
3913 return length ? array[baseRandom(0, length - 1)] : undefined;
3914 }
3915
3916 /**
3917 * A specialized version of `_.sampleSize` for arrays.
3918 *
3919 * @private
3920 * @param {Array} array The array to sample.
3921 * @param {number} n The number of elements to sample.
3922 * @returns {Array} Returns the random elements.
3923 */
3924 function arraySampleSize(array, n) {
3925 return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
3926 }
3927
3928 /**
3929 * A specialized version of `_.shuffle` for arrays.
3930 *
3931 * @private
3932 * @param {Array} array The array to shuffle.
3933 * @returns {Array} Returns the new shuffled array.
3934 */
3935 function arrayShuffle(array) {
3936 return shuffleSelf(copyArray(array));
3937 }
3938
3939 /**
3940 * This function is like `assignValue` except that it doesn't assign
3941 * `undefined` values.
3942 *
3943 * @private
3944 * @param {Object} object The object to modify.
3945 * @param {string} key The key of the property to assign.
3946 * @param {*} value The value to assign.
3947 */
3948 function assignMergeValue(object, key, value) {
3949 if ((value !== undefined && !eq(object[key], value)) ||
3950 (value === undefined && !(key in object))) {
3951 baseAssignValue(object, key, value);
3952 }
3953 }
3954
3955 /**
3956 * Assigns `value` to `key` of `object` if the existing value is not equivalent
3957 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
3958 * for equality comparisons.
3959 *
3960 * @private
3961 * @param {Object} object The object to modify.
3962 * @param {string} key The key of the property to assign.
3963 * @param {*} value The value to assign.
3964 */
3965 function assignValue(object, key, value) {
3966 var objValue = object[key];
3967 if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
3968 (value === undefined && !(key in object))) {
3969 baseAssignValue(object, key, value);
3970 }
3971 }
3972
3973 /**
3974 * Gets the index at which the `key` is found in `array` of key-value pairs.
3975 *
3976 * @private
3977 * @param {Array} array The array to inspect.
3978 * @param {*} key The key to search for.
3979 * @returns {number} Returns the index of the matched value, else `-1`.
3980 */
3981 function assocIndexOf(array, key) {
3982 var length = array.length;
3983 while (length--) {
3984 if (eq(array[length][0], key)) {
3985 return length;
3986 }
3987 }
3988 return -1;
3989 }
3990
3991 /**
3992 * Aggregates elements of `collection` on `accumulator` with keys transformed
3993 * by `iteratee` and values set by `setter`.
3994 *
3995 * @private
3996 * @param {Array|Object} collection The collection to iterate over.
3997 * @param {Function} setter The function to set `accumulator` values.
3998 * @param {Function} iteratee The iteratee to transform keys.
3999 * @param {Object} accumulator The initial aggregated object.
4000 * @returns {Function} Returns `accumulator`.
4001 */
4002 function baseAggregator(collection, setter, iteratee, accumulator) {
4003 baseEach(collection, function(value, key, collection) {
4004 setter(accumulator, value, iteratee(value), collection);
4005 });
4006 return accumulator;
4007 }
4008
4009 /**
4010 * The base implementation of `_.assign` without support for multiple sources
4011 * or `customizer` functions.
4012 *
4013 * @private
4014 * @param {Object} object The destination object.
4015 * @param {Object} source The source object.
4016 * @returns {Object} Returns `object`.
4017 */
4018 function baseAssign(object, source) {
4019 return object && copyObject(source, keys(source), object);
4020 }
4021
4022 /**
4023 * The base implementation of `_.assignIn` without support for multiple sources
4024 * or `customizer` functions.
4025 *
4026 * @private
4027 * @param {Object} object The destination object.
4028 * @param {Object} source The source object.
4029 * @returns {Object} Returns `object`.
4030 */
4031 function baseAssignIn(object, source) {
4032 return object && copyObject(source, keysIn(source), object);
4033 }
4034
4035 /**
4036 * The base implementation of `assignValue` and `assignMergeValue` without
4037 * value checks.
4038 *
4039 * @private
4040 * @param {Object} object The object to modify.
4041 * @param {string} key The key of the property to assign.
4042 * @param {*} value The value to assign.
4043 */
4044 function baseAssignValue(object, key, value) {
4045 if (key == '__proto__' && defineProperty) {
4046 defineProperty(object, key, {
4047 'configurable': true,
4048 'enumerable': true,
4049 'value': value,
4050 'writable': true
4051 });
4052 } else {
4053 object[key] = value;
4054 }
4055 }
4056
4057 /**
4058 * The base implementation of `_.at` without support for individual paths.
4059 *
4060 * @private
4061 * @param {Object} object The object to iterate over.
4062 * @param {string[]} paths The property paths to pick.
4063 * @returns {Array} Returns the picked elements.
4064 */
4065 function baseAt(object, paths) {
4066 var index = -1,
4067 length = paths.length,
4068 result = Array(length),
4069 skip = object == null;
4070
4071 while (++index < length) {
4072 result[index] = skip ? undefined : get(object, paths[index]);
4073 }
4074 return result;
4075 }
4076
4077 /**
4078 * The base implementation of `_.clamp` which doesn't coerce arguments.
4079 *
4080 * @private
4081 * @param {number} number The number to clamp.
4082 * @param {number} [lower] The lower bound.
4083 * @param {number} upper The upper bound.
4084 * @returns {number} Returns the clamped number.
4085 */
4086 function baseClamp(number, lower, upper) {
4087 if (number === number) {
4088 if (upper !== undefined) {
4089 number = number <= upper ? number : upper;
4090 }
4091 if (lower !== undefined) {
4092 number = number >= lower ? number : lower;
4093 }
4094 }
4095 return number;
4096 }
4097
4098 /**
4099 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
4100 * traversed objects.
4101 *
4102 * @private
4103 * @param {*} value The value to clone.
4104 * @param {boolean} bitmask The bitmask flags.
4105 * 1 - Deep clone
4106 * 2 - Flatten inherited properties
4107 * 4 - Clone symbols
4108 * @param {Function} [customizer] The function to customize cloning.
4109 * @param {string} [key] The key of `value`.
4110 * @param {Object} [object] The parent object of `value`.
4111 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
4112 * @returns {*} Returns the cloned value.
4113 */
4114 function baseClone(value, bitmask, customizer, key, object, stack) {
4115 var result,
4116 isDeep = bitmask & CLONE_DEEP_FLAG,
4117 isFlat = bitmask & CLONE_FLAT_FLAG,
4118 isFull = bitmask & CLONE_SYMBOLS_FLAG;
4119
4120 if (customizer) {
4121 result = object ? customizer(value, key, object, stack) : customizer(value);
4122 }
4123 if (result !== undefined) {
4124 return result;
4125 }
4126 if (!isObject(value)) {
4127 return value;
4128 }
4129 var isArr = isArray(value);
4130 if (isArr) {
4131 result = initCloneArray(value);
4132 if (!isDeep) {
4133 return copyArray(value, result);
4134 }
4135 } else {
4136 var tag = getTag(value),
4137 isFunc = tag == funcTag || tag == genTag;
4138
4139 if (isBuffer(value)) {
4140 return cloneBuffer(value, isDeep);
4141 }
4142 if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
4143 result = (isFlat || isFunc) ? {} : initCloneObject(value);
4144 if (!isDeep) {
4145 return isFlat
4146 ? copySymbolsIn(value, baseAssignIn(result, value))
4147 : copySymbols(value, baseAssign(result, value));
4148 }
4149 } else {
4150 if (!cloneableTags[tag]) {
4151 return object ? value : {};
4152 }
4153 result = initCloneByTag(value, tag, isDeep);
4154 }
4155 }
4156 // Check for circular references and return its corresponding clone.
4157 stack || (stack = new Stack);
4158 var stacked = stack.get(value);
4159 if (stacked) {
4160 return stacked;
4161 }
4162 stack.set(value, result);
4163
4164 if (isSet(value)) {
4165 value.forEach(function(subValue) {
4166 result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
4167 });
4168 } else if (isMap(value)) {
4169 value.forEach(function(subValue, key) {
4170 result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
4171 });
4172 }
4173
4174 var keysFunc = isFull
4175 ? (isFlat ? getAllKeysIn : getAllKeys)
4176 : (isFlat ? keysIn : keys);
4177
4178 var props = isArr ? undefined : keysFunc(value);
4179 arrayEach(props || value, function(subValue, key) {
4180 if (props) {
4181 key = subValue;
4182 subValue = value[key];
4183 }
4184 // Recursively populate clone (susceptible to call stack limits).
4185 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
4186 });
4187 return result;
4188 }
4189
4190 /**
4191 * The base implementation of `_.conforms` which doesn't clone `source`.
4192 *
4193 * @private
4194 * @param {Object} source The object of property predicates to conform to.
4195 * @returns {Function} Returns the new spec function.
4196 */
4197 function baseConforms(source) {
4198 var props = keys(source);
4199 return function(object) {
4200 return baseConformsTo(object, source, props);
4201 };
4202 }
4203
4204 /**
4205 * The base implementation of `_.conformsTo` which accepts `props` to check.
4206 *
4207 * @private
4208 * @param {Object} object The object to inspect.
4209 * @param {Object} source The object of property predicates to conform to.
4210 * @returns {boolean} Returns `true` if `object` conforms, else `false`.
4211 */
4212 function baseConformsTo(object, source, props) {
4213 var length = props.length;
4214 if (object == null) {
4215 return !length;
4216 }
4217 object = Object(object);
4218 while (length--) {
4219 var key = props[length],
4220 predicate = source[key],
4221 value = object[key];
4222
4223 if ((value === undefined && !(key in object)) || !predicate(value)) {
4224 return false;
4225 }
4226 }
4227 return true;
4228 }
4229
4230 /**
4231 * The base implementation of `_.delay` and `_.defer` which accepts `args`
4232 * to provide to `func`.
4233 *
4234 * @private
4235 * @param {Function} func The function to delay.
4236 * @param {number} wait The number of milliseconds to delay invocation.
4237 * @param {Array} args The arguments to provide to `func`.
4238 * @returns {number|Object} Returns the timer id or timeout object.
4239 */
4240 function baseDelay(func, wait, args) {
4241 if (typeof func != 'function') {
4242 throw new TypeError(FUNC_ERROR_TEXT);
4243 }
4244 return setTimeout(function() { func.apply(undefined, args); }, wait);
4245 }
4246
4247 /**
4248 * The base implementation of methods like `_.difference` without support
4249 * for excluding multiple arrays or iteratee shorthands.
4250 *
4251 * @private
4252 * @param {Array} array The array to inspect.
4253 * @param {Array} values The values to exclude.
4254 * @param {Function} [iteratee] The iteratee invoked per element.
4255 * @param {Function} [comparator] The comparator invoked per element.
4256 * @returns {Array} Returns the new array of filtered values.
4257 */
4258 function baseDifference(array, values, iteratee, comparator) {
4259 var index = -1,
4260 includes = arrayIncludes,
4261 isCommon = true,
4262 length = array.length,
4263 result = [],
4264 valuesLength = values.length;
4265
4266 if (!length) {
4267 return result;
4268 }
4269 if (iteratee) {
4270 values = arrayMap(values, baseUnary(iteratee));
4271 }
4272 if (comparator) {
4273 includes = arrayIncludesWith;
4274 isCommon = false;
4275 }
4276 else if (values.length >= LARGE_ARRAY_SIZE) {
4277 includes = cacheHas;
4278 isCommon = false;
4279 values = new SetCache(values);
4280 }
4281 outer:
4282 while (++index < length) {
4283 var value = array[index],
4284 computed = iteratee == null ? value : iteratee(value);
4285
4286 value = (comparator || value !== 0) ? value : 0;
4287 if (isCommon && computed === computed) {
4288 var valuesIndex = valuesLength;
4289 while (valuesIndex--) {
4290 if (values[valuesIndex] === computed) {
4291 continue outer;
4292 }
4293 }
4294 result.push(value);
4295 }
4296 else if (!includes(values, computed, comparator)) {
4297 result.push(value);
4298 }
4299 }
4300 return result;
4301 }
4302
4303 /**
4304 * The base implementation of `_.forEach` without support for iteratee shorthands.
4305 *
4306 * @private
4307 * @param {Array|Object} collection The collection to iterate over.
4308 * @param {Function} iteratee The function invoked per iteration.
4309 * @returns {Array|Object} Returns `collection`.
4310 */
4311 var baseEach = createBaseEach(baseForOwn);
4312
4313 /**
4314 * The base implementation of `_.forEachRight` without support for iteratee shorthands.
4315 *
4316 * @private
4317 * @param {Array|Object} collection The collection to iterate over.
4318 * @param {Function} iteratee The function invoked per iteration.
4319 * @returns {Array|Object} Returns `collection`.
4320 */
4321 var baseEachRight = createBaseEach(baseForOwnRight, true);
4322
4323 /**
4324 * The base implementation of `_.every` without support for iteratee shorthands.
4325 *
4326 * @private
4327 * @param {Array|Object} collection The collection to iterate over.
4328 * @param {Function} predicate The function invoked per iteration.
4329 * @returns {boolean} Returns `true` if all elements pass the predicate check,
4330 * else `false`
4331 */
4332 function baseEvery(collection, predicate) {
4333 var result = true;
4334 baseEach(collection, function(value, index, collection) {
4335 result = !!predicate(value, index, collection);
4336 return result;
4337 });
4338 return result;
4339 }
4340
4341 /**
4342 * The base implementation of methods like `_.max` and `_.min` which accepts a
4343 * `comparator` to determine the extremum value.
4344 *
4345 * @private
4346 * @param {Array} array The array to iterate over.
4347 * @param {Function} iteratee The iteratee invoked per iteration.
4348 * @param {Function} comparator The comparator used to compare values.
4349 * @returns {*} Returns the extremum value.
4350 */
4351 function baseExtremum(array, iteratee, comparator) {
4352 var index = -1,
4353 length = array.length;
4354
4355 while (++index < length) {
4356 var value = array[index],
4357 current = iteratee(value);
4358
4359 if (current != null && (computed === undefined
4360 ? (current === current && !isSymbol(current))
4361 : comparator(current, computed)
4362 )) {
4363 var computed = current,
4364 result = value;
4365 }
4366 }
4367 return result;
4368 }
4369
4370 /**
4371 * The base implementation of `_.fill` without an iteratee call guard.
4372 *
4373 * @private
4374 * @param {Array} array The array to fill.
4375 * @param {*} value The value to fill `array` with.
4376 * @param {number} [start=0] The start position.
4377 * @param {number} [end=array.length] The end position.
4378 * @returns {Array} Returns `array`.
4379 */
4380 function baseFill(array, value, start, end) {
4381 var length = array.length;
4382
4383 start = toInteger(start);
4384 if (start < 0) {
4385 start = -start > length ? 0 : (length + start);
4386 }
4387 end = (end === undefined || end > length) ? length : toInteger(end);
4388 if (end < 0) {
4389 end += length;
4390 }
4391 end = start > end ? 0 : toLength(end);
4392 while (start < end) {
4393 array[start++] = value;
4394 }
4395 return array;
4396 }
4397
4398 /**
4399 * The base implementation of `_.filter` without support for iteratee shorthands.
4400 *
4401 * @private
4402 * @param {Array|Object} collection The collection to iterate over.
4403 * @param {Function} predicate The function invoked per iteration.
4404 * @returns {Array} Returns the new filtered array.
4405 */
4406 function baseFilter(collection, predicate) {
4407 var result = [];
4408 baseEach(collection, function(value, index, collection) {
4409 if (predicate(value, index, collection)) {
4410 result.push(value);
4411 }
4412 });
4413 return result;
4414 }
4415
4416 /**
4417 * The base implementation of `_.flatten` with support for restricting flattening.
4418 *
4419 * @private
4420 * @param {Array} array The array to flatten.
4421 * @param {number} depth The maximum recursion depth.
4422 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
4423 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
4424 * @param {Array} [result=[]] The initial result value.
4425 * @returns {Array} Returns the new flattened array.
4426 */
4427 function baseFlatten(array, depth, predicate, isStrict, result) {
4428 var index = -1,
4429 length = array.length;
4430
4431 predicate || (predicate = isFlattenable);
4432 result || (result = []);
4433
4434 while (++index < length) {
4435 var value = array[index];
4436 if (depth > 0 && predicate(value)) {
4437 if (depth > 1) {
4438 // Recursively flatten arrays (susceptible to call stack limits).
4439 baseFlatten(value, depth - 1, predicate, isStrict, result);
4440 } else {
4441 arrayPush(result, value);
4442 }
4443 } else if (!isStrict) {
4444 result[result.length] = value;
4445 }
4446 }
4447 return result;
4448 }
4449
4450 /**
4451 * The base implementation of `baseForOwn` which iterates over `object`
4452 * properties returned by `keysFunc` and invokes `iteratee` for each property.
4453 * Iteratee functions may exit iteration early by explicitly returning `false`.
4454 *
4455 * @private
4456 * @param {Object} object The object to iterate over.
4457 * @param {Function} iteratee The function invoked per iteration.
4458 * @param {Function} keysFunc The function to get the keys of `object`.
4459 * @returns {Object} Returns `object`.
4460 */
4461 var baseFor = createBaseFor();
4462
4463 /**
4464 * This function is like `baseFor` except that it iterates over properties
4465 * in the opposite order.
4466 *
4467 * @private
4468 * @param {Object} object The object to iterate over.
4469 * @param {Function} iteratee The function invoked per iteration.
4470 * @param {Function} keysFunc The function to get the keys of `object`.
4471 * @returns {Object} Returns `object`.
4472 */
4473 var baseForRight = createBaseFor(true);
4474
4475 /**
4476 * The base implementation of `_.forOwn` without support for iteratee shorthands.
4477 *
4478 * @private
4479 * @param {Object} object The object to iterate over.
4480 * @param {Function} iteratee The function invoked per iteration.
4481 * @returns {Object} Returns `object`.
4482 */
4483 function baseForOwn(object, iteratee) {
4484 return object && baseFor(object, iteratee, keys);
4485 }
4486
4487 /**
4488 * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
4489 *
4490 * @private
4491 * @param {Object} object The object to iterate over.
4492 * @param {Function} iteratee The function invoked per iteration.
4493 * @returns {Object} Returns `object`.
4494 */
4495 function baseForOwnRight(object, iteratee) {
4496 return object && baseForRight(object, iteratee, keys);
4497 }
4498
4499 /**
4500 * The base implementation of `_.functions` which creates an array of
4501 * `object` function property names filtered from `props`.
4502 *
4503 * @private
4504 * @param {Object} object The object to inspect.
4505 * @param {Array} props The property names to filter.
4506 * @returns {Array} Returns the function names.
4507 */
4508 function baseFunctions(object, props) {
4509 return arrayFilter(props, function(key) {
4510 return isFunction(object[key]);
4511 });
4512 }
4513
4514 /**
4515 * The base implementation of `_.get` without support for default values.
4516 *
4517 * @private
4518 * @param {Object} object The object to query.
4519 * @param {Array|string} path The path of the property to get.
4520 * @returns {*} Returns the resolved value.
4521 */
4522 function baseGet(object, path) {
4523 path = castPath(path, object);
4524
4525 var index = 0,
4526 length = path.length;
4527
4528 while (object != null && index < length) {
4529 object = object[toKey(path[index++])];
4530 }
4531 return (index && index == length) ? object : undefined;
4532 }
4533
4534 /**
4535 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
4536 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
4537 * symbols of `object`.
4538 *
4539 * @private
4540 * @param {Object} object The object to query.
4541 * @param {Function} keysFunc The function to get the keys of `object`.
4542 * @param {Function} symbolsFunc The function to get the symbols of `object`.
4543 * @returns {Array} Returns the array of property names and symbols.
4544 */
4545 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
4546 var result = keysFunc(object);
4547 return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
4548 }
4549
4550 /**
4551 * The base implementation of `getTag` without fallbacks for buggy environments.
4552 *
4553 * @private
4554 * @param {*} value The value to query.
4555 * @returns {string} Returns the `toStringTag`.
4556 */
4557 function baseGetTag(value) {
4558 if (value == null) {
4559 return value === undefined ? undefinedTag : nullTag;
4560 }
4561 return (symToStringTag && symToStringTag in Object(value))
4562 ? getRawTag(value)
4563 : objectToString(value);
4564 }
4565
4566 /**
4567 * The base implementation of `_.gt` which doesn't coerce arguments.
4568 *
4569 * @private
4570 * @param {*} value The value to compare.
4571 * @param {*} other The other value to compare.
4572 * @returns {boolean} Returns `true` if `value` is greater than `other`,
4573 * else `false`.
4574 */
4575 function baseGt(value, other) {
4576 return value > other;
4577 }
4578
4579 /**
4580 * The base implementation of `_.has` without support for deep paths.
4581 *
4582 * @private
4583 * @param {Object} [object] The object to query.
4584 * @param {Array|string} key The key to check.
4585 * @returns {boolean} Returns `true` if `key` exists, else `false`.
4586 */
4587 function baseHas(object, key) {
4588 return object != null && hasOwnProperty.call(object, key);
4589 }
4590
4591 /**
4592 * The base implementation of `_.hasIn` without support for deep paths.
4593 *
4594 * @private
4595 * @param {Object} [object] The object to query.
4596 * @param {Array|string} key The key to check.
4597 * @returns {boolean} Returns `true` if `key` exists, else `false`.
4598 */
4599 function baseHasIn(object, key) {
4600 return object != null && key in Object(object);
4601 }
4602
4603 /**
4604 * The base implementation of `_.inRange` which doesn't coerce arguments.
4605 *
4606 * @private
4607 * @param {number} number The number to check.
4608 * @param {number} start The start of the range.
4609 * @param {number} end The end of the range.
4610 * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
4611 */
4612 function baseInRange(number, start, end) {
4613 return number >= nativeMin(start, end) && number < nativeMax(start, end);
4614 }
4615
4616 /**
4617 * The base implementation of methods like `_.intersection`, without support
4618 * for iteratee shorthands, that accepts an array of arrays to inspect.
4619 *
4620 * @private
4621 * @param {Array} arrays The arrays to inspect.
4622 * @param {Function} [iteratee] The iteratee invoked per element.
4623 * @param {Function} [comparator] The comparator invoked per element.
4624 * @returns {Array} Returns the new array of shared values.
4625 */
4626 function baseIntersection(arrays, iteratee, comparator) {
4627 var includes = comparator ? arrayIncludesWith : arrayIncludes,
4628 length = arrays[0].length,
4629 othLength = arrays.length,
4630 othIndex = othLength,
4631 caches = Array(othLength),
4632 maxLength = Infinity,
4633 result = [];
4634
4635 while (othIndex--) {
4636 var array = arrays[othIndex];
4637 if (othIndex && iteratee) {
4638 array = arrayMap(array, baseUnary(iteratee));
4639 }
4640 maxLength = nativeMin(array.length, maxLength);
4641 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
4642 ? new SetCache(othIndex && array)
4643 : undefined;
4644 }
4645 array = arrays[0];
4646
4647 var index = -1,
4648 seen = caches[0];
4649
4650 outer:
4651 while (++index < length && result.length < maxLength) {
4652 var value = array[index],
4653 computed = iteratee ? iteratee(value) : value;
4654
4655 value = (comparator || value !== 0) ? value : 0;
4656 if (!(seen
4657 ? cacheHas(seen, computed)
4658 : includes(result, computed, comparator)
4659 )) {
4660 othIndex = othLength;
4661 while (--othIndex) {
4662 var cache = caches[othIndex];
4663 if (!(cache
4664 ? cacheHas(cache, computed)
4665 : includes(arrays[othIndex], computed, comparator))
4666 ) {
4667 continue outer;
4668 }
4669 }
4670 if (seen) {
4671 seen.push(computed);
4672 }
4673 result.push(value);
4674 }
4675 }
4676 return result;
4677 }
4678
4679 /**
4680 * The base implementation of `_.invert` and `_.invertBy` which inverts
4681 * `object` with values transformed by `iteratee` and set by `setter`.
4682 *
4683 * @private
4684 * @param {Object} object The object to iterate over.
4685 * @param {Function} setter The function to set `accumulator` values.
4686 * @param {Function} iteratee The iteratee to transform values.
4687 * @param {Object} accumulator The initial inverted object.
4688 * @returns {Function} Returns `accumulator`.
4689 */
4690 function baseInverter(object, setter, iteratee, accumulator) {
4691 baseForOwn(object, function(value, key, object) {
4692 setter(accumulator, iteratee(value), key, object);
4693 });
4694 return accumulator;
4695 }
4696
4697 /**
4698 * The base implementation of `_.invoke` without support for individual
4699 * method arguments.
4700 *
4701 * @private
4702 * @param {Object} object The object to query.
4703 * @param {Array|string} path The path of the method to invoke.
4704 * @param {Array} args The arguments to invoke the method with.
4705 * @returns {*} Returns the result of the invoked method.
4706 */
4707 function baseInvoke(object, path, args) {
4708 path = castPath(path, object);
4709 object = parent(object, path);
4710 var func = object == null ? object : object[toKey(last(path))];
4711 return func == null ? undefined : apply(func, object, args);
4712 }
4713
4714 /**
4715 * The base implementation of `_.isArguments`.
4716 *
4717 * @private
4718 * @param {*} value The value to check.
4719 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
4720 */
4721 function baseIsArguments(value) {
4722 return isObjectLike(value) && baseGetTag(value) == argsTag;
4723 }
4724
4725 /**
4726 * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
4727 *
4728 * @private
4729 * @param {*} value The value to check.
4730 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
4731 */
4732 function baseIsArrayBuffer(value) {
4733 return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
4734 }
4735
4736 /**
4737 * The base implementation of `_.isDate` without Node.js optimizations.
4738 *
4739 * @private
4740 * @param {*} value The value to check.
4741 * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
4742 */
4743 function baseIsDate(value) {
4744 return isObjectLike(value) && baseGetTag(value) == dateTag;
4745 }
4746
4747 /**
4748 * The base implementation of `_.isEqual` which supports partial comparisons
4749 * and tracks traversed objects.
4750 *
4751 * @private
4752 * @param {*} value The value to compare.
4753 * @param {*} other The other value to compare.
4754 * @param {boolean} bitmask The bitmask flags.
4755 * 1 - Unordered comparison
4756 * 2 - Partial comparison
4757 * @param {Function} [customizer] The function to customize comparisons.
4758 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
4759 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
4760 */
4761 function baseIsEqual(value, other, bitmask, customizer, stack) {
4762 if (value === other) {
4763 return true;
4764 }
4765 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
4766 return value !== value && other !== other;
4767 }
4768 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
4769 }
4770
4771 /**
4772 * A specialized version of `baseIsEqual` for arrays and objects which performs
4773 * deep comparisons and tracks traversed objects enabling objects with circular
4774 * references to be compared.
4775 *
4776 * @private
4777 * @param {Object} object The object to compare.
4778 * @param {Object} other The other object to compare.
4779 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
4780 * @param {Function} customizer The function to customize comparisons.
4781 * @param {Function} equalFunc The function to determine equivalents of values.
4782 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
4783 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
4784 */
4785 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
4786 var objIsArr = isArray(object),
4787 othIsArr = isArray(other),
4788 objTag = objIsArr ? arrayTag : getTag(object),
4789 othTag = othIsArr ? arrayTag : getTag(other);
4790
4791 objTag = objTag == argsTag ? objectTag : objTag;
4792 othTag = othTag == argsTag ? objectTag : othTag;
4793
4794 var objIsObj = objTag == objectTag,
4795 othIsObj = othTag == objectTag,
4796 isSameTag = objTag == othTag;
4797
4798 if (isSameTag && isBuffer(object)) {
4799 if (!isBuffer(other)) {
4800 return false;
4801 }
4802 objIsArr = true;
4803 objIsObj = false;
4804 }
4805 if (isSameTag && !objIsObj) {
4806 stack || (stack = new Stack);
4807 return (objIsArr || isTypedArray(object))
4808 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
4809 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
4810 }
4811 if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
4812 var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
4813 othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
4814
4815 if (objIsWrapped || othIsWrapped) {
4816 var objUnwrapped = objIsWrapped ? object.value() : object,
4817 othUnwrapped = othIsWrapped ? other.value() : other;
4818
4819 stack || (stack = new Stack);
4820 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
4821 }
4822 }
4823 if (!isSameTag) {
4824 return false;
4825 }
4826 stack || (stack = new Stack);
4827 return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
4828 }
4829
4830 /**
4831 * The base implementation of `_.isMap` without Node.js optimizations.
4832 *
4833 * @private
4834 * @param {*} value The value to check.
4835 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
4836 */
4837 function baseIsMap(value) {
4838 return isObjectLike(value) && getTag(value) == mapTag;
4839 }
4840
4841 /**
4842 * The base implementation of `_.isMatch` without support for iteratee shorthands.
4843 *
4844 * @private
4845 * @param {Object} object The object to inspect.
4846 * @param {Object} source The object of property values to match.
4847 * @param {Array} matchData The property names, values, and compare flags to match.
4848 * @param {Function} [customizer] The function to customize comparisons.
4849 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
4850 */
4851 function baseIsMatch(object, source, matchData, customizer) {
4852 var index = matchData.length,
4853 length = index,
4854 noCustomizer = !customizer;
4855
4856 if (object == null) {
4857 return !length;
4858 }
4859 object = Object(object);
4860 while (index--) {
4861 var data = matchData[index];
4862 if ((noCustomizer && data[2])
4863 ? data[1] !== object[data[0]]
4864 : !(data[0] in object)
4865 ) {
4866 return false;
4867 }
4868 }
4869 while (++index < length) {
4870 data = matchData[index];
4871 var key = data[0],
4872 objValue = object[key],
4873 srcValue = data[1];
4874
4875 if (noCustomizer && data[2]) {
4876 if (objValue === undefined && !(key in object)) {
4877 return false;
4878 }
4879 } else {
4880 var stack = new Stack;
4881 if (customizer) {
4882 var result = customizer(objValue, srcValue, key, object, source, stack);
4883 }
4884 if (!(result === undefined
4885 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
4886 : result
4887 )) {
4888 return false;
4889 }
4890 }
4891 }
4892 return true;
4893 }
4894
4895 /**
4896 * The base implementation of `_.isNative` without bad shim checks.
4897 *
4898 * @private
4899 * @param {*} value The value to check.
4900 * @returns {boolean} Returns `true` if `value` is a native function,
4901 * else `false`.
4902 */
4903 function baseIsNative(value) {
4904 if (!isObject(value) || isMasked(value)) {
4905 return false;
4906 }
4907 var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
4908 return pattern.test(toSource(value));
4909 }
4910
4911 /**
4912 * The base implementation of `_.isRegExp` without Node.js optimizations.
4913 *
4914 * @private
4915 * @param {*} value The value to check.
4916 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
4917 */
4918 function baseIsRegExp(value) {
4919 return isObjectLike(value) && baseGetTag(value) == regexpTag;
4920 }
4921
4922 /**
4923 * The base implementation of `_.isSet` without Node.js optimizations.
4924 *
4925 * @private
4926 * @param {*} value The value to check.
4927 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
4928 */
4929 function baseIsSet(value) {
4930 return isObjectLike(value) && getTag(value) == setTag;
4931 }
4932
4933 /**
4934 * The base implementation of `_.isTypedArray` without Node.js optimizations.
4935 *
4936 * @private
4937 * @param {*} value The value to check.
4938 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
4939 */
4940 function baseIsTypedArray(value) {
4941 return isObjectLike(value) &&
4942 isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
4943 }
4944
4945 /**
4946 * The base implementation of `_.iteratee`.
4947 *
4948 * @private
4949 * @param {*} [value=_.identity] The value to convert to an iteratee.
4950 * @returns {Function} Returns the iteratee.
4951 */
4952 function baseIteratee(value) {
4953 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
4954 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
4955 if (typeof value == 'function') {
4956 return value;
4957 }
4958 if (value == null) {
4959 return identity;
4960 }
4961 if (typeof value == 'object') {
4962 return isArray(value)
4963 ? baseMatchesProperty(value[0], value[1])
4964 : baseMatches(value);
4965 }
4966 return property(value);
4967 }
4968
4969 /**
4970 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
4971 *
4972 * @private
4973 * @param {Object} object The object to query.
4974 * @returns {Array} Returns the array of property names.
4975 */
4976 function baseKeys(object) {
4977 if (!isPrototype(object)) {
4978 return nativeKeys(object);
4979 }
4980 var result = [];
4981 for (var key in Object(object)) {
4982 if (hasOwnProperty.call(object, key) && key != 'constructor') {
4983 result.push(key);
4984 }
4985 }
4986 return result;
4987 }
4988
4989 /**
4990 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
4991 *
4992 * @private
4993 * @param {Object} object The object to query.
4994 * @returns {Array} Returns the array of property names.
4995 */
4996 function baseKeysIn(object) {
4997 if (!isObject(object)) {
4998 return nativeKeysIn(object);
4999 }
5000 var isProto = isPrototype(object),
5001 result = [];
5002
5003 for (var key in object) {
5004 if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
5005 result.push(key);
5006 }
5007 }
5008 return result;
5009 }
5010
5011 /**
5012 * The base implementation of `_.lt` which doesn't coerce arguments.
5013 *
5014 * @private
5015 * @param {*} value The value to compare.
5016 * @param {*} other The other value to compare.
5017 * @returns {boolean} Returns `true` if `value` is less than `other`,
5018 * else `false`.
5019 */
5020 function baseLt(value, other) {
5021 return value < other;
5022 }
5023
5024 /**
5025 * The base implementation of `_.map` without support for iteratee shorthands.
5026 *
5027 * @private
5028 * @param {Array|Object} collection The collection to iterate over.
5029 * @param {Function} iteratee The function invoked per iteration.
5030 * @returns {Array} Returns the new mapped array.
5031 */
5032 function baseMap(collection, iteratee) {
5033 var index = -1,
5034 result = isArrayLike(collection) ? Array(collection.length) : [];
5035
5036 baseEach(collection, function(value, key, collection) {
5037 result[++index] = iteratee(value, key, collection);
5038 });
5039 return result;
5040 }
5041
5042 /**
5043 * The base implementation of `_.matches` which doesn't clone `source`.
5044 *
5045 * @private
5046 * @param {Object} source The object of property values to match.
5047 * @returns {Function} Returns the new spec function.
5048 */
5049 function baseMatches(source) {
5050 var matchData = getMatchData(source);
5051 if (matchData.length == 1 && matchData[0][2]) {
5052 return matchesStrictComparable(matchData[0][0], matchData[0][1]);
5053 }
5054 return function(object) {
5055 return object === source || baseIsMatch(object, source, matchData);
5056 };
5057 }
5058
5059 /**
5060 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
5061 *
5062 * @private
5063 * @param {string} path The path of the property to get.
5064 * @param {*} srcValue The value to match.
5065 * @returns {Function} Returns the new spec function.
5066 */
5067 function baseMatchesProperty(path, srcValue) {
5068 if (isKey(path) && isStrictComparable(srcValue)) {
5069 return matchesStrictComparable(toKey(path), srcValue);
5070 }
5071 return function(object) {
5072 var objValue = get(object, path);
5073 return (objValue === undefined && objValue === srcValue)
5074 ? hasIn(object, path)
5075 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
5076 };
5077 }
5078
5079 /**
5080 * The base implementation of `_.merge` without support for multiple sources.
5081 *
5082 * @private
5083 * @param {Object} object The destination object.
5084 * @param {Object} source The source object.
5085 * @param {number} srcIndex The index of `source`.
5086 * @param {Function} [customizer] The function to customize merged values.
5087 * @param {Object} [stack] Tracks traversed source values and their merged
5088 * counterparts.
5089 */
5090 function baseMerge(object, source, srcIndex, customizer, stack) {
5091 if (object === source) {
5092 return;
5093 }
5094 baseFor(source, function(srcValue, key) {
5095 stack || (stack = new Stack);
5096 if (isObject(srcValue)) {
5097 baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
5098 }
5099 else {
5100 var newValue = customizer
5101 ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
5102 : undefined;
5103
5104 if (newValue === undefined) {
5105 newValue = srcValue;
5106 }
5107 assignMergeValue(object, key, newValue);
5108 }
5109 }, keysIn);
5110 }
5111
5112 /**
5113 * A specialized version of `baseMerge` for arrays and objects which performs
5114 * deep merges and tracks traversed objects enabling objects with circular
5115 * references to be merged.
5116 *
5117 * @private
5118 * @param {Object} object The destination object.
5119 * @param {Object} source The source object.
5120 * @param {string} key The key of the value to merge.
5121 * @param {number} srcIndex The index of `source`.
5122 * @param {Function} mergeFunc The function to merge values.
5123 * @param {Function} [customizer] The function to customize assigned values.
5124 * @param {Object} [stack] Tracks traversed source values and their merged
5125 * counterparts.
5126 */
5127 function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
5128 var objValue = safeGet(object, key),
5129 srcValue = safeGet(source, key),
5130 stacked = stack.get(srcValue);
5131
5132 if (stacked) {
5133 assignMergeValue(object, key, stacked);
5134 return;
5135 }
5136 var newValue = customizer
5137 ? customizer(objValue, srcValue, (key + ''), object, source, stack)
5138 : undefined;
5139
5140 var isCommon = newValue === undefined;
5141
5142 if (isCommon) {
5143 var isArr = isArray(srcValue),
5144 isBuff = !isArr && isBuffer(srcValue),
5145 isTyped = !isArr && !isBuff && isTypedArray(srcValue);
5146
5147 newValue = srcValue;
5148 if (isArr || isBuff || isTyped) {
5149 if (isArray(objValue)) {
5150 newValue = objValue;
5151 }
5152 else if (isArrayLikeObject(objValue)) {
5153 newValue = copyArray(objValue);
5154 }
5155 else if (isBuff) {
5156 isCommon = false;
5157 newValue = cloneBuffer(srcValue, true);
5158 }
5159 else if (isTyped) {
5160 isCommon = false;
5161 newValue = cloneTypedArray(srcValue, true);
5162 }
5163 else {
5164 newValue = [];
5165 }
5166 }
5167 else if (isPlainObject(srcValue) || isArguments(srcValue)) {
5168 newValue = objValue;
5169 if (isArguments(objValue)) {
5170 newValue = toPlainObject(objValue);
5171 }
5172 else if (!isObject(objValue) || isFunction(objValue)) {
5173 newValue = initCloneObject(srcValue);
5174 }
5175 }
5176 else {
5177 isCommon = false;
5178 }
5179 }
5180 if (isCommon) {
5181 // Recursively merge objects and arrays (susceptible to call stack limits).
5182 stack.set(srcValue, newValue);
5183 mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
5184 stack['delete'](srcValue);
5185 }
5186 assignMergeValue(object, key, newValue);
5187 }
5188
5189 /**
5190 * The base implementation of `_.nth` which doesn't coerce arguments.
5191 *
5192 * @private
5193 * @param {Array} array The array to query.
5194 * @param {number} n The index of the element to return.
5195 * @returns {*} Returns the nth element of `array`.
5196 */
5197 function baseNth(array, n) {
5198 var length = array.length;
5199 if (!length) {
5200 return;
5201 }
5202 n += n < 0 ? length : 0;
5203 return isIndex(n, length) ? array[n] : undefined;
5204 }
5205
5206 /**
5207 * The base implementation of `_.orderBy` without param guards.
5208 *
5209 * @private
5210 * @param {Array|Object} collection The collection to iterate over.
5211 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
5212 * @param {string[]} orders The sort orders of `iteratees`.
5213 * @returns {Array} Returns the new sorted array.
5214 */
5215 function baseOrderBy(collection, iteratees, orders) {
5216 if (iteratees.length) {
5217 iteratees = arrayMap(iteratees, function(iteratee) {
5218 if (isArray(iteratee)) {
5219 return function(value) {
5220 return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
5221 }
5222 }
5223 return iteratee;
5224 });
5225 } else {
5226 iteratees = [identity];
5227 }
5228
5229 var index = -1;
5230 iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
5231
5232 var result = baseMap(collection, function(value, key, collection) {
5233 var criteria = arrayMap(iteratees, function(iteratee) {
5234 return iteratee(value);
5235 });
5236 return { 'criteria': criteria, 'index': ++index, 'value': value };
5237 });
5238
5239 return baseSortBy(result, function(object, other) {
5240 return compareMultiple(object, other, orders);
5241 });
5242 }
5243
5244 /**
5245 * The base implementation of `_.pick` without support for individual
5246 * property identifiers.
5247 *
5248 * @private
5249 * @param {Object} object The source object.
5250 * @param {string[]} paths The property paths to pick.
5251 * @returns {Object} Returns the new object.
5252 */
5253 function basePick(object, paths) {
5254 return basePickBy(object, paths, function(value, path) {
5255 return hasIn(object, path);
5256 });
5257 }
5258
5259 /**
5260 * The base implementation of `_.pickBy` without support for iteratee shorthands.
5261 *
5262 * @private
5263 * @param {Object} object The source object.
5264 * @param {string[]} paths The property paths to pick.
5265 * @param {Function} predicate The function invoked per property.
5266 * @returns {Object} Returns the new object.
5267 */
5268 function basePickBy(object, paths, predicate) {
5269 var index = -1,
5270 length = paths.length,
5271 result = {};
5272
5273 while (++index < length) {
5274 var path = paths[index],
5275 value = baseGet(object, path);
5276
5277 if (predicate(value, path)) {
5278 baseSet(result, castPath(path, object), value);
5279 }
5280 }
5281 return result;
5282 }
5283
5284 /**
5285 * A specialized version of `baseProperty` which supports deep paths.
5286 *
5287 * @private
5288 * @param {Array|string} path The path of the property to get.
5289 * @returns {Function} Returns the new accessor function.
5290 */
5291 function basePropertyDeep(path) {
5292 return function(object) {
5293 return baseGet(object, path);
5294 };
5295 }
5296
5297 /**
5298 * The base implementation of `_.pullAllBy` without support for iteratee
5299 * shorthands.
5300 *
5301 * @private
5302 * @param {Array} array The array to modify.
5303 * @param {Array} values The values to remove.
5304 * @param {Function} [iteratee] The iteratee invoked per element.
5305 * @param {Function} [comparator] The comparator invoked per element.
5306 * @returns {Array} Returns `array`.
5307 */
5308 function basePullAll(array, values, iteratee, comparator) {
5309 var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
5310 index = -1,
5311 length = values.length,
5312 seen = array;
5313
5314 if (array === values) {
5315 values = copyArray(values);
5316 }
5317 if (iteratee) {
5318 seen = arrayMap(array, baseUnary(iteratee));
5319 }
5320 while (++index < length) {
5321 var fromIndex = 0,
5322 value = values[index],
5323 computed = iteratee ? iteratee(value) : value;
5324
5325 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
5326 if (seen !== array) {
5327 splice.call(seen, fromIndex, 1);
5328 }
5329 splice.call(array, fromIndex, 1);
5330 }
5331 }
5332 return array;
5333 }
5334
5335 /**
5336 * The base implementation of `_.pullAt` without support for individual
5337 * indexes or capturing the removed elements.
5338 *
5339 * @private
5340 * @param {Array} array The array to modify.
5341 * @param {number[]} indexes The indexes of elements to remove.
5342 * @returns {Array} Returns `array`.
5343 */
5344 function basePullAt(array, indexes) {
5345 var length = array ? indexes.length : 0,
5346 lastIndex = length - 1;
5347
5348 while (length--) {
5349 var index = indexes[length];
5350 if (length == lastIndex || index !== previous) {
5351 var previous = index;
5352 if (isIndex(index)) {
5353 splice.call(array, index, 1);
5354 } else {
5355 baseUnset(array, index);
5356 }
5357 }
5358 }
5359 return array;
5360 }
5361
5362 /**
5363 * The base implementation of `_.random` without support for returning
5364 * floating-point numbers.
5365 *
5366 * @private
5367 * @param {number} lower The lower bound.
5368 * @param {number} upper The upper bound.
5369 * @returns {number} Returns the random number.
5370 */
5371 function baseRandom(lower, upper) {
5372 return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
5373 }
5374
5375 /**
5376 * The base implementation of `_.range` and `_.rangeRight` which doesn't
5377 * coerce arguments.
5378 *
5379 * @private
5380 * @param {number} start The start of the range.
5381 * @param {number} end The end of the range.
5382 * @param {number} step The value to increment or decrement by.
5383 * @param {boolean} [fromRight] Specify iterating from right to left.
5384 * @returns {Array} Returns the range of numbers.
5385 */
5386 function baseRange(start, end, step, fromRight) {
5387 var index = -1,
5388 length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
5389 result = Array(length);
5390
5391 while (length--) {
5392 result[fromRight ? length : ++index] = start;
5393 start += step;
5394 }
5395 return result;
5396 }
5397
5398 /**
5399 * The base implementation of `_.repeat` which doesn't coerce arguments.
5400 *
5401 * @private
5402 * @param {string} string The string to repeat.
5403 * @param {number} n The number of times to repeat the string.
5404 * @returns {string} Returns the repeated string.
5405 */
5406 function baseRepeat(string, n) {
5407 var result = '';
5408 if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
5409 return result;
5410 }
5411 // Leverage the exponentiation by squaring algorithm for a faster repeat.
5412 // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
5413 do {
5414 if (n % 2) {
5415 result += string;
5416 }
5417 n = nativeFloor(n / 2);
5418 if (n) {
5419 string += string;
5420 }
5421 } while (n);
5422
5423 return result;
5424 }
5425
5426 /**
5427 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
5428 *
5429 * @private
5430 * @param {Function} func The function to apply a rest parameter to.
5431 * @param {number} [start=func.length-1] The start position of the rest parameter.
5432 * @returns {Function} Returns the new function.
5433 */
5434 function baseRest(func, start) {
5435 return setToString(overRest(func, start, identity), func + '');
5436 }
5437
5438 /**
5439 * The base implementation of `_.sample`.
5440 *
5441 * @private
5442 * @param {Array|Object} collection The collection to sample.
5443 * @returns {*} Returns the random element.
5444 */
5445 function baseSample(collection) {
5446 return arraySample(values(collection));
5447 }
5448
5449 /**
5450 * The base implementation of `_.sampleSize` without param guards.
5451 *
5452 * @private
5453 * @param {Array|Object} collection The collection to sample.
5454 * @param {number} n The number of elements to sample.
5455 * @returns {Array} Returns the random elements.
5456 */
5457 function baseSampleSize(collection, n) {
5458 var array = values(collection);
5459 return shuffleSelf(array, baseClamp(n, 0, array.length));
5460 }
5461
5462 /**
5463 * The base implementation of `_.set`.
5464 *
5465 * @private
5466 * @param {Object} object The object to modify.
5467 * @param {Array|string} path The path of the property to set.
5468 * @param {*} value The value to set.
5469 * @param {Function} [customizer] The function to customize path creation.
5470 * @returns {Object} Returns `object`.
5471 */
5472 function baseSet(object, path, value, customizer) {
5473 if (!isObject(object)) {
5474 return object;
5475 }
5476 path = castPath(path, object);
5477
5478 var index = -1,
5479 length = path.length,
5480 lastIndex = length - 1,
5481 nested = object;
5482
5483 while (nested != null && ++index < length) {
5484 var key = toKey(path[index]),
5485 newValue = value;
5486
5487 if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
5488 return object;
5489 }
5490
5491 if (index != lastIndex) {
5492 var objValue = nested[key];
5493 newValue = customizer ? customizer(objValue, key, nested) : undefined;
5494 if (newValue === undefined) {
5495 newValue = isObject(objValue)
5496 ? objValue
5497 : (isIndex(path[index + 1]) ? [] : {});
5498 }
5499 }
5500 assignValue(nested, key, newValue);
5501 nested = nested[key];
5502 }
5503 return object;
5504 }
5505
5506 /**
5507 * The base implementation of `setData` without support for hot loop shorting.
5508 *
5509 * @private
5510 * @param {Function} func The function to associate metadata with.
5511 * @param {*} data The metadata.
5512 * @returns {Function} Returns `func`.
5513 */
5514 var baseSetData = !metaMap ? identity : function(func, data) {
5515 metaMap.set(func, data);
5516 return func;
5517 };
5518
5519 /**
5520 * The base implementation of `setToString` without support for hot loop shorting.
5521 *
5522 * @private
5523 * @param {Function} func The function to modify.
5524 * @param {Function} string The `toString` result.
5525 * @returns {Function} Returns `func`.
5526 */
5527 var baseSetToString = !defineProperty ? identity : function(func, string) {
5528 return defineProperty(func, 'toString', {
5529 'configurable': true,
5530 'enumerable': false,
5531 'value': constant(string),
5532 'writable': true
5533 });
5534 };
5535
5536 /**
5537 * The base implementation of `_.shuffle`.
5538 *
5539 * @private
5540 * @param {Array|Object} collection The collection to shuffle.
5541 * @returns {Array} Returns the new shuffled array.
5542 */
5543 function baseShuffle(collection) {
5544 return shuffleSelf(values(collection));
5545 }
5546
5547 /**
5548 * The base implementation of `_.slice` without an iteratee call guard.
5549 *
5550 * @private
5551 * @param {Array} array The array to slice.
5552 * @param {number} [start=0] The start position.
5553 * @param {number} [end=array.length] The end position.
5554 * @returns {Array} Returns the slice of `array`.
5555 */
5556 function baseSlice(array, start, end) {
5557 var index = -1,
5558 length = array.length;
5559
5560 if (start < 0) {
5561 start = -start > length ? 0 : (length + start);
5562 }
5563 end = end > length ? length : end;
5564 if (end < 0) {
5565 end += length;
5566 }
5567 length = start > end ? 0 : ((end - start) >>> 0);
5568 start >>>= 0;
5569
5570 var result = Array(length);
5571 while (++index < length) {
5572 result[index] = array[index + start];
5573 }
5574 return result;
5575 }
5576
5577 /**
5578 * The base implementation of `_.some` without support for iteratee shorthands.
5579 *
5580 * @private
5581 * @param {Array|Object} collection The collection to iterate over.
5582 * @param {Function} predicate The function invoked per iteration.
5583 * @returns {boolean} Returns `true` if any element passes the predicate check,
5584 * else `false`.
5585 */
5586 function baseSome(collection, predicate) {
5587 var result;
5588
5589 baseEach(collection, function(value, index, collection) {
5590 result = predicate(value, index, collection);
5591 return !result;
5592 });
5593 return !!result;
5594 }
5595
5596 /**
5597 * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
5598 * performs a binary search of `array` to determine the index at which `value`
5599 * should be inserted into `array` in order to maintain its sort order.
5600 *
5601 * @private
5602 * @param {Array} array The sorted array to inspect.
5603 * @param {*} value The value to evaluate.
5604 * @param {boolean} [retHighest] Specify returning the highest qualified index.
5605 * @returns {number} Returns the index at which `value` should be inserted
5606 * into `array`.
5607 */
5608 function baseSortedIndex(array, value, retHighest) {
5609 var low = 0,
5610 high = array == null ? low : array.length;
5611
5612 if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
5613 while (low < high) {
5614 var mid = (low + high) >>> 1,
5615 computed = array[mid];
5616
5617 if (computed !== null && !isSymbol(computed) &&
5618 (retHighest ? (computed <= value) : (computed < value))) {
5619 low = mid + 1;
5620 } else {
5621 high = mid;
5622 }
5623 }
5624 return high;
5625 }
5626 return baseSortedIndexBy(array, value, identity, retHighest);
5627 }
5628
5629 /**
5630 * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
5631 * which invokes `iteratee` for `value` and each element of `array` to compute
5632 * their sort ranking. The iteratee is invoked with one argument; (value).
5633 *
5634 * @private
5635 * @param {Array} array The sorted array to inspect.
5636 * @param {*} value The value to evaluate.
5637 * @param {Function} iteratee The iteratee invoked per element.
5638 * @param {boolean} [retHighest] Specify returning the highest qualified index.
5639 * @returns {number} Returns the index at which `value` should be inserted
5640 * into `array`.
5641 */
5642 function baseSortedIndexBy(array, value, iteratee, retHighest) {
5643 var low = 0,
5644 high = array == null ? 0 : array.length;
5645 if (high === 0) {
5646 return 0;
5647 }
5648
5649 value = iteratee(value);
5650 var valIsNaN = value !== value,
5651 valIsNull = value === null,
5652 valIsSymbol = isSymbol(value),
5653 valIsUndefined = value === undefined;
5654
5655 while (low < high) {
5656 var mid = nativeFloor((low + high) / 2),
5657 computed = iteratee(array[mid]),
5658 othIsDefined = computed !== undefined,
5659 othIsNull = computed === null,
5660 othIsReflexive = computed === computed,
5661 othIsSymbol = isSymbol(computed);
5662
5663 if (valIsNaN) {
5664 var setLow = retHighest || othIsReflexive;
5665 } else if (valIsUndefined) {
5666 setLow = othIsReflexive && (retHighest || othIsDefined);
5667 } else if (valIsNull) {
5668 setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
5669 } else if (valIsSymbol) {
5670 setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
5671 } else if (othIsNull || othIsSymbol) {
5672 setLow = false;
5673 } else {
5674 setLow = retHighest ? (computed <= value) : (computed < value);
5675 }
5676 if (setLow) {
5677 low = mid + 1;
5678 } else {
5679 high = mid;
5680 }
5681 }
5682 return nativeMin(high, MAX_ARRAY_INDEX);
5683 }
5684
5685 /**
5686 * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
5687 * support for iteratee shorthands.
5688 *
5689 * @private
5690 * @param {Array} array The array to inspect.
5691 * @param {Function} [iteratee] The iteratee invoked per element.
5692 * @returns {Array} Returns the new duplicate free array.
5693 */
5694 function baseSortedUniq(array, iteratee) {
5695 var index = -1,
5696 length = array.length,
5697 resIndex = 0,
5698 result = [];
5699
5700 while (++index < length) {
5701 var value = array[index],
5702 computed = iteratee ? iteratee(value) : value;
5703
5704 if (!index || !eq(computed, seen)) {
5705 var seen = computed;
5706 result[resIndex++] = value === 0 ? 0 : value;
5707 }
5708 }
5709 return result;
5710 }
5711
5712 /**
5713 * The base implementation of `_.toNumber` which doesn't ensure correct
5714 * conversions of binary, hexadecimal, or octal string values.
5715 *
5716 * @private
5717 * @param {*} value The value to process.
5718 * @returns {number} Returns the number.
5719 */
5720 function baseToNumber(value) {
5721 if (typeof value == 'number') {
5722 return value;
5723 }
5724 if (isSymbol(value)) {
5725 return NAN;
5726 }
5727 return +value;
5728 }
5729
5730 /**
5731 * The base implementation of `_.toString` which doesn't convert nullish
5732 * values to empty strings.
5733 *
5734 * @private
5735 * @param {*} value The value to process.
5736 * @returns {string} Returns the string.
5737 */
5738 function baseToString(value) {
5739 // Exit early for strings to avoid a performance hit in some environments.
5740 if (typeof value == 'string') {
5741 return value;
5742 }
5743 if (isArray(value)) {
5744 // Recursively convert values (susceptible to call stack limits).
5745 return arrayMap(value, baseToString) + '';
5746 }
5747 if (isSymbol(value)) {
5748 return symbolToString ? symbolToString.call(value) : '';
5749 }
5750 var result = (value + '');
5751 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
5752 }
5753
5754 /**
5755 * The base implementation of `_.uniqBy` without support for iteratee shorthands.
5756 *
5757 * @private
5758 * @param {Array} array The array to inspect.
5759 * @param {Function} [iteratee] The iteratee invoked per element.
5760 * @param {Function} [comparator] The comparator invoked per element.
5761 * @returns {Array} Returns the new duplicate free array.
5762 */
5763 function baseUniq(array, iteratee, comparator) {
5764 var index = -1,
5765 includes = arrayIncludes,
5766 length = array.length,
5767 isCommon = true,
5768 result = [],
5769 seen = result;
5770
5771 if (comparator) {
5772 isCommon = false;
5773 includes = arrayIncludesWith;
5774 }
5775 else if (length >= LARGE_ARRAY_SIZE) {
5776 var set = iteratee ? null : createSet(array);
5777 if (set) {
5778 return setToArray(set);
5779 }
5780 isCommon = false;
5781 includes = cacheHas;
5782 seen = new SetCache;
5783 }
5784 else {
5785 seen = iteratee ? [] : result;
5786 }
5787 outer:
5788 while (++index < length) {
5789 var value = array[index],
5790 computed = iteratee ? iteratee(value) : value;
5791
5792 value = (comparator || value !== 0) ? value : 0;
5793 if (isCommon && computed === computed) {
5794 var seenIndex = seen.length;
5795 while (seenIndex--) {
5796 if (seen[seenIndex] === computed) {
5797 continue outer;
5798 }
5799 }
5800 if (iteratee) {
5801 seen.push(computed);
5802 }
5803 result.push(value);
5804 }
5805 else if (!includes(seen, computed, comparator)) {
5806 if (seen !== result) {
5807 seen.push(computed);
5808 }
5809 result.push(value);
5810 }
5811 }
5812 return result;
5813 }
5814
5815 /**
5816 * The base implementation of `_.unset`.
5817 *
5818 * @private
5819 * @param {Object} object The object to modify.
5820 * @param {Array|string} path The property path to unset.
5821 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
5822 */
5823 function baseUnset(object, path) {
5824 path = castPath(path, object);
5825 object = parent(object, path);
5826 return object == null || delete object[toKey(last(path))];
5827 }
5828
5829 /**
5830 * The base implementation of `_.update`.
5831 *
5832 * @private
5833 * @param {Object} object The object to modify.
5834 * @param {Array|string} path The path of the property to update.
5835 * @param {Function} updater The function to produce the updated value.
5836 * @param {Function} [customizer] The function to customize path creation.
5837 * @returns {Object} Returns `object`.
5838 */
5839 function baseUpdate(object, path, updater, customizer) {
5840 return baseSet(object, path, updater(baseGet(object, path)), customizer);
5841 }
5842
5843 /**
5844 * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
5845 * without support for iteratee shorthands.
5846 *
5847 * @private
5848 * @param {Array} array The array to query.
5849 * @param {Function} predicate The function invoked per iteration.
5850 * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
5851 * @param {boolean} [fromRight] Specify iterating from right to left.
5852 * @returns {Array} Returns the slice of `array`.
5853 */
5854 function baseWhile(array, predicate, isDrop, fromRight) {
5855 var length = array.length,
5856 index = fromRight ? length : -1;
5857
5858 while ((fromRight ? index-- : ++index < length) &&
5859 predicate(array[index], index, array)) {}
5860
5861 return isDrop
5862 ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
5863 : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
5864 }
5865
5866 /**
5867 * The base implementation of `wrapperValue` which returns the result of
5868 * performing a sequence of actions on the unwrapped `value`, where each
5869 * successive action is supplied the return value of the previous.
5870 *
5871 * @private
5872 * @param {*} value The unwrapped value.
5873 * @param {Array} actions Actions to perform to resolve the unwrapped value.
5874 * @returns {*} Returns the resolved value.
5875 */
5876 function baseWrapperValue(value, actions) {
5877 var result = value;
5878 if (result instanceof LazyWrapper) {
5879 result = result.value();
5880 }
5881 return arrayReduce(actions, function(result, action) {
5882 return action.func.apply(action.thisArg, arrayPush([result], action.args));
5883 }, result);
5884 }
5885
5886 /**
5887 * The base implementation of methods like `_.xor`, without support for
5888 * iteratee shorthands, that accepts an array of arrays to inspect.
5889 *
5890 * @private
5891 * @param {Array} arrays The arrays to inspect.
5892 * @param {Function} [iteratee] The iteratee invoked per element.
5893 * @param {Function} [comparator] The comparator invoked per element.
5894 * @returns {Array} Returns the new array of values.
5895 */
5896 function baseXor(arrays, iteratee, comparator) {
5897 var length = arrays.length;
5898 if (length < 2) {
5899 return length ? baseUniq(arrays[0]) : [];
5900 }
5901 var index = -1,
5902 result = Array(length);
5903
5904 while (++index < length) {
5905 var array = arrays[index],
5906 othIndex = -1;
5907
5908 while (++othIndex < length) {
5909 if (othIndex != index) {
5910 result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
5911 }
5912 }
5913 }
5914 return baseUniq(baseFlatten(result, 1), iteratee, comparator);
5915 }
5916
5917 /**
5918 * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
5919 *
5920 * @private
5921 * @param {Array} props The property identifiers.
5922 * @param {Array} values The property values.
5923 * @param {Function} assignFunc The function to assign values.
5924 * @returns {Object} Returns the new object.
5925 */
5926 function baseZipObject(props, values, assignFunc) {
5927 var index = -1,
5928 length = props.length,
5929 valsLength = values.length,
5930 result = {};
5931
5932 while (++index < length) {
5933 var value = index < valsLength ? values[index] : undefined;
5934 assignFunc(result, props[index], value);
5935 }
5936 return result;
5937 }
5938
5939 /**
5940 * Casts `value` to an empty array if it's not an array like object.
5941 *
5942 * @private
5943 * @param {*} value The value to inspect.
5944 * @returns {Array|Object} Returns the cast array-like object.
5945 */
5946 function castArrayLikeObject(value) {
5947 return isArrayLikeObject(value) ? value : [];
5948 }
5949
5950 /**
5951 * Casts `value` to `identity` if it's not a function.
5952 *
5953 * @private
5954 * @param {*} value The value to inspect.
5955 * @returns {Function} Returns cast function.
5956 */
5957 function castFunction(value) {
5958 return typeof value == 'function' ? value : identity;
5959 }
5960
5961 /**
5962 * Casts `value` to a path array if it's not one.
5963 *
5964 * @private
5965 * @param {*} value The value to inspect.
5966 * @param {Object} [object] The object to query keys on.
5967 * @returns {Array} Returns the cast property path array.
5968 */
5969 function castPath(value, object) {
5970 if (isArray(value)) {
5971 return value;
5972 }
5973 return isKey(value, object) ? [value] : stringToPath(toString(value));
5974 }
5975
5976 /**
5977 * A `baseRest` alias which can be replaced with `identity` by module
5978 * replacement plugins.
5979 *
5980 * @private
5981 * @type {Function}
5982 * @param {Function} func The function to apply a rest parameter to.
5983 * @returns {Function} Returns the new function.
5984 */
5985 var castRest = baseRest;
5986
5987 /**
5988 * Casts `array` to a slice if it's needed.
5989 *
5990 * @private
5991 * @param {Array} array The array to inspect.
5992 * @param {number} start The start position.
5993 * @param {number} [end=array.length] The end position.
5994 * @returns {Array} Returns the cast slice.
5995 */
5996 function castSlice(array, start, end) {
5997 var length = array.length;
5998 end = end === undefined ? length : end;
5999 return (!start && end >= length) ? array : baseSlice(array, start, end);
6000 }
6001
6002 /**
6003 * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
6004 *
6005 * @private
6006 * @param {number|Object} id The timer id or timeout object of the timer to clear.
6007 */
6008 var clearTimeout = ctxClearTimeout || function(id) {
6009 return root.clearTimeout(id);
6010 };
6011
6012 /**
6013 * Creates a clone of `buffer`.
6014 *
6015 * @private
6016 * @param {Buffer} buffer The buffer to clone.
6017 * @param {boolean} [isDeep] Specify a deep clone.
6018 * @returns {Buffer} Returns the cloned buffer.
6019 */
6020 function cloneBuffer(buffer, isDeep) {
6021 if (isDeep) {
6022 return buffer.slice();
6023 }
6024 var length = buffer.length,
6025 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
6026
6027 buffer.copy(result);
6028 return result;
6029 }
6030
6031 /**
6032 * Creates a clone of `arrayBuffer`.
6033 *
6034 * @private
6035 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
6036 * @returns {ArrayBuffer} Returns the cloned array buffer.
6037 */
6038 function cloneArrayBuffer(arrayBuffer) {
6039 var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
6040 new Uint8Array(result).set(new Uint8Array(arrayBuffer));
6041 return result;
6042 }
6043
6044 /**
6045 * Creates a clone of `dataView`.
6046 *
6047 * @private
6048 * @param {Object} dataView The data view to clone.
6049 * @param {boolean} [isDeep] Specify a deep clone.
6050 * @returns {Object} Returns the cloned data view.
6051 */
6052 function cloneDataView(dataView, isDeep) {
6053 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
6054 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
6055 }
6056
6057 /**
6058 * Creates a clone of `regexp`.
6059 *
6060 * @private
6061 * @param {Object} regexp The regexp to clone.
6062 * @returns {Object} Returns the cloned regexp.
6063 */
6064 function cloneRegExp(regexp) {
6065 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
6066 result.lastIndex = regexp.lastIndex;
6067 return result;
6068 }
6069
6070 /**
6071 * Creates a clone of the `symbol` object.
6072 *
6073 * @private
6074 * @param {Object} symbol The symbol object to clone.
6075 * @returns {Object} Returns the cloned symbol object.
6076 */
6077 function cloneSymbol(symbol) {
6078 return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
6079 }
6080
6081 /**
6082 * Creates a clone of `typedArray`.
6083 *
6084 * @private
6085 * @param {Object} typedArray The typed array to clone.
6086 * @param {boolean} [isDeep] Specify a deep clone.
6087 * @returns {Object} Returns the cloned typed array.
6088 */
6089 function cloneTypedArray(typedArray, isDeep) {
6090 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
6091 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
6092 }
6093
6094 /**
6095 * Compares values to sort them in ascending order.
6096 *
6097 * @private
6098 * @param {*} value The value to compare.
6099 * @param {*} other The other value to compare.
6100 * @returns {number} Returns the sort order indicator for `value`.
6101 */
6102 function compareAscending(value, other) {
6103 if (value !== other) {
6104 var valIsDefined = value !== undefined,
6105 valIsNull = value === null,
6106 valIsReflexive = value === value,
6107 valIsSymbol = isSymbol(value);
6108
6109 var othIsDefined = other !== undefined,
6110 othIsNull = other === null,
6111 othIsReflexive = other === other,
6112 othIsSymbol = isSymbol(other);
6113
6114 if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
6115 (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
6116 (valIsNull && othIsDefined && othIsReflexive) ||
6117 (!valIsDefined && othIsReflexive) ||
6118 !valIsReflexive) {
6119 return 1;
6120 }
6121 if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
6122 (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
6123 (othIsNull && valIsDefined && valIsReflexive) ||
6124 (!othIsDefined && valIsReflexive) ||
6125 !othIsReflexive) {
6126 return -1;
6127 }
6128 }
6129 return 0;
6130 }
6131
6132 /**
6133 * Used by `_.orderBy` to compare multiple properties of a value to another
6134 * and stable sort them.
6135 *
6136 * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
6137 * specify an order of "desc" for descending or "asc" for ascending sort order
6138 * of corresponding values.
6139 *
6140 * @private
6141 * @param {Object} object The object to compare.
6142 * @param {Object} other The other object to compare.
6143 * @param {boolean[]|string[]} orders The order to sort by for each property.
6144 * @returns {number} Returns the sort order indicator for `object`.
6145 */
6146 function compareMultiple(object, other, orders) {
6147 var index = -1,
6148 objCriteria = object.criteria,
6149 othCriteria = other.criteria,
6150 length = objCriteria.length,
6151 ordersLength = orders.length;
6152
6153 while (++index < length) {
6154 var result = compareAscending(objCriteria[index], othCriteria[index]);
6155 if (result) {
6156 if (index >= ordersLength) {
6157 return result;
6158 }
6159 var order = orders[index];
6160 return result * (order == 'desc' ? -1 : 1);
6161 }
6162 }
6163 // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
6164 // that causes it, under certain circumstances, to provide the same value for
6165 // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
6166 // for more details.
6167 //
6168 // This also ensures a stable sort in V8 and other engines.
6169 // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
6170 return object.index - other.index;
6171 }
6172
6173 /**
6174 * Creates an array that is the composition of partially applied arguments,
6175 * placeholders, and provided arguments into a single array of arguments.
6176 *
6177 * @private
6178 * @param {Array} args The provided arguments.
6179 * @param {Array} partials The arguments to prepend to those provided.
6180 * @param {Array} holders The `partials` placeholder indexes.
6181 * @params {boolean} [isCurried] Specify composing for a curried function.
6182 * @returns {Array} Returns the new array of composed arguments.
6183 */
6184 function composeArgs(args, partials, holders, isCurried) {
6185 var argsIndex = -1,
6186 argsLength = args.length,
6187 holdersLength = holders.length,
6188 leftIndex = -1,
6189 leftLength = partials.length,
6190 rangeLength = nativeMax(argsLength - holdersLength, 0),
6191 result = Array(leftLength + rangeLength),
6192 isUncurried = !isCurried;
6193
6194 while (++leftIndex < leftLength) {
6195 result[leftIndex] = partials[leftIndex];
6196 }
6197 while (++argsIndex < holdersLength) {
6198 if (isUncurried || argsIndex < argsLength) {
6199 result[holders[argsIndex]] = args[argsIndex];
6200 }
6201 }
6202 while (rangeLength--) {
6203 result[leftIndex++] = args[argsIndex++];
6204 }
6205 return result;
6206 }
6207
6208 /**
6209 * This function is like `composeArgs` except that the arguments composition
6210 * is tailored for `_.partialRight`.
6211 *
6212 * @private
6213 * @param {Array} args The provided arguments.
6214 * @param {Array} partials The arguments to append to those provided.
6215 * @param {Array} holders The `partials` placeholder indexes.
6216 * @params {boolean} [isCurried] Specify composing for a curried function.
6217 * @returns {Array} Returns the new array of composed arguments.
6218 */
6219 function composeArgsRight(args, partials, holders, isCurried) {
6220 var argsIndex = -1,
6221 argsLength = args.length,
6222 holdersIndex = -1,
6223 holdersLength = holders.length,
6224 rightIndex = -1,
6225 rightLength = partials.length,
6226 rangeLength = nativeMax(argsLength - holdersLength, 0),
6227 result = Array(rangeLength + rightLength),
6228 isUncurried = !isCurried;
6229
6230 while (++argsIndex < rangeLength) {
6231 result[argsIndex] = args[argsIndex];
6232 }
6233 var offset = argsIndex;
6234 while (++rightIndex < rightLength) {
6235 result[offset + rightIndex] = partials[rightIndex];
6236 }
6237 while (++holdersIndex < holdersLength) {
6238 if (isUncurried || argsIndex < argsLength) {
6239 result[offset + holders[holdersIndex]] = args[argsIndex++];
6240 }
6241 }
6242 return result;
6243 }
6244
6245 /**
6246 * Copies the values of `source` to `array`.
6247 *
6248 * @private
6249 * @param {Array} source The array to copy values from.
6250 * @param {Array} [array=[]] The array to copy values to.
6251 * @returns {Array} Returns `array`.
6252 */
6253 function copyArray(source, array) {
6254 var index = -1,
6255 length = source.length;
6256
6257 array || (array = Array(length));
6258 while (++index < length) {
6259 array[index] = source[index];
6260 }
6261 return array;
6262 }
6263
6264 /**
6265 * Copies properties of `source` to `object`.
6266 *
6267 * @private
6268 * @param {Object} source The object to copy properties from.
6269 * @param {Array} props The property identifiers to copy.
6270 * @param {Object} [object={}] The object to copy properties to.
6271 * @param {Function} [customizer] The function to customize copied values.
6272 * @returns {Object} Returns `object`.
6273 */
6274 function copyObject(source, props, object, customizer) {
6275 var isNew = !object;
6276 object || (object = {});
6277
6278 var index = -1,
6279 length = props.length;
6280
6281 while (++index < length) {
6282 var key = props[index];
6283
6284 var newValue = customizer
6285 ? customizer(object[key], source[key], key, object, source)
6286 : undefined;
6287
6288 if (newValue === undefined) {
6289 newValue = source[key];
6290 }
6291 if (isNew) {
6292 baseAssignValue(object, key, newValue);
6293 } else {
6294 assignValue(object, key, newValue);
6295 }
6296 }
6297 return object;
6298 }
6299
6300 /**
6301 * Copies own symbols of `source` to `object`.
6302 *
6303 * @private
6304 * @param {Object} source The object to copy symbols from.
6305 * @param {Object} [object={}] The object to copy symbols to.
6306 * @returns {Object} Returns `object`.
6307 */
6308 function copySymbols(source, object) {
6309 return copyObject(source, getSymbols(source), object);
6310 }
6311
6312 /**
6313 * Copies own and inherited symbols of `source` to `object`.
6314 *
6315 * @private
6316 * @param {Object} source The object to copy symbols from.
6317 * @param {Object} [object={}] The object to copy symbols to.
6318 * @returns {Object} Returns `object`.
6319 */
6320 function copySymbolsIn(source, object) {
6321 return copyObject(source, getSymbolsIn(source), object);
6322 }
6323
6324 /**
6325 * Creates a function like `_.groupBy`.
6326 *
6327 * @private
6328 * @param {Function} setter The function to set accumulator values.
6329 * @param {Function} [initializer] The accumulator object initializer.
6330 * @returns {Function} Returns the new aggregator function.
6331 */
6332 function createAggregator(setter, initializer) {
6333 return function(collection, iteratee) {
6334 var func = isArray(collection) ? arrayAggregator : baseAggregator,
6335 accumulator = initializer ? initializer() : {};
6336
6337 return func(collection, setter, getIteratee(iteratee, 2), accumulator);
6338 };
6339 }
6340
6341 /**
6342 * Creates a function like `_.assign`.
6343 *
6344 * @private
6345 * @param {Function} assigner The function to assign values.
6346 * @returns {Function} Returns the new assigner function.
6347 */
6348 function createAssigner(assigner) {
6349 return baseRest(function(object, sources) {
6350 var index = -1,
6351 length = sources.length,
6352 customizer = length > 1 ? sources[length - 1] : undefined,
6353 guard = length > 2 ? sources[2] : undefined;
6354
6355 customizer = (assigner.length > 3 && typeof customizer == 'function')
6356 ? (length--, customizer)
6357 : undefined;
6358
6359 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
6360 customizer = length < 3 ? undefined : customizer;
6361 length = 1;
6362 }
6363 object = Object(object);
6364 while (++index < length) {
6365 var source = sources[index];
6366 if (source) {
6367 assigner(object, source, index, customizer);
6368 }
6369 }
6370 return object;
6371 });
6372 }
6373
6374 /**
6375 * Creates a `baseEach` or `baseEachRight` function.
6376 *
6377 * @private
6378 * @param {Function} eachFunc The function to iterate over a collection.
6379 * @param {boolean} [fromRight] Specify iterating from right to left.
6380 * @returns {Function} Returns the new base function.
6381 */
6382 function createBaseEach(eachFunc, fromRight) {
6383 return function(collection, iteratee) {
6384 if (collection == null) {
6385 return collection;
6386 }
6387 if (!isArrayLike(collection)) {
6388 return eachFunc(collection, iteratee);
6389 }
6390 var length = collection.length,
6391 index = fromRight ? length : -1,
6392 iterable = Object(collection);
6393
6394 while ((fromRight ? index-- : ++index < length)) {
6395 if (iteratee(iterable[index], index, iterable) === false) {
6396 break;
6397 }
6398 }
6399 return collection;
6400 };
6401 }
6402
6403 /**
6404 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
6405 *
6406 * @private
6407 * @param {boolean} [fromRight] Specify iterating from right to left.
6408 * @returns {Function} Returns the new base function.
6409 */
6410 function createBaseFor(fromRight) {
6411 return function(object, iteratee, keysFunc) {
6412 var index = -1,
6413 iterable = Object(object),
6414 props = keysFunc(object),
6415 length = props.length;
6416
6417 while (length--) {
6418 var key = props[fromRight ? length : ++index];
6419 if (iteratee(iterable[key], key, iterable) === false) {
6420 break;
6421 }
6422 }
6423 return object;
6424 };
6425 }
6426
6427 /**
6428 * Creates a function that wraps `func` to invoke it with the optional `this`
6429 * binding of `thisArg`.
6430 *
6431 * @private
6432 * @param {Function} func The function to wrap.
6433 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6434 * @param {*} [thisArg] The `this` binding of `func`.
6435 * @returns {Function} Returns the new wrapped function.
6436 */
6437 function createBind(func, bitmask, thisArg) {
6438 var isBind = bitmask & WRAP_BIND_FLAG,
6439 Ctor = createCtor(func);
6440
6441 function wrapper() {
6442 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
6443 return fn.apply(isBind ? thisArg : this, arguments);
6444 }
6445 return wrapper;
6446 }
6447
6448 /**
6449 * Creates a function like `_.lowerFirst`.
6450 *
6451 * @private
6452 * @param {string} methodName The name of the `String` case method to use.
6453 * @returns {Function} Returns the new case function.
6454 */
6455 function createCaseFirst(methodName) {
6456 return function(string) {
6457 string = toString(string);
6458
6459 var strSymbols = hasUnicode(string)
6460 ? stringToArray(string)
6461 : undefined;
6462
6463 var chr = strSymbols
6464 ? strSymbols[0]
6465 : string.charAt(0);
6466
6467 var trailing = strSymbols
6468 ? castSlice(strSymbols, 1).join('')
6469 : string.slice(1);
6470
6471 return chr[methodName]() + trailing;
6472 };
6473 }
6474
6475 /**
6476 * Creates a function like `_.camelCase`.
6477 *
6478 * @private
6479 * @param {Function} callback The function to combine each word.
6480 * @returns {Function} Returns the new compounder function.
6481 */
6482 function createCompounder(callback) {
6483 return function(string) {
6484 return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
6485 };
6486 }
6487
6488 /**
6489 * Creates a function that produces an instance of `Ctor` regardless of
6490 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
6491 *
6492 * @private
6493 * @param {Function} Ctor The constructor to wrap.
6494 * @returns {Function} Returns the new wrapped function.
6495 */
6496 function createCtor(Ctor) {
6497 return function() {
6498 // Use a `switch` statement to work with class constructors. See
6499 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
6500 // for more details.
6501 var args = arguments;
6502 switch (args.length) {
6503 case 0: return new Ctor;
6504 case 1: return new Ctor(args[0]);
6505 case 2: return new Ctor(args[0], args[1]);
6506 case 3: return new Ctor(args[0], args[1], args[2]);
6507 case 4: return new Ctor(args[0], args[1], args[2], args[3]);
6508 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
6509 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
6510 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
6511 }
6512 var thisBinding = baseCreate(Ctor.prototype),
6513 result = Ctor.apply(thisBinding, args);
6514
6515 // Mimic the constructor's `return` behavior.
6516 // See https://es5.github.io/#x13.2.2 for more details.
6517 return isObject(result) ? result : thisBinding;
6518 };
6519 }
6520
6521 /**
6522 * Creates a function that wraps `func` to enable currying.
6523 *
6524 * @private
6525 * @param {Function} func The function to wrap.
6526 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6527 * @param {number} arity The arity of `func`.
6528 * @returns {Function} Returns the new wrapped function.
6529 */
6530 function createCurry(func, bitmask, arity) {
6531 var Ctor = createCtor(func);
6532
6533 function wrapper() {
6534 var length = arguments.length,
6535 args = Array(length),
6536 index = length,
6537 placeholder = getHolder(wrapper);
6538
6539 while (index--) {
6540 args[index] = arguments[index];
6541 }
6542 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
6543 ? []
6544 : replaceHolders(args, placeholder);
6545
6546 length -= holders.length;
6547 if (length < arity) {
6548 return createRecurry(
6549 func, bitmask, createHybrid, wrapper.placeholder, undefined,
6550 args, holders, undefined, undefined, arity - length);
6551 }
6552 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
6553 return apply(fn, this, args);
6554 }
6555 return wrapper;
6556 }
6557
6558 /**
6559 * Creates a `_.find` or `_.findLast` function.
6560 *
6561 * @private
6562 * @param {Function} findIndexFunc The function to find the collection index.
6563 * @returns {Function} Returns the new find function.
6564 */
6565 function createFind(findIndexFunc) {
6566 return function(collection, predicate, fromIndex) {
6567 var iterable = Object(collection);
6568 if (!isArrayLike(collection)) {
6569 var iteratee = getIteratee(predicate, 3);
6570 collection = keys(collection);
6571 predicate = function(key) { return iteratee(iterable[key], key, iterable); };
6572 }
6573 var index = findIndexFunc(collection, predicate, fromIndex);
6574 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
6575 };
6576 }
6577
6578 /**
6579 * Creates a `_.flow` or `_.flowRight` function.
6580 *
6581 * @private
6582 * @param {boolean} [fromRight] Specify iterating from right to left.
6583 * @returns {Function} Returns the new flow function.
6584 */
6585 function createFlow(fromRight) {
6586 return flatRest(function(funcs) {
6587 var length = funcs.length,
6588 index = length,
6589 prereq = LodashWrapper.prototype.thru;
6590
6591 if (fromRight) {
6592 funcs.reverse();
6593 }
6594 while (index--) {
6595 var func = funcs[index];
6596 if (typeof func != 'function') {
6597 throw new TypeError(FUNC_ERROR_TEXT);
6598 }
6599 if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
6600 var wrapper = new LodashWrapper([], true);
6601 }
6602 }
6603 index = wrapper ? index : length;
6604 while (++index < length) {
6605 func = funcs[index];
6606
6607 var funcName = getFuncName(func),
6608 data = funcName == 'wrapper' ? getData(func) : undefined;
6609
6610 if (data && isLaziable(data[0]) &&
6611 data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
6612 !data[4].length && data[9] == 1
6613 ) {
6614 wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
6615 } else {
6616 wrapper = (func.length == 1 && isLaziable(func))
6617 ? wrapper[funcName]()
6618 : wrapper.thru(func);
6619 }
6620 }
6621 return function() {
6622 var args = arguments,
6623 value = args[0];
6624
6625 if (wrapper && args.length == 1 && isArray(value)) {
6626 return wrapper.plant(value).value();
6627 }
6628 var index = 0,
6629 result = length ? funcs[index].apply(this, args) : value;
6630
6631 while (++index < length) {
6632 result = funcs[index].call(this, result);
6633 }
6634 return result;
6635 };
6636 });
6637 }
6638
6639 /**
6640 * Creates a function that wraps `func` to invoke it with optional `this`
6641 * binding of `thisArg`, partial application, and currying.
6642 *
6643 * @private
6644 * @param {Function|string} func The function or method name to wrap.
6645 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6646 * @param {*} [thisArg] The `this` binding of `func`.
6647 * @param {Array} [partials] The arguments to prepend to those provided to
6648 * the new function.
6649 * @param {Array} [holders] The `partials` placeholder indexes.
6650 * @param {Array} [partialsRight] The arguments to append to those provided
6651 * to the new function.
6652 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
6653 * @param {Array} [argPos] The argument positions of the new function.
6654 * @param {number} [ary] The arity cap of `func`.
6655 * @param {number} [arity] The arity of `func`.
6656 * @returns {Function} Returns the new wrapped function.
6657 */
6658 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
6659 var isAry = bitmask & WRAP_ARY_FLAG,
6660 isBind = bitmask & WRAP_BIND_FLAG,
6661 isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
6662 isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
6663 isFlip = bitmask & WRAP_FLIP_FLAG,
6664 Ctor = isBindKey ? undefined : createCtor(func);
6665
6666 function wrapper() {
6667 var length = arguments.length,
6668 args = Array(length),
6669 index = length;
6670
6671 while (index--) {
6672 args[index] = arguments[index];
6673 }
6674 if (isCurried) {
6675 var placeholder = getHolder(wrapper),
6676 holdersCount = countHolders(args, placeholder);
6677 }
6678 if (partials) {
6679 args = composeArgs(args, partials, holders, isCurried);
6680 }
6681 if (partialsRight) {
6682 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
6683 }
6684 length -= holdersCount;
6685 if (isCurried && length < arity) {
6686 var newHolders = replaceHolders(args, placeholder);
6687 return createRecurry(
6688 func, bitmask, createHybrid, wrapper.placeholder, thisArg,
6689 args, newHolders, argPos, ary, arity - length
6690 );
6691 }
6692 var thisBinding = isBind ? thisArg : this,
6693 fn = isBindKey ? thisBinding[func] : func;
6694
6695 length = args.length;
6696 if (argPos) {
6697 args = reorder(args, argPos);
6698 } else if (isFlip && length > 1) {
6699 args.reverse();
6700 }
6701 if (isAry && ary < length) {
6702 args.length = ary;
6703 }
6704 if (this && this !== root && this instanceof wrapper) {
6705 fn = Ctor || createCtor(fn);
6706 }
6707 return fn.apply(thisBinding, args);
6708 }
6709 return wrapper;
6710 }
6711
6712 /**
6713 * Creates a function like `_.invertBy`.
6714 *
6715 * @private
6716 * @param {Function} setter The function to set accumulator values.
6717 * @param {Function} toIteratee The function to resolve iteratees.
6718 * @returns {Function} Returns the new inverter function.
6719 */
6720 function createInverter(setter, toIteratee) {
6721 return function(object, iteratee) {
6722 return baseInverter(object, setter, toIteratee(iteratee), {});
6723 };
6724 }
6725
6726 /**
6727 * Creates a function that performs a mathematical operation on two values.
6728 *
6729 * @private
6730 * @param {Function} operator The function to perform the operation.
6731 * @param {number} [defaultValue] The value used for `undefined` arguments.
6732 * @returns {Function} Returns the new mathematical operation function.
6733 */
6734 function createMathOperation(operator, defaultValue) {
6735 return function(value, other) {
6736 var result;
6737 if (value === undefined && other === undefined) {
6738 return defaultValue;
6739 }
6740 if (value !== undefined) {
6741 result = value;
6742 }
6743 if (other !== undefined) {
6744 if (result === undefined) {
6745 return other;
6746 }
6747 if (typeof value == 'string' || typeof other == 'string') {
6748 value = baseToString(value);
6749 other = baseToString(other);
6750 } else {
6751 value = baseToNumber(value);
6752 other = baseToNumber(other);
6753 }
6754 result = operator(value, other);
6755 }
6756 return result;
6757 };
6758 }
6759
6760 /**
6761 * Creates a function like `_.over`.
6762 *
6763 * @private
6764 * @param {Function} arrayFunc The function to iterate over iteratees.
6765 * @returns {Function} Returns the new over function.
6766 */
6767 function createOver(arrayFunc) {
6768 return flatRest(function(iteratees) {
6769 iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
6770 return baseRest(function(args) {
6771 var thisArg = this;
6772 return arrayFunc(iteratees, function(iteratee) {
6773 return apply(iteratee, thisArg, args);
6774 });
6775 });
6776 });
6777 }
6778
6779 /**
6780 * Creates the padding for `string` based on `length`. The `chars` string
6781 * is truncated if the number of characters exceeds `length`.
6782 *
6783 * @private
6784 * @param {number} length The padding length.
6785 * @param {string} [chars=' '] The string used as padding.
6786 * @returns {string} Returns the padding for `string`.
6787 */
6788 function createPadding(length, chars) {
6789 chars = chars === undefined ? ' ' : baseToString(chars);
6790
6791 var charsLength = chars.length;
6792 if (charsLength < 2) {
6793 return charsLength ? baseRepeat(chars, length) : chars;
6794 }
6795 var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
6796 return hasUnicode(chars)
6797 ? castSlice(stringToArray(result), 0, length).join('')
6798 : result.slice(0, length);
6799 }
6800
6801 /**
6802 * Creates a function that wraps `func` to invoke it with the `this` binding
6803 * of `thisArg` and `partials` prepended to the arguments it receives.
6804 *
6805 * @private
6806 * @param {Function} func The function to wrap.
6807 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6808 * @param {*} thisArg The `this` binding of `func`.
6809 * @param {Array} partials The arguments to prepend to those provided to
6810 * the new function.
6811 * @returns {Function} Returns the new wrapped function.
6812 */
6813 function createPartial(func, bitmask, thisArg, partials) {
6814 var isBind = bitmask & WRAP_BIND_FLAG,
6815 Ctor = createCtor(func);
6816
6817 function wrapper() {
6818 var argsIndex = -1,
6819 argsLength = arguments.length,
6820 leftIndex = -1,
6821 leftLength = partials.length,
6822 args = Array(leftLength + argsLength),
6823 fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
6824
6825 while (++leftIndex < leftLength) {
6826 args[leftIndex] = partials[leftIndex];
6827 }
6828 while (argsLength--) {
6829 args[leftIndex++] = arguments[++argsIndex];
6830 }
6831 return apply(fn, isBind ? thisArg : this, args);
6832 }
6833 return wrapper;
6834 }
6835
6836 /**
6837 * Creates a `_.range` or `_.rangeRight` function.
6838 *
6839 * @private
6840 * @param {boolean} [fromRight] Specify iterating from right to left.
6841 * @returns {Function} Returns the new range function.
6842 */
6843 function createRange(fromRight) {
6844 return function(start, end, step) {
6845 if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
6846 end = step = undefined;
6847 }
6848 // Ensure the sign of `-0` is preserved.
6849 start = toFinite(start);
6850 if (end === undefined) {
6851 end = start;
6852 start = 0;
6853 } else {
6854 end = toFinite(end);
6855 }
6856 step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
6857 return baseRange(start, end, step, fromRight);
6858 };
6859 }
6860
6861 /**
6862 * Creates a function that performs a relational operation on two values.
6863 *
6864 * @private
6865 * @param {Function} operator The function to perform the operation.
6866 * @returns {Function} Returns the new relational operation function.
6867 */
6868 function createRelationalOperation(operator) {
6869 return function(value, other) {
6870 if (!(typeof value == 'string' && typeof other == 'string')) {
6871 value = toNumber(value);
6872 other = toNumber(other);
6873 }
6874 return operator(value, other);
6875 };
6876 }
6877
6878 /**
6879 * Creates a function that wraps `func` to continue currying.
6880 *
6881 * @private
6882 * @param {Function} func The function to wrap.
6883 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6884 * @param {Function} wrapFunc The function to create the `func` wrapper.
6885 * @param {*} placeholder The placeholder value.
6886 * @param {*} [thisArg] The `this` binding of `func`.
6887 * @param {Array} [partials] The arguments to prepend to those provided to
6888 * the new function.
6889 * @param {Array} [holders] The `partials` placeholder indexes.
6890 * @param {Array} [argPos] The argument positions of the new function.
6891 * @param {number} [ary] The arity cap of `func`.
6892 * @param {number} [arity] The arity of `func`.
6893 * @returns {Function} Returns the new wrapped function.
6894 */
6895 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
6896 var isCurry = bitmask & WRAP_CURRY_FLAG,
6897 newHolders = isCurry ? holders : undefined,
6898 newHoldersRight = isCurry ? undefined : holders,
6899 newPartials = isCurry ? partials : undefined,
6900 newPartialsRight = isCurry ? undefined : partials;
6901
6902 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
6903 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
6904
6905 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
6906 bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
6907 }
6908 var newData = [
6909 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
6910 newHoldersRight, argPos, ary, arity
6911 ];
6912
6913 var result = wrapFunc.apply(undefined, newData);
6914 if (isLaziable(func)) {
6915 setData(result, newData);
6916 }
6917 result.placeholder = placeholder;
6918 return setWrapToString(result, func, bitmask);
6919 }
6920
6921 /**
6922 * Creates a function like `_.round`.
6923 *
6924 * @private
6925 * @param {string} methodName The name of the `Math` method to use when rounding.
6926 * @returns {Function} Returns the new round function.
6927 */
6928 function createRound(methodName) {
6929 var func = Math[methodName];
6930 return function(number, precision) {
6931 number = toNumber(number);
6932 precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
6933 if (precision && nativeIsFinite(number)) {
6934 // Shift with exponential notation to avoid floating-point issues.
6935 // See [MDN](https://mdn.io/round#Examples) for more details.
6936 var pair = (toString(number) + 'e').split('e'),
6937 value = func(pair[0] + 'e' + (+pair[1] + precision));
6938
6939 pair = (toString(value) + 'e').split('e');
6940 return +(pair[0] + 'e' + (+pair[1] - precision));
6941 }
6942 return func(number);
6943 };
6944 }
6945
6946 /**
6947 * Creates a set object of `values`.
6948 *
6949 * @private
6950 * @param {Array} values The values to add to the set.
6951 * @returns {Object} Returns the new set.
6952 */
6953 var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
6954 return new Set(values);
6955 };
6956
6957 /**
6958 * Creates a `_.toPairs` or `_.toPairsIn` function.
6959 *
6960 * @private
6961 * @param {Function} keysFunc The function to get the keys of a given object.
6962 * @returns {Function} Returns the new pairs function.
6963 */
6964 function createToPairs(keysFunc) {
6965 return function(object) {
6966 var tag = getTag(object);
6967 if (tag == mapTag) {
6968 return mapToArray(object);
6969 }
6970 if (tag == setTag) {
6971 return setToPairs(object);
6972 }
6973 return baseToPairs(object, keysFunc(object));
6974 };
6975 }
6976
6977 /**
6978 * Creates a function that either curries or invokes `func` with optional
6979 * `this` binding and partially applied arguments.
6980 *
6981 * @private
6982 * @param {Function|string} func The function or method name to wrap.
6983 * @param {number} bitmask The bitmask flags.
6984 * 1 - `_.bind`
6985 * 2 - `_.bindKey`
6986 * 4 - `_.curry` or `_.curryRight` of a bound function
6987 * 8 - `_.curry`
6988 * 16 - `_.curryRight`
6989 * 32 - `_.partial`
6990 * 64 - `_.partialRight`
6991 * 128 - `_.rearg`
6992 * 256 - `_.ary`
6993 * 512 - `_.flip`
6994 * @param {*} [thisArg] The `this` binding of `func`.
6995 * @param {Array} [partials] The arguments to be partially applied.
6996 * @param {Array} [holders] The `partials` placeholder indexes.
6997 * @param {Array} [argPos] The argument positions of the new function.
6998 * @param {number} [ary] The arity cap of `func`.
6999 * @param {number} [arity] The arity of `func`.
7000 * @returns {Function} Returns the new wrapped function.
7001 */
7002 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
7003 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
7004 if (!isBindKey && typeof func != 'function') {
7005 throw new TypeError(FUNC_ERROR_TEXT);
7006 }
7007 var length = partials ? partials.length : 0;
7008 if (!length) {
7009 bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
7010 partials = holders = undefined;
7011 }
7012 ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
7013 arity = arity === undefined ? arity : toInteger(arity);
7014 length -= holders ? holders.length : 0;
7015
7016 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
7017 var partialsRight = partials,
7018 holdersRight = holders;
7019
7020 partials = holders = undefined;
7021 }
7022 var data = isBindKey ? undefined : getData(func);
7023
7024 var newData = [
7025 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
7026 argPos, ary, arity
7027 ];
7028
7029 if (data) {
7030 mergeData(newData, data);
7031 }
7032 func = newData[0];
7033 bitmask = newData[1];
7034 thisArg = newData[2];
7035 partials = newData[3];
7036 holders = newData[4];
7037 arity = newData[9] = newData[9] === undefined
7038 ? (isBindKey ? 0 : func.length)
7039 : nativeMax(newData[9] - length, 0);
7040
7041 if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
7042 bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
7043 }
7044 if (!bitmask || bitmask == WRAP_BIND_FLAG) {
7045 var result = createBind(func, bitmask, thisArg);
7046 } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
7047 result = createCurry(func, bitmask, arity);
7048 } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
7049 result = createPartial(func, bitmask, thisArg, partials);
7050 } else {
7051 result = createHybrid.apply(undefined, newData);
7052 }
7053 var setter = data ? baseSetData : setData;
7054 return setWrapToString(setter(result, newData), func, bitmask);
7055 }
7056
7057 /**
7058 * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
7059 * of source objects to the destination object for all destination properties
7060 * that resolve to `undefined`.
7061 *
7062 * @private
7063 * @param {*} objValue The destination value.
7064 * @param {*} srcValue The source value.
7065 * @param {string} key The key of the property to assign.
7066 * @param {Object} object The parent object of `objValue`.
7067 * @returns {*} Returns the value to assign.
7068 */
7069 function customDefaultsAssignIn(objValue, srcValue, key, object) {
7070 if (objValue === undefined ||
7071 (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
7072 return srcValue;
7073 }
7074 return objValue;
7075 }
7076
7077 /**
7078 * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
7079 * objects into destination objects that are passed thru.
7080 *
7081 * @private
7082 * @param {*} objValue The destination value.
7083 * @param {*} srcValue The source value.
7084 * @param {string} key The key of the property to merge.
7085 * @param {Object} object The parent object of `objValue`.
7086 * @param {Object} source The parent object of `srcValue`.
7087 * @param {Object} [stack] Tracks traversed source values and their merged
7088 * counterparts.
7089 * @returns {*} Returns the value to assign.
7090 */
7091 function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
7092 if (isObject(objValue) && isObject(srcValue)) {
7093 // Recursively merge objects and arrays (susceptible to call stack limits).
7094 stack.set(srcValue, objValue);
7095 baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
7096 stack['delete'](srcValue);
7097 }
7098 return objValue;
7099 }
7100
7101 /**
7102 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
7103 * objects.
7104 *
7105 * @private
7106 * @param {*} value The value to inspect.
7107 * @param {string} key The key of the property to inspect.
7108 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
7109 */
7110 function customOmitClone(value) {
7111 return isPlainObject(value) ? undefined : value;
7112 }
7113
7114 /**
7115 * A specialized version of `baseIsEqualDeep` for arrays with support for
7116 * partial deep comparisons.
7117 *
7118 * @private
7119 * @param {Array} array The array to compare.
7120 * @param {Array} other The other array to compare.
7121 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
7122 * @param {Function} customizer The function to customize comparisons.
7123 * @param {Function} equalFunc The function to determine equivalents of values.
7124 * @param {Object} stack Tracks traversed `array` and `other` objects.
7125 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
7126 */
7127 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
7128 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
7129 arrLength = array.length,
7130 othLength = other.length;
7131
7132 if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
7133 return false;
7134 }
7135 // Check that cyclic values are equal.
7136 var arrStacked = stack.get(array);
7137 var othStacked = stack.get(other);
7138 if (arrStacked && othStacked) {
7139 return arrStacked == other && othStacked == array;
7140 }
7141 var index = -1,
7142 result = true,
7143 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
7144
7145 stack.set(array, other);
7146 stack.set(other, array);
7147
7148 // Ignore non-index properties.
7149 while (++index < arrLength) {
7150 var arrValue = array[index],
7151 othValue = other[index];
7152
7153 if (customizer) {
7154 var compared = isPartial
7155 ? customizer(othValue, arrValue, index, other, array, stack)
7156 : customizer(arrValue, othValue, index, array, other, stack);
7157 }
7158 if (compared !== undefined) {
7159 if (compared) {
7160 continue;
7161 }
7162 result = false;
7163 break;
7164 }
7165 // Recursively compare arrays (susceptible to call stack limits).
7166 if (seen) {
7167 if (!arraySome(other, function(othValue, othIndex) {
7168 if (!cacheHas(seen, othIndex) &&
7169 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
7170 return seen.push(othIndex);
7171 }
7172 })) {
7173 result = false;
7174 break;
7175 }
7176 } else if (!(
7177 arrValue === othValue ||
7178 equalFunc(arrValue, othValue, bitmask, customizer, stack)
7179 )) {
7180 result = false;
7181 break;
7182 }
7183 }
7184 stack['delete'](array);
7185 stack['delete'](other);
7186 return result;
7187 }
7188
7189 /**
7190 * A specialized version of `baseIsEqualDeep` for comparing objects of
7191 * the same `toStringTag`.
7192 *
7193 * **Note:** This function only supports comparing values with tags of
7194 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
7195 *
7196 * @private
7197 * @param {Object} object The object to compare.
7198 * @param {Object} other The other object to compare.
7199 * @param {string} tag The `toStringTag` of the objects to compare.
7200 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
7201 * @param {Function} customizer The function to customize comparisons.
7202 * @param {Function} equalFunc The function to determine equivalents of values.
7203 * @param {Object} stack Tracks traversed `object` and `other` objects.
7204 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
7205 */
7206 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
7207 switch (tag) {
7208 case dataViewTag:
7209 if ((object.byteLength != other.byteLength) ||
7210 (object.byteOffset != other.byteOffset)) {
7211 return false;
7212 }
7213 object = object.buffer;
7214 other = other.buffer;
7215
7216 case arrayBufferTag:
7217 if ((object.byteLength != other.byteLength) ||
7218 !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
7219 return false;
7220 }
7221 return true;
7222
7223 case boolTag:
7224 case dateTag:
7225 case numberTag:
7226 // Coerce booleans to `1` or `0` and dates to milliseconds.
7227 // Invalid dates are coerced to `NaN`.
7228 return eq(+object, +other);
7229
7230 case errorTag:
7231 return object.name == other.name && object.message == other.message;
7232
7233 case regexpTag:
7234 case stringTag:
7235 // Coerce regexes to strings and treat strings, primitives and objects,
7236 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
7237 // for more details.
7238 return object == (other + '');
7239
7240 case mapTag:
7241 var convert = mapToArray;
7242
7243 case setTag:
7244 var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
7245 convert || (convert = setToArray);
7246
7247 if (object.size != other.size && !isPartial) {
7248 return false;
7249 }
7250 // Assume cyclic values are equal.
7251 var stacked = stack.get(object);
7252 if (stacked) {
7253 return stacked == other;
7254 }
7255 bitmask |= COMPARE_UNORDERED_FLAG;
7256
7257 // Recursively compare objects (susceptible to call stack limits).
7258 stack.set(object, other);
7259 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
7260 stack['delete'](object);
7261 return result;
7262
7263 case symbolTag:
7264 if (symbolValueOf) {
7265 return symbolValueOf.call(object) == symbolValueOf.call(other);
7266 }
7267 }
7268 return false;
7269 }
7270
7271 /**
7272 * A specialized version of `baseIsEqualDeep` for objects with support for
7273 * partial deep comparisons.
7274 *
7275 * @private
7276 * @param {Object} object The object to compare.
7277 * @param {Object} other The other object to compare.
7278 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
7279 * @param {Function} customizer The function to customize comparisons.
7280 * @param {Function} equalFunc The function to determine equivalents of values.
7281 * @param {Object} stack Tracks traversed `object` and `other` objects.
7282 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
7283 */
7284 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
7285 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
7286 objProps = getAllKeys(object),
7287 objLength = objProps.length,
7288 othProps = getAllKeys(other),
7289 othLength = othProps.length;
7290
7291 if (objLength != othLength && !isPartial) {
7292 return false;
7293 }
7294 var index = objLength;
7295 while (index--) {
7296 var key = objProps[index];
7297 if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
7298 return false;
7299 }
7300 }
7301 // Check that cyclic values are equal.
7302 var objStacked = stack.get(object);
7303 var othStacked = stack.get(other);
7304 if (objStacked && othStacked) {
7305 return objStacked == other && othStacked == object;
7306 }
7307 var result = true;
7308 stack.set(object, other);
7309 stack.set(other, object);
7310
7311 var skipCtor = isPartial;
7312 while (++index < objLength) {
7313 key = objProps[index];
7314 var objValue = object[key],
7315 othValue = other[key];
7316
7317 if (customizer) {
7318 var compared = isPartial
7319 ? customizer(othValue, objValue, key, other, object, stack)
7320 : customizer(objValue, othValue, key, object, other, stack);
7321 }
7322 // Recursively compare objects (susceptible to call stack limits).
7323 if (!(compared === undefined
7324 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
7325 : compared
7326 )) {
7327 result = false;
7328 break;
7329 }
7330 skipCtor || (skipCtor = key == 'constructor');
7331 }
7332 if (result && !skipCtor) {
7333 var objCtor = object.constructor,
7334 othCtor = other.constructor;
7335
7336 // Non `Object` object instances with different constructors are not equal.
7337 if (objCtor != othCtor &&
7338 ('constructor' in object && 'constructor' in other) &&
7339 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
7340 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
7341 result = false;
7342 }
7343 }
7344 stack['delete'](object);
7345 stack['delete'](other);
7346 return result;
7347 }
7348
7349 /**
7350 * A specialized version of `baseRest` which flattens the rest array.
7351 *
7352 * @private
7353 * @param {Function} func The function to apply a rest parameter to.
7354 * @returns {Function} Returns the new function.
7355 */
7356 function flatRest(func) {
7357 return setToString(overRest(func, undefined, flatten), func + '');
7358 }
7359
7360 /**
7361 * Creates an array of own enumerable property names and symbols of `object`.
7362 *
7363 * @private
7364 * @param {Object} object The object to query.
7365 * @returns {Array} Returns the array of property names and symbols.
7366 */
7367 function getAllKeys(object) {
7368 return baseGetAllKeys(object, keys, getSymbols);
7369 }
7370
7371 /**
7372 * Creates an array of own and inherited enumerable property names and
7373 * symbols of `object`.
7374 *
7375 * @private
7376 * @param {Object} object The object to query.
7377 * @returns {Array} Returns the array of property names and symbols.
7378 */
7379 function getAllKeysIn(object) {
7380 return baseGetAllKeys(object, keysIn, getSymbolsIn);
7381 }
7382
7383 /**
7384 * Gets metadata for `func`.
7385 *
7386 * @private
7387 * @param {Function} func The function to query.
7388 * @returns {*} Returns the metadata for `func`.
7389 */
7390 var getData = !metaMap ? noop : function(func) {
7391 return metaMap.get(func);
7392 };
7393
7394 /**
7395 * Gets the name of `func`.
7396 *
7397 * @private
7398 * @param {Function} func The function to query.
7399 * @returns {string} Returns the function name.
7400 */
7401 function getFuncName(func) {
7402 var result = (func.name + ''),
7403 array = realNames[result],
7404 length = hasOwnProperty.call(realNames, result) ? array.length : 0;
7405
7406 while (length--) {
7407 var data = array[length],
7408 otherFunc = data.func;
7409 if (otherFunc == null || otherFunc == func) {
7410 return data.name;
7411 }
7412 }
7413 return result;
7414 }
7415
7416 /**
7417 * Gets the argument placeholder value for `func`.
7418 *
7419 * @private
7420 * @param {Function} func The function to inspect.
7421 * @returns {*} Returns the placeholder value.
7422 */
7423 function getHolder(func) {
7424 var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
7425 return object.placeholder;
7426 }
7427
7428 /**
7429 * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
7430 * this function returns the custom method, otherwise it returns `baseIteratee`.
7431 * If arguments are provided, the chosen function is invoked with them and
7432 * its result is returned.
7433 *
7434 * @private
7435 * @param {*} [value] The value to convert to an iteratee.
7436 * @param {number} [arity] The arity of the created iteratee.
7437 * @returns {Function} Returns the chosen function or its result.
7438 */
7439 function getIteratee() {
7440 var result = lodash.iteratee || iteratee;
7441 result = result === iteratee ? baseIteratee : result;
7442 return arguments.length ? result(arguments[0], arguments[1]) : result;
7443 }
7444
7445 /**
7446 * Gets the data for `map`.
7447 *
7448 * @private
7449 * @param {Object} map The map to query.
7450 * @param {string} key The reference key.
7451 * @returns {*} Returns the map data.
7452 */
7453 function getMapData(map, key) {
7454 var data = map.__data__;
7455 return isKeyable(key)
7456 ? data[typeof key == 'string' ? 'string' : 'hash']
7457 : data.map;
7458 }
7459
7460 /**
7461 * Gets the property names, values, and compare flags of `object`.
7462 *
7463 * @private
7464 * @param {Object} object The object to query.
7465 * @returns {Array} Returns the match data of `object`.
7466 */
7467 function getMatchData(object) {
7468 var result = keys(object),
7469 length = result.length;
7470
7471 while (length--) {
7472 var key = result[length],
7473 value = object[key];
7474
7475 result[length] = [key, value, isStrictComparable(value)];
7476 }
7477 return result;
7478 }
7479
7480 /**
7481 * Gets the native function at `key` of `object`.
7482 *
7483 * @private
7484 * @param {Object} object The object to query.
7485 * @param {string} key The key of the method to get.
7486 * @returns {*} Returns the function if it's native, else `undefined`.
7487 */
7488 function getNative(object, key) {
7489 var value = getValue(object, key);
7490 return baseIsNative(value) ? value : undefined;
7491 }
7492
7493 /**
7494 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
7495 *
7496 * @private
7497 * @param {*} value The value to query.
7498 * @returns {string} Returns the raw `toStringTag`.
7499 */
7500 function getRawTag(value) {
7501 var isOwn = hasOwnProperty.call(value, symToStringTag),
7502 tag = value[symToStringTag];
7503
7504 try {
7505 value[symToStringTag] = undefined;
7506 var unmasked = true;
7507 } catch (e) {}
7508
7509 var result = nativeObjectToString.call(value);
7510 if (unmasked) {
7511 if (isOwn) {
7512 value[symToStringTag] = tag;
7513 } else {
7514 delete value[symToStringTag];
7515 }
7516 }
7517 return result;
7518 }
7519
7520 /**
7521 * Creates an array of the own enumerable symbols of `object`.
7522 *
7523 * @private
7524 * @param {Object} object The object to query.
7525 * @returns {Array} Returns the array of symbols.
7526 */
7527 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
7528 if (object == null) {
7529 return [];
7530 }
7531 object = Object(object);
7532 return arrayFilter(nativeGetSymbols(object), function(symbol) {
7533 return propertyIsEnumerable.call(object, symbol);
7534 });
7535 };
7536
7537 /**
7538 * Creates an array of the own and inherited enumerable symbols of `object`.
7539 *
7540 * @private
7541 * @param {Object} object The object to query.
7542 * @returns {Array} Returns the array of symbols.
7543 */
7544 var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
7545 var result = [];
7546 while (object) {
7547 arrayPush(result, getSymbols(object));
7548 object = getPrototype(object);
7549 }
7550 return result;
7551 };
7552
7553 /**
7554 * Gets the `toStringTag` of `value`.
7555 *
7556 * @private
7557 * @param {*} value The value to query.
7558 * @returns {string} Returns the `toStringTag`.
7559 */
7560 var getTag = baseGetTag;
7561
7562 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
7563 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
7564 (Map && getTag(new Map) != mapTag) ||
7565 (Promise && getTag(Promise.resolve()) != promiseTag) ||
7566 (Set && getTag(new Set) != setTag) ||
7567 (WeakMap && getTag(new WeakMap) != weakMapTag)) {
7568 getTag = function(value) {
7569 var result = baseGetTag(value),
7570 Ctor = result == objectTag ? value.constructor : undefined,
7571 ctorString = Ctor ? toSource(Ctor) : '';
7572
7573 if (ctorString) {
7574 switch (ctorString) {
7575 case dataViewCtorString: return dataViewTag;
7576 case mapCtorString: return mapTag;
7577 case promiseCtorString: return promiseTag;
7578 case setCtorString: return setTag;
7579 case weakMapCtorString: return weakMapTag;
7580 }
7581 }
7582 return result;
7583 };
7584 }
7585
7586 /**
7587 * Gets the view, applying any `transforms` to the `start` and `end` positions.
7588 *
7589 * @private
7590 * @param {number} start The start of the view.
7591 * @param {number} end The end of the view.
7592 * @param {Array} transforms The transformations to apply to the view.
7593 * @returns {Object} Returns an object containing the `start` and `end`
7594 * positions of the view.
7595 */
7596 function getView(start, end, transforms) {
7597 var index = -1,
7598 length = transforms.length;
7599
7600 while (++index < length) {
7601 var data = transforms[index],
7602 size = data.size;
7603
7604 switch (data.type) {
7605 case 'drop': start += size; break;
7606 case 'dropRight': end -= size; break;
7607 case 'take': end = nativeMin(end, start + size); break;
7608 case 'takeRight': start = nativeMax(start, end - size); break;
7609 }
7610 }
7611 return { 'start': start, 'end': end };
7612 }
7613
7614 /**
7615 * Extracts wrapper details from the `source` body comment.
7616 *
7617 * @private
7618 * @param {string} source The source to inspect.
7619 * @returns {Array} Returns the wrapper details.
7620 */
7621 function getWrapDetails(source) {
7622 var match = source.match(reWrapDetails);
7623 return match ? match[1].split(reSplitDetails) : [];
7624 }
7625
7626 /**
7627 * Checks if `path` exists on `object`.
7628 *
7629 * @private
7630 * @param {Object} object The object to query.
7631 * @param {Array|string} path The path to check.
7632 * @param {Function} hasFunc The function to check properties.
7633 * @returns {boolean} Returns `true` if `path` exists, else `false`.
7634 */
7635 function hasPath(object, path, hasFunc) {
7636 path = castPath(path, object);
7637
7638 var index = -1,
7639 length = path.length,
7640 result = false;
7641
7642 while (++index < length) {
7643 var key = toKey(path[index]);
7644 if (!(result = object != null && hasFunc(object, key))) {
7645 break;
7646 }
7647 object = object[key];
7648 }
7649 if (result || ++index != length) {
7650 return result;
7651 }
7652 length = object == null ? 0 : object.length;
7653 return !!length && isLength(length) && isIndex(key, length) &&
7654 (isArray(object) || isArguments(object));
7655 }
7656
7657 /**
7658 * Initializes an array clone.
7659 *
7660 * @private
7661 * @param {Array} array The array to clone.
7662 * @returns {Array} Returns the initialized clone.
7663 */
7664 function initCloneArray(array) {
7665 var length = array.length,
7666 result = new array.constructor(length);
7667
7668 // Add properties assigned by `RegExp#exec`.
7669 if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
7670 result.index = array.index;
7671 result.input = array.input;
7672 }
7673 return result;
7674 }
7675
7676 /**
7677 * Initializes an object clone.
7678 *
7679 * @private
7680 * @param {Object} object The object to clone.
7681 * @returns {Object} Returns the initialized clone.
7682 */
7683 function initCloneObject(object) {
7684 return (typeof object.constructor == 'function' && !isPrototype(object))
7685 ? baseCreate(getPrototype(object))
7686 : {};
7687 }
7688
7689 /**
7690 * Initializes an object clone based on its `toStringTag`.
7691 *
7692 * **Note:** This function only supports cloning values with tags of
7693 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
7694 *
7695 * @private
7696 * @param {Object} object The object to clone.
7697 * @param {string} tag The `toStringTag` of the object to clone.
7698 * @param {boolean} [isDeep] Specify a deep clone.
7699 * @returns {Object} Returns the initialized clone.
7700 */
7701 function initCloneByTag(object, tag, isDeep) {
7702 var Ctor = object.constructor;
7703 switch (tag) {
7704 case arrayBufferTag:
7705 return cloneArrayBuffer(object);
7706
7707 case boolTag:
7708 case dateTag:
7709 return new Ctor(+object);
7710
7711 case dataViewTag:
7712 return cloneDataView(object, isDeep);
7713
7714 case float32Tag: case float64Tag:
7715 case int8Tag: case int16Tag: case int32Tag:
7716 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
7717 return cloneTypedArray(object, isDeep);
7718
7719 case mapTag:
7720 return new Ctor;
7721
7722 case numberTag:
7723 case stringTag:
7724 return new Ctor(object);
7725
7726 case regexpTag:
7727 return cloneRegExp(object);
7728
7729 case setTag:
7730 return new Ctor;
7731
7732 case symbolTag:
7733 return cloneSymbol(object);
7734 }
7735 }
7736
7737 /**
7738 * Inserts wrapper `details` in a comment at the top of the `source` body.
7739 *
7740 * @private
7741 * @param {string} source The source to modify.
7742 * @returns {Array} details The details to insert.
7743 * @returns {string} Returns the modified source.
7744 */
7745 function insertWrapDetails(source, details) {
7746 var length = details.length;
7747 if (!length) {
7748 return source;
7749 }
7750 var lastIndex = length - 1;
7751 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
7752 details = details.join(length > 2 ? ', ' : ' ');
7753 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
7754 }
7755
7756 /**
7757 * Checks if `value` is a flattenable `arguments` object or array.
7758 *
7759 * @private
7760 * @param {*} value The value to check.
7761 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
7762 */
7763 function isFlattenable(value) {
7764 return isArray(value) || isArguments(value) ||
7765 !!(spreadableSymbol && value && value[spreadableSymbol]);
7766 }
7767
7768 /**
7769 * Checks if `value` is a valid array-like index.
7770 *
7771 * @private
7772 * @param {*} value The value to check.
7773 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
7774 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
7775 */
7776 function isIndex(value, length) {
7777 var type = typeof value;
7778 length = length == null ? MAX_SAFE_INTEGER : length;
7779
7780 return !!length &&
7781 (type == 'number' ||
7782 (type != 'symbol' && reIsUint.test(value))) &&
7783 (value > -1 && value % 1 == 0 && value < length);
7784 }
7785
7786 /**
7787 * Checks if the given arguments are from an iteratee call.
7788 *
7789 * @private
7790 * @param {*} value The potential iteratee value argument.
7791 * @param {*} index The potential iteratee index or key argument.
7792 * @param {*} object The potential iteratee object argument.
7793 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
7794 * else `false`.
7795 */
7796 function isIterateeCall(value, index, object) {
7797 if (!isObject(object)) {
7798 return false;
7799 }
7800 var type = typeof index;
7801 if (type == 'number'
7802 ? (isArrayLike(object) && isIndex(index, object.length))
7803 : (type == 'string' && index in object)
7804 ) {
7805 return eq(object[index], value);
7806 }
7807 return false;
7808 }
7809
7810 /**
7811 * Checks if `value` is a property name and not a property path.
7812 *
7813 * @private
7814 * @param {*} value The value to check.
7815 * @param {Object} [object] The object to query keys on.
7816 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
7817 */
7818 function isKey(value, object) {
7819 if (isArray(value)) {
7820 return false;
7821 }
7822 var type = typeof value;
7823 if (type == 'number' || type == 'symbol' || type == 'boolean' ||
7824 value == null || isSymbol(value)) {
7825 return true;
7826 }
7827 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
7828 (object != null && value in Object(object));
7829 }
7830
7831 /**
7832 * Checks if `value` is suitable for use as unique object key.
7833 *
7834 * @private
7835 * @param {*} value The value to check.
7836 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
7837 */
7838 function isKeyable(value) {
7839 var type = typeof value;
7840 return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
7841 ? (value !== '__proto__')
7842 : (value === null);
7843 }
7844
7845 /**
7846 * Checks if `func` has a lazy counterpart.
7847 *
7848 * @private
7849 * @param {Function} func The function to check.
7850 * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
7851 * else `false`.
7852 */
7853 function isLaziable(func) {
7854 var funcName = getFuncName(func),
7855 other = lodash[funcName];
7856
7857 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
7858 return false;
7859 }
7860 if (func === other) {
7861 return true;
7862 }
7863 var data = getData(other);
7864 return !!data && func === data[0];
7865 }
7866
7867 /**
7868 * Checks if `func` has its source masked.
7869 *
7870 * @private
7871 * @param {Function} func The function to check.
7872 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
7873 */
7874 function isMasked(func) {
7875 return !!maskSrcKey && (maskSrcKey in func);
7876 }
7877
7878 /**
7879 * Checks if `func` is capable of being masked.
7880 *
7881 * @private
7882 * @param {*} value The value to check.
7883 * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
7884 */
7885 var isMaskable = coreJsData ? isFunction : stubFalse;
7886
7887 /**
7888 * Checks if `value` is likely a prototype object.
7889 *
7890 * @private
7891 * @param {*} value The value to check.
7892 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
7893 */
7894 function isPrototype(value) {
7895 var Ctor = value && value.constructor,
7896 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
7897
7898 return value === proto;
7899 }
7900
7901 /**
7902 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
7903 *
7904 * @private
7905 * @param {*} value The value to check.
7906 * @returns {boolean} Returns `true` if `value` if suitable for strict
7907 * equality comparisons, else `false`.
7908 */
7909 function isStrictComparable(value) {
7910 return value === value && !isObject(value);
7911 }
7912
7913 /**
7914 * A specialized version of `matchesProperty` for source values suitable
7915 * for strict equality comparisons, i.e. `===`.
7916 *
7917 * @private
7918 * @param {string} key The key of the property to get.
7919 * @param {*} srcValue The value to match.
7920 * @returns {Function} Returns the new spec function.
7921 */
7922 function matchesStrictComparable(key, srcValue) {
7923 return function(object) {
7924 if (object == null) {
7925 return false;
7926 }
7927 return object[key] === srcValue &&
7928 (srcValue !== undefined || (key in Object(object)));
7929 };
7930 }
7931
7932 /**
7933 * A specialized version of `_.memoize` which clears the memoized function's
7934 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
7935 *
7936 * @private
7937 * @param {Function} func The function to have its output memoized.
7938 * @returns {Function} Returns the new memoized function.
7939 */
7940 function memoizeCapped(func) {
7941 var result = memoize(func, function(key) {
7942 if (cache.size === MAX_MEMOIZE_SIZE) {
7943 cache.clear();
7944 }
7945 return key;
7946 });
7947
7948 var cache = result.cache;
7949 return result;
7950 }
7951
7952 /**
7953 * Merges the function metadata of `source` into `data`.
7954 *
7955 * Merging metadata reduces the number of wrappers used to invoke a function.
7956 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
7957 * may be applied regardless of execution order. Methods like `_.ary` and
7958 * `_.rearg` modify function arguments, making the order in which they are
7959 * executed important, preventing the merging of metadata. However, we make
7960 * an exception for a safe combined case where curried functions have `_.ary`
7961 * and or `_.rearg` applied.
7962 *
7963 * @private
7964 * @param {Array} data The destination metadata.
7965 * @param {Array} source The source metadata.
7966 * @returns {Array} Returns `data`.
7967 */
7968 function mergeData(data, source) {
7969 var bitmask = data[1],
7970 srcBitmask = source[1],
7971 newBitmask = bitmask | srcBitmask,
7972 isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
7973
7974 var isCombo =
7975 ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
7976 ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
7977 ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
7978
7979 // Exit early if metadata can't be merged.
7980 if (!(isCommon || isCombo)) {
7981 return data;
7982 }
7983 // Use source `thisArg` if available.
7984 if (srcBitmask & WRAP_BIND_FLAG) {
7985 data[2] = source[2];
7986 // Set when currying a bound function.
7987 newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
7988 }
7989 // Compose partial arguments.
7990 var value = source[3];
7991 if (value) {
7992 var partials = data[3];
7993 data[3] = partials ? composeArgs(partials, value, source[4]) : value;
7994 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
7995 }
7996 // Compose partial right arguments.
7997 value = source[5];
7998 if (value) {
7999 partials = data[5];
8000 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
8001 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
8002 }
8003 // Use source `argPos` if available.
8004 value = source[7];
8005 if (value) {
8006 data[7] = value;
8007 }
8008 // Use source `ary` if it's smaller.
8009 if (srcBitmask & WRAP_ARY_FLAG) {
8010 data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
8011 }
8012 // Use source `arity` if one is not provided.
8013 if (data[9] == null) {
8014 data[9] = source[9];
8015 }
8016 // Use source `func` and merge bitmasks.
8017 data[0] = source[0];
8018 data[1] = newBitmask;
8019
8020 return data;
8021 }
8022
8023 /**
8024 * This function is like
8025 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
8026 * except that it includes inherited enumerable properties.
8027 *
8028 * @private
8029 * @param {Object} object The object to query.
8030 * @returns {Array} Returns the array of property names.
8031 */
8032 function nativeKeysIn(object) {
8033 var result = [];
8034 if (object != null) {
8035 for (var key in Object(object)) {
8036 result.push(key);
8037 }
8038 }
8039 return result;
8040 }
8041
8042 /**
8043 * Converts `value` to a string using `Object.prototype.toString`.
8044 *
8045 * @private
8046 * @param {*} value The value to convert.
8047 * @returns {string} Returns the converted string.
8048 */
8049 function objectToString(value) {
8050 return nativeObjectToString.call(value);
8051 }
8052
8053 /**
8054 * A specialized version of `baseRest` which transforms the rest array.
8055 *
8056 * @private
8057 * @param {Function} func The function to apply a rest parameter to.
8058 * @param {number} [start=func.length-1] The start position of the rest parameter.
8059 * @param {Function} transform The rest array transform.
8060 * @returns {Function} Returns the new function.
8061 */
8062 function overRest(func, start, transform) {
8063 start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
8064 return function() {
8065 var args = arguments,
8066 index = -1,
8067 length = nativeMax(args.length - start, 0),
8068 array = Array(length);
8069
8070 while (++index < length) {
8071 array[index] = args[start + index];
8072 }
8073 index = -1;
8074 var otherArgs = Array(start + 1);
8075 while (++index < start) {
8076 otherArgs[index] = args[index];
8077 }
8078 otherArgs[start] = transform(array);
8079 return apply(func, this, otherArgs);
8080 };
8081 }
8082
8083 /**
8084 * Gets the parent value at `path` of `object`.
8085 *
8086 * @private
8087 * @param {Object} object The object to query.
8088 * @param {Array} path The path to get the parent value of.
8089 * @returns {*} Returns the parent value.
8090 */
8091 function parent(object, path) {
8092 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
8093 }
8094
8095 /**
8096 * Reorder `array` according to the specified indexes where the element at
8097 * the first index is assigned as the first element, the element at
8098 * the second index is assigned as the second element, and so on.
8099 *
8100 * @private
8101 * @param {Array} array The array to reorder.
8102 * @param {Array} indexes The arranged array indexes.
8103 * @returns {Array} Returns `array`.
8104 */
8105 function reorder(array, indexes) {
8106 var arrLength = array.length,
8107 length = nativeMin(indexes.length, arrLength),
8108 oldArray = copyArray(array);
8109
8110 while (length--) {
8111 var index = indexes[length];
8112 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
8113 }
8114 return array;
8115 }
8116
8117 /**
8118 * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
8119 *
8120 * @private
8121 * @param {Object} object The object to query.
8122 * @param {string} key The key of the property to get.
8123 * @returns {*} Returns the property value.
8124 */
8125 function safeGet(object, key) {
8126 if (key === 'constructor' && typeof object[key] === 'function') {
8127 return;
8128 }
8129
8130 if (key == '__proto__') {
8131 return;
8132 }
8133
8134 return object[key];
8135 }
8136
8137 /**
8138 * Sets metadata for `func`.
8139 *
8140 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
8141 * period of time, it will trip its breaker and transition to an identity
8142 * function to avoid garbage collection pauses in V8. See
8143 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
8144 * for more details.
8145 *
8146 * @private
8147 * @param {Function} func The function to associate metadata with.
8148 * @param {*} data The metadata.
8149 * @returns {Function} Returns `func`.
8150 */
8151 var setData = shortOut(baseSetData);
8152
8153 /**
8154 * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
8155 *
8156 * @private
8157 * @param {Function} func The function to delay.
8158 * @param {number} wait The number of milliseconds to delay invocation.
8159 * @returns {number|Object} Returns the timer id or timeout object.
8160 */
8161 var setTimeout = ctxSetTimeout || function(func, wait) {
8162 return root.setTimeout(func, wait);
8163 };
8164
8165 /**
8166 * Sets the `toString` method of `func` to return `string`.
8167 *
8168 * @private
8169 * @param {Function} func The function to modify.
8170 * @param {Function} string The `toString` result.
8171 * @returns {Function} Returns `func`.
8172 */
8173 var setToString = shortOut(baseSetToString);
8174
8175 /**
8176 * Sets the `toString` method of `wrapper` to mimic the source of `reference`
8177 * with wrapper details in a comment at the top of the source body.
8178 *
8179 * @private
8180 * @param {Function} wrapper The function to modify.
8181 * @param {Function} reference The reference function.
8182 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
8183 * @returns {Function} Returns `wrapper`.
8184 */
8185 function setWrapToString(wrapper, reference, bitmask) {
8186 var source = (reference + '');
8187 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
8188 }
8189
8190 /**
8191 * Creates a function that'll short out and invoke `identity` instead
8192 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
8193 * milliseconds.
8194 *
8195 * @private
8196 * @param {Function} func The function to restrict.
8197 * @returns {Function} Returns the new shortable function.
8198 */
8199 function shortOut(func) {
8200 var count = 0,
8201 lastCalled = 0;
8202
8203 return function() {
8204 var stamp = nativeNow(),
8205 remaining = HOT_SPAN - (stamp - lastCalled);
8206
8207 lastCalled = stamp;
8208 if (remaining > 0) {
8209 if (++count >= HOT_COUNT) {
8210 return arguments[0];
8211 }
8212 } else {
8213 count = 0;
8214 }
8215 return func.apply(undefined, arguments);
8216 };
8217 }
8218
8219 /**
8220 * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
8221 *
8222 * @private
8223 * @param {Array} array The array to shuffle.
8224 * @param {number} [size=array.length] The size of `array`.
8225 * @returns {Array} Returns `array`.
8226 */
8227 function shuffleSelf(array, size) {
8228 var index = -1,
8229 length = array.length,
8230 lastIndex = length - 1;
8231
8232 size = size === undefined ? length : size;
8233 while (++index < size) {
8234 var rand = baseRandom(index, lastIndex),
8235 value = array[rand];
8236
8237 array[rand] = array[index];
8238 array[index] = value;
8239 }
8240 array.length = size;
8241 return array;
8242 }
8243
8244 /**
8245 * Converts `string` to a property path array.
8246 *
8247 * @private
8248 * @param {string} string The string to convert.
8249 * @returns {Array} Returns the property path array.
8250 */
8251 var stringToPath = memoizeCapped(function(string) {
8252 var result = [];
8253 if (string.charCodeAt(0) === 46 /* . */) {
8254 result.push('');
8255 }
8256 string.replace(rePropName, function(match, number, quote, subString) {
8257 result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
8258 });
8259 return result;
8260 });
8261
8262 /**
8263 * Converts `value` to a string key if it's not a string or symbol.
8264 *
8265 * @private
8266 * @param {*} value The value to inspect.
8267 * @returns {string|symbol} Returns the key.
8268 */
8269 function toKey(value) {
8270 if (typeof value == 'string' || isSymbol(value)) {
8271 return value;
8272 }
8273 var result = (value + '');
8274 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
8275 }
8276
8277 /**
8278 * Converts `func` to its source code.
8279 *
8280 * @private
8281 * @param {Function} func The function to convert.
8282 * @returns {string} Returns the source code.
8283 */
8284 function toSource(func) {
8285 if (func != null) {
8286 try {
8287 return funcToString.call(func);
8288 } catch (e) {}
8289 try {
8290 return (func + '');
8291 } catch (e) {}
8292 }
8293 return '';
8294 }
8295
8296 /**
8297 * Updates wrapper `details` based on `bitmask` flags.
8298 *
8299 * @private
8300 * @returns {Array} details The details to modify.
8301 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
8302 * @returns {Array} Returns `details`.
8303 */
8304 function updateWrapDetails(details, bitmask) {
8305 arrayEach(wrapFlags, function(pair) {
8306 var value = '_.' + pair[0];
8307 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
8308 details.push(value);
8309 }
8310 });
8311 return details.sort();
8312 }
8313
8314 /**
8315 * Creates a clone of `wrapper`.
8316 *
8317 * @private
8318 * @param {Object} wrapper The wrapper to clone.
8319 * @returns {Object} Returns the cloned wrapper.
8320 */
8321 function wrapperClone(wrapper) {
8322 if (wrapper instanceof LazyWrapper) {
8323 return wrapper.clone();
8324 }
8325 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
8326 result.__actions__ = copyArray(wrapper.__actions__);
8327 result.__index__ = wrapper.__index__;
8328 result.__values__ = wrapper.__values__;
8329 return result;
8330 }
8331
8332 /*------------------------------------------------------------------------*/
8333
8334 /**
8335 * Creates an array of elements split into groups the length of `size`.
8336 * If `array` can't be split evenly, the final chunk will be the remaining
8337 * elements.
8338 *
8339 * @static
8340 * @memberOf _
8341 * @since 3.0.0
8342 * @category Array
8343 * @param {Array} array The array to process.
8344 * @param {number} [size=1] The length of each chunk
8345 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8346 * @returns {Array} Returns the new array of chunks.
8347 * @example
8348 *
8349 * _.chunk(['a', 'b', 'c', 'd'], 2);
8350 * // => [['a', 'b'], ['c', 'd']]
8351 *
8352 * _.chunk(['a', 'b', 'c', 'd'], 3);
8353 * // => [['a', 'b', 'c'], ['d']]
8354 */
8355 function chunk(array, size, guard) {
8356 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
8357 size = 1;
8358 } else {
8359 size = nativeMax(toInteger(size), 0);
8360 }
8361 var length = array == null ? 0 : array.length;
8362 if (!length || size < 1) {
8363 return [];
8364 }
8365 var index = 0,
8366 resIndex = 0,
8367 result = Array(nativeCeil(length / size));
8368
8369 while (index < length) {
8370 result[resIndex++] = baseSlice(array, index, (index += size));
8371 }
8372 return result;
8373 }
8374
8375 /**
8376 * Creates an array with all falsey values removed. The values `false`, `null`,
8377 * `0`, `""`, `undefined`, and `NaN` are falsey.
8378 *
8379 * @static
8380 * @memberOf _
8381 * @since 0.1.0
8382 * @category Array
8383 * @param {Array} array The array to compact.
8384 * @returns {Array} Returns the new array of filtered values.
8385 * @example
8386 *
8387 * _.compact([0, 1, false, 2, '', 3]);
8388 * // => [1, 2, 3]
8389 */
8390 function compact(array) {
8391 var index = -1,
8392 length = array == null ? 0 : array.length,
8393 resIndex = 0,
8394 result = [];
8395
8396 while (++index < length) {
8397 var value = array[index];
8398 if (value) {
8399 result[resIndex++] = value;
8400 }
8401 }
8402 return result;
8403 }
8404
8405 /**
8406 * Creates a new array concatenating `array` with any additional arrays
8407 * and/or values.
8408 *
8409 * @static
8410 * @memberOf _
8411 * @since 4.0.0
8412 * @category Array
8413 * @param {Array} array The array to concatenate.
8414 * @param {...*} [values] The values to concatenate.
8415 * @returns {Array} Returns the new concatenated array.
8416 * @example
8417 *
8418 * var array = [1];
8419 * var other = _.concat(array, 2, [3], [[4]]);
8420 *
8421 * console.log(other);
8422 * // => [1, 2, 3, [4]]
8423 *
8424 * console.log(array);
8425 * // => [1]
8426 */
8427 function concat() {
8428 var length = arguments.length;
8429 if (!length) {
8430 return [];
8431 }
8432 var args = Array(length - 1),
8433 array = arguments[0],
8434 index = length;
8435
8436 while (index--) {
8437 args[index - 1] = arguments[index];
8438 }
8439 return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
8440 }
8441
8442 /**
8443 * Creates an array of `array` values not included in the other given arrays
8444 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8445 * for equality comparisons. The order and references of result values are
8446 * determined by the first array.
8447 *
8448 * **Note:** Unlike `_.pullAll`, this method returns a new array.
8449 *
8450 * @static
8451 * @memberOf _
8452 * @since 0.1.0
8453 * @category Array
8454 * @param {Array} array The array to inspect.
8455 * @param {...Array} [values] The values to exclude.
8456 * @returns {Array} Returns the new array of filtered values.
8457 * @see _.without, _.xor
8458 * @example
8459 *
8460 * _.difference([2, 1], [2, 3]);
8461 * // => [1]
8462 */
8463 var difference = baseRest(function(array, values) {
8464 return isArrayLikeObject(array)
8465 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
8466 : [];
8467 });
8468
8469 /**
8470 * This method is like `_.difference` except that it accepts `iteratee` which
8471 * is invoked for each element of `array` and `values` to generate the criterion
8472 * by which they're compared. The order and references of result values are
8473 * determined by the first array. The iteratee is invoked with one argument:
8474 * (value).
8475 *
8476 * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
8477 *
8478 * @static
8479 * @memberOf _
8480 * @since 4.0.0
8481 * @category Array
8482 * @param {Array} array The array to inspect.
8483 * @param {...Array} [values] The values to exclude.
8484 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8485 * @returns {Array} Returns the new array of filtered values.
8486 * @example
8487 *
8488 * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
8489 * // => [1.2]
8490 *
8491 * // The `_.property` iteratee shorthand.
8492 * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
8493 * // => [{ 'x': 2 }]
8494 */
8495 var differenceBy = baseRest(function(array, values) {
8496 var iteratee = last(values);
8497 if (isArrayLikeObject(iteratee)) {
8498 iteratee = undefined;
8499 }
8500 return isArrayLikeObject(array)
8501 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
8502 : [];
8503 });
8504
8505 /**
8506 * This method is like `_.difference` except that it accepts `comparator`
8507 * which is invoked to compare elements of `array` to `values`. The order and
8508 * references of result values are determined by the first array. The comparator
8509 * is invoked with two arguments: (arrVal, othVal).
8510 *
8511 * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
8512 *
8513 * @static
8514 * @memberOf _
8515 * @since 4.0.0
8516 * @category Array
8517 * @param {Array} array The array to inspect.
8518 * @param {...Array} [values] The values to exclude.
8519 * @param {Function} [comparator] The comparator invoked per element.
8520 * @returns {Array} Returns the new array of filtered values.
8521 * @example
8522 *
8523 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8524 *
8525 * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
8526 * // => [{ 'x': 2, 'y': 1 }]
8527 */
8528 var differenceWith = baseRest(function(array, values) {
8529 var comparator = last(values);
8530 if (isArrayLikeObject(comparator)) {
8531 comparator = undefined;
8532 }
8533 return isArrayLikeObject(array)
8534 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
8535 : [];
8536 });
8537
8538 /**
8539 * Creates a slice of `array` with `n` elements dropped from the beginning.
8540 *
8541 * @static
8542 * @memberOf _
8543 * @since 0.5.0
8544 * @category Array
8545 * @param {Array} array The array to query.
8546 * @param {number} [n=1] The number of elements to drop.
8547 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8548 * @returns {Array} Returns the slice of `array`.
8549 * @example
8550 *
8551 * _.drop([1, 2, 3]);
8552 * // => [2, 3]
8553 *
8554 * _.drop([1, 2, 3], 2);
8555 * // => [3]
8556 *
8557 * _.drop([1, 2, 3], 5);
8558 * // => []
8559 *
8560 * _.drop([1, 2, 3], 0);
8561 * // => [1, 2, 3]
8562 */
8563 function drop(array, n, guard) {
8564 var length = array == null ? 0 : array.length;
8565 if (!length) {
8566 return [];
8567 }
8568 n = (guard || n === undefined) ? 1 : toInteger(n);
8569 return baseSlice(array, n < 0 ? 0 : n, length);
8570 }
8571
8572 /**
8573 * Creates a slice of `array` with `n` elements dropped from the end.
8574 *
8575 * @static
8576 * @memberOf _
8577 * @since 3.0.0
8578 * @category Array
8579 * @param {Array} array The array to query.
8580 * @param {number} [n=1] The number of elements to drop.
8581 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8582 * @returns {Array} Returns the slice of `array`.
8583 * @example
8584 *
8585 * _.dropRight([1, 2, 3]);
8586 * // => [1, 2]
8587 *
8588 * _.dropRight([1, 2, 3], 2);
8589 * // => [1]
8590 *
8591 * _.dropRight([1, 2, 3], 5);
8592 * // => []
8593 *
8594 * _.dropRight([1, 2, 3], 0);
8595 * // => [1, 2, 3]
8596 */
8597 function dropRight(array, n, guard) {
8598 var length = array == null ? 0 : array.length;
8599 if (!length) {
8600 return [];
8601 }
8602 n = (guard || n === undefined) ? 1 : toInteger(n);
8603 n = length - n;
8604 return baseSlice(array, 0, n < 0 ? 0 : n);
8605 }
8606
8607 /**
8608 * Creates a slice of `array` excluding elements dropped from the end.
8609 * Elements are dropped until `predicate` returns falsey. The predicate is
8610 * invoked with three arguments: (value, index, array).
8611 *
8612 * @static
8613 * @memberOf _
8614 * @since 3.0.0
8615 * @category Array
8616 * @param {Array} array The array to query.
8617 * @param {Function} [predicate=_.identity] The function invoked per iteration.
8618 * @returns {Array} Returns the slice of `array`.
8619 * @example
8620 *
8621 * var users = [
8622 * { 'user': 'barney', 'active': true },
8623 * { 'user': 'fred', 'active': false },
8624 * { 'user': 'pebbles', 'active': false }
8625 * ];
8626 *
8627 * _.dropRightWhile(users, function(o) { return !o.active; });
8628 * // => objects for ['barney']
8629 *
8630 * // The `_.matches` iteratee shorthand.
8631 * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
8632 * // => objects for ['barney', 'fred']
8633 *
8634 * // The `_.matchesProperty` iteratee shorthand.
8635 * _.dropRightWhile(users, ['active', false]);
8636 * // => objects for ['barney']
8637 *
8638 * // The `_.property` iteratee shorthand.
8639 * _.dropRightWhile(users, 'active');
8640 * // => objects for ['barney', 'fred', 'pebbles']
8641 */
8642 function dropRightWhile(array, predicate) {
8643 return (array && array.length)
8644 ? baseWhile(array, getIteratee(predicate, 3), true, true)
8645 : [];
8646 }
8647
8648 /**
8649 * Creates a slice of `array` excluding elements dropped from the beginning.
8650 * Elements are dropped until `predicate` returns falsey. The predicate is
8651 * invoked with three arguments: (value, index, array).
8652 *
8653 * @static
8654 * @memberOf _
8655 * @since 3.0.0
8656 * @category Array
8657 * @param {Array} array The array to query.
8658 * @param {Function} [predicate=_.identity] The function invoked per iteration.
8659 * @returns {Array} Returns the slice of `array`.
8660 * @example
8661 *
8662 * var users = [
8663 * { 'user': 'barney', 'active': false },
8664 * { 'user': 'fred', 'active': false },
8665 * { 'user': 'pebbles', 'active': true }
8666 * ];
8667 *
8668 * _.dropWhile(users, function(o) { return !o.active; });
8669 * // => objects for ['pebbles']
8670 *
8671 * // The `_.matches` iteratee shorthand.
8672 * _.dropWhile(users, { 'user': 'barney', 'active': false });
8673 * // => objects for ['fred', 'pebbles']
8674 *
8675 * // The `_.matchesProperty` iteratee shorthand.
8676 * _.dropWhile(users, ['active', false]);
8677 * // => objects for ['pebbles']
8678 *
8679 * // The `_.property` iteratee shorthand.
8680 * _.dropWhile(users, 'active');
8681 * // => objects for ['barney', 'fred', 'pebbles']
8682 */
8683 function dropWhile(array, predicate) {
8684 return (array && array.length)
8685 ? baseWhile(array, getIteratee(predicate, 3), true)
8686 : [];
8687 }
8688
8689 /**
8690 * Fills elements of `array` with `value` from `start` up to, but not
8691 * including, `end`.
8692 *
8693 * **Note:** This method mutates `array`.
8694 *
8695 * @static
8696 * @memberOf _
8697 * @since 3.2.0
8698 * @category Array
8699 * @param {Array} array The array to fill.
8700 * @param {*} value The value to fill `array` with.
8701 * @param {number} [start=0] The start position.
8702 * @param {number} [end=array.length] The end position.
8703 * @returns {Array} Returns `array`.
8704 * @example
8705 *
8706 * var array = [1, 2, 3];
8707 *
8708 * _.fill(array, 'a');
8709 * console.log(array);
8710 * // => ['a', 'a', 'a']
8711 *
8712 * _.fill(Array(3), 2);
8713 * // => [2, 2, 2]
8714 *
8715 * _.fill([4, 6, 8, 10], '*', 1, 3);
8716 * // => [4, '*', '*', 10]
8717 */
8718 function fill(array, value, start, end) {
8719 var length = array == null ? 0 : array.length;
8720 if (!length) {
8721 return [];
8722 }
8723 if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
8724 start = 0;
8725 end = length;
8726 }
8727 return baseFill(array, value, start, end);
8728 }
8729
8730 /**
8731 * This method is like `_.find` except that it returns the index of the first
8732 * element `predicate` returns truthy for instead of the element itself.
8733 *
8734 * @static
8735 * @memberOf _
8736 * @since 1.1.0
8737 * @category Array
8738 * @param {Array} array The array to inspect.
8739 * @param {Function} [predicate=_.identity] The function invoked per iteration.
8740 * @param {number} [fromIndex=0] The index to search from.
8741 * @returns {number} Returns the index of the found element, else `-1`.
8742 * @example
8743 *
8744 * var users = [
8745 * { 'user': 'barney', 'active': false },
8746 * { 'user': 'fred', 'active': false },
8747 * { 'user': 'pebbles', 'active': true }
8748 * ];
8749 *
8750 * _.findIndex(users, function(o) { return o.user == 'barney'; });
8751 * // => 0
8752 *
8753 * // The `_.matches` iteratee shorthand.
8754 * _.findIndex(users, { 'user': 'fred', 'active': false });
8755 * // => 1
8756 *
8757 * // The `_.matchesProperty` iteratee shorthand.
8758 * _.findIndex(users, ['active', false]);
8759 * // => 0
8760 *
8761 * // The `_.property` iteratee shorthand.
8762 * _.findIndex(users, 'active');
8763 * // => 2
8764 */
8765 function findIndex(array, predicate, fromIndex) {
8766 var length = array == null ? 0 : array.length;
8767 if (!length) {
8768 return -1;
8769 }
8770 var index = fromIndex == null ? 0 : toInteger(fromIndex);
8771 if (index < 0) {
8772 index = nativeMax(length + index, 0);
8773 }
8774 return baseFindIndex(array, getIteratee(predicate, 3), index);
8775 }
8776
8777 /**
8778 * This method is like `_.findIndex` except that it iterates over elements
8779 * of `collection` from right to left.
8780 *
8781 * @static
8782 * @memberOf _
8783 * @since 2.0.0
8784 * @category Array
8785 * @param {Array} array The array to inspect.
8786 * @param {Function} [predicate=_.identity] The function invoked per iteration.
8787 * @param {number} [fromIndex=array.length-1] The index to search from.
8788 * @returns {number} Returns the index of the found element, else `-1`.
8789 * @example
8790 *
8791 * var users = [
8792 * { 'user': 'barney', 'active': true },
8793 * { 'user': 'fred', 'active': false },
8794 * { 'user': 'pebbles', 'active': false }
8795 * ];
8796 *
8797 * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
8798 * // => 2
8799 *
8800 * // The `_.matches` iteratee shorthand.
8801 * _.findLastIndex(users, { 'user': 'barney', 'active': true });
8802 * // => 0
8803 *
8804 * // The `_.matchesProperty` iteratee shorthand.
8805 * _.findLastIndex(users, ['active', false]);
8806 * // => 2
8807 *
8808 * // The `_.property` iteratee shorthand.
8809 * _.findLastIndex(users, 'active');
8810 * // => 0
8811 */
8812 function findLastIndex(array, predicate, fromIndex) {
8813 var length = array == null ? 0 : array.length;
8814 if (!length) {
8815 return -1;
8816 }
8817 var index = length - 1;
8818 if (fromIndex !== undefined) {
8819 index = toInteger(fromIndex);
8820 index = fromIndex < 0
8821 ? nativeMax(length + index, 0)
8822 : nativeMin(index, length - 1);
8823 }
8824 return baseFindIndex(array, getIteratee(predicate, 3), index, true);
8825 }
8826
8827 /**
8828 * Flattens `array` a single level deep.
8829 *
8830 * @static
8831 * @memberOf _
8832 * @since 0.1.0
8833 * @category Array
8834 * @param {Array} array The array to flatten.
8835 * @returns {Array} Returns the new flattened array.
8836 * @example
8837 *
8838 * _.flatten([1, [2, [3, [4]], 5]]);
8839 * // => [1, 2, [3, [4]], 5]
8840 */
8841 function flatten(array) {
8842 var length = array == null ? 0 : array.length;
8843 return length ? baseFlatten(array, 1) : [];
8844 }
8845
8846 /**
8847 * Recursively flattens `array`.
8848 *
8849 * @static
8850 * @memberOf _
8851 * @since 3.0.0
8852 * @category Array
8853 * @param {Array} array The array to flatten.
8854 * @returns {Array} Returns the new flattened array.
8855 * @example
8856 *
8857 * _.flattenDeep([1, [2, [3, [4]], 5]]);
8858 * // => [1, 2, 3, 4, 5]
8859 */
8860 function flattenDeep(array) {
8861 var length = array == null ? 0 : array.length;
8862 return length ? baseFlatten(array, INFINITY) : [];
8863 }
8864
8865 /**
8866 * Recursively flatten `array` up to `depth` times.
8867 *
8868 * @static
8869 * @memberOf _
8870 * @since 4.4.0
8871 * @category Array
8872 * @param {Array} array The array to flatten.
8873 * @param {number} [depth=1] The maximum recursion depth.
8874 * @returns {Array} Returns the new flattened array.
8875 * @example
8876 *
8877 * var array = [1, [2, [3, [4]], 5]];
8878 *
8879 * _.flattenDepth(array, 1);
8880 * // => [1, 2, [3, [4]], 5]
8881 *
8882 * _.flattenDepth(array, 2);
8883 * // => [1, 2, 3, [4], 5]
8884 */
8885 function flattenDepth(array, depth) {
8886 var length = array == null ? 0 : array.length;
8887 if (!length) {
8888 return [];
8889 }
8890 depth = depth === undefined ? 1 : toInteger(depth);
8891 return baseFlatten(array, depth);
8892 }
8893
8894 /**
8895 * The inverse of `_.toPairs`; this method returns an object composed
8896 * from key-value `pairs`.
8897 *
8898 * @static
8899 * @memberOf _
8900 * @since 4.0.0
8901 * @category Array
8902 * @param {Array} pairs The key-value pairs.
8903 * @returns {Object} Returns the new object.
8904 * @example
8905 *
8906 * _.fromPairs([['a', 1], ['b', 2]]);
8907 * // => { 'a': 1, 'b': 2 }
8908 */
8909 function fromPairs(pairs) {
8910 var index = -1,
8911 length = pairs == null ? 0 : pairs.length,
8912 result = {};
8913
8914 while (++index < length) {
8915 var pair = pairs[index];
8916 result[pair[0]] = pair[1];
8917 }
8918 return result;
8919 }
8920
8921 /**
8922 * Gets the first element of `array`.
8923 *
8924 * @static
8925 * @memberOf _
8926 * @since 0.1.0
8927 * @alias first
8928 * @category Array
8929 * @param {Array} array The array to query.
8930 * @returns {*} Returns the first element of `array`.
8931 * @example
8932 *
8933 * _.head([1, 2, 3]);
8934 * // => 1
8935 *
8936 * _.head([]);
8937 * // => undefined
8938 */
8939 function head(array) {
8940 return (array && array.length) ? array[0] : undefined;
8941 }
8942
8943 /**
8944 * Gets the index at which the first occurrence of `value` is found in `array`
8945 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8946 * for equality comparisons. If `fromIndex` is negative, it's used as the
8947 * offset from the end of `array`.
8948 *
8949 * @static
8950 * @memberOf _
8951 * @since 0.1.0
8952 * @category Array
8953 * @param {Array} array The array to inspect.
8954 * @param {*} value The value to search for.
8955 * @param {number} [fromIndex=0] The index to search from.
8956 * @returns {number} Returns the index of the matched value, else `-1`.
8957 * @example
8958 *
8959 * _.indexOf([1, 2, 1, 2], 2);
8960 * // => 1
8961 *
8962 * // Search from the `fromIndex`.
8963 * _.indexOf([1, 2, 1, 2], 2, 2);
8964 * // => 3
8965 */
8966 function indexOf(array, value, fromIndex) {
8967 var length = array == null ? 0 : array.length;
8968 if (!length) {
8969 return -1;
8970 }
8971 var index = fromIndex == null ? 0 : toInteger(fromIndex);
8972 if (index < 0) {
8973 index = nativeMax(length + index, 0);
8974 }
8975 return baseIndexOf(array, value, index);
8976 }
8977
8978 /**
8979 * Gets all but the last element of `array`.
8980 *
8981 * @static
8982 * @memberOf _
8983 * @since 0.1.0
8984 * @category Array
8985 * @param {Array} array The array to query.
8986 * @returns {Array} Returns the slice of `array`.
8987 * @example
8988 *
8989 * _.initial([1, 2, 3]);
8990 * // => [1, 2]
8991 */
8992 function initial(array) {
8993 var length = array == null ? 0 : array.length;
8994 return length ? baseSlice(array, 0, -1) : [];
8995 }
8996
8997 /**
8998 * Creates an array of unique values that are included in all given arrays
8999 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9000 * for equality comparisons. The order and references of result values are
9001 * determined by the first array.
9002 *
9003 * @static
9004 * @memberOf _
9005 * @since 0.1.0
9006 * @category Array
9007 * @param {...Array} [arrays] The arrays to inspect.
9008 * @returns {Array} Returns the new array of intersecting values.
9009 * @example
9010 *
9011 * _.intersection([2, 1], [2, 3]);
9012 * // => [2]
9013 */
9014 var intersection = baseRest(function(arrays) {
9015 var mapped = arrayMap(arrays, castArrayLikeObject);
9016 return (mapped.length && mapped[0] === arrays[0])
9017 ? baseIntersection(mapped)
9018 : [];
9019 });
9020
9021 /**
9022 * This method is like `_.intersection` except that it accepts `iteratee`
9023 * which is invoked for each element of each `arrays` to generate the criterion
9024 * by which they're compared. The order and references of result values are
9025 * determined by the first array. The iteratee is invoked with one argument:
9026 * (value).
9027 *
9028 * @static
9029 * @memberOf _
9030 * @since 4.0.0
9031 * @category Array
9032 * @param {...Array} [arrays] The arrays to inspect.
9033 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9034 * @returns {Array} Returns the new array of intersecting values.
9035 * @example
9036 *
9037 * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
9038 * // => [2.1]
9039 *
9040 * // The `_.property` iteratee shorthand.
9041 * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
9042 * // => [{ 'x': 1 }]
9043 */
9044 var intersectionBy = baseRest(function(arrays) {
9045 var iteratee = last(arrays),
9046 mapped = arrayMap(arrays, castArrayLikeObject);
9047
9048 if (iteratee === last(mapped)) {
9049 iteratee = undefined;
9050 } else {
9051 mapped.pop();
9052 }
9053 return (mapped.length && mapped[0] === arrays[0])
9054 ? baseIntersection(mapped, getIteratee(iteratee, 2))
9055 : [];
9056 });
9057
9058 /**
9059 * This method is like `_.intersection` except that it accepts `comparator`
9060 * which is invoked to compare elements of `arrays`. The order and references
9061 * of result values are determined by the first array. The comparator is
9062 * invoked with two arguments: (arrVal, othVal).
9063 *
9064 * @static
9065 * @memberOf _
9066 * @since 4.0.0
9067 * @category Array
9068 * @param {...Array} [arrays] The arrays to inspect.
9069 * @param {Function} [comparator] The comparator invoked per element.
9070 * @returns {Array} Returns the new array of intersecting values.
9071 * @example
9072 *
9073 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
9074 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
9075 *
9076 * _.intersectionWith(objects, others, _.isEqual);
9077 * // => [{ 'x': 1, 'y': 2 }]
9078 */
9079 var intersectionWith = baseRest(function(arrays) {
9080 var comparator = last(arrays),
9081 mapped = arrayMap(arrays, castArrayLikeObject);
9082
9083 comparator = typeof comparator == 'function' ? comparator : undefined;
9084 if (comparator) {
9085 mapped.pop();
9086 }
9087 return (mapped.length && mapped[0] === arrays[0])
9088 ? baseIntersection(mapped, undefined, comparator)
9089 : [];
9090 });
9091
9092 /**
9093 * Converts all elements in `array` into a string separated by `separator`.
9094 *
9095 * @static
9096 * @memberOf _
9097 * @since 4.0.0
9098 * @category Array
9099 * @param {Array} array The array to convert.
9100 * @param {string} [separator=','] The element separator.
9101 * @returns {string} Returns the joined string.
9102 * @example
9103 *
9104 * _.join(['a', 'b', 'c'], '~');
9105 * // => 'a~b~c'
9106 */
9107 function join(array, separator) {
9108 return array == null ? '' : nativeJoin.call(array, separator);
9109 }
9110
9111 /**
9112 * Gets the last element of `array`.
9113 *
9114 * @static
9115 * @memberOf _
9116 * @since 0.1.0
9117 * @category Array
9118 * @param {Array} array The array to query.
9119 * @returns {*} Returns the last element of `array`.
9120 * @example
9121 *
9122 * _.last([1, 2, 3]);
9123 * // => 3
9124 */
9125 function last(array) {
9126 var length = array == null ? 0 : array.length;
9127 return length ? array[length - 1] : undefined;
9128 }
9129
9130 /**
9131 * This method is like `_.indexOf` except that it iterates over elements of
9132 * `array` from right to left.
9133 *
9134 * @static
9135 * @memberOf _
9136 * @since 0.1.0
9137 * @category Array
9138 * @param {Array} array The array to inspect.
9139 * @param {*} value The value to search for.
9140 * @param {number} [fromIndex=array.length-1] The index to search from.
9141 * @returns {number} Returns the index of the matched value, else `-1`.
9142 * @example
9143 *
9144 * _.lastIndexOf([1, 2, 1, 2], 2);
9145 * // => 3
9146 *
9147 * // Search from the `fromIndex`.
9148 * _.lastIndexOf([1, 2, 1, 2], 2, 2);
9149 * // => 1
9150 */
9151 function lastIndexOf(array, value, fromIndex) {
9152 var length = array == null ? 0 : array.length;
9153 if (!length) {
9154 return -1;
9155 }
9156 var index = length;
9157 if (fromIndex !== undefined) {
9158 index = toInteger(fromIndex);
9159 index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
9160 }
9161 return value === value
9162 ? strictLastIndexOf(array, value, index)
9163 : baseFindIndex(array, baseIsNaN, index, true);
9164 }
9165
9166 /**
9167 * Gets the element at index `n` of `array`. If `n` is negative, the nth
9168 * element from the end is returned.
9169 *
9170 * @static
9171 * @memberOf _
9172 * @since 4.11.0
9173 * @category Array
9174 * @param {Array} array The array to query.
9175 * @param {number} [n=0] The index of the element to return.
9176 * @returns {*} Returns the nth element of `array`.
9177 * @example
9178 *
9179 * var array = ['a', 'b', 'c', 'd'];
9180 *
9181 * _.nth(array, 1);
9182 * // => 'b'
9183 *
9184 * _.nth(array, -2);
9185 * // => 'c';
9186 */
9187 function nth(array, n) {
9188 return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
9189 }
9190
9191 /**
9192 * Removes all given values from `array` using
9193 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9194 * for equality comparisons.
9195 *
9196 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
9197 * to remove elements from an array by predicate.
9198 *
9199 * @static
9200 * @memberOf _
9201 * @since 2.0.0
9202 * @category Array
9203 * @param {Array} array The array to modify.
9204 * @param {...*} [values] The values to remove.
9205 * @returns {Array} Returns `array`.
9206 * @example
9207 *
9208 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
9209 *
9210 * _.pull(array, 'a', 'c');
9211 * console.log(array);
9212 * // => ['b', 'b']
9213 */
9214 var pull = baseRest(pullAll);
9215
9216 /**
9217 * This method is like `_.pull` except that it accepts an array of values to remove.
9218 *
9219 * **Note:** Unlike `_.difference`, this method mutates `array`.
9220 *
9221 * @static
9222 * @memberOf _
9223 * @since 4.0.0
9224 * @category Array
9225 * @param {Array} array The array to modify.
9226 * @param {Array} values The values to remove.
9227 * @returns {Array} Returns `array`.
9228 * @example
9229 *
9230 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
9231 *
9232 * _.pullAll(array, ['a', 'c']);
9233 * console.log(array);
9234 * // => ['b', 'b']
9235 */
9236 function pullAll(array, values) {
9237 return (array && array.length && values && values.length)
9238 ? basePullAll(array, values)
9239 : array;
9240 }
9241
9242 /**
9243 * This method is like `_.pullAll` except that it accepts `iteratee` which is
9244 * invoked for each element of `array` and `values` to generate the criterion
9245 * by which they're compared. The iteratee is invoked with one argument: (value).
9246 *
9247 * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
9248 *
9249 * @static
9250 * @memberOf _
9251 * @since 4.0.0
9252 * @category Array
9253 * @param {Array} array The array to modify.
9254 * @param {Array} values The values to remove.
9255 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9256 * @returns {Array} Returns `array`.
9257 * @example
9258 *
9259 * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
9260 *
9261 * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
9262 * console.log(array);
9263 * // => [{ 'x': 2 }]
9264 */
9265 function pullAllBy(array, values, iteratee) {
9266 return (array && array.length && values && values.length)
9267 ? basePullAll(array, values, getIteratee(iteratee, 2))
9268 : array;
9269 }
9270
9271 /**
9272 * This method is like `_.pullAll` except that it accepts `comparator` which
9273 * is invoked to compare elements of `array` to `values`. The comparator is
9274 * invoked with two arguments: (arrVal, othVal).
9275 *
9276 * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
9277 *
9278 * @static
9279 * @memberOf _
9280 * @since 4.6.0
9281 * @category Array
9282 * @param {Array} array The array to modify.
9283 * @param {Array} values The values to remove.
9284 * @param {Function} [comparator] The comparator invoked per element.
9285 * @returns {Array} Returns `array`.
9286 * @example
9287 *
9288 * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
9289 *
9290 * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
9291 * console.log(array);
9292 * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
9293 */
9294 function pullAllWith(array, values, comparator) {
9295 return (array && array.length && values && values.length)
9296 ? basePullAll(array, values, undefined, comparator)
9297 : array;
9298 }
9299
9300 /**
9301 * Removes elements from `array` corresponding to `indexes` and returns an
9302 * array of removed elements.
9303 *
9304 * **Note:** Unlike `_.at`, this method mutates `array`.
9305 *
9306 * @static
9307 * @memberOf _
9308 * @since 3.0.0
9309 * @category Array
9310 * @param {Array} array The array to modify.
9311 * @param {...(number|number[])} [indexes] The indexes of elements to remove.
9312 * @returns {Array} Returns the new array of removed elements.
9313 * @example
9314 *
9315 * var array = ['a', 'b', 'c', 'd'];
9316 * var pulled = _.pullAt(array, [1, 3]);
9317 *
9318 * console.log(array);
9319 * // => ['a', 'c']
9320 *
9321 * console.log(pulled);
9322 * // => ['b', 'd']
9323 */
9324 var pullAt = flatRest(function(array, indexes) {
9325 var length = array == null ? 0 : array.length,
9326 result = baseAt(array, indexes);
9327
9328 basePullAt(array, arrayMap(indexes, function(index) {
9329 return isIndex(index, length) ? +index : index;
9330 }).sort(compareAscending));
9331
9332 return result;
9333 });
9334
9335 /**
9336 * Removes all elements from `array` that `predicate` returns truthy for
9337 * and returns an array of the removed elements. The predicate is invoked
9338 * with three arguments: (value, index, array).
9339 *
9340 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
9341 * to pull elements from an array by value.
9342 *
9343 * @static
9344 * @memberOf _
9345 * @since 2.0.0
9346 * @category Array
9347 * @param {Array} array The array to modify.
9348 * @param {Function} [predicate=_.identity] The function invoked per iteration.
9349 * @returns {Array} Returns the new array of removed elements.
9350 * @example
9351 *
9352 * var array = [1, 2, 3, 4];
9353 * var evens = _.remove(array, function(n) {
9354 * return n % 2 == 0;
9355 * });
9356 *
9357 * console.log(array);
9358 * // => [1, 3]
9359 *
9360 * console.log(evens);
9361 * // => [2, 4]
9362 */
9363 function remove(array, predicate) {
9364 var result = [];
9365 if (!(array && array.length)) {
9366 return result;
9367 }
9368 var index = -1,
9369 indexes = [],
9370 length = array.length;
9371
9372 predicate = getIteratee(predicate, 3);
9373 while (++index < length) {
9374 var value = array[index];
9375 if (predicate(value, index, array)) {
9376 result.push(value);
9377 indexes.push(index);
9378 }
9379 }
9380 basePullAt(array, indexes);
9381 return result;
9382 }
9383
9384 /**
9385 * Reverses `array` so that the first element becomes the last, the second
9386 * element becomes the second to last, and so on.
9387 *
9388 * **Note:** This method mutates `array` and is based on
9389 * [`Array#reverse`](https://mdn.io/Array/reverse).
9390 *
9391 * @static
9392 * @memberOf _
9393 * @since 4.0.0
9394 * @category Array
9395 * @param {Array} array The array to modify.
9396 * @returns {Array} Returns `array`.
9397 * @example
9398 *
9399 * var array = [1, 2, 3];
9400 *
9401 * _.reverse(array);
9402 * // => [3, 2, 1]
9403 *
9404 * console.log(array);
9405 * // => [3, 2, 1]
9406 */
9407 function reverse(array) {
9408 return array == null ? array : nativeReverse.call(array);
9409 }
9410
9411 /**
9412 * Creates a slice of `array` from `start` up to, but not including, `end`.
9413 *
9414 * **Note:** This method is used instead of
9415 * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
9416 * returned.
9417 *
9418 * @static
9419 * @memberOf _
9420 * @since 3.0.0
9421 * @category Array
9422 * @param {Array} array The array to slice.
9423 * @param {number} [start=0] The start position.
9424 * @param {number} [end=array.length] The end position.
9425 * @returns {Array} Returns the slice of `array`.
9426 */
9427 function slice(array, start, end) {
9428 var length = array == null ? 0 : array.length;
9429 if (!length) {
9430 return [];
9431 }
9432 if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
9433 start = 0;
9434 end = length;
9435 }
9436 else {
9437 start = start == null ? 0 : toInteger(start);
9438 end = end === undefined ? length : toInteger(end);
9439 }
9440 return baseSlice(array, start, end);
9441 }
9442
9443 /**
9444 * Uses a binary search to determine the lowest index at which `value`
9445 * should be inserted into `array` in order to maintain its sort order.
9446 *
9447 * @static
9448 * @memberOf _
9449 * @since 0.1.0
9450 * @category Array
9451 * @param {Array} array The sorted array to inspect.
9452 * @param {*} value The value to evaluate.
9453 * @returns {number} Returns the index at which `value` should be inserted
9454 * into `array`.
9455 * @example
9456 *
9457 * _.sortedIndex([30, 50], 40);
9458 * // => 1
9459 */
9460 function sortedIndex(array, value) {
9461 return baseSortedIndex(array, value);
9462 }
9463
9464 /**
9465 * This method is like `_.sortedIndex` except that it accepts `iteratee`
9466 * which is invoked for `value` and each element of `array` to compute their
9467 * sort ranking. The iteratee is invoked with one argument: (value).
9468 *
9469 * @static
9470 * @memberOf _
9471 * @since 4.0.0
9472 * @category Array
9473 * @param {Array} array The sorted array to inspect.
9474 * @param {*} value The value to evaluate.
9475 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9476 * @returns {number} Returns the index at which `value` should be inserted
9477 * into `array`.
9478 * @example
9479 *
9480 * var objects = [{ 'x': 4 }, { 'x': 5 }];
9481 *
9482 * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
9483 * // => 0
9484 *
9485 * // The `_.property` iteratee shorthand.
9486 * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
9487 * // => 0
9488 */
9489 function sortedIndexBy(array, value, iteratee) {
9490 return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
9491 }
9492
9493 /**
9494 * This method is like `_.indexOf` except that it performs a binary
9495 * search on a sorted `array`.
9496 *
9497 * @static
9498 * @memberOf _
9499 * @since 4.0.0
9500 * @category Array
9501 * @param {Array} array The array to inspect.
9502 * @param {*} value The value to search for.
9503 * @returns {number} Returns the index of the matched value, else `-1`.
9504 * @example
9505 *
9506 * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
9507 * // => 1
9508 */
9509 function sortedIndexOf(array, value) {
9510 var length = array == null ? 0 : array.length;
9511 if (length) {
9512 var index = baseSortedIndex(array, value);
9513 if (index < length && eq(array[index], value)) {
9514 return index;
9515 }
9516 }
9517 return -1;
9518 }
9519
9520 /**
9521 * This method is like `_.sortedIndex` except that it returns the highest
9522 * index at which `value` should be inserted into `array` in order to
9523 * maintain its sort order.
9524 *
9525 * @static
9526 * @memberOf _
9527 * @since 3.0.0
9528 * @category Array
9529 * @param {Array} array The sorted array to inspect.
9530 * @param {*} value The value to evaluate.
9531 * @returns {number} Returns the index at which `value` should be inserted
9532 * into `array`.
9533 * @example
9534 *
9535 * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
9536 * // => 4
9537 */
9538 function sortedLastIndex(array, value) {
9539 return baseSortedIndex(array, value, true);
9540 }
9541
9542 /**
9543 * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
9544 * which is invoked for `value` and each element of `array` to compute their
9545 * sort ranking. The iteratee is invoked with one argument: (value).
9546 *
9547 * @static
9548 * @memberOf _
9549 * @since 4.0.0
9550 * @category Array
9551 * @param {Array} array The sorted array to inspect.
9552 * @param {*} value The value to evaluate.
9553 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9554 * @returns {number} Returns the index at which `value` should be inserted
9555 * into `array`.
9556 * @example
9557 *
9558 * var objects = [{ 'x': 4 }, { 'x': 5 }];
9559 *
9560 * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
9561 * // => 1
9562 *
9563 * // The `_.property` iteratee shorthand.
9564 * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
9565 * // => 1
9566 */
9567 function sortedLastIndexBy(array, value, iteratee) {
9568 return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
9569 }
9570
9571 /**
9572 * This method is like `_.lastIndexOf` except that it performs a binary
9573 * search on a sorted `array`.
9574 *
9575 * @static
9576 * @memberOf _
9577 * @since 4.0.0
9578 * @category Array
9579 * @param {Array} array The array to inspect.
9580 * @param {*} value The value to search for.
9581 * @returns {number} Returns the index of the matched value, else `-1`.
9582 * @example
9583 *
9584 * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
9585 * // => 3
9586 */
9587 function sortedLastIndexOf(array, value) {
9588 var length = array == null ? 0 : array.length;
9589 if (length) {
9590 var index = baseSortedIndex(array, value, true) - 1;
9591 if (eq(array[index], value)) {
9592 return index;
9593 }
9594 }
9595 return -1;
9596 }
9597
9598 /**
9599 * This method is like `_.uniq` except that it's designed and optimized
9600 * for sorted arrays.
9601 *
9602 * @static
9603 * @memberOf _
9604 * @since 4.0.0
9605 * @category Array
9606 * @param {Array} array The array to inspect.
9607 * @returns {Array} Returns the new duplicate free array.
9608 * @example
9609 *
9610 * _.sortedUniq([1, 1, 2]);
9611 * // => [1, 2]
9612 */
9613 function sortedUniq(array) {
9614 return (array && array.length)
9615 ? baseSortedUniq(array)
9616 : [];
9617 }
9618
9619 /**
9620 * This method is like `_.uniqBy` except that it's designed and optimized
9621 * for sorted arrays.
9622 *
9623 * @static
9624 * @memberOf _
9625 * @since 4.0.0
9626 * @category Array
9627 * @param {Array} array The array to inspect.
9628 * @param {Function} [iteratee] The iteratee invoked per element.
9629 * @returns {Array} Returns the new duplicate free array.
9630 * @example
9631 *
9632 * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
9633 * // => [1.1, 2.3]
9634 */
9635 function sortedUniqBy(array, iteratee) {
9636 return (array && array.length)
9637 ? baseSortedUniq(array, getIteratee(iteratee, 2))
9638 : [];
9639 }
9640
9641 /**
9642 * Gets all but the first element of `array`.
9643 *
9644 * @static
9645 * @memberOf _
9646 * @since 4.0.0
9647 * @category Array
9648 * @param {Array} array The array to query.
9649 * @returns {Array} Returns the slice of `array`.
9650 * @example
9651 *
9652 * _.tail([1, 2, 3]);
9653 * // => [2, 3]
9654 */
9655 function tail(array) {
9656 var length = array == null ? 0 : array.length;
9657 return length ? baseSlice(array, 1, length) : [];
9658 }
9659
9660 /**
9661 * Creates a slice of `array` with `n` elements taken from the beginning.
9662 *
9663 * @static
9664 * @memberOf _
9665 * @since 0.1.0
9666 * @category Array
9667 * @param {Array} array The array to query.
9668 * @param {number} [n=1] The number of elements to take.
9669 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9670 * @returns {Array} Returns the slice of `array`.
9671 * @example
9672 *
9673 * _.take([1, 2, 3]);
9674 * // => [1]
9675 *
9676 * _.take([1, 2, 3], 2);
9677 * // => [1, 2]
9678 *
9679 * _.take([1, 2, 3], 5);
9680 * // => [1, 2, 3]
9681 *
9682 * _.take([1, 2, 3], 0);
9683 * // => []
9684 */
9685 function take(array, n, guard) {
9686 if (!(array && array.length)) {
9687 return [];
9688 }
9689 n = (guard || n === undefined) ? 1 : toInteger(n);
9690 return baseSlice(array, 0, n < 0 ? 0 : n);
9691 }
9692
9693 /**
9694 * Creates a slice of `array` with `n` elements taken from the end.
9695 *
9696 * @static
9697 * @memberOf _
9698 * @since 3.0.0
9699 * @category Array
9700 * @param {Array} array The array to query.
9701 * @param {number} [n=1] The number of elements to take.
9702 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9703 * @returns {Array} Returns the slice of `array`.
9704 * @example
9705 *
9706 * _.takeRight([1, 2, 3]);
9707 * // => [3]
9708 *
9709 * _.takeRight([1, 2, 3], 2);
9710 * // => [2, 3]
9711 *
9712 * _.takeRight([1, 2, 3], 5);
9713 * // => [1, 2, 3]
9714 *
9715 * _.takeRight([1, 2, 3], 0);
9716 * // => []
9717 */
9718 function takeRight(array, n, guard) {
9719 var length = array == null ? 0 : array.length;
9720 if (!length) {
9721 return [];
9722 }
9723 n = (guard || n === undefined) ? 1 : toInteger(n);
9724 n = length - n;
9725 return baseSlice(array, n < 0 ? 0 : n, length);
9726 }
9727
9728 /**
9729 * Creates a slice of `array` with elements taken from the end. Elements are
9730 * taken until `predicate` returns falsey. The predicate is invoked with
9731 * three arguments: (value, index, array).
9732 *
9733 * @static
9734 * @memberOf _
9735 * @since 3.0.0
9736 * @category Array
9737 * @param {Array} array The array to query.
9738 * @param {Function} [predicate=_.identity] The function invoked per iteration.
9739 * @returns {Array} Returns the slice of `array`.
9740 * @example
9741 *
9742 * var users = [
9743 * { 'user': 'barney', 'active': true },
9744 * { 'user': 'fred', 'active': false },
9745 * { 'user': 'pebbles', 'active': false }
9746 * ];
9747 *
9748 * _.takeRightWhile(users, function(o) { return !o.active; });
9749 * // => objects for ['fred', 'pebbles']
9750 *
9751 * // The `_.matches` iteratee shorthand.
9752 * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
9753 * // => objects for ['pebbles']
9754 *
9755 * // The `_.matchesProperty` iteratee shorthand.
9756 * _.takeRightWhile(users, ['active', false]);
9757 * // => objects for ['fred', 'pebbles']
9758 *
9759 * // The `_.property` iteratee shorthand.
9760 * _.takeRightWhile(users, 'active');
9761 * // => []
9762 */
9763 function takeRightWhile(array, predicate) {
9764 return (array && array.length)
9765 ? baseWhile(array, getIteratee(predicate, 3), false, true)
9766 : [];
9767 }
9768
9769 /**
9770 * Creates a slice of `array` with elements taken from the beginning. Elements
9771 * are taken until `predicate` returns falsey. The predicate is invoked with
9772 * three arguments: (value, index, array).
9773 *
9774 * @static
9775 * @memberOf _
9776 * @since 3.0.0
9777 * @category Array
9778 * @param {Array} array The array to query.
9779 * @param {Function} [predicate=_.identity] The function invoked per iteration.
9780 * @returns {Array} Returns the slice of `array`.
9781 * @example
9782 *
9783 * var users = [
9784 * { 'user': 'barney', 'active': false },
9785 * { 'user': 'fred', 'active': false },
9786 * { 'user': 'pebbles', 'active': true }
9787 * ];
9788 *
9789 * _.takeWhile(users, function(o) { return !o.active; });
9790 * // => objects for ['barney', 'fred']
9791 *
9792 * // The `_.matches` iteratee shorthand.
9793 * _.takeWhile(users, { 'user': 'barney', 'active': false });
9794 * // => objects for ['barney']
9795 *
9796 * // The `_.matchesProperty` iteratee shorthand.
9797 * _.takeWhile(users, ['active', false]);
9798 * // => objects for ['barney', 'fred']
9799 *
9800 * // The `_.property` iteratee shorthand.
9801 * _.takeWhile(users, 'active');
9802 * // => []
9803 */
9804 function takeWhile(array, predicate) {
9805 return (array && array.length)
9806 ? baseWhile(array, getIteratee(predicate, 3))
9807 : [];
9808 }
9809
9810 /**
9811 * Creates an array of unique values, in order, from all given arrays using
9812 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9813 * for equality comparisons.
9814 *
9815 * @static
9816 * @memberOf _
9817 * @since 0.1.0
9818 * @category Array
9819 * @param {...Array} [arrays] The arrays to inspect.
9820 * @returns {Array} Returns the new array of combined values.
9821 * @example
9822 *
9823 * _.union([2], [1, 2]);
9824 * // => [2, 1]
9825 */
9826 var union = baseRest(function(arrays) {
9827 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
9828 });
9829
9830 /**
9831 * This method is like `_.union` except that it accepts `iteratee` which is
9832 * invoked for each element of each `arrays` to generate the criterion by
9833 * which uniqueness is computed. Result values are chosen from the first
9834 * array in which the value occurs. The iteratee is invoked with one argument:
9835 * (value).
9836 *
9837 * @static
9838 * @memberOf _
9839 * @since 4.0.0
9840 * @category Array
9841 * @param {...Array} [arrays] The arrays to inspect.
9842 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9843 * @returns {Array} Returns the new array of combined values.
9844 * @example
9845 *
9846 * _.unionBy([2.1], [1.2, 2.3], Math.floor);
9847 * // => [2.1, 1.2]
9848 *
9849 * // The `_.property` iteratee shorthand.
9850 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
9851 * // => [{ 'x': 1 }, { 'x': 2 }]
9852 */
9853 var unionBy = baseRest(function(arrays) {
9854 var iteratee = last(arrays);
9855 if (isArrayLikeObject(iteratee)) {
9856 iteratee = undefined;
9857 }
9858 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
9859 });
9860
9861 /**
9862 * This method is like `_.union` except that it accepts `comparator` which
9863 * is invoked to compare elements of `arrays`. Result values are chosen from
9864 * the first array in which the value occurs. The comparator is invoked
9865 * with two arguments: (arrVal, othVal).
9866 *
9867 * @static
9868 * @memberOf _
9869 * @since 4.0.0
9870 * @category Array
9871 * @param {...Array} [arrays] The arrays to inspect.
9872 * @param {Function} [comparator] The comparator invoked per element.
9873 * @returns {Array} Returns the new array of combined values.
9874 * @example
9875 *
9876 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
9877 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
9878 *
9879 * _.unionWith(objects, others, _.isEqual);
9880 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
9881 */
9882 var unionWith = baseRest(function(arrays) {
9883 var comparator = last(arrays);
9884 comparator = typeof comparator == 'function' ? comparator : undefined;
9885 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
9886 });
9887
9888 /**
9889 * Creates a duplicate-free version of an array, using
9890 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9891 * for equality comparisons, in which only the first occurrence of each element
9892 * is kept. The order of result values is determined by the order they occur
9893 * in the array.
9894 *
9895 * @static
9896 * @memberOf _
9897 * @since 0.1.0
9898 * @category Array
9899 * @param {Array} array The array to inspect.
9900 * @returns {Array} Returns the new duplicate free array.
9901 * @example
9902 *
9903 * _.uniq([2, 1, 2]);
9904 * // => [2, 1]
9905 */
9906 function uniq(array) {
9907 return (array && array.length) ? baseUniq(array) : [];
9908 }
9909
9910 /**
9911 * This method is like `_.uniq` except that it accepts `iteratee` which is
9912 * invoked for each element in `array` to generate the criterion by which
9913 * uniqueness is computed. The order of result values is determined by the
9914 * order they occur in the array. The iteratee is invoked with one argument:
9915 * (value).
9916 *
9917 * @static
9918 * @memberOf _
9919 * @since 4.0.0
9920 * @category Array
9921 * @param {Array} array The array to inspect.
9922 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9923 * @returns {Array} Returns the new duplicate free array.
9924 * @example
9925 *
9926 * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
9927 * // => [2.1, 1.2]
9928 *
9929 * // The `_.property` iteratee shorthand.
9930 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
9931 * // => [{ 'x': 1 }, { 'x': 2 }]
9932 */
9933 function uniqBy(array, iteratee) {
9934 return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
9935 }
9936
9937 /**
9938 * This method is like `_.uniq` except that it accepts `comparator` which
9939 * is invoked to compare elements of `array`. The order of result values is
9940 * determined by the order they occur in the array.The comparator is invoked
9941 * with two arguments: (arrVal, othVal).
9942 *
9943 * @static
9944 * @memberOf _
9945 * @since 4.0.0
9946 * @category Array
9947 * @param {Array} array The array to inspect.
9948 * @param {Function} [comparator] The comparator invoked per element.
9949 * @returns {Array} Returns the new duplicate free array.
9950 * @example
9951 *
9952 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
9953 *
9954 * _.uniqWith(objects, _.isEqual);
9955 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
9956 */
9957 function uniqWith(array, comparator) {
9958 comparator = typeof comparator == 'function' ? comparator : undefined;
9959 return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
9960 }
9961
9962 /**
9963 * This method is like `_.zip` except that it accepts an array of grouped
9964 * elements and creates an array regrouping the elements to their pre-zip
9965 * configuration.
9966 *
9967 * @static
9968 * @memberOf _
9969 * @since 1.2.0
9970 * @category Array
9971 * @param {Array} array The array of grouped elements to process.
9972 * @returns {Array} Returns the new array of regrouped elements.
9973 * @example
9974 *
9975 * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
9976 * // => [['a', 1, true], ['b', 2, false]]
9977 *
9978 * _.unzip(zipped);
9979 * // => [['a', 'b'], [1, 2], [true, false]]
9980 */
9981 function unzip(array) {
9982 if (!(array && array.length)) {
9983 return [];
9984 }
9985 var length = 0;
9986 array = arrayFilter(array, function(group) {
9987 if (isArrayLikeObject(group)) {
9988 length = nativeMax(group.length, length);
9989 return true;
9990 }
9991 });
9992 return baseTimes(length, function(index) {
9993 return arrayMap(array, baseProperty(index));
9994 });
9995 }
9996
9997 /**
9998 * This method is like `_.unzip` except that it accepts `iteratee` to specify
9999 * how regrouped values should be combined. The iteratee is invoked with the
10000 * elements of each group: (...group).
10001 *
10002 * @static
10003 * @memberOf _
10004 * @since 3.8.0
10005 * @category Array
10006 * @param {Array} array The array of grouped elements to process.
10007 * @param {Function} [iteratee=_.identity] The function to combine
10008 * regrouped values.
10009 * @returns {Array} Returns the new array of regrouped elements.
10010 * @example
10011 *
10012 * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
10013 * // => [[1, 10, 100], [2, 20, 200]]
10014 *
10015 * _.unzipWith(zipped, _.add);
10016 * // => [3, 30, 300]
10017 */
10018 function unzipWith(array, iteratee) {
10019 if (!(array && array.length)) {
10020 return [];
10021 }
10022 var result = unzip(array);
10023 if (iteratee == null) {
10024 return result;
10025 }
10026 return arrayMap(result, function(group) {
10027 return apply(iteratee, undefined, group);
10028 });
10029 }
10030
10031 /**
10032 * Creates an array excluding all given values using
10033 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
10034 * for equality comparisons.
10035 *
10036 * **Note:** Unlike `_.pull`, this method returns a new array.
10037 *
10038 * @static
10039 * @memberOf _
10040 * @since 0.1.0
10041 * @category Array
10042 * @param {Array} array The array to inspect.
10043 * @param {...*} [values] The values to exclude.
10044 * @returns {Array} Returns the new array of filtered values.
10045 * @see _.difference, _.xor
10046 * @example
10047 *
10048 * _.without([2, 1, 2, 3], 1, 2);
10049 * // => [3]
10050 */
10051 var without = baseRest(function(array, values) {
10052 return isArrayLikeObject(array)
10053 ? baseDifference(array, values)
10054 : [];
10055 });
10056
10057 /**
10058 * Creates an array of unique values that is the
10059 * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
10060 * of the given arrays. The order of result values is determined by the order
10061 * they occur in the arrays.
10062 *
10063 * @static
10064 * @memberOf _
10065 * @since 2.4.0
10066 * @category Array
10067 * @param {...Array} [arrays] The arrays to inspect.
10068 * @returns {Array} Returns the new array of filtered values.
10069 * @see _.difference, _.without
10070 * @example
10071 *
10072 * _.xor([2, 1], [2, 3]);
10073 * // => [1, 3]
10074 */
10075 var xor = baseRest(function(arrays) {
10076 return baseXor(arrayFilter(arrays, isArrayLikeObject));
10077 });
10078
10079 /**
10080 * This method is like `_.xor` except that it accepts `iteratee` which is
10081 * invoked for each element of each `arrays` to generate the criterion by
10082 * which by which they're compared. The order of result values is determined
10083 * by the order they occur in the arrays. The iteratee is invoked with one
10084 * argument: (value).
10085 *
10086 * @static
10087 * @memberOf _
10088 * @since 4.0.0
10089 * @category Array
10090 * @param {...Array} [arrays] The arrays to inspect.
10091 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
10092 * @returns {Array} Returns the new array of filtered values.
10093 * @example
10094 *
10095 * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
10096 * // => [1.2, 3.4]
10097 *
10098 * // The `_.property` iteratee shorthand.
10099 * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
10100 * // => [{ 'x': 2 }]
10101 */
10102 var xorBy = baseRest(function(arrays) {
10103 var iteratee = last(arrays);
10104 if (isArrayLikeObject(iteratee)) {
10105 iteratee = undefined;
10106 }
10107 return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
10108 });
10109
10110 /**
10111 * This method is like `_.xor` except that it accepts `comparator` which is
10112 * invoked to compare elements of `arrays`. The order of result values is
10113 * determined by the order they occur in the arrays. The comparator is invoked
10114 * with two arguments: (arrVal, othVal).
10115 *
10116 * @static
10117 * @memberOf _
10118 * @since 4.0.0
10119 * @category Array
10120 * @param {...Array} [arrays] The arrays to inspect.
10121 * @param {Function} [comparator] The comparator invoked per element.
10122 * @returns {Array} Returns the new array of filtered values.
10123 * @example
10124 *
10125 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
10126 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
10127 *
10128 * _.xorWith(objects, others, _.isEqual);
10129 * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
10130 */
10131 var xorWith = baseRest(function(arrays) {
10132 var comparator = last(arrays);
10133 comparator = typeof comparator == 'function' ? comparator : undefined;
10134 return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
10135 });
10136
10137 /**
10138 * Creates an array of grouped elements, the first of which contains the
10139 * first elements of the given arrays, the second of which contains the
10140 * second elements of the given arrays, and so on.
10141 *
10142 * @static
10143 * @memberOf _
10144 * @since 0.1.0
10145 * @category Array
10146 * @param {...Array} [arrays] The arrays to process.
10147 * @returns {Array} Returns the new array of grouped elements.
10148 * @example
10149 *
10150 * _.zip(['a', 'b'], [1, 2], [true, false]);
10151 * // => [['a', 1, true], ['b', 2, false]]
10152 */
10153 var zip = baseRest(unzip);
10154
10155 /**
10156 * This method is like `_.fromPairs` except that it accepts two arrays,
10157 * one of property identifiers and one of corresponding values.
10158 *
10159 * @static
10160 * @memberOf _
10161 * @since 0.4.0
10162 * @category Array
10163 * @param {Array} [props=[]] The property identifiers.
10164 * @param {Array} [values=[]] The property values.
10165 * @returns {Object} Returns the new object.
10166 * @example
10167 *
10168 * _.zipObject(['a', 'b'], [1, 2]);
10169 * // => { 'a': 1, 'b': 2 }
10170 */
10171 function zipObject(props, values) {
10172 return baseZipObject(props || [], values || [], assignValue);
10173 }
10174
10175 /**
10176 * This method is like `_.zipObject` except that it supports property paths.
10177 *
10178 * @static
10179 * @memberOf _
10180 * @since 4.1.0
10181 * @category Array
10182 * @param {Array} [props=[]] The property identifiers.
10183 * @param {Array} [values=[]] The property values.
10184 * @returns {Object} Returns the new object.
10185 * @example
10186 *
10187 * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
10188 * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
10189 */
10190 function zipObjectDeep(props, values) {
10191 return baseZipObject(props || [], values || [], baseSet);
10192 }
10193
10194 /**
10195 * This method is like `_.zip` except that it accepts `iteratee` to specify
10196 * how grouped values should be combined. The iteratee is invoked with the
10197 * elements of each group: (...group).
10198 *
10199 * @static
10200 * @memberOf _
10201 * @since 3.8.0
10202 * @category Array
10203 * @param {...Array} [arrays] The arrays to process.
10204 * @param {Function} [iteratee=_.identity] The function to combine
10205 * grouped values.
10206 * @returns {Array} Returns the new array of grouped elements.
10207 * @example
10208 *
10209 * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
10210 * return a + b + c;
10211 * });
10212 * // => [111, 222]
10213 */
10214 var zipWith = baseRest(function(arrays) {
10215 var length = arrays.length,
10216 iteratee = length > 1 ? arrays[length - 1] : undefined;
10217
10218 iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
10219 return unzipWith(arrays, iteratee);
10220 });
10221
10222 /*------------------------------------------------------------------------*/
10223
10224 /**
10225 * Creates a `lodash` wrapper instance that wraps `value` with explicit method
10226 * chain sequences enabled. The result of such sequences must be unwrapped
10227 * with `_#value`.
10228 *
10229 * @static
10230 * @memberOf _
10231 * @since 1.3.0
10232 * @category Seq
10233 * @param {*} value The value to wrap.
10234 * @returns {Object} Returns the new `lodash` wrapper instance.
10235 * @example
10236 *
10237 * var users = [
10238 * { 'user': 'barney', 'age': 36 },
10239 * { 'user': 'fred', 'age': 40 },
10240 * { 'user': 'pebbles', 'age': 1 }
10241 * ];
10242 *
10243 * var youngest = _
10244 * .chain(users)
10245 * .sortBy('age')
10246 * .map(function(o) {
10247 * return o.user + ' is ' + o.age;
10248 * })
10249 * .head()
10250 * .value();
10251 * // => 'pebbles is 1'
10252 */
10253 function chain(value) {
10254 var result = lodash(value);
10255 result.__chain__ = true;
10256 return result;
10257 }
10258
10259 /**
10260 * This method invokes `interceptor` and returns `value`. The interceptor
10261 * is invoked with one argument; (value). The purpose of this method is to
10262 * "tap into" a method chain sequence in order to modify intermediate results.
10263 *
10264 * @static
10265 * @memberOf _
10266 * @since 0.1.0
10267 * @category Seq
10268 * @param {*} value The value to provide to `interceptor`.
10269 * @param {Function} interceptor The function to invoke.
10270 * @returns {*} Returns `value`.
10271 * @example
10272 *
10273 * _([1, 2, 3])
10274 * .tap(function(array) {
10275 * // Mutate input array.
10276 * array.pop();
10277 * })
10278 * .reverse()
10279 * .value();
10280 * // => [2, 1]
10281 */
10282 function tap(value, interceptor) {
10283 interceptor(value);
10284 return value;
10285 }
10286
10287 /**
10288 * This method is like `_.tap` except that it returns the result of `interceptor`.
10289 * The purpose of this method is to "pass thru" values replacing intermediate
10290 * results in a method chain sequence.
10291 *
10292 * @static
10293 * @memberOf _
10294 * @since 3.0.0
10295 * @category Seq
10296 * @param {*} value The value to provide to `interceptor`.
10297 * @param {Function} interceptor The function to invoke.
10298 * @returns {*} Returns the result of `interceptor`.
10299 * @example
10300 *
10301 * _(' abc ')
10302 * .chain()
10303 * .trim()
10304 * .thru(function(value) {
10305 * return [value];
10306 * })
10307 * .value();
10308 * // => ['abc']
10309 */
10310 function thru(value, interceptor) {
10311 return interceptor(value);
10312 }
10313
10314 /**
10315 * This method is the wrapper version of `_.at`.
10316 *
10317 * @name at
10318 * @memberOf _
10319 * @since 1.0.0
10320 * @category Seq
10321 * @param {...(string|string[])} [paths] The property paths to pick.
10322 * @returns {Object} Returns the new `lodash` wrapper instance.
10323 * @example
10324 *
10325 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
10326 *
10327 * _(object).at(['a[0].b.c', 'a[1]']).value();
10328 * // => [3, 4]
10329 */
10330 var wrapperAt = flatRest(function(paths) {
10331 var length = paths.length,
10332 start = length ? paths[0] : 0,
10333 value = this.__wrapped__,
10334 interceptor = function(object) { return baseAt(object, paths); };
10335
10336 if (length > 1 || this.__actions__.length ||
10337 !(value instanceof LazyWrapper) || !isIndex(start)) {
10338 return this.thru(interceptor);
10339 }
10340 value = value.slice(start, +start + (length ? 1 : 0));
10341 value.__actions__.push({
10342 'func': thru,
10343 'args': [interceptor],
10344 'thisArg': undefined
10345 });
10346 return new LodashWrapper(value, this.__chain__).thru(function(array) {
10347 if (length && !array.length) {
10348 array.push(undefined);
10349 }
10350 return array;
10351 });
10352 });
10353
10354 /**
10355 * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
10356 *
10357 * @name chain
10358 * @memberOf _
10359 * @since 0.1.0
10360 * @category Seq
10361 * @returns {Object} Returns the new `lodash` wrapper instance.
10362 * @example
10363 *
10364 * var users = [
10365 * { 'user': 'barney', 'age': 36 },
10366 * { 'user': 'fred', 'age': 40 }
10367 * ];
10368 *
10369 * // A sequence without explicit chaining.
10370 * _(users).head();
10371 * // => { 'user': 'barney', 'age': 36 }
10372 *
10373 * // A sequence with explicit chaining.
10374 * _(users)
10375 * .chain()
10376 * .head()
10377 * .pick('user')
10378 * .value();
10379 * // => { 'user': 'barney' }
10380 */
10381 function wrapperChain() {
10382 return chain(this);
10383 }
10384
10385 /**
10386 * Executes the chain sequence and returns the wrapped result.
10387 *
10388 * @name commit
10389 * @memberOf _
10390 * @since 3.2.0
10391 * @category Seq
10392 * @returns {Object} Returns the new `lodash` wrapper instance.
10393 * @example
10394 *
10395 * var array = [1, 2];
10396 * var wrapped = _(array).push(3);
10397 *
10398 * console.log(array);
10399 * // => [1, 2]
10400 *
10401 * wrapped = wrapped.commit();
10402 * console.log(array);
10403 * // => [1, 2, 3]
10404 *
10405 * wrapped.last();
10406 * // => 3
10407 *
10408 * console.log(array);
10409 * // => [1, 2, 3]
10410 */
10411 function wrapperCommit() {
10412 return new LodashWrapper(this.value(), this.__chain__);
10413 }
10414
10415 /**
10416 * Gets the next value on a wrapped object following the
10417 * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
10418 *
10419 * @name next
10420 * @memberOf _
10421 * @since 4.0.0
10422 * @category Seq
10423 * @returns {Object} Returns the next iterator value.
10424 * @example
10425 *
10426 * var wrapped = _([1, 2]);
10427 *
10428 * wrapped.next();
10429 * // => { 'done': false, 'value': 1 }
10430 *
10431 * wrapped.next();
10432 * // => { 'done': false, 'value': 2 }
10433 *
10434 * wrapped.next();
10435 * // => { 'done': true, 'value': undefined }
10436 */
10437 function wrapperNext() {
10438 if (this.__values__ === undefined) {
10439 this.__values__ = toArray(this.value());
10440 }
10441 var done = this.__index__ >= this.__values__.length,
10442 value = done ? undefined : this.__values__[this.__index__++];
10443
10444 return { 'done': done, 'value': value };
10445 }
10446
10447 /**
10448 * Enables the wrapper to be iterable.
10449 *
10450 * @name Symbol.iterator
10451 * @memberOf _
10452 * @since 4.0.0
10453 * @category Seq
10454 * @returns {Object} Returns the wrapper object.
10455 * @example
10456 *
10457 * var wrapped = _([1, 2]);
10458 *
10459 * wrapped[Symbol.iterator]() === wrapped;
10460 * // => true
10461 *
10462 * Array.from(wrapped);
10463 * // => [1, 2]
10464 */
10465 function wrapperToIterator() {
10466 return this;
10467 }
10468
10469 /**
10470 * Creates a clone of the chain sequence planting `value` as the wrapped value.
10471 *
10472 * @name plant
10473 * @memberOf _
10474 * @since 3.2.0
10475 * @category Seq
10476 * @param {*} value The value to plant.
10477 * @returns {Object} Returns the new `lodash` wrapper instance.
10478 * @example
10479 *
10480 * function square(n) {
10481 * return n * n;
10482 * }
10483 *
10484 * var wrapped = _([1, 2]).map(square);
10485 * var other = wrapped.plant([3, 4]);
10486 *
10487 * other.value();
10488 * // => [9, 16]
10489 *
10490 * wrapped.value();
10491 * // => [1, 4]
10492 */
10493 function wrapperPlant(value) {
10494 var result,
10495 parent = this;
10496
10497 while (parent instanceof baseLodash) {
10498 var clone = wrapperClone(parent);
10499 clone.__index__ = 0;
10500 clone.__values__ = undefined;
10501 if (result) {
10502 previous.__wrapped__ = clone;
10503 } else {
10504 result = clone;
10505 }
10506 var previous = clone;
10507 parent = parent.__wrapped__;
10508 }
10509 previous.__wrapped__ = value;
10510 return result;
10511 }
10512
10513 /**
10514 * This method is the wrapper version of `_.reverse`.
10515 *
10516 * **Note:** This method mutates the wrapped array.
10517 *
10518 * @name reverse
10519 * @memberOf _
10520 * @since 0.1.0
10521 * @category Seq
10522 * @returns {Object} Returns the new `lodash` wrapper instance.
10523 * @example
10524 *
10525 * var array = [1, 2, 3];
10526 *
10527 * _(array).reverse().value()
10528 * // => [3, 2, 1]
10529 *
10530 * console.log(array);
10531 * // => [3, 2, 1]
10532 */
10533 function wrapperReverse() {
10534 var value = this.__wrapped__;
10535 if (value instanceof LazyWrapper) {
10536 var wrapped = value;
10537 if (this.__actions__.length) {
10538 wrapped = new LazyWrapper(this);
10539 }
10540 wrapped = wrapped.reverse();
10541 wrapped.__actions__.push({
10542 'func': thru,
10543 'args': [reverse],
10544 'thisArg': undefined
10545 });
10546 return new LodashWrapper(wrapped, this.__chain__);
10547 }
10548 return this.thru(reverse);
10549 }
10550
10551 /**
10552 * Executes the chain sequence to resolve the unwrapped value.
10553 *
10554 * @name value
10555 * @memberOf _
10556 * @since 0.1.0
10557 * @alias toJSON, valueOf
10558 * @category Seq
10559 * @returns {*} Returns the resolved unwrapped value.
10560 * @example
10561 *
10562 * _([1, 2, 3]).value();
10563 * // => [1, 2, 3]
10564 */
10565 function wrapperValue() {
10566 return baseWrapperValue(this.__wrapped__, this.__actions__);
10567 }
10568
10569 /*------------------------------------------------------------------------*/
10570
10571 /**
10572 * Creates an object composed of keys generated from the results of running
10573 * each element of `collection` thru `iteratee`. The corresponding value of
10574 * each key is the number of times the key was returned by `iteratee`. The
10575 * iteratee is invoked with one argument: (value).
10576 *
10577 * @static
10578 * @memberOf _
10579 * @since 0.5.0
10580 * @category Collection
10581 * @param {Array|Object} collection The collection to iterate over.
10582 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
10583 * @returns {Object} Returns the composed aggregate object.
10584 * @example
10585 *
10586 * _.countBy([6.1, 4.2, 6.3], Math.floor);
10587 * // => { '4': 1, '6': 2 }
10588 *
10589 * // The `_.property` iteratee shorthand.
10590 * _.countBy(['one', 'two', 'three'], 'length');
10591 * // => { '3': 2, '5': 1 }
10592 */
10593 var countBy = createAggregator(function(result, value, key) {
10594 if (hasOwnProperty.call(result, key)) {
10595 ++result[key];
10596 } else {
10597 baseAssignValue(result, key, 1);
10598 }
10599 });
10600
10601 /**
10602 * Checks if `predicate` returns truthy for **all** elements of `collection`.
10603 * Iteration is stopped once `predicate` returns falsey. The predicate is
10604 * invoked with three arguments: (value, index|key, collection).
10605 *
10606 * **Note:** This method returns `true` for
10607 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
10608 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
10609 * elements of empty collections.
10610 *
10611 * @static
10612 * @memberOf _
10613 * @since 0.1.0
10614 * @category Collection
10615 * @param {Array|Object} collection The collection to iterate over.
10616 * @param {Function} [predicate=_.identity] The function invoked per iteration.
10617 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10618 * @returns {boolean} Returns `true` if all elements pass the predicate check,
10619 * else `false`.
10620 * @example
10621 *
10622 * _.every([true, 1, null, 'yes'], Boolean);
10623 * // => false
10624 *
10625 * var users = [
10626 * { 'user': 'barney', 'age': 36, 'active': false },
10627 * { 'user': 'fred', 'age': 40, 'active': false }
10628 * ];
10629 *
10630 * // The `_.matches` iteratee shorthand.
10631 * _.every(users, { 'user': 'barney', 'active': false });
10632 * // => false
10633 *
10634 * // The `_.matchesProperty` iteratee shorthand.
10635 * _.every(users, ['active', false]);
10636 * // => true
10637 *
10638 * // The `_.property` iteratee shorthand.
10639 * _.every(users, 'active');
10640 * // => false
10641 */
10642 function every(collection, predicate, guard) {
10643 var func = isArray(collection) ? arrayEvery : baseEvery;
10644 if (guard && isIterateeCall(collection, predicate, guard)) {
10645 predicate = undefined;
10646 }
10647 return func(collection, getIteratee(predicate, 3));
10648 }
10649
10650 /**
10651 * Iterates over elements of `collection`, returning an array of all elements
10652 * `predicate` returns truthy for. The predicate is invoked with three
10653 * arguments: (value, index|key, collection).
10654 *
10655 * **Note:** Unlike `_.remove`, this method returns a new array.
10656 *
10657 * @static
10658 * @memberOf _
10659 * @since 0.1.0
10660 * @category Collection
10661 * @param {Array|Object} collection The collection to iterate over.
10662 * @param {Function} [predicate=_.identity] The function invoked per iteration.
10663 * @returns {Array} Returns the new filtered array.
10664 * @see _.reject
10665 * @example
10666 *
10667 * var users = [
10668 * { 'user': 'barney', 'age': 36, 'active': true },
10669 * { 'user': 'fred', 'age': 40, 'active': false }
10670 * ];
10671 *
10672 * _.filter(users, function(o) { return !o.active; });
10673 * // => objects for ['fred']
10674 *
10675 * // The `_.matches` iteratee shorthand.
10676 * _.filter(users, { 'age': 36, 'active': true });
10677 * // => objects for ['barney']
10678 *
10679 * // The `_.matchesProperty` iteratee shorthand.
10680 * _.filter(users, ['active', false]);
10681 * // => objects for ['fred']
10682 *
10683 * // The `_.property` iteratee shorthand.
10684 * _.filter(users, 'active');
10685 * // => objects for ['barney']
10686 *
10687 * // Combining several predicates using `_.overEvery` or `_.overSome`.
10688 * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
10689 * // => objects for ['fred', 'barney']
10690 */
10691 function filter(collection, predicate) {
10692 var func = isArray(collection) ? arrayFilter : baseFilter;
10693 return func(collection, getIteratee(predicate, 3));
10694 }
10695
10696 /**
10697 * Iterates over elements of `collection`, returning the first element
10698 * `predicate` returns truthy for. The predicate is invoked with three
10699 * arguments: (value, index|key, collection).
10700 *
10701 * @static
10702 * @memberOf _
10703 * @since 0.1.0
10704 * @category Collection
10705 * @param {Array|Object} collection The collection to inspect.
10706 * @param {Function} [predicate=_.identity] The function invoked per iteration.
10707 * @param {number} [fromIndex=0] The index to search from.
10708 * @returns {*} Returns the matched element, else `undefined`.
10709 * @example
10710 *
10711 * var users = [
10712 * { 'user': 'barney', 'age': 36, 'active': true },
10713 * { 'user': 'fred', 'age': 40, 'active': false },
10714 * { 'user': 'pebbles', 'age': 1, 'active': true }
10715 * ];
10716 *
10717 * _.find(users, function(o) { return o.age < 40; });
10718 * // => object for 'barney'
10719 *
10720 * // The `_.matches` iteratee shorthand.
10721 * _.find(users, { 'age': 1, 'active': true });
10722 * // => object for 'pebbles'
10723 *
10724 * // The `_.matchesProperty` iteratee shorthand.
10725 * _.find(users, ['active', false]);
10726 * // => object for 'fred'
10727 *
10728 * // The `_.property` iteratee shorthand.
10729 * _.find(users, 'active');
10730 * // => object for 'barney'
10731 */
10732 var find = createFind(findIndex);
10733
10734 /**
10735 * This method is like `_.find` except that it iterates over elements of
10736 * `collection` from right to left.
10737 *
10738 * @static
10739 * @memberOf _
10740 * @since 2.0.0
10741 * @category Collection
10742 * @param {Array|Object} collection The collection to inspect.
10743 * @param {Function} [predicate=_.identity] The function invoked per iteration.
10744 * @param {number} [fromIndex=collection.length-1] The index to search from.
10745 * @returns {*} Returns the matched element, else `undefined`.
10746 * @example
10747 *
10748 * _.findLast([1, 2, 3, 4], function(n) {
10749 * return n % 2 == 1;
10750 * });
10751 * // => 3
10752 */
10753 var findLast = createFind(findLastIndex);
10754
10755 /**
10756 * Creates a flattened array of values by running each element in `collection`
10757 * thru `iteratee` and flattening the mapped results. The iteratee is invoked
10758 * with three arguments: (value, index|key, collection).
10759 *
10760 * @static
10761 * @memberOf _
10762 * @since 4.0.0
10763 * @category Collection
10764 * @param {Array|Object} collection The collection to iterate over.
10765 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10766 * @returns {Array} Returns the new flattened array.
10767 * @example
10768 *
10769 * function duplicate(n) {
10770 * return [n, n];
10771 * }
10772 *
10773 * _.flatMap([1, 2], duplicate);
10774 * // => [1, 1, 2, 2]
10775 */
10776 function flatMap(collection, iteratee) {
10777 return baseFlatten(map(collection, iteratee), 1);
10778 }
10779
10780 /**
10781 * This method is like `_.flatMap` except that it recursively flattens the
10782 * mapped results.
10783 *
10784 * @static
10785 * @memberOf _
10786 * @since 4.7.0
10787 * @category Collection
10788 * @param {Array|Object} collection The collection to iterate over.
10789 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10790 * @returns {Array} Returns the new flattened array.
10791 * @example
10792 *
10793 * function duplicate(n) {
10794 * return [[[n, n]]];
10795 * }
10796 *
10797 * _.flatMapDeep([1, 2], duplicate);
10798 * // => [1, 1, 2, 2]
10799 */
10800 function flatMapDeep(collection, iteratee) {
10801 return baseFlatten(map(collection, iteratee), INFINITY);
10802 }
10803
10804 /**
10805 * This method is like `_.flatMap` except that it recursively flattens the
10806 * mapped results up to `depth` times.
10807 *
10808 * @static
10809 * @memberOf _
10810 * @since 4.7.0
10811 * @category Collection
10812 * @param {Array|Object} collection The collection to iterate over.
10813 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10814 * @param {number} [depth=1] The maximum recursion depth.
10815 * @returns {Array} Returns the new flattened array.
10816 * @example
10817 *
10818 * function duplicate(n) {
10819 * return [[[n, n]]];
10820 * }
10821 *
10822 * _.flatMapDepth([1, 2], duplicate, 2);
10823 * // => [[1, 1], [2, 2]]
10824 */
10825 function flatMapDepth(collection, iteratee, depth) {
10826 depth = depth === undefined ? 1 : toInteger(depth);
10827 return baseFlatten(map(collection, iteratee), depth);
10828 }
10829
10830 /**
10831 * Iterates over elements of `collection` and invokes `iteratee` for each element.
10832 * The iteratee is invoked with three arguments: (value, index|key, collection).
10833 * Iteratee functions may exit iteration early by explicitly returning `false`.
10834 *
10835 * **Note:** As with other "Collections" methods, objects with a "length"
10836 * property are iterated like arrays. To avoid this behavior use `_.forIn`
10837 * or `_.forOwn` for object iteration.
10838 *
10839 * @static
10840 * @memberOf _
10841 * @since 0.1.0
10842 * @alias each
10843 * @category Collection
10844 * @param {Array|Object} collection The collection to iterate over.
10845 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10846 * @returns {Array|Object} Returns `collection`.
10847 * @see _.forEachRight
10848 * @example
10849 *
10850 * _.forEach([1, 2], function(value) {
10851 * console.log(value);
10852 * });
10853 * // => Logs `1` then `2`.
10854 *
10855 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
10856 * console.log(key);
10857 * });
10858 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
10859 */
10860 function forEach(collection, iteratee) {
10861 var func = isArray(collection) ? arrayEach : baseEach;
10862 return func(collection, getIteratee(iteratee, 3));
10863 }
10864
10865 /**
10866 * This method is like `_.forEach` except that it iterates over elements of
10867 * `collection` from right to left.
10868 *
10869 * @static
10870 * @memberOf _
10871 * @since 2.0.0
10872 * @alias eachRight
10873 * @category Collection
10874 * @param {Array|Object} collection The collection to iterate over.
10875 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10876 * @returns {Array|Object} Returns `collection`.
10877 * @see _.forEach
10878 * @example
10879 *
10880 * _.forEachRight([1, 2], function(value) {
10881 * console.log(value);
10882 * });
10883 * // => Logs `2` then `1`.
10884 */
10885 function forEachRight(collection, iteratee) {
10886 var func = isArray(collection) ? arrayEachRight : baseEachRight;
10887 return func(collection, getIteratee(iteratee, 3));
10888 }
10889
10890 /**
10891 * Creates an object composed of keys generated from the results of running
10892 * each element of `collection` thru `iteratee`. The order of grouped values
10893 * is determined by the order they occur in `collection`. The corresponding
10894 * value of each key is an array of elements responsible for generating the
10895 * key. The iteratee is invoked with one argument: (value).
10896 *
10897 * @static
10898 * @memberOf _
10899 * @since 0.1.0
10900 * @category Collection
10901 * @param {Array|Object} collection The collection to iterate over.
10902 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
10903 * @returns {Object} Returns the composed aggregate object.
10904 * @example
10905 *
10906 * _.groupBy([6.1, 4.2, 6.3], Math.floor);
10907 * // => { '4': [4.2], '6': [6.1, 6.3] }
10908 *
10909 * // The `_.property` iteratee shorthand.
10910 * _.groupBy(['one', 'two', 'three'], 'length');
10911 * // => { '3': ['one', 'two'], '5': ['three'] }
10912 */
10913 var groupBy = createAggregator(function(result, value, key) {
10914 if (hasOwnProperty.call(result, key)) {
10915 result[key].push(value);
10916 } else {
10917 baseAssignValue(result, key, [value]);
10918 }
10919 });
10920
10921 /**
10922 * Checks if `value` is in `collection`. If `collection` is a string, it's
10923 * checked for a substring of `value`, otherwise
10924 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
10925 * is used for equality comparisons. If `fromIndex` is negative, it's used as
10926 * the offset from the end of `collection`.
10927 *
10928 * @static
10929 * @memberOf _
10930 * @since 0.1.0
10931 * @category Collection
10932 * @param {Array|Object|string} collection The collection to inspect.
10933 * @param {*} value The value to search for.
10934 * @param {number} [fromIndex=0] The index to search from.
10935 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
10936 * @returns {boolean} Returns `true` if `value` is found, else `false`.
10937 * @example
10938 *
10939 * _.includes([1, 2, 3], 1);
10940 * // => true
10941 *
10942 * _.includes([1, 2, 3], 1, 2);
10943 * // => false
10944 *
10945 * _.includes({ 'a': 1, 'b': 2 }, 1);
10946 * // => true
10947 *
10948 * _.includes('abcd', 'bc');
10949 * // => true
10950 */
10951 function includes(collection, value, fromIndex, guard) {
10952 collection = isArrayLike(collection) ? collection : values(collection);
10953 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
10954
10955 var length = collection.length;
10956 if (fromIndex < 0) {
10957 fromIndex = nativeMax(length + fromIndex, 0);
10958 }
10959 return isString(collection)
10960 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
10961 : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
10962 }
10963
10964 /**
10965 * Invokes the method at `path` of each element in `collection`, returning
10966 * an array of the results of each invoked method. Any additional arguments
10967 * are provided to each invoked method. If `path` is a function, it's invoked
10968 * for, and `this` bound to, each element in `collection`.
10969 *
10970 * @static
10971 * @memberOf _
10972 * @since 4.0.0
10973 * @category Collection
10974 * @param {Array|Object} collection The collection to iterate over.
10975 * @param {Array|Function|string} path The path of the method to invoke or
10976 * the function invoked per iteration.
10977 * @param {...*} [args] The arguments to invoke each method with.
10978 * @returns {Array} Returns the array of results.
10979 * @example
10980 *
10981 * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
10982 * // => [[1, 5, 7], [1, 2, 3]]
10983 *
10984 * _.invokeMap([123, 456], String.prototype.split, '');
10985 * // => [['1', '2', '3'], ['4', '5', '6']]
10986 */
10987 var invokeMap = baseRest(function(collection, path, args) {
10988 var index = -1,
10989 isFunc = typeof path == 'function',
10990 result = isArrayLike(collection) ? Array(collection.length) : [];
10991
10992 baseEach(collection, function(value) {
10993 result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
10994 });
10995 return result;
10996 });
10997
10998 /**
10999 * Creates an object composed of keys generated from the results of running
11000 * each element of `collection` thru `iteratee`. The corresponding value of
11001 * each key is the last element responsible for generating the key. The
11002 * iteratee is invoked with one argument: (value).
11003 *
11004 * @static
11005 * @memberOf _
11006 * @since 4.0.0
11007 * @category Collection
11008 * @param {Array|Object} collection The collection to iterate over.
11009 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
11010 * @returns {Object} Returns the composed aggregate object.
11011 * @example
11012 *
11013 * var array = [
11014 * { 'dir': 'left', 'code': 97 },
11015 * { 'dir': 'right', 'code': 100 }
11016 * ];
11017 *
11018 * _.keyBy(array, function(o) {
11019 * return String.fromCharCode(o.code);
11020 * });
11021 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
11022 *
11023 * _.keyBy(array, 'dir');
11024 * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
11025 */
11026 var keyBy = createAggregator(function(result, value, key) {
11027 baseAssignValue(result, key, value);
11028 });
11029
11030 /**
11031 * Creates an array of values by running each element in `collection` thru
11032 * `iteratee`. The iteratee is invoked with three arguments:
11033 * (value, index|key, collection).
11034 *
11035 * Many lodash methods are guarded to work as iteratees for methods like
11036 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
11037 *
11038 * The guarded methods are:
11039 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
11040 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
11041 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
11042 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
11043 *
11044 * @static
11045 * @memberOf _
11046 * @since 0.1.0
11047 * @category Collection
11048 * @param {Array|Object} collection The collection to iterate over.
11049 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11050 * @returns {Array} Returns the new mapped array.
11051 * @example
11052 *
11053 * function square(n) {
11054 * return n * n;
11055 * }
11056 *
11057 * _.map([4, 8], square);
11058 * // => [16, 64]
11059 *
11060 * _.map({ 'a': 4, 'b': 8 }, square);
11061 * // => [16, 64] (iteration order is not guaranteed)
11062 *
11063 * var users = [
11064 * { 'user': 'barney' },
11065 * { 'user': 'fred' }
11066 * ];
11067 *
11068 * // The `_.property` iteratee shorthand.
11069 * _.map(users, 'user');
11070 * // => ['barney', 'fred']
11071 */
11072 function map(collection, iteratee) {
11073 var func = isArray(collection) ? arrayMap : baseMap;
11074 return func(collection, getIteratee(iteratee, 3));
11075 }
11076
11077 /**
11078 * This method is like `_.sortBy` except that it allows specifying the sort
11079 * orders of the iteratees to sort by. If `orders` is unspecified, all values
11080 * are sorted in ascending order. Otherwise, specify an order of "desc" for
11081 * descending or "asc" for ascending sort order of corresponding values.
11082 *
11083 * @static
11084 * @memberOf _
11085 * @since 4.0.0
11086 * @category Collection
11087 * @param {Array|Object} collection The collection to iterate over.
11088 * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
11089 * The iteratees to sort by.
11090 * @param {string[]} [orders] The sort orders of `iteratees`.
11091 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
11092 * @returns {Array} Returns the new sorted array.
11093 * @example
11094 *
11095 * var users = [
11096 * { 'user': 'fred', 'age': 48 },
11097 * { 'user': 'barney', 'age': 34 },
11098 * { 'user': 'fred', 'age': 40 },
11099 * { 'user': 'barney', 'age': 36 }
11100 * ];
11101 *
11102 * // Sort by `user` in ascending order and by `age` in descending order.
11103 * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
11104 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
11105 */
11106 function orderBy(collection, iteratees, orders, guard) {
11107 if (collection == null) {
11108 return [];
11109 }
11110 if (!isArray(iteratees)) {
11111 iteratees = iteratees == null ? [] : [iteratees];
11112 }
11113 orders = guard ? undefined : orders;
11114 if (!isArray(orders)) {
11115 orders = orders == null ? [] : [orders];
11116 }
11117 return baseOrderBy(collection, iteratees, orders);
11118 }
11119
11120 /**
11121 * Creates an array of elements split into two groups, the first of which
11122 * contains elements `predicate` returns truthy for, the second of which
11123 * contains elements `predicate` returns falsey for. The predicate is
11124 * invoked with one argument: (value).
11125 *
11126 * @static
11127 * @memberOf _
11128 * @since 3.0.0
11129 * @category Collection
11130 * @param {Array|Object} collection The collection to iterate over.
11131 * @param {Function} [predicate=_.identity] The function invoked per iteration.
11132 * @returns {Array} Returns the array of grouped elements.
11133 * @example
11134 *
11135 * var users = [
11136 * { 'user': 'barney', 'age': 36, 'active': false },
11137 * { 'user': 'fred', 'age': 40, 'active': true },
11138 * { 'user': 'pebbles', 'age': 1, 'active': false }
11139 * ];
11140 *
11141 * _.partition(users, function(o) { return o.active; });
11142 * // => objects for [['fred'], ['barney', 'pebbles']]
11143 *
11144 * // The `_.matches` iteratee shorthand.
11145 * _.partition(users, { 'age': 1, 'active': false });
11146 * // => objects for [['pebbles'], ['barney', 'fred']]
11147 *
11148 * // The `_.matchesProperty` iteratee shorthand.
11149 * _.partition(users, ['active', false]);
11150 * // => objects for [['barney', 'pebbles'], ['fred']]
11151 *
11152 * // The `_.property` iteratee shorthand.
11153 * _.partition(users, 'active');
11154 * // => objects for [['fred'], ['barney', 'pebbles']]
11155 */
11156 var partition = createAggregator(function(result, value, key) {
11157 result[key ? 0 : 1].push(value);
11158 }, function() { return [[], []]; });
11159
11160 /**
11161 * Reduces `collection` to a value which is the accumulated result of running
11162 * each element in `collection` thru `iteratee`, where each successive
11163 * invocation is supplied the return value of the previous. If `accumulator`
11164 * is not given, the first element of `collection` is used as the initial
11165 * value. The iteratee is invoked with four arguments:
11166 * (accumulator, value, index|key, collection).
11167 *
11168 * Many lodash methods are guarded to work as iteratees for methods like
11169 * `_.reduce`, `_.reduceRight`, and `_.transform`.
11170 *
11171 * The guarded methods are:
11172 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
11173 * and `sortBy`
11174 *
11175 * @static
11176 * @memberOf _
11177 * @since 0.1.0
11178 * @category Collection
11179 * @param {Array|Object} collection The collection to iterate over.
11180 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11181 * @param {*} [accumulator] The initial value.
11182 * @returns {*} Returns the accumulated value.
11183 * @see _.reduceRight
11184 * @example
11185 *
11186 * _.reduce([1, 2], function(sum, n) {
11187 * return sum + n;
11188 * }, 0);
11189 * // => 3
11190 *
11191 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
11192 * (result[value] || (result[value] = [])).push(key);
11193 * return result;
11194 * }, {});
11195 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
11196 */
11197 function reduce(collection, iteratee, accumulator) {
11198 var func = isArray(collection) ? arrayReduce : baseReduce,
11199 initAccum = arguments.length < 3;
11200
11201 return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
11202 }
11203
11204 /**
11205 * This method is like `_.reduce` except that it iterates over elements of
11206 * `collection` from right to left.
11207 *
11208 * @static
11209 * @memberOf _
11210 * @since 0.1.0
11211 * @category Collection
11212 * @param {Array|Object} collection The collection to iterate over.
11213 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11214 * @param {*} [accumulator] The initial value.
11215 * @returns {*} Returns the accumulated value.
11216 * @see _.reduce
11217 * @example
11218 *
11219 * var array = [[0, 1], [2, 3], [4, 5]];
11220 *
11221 * _.reduceRight(array, function(flattened, other) {
11222 * return flattened.concat(other);
11223 * }, []);
11224 * // => [4, 5, 2, 3, 0, 1]
11225 */
11226 function reduceRight(collection, iteratee, accumulator) {
11227 var func = isArray(collection) ? arrayReduceRight : baseReduce,
11228 initAccum = arguments.length < 3;
11229
11230 return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
11231 }
11232
11233 /**
11234 * The opposite of `_.filter`; this method returns the elements of `collection`
11235 * that `predicate` does **not** return truthy for.
11236 *
11237 * @static
11238 * @memberOf _
11239 * @since 0.1.0
11240 * @category Collection
11241 * @param {Array|Object} collection The collection to iterate over.
11242 * @param {Function} [predicate=_.identity] The function invoked per iteration.
11243 * @returns {Array} Returns the new filtered array.
11244 * @see _.filter
11245 * @example
11246 *
11247 * var users = [
11248 * { 'user': 'barney', 'age': 36, 'active': false },
11249 * { 'user': 'fred', 'age': 40, 'active': true }
11250 * ];
11251 *
11252 * _.reject(users, function(o) { return !o.active; });
11253 * // => objects for ['fred']
11254 *
11255 * // The `_.matches` iteratee shorthand.
11256 * _.reject(users, { 'age': 40, 'active': true });
11257 * // => objects for ['barney']
11258 *
11259 * // The `_.matchesProperty` iteratee shorthand.
11260 * _.reject(users, ['active', false]);
11261 * // => objects for ['fred']
11262 *
11263 * // The `_.property` iteratee shorthand.
11264 * _.reject(users, 'active');
11265 * // => objects for ['barney']
11266 */
11267 function reject(collection, predicate) {
11268 var func = isArray(collection) ? arrayFilter : baseFilter;
11269 return func(collection, negate(getIteratee(predicate, 3)));
11270 }
11271
11272 /**
11273 * Gets a random element from `collection`.
11274 *
11275 * @static
11276 * @memberOf _
11277 * @since 2.0.0
11278 * @category Collection
11279 * @param {Array|Object} collection The collection to sample.
11280 * @returns {*} Returns the random element.
11281 * @example
11282 *
11283 * _.sample([1, 2, 3, 4]);
11284 * // => 2
11285 */
11286 function sample(collection) {
11287 var func = isArray(collection) ? arraySample : baseSample;
11288 return func(collection);
11289 }
11290
11291 /**
11292 * Gets `n` random elements at unique keys from `collection` up to the
11293 * size of `collection`.
11294 *
11295 * @static
11296 * @memberOf _
11297 * @since 4.0.0
11298 * @category Collection
11299 * @param {Array|Object} collection The collection to sample.
11300 * @param {number} [n=1] The number of elements to sample.
11301 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11302 * @returns {Array} Returns the random elements.
11303 * @example
11304 *
11305 * _.sampleSize([1, 2, 3], 2);
11306 * // => [3, 1]
11307 *
11308 * _.sampleSize([1, 2, 3], 4);
11309 * // => [2, 3, 1]
11310 */
11311 function sampleSize(collection, n, guard) {
11312 if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
11313 n = 1;
11314 } else {
11315 n = toInteger(n);
11316 }
11317 var func = isArray(collection) ? arraySampleSize : baseSampleSize;
11318 return func(collection, n);
11319 }
11320
11321 /**
11322 * Creates an array of shuffled values, using a version of the
11323 * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
11324 *
11325 * @static
11326 * @memberOf _
11327 * @since 0.1.0
11328 * @category Collection
11329 * @param {Array|Object} collection The collection to shuffle.
11330 * @returns {Array} Returns the new shuffled array.
11331 * @example
11332 *
11333 * _.shuffle([1, 2, 3, 4]);
11334 * // => [4, 1, 3, 2]
11335 */
11336 function shuffle(collection) {
11337 var func = isArray(collection) ? arrayShuffle : baseShuffle;
11338 return func(collection);
11339 }
11340
11341 /**
11342 * Gets the size of `collection` by returning its length for array-like
11343 * values or the number of own enumerable string keyed properties for objects.
11344 *
11345 * @static
11346 * @memberOf _
11347 * @since 0.1.0
11348 * @category Collection
11349 * @param {Array|Object|string} collection The collection to inspect.
11350 * @returns {number} Returns the collection size.
11351 * @example
11352 *
11353 * _.size([1, 2, 3]);
11354 * // => 3
11355 *
11356 * _.size({ 'a': 1, 'b': 2 });
11357 * // => 2
11358 *
11359 * _.size('pebbles');
11360 * // => 7
11361 */
11362 function size(collection) {
11363 if (collection == null) {
11364 return 0;
11365 }
11366 if (isArrayLike(collection)) {
11367 return isString(collection) ? stringSize(collection) : collection.length;
11368 }
11369 var tag = getTag(collection);
11370 if (tag == mapTag || tag == setTag) {
11371 return collection.size;
11372 }
11373 return baseKeys(collection).length;
11374 }
11375
11376 /**
11377 * Checks if `predicate` returns truthy for **any** element of `collection`.
11378 * Iteration is stopped once `predicate` returns truthy. The predicate is
11379 * invoked with three arguments: (value, index|key, collection).
11380 *
11381 * @static
11382 * @memberOf _
11383 * @since 0.1.0
11384 * @category Collection
11385 * @param {Array|Object} collection The collection to iterate over.
11386 * @param {Function} [predicate=_.identity] The function invoked per iteration.
11387 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11388 * @returns {boolean} Returns `true` if any element passes the predicate check,
11389 * else `false`.
11390 * @example
11391 *
11392 * _.some([null, 0, 'yes', false], Boolean);
11393 * // => true
11394 *
11395 * var users = [
11396 * { 'user': 'barney', 'active': true },
11397 * { 'user': 'fred', 'active': false }
11398 * ];
11399 *
11400 * // The `_.matches` iteratee shorthand.
11401 * _.some(users, { 'user': 'barney', 'active': false });
11402 * // => false
11403 *
11404 * // The `_.matchesProperty` iteratee shorthand.
11405 * _.some(users, ['active', false]);
11406 * // => true
11407 *
11408 * // The `_.property` iteratee shorthand.
11409 * _.some(users, 'active');
11410 * // => true
11411 */
11412 function some(collection, predicate, guard) {
11413 var func = isArray(collection) ? arraySome : baseSome;
11414 if (guard && isIterateeCall(collection, predicate, guard)) {
11415 predicate = undefined;
11416 }
11417 return func(collection, getIteratee(predicate, 3));
11418 }
11419
11420 /**
11421 * Creates an array of elements, sorted in ascending order by the results of
11422 * running each element in a collection thru each iteratee. This method
11423 * performs a stable sort, that is, it preserves the original sort order of
11424 * equal elements. The iteratees are invoked with one argument: (value).
11425 *
11426 * @static
11427 * @memberOf _
11428 * @since 0.1.0
11429 * @category Collection
11430 * @param {Array|Object} collection The collection to iterate over.
11431 * @param {...(Function|Function[])} [iteratees=[_.identity]]
11432 * The iteratees to sort by.
11433 * @returns {Array} Returns the new sorted array.
11434 * @example
11435 *
11436 * var users = [
11437 * { 'user': 'fred', 'age': 48 },
11438 * { 'user': 'barney', 'age': 36 },
11439 * { 'user': 'fred', 'age': 30 },
11440 * { 'user': 'barney', 'age': 34 }
11441 * ];
11442 *
11443 * _.sortBy(users, [function(o) { return o.user; }]);
11444 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
11445 *
11446 * _.sortBy(users, ['user', 'age']);
11447 * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
11448 */
11449 var sortBy = baseRest(function(collection, iteratees) {
11450 if (collection == null) {
11451 return [];
11452 }
11453 var length = iteratees.length;
11454 if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
11455 iteratees = [];
11456 } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
11457 iteratees = [iteratees[0]];
11458 }
11459 return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
11460 });
11461
11462 /*------------------------------------------------------------------------*/
11463
11464 /**
11465 * Gets the timestamp of the number of milliseconds that have elapsed since
11466 * the Unix epoch (1 January 1970 00:00:00 UTC).
11467 *
11468 * @static
11469 * @memberOf _
11470 * @since 2.4.0
11471 * @category Date
11472 * @returns {number} Returns the timestamp.
11473 * @example
11474 *
11475 * _.defer(function(stamp) {
11476 * console.log(_.now() - stamp);
11477 * }, _.now());
11478 * // => Logs the number of milliseconds it took for the deferred invocation.
11479 */
11480 var now = ctxNow || function() {
11481 return root.Date.now();
11482 };
11483
11484 /*------------------------------------------------------------------------*/
11485
11486 /**
11487 * The opposite of `_.before`; this method creates a function that invokes
11488 * `func` once it's called `n` or more times.
11489 *
11490 * @static
11491 * @memberOf _
11492 * @since 0.1.0
11493 * @category Function
11494 * @param {number} n The number of calls before `func` is invoked.
11495 * @param {Function} func The function to restrict.
11496 * @returns {Function} Returns the new restricted function.
11497 * @example
11498 *
11499 * var saves = ['profile', 'settings'];
11500 *
11501 * var done = _.after(saves.length, function() {
11502 * console.log('done saving!');
11503 * });
11504 *
11505 * _.forEach(saves, function(type) {
11506 * asyncSave({ 'type': type, 'complete': done });
11507 * });
11508 * // => Logs 'done saving!' after the two async saves have completed.
11509 */
11510 function after(n, func) {
11511 if (typeof func != 'function') {
11512 throw new TypeError(FUNC_ERROR_TEXT);
11513 }
11514 n = toInteger(n);
11515 return function() {
11516 if (--n < 1) {
11517 return func.apply(this, arguments);
11518 }
11519 };
11520 }
11521
11522 /**
11523 * Creates a function that invokes `func`, with up to `n` arguments,
11524 * ignoring any additional arguments.
11525 *
11526 * @static
11527 * @memberOf _
11528 * @since 3.0.0
11529 * @category Function
11530 * @param {Function} func The function to cap arguments for.
11531 * @param {number} [n=func.length] The arity cap.
11532 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11533 * @returns {Function} Returns the new capped function.
11534 * @example
11535 *
11536 * _.map(['6', '8', '10'], _.ary(parseInt, 1));
11537 * // => [6, 8, 10]
11538 */
11539 function ary(func, n, guard) {
11540 n = guard ? undefined : n;
11541 n = (func && n == null) ? func.length : n;
11542 return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
11543 }
11544
11545 /**
11546 * Creates a function that invokes `func`, with the `this` binding and arguments
11547 * of the created function, while it's called less than `n` times. Subsequent
11548 * calls to the created function return the result of the last `func` invocation.
11549 *
11550 * @static
11551 * @memberOf _
11552 * @since 3.0.0
11553 * @category Function
11554 * @param {number} n The number of calls at which `func` is no longer invoked.
11555 * @param {Function} func The function to restrict.
11556 * @returns {Function} Returns the new restricted function.
11557 * @example
11558 *
11559 * jQuery(element).on('click', _.before(5, addContactToList));
11560 * // => Allows adding up to 4 contacts to the list.
11561 */
11562 function before(n, func) {
11563 var result;
11564 if (typeof func != 'function') {
11565 throw new TypeError(FUNC_ERROR_TEXT);
11566 }
11567 n = toInteger(n);
11568 return function() {
11569 if (--n > 0) {
11570 result = func.apply(this, arguments);
11571 }
11572 if (n <= 1) {
11573 func = undefined;
11574 }
11575 return result;
11576 };
11577 }
11578
11579 /**
11580 * Creates a function that invokes `func` with the `this` binding of `thisArg`
11581 * and `partials` prepended to the arguments it receives.
11582 *
11583 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
11584 * may be used as a placeholder for partially applied arguments.
11585 *
11586 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
11587 * property of bound functions.
11588 *
11589 * @static
11590 * @memberOf _
11591 * @since 0.1.0
11592 * @category Function
11593 * @param {Function} func The function to bind.
11594 * @param {*} thisArg The `this` binding of `func`.
11595 * @param {...*} [partials] The arguments to be partially applied.
11596 * @returns {Function} Returns the new bound function.
11597 * @example
11598 *
11599 * function greet(greeting, punctuation) {
11600 * return greeting + ' ' + this.user + punctuation;
11601 * }
11602 *
11603 * var object = { 'user': 'fred' };
11604 *
11605 * var bound = _.bind(greet, object, 'hi');
11606 * bound('!');
11607 * // => 'hi fred!'
11608 *
11609 * // Bound with placeholders.
11610 * var bound = _.bind(greet, object, _, '!');
11611 * bound('hi');
11612 * // => 'hi fred!'
11613 */
11614 var bind = baseRest(function(func, thisArg, partials) {
11615 var bitmask = WRAP_BIND_FLAG;
11616 if (partials.length) {
11617 var holders = replaceHolders(partials, getHolder(bind));
11618 bitmask |= WRAP_PARTIAL_FLAG;
11619 }
11620 return createWrap(func, bitmask, thisArg, partials, holders);
11621 });
11622
11623 /**
11624 * Creates a function that invokes the method at `object[key]` with `partials`
11625 * prepended to the arguments it receives.
11626 *
11627 * This method differs from `_.bind` by allowing bound functions to reference
11628 * methods that may be redefined or don't yet exist. See
11629 * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
11630 * for more details.
11631 *
11632 * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
11633 * builds, may be used as a placeholder for partially applied arguments.
11634 *
11635 * @static
11636 * @memberOf _
11637 * @since 0.10.0
11638 * @category Function
11639 * @param {Object} object The object to invoke the method on.
11640 * @param {string} key The key of the method.
11641 * @param {...*} [partials] The arguments to be partially applied.
11642 * @returns {Function} Returns the new bound function.
11643 * @example
11644 *
11645 * var object = {
11646 * 'user': 'fred',
11647 * 'greet': function(greeting, punctuation) {
11648 * return greeting + ' ' + this.user + punctuation;
11649 * }
11650 * };
11651 *
11652 * var bound = _.bindKey(object, 'greet', 'hi');
11653 * bound('!');
11654 * // => 'hi fred!'
11655 *
11656 * object.greet = function(greeting, punctuation) {
11657 * return greeting + 'ya ' + this.user + punctuation;
11658 * };
11659 *
11660 * bound('!');
11661 * // => 'hiya fred!'
11662 *
11663 * // Bound with placeholders.
11664 * var bound = _.bindKey(object, 'greet', _, '!');
11665 * bound('hi');
11666 * // => 'hiya fred!'
11667 */
11668 var bindKey = baseRest(function(object, key, partials) {
11669 var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
11670 if (partials.length) {
11671 var holders = replaceHolders(partials, getHolder(bindKey));
11672 bitmask |= WRAP_PARTIAL_FLAG;
11673 }
11674 return createWrap(key, bitmask, object, partials, holders);
11675 });
11676
11677 /**
11678 * Creates a function that accepts arguments of `func` and either invokes
11679 * `func` returning its result, if at least `arity` number of arguments have
11680 * been provided, or returns a function that accepts the remaining `func`
11681 * arguments, and so on. The arity of `func` may be specified if `func.length`
11682 * is not sufficient.
11683 *
11684 * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
11685 * may be used as a placeholder for provided arguments.
11686 *
11687 * **Note:** This method doesn't set the "length" property of curried functions.
11688 *
11689 * @static
11690 * @memberOf _
11691 * @since 2.0.0
11692 * @category Function
11693 * @param {Function} func The function to curry.
11694 * @param {number} [arity=func.length] The arity of `func`.
11695 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11696 * @returns {Function} Returns the new curried function.
11697 * @example
11698 *
11699 * var abc = function(a, b, c) {
11700 * return [a, b, c];
11701 * };
11702 *
11703 * var curried = _.curry(abc);
11704 *
11705 * curried(1)(2)(3);
11706 * // => [1, 2, 3]
11707 *
11708 * curried(1, 2)(3);
11709 * // => [1, 2, 3]
11710 *
11711 * curried(1, 2, 3);
11712 * // => [1, 2, 3]
11713 *
11714 * // Curried with placeholders.
11715 * curried(1)(_, 3)(2);
11716 * // => [1, 2, 3]
11717 */
11718 function curry(func, arity, guard) {
11719 arity = guard ? undefined : arity;
11720 var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
11721 result.placeholder = curry.placeholder;
11722 return result;
11723 }
11724
11725 /**
11726 * This method is like `_.curry` except that arguments are applied to `func`
11727 * in the manner of `_.partialRight` instead of `_.partial`.
11728 *
11729 * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
11730 * builds, may be used as a placeholder for provided arguments.
11731 *
11732 * **Note:** This method doesn't set the "length" property of curried functions.
11733 *
11734 * @static
11735 * @memberOf _
11736 * @since 3.0.0
11737 * @category Function
11738 * @param {Function} func The function to curry.
11739 * @param {number} [arity=func.length] The arity of `func`.
11740 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11741 * @returns {Function} Returns the new curried function.
11742 * @example
11743 *
11744 * var abc = function(a, b, c) {
11745 * return [a, b, c];
11746 * };
11747 *
11748 * var curried = _.curryRight(abc);
11749 *
11750 * curried(3)(2)(1);
11751 * // => [1, 2, 3]
11752 *
11753 * curried(2, 3)(1);
11754 * // => [1, 2, 3]
11755 *
11756 * curried(1, 2, 3);
11757 * // => [1, 2, 3]
11758 *
11759 * // Curried with placeholders.
11760 * curried(3)(1, _)(2);
11761 * // => [1, 2, 3]
11762 */
11763 function curryRight(func, arity, guard) {
11764 arity = guard ? undefined : arity;
11765 var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
11766 result.placeholder = curryRight.placeholder;
11767 return result;
11768 }
11769
11770 /**
11771 * Creates a debounced function that delays invoking `func` until after `wait`
11772 * milliseconds have elapsed since the last time the debounced function was
11773 * invoked. The debounced function comes with a `cancel` method to cancel
11774 * delayed `func` invocations and a `flush` method to immediately invoke them.
11775 * Provide `options` to indicate whether `func` should be invoked on the
11776 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
11777 * with the last arguments provided to the debounced function. Subsequent
11778 * calls to the debounced function return the result of the last `func`
11779 * invocation.
11780 *
11781 * **Note:** If `leading` and `trailing` options are `true`, `func` is
11782 * invoked on the trailing edge of the timeout only if the debounced function
11783 * is invoked more than once during the `wait` timeout.
11784 *
11785 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
11786 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
11787 *
11788 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
11789 * for details over the differences between `_.debounce` and `_.throttle`.
11790 *
11791 * @static
11792 * @memberOf _
11793 * @since 0.1.0
11794 * @category Function
11795 * @param {Function} func The function to debounce.
11796 * @param {number} [wait=0] The number of milliseconds to delay.
11797 * @param {Object} [options={}] The options object.
11798 * @param {boolean} [options.leading=false]
11799 * Specify invoking on the leading edge of the timeout.
11800 * @param {number} [options.maxWait]
11801 * The maximum time `func` is allowed to be delayed before it's invoked.
11802 * @param {boolean} [options.trailing=true]
11803 * Specify invoking on the trailing edge of the timeout.
11804 * @returns {Function} Returns the new debounced function.
11805 * @example
11806 *
11807 * // Avoid costly calculations while the window size is in flux.
11808 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
11809 *
11810 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
11811 * jQuery(element).on('click', _.debounce(sendMail, 300, {
11812 * 'leading': true,
11813 * 'trailing': false
11814 * }));
11815 *
11816 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
11817 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
11818 * var source = new EventSource('/stream');
11819 * jQuery(source).on('message', debounced);
11820 *
11821 * // Cancel the trailing debounced invocation.
11822 * jQuery(window).on('popstate', debounced.cancel);
11823 */
11824 function debounce(func, wait, options) {
11825 var lastArgs,
11826 lastThis,
11827 maxWait,
11828 result,
11829 timerId,
11830 lastCallTime,
11831 lastInvokeTime = 0,
11832 leading = false,
11833 maxing = false,
11834 trailing = true;
11835
11836 if (typeof func != 'function') {
11837 throw new TypeError(FUNC_ERROR_TEXT);
11838 }
11839 wait = toNumber(wait) || 0;
11840 if (isObject(options)) {
11841 leading = !!options.leading;
11842 maxing = 'maxWait' in options;
11843 maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
11844 trailing = 'trailing' in options ? !!options.trailing : trailing;
11845 }
11846
11847 function invokeFunc(time) {
11848 var args = lastArgs,
11849 thisArg = lastThis;
11850
11851 lastArgs = lastThis = undefined;
11852 lastInvokeTime = time;
11853 result = func.apply(thisArg, args);
11854 return result;
11855 }
11856
11857 function leadingEdge(time) {
11858 // Reset any `maxWait` timer.
11859 lastInvokeTime = time;
11860 // Start the timer for the trailing edge.
11861 timerId = setTimeout(timerExpired, wait);
11862 // Invoke the leading edge.
11863 return leading ? invokeFunc(time) : result;
11864 }
11865
11866 function remainingWait(time) {
11867 var timeSinceLastCall = time - lastCallTime,
11868 timeSinceLastInvoke = time - lastInvokeTime,
11869 timeWaiting = wait - timeSinceLastCall;
11870
11871 return maxing
11872 ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
11873 : timeWaiting;
11874 }
11875
11876 function shouldInvoke(time) {
11877 var timeSinceLastCall = time - lastCallTime,
11878 timeSinceLastInvoke = time - lastInvokeTime;
11879
11880 // Either this is the first call, activity has stopped and we're at the
11881 // trailing edge, the system time has gone backwards and we're treating
11882 // it as the trailing edge, or we've hit the `maxWait` limit.
11883 return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
11884 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
11885 }
11886
11887 function timerExpired() {
11888 var time = now();
11889 if (shouldInvoke(time)) {
11890 return trailingEdge(time);
11891 }
11892 // Restart the timer.
11893 timerId = setTimeout(timerExpired, remainingWait(time));
11894 }
11895
11896 function trailingEdge(time) {
11897 timerId = undefined;
11898
11899 // Only invoke if we have `lastArgs` which means `func` has been
11900 // debounced at least once.
11901 if (trailing && lastArgs) {
11902 return invokeFunc(time);
11903 }
11904 lastArgs = lastThis = undefined;
11905 return result;
11906 }
11907
11908 function cancel() {
11909 if (timerId !== undefined) {
11910 clearTimeout(timerId);
11911 }
11912 lastInvokeTime = 0;
11913 lastArgs = lastCallTime = lastThis = timerId = undefined;
11914 }
11915
11916 function flush() {
11917 return timerId === undefined ? result : trailingEdge(now());
11918 }
11919
11920 function debounced() {
11921 var time = now(),
11922 isInvoking = shouldInvoke(time);
11923
11924 lastArgs = arguments;
11925 lastThis = this;
11926 lastCallTime = time;
11927
11928 if (isInvoking) {
11929 if (timerId === undefined) {
11930 return leadingEdge(lastCallTime);
11931 }
11932 if (maxing) {
11933 // Handle invocations in a tight loop.
11934 clearTimeout(timerId);
11935 timerId = setTimeout(timerExpired, wait);
11936 return invokeFunc(lastCallTime);
11937 }
11938 }
11939 if (timerId === undefined) {
11940 timerId = setTimeout(timerExpired, wait);
11941 }
11942 return result;
11943 }
11944 debounced.cancel = cancel;
11945 debounced.flush = flush;
11946 return debounced;
11947 }
11948
11949 /**
11950 * Defers invoking the `func` until the current call stack has cleared. Any
11951 * additional arguments are provided to `func` when it's invoked.
11952 *
11953 * @static
11954 * @memberOf _
11955 * @since 0.1.0
11956 * @category Function
11957 * @param {Function} func The function to defer.
11958 * @param {...*} [args] The arguments to invoke `func` with.
11959 * @returns {number} Returns the timer id.
11960 * @example
11961 *
11962 * _.defer(function(text) {
11963 * console.log(text);
11964 * }, 'deferred');
11965 * // => Logs 'deferred' after one millisecond.
11966 */
11967 var defer = baseRest(function(func, args) {
11968 return baseDelay(func, 1, args);
11969 });
11970
11971 /**
11972 * Invokes `func` after `wait` milliseconds. Any additional arguments are
11973 * provided to `func` when it's invoked.
11974 *
11975 * @static
11976 * @memberOf _
11977 * @since 0.1.0
11978 * @category Function
11979 * @param {Function} func The function to delay.
11980 * @param {number} wait The number of milliseconds to delay invocation.
11981 * @param {...*} [args] The arguments to invoke `func` with.
11982 * @returns {number} Returns the timer id.
11983 * @example
11984 *
11985 * _.delay(function(text) {
11986 * console.log(text);
11987 * }, 1000, 'later');
11988 * // => Logs 'later' after one second.
11989 */
11990 var delay = baseRest(function(func, wait, args) {
11991 return baseDelay(func, toNumber(wait) || 0, args);
11992 });
11993
11994 /**
11995 * Creates a function that invokes `func` with arguments reversed.
11996 *
11997 * @static
11998 * @memberOf _
11999 * @since 4.0.0
12000 * @category Function
12001 * @param {Function} func The function to flip arguments for.
12002 * @returns {Function} Returns the new flipped function.
12003 * @example
12004 *
12005 * var flipped = _.flip(function() {
12006 * return _.toArray(arguments);
12007 * });
12008 *
12009 * flipped('a', 'b', 'c', 'd');
12010 * // => ['d', 'c', 'b', 'a']
12011 */
12012 function flip(func) {
12013 return createWrap(func, WRAP_FLIP_FLAG);
12014 }
12015
12016 /**
12017 * Creates a function that memoizes the result of `func`. If `resolver` is
12018 * provided, it determines the cache key for storing the result based on the
12019 * arguments provided to the memoized function. By default, the first argument
12020 * provided to the memoized function is used as the map cache key. The `func`
12021 * is invoked with the `this` binding of the memoized function.
12022 *
12023 * **Note:** The cache is exposed as the `cache` property on the memoized
12024 * function. Its creation may be customized by replacing the `_.memoize.Cache`
12025 * constructor with one whose instances implement the
12026 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
12027 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
12028 *
12029 * @static
12030 * @memberOf _
12031 * @since 0.1.0
12032 * @category Function
12033 * @param {Function} func The function to have its output memoized.
12034 * @param {Function} [resolver] The function to resolve the cache key.
12035 * @returns {Function} Returns the new memoized function.
12036 * @example
12037 *
12038 * var object = { 'a': 1, 'b': 2 };
12039 * var other = { 'c': 3, 'd': 4 };
12040 *
12041 * var values = _.memoize(_.values);
12042 * values(object);
12043 * // => [1, 2]
12044 *
12045 * values(other);
12046 * // => [3, 4]
12047 *
12048 * object.a = 2;
12049 * values(object);
12050 * // => [1, 2]
12051 *
12052 * // Modify the result cache.
12053 * values.cache.set(object, ['a', 'b']);
12054 * values(object);
12055 * // => ['a', 'b']
12056 *
12057 * // Replace `_.memoize.Cache`.
12058 * _.memoize.Cache = WeakMap;
12059 */
12060 function memoize(func, resolver) {
12061 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
12062 throw new TypeError(FUNC_ERROR_TEXT);
12063 }
12064 var memoized = function() {
12065 var args = arguments,
12066 key = resolver ? resolver.apply(this, args) : args[0],
12067 cache = memoized.cache;
12068
12069 if (cache.has(key)) {
12070 return cache.get(key);
12071 }
12072 var result = func.apply(this, args);
12073 memoized.cache = cache.set(key, result) || cache;
12074 return result;
12075 };
12076 memoized.cache = new (memoize.Cache || MapCache);
12077 return memoized;
12078 }
12079
12080 // Expose `MapCache`.
12081 memoize.Cache = MapCache;
12082
12083 /**
12084 * Creates a function that negates the result of the predicate `func`. The
12085 * `func` predicate is invoked with the `this` binding and arguments of the
12086 * created function.
12087 *
12088 * @static
12089 * @memberOf _
12090 * @since 3.0.0
12091 * @category Function
12092 * @param {Function} predicate The predicate to negate.
12093 * @returns {Function} Returns the new negated function.
12094 * @example
12095 *
12096 * function isEven(n) {
12097 * return n % 2 == 0;
12098 * }
12099 *
12100 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
12101 * // => [1, 3, 5]
12102 */
12103 function negate(predicate) {
12104 if (typeof predicate != 'function') {
12105 throw new TypeError(FUNC_ERROR_TEXT);
12106 }
12107 return function() {
12108 var args = arguments;
12109 switch (args.length) {
12110 case 0: return !predicate.call(this);
12111 case 1: return !predicate.call(this, args[0]);
12112 case 2: return !predicate.call(this, args[0], args[1]);
12113 case 3: return !predicate.call(this, args[0], args[1], args[2]);
12114 }
12115 return !predicate.apply(this, args);
12116 };
12117 }
12118
12119 /**
12120 * Creates a function that is restricted to invoking `func` once. Repeat calls
12121 * to the function return the value of the first invocation. The `func` is
12122 * invoked with the `this` binding and arguments of the created function.
12123 *
12124 * @static
12125 * @memberOf _
12126 * @since 0.1.0
12127 * @category Function
12128 * @param {Function} func The function to restrict.
12129 * @returns {Function} Returns the new restricted function.
12130 * @example
12131 *
12132 * var initialize = _.once(createApplication);
12133 * initialize();
12134 * initialize();
12135 * // => `createApplication` is invoked once
12136 */
12137 function once(func) {
12138 return before(2, func);
12139 }
12140
12141 /**
12142 * Creates a function that invokes `func` with its arguments transformed.
12143 *
12144 * @static
12145 * @since 4.0.0
12146 * @memberOf _
12147 * @category Function
12148 * @param {Function} func The function to wrap.
12149 * @param {...(Function|Function[])} [transforms=[_.identity]]
12150 * The argument transforms.
12151 * @returns {Function} Returns the new function.
12152 * @example
12153 *
12154 * function doubled(n) {
12155 * return n * 2;
12156 * }
12157 *
12158 * function square(n) {
12159 * return n * n;
12160 * }
12161 *
12162 * var func = _.overArgs(function(x, y) {
12163 * return [x, y];
12164 * }, [square, doubled]);
12165 *
12166 * func(9, 3);
12167 * // => [81, 6]
12168 *
12169 * func(10, 5);
12170 * // => [100, 10]
12171 */
12172 var overArgs = castRest(function(func, transforms) {
12173 transforms = (transforms.length == 1 && isArray(transforms[0]))
12174 ? arrayMap(transforms[0], baseUnary(getIteratee()))
12175 : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
12176
12177 var funcsLength = transforms.length;
12178 return baseRest(function(args) {
12179 var index = -1,
12180 length = nativeMin(args.length, funcsLength);
12181
12182 while (++index < length) {
12183 args[index] = transforms[index].call(this, args[index]);
12184 }
12185 return apply(func, this, args);
12186 });
12187 });
12188
12189 /**
12190 * Creates a function that invokes `func` with `partials` prepended to the
12191 * arguments it receives. This method is like `_.bind` except it does **not**
12192 * alter the `this` binding.
12193 *
12194 * The `_.partial.placeholder` value, which defaults to `_` in monolithic
12195 * builds, may be used as a placeholder for partially applied arguments.
12196 *
12197 * **Note:** This method doesn't set the "length" property of partially
12198 * applied functions.
12199 *
12200 * @static
12201 * @memberOf _
12202 * @since 0.2.0
12203 * @category Function
12204 * @param {Function} func The function to partially apply arguments to.
12205 * @param {...*} [partials] The arguments to be partially applied.
12206 * @returns {Function} Returns the new partially applied function.
12207 * @example
12208 *
12209 * function greet(greeting, name) {
12210 * return greeting + ' ' + name;
12211 * }
12212 *
12213 * var sayHelloTo = _.partial(greet, 'hello');
12214 * sayHelloTo('fred');
12215 * // => 'hello fred'
12216 *
12217 * // Partially applied with placeholders.
12218 * var greetFred = _.partial(greet, _, 'fred');
12219 * greetFred('hi');
12220 * // => 'hi fred'
12221 */
12222 var partial = baseRest(function(func, partials) {
12223 var holders = replaceHolders(partials, getHolder(partial));
12224 return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
12225 });
12226
12227 /**
12228 * This method is like `_.partial` except that partially applied arguments
12229 * are appended to the arguments it receives.
12230 *
12231 * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
12232 * builds, may be used as a placeholder for partially applied arguments.
12233 *
12234 * **Note:** This method doesn't set the "length" property of partially
12235 * applied functions.
12236 *
12237 * @static
12238 * @memberOf _
12239 * @since 1.0.0
12240 * @category Function
12241 * @param {Function} func The function to partially apply arguments to.
12242 * @param {...*} [partials] The arguments to be partially applied.
12243 * @returns {Function} Returns the new partially applied function.
12244 * @example
12245 *
12246 * function greet(greeting, name) {
12247 * return greeting + ' ' + name;
12248 * }
12249 *
12250 * var greetFred = _.partialRight(greet, 'fred');
12251 * greetFred('hi');
12252 * // => 'hi fred'
12253 *
12254 * // Partially applied with placeholders.
12255 * var sayHelloTo = _.partialRight(greet, 'hello', _);
12256 * sayHelloTo('fred');
12257 * // => 'hello fred'
12258 */
12259 var partialRight = baseRest(function(func, partials) {
12260 var holders = replaceHolders(partials, getHolder(partialRight));
12261 return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
12262 });
12263
12264 /**
12265 * Creates a function that invokes `func` with arguments arranged according
12266 * to the specified `indexes` where the argument value at the first index is
12267 * provided as the first argument, the argument value at the second index is
12268 * provided as the second argument, and so on.
12269 *
12270 * @static
12271 * @memberOf _
12272 * @since 3.0.0
12273 * @category Function
12274 * @param {Function} func The function to rearrange arguments for.
12275 * @param {...(number|number[])} indexes The arranged argument indexes.
12276 * @returns {Function} Returns the new function.
12277 * @example
12278 *
12279 * var rearged = _.rearg(function(a, b, c) {
12280 * return [a, b, c];
12281 * }, [2, 0, 1]);
12282 *
12283 * rearged('b', 'c', 'a')
12284 * // => ['a', 'b', 'c']
12285 */
12286 var rearg = flatRest(function(func, indexes) {
12287 return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
12288 });
12289
12290 /**
12291 * Creates a function that invokes `func` with the `this` binding of the
12292 * created function and arguments from `start` and beyond provided as
12293 * an array.
12294 *
12295 * **Note:** This method is based on the
12296 * [rest parameter](https://mdn.io/rest_parameters).
12297 *
12298 * @static
12299 * @memberOf _
12300 * @since 4.0.0
12301 * @category Function
12302 * @param {Function} func The function to apply a rest parameter to.
12303 * @param {number} [start=func.length-1] The start position of the rest parameter.
12304 * @returns {Function} Returns the new function.
12305 * @example
12306 *
12307 * var say = _.rest(function(what, names) {
12308 * return what + ' ' + _.initial(names).join(', ') +
12309 * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
12310 * });
12311 *
12312 * say('hello', 'fred', 'barney', 'pebbles');
12313 * // => 'hello fred, barney, & pebbles'
12314 */
12315 function rest(func, start) {
12316 if (typeof func != 'function') {
12317 throw new TypeError(FUNC_ERROR_TEXT);
12318 }
12319 start = start === undefined ? start : toInteger(start);
12320 return baseRest(func, start);
12321 }
12322
12323 /**
12324 * Creates a function that invokes `func` with the `this` binding of the
12325 * create function and an array of arguments much like
12326 * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
12327 *
12328 * **Note:** This method is based on the
12329 * [spread operator](https://mdn.io/spread_operator).
12330 *
12331 * @static
12332 * @memberOf _
12333 * @since 3.2.0
12334 * @category Function
12335 * @param {Function} func The function to spread arguments over.
12336 * @param {number} [start=0] The start position of the spread.
12337 * @returns {Function} Returns the new function.
12338 * @example
12339 *
12340 * var say = _.spread(function(who, what) {
12341 * return who + ' says ' + what;
12342 * });
12343 *
12344 * say(['fred', 'hello']);
12345 * // => 'fred says hello'
12346 *
12347 * var numbers = Promise.all([
12348 * Promise.resolve(40),
12349 * Promise.resolve(36)
12350 * ]);
12351 *
12352 * numbers.then(_.spread(function(x, y) {
12353 * return x + y;
12354 * }));
12355 * // => a Promise of 76
12356 */
12357 function spread(func, start) {
12358 if (typeof func != 'function') {
12359 throw new TypeError(FUNC_ERROR_TEXT);
12360 }
12361 start = start == null ? 0 : nativeMax(toInteger(start), 0);
12362 return baseRest(function(args) {
12363 var array = args[start],
12364 otherArgs = castSlice(args, 0, start);
12365
12366 if (array) {
12367 arrayPush(otherArgs, array);
12368 }
12369 return apply(func, this, otherArgs);
12370 });
12371 }
12372
12373 /**
12374 * Creates a throttled function that only invokes `func` at most once per
12375 * every `wait` milliseconds. The throttled function comes with a `cancel`
12376 * method to cancel delayed `func` invocations and a `flush` method to
12377 * immediately invoke them. Provide `options` to indicate whether `func`
12378 * should be invoked on the leading and/or trailing edge of the `wait`
12379 * timeout. The `func` is invoked with the last arguments provided to the
12380 * throttled function. Subsequent calls to the throttled function return the
12381 * result of the last `func` invocation.
12382 *
12383 * **Note:** If `leading` and `trailing` options are `true`, `func` is
12384 * invoked on the trailing edge of the timeout only if the throttled function
12385 * is invoked more than once during the `wait` timeout.
12386 *
12387 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
12388 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
12389 *
12390 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
12391 * for details over the differences between `_.throttle` and `_.debounce`.
12392 *
12393 * @static
12394 * @memberOf _
12395 * @since 0.1.0
12396 * @category Function
12397 * @param {Function} func The function to throttle.
12398 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
12399 * @param {Object} [options={}] The options object.
12400 * @param {boolean} [options.leading=true]
12401 * Specify invoking on the leading edge of the timeout.
12402 * @param {boolean} [options.trailing=true]
12403 * Specify invoking on the trailing edge of the timeout.
12404 * @returns {Function} Returns the new throttled function.
12405 * @example
12406 *
12407 * // Avoid excessively updating the position while scrolling.
12408 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
12409 *
12410 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
12411 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
12412 * jQuery(element).on('click', throttled);
12413 *
12414 * // Cancel the trailing throttled invocation.
12415 * jQuery(window).on('popstate', throttled.cancel);
12416 */
12417 function throttle(func, wait, options) {
12418 var leading = true,
12419 trailing = true;
12420
12421 if (typeof func != 'function') {
12422 throw new TypeError(FUNC_ERROR_TEXT);
12423 }
12424 if (isObject(options)) {
12425 leading = 'leading' in options ? !!options.leading : leading;
12426 trailing = 'trailing' in options ? !!options.trailing : trailing;
12427 }
12428 return debounce(func, wait, {
12429 'leading': leading,
12430 'maxWait': wait,
12431 'trailing': trailing
12432 });
12433 }
12434
12435 /**
12436 * Creates a function that accepts up to one argument, ignoring any
12437 * additional arguments.
12438 *
12439 * @static
12440 * @memberOf _
12441 * @since 4.0.0
12442 * @category Function
12443 * @param {Function} func The function to cap arguments for.
12444 * @returns {Function} Returns the new capped function.
12445 * @example
12446 *
12447 * _.map(['6', '8', '10'], _.unary(parseInt));
12448 * // => [6, 8, 10]
12449 */
12450 function unary(func) {
12451 return ary(func, 1);
12452 }
12453
12454 /**
12455 * Creates a function that provides `value` to `wrapper` as its first
12456 * argument. Any additional arguments provided to the function are appended
12457 * to those provided to the `wrapper`. The wrapper is invoked with the `this`
12458 * binding of the created function.
12459 *
12460 * @static
12461 * @memberOf _
12462 * @since 0.1.0
12463 * @category Function
12464 * @param {*} value The value to wrap.
12465 * @param {Function} [wrapper=identity] The wrapper function.
12466 * @returns {Function} Returns the new function.
12467 * @example
12468 *
12469 * var p = _.wrap(_.escape, function(func, text) {
12470 * return '<p>' + func(text) + '</p>';
12471 * });
12472 *
12473 * p('fred, barney, & pebbles');
12474 * // => '<p>fred, barney, &amp; pebbles</p>'
12475 */
12476 function wrap(value, wrapper) {
12477 return partial(castFunction(wrapper), value);
12478 }
12479
12480 /*------------------------------------------------------------------------*/
12481
12482 /**
12483 * Casts `value` as an array if it's not one.
12484 *
12485 * @static
12486 * @memberOf _
12487 * @since 4.4.0
12488 * @category Lang
12489 * @param {*} value The value to inspect.
12490 * @returns {Array} Returns the cast array.
12491 * @example
12492 *
12493 * _.castArray(1);
12494 * // => [1]
12495 *
12496 * _.castArray({ 'a': 1 });
12497 * // => [{ 'a': 1 }]
12498 *
12499 * _.castArray('abc');
12500 * // => ['abc']
12501 *
12502 * _.castArray(null);
12503 * // => [null]
12504 *
12505 * _.castArray(undefined);
12506 * // => [undefined]
12507 *
12508 * _.castArray();
12509 * // => []
12510 *
12511 * var array = [1, 2, 3];
12512 * console.log(_.castArray(array) === array);
12513 * // => true
12514 */
12515 function castArray() {
12516 if (!arguments.length) {
12517 return [];
12518 }
12519 var value = arguments[0];
12520 return isArray(value) ? value : [value];
12521 }
12522
12523 /**
12524 * Creates a shallow clone of `value`.
12525 *
12526 * **Note:** This method is loosely based on the
12527 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
12528 * and supports cloning arrays, array buffers, booleans, date objects, maps,
12529 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
12530 * arrays. The own enumerable properties of `arguments` objects are cloned
12531 * as plain objects. An empty object is returned for uncloneable values such
12532 * as error objects, functions, DOM nodes, and WeakMaps.
12533 *
12534 * @static
12535 * @memberOf _
12536 * @since 0.1.0
12537 * @category Lang
12538 * @param {*} value The value to clone.
12539 * @returns {*} Returns the cloned value.
12540 * @see _.cloneDeep
12541 * @example
12542 *
12543 * var objects = [{ 'a': 1 }, { 'b': 2 }];
12544 *
12545 * var shallow = _.clone(objects);
12546 * console.log(shallow[0] === objects[0]);
12547 * // => true
12548 */
12549 function clone(value) {
12550 return baseClone(value, CLONE_SYMBOLS_FLAG);
12551 }
12552
12553 /**
12554 * This method is like `_.clone` except that it accepts `customizer` which
12555 * is invoked to produce the cloned value. If `customizer` returns `undefined`,
12556 * cloning is handled by the method instead. The `customizer` is invoked with
12557 * up to four arguments; (value [, index|key, object, stack]).
12558 *
12559 * @static
12560 * @memberOf _
12561 * @since 4.0.0
12562 * @category Lang
12563 * @param {*} value The value to clone.
12564 * @param {Function} [customizer] The function to customize cloning.
12565 * @returns {*} Returns the cloned value.
12566 * @see _.cloneDeepWith
12567 * @example
12568 *
12569 * function customizer(value) {
12570 * if (_.isElement(value)) {
12571 * return value.cloneNode(false);
12572 * }
12573 * }
12574 *
12575 * var el = _.cloneWith(document.body, customizer);
12576 *
12577 * console.log(el === document.body);
12578 * // => false
12579 * console.log(el.nodeName);
12580 * // => 'BODY'
12581 * console.log(el.childNodes.length);
12582 * // => 0
12583 */
12584 function cloneWith(value, customizer) {
12585 customizer = typeof customizer == 'function' ? customizer : undefined;
12586 return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
12587 }
12588
12589 /**
12590 * This method is like `_.clone` except that it recursively clones `value`.
12591 *
12592 * @static
12593 * @memberOf _
12594 * @since 1.0.0
12595 * @category Lang
12596 * @param {*} value The value to recursively clone.
12597 * @returns {*} Returns the deep cloned value.
12598 * @see _.clone
12599 * @example
12600 *
12601 * var objects = [{ 'a': 1 }, { 'b': 2 }];
12602 *
12603 * var deep = _.cloneDeep(objects);
12604 * console.log(deep[0] === objects[0]);
12605 * // => false
12606 */
12607 function cloneDeep(value) {
12608 return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
12609 }
12610
12611 /**
12612 * This method is like `_.cloneWith` except that it recursively clones `value`.
12613 *
12614 * @static
12615 * @memberOf _
12616 * @since 4.0.0
12617 * @category Lang
12618 * @param {*} value The value to recursively clone.
12619 * @param {Function} [customizer] The function to customize cloning.
12620 * @returns {*} Returns the deep cloned value.
12621 * @see _.cloneWith
12622 * @example
12623 *
12624 * function customizer(value) {
12625 * if (_.isElement(value)) {
12626 * return value.cloneNode(true);
12627 * }
12628 * }
12629 *
12630 * var el = _.cloneDeepWith(document.body, customizer);
12631 *
12632 * console.log(el === document.body);
12633 * // => false
12634 * console.log(el.nodeName);
12635 * // => 'BODY'
12636 * console.log(el.childNodes.length);
12637 * // => 20
12638 */
12639 function cloneDeepWith(value, customizer) {
12640 customizer = typeof customizer == 'function' ? customizer : undefined;
12641 return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
12642 }
12643
12644 /**
12645 * Checks if `object` conforms to `source` by invoking the predicate
12646 * properties of `source` with the corresponding property values of `object`.
12647 *
12648 * **Note:** This method is equivalent to `_.conforms` when `source` is
12649 * partially applied.
12650 *
12651 * @static
12652 * @memberOf _
12653 * @since 4.14.0
12654 * @category Lang
12655 * @param {Object} object The object to inspect.
12656 * @param {Object} source The object of property predicates to conform to.
12657 * @returns {boolean} Returns `true` if `object` conforms, else `false`.
12658 * @example
12659 *
12660 * var object = { 'a': 1, 'b': 2 };
12661 *
12662 * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
12663 * // => true
12664 *
12665 * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
12666 * // => false
12667 */
12668 function conformsTo(object, source) {
12669 return source == null || baseConformsTo(object, source, keys(source));
12670 }
12671
12672 /**
12673 * Performs a
12674 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
12675 * comparison between two values to determine if they are equivalent.
12676 *
12677 * @static
12678 * @memberOf _
12679 * @since 4.0.0
12680 * @category Lang
12681 * @param {*} value The value to compare.
12682 * @param {*} other The other value to compare.
12683 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
12684 * @example
12685 *
12686 * var object = { 'a': 1 };
12687 * var other = { 'a': 1 };
12688 *
12689 * _.eq(object, object);
12690 * // => true
12691 *
12692 * _.eq(object, other);
12693 * // => false
12694 *
12695 * _.eq('a', 'a');
12696 * // => true
12697 *
12698 * _.eq('a', Object('a'));
12699 * // => false
12700 *
12701 * _.eq(NaN, NaN);
12702 * // => true
12703 */
12704 function eq(value, other) {
12705 return value === other || (value !== value && other !== other);
12706 }
12707
12708 /**
12709 * Checks if `value` is greater than `other`.
12710 *
12711 * @static
12712 * @memberOf _
12713 * @since 3.9.0
12714 * @category Lang
12715 * @param {*} value The value to compare.
12716 * @param {*} other The other value to compare.
12717 * @returns {boolean} Returns `true` if `value` is greater than `other`,
12718 * else `false`.
12719 * @see _.lt
12720 * @example
12721 *
12722 * _.gt(3, 1);
12723 * // => true
12724 *
12725 * _.gt(3, 3);
12726 * // => false
12727 *
12728 * _.gt(1, 3);
12729 * // => false
12730 */
12731 var gt = createRelationalOperation(baseGt);
12732
12733 /**
12734 * Checks if `value` is greater than or equal to `other`.
12735 *
12736 * @static
12737 * @memberOf _
12738 * @since 3.9.0
12739 * @category Lang
12740 * @param {*} value The value to compare.
12741 * @param {*} other The other value to compare.
12742 * @returns {boolean} Returns `true` if `value` is greater than or equal to
12743 * `other`, else `false`.
12744 * @see _.lte
12745 * @example
12746 *
12747 * _.gte(3, 1);
12748 * // => true
12749 *
12750 * _.gte(3, 3);
12751 * // => true
12752 *
12753 * _.gte(1, 3);
12754 * // => false
12755 */
12756 var gte = createRelationalOperation(function(value, other) {
12757 return value >= other;
12758 });
12759
12760 /**
12761 * Checks if `value` is likely an `arguments` object.
12762 *
12763 * @static
12764 * @memberOf _
12765 * @since 0.1.0
12766 * @category Lang
12767 * @param {*} value The value to check.
12768 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
12769 * else `false`.
12770 * @example
12771 *
12772 * _.isArguments(function() { return arguments; }());
12773 * // => true
12774 *
12775 * _.isArguments([1, 2, 3]);
12776 * // => false
12777 */
12778 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
12779 return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
12780 !propertyIsEnumerable.call(value, 'callee');
12781 };
12782
12783 /**
12784 * Checks if `value` is classified as an `Array` object.
12785 *
12786 * @static
12787 * @memberOf _
12788 * @since 0.1.0
12789 * @category Lang
12790 * @param {*} value The value to check.
12791 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
12792 * @example
12793 *
12794 * _.isArray([1, 2, 3]);
12795 * // => true
12796 *
12797 * _.isArray(document.body.children);
12798 * // => false
12799 *
12800 * _.isArray('abc');
12801 * // => false
12802 *
12803 * _.isArray(_.noop);
12804 * // => false
12805 */
12806 var isArray = Array.isArray;
12807
12808 /**
12809 * Checks if `value` is classified as an `ArrayBuffer` object.
12810 *
12811 * @static
12812 * @memberOf _
12813 * @since 4.3.0
12814 * @category Lang
12815 * @param {*} value The value to check.
12816 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
12817 * @example
12818 *
12819 * _.isArrayBuffer(new ArrayBuffer(2));
12820 * // => true
12821 *
12822 * _.isArrayBuffer(new Array(2));
12823 * // => false
12824 */
12825 var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
12826
12827 /**
12828 * Checks if `value` is array-like. A value is considered array-like if it's
12829 * not a function and has a `value.length` that's an integer greater than or
12830 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
12831 *
12832 * @static
12833 * @memberOf _
12834 * @since 4.0.0
12835 * @category Lang
12836 * @param {*} value The value to check.
12837 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
12838 * @example
12839 *
12840 * _.isArrayLike([1, 2, 3]);
12841 * // => true
12842 *
12843 * _.isArrayLike(document.body.children);
12844 * // => true
12845 *
12846 * _.isArrayLike('abc');
12847 * // => true
12848 *
12849 * _.isArrayLike(_.noop);
12850 * // => false
12851 */
12852 function isArrayLike(value) {
12853 return value != null && isLength(value.length) && !isFunction(value);
12854 }
12855
12856 /**
12857 * This method is like `_.isArrayLike` except that it also checks if `value`
12858 * is an object.
12859 *
12860 * @static
12861 * @memberOf _
12862 * @since 4.0.0
12863 * @category Lang
12864 * @param {*} value The value to check.
12865 * @returns {boolean} Returns `true` if `value` is an array-like object,
12866 * else `false`.
12867 * @example
12868 *
12869 * _.isArrayLikeObject([1, 2, 3]);
12870 * // => true
12871 *
12872 * _.isArrayLikeObject(document.body.children);
12873 * // => true
12874 *
12875 * _.isArrayLikeObject('abc');
12876 * // => false
12877 *
12878 * _.isArrayLikeObject(_.noop);
12879 * // => false
12880 */
12881 function isArrayLikeObject(value) {
12882 return isObjectLike(value) && isArrayLike(value);
12883 }
12884
12885 /**
12886 * Checks if `value` is classified as a boolean primitive or object.
12887 *
12888 * @static
12889 * @memberOf _
12890 * @since 0.1.0
12891 * @category Lang
12892 * @param {*} value The value to check.
12893 * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
12894 * @example
12895 *
12896 * _.isBoolean(false);
12897 * // => true
12898 *
12899 * _.isBoolean(null);
12900 * // => false
12901 */
12902 function isBoolean(value) {
12903 return value === true || value === false ||
12904 (isObjectLike(value) && baseGetTag(value) == boolTag);
12905 }
12906
12907 /**
12908 * Checks if `value` is a buffer.
12909 *
12910 * @static
12911 * @memberOf _
12912 * @since 4.3.0
12913 * @category Lang
12914 * @param {*} value The value to check.
12915 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
12916 * @example
12917 *
12918 * _.isBuffer(new Buffer(2));
12919 * // => true
12920 *
12921 * _.isBuffer(new Uint8Array(2));
12922 * // => false
12923 */
12924 var isBuffer = nativeIsBuffer || stubFalse;
12925
12926 /**
12927 * Checks if `value` is classified as a `Date` object.
12928 *
12929 * @static
12930 * @memberOf _
12931 * @since 0.1.0
12932 * @category Lang
12933 * @param {*} value The value to check.
12934 * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
12935 * @example
12936 *
12937 * _.isDate(new Date);
12938 * // => true
12939 *
12940 * _.isDate('Mon April 23 2012');
12941 * // => false
12942 */
12943 var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
12944
12945 /**
12946 * Checks if `value` is likely a DOM element.
12947 *
12948 * @static
12949 * @memberOf _
12950 * @since 0.1.0
12951 * @category Lang
12952 * @param {*} value The value to check.
12953 * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
12954 * @example
12955 *
12956 * _.isElement(document.body);
12957 * // => true
12958 *
12959 * _.isElement('<body>');
12960 * // => false
12961 */
12962 function isElement(value) {
12963 return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
12964 }
12965
12966 /**
12967 * Checks if `value` is an empty object, collection, map, or set.
12968 *
12969 * Objects are considered empty if they have no own enumerable string keyed
12970 * properties.
12971 *
12972 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
12973 * jQuery-like collections are considered empty if they have a `length` of `0`.
12974 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
12975 *
12976 * @static
12977 * @memberOf _
12978 * @since 0.1.0
12979 * @category Lang
12980 * @param {*} value The value to check.
12981 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
12982 * @example
12983 *
12984 * _.isEmpty(null);
12985 * // => true
12986 *
12987 * _.isEmpty(true);
12988 * // => true
12989 *
12990 * _.isEmpty(1);
12991 * // => true
12992 *
12993 * _.isEmpty([1, 2, 3]);
12994 * // => false
12995 *
12996 * _.isEmpty({ 'a': 1 });
12997 * // => false
12998 */
12999 function isEmpty(value) {
13000 if (value == null) {
13001 return true;
13002 }
13003 if (isArrayLike(value) &&
13004 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
13005 isBuffer(value) || isTypedArray(value) || isArguments(value))) {
13006 return !value.length;
13007 }
13008 var tag = getTag(value);
13009 if (tag == mapTag || tag == setTag) {
13010 return !value.size;
13011 }
13012 if (isPrototype(value)) {
13013 return !baseKeys(value).length;
13014 }
13015 for (var key in value) {
13016 if (hasOwnProperty.call(value, key)) {
13017 return false;
13018 }
13019 }
13020 return true;
13021 }
13022
13023 /**
13024 * Performs a deep comparison between two values to determine if they are
13025 * equivalent.
13026 *
13027 * **Note:** This method supports comparing arrays, array buffers, booleans,
13028 * date objects, error objects, maps, numbers, `Object` objects, regexes,
13029 * sets, strings, symbols, and typed arrays. `Object` objects are compared
13030 * by their own, not inherited, enumerable properties. Functions and DOM
13031 * nodes are compared by strict equality, i.e. `===`.
13032 *
13033 * @static
13034 * @memberOf _
13035 * @since 0.1.0
13036 * @category Lang
13037 * @param {*} value The value to compare.
13038 * @param {*} other The other value to compare.
13039 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
13040 * @example
13041 *
13042 * var object = { 'a': 1 };
13043 * var other = { 'a': 1 };
13044 *
13045 * _.isEqual(object, other);
13046 * // => true
13047 *
13048 * object === other;
13049 * // => false
13050 */
13051 function isEqual(value, other) {
13052 return baseIsEqual(value, other);
13053 }
13054
13055 /**
13056 * This method is like `_.isEqual` except that it accepts `customizer` which
13057 * is invoked to compare values. If `customizer` returns `undefined`, comparisons
13058 * are handled by the method instead. The `customizer` is invoked with up to
13059 * six arguments: (objValue, othValue [, index|key, object, other, stack]).
13060 *
13061 * @static
13062 * @memberOf _
13063 * @since 4.0.0
13064 * @category Lang
13065 * @param {*} value The value to compare.
13066 * @param {*} other The other value to compare.
13067 * @param {Function} [customizer] The function to customize comparisons.
13068 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
13069 * @example
13070 *
13071 * function isGreeting(value) {
13072 * return /^h(?:i|ello)$/.test(value);
13073 * }
13074 *
13075 * function customizer(objValue, othValue) {
13076 * if (isGreeting(objValue) && isGreeting(othValue)) {
13077 * return true;
13078 * }
13079 * }
13080 *
13081 * var array = ['hello', 'goodbye'];
13082 * var other = ['hi', 'goodbye'];
13083 *
13084 * _.isEqualWith(array, other, customizer);
13085 * // => true
13086 */
13087 function isEqualWith(value, other, customizer) {
13088 customizer = typeof customizer == 'function' ? customizer : undefined;
13089 var result = customizer ? customizer(value, other) : undefined;
13090 return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
13091 }
13092
13093 /**
13094 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
13095 * `SyntaxError`, `TypeError`, or `URIError` object.
13096 *
13097 * @static
13098 * @memberOf _
13099 * @since 3.0.0
13100 * @category Lang
13101 * @param {*} value The value to check.
13102 * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
13103 * @example
13104 *
13105 * _.isError(new Error);
13106 * // => true
13107 *
13108 * _.isError(Error);
13109 * // => false
13110 */
13111 function isError(value) {
13112 if (!isObjectLike(value)) {
13113 return false;
13114 }
13115 var tag = baseGetTag(value);
13116 return tag == errorTag || tag == domExcTag ||
13117 (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
13118 }
13119
13120 /**
13121 * Checks if `value` is a finite primitive number.
13122 *
13123 * **Note:** This method is based on
13124 * [`Number.isFinite`](https://mdn.io/Number/isFinite).
13125 *
13126 * @static
13127 * @memberOf _
13128 * @since 0.1.0
13129 * @category Lang
13130 * @param {*} value The value to check.
13131 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
13132 * @example
13133 *
13134 * _.isFinite(3);
13135 * // => true
13136 *
13137 * _.isFinite(Number.MIN_VALUE);
13138 * // => true
13139 *
13140 * _.isFinite(Infinity);
13141 * // => false
13142 *
13143 * _.isFinite('3');
13144 * // => false
13145 */
13146 function isFinite(value) {
13147 return typeof value == 'number' && nativeIsFinite(value);
13148 }
13149
13150 /**
13151 * Checks if `value` is classified as a `Function` object.
13152 *
13153 * @static
13154 * @memberOf _
13155 * @since 0.1.0
13156 * @category Lang
13157 * @param {*} value The value to check.
13158 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
13159 * @example
13160 *
13161 * _.isFunction(_);
13162 * // => true
13163 *
13164 * _.isFunction(/abc/);
13165 * // => false
13166 */
13167 function isFunction(value) {
13168 if (!isObject(value)) {
13169 return false;
13170 }
13171 // The use of `Object#toString` avoids issues with the `typeof` operator
13172 // in Safari 9 which returns 'object' for typed arrays and other constructors.
13173 var tag = baseGetTag(value);
13174 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
13175 }
13176
13177 /**
13178 * Checks if `value` is an integer.
13179 *
13180 * **Note:** This method is based on
13181 * [`Number.isInteger`](https://mdn.io/Number/isInteger).
13182 *
13183 * @static
13184 * @memberOf _
13185 * @since 4.0.0
13186 * @category Lang
13187 * @param {*} value The value to check.
13188 * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
13189 * @example
13190 *
13191 * _.isInteger(3);
13192 * // => true
13193 *
13194 * _.isInteger(Number.MIN_VALUE);
13195 * // => false
13196 *
13197 * _.isInteger(Infinity);
13198 * // => false
13199 *
13200 * _.isInteger('3');
13201 * // => false
13202 */
13203 function isInteger(value) {
13204 return typeof value == 'number' && value == toInteger(value);
13205 }
13206
13207 /**
13208 * Checks if `value` is a valid array-like length.
13209 *
13210 * **Note:** This method is loosely based on
13211 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
13212 *
13213 * @static
13214 * @memberOf _
13215 * @since 4.0.0
13216 * @category Lang
13217 * @param {*} value The value to check.
13218 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
13219 * @example
13220 *
13221 * _.isLength(3);
13222 * // => true
13223 *
13224 * _.isLength(Number.MIN_VALUE);
13225 * // => false
13226 *
13227 * _.isLength(Infinity);
13228 * // => false
13229 *
13230 * _.isLength('3');
13231 * // => false
13232 */
13233 function isLength(value) {
13234 return typeof value == 'number' &&
13235 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
13236 }
13237
13238 /**
13239 * Checks if `value` is the
13240 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
13241 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
13242 *
13243 * @static
13244 * @memberOf _
13245 * @since 0.1.0
13246 * @category Lang
13247 * @param {*} value The value to check.
13248 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
13249 * @example
13250 *
13251 * _.isObject({});
13252 * // => true
13253 *
13254 * _.isObject([1, 2, 3]);
13255 * // => true
13256 *
13257 * _.isObject(_.noop);
13258 * // => true
13259 *
13260 * _.isObject(null);
13261 * // => false
13262 */
13263 function isObject(value) {
13264 var type = typeof value;
13265 return value != null && (type == 'object' || type == 'function');
13266 }
13267
13268 /**
13269 * Checks if `value` is object-like. A value is object-like if it's not `null`
13270 * and has a `typeof` result of "object".
13271 *
13272 * @static
13273 * @memberOf _
13274 * @since 4.0.0
13275 * @category Lang
13276 * @param {*} value The value to check.
13277 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
13278 * @example
13279 *
13280 * _.isObjectLike({});
13281 * // => true
13282 *
13283 * _.isObjectLike([1, 2, 3]);
13284 * // => true
13285 *
13286 * _.isObjectLike(_.noop);
13287 * // => false
13288 *
13289 * _.isObjectLike(null);
13290 * // => false
13291 */
13292 function isObjectLike(value) {
13293 return value != null && typeof value == 'object';
13294 }
13295
13296 /**
13297 * Checks if `value` is classified as a `Map` object.
13298 *
13299 * @static
13300 * @memberOf _
13301 * @since 4.3.0
13302 * @category Lang
13303 * @param {*} value The value to check.
13304 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
13305 * @example
13306 *
13307 * _.isMap(new Map);
13308 * // => true
13309 *
13310 * _.isMap(new WeakMap);
13311 * // => false
13312 */
13313 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
13314
13315 /**
13316 * Performs a partial deep comparison between `object` and `source` to
13317 * determine if `object` contains equivalent property values.
13318 *
13319 * **Note:** This method is equivalent to `_.matches` when `source` is
13320 * partially applied.
13321 *
13322 * Partial comparisons will match empty array and empty object `source`
13323 * values against any array or object value, respectively. See `_.isEqual`
13324 * for a list of supported value comparisons.
13325 *
13326 * @static
13327 * @memberOf _
13328 * @since 3.0.0
13329 * @category Lang
13330 * @param {Object} object The object to inspect.
13331 * @param {Object} source The object of property values to match.
13332 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
13333 * @example
13334 *
13335 * var object = { 'a': 1, 'b': 2 };
13336 *
13337 * _.isMatch(object, { 'b': 2 });
13338 * // => true
13339 *
13340 * _.isMatch(object, { 'b': 1 });
13341 * // => false
13342 */
13343 function isMatch(object, source) {
13344 return object === source || baseIsMatch(object, source, getMatchData(source));
13345 }
13346
13347 /**
13348 * This method is like `_.isMatch` except that it accepts `customizer` which
13349 * is invoked to compare values. If `customizer` returns `undefined`, comparisons
13350 * are handled by the method instead. The `customizer` is invoked with five
13351 * arguments: (objValue, srcValue, index|key, object, source).
13352 *
13353 * @static
13354 * @memberOf _
13355 * @since 4.0.0
13356 * @category Lang
13357 * @param {Object} object The object to inspect.
13358 * @param {Object} source The object of property values to match.
13359 * @param {Function} [customizer] The function to customize comparisons.
13360 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
13361 * @example
13362 *
13363 * function isGreeting(value) {
13364 * return /^h(?:i|ello)$/.test(value);
13365 * }
13366 *
13367 * function customizer(objValue, srcValue) {
13368 * if (isGreeting(objValue) && isGreeting(srcValue)) {
13369 * return true;
13370 * }
13371 * }
13372 *
13373 * var object = { 'greeting': 'hello' };
13374 * var source = { 'greeting': 'hi' };
13375 *
13376 * _.isMatchWith(object, source, customizer);
13377 * // => true
13378 */
13379 function isMatchWith(object, source, customizer) {
13380 customizer = typeof customizer == 'function' ? customizer : undefined;
13381 return baseIsMatch(object, source, getMatchData(source), customizer);
13382 }
13383
13384 /**
13385 * Checks if `value` is `NaN`.
13386 *
13387 * **Note:** This method is based on
13388 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
13389 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
13390 * `undefined` and other non-number values.
13391 *
13392 * @static
13393 * @memberOf _
13394 * @since 0.1.0
13395 * @category Lang
13396 * @param {*} value The value to check.
13397 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
13398 * @example
13399 *
13400 * _.isNaN(NaN);
13401 * // => true
13402 *
13403 * _.isNaN(new Number(NaN));
13404 * // => true
13405 *
13406 * isNaN(undefined);
13407 * // => true
13408 *
13409 * _.isNaN(undefined);
13410 * // => false
13411 */
13412 function isNaN(value) {
13413 // An `NaN` primitive is the only value that is not equal to itself.
13414 // Perform the `toStringTag` check first to avoid errors with some
13415 // ActiveX objects in IE.
13416 return isNumber(value) && value != +value;
13417 }
13418
13419 /**
13420 * Checks if `value` is a pristine native function.
13421 *
13422 * **Note:** This method can't reliably detect native functions in the presence
13423 * of the core-js package because core-js circumvents this kind of detection.
13424 * Despite multiple requests, the core-js maintainer has made it clear: any
13425 * attempt to fix the detection will be obstructed. As a result, we're left
13426 * with little choice but to throw an error. Unfortunately, this also affects
13427 * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
13428 * which rely on core-js.
13429 *
13430 * @static
13431 * @memberOf _
13432 * @since 3.0.0
13433 * @category Lang
13434 * @param {*} value The value to check.
13435 * @returns {boolean} Returns `true` if `value` is a native function,
13436 * else `false`.
13437 * @example
13438 *
13439 * _.isNative(Array.prototype.push);
13440 * // => true
13441 *
13442 * _.isNative(_);
13443 * // => false
13444 */
13445 function isNative(value) {
13446 if (isMaskable(value)) {
13447 throw new Error(CORE_ERROR_TEXT);
13448 }
13449 return baseIsNative(value);
13450 }
13451
13452 /**
13453 * Checks if `value` is `null`.
13454 *
13455 * @static
13456 * @memberOf _
13457 * @since 0.1.0
13458 * @category Lang
13459 * @param {*} value The value to check.
13460 * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
13461 * @example
13462 *
13463 * _.isNull(null);
13464 * // => true
13465 *
13466 * _.isNull(void 0);
13467 * // => false
13468 */
13469 function isNull(value) {
13470 return value === null;
13471 }
13472
13473 /**
13474 * Checks if `value` is `null` or `undefined`.
13475 *
13476 * @static
13477 * @memberOf _
13478 * @since 4.0.0
13479 * @category Lang
13480 * @param {*} value The value to check.
13481 * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
13482 * @example
13483 *
13484 * _.isNil(null);
13485 * // => true
13486 *
13487 * _.isNil(void 0);
13488 * // => true
13489 *
13490 * _.isNil(NaN);
13491 * // => false
13492 */
13493 function isNil(value) {
13494 return value == null;
13495 }
13496
13497 /**
13498 * Checks if `value` is classified as a `Number` primitive or object.
13499 *
13500 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
13501 * classified as numbers, use the `_.isFinite` method.
13502 *
13503 * @static
13504 * @memberOf _
13505 * @since 0.1.0
13506 * @category Lang
13507 * @param {*} value The value to check.
13508 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
13509 * @example
13510 *
13511 * _.isNumber(3);
13512 * // => true
13513 *
13514 * _.isNumber(Number.MIN_VALUE);
13515 * // => true
13516 *
13517 * _.isNumber(Infinity);
13518 * // => true
13519 *
13520 * _.isNumber('3');
13521 * // => false
13522 */
13523 function isNumber(value) {
13524 return typeof value == 'number' ||
13525 (isObjectLike(value) && baseGetTag(value) == numberTag);
13526 }
13527
13528 /**
13529 * Checks if `value` is a plain object, that is, an object created by the
13530 * `Object` constructor or one with a `[[Prototype]]` of `null`.
13531 *
13532 * @static
13533 * @memberOf _
13534 * @since 0.8.0
13535 * @category Lang
13536 * @param {*} value The value to check.
13537 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
13538 * @example
13539 *
13540 * function Foo() {
13541 * this.a = 1;
13542 * }
13543 *
13544 * _.isPlainObject(new Foo);
13545 * // => false
13546 *
13547 * _.isPlainObject([1, 2, 3]);
13548 * // => false
13549 *
13550 * _.isPlainObject({ 'x': 0, 'y': 0 });
13551 * // => true
13552 *
13553 * _.isPlainObject(Object.create(null));
13554 * // => true
13555 */
13556 function isPlainObject(value) {
13557 if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
13558 return false;
13559 }
13560 var proto = getPrototype(value);
13561 if (proto === null) {
13562 return true;
13563 }
13564 var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
13565 return typeof Ctor == 'function' && Ctor instanceof Ctor &&
13566 funcToString.call(Ctor) == objectCtorString;
13567 }
13568
13569 /**
13570 * Checks if `value` is classified as a `RegExp` object.
13571 *
13572 * @static
13573 * @memberOf _
13574 * @since 0.1.0
13575 * @category Lang
13576 * @param {*} value The value to check.
13577 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
13578 * @example
13579 *
13580 * _.isRegExp(/abc/);
13581 * // => true
13582 *
13583 * _.isRegExp('/abc/');
13584 * // => false
13585 */
13586 var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
13587
13588 /**
13589 * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
13590 * double precision number which isn't the result of a rounded unsafe integer.
13591 *
13592 * **Note:** This method is based on
13593 * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
13594 *
13595 * @static
13596 * @memberOf _
13597 * @since 4.0.0
13598 * @category Lang
13599 * @param {*} value The value to check.
13600 * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
13601 * @example
13602 *
13603 * _.isSafeInteger(3);
13604 * // => true
13605 *
13606 * _.isSafeInteger(Number.MIN_VALUE);
13607 * // => false
13608 *
13609 * _.isSafeInteger(Infinity);
13610 * // => false
13611 *
13612 * _.isSafeInteger('3');
13613 * // => false
13614 */
13615 function isSafeInteger(value) {
13616 return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
13617 }
13618
13619 /**
13620 * Checks if `value` is classified as a `Set` object.
13621 *
13622 * @static
13623 * @memberOf _
13624 * @since 4.3.0
13625 * @category Lang
13626 * @param {*} value The value to check.
13627 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
13628 * @example
13629 *
13630 * _.isSet(new Set);
13631 * // => true
13632 *
13633 * _.isSet(new WeakSet);
13634 * // => false
13635 */
13636 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
13637
13638 /**
13639 * Checks if `value` is classified as a `String` primitive or object.
13640 *
13641 * @static
13642 * @since 0.1.0
13643 * @memberOf _
13644 * @category Lang
13645 * @param {*} value The value to check.
13646 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
13647 * @example
13648 *
13649 * _.isString('abc');
13650 * // => true
13651 *
13652 * _.isString(1);
13653 * // => false
13654 */
13655 function isString(value) {
13656 return typeof value == 'string' ||
13657 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
13658 }
13659
13660 /**
13661 * Checks if `value` is classified as a `Symbol` primitive or object.
13662 *
13663 * @static
13664 * @memberOf _
13665 * @since 4.0.0
13666 * @category Lang
13667 * @param {*} value The value to check.
13668 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
13669 * @example
13670 *
13671 * _.isSymbol(Symbol.iterator);
13672 * // => true
13673 *
13674 * _.isSymbol('abc');
13675 * // => false
13676 */
13677 function isSymbol(value) {
13678 return typeof value == 'symbol' ||
13679 (isObjectLike(value) && baseGetTag(value) == symbolTag);
13680 }
13681
13682 /**
13683 * Checks if `value` is classified as a typed array.
13684 *
13685 * @static
13686 * @memberOf _
13687 * @since 3.0.0
13688 * @category Lang
13689 * @param {*} value The value to check.
13690 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
13691 * @example
13692 *
13693 * _.isTypedArray(new Uint8Array);
13694 * // => true
13695 *
13696 * _.isTypedArray([]);
13697 * // => false
13698 */
13699 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
13700
13701 /**
13702 * Checks if `value` is `undefined`.
13703 *
13704 * @static
13705 * @since 0.1.0
13706 * @memberOf _
13707 * @category Lang
13708 * @param {*} value The value to check.
13709 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
13710 * @example
13711 *
13712 * _.isUndefined(void 0);
13713 * // => true
13714 *
13715 * _.isUndefined(null);
13716 * // => false
13717 */
13718 function isUndefined(value) {
13719 return value === undefined;
13720 }
13721
13722 /**
13723 * Checks if `value` is classified as a `WeakMap` object.
13724 *
13725 * @static
13726 * @memberOf _
13727 * @since 4.3.0
13728 * @category Lang
13729 * @param {*} value The value to check.
13730 * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
13731 * @example
13732 *
13733 * _.isWeakMap(new WeakMap);
13734 * // => true
13735 *
13736 * _.isWeakMap(new Map);
13737 * // => false
13738 */
13739 function isWeakMap(value) {
13740 return isObjectLike(value) && getTag(value) == weakMapTag;
13741 }
13742
13743 /**
13744 * Checks if `value` is classified as a `WeakSet` object.
13745 *
13746 * @static
13747 * @memberOf _
13748 * @since 4.3.0
13749 * @category Lang
13750 * @param {*} value The value to check.
13751 * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
13752 * @example
13753 *
13754 * _.isWeakSet(new WeakSet);
13755 * // => true
13756 *
13757 * _.isWeakSet(new Set);
13758 * // => false
13759 */
13760 function isWeakSet(value) {
13761 return isObjectLike(value) && baseGetTag(value) == weakSetTag;
13762 }
13763
13764 /**
13765 * Checks if `value` is less than `other`.
13766 *
13767 * @static
13768 * @memberOf _
13769 * @since 3.9.0
13770 * @category Lang
13771 * @param {*} value The value to compare.
13772 * @param {*} other The other value to compare.
13773 * @returns {boolean} Returns `true` if `value` is less than `other`,
13774 * else `false`.
13775 * @see _.gt
13776 * @example
13777 *
13778 * _.lt(1, 3);
13779 * // => true
13780 *
13781 * _.lt(3, 3);
13782 * // => false
13783 *
13784 * _.lt(3, 1);
13785 * // => false
13786 */
13787 var lt = createRelationalOperation(baseLt);
13788
13789 /**
13790 * Checks if `value` is less than or equal to `other`.
13791 *
13792 * @static
13793 * @memberOf _
13794 * @since 3.9.0
13795 * @category Lang
13796 * @param {*} value The value to compare.
13797 * @param {*} other The other value to compare.
13798 * @returns {boolean} Returns `true` if `value` is less than or equal to
13799 * `other`, else `false`.
13800 * @see _.gte
13801 * @example
13802 *
13803 * _.lte(1, 3);
13804 * // => true
13805 *
13806 * _.lte(3, 3);
13807 * // => true
13808 *
13809 * _.lte(3, 1);
13810 * // => false
13811 */
13812 var lte = createRelationalOperation(function(value, other) {
13813 return value <= other;
13814 });
13815
13816 /**
13817 * Converts `value` to an array.
13818 *
13819 * @static
13820 * @since 0.1.0
13821 * @memberOf _
13822 * @category Lang
13823 * @param {*} value The value to convert.
13824 * @returns {Array} Returns the converted array.
13825 * @example
13826 *
13827 * _.toArray({ 'a': 1, 'b': 2 });
13828 * // => [1, 2]
13829 *
13830 * _.toArray('abc');
13831 * // => ['a', 'b', 'c']
13832 *
13833 * _.toArray(1);
13834 * // => []
13835 *
13836 * _.toArray(null);
13837 * // => []
13838 */
13839 function toArray(value) {
13840 if (!value) {
13841 return [];
13842 }
13843 if (isArrayLike(value)) {
13844 return isString(value) ? stringToArray(value) : copyArray(value);
13845 }
13846 if (symIterator && value[symIterator]) {
13847 return iteratorToArray(value[symIterator]());
13848 }
13849 var tag = getTag(value),
13850 func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
13851
13852 return func(value);
13853 }
13854
13855 /**
13856 * Converts `value` to a finite number.
13857 *
13858 * @static
13859 * @memberOf _
13860 * @since 4.12.0
13861 * @category Lang
13862 * @param {*} value The value to convert.
13863 * @returns {number} Returns the converted number.
13864 * @example
13865 *
13866 * _.toFinite(3.2);
13867 * // => 3.2
13868 *
13869 * _.toFinite(Number.MIN_VALUE);
13870 * // => 5e-324
13871 *
13872 * _.toFinite(Infinity);
13873 * // => 1.7976931348623157e+308
13874 *
13875 * _.toFinite('3.2');
13876 * // => 3.2
13877 */
13878 function toFinite(value) {
13879 if (!value) {
13880 return value === 0 ? value : 0;
13881 }
13882 value = toNumber(value);
13883 if (value === INFINITY || value === -INFINITY) {
13884 var sign = (value < 0 ? -1 : 1);
13885 return sign * MAX_INTEGER;
13886 }
13887 return value === value ? value : 0;
13888 }
13889
13890 /**
13891 * Converts `value` to an integer.
13892 *
13893 * **Note:** This method is loosely based on
13894 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
13895 *
13896 * @static
13897 * @memberOf _
13898 * @since 4.0.0
13899 * @category Lang
13900 * @param {*} value The value to convert.
13901 * @returns {number} Returns the converted integer.
13902 * @example
13903 *
13904 * _.toInteger(3.2);
13905 * // => 3
13906 *
13907 * _.toInteger(Number.MIN_VALUE);
13908 * // => 0
13909 *
13910 * _.toInteger(Infinity);
13911 * // => 1.7976931348623157e+308
13912 *
13913 * _.toInteger('3.2');
13914 * // => 3
13915 */
13916 function toInteger(value) {
13917 var result = toFinite(value),
13918 remainder = result % 1;
13919
13920 return result === result ? (remainder ? result - remainder : result) : 0;
13921 }
13922
13923 /**
13924 * Converts `value` to an integer suitable for use as the length of an
13925 * array-like object.
13926 *
13927 * **Note:** This method is based on
13928 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
13929 *
13930 * @static
13931 * @memberOf _
13932 * @since 4.0.0
13933 * @category Lang
13934 * @param {*} value The value to convert.
13935 * @returns {number} Returns the converted integer.
13936 * @example
13937 *
13938 * _.toLength(3.2);
13939 * // => 3
13940 *
13941 * _.toLength(Number.MIN_VALUE);
13942 * // => 0
13943 *
13944 * _.toLength(Infinity);
13945 * // => 4294967295
13946 *
13947 * _.toLength('3.2');
13948 * // => 3
13949 */
13950 function toLength(value) {
13951 return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
13952 }
13953
13954 /**
13955 * Converts `value` to a number.
13956 *
13957 * @static
13958 * @memberOf _
13959 * @since 4.0.0
13960 * @category Lang
13961 * @param {*} value The value to process.
13962 * @returns {number} Returns the number.
13963 * @example
13964 *
13965 * _.toNumber(3.2);
13966 * // => 3.2
13967 *
13968 * _.toNumber(Number.MIN_VALUE);
13969 * // => 5e-324
13970 *
13971 * _.toNumber(Infinity);
13972 * // => Infinity
13973 *
13974 * _.toNumber('3.2');
13975 * // => 3.2
13976 */
13977 function toNumber(value) {
13978 if (typeof value == 'number') {
13979 return value;
13980 }
13981 if (isSymbol(value)) {
13982 return NAN;
13983 }
13984 if (isObject(value)) {
13985 var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
13986 value = isObject(other) ? (other + '') : other;
13987 }
13988 if (typeof value != 'string') {
13989 return value === 0 ? value : +value;
13990 }
13991 value = value.replace(reTrim, '');
13992 var isBinary = reIsBinary.test(value);
13993 return (isBinary || reIsOctal.test(value))
13994 ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
13995 : (reIsBadHex.test(value) ? NAN : +value);
13996 }
13997
13998 /**
13999 * Converts `value` to a plain object flattening inherited enumerable string
14000 * keyed properties of `value` to own properties of the plain object.
14001 *
14002 * @static
14003 * @memberOf _
14004 * @since 3.0.0
14005 * @category Lang
14006 * @param {*} value The value to convert.
14007 * @returns {Object} Returns the converted plain object.
14008 * @example
14009 *
14010 * function Foo() {
14011 * this.b = 2;
14012 * }
14013 *
14014 * Foo.prototype.c = 3;
14015 *
14016 * _.assign({ 'a': 1 }, new Foo);
14017 * // => { 'a': 1, 'b': 2 }
14018 *
14019 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
14020 * // => { 'a': 1, 'b': 2, 'c': 3 }
14021 */
14022 function toPlainObject(value) {
14023 return copyObject(value, keysIn(value));
14024 }
14025
14026 /**
14027 * Converts `value` to a safe integer. A safe integer can be compared and
14028 * represented correctly.
14029 *
14030 * @static
14031 * @memberOf _
14032 * @since 4.0.0
14033 * @category Lang
14034 * @param {*} value The value to convert.
14035 * @returns {number} Returns the converted integer.
14036 * @example
14037 *
14038 * _.toSafeInteger(3.2);
14039 * // => 3
14040 *
14041 * _.toSafeInteger(Number.MIN_VALUE);
14042 * // => 0
14043 *
14044 * _.toSafeInteger(Infinity);
14045 * // => 9007199254740991
14046 *
14047 * _.toSafeInteger('3.2');
14048 * // => 3
14049 */
14050 function toSafeInteger(value) {
14051 return value
14052 ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
14053 : (value === 0 ? value : 0);
14054 }
14055
14056 /**
14057 * Converts `value` to a string. An empty string is returned for `null`
14058 * and `undefined` values. The sign of `-0` is preserved.
14059 *
14060 * @static
14061 * @memberOf _
14062 * @since 4.0.0
14063 * @category Lang
14064 * @param {*} value The value to convert.
14065 * @returns {string} Returns the converted string.
14066 * @example
14067 *
14068 * _.toString(null);
14069 * // => ''
14070 *
14071 * _.toString(-0);
14072 * // => '-0'
14073 *
14074 * _.toString([1, 2, 3]);
14075 * // => '1,2,3'
14076 */
14077 function toString(value) {
14078 return value == null ? '' : baseToString(value);
14079 }
14080
14081 /*------------------------------------------------------------------------*/
14082
14083 /**
14084 * Assigns own enumerable string keyed properties of source objects to the
14085 * destination object. Source objects are applied from left to right.
14086 * Subsequent sources overwrite property assignments of previous sources.
14087 *
14088 * **Note:** This method mutates `object` and is loosely based on
14089 * [`Object.assign`](https://mdn.io/Object/assign).
14090 *
14091 * @static
14092 * @memberOf _
14093 * @since 0.10.0
14094 * @category Object
14095 * @param {Object} object The destination object.
14096 * @param {...Object} [sources] The source objects.
14097 * @returns {Object} Returns `object`.
14098 * @see _.assignIn
14099 * @example
14100 *
14101 * function Foo() {
14102 * this.a = 1;
14103 * }
14104 *
14105 * function Bar() {
14106 * this.c = 3;
14107 * }
14108 *
14109 * Foo.prototype.b = 2;
14110 * Bar.prototype.d = 4;
14111 *
14112 * _.assign({ 'a': 0 }, new Foo, new Bar);
14113 * // => { 'a': 1, 'c': 3 }
14114 */
14115 var assign = createAssigner(function(object, source) {
14116 if (isPrototype(source) || isArrayLike(source)) {
14117 copyObject(source, keys(source), object);
14118 return;
14119 }
14120 for (var key in source) {
14121 if (hasOwnProperty.call(source, key)) {
14122 assignValue(object, key, source[key]);
14123 }
14124 }
14125 });
14126
14127 /**
14128 * This method is like `_.assign` except that it iterates over own and
14129 * inherited source properties.
14130 *
14131 * **Note:** This method mutates `object`.
14132 *
14133 * @static
14134 * @memberOf _
14135 * @since 4.0.0
14136 * @alias extend
14137 * @category Object
14138 * @param {Object} object The destination object.
14139 * @param {...Object} [sources] The source objects.
14140 * @returns {Object} Returns `object`.
14141 * @see _.assign
14142 * @example
14143 *
14144 * function Foo() {
14145 * this.a = 1;
14146 * }
14147 *
14148 * function Bar() {
14149 * this.c = 3;
14150 * }
14151 *
14152 * Foo.prototype.b = 2;
14153 * Bar.prototype.d = 4;
14154 *
14155 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
14156 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
14157 */
14158 var assignIn = createAssigner(function(object, source) {
14159 copyObject(source, keysIn(source), object);
14160 });
14161
14162 /**
14163 * This method is like `_.assignIn` except that it accepts `customizer`
14164 * which is invoked to produce the assigned values. If `customizer` returns
14165 * `undefined`, assignment is handled by the method instead. The `customizer`
14166 * is invoked with five arguments: (objValue, srcValue, key, object, source).
14167 *
14168 * **Note:** This method mutates `object`.
14169 *
14170 * @static
14171 * @memberOf _
14172 * @since 4.0.0
14173 * @alias extendWith
14174 * @category Object
14175 * @param {Object} object The destination object.
14176 * @param {...Object} sources The source objects.
14177 * @param {Function} [customizer] The function to customize assigned values.
14178 * @returns {Object} Returns `object`.
14179 * @see _.assignWith
14180 * @example
14181 *
14182 * function customizer(objValue, srcValue) {
14183 * return _.isUndefined(objValue) ? srcValue : objValue;
14184 * }
14185 *
14186 * var defaults = _.partialRight(_.assignInWith, customizer);
14187 *
14188 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
14189 * // => { 'a': 1, 'b': 2 }
14190 */
14191 var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
14192 copyObject(source, keysIn(source), object, customizer);
14193 });
14194
14195 /**
14196 * This method is like `_.assign` except that it accepts `customizer`
14197 * which is invoked to produce the assigned values. If `customizer` returns
14198 * `undefined`, assignment is handled by the method instead. The `customizer`
14199 * is invoked with five arguments: (objValue, srcValue, key, object, source).
14200 *
14201 * **Note:** This method mutates `object`.
14202 *
14203 * @static
14204 * @memberOf _
14205 * @since 4.0.0
14206 * @category Object
14207 * @param {Object} object The destination object.
14208 * @param {...Object} sources The source objects.
14209 * @param {Function} [customizer] The function to customize assigned values.
14210 * @returns {Object} Returns `object`.
14211 * @see _.assignInWith
14212 * @example
14213 *
14214 * function customizer(objValue, srcValue) {
14215 * return _.isUndefined(objValue) ? srcValue : objValue;
14216 * }
14217 *
14218 * var defaults = _.partialRight(_.assignWith, customizer);
14219 *
14220 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
14221 * // => { 'a': 1, 'b': 2 }
14222 */
14223 var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
14224 copyObject(source, keys(source), object, customizer);
14225 });
14226
14227 /**
14228 * Creates an array of values corresponding to `paths` of `object`.
14229 *
14230 * @static
14231 * @memberOf _
14232 * @since 1.0.0
14233 * @category Object
14234 * @param {Object} object The object to iterate over.
14235 * @param {...(string|string[])} [paths] The property paths to pick.
14236 * @returns {Array} Returns the picked values.
14237 * @example
14238 *
14239 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
14240 *
14241 * _.at(object, ['a[0].b.c', 'a[1]']);
14242 * // => [3, 4]
14243 */
14244 var at = flatRest(baseAt);
14245
14246 /**
14247 * Creates an object that inherits from the `prototype` object. If a
14248 * `properties` object is given, its own enumerable string keyed properties
14249 * are assigned to the created object.
14250 *
14251 * @static
14252 * @memberOf _
14253 * @since 2.3.0
14254 * @category Object
14255 * @param {Object} prototype The object to inherit from.
14256 * @param {Object} [properties] The properties to assign to the object.
14257 * @returns {Object} Returns the new object.
14258 * @example
14259 *
14260 * function Shape() {
14261 * this.x = 0;
14262 * this.y = 0;
14263 * }
14264 *
14265 * function Circle() {
14266 * Shape.call(this);
14267 * }
14268 *
14269 * Circle.prototype = _.create(Shape.prototype, {
14270 * 'constructor': Circle
14271 * });
14272 *
14273 * var circle = new Circle;
14274 * circle instanceof Circle;
14275 * // => true
14276 *
14277 * circle instanceof Shape;
14278 * // => true
14279 */
14280 function create(prototype, properties) {
14281 var result = baseCreate(prototype);
14282 return properties == null ? result : baseAssign(result, properties);
14283 }
14284
14285 /**
14286 * Assigns own and inherited enumerable string keyed properties of source
14287 * objects to the destination object for all destination properties that
14288 * resolve to `undefined`. Source objects are applied from left to right.
14289 * Once a property is set, additional values of the same property are ignored.
14290 *
14291 * **Note:** This method mutates `object`.
14292 *
14293 * @static
14294 * @since 0.1.0
14295 * @memberOf _
14296 * @category Object
14297 * @param {Object} object The destination object.
14298 * @param {...Object} [sources] The source objects.
14299 * @returns {Object} Returns `object`.
14300 * @see _.defaultsDeep
14301 * @example
14302 *
14303 * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
14304 * // => { 'a': 1, 'b': 2 }
14305 */
14306 var defaults = baseRest(function(object, sources) {
14307 object = Object(object);
14308
14309 var index = -1;
14310 var length = sources.length;
14311 var guard = length > 2 ? sources[2] : undefined;
14312
14313 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
14314 length = 1;
14315 }
14316
14317 while (++index < length) {
14318 var source = sources[index];
14319 var props = keysIn(source);
14320 var propsIndex = -1;
14321 var propsLength = props.length;
14322
14323 while (++propsIndex < propsLength) {
14324 var key = props[propsIndex];
14325 var value = object[key];
14326
14327 if (value === undefined ||
14328 (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
14329 object[key] = source[key];
14330 }
14331 }
14332 }
14333
14334 return object;
14335 });
14336
14337 /**
14338 * This method is like `_.defaults` except that it recursively assigns
14339 * default properties.
14340 *
14341 * **Note:** This method mutates `object`.
14342 *
14343 * @static
14344 * @memberOf _
14345 * @since 3.10.0
14346 * @category Object
14347 * @param {Object} object The destination object.
14348 * @param {...Object} [sources] The source objects.
14349 * @returns {Object} Returns `object`.
14350 * @see _.defaults
14351 * @example
14352 *
14353 * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
14354 * // => { 'a': { 'b': 2, 'c': 3 } }
14355 */
14356 var defaultsDeep = baseRest(function(args) {
14357 args.push(undefined, customDefaultsMerge);
14358 return apply(mergeWith, undefined, args);
14359 });
14360
14361 /**
14362 * This method is like `_.find` except that it returns the key of the first
14363 * element `predicate` returns truthy for instead of the element itself.
14364 *
14365 * @static
14366 * @memberOf _
14367 * @since 1.1.0
14368 * @category Object
14369 * @param {Object} object The object to inspect.
14370 * @param {Function} [predicate=_.identity] The function invoked per iteration.
14371 * @returns {string|undefined} Returns the key of the matched element,
14372 * else `undefined`.
14373 * @example
14374 *
14375 * var users = {
14376 * 'barney': { 'age': 36, 'active': true },
14377 * 'fred': { 'age': 40, 'active': false },
14378 * 'pebbles': { 'age': 1, 'active': true }
14379 * };
14380 *
14381 * _.findKey(users, function(o) { return o.age < 40; });
14382 * // => 'barney' (iteration order is not guaranteed)
14383 *
14384 * // The `_.matches` iteratee shorthand.
14385 * _.findKey(users, { 'age': 1, 'active': true });
14386 * // => 'pebbles'
14387 *
14388 * // The `_.matchesProperty` iteratee shorthand.
14389 * _.findKey(users, ['active', false]);
14390 * // => 'fred'
14391 *
14392 * // The `_.property` iteratee shorthand.
14393 * _.findKey(users, 'active');
14394 * // => 'barney'
14395 */
14396 function findKey(object, predicate) {
14397 return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
14398 }
14399
14400 /**
14401 * This method is like `_.findKey` except that it iterates over elements of
14402 * a collection in the opposite order.
14403 *
14404 * @static
14405 * @memberOf _
14406 * @since 2.0.0
14407 * @category Object
14408 * @param {Object} object The object to inspect.
14409 * @param {Function} [predicate=_.identity] The function invoked per iteration.
14410 * @returns {string|undefined} Returns the key of the matched element,
14411 * else `undefined`.
14412 * @example
14413 *
14414 * var users = {
14415 * 'barney': { 'age': 36, 'active': true },
14416 * 'fred': { 'age': 40, 'active': false },
14417 * 'pebbles': { 'age': 1, 'active': true }
14418 * };
14419 *
14420 * _.findLastKey(users, function(o) { return o.age < 40; });
14421 * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
14422 *
14423 * // The `_.matches` iteratee shorthand.
14424 * _.findLastKey(users, { 'age': 36, 'active': true });
14425 * // => 'barney'
14426 *
14427 * // The `_.matchesProperty` iteratee shorthand.
14428 * _.findLastKey(users, ['active', false]);
14429 * // => 'fred'
14430 *
14431 * // The `_.property` iteratee shorthand.
14432 * _.findLastKey(users, 'active');
14433 * // => 'pebbles'
14434 */
14435 function findLastKey(object, predicate) {
14436 return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
14437 }
14438
14439 /**
14440 * Iterates over own and inherited enumerable string keyed properties of an
14441 * object and invokes `iteratee` for each property. The iteratee is invoked
14442 * with three arguments: (value, key, object). Iteratee functions may exit
14443 * iteration early by explicitly returning `false`.
14444 *
14445 * @static
14446 * @memberOf _
14447 * @since 0.3.0
14448 * @category Object
14449 * @param {Object} object The object to iterate over.
14450 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14451 * @returns {Object} Returns `object`.
14452 * @see _.forInRight
14453 * @example
14454 *
14455 * function Foo() {
14456 * this.a = 1;
14457 * this.b = 2;
14458 * }
14459 *
14460 * Foo.prototype.c = 3;
14461 *
14462 * _.forIn(new Foo, function(value, key) {
14463 * console.log(key);
14464 * });
14465 * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
14466 */
14467 function forIn(object, iteratee) {
14468 return object == null
14469 ? object
14470 : baseFor(object, getIteratee(iteratee, 3), keysIn);
14471 }
14472
14473 /**
14474 * This method is like `_.forIn` except that it iterates over properties of
14475 * `object` in the opposite order.
14476 *
14477 * @static
14478 * @memberOf _
14479 * @since 2.0.0
14480 * @category Object
14481 * @param {Object} object The object to iterate over.
14482 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14483 * @returns {Object} Returns `object`.
14484 * @see _.forIn
14485 * @example
14486 *
14487 * function Foo() {
14488 * this.a = 1;
14489 * this.b = 2;
14490 * }
14491 *
14492 * Foo.prototype.c = 3;
14493 *
14494 * _.forInRight(new Foo, function(value, key) {
14495 * console.log(key);
14496 * });
14497 * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
14498 */
14499 function forInRight(object, iteratee) {
14500 return object == null
14501 ? object
14502 : baseForRight(object, getIteratee(iteratee, 3), keysIn);
14503 }
14504
14505 /**
14506 * Iterates over own enumerable string keyed properties of an object and
14507 * invokes `iteratee` for each property. The iteratee is invoked with three
14508 * arguments: (value, key, object). Iteratee functions may exit iteration
14509 * early by explicitly returning `false`.
14510 *
14511 * @static
14512 * @memberOf _
14513 * @since 0.3.0
14514 * @category Object
14515 * @param {Object} object The object to iterate over.
14516 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14517 * @returns {Object} Returns `object`.
14518 * @see _.forOwnRight
14519 * @example
14520 *
14521 * function Foo() {
14522 * this.a = 1;
14523 * this.b = 2;
14524 * }
14525 *
14526 * Foo.prototype.c = 3;
14527 *
14528 * _.forOwn(new Foo, function(value, key) {
14529 * console.log(key);
14530 * });
14531 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
14532 */
14533 function forOwn(object, iteratee) {
14534 return object && baseForOwn(object, getIteratee(iteratee, 3));
14535 }
14536
14537 /**
14538 * This method is like `_.forOwn` except that it iterates over properties of
14539 * `object` in the opposite order.
14540 *
14541 * @static
14542 * @memberOf _
14543 * @since 2.0.0
14544 * @category Object
14545 * @param {Object} object The object to iterate over.
14546 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14547 * @returns {Object} Returns `object`.
14548 * @see _.forOwn
14549 * @example
14550 *
14551 * function Foo() {
14552 * this.a = 1;
14553 * this.b = 2;
14554 * }
14555 *
14556 * Foo.prototype.c = 3;
14557 *
14558 * _.forOwnRight(new Foo, function(value, key) {
14559 * console.log(key);
14560 * });
14561 * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
14562 */
14563 function forOwnRight(object, iteratee) {
14564 return object && baseForOwnRight(object, getIteratee(iteratee, 3));
14565 }
14566
14567 /**
14568 * Creates an array of function property names from own enumerable properties
14569 * of `object`.
14570 *
14571 * @static
14572 * @since 0.1.0
14573 * @memberOf _
14574 * @category Object
14575 * @param {Object} object The object to inspect.
14576 * @returns {Array} Returns the function names.
14577 * @see _.functionsIn
14578 * @example
14579 *
14580 * function Foo() {
14581 * this.a = _.constant('a');
14582 * this.b = _.constant('b');
14583 * }
14584 *
14585 * Foo.prototype.c = _.constant('c');
14586 *
14587 * _.functions(new Foo);
14588 * // => ['a', 'b']
14589 */
14590 function functions(object) {
14591 return object == null ? [] : baseFunctions(object, keys(object));
14592 }
14593
14594 /**
14595 * Creates an array of function property names from own and inherited
14596 * enumerable properties of `object`.
14597 *
14598 * @static
14599 * @memberOf _
14600 * @since 4.0.0
14601 * @category Object
14602 * @param {Object} object The object to inspect.
14603 * @returns {Array} Returns the function names.
14604 * @see _.functions
14605 * @example
14606 *
14607 * function Foo() {
14608 * this.a = _.constant('a');
14609 * this.b = _.constant('b');
14610 * }
14611 *
14612 * Foo.prototype.c = _.constant('c');
14613 *
14614 * _.functionsIn(new Foo);
14615 * // => ['a', 'b', 'c']
14616 */
14617 function functionsIn(object) {
14618 return object == null ? [] : baseFunctions(object, keysIn(object));
14619 }
14620
14621 /**
14622 * Gets the value at `path` of `object`. If the resolved value is
14623 * `undefined`, the `defaultValue` is returned in its place.
14624 *
14625 * @static
14626 * @memberOf _
14627 * @since 3.7.0
14628 * @category Object
14629 * @param {Object} object The object to query.
14630 * @param {Array|string} path The path of the property to get.
14631 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
14632 * @returns {*} Returns the resolved value.
14633 * @example
14634 *
14635 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
14636 *
14637 * _.get(object, 'a[0].b.c');
14638 * // => 3
14639 *
14640 * _.get(object, ['a', '0', 'b', 'c']);
14641 * // => 3
14642 *
14643 * _.get(object, 'a.b.c', 'default');
14644 * // => 'default'
14645 */
14646 function get(object, path, defaultValue) {
14647 var result = object == null ? undefined : baseGet(object, path);
14648 return result === undefined ? defaultValue : result;
14649 }
14650
14651 /**
14652 * Checks if `path` is a direct property of `object`.
14653 *
14654 * @static
14655 * @since 0.1.0
14656 * @memberOf _
14657 * @category Object
14658 * @param {Object} object The object to query.
14659 * @param {Array|string} path The path to check.
14660 * @returns {boolean} Returns `true` if `path` exists, else `false`.
14661 * @example
14662 *
14663 * var object = { 'a': { 'b': 2 } };
14664 * var other = _.create({ 'a': _.create({ 'b': 2 }) });
14665 *
14666 * _.has(object, 'a');
14667 * // => true
14668 *
14669 * _.has(object, 'a.b');
14670 * // => true
14671 *
14672 * _.has(object, ['a', 'b']);
14673 * // => true
14674 *
14675 * _.has(other, 'a');
14676 * // => false
14677 */
14678 function has(object, path) {
14679 return object != null && hasPath(object, path, baseHas);
14680 }
14681
14682 /**
14683 * Checks if `path` is a direct or inherited property of `object`.
14684 *
14685 * @static
14686 * @memberOf _
14687 * @since 4.0.0
14688 * @category Object
14689 * @param {Object} object The object to query.
14690 * @param {Array|string} path The path to check.
14691 * @returns {boolean} Returns `true` if `path` exists, else `false`.
14692 * @example
14693 *
14694 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
14695 *
14696 * _.hasIn(object, 'a');
14697 * // => true
14698 *
14699 * _.hasIn(object, 'a.b');
14700 * // => true
14701 *
14702 * _.hasIn(object, ['a', 'b']);
14703 * // => true
14704 *
14705 * _.hasIn(object, 'b');
14706 * // => false
14707 */
14708 function hasIn(object, path) {
14709 return object != null && hasPath(object, path, baseHasIn);
14710 }
14711
14712 /**
14713 * Creates an object composed of the inverted keys and values of `object`.
14714 * If `object` contains duplicate values, subsequent values overwrite
14715 * property assignments of previous values.
14716 *
14717 * @static
14718 * @memberOf _
14719 * @since 0.7.0
14720 * @category Object
14721 * @param {Object} object The object to invert.
14722 * @returns {Object} Returns the new inverted object.
14723 * @example
14724 *
14725 * var object = { 'a': 1, 'b': 2, 'c': 1 };
14726 *
14727 * _.invert(object);
14728 * // => { '1': 'c', '2': 'b' }
14729 */
14730 var invert = createInverter(function(result, value, key) {
14731 if (value != null &&
14732 typeof value.toString != 'function') {
14733 value = nativeObjectToString.call(value);
14734 }
14735
14736 result[value] = key;
14737 }, constant(identity));
14738
14739 /**
14740 * This method is like `_.invert` except that the inverted object is generated
14741 * from the results of running each element of `object` thru `iteratee`. The
14742 * corresponding inverted value of each inverted key is an array of keys
14743 * responsible for generating the inverted value. The iteratee is invoked
14744 * with one argument: (value).
14745 *
14746 * @static
14747 * @memberOf _
14748 * @since 4.1.0
14749 * @category Object
14750 * @param {Object} object The object to invert.
14751 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
14752 * @returns {Object} Returns the new inverted object.
14753 * @example
14754 *
14755 * var object = { 'a': 1, 'b': 2, 'c': 1 };
14756 *
14757 * _.invertBy(object);
14758 * // => { '1': ['a', 'c'], '2': ['b'] }
14759 *
14760 * _.invertBy(object, function(value) {
14761 * return 'group' + value;
14762 * });
14763 * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
14764 */
14765 var invertBy = createInverter(function(result, value, key) {
14766 if (value != null &&
14767 typeof value.toString != 'function') {
14768 value = nativeObjectToString.call(value);
14769 }
14770
14771 if (hasOwnProperty.call(result, value)) {
14772 result[value].push(key);
14773 } else {
14774 result[value] = [key];
14775 }
14776 }, getIteratee);
14777
14778 /**
14779 * Invokes the method at `path` of `object`.
14780 *
14781 * @static
14782 * @memberOf _
14783 * @since 4.0.0
14784 * @category Object
14785 * @param {Object} object The object to query.
14786 * @param {Array|string} path The path of the method to invoke.
14787 * @param {...*} [args] The arguments to invoke the method with.
14788 * @returns {*} Returns the result of the invoked method.
14789 * @example
14790 *
14791 * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
14792 *
14793 * _.invoke(object, 'a[0].b.c.slice', 1, 3);
14794 * // => [2, 3]
14795 */
14796 var invoke = baseRest(baseInvoke);
14797
14798 /**
14799 * Creates an array of the own enumerable property names of `object`.
14800 *
14801 * **Note:** Non-object values are coerced to objects. See the
14802 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
14803 * for more details.
14804 *
14805 * @static
14806 * @since 0.1.0
14807 * @memberOf _
14808 * @category Object
14809 * @param {Object} object The object to query.
14810 * @returns {Array} Returns the array of property names.
14811 * @example
14812 *
14813 * function Foo() {
14814 * this.a = 1;
14815 * this.b = 2;
14816 * }
14817 *
14818 * Foo.prototype.c = 3;
14819 *
14820 * _.keys(new Foo);
14821 * // => ['a', 'b'] (iteration order is not guaranteed)
14822 *
14823 * _.keys('hi');
14824 * // => ['0', '1']
14825 */
14826 function keys(object) {
14827 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
14828 }
14829
14830 /**
14831 * Creates an array of the own and inherited enumerable property names of `object`.
14832 *
14833 * **Note:** Non-object values are coerced to objects.
14834 *
14835 * @static
14836 * @memberOf _
14837 * @since 3.0.0
14838 * @category Object
14839 * @param {Object} object The object to query.
14840 * @returns {Array} Returns the array of property names.
14841 * @example
14842 *
14843 * function Foo() {
14844 * this.a = 1;
14845 * this.b = 2;
14846 * }
14847 *
14848 * Foo.prototype.c = 3;
14849 *
14850 * _.keysIn(new Foo);
14851 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
14852 */
14853 function keysIn(object) {
14854 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
14855 }
14856
14857 /**
14858 * The opposite of `_.mapValues`; this method creates an object with the
14859 * same values as `object` and keys generated by running each own enumerable
14860 * string keyed property of `object` thru `iteratee`. The iteratee is invoked
14861 * with three arguments: (value, key, object).
14862 *
14863 * @static
14864 * @memberOf _
14865 * @since 3.8.0
14866 * @category Object
14867 * @param {Object} object The object to iterate over.
14868 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14869 * @returns {Object} Returns the new mapped object.
14870 * @see _.mapValues
14871 * @example
14872 *
14873 * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
14874 * return key + value;
14875 * });
14876 * // => { 'a1': 1, 'b2': 2 }
14877 */
14878 function mapKeys(object, iteratee) {
14879 var result = {};
14880 iteratee = getIteratee(iteratee, 3);
14881
14882 baseForOwn(object, function(value, key, object) {
14883 baseAssignValue(result, iteratee(value, key, object), value);
14884 });
14885 return result;
14886 }
14887
14888 /**
14889 * Creates an object with the same keys as `object` and values generated
14890 * by running each own enumerable string keyed property of `object` thru
14891 * `iteratee`. The iteratee is invoked with three arguments:
14892 * (value, key, object).
14893 *
14894 * @static
14895 * @memberOf _
14896 * @since 2.4.0
14897 * @category Object
14898 * @param {Object} object The object to iterate over.
14899 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14900 * @returns {Object} Returns the new mapped object.
14901 * @see _.mapKeys
14902 * @example
14903 *
14904 * var users = {
14905 * 'fred': { 'user': 'fred', 'age': 40 },
14906 * 'pebbles': { 'user': 'pebbles', 'age': 1 }
14907 * };
14908 *
14909 * _.mapValues(users, function(o) { return o.age; });
14910 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
14911 *
14912 * // The `_.property` iteratee shorthand.
14913 * _.mapValues(users, 'age');
14914 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
14915 */
14916 function mapValues(object, iteratee) {
14917 var result = {};
14918 iteratee = getIteratee(iteratee, 3);
14919
14920 baseForOwn(object, function(value, key, object) {
14921 baseAssignValue(result, key, iteratee(value, key, object));
14922 });
14923 return result;
14924 }
14925
14926 /**
14927 * This method is like `_.assign` except that it recursively merges own and
14928 * inherited enumerable string keyed properties of source objects into the
14929 * destination object. Source properties that resolve to `undefined` are
14930 * skipped if a destination value exists. Array and plain object properties
14931 * are merged recursively. Other objects and value types are overridden by
14932 * assignment. Source objects are applied from left to right. Subsequent
14933 * sources overwrite property assignments of previous sources.
14934 *
14935 * **Note:** This method mutates `object`.
14936 *
14937 * @static
14938 * @memberOf _
14939 * @since 0.5.0
14940 * @category Object
14941 * @param {Object} object The destination object.
14942 * @param {...Object} [sources] The source objects.
14943 * @returns {Object} Returns `object`.
14944 * @example
14945 *
14946 * var object = {
14947 * 'a': [{ 'b': 2 }, { 'd': 4 }]
14948 * };
14949 *
14950 * var other = {
14951 * 'a': [{ 'c': 3 }, { 'e': 5 }]
14952 * };
14953 *
14954 * _.merge(object, other);
14955 * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
14956 */
14957 var merge = createAssigner(function(object, source, srcIndex) {
14958 baseMerge(object, source, srcIndex);
14959 });
14960
14961 /**
14962 * This method is like `_.merge` except that it accepts `customizer` which
14963 * is invoked to produce the merged values of the destination and source
14964 * properties. If `customizer` returns `undefined`, merging is handled by the
14965 * method instead. The `customizer` is invoked with six arguments:
14966 * (objValue, srcValue, key, object, source, stack).
14967 *
14968 * **Note:** This method mutates `object`.
14969 *
14970 * @static
14971 * @memberOf _
14972 * @since 4.0.0
14973 * @category Object
14974 * @param {Object} object The destination object.
14975 * @param {...Object} sources The source objects.
14976 * @param {Function} customizer The function to customize assigned values.
14977 * @returns {Object} Returns `object`.
14978 * @example
14979 *
14980 * function customizer(objValue, srcValue) {
14981 * if (_.isArray(objValue)) {
14982 * return objValue.concat(srcValue);
14983 * }
14984 * }
14985 *
14986 * var object = { 'a': [1], 'b': [2] };
14987 * var other = { 'a': [3], 'b': [4] };
14988 *
14989 * _.mergeWith(object, other, customizer);
14990 * // => { 'a': [1, 3], 'b': [2, 4] }
14991 */
14992 var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
14993 baseMerge(object, source, srcIndex, customizer);
14994 });
14995
14996 /**
14997 * The opposite of `_.pick`; this method creates an object composed of the
14998 * own and inherited enumerable property paths of `object` that are not omitted.
14999 *
15000 * **Note:** This method is considerably slower than `_.pick`.
15001 *
15002 * @static
15003 * @since 0.1.0
15004 * @memberOf _
15005 * @category Object
15006 * @param {Object} object The source object.
15007 * @param {...(string|string[])} [paths] The property paths to omit.
15008 * @returns {Object} Returns the new object.
15009 * @example
15010 *
15011 * var object = { 'a': 1, 'b': '2', 'c': 3 };
15012 *
15013 * _.omit(object, ['a', 'c']);
15014 * // => { 'b': '2' }
15015 */
15016 var omit = flatRest(function(object, paths) {
15017 var result = {};
15018 if (object == null) {
15019 return result;
15020 }
15021 var isDeep = false;
15022 paths = arrayMap(paths, function(path) {
15023 path = castPath(path, object);
15024 isDeep || (isDeep = path.length > 1);
15025 return path;
15026 });
15027 copyObject(object, getAllKeysIn(object), result);
15028 if (isDeep) {
15029 result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
15030 }
15031 var length = paths.length;
15032 while (length--) {
15033 baseUnset(result, paths[length]);
15034 }
15035 return result;
15036 });
15037
15038 /**
15039 * The opposite of `_.pickBy`; this method creates an object composed of
15040 * the own and inherited enumerable string keyed properties of `object` that
15041 * `predicate` doesn't return truthy for. The predicate is invoked with two
15042 * arguments: (value, key).
15043 *
15044 * @static
15045 * @memberOf _
15046 * @since 4.0.0
15047 * @category Object
15048 * @param {Object} object The source object.
15049 * @param {Function} [predicate=_.identity] The function invoked per property.
15050 * @returns {Object} Returns the new object.
15051 * @example
15052 *
15053 * var object = { 'a': 1, 'b': '2', 'c': 3 };
15054 *
15055 * _.omitBy(object, _.isNumber);
15056 * // => { 'b': '2' }
15057 */
15058 function omitBy(object, predicate) {
15059 return pickBy(object, negate(getIteratee(predicate)));
15060 }
15061
15062 /**
15063 * Creates an object composed of the picked `object` properties.
15064 *
15065 * @static
15066 * @since 0.1.0
15067 * @memberOf _
15068 * @category Object
15069 * @param {Object} object The source object.
15070 * @param {...(string|string[])} [paths] The property paths to pick.
15071 * @returns {Object} Returns the new object.
15072 * @example
15073 *
15074 * var object = { 'a': 1, 'b': '2', 'c': 3 };
15075 *
15076 * _.pick(object, ['a', 'c']);
15077 * // => { 'a': 1, 'c': 3 }
15078 */
15079 var pick = flatRest(function(object, paths) {
15080 return object == null ? {} : basePick(object, paths);
15081 });
15082
15083 /**
15084 * Creates an object composed of the `object` properties `predicate` returns
15085 * truthy for. The predicate is invoked with two arguments: (value, key).
15086 *
15087 * @static
15088 * @memberOf _
15089 * @since 4.0.0
15090 * @category Object
15091 * @param {Object} object The source object.
15092 * @param {Function} [predicate=_.identity] The function invoked per property.
15093 * @returns {Object} Returns the new object.
15094 * @example
15095 *
15096 * var object = { 'a': 1, 'b': '2', 'c': 3 };
15097 *
15098 * _.pickBy(object, _.isNumber);
15099 * // => { 'a': 1, 'c': 3 }
15100 */
15101 function pickBy(object, predicate) {
15102 if (object == null) {
15103 return {};
15104 }
15105 var props = arrayMap(getAllKeysIn(object), function(prop) {
15106 return [prop];
15107 });
15108 predicate = getIteratee(predicate);
15109 return basePickBy(object, props, function(value, path) {
15110 return predicate(value, path[0]);
15111 });
15112 }
15113
15114 /**
15115 * This method is like `_.get` except that if the resolved value is a
15116 * function it's invoked with the `this` binding of its parent object and
15117 * its result is returned.
15118 *
15119 * @static
15120 * @since 0.1.0
15121 * @memberOf _
15122 * @category Object
15123 * @param {Object} object The object to query.
15124 * @param {Array|string} path The path of the property to resolve.
15125 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
15126 * @returns {*} Returns the resolved value.
15127 * @example
15128 *
15129 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
15130 *
15131 * _.result(object, 'a[0].b.c1');
15132 * // => 3
15133 *
15134 * _.result(object, 'a[0].b.c2');
15135 * // => 4
15136 *
15137 * _.result(object, 'a[0].b.c3', 'default');
15138 * // => 'default'
15139 *
15140 * _.result(object, 'a[0].b.c3', _.constant('default'));
15141 * // => 'default'
15142 */
15143 function result(object, path, defaultValue) {
15144 path = castPath(path, object);
15145
15146 var index = -1,
15147 length = path.length;
15148
15149 // Ensure the loop is entered when path is empty.
15150 if (!length) {
15151 length = 1;
15152 object = undefined;
15153 }
15154 while (++index < length) {
15155 var value = object == null ? undefined : object[toKey(path[index])];
15156 if (value === undefined) {
15157 index = length;
15158 value = defaultValue;
15159 }
15160 object = isFunction(value) ? value.call(object) : value;
15161 }
15162 return object;
15163 }
15164
15165 /**
15166 * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
15167 * it's created. Arrays are created for missing index properties while objects
15168 * are created for all other missing properties. Use `_.setWith` to customize
15169 * `path` creation.
15170 *
15171 * **Note:** This method mutates `object`.
15172 *
15173 * @static
15174 * @memberOf _
15175 * @since 3.7.0
15176 * @category Object
15177 * @param {Object} object The object to modify.
15178 * @param {Array|string} path The path of the property to set.
15179 * @param {*} value The value to set.
15180 * @returns {Object} Returns `object`.
15181 * @example
15182 *
15183 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
15184 *
15185 * _.set(object, 'a[0].b.c', 4);
15186 * console.log(object.a[0].b.c);
15187 * // => 4
15188 *
15189 * _.set(object, ['x', '0', 'y', 'z'], 5);
15190 * console.log(object.x[0].y.z);
15191 * // => 5
15192 */
15193 function set(object, path, value) {
15194 return object == null ? object : baseSet(object, path, value);
15195 }
15196
15197 /**
15198 * This method is like `_.set` except that it accepts `customizer` which is
15199 * invoked to produce the objects of `path`. If `customizer` returns `undefined`
15200 * path creation is handled by the method instead. The `customizer` is invoked
15201 * with three arguments: (nsValue, key, nsObject).
15202 *
15203 * **Note:** This method mutates `object`.
15204 *
15205 * @static
15206 * @memberOf _
15207 * @since 4.0.0
15208 * @category Object
15209 * @param {Object} object The object to modify.
15210 * @param {Array|string} path The path of the property to set.
15211 * @param {*} value The value to set.
15212 * @param {Function} [customizer] The function to customize assigned values.
15213 * @returns {Object} Returns `object`.
15214 * @example
15215 *
15216 * var object = {};
15217 *
15218 * _.setWith(object, '[0][1]', 'a', Object);
15219 * // => { '0': { '1': 'a' } }
15220 */
15221 function setWith(object, path, value, customizer) {
15222 customizer = typeof customizer == 'function' ? customizer : undefined;
15223 return object == null ? object : baseSet(object, path, value, customizer);
15224 }
15225
15226 /**
15227 * Creates an array of own enumerable string keyed-value pairs for `object`
15228 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
15229 * entries are returned.
15230 *
15231 * @static
15232 * @memberOf _
15233 * @since 4.0.0
15234 * @alias entries
15235 * @category Object
15236 * @param {Object} object The object to query.
15237 * @returns {Array} Returns the key-value pairs.
15238 * @example
15239 *
15240 * function Foo() {
15241 * this.a = 1;
15242 * this.b = 2;
15243 * }
15244 *
15245 * Foo.prototype.c = 3;
15246 *
15247 * _.toPairs(new Foo);
15248 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
15249 */
15250 var toPairs = createToPairs(keys);
15251
15252 /**
15253 * Creates an array of own and inherited enumerable string keyed-value pairs
15254 * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
15255 * or set, its entries are returned.
15256 *
15257 * @static
15258 * @memberOf _
15259 * @since 4.0.0
15260 * @alias entriesIn
15261 * @category Object
15262 * @param {Object} object The object to query.
15263 * @returns {Array} Returns the key-value pairs.
15264 * @example
15265 *
15266 * function Foo() {
15267 * this.a = 1;
15268 * this.b = 2;
15269 * }
15270 *
15271 * Foo.prototype.c = 3;
15272 *
15273 * _.toPairsIn(new Foo);
15274 * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
15275 */
15276 var toPairsIn = createToPairs(keysIn);
15277
15278 /**
15279 * An alternative to `_.reduce`; this method transforms `object` to a new
15280 * `accumulator` object which is the result of running each of its own
15281 * enumerable string keyed properties thru `iteratee`, with each invocation
15282 * potentially mutating the `accumulator` object. If `accumulator` is not
15283 * provided, a new object with the same `[[Prototype]]` will be used. The
15284 * iteratee is invoked with four arguments: (accumulator, value, key, object).
15285 * Iteratee functions may exit iteration early by explicitly returning `false`.
15286 *
15287 * @static
15288 * @memberOf _
15289 * @since 1.3.0
15290 * @category Object
15291 * @param {Object} object The object to iterate over.
15292 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
15293 * @param {*} [accumulator] The custom accumulator value.
15294 * @returns {*} Returns the accumulated value.
15295 * @example
15296 *
15297 * _.transform([2, 3, 4], function(result, n) {
15298 * result.push(n *= n);
15299 * return n % 2 == 0;
15300 * }, []);
15301 * // => [4, 9]
15302 *
15303 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
15304 * (result[value] || (result[value] = [])).push(key);
15305 * }, {});
15306 * // => { '1': ['a', 'c'], '2': ['b'] }
15307 */
15308 function transform(object, iteratee, accumulator) {
15309 var isArr = isArray(object),
15310 isArrLike = isArr || isBuffer(object) || isTypedArray(object);
15311
15312 iteratee = getIteratee(iteratee, 4);
15313 if (accumulator == null) {
15314 var Ctor = object && object.constructor;
15315 if (isArrLike) {
15316 accumulator = isArr ? new Ctor : [];
15317 }
15318 else if (isObject(object)) {
15319 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
15320 }
15321 else {
15322 accumulator = {};
15323 }
15324 }
15325 (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
15326 return iteratee(accumulator, value, index, object);
15327 });
15328 return accumulator;
15329 }
15330
15331 /**
15332 * Removes the property at `path` of `object`.
15333 *
15334 * **Note:** This method mutates `object`.
15335 *
15336 * @static
15337 * @memberOf _
15338 * @since 4.0.0
15339 * @category Object
15340 * @param {Object} object The object to modify.
15341 * @param {Array|string} path The path of the property to unset.
15342 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
15343 * @example
15344 *
15345 * var object = { 'a': [{ 'b': { 'c': 7 } }] };
15346 * _.unset(object, 'a[0].b.c');
15347 * // => true
15348 *
15349 * console.log(object);
15350 * // => { 'a': [{ 'b': {} }] };
15351 *
15352 * _.unset(object, ['a', '0', 'b', 'c']);
15353 * // => true
15354 *
15355 * console.log(object);
15356 * // => { 'a': [{ 'b': {} }] };
15357 */
15358 function unset(object, path) {
15359 return object == null ? true : baseUnset(object, path);
15360 }
15361
15362 /**
15363 * This method is like `_.set` except that accepts `updater` to produce the
15364 * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
15365 * is invoked with one argument: (value).
15366 *
15367 * **Note:** This method mutates `object`.
15368 *
15369 * @static
15370 * @memberOf _
15371 * @since 4.6.0
15372 * @category Object
15373 * @param {Object} object The object to modify.
15374 * @param {Array|string} path The path of the property to set.
15375 * @param {Function} updater The function to produce the updated value.
15376 * @returns {Object} Returns `object`.
15377 * @example
15378 *
15379 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
15380 *
15381 * _.update(object, 'a[0].b.c', function(n) { return n * n; });
15382 * console.log(object.a[0].b.c);
15383 * // => 9
15384 *
15385 * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
15386 * console.log(object.x[0].y.z);
15387 * // => 0
15388 */
15389 function update(object, path, updater) {
15390 return object == null ? object : baseUpdate(object, path, castFunction(updater));
15391 }
15392
15393 /**
15394 * This method is like `_.update` except that it accepts `customizer` which is
15395 * invoked to produce the objects of `path`. If `customizer` returns `undefined`
15396 * path creation is handled by the method instead. The `customizer` is invoked
15397 * with three arguments: (nsValue, key, nsObject).
15398 *
15399 * **Note:** This method mutates `object`.
15400 *
15401 * @static
15402 * @memberOf _
15403 * @since 4.6.0
15404 * @category Object
15405 * @param {Object} object The object to modify.
15406 * @param {Array|string} path The path of the property to set.
15407 * @param {Function} updater The function to produce the updated value.
15408 * @param {Function} [customizer] The function to customize assigned values.
15409 * @returns {Object} Returns `object`.
15410 * @example
15411 *
15412 * var object = {};
15413 *
15414 * _.updateWith(object, '[0][1]', _.constant('a'), Object);
15415 * // => { '0': { '1': 'a' } }
15416 */
15417 function updateWith(object, path, updater, customizer) {
15418 customizer = typeof customizer == 'function' ? customizer : undefined;
15419 return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
15420 }
15421
15422 /**
15423 * Creates an array of the own enumerable string keyed property values of `object`.
15424 *
15425 * **Note:** Non-object values are coerced to objects.
15426 *
15427 * @static
15428 * @since 0.1.0
15429 * @memberOf _
15430 * @category Object
15431 * @param {Object} object The object to query.
15432 * @returns {Array} Returns the array of property values.
15433 * @example
15434 *
15435 * function Foo() {
15436 * this.a = 1;
15437 * this.b = 2;
15438 * }
15439 *
15440 * Foo.prototype.c = 3;
15441 *
15442 * _.values(new Foo);
15443 * // => [1, 2] (iteration order is not guaranteed)
15444 *
15445 * _.values('hi');
15446 * // => ['h', 'i']
15447 */
15448 function values(object) {
15449 return object == null ? [] : baseValues(object, keys(object));
15450 }
15451
15452 /**
15453 * Creates an array of the own and inherited enumerable string keyed property
15454 * values of `object`.
15455 *
15456 * **Note:** Non-object values are coerced to objects.
15457 *
15458 * @static
15459 * @memberOf _
15460 * @since 3.0.0
15461 * @category Object
15462 * @param {Object} object The object to query.
15463 * @returns {Array} Returns the array of property values.
15464 * @example
15465 *
15466 * function Foo() {
15467 * this.a = 1;
15468 * this.b = 2;
15469 * }
15470 *
15471 * Foo.prototype.c = 3;
15472 *
15473 * _.valuesIn(new Foo);
15474 * // => [1, 2, 3] (iteration order is not guaranteed)
15475 */
15476 function valuesIn(object) {
15477 return object == null ? [] : baseValues(object, keysIn(object));
15478 }
15479
15480 /*------------------------------------------------------------------------*/
15481
15482 /**
15483 * Clamps `number` within the inclusive `lower` and `upper` bounds.
15484 *
15485 * @static
15486 * @memberOf _
15487 * @since 4.0.0
15488 * @category Number
15489 * @param {number} number The number to clamp.
15490 * @param {number} [lower] The lower bound.
15491 * @param {number} upper The upper bound.
15492 * @returns {number} Returns the clamped number.
15493 * @example
15494 *
15495 * _.clamp(-10, -5, 5);
15496 * // => -5
15497 *
15498 * _.clamp(10, -5, 5);
15499 * // => 5
15500 */
15501 function clamp(number, lower, upper) {
15502 if (upper === undefined) {
15503 upper = lower;
15504 lower = undefined;
15505 }
15506 if (upper !== undefined) {
15507 upper = toNumber(upper);
15508 upper = upper === upper ? upper : 0;
15509 }
15510 if (lower !== undefined) {
15511 lower = toNumber(lower);
15512 lower = lower === lower ? lower : 0;
15513 }
15514 return baseClamp(toNumber(number), lower, upper);
15515 }
15516
15517 /**
15518 * Checks if `n` is between `start` and up to, but not including, `end`. If
15519 * `end` is not specified, it's set to `start` with `start` then set to `0`.
15520 * If `start` is greater than `end` the params are swapped to support
15521 * negative ranges.
15522 *
15523 * @static
15524 * @memberOf _
15525 * @since 3.3.0
15526 * @category Number
15527 * @param {number} number The number to check.
15528 * @param {number} [start=0] The start of the range.
15529 * @param {number} end The end of the range.
15530 * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
15531 * @see _.range, _.rangeRight
15532 * @example
15533 *
15534 * _.inRange(3, 2, 4);
15535 * // => true
15536 *
15537 * _.inRange(4, 8);
15538 * // => true
15539 *
15540 * _.inRange(4, 2);
15541 * // => false
15542 *
15543 * _.inRange(2, 2);
15544 * // => false
15545 *
15546 * _.inRange(1.2, 2);
15547 * // => true
15548 *
15549 * _.inRange(5.2, 4);
15550 * // => false
15551 *
15552 * _.inRange(-3, -2, -6);
15553 * // => true
15554 */
15555 function inRange(number, start, end) {
15556 start = toFinite(start);
15557 if (end === undefined) {
15558 end = start;
15559 start = 0;
15560 } else {
15561 end = toFinite(end);
15562 }
15563 number = toNumber(number);
15564 return baseInRange(number, start, end);
15565 }
15566
15567 /**
15568 * Produces a random number between the inclusive `lower` and `upper` bounds.
15569 * If only one argument is provided a number between `0` and the given number
15570 * is returned. If `floating` is `true`, or either `lower` or `upper` are
15571 * floats, a floating-point number is returned instead of an integer.
15572 *
15573 * **Note:** JavaScript follows the IEEE-754 standard for resolving
15574 * floating-point values which can produce unexpected results.
15575 *
15576 * @static
15577 * @memberOf _
15578 * @since 0.7.0
15579 * @category Number
15580 * @param {number} [lower=0] The lower bound.
15581 * @param {number} [upper=1] The upper bound.
15582 * @param {boolean} [floating] Specify returning a floating-point number.
15583 * @returns {number} Returns the random number.
15584 * @example
15585 *
15586 * _.random(0, 5);
15587 * // => an integer between 0 and 5
15588 *
15589 * _.random(5);
15590 * // => also an integer between 0 and 5
15591 *
15592 * _.random(5, true);
15593 * // => a floating-point number between 0 and 5
15594 *
15595 * _.random(1.2, 5.2);
15596 * // => a floating-point number between 1.2 and 5.2
15597 */
15598 function random(lower, upper, floating) {
15599 if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
15600 upper = floating = undefined;
15601 }
15602 if (floating === undefined) {
15603 if (typeof upper == 'boolean') {
15604 floating = upper;
15605 upper = undefined;
15606 }
15607 else if (typeof lower == 'boolean') {
15608 floating = lower;
15609 lower = undefined;
15610 }
15611 }
15612 if (lower === undefined && upper === undefined) {
15613 lower = 0;
15614 upper = 1;
15615 }
15616 else {
15617 lower = toFinite(lower);
15618 if (upper === undefined) {
15619 upper = lower;
15620 lower = 0;
15621 } else {
15622 upper = toFinite(upper);
15623 }
15624 }
15625 if (lower > upper) {
15626 var temp = lower;
15627 lower = upper;
15628 upper = temp;
15629 }
15630 if (floating || lower % 1 || upper % 1) {
15631 var rand = nativeRandom();
15632 return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
15633 }
15634 return baseRandom(lower, upper);
15635 }
15636
15637 /*------------------------------------------------------------------------*/
15638
15639 /**
15640 * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
15641 *
15642 * @static
15643 * @memberOf _
15644 * @since 3.0.0
15645 * @category String
15646 * @param {string} [string=''] The string to convert.
15647 * @returns {string} Returns the camel cased string.
15648 * @example
15649 *
15650 * _.camelCase('Foo Bar');
15651 * // => 'fooBar'
15652 *
15653 * _.camelCase('--foo-bar--');
15654 * // => 'fooBar'
15655 *
15656 * _.camelCase('__FOO_BAR__');
15657 * // => 'fooBar'
15658 */
15659 var camelCase = createCompounder(function(result, word, index) {
15660 word = word.toLowerCase();
15661 return result + (index ? capitalize(word) : word);
15662 });
15663
15664 /**
15665 * Converts the first character of `string` to upper case and the remaining
15666 * to lower case.
15667 *
15668 * @static
15669 * @memberOf _
15670 * @since 3.0.0
15671 * @category String
15672 * @param {string} [string=''] The string to capitalize.
15673 * @returns {string} Returns the capitalized string.
15674 * @example
15675 *
15676 * _.capitalize('FRED');
15677 * // => 'Fred'
15678 */
15679 function capitalize(string) {
15680 return upperFirst(toString(string).toLowerCase());
15681 }
15682
15683 /**
15684 * Deburrs `string` by converting
15685 * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
15686 * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
15687 * letters to basic Latin letters and removing
15688 * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
15689 *
15690 * @static
15691 * @memberOf _
15692 * @since 3.0.0
15693 * @category String
15694 * @param {string} [string=''] The string to deburr.
15695 * @returns {string} Returns the deburred string.
15696 * @example
15697 *
15698 * _.deburr('déjà vu');
15699 * // => 'deja vu'
15700 */
15701 function deburr(string) {
15702 string = toString(string);
15703 return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
15704 }
15705
15706 /**
15707 * Checks if `string` ends with the given target string.
15708 *
15709 * @static
15710 * @memberOf _
15711 * @since 3.0.0
15712 * @category String
15713 * @param {string} [string=''] The string to inspect.
15714 * @param {string} [target] The string to search for.
15715 * @param {number} [position=string.length] The position to search up to.
15716 * @returns {boolean} Returns `true` if `string` ends with `target`,
15717 * else `false`.
15718 * @example
15719 *
15720 * _.endsWith('abc', 'c');
15721 * // => true
15722 *
15723 * _.endsWith('abc', 'b');
15724 * // => false
15725 *
15726 * _.endsWith('abc', 'b', 2);
15727 * // => true
15728 */
15729 function endsWith(string, target, position) {
15730 string = toString(string);
15731 target = baseToString(target);
15732
15733 var length = string.length;
15734 position = position === undefined
15735 ? length
15736 : baseClamp(toInteger(position), 0, length);
15737
15738 var end = position;
15739 position -= target.length;
15740 return position >= 0 && string.slice(position, end) == target;
15741 }
15742
15743 /**
15744 * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
15745 * corresponding HTML entities.
15746 *
15747 * **Note:** No other characters are escaped. To escape additional
15748 * characters use a third-party library like [_he_](https://mths.be/he).
15749 *
15750 * Though the ">" character is escaped for symmetry, characters like
15751 * ">" and "/" don't need escaping in HTML and have no special meaning
15752 * unless they're part of a tag or unquoted attribute value. See
15753 * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
15754 * (under "semi-related fun fact") for more details.
15755 *
15756 * When working with HTML you should always
15757 * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
15758 * XSS vectors.
15759 *
15760 * @static
15761 * @since 0.1.0
15762 * @memberOf _
15763 * @category String
15764 * @param {string} [string=''] The string to escape.
15765 * @returns {string} Returns the escaped string.
15766 * @example
15767 *
15768 * _.escape('fred, barney, & pebbles');
15769 * // => 'fred, barney, &amp; pebbles'
15770 */
15771 function escape(string) {
15772 string = toString(string);
15773 return (string && reHasUnescapedHtml.test(string))
15774 ? string.replace(reUnescapedHtml, escapeHtmlChar)
15775 : string;
15776 }
15777
15778 /**
15779 * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
15780 * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
15781 *
15782 * @static
15783 * @memberOf _
15784 * @since 3.0.0
15785 * @category String
15786 * @param {string} [string=''] The string to escape.
15787 * @returns {string} Returns the escaped string.
15788 * @example
15789 *
15790 * _.escapeRegExp('[lodash](https://lodash.com/)');
15791 * // => '\[lodash\]\(https://lodash\.com/\)'
15792 */
15793 function escapeRegExp(string) {
15794 string = toString(string);
15795 return (string && reHasRegExpChar.test(string))
15796 ? string.replace(reRegExpChar, '\\$&')
15797 : string;
15798 }
15799
15800 /**
15801 * Converts `string` to
15802 * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
15803 *
15804 * @static
15805 * @memberOf _
15806 * @since 3.0.0
15807 * @category String
15808 * @param {string} [string=''] The string to convert.
15809 * @returns {string} Returns the kebab cased string.
15810 * @example
15811 *
15812 * _.kebabCase('Foo Bar');
15813 * // => 'foo-bar'
15814 *
15815 * _.kebabCase('fooBar');
15816 * // => 'foo-bar'
15817 *
15818 * _.kebabCase('__FOO_BAR__');
15819 * // => 'foo-bar'
15820 */
15821 var kebabCase = createCompounder(function(result, word, index) {
15822 return result + (index ? '-' : '') + word.toLowerCase();
15823 });
15824
15825 /**
15826 * Converts `string`, as space separated words, to lower case.
15827 *
15828 * @static
15829 * @memberOf _
15830 * @since 4.0.0
15831 * @category String
15832 * @param {string} [string=''] The string to convert.
15833 * @returns {string} Returns the lower cased string.
15834 * @example
15835 *
15836 * _.lowerCase('--Foo-Bar--');
15837 * // => 'foo bar'
15838 *
15839 * _.lowerCase('fooBar');
15840 * // => 'foo bar'
15841 *
15842 * _.lowerCase('__FOO_BAR__');
15843 * // => 'foo bar'
15844 */
15845 var lowerCase = createCompounder(function(result, word, index) {
15846 return result + (index ? ' ' : '') + word.toLowerCase();
15847 });
15848
15849 /**
15850 * Converts the first character of `string` to lower case.
15851 *
15852 * @static
15853 * @memberOf _
15854 * @since 4.0.0
15855 * @category String
15856 * @param {string} [string=''] The string to convert.
15857 * @returns {string} Returns the converted string.
15858 * @example
15859 *
15860 * _.lowerFirst('Fred');
15861 * // => 'fred'
15862 *
15863 * _.lowerFirst('FRED');
15864 * // => 'fRED'
15865 */
15866 var lowerFirst = createCaseFirst('toLowerCase');
15867
15868 /**
15869 * Pads `string` on the left and right sides if it's shorter than `length`.
15870 * Padding characters are truncated if they can't be evenly divided by `length`.
15871 *
15872 * @static
15873 * @memberOf _
15874 * @since 3.0.0
15875 * @category String
15876 * @param {string} [string=''] The string to pad.
15877 * @param {number} [length=0] The padding length.
15878 * @param {string} [chars=' '] The string used as padding.
15879 * @returns {string} Returns the padded string.
15880 * @example
15881 *
15882 * _.pad('abc', 8);
15883 * // => ' abc '
15884 *
15885 * _.pad('abc', 8, '_-');
15886 * // => '_-abc_-_'
15887 *
15888 * _.pad('abc', 3);
15889 * // => 'abc'
15890 */
15891 function pad(string, length, chars) {
15892 string = toString(string);
15893 length = toInteger(length);
15894
15895 var strLength = length ? stringSize(string) : 0;
15896 if (!length || strLength >= length) {
15897 return string;
15898 }
15899 var mid = (length - strLength) / 2;
15900 return (
15901 createPadding(nativeFloor(mid), chars) +
15902 string +
15903 createPadding(nativeCeil(mid), chars)
15904 );
15905 }
15906
15907 /**
15908 * Pads `string` on the right side if it's shorter than `length`. Padding
15909 * characters are truncated if they exceed `length`.
15910 *
15911 * @static
15912 * @memberOf _
15913 * @since 4.0.0
15914 * @category String
15915 * @param {string} [string=''] The string to pad.
15916 * @param {number} [length=0] The padding length.
15917 * @param {string} [chars=' '] The string used as padding.
15918 * @returns {string} Returns the padded string.
15919 * @example
15920 *
15921 * _.padEnd('abc', 6);
15922 * // => 'abc '
15923 *
15924 * _.padEnd('abc', 6, '_-');
15925 * // => 'abc_-_'
15926 *
15927 * _.padEnd('abc', 3);
15928 * // => 'abc'
15929 */
15930 function padEnd(string, length, chars) {
15931 string = toString(string);
15932 length = toInteger(length);
15933
15934 var strLength = length ? stringSize(string) : 0;
15935 return (length && strLength < length)
15936 ? (string + createPadding(length - strLength, chars))
15937 : string;
15938 }
15939
15940 /**
15941 * Pads `string` on the left side if it's shorter than `length`. Padding
15942 * characters are truncated if they exceed `length`.
15943 *
15944 * @static
15945 * @memberOf _
15946 * @since 4.0.0
15947 * @category String
15948 * @param {string} [string=''] The string to pad.
15949 * @param {number} [length=0] The padding length.
15950 * @param {string} [chars=' '] The string used as padding.
15951 * @returns {string} Returns the padded string.
15952 * @example
15953 *
15954 * _.padStart('abc', 6);
15955 * // => ' abc'
15956 *
15957 * _.padStart('abc', 6, '_-');
15958 * // => '_-_abc'
15959 *
15960 * _.padStart('abc', 3);
15961 * // => 'abc'
15962 */
15963 function padStart(string, length, chars) {
15964 string = toString(string);
15965 length = toInteger(length);
15966
15967 var strLength = length ? stringSize(string) : 0;
15968 return (length && strLength < length)
15969 ? (createPadding(length - strLength, chars) + string)
15970 : string;
15971 }
15972
15973 /**
15974 * Converts `string` to an integer of the specified radix. If `radix` is
15975 * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
15976 * hexadecimal, in which case a `radix` of `16` is used.
15977 *
15978 * **Note:** This method aligns with the
15979 * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
15980 *
15981 * @static
15982 * @memberOf _
15983 * @since 1.1.0
15984 * @category String
15985 * @param {string} string The string to convert.
15986 * @param {number} [radix=10] The radix to interpret `value` by.
15987 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15988 * @returns {number} Returns the converted integer.
15989 * @example
15990 *
15991 * _.parseInt('08');
15992 * // => 8
15993 *
15994 * _.map(['6', '08', '10'], _.parseInt);
15995 * // => [6, 8, 10]
15996 */
15997 function parseInt(string, radix, guard) {
15998 if (guard || radix == null) {
15999 radix = 0;
16000 } else if (radix) {
16001 radix = +radix;
16002 }
16003 return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
16004 }
16005
16006 /**
16007 * Repeats the given string `n` times.
16008 *
16009 * @static
16010 * @memberOf _
16011 * @since 3.0.0
16012 * @category String
16013 * @param {string} [string=''] The string to repeat.
16014 * @param {number} [n=1] The number of times to repeat the string.
16015 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16016 * @returns {string} Returns the repeated string.
16017 * @example
16018 *
16019 * _.repeat('*', 3);
16020 * // => '***'
16021 *
16022 * _.repeat('abc', 2);
16023 * // => 'abcabc'
16024 *
16025 * _.repeat('abc', 0);
16026 * // => ''
16027 */
16028 function repeat(string, n, guard) {
16029 if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
16030 n = 1;
16031 } else {
16032 n = toInteger(n);
16033 }
16034 return baseRepeat(toString(string), n);
16035 }
16036
16037 /**
16038 * Replaces matches for `pattern` in `string` with `replacement`.
16039 *
16040 * **Note:** This method is based on
16041 * [`String#replace`](https://mdn.io/String/replace).
16042 *
16043 * @static
16044 * @memberOf _
16045 * @since 4.0.0
16046 * @category String
16047 * @param {string} [string=''] The string to modify.
16048 * @param {RegExp|string} pattern The pattern to replace.
16049 * @param {Function|string} replacement The match replacement.
16050 * @returns {string} Returns the modified string.
16051 * @example
16052 *
16053 * _.replace('Hi Fred', 'Fred', 'Barney');
16054 * // => 'Hi Barney'
16055 */
16056 function replace() {
16057 var args = arguments,
16058 string = toString(args[0]);
16059
16060 return args.length < 3 ? string : string.replace(args[1], args[2]);
16061 }
16062
16063 /**
16064 * Converts `string` to
16065 * [snake case](https://en.wikipedia.org/wiki/Snake_case).
16066 *
16067 * @static
16068 * @memberOf _
16069 * @since 3.0.0
16070 * @category String
16071 * @param {string} [string=''] The string to convert.
16072 * @returns {string} Returns the snake cased string.
16073 * @example
16074 *
16075 * _.snakeCase('Foo Bar');
16076 * // => 'foo_bar'
16077 *
16078 * _.snakeCase('fooBar');
16079 * // => 'foo_bar'
16080 *
16081 * _.snakeCase('--FOO-BAR--');
16082 * // => 'foo_bar'
16083 */
16084 var snakeCase = createCompounder(function(result, word, index) {
16085 return result + (index ? '_' : '') + word.toLowerCase();
16086 });
16087
16088 /**
16089 * Splits `string` by `separator`.
16090 *
16091 * **Note:** This method is based on
16092 * [`String#split`](https://mdn.io/String/split).
16093 *
16094 * @static
16095 * @memberOf _
16096 * @since 4.0.0
16097 * @category String
16098 * @param {string} [string=''] The string to split.
16099 * @param {RegExp|string} separator The separator pattern to split by.
16100 * @param {number} [limit] The length to truncate results to.
16101 * @returns {Array} Returns the string segments.
16102 * @example
16103 *
16104 * _.split('a-b-c', '-', 2);
16105 * // => ['a', 'b']
16106 */
16107 function split(string, separator, limit) {
16108 if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
16109 separator = limit = undefined;
16110 }
16111 limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
16112 if (!limit) {
16113 return [];
16114 }
16115 string = toString(string);
16116 if (string && (
16117 typeof separator == 'string' ||
16118 (separator != null && !isRegExp(separator))
16119 )) {
16120 separator = baseToString(separator);
16121 if (!separator && hasUnicode(string)) {
16122 return castSlice(stringToArray(string), 0, limit);
16123 }
16124 }
16125 return string.split(separator, limit);
16126 }
16127
16128 /**
16129 * Converts `string` to
16130 * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
16131 *
16132 * @static
16133 * @memberOf _
16134 * @since 3.1.0
16135 * @category String
16136 * @param {string} [string=''] The string to convert.
16137 * @returns {string} Returns the start cased string.
16138 * @example
16139 *
16140 * _.startCase('--foo-bar--');
16141 * // => 'Foo Bar'
16142 *
16143 * _.startCase('fooBar');
16144 * // => 'Foo Bar'
16145 *
16146 * _.startCase('__FOO_BAR__');
16147 * // => 'FOO BAR'
16148 */
16149 var startCase = createCompounder(function(result, word, index) {
16150 return result + (index ? ' ' : '') + upperFirst(word);
16151 });
16152
16153 /**
16154 * Checks if `string` starts with the given target string.
16155 *
16156 * @static
16157 * @memberOf _
16158 * @since 3.0.0
16159 * @category String
16160 * @param {string} [string=''] The string to inspect.
16161 * @param {string} [target] The string to search for.
16162 * @param {number} [position=0] The position to search from.
16163 * @returns {boolean} Returns `true` if `string` starts with `target`,
16164 * else `false`.
16165 * @example
16166 *
16167 * _.startsWith('abc', 'a');
16168 * // => true
16169 *
16170 * _.startsWith('abc', 'b');
16171 * // => false
16172 *
16173 * _.startsWith('abc', 'b', 1);
16174 * // => true
16175 */
16176 function startsWith(string, target, position) {
16177 string = toString(string);
16178 position = position == null
16179 ? 0
16180 : baseClamp(toInteger(position), 0, string.length);
16181
16182 target = baseToString(target);
16183 return string.slice(position, position + target.length) == target;
16184 }
16185
16186 /**
16187 * Creates a compiled template function that can interpolate data properties
16188 * in "interpolate" delimiters, HTML-escape interpolated data properties in
16189 * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
16190 * properties may be accessed as free variables in the template. If a setting
16191 * object is given, it takes precedence over `_.templateSettings` values.
16192 *
16193 * **Note:** In the development build `_.template` utilizes
16194 * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
16195 * for easier debugging.
16196 *
16197 * For more information on precompiling templates see
16198 * [lodash's custom builds documentation](https://lodash.com/custom-builds).
16199 *
16200 * For more information on Chrome extension sandboxes see
16201 * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
16202 *
16203 * @static
16204 * @since 0.1.0
16205 * @memberOf _
16206 * @category String
16207 * @param {string} [string=''] The template string.
16208 * @param {Object} [options={}] The options object.
16209 * @param {RegExp} [options.escape=_.templateSettings.escape]
16210 * The HTML "escape" delimiter.
16211 * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
16212 * The "evaluate" delimiter.
16213 * @param {Object} [options.imports=_.templateSettings.imports]
16214 * An object to import into the template as free variables.
16215 * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
16216 * The "interpolate" delimiter.
16217 * @param {string} [options.sourceURL='lodash.templateSources[n]']
16218 * The sourceURL of the compiled template.
16219 * @param {string} [options.variable='obj']
16220 * The data object variable name.
16221 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16222 * @returns {Function} Returns the compiled template function.
16223 * @example
16224 *
16225 * // Use the "interpolate" delimiter to create a compiled template.
16226 * var compiled = _.template('hello <%= user %>!');
16227 * compiled({ 'user': 'fred' });
16228 * // => 'hello fred!'
16229 *
16230 * // Use the HTML "escape" delimiter to escape data property values.
16231 * var compiled = _.template('<b><%- value %></b>');
16232 * compiled({ 'value': '<script>' });
16233 * // => '<b>&lt;script&gt;</b>'
16234 *
16235 * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
16236 * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
16237 * compiled({ 'users': ['fred', 'barney'] });
16238 * // => '<li>fred</li><li>barney</li>'
16239 *
16240 * // Use the internal `print` function in "evaluate" delimiters.
16241 * var compiled = _.template('<% print("hello " + user); %>!');
16242 * compiled({ 'user': 'barney' });
16243 * // => 'hello barney!'
16244 *
16245 * // Use the ES template literal delimiter as an "interpolate" delimiter.
16246 * // Disable support by replacing the "interpolate" delimiter.
16247 * var compiled = _.template('hello ${ user }!');
16248 * compiled({ 'user': 'pebbles' });
16249 * // => 'hello pebbles!'
16250 *
16251 * // Use backslashes to treat delimiters as plain text.
16252 * var compiled = _.template('<%= "\\<%- value %\\>" %>');
16253 * compiled({ 'value': 'ignored' });
16254 * // => '<%- value %>'
16255 *
16256 * // Use the `imports` option to import `jQuery` as `jq`.
16257 * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
16258 * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
16259 * compiled({ 'users': ['fred', 'barney'] });
16260 * // => '<li>fred</li><li>barney</li>'
16261 *
16262 * // Use the `sourceURL` option to specify a custom sourceURL for the template.
16263 * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
16264 * compiled(data);
16265 * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
16266 *
16267 * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
16268 * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
16269 * compiled.source;
16270 * // => function(data) {
16271 * // var __t, __p = '';
16272 * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
16273 * // return __p;
16274 * // }
16275 *
16276 * // Use custom template delimiters.
16277 * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
16278 * var compiled = _.template('hello {{ user }}!');
16279 * compiled({ 'user': 'mustache' });
16280 * // => 'hello mustache!'
16281 *
16282 * // Use the `source` property to inline compiled templates for meaningful
16283 * // line numbers in error messages and stack traces.
16284 * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
16285 * var JST = {\
16286 * "main": ' + _.template(mainText).source + '\
16287 * };\
16288 * ');
16289 */
16290 function template(string, options, guard) {
16291 // Based on John Resig's `tmpl` implementation
16292 // (http://ejohn.org/blog/javascript-micro-templating/)
16293 // and Laura Doktorova's doT.js (https://github.com/olado/doT).
16294 var settings = lodash.templateSettings;
16295
16296 if (guard && isIterateeCall(string, options, guard)) {
16297 options = undefined;
16298 }
16299 string = toString(string);
16300 options = assignInWith({}, options, settings, customDefaultsAssignIn);
16301
16302 var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
16303 importsKeys = keys(imports),
16304 importsValues = baseValues(imports, importsKeys);
16305
16306 var isEscaping,
16307 isEvaluating,
16308 index = 0,
16309 interpolate = options.interpolate || reNoMatch,
16310 source = "__p += '";
16311
16312 // Compile the regexp to match each delimiter.
16313 var reDelimiters = RegExp(
16314 (options.escape || reNoMatch).source + '|' +
16315 interpolate.source + '|' +
16316 (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
16317 (options.evaluate || reNoMatch).source + '|$'
16318 , 'g');
16319
16320 // Use a sourceURL for easier debugging.
16321 // The sourceURL gets injected into the source that's eval-ed, so be careful
16322 // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
16323 // and escape the comment, thus injecting code that gets evaled.
16324 var sourceURL = '//# sourceURL=' +
16325 (hasOwnProperty.call(options, 'sourceURL')
16326 ? (options.sourceURL + '').replace(/\s/g, ' ')
16327 : ('lodash.templateSources[' + (++templateCounter) + ']')
16328 ) + '\n';
16329
16330 string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
16331 interpolateValue || (interpolateValue = esTemplateValue);
16332
16333 // Escape characters that can't be included in string literals.
16334 source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
16335
16336 // Replace delimiters with snippets.
16337 if (escapeValue) {
16338 isEscaping = true;
16339 source += "' +\n__e(" + escapeValue + ") +\n'";
16340 }
16341 if (evaluateValue) {
16342 isEvaluating = true;
16343 source += "';\n" + evaluateValue + ";\n__p += '";
16344 }
16345 if (interpolateValue) {
16346 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
16347 }
16348 index = offset + match.length;
16349
16350 // The JS engine embedded in Adobe products needs `match` returned in
16351 // order to produce the correct `offset` value.
16352 return match;
16353 });
16354
16355 source += "';\n";
16356
16357 // If `variable` is not specified wrap a with-statement around the generated
16358 // code to add the data object to the top of the scope chain.
16359 var variable = hasOwnProperty.call(options, 'variable') && options.variable;
16360 if (!variable) {
16361 source = 'with (obj) {\n' + source + '\n}\n';
16362 }
16363 // Cleanup code by stripping empty strings.
16364 source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
16365 .replace(reEmptyStringMiddle, '$1')
16366 .replace(reEmptyStringTrailing, '$1;');
16367
16368 // Frame code as the function body.
16369 source = 'function(' + (variable || 'obj') + ') {\n' +
16370 (variable
16371 ? ''
16372 : 'obj || (obj = {});\n'
16373 ) +
16374 "var __t, __p = ''" +
16375 (isEscaping
16376 ? ', __e = _.escape'
16377 : ''
16378 ) +
16379 (isEvaluating
16380 ? ', __j = Array.prototype.join;\n' +
16381 "function print() { __p += __j.call(arguments, '') }\n"
16382 : ';\n'
16383 ) +
16384 source +
16385 'return __p\n}';
16386
16387 var result = attempt(function() {
16388 return Function(importsKeys, sourceURL + 'return ' + source)
16389 .apply(undefined, importsValues);
16390 });
16391
16392 // Provide the compiled function's source by its `toString` method or
16393 // the `source` property as a convenience for inlining compiled templates.
16394 result.source = source;
16395 if (isError(result)) {
16396 throw result;
16397 }
16398 return result;
16399 }
16400
16401 /**
16402 * Converts `string`, as a whole, to lower case just like
16403 * [String#toLowerCase](https://mdn.io/toLowerCase).
16404 *
16405 * @static
16406 * @memberOf _
16407 * @since 4.0.0
16408 * @category String
16409 * @param {string} [string=''] The string to convert.
16410 * @returns {string} Returns the lower cased string.
16411 * @example
16412 *
16413 * _.toLower('--Foo-Bar--');
16414 * // => '--foo-bar--'
16415 *
16416 * _.toLower('fooBar');
16417 * // => 'foobar'
16418 *
16419 * _.toLower('__FOO_BAR__');
16420 * // => '__foo_bar__'
16421 */
16422 function toLower(value) {
16423 return toString(value).toLowerCase();
16424 }
16425
16426 /**
16427 * Converts `string`, as a whole, to upper case just like
16428 * [String#toUpperCase](https://mdn.io/toUpperCase).
16429 *
16430 * @static
16431 * @memberOf _
16432 * @since 4.0.0
16433 * @category String
16434 * @param {string} [string=''] The string to convert.
16435 * @returns {string} Returns the upper cased string.
16436 * @example
16437 *
16438 * _.toUpper('--foo-bar--');
16439 * // => '--FOO-BAR--'
16440 *
16441 * _.toUpper('fooBar');
16442 * // => 'FOOBAR'
16443 *
16444 * _.toUpper('__foo_bar__');
16445 * // => '__FOO_BAR__'
16446 */
16447 function toUpper(value) {
16448 return toString(value).toUpperCase();
16449 }
16450
16451 /**
16452 * Removes leading and trailing whitespace or specified characters from `string`.
16453 *
16454 * @static
16455 * @memberOf _
16456 * @since 3.0.0
16457 * @category String
16458 * @param {string} [string=''] The string to trim.
16459 * @param {string} [chars=whitespace] The characters to trim.
16460 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16461 * @returns {string} Returns the trimmed string.
16462 * @example
16463 *
16464 * _.trim(' abc ');
16465 * // => 'abc'
16466 *
16467 * _.trim('-_-abc-_-', '_-');
16468 * // => 'abc'
16469 *
16470 * _.map([' foo ', ' bar '], _.trim);
16471 * // => ['foo', 'bar']
16472 */
16473 function trim(string, chars, guard) {
16474 string = toString(string);
16475 if (string && (guard || chars === undefined)) {
16476 return string.replace(reTrim, '');
16477 }
16478 if (!string || !(chars = baseToString(chars))) {
16479 return string;
16480 }
16481 var strSymbols = stringToArray(string),
16482 chrSymbols = stringToArray(chars),
16483 start = charsStartIndex(strSymbols, chrSymbols),
16484 end = charsEndIndex(strSymbols, chrSymbols) + 1;
16485
16486 return castSlice(strSymbols, start, end).join('');
16487 }
16488
16489 /**
16490 * Removes trailing whitespace or specified characters from `string`.
16491 *
16492 * @static
16493 * @memberOf _
16494 * @since 4.0.0
16495 * @category String
16496 * @param {string} [string=''] The string to trim.
16497 * @param {string} [chars=whitespace] The characters to trim.
16498 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16499 * @returns {string} Returns the trimmed string.
16500 * @example
16501 *
16502 * _.trimEnd(' abc ');
16503 * // => ' abc'
16504 *
16505 * _.trimEnd('-_-abc-_-', '_-');
16506 * // => '-_-abc'
16507 */
16508 function trimEnd(string, chars, guard) {
16509 string = toString(string);
16510 if (string && (guard || chars === undefined)) {
16511 return string.replace(reTrimEnd, '');
16512 }
16513 if (!string || !(chars = baseToString(chars))) {
16514 return string;
16515 }
16516 var strSymbols = stringToArray(string),
16517 end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
16518
16519 return castSlice(strSymbols, 0, end).join('');
16520 }
16521
16522 /**
16523 * Removes leading whitespace or specified characters from `string`.
16524 *
16525 * @static
16526 * @memberOf _
16527 * @since 4.0.0
16528 * @category String
16529 * @param {string} [string=''] The string to trim.
16530 * @param {string} [chars=whitespace] The characters to trim.
16531 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16532 * @returns {string} Returns the trimmed string.
16533 * @example
16534 *
16535 * _.trimStart(' abc ');
16536 * // => 'abc '
16537 *
16538 * _.trimStart('-_-abc-_-', '_-');
16539 * // => 'abc-_-'
16540 */
16541 function trimStart(string, chars, guard) {
16542 string = toString(string);
16543 if (string && (guard || chars === undefined)) {
16544 return string.replace(reTrimStart, '');
16545 }
16546 if (!string || !(chars = baseToString(chars))) {
16547 return string;
16548 }
16549 var strSymbols = stringToArray(string),
16550 start = charsStartIndex(strSymbols, stringToArray(chars));
16551
16552 return castSlice(strSymbols, start).join('');
16553 }
16554
16555 /**
16556 * Truncates `string` if it's longer than the given maximum string length.
16557 * The last characters of the truncated string are replaced with the omission
16558 * string which defaults to "...".
16559 *
16560 * @static
16561 * @memberOf _
16562 * @since 4.0.0
16563 * @category String
16564 * @param {string} [string=''] The string to truncate.
16565 * @param {Object} [options={}] The options object.
16566 * @param {number} [options.length=30] The maximum string length.
16567 * @param {string} [options.omission='...'] The string to indicate text is omitted.
16568 * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
16569 * @returns {string} Returns the truncated string.
16570 * @example
16571 *
16572 * _.truncate('hi-diddly-ho there, neighborino');
16573 * // => 'hi-diddly-ho there, neighbo...'
16574 *
16575 * _.truncate('hi-diddly-ho there, neighborino', {
16576 * 'length': 24,
16577 * 'separator': ' '
16578 * });
16579 * // => 'hi-diddly-ho there,...'
16580 *
16581 * _.truncate('hi-diddly-ho there, neighborino', {
16582 * 'length': 24,
16583 * 'separator': /,? +/
16584 * });
16585 * // => 'hi-diddly-ho there...'
16586 *
16587 * _.truncate('hi-diddly-ho there, neighborino', {
16588 * 'omission': ' [...]'
16589 * });
16590 * // => 'hi-diddly-ho there, neig [...]'
16591 */
16592 function truncate(string, options) {
16593 var length = DEFAULT_TRUNC_LENGTH,
16594 omission = DEFAULT_TRUNC_OMISSION;
16595
16596 if (isObject(options)) {
16597 var separator = 'separator' in options ? options.separator : separator;
16598 length = 'length' in options ? toInteger(options.length) : length;
16599 omission = 'omission' in options ? baseToString(options.omission) : omission;
16600 }
16601 string = toString(string);
16602
16603 var strLength = string.length;
16604 if (hasUnicode(string)) {
16605 var strSymbols = stringToArray(string);
16606 strLength = strSymbols.length;
16607 }
16608 if (length >= strLength) {
16609 return string;
16610 }
16611 var end = length - stringSize(omission);
16612 if (end < 1) {
16613 return omission;
16614 }
16615 var result = strSymbols
16616 ? castSlice(strSymbols, 0, end).join('')
16617 : string.slice(0, end);
16618
16619 if (separator === undefined) {
16620 return result + omission;
16621 }
16622 if (strSymbols) {
16623 end += (result.length - end);
16624 }
16625 if (isRegExp(separator)) {
16626 if (string.slice(end).search(separator)) {
16627 var match,
16628 substring = result;
16629
16630 if (!separator.global) {
16631 separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
16632 }
16633 separator.lastIndex = 0;
16634 while ((match = separator.exec(substring))) {
16635 var newEnd = match.index;
16636 }
16637 result = result.slice(0, newEnd === undefined ? end : newEnd);
16638 }
16639 } else if (string.indexOf(baseToString(separator), end) != end) {
16640 var index = result.lastIndexOf(separator);
16641 if (index > -1) {
16642 result = result.slice(0, index);
16643 }
16644 }
16645 return result + omission;
16646 }
16647
16648 /**
16649 * The inverse of `_.escape`; this method converts the HTML entities
16650 * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
16651 * their corresponding characters.
16652 *
16653 * **Note:** No other HTML entities are unescaped. To unescape additional
16654 * HTML entities use a third-party library like [_he_](https://mths.be/he).
16655 *
16656 * @static
16657 * @memberOf _
16658 * @since 0.6.0
16659 * @category String
16660 * @param {string} [string=''] The string to unescape.
16661 * @returns {string} Returns the unescaped string.
16662 * @example
16663 *
16664 * _.unescape('fred, barney, &amp; pebbles');
16665 * // => 'fred, barney, & pebbles'
16666 */
16667 function unescape(string) {
16668 string = toString(string);
16669 return (string && reHasEscapedHtml.test(string))
16670 ? string.replace(reEscapedHtml, unescapeHtmlChar)
16671 : string;
16672 }
16673
16674 /**
16675 * Converts `string`, as space separated words, to upper case.
16676 *
16677 * @static
16678 * @memberOf _
16679 * @since 4.0.0
16680 * @category String
16681 * @param {string} [string=''] The string to convert.
16682 * @returns {string} Returns the upper cased string.
16683 * @example
16684 *
16685 * _.upperCase('--foo-bar');
16686 * // => 'FOO BAR'
16687 *
16688 * _.upperCase('fooBar');
16689 * // => 'FOO BAR'
16690 *
16691 * _.upperCase('__foo_bar__');
16692 * // => 'FOO BAR'
16693 */
16694 var upperCase = createCompounder(function(result, word, index) {
16695 return result + (index ? ' ' : '') + word.toUpperCase();
16696 });
16697
16698 /**
16699 * Converts the first character of `string` to upper case.
16700 *
16701 * @static
16702 * @memberOf _
16703 * @since 4.0.0
16704 * @category String
16705 * @param {string} [string=''] The string to convert.
16706 * @returns {string} Returns the converted string.
16707 * @example
16708 *
16709 * _.upperFirst('fred');
16710 * // => 'Fred'
16711 *
16712 * _.upperFirst('FRED');
16713 * // => 'FRED'
16714 */
16715 var upperFirst = createCaseFirst('toUpperCase');
16716
16717 /**
16718 * Splits `string` into an array of its words.
16719 *
16720 * @static
16721 * @memberOf _
16722 * @since 3.0.0
16723 * @category String
16724 * @param {string} [string=''] The string to inspect.
16725 * @param {RegExp|string} [pattern] The pattern to match words.
16726 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16727 * @returns {Array} Returns the words of `string`.
16728 * @example
16729 *
16730 * _.words('fred, barney, & pebbles');
16731 * // => ['fred', 'barney', 'pebbles']
16732 *
16733 * _.words('fred, barney, & pebbles', /[^, ]+/g);
16734 * // => ['fred', 'barney', '&', 'pebbles']
16735 */
16736 function words(string, pattern, guard) {
16737 string = toString(string);
16738 pattern = guard ? undefined : pattern;
16739
16740 if (pattern === undefined) {
16741 return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
16742 }
16743 return string.match(pattern) || [];
16744 }
16745
16746 /*------------------------------------------------------------------------*/
16747
16748 /**
16749 * Attempts to invoke `func`, returning either the result or the caught error
16750 * object. Any additional arguments are provided to `func` when it's invoked.
16751 *
16752 * @static
16753 * @memberOf _
16754 * @since 3.0.0
16755 * @category Util
16756 * @param {Function} func The function to attempt.
16757 * @param {...*} [args] The arguments to invoke `func` with.
16758 * @returns {*} Returns the `func` result or error object.
16759 * @example
16760 *
16761 * // Avoid throwing errors for invalid selectors.
16762 * var elements = _.attempt(function(selector) {
16763 * return document.querySelectorAll(selector);
16764 * }, '>_>');
16765 *
16766 * if (_.isError(elements)) {
16767 * elements = [];
16768 * }
16769 */
16770 var attempt = baseRest(function(func, args) {
16771 try {
16772 return apply(func, undefined, args);
16773 } catch (e) {
16774 return isError(e) ? e : new Error(e);
16775 }
16776 });
16777
16778 /**
16779 * Binds methods of an object to the object itself, overwriting the existing
16780 * method.
16781 *
16782 * **Note:** This method doesn't set the "length" property of bound functions.
16783 *
16784 * @static
16785 * @since 0.1.0
16786 * @memberOf _
16787 * @category Util
16788 * @param {Object} object The object to bind and assign the bound methods to.
16789 * @param {...(string|string[])} methodNames The object method names to bind.
16790 * @returns {Object} Returns `object`.
16791 * @example
16792 *
16793 * var view = {
16794 * 'label': 'docs',
16795 * 'click': function() {
16796 * console.log('clicked ' + this.label);
16797 * }
16798 * };
16799 *
16800 * _.bindAll(view, ['click']);
16801 * jQuery(element).on('click', view.click);
16802 * // => Logs 'clicked docs' when clicked.
16803 */
16804 var bindAll = flatRest(function(object, methodNames) {
16805 arrayEach(methodNames, function(key) {
16806 key = toKey(key);
16807 baseAssignValue(object, key, bind(object[key], object));
16808 });
16809 return object;
16810 });
16811
16812 /**
16813 * Creates a function that iterates over `pairs` and invokes the corresponding
16814 * function of the first predicate to return truthy. The predicate-function
16815 * pairs are invoked with the `this` binding and arguments of the created
16816 * function.
16817 *
16818 * @static
16819 * @memberOf _
16820 * @since 4.0.0
16821 * @category Util
16822 * @param {Array} pairs The predicate-function pairs.
16823 * @returns {Function} Returns the new composite function.
16824 * @example
16825 *
16826 * var func = _.cond([
16827 * [_.matches({ 'a': 1 }), _.constant('matches A')],
16828 * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
16829 * [_.stubTrue, _.constant('no match')]
16830 * ]);
16831 *
16832 * func({ 'a': 1, 'b': 2 });
16833 * // => 'matches A'
16834 *
16835 * func({ 'a': 0, 'b': 1 });
16836 * // => 'matches B'
16837 *
16838 * func({ 'a': '1', 'b': '2' });
16839 * // => 'no match'
16840 */
16841 function cond(pairs) {
16842 var length = pairs == null ? 0 : pairs.length,
16843 toIteratee = getIteratee();
16844
16845 pairs = !length ? [] : arrayMap(pairs, function(pair) {
16846 if (typeof pair[1] != 'function') {
16847 throw new TypeError(FUNC_ERROR_TEXT);
16848 }
16849 return [toIteratee(pair[0]), pair[1]];
16850 });
16851
16852 return baseRest(function(args) {
16853 var index = -1;
16854 while (++index < length) {
16855 var pair = pairs[index];
16856 if (apply(pair[0], this, args)) {
16857 return apply(pair[1], this, args);
16858 }
16859 }
16860 });
16861 }
16862
16863 /**
16864 * Creates a function that invokes the predicate properties of `source` with
16865 * the corresponding property values of a given object, returning `true` if
16866 * all predicates return truthy, else `false`.
16867 *
16868 * **Note:** The created function is equivalent to `_.conformsTo` with
16869 * `source` partially applied.
16870 *
16871 * @static
16872 * @memberOf _
16873 * @since 4.0.0
16874 * @category Util
16875 * @param {Object} source The object of property predicates to conform to.
16876 * @returns {Function} Returns the new spec function.
16877 * @example
16878 *
16879 * var objects = [
16880 * { 'a': 2, 'b': 1 },
16881 * { 'a': 1, 'b': 2 }
16882 * ];
16883 *
16884 * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
16885 * // => [{ 'a': 1, 'b': 2 }]
16886 */
16887 function conforms(source) {
16888 return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
16889 }
16890
16891 /**
16892 * Creates a function that returns `value`.
16893 *
16894 * @static
16895 * @memberOf _
16896 * @since 2.4.0
16897 * @category Util
16898 * @param {*} value The value to return from the new function.
16899 * @returns {Function} Returns the new constant function.
16900 * @example
16901 *
16902 * var objects = _.times(2, _.constant({ 'a': 1 }));
16903 *
16904 * console.log(objects);
16905 * // => [{ 'a': 1 }, { 'a': 1 }]
16906 *
16907 * console.log(objects[0] === objects[1]);
16908 * // => true
16909 */
16910 function constant(value) {
16911 return function() {
16912 return value;
16913 };
16914 }
16915
16916 /**
16917 * Checks `value` to determine whether a default value should be returned in
16918 * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
16919 * or `undefined`.
16920 *
16921 * @static
16922 * @memberOf _
16923 * @since 4.14.0
16924 * @category Util
16925 * @param {*} value The value to check.
16926 * @param {*} defaultValue The default value.
16927 * @returns {*} Returns the resolved value.
16928 * @example
16929 *
16930 * _.defaultTo(1, 10);
16931 * // => 1
16932 *
16933 * _.defaultTo(undefined, 10);
16934 * // => 10
16935 */
16936 function defaultTo(value, defaultValue) {
16937 return (value == null || value !== value) ? defaultValue : value;
16938 }
16939
16940 /**
16941 * Creates a function that returns the result of invoking the given functions
16942 * with the `this` binding of the created function, where each successive
16943 * invocation is supplied the return value of the previous.
16944 *
16945 * @static
16946 * @memberOf _
16947 * @since 3.0.0
16948 * @category Util
16949 * @param {...(Function|Function[])} [funcs] The functions to invoke.
16950 * @returns {Function} Returns the new composite function.
16951 * @see _.flowRight
16952 * @example
16953 *
16954 * function square(n) {
16955 * return n * n;
16956 * }
16957 *
16958 * var addSquare = _.flow([_.add, square]);
16959 * addSquare(1, 2);
16960 * // => 9
16961 */
16962 var flow = createFlow();
16963
16964 /**
16965 * This method is like `_.flow` except that it creates a function that
16966 * invokes the given functions from right to left.
16967 *
16968 * @static
16969 * @since 3.0.0
16970 * @memberOf _
16971 * @category Util
16972 * @param {...(Function|Function[])} [funcs] The functions to invoke.
16973 * @returns {Function} Returns the new composite function.
16974 * @see _.flow
16975 * @example
16976 *
16977 * function square(n) {
16978 * return n * n;
16979 * }
16980 *
16981 * var addSquare = _.flowRight([square, _.add]);
16982 * addSquare(1, 2);
16983 * // => 9
16984 */
16985 var flowRight = createFlow(true);
16986
16987 /**
16988 * This method returns the first argument it receives.
16989 *
16990 * @static
16991 * @since 0.1.0
16992 * @memberOf _
16993 * @category Util
16994 * @param {*} value Any value.
16995 * @returns {*} Returns `value`.
16996 * @example
16997 *
16998 * var object = { 'a': 1 };
16999 *
17000 * console.log(_.identity(object) === object);
17001 * // => true
17002 */
17003 function identity(value) {
17004 return value;
17005 }
17006
17007 /**
17008 * Creates a function that invokes `func` with the arguments of the created
17009 * function. If `func` is a property name, the created function returns the
17010 * property value for a given element. If `func` is an array or object, the
17011 * created function returns `true` for elements that contain the equivalent
17012 * source properties, otherwise it returns `false`.
17013 *
17014 * @static
17015 * @since 4.0.0
17016 * @memberOf _
17017 * @category Util
17018 * @param {*} [func=_.identity] The value to convert to a callback.
17019 * @returns {Function} Returns the callback.
17020 * @example
17021 *
17022 * var users = [
17023 * { 'user': 'barney', 'age': 36, 'active': true },
17024 * { 'user': 'fred', 'age': 40, 'active': false }
17025 * ];
17026 *
17027 * // The `_.matches` iteratee shorthand.
17028 * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
17029 * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
17030 *
17031 * // The `_.matchesProperty` iteratee shorthand.
17032 * _.filter(users, _.iteratee(['user', 'fred']));
17033 * // => [{ 'user': 'fred', 'age': 40 }]
17034 *
17035 * // The `_.property` iteratee shorthand.
17036 * _.map(users, _.iteratee('user'));
17037 * // => ['barney', 'fred']
17038 *
17039 * // Create custom iteratee shorthands.
17040 * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
17041 * return !_.isRegExp(func) ? iteratee(func) : function(string) {
17042 * return func.test(string);
17043 * };
17044 * });
17045 *
17046 * _.filter(['abc', 'def'], /ef/);
17047 * // => ['def']
17048 */
17049 function iteratee(func) {
17050 return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
17051 }
17052
17053 /**
17054 * Creates a function that performs a partial deep comparison between a given
17055 * object and `source`, returning `true` if the given object has equivalent
17056 * property values, else `false`.
17057 *
17058 * **Note:** The created function is equivalent to `_.isMatch` with `source`
17059 * partially applied.
17060 *
17061 * Partial comparisons will match empty array and empty object `source`
17062 * values against any array or object value, respectively. See `_.isEqual`
17063 * for a list of supported value comparisons.
17064 *
17065 * **Note:** Multiple values can be checked by combining several matchers
17066 * using `_.overSome`
17067 *
17068 * @static
17069 * @memberOf _
17070 * @since 3.0.0
17071 * @category Util
17072 * @param {Object} source The object of property values to match.
17073 * @returns {Function} Returns the new spec function.
17074 * @example
17075 *
17076 * var objects = [
17077 * { 'a': 1, 'b': 2, 'c': 3 },
17078 * { 'a': 4, 'b': 5, 'c': 6 }
17079 * ];
17080 *
17081 * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
17082 * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
17083 *
17084 * // Checking for several possible values
17085 * _.filter(users, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
17086 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
17087 */
17088 function matches(source) {
17089 return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
17090 }
17091
17092 /**
17093 * Creates a function that performs a partial deep comparison between the
17094 * value at `path` of a given object to `srcValue`, returning `true` if the
17095 * object value is equivalent, else `false`.
17096 *
17097 * **Note:** Partial comparisons will match empty array and empty object
17098 * `srcValue` values against any array or object value, respectively. See
17099 * `_.isEqual` for a list of supported value comparisons.
17100 *
17101 * **Note:** Multiple values can be checked by combining several matchers
17102 * using `_.overSome`
17103 *
17104 * @static
17105 * @memberOf _
17106 * @since 3.2.0
17107 * @category Util
17108 * @param {Array|string} path The path of the property to get.
17109 * @param {*} srcValue The value to match.
17110 * @returns {Function} Returns the new spec function.
17111 * @example
17112 *
17113 * var objects = [
17114 * { 'a': 1, 'b': 2, 'c': 3 },
17115 * { 'a': 4, 'b': 5, 'c': 6 }
17116 * ];
17117 *
17118 * _.find(objects, _.matchesProperty('a', 4));
17119 * // => { 'a': 4, 'b': 5, 'c': 6 }
17120 *
17121 * // Checking for several possible values
17122 * _.filter(users, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
17123 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
17124 */
17125 function matchesProperty(path, srcValue) {
17126 return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
17127 }
17128
17129 /**
17130 * Creates a function that invokes the method at `path` of a given object.
17131 * Any additional arguments are provided to the invoked method.
17132 *
17133 * @static
17134 * @memberOf _
17135 * @since 3.7.0
17136 * @category Util
17137 * @param {Array|string} path The path of the method to invoke.
17138 * @param {...*} [args] The arguments to invoke the method with.
17139 * @returns {Function} Returns the new invoker function.
17140 * @example
17141 *
17142 * var objects = [
17143 * { 'a': { 'b': _.constant(2) } },
17144 * { 'a': { 'b': _.constant(1) } }
17145 * ];
17146 *
17147 * _.map(objects, _.method('a.b'));
17148 * // => [2, 1]
17149 *
17150 * _.map(objects, _.method(['a', 'b']));
17151 * // => [2, 1]
17152 */
17153 var method = baseRest(function(path, args) {
17154 return function(object) {
17155 return baseInvoke(object, path, args);
17156 };
17157 });
17158
17159 /**
17160 * The opposite of `_.method`; this method creates a function that invokes
17161 * the method at a given path of `object`. Any additional arguments are
17162 * provided to the invoked method.
17163 *
17164 * @static
17165 * @memberOf _
17166 * @since 3.7.0
17167 * @category Util
17168 * @param {Object} object The object to query.
17169 * @param {...*} [args] The arguments to invoke the method with.
17170 * @returns {Function} Returns the new invoker function.
17171 * @example
17172 *
17173 * var array = _.times(3, _.constant),
17174 * object = { 'a': array, 'b': array, 'c': array };
17175 *
17176 * _.map(['a[2]', 'c[0]'], _.methodOf(object));
17177 * // => [2, 0]
17178 *
17179 * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
17180 * // => [2, 0]
17181 */
17182 var methodOf = baseRest(function(object, args) {
17183 return function(path) {
17184 return baseInvoke(object, path, args);
17185 };
17186 });
17187
17188 /**
17189 * Adds all own enumerable string keyed function properties of a source
17190 * object to the destination object. If `object` is a function, then methods
17191 * are added to its prototype as well.
17192 *
17193 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
17194 * avoid conflicts caused by modifying the original.
17195 *
17196 * @static
17197 * @since 0.1.0
17198 * @memberOf _
17199 * @category Util
17200 * @param {Function|Object} [object=lodash] The destination object.
17201 * @param {Object} source The object of functions to add.
17202 * @param {Object} [options={}] The options object.
17203 * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
17204 * @returns {Function|Object} Returns `object`.
17205 * @example
17206 *
17207 * function vowels(string) {
17208 * return _.filter(string, function(v) {
17209 * return /[aeiou]/i.test(v);
17210 * });
17211 * }
17212 *
17213 * _.mixin({ 'vowels': vowels });
17214 * _.vowels('fred');
17215 * // => ['e']
17216 *
17217 * _('fred').vowels().value();
17218 * // => ['e']
17219 *
17220 * _.mixin({ 'vowels': vowels }, { 'chain': false });
17221 * _('fred').vowels();
17222 * // => ['e']
17223 */
17224 function mixin(object, source, options) {
17225 var props = keys(source),
17226 methodNames = baseFunctions(source, props);
17227
17228 if (options == null &&
17229 !(isObject(source) && (methodNames.length || !props.length))) {
17230 options = source;
17231 source = object;
17232 object = this;
17233 methodNames = baseFunctions(source, keys(source));
17234 }
17235 var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
17236 isFunc = isFunction(object);
17237
17238 arrayEach(methodNames, function(methodName) {
17239 var func = source[methodName];
17240 object[methodName] = func;
17241 if (isFunc) {
17242 object.prototype[methodName] = function() {
17243 var chainAll = this.__chain__;
17244 if (chain || chainAll) {
17245 var result = object(this.__wrapped__),
17246 actions = result.__actions__ = copyArray(this.__actions__);
17247
17248 actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
17249 result.__chain__ = chainAll;
17250 return result;
17251 }
17252 return func.apply(object, arrayPush([this.value()], arguments));
17253 };
17254 }
17255 });
17256
17257 return object;
17258 }
17259
17260 /**
17261 * Reverts the `_` variable to its previous value and returns a reference to
17262 * the `lodash` function.
17263 *
17264 * @static
17265 * @since 0.1.0
17266 * @memberOf _
17267 * @category Util
17268 * @returns {Function} Returns the `lodash` function.
17269 * @example
17270 *
17271 * var lodash = _.noConflict();
17272 */
17273 function noConflict() {
17274 if (root._ === this) {
17275 root._ = oldDash;
17276 }
17277 return this;
17278 }
17279
17280 /**
17281 * This method returns `undefined`.
17282 *
17283 * @static
17284 * @memberOf _
17285 * @since 2.3.0
17286 * @category Util
17287 * @example
17288 *
17289 * _.times(2, _.noop);
17290 * // => [undefined, undefined]
17291 */
17292 function noop() {
17293 // No operation performed.
17294 }
17295
17296 /**
17297 * Creates a function that gets the argument at index `n`. If `n` is negative,
17298 * the nth argument from the end is returned.
17299 *
17300 * @static
17301 * @memberOf _
17302 * @since 4.0.0
17303 * @category Util
17304 * @param {number} [n=0] The index of the argument to return.
17305 * @returns {Function} Returns the new pass-thru function.
17306 * @example
17307 *
17308 * var func = _.nthArg(1);
17309 * func('a', 'b', 'c', 'd');
17310 * // => 'b'
17311 *
17312 * var func = _.nthArg(-2);
17313 * func('a', 'b', 'c', 'd');
17314 * // => 'c'
17315 */
17316 function nthArg(n) {
17317 n = toInteger(n);
17318 return baseRest(function(args) {
17319 return baseNth(args, n);
17320 });
17321 }
17322
17323 /**
17324 * Creates a function that invokes `iteratees` with the arguments it receives
17325 * and returns their results.
17326 *
17327 * @static
17328 * @memberOf _
17329 * @since 4.0.0
17330 * @category Util
17331 * @param {...(Function|Function[])} [iteratees=[_.identity]]
17332 * The iteratees to invoke.
17333 * @returns {Function} Returns the new function.
17334 * @example
17335 *
17336 * var func = _.over([Math.max, Math.min]);
17337 *
17338 * func(1, 2, 3, 4);
17339 * // => [4, 1]
17340 */
17341 var over = createOver(arrayMap);
17342
17343 /**
17344 * Creates a function that checks if **all** of the `predicates` return
17345 * truthy when invoked with the arguments it receives.
17346 *
17347 * Following shorthands are possible for providing predicates.
17348 * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
17349 * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
17350 *
17351 * @static
17352 * @memberOf _
17353 * @since 4.0.0
17354 * @category Util
17355 * @param {...(Function|Function[])} [predicates=[_.identity]]
17356 * The predicates to check.
17357 * @returns {Function} Returns the new function.
17358 * @example
17359 *
17360 * var func = _.overEvery([Boolean, isFinite]);
17361 *
17362 * func('1');
17363 * // => true
17364 *
17365 * func(null);
17366 * // => false
17367 *
17368 * func(NaN);
17369 * // => false
17370 */
17371 var overEvery = createOver(arrayEvery);
17372
17373 /**
17374 * Creates a function that checks if **any** of the `predicates` return
17375 * truthy when invoked with the arguments it receives.
17376 *
17377 * Following shorthands are possible for providing predicates.
17378 * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
17379 * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
17380 *
17381 * @static
17382 * @memberOf _
17383 * @since 4.0.0
17384 * @category Util
17385 * @param {...(Function|Function[])} [predicates=[_.identity]]
17386 * The predicates to check.
17387 * @returns {Function} Returns the new function.
17388 * @example
17389 *
17390 * var func = _.overSome([Boolean, isFinite]);
17391 *
17392 * func('1');
17393 * // => true
17394 *
17395 * func(null);
17396 * // => true
17397 *
17398 * func(NaN);
17399 * // => false
17400 *
17401 * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
17402 * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
17403 */
17404 var overSome = createOver(arraySome);
17405
17406 /**
17407 * Creates a function that returns the value at `path` of a given object.
17408 *
17409 * @static
17410 * @memberOf _
17411 * @since 2.4.0
17412 * @category Util
17413 * @param {Array|string} path The path of the property to get.
17414 * @returns {Function} Returns the new accessor function.
17415 * @example
17416 *
17417 * var objects = [
17418 * { 'a': { 'b': 2 } },
17419 * { 'a': { 'b': 1 } }
17420 * ];
17421 *
17422 * _.map(objects, _.property('a.b'));
17423 * // => [2, 1]
17424 *
17425 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
17426 * // => [1, 2]
17427 */
17428 function property(path) {
17429 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
17430 }
17431
17432 /**
17433 * The opposite of `_.property`; this method creates a function that returns
17434 * the value at a given path of `object`.
17435 *
17436 * @static
17437 * @memberOf _
17438 * @since 3.0.0
17439 * @category Util
17440 * @param {Object} object The object to query.
17441 * @returns {Function} Returns the new accessor function.
17442 * @example
17443 *
17444 * var array = [0, 1, 2],
17445 * object = { 'a': array, 'b': array, 'c': array };
17446 *
17447 * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
17448 * // => [2, 0]
17449 *
17450 * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
17451 * // => [2, 0]
17452 */
17453 function propertyOf(object) {
17454 return function(path) {
17455 return object == null ? undefined : baseGet(object, path);
17456 };
17457 }
17458
17459 /**
17460 * Creates an array of numbers (positive and/or negative) progressing from
17461 * `start` up to, but not including, `end`. A step of `-1` is used if a negative
17462 * `start` is specified without an `end` or `step`. If `end` is not specified,
17463 * it's set to `start` with `start` then set to `0`.
17464 *
17465 * **Note:** JavaScript follows the IEEE-754 standard for resolving
17466 * floating-point values which can produce unexpected results.
17467 *
17468 * @static
17469 * @since 0.1.0
17470 * @memberOf _
17471 * @category Util
17472 * @param {number} [start=0] The start of the range.
17473 * @param {number} end The end of the range.
17474 * @param {number} [step=1] The value to increment or decrement by.
17475 * @returns {Array} Returns the range of numbers.
17476 * @see _.inRange, _.rangeRight
17477 * @example
17478 *
17479 * _.range(4);
17480 * // => [0, 1, 2, 3]
17481 *
17482 * _.range(-4);
17483 * // => [0, -1, -2, -3]
17484 *
17485 * _.range(1, 5);
17486 * // => [1, 2, 3, 4]
17487 *
17488 * _.range(0, 20, 5);
17489 * // => [0, 5, 10, 15]
17490 *
17491 * _.range(0, -4, -1);
17492 * // => [0, -1, -2, -3]
17493 *
17494 * _.range(1, 4, 0);
17495 * // => [1, 1, 1]
17496 *
17497 * _.range(0);
17498 * // => []
17499 */
17500 var range = createRange();
17501
17502 /**
17503 * This method is like `_.range` except that it populates values in
17504 * descending order.
17505 *
17506 * @static
17507 * @memberOf _
17508 * @since 4.0.0
17509 * @category Util
17510 * @param {number} [start=0] The start of the range.
17511 * @param {number} end The end of the range.
17512 * @param {number} [step=1] The value to increment or decrement by.
17513 * @returns {Array} Returns the range of numbers.
17514 * @see _.inRange, _.range
17515 * @example
17516 *
17517 * _.rangeRight(4);
17518 * // => [3, 2, 1, 0]
17519 *
17520 * _.rangeRight(-4);
17521 * // => [-3, -2, -1, 0]
17522 *
17523 * _.rangeRight(1, 5);
17524 * // => [4, 3, 2, 1]
17525 *
17526 * _.rangeRight(0, 20, 5);
17527 * // => [15, 10, 5, 0]
17528 *
17529 * _.rangeRight(0, -4, -1);
17530 * // => [-3, -2, -1, 0]
17531 *
17532 * _.rangeRight(1, 4, 0);
17533 * // => [1, 1, 1]
17534 *
17535 * _.rangeRight(0);
17536 * // => []
17537 */
17538 var rangeRight = createRange(true);
17539
17540 /**
17541 * This method returns a new empty array.
17542 *
17543 * @static
17544 * @memberOf _
17545 * @since 4.13.0
17546 * @category Util
17547 * @returns {Array} Returns the new empty array.
17548 * @example
17549 *
17550 * var arrays = _.times(2, _.stubArray);
17551 *
17552 * console.log(arrays);
17553 * // => [[], []]
17554 *
17555 * console.log(arrays[0] === arrays[1]);
17556 * // => false
17557 */
17558 function stubArray() {
17559 return [];
17560 }
17561
17562 /**
17563 * This method returns `false`.
17564 *
17565 * @static
17566 * @memberOf _
17567 * @since 4.13.0
17568 * @category Util
17569 * @returns {boolean} Returns `false`.
17570 * @example
17571 *
17572 * _.times(2, _.stubFalse);
17573 * // => [false, false]
17574 */
17575 function stubFalse() {
17576 return false;
17577 }
17578
17579 /**
17580 * This method returns a new empty object.
17581 *
17582 * @static
17583 * @memberOf _
17584 * @since 4.13.0
17585 * @category Util
17586 * @returns {Object} Returns the new empty object.
17587 * @example
17588 *
17589 * var objects = _.times(2, _.stubObject);
17590 *
17591 * console.log(objects);
17592 * // => [{}, {}]
17593 *
17594 * console.log(objects[0] === objects[1]);
17595 * // => false
17596 */
17597 function stubObject() {
17598 return {};
17599 }
17600
17601 /**
17602 * This method returns an empty string.
17603 *
17604 * @static
17605 * @memberOf _
17606 * @since 4.13.0
17607 * @category Util
17608 * @returns {string} Returns the empty string.
17609 * @example
17610 *
17611 * _.times(2, _.stubString);
17612 * // => ['', '']
17613 */
17614 function stubString() {
17615 return '';
17616 }
17617
17618 /**
17619 * This method returns `true`.
17620 *
17621 * @static
17622 * @memberOf _
17623 * @since 4.13.0
17624 * @category Util
17625 * @returns {boolean} Returns `true`.
17626 * @example
17627 *
17628 * _.times(2, _.stubTrue);
17629 * // => [true, true]
17630 */
17631 function stubTrue() {
17632 return true;
17633 }
17634
17635 /**
17636 * Invokes the iteratee `n` times, returning an array of the results of
17637 * each invocation. The iteratee is invoked with one argument; (index).
17638 *
17639 * @static
17640 * @since 0.1.0
17641 * @memberOf _
17642 * @category Util
17643 * @param {number} n The number of times to invoke `iteratee`.
17644 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
17645 * @returns {Array} Returns the array of results.
17646 * @example
17647 *
17648 * _.times(3, String);
17649 * // => ['0', '1', '2']
17650 *
17651 * _.times(4, _.constant(0));
17652 * // => [0, 0, 0, 0]
17653 */
17654 function times(n, iteratee) {
17655 n = toInteger(n);
17656 if (n < 1 || n > MAX_SAFE_INTEGER) {
17657 return [];
17658 }
17659 var index = MAX_ARRAY_LENGTH,
17660 length = nativeMin(n, MAX_ARRAY_LENGTH);
17661
17662 iteratee = getIteratee(iteratee);
17663 n -= MAX_ARRAY_LENGTH;
17664
17665 var result = baseTimes(length, iteratee);
17666 while (++index < n) {
17667 iteratee(index);
17668 }
17669 return result;
17670 }
17671
17672 /**
17673 * Converts `value` to a property path array.
17674 *
17675 * @static
17676 * @memberOf _
17677 * @since 4.0.0
17678 * @category Util
17679 * @param {*} value The value to convert.
17680 * @returns {Array} Returns the new property path array.
17681 * @example
17682 *
17683 * _.toPath('a.b.c');
17684 * // => ['a', 'b', 'c']
17685 *
17686 * _.toPath('a[0].b.c');
17687 * // => ['a', '0', 'b', 'c']
17688 */
17689 function toPath(value) {
17690 if (isArray(value)) {
17691 return arrayMap(value, toKey);
17692 }
17693 return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
17694 }
17695
17696 /**
17697 * Generates a unique ID. If `prefix` is given, the ID is appended to it.
17698 *
17699 * @static
17700 * @since 0.1.0
17701 * @memberOf _
17702 * @category Util
17703 * @param {string} [prefix=''] The value to prefix the ID with.
17704 * @returns {string} Returns the unique ID.
17705 * @example
17706 *
17707 * _.uniqueId('contact_');
17708 * // => 'contact_104'
17709 *
17710 * _.uniqueId();
17711 * // => '105'
17712 */
17713 function uniqueId(prefix) {
17714 var id = ++idCounter;
17715 return toString(prefix) + id;
17716 }
17717
17718 /*------------------------------------------------------------------------*/
17719
17720 /**
17721 * Adds two numbers.
17722 *
17723 * @static
17724 * @memberOf _
17725 * @since 3.4.0
17726 * @category Math
17727 * @param {number} augend The first number in an addition.
17728 * @param {number} addend The second number in an addition.
17729 * @returns {number} Returns the total.
17730 * @example
17731 *
17732 * _.add(6, 4);
17733 * // => 10
17734 */
17735 var add = createMathOperation(function(augend, addend) {
17736 return augend + addend;
17737 }, 0);
17738
17739 /**
17740 * Computes `number` rounded up to `precision`.
17741 *
17742 * @static
17743 * @memberOf _
17744 * @since 3.10.0
17745 * @category Math
17746 * @param {number} number The number to round up.
17747 * @param {number} [precision=0] The precision to round up to.
17748 * @returns {number} Returns the rounded up number.
17749 * @example
17750 *
17751 * _.ceil(4.006);
17752 * // => 5
17753 *
17754 * _.ceil(6.004, 2);
17755 * // => 6.01
17756 *
17757 * _.ceil(6040, -2);
17758 * // => 6100
17759 */
17760 var ceil = createRound('ceil');
17761
17762 /**
17763 * Divide two numbers.
17764 *
17765 * @static
17766 * @memberOf _
17767 * @since 4.7.0
17768 * @category Math
17769 * @param {number} dividend The first number in a division.
17770 * @param {number} divisor The second number in a division.
17771 * @returns {number} Returns the quotient.
17772 * @example
17773 *
17774 * _.divide(6, 4);
17775 * // => 1.5
17776 */
17777 var divide = createMathOperation(function(dividend, divisor) {
17778 return dividend / divisor;
17779 }, 1);
17780
17781 /**
17782 * Computes `number` rounded down to `precision`.
17783 *
17784 * @static
17785 * @memberOf _
17786 * @since 3.10.0
17787 * @category Math
17788 * @param {number} number The number to round down.
17789 * @param {number} [precision=0] The precision to round down to.
17790 * @returns {number} Returns the rounded down number.
17791 * @example
17792 *
17793 * _.floor(4.006);
17794 * // => 4
17795 *
17796 * _.floor(0.046, 2);
17797 * // => 0.04
17798 *
17799 * _.floor(4060, -2);
17800 * // => 4000
17801 */
17802 var floor = createRound('floor');
17803
17804 /**
17805 * Computes the maximum value of `array`. If `array` is empty or falsey,
17806 * `undefined` is returned.
17807 *
17808 * @static
17809 * @since 0.1.0
17810 * @memberOf _
17811 * @category Math
17812 * @param {Array} array The array to iterate over.
17813 * @returns {*} Returns the maximum value.
17814 * @example
17815 *
17816 * _.max([4, 2, 8, 6]);
17817 * // => 8
17818 *
17819 * _.max([]);
17820 * // => undefined
17821 */
17822 function max(array) {
17823 return (array && array.length)
17824 ? baseExtremum(array, identity, baseGt)
17825 : undefined;
17826 }
17827
17828 /**
17829 * This method is like `_.max` except that it accepts `iteratee` which is
17830 * invoked for each element in `array` to generate the criterion by which
17831 * the value is ranked. The iteratee is invoked with one argument: (value).
17832 *
17833 * @static
17834 * @memberOf _
17835 * @since 4.0.0
17836 * @category Math
17837 * @param {Array} array The array to iterate over.
17838 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17839 * @returns {*} Returns the maximum value.
17840 * @example
17841 *
17842 * var objects = [{ 'n': 1 }, { 'n': 2 }];
17843 *
17844 * _.maxBy(objects, function(o) { return o.n; });
17845 * // => { 'n': 2 }
17846 *
17847 * // The `_.property` iteratee shorthand.
17848 * _.maxBy(objects, 'n');
17849 * // => { 'n': 2 }
17850 */
17851 function maxBy(array, iteratee) {
17852 return (array && array.length)
17853 ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
17854 : undefined;
17855 }
17856
17857 /**
17858 * Computes the mean of the values in `array`.
17859 *
17860 * @static
17861 * @memberOf _
17862 * @since 4.0.0
17863 * @category Math
17864 * @param {Array} array The array to iterate over.
17865 * @returns {number} Returns the mean.
17866 * @example
17867 *
17868 * _.mean([4, 2, 8, 6]);
17869 * // => 5
17870 */
17871 function mean(array) {
17872 return baseMean(array, identity);
17873 }
17874
17875 /**
17876 * This method is like `_.mean` except that it accepts `iteratee` which is
17877 * invoked for each element in `array` to generate the value to be averaged.
17878 * The iteratee is invoked with one argument: (value).
17879 *
17880 * @static
17881 * @memberOf _
17882 * @since 4.7.0
17883 * @category Math
17884 * @param {Array} array The array to iterate over.
17885 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17886 * @returns {number} Returns the mean.
17887 * @example
17888 *
17889 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
17890 *
17891 * _.meanBy(objects, function(o) { return o.n; });
17892 * // => 5
17893 *
17894 * // The `_.property` iteratee shorthand.
17895 * _.meanBy(objects, 'n');
17896 * // => 5
17897 */
17898 function meanBy(array, iteratee) {
17899 return baseMean(array, getIteratee(iteratee, 2));
17900 }
17901
17902 /**
17903 * Computes the minimum value of `array`. If `array` is empty or falsey,
17904 * `undefined` is returned.
17905 *
17906 * @static
17907 * @since 0.1.0
17908 * @memberOf _
17909 * @category Math
17910 * @param {Array} array The array to iterate over.
17911 * @returns {*} Returns the minimum value.
17912 * @example
17913 *
17914 * _.min([4, 2, 8, 6]);
17915 * // => 2
17916 *
17917 * _.min([]);
17918 * // => undefined
17919 */
17920 function min(array) {
17921 return (array && array.length)
17922 ? baseExtremum(array, identity, baseLt)
17923 : undefined;
17924 }
17925
17926 /**
17927 * This method is like `_.min` except that it accepts `iteratee` which is
17928 * invoked for each element in `array` to generate the criterion by which
17929 * the value is ranked. The iteratee is invoked with one argument: (value).
17930 *
17931 * @static
17932 * @memberOf _
17933 * @since 4.0.0
17934 * @category Math
17935 * @param {Array} array The array to iterate over.
17936 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17937 * @returns {*} Returns the minimum value.
17938 * @example
17939 *
17940 * var objects = [{ 'n': 1 }, { 'n': 2 }];
17941 *
17942 * _.minBy(objects, function(o) { return o.n; });
17943 * // => { 'n': 1 }
17944 *
17945 * // The `_.property` iteratee shorthand.
17946 * _.minBy(objects, 'n');
17947 * // => { 'n': 1 }
17948 */
17949 function minBy(array, iteratee) {
17950 return (array && array.length)
17951 ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
17952 : undefined;
17953 }
17954
17955 /**
17956 * Multiply two numbers.
17957 *
17958 * @static
17959 * @memberOf _
17960 * @since 4.7.0
17961 * @category Math
17962 * @param {number} multiplier The first number in a multiplication.
17963 * @param {number} multiplicand The second number in a multiplication.
17964 * @returns {number} Returns the product.
17965 * @example
17966 *
17967 * _.multiply(6, 4);
17968 * // => 24
17969 */
17970 var multiply = createMathOperation(function(multiplier, multiplicand) {
17971 return multiplier * multiplicand;
17972 }, 1);
17973
17974 /**
17975 * Computes `number` rounded to `precision`.
17976 *
17977 * @static
17978 * @memberOf _
17979 * @since 3.10.0
17980 * @category Math
17981 * @param {number} number The number to round.
17982 * @param {number} [precision=0] The precision to round to.
17983 * @returns {number} Returns the rounded number.
17984 * @example
17985 *
17986 * _.round(4.006);
17987 * // => 4
17988 *
17989 * _.round(4.006, 2);
17990 * // => 4.01
17991 *
17992 * _.round(4060, -2);
17993 * // => 4100
17994 */
17995 var round = createRound('round');
17996
17997 /**
17998 * Subtract two numbers.
17999 *
18000 * @static
18001 * @memberOf _
18002 * @since 4.0.0
18003 * @category Math
18004 * @param {number} minuend The first number in a subtraction.
18005 * @param {number} subtrahend The second number in a subtraction.
18006 * @returns {number} Returns the difference.
18007 * @example
18008 *
18009 * _.subtract(6, 4);
18010 * // => 2
18011 */
18012 var subtract = createMathOperation(function(minuend, subtrahend) {
18013 return minuend - subtrahend;
18014 }, 0);
18015
18016 /**
18017 * Computes the sum of the values in `array`.
18018 *
18019 * @static
18020 * @memberOf _
18021 * @since 3.4.0
18022 * @category Math
18023 * @param {Array} array The array to iterate over.
18024 * @returns {number} Returns the sum.
18025 * @example
18026 *
18027 * _.sum([4, 2, 8, 6]);
18028 * // => 20
18029 */
18030 function sum(array) {
18031 return (array && array.length)
18032 ? baseSum(array, identity)
18033 : 0;
18034 }
18035
18036 /**
18037 * This method is like `_.sum` except that it accepts `iteratee` which is
18038 * invoked for each element in `array` to generate the value to be summed.
18039 * The iteratee is invoked with one argument: (value).
18040 *
18041 * @static
18042 * @memberOf _
18043 * @since 4.0.0
18044 * @category Math
18045 * @param {Array} array The array to iterate over.
18046 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
18047 * @returns {number} Returns the sum.
18048 * @example
18049 *
18050 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
18051 *
18052 * _.sumBy(objects, function(o) { return o.n; });
18053 * // => 20
18054 *
18055 * // The `_.property` iteratee shorthand.
18056 * _.sumBy(objects, 'n');
18057 * // => 20
18058 */
18059 function sumBy(array, iteratee) {
18060 return (array && array.length)
18061 ? baseSum(array, getIteratee(iteratee, 2))
18062 : 0;
18063 }
18064
18065 /*------------------------------------------------------------------------*/
18066
18067 // Add methods that return wrapped values in chain sequences.
18068 lodash.after = after;
18069 lodash.ary = ary;
18070 lodash.assign = assign;
18071 lodash.assignIn = assignIn;
18072 lodash.assignInWith = assignInWith;
18073 lodash.assignWith = assignWith;
18074 lodash.at = at;
18075 lodash.before = before;
18076 lodash.bind = bind;
18077 lodash.bindAll = bindAll;
18078 lodash.bindKey = bindKey;
18079 lodash.castArray = castArray;
18080 lodash.chain = chain;
18081 lodash.chunk = chunk;
18082 lodash.compact = compact;
18083 lodash.concat = concat;
18084 lodash.cond = cond;
18085 lodash.conforms = conforms;
18086 lodash.constant = constant;
18087 lodash.countBy = countBy;
18088 lodash.create = create;
18089 lodash.curry = curry;
18090 lodash.curryRight = curryRight;
18091 lodash.debounce = debounce;
18092 lodash.defaults = defaults;
18093 lodash.defaultsDeep = defaultsDeep;
18094 lodash.defer = defer;
18095 lodash.delay = delay;
18096 lodash.difference = difference;
18097 lodash.differenceBy = differenceBy;
18098 lodash.differenceWith = differenceWith;
18099 lodash.drop = drop;
18100 lodash.dropRight = dropRight;
18101 lodash.dropRightWhile = dropRightWhile;
18102 lodash.dropWhile = dropWhile;
18103 lodash.fill = fill;
18104 lodash.filter = filter;
18105 lodash.flatMap = flatMap;
18106 lodash.flatMapDeep = flatMapDeep;
18107 lodash.flatMapDepth = flatMapDepth;
18108 lodash.flatten = flatten;
18109 lodash.flattenDeep = flattenDeep;
18110 lodash.flattenDepth = flattenDepth;
18111 lodash.flip = flip;
18112 lodash.flow = flow;
18113 lodash.flowRight = flowRight;
18114 lodash.fromPairs = fromPairs;
18115 lodash.functions = functions;
18116 lodash.functionsIn = functionsIn;
18117 lodash.groupBy = groupBy;
18118 lodash.initial = initial;
18119 lodash.intersection = intersection;
18120 lodash.intersectionBy = intersectionBy;
18121 lodash.intersectionWith = intersectionWith;
18122 lodash.invert = invert;
18123 lodash.invertBy = invertBy;
18124 lodash.invokeMap = invokeMap;
18125 lodash.iteratee = iteratee;
18126 lodash.keyBy = keyBy;
18127 lodash.keys = keys;
18128 lodash.keysIn = keysIn;
18129 lodash.map = map;
18130 lodash.mapKeys = mapKeys;
18131 lodash.mapValues = mapValues;
18132 lodash.matches = matches;
18133 lodash.matchesProperty = matchesProperty;
18134 lodash.memoize = memoize;
18135 lodash.merge = merge;
18136 lodash.mergeWith = mergeWith;
18137 lodash.method = method;
18138 lodash.methodOf = methodOf;
18139 lodash.mixin = mixin;
18140 lodash.negate = negate;
18141 lodash.nthArg = nthArg;
18142 lodash.omit = omit;
18143 lodash.omitBy = omitBy;
18144 lodash.once = once;
18145 lodash.orderBy = orderBy;
18146 lodash.over = over;
18147 lodash.overArgs = overArgs;
18148 lodash.overEvery = overEvery;
18149 lodash.overSome = overSome;
18150 lodash.partial = partial;
18151 lodash.partialRight = partialRight;
18152 lodash.partition = partition;
18153 lodash.pick = pick;
18154 lodash.pickBy = pickBy;
18155 lodash.property = property;
18156 lodash.propertyOf = propertyOf;
18157 lodash.pull = pull;
18158 lodash.pullAll = pullAll;
18159 lodash.pullAllBy = pullAllBy;
18160 lodash.pullAllWith = pullAllWith;
18161 lodash.pullAt = pullAt;
18162 lodash.range = range;
18163 lodash.rangeRight = rangeRight;
18164 lodash.rearg = rearg;
18165 lodash.reject = reject;
18166 lodash.remove = remove;
18167 lodash.rest = rest;
18168 lodash.reverse = reverse;
18169 lodash.sampleSize = sampleSize;
18170 lodash.set = set;
18171 lodash.setWith = setWith;
18172 lodash.shuffle = shuffle;
18173 lodash.slice = slice;
18174 lodash.sortBy = sortBy;
18175 lodash.sortedUniq = sortedUniq;
18176 lodash.sortedUniqBy = sortedUniqBy;
18177 lodash.split = split;
18178 lodash.spread = spread;
18179 lodash.tail = tail;
18180 lodash.take = take;
18181 lodash.takeRight = takeRight;
18182 lodash.takeRightWhile = takeRightWhile;
18183 lodash.takeWhile = takeWhile;
18184 lodash.tap = tap;
18185 lodash.throttle = throttle;
18186 lodash.thru = thru;
18187 lodash.toArray = toArray;
18188 lodash.toPairs = toPairs;
18189 lodash.toPairsIn = toPairsIn;
18190 lodash.toPath = toPath;
18191 lodash.toPlainObject = toPlainObject;
18192 lodash.transform = transform;
18193 lodash.unary = unary;
18194 lodash.union = union;
18195 lodash.unionBy = unionBy;
18196 lodash.unionWith = unionWith;
18197 lodash.uniq = uniq;
18198 lodash.uniqBy = uniqBy;
18199 lodash.uniqWith = uniqWith;
18200 lodash.unset = unset;
18201 lodash.unzip = unzip;
18202 lodash.unzipWith = unzipWith;
18203 lodash.update = update;
18204 lodash.updateWith = updateWith;
18205 lodash.values = values;
18206 lodash.valuesIn = valuesIn;
18207 lodash.without = without;
18208 lodash.words = words;
18209 lodash.wrap = wrap;
18210 lodash.xor = xor;
18211 lodash.xorBy = xorBy;
18212 lodash.xorWith = xorWith;
18213 lodash.zip = zip;
18214 lodash.zipObject = zipObject;
18215 lodash.zipObjectDeep = zipObjectDeep;
18216 lodash.zipWith = zipWith;
18217
18218 // Add aliases.
18219 lodash.entries = toPairs;
18220 lodash.entriesIn = toPairsIn;
18221 lodash.extend = assignIn;
18222 lodash.extendWith = assignInWith;
18223
18224 // Add methods to `lodash.prototype`.
18225 mixin(lodash, lodash);
18226
18227 /*------------------------------------------------------------------------*/
18228
18229 // Add methods that return unwrapped values in chain sequences.
18230 lodash.add = add;
18231 lodash.attempt = attempt;
18232 lodash.camelCase = camelCase;
18233 lodash.capitalize = capitalize;
18234 lodash.ceil = ceil;
18235 lodash.clamp = clamp;
18236 lodash.clone = clone;
18237 lodash.cloneDeep = cloneDeep;
18238 lodash.cloneDeepWith = cloneDeepWith;
18239 lodash.cloneWith = cloneWith;
18240 lodash.conformsTo = conformsTo;
18241 lodash.deburr = deburr;
18242 lodash.defaultTo = defaultTo;
18243 lodash.divide = divide;
18244 lodash.endsWith = endsWith;
18245 lodash.eq = eq;
18246 lodash.escape = escape;
18247 lodash.escapeRegExp = escapeRegExp;
18248 lodash.every = every;
18249 lodash.find = find;
18250 lodash.findIndex = findIndex;
18251 lodash.findKey = findKey;
18252 lodash.findLast = findLast;
18253 lodash.findLastIndex = findLastIndex;
18254 lodash.findLastKey = findLastKey;
18255 lodash.floor = floor;
18256 lodash.forEach = forEach;
18257 lodash.forEachRight = forEachRight;
18258 lodash.forIn = forIn;
18259 lodash.forInRight = forInRight;
18260 lodash.forOwn = forOwn;
18261 lodash.forOwnRight = forOwnRight;
18262 lodash.get = get;
18263 lodash.gt = gt;
18264 lodash.gte = gte;
18265 lodash.has = has;
18266 lodash.hasIn = hasIn;
18267 lodash.head = head;
18268 lodash.identity = identity;
18269 lodash.includes = includes;
18270 lodash.indexOf = indexOf;
18271 lodash.inRange = inRange;
18272 lodash.invoke = invoke;
18273 lodash.isArguments = isArguments;
18274 lodash.isArray = isArray;
18275 lodash.isArrayBuffer = isArrayBuffer;
18276 lodash.isArrayLike = isArrayLike;
18277 lodash.isArrayLikeObject = isArrayLikeObject;
18278 lodash.isBoolean = isBoolean;
18279 lodash.isBuffer = isBuffer;
18280 lodash.isDate = isDate;
18281 lodash.isElement = isElement;
18282 lodash.isEmpty = isEmpty;
18283 lodash.isEqual = isEqual;
18284 lodash.isEqualWith = isEqualWith;
18285 lodash.isError = isError;
18286 lodash.isFinite = isFinite;
18287 lodash.isFunction = isFunction;
18288 lodash.isInteger = isInteger;
18289 lodash.isLength = isLength;
18290 lodash.isMap = isMap;
18291 lodash.isMatch = isMatch;
18292 lodash.isMatchWith = isMatchWith;
18293 lodash.isNaN = isNaN;
18294 lodash.isNative = isNative;
18295 lodash.isNil = isNil;
18296 lodash.isNull = isNull;
18297 lodash.isNumber = isNumber;
18298 lodash.isObject = isObject;
18299 lodash.isObjectLike = isObjectLike;
18300 lodash.isPlainObject = isPlainObject;
18301 lodash.isRegExp = isRegExp;
18302 lodash.isSafeInteger = isSafeInteger;
18303 lodash.isSet = isSet;
18304 lodash.isString = isString;
18305 lodash.isSymbol = isSymbol;
18306 lodash.isTypedArray = isTypedArray;
18307 lodash.isUndefined = isUndefined;
18308 lodash.isWeakMap = isWeakMap;
18309 lodash.isWeakSet = isWeakSet;
18310 lodash.join = join;
18311 lodash.kebabCase = kebabCase;
18312 lodash.last = last;
18313 lodash.lastIndexOf = lastIndexOf;
18314 lodash.lowerCase = lowerCase;
18315 lodash.lowerFirst = lowerFirst;
18316 lodash.lt = lt;
18317 lodash.lte = lte;
18318 lodash.max = max;
18319 lodash.maxBy = maxBy;
18320 lodash.mean = mean;
18321 lodash.meanBy = meanBy;
18322 lodash.min = min;
18323 lodash.minBy = minBy;
18324 lodash.stubArray = stubArray;
18325 lodash.stubFalse = stubFalse;
18326 lodash.stubObject = stubObject;
18327 lodash.stubString = stubString;
18328 lodash.stubTrue = stubTrue;
18329 lodash.multiply = multiply;
18330 lodash.nth = nth;
18331 lodash.noConflict = noConflict;
18332 lodash.noop = noop;
18333 lodash.now = now;
18334 lodash.pad = pad;
18335 lodash.padEnd = padEnd;
18336 lodash.padStart = padStart;
18337 lodash.parseInt = parseInt;
18338 lodash.random = random;
18339 lodash.reduce = reduce;
18340 lodash.reduceRight = reduceRight;
18341 lodash.repeat = repeat;
18342 lodash.replace = replace;
18343 lodash.result = result;
18344 lodash.round = round;
18345 lodash.runInContext = runInContext;
18346 lodash.sample = sample;
18347 lodash.size = size;
18348 lodash.snakeCase = snakeCase;
18349 lodash.some = some;
18350 lodash.sortedIndex = sortedIndex;
18351 lodash.sortedIndexBy = sortedIndexBy;
18352 lodash.sortedIndexOf = sortedIndexOf;
18353 lodash.sortedLastIndex = sortedLastIndex;
18354 lodash.sortedLastIndexBy = sortedLastIndexBy;
18355 lodash.sortedLastIndexOf = sortedLastIndexOf;
18356 lodash.startCase = startCase;
18357 lodash.startsWith = startsWith;
18358 lodash.subtract = subtract;
18359 lodash.sum = sum;
18360 lodash.sumBy = sumBy;
18361 lodash.template = template;
18362 lodash.times = times;
18363 lodash.toFinite = toFinite;
18364 lodash.toInteger = toInteger;
18365 lodash.toLength = toLength;
18366 lodash.toLower = toLower;
18367 lodash.toNumber = toNumber;
18368 lodash.toSafeInteger = toSafeInteger;
18369 lodash.toString = toString;
18370 lodash.toUpper = toUpper;
18371 lodash.trim = trim;
18372 lodash.trimEnd = trimEnd;
18373 lodash.trimStart = trimStart;
18374 lodash.truncate = truncate;
18375 lodash.unescape = unescape;
18376 lodash.uniqueId = uniqueId;
18377 lodash.upperCase = upperCase;
18378 lodash.upperFirst = upperFirst;
18379
18380 // Add aliases.
18381 lodash.each = forEach;
18382 lodash.eachRight = forEachRight;
18383 lodash.first = head;
18384
18385 mixin(lodash, (function() {
18386 var source = {};
18387 baseForOwn(lodash, function(func, methodName) {
18388 if (!hasOwnProperty.call(lodash.prototype, methodName)) {
18389 source[methodName] = func;
18390 }
18391 });
18392 return source;
18393 }()), { 'chain': false });
18394
18395 /*------------------------------------------------------------------------*/
18396
18397 /**
18398 * The semantic version number.
18399 *
18400 * @static
18401 * @memberOf _
18402 * @type {string}
18403 */
18404 lodash.VERSION = VERSION;
18405
18406 // Assign default placeholders.
18407 arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
18408 lodash[methodName].placeholder = lodash;
18409 });
18410
18411 // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
18412 arrayEach(['drop', 'take'], function(methodName, index) {
18413 LazyWrapper.prototype[methodName] = function(n) {
18414 n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
18415
18416 var result = (this.__filtered__ && !index)
18417 ? new LazyWrapper(this)
18418 : this.clone();
18419
18420 if (result.__filtered__) {
18421 result.__takeCount__ = nativeMin(n, result.__takeCount__);
18422 } else {
18423 result.__views__.push({
18424 'size': nativeMin(n, MAX_ARRAY_LENGTH),
18425 'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
18426 });
18427 }
18428 return result;
18429 };
18430
18431 LazyWrapper.prototype[methodName + 'Right'] = function(n) {
18432 return this.reverse()[methodName](n).reverse();
18433 };
18434 });
18435
18436 // Add `LazyWrapper` methods that accept an `iteratee` value.
18437 arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
18438 var type = index + 1,
18439 isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
18440
18441 LazyWrapper.prototype[methodName] = function(iteratee) {
18442 var result = this.clone();
18443 result.__iteratees__.push({
18444 'iteratee': getIteratee(iteratee, 3),
18445 'type': type
18446 });
18447 result.__filtered__ = result.__filtered__ || isFilter;
18448 return result;
18449 };
18450 });
18451
18452 // Add `LazyWrapper` methods for `_.head` and `_.last`.
18453 arrayEach(['head', 'last'], function(methodName, index) {
18454 var takeName = 'take' + (index ? 'Right' : '');
18455
18456 LazyWrapper.prototype[methodName] = function() {
18457 return this[takeName](1).value()[0];
18458 };
18459 });
18460
18461 // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
18462 arrayEach(['initial', 'tail'], function(methodName, index) {
18463 var dropName = 'drop' + (index ? '' : 'Right');
18464
18465 LazyWrapper.prototype[methodName] = function() {
18466 return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
18467 };
18468 });
18469
18470 LazyWrapper.prototype.compact = function() {
18471 return this.filter(identity);
18472 };
18473
18474 LazyWrapper.prototype.find = function(predicate) {
18475 return this.filter(predicate).head();
18476 };
18477
18478 LazyWrapper.prototype.findLast = function(predicate) {
18479 return this.reverse().find(predicate);
18480 };
18481
18482 LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
18483 if (typeof path == 'function') {
18484 return new LazyWrapper(this);
18485 }
18486 return this.map(function(value) {
18487 return baseInvoke(value, path, args);
18488 });
18489 });
18490
18491 LazyWrapper.prototype.reject = function(predicate) {
18492 return this.filter(negate(getIteratee(predicate)));
18493 };
18494
18495 LazyWrapper.prototype.slice = function(start, end) {
18496 start = toInteger(start);
18497
18498 var result = this;
18499 if (result.__filtered__ && (start > 0 || end < 0)) {
18500 return new LazyWrapper(result);
18501 }
18502 if (start < 0) {
18503 result = result.takeRight(-start);
18504 } else if (start) {
18505 result = result.drop(start);
18506 }
18507 if (end !== undefined) {
18508 end = toInteger(end);
18509 result = end < 0 ? result.dropRight(-end) : result.take(end - start);
18510 }
18511 return result;
18512 };
18513
18514 LazyWrapper.prototype.takeRightWhile = function(predicate) {
18515 return this.reverse().takeWhile(predicate).reverse();
18516 };
18517
18518 LazyWrapper.prototype.toArray = function() {
18519 return this.take(MAX_ARRAY_LENGTH);
18520 };
18521
18522 // Add `LazyWrapper` methods to `lodash.prototype`.
18523 baseForOwn(LazyWrapper.prototype, function(func, methodName) {
18524 var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
18525 isTaker = /^(?:head|last)$/.test(methodName),
18526 lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
18527 retUnwrapped = isTaker || /^find/.test(methodName);
18528
18529 if (!lodashFunc) {
18530 return;
18531 }
18532 lodash.prototype[methodName] = function() {
18533 var value = this.__wrapped__,
18534 args = isTaker ? [1] : arguments,
18535 isLazy = value instanceof LazyWrapper,
18536 iteratee = args[0],
18537 useLazy = isLazy || isArray(value);
18538
18539 var interceptor = function(value) {
18540 var result = lodashFunc.apply(lodash, arrayPush([value], args));
18541 return (isTaker && chainAll) ? result[0] : result;
18542 };
18543
18544 if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
18545 // Avoid lazy use if the iteratee has a "length" value other than `1`.
18546 isLazy = useLazy = false;
18547 }
18548 var chainAll = this.__chain__,
18549 isHybrid = !!this.__actions__.length,
18550 isUnwrapped = retUnwrapped && !chainAll,
18551 onlyLazy = isLazy && !isHybrid;
18552
18553 if (!retUnwrapped && useLazy) {
18554 value = onlyLazy ? value : new LazyWrapper(this);
18555 var result = func.apply(value, args);
18556 result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
18557 return new LodashWrapper(result, chainAll);
18558 }
18559 if (isUnwrapped && onlyLazy) {
18560 return func.apply(this, args);
18561 }
18562 result = this.thru(interceptor);
18563 return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
18564 };
18565 });
18566
18567 // Add `Array` methods to `lodash.prototype`.
18568 arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
18569 var func = arrayProto[methodName],
18570 chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
18571 retUnwrapped = /^(?:pop|shift)$/.test(methodName);
18572
18573 lodash.prototype[methodName] = function() {
18574 var args = arguments;
18575 if (retUnwrapped && !this.__chain__) {
18576 var value = this.value();
18577 return func.apply(isArray(value) ? value : [], args);
18578 }
18579 return this[chainName](function(value) {
18580 return func.apply(isArray(value) ? value : [], args);
18581 });
18582 };
18583 });
18584
18585 // Map minified method names to their real names.
18586 baseForOwn(LazyWrapper.prototype, function(func, methodName) {
18587 var lodashFunc = lodash[methodName];
18588 if (lodashFunc) {
18589 var key = lodashFunc.name + '';
18590 if (!hasOwnProperty.call(realNames, key)) {
18591 realNames[key] = [];
18592 }
18593 realNames[key].push({ 'name': methodName, 'func': lodashFunc });
18594 }
18595 });
18596
18597 realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
18598 'name': 'wrapper',
18599 'func': undefined
18600 }];
18601
18602 // Add methods to `LazyWrapper`.
18603 LazyWrapper.prototype.clone = lazyClone;
18604 LazyWrapper.prototype.reverse = lazyReverse;
18605 LazyWrapper.prototype.value = lazyValue;
18606
18607 // Add chain sequence methods to the `lodash` wrapper.
18608 lodash.prototype.at = wrapperAt;
18609 lodash.prototype.chain = wrapperChain;
18610 lodash.prototype.commit = wrapperCommit;
18611 lodash.prototype.next = wrapperNext;
18612 lodash.prototype.plant = wrapperPlant;
18613 lodash.prototype.reverse = wrapperReverse;
18614 lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
18615
18616 // Add lazy aliases.
18617 lodash.prototype.first = lodash.prototype.head;
18618
18619 if (symIterator) {
18620 lodash.prototype[symIterator] = wrapperToIterator;
18621 }
18622 return lodash;
18623 });
18624
18625 /*--------------------------------------------------------------------------*/
18626
18627 // Export lodash.
18628 var _ = runInContext();
18629
18630 // Some AMD build optimizers, like r.js, check for condition patterns like:
18631 if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
18632 // Expose Lodash on the global object to prevent errors when Lodash is
18633 // loaded by a script tag in the presence of an AMD loader.
18634 // See http://requirejs.org/docs/errors.html#mismatch for more details.
18635 // Use `_.noConflict` to remove Lodash from the global object.
18636 root._ = _;
18637
18638 // Define as an anonymous module so, through path mapping, it can be
18639 // referenced as the "underscore" module.
18640 define(function() {
18641 return _;
18642 });
18643 }
18644 // Check for `exports` after `define` in case a build optimizer adds it.
18645 else if (freeModule) {
18646 // Export for Node.js.
18647 (freeModule.exports = _)._ = _;
18648 // Export for CommonJS support.
18649 freeExports._ = _;
18650 }
18651 else {
18652 // Export to the global object.
18653 root._ = _;
18654 }
18655 }.call(this));
18656
18657 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
18658 },{}],17:[function(require,module,exports){
18659 /*
18660 * Lexical analysis and token construction.
18661 */
18662
18663 "use strict";
18664
18665 var _ = require("lodash");
18666 var events = require("events");
18667 var reg = require("./reg.js");
18668 var state = require("./state.js").state;
18669
18670 var unicodeData = require("../data/ascii-identifier-data.js");
18671 var asciiIdentifierStartTable = unicodeData.asciiIdentifierStartTable;
18672 var asciiIdentifierPartTable = unicodeData.asciiIdentifierPartTable;
18673 var nonAsciiIdentifierStartTable = require("../data/non-ascii-identifier-start.js");
18674 var nonAsciiIdentifierPartTable = require("../data/non-ascii-identifier-part-only.js");
18675 // Loading of this module is deferred as an optimization for ES2015 input
18676 var es5IdentifierNames;
18677
18678 // Some of these token types are from JavaScript Parser API
18679 // while others are specific to JSHint parser.
18680 // JS Parser API: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
18681
18682 var Token = {
18683 Identifier: 1,
18684 Punctuator: 2,
18685 NumericLiteral: 3,
18686 StringLiteral: 4,
18687 Comment: 5,
18688 Keyword: 6,
18689 RegExp: 9,
18690 TemplateHead: 10,
18691 TemplateMiddle: 11,
18692 TemplateTail: 12,
18693 NoSubstTemplate: 13
18694 };
18695
18696 var Context = {
18697 Block: 1,
18698 Template: 2
18699 };
18700
18701 function isHex(str) {
18702 return /^[0-9a-fA-F]+$/.test(str);
18703 }
18704
18705 function isHexDigit(str) {
18706 return str.length === 1 && isHex(str);
18707 }
18708
18709 // Object that handles postponed lexing verifications that checks the parsed
18710 // environment state.
18711
18712 function asyncTrigger() {
18713 var _checks = [];
18714
18715 return {
18716 push: function(fn) {
18717 _checks.push(fn);
18718 },
18719
18720 check: function() {
18721 for (var check = 0; check < _checks.length; ++check) {
18722 _checks[check]();
18723 }
18724
18725 _checks.splice(0, _checks.length);
18726 }
18727 };
18728 }
18729
18730 /*
18731 * Lexer for JSHint.
18732 *
18733 * This object does a char-by-char scan of the provided source code
18734 * and produces a sequence of tokens.
18735 *
18736 * var lex = new Lexer("var i = 0;");
18737 * lex.start();
18738 * lex.token(); // returns the next token
18739 *
18740 * You have to use the token() method to move the lexer forward
18741 * but you don't have to use its return value to get tokens. In addition
18742 * to token() method returning the next token, the Lexer object also
18743 * emits events.
18744 *
18745 * lex.on("Identifier", function(data) {
18746 * if (data.name.indexOf("_") >= 0) {
18747 * // Produce a warning.
18748 * }
18749 * });
18750 *
18751 * Note that the token() method returns tokens in a JSLint-compatible
18752 * format while the event emitter uses a slightly modified version of
18753 * Mozilla's JavaScript Parser API. Eventually, we will move away from
18754 * JSLint format.
18755 */
18756 function Lexer(source) {
18757 var lines = source;
18758
18759 if (typeof lines === "string") {
18760 lines = lines
18761 .replace(/\r\n/g, "\n")
18762 .replace(/\r/g, "\n")
18763 .split("\n");
18764 }
18765
18766 // If the first line is a shebang (#!), make it a blank and move on.
18767 // Shebangs are used by Node scripts.
18768
18769 if (lines[0] && lines[0].substr(0, 2) === "#!") {
18770 if (lines[0].indexOf("node") !== -1) {
18771 state.option.node = true;
18772 }
18773 lines[0] = "";
18774 }
18775
18776 this.emitter = new events.EventEmitter();
18777 this.source = source;
18778 this.setLines(lines);
18779 this.prereg = true;
18780
18781 this.line = 0;
18782 this.char = 1;
18783 this.from = 1;
18784 this.input = "";
18785 this.inComment = false;
18786 this.context = [];
18787 this.templateStarts = [];
18788
18789 for (var i = 0; i < state.option.indent; i += 1) {
18790 state.tab += " ";
18791 }
18792 }
18793
18794 Lexer.prototype = {
18795 _lines: [],
18796
18797 inContext: function(ctxType) {
18798 return this.context.length > 0 && this.context[this.context.length - 1].type === ctxType;
18799 },
18800
18801 pushContext: function(ctxType) {
18802 this.context.push({ type: ctxType });
18803 },
18804
18805 popContext: function() {
18806 return this.context.pop();
18807 },
18808
18809 currentContext: function() {
18810 return this.context.length > 0 && this.context[this.context.length - 1];
18811 },
18812
18813 getLines: function() {
18814 this._lines = state.lines;
18815 return this._lines;
18816 },
18817
18818 setLines: function(val) {
18819 this._lines = val;
18820 state.lines = this._lines;
18821 },
18822
18823 /*
18824 * Return the next i character without actually moving the
18825 * char pointer.
18826 */
18827 peek: function(i) {
18828 return this.input.charAt(i || 0);
18829 },
18830
18831 /*
18832 * Move the char pointer forward i times.
18833 */
18834 skip: function(i) {
18835 i = i || 1;
18836 this.char += i;
18837 this.input = this.input.slice(i);
18838 },
18839
18840 /*
18841 * Subscribe to a token event. The API for this method is similar
18842 * Underscore.js i.e. you can subscribe to multiple events with
18843 * one call:
18844 *
18845 * lex.on("Identifier Number", function(data) {
18846 * // ...
18847 * });
18848 */
18849 on: function(names, listener) {
18850 names.split(" ").forEach(function(name) {
18851 this.emitter.on(name, listener);
18852 }.bind(this));
18853 },
18854
18855 /*
18856 * Trigger a token event. All arguments will be passed to each
18857 * listener.
18858 */
18859 trigger: function() {
18860 this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments));
18861 },
18862
18863 /*
18864 * Postpone a token event. the checking condition is set as
18865 * last parameter, and the trigger function is called in a
18866 * stored callback. To be later called using the check() function
18867 * by the parser. This avoids parser's peek() to give the lexer
18868 * a false context.
18869 */
18870 triggerAsync: function(type, args, checks, fn) {
18871 checks.push(function() {
18872 if (fn()) {
18873 this.trigger(type, args);
18874 }
18875 }.bind(this));
18876 },
18877
18878 /*
18879 * Extract a punctuator out of the next sequence of characters
18880 * or return 'null' if its not possible.
18881 *
18882 * This method's implementation was heavily influenced by the
18883 * scanPunctuator function in the Esprima parser's source code.
18884 */
18885 scanPunctuator: function() {
18886 var ch1 = this.peek();
18887 var ch2, ch3, ch4;
18888
18889 switch (ch1) {
18890 // Most common single-character punctuators
18891 case ".":
18892 if ((/^[0-9]$/).test(this.peek(1))) {
18893 return null;
18894 }
18895 if (this.peek(1) === "." && this.peek(2) === ".") {
18896 return {
18897 type: Token.Punctuator,
18898 value: "..."
18899 };
18900 }
18901 /* falls through */
18902 case "(":
18903 case ")":
18904 case ";":
18905 case ",":
18906 case "[":
18907 case "]":
18908 case ":":
18909 case "~":
18910 case "?":
18911 return {
18912 type: Token.Punctuator,
18913 value: ch1
18914 };
18915
18916 // A block/object opener
18917 case "{":
18918 this.pushContext(Context.Block);
18919 return {
18920 type: Token.Punctuator,
18921 value: ch1
18922 };
18923
18924 // A block/object closer
18925 case "}":
18926 if (this.inContext(Context.Block)) {
18927 this.popContext();
18928 }
18929 return {
18930 type: Token.Punctuator,
18931 value: ch1
18932 };
18933
18934 // A pound sign (for Node shebangs)
18935 case "#":
18936 return {
18937 type: Token.Punctuator,
18938 value: ch1
18939 };
18940
18941 // We're at the end of input
18942 case "":
18943 return null;
18944 }
18945
18946 // Peek more characters
18947
18948 ch2 = this.peek(1);
18949 ch3 = this.peek(2);
18950 ch4 = this.peek(3);
18951
18952 // 4-character punctuator: >>>=
18953
18954 if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") {
18955 return {
18956 type: Token.Punctuator,
18957 value: ">>>="
18958 };
18959 }
18960
18961 // 3-character punctuators: === !== >>> <<= >>=
18962
18963 if (ch1 === "=" && ch2 === "=" && ch3 === "=") {
18964 return {
18965 type: Token.Punctuator,
18966 value: "==="
18967 };
18968 }
18969
18970 if (ch1 === "!" && ch2 === "=" && ch3 === "=") {
18971 return {
18972 type: Token.Punctuator,
18973 value: "!=="
18974 };
18975 }
18976
18977 if (ch1 === ">" && ch2 === ">" && ch3 === ">") {
18978 return {
18979 type: Token.Punctuator,
18980 value: ">>>"
18981 };
18982 }
18983
18984 if (ch1 === "<" && ch2 === "<" && ch3 === "=") {
18985 return {
18986 type: Token.Punctuator,
18987 value: "<<="
18988 };
18989 }
18990
18991 if (ch1 === ">" && ch2 === ">" && ch3 === "=") {
18992 return {
18993 type: Token.Punctuator,
18994 value: ">>="
18995 };
18996 }
18997
18998 // Fat arrow punctuator
18999 if (ch1 === "=" && ch2 === ">") {
19000 return {
19001 type: Token.Punctuator,
19002 value: ch1 + ch2
19003 };
19004 }
19005
19006 // 2-character punctuators: ++ -- << >> && || **
19007 if (ch1 === ch2 && ("+-<>&|*".indexOf(ch1) >= 0)) {
19008 if (ch1 === "*" && ch3 === "=") {
19009 return {
19010 type: Token.Punctuator,
19011 value: ch1 + ch2 + ch3
19012 };
19013 }
19014
19015 return {
19016 type: Token.Punctuator,
19017 value: ch1 + ch2
19018 };
19019 }
19020
19021 // <= >= != += -= *= %= &= |= ^= /=
19022 if ("<>=!+-*%&|^/".indexOf(ch1) >= 0) {
19023 if (ch2 === "=") {
19024 return {
19025 type: Token.Punctuator,
19026 value: ch1 + ch2
19027 };
19028 }
19029
19030 return {
19031 type: Token.Punctuator,
19032 value: ch1
19033 };
19034 }
19035
19036 return null;
19037 },
19038
19039 /*
19040 * Extract a comment out of the next sequence of characters and/or
19041 * lines or return 'null' if its not possible. Since comments can
19042 * span across multiple lines this method has to move the char
19043 * pointer.
19044 *
19045 * In addition to normal JavaScript comments (// and /*) this method
19046 * also recognizes JSHint- and JSLint-specific comments such as
19047 * /*jshint, /*jslint, /*globals and so on.
19048 */
19049 scanComments: function(checks) {
19050 var ch1 = this.peek();
19051 var ch2 = this.peek(1);
19052 var rest = this.input.substr(2);
19053 var startLine = this.line;
19054 var startChar = this.char;
19055 var self = this;
19056
19057 // Create a comment token object and make sure it
19058 // has all the data JSHint needs to work with special
19059 // comments.
19060
19061 function commentToken(label, body, opt) {
19062 var special = [
19063 "jshint", "jshint.unstable", "jslint", "members", "member", "globals",
19064 "global", "exported"
19065 ];
19066 var isSpecial = false;
19067 var value = label + body;
19068 var commentType = "plain";
19069 opt = opt || {};
19070
19071 if (opt.isMultiline) {
19072 value += "*/";
19073 }
19074
19075 body = body.replace(/\n/g, " ");
19076
19077 if (label === "/*" && reg.fallsThrough.test(body)) {
19078 isSpecial = true;
19079 commentType = "falls through";
19080 }
19081
19082 special.forEach(function(str) {
19083 if (isSpecial) {
19084 return;
19085 }
19086
19087 // Don't recognize any special comments other than jshint for single-line
19088 // comments. This introduced many problems with legit comments.
19089 if (label === "//" && str !== "jshint" && str !== "jshint.unstable") {
19090 return;
19091 }
19092
19093 if (body.charAt(str.length) === " " && body.substr(0, str.length) === str) {
19094 isSpecial = true;
19095 label = label + str;
19096 body = body.substr(str.length);
19097 }
19098
19099 if (!isSpecial && body.charAt(0) === " " && body.charAt(str.length + 1) === " " &&
19100 body.substr(1, str.length) === str) {
19101 isSpecial = true;
19102 label = label + " " + str;
19103 body = body.substr(str.length + 1);
19104 }
19105
19106 // To handle rarer case when special word is separated from label by
19107 // multiple spaces or tabs
19108 var strIndex = body.indexOf(str);
19109 if (!isSpecial && strIndex >= 0 && body.charAt(strIndex + str.length) === " ") {
19110 var isAllWhitespace = body.substr(0, strIndex).trim().length === 0;
19111 if (isAllWhitespace) {
19112 isSpecial = true;
19113 body = body.substr(str.length + strIndex);
19114 }
19115 }
19116
19117 if (!isSpecial) {
19118 return;
19119 }
19120
19121 switch (str) {
19122 case "member":
19123 commentType = "members";
19124 break;
19125 case "global":
19126 commentType = "globals";
19127 break;
19128 default:
19129 var options = body.split(":").map(function(v) {
19130 return v.replace(/^\s+/, "").replace(/\s+$/, "");
19131 });
19132
19133 if (options.length === 2) {
19134 switch (options[0]) {
19135 case "ignore":
19136 switch (options[1]) {
19137 case "start":
19138 self.ignoringLinterErrors = true;
19139 isSpecial = false;
19140 break;
19141 case "end":
19142 self.ignoringLinterErrors = false;
19143 isSpecial = false;
19144 break;
19145 }
19146 }
19147 }
19148
19149 commentType = str;
19150 }
19151 });
19152
19153 return {
19154 type: Token.Comment,
19155 commentType: commentType,
19156 value: value,
19157 body: body,
19158 isSpecial: isSpecial,
19159 isMalformed: opt.isMalformed || false
19160 };
19161 }
19162
19163 // End of unbegun comment. Raise an error and skip that input.
19164 if (ch1 === "*" && ch2 === "/") {
19165 this.trigger("error", {
19166 code: "E018",
19167 line: startLine,
19168 character: startChar
19169 });
19170
19171 this.skip(2);
19172 return null;
19173 }
19174
19175 // Comments must start either with // or /*
19176 if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) {
19177 return null;
19178 }
19179
19180 // One-line comment
19181 if (ch2 === "/") {
19182 this.skip(this.input.length); // Skip to the EOL.
19183 return commentToken("//", rest);
19184 }
19185
19186 var body = "";
19187
19188 /* Multi-line comment */
19189 if (ch2 === "*") {
19190 this.inComment = true;
19191 this.skip(2);
19192
19193 while (this.peek() !== "*" || this.peek(1) !== "/") {
19194 if (this.peek() === "") { // End of Line
19195 body += "\n";
19196
19197 // If we hit EOF and our comment is still unclosed,
19198 // trigger an error and end the comment implicitly.
19199 if (!this.nextLine(checks)) {
19200 this.trigger("error", {
19201 code: "E017",
19202 line: startLine,
19203 character: startChar
19204 });
19205
19206 this.inComment = false;
19207 return commentToken("/*", body, {
19208 isMultiline: true,
19209 isMalformed: true
19210 });
19211 }
19212 } else {
19213 body += this.peek();
19214 this.skip();
19215 }
19216 }
19217
19218 this.skip(2);
19219 this.inComment = false;
19220 return commentToken("/*", body, { isMultiline: true });
19221 }
19222 },
19223
19224 /*
19225 * Extract a keyword out of the next sequence of characters or
19226 * return 'null' if its not possible.
19227 */
19228 scanKeyword: function() {
19229 var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input);
19230 var keywords = [
19231 "if", "in", "do", "var", "for", "new",
19232 "try", "let", "this", "else", "case",
19233 "void", "with", "enum", "while", "break",
19234 "catch", "throw", "const", "yield", "class",
19235 "super", "return", "typeof", "delete",
19236 "switch", "export", "import", "default",
19237 "finally", "extends", "function", "continue",
19238 "debugger", "instanceof", "true", "false", "null", "async", "await"
19239 ];
19240
19241 if (result && keywords.indexOf(result[0]) >= 0) {
19242 return {
19243 type: Token.Keyword,
19244 value: result[0]
19245 };
19246 }
19247
19248 return null;
19249 },
19250
19251 /*
19252 * Extract a JavaScript identifier out of the next sequence of
19253 * characters or return 'null' if its not possible.
19254 */
19255 scanIdentifier: function(checks) {
19256 var id = "";
19257 var index = 0;
19258 var char, value;
19259
19260 function isNonAsciiIdentifierStart(code) {
19261 return nonAsciiIdentifierStartTable.indexOf(code) > -1;
19262 }
19263
19264 function isNonAsciiIdentifierPart(code) {
19265 return isNonAsciiIdentifierStart(code) || nonAsciiIdentifierPartTable.indexOf(code) > -1;
19266 }
19267
19268 var readUnicodeEscapeSequence = function() {
19269 /*jshint validthis:true */
19270 index += 1;
19271
19272 if (this.peek(index) !== "u") {
19273 return null;
19274 }
19275
19276 var sequence = this.peek(index + 1) + this.peek(index + 2) +
19277 this.peek(index + 3) + this.peek(index + 4);
19278 var code;
19279
19280 if (isHex(sequence)) {
19281 code = parseInt(sequence, 16);
19282
19283 if (asciiIdentifierPartTable[code] || isNonAsciiIdentifierPart(code)) {
19284 index += 5;
19285 return "\\u" + sequence;
19286 }
19287
19288 return null;
19289 }
19290
19291 return null;
19292 }.bind(this);
19293
19294 var getIdentifierStart = function() {
19295 /*jshint validthis:true */
19296 var chr = this.peek(index);
19297 var code = chr.charCodeAt(0);
19298
19299 if (code === 92) {
19300 return readUnicodeEscapeSequence();
19301 }
19302
19303 if (code < 128) {
19304 if (asciiIdentifierStartTable[code]) {
19305 index += 1;
19306 return chr;
19307 }
19308
19309 return null;
19310 }
19311
19312 if (isNonAsciiIdentifierStart(code)) {
19313 index += 1;
19314 return chr;
19315 }
19316
19317 return null;
19318 }.bind(this);
19319
19320 var getIdentifierPart = function() {
19321 /*jshint validthis:true */
19322 var chr = this.peek(index);
19323 var code = chr.charCodeAt(0);
19324
19325 if (code === 92) {
19326 return readUnicodeEscapeSequence();
19327 }
19328
19329 if (code < 128) {
19330 if (asciiIdentifierPartTable[code]) {
19331 index += 1;
19332 return chr;
19333 }
19334
19335 return null;
19336 }
19337
19338 if (isNonAsciiIdentifierPart(code)) {
19339 index += 1;
19340 return chr;
19341 }
19342
19343 return null;
19344 }.bind(this);
19345
19346 function removeEscapeSequences(id) {
19347 return id.replace(/\\u([0-9a-fA-F]{4})/g, function(m0, codepoint) {
19348 return String.fromCharCode(parseInt(codepoint, 16));
19349 });
19350 }
19351
19352 char = getIdentifierStart();
19353 if (char === null) {
19354 return null;
19355 }
19356
19357 id = char;
19358 for (;;) {
19359 char = getIdentifierPart();
19360
19361 if (char === null) {
19362 break;
19363 }
19364
19365 id += char;
19366 }
19367
19368 value = removeEscapeSequences(id);
19369
19370 if (!state.inES6(true)) {
19371 es5IdentifierNames = require("../data/es5-identifier-names.js");
19372
19373 if (!es5IdentifierNames.test(value)) {
19374 this.triggerAsync(
19375 "warning",
19376 {
19377 code: "W119",
19378 line: this.line,
19379 character: this.char,
19380 data: ["unicode 8", "6"]
19381 },
19382 checks,
19383 function() { return true; }
19384 );
19385 }
19386 }
19387
19388 return {
19389 type: Token.Identifier,
19390 value: value,
19391 text: id,
19392 tokenLength: id.length
19393 };
19394 },
19395
19396 /*
19397 * Extract a numeric literal out of the next sequence of
19398 * characters or return 'null' if its not possible. This method
19399 * supports all numeric literals described in section 7.8.3
19400 * of the EcmaScript 5 specification.
19401 *
19402 * This method's implementation was heavily influenced by the
19403 * scanNumericLiteral function in the Esprima parser's source code.
19404 */
19405 scanNumericLiteral: function(checks) {
19406 var index = 0;
19407 var value = "";
19408 var length = this.input.length;
19409 var char = this.peek(index);
19410 var isAllowedDigit = isDecimalDigit;
19411 var base = 10;
19412 var isLegacy = false;
19413 var isNonOctal = false;
19414
19415 function isDecimalDigit(str) {
19416 return (/^[0-9]$/).test(str);
19417 }
19418
19419 function isOctalDigit(str) {
19420 return (/^[0-7]$/).test(str);
19421 }
19422
19423 function isNonOctalDigit(str) {
19424 return str === "8" || str === "9";
19425 }
19426
19427 function isBinaryDigit(str) {
19428 return (/^[01]$/).test(str);
19429 }
19430
19431 function isIdentifierStart(ch) {
19432 return (ch === "$") || (ch === "_") || (ch === "\\") ||
19433 (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z");
19434 }
19435
19436 // Numbers must start either with a decimal digit or a point.
19437
19438 if (char !== "." && !isDecimalDigit(char)) {
19439 return null;
19440 }
19441
19442 if (char !== ".") {
19443 value = this.peek(index);
19444 index += 1;
19445 char = this.peek(index);
19446
19447 if (value === "0") {
19448 // Base-16 numbers.
19449 if (char === "x" || char === "X") {
19450 isAllowedDigit = isHexDigit;
19451 base = 16;
19452
19453 index += 1;
19454 value += char;
19455 }
19456
19457 // Base-8 numbers.
19458 if (char === "o" || char === "O") {
19459 isAllowedDigit = isOctalDigit;
19460 base = 8;
19461
19462 if (!state.inES6(true)) {
19463 this.triggerAsync(
19464 "warning",
19465 {
19466 code: "W119",
19467 line: this.line,
19468 character: this.char,
19469 data: [ "Octal integer literal", "6" ]
19470 },
19471 checks,
19472 function() { return true; }
19473 );
19474 }
19475
19476 index += 1;
19477 value += char;
19478 }
19479
19480 // Base-2 numbers.
19481 if (char === "b" || char === "B") {
19482 isAllowedDigit = isBinaryDigit;
19483 base = 2;
19484
19485 if (!state.inES6(true)) {
19486 this.triggerAsync(
19487 "warning",
19488 {
19489 code: "W119",
19490 line: this.line,
19491 character: this.char,
19492 data: [ "Binary integer literal", "6" ]
19493 },
19494 checks,
19495 function() { return true; }
19496 );
19497 }
19498
19499 index += 1;
19500 value += char;
19501 }
19502
19503 // Legacy base-8 numbers.
19504 if (isOctalDigit(char)) {
19505 isAllowedDigit = isOctalDigit;
19506 base = 8;
19507 isLegacy = true;
19508
19509 } else if (isDecimalDigit(char)) {
19510 isNonOctal = true;
19511 }
19512 }
19513
19514 while (index < length) {
19515 char = this.peek(index);
19516
19517 if (isLegacy && isNonOctalDigit(char)) {
19518 base = 10;
19519 isLegacy = false;
19520 isNonOctal = true;
19521 isAllowedDigit = isDecimalDigit;
19522 }
19523
19524 if (!isAllowedDigit(char)) {
19525 break;
19526 }
19527 value += char;
19528 index += 1;
19529 }
19530
19531 var isBigInt = this.peek(index) === 'n';
19532
19533 if (isAllowedDigit !== isDecimalDigit || isBigInt) {
19534 if (isBigInt) {
19535 if (!state.option.unstable.bigint) {
19536 this.triggerAsync(
19537 "warning",
19538 {
19539 code: "W144",
19540 line: this.line,
19541 character: this.char,
19542 data: [ "BigInt", "bigint" ]
19543 },
19544 checks,
19545 function() { return true; }
19546 );
19547 }
19548
19549 if (isLegacy || isNonOctal) {
19550 this.triggerAsync(
19551 "error",
19552 {
19553 code: "E067",
19554 line: this.line,
19555 character: this.char,
19556 data: [value + char]
19557 },
19558 checks,
19559 function() { return true; }
19560 );
19561 }
19562
19563 value += char;
19564 index += 1;
19565 } else if (!isLegacy && value.length <= 2) { // 0x
19566 return {
19567 type: Token.NumericLiteral,
19568 value: value,
19569 isMalformed: true
19570 };
19571 }
19572
19573 if (index < length) {
19574 char = this.peek(index);
19575 if (isIdentifierStart(char)) {
19576 return null;
19577 }
19578 }
19579
19580 return {
19581 type: Token.NumericLiteral,
19582 value: value,
19583 base: base,
19584 isLegacy: isLegacy,
19585 isMalformed: false
19586 };
19587 }
19588 }
19589
19590 // Decimal digits.
19591
19592 if (char === ".") {
19593 value += char;
19594 index += 1;
19595
19596 while (index < length) {
19597 char = this.peek(index);
19598 if (!isDecimalDigit(char)) {
19599 break;
19600 }
19601 value += char;
19602 index += 1;
19603 }
19604 }
19605
19606 // Exponent part.
19607
19608 if (char === "e" || char === "E") {
19609 value += char;
19610 index += 1;
19611 char = this.peek(index);
19612
19613 if (char === "+" || char === "-") {
19614 value += this.peek(index);
19615 index += 1;
19616 }
19617
19618 char = this.peek(index);
19619 if (isDecimalDigit(char)) {
19620 value += char;
19621 index += 1;
19622
19623 while (index < length) {
19624 char = this.peek(index);
19625 if (!isDecimalDigit(char)) {
19626 break;
19627 }
19628 value += char;
19629 index += 1;
19630 }
19631 } else {
19632 return null;
19633 }
19634 }
19635
19636 if (index < length) {
19637 char = this.peek(index);
19638 if (isIdentifierStart(char)) {
19639 return null;
19640 }
19641 }
19642
19643 // TODO: Extend this check to other numeric literals
19644 this.triggerAsync("warning", {
19645 code: "W045",
19646 line: this.line,
19647 character: this.char + value.length,
19648 data: [ value ]
19649 }, checks, function() { return !isFinite(value); });
19650
19651 return {
19652 type: Token.NumericLiteral,
19653 value: value,
19654 base: base,
19655 isNonOctal: isNonOctal,
19656 isMalformed: false
19657 };
19658 },
19659
19660
19661 // Assumes previously parsed character was \ (=== '\\') and was not skipped.
19662 scanEscapeSequence: function(checks) {
19663 var allowNewLine = false;
19664 var jump = 1;
19665 this.skip();
19666 var char = this.peek();
19667
19668 switch (char) {
19669 case "'":
19670 this.triggerAsync("warning", {
19671 code: "W114",
19672 line: this.line,
19673 character: this.char,
19674 data: [ "\\'" ]
19675 }, checks, function() {return state.jsonMode; });
19676 break;
19677 case "b":
19678 char = "\\b";
19679 break;
19680 case "f":
19681 char = "\\f";
19682 break;
19683 case "n":
19684 char = "\\n";
19685 break;
19686 case "r":
19687 char = "\\r";
19688 break;
19689 case "t":
19690 char = "\\t";
19691 break;
19692 case "0":
19693 char = "\\0";
19694
19695 // Octal literals fail in strict mode.
19696 // Check if the number is between 00 and 07.
19697 var n = parseInt(this.peek(1), 10);
19698 this.triggerAsync("warning", {
19699 code: "W115",
19700 line: this.line,
19701 character: this.char
19702 }, checks,
19703 function() { return n >= 0 && n <= 7 && state.isStrict(); });
19704 break;
19705 case "1":
19706 case "2":
19707 case "3":
19708 case "4":
19709 case "5":
19710 case "6":
19711 case "7":
19712 char = "\\" + char;
19713 this.triggerAsync("warning", {
19714 code: "W115",
19715 line: this.line,
19716 character: this.char
19717 }, checks,
19718 function() { return state.isStrict(); });
19719 break;
19720 case "u":
19721 var sequence = this.input.substr(1, 4);
19722 var code = parseInt(sequence, 16);
19723 if (!isHex(sequence)) {
19724 // This condition unequivocally describes a syntax error.
19725 // TODO: Re-factor as an "error" (not a "warning").
19726 this.trigger("warning", {
19727 code: "W052",
19728 line: this.line,
19729 character: this.char,
19730 data: [ "u" + sequence ]
19731 });
19732 }
19733 char = String.fromCharCode(code);
19734 jump = 5;
19735 break;
19736 case "v":
19737 this.triggerAsync("warning", {
19738 code: "W114",
19739 line: this.line,
19740 character: this.char,
19741 data: [ "\\v" ]
19742 }, checks, function() { return state.jsonMode; });
19743
19744 char = "\v";
19745 break;
19746 case "x":
19747 var x = parseInt(this.input.substr(1, 2), 16);
19748
19749 this.triggerAsync("warning", {
19750 code: "W114",
19751 line: this.line,
19752 character: this.char,
19753 data: [ "\\x-" ]
19754 }, checks, function() { return state.jsonMode; });
19755
19756 char = String.fromCharCode(x);
19757 jump = 3;
19758 break;
19759 case "\\":
19760 char = "\\\\";
19761 break;
19762 case "\"":
19763 char = "\\\"";
19764 break;
19765 case "/":
19766 break;
19767 case "":
19768 allowNewLine = true;
19769 char = "";
19770 break;
19771 }
19772
19773 return { char: char, jump: jump, allowNewLine: allowNewLine };
19774 },
19775
19776 /*
19777 * Extract a template literal out of the next sequence of characters
19778 * and/or lines or return 'null' if its not possible. Since template
19779 * literals can span across multiple lines, this method has to move
19780 * the char pointer.
19781 */
19782 scanTemplateLiteral: function(checks) {
19783 var tokenType;
19784 var value = "";
19785 var ch;
19786 var startLine = this.line;
19787 var startChar = this.char;
19788 var depth = this.templateStarts.length;
19789
19790 if (this.peek() === "`") {
19791 if (!state.inES6(true)) {
19792 this.triggerAsync(
19793 "warning",
19794 {
19795 code: "W119",
19796 line: this.line,
19797 character: this.char,
19798 data: ["template literal syntax", "6"]
19799 },
19800 checks,
19801 function() { return true; }
19802 );
19803 }
19804 // Template must start with a backtick.
19805 tokenType = Token.TemplateHead;
19806 this.templateStarts.push({ line: this.line, char: this.char });
19807 depth = this.templateStarts.length;
19808 this.skip(1);
19809 this.pushContext(Context.Template);
19810 } else if (this.inContext(Context.Template) && this.peek() === "}") {
19811 // If we're in a template context, and we have a '}', lex a TemplateMiddle.
19812 tokenType = Token.TemplateMiddle;
19813 } else {
19814 // Go lex something else.
19815 return null;
19816 }
19817
19818 while (this.peek() !== "`") {
19819 while ((ch = this.peek()) === "") {
19820 value += "\n";
19821 if (!this.nextLine(checks)) {
19822 // Unclosed template literal --- point to the starting "`"
19823 var startPos = this.templateStarts.pop();
19824 this.trigger("error", {
19825 code: "E052",
19826 line: startPos.line,
19827 character: startPos.char
19828 });
19829 return {
19830 type: tokenType,
19831 value: value,
19832 startLine: startLine,
19833 startChar: startChar,
19834 isUnclosed: true,
19835 depth: depth,
19836 context: this.popContext()
19837 };
19838 }
19839 }
19840
19841 if (ch === '$' && this.peek(1) === '{') {
19842 value += '${';
19843 this.skip(2);
19844 return {
19845 type: tokenType,
19846 value: value,
19847 startLine: startLine,
19848 startChar: startChar,
19849 isUnclosed: false,
19850 depth: depth,
19851 context: this.currentContext()
19852 };
19853 } else if (ch === '\\') {
19854 var escape = this.scanEscapeSequence(checks);
19855 value += escape.char;
19856 this.skip(escape.jump);
19857 } else if (ch !== '`') {
19858 // Otherwise, append the value and continue.
19859 value += ch;
19860 this.skip(1);
19861 }
19862 }
19863
19864 // Final value is either NoSubstTemplate or TemplateTail
19865 tokenType = tokenType === Token.TemplateHead ? Token.NoSubstTemplate : Token.TemplateTail;
19866 this.skip(1);
19867 this.templateStarts.pop();
19868
19869 return {
19870 type: tokenType,
19871 value: value,
19872 startLine: startLine,
19873 startChar: startChar,
19874 isUnclosed: false,
19875 depth: depth,
19876 context: this.popContext()
19877 };
19878 },
19879
19880 /*
19881 * Extract a string out of the next sequence of characters and/or
19882 * lines or return 'null' if its not possible. Since strings can
19883 * span across multiple lines this method has to move the char
19884 * pointer.
19885 *
19886 * This method recognizes pseudo-multiline JavaScript strings:
19887 *
19888 * var str = "hello\
19889 * world";
19890 */
19891 scanStringLiteral: function(checks) {
19892 /*jshint loopfunc:true */
19893 var quote = this.peek();
19894
19895 // String must start with a quote.
19896 if (quote !== "\"" && quote !== "'") {
19897 return null;
19898 }
19899
19900 // In JSON strings must always use double quotes.
19901 this.triggerAsync("warning", {
19902 code: "W108",
19903 line: this.line,
19904 character: this.char // +1?
19905 }, checks, function() { return state.jsonMode && quote !== "\""; });
19906
19907 var value = "";
19908 var startLine = this.line;
19909 var startChar = this.char;
19910 var allowNewLine = false;
19911
19912 this.skip();
19913
19914 while (this.peek() !== quote) {
19915 if (this.peek() === "") { // End Of Line
19916
19917 // If an EOL is not preceded by a backslash, show a warning
19918 // and proceed like it was a legit multi-line string where
19919 // author simply forgot to escape the newline symbol.
19920 //
19921 // Another approach is to implicitly close a string on EOL
19922 // but it generates too many false positives.
19923
19924 if (!allowNewLine) {
19925 // This condition unequivocally describes a syntax error.
19926 // TODO: Emit error E029 and remove W112.
19927 this.trigger("warning", {
19928 code: "W112",
19929 line: this.line,
19930 character: this.char
19931 });
19932 } else {
19933 allowNewLine = false;
19934
19935 // Otherwise show a warning if multistr option was not set.
19936 // For JSON, show warning no matter what.
19937
19938 this.triggerAsync("warning", {
19939 code: "W043",
19940 line: this.line,
19941 character: this.char
19942 }, checks, function() { return !state.option.multistr; });
19943
19944 this.triggerAsync("warning", {
19945 code: "W042",
19946 line: this.line,
19947 character: this.char
19948 }, checks, function() { return state.jsonMode && state.option.multistr; });
19949 }
19950
19951 // If we get an EOF inside of an unclosed string, show an
19952 // error and implicitly close it at the EOF point.
19953
19954 if (!this.nextLine(checks)) {
19955 return {
19956 type: Token.StringLiteral,
19957 value: value,
19958 startLine: startLine,
19959 startChar: startChar,
19960 isUnclosed: true,
19961 quote: quote
19962 };
19963 }
19964
19965 } else { // Any character other than End Of Line
19966
19967 allowNewLine = false;
19968 var char = this.peek();
19969 var jump = 1; // A length of a jump, after we're done
19970 // parsing this character.
19971
19972 if (char < " ") {
19973 // Warn about a control character in a string.
19974 this.triggerAsync(
19975 "warning",
19976 {
19977 code: "W113",
19978 line: this.line,
19979 character: this.char,
19980 data: [ "<non-printable>" ]
19981 },
19982 checks,
19983 function() { return true; }
19984 );
19985 }
19986
19987 // Special treatment for some escaped characters.
19988 if (char === "\\") {
19989 var parsed = this.scanEscapeSequence(checks);
19990 char = parsed.char;
19991 jump = parsed.jump;
19992 allowNewLine = parsed.allowNewLine;
19993 }
19994
19995 // If char is the empty string, end of the line has been reached. In
19996 // this case, `this.char` should not be incremented so that warnings
19997 // and errors reported in the subsequent loop iteration have the
19998 // correct character column offset.
19999 if (char !== "") {
20000 value += char;
20001 this.skip(jump);
20002 }
20003 }
20004 }
20005
20006 this.skip();
20007 return {
20008 type: Token.StringLiteral,
20009 value: value,
20010 startLine: startLine,
20011 startChar: startChar,
20012 isUnclosed: false,
20013 quote: quote
20014 };
20015 },
20016
20017 /*
20018 * Extract a regular expression out of the next sequence of
20019 * characters and/or lines or return 'null' if its not possible.
20020 *
20021 * This method is platform dependent: it accepts almost any
20022 * regular expression values but then tries to compile and run
20023 * them using system's RegExp object. This means that there are
20024 * rare edge cases where one JavaScript engine complains about
20025 * your regular expression while others don't.
20026 */
20027 scanRegExp: function(checks) {
20028 var index = 0;
20029 var length = this.input.length;
20030 var char = this.peek();
20031 var value = char;
20032 var body = "";
20033 var groupReferences = [];
20034 var allFlags = "";
20035 var es5Flags = "";
20036 var malformed = false;
20037 var isCharSet = false;
20038 var isCharSetRange = false;
20039 var isGroup = false;
20040 var isQuantifiable = false;
20041 var hasInvalidQuantifier = false;
20042 var escapedChars = "";
20043 var hasUFlag = function() { return allFlags.indexOf("u") > -1; };
20044 var escapeSequence;
20045 var groupCount = 0;
20046 var terminated, malformedDesc;
20047
20048 var scanRegexpEscapeSequence = function() {
20049 var next, sequence;
20050 index += 1;
20051 char = this.peek(index);
20052
20053 if (reg.nonzeroDigit.test(char)) {
20054 sequence = char;
20055 next = this.peek(index + 1);
20056 while (reg.nonzeroDigit.test(next) || next === "0") {
20057 index += 1;
20058 char = next;
20059 sequence += char;
20060 body += char;
20061 value += char;
20062 next = this.peek(index + 1);
20063 }
20064 groupReferences.push(Number(sequence));
20065 return sequence;
20066 }
20067
20068 escapedChars += char;
20069
20070 if (char === "u" && this.peek(index + 1) === "{") {
20071 var x = index + 2;
20072 sequence = "u{";
20073 next = this.peek(x);
20074 while (isHex(next)) {
20075 sequence += next;
20076 x += 1;
20077 next = this.peek(x);
20078 }
20079
20080 if (next !== "}") {
20081 this.triggerAsync(
20082 "error",
20083 {
20084 code: "E016",
20085 line: this.line,
20086 character: this.char,
20087 data: [ "Invalid Unicode escape sequence" ]
20088 },
20089 checks,
20090 hasUFlag
20091 );
20092 } else if (sequence.length > 2) {
20093 sequence += "}";
20094 body += sequence;
20095 value += sequence;
20096 index = x + 1;
20097 return sequence;
20098 }
20099 }
20100
20101 // Unexpected control character
20102 if (char < " ") {
20103 malformed = true;
20104 this.triggerAsync(
20105 "warning",
20106 {
20107 code: "W048",
20108 line: this.line,
20109 character: this.char
20110 },
20111 checks,
20112 function() { return true; }
20113 );
20114 }
20115
20116 // Unexpected escaped character
20117 if (char === "<") {
20118 malformed = true;
20119 this.triggerAsync(
20120 "warning",
20121 {
20122 code: "W049",
20123 line: this.line,
20124 character: this.char,
20125 data: [ char ]
20126 },
20127 checks,
20128 function() { return true; }
20129 );
20130 } else if (char === "0" && reg.decimalDigit.test(this.peek(index + 1))) {
20131 this.triggerAsync(
20132 "error",
20133 {
20134 code: "E016",
20135 line: this.line,
20136 character: this.char,
20137 data: [ "Invalid decimal escape sequence" ]
20138 },
20139 checks,
20140 hasUFlag
20141 );
20142 }
20143
20144 index += 1;
20145 body += char;
20146 value += char;
20147
20148 return char;
20149 }.bind(this);
20150
20151 var checkQuantifier = function() {
20152 var lookahead = index;
20153 var lowerBound = "";
20154 var upperBound = "";
20155 var next;
20156
20157 next = this.peek(lookahead + 1);
20158
20159 while (reg.decimalDigit.test(next)) {
20160 lookahead += 1;
20161 lowerBound += next;
20162 next = this.peek(lookahead + 1);
20163 }
20164
20165 if (!lowerBound) {
20166 return false;
20167 }
20168
20169 if (next === "}") {
20170 return true;
20171 }
20172
20173 if (next !== ",") {
20174 return false;
20175 }
20176
20177 lookahead += 1;
20178 next = this.peek(lookahead + 1);
20179
20180 while (reg.decimalDigit.test(next)) {
20181 lookahead += 1;
20182 upperBound += next;
20183 next = this.peek(lookahead + 1);
20184 }
20185
20186 if (next !== "}") {
20187 return false;
20188 }
20189
20190 if (upperBound) {
20191 return Number(lowerBound) <= Number(upperBound);
20192 }
20193
20194 return true;
20195 }.bind(this);
20196
20197 var translateUFlag = function(body) {
20198 // The BMP character to use as a replacement for astral symbols when
20199 // translating an ES6 "u"-flagged pattern to an ES5-compatible
20200 // approximation.
20201 // Note: replacing with '\uFFFF' enables false positives in unlikely
20202 // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid pattern
20203 // that would not be detected by this substitution.
20204 var astralSubstitute = "\uFFFF";
20205
20206 return body
20207 // Replace every Unicode escape sequence with the equivalent BMP
20208 // character or a constant ASCII code point in the case of astral
20209 // symbols. (See the above note on `astralSubstitute` for more
20210 // information.)
20211 .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function($0, $1, $2) {
20212 var codePoint = parseInt($1 || $2, 16);
20213 var literal;
20214
20215 if (codePoint > 0x10FFFF) {
20216 malformed = true;
20217 this.trigger("error", {
20218 code: "E016",
20219 line: this.line,
20220 character: this.char,
20221 data: [ char ]
20222 });
20223
20224 return;
20225 }
20226 literal = String.fromCharCode(codePoint);
20227
20228 if (reg.regexpSyntaxChars.test(literal)) {
20229 return $0;
20230 }
20231
20232 if (codePoint <= 0xFFFF) {
20233 return String.fromCharCode(codePoint);
20234 }
20235 return astralSubstitute;
20236 }.bind(this))
20237 // Replace each paired surrogate with a single ASCII symbol to avoid
20238 // throwing on regular expressions that are only valid in combination
20239 // with the "u" flag.
20240 .replace(
20241 /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
20242 astralSubstitute
20243 );
20244 }.bind(this);
20245
20246 // Regular expressions must start with '/'
20247 if (!this.prereg || char !== "/") {
20248 return null;
20249 }
20250
20251 index += 1;
20252 terminated = false;
20253
20254 // Try to get everything in between slashes. A couple of
20255 // cases aside (see scanRegexpEscapeSequence) we don't really
20256 // care whether the resulting expression is valid or not.
20257 // We will check that later using the RegExp object.
20258
20259 while (index < length) {
20260 // Because an iteration of this loop may terminate in a number of
20261 // distinct locations, `isCharSetRange` is re-set at the onset of
20262 // iteration.
20263 isCharSetRange &= char === "-";
20264 char = this.peek(index);
20265 value += char;
20266 body += char;
20267
20268 if (isCharSet) {
20269 if (char === "]") {
20270 if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") {
20271 isCharSet = false;
20272 }
20273 } else if (char === "-") {
20274 isCharSetRange = true;
20275 }
20276 }
20277
20278 if (char === "\\") {
20279 escapeSequence = scanRegexpEscapeSequence();
20280
20281 if (isCharSet && (this.peek(index) === "-" || isCharSetRange) &&
20282 reg.regexpCharClasses.test(escapeSequence)) {
20283 this.triggerAsync(
20284 "error",
20285 {
20286 code: "E016",
20287 line: this.line,
20288 character: this.char,
20289 data: [ "Character class used in range" ]
20290 },
20291 checks,
20292 hasUFlag
20293 );
20294 }
20295
20296 continue;
20297 }
20298
20299 if (isCharSet) {
20300 index += 1;
20301 continue;
20302 }
20303
20304 if (char === "{" && !hasInvalidQuantifier) {
20305 hasInvalidQuantifier = !checkQuantifier();
20306 }
20307
20308 if (char === "[") {
20309 isCharSet = true;
20310 index += 1;
20311 continue;
20312 } else if (char === "(") {
20313 isGroup = true;
20314
20315 if (this.peek(index + 1) === "?" &&
20316 (this.peek(index + 2) === "=" || this.peek(index + 2) === "!")) {
20317 isQuantifiable = true;
20318 }
20319 } else if (char === ")") {
20320 if (isQuantifiable) {
20321 isQuantifiable = false;
20322
20323 if (reg.regexpQuantifiers.test(this.peek(index + 1))) {
20324 this.triggerAsync(
20325 "error",
20326 {
20327 code: "E016",
20328 line: this.line,
20329 character: this.char,
20330 data: [ "Quantified quantifiable" ]
20331 },
20332 checks,
20333 hasUFlag
20334 );
20335 }
20336 } else {
20337 groupCount += 1;
20338 }
20339
20340 isGroup = false;
20341 } else if (char === "/") {
20342 body = body.substr(0, body.length - 1);
20343 terminated = true;
20344 index += 1;
20345 break;
20346 }
20347
20348 index += 1;
20349 }
20350
20351 // A regular expression that was never closed is an
20352 // error from which we cannot recover.
20353
20354 if (!terminated) {
20355 this.trigger("error", {
20356 code: "E015",
20357 line: this.line,
20358 character: this.from
20359 });
20360
20361 return void this.trigger("fatal", {
20362 line: this.line,
20363 from: this.from
20364 });
20365 }
20366
20367 // Parse flags (if any).
20368
20369 while (index < length) {
20370 char = this.peek(index);
20371 if (!/[gimyus]/.test(char)) {
20372 break;
20373 }
20374 if (char === "y") {
20375 if (!state.inES6(true)) {
20376 this.triggerAsync(
20377 "warning",
20378 {
20379 code: "W119",
20380 line: this.line,
20381 character: this.char,
20382 data: [ "Sticky RegExp flag", "6" ]
20383 },
20384 checks,
20385 function() { return true; }
20386 );
20387 }
20388 } else if (char === "u") {
20389 if (!state.inES6(true)) {
20390 this.triggerAsync(
20391 "warning",
20392 {
20393 code: "W119",
20394 line: this.line,
20395 character: this.char,
20396 data: [ "Unicode RegExp flag", "6" ]
20397 },
20398 checks,
20399 function() { return true; }
20400 );
20401 }
20402
20403 var hasInvalidEscape = (function(groupReferences, groupCount, escapedChars, reg) {
20404 var hasInvalidGroup = groupReferences.some(function(groupReference) {
20405 if (groupReference > groupCount) {
20406 return true;
20407 }
20408 });
20409
20410 if (hasInvalidGroup) {
20411 return true;
20412 }
20413
20414 return !escapedChars.split("").every(function(escapedChar) {
20415 return escapedChar === "u" ||
20416 escapedChar === "/" ||
20417 escapedChar === "0" ||
20418 reg.regexpControlEscapes.test(escapedChar) ||
20419 reg.regexpCharClasses.test(escapedChar) ||
20420 reg.regexpSyntaxChars.test(escapedChar);
20421 });
20422 }(groupReferences, groupCount, escapedChars, reg));
20423
20424 if (hasInvalidEscape) {
20425 malformedDesc = "Invalid escape";
20426 } else if (hasInvalidQuantifier) {
20427 malformedDesc = "Invalid quantifier";
20428 }
20429
20430 body = translateUFlag(body);
20431 } else if (char === "s") {
20432 if (!state.inES9()) {
20433 this.triggerAsync(
20434 "warning",
20435 {
20436 code: "W119",
20437 line: this.line,
20438 character: this.char,
20439 data: [ "DotAll RegExp flag", "9" ]
20440 },
20441 checks,
20442 function() { return true; }
20443 );
20444 }
20445 if (value.indexOf("s") > -1) {
20446 malformedDesc = "Duplicate RegExp flag";
20447 }
20448 } else {
20449 es5Flags += char;
20450 }
20451
20452 if (allFlags.indexOf(char) > -1) {
20453 malformedDesc = "Duplicate RegExp flag";
20454 }
20455 allFlags += char;
20456
20457 value += char;
20458 allFlags += char;
20459 index += 1;
20460 }
20461
20462 if (allFlags.indexOf("u") === -1) {
20463 this.triggerAsync("warning", {
20464 code: "W147",
20465 line: this.line,
20466 character: this.char
20467 }, checks, function() { return state.option.regexpu; });
20468 }
20469
20470 // Check regular expression for correctness.
20471
20472 try {
20473 new RegExp(body, es5Flags);
20474 } catch (err) {
20475 /**
20476 * Because JSHint relies on the current engine's RegExp parser to
20477 * validate RegExp literals, the description (exposed as the "data"
20478 * property on the error object) is platform dependent.
20479 */
20480 malformedDesc = err.message;
20481 }
20482
20483 if (malformedDesc) {
20484 malformed = true;
20485 this.trigger("error", {
20486 code: "E016",
20487 line: this.line,
20488 character: this.char,
20489 data: [ malformedDesc ]
20490 });
20491 } else if (allFlags.indexOf("s") > -1 && !reg.regexpDot.test(body)) {
20492 this.trigger("warning", {
20493 code: "W148",
20494 line: this.line,
20495 character: this.char
20496 });
20497 }
20498
20499 return {
20500 type: Token.RegExp,
20501 value: value,
20502 isMalformed: malformed
20503 };
20504 },
20505
20506 /*
20507 * Scan for any occurrence of non-breaking spaces. Non-breaking spaces
20508 * can be mistakenly typed on OS X with option-space. Non UTF-8 web
20509 * pages with non-breaking pages produce syntax errors.
20510 */
20511 scanNonBreakingSpaces: function() {
20512 return state.option.nonbsp ?
20513 this.input.search(/(\u00A0)/) : -1;
20514 },
20515
20516 /*
20517 * Produce the next raw token or return 'null' if no tokens can be matched.
20518 * This method skips over all space characters.
20519 */
20520 next: function(checks) {
20521 this.from = this.char;
20522
20523 // Move to the next non-space character.
20524 while (reg.whitespace.test(this.peek())) {
20525 this.from += 1;
20526 this.skip();
20527 }
20528
20529 // Methods that work with multi-line structures and move the
20530 // character pointer.
20531
20532 var match = this.scanComments(checks) ||
20533 this.scanStringLiteral(checks) ||
20534 this.scanTemplateLiteral(checks);
20535
20536 if (match) {
20537 return match;
20538 }
20539
20540 // Methods that don't move the character pointer.
20541
20542 match =
20543 this.scanRegExp(checks) ||
20544 this.scanPunctuator() ||
20545 this.scanKeyword() ||
20546 this.scanIdentifier(checks) ||
20547 this.scanNumericLiteral(checks);
20548
20549 if (match) {
20550 this.skip(match.tokenLength || match.value.length);
20551 return match;
20552 }
20553
20554 // No token could be matched, give up.
20555
20556 return null;
20557 },
20558
20559 /*
20560 * Switch to the next line and reset all char pointers. Once
20561 * switched, this method also checks for other minor warnings.
20562 */
20563 nextLine: function(checks) {
20564 var char;
20565
20566 if (this.line >= this.getLines().length) {
20567 return false;
20568 }
20569
20570 this.input = this.getLines()[this.line];
20571 this.line += 1;
20572 this.char = 1;
20573 this.from = 1;
20574
20575 var inputTrimmed = this.input.trim();
20576
20577 var startsWith = function() {
20578 return _.some(arguments, function(prefix) {
20579 return inputTrimmed.indexOf(prefix) === 0;
20580 });
20581 };
20582
20583 var endsWith = function() {
20584 return _.some(arguments, function(suffix) {
20585 return inputTrimmed.indexOf(suffix, inputTrimmed.length - suffix.length) !== -1;
20586 });
20587 };
20588
20589 // If we are ignoring linter errors, replace the input with empty string
20590 // if it doesn't already at least start or end a multi-line comment
20591 if (this.ignoringLinterErrors === true) {
20592 if (!startsWith("/*", "//") && !(this.inComment && endsWith("*/"))) {
20593 this.input = "";
20594 }
20595 }
20596
20597 char = this.scanNonBreakingSpaces();
20598 if (char >= 0) {
20599 this.triggerAsync(
20600 "warning",
20601 { code: "W125", line: this.line, character: char + 1 },
20602 checks,
20603 function() { return true; }
20604 );
20605 }
20606
20607 this.input = this.input.replace(/\t/g, state.tab);
20608
20609 // If there is a limit on line length, warn when lines get too
20610 // long.
20611
20612 if (!this.ignoringLinterErrors && state.option.maxlen &&
20613 state.option.maxlen < this.input.length) {
20614 var inComment = this.inComment ||
20615 startsWith.call(inputTrimmed, "//") ||
20616 startsWith.call(inputTrimmed, "/*");
20617
20618 var shouldTriggerError = !inComment || !reg.maxlenException.test(inputTrimmed);
20619
20620 if (shouldTriggerError) {
20621 this.triggerAsync(
20622 "warning",
20623 { code: "W101", line: this.line, character: this.input.length },
20624 checks,
20625 function() { return true; }
20626 );
20627 }
20628 }
20629
20630 return true;
20631 },
20632
20633 /*
20634 * Produce the next token. This function is called by advance() to get
20635 * the next token. It returns a token in a JSLint-compatible format.
20636 */
20637 token: function() {
20638 /*jshint loopfunc:true */
20639 var checks = asyncTrigger();
20640 var token;
20641
20642 // Produce a token object.
20643 var create = function(type, value, isProperty, token) {
20644 /*jshint validthis:true */
20645 var obj;
20646
20647 if (type !== "(endline)" && type !== "(end)") {
20648 this.prereg = false;
20649 }
20650
20651 if (type === "(punctuator)") {
20652 switch (value) {
20653 case ".":
20654 case ")":
20655 case "~":
20656 case "#":
20657 case "]":
20658 case "}":
20659 case "++":
20660 case "--":
20661 this.prereg = false;
20662 break;
20663 default:
20664 this.prereg = true;
20665 }
20666
20667 obj = Object.create(state.syntax[value] || state.syntax["(error)"]);
20668 }
20669
20670 if (type === "(identifier)") {
20671 if (value === "return" || value === "case" || value === "yield" ||
20672 value === "typeof" || value === "instanceof" || value === "void" ||
20673 value === "await" || value === "new" || value === "delete" ||
20674 value === "default" || value === "extends") {
20675 this.prereg = true;
20676 }
20677
20678 if (_.has(state.syntax, value)) {
20679 obj = Object.create(state.syntax[value] || state.syntax["(error)"]);
20680 }
20681 }
20682
20683 if (type === "(template)" || type === "(template middle)") {
20684 this.prereg = true;
20685 }
20686
20687 if (!obj) {
20688 obj = Object.create(state.syntax[type]);
20689 }
20690
20691 obj.identifier = (type === "(identifier)");
20692 obj.type = obj.type || type;
20693 obj.value = value;
20694 obj.line = this.line;
20695 obj.character = this.char;
20696 obj.from = this.from;
20697 if (obj.identifier && token) obj.raw_text = token.text || token.value;
20698 if (token && token.startLine && token.startLine !== this.line) {
20699 obj.startLine = token.startLine;
20700 }
20701 if (token && token.context) {
20702 // Context of current token
20703 obj.context = token.context;
20704 }
20705 if (token && token.depth) {
20706 // Nested template depth
20707 obj.depth = token.depth;
20708 }
20709 if (token && token.isUnclosed) {
20710 // Mark token as unclosed string / template literal
20711 obj.isUnclosed = token.isUnclosed;
20712 }
20713
20714 if (isProperty && obj.identifier) {
20715 obj.isProperty = isProperty;
20716 }
20717
20718 obj.check = checks.check;
20719
20720 return obj;
20721 }.bind(this);
20722
20723 for (;;) {
20724 if (!this.input.length) {
20725 if (this.nextLine(checks)) {
20726 return create("(endline)", "");
20727 }
20728
20729 if (this.exhausted) {
20730 return null;
20731 }
20732
20733 this.exhausted = true;
20734 return create("(end)", "");
20735 }
20736
20737 token = this.next(checks);
20738
20739 if (!token) {
20740 if (this.input.length) {
20741 // Unexpected character.
20742 this.trigger("error", {
20743 code: "E024",
20744 line: this.line,
20745 character: this.char,
20746 data: [ this.peek() ]
20747 });
20748
20749 this.input = "";
20750 }
20751
20752 continue;
20753 }
20754
20755 switch (token.type) {
20756 case Token.StringLiteral:
20757 this.triggerAsync("String", {
20758 line: this.line,
20759 char: this.char,
20760 from: this.from,
20761 startLine: token.startLine,
20762 startChar: token.startChar,
20763 value: token.value,
20764 quote: token.quote
20765 }, checks, function() { return true; });
20766
20767 return create("(string)", token.value, null, token);
20768
20769 case Token.TemplateHead:
20770 this.trigger("TemplateHead", {
20771 line: this.line,
20772 char: this.char,
20773 from: this.from,
20774 startLine: token.startLine,
20775 startChar: token.startChar,
20776 value: token.value
20777 });
20778 return create("(template)", token.value, null, token);
20779
20780 case Token.TemplateMiddle:
20781 this.trigger("TemplateMiddle", {
20782 line: this.line,
20783 char: this.char,
20784 from: this.from,
20785 startLine: token.startLine,
20786 startChar: token.startChar,
20787 value: token.value
20788 });
20789 return create("(template middle)", token.value, null, token);
20790
20791 case Token.TemplateTail:
20792 this.trigger("TemplateTail", {
20793 line: this.line,
20794 char: this.char,
20795 from: this.from,
20796 startLine: token.startLine,
20797 startChar: token.startChar,
20798 value: token.value
20799 });
20800 return create("(template tail)", token.value, null, token);
20801
20802 case Token.NoSubstTemplate:
20803 this.trigger("NoSubstTemplate", {
20804 line: this.line,
20805 char: this.char,
20806 from: this.from,
20807 startLine: token.startLine,
20808 startChar: token.startChar,
20809 value: token.value
20810 });
20811 return create("(no subst template)", token.value, null, token);
20812
20813 case Token.Identifier:
20814 this.triggerAsync("Identifier", {
20815 line: this.line,
20816 char: this.char,
20817 from: this.from,
20818 name: token.value,
20819 raw_name: token.text,
20820 isProperty: state.tokens.curr.id === "."
20821 }, checks, function() { return true; });
20822
20823 /* falls through */
20824 case Token.Keyword:
20825 return create("(identifier)", token.value, state.tokens.curr.id === ".", token);
20826
20827 case Token.NumericLiteral:
20828 if (token.isMalformed) {
20829 this.trigger("error", {
20830 code: "E067",
20831 line: this.line,
20832 character: this.char,
20833 data: [ token.value ]
20834 });
20835 }
20836
20837 this.triggerAsync("warning", {
20838 code: "W114",
20839 line: this.line,
20840 character: this.char,
20841 data: [ "0x-" ]
20842 }, checks, function() { return token.base === 16 && state.jsonMode; });
20843
20844 this.triggerAsync("warning", {
20845 code: "W115",
20846 line: this.line,
20847 character: this.char
20848 }, checks, function() {
20849 return state.isStrict() && token.base === 8 && token.isLegacy;
20850 });
20851
20852 this.triggerAsync("error", {
20853 code: "E068",
20854 line: this.line,
20855 character: this.char
20856 }, checks, function() {
20857 return state.isStrict() && token.isNonOctal;
20858 });
20859
20860 this.trigger("Number", {
20861 line: this.line,
20862 char: this.char,
20863 from: this.from,
20864 value: token.value,
20865 base: token.base,
20866 isMalformed: token.isMalformed
20867 });
20868
20869 return create("(number)", token.value);
20870
20871 case Token.RegExp:
20872 return create("(regexp)", token.value);
20873
20874 case Token.Comment:
20875 if (token.isSpecial) {
20876 return {
20877 id: '(comment)',
20878 value: token.value,
20879 body: token.body,
20880 type: token.commentType,
20881 isSpecial: token.isSpecial,
20882 line: this.line,
20883 character: this.char,
20884 from: this.from
20885 };
20886 }
20887
20888 break;
20889
20890 default:
20891 return create("(punctuator)", token.value);
20892 }
20893 }
20894 }
20895 };
20896
20897 exports.Lexer = Lexer;
20898 exports.Context = Context;
20899
20900 },{"../data/ascii-identifier-data.js":1,"../data/es5-identifier-names.js":2,"../data/non-ascii-identifier-part-only.js":3,"../data/non-ascii-identifier-start.js":4,"./reg.js":22,"./state.js":24,"events":9,"lodash":16}],18:[function(require,module,exports){
20901 "use strict";
20902
20903 var _ = require("lodash");
20904
20905 var errors = {
20906 // JSHint options
20907 E001: "Bad {a}option: '{b}'.",
20908 E002: "Bad option value.",
20909
20910 // JSHint input
20911 E003: "Expected a JSON value.",
20912 E004: "Input is neither a string nor an array of strings.",
20913 E005: "Input is empty.",
20914 E006: "Unexpected early end of program.",
20915
20916 // Strict mode
20917 E007: "Missing \"use strict\" statement.",
20918 E008: "Strict violation.",
20919 E009: "Option 'validthis' can't be used in a global scope.",
20920 E010: "'with' is not allowed in strict mode.",
20921
20922 // Constants
20923 E011: "'{a}' has already been declared.",
20924 E012: "const '{a}' is initialized to 'undefined'.",
20925 E013: "Attempting to override '{a}' which is a constant.",
20926
20927 // Regular expressions
20928 E014: "A regular expression literal can be confused with '/='.",
20929 E015: "Unclosed regular expression.",
20930 E016: "Invalid regular expression.",
20931
20932 // Tokens
20933 E017: "Unclosed comment.",
20934 E018: "Unbegun comment.",
20935 E019: "Unmatched '{a}'.",
20936 E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
20937 E021: "Expected '{a}' and instead saw '{b}'.",
20938 E022: "Line breaking error '{a}'.",
20939 E023: "Missing '{a}'.",
20940 E024: "Unexpected '{a}'.",
20941 E025: "Missing ':' on a case clause.",
20942 E026: "Missing '}' to match '{' from line {a}.",
20943 E027: "Missing ']' to match '[' from line {a}.",
20944 E028: "Illegal comma.",
20945 E029: "Unclosed string.",
20946
20947 // Everything else
20948 E030: "Expected an identifier and instead saw '{a}'.",
20949 E031: "Bad assignment.", // FIXME: Rephrase
20950 E032: "Expected a small integer or 'false' and instead saw '{a}'.",
20951 E033: "Expected an operator and instead saw '{a}'.",
20952 E034: "get/set are ES5 features.",
20953 E035: "Missing property name.",
20954 E036: "Expected to see a statement and instead saw a block.",
20955 E037: null,
20956 E038: null,
20957 E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
20958 E040: "Each value should have its own case label.",
20959 E041: "Unrecoverable syntax error.",
20960 E042: "Stopping.",
20961 E043: "Too many errors.",
20962 E044: null,
20963 E045: "Invalid for each loop.",
20964 E046: "Yield expressions may only occur within generator functions.",
20965 E047: null,
20966 E048: "{a} declaration not directly within block.",
20967 E049: "A {a} cannot be named '{b}'.",
20968 E050: "Mozilla requires the yield expression to be parenthesized here.",
20969 E051: null,
20970 E052: "Unclosed template literal.",
20971 E053: "{a} declarations are only allowed at the top level of module scope.",
20972 E054: "Class properties must be methods. Expected '(' but instead saw '{a}'.",
20973 E055: "The '{a}' option cannot be set after any executable code.",
20974 E056: "'{a}' was used before it was declared, which is illegal for '{b}' variables.",
20975 E057: "Invalid meta property: '{a}.{b}'.",
20976 E058: "Missing semicolon.",
20977 E059: "Incompatible values for the '{a}' and '{b}' linting options.",
20978 E060: "Non-callable values cannot be used as the second operand to instanceof.",
20979 E061: "Invalid position for 'yield' expression (consider wrapping in parenthesis).",
20980 E062: "Rest parameter does not a support default value.",
20981 E063: "Super property may only be used within method bodies.",
20982 E064: "Super call may only be used within class method bodies.",
20983 E065: "Functions defined outside of strict mode with non-simple parameter lists may not " +
20984 "enable strict mode.",
20985 E066: "Asynchronous iteration is only available with for-of loops.",
20986 E067: "Malformed numeric literal: '{a}'.",
20987 E068: "Decimals with leading zeros are not allowed in strict mode."
20988 };
20989
20990 var warnings = {
20991 W001: "'hasOwnProperty' is a really bad name.",
20992 W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
20993 W003: "'{a}' was used before it was defined.",
20994 W004: "'{a}' is already defined.",
20995 W005: "A dot following a number can be confused with a decimal point.",
20996 W006: "Confusing minuses.",
20997 W007: "Confusing plusses.",
20998 W008: "A leading decimal point can be confused with a dot: '{a}'.",
20999 W009: "The array literal notation [] is preferable.",
21000 W010: "The object literal notation {} is preferable.",
21001 W011: null,
21002 W012: null,
21003 W013: null,
21004 W014: "Misleading line break before '{a}'; readers may interpret this as an expression boundary.",
21005 W015: null,
21006 W016: "Unexpected use of '{a}'.",
21007 W017: "Bad operand.",
21008 W018: "Confusing use of '{a}'.",
21009 W019: "Use the isNaN function to compare with NaN.",
21010 W020: "Read only.",
21011 W021: "Reassignment of '{a}', which is a {b}. " +
21012 "Use 'var' or 'let' to declare bindings that may change.",
21013 W022: "Do not assign to the exception parameter.",
21014 W023: null,
21015 W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
21016 W025: "Missing name in function declaration.",
21017 W026: "Inner functions should be listed at the top of the outer function.",
21018 W027: "Unreachable '{a}' after '{b}'.",
21019 W028: "Label '{a}' on {b} statement.",
21020 W030: "Expected an assignment or function call and instead saw an expression.",
21021 W031: "Do not use 'new' for side effects.",
21022 W032: "Unnecessary semicolon.",
21023 W033: "Missing semicolon.",
21024 W034: "Unnecessary directive \"{a}\".",
21025 W035: "Empty block.",
21026 W036: "Unexpected /*member '{a}'.",
21027 W037: "'{a}' is a statement label.",
21028 W038: "'{a}' used out of scope.",
21029 W039: null,
21030 W040: "If a strict mode function is executed using function invocation, " +
21031 "its 'this' value will be undefined.",
21032 W041: null,
21033 W042: "Avoid EOL escaping.",
21034 W043: "Bad escaping of EOL. Use option multistr if needed.",
21035 W044: "Bad or unnecessary escaping.", /* TODO(caitp): remove W044 */
21036 W045: "Value described by numeric literal cannot be accurately " +
21037 "represented with a number value: '{a}'.",
21038 W046: "Don't use extra leading zeros '{a}'.",
21039 W047: "A trailing decimal point can be confused with a dot: '{a}'.",
21040 W048: "Unexpected control character in regular expression.",
21041 W049: "Unexpected escaped character '{a}' in regular expression.",
21042 W050: "JavaScript URL.",
21043 W051: "Variables should not be deleted.",
21044 W052: "Unexpected '{a}'.",
21045 W053: "Do not use {a} as a constructor.",
21046 W054: "The Function constructor is a form of eval.",
21047 W055: "A constructor name should start with an uppercase letter.",
21048 W056: "Bad constructor.",
21049 W057: "Weird construction. Is 'new' necessary?",
21050 W058: "Missing '()' invoking a constructor.",
21051 W059: "Avoid arguments.{a}.",
21052 W060: "document.write can be a form of eval.",
21053 W061: "eval can be harmful.",
21054 W062: "Wrap an immediate function invocation in parens " +
21055 "to assist the reader in understanding that the expression " +
21056 "is the result of a function, and not the function itself.",
21057 W063: "Math is not a function.",
21058 W064: "Missing 'new' prefix when invoking a constructor.",
21059 W065: "Missing radix parameter.",
21060 W066: "Implied eval. Consider passing a function instead of a string.",
21061 W067: "Unorthodox function invocation.",
21062 W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
21063 W069: "['{a}'] is better written in dot notation.",
21064 W070: "Extra comma. (it breaks older versions of IE)",
21065 W071: "This function has too many statements. ({a})",
21066 W072: "This function has too many parameters. ({a})",
21067 W073: "Blocks are nested too deeply. ({a})",
21068 W074: "This function's cyclomatic complexity is too high. ({a})",
21069 W075: "Duplicate {a} '{b}'.",
21070 W076: "Unexpected parameter '{a}' in get {b} function.",
21071 W077: "Expected a single parameter in set {a} function.",
21072 W078: "Setter is defined without getter.",
21073 W079: "Redefinition of '{a}'.",
21074 W080: "It's not necessary to initialize '{a}' to 'undefined'.",
21075 W081: null,
21076 W082: "Function declarations should not be placed in blocks. " +
21077 "Use a function expression or move the statement to the top of " +
21078 "the outer function.",
21079 W083: "Functions declared within loops referencing an outer scoped " +
21080 "variable may lead to confusing semantics. ({a})",
21081 W084: "Expected a conditional expression and instead saw an assignment.",
21082 W085: "Don't use 'with'.",
21083 W086: "Expected a 'break' statement before '{a}'.",
21084 W087: "Forgotten 'debugger' statement?",
21085 W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
21086 W089: "The body of a for in should be wrapped in an if statement to filter " +
21087 "unwanted properties from the prototype.",
21088 W090: "'{a}' is not a statement label.",
21089 W091: null,
21090 W093: "Did you mean to return a conditional instead of an assignment?",
21091 W094: "Unexpected comma.",
21092 W095: "Expected a string and instead saw {a}.",
21093 W096: "The '{a}' key may produce unexpected results.",
21094 W097: "Use the function form of \"use strict\".",
21095 W098: "'{a}' is defined but never used.",
21096 W099: null,
21097 W100: null,
21098 W101: "Line is too long.",
21099 W102: null,
21100 W103: "The '{a}' property is deprecated.",
21101 W104: "'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).",
21102 W105: null,
21103 W106: "Identifier '{a}' is not in camel case.",
21104 W107: "Script URL.",
21105 W108: "Strings must use doublequote.",
21106 W109: "Strings must use singlequote.",
21107 W110: "Mixed double and single quotes.",
21108 W112: "Unclosed string.",
21109 W113: "Control character in string: {a}.",
21110 W114: "Avoid {a}.",
21111 W115: "Octal literals are not allowed in strict mode.",
21112 W116: "Expected '{a}' and instead saw '{b}'.",
21113 W117: "'{a}' is not defined.",
21114 W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
21115 W119: "'{a}' is only available in ES{b} (use 'esversion: {b}').",
21116 W120: "You might be leaking a variable ({a}) here.",
21117 W121: "Extending prototype of native object: '{a}'.",
21118 W122: "Invalid typeof value '{a}'",
21119 W123: "'{a}' is already defined in outer scope.",
21120 W124: "A generator function should contain at least one yield expression.",
21121 W125: "This line contains non-breaking spaces: http://jshint.com/docs/options/#nonbsp",
21122 W126: "Unnecessary grouping operator.",
21123 W127: "Unexpected use of a comma operator.",
21124 W128: "Empty array elements require elision=true.",
21125 W129: "'{a}' is defined in a future version of JavaScript. Use a " +
21126 "different variable name to avoid migration issues.",
21127 W130: "Invalid element after rest element.",
21128 W131: "Invalid parameter after rest parameter.",
21129 W132: "`var` declarations are forbidden. Use `let` or `const` instead.",
21130 W133: "Invalid for-{a} loop left-hand-side: {b}.",
21131 W134: "The '{a}' option is only available when linting ECMAScript {b} code.",
21132 W135: "{a} may not be supported by non-browser environments.",
21133 W136: "'{a}' must be in function scope.",
21134 W137: "Empty destructuring: this is unnecessary and can be removed.",
21135 W138: "Regular parameters should not come after default parameters.",
21136 W139: "Function expressions should not be used as the second operand to instanceof.",
21137 W140: "Missing comma.",
21138 W141: "Empty {a}: this is unnecessary and can be removed.",
21139 W142: "Empty {a}: consider replacing with `import '{b}';`.",
21140 W143: "Assignment to properties of a mapped arguments object may cause " +
21141 "unexpected changes to formal parameters.",
21142 W144: "'{a}' is a non-standard language feature. Enable it using the '{b}' unstable option.",
21143 W145: "Superfluous 'case' clause.",
21144 W146: "Unnecessary `await` expression.",
21145 W147: "Regular expressions should include the 'u' flag.",
21146 W148: "Unnecessary RegExp 's' flag."
21147 };
21148
21149 var info = {
21150 I001: "Comma warnings can be turned off with 'laxcomma'.",
21151 I002: null,
21152 I003: "ES5 option is now set per default"
21153 };
21154
21155 exports.errors = {};
21156 exports.warnings = {};
21157 exports.info = {};
21158
21159 _.each(errors, function(desc, code) {
21160 exports.errors[code] = { code: code, desc: desc };
21161 });
21162
21163 _.each(warnings, function(desc, code) {
21164 exports.warnings[code] = { code: code, desc: desc };
21165 });
21166
21167 _.each(info, function(desc, code) {
21168 exports.info[code] = { code: code, desc: desc };
21169 });
21170
21171 },{"lodash":16}],19:[function(require,module,exports){
21172 /**
21173 * The NameStack class is used to approximate function name inference as
21174 * introduced by ECMAScript 2015. In that edition, the `name` property of
21175 * function objects is set according to the function's syntactic form. For
21176 * certain forms, this value depends on values available to the runtime during
21177 * execution. For example:
21178 *
21179 * var fnName = function() {};
21180 *
21181 * In the program code above, the function object's `name` property is set to
21182 * `"fnName"` during execution.
21183 *
21184 * This general "name inference" behavior extends to a number of additional
21185 * syntactic forms, not all of which can be implemented statically. `NameStack`
21186 * is a support class representing a "best-effort" attempt to implement the
21187 * specified behavior in cases where this may be done statically.
21188 *
21189 * For more information on this behavior, see the following blog post:
21190 * https://bocoup.com/blog/whats-in-a-function-name
21191 */
21192 "use strict";
21193
21194 function NameStack() {
21195 this._stack = [];
21196 }
21197
21198 Object.defineProperty(NameStack.prototype, "length", {
21199 get: function() {
21200 return this._stack.length;
21201 }
21202 });
21203
21204 /**
21205 * Create a new entry in the stack. Useful for tracking names across
21206 * expressions.
21207 */
21208 NameStack.prototype.push = function() {
21209 this._stack.push(null);
21210 };
21211
21212 /**
21213 * Discard the most recently-created name on the stack.
21214 */
21215 NameStack.prototype.pop = function() {
21216 this._stack.pop();
21217 };
21218
21219 /**
21220 * Update the most recent name on the top of the stack.
21221 *
21222 * @param {object} token The token to consider as the source for the most
21223 * recent name.
21224 */
21225 NameStack.prototype.set = function(token) {
21226 this._stack[this.length - 1] = token;
21227 };
21228
21229 /**
21230 * Generate a string representation of the most recent name.
21231 *
21232 * @returns {string}
21233 */
21234 NameStack.prototype.infer = function() {
21235 var nameToken = this._stack[this.length - 1];
21236 var prefix = "";
21237 var type;
21238
21239 // During expected operation, the topmost entry on the stack will only
21240 // reflect the current function's name when the function is declared without
21241 // the `function` keyword (i.e. for in-line accessor methods). In other
21242 // cases, the `function` expression itself will introduce an empty entry on
21243 // the top of the stack, and this should be ignored.
21244 if (!nameToken || nameToken.type === "class") {
21245 nameToken = this._stack[this.length - 2];
21246 }
21247
21248 if (!nameToken) {
21249 return "(empty)";
21250 }
21251
21252 type = nameToken.type;
21253
21254 if (type !== "(string)" && type !== "(number)" && type !== "(identifier)" && type !== "default") {
21255 return "(expression)";
21256 }
21257
21258 if (nameToken.accessorType) {
21259 prefix = nameToken.accessorType + " ";
21260 }
21261
21262 return prefix + nameToken.value;
21263 };
21264
21265 module.exports = NameStack;
21266
21267 },{}],20:[function(require,module,exports){
21268 "use strict";
21269
21270 // These are the JSHint boolean options.
21271 exports.bool = {
21272 enforcing: {
21273
21274 /**
21275 * This option prohibits the use of bitwise operators such as `^` (XOR),
21276 * `|` (OR) and others. Bitwise operators are very rare in JavaScript
21277 * programs and quite often `&` is simply a mistyped `&&`.
21278 */
21279 bitwise : true,
21280
21281 /**
21282 *
21283 * This options prohibits overwriting prototypes of native objects such as
21284 * `Array`, `Date` and so on.
21285 *
21286 * // jshint freeze:true
21287 * Array.prototype.count = function (value) { return 4; };
21288 * // -> Warning: Extending prototype of native object: 'Array'.
21289 */
21290 freeze : true,
21291
21292 /**
21293 * This option allows you to force all variable names to use either
21294 * camelCase style or UPPER_CASE with underscores.
21295 *
21296 * @deprecated JSHint is limiting its scope to issues of code correctness.
21297 * If you would like to enforce rules relating to code style,
21298 * check out [the JSCS
21299 * project](https://github.com/jscs-dev/node-jscs).
21300 */
21301 camelcase : true,
21302
21303 /**
21304 * This option requires you to always put curly braces around blocks in
21305 * loops and conditionals. JavaScript allows you to omit curly braces when
21306 * the block consists of only one statement, for example:
21307 *
21308 * while (day)
21309 * shuffle();
21310 *
21311 * However, in some circumstances, it can lead to bugs (you'd think that
21312 * `sleep()` is a part of the loop while in reality it is not):
21313 *
21314 * while (day)
21315 * shuffle();
21316 * sleep();
21317 */
21318 curly : true,
21319
21320 /**
21321 * This options prohibits the use of `==` and `!=` in favor of `===` and
21322 * `!==`. The former try to coerce values before comparing them which can
21323 * lead to some unexpected results. The latter don't do any coercion so
21324 * they are generally safer. If you would like to learn more about type
21325 * coercion in JavaScript, we recommend [Truth, Equality and
21326 * JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/)
21327 * by Angus Croll.
21328 */
21329 eqeqeq : true,
21330
21331 /**
21332 * This option enables warnings about the use of identifiers which are
21333 * defined in future versions of JavaScript. Although overwriting them has
21334 * no effect in contexts where they are not implemented, this practice can
21335 * cause issues when migrating codebases to newer versions of the language.
21336 */
21337 futurehostile: true,
21338
21339 /**
21340 * This option tells JSHint that your code needs to adhere to ECMAScript 3
21341 * specification. Use this option if you need your program to be executable
21342 * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy
21343 * JavaScript environments.
21344 *
21345 * @deprecated Use `esversion: 3` instead.
21346 */
21347 es3 : true,
21348
21349 /**
21350 * This option enables syntax first defined in [the ECMAScript 5.1
21351 * specification](http://es5.github.io/). This includes allowing reserved
21352 * keywords as object properties.
21353 *
21354 * @deprecated Use `esversion: 5` instead.
21355 */
21356 es5 : true,
21357
21358 /**
21359 * This option requires all `for in` loops to filter object's items. The
21360 * for in statement allows for looping through the names of all of the
21361 * properties of an object including those inherited through the prototype
21362 * chain. This behavior can lead to unexpected items in your object so it
21363 * is generally safer to always filter inherited properties out as shown in
21364 * the example:
21365 *
21366 * for (key in obj) {
21367 * if (obj.hasOwnProperty(key)) {
21368 * // We are sure that obj[key] belongs to the object and was not inherited.
21369 * }
21370 * }
21371 *
21372 * For more in-depth understanding of `for in` loops in JavaScript, read
21373 * [Exploring JavaScript for-in
21374 * loops](http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/)
21375 * by Angus Croll.
21376 */
21377 forin : true,
21378
21379 /**
21380 * This option prohibits the use of immediate function invocations without
21381 * wrapping them in parentheses. Wrapping parentheses assists readers of
21382 * your code in understanding that the expression is the result of a
21383 * function, and not the function itself.
21384 *
21385 * @deprecated JSHint is limiting its scope to issues of code correctness.
21386 * If you would like to enforce rules relating to code style,
21387 * check out [the JSCS
21388 * project](https://github.com/jscs-dev/node-jscs).
21389 */
21390 immed : true,
21391
21392 /**
21393 * This option prohibits unnecessary clauses within `switch` statements,
21394 * e.g.
21395 *
21396 * switch (x) {
21397 * case 1:
21398 * default:
21399 * z();
21400 * }
21401 *
21402 * While clauses like these are techincally valid, they do not effect
21403 * program behavior and may indicate an erroneous refactoring.
21404 */
21405 leanswitch : true,
21406
21407 /**
21408 * This option requires you to capitalize names of constructor functions.
21409 * Capitalizing functions that are intended to be used with `new` operator
21410 * is just a convention that helps programmers to visually distinguish
21411 * constructor functions from other types of functions to help spot
21412 * mistakes when using `this`.
21413 *
21414 * Not doing so won't break your code in any browsers or environments but
21415 * it will be a bit harder to figure out—by reading the code—if the
21416 * function was supposed to be used with or without new. And this is
21417 * important because when the function that was intended to be used with
21418 * `new` is used without it, `this` will point to the global object instead
21419 * of a new object.
21420 *
21421 * @deprecated JSHint is limiting its scope to issues of code correctness.
21422 * If you would like to enforce rules relating to code style,
21423 * check out [the JSCS
21424 * project](https://github.com/jscs-dev/node-jscs).
21425 */
21426 newcap : true,
21427
21428 /**
21429 * This option prohibits the use of `arguments.caller` and
21430 * `arguments.callee`. Both `.caller` and `.callee` make quite a few
21431 * optimizations impossible so they were deprecated in future versions of
21432 * JavaScript. In fact, ECMAScript 5 forbids the use of `arguments.callee`
21433 * in strict mode.
21434 */
21435 noarg : true,
21436
21437 /**
21438 * This option prohibits the use of the comma operator. When misused, the
21439 * comma operator can obscure the value of a statement and promote
21440 * incorrect code.
21441 */
21442 nocomma : true,
21443
21444 /**
21445 * This option warns when you have an empty block in your code. JSLint was
21446 * originally warning for all empty blocks and we simply made it optional.
21447 * There were no studies reporting that empty blocks in JavaScript break
21448 * your code in any way.
21449 *
21450 * @deprecated JSHint is limiting its scope to issues of code correctness.
21451 * If you would like to enforce rules relating to code style,
21452 * check out [the JSCS
21453 * project](https://github.com/jscs-dev/node-jscs).
21454 */
21455 noempty : true,
21456
21457 /**
21458 * This option warns about "non-breaking whitespace" characters. These
21459 * characters can be entered with option-space on Mac computers and have a
21460 * potential of breaking non-UTF8 web pages.
21461 */
21462 nonbsp : true,
21463
21464 /**
21465 * This option prohibits the use of constructor functions for side-effects.
21466 * Some people like to call constructor functions without assigning its
21467 * result to any variable:
21468 *
21469 * new MyConstructor();
21470 *
21471 * There is no advantage in this approach over simply calling
21472 * `MyConstructor` since the object that the operator `new` creates isn't
21473 * used anywhere so you should generally avoid constructors like this one.
21474 */
21475 nonew : true,
21476
21477
21478 /**
21479 * Async functions resolve on their return value. In most cases, this makes
21480 * returning the result of an AwaitExpression (which is itself a Promise
21481 * instance) unnecessary. For clarity, it's often preferable to return the
21482 * result of the asynchronous operation directly. The notable exception is
21483 * within the `try` clause of a TryStatement--for more, see "await vs
21484 * return vs return await":
21485 *
21486 * https://jakearchibald.com/2017/await-vs-return-vs-return-await/
21487 */
21488 noreturnawait: true,
21489
21490 /**
21491 * This option enables warnings for regular expressions which do not
21492 * include the "u" flag. The "u" flag extends support for Unicode and also
21493 * enables more strict parsing rules. JSHint will enforce these rules even
21494 * if it is executed in a JavaScript engine which does not support the "u"
21495 * flag.
21496 */
21497 regexpu : true,
21498
21499 /**
21500 * This option prohibits the use of explicitly undeclared variables. This
21501 * option is very useful for spotting leaking and mistyped variables.
21502 *
21503 * // jshint undef:true
21504 *
21505 * function test() {
21506 * var myVar = 'Hello, World';
21507 * console.log(myvar); // Oops, typoed here. JSHint with undef will complain
21508 * }
21509 *
21510 * If your variable is defined in another file, you can use the `global`
21511 * directive to tell JSHint about it.
21512 */
21513 undef : true,
21514
21515 /**
21516 * This option prohibits the use of the grouping operator when it is not
21517 * strictly required. Such usage commonly reflects a misunderstanding of
21518 * unary operators, for example:
21519 *
21520 * // jshint singleGroups: true
21521 *
21522 * delete(obj.attr); // Warning: Unnecessary grouping operator.
21523 */
21524 singleGroups: false,
21525
21526 /**
21527 * When set to true, the use of VariableStatements are forbidden.
21528 * For example:
21529 *
21530 * // jshint varstmt: true
21531 *
21532 * var a; // Warning: `var` declarations are forbidden. Use `let` or `const` instead.
21533 */
21534 varstmt: false,
21535
21536 /**
21537 * This option is a short hand for the most strict JSHint configuration as
21538 * available in JSHint version 2.6.3. It enables all enforcing options and
21539 * disables all relaxing options that were defined in that release.
21540 *
21541 * @deprecated The option cannot be maintained without automatically opting
21542 * users in to new features. This can lead to unexpected
21543 * warnings/errors in when upgrading between minor versions of
21544 * JSHint.
21545 */
21546 enforceall : false,
21547
21548 /**
21549 * This option warns when a comma is not placed after the last element in an
21550 * array or object literal. Due to bugs in old versions of IE, trailing
21551 * commas used to be discouraged, but since ES5 their semantics were
21552 * standardized. (See
21553 * [#11.1.4](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.4) and
21554 * [#11.1.5](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5).)
21555 * Now, they help to prevent the same [visual
21556 * ambiguities](http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.2)
21557 * that the strict usage of semicolons helps prevent.
21558 *
21559 * For example, this code might have worked last Tuesday:
21560 *
21561 * [
21562 * b + c
21563 * ].forEach(print);
21564 *
21565 * But if one adds an element to the array and forgets to compensate for the
21566 * missing comma, no syntax error is thrown, and a linter cannot determine
21567 * if this was a mistake or an intentional function invocation.
21568 *
21569 * [
21570 * b + c
21571 * (d + e)
21572 * ].forEach(print);
21573 *
21574 * If one always appends a list item with a comma, this ambiguity cannot
21575 * occur:
21576 *
21577 * [
21578 * b + c,
21579 * ].forEach(print);
21580 *
21581 * [
21582 * b + c,
21583 * (d + e),
21584 * ].forEach(print);
21585 */
21586 trailingcomma: false
21587 },
21588 relaxing: {
21589
21590 /**
21591 * This option suppresses warnings about missing semicolons. There is a lot
21592 * of FUD about semicolon spread by quite a few people in the community.
21593 * The common myths are that semicolons are required all the time (they are
21594 * not) and that they are unreliable. JavaScript has rules about semicolons
21595 * which are followed by *all* browsers so it is up to you to decide
21596 * whether you should or should not use semicolons in your code.
21597 *
21598 * For more information about semicolons in JavaScript read [An Open Letter
21599 * to JavaScript Leaders Regarding
21600 * Semicolons](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding)
21601 * by Isaac Schlueter and [JavaScript Semicolon
21602 * Insertion](http://inimino.org/~inimino/blog/javascript_semicolons).
21603 */
21604 asi : true,
21605
21606 /**
21607 * This option suppresses warnings about multi-line strings. Multi-line
21608 * strings can be dangerous in JavaScript because all hell breaks loose if
21609 * you accidentally put a whitespace in between the escape character (`\`)
21610 * and a new line.
21611 *
21612 * Note that even though this option allows correct multi-line strings, it
21613 * still warns about multi-line strings without escape characters or with
21614 * anything in between the escape character and a whitespace.
21615 *
21616 * // jshint multistr:true
21617 *
21618 * var text = "Hello\
21619 * World"; // All good.
21620 *
21621 * text = "Hello
21622 * World"; // Warning, no escape character.
21623 *
21624 * text = "Hello\
21625 * World"; // Warning, there is a space after \
21626 *
21627 * @deprecated JSHint is limiting its scope to issues of code correctness.
21628 * If you would like to enforce rules relating to code style,
21629 * check out [the JSCS
21630 * project](https://github.com/jscs-dev/node-jscs).
21631 */
21632 multistr : true,
21633
21634 /**
21635 * This option suppresses warnings about the `debugger` statements in your
21636 * code.
21637 */
21638 debug : true,
21639
21640 /**
21641 * This option suppresses warnings about the use of assignments in cases
21642 * where comparisons are expected. More often than not, code like `if (a =
21643 * 10) {}` is a typo. However, it can be useful in cases like this one:
21644 *
21645 * for (var i = 0, person; person = people[i]; i++) {}
21646 *
21647 * You can silence this error on a per-use basis by surrounding the assignment
21648 * with parenthesis, such as:
21649 *
21650 * for (var i = 0, person; (person = people[i]); i++) {}
21651 */
21652 boss : true,
21653
21654 /**
21655 * This option suppresses warnings about the use of `eval`. The use of
21656 * `eval` is discouraged because it can make your code vulnerable to
21657 * various injection attacks and it makes it hard for JavaScript
21658 * interpreter to do certain optimizations.
21659 */
21660 evil : true,
21661
21662 /**
21663 * This option suppresses warnings about declaring variables inside
21664 * of control structures while accessing them later from the outside.
21665 * Even though identifiers declared with `var` have two real scopes—global
21666 * and function—such practice leads to confusion among people new to
21667 * the language and hard-to-debug bugs. This is why, by default, JSHint
21668 * warns about variables that are used outside of their intended scope.
21669 *
21670 * function test() {
21671 * if (true) {
21672 * var x = 0;
21673 * }
21674 *
21675 * x += 1; // Default: 'x' used out of scope.
21676 * // No warning when funcscope:true
21677 * }
21678 */
21679 funcscope : true,
21680
21681 /**
21682 * This option suppresses warnings about the use of global strict mode.
21683 * Global strict mode can break third-party widgets so it is not
21684 * recommended.
21685 *
21686 * For more info about strict mode see the `strict` option.
21687 *
21688 * @deprecated Use `strict: "global"`.
21689 */
21690 globalstrict: true,
21691
21692 /**
21693 * This option suppresses warnings about the `__iterator__` property. This
21694 * property is not supported by all browsers so use it carefully.
21695 */
21696 iterator : true,
21697
21698 /**
21699 * This option suppresses warnings about invalid `typeof` operator values.
21700 * This operator has only [a limited set of possible return
21701 * values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof).
21702 * By default, JSHint warns when you compare its result with an invalid
21703 * value which often can be a typo.
21704 *
21705 * // 'fuction' instead of 'function'
21706 * if (typeof a == "fuction") { // Invalid typeof value 'fuction'
21707 * // ...
21708 * }
21709 *
21710 * Do not use this option unless you're absolutely sure you don't want
21711 * these checks.
21712 */
21713 notypeof : true,
21714
21715 /**
21716 * This option prohibits the use of unary increment and decrement
21717 * operators. Some people think that `++` and `--` reduces the quality of
21718 * their coding styles and there are programming languages—such as
21719 * Python—that go completely without these operators.
21720 */
21721 plusplus : true,
21722
21723 /**
21724 * This option suppresses warnings about the `__proto__` property.
21725 */
21726 proto : true,
21727
21728 /**
21729 * This option suppresses warnings about the use of script-targeted
21730 * URLs—such as `javascript:...`.
21731 */
21732 scripturl : true,
21733
21734 /**
21735 * This option suppresses warnings about using `[]` notation when it can be
21736 * expressed in dot notation: `person['name']` vs. `person.name`.
21737 *
21738 * @deprecated JSHint is limiting its scope to issues of code correctness.
21739 * If you would like to enforce rules relating to code style,
21740 * check out [the JSCS
21741 * project](https://github.com/jscs-dev/node-jscs).
21742 */
21743 sub : true,
21744
21745 /**
21746 * This option suppresses warnings about "weird" constructions like
21747 * `new function () { ... }` and `new Object;`. Such constructions are
21748 * sometimes used to produce singletons in JavaScript:
21749 *
21750 * var singleton = new function() {
21751 * var privateVar;
21752 *
21753 * this.publicMethod = function () {}
21754 * this.publicMethod2 = function () {}
21755 * };
21756 */
21757 supernew : true,
21758
21759 /**
21760 * This option suppresses most of the warnings about possibly unsafe line
21761 * breakings in your code. It doesn't suppress warnings about comma-first
21762 * coding style. To suppress those you have to use `laxcomma` (see below).
21763 *
21764 * @deprecated JSHint is limiting its scope to issues of code correctness.
21765 * If you would like to enforce rules relating to code style,
21766 * check out [the JSCS
21767 * project](https://github.com/jscs-dev/node-jscs).
21768 */
21769 laxbreak : true,
21770
21771 /**
21772 * This option suppresses warnings about comma-first coding style:
21773 *
21774 * var obj = {
21775 * name: 'Anton'
21776 * , handle: 'valueof'
21777 * , role: 'SW Engineer'
21778 * };
21779 *
21780 * @deprecated JSHint is limiting its scope to issues of code correctness.
21781 * If you would like to enforce rules relating to code style,
21782 * check out [the JSCS
21783 * project](https://github.com/jscs-dev/node-jscs).
21784 */
21785 laxcomma : true,
21786
21787 /**
21788 * This option suppresses warnings about possible strict violations when
21789 * the code is running in strict mode and you use `this` in a
21790 * non-constructor function. You should use this option—in a function scope
21791 * only—when you are positive that your use of `this` is valid in the
21792 * strict mode (for example, if you call your function using
21793 * `Function.call`).
21794 *
21795 * **Note:** This option can be used only inside of a function scope.
21796 * JSHint will fail with an error if you will try to set this option
21797 * globally.
21798 */
21799 validthis : true,
21800
21801 /**
21802 * This option suppresses warnings about the use of the `with` statement.
21803 * The semantics of the `with` statement can cause confusion among
21804 * developers and accidental definition of global variables.
21805 *
21806 * More info:
21807 *
21808 * * [with Statement Considered
21809 * Harmful](http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/)
21810 */
21811 withstmt : true,
21812
21813 /**
21814 * This options tells JSHint that your code uses Mozilla JavaScript
21815 * extensions. Unless you develop specifically for the Firefox web browser
21816 * you don't need this option.
21817 *
21818 * More info:
21819 *
21820 * * [New in JavaScript
21821 * 1.7](https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7)
21822 */
21823 moz : true,
21824
21825 /**
21826 * This option suppresses warnings about generator functions with no
21827 * `yield` statement in them.
21828 */
21829 noyield : true,
21830
21831 /**
21832 * This option suppresses warnings about `== null` comparisons. Such
21833 * comparisons are often useful when you want to check if a variable is
21834 * `null` or `undefined`.
21835 */
21836 eqnull : true,
21837
21838 /**
21839 * This option suppresses warnings about missing semicolons, but only when
21840 * the semicolon is omitted for the last statement in a one-line block:
21841 *
21842 * var name = (function() { return 'Anton' }());
21843 *
21844 * This is a very niche use case that is useful only when you use automatic
21845 * JavaScript code generators.
21846 */
21847 lastsemic : true,
21848
21849 /**
21850 * This option suppresses warnings about functions inside of loops.
21851 * Defining functions inside of loops can lead to bugs such as this one:
21852 *
21853 * var nums = [];
21854 *
21855 * for (var i = 0; i < 10; i++) {
21856 * nums[i] = function (j) {
21857 * return i + j;
21858 * };
21859 * }
21860 *
21861 * nums[0](2); // Prints 12 instead of 2
21862 *
21863 * To fix the code above you need to copy the value of `i`:
21864 *
21865 * var nums = [];
21866 *
21867 * for (var i = 0; i < 10; i++) {
21868 * (function (i) {
21869 * nums[i] = function (j) {
21870 * return i + j;
21871 * };
21872 * }(i));
21873 * }
21874 */
21875 loopfunc : true,
21876
21877 /**
21878 * This option suppresses warnings about the use of expressions where
21879 * normally you would expect to see assignments or function calls. Most of
21880 * the time, such code is a typo. However, it is not forbidden by the spec
21881 * and that's why this warning is optional.
21882 */
21883 expr : true,
21884
21885 /**
21886 * This option tells JSHint that your code uses ECMAScript 6 specific
21887 * syntax. Note that not all browsers implement these features.
21888 *
21889 * More info:
21890 *
21891 * * [Specification for ECMAScript
21892 * 6](http://www.ecma-international.org/ecma-262/6.0/index.html)
21893 *
21894 * @deprecated Use `esversion: 6` instead.
21895 */
21896 esnext : true,
21897
21898 /**
21899 * This option tells JSHint that your code uses ES3 array elision elements,
21900 * or empty elements (for example, `[1, , , 4, , , 7]`).
21901 */
21902 elision : true,
21903 },
21904
21905 // Third party globals
21906 environments: {
21907
21908 /**
21909 * This option defines globals exposed by the
21910 * [MooTools](http://mootools.net/) JavaScript framework.
21911 */
21912 mootools : true,
21913
21914 /**
21915 * This option defines globals exposed by
21916 * [CouchDB](http://couchdb.apache.org/). CouchDB is a document-oriented
21917 * database that can be queried and indexed in a MapReduce fashion using
21918 * JavaScript.
21919 */
21920 couch : true,
21921
21922 /**
21923 * This option defines globals exposed by [the Jasmine unit testing
21924 * framework](https://jasmine.github.io/).
21925 */
21926 jasmine : true,
21927
21928 /**
21929 * This option defines globals exposed by the [jQuery](http://jquery.com/)
21930 * JavaScript library.
21931 */
21932 jquery : true,
21933
21934 /**
21935 * This option defines globals available when your code is running inside
21936 * of the Node runtime environment. [Node.js](http://nodejs.org/) is a
21937 * server-side JavaScript environment that uses an asynchronous
21938 * event-driven model. This option also skips some warnings that make sense
21939 * in the browser environments but don't make sense in Node such as
21940 * file-level `use strict` pragmas and `console.log` statements.
21941 */
21942 node : true,
21943
21944 /**
21945 * This option defines globals exposed by [the QUnit unit testing
21946 * framework](http://qunitjs.com/).
21947 */
21948 qunit : true,
21949
21950 /**
21951 * This option defines globals available when your code is running inside
21952 * of the Rhino runtime environment. [Rhino](http://www.mozilla.org/rhino/)
21953 * is an open-source implementation of JavaScript written entirely in Java.
21954 */
21955 rhino : true,
21956
21957 /**
21958 * This option defines globals exposed by [the ShellJS
21959 * library](http://documentup.com/arturadib/shelljs).
21960 */
21961 shelljs : true,
21962
21963 /**
21964 * This option defines globals exposed by the
21965 * [Prototype](http://www.prototypejs.org/) JavaScript framework.
21966 */
21967 prototypejs : true,
21968
21969 /**
21970 * This option defines globals exposed by the [YUI](http://yuilibrary.com/)
21971 * JavaScript framework.
21972 */
21973 yui : true,
21974
21975 /**
21976 * This option defines globals exposed by the "BDD" and "TDD" UIs of the
21977 * [Mocha unit testing framework](http://mochajs.org/).
21978 */
21979 mocha : true,
21980
21981 /**
21982 * This option informs JSHint that the input code describes an ECMAScript 6
21983 * module. All module code is interpreted as strict mode code.
21984 */
21985 module : true,
21986
21987 /**
21988 * This option defines globals available when your code is running as a
21989 * script for the [Windows Script
21990 * Host](http://en.wikipedia.org/wiki/Windows_Script_Host).
21991 */
21992 wsh : true,
21993
21994 /**
21995 * This option defines globals available when your code is running inside
21996 * of a Web Worker. [Web
21997 * Workers](https://developer.mozilla.org/en/Using_web_workers) provide a
21998 * simple means for web content to run scripts in background threads.
21999 */
22000 worker : true,
22001
22002 /**
22003 * This option defines non-standard but widely adopted globals such as
22004 * `escape` and `unescape`.
22005 */
22006 nonstandard : true,
22007
22008 /**
22009 * This option defines globals exposed by modern browsers: all the way from
22010 * good old `document` and `navigator` to the HTML5 `FileReader` and other
22011 * new developments in the browser world.
22012 *
22013 * **Note:** This option doesn't expose variables like `alert` or
22014 * `console`. See option `devel` for more information.
22015 */
22016 browser : true,
22017
22018 /**
22019 * This option defines globals available when using [the Browserify
22020 * tool](http://browserify.org/) to build a project.
22021 */
22022 browserify : true,
22023
22024 /**
22025 * This option defines globals that are usually used for logging poor-man's
22026 * debugging: `console`, `alert`, etc. It is usually a good idea to not
22027 * ship them in production because, for example, `console.log` breaks in
22028 * legacy versions of Internet Explorer.
22029 */
22030 devel : true,
22031
22032 /**
22033 * This option defines globals exposed by the [Dojo
22034 * Toolkit](http://dojotoolkit.org/).
22035 */
22036 dojo : true,
22037
22038 /**
22039 * This option defines globals for typed array constructors.
22040 *
22041 * More info:
22042 *
22043 * * [JavaScript typed
22044 * arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays)
22045 */
22046 typed : true,
22047
22048 /**
22049 * This option defines globals available when your core is running inside
22050 * of the PhantomJS runtime environment. [PhantomJS](http://phantomjs.org/)
22051 * is a headless WebKit scriptable with a JavaScript API. It has fast and
22052 * native support for various web standards: DOM handling, CSS selector,
22053 * JSON, Canvas, and SVG.
22054 */
22055 phantom : true
22056 },
22057
22058 // Obsolete options
22059 obsolete: {
22060 onecase : true, // if one case switch statements should be allowed
22061 regexp : true, // if the . should not be allowed in regexp literals
22062 regexdash : true // if unescaped first/last dash (-) inside brackets
22063 // should be tolerated
22064 }
22065 };
22066
22067 // These are the JSHint options that can take any value
22068 // (we use this object to detect invalid options)
22069 exports.val = {
22070
22071 /**
22072 * This option lets you set the maximum length of a line.
22073 *
22074 * @deprecated JSHint is limiting its scope to issues of code correctness. If
22075 * you would like to enforce rules relating to code style, check
22076 * out [the JSCS project](https://github.com/jscs-dev/node-jscs).
22077 */
22078 maxlen : false,
22079
22080 /**
22081 * This option sets a specific tab width for your code.
22082 *
22083 * @deprecated JSHint is limiting its scope to issues of code correctness. If
22084 * you would like to enforce rules relating to code style, check
22085 * out [the JSCS project](https://github.com/jscs-dev/node-jscs).
22086 */
22087 indent : false,
22088
22089 /**
22090 * This options allows you to set the maximum amount of warnings JSHint will
22091 * produce before giving up. Default is 50.
22092 */
22093 maxerr : false,
22094
22095 /**
22096 * This option allows you to control which variables JSHint considers to be
22097 * implicitly defined in the environment. Configure it with an array of
22098 * string values. Prefixing a variable name with a hyphen (-) character will
22099 * remove that name from the collection of predefined variables.
22100 *
22101 * JSHint will consider variables declared in this way to be read-only.
22102 *
22103 * This option cannot be specified in-line; it may only be used via the
22104 * JavaScript API or from an external configuration file.
22105 */
22106 predef : false,
22107
22108 /**
22109 * This option can be used to specify a white list of global variables that
22110 * are not formally defined in the source code. This is most useful when
22111 * combined with the `undef` option in order to suppress warnings for
22112 * project-specific global variables.
22113 *
22114 * Setting an entry to `true` enables reading and writing to that variable.
22115 * Setting it to `false` will trigger JSHint to consider that variable
22116 * read-only.
22117 *
22118 * See also the "environment" options: a set of options to be used as short
22119 * hand for enabling global variables defined in common JavaScript
22120 * environments.
22121 *
22122 * To configure `globals` within an individual file, see [Inline
22123 * Configuration](http://jshint.com/docs/#inline-configuration).
22124 */
22125 globals : false,
22126
22127 /**
22128 * This option enforces the consistency of quotation marks used throughout
22129 * your code. It accepts three values: `true` if you don't want to enforce
22130 * one particular style but want some consistency, `"single"` if you want to
22131 * allow only single quotes and `"double"` if you want to allow only double
22132 * quotes.
22133 *
22134 * @deprecated JSHint is limiting its scope to issues of code correctness. If
22135 * you would like to enforce rules relating to code style, check
22136 * out [the JSCS project](https://github.com/jscs-dev/node-jscs).
22137 */
22138 quotmark : false,
22139
22140 scope : false,
22141
22142 /**
22143 * This option lets you set the max number of statements allowed per function:
22144 *
22145 * // jshint maxstatements:4
22146 *
22147 * function main() {
22148 * var i = 0;
22149 * var j = 0;
22150 *
22151 * // Function declarations count as one statement. Their bodies
22152 * // don't get taken into account for the outer function.
22153 * function inner() {
22154 * var i2 = 1;
22155 * var j2 = 1;
22156 *
22157 * return i2 + j2;
22158 * }
22159 *
22160 * j = i + j;
22161 * return j; // JSHint: Too many statements per function. (5)
22162 * }
22163 */
22164 maxstatements: false,
22165
22166 /**
22167 * This option lets you control how nested do you want your blocks to be:
22168 *
22169 * // jshint maxdepth:2
22170 *
22171 * function main(meaning) {
22172 * var day = true;
22173 *
22174 * if (meaning === 42) {
22175 * while (day) {
22176 * shuffle();
22177 *
22178 * if (tired) { // JSHint: Blocks are nested too deeply (3).
22179 * sleep();
22180 * }
22181 * }
22182 * }
22183 * }
22184 */
22185 maxdepth : false,
22186
22187 /**
22188 * This option lets you set the max number of formal parameters allowed per
22189 * function:
22190 *
22191 * // jshint maxparams:3
22192 *
22193 * function login(request, onSuccess) {
22194 * // ...
22195 * }
22196 *
22197 * // JSHint: Too many parameters per function (4).
22198 * function logout(request, isManual, whereAmI, onSuccess) {
22199 * // ...
22200 * }
22201 */
22202 maxparams : false,
22203
22204 /**
22205 * This option lets you control cyclomatic complexity throughout your code.
22206 * Cyclomatic complexity measures the number of linearly independent paths
22207 * through a program's source code. Read more about [cyclomatic complexity on
22208 * Wikipedia](http://en.wikipedia.org/wiki/Cyclomatic_complexity).
22209 */
22210 maxcomplexity: false,
22211
22212 /**
22213 * This option suppresses warnings about variable shadowing i.e. declaring a
22214 * variable that had been already declared somewhere in the outer scope.
22215 *
22216 * - "inner" - check for variables defined in the same scope only
22217 * - "outer" - check for variables defined in outer scopes as well
22218 * - false - same as inner
22219 * - true - allow variable shadowing
22220 */
22221 shadow : false,
22222
22223 /**
22224 * This option requires the code to run in ECMAScript 5's strict mode.
22225 * [Strict mode](https://developer.mozilla.org/en/JavaScript/Strict_mode)
22226 * is a way to opt in to a restricted variant of JavaScript. Strict mode
22227 * eliminates some JavaScript pitfalls that didn't cause errors by changing
22228 * them to produce errors. It also fixes mistakes that made it difficult
22229 * for the JavaScript engines to perform certain optimizations.
22230 *
22231 * - "global" - there must be a `"use strict";` directive at global level
22232 * - "implied" - lint the code as if there is the `"use strict";` directive
22233 * - false - disable warnings about strict mode
22234 * - true - there must be a `"use strict";` directive at function level;
22235 * this is preferable for scripts intended to be loaded in web
22236 * browsers directly because enabling strict mode globally
22237 * could adversely effect other scripts running on the same
22238 * page
22239 */
22240 strict : true,
22241
22242 /**
22243 * This option warns when you define and never use your variables. It is very
22244 * useful for general code cleanup, especially when used in addition to
22245 * `undef`.
22246 *
22247 * // jshint unused:true
22248 *
22249 * function test(a, b) {
22250 * var c, d = 2;
22251 *
22252 * return a + d;
22253 * }
22254 *
22255 * test(1, 2);
22256 *
22257 * // Line 3: 'b' was defined but never used.
22258 * // Line 4: 'c' was defined but never used.
22259 *
22260 * In addition to that, this option will warn you about unused global
22261 * variables declared via the `global` directive.
22262 *
22263 * When set to `true`, unused parameters that are followed by a used
22264 * parameter will not produce warnings. This option can be set to `vars` to
22265 * only check for variables, not function parameters, or `strict` to check
22266 * all variables and parameters.
22267 */
22268 unused : true,
22269
22270 /**
22271 * This option prohibits the use of a variable before it was defined.
22272 * JavaScript has function scope only and, in addition to that, all variables
22273 * are always moved—or hoisted— to the top of the function. This behavior can
22274 * lead to some very nasty bugs and that's why it is safer to always use
22275 * variable only after they have been explicitly defined.
22276 *
22277 * Setting this option to "nofunc" will allow function declarations to be
22278 * ignored.
22279 *
22280 * For more in-depth understanding of scoping and hoisting in JavaScript,
22281 * read [JavaScript Scoping and
22282 * Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)
22283 * by Ben Cherry.
22284 */
22285 latedef : false,
22286
22287 ignore : false, // start/end ignoring lines of code, bypassing the lexer
22288 // start - start ignoring lines, including the current line
22289 // end - stop ignoring lines, starting on the next line
22290 // line - ignore warnings / errors for just a single line
22291 // (this option does not bypass the lexer)
22292
22293 ignoreDelimiters: false, // array of start/end delimiters used to ignore
22294 // certain chunks from code
22295
22296 /**
22297 * This option is used to specify the ECMAScript version to which the code
22298 * must adhere. It can assume one of the following values:
22299 * - `3` - If you need your program to be executable
22300 * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy
22301 * JavaScript environments
22302 * - `5` - To enable syntax first defined in [the ECMAScript 5.1
22303 * specification](http://www.ecma-international.org/ecma-262/5.1/index.html).
22304 * This includes allowing reserved keywords as object properties.
22305 * - `6` - To tell JSHint that your code uses [ECMAScript
22306 * 6](http://www.ecma-international.org/ecma-262/6.0/index.html) specific
22307 * syntax. Note that not all browsers implement them.
22308 * - `7` - To enable language features introduced by [ECMAScript
22309 * 7](https://www.ecma-international.org/ecma-262/7.0/index.html). Notable
22310 * additions: the exponentiation operator.
22311 * - `8` - To enable language features introduced by [ECMAScript
22312 * 8](https://www.ecma-international.org/ecma-262/8.0/index.html). Notable
22313 * additions: async functions, shared memory, and atomics
22314 * - `9` - To enable language features introduced by [ECMAScript
22315 * 9](https://www.ecma-international.org/ecma-262/9.0/index.html). Notable
22316 * additions: asynchronous iteration, rest/spread properties, and various
22317 * RegExp extensions
22318 * - `10` - To enable language features introduced by ECMAScript
22319 * 10](https://www.ecma-international.org/ecma-262/10.0/index.html).
22320 * Notable additions: optional catch bindings.
22321 */
22322 esversion: 5
22323 };
22324
22325 /**
22326 * Unstable options allow control for parsing and linting of proposed additions
22327 * to the JavaScript language. Just like the language features they describe,
22328 * the presence and behavior of these options is volatile; JSHint reserves the
22329 * right to remove or modify them between major version releases.
22330 */
22331 exports.unstable = {
22332 /**
22333 * [The BigInt proposal](https://github.com/tc39/proposal-bigint) extends the
22334 * language's grammer for numeric literals to support integer values of
22335 * arbitrary precision. It also introduces a new value of the `typeof`
22336 * operator, "bigint".
22337 *
22338 * Mathematical operations which use both BigInt and traditional ECMAScript
22339 * Number values may not have the intended effect. Due to the weakly-typed
22340 * nature of the language, JSHint is unable to identify such cases.
22341 */
22342 bigint: true
22343 };
22344
22345 // These are JSHint boolean options which are shared with JSLint
22346 // where the definition in JSHint is opposite JSLint
22347 exports.inverted = {
22348 bitwise : true,
22349 forin : true,
22350 newcap : true,
22351 plusplus: true,
22352 regexp : true,
22353 undef : true,
22354
22355 // Inverted and renamed, use JSHint name here
22356 eqeqeq : true,
22357 strict : true
22358 };
22359
22360 exports.validNames = Object.keys(exports.val)
22361 .concat(Object.keys(exports.bool.relaxing))
22362 .concat(Object.keys(exports.bool.enforcing))
22363 .concat(Object.keys(exports.bool.obsolete))
22364 .concat(Object.keys(exports.bool.environments))
22365 .concat(["unstable"]);
22366
22367 exports.unstableNames = Object.keys(exports.unstable);
22368
22369 // These are JSHint boolean options which are shared with JSLint
22370 // where the name has been changed but the effect is unchanged
22371 exports.renamed = {
22372 eqeq : "eqeqeq",
22373 windows: "wsh",
22374 sloppy : "strict"
22375 };
22376
22377 exports.removed = {
22378 nomen: true,
22379 onevar: true,
22380 passfail: true,
22381 white: true,
22382 gcl: true,
22383 smarttabs: true,
22384 trailing: true
22385 };
22386
22387 // Add options here which should not be automatically enforced by
22388 // `enforceall`.
22389 exports.noenforceall = {
22390 varstmt: true,
22391 strict: true,
22392 regexpu: true
22393 };
22394
22395 },{}],21:[function(require,module,exports){
22396 /**
22397 * This module defines a set of enum-like values intended for use as bit
22398 * "flags" during parsing. The ECMAScript grammar defines a number of such
22399 * "production parameters" to control how certain forms are parsed in context.
22400 * JSHint implements additional parameters to facilitate detection of lint
22401 * warnings.
22402 *
22403 * An equivalent implementation which described the context in terms of a
22404 * "lookup table" object would be more idiomatic for a JavaScript project like
22405 * JSHint. However, because the number of contexts scales with the number of
22406 * expressions in the input program, this would have non-negligible impact on
22407 * the process's memory footprint.
22408 */
22409 module.exports = {
22410 /**
22411 * Enabled when parsing expressions within ES2015 "export" declarations,
22412 * allowing otherwise-unreferenced bindings to be considered "used".
22413 */
22414 export: 1,
22415
22416 /**
22417 * Enabled when parsing expressions within the head of `for` statements,
22418 * allowing to distinguish between `for-in` and "C-style" `for` statements.
22419 */
22420 noin: 2,
22421
22422 /**
22423 * Enabled when the expression begins the statement, allowing the parser to
22424 * correctly select between the null denotation ("nud") and first null
22425 * denotation ("fud") parsing strategy.
22426 */
22427 initial: 4,
22428
22429 preAsync: 8,
22430
22431 async: 16,
22432
22433 /**
22434 * Enabled when any exception thrown by the expression will be caught by a
22435 * TryStatement.
22436 */
22437 tryClause: 32,
22438
22439 /**
22440 * Enabled when parsing the body of a generator function.
22441 */
22442 yield: 64
22443 };
22444
22445 },{}],22:[function(require,module,exports){
22446 /*
22447 * Regular expressions. Some of these are stupidly long.
22448 */
22449
22450 /*jshint maxlen:1000 */
22451
22452 "use strict";
22453
22454 // Unsafe comment or string (ax)
22455 exports.unsafeString =
22456 /@cc|<\/?|script|\]\s*\]|<\s*!|&lt/i;
22457
22458 // Characters in strings that need escaping (nx and nxg)
22459 exports.needEsc =
22460 /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
22461
22462 exports.needEscGlobal =
22463 /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
22464
22465 // Star slash (lx)
22466 exports.starSlash = /\*\//;
22467
22468 // Identifier (ix)
22469 exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;
22470
22471 // JavaScript URL (jx)
22472 exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
22473
22474 // Catches /* falls through */ comments (ft)
22475 exports.fallsThrough = /^\s*falls?\sthrough\s*$/;
22476
22477 // very conservative rule (eg: only one space between the start of the comment and the first character)
22478 // to relax the maxlen option
22479 exports.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/;
22480
22481 // Node.js releases prior to version 8 include a version of the V8 engine which
22482 // incorrectly interprets the character class escape `\s`. The following
22483 // regular expression may be replaced with `/\s/` when JSHint removes support
22484 // for Node.js versions prior to 8.
22485 // Source:
22486 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
22487 exports.whitespace = /[ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/;
22488
22489 exports.nonzeroDigit = /^[1-9]$/;
22490
22491 exports.decimalDigit = /^[0-9]$/;
22492
22493 exports.regexpSyntaxChars = /[\^$\\.*+?()[\]{}|]/;
22494
22495 exports.regexpQuantifiers = /[*+?{]/;
22496
22497 exports.regexpControlEscapes = /[fnrtv]/;
22498
22499 exports.regexpCharClasses = /[dDsSwW]/;
22500
22501 // Identifies the "dot" atom in regular expressions
22502 exports.regexpDot = /(^|[^\\])(\\\\)*\./;
22503
22504 },{}],23:[function(require,module,exports){
22505 "use strict";
22506 /**
22507 * A note on `__proto__`:
22508 *
22509 * This file uses ordinary objects to track identifiers that are observed in
22510 * the input source code. It creates these objects using `Object.create` so
22511 * that the tracking objects have no prototype, allowing the `__proto__`
22512 * property to be used to store a value *without* triggering the invocation of
22513 * the built-in `Object.prototype.__proto__` accessor method. Some environments
22514 * (e.g. PhantomJS) do not implement the correct semantics for property
22515 * enumeration. In those environments, methods like `Object.keys` and Lodash's
22516 * `values` do not include the property name. This file includes a number of
22517 * branches which ensure that JSHint behaves consistently in those
22518 * environments. The branches must be ignored by the test coverage verification
22519 * system because the workaround is not necessary in the environment where
22520 * coverage is verified (i.e. Node.js).
22521 */
22522
22523 var _ = require("lodash");
22524 var events = require("events");
22525
22526 // Used to denote membership in lookup tables (a primitive value such as `true`
22527 // would be silently rejected for the property name "__proto__" in some
22528 // environments)
22529 var marker = {};
22530
22531 /**
22532 * A factory function for creating scope managers. A scope manager tracks
22533 * bindings, detecting when variables are referenced (through "usages").
22534 *
22535 * @param {object} state - the global state object (see `state.js`)
22536 * @param {Array} predefined - a set of binding names for built-in bindings
22537 * provided by the environment
22538 * @param {object} exported - a hash for binding names that are intended to be
22539 * referenced in contexts beyond the current program
22540 * code
22541 * @param {object} declared - a hash for binding names that were defined as
22542 * global bindings via linting configuration
22543 *
22544 * @returns {object} - a scope manager
22545 */
22546 var scopeManager = function(state, predefined, exported, declared) {
22547
22548 var _current;
22549 var _scopeStack = [];
22550
22551 function _newScope(type) {
22552 _current = {
22553 "(bindings)": Object.create(null),
22554 "(usages)": Object.create(null),
22555 "(labels)": Object.create(null),
22556 "(parent)": _current,
22557 "(type)": type,
22558 "(params)": (type === "functionparams" || type === "catchparams") ? [] : null
22559 };
22560 _scopeStack.push(_current);
22561 }
22562
22563 _newScope("global");
22564 _current["(predefined)"] = predefined;
22565
22566 var _currentFunctBody = _current; // this is the block after the params = function
22567
22568 var usedPredefinedAndGlobals = Object.create(null);
22569 var impliedGlobals = Object.create(null);
22570 var unuseds = [];
22571 var emitter = new events.EventEmitter();
22572
22573 function warning(code, token) {
22574 emitter.emit("warning", {
22575 code: code,
22576 token: token,
22577 data: _.slice(arguments, 2)
22578 });
22579 }
22580
22581 function error(code, token) {
22582 emitter.emit("warning", {
22583 code: code,
22584 token: token,
22585 data: _.slice(arguments, 2)
22586 });
22587 }
22588
22589 function _setupUsages(bindingName) {
22590 if (!_current["(usages)"][bindingName]) {
22591 _current["(usages)"][bindingName] = {
22592 "(modified)": [],
22593 "(reassigned)": [],
22594 "(tokens)": []
22595 };
22596 }
22597 }
22598
22599 var _getUnusedOption = function(unused_opt) {
22600 if (unused_opt === undefined) {
22601 unused_opt = state.option.unused;
22602 }
22603
22604 if (unused_opt === true) {
22605 unused_opt = "last-param";
22606 }
22607
22608 return unused_opt;
22609 };
22610
22611 var _warnUnused = function(name, tkn, type, unused_opt) {
22612 var line = tkn.line;
22613 var chr = tkn.from;
22614 var raw_name = tkn.raw_text || name;
22615
22616 unused_opt = _getUnusedOption(unused_opt);
22617
22618 var warnable_types = {
22619 "vars": ["var"],
22620 "last-param": ["var", "param"],
22621 "strict": ["var", "param", "last-param"]
22622 };
22623
22624 if (unused_opt) {
22625 if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) {
22626 warning("W098", { line: line, from: chr }, raw_name);
22627 }
22628 }
22629
22630 // inconsistent - see gh-1894
22631 if (unused_opt || type === "var") {
22632 unuseds.push({
22633 name: name,
22634 line: line,
22635 character: chr
22636 });
22637 }
22638 };
22639
22640 /**
22641 * Check the current scope for unused identifiers
22642 */
22643 function _checkForUnused() {
22644 if (_current["(type)"] !== "functionparams") {
22645 var currentBindings = _current["(bindings)"];
22646 for (var bindingName in currentBindings) {
22647 if (currentBindings[bindingName]["(type)"] !== "exception" &&
22648 currentBindings[bindingName]["(unused)"]) {
22649 _warnUnused(bindingName, currentBindings[bindingName]["(token)"], "var");
22650 }
22651 }
22652 return;
22653 }
22654
22655 // Check the current scope for unused parameters and issue warnings as
22656 // necessary.
22657 var params = _current["(params)"];
22658
22659 var param = params.pop();
22660 var unused_opt;
22661
22662 while (param) {
22663 var binding = _current["(bindings)"][param];
22664
22665 unused_opt = _getUnusedOption(state.funct["(unusedOption)"]);
22666
22667 // 'undefined' is a special case for the common pattern where `undefined`
22668 // is used as a formal parameter name to defend against global
22669 // re-assignment, e.g.
22670 //
22671 // (function(window, undefined) {
22672 // })();
22673 if (param === "undefined")
22674 return;
22675
22676 if (binding["(unused)"]) {
22677 _warnUnused(param, binding["(token)"], "param", state.funct["(unusedOption)"]);
22678 } else if (unused_opt === "last-param") {
22679 return;
22680 }
22681
22682 param = params.pop();
22683 }
22684 }
22685
22686 /**
22687 * Find the relevant binding's scope. The owning scope is located by first
22688 * inspecting the current scope and then moving "downward" through the stack
22689 * of scopes.
22690 *
22691 * @param {string} bindingName - the value of the identifier
22692 *
22693 * @returns {Object} - the scope in which the binding was found
22694 */
22695 function _getBinding(bindingName) {
22696 for (var i = _scopeStack.length - 1 ; i >= 0; --i) {
22697 var scopeBindings = _scopeStack[i]["(bindings)"];
22698 if (scopeBindings[bindingName]) {
22699 return scopeBindings;
22700 }
22701 }
22702 }
22703
22704 /**
22705 * Determine if a given binding name has been referenced within the current
22706 * function or any function defined within.
22707 *
22708 * @param {string} bindingName - the value of the identifier
22709 *
22710 * @returns {boolean}
22711 */
22712 function usedSoFarInCurrentFunction(bindingName) {
22713 for (var i = _scopeStack.length - 1; i >= 0; i--) {
22714 var current = _scopeStack[i];
22715 if (current["(usages)"][bindingName]) {
22716 return current["(usages)"][bindingName];
22717 }
22718 if (current === _currentFunctBody) {
22719 break;
22720 }
22721 }
22722 return false;
22723 }
22724
22725 function _checkOuterShadow(bindingName, token) {
22726
22727 // only check if shadow is outer
22728 if (state.option.shadow !== "outer") {
22729 return;
22730 }
22731
22732 var isGlobal = _currentFunctBody["(type)"] === "global",
22733 isNewFunction = _current["(type)"] === "functionparams";
22734
22735 var outsideCurrentFunction = !isGlobal;
22736 for (var i = 0; i < _scopeStack.length; i++) {
22737 var stackItem = _scopeStack[i];
22738
22739 if (!isNewFunction && _scopeStack[i + 1] === _currentFunctBody) {
22740 outsideCurrentFunction = false;
22741 }
22742 if (outsideCurrentFunction && stackItem["(bindings)"][bindingName]) {
22743 warning("W123", token, bindingName);
22744 }
22745 if (stackItem["(labels)"][bindingName]) {
22746 warning("W123", token, bindingName);
22747 }
22748 }
22749 }
22750
22751 function _latedefWarning(type, bindingName, token) {
22752 var isFunction;
22753
22754 if (state.option.latedef) {
22755 isFunction = type === "function" || type === "generator function" ||
22756 type === "async function";
22757
22758 // if either latedef is strict and this is a function
22759 // or this is not a function
22760 if ((state.option.latedef === true && isFunction) || !isFunction) {
22761 warning("W003", token, bindingName);
22762 }
22763 }
22764 }
22765
22766 var scopeManagerInst = {
22767
22768 on: function(names, listener) {
22769 names.split(" ").forEach(function(name) {
22770 emitter.on(name, listener);
22771 });
22772 },
22773
22774 isPredefined: function(bindingName) {
22775 return !this.has(bindingName) && _.has(_scopeStack[0]["(predefined)"], bindingName);
22776 },
22777
22778 /**
22779 * Create a new scope within the current scope. As the topmost value, the
22780 * new scope will be interpreted as the current scope until it is
22781 * exited--see the `unstack` method.
22782 *
22783 * @param {string} [type] - The type of the scope. Valid values are
22784 * "functionparams", "catchparams" and
22785 * "functionouter"
22786 */
22787 stack: function(type) {
22788 var previousScope = _current;
22789 _newScope(type);
22790
22791 if (!type && previousScope["(type)"] === "functionparams") {
22792
22793 _current["(isFuncBody)"] = true;
22794 _currentFunctBody = _current;
22795 }
22796 },
22797
22798 /**
22799 * Valldate all binding references and declarations in the current scope
22800 * and set the next scope on the stack as the active scope.
22801 */
22802 unstack: function() {
22803 // jshint proto: true
22804 var subScope = _scopeStack.length > 1 ? _scopeStack[_scopeStack.length - 2] : null;
22805 var isUnstackingFunctionBody = _current === _currentFunctBody,
22806 isUnstackingFunctionParams = _current["(type)"] === "functionparams",
22807 isUnstackingFunctionOuter = _current["(type)"] === "functionouter";
22808
22809 var i, j, isImmutable, isFunction;
22810 var currentUsages = _current["(usages)"];
22811 var currentBindings = _current["(bindings)"];
22812 var usedBindingNameList = Object.keys(currentUsages);
22813
22814 // See comment, "A note on `__proto__`"
22815 /* istanbul ignore if */
22816 if (currentUsages.__proto__ && usedBindingNameList.indexOf("__proto__") === -1) {
22817 usedBindingNameList.push("__proto__");
22818 }
22819
22820 for (i = 0; i < usedBindingNameList.length; i++) {
22821 var usedBindingName = usedBindingNameList[i];
22822
22823 var usage = currentUsages[usedBindingName];
22824 var usedBinding = currentBindings[usedBindingName];
22825 if (usedBinding) {
22826 var usedBindingType = usedBinding["(type)"];
22827 isImmutable = usedBindingType === "const" || usedBindingType === "import";
22828
22829 if (usedBinding["(useOutsideOfScope)"] && !state.option.funcscope) {
22830 var usedTokens = usage["(tokens)"];
22831 for (j = 0; j < usedTokens.length; j++) {
22832 // Keep the consistency of https://github.com/jshint/jshint/issues/2409
22833 if (usedBinding["(function)"] === usedTokens[j]["(function)"]) {
22834 error("W038", usedTokens[j], usedBindingName);
22835 }
22836 }
22837 }
22838
22839 // mark the binding used
22840 _current["(bindings)"][usedBindingName]["(unused)"] = false;
22841
22842 // check for modifying a const
22843 if (isImmutable && usage["(modified)"]) {
22844 for (j = 0; j < usage["(modified)"].length; j++) {
22845 error("E013", usage["(modified)"][j], usedBindingName);
22846 }
22847 }
22848
22849 isFunction = usedBindingType === "function" ||
22850 usedBindingType === "generator function" ||
22851 usedBindingType === "async function";
22852
22853 // check for re-assigning a function declaration
22854 if ((isFunction || usedBindingType === "class") && usage["(reassigned)"]) {
22855 for (j = 0; j < usage["(reassigned)"].length; j++) {
22856 if (!usage["(reassigned)"][j].ignoreW021) {
22857 warning("W021", usage["(reassigned)"][j], usedBindingName, usedBindingType);
22858 }
22859 }
22860 }
22861 continue;
22862 }
22863
22864 if (subScope) {
22865 var bindingType = this.bindingtype(usedBindingName);
22866 isImmutable = bindingType === "const" ||
22867 (bindingType === null && _scopeStack[0]["(predefined)"][usedBindingName] === false);
22868 if (isUnstackingFunctionOuter && !isImmutable) {
22869 if (!state.funct["(outerMutables)"]) {
22870 state.funct["(outerMutables)"] = [];
22871 }
22872 state.funct["(outerMutables)"].push(usedBindingName);
22873 }
22874
22875 // not exiting the global scope, so copy the usage down in case its an out of scope usage
22876 if (!subScope["(usages)"][usedBindingName]) {
22877 subScope["(usages)"][usedBindingName] = usage;
22878 if (isUnstackingFunctionBody) {
22879 subScope["(usages)"][usedBindingName]["(onlyUsedSubFunction)"] = true;
22880 }
22881 } else {
22882 var subScopeUsage = subScope["(usages)"][usedBindingName];
22883 subScopeUsage["(modified)"] = subScopeUsage["(modified)"].concat(usage["(modified)"]);
22884 subScopeUsage["(tokens)"] = subScopeUsage["(tokens)"].concat(usage["(tokens)"]);
22885 subScopeUsage["(reassigned)"] =
22886 subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]);
22887 }
22888 } else {
22889 // this is exiting global scope, so we finalise everything here - we are at the end of the file
22890 if (typeof _current["(predefined)"][usedBindingName] === "boolean") {
22891
22892 // remove the declared token, so we know it is used
22893 delete declared[usedBindingName];
22894
22895 // note it as used so it can be reported
22896 usedPredefinedAndGlobals[usedBindingName] = marker;
22897
22898 // check for re-assigning a read-only (set to false) predefined
22899 if (_current["(predefined)"][usedBindingName] === false && usage["(reassigned)"]) {
22900 for (j = 0; j < usage["(reassigned)"].length; j++) {
22901 if (!usage["(reassigned)"][j].ignoreW020) {
22902 warning("W020", usage["(reassigned)"][j]);
22903 }
22904 }
22905 }
22906 }
22907 else {
22908 // binding usage is not predefined and we have not found a declaration
22909 // so report as undeclared
22910 for (j = 0; j < usage["(tokens)"].length; j++) {
22911 var undefinedToken = usage["(tokens)"][j];
22912 // if its not a forgiven undefined (e.g. typof x)
22913 if (!undefinedToken.forgiveUndef) {
22914 // if undef is on and undef was on when the token was defined
22915 if (state.option.undef && !undefinedToken.ignoreUndef) {
22916 warning("W117", undefinedToken, usedBindingName);
22917 }
22918 if (impliedGlobals[usedBindingName]) {
22919 impliedGlobals[usedBindingName].line.push(undefinedToken.line);
22920 } else {
22921 impliedGlobals[usedBindingName] = {
22922 name: usedBindingName,
22923 line: [undefinedToken.line]
22924 };
22925 }
22926 }
22927 }
22928 }
22929 }
22930 }
22931
22932 // if exiting the global scope, we can warn about declared globals that haven't been used yet
22933 if (!subScope) {
22934 Object.keys(declared)
22935 .forEach(function(bindingNotUsed) {
22936 _warnUnused(bindingNotUsed, declared[bindingNotUsed], "var");
22937 });
22938 }
22939
22940 // If this is not a function boundary, transfer function-scoped bindings to
22941 // the parent block (a rough simulation of variable hoisting). Previously
22942 // existing bindings in the parent block should take precedence so that
22943 // prior usages are not discarded.
22944 if (subScope && !isUnstackingFunctionBody &&
22945 !isUnstackingFunctionParams && !isUnstackingFunctionOuter) {
22946 var bindingNames = Object.keys(currentBindings);
22947 for (i = 0; i < bindingNames.length; i++) {
22948
22949 var defBindingName = bindingNames[i];
22950 var defBinding = currentBindings[defBindingName];
22951
22952 if (!defBinding["(blockscoped)"] && defBinding["(type)"] !== "exception") {
22953 var shadowed = subScope["(bindings)"][defBindingName];
22954
22955 // Do not overwrite a binding if it exists in the parent scope
22956 // because it is shared by adjacent blocks. Copy the `unused`
22957 // property so that any references found within the current block
22958 // are counted toward that higher-level declaration.
22959 if (shadowed) {
22960 shadowed["(unused)"] &= defBinding["(unused)"];
22961
22962 // "Hoist" the variable to the parent block, decorating the binding
22963 // so that future references, though technically valid, can be
22964 // reported as "out-of-scope" in the absence of the `funcscope`
22965 // option.
22966 } else {
22967 defBinding["(useOutsideOfScope)"] =
22968 // Do not warn about out-of-scope usages in the global scope
22969 _currentFunctBody["(type)"] !== "global" &&
22970 // When a higher scope contains a binding for the binding, the
22971 // binding is a re-declaration and should not prompt "used
22972 // out-of-scope" warnings.
22973 !this.funct.has(defBindingName, { excludeCurrent: true });
22974
22975 subScope["(bindings)"][defBindingName] = defBinding;
22976 }
22977
22978 delete currentBindings[defBindingName];
22979 }
22980 }
22981 }
22982
22983 _checkForUnused();
22984
22985 _scopeStack.pop();
22986 if (isUnstackingFunctionBody) {
22987 _currentFunctBody = _scopeStack[_.findLastIndex(_scopeStack, function(scope) {
22988 // if function or if global (which is at the bottom so it will only return true if we call back)
22989 return scope["(isFuncBody)"] || scope["(type)"] === "global";
22990 })];
22991 }
22992
22993 _current = subScope;
22994 },
22995
22996 /**
22997 * Add a function parameter to the current scope.
22998 *
22999 * @param {string} bindingName - the value of the identifier
23000 * @param {Token} token
23001 * @param {string} [type] - binding type; defaults to "param"
23002 */
23003 addParam: function(bindingName, token, type) {
23004 type = type || "param";
23005
23006 if (type === "exception") {
23007 // if defined in the current function
23008 var previouslyDefinedBindingType = this.funct.bindingtype(bindingName);
23009 if (previouslyDefinedBindingType && previouslyDefinedBindingType !== "exception") {
23010 // and has not been used yet in the current function scope
23011 if (!state.option.node) {
23012 warning("W002", state.tokens.next, bindingName);
23013 }
23014 }
23015
23016 if (state.isStrict() && (bindingName === "arguments" || bindingName === "eval")) {
23017 warning("E008", token);
23018 }
23019 }
23020
23021 // The variable was declared in the current scope
23022 if (_.has(_current["(bindings)"], bindingName)) {
23023 _current["(bindings)"][bindingName].duplicated = true;
23024
23025 // The variable was declared in an outer scope
23026 } else {
23027 // if this scope has the variable defined, it's a re-definition error
23028 _checkOuterShadow(bindingName, token);
23029
23030 _current["(bindings)"][bindingName] = {
23031 "(type)" : type,
23032 "(token)": token,
23033 "(unused)": true };
23034
23035 _current["(params)"].push(bindingName);
23036 }
23037
23038 if (_.has(_current["(usages)"], bindingName)) {
23039 var usage = _current["(usages)"][bindingName];
23040 // if its in a sub function it is not necessarily an error, just latedef
23041 if (usage["(onlyUsedSubFunction)"]) {
23042 _latedefWarning(type, bindingName, token);
23043 } else {
23044 // this is a clear illegal usage for block scoped variables
23045 warning("E056", token, bindingName, type);
23046 }
23047 }
23048 },
23049
23050 validateParams: function(isArrow) {
23051 var isStrict = state.isStrict();
23052 var currentFunctParamScope = _currentFunctBody["(parent)"];
23053 // From ECMAScript 2017:
23054 //
23055 // > 14.1.2Static Semantics: Early Errors
23056 // >
23057 // > [...]
23058 // > - It is a Syntax Error if IsSimpleParameterList of
23059 // > FormalParameterList is false and BoundNames of FormalParameterList
23060 // > contains any duplicate elements.
23061 var isSimple = state.funct['(hasSimpleParams)'];
23062 // Method definitions are defined in terms of UniqueFormalParameters, so
23063 // they cannot support duplicate parameter names regardless of strict
23064 // mode.
23065 var isMethod = state.funct["(method)"];
23066
23067 if (!currentFunctParamScope["(params)"]) {
23068 /* istanbul ignore next */
23069 return;
23070 }
23071
23072 currentFunctParamScope["(params)"].forEach(function(bindingName) {
23073 var binding = currentFunctParamScope["(bindings)"][bindingName];
23074
23075 if (binding.duplicated) {
23076 if (isStrict || isArrow || isMethod || !isSimple) {
23077 warning("E011", binding["(token)"], bindingName);
23078 } else if (state.option.shadow !== true) {
23079 warning("W004", binding["(token)"], bindingName);
23080 }
23081 }
23082
23083 if (isStrict && (bindingName === "arguments" || bindingName === "eval")) {
23084 warning("E008", binding["(token)"]);
23085 }
23086 });
23087 },
23088
23089 getUsedOrDefinedGlobals: function() {
23090 // jshint proto: true
23091 var list = Object.keys(usedPredefinedAndGlobals);
23092
23093 // See comment, "A note on `__proto__`"
23094 /* istanbul ignore if */
23095 if (usedPredefinedAndGlobals.__proto__ === marker &&
23096 list.indexOf("__proto__") === -1) {
23097 list.push("__proto__");
23098 }
23099
23100 return list;
23101 },
23102
23103 /**
23104 * Get an array of implied globals
23105 *
23106 * @returns {Array.<{ name: string, line: Array.<number>}>}
23107 */
23108 getImpliedGlobals: function() {
23109 // jshint proto: true
23110 var values = _.values(impliedGlobals);
23111 var hasProto = false;
23112
23113 // See comment, "A note on `__proto__`"
23114 if (impliedGlobals.__proto__) {
23115 hasProto = values.some(function(value) {
23116 return value.name === "__proto__";
23117 });
23118
23119 /* istanbul ignore if */
23120 if (!hasProto) {
23121 values.push(impliedGlobals.__proto__);
23122 }
23123 }
23124
23125 return values;
23126 },
23127
23128 /**
23129 * Get an array of objects describing unused bindings.
23130 *
23131 * @returns {Array<Object>}
23132 */
23133 getUnuseds: function() {
23134 return unuseds;
23135 },
23136
23137 /**
23138 * Determine if a given name has been defined in the current scope or any
23139 * lower scope.
23140 *
23141 * @param {string} bindingName - the value of the identifier
23142 *
23143 * @return {boolean}
23144 */
23145 has: function(bindingName) {
23146 return Boolean(_getBinding(bindingName));
23147 },
23148
23149 /**
23150 * Retrieve binding described by `bindingName` or null
23151 *
23152 * @param {string} bindingName - the value of the identifier
23153 *
23154 * @returns {string|null} - the type of the binding or `null` if no such
23155 * binding exists
23156 */
23157 bindingtype: function(bindingName) {
23158 var scopeBindings = _getBinding(bindingName);
23159 if (scopeBindings) {
23160 return scopeBindings[bindingName]["(type)"];
23161 }
23162 return null;
23163 },
23164
23165 /**
23166 * For the exported options, indicating a variable is used outside the file
23167 *
23168 * @param {string} bindingName - the value of the identifier
23169 */
23170 addExported: function(bindingName) {
23171 var globalBindings = _scopeStack[0]["(bindings)"];
23172 if (_.has(declared, bindingName)) {
23173 // remove the declared token, so we know it is used
23174 delete declared[bindingName];
23175 } else if (_.has(globalBindings, bindingName)) {
23176 globalBindings[bindingName]["(unused)"] = false;
23177 } else {
23178 for (var i = 1; i < _scopeStack.length; i++) {
23179 var scope = _scopeStack[i];
23180 // if `scope.(type)` is not defined, it is a block scope
23181 if (!scope["(type)"]) {
23182 if (_.has(scope["(bindings)"], bindingName) &&
23183 !scope["(bindings)"][bindingName]["(blockscoped)"]) {
23184 scope["(bindings)"][bindingName]["(unused)"] = false;
23185 return;
23186 }
23187 } else {
23188 break;
23189 }
23190 }
23191 exported[bindingName] = true;
23192 }
23193 },
23194
23195 /**
23196 * Mark a binding as "exported" by an ES2015 module
23197 *
23198 * @param {string} bindingName - the value of the identifier
23199 * @param {object} token
23200 */
23201 setExported: function(bindingName, token) {
23202 this.block.use(bindingName, token);
23203 },
23204
23205 /**
23206 * Mark a binding as "initialized." This is necessary to enforce the
23207 * "temporal dead zone" (TDZ) of block-scoped bindings which are not
23208 * hoisted.
23209 *
23210 * @param {string} bindingName - the value of the identifier
23211 */
23212 initialize: function(bindingName) {
23213 if (_current["(bindings)"][bindingName]) {
23214 _current["(bindings)"][bindingName]["(initialized)"] = true;
23215 }
23216 },
23217
23218 /**
23219 * Create a new binding and add it to the current scope. Delegates to the
23220 * internal `block.add` or `func.add` methods depending on the type.
23221 * Produces warnings and errors as necessary.
23222 *
23223 * @param {string} bindingName
23224 * @param {Object} opts
23225 * @param {String} opts.type - the type of the binding e.g. "param", "var",
23226 * "let, "const", "import", "function",
23227 * "generator function", "async function",
23228 * "async generator function"
23229 * @param {object} opts.token - the token pointing at the declaration
23230 * @param {boolean} opts.initialized - whether the binding should be
23231 * created in an "initialized" state.
23232 */
23233 addbinding: function(bindingName, opts) {
23234
23235 var type = opts.type;
23236 var token = opts.token;
23237 var isblockscoped = type === "let" || type === "const" ||
23238 type === "class" || type === "import" || type === "generator function" ||
23239 type === "async function" || type === "async generator function";
23240 var ishoisted = type === "function" || type === "generator function" ||
23241 type === "async function" || type === "import";
23242 var isexported = (isblockscoped ? _current : _currentFunctBody)["(type)"] === "global" &&
23243 _.has(exported, bindingName);
23244
23245 // outer shadow check (inner is only on non-block scoped)
23246 _checkOuterShadow(bindingName, token);
23247
23248 if (state.isStrict() && (bindingName === "arguments" || bindingName === "eval")) {
23249 warning("E008", token);
23250 }
23251
23252 if (isblockscoped) {
23253
23254 var declaredInCurrentScope = _current["(bindings)"][bindingName];
23255 // for block scoped variables, params are seen in the current scope as the root function
23256 // scope, so check these too.
23257 if (!declaredInCurrentScope && _current === _currentFunctBody &&
23258 _current["(type)"] !== "global") {
23259 declaredInCurrentScope = !!_currentFunctBody["(parent)"]["(bindings)"][bindingName];
23260 }
23261
23262 // if its not already defined (which is an error, so ignore) and is used in TDZ
23263 if (!declaredInCurrentScope && _current["(usages)"][bindingName]) {
23264 var usage = _current["(usages)"][bindingName];
23265 // if its in a sub function it is not necessarily an error, just latedef
23266 if (usage["(onlyUsedSubFunction)"] || ishoisted) {
23267 _latedefWarning(type, bindingName, token);
23268 } else if (!ishoisted) {
23269 // this is a clear illegal usage for block scoped variables
23270 warning("E056", token, bindingName, type);
23271 }
23272 }
23273
23274 // If this scope has already declared a binding with the same name,
23275 // then this represents a redeclaration error if:
23276 //
23277 // 1. it is a "hoisted" block-scoped binding within a block. For
23278 // instance: generator functions may be redeclared in the global
23279 // scope but not within block statements
23280 // 2. this is not a "hoisted" block-scoped binding
23281 if (declaredInCurrentScope &&
23282 (!ishoisted || (_current["(type)"] !== "global" || type === "import"))) {
23283 warning("E011", token, bindingName);
23284 }
23285 else if (state.option.shadow === "outer") {
23286
23287 // if shadow is outer, for block scope we want to detect any shadowing within this function
23288 if (scopeManagerInst.funct.has(bindingName)) {
23289 warning("W004", token, bindingName);
23290 }
23291 }
23292
23293 scopeManagerInst.block.add(
23294 bindingName, type, token, !isexported, opts.initialized
23295 );
23296
23297 } else {
23298
23299 var declaredInCurrentFunctionScope = scopeManagerInst.funct.has(bindingName);
23300
23301 // check for late definition, ignore if already declared
23302 if (!declaredInCurrentFunctionScope && usedSoFarInCurrentFunction(bindingName)) {
23303 _latedefWarning(type, bindingName, token);
23304 }
23305
23306 // defining with a var or a function when a block scope variable of the same name
23307 // is in scope is an error
23308 if (scopeManagerInst.funct.has(bindingName, { onlyBlockscoped: true })) {
23309 warning("E011", token, bindingName);
23310 } else if (state.option.shadow !== true) {
23311 // now since we didn't get any block scope variables, test for var/function
23312 // shadowing
23313 if (declaredInCurrentFunctionScope && bindingName !== "__proto__") {
23314
23315 // see https://github.com/jshint/jshint/issues/2400
23316 if (_currentFunctBody["(type)"] !== "global") {
23317 warning("W004", token, bindingName);
23318 }
23319 }
23320 }
23321
23322 scopeManagerInst.funct.add(bindingName, type, token, !isexported);
23323
23324 if (_currentFunctBody["(type)"] === "global" && !state.impliedClosure()) {
23325 usedPredefinedAndGlobals[bindingName] = marker;
23326 }
23327 }
23328 },
23329
23330 funct: {
23331 /**
23332 * Return the type of the provided binding given certain options
23333 *
23334 * @param {string} bindingName
23335 * @param {Object=} [options]
23336 * @param {boolean} [options.onlyBlockscoped] - only include block scoped
23337 * bindings
23338 * @param {boolean} [options.excludeParams] - exclude the param scope
23339 * @param {boolean} [options.excludeCurrent] - exclude the current scope
23340 *
23341 * @returns {String}
23342 */
23343 bindingtype: function(bindingName, options) {
23344 var onlyBlockscoped = options && options.onlyBlockscoped;
23345 var excludeParams = options && options.excludeParams;
23346 var currentScopeIndex = _scopeStack.length - (options && options.excludeCurrent ? 2 : 1);
23347 for (var i = currentScopeIndex; i >= 0; i--) {
23348 var current = _scopeStack[i];
23349 if (current["(bindings)"][bindingName] &&
23350 (!onlyBlockscoped || current["(bindings)"][bindingName]["(blockscoped)"])) {
23351 return current["(bindings)"][bindingName]["(type)"];
23352 }
23353 var scopeCheck = excludeParams ? _scopeStack[ i - 1 ] : current;
23354 if (scopeCheck && scopeCheck["(type)"] === "functionparams") {
23355 return null;
23356 }
23357 }
23358 return null;
23359 },
23360
23361 /**
23362 * Determine whether a `break` statement label exists in the function
23363 * scope.
23364 *
23365 * @param {string} labelName - the value of the identifier
23366 *
23367 * @returns {boolean}
23368 */
23369 hasLabel: function(labelName) {
23370 for (var i = _scopeStack.length - 1; i >= 0; i--) {
23371 var current = _scopeStack[i];
23372
23373 if (current["(labels)"][labelName]) {
23374 return true;
23375 }
23376 if (current["(type)"] === "functionparams") {
23377 return false;
23378 }
23379 }
23380 return false;
23381 },
23382
23383 /**
23384 * Determine if a given name has been defined in the current function
23385 * scope.
23386 *
23387 * @param {string} bindingName - the value of the identifier
23388 * @param {object} options - options as supported by the
23389 * `funct.bindingtype` method
23390 *
23391 * @return {boolean}
23392 */
23393 has: function(bindingName, options) {
23394 return Boolean(this.bindingtype(bindingName, options));
23395 },
23396
23397 /**
23398 * Create a new function-scoped binding and add it to the current scope.
23399 * See the `block.add` method for coresponding logic to create
23400 * block-scoped bindings.
23401 *
23402 * @param {string} bindingName - the value of the identifier
23403 * @param {string} type - the type of the binding; either "function" or
23404 * "var"
23405 * @param {object} tok - the token that triggered the definition
23406 * @param {boolean} unused - `true` if the binding has not been
23407 * referenced
23408 */
23409 add: function(bindingName, type, tok, unused) {
23410 _current["(bindings)"][bindingName] = {
23411 "(type)" : type,
23412 "(token)": tok,
23413 "(blockscoped)": false,
23414 "(function)": _currentFunctBody,
23415 "(unused)": unused };
23416 }
23417 },
23418
23419 block: {
23420
23421 /**
23422 * Determine whether the current block scope is the global scope.
23423 *
23424 * @returns Boolean
23425 */
23426 isGlobal: function() {
23427 return _current["(type)"] === "global";
23428 },
23429
23430 /**
23431 * Resolve a reference to a binding and mark the corresponding binding as
23432 * "used."
23433 *
23434 * @param {string} bindingName - the value of the identifier
23435 * @param {object} token - the token value that triggered the reference
23436 */
23437 use: function(bindingName, token) {
23438 // If the name resolves to a parameter of the current function, then do
23439 // not store usage. This is because in cases such as the following:
23440 //
23441 // function(a) {
23442 // var a;
23443 // a = a;
23444 // }
23445 //
23446 // the usage of `a` will resolve to the parameter, not to the unset
23447 // variable binding.
23448 var paramScope = _currentFunctBody["(parent)"];
23449 if (paramScope && paramScope["(bindings)"][bindingName] &&
23450 paramScope["(bindings)"][bindingName]["(type)"] === "param") {
23451
23452 // then check its not declared by a block scope variable
23453 if (!scopeManagerInst.funct.has(bindingName,
23454 { excludeParams: true, onlyBlockscoped: true })) {
23455 paramScope["(bindings)"][bindingName]["(unused)"] = false;
23456 }
23457 }
23458
23459 if (token && (state.ignored.W117 || state.option.undef === false)) {
23460 token.ignoreUndef = true;
23461 }
23462
23463 _setupUsages(bindingName);
23464
23465 _current["(usages)"][bindingName]["(onlyUsedSubFunction)"] = false;
23466
23467 if (token) {
23468 token["(function)"] = _currentFunctBody;
23469 _current["(usages)"][bindingName]["(tokens)"].push(token);
23470 }
23471
23472 // Block-scoped bindings can't be used within their initializer due to
23473 // "temporal dead zone" (TDZ) restrictions.
23474 var binding = _current["(bindings)"][bindingName];
23475 if (binding && binding["(blockscoped)"] && !binding["(initialized)"]) {
23476 error("E056", token, bindingName, binding["(type)"]);
23477 }
23478 },
23479
23480 reassign: function(bindingName, token) {
23481 token.ignoreW020 = state.ignored.W020;
23482 token.ignoreW021 = state.ignored.W021;
23483
23484 this.modify(bindingName, token);
23485
23486 _current["(usages)"][bindingName]["(reassigned)"].push(token);
23487 },
23488
23489 modify: function(bindingName, token) {
23490
23491 _setupUsages(bindingName);
23492
23493 _current["(usages)"][bindingName]["(onlyUsedSubFunction)"] = false;
23494 _current["(usages)"][bindingName]["(modified)"].push(token);
23495 },
23496
23497 /**
23498 * Create a new block-scoped binding and add it to the current scope. See
23499 * the `funct.add` method for coresponding logic to create
23500 * function-scoped bindings.
23501 *
23502 * @param {string} bindingName - the value of the identifier
23503 * @param {string} type - the type of the binding; one of "class",
23504 * "const", "function", "import", or "let"
23505 * @param {object} tok - the token that triggered the definition
23506 * @param {boolean} unused - `true` if the binding has not been
23507 * referenced
23508 * @param {boolean} initialized - `true` if the binding has been
23509 * initialized (as is the case with
23510 * bindings created via `import`
23511 * declarations)
23512 */
23513 add: function(bindingName, type, tok, unused, initialized) {
23514 _current["(bindings)"][bindingName] = {
23515 "(type)" : type,
23516 "(token)": tok,
23517 "(initialized)": !!initialized,
23518 "(blockscoped)": true,
23519 "(unused)": unused };
23520 },
23521
23522 addLabel: function(labelName, opts) {
23523 var token = opts.token;
23524 if (scopeManagerInst.funct.hasLabel(labelName)) {
23525 warning("E011", token, labelName);
23526 }
23527 else if (state.option.shadow === "outer") {
23528 if (scopeManagerInst.funct.has(labelName)) {
23529 warning("W004", token, labelName);
23530 } else {
23531 _checkOuterShadow(labelName, token);
23532 }
23533 }
23534 _current["(labels)"][labelName] = token;
23535 }
23536 }
23537 };
23538 return scopeManagerInst;
23539 };
23540
23541 module.exports = scopeManager;
23542
23543 },{"events":9,"lodash":16}],24:[function(require,module,exports){
23544 "use strict";
23545 var NameStack = require("./name-stack.js");
23546
23547 var state = {
23548 syntax: {},
23549
23550 /**
23551 * Determine if the code currently being linted is strict mode code.
23552 *
23553 * @returns {boolean}
23554 */
23555 isStrict: function() {
23556 return this.directive["use strict"] || this.inClassBody ||
23557 this.option.module || this.option.strict === "implied";
23558 },
23559
23560 /**
23561 * Determine if the current state warrants a warning for statements outside
23562 * of strict mode code.
23563 *
23564 * While emitting warnings based on function scope would be more intuitive
23565 * (and less noisy), JSHint observes statement-based semantics in order to
23566 * preserve legacy behavior.
23567 *
23568 * This method does not take the state of the parser into account, making no
23569 * distinction between global code and function code. Because the "missing
23570 * 'use strict'" warning is *also* reported at function boundaries, this
23571 * function interprets `strict` option values `true` and `undefined` as
23572 * equivalent.
23573 */
23574 stmtMissingStrict: function() {
23575 if (this.option.strict === "global") {
23576 return true;
23577 }
23578
23579 if (this.option.strict === false) {
23580 return false;
23581 }
23582
23583 if (this.option.globalstrict) {
23584 return true;
23585 }
23586
23587 return false;
23588 },
23589
23590 allowsGlobalUsd: function() {
23591 return this.option.strict === "global" || this.option.globalstrict ||
23592 this.option.module || this.impliedClosure();
23593 },
23594
23595 /**
23596 * Determine if the current configuration describes an environment that is
23597 * wrapped in an immediately-invoked function expression prior to evaluation.
23598 *
23599 * @returns {boolean}
23600 */
23601 impliedClosure: function() {
23602 return this.option.node || this.option.phantom || this.option.browserify;
23603 },
23604
23605 // Assumption: chronologically ES3 < ES5 < ES6 < Moz
23606
23607 inMoz: function() {
23608 return this.option.moz;
23609 },
23610
23611 /**
23612 * Determine if constructs introduced in ECMAScript 10 should be accepted.
23613 *
23614 * @returns {boolean}
23615 */
23616 inES10: function() {
23617 return this.esVersion >= 10;
23618 },
23619
23620 /**
23621 * Determine if constructs introduced in ECMAScript 9 should be accepted.
23622 *
23623 * @returns {boolean}
23624 */
23625 inES9: function() {
23626 return this.esVersion >= 9;
23627 },
23628
23629 /**
23630 * Determine if constructs introduced in ECMAScript 8 should be accepted.
23631 *
23632 * @returns {boolean}
23633 */
23634 inES8: function() {
23635 return this.esVersion >= 8;
23636 },
23637
23638 /**
23639 * Determine if constructs introduced in ECMAScript 7 should be accepted.
23640 *
23641 * @returns {boolean}
23642 */
23643 inES7: function() {
23644 return this.esVersion >= 7;
23645 },
23646
23647 /**
23648 * Determine if constructs introduced in ECMAScript 6 should be accepted.
23649 *
23650 * @param {boolean} strict - When `true`, do not interpret the `moz` option
23651 * as ECMAScript 6
23652 *
23653 * @returns {boolean}
23654 */
23655 inES6: function(strict) {
23656 if (!strict && this.option.moz) {
23657 return true;
23658 }
23659
23660 return this.esVersion >= 6;
23661 },
23662
23663 /**
23664 * Determine if constructs introduced in ECMAScript 5 should be accepted.
23665 *
23666 * @returns {boolean}
23667 */
23668 inES5: function() {
23669 return !this.esVersion || this.esVersion >= 5 || this.option.moz;
23670 },
23671
23672 /**
23673 * Determine the current version of the input language by inspecting the
23674 * value of all ECMAScript-version-related options. This logic is necessary
23675 * to ensure compatibility with deprecated options `es3`, `es5`, and
23676 * `esnext`, and it may be drastically simplified when those options are
23677 * removed.
23678 *
23679 * @returns {string|null} - the name of any incompatible option detected,
23680 * `null` otherwise
23681 */
23682 inferEsVersion: function() {
23683 var badOpt = null;
23684
23685 if (this.option.esversion) {
23686 if (this.option.es3) {
23687 badOpt = "es3";
23688 } else if (this.option.es5) {
23689 badOpt = "es5";
23690 } else if (this.option.esnext) {
23691 badOpt = "esnext";
23692 }
23693
23694 if (badOpt) {
23695 return badOpt;
23696 }
23697
23698 if (this.option.esversion === 2015) {
23699 this.esVersion = 6;
23700 } else {
23701 this.esVersion = this.option.esversion;
23702 }
23703 } else if (this.option.es3) {
23704 this.esVersion = 3;
23705 } else if (this.option.esnext) {
23706 this.esVersion = 6;
23707 }
23708
23709 return null;
23710 },
23711
23712 reset: function() {
23713 this.tokens = {
23714 prev: null,
23715 next: null,
23716 curr: null
23717 };
23718
23719 this.option = { unstable: {} };
23720 this.esVersion = 5;
23721 this.funct = null;
23722 this.ignored = {};
23723 this.directive = Object.create(null);
23724 this.jsonMode = false;
23725 this.lines = [];
23726 this.tab = "";
23727 this.cache = {}; // Node.JS doesn't have Map. Sniff.
23728 this.ignoredLines = {};
23729 this.forinifcheckneeded = false;
23730 this.nameStack = new NameStack();
23731 this.inClassBody = false;
23732 }
23733 };
23734
23735 exports.state = state;
23736
23737 },{"./name-stack.js":19}],25:[function(require,module,exports){
23738 "use strict";
23739
23740 exports.register = function(linter) {
23741 // Check for properties named __proto__. This special property was
23742 // deprecated and then re-introduced for ES6.
23743
23744 linter.on("Identifier", function style_scanProto(data) {
23745 if (linter.getOption("proto")) {
23746 return;
23747 }
23748
23749 if (data.name === "__proto__") {
23750 linter.warn("W103", {
23751 line: data.line,
23752 char: data.char,
23753 data: [ data.name, "6" ]
23754 });
23755 }
23756 });
23757
23758 // Check for properties named __iterator__. This is a special property
23759 // available only in browsers with JavaScript 1.7 implementation, but
23760 // it is deprecated for ES6
23761
23762 linter.on("Identifier", function style_scanIterator(data) {
23763 if (linter.getOption("iterator")) {
23764 return;
23765 }
23766
23767 if (data.name === "__iterator__") {
23768 linter.warn("W103", {
23769 line: data.line,
23770 char: data.char,
23771 data: [ data.name ]
23772 });
23773 }
23774 });
23775
23776 // Check that all identifiers are using camelCase notation.
23777 // Exceptions: names like MY_VAR and _myVar.
23778
23779 linter.on("Identifier", function style_scanCamelCase(data) {
23780 if (!linter.getOption("camelcase")) {
23781 return;
23782 }
23783
23784 if (data.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {
23785 linter.warn("W106", {
23786 line: data.line,
23787 char: data.char,
23788 data: [ data.name ]
23789 });
23790 }
23791 });
23792
23793 // Enforce consistency in style of quoting.
23794
23795 linter.on("String", function style_scanQuotes(data) {
23796 var quotmark = linter.getOption("quotmark");
23797 var code;
23798
23799 if (!quotmark) {
23800 return;
23801 }
23802
23803 // If quotmark is set to 'single' warn about all double-quotes.
23804
23805 if (quotmark === "single" && data.quote !== "'") {
23806 code = "W109";
23807 }
23808
23809 // If quotmark is set to 'double' warn about all single-quotes.
23810
23811 if (quotmark === "double" && data.quote !== "\"") {
23812 code = "W108";
23813 }
23814
23815 // If quotmark is set to true, remember the first quotation style
23816 // and then warn about all others.
23817
23818 if (quotmark === true) {
23819 if (!linter.getCache("quotmark")) {
23820 linter.setCache("quotmark", data.quote);
23821 }
23822
23823 if (linter.getCache("quotmark") !== data.quote) {
23824 code = "W110";
23825 }
23826 }
23827
23828 if (code) {
23829 linter.warn(code, {
23830 line: data.line,
23831 char: data.char,
23832 });
23833 }
23834 });
23835
23836 linter.on("Number", function style_scanNumbers(data) {
23837 if (data.value.charAt(0) === ".") {
23838 // Warn about a leading decimal point.
23839 linter.warn("W008", {
23840 line: data.line,
23841 char: data.char,
23842 data: [ data.value ]
23843 });
23844 }
23845
23846 if (data.value.substr(data.value.length - 1) === ".") {
23847 // Warn about a trailing decimal point.
23848 linter.warn("W047", {
23849 line: data.line,
23850 char: data.char,
23851 data: [ data.value ]
23852 });
23853 }
23854
23855 if (/^00+/.test(data.value)) {
23856 // Multiple leading zeroes.
23857 linter.warn("W046", {
23858 line: data.line,
23859 char: data.char,
23860 data: [ data.value ]
23861 });
23862 }
23863 });
23864
23865 // Warn about script URLs.
23866
23867 linter.on("String", function style_scanJavaScriptURLs(data) {
23868 var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
23869
23870 if (linter.getOption("scripturl")) {
23871 return;
23872 }
23873
23874 if (re.test(data.value)) {
23875 linter.warn("W107", {
23876 line: data.line,
23877 char: data.char
23878 });
23879 }
23880 });
23881 };
23882
23883 },{}],26:[function(require,module,exports){
23884 // jshint -W001
23885
23886 "use strict";
23887
23888 // Identifiers provided by the ECMAScript standard.
23889
23890 exports.reservedVars = {
23891 NaN : false,
23892 undefined : false
23893 };
23894
23895 exports.ecmaIdentifiers = {
23896 3: {
23897 Array : false,
23898 Boolean : false,
23899 Date : false,
23900 decodeURI : false,
23901 decodeURIComponent : false,
23902 encodeURI : false,
23903 encodeURIComponent : false,
23904 Error : false,
23905 "eval" : false,
23906 EvalError : false,
23907 Function : false,
23908 hasOwnProperty : false,
23909 Infinity : false,
23910 isFinite : false,
23911 isNaN : false,
23912 Math : false,
23913 Number : false,
23914 Object : false,
23915 parseInt : false,
23916 parseFloat : false,
23917 RangeError : false,
23918 ReferenceError : false,
23919 RegExp : false,
23920 String : false,
23921 SyntaxError : false,
23922 TypeError : false,
23923 URIError : false
23924 },
23925 5: {
23926 JSON : false
23927 },
23928 6: {
23929 ArrayBuffer : false,
23930 DataView : false,
23931 Float32Array : false,
23932 Float64Array : false,
23933 Int8Array : false,
23934 Int16Array : false,
23935 Int32Array : false,
23936 Map : false,
23937 Promise : false,
23938 Proxy : false,
23939 Reflect : false,
23940 Set : false,
23941 Symbol : false,
23942 Uint8Array : false,
23943 Uint16Array : false,
23944 Uint32Array : false,
23945 Uint8ClampedArray : false,
23946 WeakMap : false,
23947 WeakSet : false
23948 },
23949 8: {
23950 Atomics : false,
23951 SharedArrayBuffer : false
23952 }
23953 };
23954
23955 // Global variables commonly provided by a web browser environment.
23956
23957 exports.browser = {
23958 Audio : false,
23959 Blob : false,
23960 addEventListener : false, // EventTarget
23961 applicationCache : false,
23962 atob : false, // WindowOrWorkerGlobalScope
23963 blur : false,
23964 btoa : false, // WindowOrWorkerGlobalScope
23965 cancelAnimationFrame : false,
23966 CanvasGradient : false,
23967 CanvasPattern : false,
23968 CanvasRenderingContext2D: false,
23969 CSS : false,
23970 CSSImportRule : false,
23971 CSSGroupingRule : false,
23972 CSSMarginRule : false,
23973 CSSMediaRule : false,
23974 CSSNamespaceRule : false,
23975 CSSPageRule : false,
23976 CSSRule : false,
23977 CSSRuleList : false,
23978 CSSStyleDeclaration : false,
23979 CSSStyleRule : false,
23980 CSSStyleSheet : false,
23981 clearInterval : false, // WindowOrWorkerGlobalScope
23982 clearTimeout : false, // WindowOrWorkerGlobalScope
23983 close : false,
23984 closed : false,
23985 Comment : false,
23986 CompositionEvent : false,
23987 createImageBitmap : false, // WindowOrWorkerGlobalScope
23988 CustomEvent : false,
23989 DOMParser : false,
23990 defaultStatus : false,
23991 dispatchEvent : false, // EventTarget
23992 Document : false,
23993 document : false,
23994 DocumentFragment : false,
23995 Element : false,
23996 ElementTimeControl : false,
23997 Event : false,
23998 event : false,
23999 fetch : false,
24000 File : false,
24001 FileList : false,
24002 FileReader : false,
24003 FormData : false,
24004 focus : false,
24005 frames : false,
24006 getComputedStyle : false,
24007 Headers : false,
24008 HTMLAnchorElement : false,
24009 HTMLAreaElement : false,
24010 HTMLAudioElement : false,
24011 HTMLBaseElement : false,
24012 HTMLBlockquoteElement: false,
24013 HTMLBodyElement : false,
24014 HTMLBRElement : false,
24015 HTMLButtonElement : false,
24016 HTMLCanvasElement : false,
24017 HTMLCollection : false,
24018 HTMLDataElement : false,
24019 HTMLDataListElement : false,
24020 HTMLDetailsElement : false,
24021 HTMLDialogElement : false,
24022 HTMLDirectoryElement : false,
24023 HTMLDivElement : false,
24024 HTMLDListElement : false,
24025 HTMLElement : false,
24026 HTMLEmbedElement : false,
24027 HTMLFieldSetElement : false,
24028 HTMLFontElement : false,
24029 HTMLFormElement : false,
24030 HTMLFrameElement : false,
24031 HTMLFrameSetElement : false,
24032 HTMLHeadElement : false,
24033 HTMLHeadingElement : false,
24034 HTMLHRElement : false,
24035 HTMLHtmlElement : false,
24036 HTMLIFrameElement : false,
24037 HTMLImageElement : false,
24038 HTMLInputElement : false,
24039 /* HTMLIsIndexElement was removed from the WHATWG HTML spec;
24040 see https://github.com/whatwg/html/pull/1095.
24041 HTMLIsIndexElement has been removed from browsers; see:
24042 • Chromium Removal: https://codereview.chromium.org/96653004/
24043 • Gecko Removal: https://bugzilla.mozilla.org/show_bug.cgi?id=1266495
24044 • WebKit Removal: https://bugs.webkit.org/show_bug.cgi?id=7139.
24045 See also the discussion at https://github.com/jshint/jshint/pull/3222. */
24046 HTMLIsIndexElement : false,
24047 HTMLLabelElement : false,
24048 HTMLLayerElement : false,
24049 HTMLLegendElement : false,
24050 HTMLLIElement : false,
24051 HTMLLinkElement : false,
24052 HTMLMapElement : false,
24053 HTMLMarqueeElement : false,
24054 HTMLMediaElement : false,
24055 HTMLMenuElement : false,
24056 HTMLMetaElement : false,
24057 HTMLMeterElement : false,
24058 HTMLModElement : false,
24059 HTMLObjectElement : false,
24060 HTMLOListElement : false,
24061 HTMLOptGroupElement : false,
24062 HTMLOptionElement : false,
24063 HTMLParagraphElement : false,
24064 HTMLParamElement : false,
24065 HTMLPictureElement : false,
24066 HTMLPreElement : false,
24067 HTMLProgressElement : false,
24068 HTMLQuoteElement : false,
24069 HTMLScriptElement : false,
24070 HTMLSelectElement : false,
24071 HTMLSlotElement : false,
24072 HTMLSourceElement : false,
24073 HTMLStyleElement : false,
24074 HTMLTableCaptionElement: false,
24075 HTMLTableCellElement : false,
24076 HTMLTableColElement : false,
24077 HTMLTableElement : false,
24078 HTMLTableRowElement : false,
24079 HTMLTableSectionElement: false,
24080 HTMLTemplateElement : false,
24081 HTMLTextAreaElement : false,
24082 HTMLTimeElement : false,
24083 HTMLTitleElement : false,
24084 HTMLTrackElement : false,
24085 HTMLUListElement : false,
24086 HTMLVideoElement : false,
24087 history : false,
24088 Image : false,
24089 IntersectionObserver : false,
24090 Intl : false,
24091 length : false,
24092 localStorage : false,
24093 location : false,
24094 matchMedia : false,
24095 MediaList : false,
24096 MediaRecorder : false,
24097 MessageChannel : false,
24098 MessageEvent : false,
24099 MessagePort : false,
24100 MouseEvent : false,
24101 moveBy : false,
24102 moveTo : false,
24103 MutationObserver : false,
24104 name : false,
24105 Node : false,
24106 NodeFilter : false,
24107 NodeList : false,
24108 Notification : false,
24109 navigator : false,
24110 onbeforeunload : true,
24111 onblur : true,
24112 onerror : true,
24113 onfocus : true,
24114 onload : true,
24115 onresize : true,
24116 onunload : true,
24117 open : false,
24118 openDatabase : false,
24119 opener : false,
24120 Option : false,
24121 origin : false, // WindowOrWorkerGlobalScope
24122 parent : false,
24123 performance : false,
24124 print : false,
24125 queueMicrotask : false, // WindowOrWorkerGlobalScope
24126 Range : false,
24127 requestAnimationFrame : false,
24128 removeEventListener : false, // EventTarget
24129 Request : false,
24130 resizeBy : false,
24131 resizeTo : false,
24132 Response : false,
24133 screen : false,
24134 scroll : false,
24135 scrollBy : false,
24136 scrollTo : false,
24137 sessionStorage : false,
24138 setInterval : false, // WindowOrWorkerGlobalScope
24139 setTimeout : false, // WindowOrWorkerGlobalScope
24140 SharedWorker : false,
24141 status : false,
24142 Storage : false,
24143 StyleSheet : false,
24144 SVGAElement : false,
24145 SVGAltGlyphDefElement: false,
24146 SVGAltGlyphElement : false,
24147 SVGAltGlyphItemElement: false,
24148 SVGAngle : false,
24149 SVGAnimateColorElement: false,
24150 SVGAnimateElement : false,
24151 SVGAnimateMotionElement: false,
24152 SVGAnimateTransformElement: false,
24153 SVGAnimatedAngle : false,
24154 SVGAnimatedBoolean : false,
24155 SVGAnimatedEnumeration: false,
24156 SVGAnimatedInteger : false,
24157 SVGAnimatedLength : false,
24158 SVGAnimatedLengthList: false,
24159 SVGAnimatedNumber : false,
24160 SVGAnimatedNumberList: false,
24161 SVGAnimatedPathData : false,
24162 SVGAnimatedPoints : false,
24163 SVGAnimatedPreserveAspectRatio: false,
24164 SVGAnimatedRect : false,
24165 SVGAnimatedString : false,
24166 SVGAnimatedTransformList: false,
24167 SVGAnimationElement : false,
24168 SVGCSSRule : false,
24169 SVGCircleElement : false,
24170 SVGClipPathElement : false,
24171 SVGColor : false,
24172 SVGColorProfileElement: false,
24173 SVGColorProfileRule : false,
24174 SVGComponentTransferFunctionElement: false,
24175 SVGCursorElement : false,
24176 SVGDefsElement : false,
24177 SVGDescElement : false,
24178 SVGDocument : false,
24179 SVGElement : false,
24180 SVGElementInstance : false,
24181 SVGElementInstanceList: false,
24182 SVGEllipseElement : false,
24183 SVGExternalResourcesRequired: false,
24184 SVGFEBlendElement : false,
24185 SVGFEColorMatrixElement: false,
24186 SVGFEComponentTransferElement: false,
24187 SVGFECompositeElement: false,
24188 SVGFEConvolveMatrixElement: false,
24189 SVGFEDiffuseLightingElement: false,
24190 SVGFEDisplacementMapElement: false,
24191 SVGFEDistantLightElement: false,
24192 SVGFEFloodElement : false,
24193 SVGFEFuncAElement : false,
24194 SVGFEFuncBElement : false,
24195 SVGFEFuncGElement : false,
24196 SVGFEFuncRElement : false,
24197 SVGFEGaussianBlurElement: false,
24198 SVGFEImageElement : false,
24199 SVGFEMergeElement : false,
24200 SVGFEMergeNodeElement: false,
24201 SVGFEMorphologyElement: false,
24202 SVGFEOffsetElement : false,
24203 SVGFEPointLightElement: false,
24204 SVGFESpecularLightingElement: false,
24205 SVGFESpotLightElement: false,
24206 SVGFETileElement : false,
24207 SVGFETurbulenceElement: false,
24208 SVGFilterElement : false,
24209 SVGFilterPrimitiveStandardAttributes: false,
24210 SVGFitToViewBox : false,
24211 SVGFontElement : false,
24212 SVGFontFaceElement : false,
24213 SVGFontFaceFormatElement: false,
24214 SVGFontFaceNameElement: false,
24215 SVGFontFaceSrcElement: false,
24216 SVGFontFaceUriElement: false,
24217 SVGForeignObjectElement: false,
24218 SVGGElement : false,
24219 SVGGlyphElement : false,
24220 SVGGlyphRefElement : false,
24221 SVGGradientElement : false,
24222 SVGHKernElement : false,
24223 SVGICCColor : false,
24224 SVGImageElement : false,
24225 SVGLangSpace : false,
24226 SVGLength : false,
24227 SVGLengthList : false,
24228 SVGLineElement : false,
24229 SVGLinearGradientElement: false,
24230 SVGLocatable : false,
24231 SVGMPathElement : false,
24232 SVGMarkerElement : false,
24233 SVGMaskElement : false,
24234 SVGMatrix : false,
24235 SVGMetadataElement : false,
24236 SVGMissingGlyphElement: false,
24237 SVGNumber : false,
24238 SVGNumberList : false,
24239 SVGPaint : false,
24240 SVGPathElement : false,
24241 SVGPathSeg : false,
24242 SVGPathSegArcAbs : false,
24243 SVGPathSegArcRel : false,
24244 SVGPathSegClosePath : false,
24245 SVGPathSegCurvetoCubicAbs: false,
24246 SVGPathSegCurvetoCubicRel: false,
24247 SVGPathSegCurvetoCubicSmoothAbs: false,
24248 SVGPathSegCurvetoCubicSmoothRel: false,
24249 SVGPathSegCurvetoQuadraticAbs: false,
24250 SVGPathSegCurvetoQuadraticRel: false,
24251 SVGPathSegCurvetoQuadraticSmoothAbs: false,
24252 SVGPathSegCurvetoQuadraticSmoothRel: false,
24253 SVGPathSegLinetoAbs : false,
24254 SVGPathSegLinetoHorizontalAbs: false,
24255 SVGPathSegLinetoHorizontalRel: false,
24256 SVGPathSegLinetoRel : false,
24257 SVGPathSegLinetoVerticalAbs: false,
24258 SVGPathSegLinetoVerticalRel: false,
24259 SVGPathSegList : false,
24260 SVGPathSegMovetoAbs : false,
24261 SVGPathSegMovetoRel : false,
24262 SVGPatternElement : false,
24263 SVGPoint : false,
24264 SVGPointList : false,
24265 SVGPolygonElement : false,
24266 SVGPolylineElement : false,
24267 SVGPreserveAspectRatio: false,
24268 SVGRadialGradientElement: false,
24269 SVGRect : false,
24270 SVGRectElement : false,
24271 SVGRenderingIntent : false,
24272 SVGSVGElement : false,
24273 SVGScriptElement : false,
24274 SVGSetElement : false,
24275 SVGStopElement : false,
24276 SVGStringList : false,
24277 SVGStylable : false,
24278 SVGStyleElement : false,
24279 SVGSwitchElement : false,
24280 SVGSymbolElement : false,
24281 SVGTRefElement : false,
24282 SVGTSpanElement : false,
24283 SVGTests : false,
24284 SVGTextContentElement: false,
24285 SVGTextElement : false,
24286 SVGTextPathElement : false,
24287 SVGTextPositioningElement: false,
24288 SVGTitleElement : false,
24289 SVGTransform : false,
24290 SVGTransformList : false,
24291 SVGTransformable : false,
24292 SVGURIReference : false,
24293 SVGUnitTypes : false,
24294 SVGUseElement : false,
24295 SVGVKernElement : false,
24296 SVGViewElement : false,
24297 SVGViewSpec : false,
24298 SVGZoomAndPan : false,
24299 Text : false,
24300 TextDecoder : false,
24301 TextEncoder : false,
24302 TimeEvent : false,
24303 top : false,
24304 URL : false,
24305 WebGLActiveInfo : false,
24306 WebGLBuffer : false,
24307 WebGLContextEvent : false,
24308 WebGLFramebuffer : false,
24309 WebGLProgram : false,
24310 WebGLRenderbuffer : false,
24311 WebGLRenderingContext: false,
24312 WebGLShader : false,
24313 WebGLShaderPrecisionFormat: false,
24314 WebGLTexture : false,
24315 WebGLUniformLocation : false,
24316 WebSocket : false,
24317 window : false,
24318 Window : false,
24319 Worker : false,
24320 XDomainRequest : false,
24321 XMLDocument : false,
24322 XMLHttpRequest : false,
24323 XMLSerializer : false,
24324 XPathEvaluator : false,
24325 XPathException : false,
24326 XPathExpression : false,
24327 XPathNamespace : false,
24328 XPathNSResolver : false,
24329 XPathResult : false
24330 };
24331
24332 exports.devel = {
24333 alert : false,
24334 confirm: false,
24335 console: false,
24336 Debug : false,
24337 opera : false,
24338 prompt : false
24339 };
24340
24341 exports.worker = {
24342 addEventListener : true, // EventTarget
24343 atob : true, // WindowOrWorkerGlobalScope
24344 btoa : true, // WindowOrWorkerGlobalScope
24345 clearInterval : true, // WindowOrWorkerGlobalScope
24346 clearTimeout : true, // WindowOrWorkerGlobalScope
24347 createImageBitmap : true, // WindowOrWorkerGlobalScope
24348 dispatchEvent : true, // EventTarget
24349 importScripts : true,
24350 onmessage : true,
24351 origin : true, // WindowOrWorkerGlobalScope
24352 postMessage : true,
24353 queueMicrotask : true, // WindowOrWorkerGlobalScope
24354 removeEventListener : true, // EventTarget
24355 self : true,
24356 setInterval : true, // WindowOrWorkerGlobalScope
24357 setTimeout : true, // WindowOrWorkerGlobalScope
24358 FileReaderSync : true
24359 };
24360
24361 // Widely adopted global names that are not part of ECMAScript standard
24362 exports.nonstandard = {
24363 escape : false,
24364 unescape: false
24365 };
24366
24367 // Globals provided by popular JavaScript environments.
24368
24369 exports.couch = {
24370 "require" : false,
24371 respond : false,
24372 getRow : false,
24373 emit : false,
24374 send : false,
24375 start : false,
24376 sum : false,
24377 log : false,
24378 exports : false,
24379 module : false,
24380 provides : false
24381 };
24382
24383 exports.node = {
24384 __filename : false,
24385 __dirname : false,
24386 arguments : false,
24387 GLOBAL : false,
24388 global : false,
24389 module : false,
24390 require : false,
24391
24392 // These globals are writeable because Node allows the following
24393 // usage pattern: var Buffer = require("buffer").Buffer;
24394
24395 Buffer : true,
24396 console : true,
24397 exports : true,
24398 process : true,
24399 setTimeout : true,
24400 clearTimeout : true,
24401 setInterval : true,
24402 clearInterval : true,
24403 setImmediate : true, // v0.9.1+
24404 clearImmediate: true // v0.9.1+
24405 };
24406
24407 exports.browserify = {
24408 __filename : false,
24409 __dirname : false,
24410 global : false,
24411 module : false,
24412 require : false,
24413 Buffer : true,
24414 exports : true,
24415 process : true
24416 };
24417
24418 exports.phantom = {
24419 phantom : true,
24420 require : true,
24421 WebPage : true,
24422 console : true, // in examples, but undocumented
24423 exports : true // v1.7+
24424 };
24425
24426 exports.qunit = {
24427 asyncTest : false,
24428 deepEqual : false,
24429 equal : false,
24430 expect : false,
24431 module : false,
24432 notDeepEqual : false,
24433 notEqual : false,
24434 notOk : false,
24435 notPropEqual : false,
24436 notStrictEqual : false,
24437 ok : false,
24438 propEqual : false,
24439 QUnit : false,
24440 raises : false,
24441 start : false,
24442 stop : false,
24443 strictEqual : false,
24444 test : false,
24445 "throws" : false
24446 };
24447
24448 exports.rhino = {
24449 arguments : false,
24450 defineClass : false,
24451 deserialize : false,
24452 gc : false,
24453 help : false,
24454 importClass : false,
24455 importPackage: false,
24456 "java" : false,
24457 load : false,
24458 loadClass : false,
24459 Packages : false,
24460 print : false,
24461 quit : false,
24462 readFile : false,
24463 readUrl : false,
24464 runCommand : false,
24465 seal : false,
24466 serialize : false,
24467 spawn : false,
24468 sync : false,
24469 toint32 : false,
24470 version : false
24471 };
24472
24473 exports.shelljs = {
24474 target : false,
24475 echo : false,
24476 exit : false,
24477 cd : false,
24478 pwd : false,
24479 ls : false,
24480 find : false,
24481 cp : false,
24482 rm : false,
24483 mv : false,
24484 mkdir : false,
24485 test : false,
24486 cat : false,
24487 sed : false,
24488 grep : false,
24489 which : false,
24490 dirs : false,
24491 pushd : false,
24492 popd : false,
24493 env : false,
24494 exec : false,
24495 chmod : false,
24496 config : false,
24497 error : false,
24498 tempdir : false
24499 };
24500
24501 exports.typed = {
24502 ArrayBuffer : false,
24503 ArrayBufferView : false,
24504 DataView : false,
24505 Float32Array : false,
24506 Float64Array : false,
24507 Int16Array : false,
24508 Int32Array : false,
24509 Int8Array : false,
24510 Uint16Array : false,
24511 Uint32Array : false,
24512 Uint8Array : false,
24513 Uint8ClampedArray : false
24514 };
24515
24516 exports.wsh = {
24517 ActiveXObject : true,
24518 Enumerator : true,
24519 GetObject : true,
24520 ScriptEngine : true,
24521 ScriptEngineBuildVersion : true,
24522 ScriptEngineMajorVersion : true,
24523 ScriptEngineMinorVersion : true,
24524 VBArray : true,
24525 WSH : true,
24526 WScript : true,
24527 XDomainRequest : true
24528 };
24529
24530 // Globals provided by popular JavaScript libraries.
24531
24532 exports.dojo = {
24533 dojo : false,
24534 dijit : false,
24535 dojox : false,
24536 define : false,
24537 "require": false
24538 };
24539
24540 exports.jquery = {
24541 "$" : false,
24542 jQuery : false
24543 };
24544
24545 exports.mootools = {
24546 "$" : false,
24547 "$$" : false,
24548 Asset : false,
24549 Browser : false,
24550 Chain : false,
24551 Class : false,
24552 Color : false,
24553 Cookie : false,
24554 Core : false,
24555 Document : false,
24556 DomReady : false,
24557 DOMEvent : false,
24558 DOMReady : false,
24559 Drag : false,
24560 Element : false,
24561 Elements : false,
24562 Event : false,
24563 Events : false,
24564 Fx : false,
24565 Group : false,
24566 Hash : false,
24567 HtmlTable : false,
24568 IFrame : false,
24569 IframeShim : false,
24570 InputValidator: false,
24571 instanceOf : false,
24572 Keyboard : false,
24573 Locale : false,
24574 Mask : false,
24575 MooTools : false,
24576 Native : false,
24577 Options : false,
24578 OverText : false,
24579 Request : false,
24580 Scroller : false,
24581 Slick : false,
24582 Slider : false,
24583 Sortables : false,
24584 Spinner : false,
24585 Swiff : false,
24586 Tips : false,
24587 Type : false,
24588 typeOf : false,
24589 URI : false,
24590 Window : false
24591 };
24592
24593 exports.prototypejs = {
24594 "$" : false,
24595 "$$" : false,
24596 "$A" : false,
24597 "$F" : false,
24598 "$H" : false,
24599 "$R" : false,
24600 "$break" : false,
24601 "$continue" : false,
24602 "$w" : false,
24603 Abstract : false,
24604 Ajax : false,
24605 Class : false,
24606 Enumerable : false,
24607 Element : false,
24608 Event : false,
24609 Field : false,
24610 Form : false,
24611 Hash : false,
24612 Insertion : false,
24613 ObjectRange : false,
24614 PeriodicalExecuter: false,
24615 Position : false,
24616 Prototype : false,
24617 Selector : false,
24618 Template : false,
24619 Toggle : false,
24620 Try : false,
24621 Autocompleter : false,
24622 Builder : false,
24623 Control : false,
24624 Draggable : false,
24625 Draggables : false,
24626 Droppables : false,
24627 Effect : false,
24628 Sortable : false,
24629 SortableObserver : false,
24630 Sound : false,
24631 Scriptaculous : false
24632 };
24633
24634 exports.yui = {
24635 YUI : false,
24636 Y : false,
24637 YUI_config: false
24638 };
24639
24640 exports.mocha = {
24641 // Global (for config etc.)
24642 mocha : false,
24643 // BDD
24644 describe : false,
24645 xdescribe : false,
24646 it : false,
24647 xit : false,
24648 context : false,
24649 xcontext : false,
24650 before : false,
24651 after : false,
24652 beforeEach : false,
24653 afterEach : false,
24654 // TDD
24655 suite : false,
24656 test : false,
24657 setup : false,
24658 teardown : false,
24659 suiteSetup : false,
24660 suiteTeardown : false
24661 };
24662
24663 exports.jasmine = {
24664 jasmine : false,
24665 describe : false,
24666 xdescribe : false,
24667 it : false,
24668 xit : false,
24669 beforeEach : false,
24670 afterEach : false,
24671 setFixtures : false,
24672 loadFixtures: false,
24673 spyOn : false,
24674 expect : false,
24675 // Jasmine 1.3
24676 runs : false,
24677 waitsFor : false,
24678 waits : false,
24679 // Jasmine 2.1
24680 beforeAll : false,
24681 afterAll : false,
24682 fail : false,
24683 fdescribe : false,
24684 fit : false,
24685 pending : false,
24686 // Jasmine 2.6
24687 spyOnProperty: false
24688 };
24689
24690 },{}],"jshint":[function(require,module,exports){
24691 /*!
24692 * JSHint, by JSHint Community.
24693 *
24694 * Licensed under the MIT license.
24695 *
24696 * JSHint is a derivative work of JSLint:
24697 *
24698 * Copyright (c) 2002 Douglas Crockford (www.JSLint.com)
24699 *
24700 * Permission is hereby granted, free of charge, to any person obtaining
24701 * a copy of this software and associated documentation files (the "Software"),
24702 * to deal in the Software without restriction, including without limitation
24703 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
24704 * and/or sell copies of the Software, and to permit persons to whom
24705 * the Software is furnished to do so, subject to the following conditions:
24706 *
24707 * The above copyright notice and this permission notice shall be included
24708 * in all copies or substantial portions of the Software.
24709 *
24710 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24711 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24712 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24713 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24714 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24715 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24716 * DEALINGS IN THE SOFTWARE.
24717 *
24718 */
24719
24720 /*jshint quotmark:double */
24721 /*exported console */
24722
24723 var _ = require("lodash");
24724 var events = require("events");
24725 var vars = require("./vars.js");
24726 var messages = require("./messages.js");
24727 var Lexer = require("./lex.js").Lexer;
24728 var reg = require("./reg.js");
24729 var state = require("./state.js").state;
24730 var style = require("./style.js");
24731 var options = require("./options.js");
24732 var scopeManager = require("./scope-manager.js");
24733 var prodParams = require("./prod-params.js");
24734
24735 // We need this module here because environments such as IE and Rhino
24736 // don't necessarilly expose the 'console' API and browserify uses
24737 // it to log things. It's a sad state of affair, really.
24738 var console = require("console-browserify");
24739
24740 // We build the application inside a function so that we produce only a singleton
24741 // variable. That function will be invoked immediately, and its return value is
24742 // the JSHINT function itself.
24743
24744 var JSHINT = (function() {
24745 "use strict";
24746
24747 var api, // Extension API
24748
24749 // These are operators that should not be used with the ! operator.
24750 bang = {
24751 "<" : true,
24752 "<=" : true,
24753 "==" : true,
24754 "===": true,
24755 "!==": true,
24756 "!=" : true,
24757 ">" : true,
24758 ">=" : true,
24759 "+" : true,
24760 "-" : true,
24761 "*" : true,
24762 "/" : true,
24763 "%" : true
24764 },
24765
24766 declared, // Globals that were declared using /*global ... */ syntax.
24767
24768 functions, // All of the functions
24769
24770 inblock,
24771 indent,
24772 lookahead,
24773 lex,
24774 member,
24775 membersOnly,
24776 predefined, // Global variables defined by option
24777
24778 extraModules = [],
24779 emitter = new events.EventEmitter();
24780
24781 function checkOption(name, isStable, t) {
24782 var type, validNames;
24783
24784 if (isStable) {
24785 type = "";
24786 validNames = options.validNames;
24787 } else {
24788 type = "unstable ";
24789 validNames = options.unstableNames;
24790 }
24791
24792 name = name.trim();
24793
24794 if (/^[+-]W\d{3}$/g.test(name)) {
24795 return true;
24796 }
24797
24798 if (validNames.indexOf(name) === -1) {
24799 if (t.type !== "jslint" && !_.has(options.removed, name)) {
24800 error("E001", t, type, name);
24801 return false;
24802 }
24803 }
24804
24805 return true;
24806 }
24807
24808 function isString(obj) {
24809 return Object.prototype.toString.call(obj) === "[object String]";
24810 }
24811
24812 function isIdentifier(tkn, value) {
24813 if (!tkn)
24814 return false;
24815
24816 if (!tkn.identifier || tkn.value !== value)
24817 return false;
24818
24819 return true;
24820 }
24821
24822 /**
24823 * ES3 defined a set of "FutureReservedWords" in order "to allow for the
24824 * possibility of future adoption of [proposed] extensions."
24825 *
24826 * ES5 reduced the set of FutureReservedWords, in some cases by using them to
24827 * define new syntactic forms (e.g. `class` and `const`) and in other cases
24828 * by simply allowing their use as Identifiers (e.g. `int` and `goto`).
24829 * Separately, ES5 introduced new restrictions on certain tokens, but limited
24830 * the restriction to strict mode code (e.g. `let` and `yield`).
24831 *
24832 * This function determines if a given token describes a reserved word
24833 * according to the current state of the parser.
24834 *
24835 * @param {number} context - the parsing context; see `prod-params.js` for
24836 * more information
24837 * @param {Token} token
24838 */
24839 function isReserved(context, token) {
24840 if (!token.reserved) {
24841 return false;
24842 }
24843 var meta = token.meta;
24844
24845 if (meta && meta.isFutureReservedWord) {
24846 if (state.inES5()) {
24847 // ES3 FutureReservedWord in an ES5 environment.
24848 if (!meta.es5) {
24849 return false;
24850 }
24851
24852 if (token.isProperty) {
24853 return false;
24854 }
24855 }
24856 } else if (meta && meta.es5 && !state.inES5()) {
24857 return false;
24858 }
24859
24860 // Some identifiers are reserved only within a strict mode environment.
24861 if (meta && meta.strictOnly && state.inES5()) {
24862 if (!state.option.strict && !state.isStrict()) {
24863 return false;
24864 }
24865 }
24866
24867 if (token.id === "await" && (!(context & prodParams.async) && !state.option.module)) {
24868 return false;
24869 }
24870
24871 if (token.id === "yield" && (!(context & prodParams.yield))) {
24872 return state.isStrict();
24873 }
24874
24875 return true;
24876 }
24877
24878 function supplant(str, data) {
24879 return str.replace(/\{([^{}]*)\}/g, function(a, b) {
24880 var r = data[b];
24881 return typeof r === "string" || typeof r === "number" ? r : a;
24882 });
24883 }
24884
24885 function combine(dest, src) {
24886 Object.keys(src).forEach(function(name) {
24887 if (_.has(JSHINT.blacklist, name)) return;
24888 dest[name] = src[name];
24889 });
24890 }
24891
24892 function processenforceall() {
24893 if (state.option.enforceall) {
24894 for (var enforceopt in options.bool.enforcing) {
24895 if (state.option[enforceopt] === undefined &&
24896 !options.noenforceall[enforceopt]) {
24897 state.option[enforceopt] = true;
24898 }
24899 }
24900 for (var relaxopt in options.bool.relaxing) {
24901 if (state.option[relaxopt] === undefined) {
24902 state.option[relaxopt] = false;
24903 }
24904 }
24905 }
24906 }
24907
24908 /**
24909 * Apply all linting options according to the status of the `state` object.
24910 */
24911 function applyOptions() {
24912 var badESOpt = null;
24913 processenforceall();
24914
24915 /**
24916 * TODO: Remove in JSHint 3
24917 */
24918 badESOpt = state.inferEsVersion();
24919 if (badESOpt) {
24920 quit("E059", state.tokens.next, "esversion", badESOpt);
24921 }
24922
24923 if (state.inES5()) {
24924 combine(predefined, vars.ecmaIdentifiers[5]);
24925 }
24926
24927 if (state.inES6()) {
24928 combine(predefined, vars.ecmaIdentifiers[6]);
24929 }
24930
24931 if (state.inES8()) {
24932 combine(predefined, vars.ecmaIdentifiers[8]);
24933 }
24934
24935 /**
24936 * Use `in` to check for the presence of any explicitly-specified value for
24937 * `globalstrict` because both `true` and `false` should trigger an error.
24938 */
24939 if (state.option.strict === "global" && "globalstrict" in state.option) {
24940 quit("E059", state.tokens.next, "strict", "globalstrict");
24941 }
24942
24943 if (state.option.module) {
24944 /**
24945 * TODO: Extend this restriction to *all* ES6-specific options.
24946 */
24947 if (!state.inES6()) {
24948 warning("W134", state.tokens.next, "module", 6);
24949 }
24950 }
24951
24952 if (state.option.regexpu) {
24953 /**
24954 * TODO: Extend this restriction to *all* ES6-specific options.
24955 */
24956 if (!state.inES6()) {
24957 warning("W134", state.tokens.next, "regexpu", 6);
24958 }
24959 }
24960
24961 if (state.option.couch) {
24962 combine(predefined, vars.couch);
24963 }
24964
24965 if (state.option.qunit) {
24966 combine(predefined, vars.qunit);
24967 }
24968
24969 if (state.option.rhino) {
24970 combine(predefined, vars.rhino);
24971 }
24972
24973 if (state.option.shelljs) {
24974 combine(predefined, vars.shelljs);
24975 combine(predefined, vars.node);
24976 }
24977 if (state.option.typed) {
24978 combine(predefined, vars.typed);
24979 }
24980
24981 if (state.option.phantom) {
24982 combine(predefined, vars.phantom);
24983 }
24984
24985 if (state.option.prototypejs) {
24986 combine(predefined, vars.prototypejs);
24987 }
24988
24989 if (state.option.node) {
24990 combine(predefined, vars.node);
24991 combine(predefined, vars.typed);
24992 }
24993
24994 if (state.option.devel) {
24995 combine(predefined, vars.devel);
24996 }
24997
24998 if (state.option.dojo) {
24999 combine(predefined, vars.dojo);
25000 }
25001
25002 if (state.option.browser) {
25003 combine(predefined, vars.browser);
25004 combine(predefined, vars.typed);
25005 }
25006
25007 if (state.option.browserify) {
25008 combine(predefined, vars.browser);
25009 combine(predefined, vars.typed);
25010 combine(predefined, vars.browserify);
25011 }
25012
25013 if (state.option.nonstandard) {
25014 combine(predefined, vars.nonstandard);
25015 }
25016
25017 if (state.option.jasmine) {
25018 combine(predefined, vars.jasmine);
25019 }
25020
25021 if (state.option.jquery) {
25022 combine(predefined, vars.jquery);
25023 }
25024
25025 if (state.option.mootools) {
25026 combine(predefined, vars.mootools);
25027 }
25028
25029 if (state.option.worker) {
25030 combine(predefined, vars.worker);
25031 }
25032
25033 if (state.option.wsh) {
25034 combine(predefined, vars.wsh);
25035 }
25036
25037 if (state.option.yui) {
25038 combine(predefined, vars.yui);
25039 }
25040
25041 if (state.option.mocha) {
25042 combine(predefined, vars.mocha);
25043 }
25044 }
25045
25046 // Produce an error warning.
25047 function quit(code, token, a, b) {
25048 var percentage = Math.floor((token.line / state.lines.length) * 100);
25049 var message = messages.errors[code].desc;
25050
25051 var exception = {
25052 name: "JSHintError",
25053 line: token.line,
25054 character: token.from,
25055 message: message + " (" + percentage + "% scanned).",
25056 raw: message,
25057 code: code,
25058 a: a,
25059 b: b
25060 };
25061
25062 exception.reason = supplant(message, exception) + " (" + percentage +
25063 "% scanned).";
25064
25065 throw exception;
25066 }
25067
25068 function removeIgnoredMessages() {
25069 var ignored = state.ignoredLines;
25070
25071 if (_.isEmpty(ignored)) return;
25072 JSHINT.errors = _.reject(JSHINT.errors, function(err) { return ignored[err.line] });
25073 }
25074
25075 function warning(code, t, a, b, c, d) {
25076 var ch, l, w, msg;
25077
25078 if (/^W\d{3}$/.test(code)) {
25079 if (state.ignored[code])
25080 return;
25081
25082 msg = messages.warnings[code];
25083 } else if (/E\d{3}/.test(code)) {
25084 msg = messages.errors[code];
25085 } else if (/I\d{3}/.test(code)) {
25086 msg = messages.info[code];
25087 }
25088
25089 t = t || state.tokens.next || {};
25090 if (t.id === "(end)") { // `~
25091 t = state.tokens.curr;
25092 }
25093
25094 l = t.line;
25095 ch = t.from;
25096
25097 w = {
25098 id: "(error)",
25099 raw: msg.desc,
25100 code: msg.code,
25101 evidence: state.lines[l - 1] || "",
25102 line: l,
25103 character: ch,
25104 scope: JSHINT.scope,
25105 a: a,
25106 b: b,
25107 c: c,
25108 d: d
25109 };
25110
25111 w.reason = supplant(msg.desc, w);
25112 JSHINT.errors.push(w);
25113
25114 removeIgnoredMessages();
25115
25116 if (JSHINT.errors.length >= state.option.maxerr)
25117 quit("E043", t);
25118
25119 return w;
25120 }
25121
25122 function warningAt(m, l, ch, a, b, c, d) {
25123 return warning(m, {
25124 line: l,
25125 from: ch
25126 }, a, b, c, d);
25127 }
25128
25129 function error(m, t, a, b, c, d) {
25130 warning(m, t, a, b, c, d);
25131 }
25132
25133 function errorAt(m, l, ch, a, b, c, d) {
25134 return error(m, {
25135 line: l,
25136 from: ch
25137 }, a, b, c, d);
25138 }
25139
25140 // Tracking of "internal" scripts, like eval containing a static string
25141 function addEvalCode(elem, token) {
25142 JSHINT.internals.push({
25143 id: "(internal)",
25144 elem: elem,
25145 token: token,
25146 code: token.value.replace(/([^\\])(\\*)\2\\n/g, "$1\n")
25147 });
25148 }
25149
25150 /**
25151 * Process an inline linting directive
25152 *
25153 * @param {Token} directiveToken - the directive-bearing comment token
25154 * @param {Token} previous - the token that preceeds the directive
25155 */
25156 function lintingDirective(directiveToken, previous) {
25157 var body = directiveToken.body.split(",")
25158 .map(function(s) { return s.trim(); });
25159 var predef = {};
25160
25161 if (directiveToken.type === "falls through") {
25162 previous.caseFallsThrough = true;
25163 return;
25164 }
25165
25166 if (directiveToken.type === "globals") {
25167 body.forEach(function(item, idx) {
25168 var parts = item.split(":");
25169 var key = parts[0].trim();
25170
25171 if (key === "-" || !key.length) {
25172 // Ignore trailing comma
25173 if (idx > 0 && idx === body.length - 1) {
25174 return;
25175 }
25176 error("E002", directiveToken);
25177 return;
25178 }
25179
25180 if (key.charAt(0) === "-") {
25181 key = key.slice(1);
25182
25183 JSHINT.blacklist[key] = key;
25184 delete predefined[key];
25185 } else {
25186 predef[key] = parts.length > 1 && parts[1].trim() === "true";
25187 }
25188 });
25189
25190 combine(predefined, predef);
25191
25192 for (var key in predef) {
25193 if (_.has(predef, key)) {
25194 declared[key] = directiveToken;
25195 }
25196 }
25197 }
25198
25199 if (directiveToken.type === "exported") {
25200 body.forEach(function(e, idx) {
25201 if (!e.length) {
25202 // Ignore trailing comma
25203 if (idx > 0 && idx === body.length - 1) {
25204 return;
25205 }
25206 error("E002", directiveToken);
25207 return;
25208 }
25209
25210 state.funct["(scope)"].addExported(e);
25211 });
25212 }
25213
25214 if (directiveToken.type === "members") {
25215 membersOnly = membersOnly || {};
25216
25217 body.forEach(function(m) {
25218 var ch1 = m.charAt(0);
25219 var ch2 = m.charAt(m.length - 1);
25220
25221 if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) {
25222 m = m
25223 .substr(1, m.length - 2)
25224 .replace("\\\"", "\"");
25225 }
25226
25227 membersOnly[m] = false;
25228 });
25229 }
25230
25231 var numvals = [
25232 "maxstatements",
25233 "maxparams",
25234 "maxdepth",
25235 "maxcomplexity",
25236 "maxerr",
25237 "maxlen",
25238 "indent"
25239 ];
25240
25241 if (directiveToken.type === "jshint" || directiveToken.type === "jslint" ||
25242 directiveToken.type === "jshint.unstable") {
25243 body.forEach(function(item) {
25244 var parts = item.split(":");
25245 var key = parts[0].trim();
25246 var val = parts.length > 1 ? parts[1].trim() : "";
25247 var numberVal;
25248
25249 if (!checkOption(key, directiveToken.type !== "jshint.unstable", directiveToken)) {
25250 return;
25251 }
25252
25253 if (numvals.indexOf(key) >= 0) {
25254 // GH988 - numeric options can be disabled by setting them to `false`
25255 if (val !== "false") {
25256 numberVal = +val;
25257
25258 if (typeof numberVal !== "number" || !isFinite(numberVal) ||
25259 numberVal <= 0 || Math.floor(numberVal) !== numberVal) {
25260 error("E032", directiveToken, val);
25261 return;
25262 }
25263
25264 state.option[key] = numberVal;
25265 } else {
25266 state.option[key] = key === "indent" ? 4 : false;
25267 }
25268
25269 return;
25270 }
25271
25272 if (key === "validthis") {
25273 // `validthis` is valid only within a function scope.
25274
25275 if (state.funct["(global)"])
25276 return void error("E009");
25277
25278 if (val !== "true" && val !== "false")
25279 return void error("E002", directiveToken);
25280
25281 state.option.validthis = (val === "true");
25282 return;
25283 }
25284
25285 if (key === "quotmark") {
25286 switch (val) {
25287 case "true":
25288 case "false":
25289 state.option.quotmark = (val === "true");
25290 break;
25291 case "double":
25292 case "single":
25293 state.option.quotmark = val;
25294 break;
25295 default:
25296 error("E002", directiveToken);
25297 }
25298 return;
25299 }
25300
25301 if (key === "shadow") {
25302 switch (val) {
25303 case "true":
25304 state.option.shadow = true;
25305 break;
25306 case "outer":
25307 state.option.shadow = "outer";
25308 break;
25309 case "false":
25310 case "inner":
25311 state.option.shadow = "inner";
25312 break;
25313 default:
25314 error("E002", directiveToken);
25315 }
25316 return;
25317 }
25318
25319 if (key === "unused") {
25320 switch (val) {
25321 case "true":
25322 state.option.unused = true;
25323 break;
25324 case "false":
25325 state.option.unused = false;
25326 break;
25327 case "vars":
25328 case "strict":
25329 state.option.unused = val;
25330 break;
25331 default:
25332 error("E002", directiveToken);
25333 }
25334 return;
25335 }
25336
25337 if (key === "latedef") {
25338 switch (val) {
25339 case "true":
25340 state.option.latedef = true;
25341 break;
25342 case "false":
25343 state.option.latedef = false;
25344 break;
25345 case "nofunc":
25346 state.option.latedef = "nofunc";
25347 break;
25348 default:
25349 error("E002", directiveToken);
25350 }
25351 return;
25352 }
25353
25354 if (key === "ignore") {
25355 switch (val) {
25356 case "line":
25357 state.ignoredLines[directiveToken.line] = true;
25358 removeIgnoredMessages();
25359 break;
25360 default:
25361 error("E002", directiveToken);
25362 }
25363 return;
25364 }
25365
25366 if (key === "strict") {
25367 switch (val) {
25368 case "true":
25369 state.option.strict = true;
25370 break;
25371 case "false":
25372 state.option.strict = false;
25373 break;
25374 case "global":
25375 case "implied":
25376 state.option.strict = val;
25377 break;
25378 default:
25379 error("E002", directiveToken);
25380 }
25381 return;
25382 }
25383
25384 if (key === "module") {
25385 /**
25386 * TODO: Extend this restriction to *all* "environmental" options.
25387 */
25388 if (!hasParsedCode(state.funct)) {
25389 error("E055", directiveToken, "module");
25390 }
25391 }
25392
25393 if (key === "esversion") {
25394 switch (val) {
25395 case "3":
25396 case "5":
25397 case "6":
25398 case "7":
25399 case "8":
25400 case "9":
25401 case "10":
25402 state.option.moz = false;
25403 state.option.esversion = +val;
25404 break;
25405 case "2015":
25406 case "2016":
25407 case "2017":
25408 case "2018":
25409 case "2019":
25410 state.option.moz = false;
25411 // Translate specification publication year to version number.
25412 state.option.esversion = +val - 2009;
25413 break;
25414 default:
25415 error("E002", directiveToken);
25416 }
25417 if (!hasParsedCode(state.funct)) {
25418 error("E055", directiveToken, "esversion");
25419 }
25420 return;
25421 }
25422
25423 var match = /^([+-])(W\d{3})$/g.exec(key);
25424 if (match) {
25425 // ignore for -W..., unignore for +W...
25426 state.ignored[match[2]] = (match[1] === "-");
25427 return;
25428 }
25429
25430 var tn;
25431 if (val === "true" || val === "false") {
25432 if (directiveToken.type === "jslint") {
25433 tn = options.renamed[key] || key;
25434 state.option[tn] = (val === "true");
25435
25436 if (options.inverted[tn] !== undefined) {
25437 state.option[tn] = !state.option[tn];
25438 }
25439 } else if (directiveToken.type === "jshint.unstable") {
25440 state.option.unstable[key] = (val === "true");
25441 } else {
25442 state.option[key] = (val === "true");
25443 }
25444
25445 return;
25446 }
25447
25448 error("E002", directiveToken);
25449 });
25450
25451 applyOptions();
25452 }
25453 }
25454
25455 /**
25456 * Return a token beyond the token available in `state.tokens.next`. If no
25457 * such token exists, return the "(end)" token. This function is used to
25458 * determine parsing strategies in cases where the value of the next token
25459 * does not provide sufficient information, as is the case with `for` loops,
25460 * e.g.:
25461 *
25462 * for ( var i in ...
25463 *
25464 * versus:
25465 *
25466 * for ( var i = ...
25467 *
25468 * @param {number} [p] - offset of desired token; defaults to 0
25469 *
25470 * @returns {token}
25471 */
25472 function peek(p) {
25473 var i = p || 0, j = lookahead.length, t;
25474
25475 if (i < j) {
25476 return lookahead[i];
25477 }
25478
25479 while (j <= i) {
25480 t = lex.token();
25481
25482 // When the lexer is exhausted, this function should produce the "(end)"
25483 // token, even in cases where the requested token is beyond the end of
25484 // the input stream.
25485 if (!t) {
25486 // If the lookahead buffer is empty, the expected "(end)" token was
25487 // already emitted by the most recent invocation of `advance` and is
25488 // available as the next token.
25489 if (!lookahead.length) {
25490 return state.tokens.next;
25491 }
25492
25493 return lookahead[j - 1];
25494 }
25495
25496 lookahead[j] = t;
25497 j += 1;
25498 }
25499
25500 return t;
25501 }
25502
25503 function peekIgnoreEOL() {
25504 var i = 0;
25505 var t;
25506 do {
25507 t = peek(i++);
25508 } while (t.id === "(endline)");
25509 return t;
25510 }
25511
25512 /**
25513 * Consume the next token.
25514 *
25515 * @param {string} [expected] - the expected value of the next token's `id`
25516 * property (in the case of punctuators) or
25517 * `value` property (in the case of identifiers
25518 * and literals); if unspecified, any token will
25519 * be accepted
25520 * @param {object} [relatedToken] - the token that informed the expected
25521 * value, if any (for example: the opening
25522 * brace when a closing brace is expected);
25523 * used to produce more meaningful errors
25524 */
25525 function advance(expected, relatedToken) {
25526 var nextToken = state.tokens.next;
25527
25528 if (expected && nextToken.id !== expected) {
25529 if (relatedToken) {
25530 if (nextToken.id === "(end)") {
25531 error("E019", relatedToken, relatedToken.id);
25532 } else {
25533 error("E020", nextToken, expected, relatedToken.id,
25534 relatedToken.line, nextToken.value);
25535 }
25536 } else if (nextToken.type !== "(identifier)" || nextToken.value !== expected) {
25537 error("E021", nextToken, expected, nextToken.value);
25538 }
25539 }
25540
25541 state.tokens.prev = state.tokens.curr;
25542 state.tokens.curr = state.tokens.next;
25543 for (;;) {
25544 state.tokens.next = lookahead.shift() || lex.token();
25545
25546 if (!state.tokens.next) { // No more tokens left, give up
25547 quit("E041", state.tokens.curr);
25548 }
25549
25550 if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") {
25551 return;
25552 }
25553
25554 if (state.tokens.next.check) {
25555 state.tokens.next.check();
25556 }
25557
25558 if (state.tokens.next.isSpecial) {
25559 lintingDirective(state.tokens.next, state.tokens.curr);
25560 } else {
25561 if (state.tokens.next.id !== "(endline)") {
25562 break;
25563 }
25564 }
25565 }
25566 }
25567
25568 /**
25569 * Determine whether a given token is an operator.
25570 *
25571 * @param {token} token
25572 *
25573 * @returns {boolean}
25574 */
25575 function isOperator(token) {
25576 return token.first || token.right || token.left || token.id === "yield" || token.id === "await";
25577 }
25578
25579 function isEndOfExpr(context, curr, next) {
25580 if (arguments.length <= 1) {
25581 curr = state.tokens.curr;
25582 next = state.tokens.next;
25583 }
25584
25585 if (next.id === "in" && context & prodParams.noin) {
25586 return true;
25587 }
25588
25589 if (next.id === ";" || next.id === "}" || next.id === ":") {
25590 return true;
25591 }
25592
25593 if (next.infix === curr.infix ||
25594 // Infix operators which follow `yield` should only be consumed as part
25595 // of the current expression if allowed by the syntactic grammar. In
25596 // effect, this prevents automatic semicolon insertion when `yield` is
25597 // followed by a newline and a comma operator (without enabling it when
25598 // `yield` is followed by a newline and a `[` token).
25599 (curr.id === "yield" && curr.rbp < next.rbp)) {
25600 return !sameLine(curr, next);
25601 }
25602
25603 return false;
25604 }
25605
25606 /**
25607 * The `expression` function is the heart of JSHint's parsing behaior. It is
25608 * based on the Pratt parser, but it extends that model with a `fud` method.
25609 * Short for "first null denotation," it it similar to the `nud` ("null
25610 * denotation") function, but it is only used on the first token of a
25611 * statement. This simplifies usage in statement-oriented languages like
25612 * JavaScript.
25613 *
25614 * .nud Null denotation
25615 * .fud First null denotation
25616 * .led Left denotation
25617 * lbp Left binding power
25618 * rbp Right binding power
25619 *
25620 * They are elements of the parsing method called Top Down Operator Precedence.
25621 *
25622 * In addition to parsing, this function applies a number of linting patterns.
25623 *
25624 * @param {number} context - the parsing context (a bitfield describing
25625 * conditions of the current parsing operation
25626 * which can influence how the next tokens are
25627 * interpreted); see `prod-params.js` for more
25628 * detail)
25629 * @param {number} rbp - the right-binding power of the token to be consumed
25630 */
25631 function expression(context, rbp) {
25632 var left, isArray = false, isObject = false;
25633 var initial = context & prodParams.initial;
25634 var curr;
25635
25636 context &= ~prodParams.initial;
25637
25638 state.nameStack.push();
25639
25640 if (state.tokens.next.id === "(end)")
25641 error("E006", state.tokens.curr);
25642
25643 advance();
25644
25645 if (initial) {
25646 state.funct["(verb)"] = state.tokens.curr.value;
25647 state.tokens.curr.beginsStmt = true;
25648 }
25649
25650 curr = state.tokens.curr;
25651
25652 if (initial && curr.fud && (!curr.useFud || curr.useFud(context))) {
25653 left = state.tokens.curr.fud(context);
25654 } else {
25655 if (state.tokens.curr.nud) {
25656 left = state.tokens.curr.nud(context, rbp);
25657 } else {
25658 error("E030", state.tokens.curr, state.tokens.curr.id);
25659 }
25660
25661 while (rbp < state.tokens.next.lbp && !isEndOfExpr(context)) {
25662 isArray = state.tokens.curr.value === "Array";
25663 isObject = state.tokens.curr.value === "Object";
25664
25665 // #527, new Foo.Array(), Foo.Array(), new Foo.Object(), Foo.Object()
25666 // Line breaks in IfStatement heads exist to satisfy the checkJSHint
25667 // "Line too long." error.
25668 if (left && (left.value || (left.first && left.first.value))) {
25669 // If the left.value is not "new", or the left.first.value is a "."
25670 // then safely assume that this is not "new Array()" and possibly
25671 // not "new Object()"...
25672 if (left.value !== "new" ||
25673 (left.first && left.first.value && left.first.value === ".")) {
25674 isArray = false;
25675 // ...In the case of Object, if the left.value and state.tokens.curr.value
25676 // are not equal, then safely assume that this not "new Object()"
25677 if (left.value !== state.tokens.curr.value) {
25678 isObject = false;
25679 }
25680 }
25681 }
25682
25683 advance();
25684
25685 if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {
25686 warning("W009", state.tokens.curr);
25687 }
25688
25689 if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {
25690 warning("W010", state.tokens.curr);
25691 }
25692
25693 if (left && state.tokens.curr.led) {
25694 left = state.tokens.curr.led(context, left);
25695 } else {
25696 error("E033", state.tokens.curr, state.tokens.curr.id);
25697 }
25698 }
25699 }
25700
25701 state.nameStack.pop();
25702
25703 return left;
25704 }
25705
25706
25707 // Functions for conformance of style.
25708
25709 function sameLine(first, second) {
25710 return first.line === (second.startLine || second.line);
25711 }
25712
25713 function nobreaknonadjacent(left, right) {
25714 if (!state.option.laxbreak && !sameLine(left, right)) {
25715 warning("W014", right, right.value);
25716 }
25717 }
25718
25719 function nolinebreak(t) {
25720 if (!sameLine(t, state.tokens.next)) {
25721 warning("E022", t, t.value);
25722 }
25723 }
25724
25725 /**
25726 * Validate the comma token in the "current" position of the token stream.
25727 *
25728 * @param {object} [opts]
25729 * @param {boolean} [opts.property] - flag indicating whether the current
25730 * comma token is situated directly within
25731 * an object initializer
25732 * @param {boolean} [opts.allowTrailing] - flag indicating whether the
25733 * current comma token may appear
25734 * directly before a delimiter
25735 *
25736 * @returns {boolean} flag indicating the validity of the current comma
25737 * token; `false` if the token directly causes a syntax
25738 * error, `true` otherwise
25739 */
25740 function checkComma(opts) {
25741 var prev = state.tokens.prev;
25742 var curr = state.tokens.curr;
25743 opts = opts || {};
25744
25745 if (!sameLine(prev, curr)) {
25746 if (!state.option.laxcomma) {
25747 if (checkComma.first) {
25748 warning("I001", curr);
25749 checkComma.first = false;
25750 }
25751 warning("W014", prev, curr.value);
25752 }
25753 }
25754
25755 if (state.tokens.next.identifier && !(opts.property && state.inES5())) {
25756 // Keywords that cannot follow a comma operator.
25757 switch (state.tokens.next.value) {
25758 case "break":
25759 case "case":
25760 case "catch":
25761 case "continue":
25762 case "default":
25763 case "do":
25764 case "else":
25765 case "finally":
25766 case "for":
25767 case "if":
25768 case "in":
25769 case "instanceof":
25770 case "return":
25771 case "switch":
25772 case "throw":
25773 case "try":
25774 case "var":
25775 case "let":
25776 case "while":
25777 case "with":
25778 error("E024", state.tokens.next, state.tokens.next.value);
25779 return false;
25780 }
25781 }
25782
25783 if (state.tokens.next.type === "(punctuator)") {
25784 switch (state.tokens.next.value) {
25785 case "}":
25786 case "]":
25787 case ",":
25788 case ")":
25789 if (opts.allowTrailing) {
25790 return true;
25791 }
25792
25793 error("E024", state.tokens.next, state.tokens.next.value);
25794 return false;
25795 }
25796 }
25797 return true;
25798 }
25799
25800 /**
25801 * Factory function for creating "symbols"--objects that will be inherited by
25802 * tokens. The objects created by this function are stored in a symbol table
25803 * and set as the prototype of the tokens generated by the lexer.
25804 *
25805 * Note that this definition of "symbol" describes an implementation detail
25806 * of JSHint and is not related to the ECMAScript value type introduced in
25807 * ES2015.
25808 *
25809 * @param {string} s - the name of the token; for keywords (e.g. `void`) and
25810 * delimiters (e.g.. `[`), this is the token's text
25811 * representation; for literals (e.g. numbers) and other
25812 * "special" tokens (e.g. the end-of-file marker) this is
25813 * a parenthetical value
25814 * @param {number} p - the left-binding power of the token as used by the
25815 * Pratt parsing semantics
25816 *
25817 * @returns {object} - the object describing the JSHint symbol (provided to
25818 * support cases where further refinement is necessary)
25819 */
25820 function symbol(s, p) {
25821 var x = state.syntax[s];
25822 if (!x || typeof x !== "object") {
25823 state.syntax[s] = x = {
25824 id: s,
25825 lbp: p,
25826 // Symbols that accept a right-hand side do so with a binding power
25827 // that is commonly identical to their left-binding power. (This value
25828 // is relevant when determining if the grouping operator is necessary
25829 // to override the precedence of surrounding operators.) Because the
25830 // exponentiation operator's left-binding power and right-binding power
25831 // are distinct, the values must be encoded separately.
25832 rbp: p,
25833 value: s
25834 };
25835 }
25836 return x;
25837 }
25838
25839 /**
25840 * Convenience function for defining delimiter symbols.
25841 *
25842 * @param {string} s - the name of the symbol
25843 *
25844 * @returns {object} - the object describing the JSHint symbol (provided to
25845 * support cases where further refinement is necessary)
25846 */
25847 function delim(s) {
25848 var x = symbol(s, 0);
25849 x.delim = true;
25850 return x;
25851 }
25852
25853 /**
25854 * Convenience function for defining statement-denoting symbols.
25855 *
25856 * @param {string} s - the name of the symbol
25857 * @param {function} f - the first null denotation function for the symbol;
25858 * see the `expression` function for more detail
25859 *
25860 * @returns {object} - the object describing the JSHint symbol (provided to
25861 * support cases where further refinement is necessary)
25862 */
25863 function stmt(s, f) {
25864 var x = delim(s);
25865 x.identifier = x.reserved = true;
25866 x.fud = f;
25867 return x;
25868 }
25869
25870 /**
25871 * Convenience function for defining block-statement-denoting symbols.
25872 *
25873 * A block-statement-denoting symbol is one like 'if' or 'for', which will be
25874 * followed by a block and will not have to end with a semicolon.
25875 *
25876 * @param {string} s - the name of the symbol
25877 * @param {function} - the first null denotation function for the symbol; see
25878 * the `expression` function for more detail
25879 *
25880 * @returns {object} - the object describing the JSHint symbol (provided to
25881 * support cases where further refinement is necessary)
25882 */
25883 function blockstmt(s, f) {
25884 var x = stmt(s, f);
25885 x.block = true;
25886 return x;
25887 }
25888 /**
25889 * Denote a given JSHint symbol as an identifier and a reserved keyword.
25890 *
25891 * @param {object} - a JSHint symbol value
25892 *
25893 * @returns {object} - the provided object
25894 */
25895 function reserveName(x) {
25896 var c = x.id.charAt(0);
25897 if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) {
25898 x.identifier = x.reserved = true;
25899 }
25900 return x;
25901 }
25902
25903 /**
25904 * Convenience function for defining "prefix" symbols--operators that accept
25905 * expressions as a right-hand side.
25906 *
25907 * @param {string} s - the name of the symbol
25908 * @param {function} [f] - the first null denotation function for the symbol;
25909 * see the `expression` function for more detail
25910 *
25911 * @returns {object} - the object describing the JSHint symbol (provided to
25912 * support cases where further refinement is necessary)
25913 */
25914 function prefix(s, f) {
25915 var x = symbol(s, 150);
25916 reserveName(x);
25917
25918 x.nud = (typeof f === "function") ? f : function(context) {
25919 this.arity = "unary";
25920 this.right = expression(context, 150);
25921
25922 if (this.id === "++" || this.id === "--") {
25923 if (state.option.plusplus) {
25924 warning("W016", this, this.id);
25925 }
25926
25927 if (this.right) {
25928 checkLeftSideAssign(context, this.right, this);
25929 }
25930 }
25931
25932 return this;
25933 };
25934
25935 return x;
25936 }
25937
25938 /**
25939 * Convenience function for defining "type" symbols--those that describe
25940 * literal values.
25941 *
25942 * @param {string} s - the name of the symbol
25943 * @param {function} f - the first null denotation function for the symbol;
25944 * see the `expression` function for more detail
25945 *
25946 * @returns {object} - the object describing the JSHint symbol (provided to
25947 * support cases where further refinement is necessary)
25948 */
25949 function type(s, f) {
25950 var x = symbol(s, 0);
25951 x.type = s;
25952 x.nud = f;
25953 return x;
25954 }
25955
25956 /**
25957 * Convenience function for defining JSHint symbols for reserved
25958 * keywords--those that are restricted from use as bindings (and as property
25959 * names in ECMAScript 3 environments).
25960 *
25961 * @param {string} s - the name of the symbol
25962 * @param {function} func - the first null denotation function for the
25963 * symbol; see the `expression` function for more
25964 * detail
25965 *
25966 * @returns {object} - the object describing the JSHint symbol (provided to
25967 * support cases where further refinement is necessary)
25968 */
25969 function reserve(name, func) {
25970 var x = type(name, func);
25971 x.identifier = true;
25972 x.reserved = true;
25973 return x;
25974 }
25975
25976 /**
25977 * Convenience function for defining JSHint symbols for keywords that are
25978 * only reserved in some circumstances.
25979 *
25980 * @param {string} name - the name of the symbol
25981 * @param {object} [meta] - a collection of optional arguments
25982 * @param {function} [meta.nud] -the null denotation function for the symbol;
25983 * see the `expression` function for more detail
25984 * @param {boolean} [meta.es5] - `true` if the identifier is reserved
25985 * in ECMAScript 5 or later
25986 * @param {boolean} [meta.strictOnly] - `true` if the identifier is only
25987 * reserved in strict mode code.
25988 *
25989 * @returns {object} - the object describing the JSHint symbol (provided to
25990 * support cases where further refinement is necessary)
25991 */
25992 function FutureReservedWord(name, meta) {
25993 var x = type(name, state.syntax["(identifier)"].nud);
25994
25995 meta = meta || {};
25996 meta.isFutureReservedWord = true;
25997
25998 x.value = name;
25999 x.identifier = true;
26000 x.reserved = true;
26001 x.meta = meta;
26002
26003 return x;
26004 }
26005
26006 /**
26007 * Convenience function for defining "infix" symbols--operators that require
26008 * operands as both "land-hand side" and "right-hand side".
26009 *
26010 * @param {string} s - the name of the symbol
26011 * @param {function} [f] - a function to be invoked that consumes the
26012 * right-hand side of the operator
26013 * @param {number} p - the left-binding power of the token as used by the
26014 * Pratt parsing semantics
26015 * @param {boolean} [w] - if `true`
26016 *
26017 * @returns {object} - the object describing the JSHint symbol (provided to
26018 * support cases where further refinement is necessary)
26019 */
26020 function infix(s, f, p, w) {
26021 var x = symbol(s, p);
26022 reserveName(x);
26023 x.infix = true;
26024 x.led = function(context, left) {
26025 if (!w) {
26026 nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
26027 }
26028 if ((s === "in" || s === "instanceof") && left.id === "!") {
26029 warning("W018", left, "!");
26030 }
26031 if (typeof f === "function") {
26032 return f(context, left, this);
26033 } else {
26034 this.left = left;
26035 this.right = expression(context, p);
26036 return this;
26037 }
26038 };
26039 return x;
26040 }
26041
26042 /**
26043 * Convenience function for defining the `=>` token as used in arrow
26044 * functions.
26045 *
26046 * @param {string} s - the name of the symbol
26047 *
26048 * @returns {object} - the object describing the JSHint symbol (provided to
26049 * support cases where further refinement is necessary)
26050 */
26051 function application(s) {
26052 var x = symbol(s, 42);
26053
26054 x.infix = true;
26055 x.led = function(context, left) {
26056 nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
26057
26058 this.left = left;
26059 this.right = doFunction(context, { type: "arrow", loneArg: left });
26060 return this;
26061 };
26062 return x;
26063 }
26064
26065 /**
26066 * Convenience function for defining JSHint symbols for relation operators.
26067 *
26068 * @param {string} s - the name of the symbol
26069 * @param {function} [f] - a function to be invoked to enforce any additional
26070 * linting rules.
26071 *
26072 * @returns {object} - the object describing the JSHint symbol (provided to
26073 * support cases where further refinement is necessary)
26074 */
26075 function relation(s, f) {
26076 var x = symbol(s, 100);
26077
26078 x.infix = true;
26079 x.led = function(context, left) {
26080 nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
26081 this.left = left;
26082 var right = this.right = expression(context, 100);
26083
26084 if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) {
26085 warning("W019", this);
26086 } else if (f) {
26087 f.apply(this, [context, left, right]);
26088 }
26089
26090 if (!left || !right) {
26091 quit("E041", state.tokens.curr);
26092 }
26093
26094 if (left.id === "!") {
26095 warning("W018", left, "!");
26096 }
26097
26098 if (right.id === "!") {
26099 warning("W018", right, "!");
26100 }
26101
26102 return this;
26103 };
26104 return x;
26105 }
26106
26107 /**
26108 * Determine if a given token marks the beginning of a UnaryExpression.
26109 *
26110 * @param {object} token
26111 *
26112 * @returns {boolean}
26113 */
26114 function beginsUnaryExpression(token) {
26115 return token.arity === "unary" && token.id !== "++" && token.id !== "--";
26116 }
26117
26118 var typeofValues = {};
26119 typeofValues.legacy = [
26120 // E4X extended the `typeof` operator to return "xml" for the XML and
26121 // XMLList types it introduced.
26122 // Ref: 11.3.2 The typeof Operator
26123 // http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf
26124 "xml",
26125 // IE<9 reports "unknown" when the `typeof` operator is applied to an
26126 // object existing across a COM+ bridge. In lieu of official documentation
26127 // (which does not exist), see:
26128 // http://robertnyman.com/2005/12/21/what-is-typeof-unknown/
26129 "unknown"
26130 ];
26131 typeofValues.es3 = [
26132 "undefined", "boolean", "number", "string", "function", "object",
26133 ];
26134 typeofValues.es3 = typeofValues.es3.concat(typeofValues.legacy);
26135 typeofValues.es6 = typeofValues.es3.concat("symbol", "bigint");
26136
26137 /**
26138 * Validate comparisons between the result of a `typeof` expression and a
26139 * string literal.
26140 *
26141 * @param {token} [left] - one of the values being compared
26142 * @param {token} [right] - the other value being compared
26143 * @param {object} state - the global state object (see `state.js`)
26144 *
26145 * @returns {boolean} - `false` if the second token describes a `typeof`
26146 * expression and the first token is a string literal
26147 * whose value is never returned by that operator;
26148 * `true` otherwise
26149 */
26150 function isTypoTypeof(left, right, state) {
26151 var values;
26152
26153 if (state.option.notypeof)
26154 return false;
26155
26156 if (!left || !right)
26157 return false;
26158
26159 values = state.inES6() ? typeofValues.es6 : typeofValues.es3;
26160
26161 if (right.type === "(identifier)" && right.value === "typeof" && left.type === "(string)") {
26162 if (left.value === "bigint") {
26163 if (!state.option.unstable.bigint) {
26164 warning("W144", left, "BigInt", "bigint");
26165 }
26166
26167 return false;
26168 }
26169
26170 return !_.includes(values, left.value);
26171 }
26172
26173 return false;
26174 }
26175
26176 /**
26177 * Determine if a given token describes the built-in `eval` function.
26178 *
26179 * @param {token} left
26180 * @param {object} state - the global state object (see `state.js`)
26181 *
26182 * @returns {boolean}
26183 */
26184 function isGlobalEval(left, state) {
26185 var isGlobal = false;
26186
26187 // permit methods to refer to an "eval" key in their own context
26188 if (left.type === "this" && state.funct["(context)"] === null) {
26189 isGlobal = true;
26190 }
26191 // permit use of "eval" members of objects
26192 else if (left.type === "(identifier)") {
26193 if (state.option.node && left.value === "global") {
26194 isGlobal = true;
26195 }
26196
26197 else if (state.option.browser && (left.value === "window" || left.value === "document")) {
26198 isGlobal = true;
26199 }
26200 }
26201
26202 return isGlobal;
26203 }
26204
26205 /**
26206 * Determine if a given token describes a property of a built-in object.
26207 *
26208 * @param {token} left
26209 *
26210 * @returns {boolean}
26211 */
26212 function findNativePrototype(left) {
26213 var natives = [
26214 "Array", "ArrayBuffer", "Boolean", "Collator", "DataView", "Date",
26215 "DateTimeFormat", "Error", "EvalError", "Float32Array", "Float64Array",
26216 "Function", "Infinity", "Intl", "Int16Array", "Int32Array", "Int8Array",
26217 "Iterator", "Number", "NumberFormat", "Object", "RangeError",
26218 "ReferenceError", "RegExp", "StopIteration", "String", "SyntaxError",
26219 "TypeError", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray",
26220 "URIError"
26221 ];
26222
26223 function walkPrototype(obj) {
26224 if (typeof obj !== "object") return;
26225 return obj.right === "prototype" ? obj : walkPrototype(obj.left);
26226 }
26227
26228 function walkNative(obj) {
26229 while (!obj.identifier && typeof obj.left === "object")
26230 obj = obj.left;
26231
26232 if (obj.identifier && natives.indexOf(obj.value) >= 0 &&
26233 state.funct["(scope)"].isPredefined(obj.value)) {
26234 return obj.value;
26235 }
26236 }
26237
26238 var prototype = walkPrototype(left);
26239 if (prototype) return walkNative(prototype);
26240 }
26241
26242 /**
26243 * Determine if the given token is a valid assignment target; emit errors
26244 * and/or warnings as appropriate
26245 *
26246 * @param {number} context - the parsing context; see `prod-params.js` for
26247 * more information
26248 * @param {token} left - the left hand side of the assignment
26249 * @param {token=} assignToken - the token for the assignment, used for
26250 * reporting
26251 * @param {object=} options - optional object
26252 * @param {boolean} options.allowDestructuring - whether to allow
26253 * destructuring binding
26254 *
26255 * @returns {boolean} Whether the left hand side is OK
26256 */
26257 function checkLeftSideAssign(context, left, assignToken, options) {
26258
26259 var allowDestructuring = options && options.allowDestructuring;
26260
26261 assignToken = assignToken || left;
26262
26263 if (state.option.freeze) {
26264 var nativeObject = findNativePrototype(left);
26265 if (nativeObject)
26266 warning("W121", left, nativeObject);
26267 }
26268
26269 if (left.identifier && !left.isMetaProperty) {
26270 // The `reassign` method also calls `modify`, but we are specific in
26271 // order to catch function re-assignment and globals re-assignment
26272 state.funct["(scope)"].block.reassign(left.value, left);
26273 }
26274
26275 if (left.id === ".") {
26276 if (!left.left || left.left.value === "arguments" && !state.isStrict()) {
26277 warning("W143", assignToken);
26278 }
26279
26280 state.nameStack.set(state.tokens.prev);
26281 return true;
26282 } else if (left.id === "{" || left.id === "[") {
26283 if (!allowDestructuring || !left.destructAssign) {
26284 if (left.id === "{" || !left.left) {
26285 warning("E031", assignToken);
26286 } else if (left.left.value === "arguments" && !state.isStrict()) {
26287 warning("W143", assignToken);
26288 }
26289 }
26290
26291 if (left.id === "[") {
26292 state.nameStack.set(left.right);
26293 }
26294
26295 return true;
26296 } else if (left.identifier && !isReserved(context, left) && !left.isMetaProperty) {
26297 if (state.funct["(scope)"].bindingtype(left.value) === "exception") {
26298 warning("W022", left);
26299 }
26300
26301 if (left.value === "eval" && state.isStrict()) {
26302 error("E031", assignToken);
26303 return false;
26304 } else if (left.value === "arguments") {
26305 if (!state.isStrict()) {
26306 warning("W143", assignToken);
26307 } else {
26308 error("E031", assignToken);
26309 return false;
26310 }
26311 }
26312 state.nameStack.set(left);
26313 return true;
26314 }
26315
26316 error("E031", assignToken);
26317
26318 return false;
26319 }
26320
26321 /**
26322 * Convenience function for defining JSHint symbols for assignment operators.
26323 *
26324 * @param {string} s - the name of the symbol
26325 * @param {function} [f] - a function to be invoked that consumes the
26326 * right-hand side of the operator (see the `infix`
26327 * function)
26328 *
26329 * @returns {object} - the object describing the JSHint symbol (provided to
26330 * support cases where further refinement is necessary)
26331 */
26332 function assignop(s, f) {
26333 var x = infix(s, typeof f === "function" ? f : function(context, left, that) {
26334 that.left = left;
26335
26336 checkLeftSideAssign(context, left, that, { allowDestructuring: true });
26337
26338 that.right = expression(context, 10);
26339
26340 return that;
26341 }, 20);
26342
26343 x.exps = true;
26344 x.assign = true;
26345
26346 return x;
26347 }
26348
26349 /**
26350 * Convenience function for defining JSHint symbols for bitwise operators.
26351 *
26352 * @param {string} s - the name of the symbol
26353 * @param {function} [f] - the left denotation function for the symbol; see
26354 * the `expression` function for more detail
26355 * @param {number} p - the left-binding power of the token as used by the
26356 * Pratt parsing semantics
26357 *
26358 * @returns {object} - the object describing the JSHint symbol (provided to
26359 * support cases where further refinement is necessary)
26360 */
26361 function bitwise(s, f, p) {
26362 var x = symbol(s, p);
26363 reserveName(x);
26364 x.infix = true;
26365 x.led = (typeof f === "function") ? f : function(context, left) {
26366 if (state.option.bitwise) {
26367 warning("W016", this, this.id);
26368 }
26369 this.left = left;
26370 this.right = expression(context, p);
26371 return this;
26372 };
26373 return x;
26374 }
26375
26376 /**
26377 * Convenience function for defining JSHint symbols for bitwise assignment
26378 * operators. See the `assignop` function for more detail.
26379 *
26380 * @param {string} s - the name of the symbol
26381 *
26382 * @returns {object} - the object describing the JSHint symbol (provided to
26383 * support cases where further refinement is necessary)
26384 */
26385 function bitwiseassignop(s) {
26386 symbol(s, 20).exps = true;
26387 return infix(s, function(context, left, that) {
26388 if (state.option.bitwise) {
26389 warning("W016", that, that.id);
26390 }
26391
26392 checkLeftSideAssign(context, left, that);
26393
26394 that.right = expression(context, 10);
26395
26396 return that;
26397 }, 20);
26398 }
26399
26400 /**
26401 * Convenience function for defining JSHint symbols for those operators which
26402 * have a single operand that appears before them in the source code.
26403 *
26404 * @param {string} s - the name of the symbol
26405 *
26406 * @returns {object} - the object describing the JSHint symbol (provided to
26407 * support cases where further refinement is necessary)
26408 */
26409 function suffix(s) {
26410 var x = symbol(s, 150);
26411
26412 x.led = function(context, left) {
26413 // this = suffix e.g. "++" punctuator
26414 // left = symbol operated e.g. "a" identifier or "a.b" punctuator
26415 if (state.option.plusplus) {
26416 warning("W016", this, this.id);
26417 }
26418
26419 checkLeftSideAssign(context, left, this);
26420
26421 this.left = left;
26422 return this;
26423 };
26424 return x;
26425 }
26426
26427 /**
26428 * Retrieve the value of the current token if it is an identifier and
26429 * optionally advance the parser.
26430 *
26431 * @param {number} context - the parsing context; see `prod-params.js` for
26432 * more information
26433 * @param {boolean} [prop] -`true` if this identifier is that of an object
26434 * property
26435 * @param {boolean} [preserve] - `true` if the token should not be consumed
26436 *
26437 * @returns {string|undefined} - the value of the identifier, if present
26438 */
26439 function optionalidentifier(context, prop, preserve) {
26440 if (!state.tokens.next.identifier) {
26441 return;
26442 }
26443
26444 if (!preserve) {
26445 advance();
26446 }
26447
26448 var curr = state.tokens.curr;
26449 var val = state.tokens.curr.value;
26450
26451 if (!isReserved(context, curr)) {
26452 return val;
26453 }
26454
26455 if (prop) {
26456 if (state.inES5()) {
26457 return val;
26458 }
26459 }
26460
26461 warning("W024", state.tokens.curr, state.tokens.curr.id);
26462 return val;
26463 }
26464
26465 /**
26466 * Consume the "..." token which designates "spread" and "rest" operations if
26467 * it is present. If the operator is repeated, consume every repetition, and
26468 * issue a single error describing the syntax error.
26469 *
26470 * @param {string} operation - either "spread" or "rest"
26471 *
26472 * @returns {boolean} a value describing whether or not any tokens were
26473 * consumed in this way
26474 */
26475 function spreadrest(operation) {
26476 if (!checkPunctuator(state.tokens.next, "...")) {
26477 return false;
26478 }
26479
26480 if (!state.inES6(true)) {
26481 warning("W119", state.tokens.next, operation + " operator", "6");
26482 }
26483 advance();
26484
26485 if (checkPunctuator(state.tokens.next, "...")) {
26486 warning("E024", state.tokens.next, "...");
26487 while (checkPunctuator(state.tokens.next, "...")) {
26488 advance();
26489 }
26490 }
26491
26492 return true;
26493 }
26494
26495 /**
26496 * Ensure that the current token is an identifier and retrieve its value.
26497 *
26498 * @param {number} context - the parsing context; see `prod-params.js` for
26499 * more information
26500 * @param {boolean} [prop] -`true` if this identifier is that of an object
26501 * property
26502 *
26503 * @returns {string|undefined} - the value of the identifier, if present
26504 */
26505 function identifier(context, prop) {
26506 var i = optionalidentifier(context, prop, false);
26507 if (i) {
26508 return i;
26509 }
26510
26511 error("E030", state.tokens.next, state.tokens.next.value);
26512
26513 // The token should be consumed after a warning is issued so the parser
26514 // can continue as though an identifier were found. The semicolon token
26515 // should not be consumed in this way so that the parser interprets it as
26516 // a statement delimiter;
26517 if (state.tokens.next.id !== ";") {
26518 advance();
26519 }
26520 }
26521
26522
26523 /**
26524 * Determine if the provided token may be evaluated and emit a linting
26525 * warning if this is note the case.
26526 *
26527 * @param {token} controlToken
26528 */
26529 function reachable(controlToken) {
26530 var i = 0, t;
26531 if (state.tokens.next.id !== ";" || controlToken.inBracelessBlock) {
26532 return;
26533 }
26534 for (;;) {
26535 do {
26536 t = peek(i);
26537 i += 1;
26538 } while (t.id !== "(end)" && t.id === "(comment)");
26539
26540 if (t.reach) {
26541 return;
26542 }
26543 if (t.id !== "(endline)") {
26544 if (t.id === "function") {
26545 if (state.option.latedef === true) {
26546 warning("W026", t);
26547 }
26548 break;
26549 }
26550
26551 warning("W027", t, t.value, controlToken.value);
26552 break;
26553 }
26554 }
26555 }
26556
26557 /**
26558 * Consume the semicolon that delimits the statement currently being parsed,
26559 * emitting relevant warnings/errors as appropriate.
26560 *
26561 * @param {token} stmt - token describing the statement under consideration
26562 */
26563 function parseFinalSemicolon(stmt) {
26564 if (state.tokens.next.id !== ";") {
26565 // don't complain about unclosed templates / strings
26566 if (state.tokens.next.isUnclosed) return advance();
26567
26568 var isSameLine = sameLine(state.tokens.curr, state.tokens.next) &&
26569 state.tokens.next.id !== "(end)";
26570 var blockEnd = checkPunctuator(state.tokens.next, "}");
26571
26572 if (isSameLine && !blockEnd && !(stmt.id === "do" && state.inES6(true))) {
26573 errorAt("E058", state.tokens.curr.line, state.tokens.curr.character);
26574 } else if (!state.option.asi) {
26575
26576 // If this is the last statement in a block that ends on the same line
26577 // *and* option lastsemic is on, ignore the warning. Otherwise, issue
26578 // a warning about missing semicolon.
26579 if (!(blockEnd && isSameLine && state.option.lastsemic)) {
26580 warningAt("W033", state.tokens.curr.line, state.tokens.curr.character);
26581 }
26582 }
26583 } else {
26584 advance(";");
26585 }
26586 }
26587
26588 /**
26589 * Consume a statement.
26590 *
26591 * @param {number} context - the parsing context; see `prod-params.js` for
26592 * more information
26593 *
26594 * @returns {token} - the token describing the statement
26595 */
26596 function statement(context) {
26597 var i = indent, r, t = state.tokens.next, hasOwnScope = false;
26598
26599 context |= prodParams.initial;
26600
26601 if (t.id === ";") {
26602 advance(";");
26603 return;
26604 }
26605
26606 // Is this a labelled statement?
26607 var res = isReserved(context, t);
26608
26609 // We're being more tolerant here: if someone uses
26610 // a FutureReservedWord (that is not meant to start a statement)
26611 // as a label, we warn but proceed anyway.
26612
26613 if (res && t.meta && t.meta.isFutureReservedWord && !t.fud) {
26614 warning("W024", t, t.id);
26615 res = false;
26616 }
26617
26618 if (t.identifier && !res && peek().id === ":") {
26619 advance();
26620 advance(":");
26621
26622 hasOwnScope = true;
26623 state.funct["(scope)"].stack();
26624 state.funct["(scope)"].block.addLabel(t.value, { token: state.tokens.curr });
26625
26626 if (!state.tokens.next.labelled && state.tokens.next.value !== "{") {
26627 warning("W028", state.tokens.next, t.value, state.tokens.next.value);
26628 }
26629
26630 t = state.tokens.next;
26631 }
26632
26633 // Is it a lonely block?
26634
26635 if (t.id === "{") {
26636 // Is it a switch case block?
26637 //
26638 // switch (foo) {
26639 // case bar: { <= here.
26640 // ...
26641 // }
26642 // }
26643 var iscase = (state.funct["(verb)"] === "case" && state.tokens.curr.value === ":");
26644 block(context, true, true, false, false, iscase);
26645
26646 if (hasOwnScope) {
26647 state.funct["(scope)"].unstack();
26648 }
26649
26650 return;
26651 }
26652
26653 // Parse the statement.
26654
26655 r = expression(context, 0);
26656
26657 if (r && !(r.identifier && r.value === "function") &&
26658 !(r.type === "(punctuator)" && r.left &&
26659 r.left.identifier && r.left.value === "function")) {
26660 if (!state.isStrict() && state.stmtMissingStrict()) {
26661 warning("E007");
26662 }
26663 }
26664
26665 // Look for the final semicolon.
26666
26667 if (!t.block) {
26668 if (!state.option.expr && (!r || !r.exps)) {
26669 warning("W030", state.tokens.curr);
26670 } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") {
26671 warning("W031", t);
26672 }
26673
26674 parseFinalSemicolon(t);
26675 }
26676
26677
26678 // Restore the indentation.
26679
26680 indent = i;
26681 if (hasOwnScope) {
26682 state.funct["(scope)"].unstack();
26683 }
26684 return r;
26685 }
26686
26687 /**
26688 * Consume a series of statements until encountering either the end of the
26689 * program or a token that interrupts control flow.
26690 *
26691 * @param {number} context - the parsing context; see `prod-params.js` for
26692 * more information
26693 *
26694 * @returns {Array<token>} - the tokens consumed
26695 */
26696 function statements(context) {
26697 var a = [], p;
26698
26699 while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") {
26700 if (state.tokens.next.id === ";") {
26701 p = peek();
26702
26703 if (!p || (p.id !== "(" && p.id !== "[")) {
26704 warning("W032");
26705 }
26706
26707 advance(";");
26708 } else {
26709 a.push(statement(context));
26710 }
26711 }
26712 return a;
26713 }
26714
26715
26716 /**
26717 * Parse any directives in a directive prologue.
26718 */
26719 function directives() {
26720 var current = state.tokens.next;
26721 while (state.tokens.next.id === "(string)") {
26722 var next = peekIgnoreEOL();
26723 if (!isEndOfExpr(0, current, next)) {
26724 break;
26725 }
26726 current = next;
26727
26728 advance();
26729 var directive = state.tokens.curr.value;
26730 if (state.directive[directive] ||
26731 (directive === "use strict" && state.option.strict === "implied")) {
26732 warning("W034", state.tokens.curr, directive);
26733 }
26734
26735 // From ECMAScript 2016:
26736 //
26737 // > 14.1.2 Static Semantics: Early Errors
26738 // >
26739 // > [...]
26740 // > - It is a Syntax Error if ContainsUseStrict of FunctionBody is true
26741 // > and IsSimpleParameterList of FormalParameters is false.
26742 if (directive === "use strict" && state.inES7() &&
26743 !state.funct["(global)"] && state.funct["(hasSimpleParams)"] === false) {
26744 error("E065", state.tokens.curr);
26745 }
26746
26747 // there's no directive negation, so always set to true
26748 state.directive[directive] = true;
26749
26750 parseFinalSemicolon(current);
26751 }
26752
26753 if (state.isStrict()) {
26754 state.option.undef = true;
26755 }
26756 }
26757
26758 /**
26759 * Parses a single block. A block is a sequence of statements wrapped in
26760 * braces.
26761 *
26762 * @param {number} context - parsing context
26763 * @param {boolean} ordinary - `true` for everything but function bodies and
26764 * try blocks
26765 * @param {boolean} [stmt] - `true` if block can be a single statement (e.g.
26766 * in if/for/while)
26767 * @param {boolean} [isfunc] - `true` if block is a function body
26768 * @param {boolean} [isfatarrow] - `true` if its a body of a fat arrow
26769 * function
26770 * @param {boolean} [iscase] - `true` if block is a switch case block
26771 *
26772 * @returns {token} - the token describing the block
26773 */
26774 function block(context, ordinary, stmt, isfunc, isfatarrow, iscase) {
26775 var a,
26776 b = inblock,
26777 old_indent = indent,
26778 m,
26779 t,
26780 d;
26781
26782 inblock = ordinary;
26783
26784 t = state.tokens.next;
26785
26786 var metrics = state.funct["(metrics)"];
26787 metrics.nestedBlockDepth += 1;
26788 metrics.verifyMaxNestedBlockDepthPerFunction();
26789
26790 if (state.tokens.next.id === "{") {
26791 advance("{");
26792
26793 // create a new block scope
26794 state.funct["(scope)"].stack();
26795
26796 if (state.tokens.next.id !== "}") {
26797 indent += state.option.indent;
26798 while (!ordinary && state.tokens.next.from > indent) {
26799 indent += state.option.indent;
26800 }
26801
26802 if (isfunc) {
26803 m = {};
26804 for (d in state.directive) {
26805 m[d] = state.directive[d];
26806 }
26807 directives();
26808
26809 state.funct["(isStrict)"] = state.isStrict();
26810
26811 if (state.option.strict && state.funct["(context)"]["(global)"]) {
26812 if (!m["use strict"] && !state.isStrict()) {
26813 warning("E007");
26814 }
26815 }
26816 }
26817
26818 a = statements(context);
26819
26820 metrics.statementCount += a.length;
26821
26822 indent -= state.option.indent;
26823 } else if (isfunc) {
26824 // Ensure property is set for functions with empty bodies.
26825 state.funct["(isStrict)"] = state.isStrict();
26826 }
26827
26828 advance("}", t);
26829
26830 if (isfunc) {
26831 state.funct["(scope)"].validateParams(isfatarrow);
26832 if (m) {
26833 state.directive = m;
26834 }
26835 }
26836
26837 state.funct["(scope)"].unstack();
26838
26839 indent = old_indent;
26840 } else if (!ordinary) {
26841 if (isfunc) {
26842 state.funct["(scope)"].stack();
26843
26844 if (stmt && !isfatarrow && !state.inMoz()) {
26845 error("W118", state.tokens.curr, "function closure expressions");
26846 }
26847
26848 if (isfatarrow) {
26849 state.funct["(scope)"].validateParams(true);
26850 }
26851
26852 var expr = expression(context, 10);
26853
26854 if (state.option.noreturnawait && context & prodParams.async &&
26855 expr.identifier && expr.value === "await") {
26856 warning("W146", expr);
26857 }
26858
26859 if (state.option.strict && state.funct["(context)"]["(global)"]) {
26860 if (!state.isStrict()) {
26861 warning("E007");
26862 }
26863 }
26864
26865 state.funct["(scope)"].unstack();
26866 } else {
26867 error("E021", state.tokens.next, "{", state.tokens.next.value);
26868 }
26869 } else {
26870
26871 state.funct["(scope)"].stack();
26872
26873 if (!stmt || state.option.curly) {
26874 warning("W116", state.tokens.next, "{", state.tokens.next.value);
26875 }
26876
26877 // JSHint observes Annex B of the ECMAScript specification by default,
26878 // where function declarations are permitted in the statement positions
26879 // of IfStatements.
26880 var supportsFnDecl = state.funct["(verb)"] === "if" ||
26881 state.tokens.curr.id === "else";
26882
26883 state.tokens.next.inBracelessBlock = true;
26884 indent += state.option.indent;
26885 // test indentation only if statement is in new line
26886 a = [statement(context)];
26887 indent -= state.option.indent;
26888
26889 if (a[0] && a[0].declaration &&
26890 !(supportsFnDecl && a[0].id === "function")) {
26891 error("E048", a[0], a[0].id[0].toUpperCase() + a[0].id.slice(1));
26892 }
26893
26894 state.funct["(scope)"].unstack();
26895 }
26896
26897 // Don't clear and let it propagate out if it is "break", "return" or
26898 // similar in switch case
26899 switch (state.funct["(verb)"]) {
26900 case "break":
26901 case "continue":
26902 case "return":
26903 case "throw":
26904 if (iscase) {
26905 break;
26906 }
26907
26908 /* falls through */
26909 default:
26910 state.funct["(verb)"] = null;
26911 }
26912
26913 inblock = b;
26914 if (ordinary && state.option.noempty && (!a || a.length === 0)) {
26915 warning("W035", state.tokens.prev);
26916 }
26917 metrics.nestedBlockDepth -= 1;
26918 return a;
26919 }
26920
26921
26922 /**
26923 * Update the global state which tracks all statically-identifiable property
26924 * names, and emit a warning if the `members` linting directive is in use and
26925 * does not include the given name.
26926 *
26927 * @param {string} m - the property name
26928 */
26929 function countMember(m) {
26930 if (membersOnly && typeof membersOnly[m] !== "boolean") {
26931 warning("W036", state.tokens.curr, m);
26932 }
26933 if (typeof member[m] === "number") {
26934 member[m] += 1;
26935 } else {
26936 member[m] = 1;
26937 }
26938 }
26939
26940 // Build the syntax table by declaring the syntactic elements of the language.
26941
26942 type("(number)", function() {
26943 if (state.tokens.next.id === ".") {
26944 warning("W005", this);
26945 }
26946
26947 return this;
26948 });
26949
26950 type("(string)", function() {
26951 return this;
26952 });
26953
26954 state.syntax["(identifier)"] = {
26955 type: "(identifier)",
26956 lbp: 0,
26957 identifier: true,
26958
26959 nud: function(context) {
26960 var v = this.value;
26961 // If this identifier is the lone parameter to a shorthand "fat arrow"
26962 // function definition, i.e.
26963 //
26964 // x => x;
26965 //
26966 // ...it should not be considered as a variable in the current scope. It
26967 // will be added to the scope of the new function when the next token is
26968 // parsed, so it can be safely ignored for now.
26969 var isLoneArrowParam = state.tokens.next.id === "=>";
26970
26971 if (isReserved(context, this)) {
26972 warning("W024", this, v);
26973 } else if (!isLoneArrowParam && !state.funct["(comparray)"].check(v)) {
26974 state.funct["(scope)"].block.use(v, state.tokens.curr);
26975 }
26976
26977 return this;
26978 },
26979
26980 led: function() {
26981 /* istanbul ignore next */
26982 error("E033", state.tokens.next, state.tokens.next.value);
26983 }
26984 };
26985
26986 var baseTemplateSyntax = {
26987 identifier: false,
26988 template: true,
26989 };
26990 state.syntax["(template)"] = _.extend({
26991 lbp: 155,
26992 type: "(template)",
26993 nud: doTemplateLiteral,
26994 led: doTemplateLiteral,
26995 noSubst: false
26996 }, baseTemplateSyntax);
26997
26998 state.syntax["(template middle)"] = _.extend({
26999 lbp: 0,
27000 type: "(template middle)",
27001 noSubst: false
27002 }, baseTemplateSyntax);
27003
27004 state.syntax["(template tail)"] = _.extend({
27005 lbp: 0,
27006 type: "(template tail)",
27007 tail: true,
27008 noSubst: false
27009 }, baseTemplateSyntax);
27010
27011 state.syntax["(no subst template)"] = _.extend({
27012 lbp: 155,
27013 type: "(template)",
27014 nud: doTemplateLiteral,
27015 led: doTemplateLiteral,
27016 noSubst: true,
27017 tail: true // mark as tail, since it's always the last component
27018 }, baseTemplateSyntax);
27019
27020 type("(regexp)", function() {
27021 return this;
27022 });
27023
27024 // ECMAScript parser
27025
27026 delim("(endline)");
27027 (function(x) {
27028 x.line = x.from = 0;
27029 })(delim("(begin)"));
27030 delim("(end)").reach = true;
27031 delim("(error)").reach = true;
27032 delim("}").reach = true;
27033 delim(")");
27034 delim("]");
27035 delim("\"").reach = true;
27036 delim("'").reach = true;
27037 delim(";");
27038 delim(":").reach = true;
27039 delim("#");
27040
27041 reserve("else");
27042 reserve("case").reach = true;
27043 reserve("catch");
27044 reserve("default").reach = true;
27045 reserve("finally");
27046 reserve("true", function() { return this; });
27047 reserve("false", function() { return this; });
27048 reserve("null", function() { return this; });
27049 reserve("this", function() {
27050 if (state.isStrict() && !isMethod() &&
27051 !state.option.validthis && ((state.funct["(statement)"] &&
27052 state.funct["(name)"].charAt(0) > "Z") || state.funct["(global)"])) {
27053 warning("W040", this);
27054 }
27055
27056 return this;
27057 });
27058 reserve("super", function() {
27059 superNud.call(state.tokens.curr, this);
27060
27061 return this;
27062 });
27063
27064 assignop("=", "assign");
27065 assignop("+=", "assignadd");
27066 assignop("-=", "assignsub");
27067 assignop("*=", "assignmult");
27068 assignop("/=", "assigndiv").nud = function() {
27069 /* istanbul ignore next */
27070 error("E014");
27071 };
27072 assignop("%=", "assignmod");
27073 assignop("**=", function(context, left, that) {
27074 if (!state.inES7()) {
27075 warning("W119", that, "Exponentiation operator", "7");
27076 }
27077
27078 that.left = left;
27079
27080 checkLeftSideAssign(context, left, that);
27081
27082 that.right = expression(context, 10);
27083
27084 return that;
27085 });
27086
27087 bitwiseassignop("&=");
27088 bitwiseassignop("|=");
27089 bitwiseassignop("^=");
27090 bitwiseassignop("<<=");
27091 bitwiseassignop(">>=");
27092 bitwiseassignop(">>>=");
27093 infix(",", function(context, left, that) {
27094 if (state.option.nocomma) {
27095 warning("W127", that);
27096 }
27097
27098 that.left = left;
27099
27100 if (checkComma()) {
27101 that.right = expression(context, 10);
27102 } else {
27103 that.right = null;
27104 }
27105
27106 return that;
27107 }, 10, true);
27108
27109 infix("?", function(context, left, that) {
27110 increaseComplexityCount();
27111 that.left = left;
27112 that.right = expression(context & ~prodParams.noin, 10);
27113 advance(":");
27114 expression(context, 10);
27115 return that;
27116 }, 30);
27117
27118 infix("||", function(context, left, that) {
27119 increaseComplexityCount();
27120 that.left = left;
27121 that.right = expression(context, 40);
27122 return that;
27123 }, 40);
27124
27125 var andPrecedence = 50;
27126 infix("&&", function(context, left, that) {
27127 increaseComplexityCount();
27128 that.left = left;
27129 that.right = expression(context, andPrecedence);
27130 return that;
27131 }, andPrecedence);
27132
27133 // The Exponentiation operator, introduced in ECMAScript 2016
27134 //
27135 // ExponentiationExpression[Yield] :
27136 // UnaryExpression[?Yield]
27137 // UpdateExpression[?Yield] ** ExponentiationExpression[?Yield]
27138 infix("**", function(context, left, that) {
27139 if (!state.inES7()) {
27140 warning("W119", that, "Exponentiation operator", "7");
27141 }
27142
27143 // Disallow UnaryExpressions which are not wrapped in parenthesis
27144 if (!left.paren && beginsUnaryExpression(left)) {
27145 error("E024", that, "**");
27146 }
27147
27148 that.left = left;
27149 that.right = expression(context, that.rbp);
27150 return that;
27151 }, 150);
27152 state.syntax["**"].rbp = 140;
27153 bitwise("|", "bitor", 70);
27154 bitwise("^", "bitxor", 80);
27155 bitwise("&", "bitand", 90);
27156 relation("==", function(context, left, right) {
27157 var eqnull = state.option.eqnull &&
27158 ((left && left.value) === "null" || (right && right.value) === "null");
27159
27160 switch (true) {
27161 case !eqnull && state.option.eqeqeq:
27162 this.from = this.character;
27163 warning("W116", this, "===", "==");
27164 break;
27165 /* istanbul ignore next */
27166 case isTypoTypeof(right, left, state):
27167 warning("W122", this, right.value);
27168 break;
27169 case isTypoTypeof(left, right, state):
27170 warning("W122", this, left.value);
27171 break;
27172 }
27173
27174 return this;
27175 });
27176 relation("===", function(context, left, right) {
27177 if (isTypoTypeof(right, left, state)) {
27178 warning("W122", this, right.value);
27179 } else if (isTypoTypeof(left, right, state)) {
27180 /* istanbul ignore next */
27181 warning("W122", this, left.value);
27182 }
27183 return this;
27184 });
27185 relation("!=", function(context, left, right) {
27186 var eqnull = state.option.eqnull &&
27187 ((left && left.value) === "null" || (right && right.value) === "null");
27188
27189 if (!eqnull && state.option.eqeqeq) {
27190 this.from = this.character;
27191 warning("W116", this, "!==", "!=");
27192 } else if (isTypoTypeof(right, left, state)) {
27193 /* istanbul ignore next */
27194 warning("W122", this, right.value);
27195 } else if (isTypoTypeof(left, right, state)) {
27196 warning("W122", this, left.value);
27197 }
27198 return this;
27199 });
27200 relation("!==", function(context, left, right) {
27201 if (isTypoTypeof(right, left, state)) {
27202 warning("W122", this, right.value);
27203 } else if (isTypoTypeof(left, right, state)) {
27204 /* istanbul ignore next */
27205 warning("W122", this, left.value);
27206 }
27207 return this;
27208 });
27209 relation("<");
27210 relation(">");
27211 relation("<=");
27212 relation(">=");
27213 bitwise("<<", "shiftleft", 120);
27214 bitwise(">>", "shiftright", 120);
27215 bitwise(">>>", "shiftrightunsigned", 120);
27216 infix("in", "in", 120);
27217 infix("instanceof", function(context, left, token) {
27218 var right;
27219 var scope = state.funct["(scope)"];
27220 token.left = left;
27221 token.right = right = expression(context, 120);
27222
27223 // This condition reflects a syntax error which will be reported by the
27224 // `expression` function.
27225 if (!right) {
27226 return token;
27227 }
27228
27229 if (right.id === "(number)" ||
27230 right.id === "(string)" ||
27231 right.value === "null" ||
27232 (right.value === "undefined" && !scope.has("undefined")) ||
27233 right.arity === "unary" ||
27234 right.id === "{" ||
27235 (right.id === "[" && !right.right) ||
27236 right.id === "(regexp)" ||
27237 (right.id === "(template)" && !right.tag)) {
27238 error("E060");
27239 }
27240
27241 if (right.id === "function") {
27242 warning("W139");
27243 }
27244
27245 return token;
27246 }, 120);
27247 infix("+", function(context, left, that) {
27248 var next = state.tokens.next;
27249 var right;
27250 that.left = left;
27251 that.right = right = expression(context, 130);
27252
27253 if (left && right && left.id === "(string)" && right.id === "(string)") {
27254 left.value += right.value;
27255 left.character = right.character;
27256 if (!state.option.scripturl && reg.javascriptURL.test(left.value)) {
27257 warning("W050", left);
27258 }
27259 return left;
27260 }
27261
27262 if (next.id === "+" || next.id === "++") {
27263 warning("W007", that.right);
27264 }
27265
27266 return that;
27267 }, 130);
27268 prefix("+", function(context) {
27269 var next = state.tokens.next;
27270 this.arity = "unary";
27271 this.right = expression(context, 150);
27272
27273 if (next.id === "+" || next.id === "++") {
27274 warning("W007", this.right);
27275 }
27276
27277 return this;
27278 });
27279 infix("-", function(context, left, that) {
27280 var next = state.tokens.next;
27281 that.left = left;
27282 that.right = expression(context, 130);
27283
27284 if (next.id === "-" || next.id === "--") {
27285 warning("W006", that.right);
27286 }
27287
27288 return that;
27289 }, 130);
27290 prefix("-", function(context) {
27291 var next = state.tokens.next;
27292 this.arity = "unary";
27293 this.right = expression(context, 150);
27294
27295 if (next.id === "-" || next.id === "--") {
27296 warning("W006", this.right);
27297 }
27298
27299 return this;
27300 });
27301 infix("*", "mult", 140);
27302 infix("/", "div", 140);
27303 infix("%", "mod", 140);
27304
27305 suffix("++");
27306 prefix("++", "preinc");
27307 state.syntax["++"].exps = true;
27308
27309 suffix("--");
27310 prefix("--", "predec");
27311 state.syntax["--"].exps = true;
27312
27313 prefix("delete", function(context) {
27314 this.arity = "unary";
27315 var p = expression(context, 150);
27316 if (!p) {
27317 return this;
27318 }
27319
27320 if (p.id !== "." && p.id !== "[") {
27321 warning("W051");
27322 }
27323 this.first = p;
27324
27325 // The `delete` operator accepts unresolvable references when not in strict
27326 // mode, so the operand may be undefined.
27327 if (p.identifier && !state.isStrict()) {
27328 p.forgiveUndef = true;
27329 }
27330 return this;
27331 }).exps = true;
27332
27333 prefix("~", function(context) {
27334 if (state.option.bitwise) {
27335 warning("W016", this, "~");
27336 }
27337 this.arity = "unary";
27338 this.right = expression(context, 150);
27339 return this;
27340 });
27341
27342 infix("...");
27343
27344 prefix("!", function(context) {
27345 this.arity = "unary";
27346 this.right = expression(context, 150);
27347
27348 if (!this.right) { // '!' followed by nothing? Give up.
27349 quit("E041", this);
27350 }
27351
27352 if (bang[this.right.id] === true) {
27353 warning("W018", this, "!");
27354 }
27355 return this;
27356 });
27357
27358 prefix("typeof", function(context) {
27359 this.arity = "unary";
27360 var p = expression(context, 150);
27361 this.first = this.right = p;
27362
27363 if (!p) { // 'typeof' followed by nothing? Give up.
27364 quit("E041", this);
27365 }
27366
27367 // The `typeof` operator accepts unresolvable references, so the operand
27368 // may be undefined.
27369 if (p.identifier) {
27370 p.forgiveUndef = true;
27371 }
27372 return this;
27373 });
27374 prefix("new", function(context) {
27375 var mp = metaProperty(context, "target", function() {
27376 if (!state.inES6(true)) {
27377 warning("W119", state.tokens.prev, "new.target", "6");
27378 }
27379 var inFunction, c = state.funct;
27380 while (c) {
27381 inFunction = !c["(global)"];
27382 if (!c["(arrow)"]) { break; }
27383 c = c["(context)"];
27384 }
27385 if (!inFunction) {
27386 warning("W136", state.tokens.prev, "new.target");
27387 }
27388 });
27389 if (mp) { return mp; }
27390
27391 var c = expression(context, 155), i;
27392 if (c && c.id !== "function") {
27393 if (c.identifier) {
27394 switch (c.value) {
27395 case "Number":
27396 case "String":
27397 case "Boolean":
27398 case "Math":
27399 case "JSON":
27400 warning("W053", state.tokens.prev, c.value);
27401 break;
27402 case "Symbol":
27403 if (state.inES6()) {
27404 warning("W053", state.tokens.prev, c.value);
27405 }
27406 break;
27407 case "Function":
27408 if (!state.option.evil) {
27409 warning("W054");
27410 }
27411 break;
27412 case "Date":
27413 case "RegExp":
27414 case "this":
27415 break;
27416 default:
27417 i = c.value.substr(0, 1);
27418 if (state.option.newcap && (i < "A" || i > "Z") &&
27419 !state.funct["(scope)"].isPredefined(c.value)) {
27420 warning("W055", state.tokens.curr);
27421 }
27422 }
27423 } else {
27424 if (c.id !== "." && c.id !== "[" && c.id !== "(") {
27425 /* istanbul ignore next */
27426 warning("W056", state.tokens.curr);
27427 }
27428 }
27429 } else {
27430 if (!state.option.supernew)
27431 warning("W057", this);
27432 }
27433 if (state.tokens.next.id !== "(" && !state.option.supernew) {
27434 warning("W058", state.tokens.curr, state.tokens.curr.value);
27435 }
27436 this.first = this.right = c;
27437 return this;
27438 });
27439 state.syntax["new"].exps = true;
27440
27441
27442 var classDeclaration = blockstmt("class", function(context) {
27443 var className, classNameToken;
27444 var inexport = context & prodParams.export;
27445
27446 if (!state.inES6()) {
27447 warning("W104", state.tokens.curr, "class", "6");
27448 }
27449 state.inClassBody = true;
27450
27451 // Class Declaration: 'class <Classname>'
27452 if (state.tokens.next.identifier && state.tokens.next.value !== "extends") {
27453 classNameToken = state.tokens.next;
27454 className = classNameToken.value;
27455 identifier(context);
27456 // unintialized, so that the 'extends' clause is parsed while the class is in TDZ
27457 state.funct["(scope)"].addbinding(className, {
27458 type: "class",
27459 initialized: false,
27460 token: classNameToken
27461 });
27462 }
27463
27464 // Class Declaration: 'class <Classname> extends <Superclass>'
27465 if (state.tokens.next.value === "extends") {
27466 advance("extends");
27467 expression(context, 0);
27468 }
27469
27470 if (classNameToken) {
27471 this.name = className;
27472 state.funct["(scope)"].initialize(className);
27473 if (inexport) {
27474 state.funct["(scope)"].setExported(className, classNameToken);
27475 }
27476 }
27477 state.funct["(scope)"].stack();
27478 classBody(this, context);
27479 return this;
27480 });
27481 classDeclaration.exps = true;
27482 classDeclaration.declaration = true;
27483
27484 /*
27485 Class expression
27486
27487 The Block- and Expression- handling for "class" are almost identical, except for the ordering of steps.
27488 In an expression:, the name should not be saved into the calling scope, but is still accessible inside the definition, so we open a new scope first, then save the name. We also mark it as used.
27489 */
27490 prefix("class", function(context) {
27491 var className, classNameToken;
27492
27493 if (!state.inES6()) {
27494 warning("W104", state.tokens.curr, "class", "6");
27495 }
27496 state.inClassBody = true;
27497
27498 // Class Declaration: 'class <Classname>'
27499 if (state.tokens.next.identifier && state.tokens.next.value !== "extends") {
27500 classNameToken = state.tokens.next;
27501 className = classNameToken.value;
27502 identifier(context);
27503 }
27504
27505 // Class Declaration: 'class <Classname> extends <Superclass>'
27506 if (state.tokens.next.value === "extends") {
27507 advance("extends");
27508 expression(context, 0);
27509 }
27510
27511 state.funct["(scope)"].stack();
27512 if (classNameToken) {
27513 this.name = className;
27514 state.funct["(scope)"].addbinding(className, {
27515 type: "class",
27516 initialized: true,
27517 token: classNameToken
27518 });
27519 state.funct["(scope)"].block.use(className, classNameToken);
27520 }
27521
27522 classBody(this, context);
27523 return this;
27524 });
27525
27526 function classBody(classToken, context) {
27527 var props = Object.create(null);
27528 var name, accessorType, token, isStatic, inGenerator, hasConstructor;
27529
27530 /* istanbul ignore else */
27531 if (state.tokens.next.value === "{") {
27532 advance("{");
27533 } else {
27534 warning("W116", state.tokens.curr, "identifier", state.tokens.next.type); //?
27535 advance();
27536 }
27537
27538 while (state.tokens.next.value !== "}") {
27539 isStatic = false;
27540 inGenerator = false;
27541 context &= ~prodParams.preAsync;
27542
27543 if (state.tokens.next.value === "static" &&
27544 !checkPunctuator(peek(), "(")) {
27545 isStatic = true;
27546 advance();
27547 }
27548
27549 if (state.tokens.next.value === "async") {
27550 if (!checkPunctuator(peek(), "(")) {
27551 context |= prodParams.preAsync;
27552 advance();
27553
27554 nolinebreak(state.tokens.curr);
27555
27556 if (checkPunctuator(state.tokens.next, "*")) {
27557 inGenerator = true;
27558 advance("*");
27559
27560 if (!state.inES9()) {
27561 warning("W119", state.tokens.next, "async generators", "9");
27562 }
27563 }
27564
27565 if (!state.inES8()) {
27566 warning("W119", state.tokens.curr, "async functions", "8");
27567 }
27568 }
27569 }
27570
27571 if (state.tokens.next.value === "*") {
27572 inGenerator = true;
27573 advance();
27574 }
27575
27576 token = state.tokens.next;
27577
27578 if ((token.value === "set" || token.value === "get") && !checkPunctuator(peek(), "(")) {
27579 if (inGenerator) {
27580 /* istanbul ignore next */
27581 error("E024", token, token.value);
27582 }
27583 accessorType = token.value;
27584 advance();
27585 token = state.tokens.next;
27586
27587 if (!isStatic && token.value === "constructor") {
27588 error("E049", token, "class " + accessorType + "ter method", token.value);
27589 } else if (isStatic && token.value === "prototype") {
27590 error("E049", token, "static class " + accessorType + "ter method", token.value);
27591 }
27592 } else {
27593 accessorType = null;
27594 }
27595
27596 switch (token.value) {
27597 case ";":
27598 warning("W032", token);
27599 advance();
27600 break;
27601 case "constructor":
27602 if (isStatic) {
27603 // treat like a regular method -- static methods can be called 'constructor'
27604 name = propertyName(context);
27605 saveProperty(props, name, token, true, isStatic);
27606 doMethod(classToken, context, name, inGenerator);
27607 } else {
27608 if (inGenerator || context & prodParams.preAsync) {
27609 error("E024", token, token.value);
27610 } else if (hasConstructor) {
27611 /* istanbul ignore next */
27612 error("E024", token, token.value);
27613 } else {
27614 hasConstructor = !accessorType && !isStatic;
27615 }
27616 advance();
27617 doMethod(classToken, context, state.nameStack.infer());
27618 }
27619 break;
27620 case "[":
27621 name = computedPropertyName(context);
27622 doMethod(classToken, context, name, inGenerator);
27623 // We don't check names (via calling saveProperty()) of computed expressions like ["Symbol.iterator"]()
27624 break;
27625 default:
27626 name = propertyName(context);
27627 if (name === undefined) {
27628 error("E024", token, token.value);
27629 advance();
27630 break;
27631 }
27632
27633 if (accessorType) {
27634 saveAccessor(accessorType, props, name, token, true, isStatic);
27635 name = state.nameStack.infer();
27636 } else {
27637 if (isStatic && name === "prototype") {
27638 error("E049", token, "static class method", name);
27639 }
27640
27641 saveProperty(props, name, token, true, isStatic);
27642 }
27643
27644 doMethod(classToken, context, name, inGenerator);
27645 break;
27646 }
27647 }
27648 advance("}");
27649 checkProperties(props);
27650
27651 state.inClassBody = false;
27652 state.funct["(scope)"].unstack();
27653 }
27654
27655 function doMethod(classToken, context, name, generator) {
27656 if (generator) {
27657 if (!state.inES6()) {
27658 warning("W119", state.tokens.curr, "function*", "6");
27659 }
27660 }
27661
27662 if (state.tokens.next.value !== "(") {
27663 error("E054", state.tokens.next, state.tokens.next.value);
27664 advance();
27665 if (state.tokens.next.value === "{") {
27666 // manually cheating the test "invalidClasses", which asserts this particular behavior when a class is misdefined.
27667 advance();
27668 if (state.tokens.next.value === "}") {
27669 warning("W116", state.tokens.next, "(", state.tokens.next.value);
27670 advance();
27671 identifier(context);
27672 advance();
27673 }
27674 /* istanbul ignore next */
27675 return;
27676 } else {
27677 while (state.tokens.next.value !== "(") {
27678 advance();
27679 }
27680 }
27681 }
27682
27683 doFunction(context, { name: name,
27684 type: generator ? "generator" : null,
27685 isMethod: true,
27686 statement: classToken });
27687 }
27688
27689 prefix("void").exps = true;
27690
27691 infix(".", function(context, left, that) {
27692 var m = identifier(context, true);
27693
27694 if (typeof m === "string") {
27695 countMember(m);
27696 }
27697
27698 that.left = left;
27699 that.right = m;
27700
27701 if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") {
27702 warning("W001");
27703 }
27704
27705 if (left && left.value === "arguments" && (m === "callee" || m === "caller")) {
27706 if (state.option.noarg)
27707 warning("W059", left, m);
27708 else if (state.isStrict())
27709 error("E008");
27710 } else if (!state.option.evil && left && left.value === "document" &&
27711 (m === "write" || m === "writeln")) {
27712 warning("W060", left);
27713 }
27714
27715 if (!state.option.evil && (m === "eval" || m === "execScript")) {
27716 if (isGlobalEval(left, state)) {
27717 warning("W061");
27718 }
27719 }
27720
27721 return that;
27722 }, 160, true);
27723
27724 infix("(", function(context, left, that) {
27725 if (state.option.immed && left && !left.immed && left.id === "function") {
27726 warning("W062");
27727 }
27728
27729 if (state.option.asi && checkPunctuators(state.tokens.prev, [")", "]"]) &&
27730 !sameLine(state.tokens.prev, state.tokens.curr)) {
27731 warning("W014", state.tokens.curr, state.tokens.curr.id);
27732 }
27733
27734 var n = 0;
27735 var p = [];
27736
27737 if (left) {
27738 if (left.type === "(identifier)") {
27739 if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {
27740 if ("Array Number String Boolean Date Object Error Symbol".indexOf(left.value) === -1) {
27741 if (left.value === "Math") {
27742 /* istanbul ignore next */
27743 warning("W063", left);
27744 } else if (state.option.newcap) {
27745 warning("W064", left);
27746 }
27747 }
27748 }
27749 }
27750 }
27751
27752 if (state.tokens.next.id !== ")") {
27753 for (;;) {
27754 spreadrest("spread");
27755
27756 p[p.length] = expression(context, 10);
27757 n += 1;
27758 if (state.tokens.next.id !== ",") {
27759 break;
27760 }
27761 advance(",");
27762 checkComma({ allowTrailing: true });
27763
27764 if (state.tokens.next.id === ")") {
27765 if (!state.inES8()) {
27766 warning("W119", state.tokens.curr, "Trailing comma in arguments lists", "8");
27767 }
27768
27769 break;
27770 }
27771 }
27772 }
27773
27774 advance(")");
27775
27776 if (typeof left === "object") {
27777 if (!state.inES5() && left.value === "parseInt" && n === 1) {
27778 warning("W065", state.tokens.curr);
27779 }
27780 if (!state.option.evil) {
27781 if (left.value === "eval" || left.value === "Function" ||
27782 left.value === "execScript") {
27783 warning("W061", left);
27784
27785 // This conditional expression was initially implemented with a typo
27786 // which prevented the branch's execution in all cases. While
27787 // enabling the code will produce behavior that is consistent with
27788 // the other forms of code evaluation that follow, such a change is
27789 // also technically incompatable with prior versions of JSHint (due
27790 // to the fact that the behavior was never formally documented). This
27791 // branch should be enabled as part of a major release.
27792 //if (p[0] && p[0].id === "(string)") {
27793 // addEvalCode(left, p[0]);
27794 //}
27795 } else if (p[0] && p[0].id === "(string)" &&
27796 (left.value === "setTimeout" ||
27797 left.value === "setInterval")) {
27798 warning("W066", left);
27799 addEvalCode(left, p[0]);
27800
27801 // window.setTimeout/setInterval
27802 } else if (p[0] && p[0].id === "(string)" &&
27803 left.value === "." &&
27804 left.left.value === "window" &&
27805 (left.right === "setTimeout" ||
27806 left.right === "setInterval")) {
27807 warning("W066", left);
27808 addEvalCode(left, p[0]);
27809 }
27810 }
27811 if (!left.identifier && left.id !== "." && left.id !== "[" && left.id !== "=>" &&
27812 left.id !== "(" && left.id !== "&&" && left.id !== "||" && left.id !== "?" &&
27813 left.id !== "async" && !(state.inES6() && left["(name)"])) {
27814 warning("W067", that);
27815 }
27816 }
27817
27818 that.left = left;
27819 return that;
27820 }, 155, true).exps = true;
27821
27822 function peekThroughParens(parens) {
27823 var pn = state.tokens.next;
27824 var i = -1;
27825 var pn1;
27826
27827 do {
27828 if (pn.value === "(") {
27829 parens += 1;
27830 } else if (pn.value === ")") {
27831 parens -= 1;
27832 }
27833
27834 i += 1;
27835 pn1 = pn;
27836 pn = peek(i);
27837 } while (!(parens === 0 && pn1.value === ")") && pn.type !== "(end)");
27838
27839 return pn;
27840 }
27841
27842 prefix("(", function(context, rbp) {
27843 var ret, triggerFnExpr, first, last;
27844 var opening = state.tokens.curr;
27845 var preceeding = state.tokens.prev;
27846 var isNecessary = !state.option.singleGroups;
27847 var pn = peekThroughParens(1);
27848
27849 if (state.tokens.next.id === "function") {
27850 triggerFnExpr = state.tokens.next.immed = true;
27851 }
27852
27853 // If the balanced grouping operator is followed by a "fat arrow", the
27854 // current token marks the beginning of a "fat arrow" function and parsing
27855 // should proceed accordingly.
27856 if (pn.value === "=>") {
27857 pn.funct = doFunction(context, { type: "arrow", parsedOpening: true });
27858 return pn;
27859 }
27860
27861 // The ECMA262 grammar requires an expression between the "opening
27862 // parenthesis" and "close parenthesis" tokens of the grouping operator.
27863 // However, the "ignore" directive is commonly used to inject values that
27864 // are not included in the token stream. For example:
27865 //
27866 // return (
27867 // /*jshint ignore:start */
27868 // <div></div>
27869 // /*jshint ignore:end */
27870 // );
27871 //
27872 // The "empty" grouping operator is permitted in order to tolerate this
27873 // pattern.
27874 if (state.tokens.next.id === ")") {
27875 advance(")");
27876 return;
27877 }
27878
27879 ret = expression(context, 0);
27880
27881 advance(")", this);
27882
27883 if (!ret) {
27884 return;
27885 }
27886
27887 ret.paren = true;
27888
27889 if (state.option.immed && ret && ret.id === "function") {
27890 if (state.tokens.next.id !== "(" &&
27891 state.tokens.next.id !== "." && state.tokens.next.id !== "[") {
27892 warning("W068", this);
27893 }
27894 }
27895
27896 if (ret.id === ",") {
27897 first = ret.left;
27898 while (first.id === ",") {
27899 first = first.left;
27900 }
27901
27902 last = ret.right;
27903 } else {
27904 first = last = ret;
27905
27906 if (!isNecessary) {
27907 // async functions are identified after parsing due to the complexity
27908 // of disambiguating the `async` keyword.
27909 if (!triggerFnExpr) {
27910 triggerFnExpr = ret.id === "async";
27911 }
27912
27913 isNecessary =
27914 // Used to distinguish from an ExpressionStatement which may not
27915 // begin with the `{` and `function` tokens
27916 (opening.beginsStmt && (ret.id === "{" || triggerFnExpr)) ||
27917 // Used to signal that a function expression is being supplied to
27918 // some other operator.
27919 (triggerFnExpr &&
27920 // For parenthesis wrapping a function expression to be considered
27921 // necessary, the grouping operator should be the left-hand-side of
27922 // some other operator--either within the parenthesis or directly
27923 // following them.
27924 (!isEndOfExpr() || state.tokens.prev.id !== "}")) ||
27925 // Used to demarcate an arrow function as the left-hand side of some
27926 // operator.
27927 (ret.id === "=>" && !isEndOfExpr()) ||
27928 // Used as the return value of a single-statement arrow function
27929 (ret.id === "{" && preceeding.id === "=>") ||
27930 // Used to cover a unary expression as the left-hand side of the
27931 // exponentiation operator
27932 (beginsUnaryExpression(ret) && state.tokens.next.id === "**") ||
27933 // Used to delineate an integer number literal from a dereferencing
27934 // punctuator (otherwise interpreted as a decimal point)
27935 (ret.type === "(number)" &&
27936 checkPunctuator(pn, ".") && /^\d+$/.test(ret.value)) ||
27937 // Used to wrap object destructuring assignment
27938 (opening.beginsStmt && ret.id === "=" && ret.left.id === "{");
27939 }
27940 }
27941
27942 // The operator may be necessary to override the default binding power of
27943 // neighboring operators (whenever there is an operator in use within the
27944 // first expression *or* the current group contains multiple expressions)
27945 if (!isNecessary && (isOperator(first) || first !== last)) {
27946 isNecessary =
27947 (rbp > first.lbp) ||
27948 (rbp > 0 && rbp === first.lbp) ||
27949 (!isEndOfExpr() && last.rbp < state.tokens.next.lbp);
27950 }
27951
27952 if (!isNecessary) {
27953 warning("W126", opening);
27954 }
27955
27956 return ret;
27957 });
27958
27959 application("=>");
27960
27961 infix("[", function(context, left, that) {
27962 var e, s, canUseDot;
27963
27964 if (state.option.asi && checkPunctuators(state.tokens.prev, [")", "]"]) &&
27965 !sameLine(state.tokens.prev, state.tokens.curr)) {
27966 warning("W014", state.tokens.curr, state.tokens.curr.id);
27967 }
27968
27969 e = expression(context & ~prodParams.noin, 10);
27970
27971 if (e && e.type === "(string)") {
27972 if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) {
27973 if (isGlobalEval(left, state)) {
27974 warning("W061");
27975 }
27976 }
27977
27978 countMember(e.value);
27979 if (!state.option.sub && reg.identifier.test(e.value)) {
27980 s = state.syntax[e.value];
27981
27982 if (s) {
27983 canUseDot = !isReserved(context, s);
27984 } else {
27985 // This branch exists to preserve legacy behavior with version 2.9.5
27986 // and earlier. In those releases, `eval` and `arguments` were
27987 // incorrectly interpreted as reserved keywords, so Member
27988 // Expressions such as `object["eval"]` did not trigger warning W069.
27989 //
27990 // TODO: Remove in JSHint 3
27991 canUseDot = e.value !== "eval" && e.value !== "arguments";
27992 }
27993
27994 if (canUseDot) {
27995 warning("W069", state.tokens.prev, e.value);
27996 }
27997 }
27998 }
27999 advance("]", that);
28000
28001 if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") {
28002 warning("W001");
28003 }
28004
28005 that.left = left;
28006 that.right = e;
28007 return that;
28008 }, 160, true);
28009
28010 function comprehensiveArrayExpression(context) {
28011 var res = {};
28012 res.exps = true;
28013 state.funct["(comparray)"].stack();
28014
28015 // Handle reversed for expressions, used in spidermonkey
28016 var reversed = false;
28017 if (state.tokens.next.value !== "for") {
28018 reversed = true;
28019 if (!state.inMoz()) {
28020 warning("W116", state.tokens.next, "for", state.tokens.next.value);
28021 }
28022 state.funct["(comparray)"].setState("use");
28023 res.right = expression(context, 10);
28024 }
28025
28026 advance("for");
28027 if (state.tokens.next.value === "each") {
28028 advance("each");
28029 if (!state.inMoz()) {
28030 warning("W118", state.tokens.curr, "for each");
28031 }
28032 }
28033 advance("(");
28034 state.funct["(comparray)"].setState("define");
28035 res.left = expression(context, 130);
28036 if (_.includes(["in", "of"], state.tokens.next.value)) {
28037 advance();
28038 } else {
28039 /* istanbul ignore next */
28040 error("E045", state.tokens.curr);
28041 }
28042 state.funct["(comparray)"].setState("generate");
28043 expression(context, 10);
28044
28045 advance(")");
28046 if (state.tokens.next.value === "if") {
28047 advance("if");
28048 advance("(");
28049 state.funct["(comparray)"].setState("filter");
28050 expression(context, 10);
28051 advance(")");
28052 }
28053
28054 if (!reversed) {
28055 state.funct["(comparray)"].setState("use");
28056 res.right = expression(context, 10);
28057 }
28058
28059 advance("]");
28060 state.funct["(comparray)"].unstack();
28061 return res;
28062 }
28063
28064 prefix("[", function(context) {
28065 var blocktype = lookupBlockType();
28066 if (blocktype.isCompArray) {
28067 if (!state.option.esnext && !state.inMoz()) {
28068 warning("W118", state.tokens.curr, "array comprehension");
28069 }
28070 return comprehensiveArrayExpression(context);
28071 } else if (blocktype.isDestAssign) {
28072 this.destructAssign = destructuringPattern(context, {
28073 openingParsed: true,
28074 assignment: true
28075 });
28076 return this;
28077 }
28078 var b = !sameLine(state.tokens.curr, state.tokens.next);
28079 this.first = [];
28080 if (b) {
28081 indent += state.option.indent;
28082 if (state.tokens.next.from === indent + state.option.indent) {
28083 /* istanbul ignore next */
28084 indent += state.option.indent;
28085 }
28086 }
28087 while (state.tokens.next.id !== "(end)") {
28088 while (state.tokens.next.id === ",") {
28089 if (!state.option.elision) {
28090 if (!state.inES5()) {
28091 // Maintain compat with old options --- ES5 mode without
28092 // elision=true will warn once per comma
28093 warning("W070");
28094 } else {
28095 warning("W128");
28096 do {
28097 advance(",");
28098 } while (state.tokens.next.id === ",");
28099 continue;
28100 }
28101 }
28102 advance(",");
28103 }
28104
28105 if (state.tokens.next.id === "]") {
28106 break;
28107 }
28108
28109 spreadrest("spread");
28110
28111 this.first.push(expression(context, 10));
28112 if (state.tokens.next.id === ",") {
28113 advance(",");
28114 checkComma({ allowTrailing: true });
28115 if (state.tokens.next.id === "]" && !state.inES5()) {
28116 warning("W070", state.tokens.curr);
28117 break;
28118 }
28119 } else {
28120 if (state.option.trailingcomma && state.inES5()) {
28121 warningAt("W140", state.tokens.curr.line, state.tokens.curr.character);
28122 }
28123 break;
28124 }
28125 }
28126 if (b) {
28127 indent -= state.option.indent;
28128 }
28129 advance("]", this);
28130 return this;
28131 });
28132
28133
28134 function isMethod() {
28135 return !!state.funct["(method)"];
28136 }
28137
28138 function propertyName(context, preserveOrToken) {
28139 var id;
28140 var preserve = true;
28141 if (typeof preserveOrToken === "object") {
28142 /* istanbul ignore next */
28143 id = preserveOrToken;
28144 } else {
28145 preserve = preserveOrToken;
28146 id = optionalidentifier(context, true, preserve);
28147 }
28148
28149 if (!id) {
28150 if (state.tokens.next.id === "(string)") {
28151 id = state.tokens.next.value;
28152 if (!preserve) {
28153 advance();
28154 }
28155 } else if (state.tokens.next.id === "(number)") {
28156 id = state.tokens.next.value.toString();
28157 if (!preserve) {
28158 advance();
28159 }
28160 }
28161 /* istanbul ignore next */
28162 } else if (typeof id === "object") {
28163 if (id.id === "(string)" || id.id === "(identifier)") id = id.value;
28164 else if (id.id === "(number)") id = id.value.toString();
28165 }
28166
28167 if (id === "hasOwnProperty") {
28168 warning("W001");
28169 }
28170
28171 return id;
28172 }
28173
28174 /**
28175 * @param {Number} context The parsing context
28176 * @param {Object} [options]
28177 * @param {token} [options.loneArg] The argument to the function in cases
28178 * where it was defined using the
28179 * single-argument shorthand.
28180 * @param {bool} [options.parsedOpening] Whether the opening parenthesis has
28181 * already been parsed.
28182 *
28183 * @returns {{ arity: number, params: Array.<string>, isSimple: boolean }}
28184 */
28185 function functionparams(context, options) {
28186 var next;
28187 var paramsIds = [];
28188 var ident;
28189 var tokens = [];
28190 var t;
28191 var pastDefault = false;
28192 var pastRest = false;
28193 var arity = 0;
28194 var loneArg = options && options.loneArg;
28195 var hasDestructuring = false;
28196
28197 if (loneArg && loneArg.identifier === true) {
28198 state.funct["(scope)"].addParam(loneArg.value, loneArg);
28199 return { arity: 1, params: [ loneArg.value ], isSimple: true };
28200 }
28201
28202 next = state.tokens.next;
28203
28204 if (!options || !options.parsedOpening) {
28205 advance("(");
28206 }
28207
28208 if (state.tokens.next.id === ")") {
28209 advance(")");
28210 return;
28211 }
28212
28213 function addParam(addParamArgs) {
28214 state.funct["(scope)"].addParam.apply(state.funct["(scope)"], addParamArgs);
28215 }
28216
28217 for (;;) {
28218 arity++;
28219 // are added to the param scope
28220 var currentParams = [];
28221
28222 pastRest = spreadrest("rest");
28223
28224 if (_.includes(["{", "["], state.tokens.next.id)) {
28225 hasDestructuring = true;
28226 tokens = destructuringPattern(context);
28227 for (t in tokens) {
28228 t = tokens[t];
28229 if (t.id) {
28230 paramsIds.push(t.id);
28231 currentParams.push([t.id, t.token]);
28232 }
28233 }
28234 } else {
28235 ident = identifier(context);
28236
28237 if (ident) {
28238 paramsIds.push(ident);
28239 currentParams.push([ident, state.tokens.curr]);
28240 } else {
28241 // Skip invalid parameter.
28242 while (!checkPunctuators(state.tokens.next, [",", ")"])) advance();
28243 }
28244 }
28245
28246 // It is valid to have a regular argument after a default argument
28247 // since undefined can be used for missing parameters. Still warn as it is
28248 // a possible code smell.
28249 if (pastDefault) {
28250 if (state.tokens.next.id !== "=") {
28251 error("W138", state.tokens.curr);
28252 }
28253 }
28254 if (state.tokens.next.id === "=") {
28255 if (!state.inES6()) {
28256 warning("W119", state.tokens.next, "default parameters", "6");
28257 }
28258
28259 if (pastRest) {
28260 error("E062", state.tokens.next);
28261 }
28262
28263 advance("=");
28264 pastDefault = true;
28265 expression(context, 10);
28266 }
28267
28268 // now we have evaluated the default expression, add the variable to the param scope
28269 currentParams.forEach(addParam);
28270 if (state.tokens.next.id === ",") {
28271 if (pastRest) {
28272 warning("W131", state.tokens.next);
28273 }
28274 advance(",");
28275 checkComma({ allowTrailing: true });
28276 }
28277
28278 if (state.tokens.next.id === ")") {
28279 if (state.tokens.curr.id === "," && !state.inES8()) {
28280 warning("W119", state.tokens.curr, "Trailing comma in function parameters", "8");
28281 }
28282
28283 advance(")", next);
28284 return {
28285 arity: arity,
28286 params: paramsIds,
28287 isSimple: !hasDestructuring && !pastRest && !pastDefault
28288 };
28289 }
28290 }
28291 }
28292
28293 /**
28294 * Factory function for creating objects used to track statistics of function
28295 * literals.
28296 *
28297 * @param {string} name - the identifier name to associate with the function
28298 * @param {object} [token] - token responsible for creating the function
28299 * object
28300 * @param {object} [overwrites] - a collection of properties that should
28301 * override the corresponding default value of
28302 * the new "functor" object
28303 */
28304 function functor(name, token, overwrites) {
28305 var funct = {
28306 "(name)" : name,
28307 "(breakage)" : 0,
28308 "(loopage)" : 0,
28309 // The strictness of the function body is tracked via a dedicated
28310 // property (as opposed to via the global `state` object) so that the
28311 // value can be referenced after the body has been fully parsed (i.e.
28312 // when validating the identifier used in function declarations and
28313 // function expressions).
28314 "(isStrict)" : "unknown",
28315
28316 "(global)" : false,
28317
28318 "(line)" : null,
28319 "(character)" : null,
28320 "(metrics)" : null,
28321 "(statement)" : null,
28322 "(context)" : null,
28323 "(scope)" : null,
28324 "(comparray)" : null,
28325 "(yielded)" : null,
28326 "(arrow)" : null,
28327 "(async)" : null,
28328 "(params)" : null
28329 };
28330
28331 if (token) {
28332 _.extend(funct, {
28333 "(line)" : token.line,
28334 "(character)": token.character,
28335 "(metrics)" : createMetrics(token)
28336 });
28337 }
28338
28339 _.extend(funct, overwrites);
28340
28341 if (funct["(context)"]) {
28342 funct["(scope)"] = funct["(context)"]["(scope)"];
28343 funct["(comparray)"] = funct["(context)"]["(comparray)"];
28344 }
28345
28346 return funct;
28347 }
28348
28349 /**
28350 * Determine if the parser has begun parsing executable code.
28351 *
28352 * @param {Token} funct - The current "functor" token
28353 *
28354 * @returns {boolean}
28355 */
28356 function hasParsedCode(funct) {
28357 return funct["(global)"] && !funct["(verb)"];
28358 }
28359
28360 /**
28361 * This function is used as both a null-denotation method *and* a
28362 * left-denotation method, meaning the first parameter is overloaded.
28363 */
28364 function doTemplateLiteral(context, leftOrRbp) {
28365 // ASSERT: this.type === "(template)"
28366 // jshint validthis: true
28367 var ctx = this.context;
28368 var noSubst = this.noSubst;
28369 var depth = this.depth;
28370 var left = typeof leftOrRbp === "number" ? null : leftOrRbp;
28371
28372 if (!noSubst) {
28373 while (!end()) {
28374 if (!state.tokens.next.template || state.tokens.next.depth > depth) {
28375 expression(context, 0); // should probably have different rbp?
28376 } else {
28377 // skip template start / middle
28378 advance();
28379 }
28380 }
28381 }
28382
28383 return {
28384 id: "(template)",
28385 type: "(template)",
28386 tag: left
28387 };
28388
28389 function end() {
28390 if (state.tokens.curr.template && state.tokens.curr.tail &&
28391 state.tokens.curr.context === ctx) {
28392 /* istanbul ignore next */
28393 return true;
28394 }
28395 var complete = (state.tokens.next.template && state.tokens.next.tail &&
28396 state.tokens.next.context === ctx);
28397 if (complete) advance();
28398 return complete || state.tokens.next.isUnclosed;
28399 }
28400 }
28401
28402 /**
28403 * Parse a function literal.
28404 *
28405 * @param {Number} context The parsing context
28406 * @param {Object} [options]
28407 * @param {string} [options.name] The identifier belonging to the function (if
28408 * any)
28409 * @param {token} [options.statement] The statement that triggered creation
28410 * of the current function.
28411 * @param {string} [options.type] If specified, either "generator" or "arrow"
28412 * @param {token} [options.loneArg] The argument to the function in cases
28413 * where it was defined using the
28414 * single-argument shorthand
28415 * @param {bool} [options.parsedOpening] Whether the opening parenthesis has
28416 * already been parsed
28417 * @param {string} [options.classExprBinding] Define a function with this
28418 * identifier in the new function's
28419 * scope, mimicking the bahavior of
28420 * class expression names within
28421 * the body of member functions.
28422 */
28423 function doFunction(context, options) {
28424 var f, token, name, statement, classExprBinding, isGenerator, isArrow,
28425 isMethod, ignoreLoopFunc;
28426 var oldOption = state.option;
28427 var oldIgnored = state.ignored;
28428 var isAsync = context & prodParams.preAsync;
28429
28430 if (options) {
28431 name = options.name;
28432 statement = options.statement;
28433 classExprBinding = options.classExprBinding;
28434 isGenerator = options.type === "generator";
28435 isArrow = options.type === "arrow";
28436 isMethod = options.isMethod;
28437 ignoreLoopFunc = options.ignoreLoopFunc;
28438 }
28439
28440 context &= ~prodParams.noin;
28441 context &= ~prodParams.tryClause;
28442
28443 if (isAsync) {
28444 context |= prodParams.async;
28445 } else {
28446 context &= ~prodParams.async;
28447 }
28448
28449 if (isGenerator) {
28450 context |= prodParams.yield;
28451 } else if (!isArrow) {
28452 context &= ~prodParams.yield;
28453 }
28454 context &= ~prodParams.preAsync;
28455
28456 state.option = Object.create(state.option);
28457 state.ignored = Object.create(state.ignored);
28458
28459 state.funct = functor(name || state.nameStack.infer(), state.tokens.next, {
28460 "(statement)": statement,
28461 "(context)": state.funct,
28462 "(arrow)": isArrow,
28463 "(method)": isMethod,
28464 "(async)": isAsync
28465 });
28466
28467 f = state.funct;
28468 token = state.tokens.curr;
28469
28470 functions.push(state.funct);
28471
28472 // So that the function is available to itself and referencing itself is not
28473 // seen as a closure, add the function name to a new scope, but do not
28474 // test for unused (unused: false)
28475 // it is a new block scope so that params can override it, it can be block scoped
28476 // but declarations inside the function don't cause already declared error
28477 state.funct["(scope)"].stack("functionouter");
28478 var internallyAccessibleName = !isMethod && (name || classExprBinding);
28479 if (internallyAccessibleName) {
28480 state.funct["(scope)"].block.add(internallyAccessibleName,
28481 classExprBinding ? "class" : "function", state.tokens.curr, false);
28482 }
28483
28484 if (!isArrow) {
28485 state.funct["(scope)"].funct.add("arguments", "var", token, false);
28486 }
28487
28488 // create the param scope (params added in functionparams)
28489 state.funct["(scope)"].stack("functionparams");
28490
28491 var paramsInfo = functionparams(context, options);
28492
28493 if (paramsInfo) {
28494 state.funct["(params)"] = paramsInfo.params;
28495 state.funct["(hasSimpleParams)"] = paramsInfo.isSimple;
28496 state.funct["(metrics)"].arity = paramsInfo.arity;
28497 state.funct["(metrics)"].verifyMaxParametersPerFunction();
28498 } else {
28499 state.funct["(params)"] = [];
28500 state.funct["(metrics)"].arity = 0;
28501 state.funct["(hasSimpleParams)"] = true;
28502 }
28503
28504 if (isArrow) {
28505 context &= ~prodParams.yield;
28506
28507 if (!state.inES6(true)) {
28508 warning("W119", state.tokens.curr, "arrow function syntax (=>)", "6");
28509 }
28510
28511 if (!options.loneArg) {
28512 advance("=>");
28513 }
28514 }
28515
28516 block(context, false, true, true, isArrow);
28517
28518 if (!state.option.noyield && isGenerator && !state.funct["(yielded)"]) {
28519 warning("W124", state.tokens.curr);
28520 }
28521
28522 state.funct["(metrics)"].verifyMaxStatementsPerFunction();
28523 state.funct["(metrics)"].verifyMaxComplexityPerFunction();
28524 state.funct["(unusedOption)"] = state.option.unused;
28525 state.option = oldOption;
28526 state.ignored = oldIgnored;
28527 state.funct["(last)"] = state.tokens.curr.line;
28528 state.funct["(lastcharacter)"] = state.tokens.curr.character;
28529
28530 // unstack the params scope
28531 state.funct["(scope)"].unstack(); // also does usage and label checks
28532
28533 // unstack the function outer stack
28534 state.funct["(scope)"].unstack();
28535
28536 state.funct = state.funct["(context)"];
28537
28538 if (!ignoreLoopFunc && !state.option.loopfunc && state.funct["(loopage)"]) {
28539 // If the function we just parsed accesses any non-local variables
28540 // trigger a warning. Otherwise, the function is safe even within
28541 // a loop.
28542 if (f["(outerMutables)"]) {
28543 warning("W083", token, f["(outerMutables)"].join(", "));
28544 }
28545 }
28546
28547 return f;
28548 }
28549
28550 function createMetrics(functionStartToken) {
28551 return {
28552 statementCount: 0,
28553 nestedBlockDepth: -1,
28554 ComplexityCount: 1,
28555 arity: 0,
28556
28557 verifyMaxStatementsPerFunction: function() {
28558 if (state.option.maxstatements &&
28559 this.statementCount > state.option.maxstatements) {
28560 warning("W071", functionStartToken, this.statementCount);
28561 }
28562 },
28563
28564 verifyMaxParametersPerFunction: function() {
28565 if (_.isNumber(state.option.maxparams) &&
28566 this.arity > state.option.maxparams) {
28567 warning("W072", functionStartToken, this.arity);
28568 }
28569 },
28570
28571 verifyMaxNestedBlockDepthPerFunction: function() {
28572 if (state.option.maxdepth &&
28573 this.nestedBlockDepth > 0 &&
28574 this.nestedBlockDepth === state.option.maxdepth + 1) {
28575 warning("W073", null, this.nestedBlockDepth);
28576 }
28577 },
28578
28579 verifyMaxComplexityPerFunction: function() {
28580 var max = state.option.maxcomplexity;
28581 var cc = this.ComplexityCount;
28582 if (max && cc > max) {
28583 warning("W074", functionStartToken, cc);
28584 }
28585 }
28586 };
28587 }
28588
28589 function increaseComplexityCount() {
28590 state.funct["(metrics)"].ComplexityCount += 1;
28591 }
28592
28593 // Parse assignments that were found instead of conditionals.
28594 // For example: if (a = 1) { ... }
28595
28596 function checkCondAssignment(token) {
28597 if (!token || token.paren) {
28598 return;
28599 }
28600
28601 if (token.id === ",") {
28602 checkCondAssignment(token.right);
28603 return;
28604 }
28605
28606 switch (token.id) {
28607 case "=":
28608 case "+=":
28609 case "-=":
28610 case "*=":
28611 case "%=":
28612 case "&=":
28613 case "|=":
28614 case "^=":
28615 case "/=":
28616 if (!state.option.boss) {
28617 warning("W084", token);
28618 }
28619 }
28620 }
28621
28622 /**
28623 * Validate the properties defined within an object literal or class body.
28624 * See the `saveAccessor` and `saveProperty` functions for more detail.
28625 *
28626 * @param {object} props - Collection of objects describing the properties
28627 * encountered
28628 */
28629 function checkProperties(props) {
28630 // Check for lonely setters if in the ES5 mode.
28631 if (state.inES5()) {
28632 for (var name in props) {
28633 if (props[name] && props[name].setterToken && !props[name].getterToken &&
28634 !props[name].static) {
28635 warning("W078", props[name].setterToken);
28636 }
28637 }
28638 }
28639 }
28640
28641 function metaProperty(context, name, c) {
28642 if (checkPunctuator(state.tokens.next, ".")) {
28643 var left = state.tokens.curr.id;
28644 advance(".");
28645 var id = identifier(context);
28646 state.tokens.curr.isMetaProperty = true;
28647 if (name !== id) {
28648 error("E057", state.tokens.prev, left, id);
28649 } else {
28650 c();
28651 }
28652 return state.tokens.curr;
28653 }
28654 }
28655
28656 //object literals
28657 (function(x) {
28658 x.nud = function(context) {
28659 var b, f, i, params, t, isGeneratorMethod = false, nextVal;
28660 var props = Object.create(null); // All properties, including accessors
28661 var isAsyncMethod = false;
28662
28663 b = !sameLine(state.tokens.curr, state.tokens.next);
28664 if (b) {
28665 indent += state.option.indent;
28666 if (state.tokens.next.from === indent + state.option.indent) {
28667 /* istanbul ignore next */
28668 indent += state.option.indent;
28669 }
28670 }
28671
28672 var blocktype = lookupBlockType();
28673 if (blocktype.isDestAssign) {
28674 this.destructAssign = destructuringPattern(context, {
28675 openingParsed: true,
28676 assignment: true
28677 });
28678 return this;
28679 }
28680 state.inObjectBody = true;
28681 for (;;) {
28682 if (state.tokens.next.id === "}") {
28683 break;
28684 }
28685
28686 nextVal = state.tokens.next.value;
28687 if (state.tokens.next.identifier &&
28688 (peekIgnoreEOL().id === "," || peekIgnoreEOL().id === "}")) {
28689 if (!state.inES6()) {
28690 warning("W104", state.tokens.next, "object short notation", "6");
28691 }
28692 i = propertyName(context, true);
28693 saveProperty(props, i, state.tokens.next);
28694
28695 expression(context, 10);
28696
28697 } else if (peek().id !== ":" && (nextVal === "get" || nextVal === "set")) {
28698 advance(nextVal);
28699
28700 if (!state.inES5()) {
28701 error("E034");
28702 }
28703
28704 if (state.tokens.next.id === "[") {
28705 i = computedPropertyName(context);
28706 } else {
28707 i = propertyName(context);
28708
28709 // ES6 allows for get() {...} and set() {...} method
28710 // definition shorthand syntax, so we don't produce an error
28711 // if linting ECMAScript 6 code.
28712 if (!i && !state.inES6()) {
28713 error("E035");
28714 }
28715 }
28716
28717 // We don't want to save this getter unless it's an actual getter
28718 // and not an ES6 concise method
28719 if (i) {
28720 saveAccessor(nextVal, props, i, state.tokens.curr);
28721 }
28722
28723 t = state.tokens.next;
28724 f = doFunction(context, { isMethod: true });
28725 params = f["(params)"];
28726
28727 // Don't warn about getter/setter pairs if this is an ES6 concise method
28728 if (nextVal === "get" && i && params.length) {
28729 warning("W076", t, params[0], i);
28730 } else if (nextVal === "set" && i && f["(metrics)"].arity !== 1) {
28731 warning("W077", t, i);
28732 }
28733
28734 } else if (spreadrest("spread")) {
28735 if (!state.inES9()) {
28736 warning("W119", state.tokens.next, "object spread property", "9");
28737 }
28738
28739 expression(context, 10);
28740 } else {
28741 if (state.tokens.next.id === "async" && !checkPunctuators(peek(), ["(", ":"])) {
28742 if (!state.inES8()) {
28743 warning("W119", state.tokens.next, "async functions", "8");
28744 }
28745
28746 isAsyncMethod = true;
28747 advance();
28748
28749 nolinebreak(state.tokens.curr);
28750 } else {
28751 isAsyncMethod = false;
28752 }
28753
28754 if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") {
28755 if (isAsyncMethod && !state.inES9()) {
28756 warning("W119", state.tokens.next, "async generators", "9");
28757 } else if (!state.inES6()) {
28758 warning("W104", state.tokens.next, "generator functions", "6");
28759 }
28760
28761 advance("*");
28762 isGeneratorMethod = true;
28763 } else {
28764 isGeneratorMethod = false;
28765 }
28766
28767 if (state.tokens.next.id === "[") {
28768 i = computedPropertyName(context);
28769 state.nameStack.set(i);
28770 } else {
28771 state.nameStack.set(state.tokens.next);
28772 i = propertyName(context);
28773 saveProperty(props, i, state.tokens.next);
28774
28775 if (typeof i !== "string") {
28776 break;
28777 }
28778 }
28779
28780 if (state.tokens.next.value === "(") {
28781 if (!state.inES6()) {
28782 warning("W104", state.tokens.curr, "concise methods", "6");
28783 }
28784
28785 doFunction(isAsyncMethod ? context | prodParams.preAsync : context, {
28786 isMethod: true,
28787 type: isGeneratorMethod ? "generator" : null
28788 });
28789 } else {
28790 advance(":");
28791 expression(context, 10);
28792 }
28793 }
28794
28795 countMember(i);
28796
28797 if (state.tokens.next.id === ",") {
28798 advance(",");
28799 checkComma({ allowTrailing: true, property: true });
28800 if (state.tokens.next.id === ",") {
28801 /* istanbul ignore next */
28802 warning("W070", state.tokens.curr);
28803 } else if (state.tokens.next.id === "}" && !state.inES5()) {
28804 warning("W070", state.tokens.curr);
28805 }
28806 } else {
28807 if (state.option.trailingcomma && state.inES5()) {
28808 warningAt("W140", state.tokens.curr.line, state.tokens.curr.character);
28809 }
28810 break;
28811 }
28812 }
28813 if (b) {
28814 indent -= state.option.indent;
28815 }
28816 advance("}", this);
28817
28818 checkProperties(props);
28819 state.inObjectBody = false;
28820
28821 return this;
28822 };
28823 x.fud = function() {
28824 /* istanbul ignore next */
28825 error("E036", state.tokens.curr);
28826 };
28827 }(delim("{")));
28828
28829 function destructuringPattern(context, options) {
28830 var isAssignment = options && options.assignment;
28831
28832 context &= ~prodParams.noin;
28833
28834 if (!state.inES6()) {
28835 warning("W104", state.tokens.curr,
28836 isAssignment ? "destructuring assignment" : "destructuring binding", "6");
28837 }
28838
28839 return destructuringPatternRecursive(context, options);
28840 }
28841
28842 function destructuringPatternRecursive(context, options) {
28843 var ids, idx;
28844 var identifiers = [];
28845 var openingParsed = options && options.openingParsed;
28846 var isAssignment = options && options.assignment;
28847 var recursiveOptions = isAssignment ? { assignment: isAssignment } : null;
28848 var firstToken = openingParsed ? state.tokens.curr : state.tokens.next;
28849
28850 var nextInnerDE = function() {
28851 var ident;
28852 if (checkPunctuators(state.tokens.next, ["[", "{"])) {
28853 ids = destructuringPatternRecursive(context, recursiveOptions);
28854 for (idx = 0; idx < ids.length; idx++) {
28855 identifiers.push({ id: ids[idx].id, token: ids[idx].token });
28856 }
28857 } else if (checkPunctuator(state.tokens.next, ",")) {
28858 identifiers.push({ id: null, token: state.tokens.curr });
28859 } else if (checkPunctuator(state.tokens.next, "(")) {
28860 advance("(");
28861 nextInnerDE();
28862 advance(")");
28863 } else {
28864 if (isAssignment) {
28865 var assignTarget = expression(context, 20);
28866 if (assignTarget) {
28867 checkLeftSideAssign(context, assignTarget);
28868
28869 // if the target was a simple identifier, add it to the list to return
28870 if (assignTarget.identifier) {
28871 ident = assignTarget.value;
28872 }
28873 }
28874 } else {
28875 ident = identifier(context);
28876 }
28877 if (ident) {
28878 identifiers.push({ id: ident, token: state.tokens.curr });
28879 }
28880 }
28881 };
28882
28883 var assignmentProperty = function(context) {
28884 var id, expr;
28885
28886 if (checkPunctuator(state.tokens.next, "[")) {
28887 advance("[");
28888 expression(context, 10);
28889 advance("]");
28890 advance(":");
28891 nextInnerDE();
28892 } else if (state.tokens.next.id === "(string)" ||
28893 state.tokens.next.id === "(number)") {
28894 advance();
28895 advance(":");
28896 nextInnerDE();
28897 } else {
28898 // this id will either be the property name or the property name and the assigning identifier
28899 var isRest = spreadrest("rest");
28900
28901 if (isRest) {
28902 if (!state.inES9()) {
28903 warning("W119", state.tokens.next, "object rest property", "9");
28904 }
28905
28906 // Due to visual symmetry with the array rest property (and the early
28907 // design of the language feature), developers may mistakenly assume
28908 // any expression is valid in this position. If the next token is not
28909 // an identifier, attempt to parse an expression and issue an error.
28910 // order to recover more gracefully from this condition.
28911 if (state.tokens.next.type === "(identifier)") {
28912 id = identifier(context);
28913 } else {
28914 expr = expression(context, 10);
28915 error("E030", expr, expr.value);
28916 }
28917 } else {
28918 id = identifier(context);
28919 }
28920
28921 if (!isRest && checkPunctuator(state.tokens.next, ":")) {
28922 advance(":");
28923 nextInnerDE();
28924 } else if (id) {
28925 // in this case we are assigning (not declaring), so check assignment
28926 if (isAssignment) {
28927 checkLeftSideAssign(context, state.tokens.curr);
28928 }
28929 identifiers.push({ id: id, token: state.tokens.curr });
28930 }
28931
28932 if (isRest && checkPunctuator(state.tokens.next, ",")) {
28933 warning("W130", state.tokens.next);
28934 }
28935 }
28936 };
28937
28938 var id, value;
28939 if (checkPunctuator(firstToken, "[")) {
28940 if (!openingParsed) {
28941 advance("[");
28942 }
28943 if (checkPunctuator(state.tokens.next, "]")) {
28944 warning("W137", state.tokens.curr);
28945 }
28946 var element_after_rest = false;
28947 while (!checkPunctuator(state.tokens.next, "]")) {
28948 var isRest = spreadrest("rest");
28949
28950 nextInnerDE();
28951
28952 if (isRest && !element_after_rest &&
28953 checkPunctuator(state.tokens.next, ",")) {
28954 warning("W130", state.tokens.next);
28955 element_after_rest = true;
28956 }
28957 if (!isRest && checkPunctuator(state.tokens.next, "=")) {
28958 if (checkPunctuator(state.tokens.prev, "...")) {
28959 /* istanbul ignore next */
28960 advance("]");
28961 } else {
28962 advance("=");
28963 }
28964 id = state.tokens.prev;
28965 value = expression(context, 10);
28966 if (value && value.identifier && value.value === "undefined") {
28967 warning("W080", id, id.value);
28968 }
28969 }
28970 if (!checkPunctuator(state.tokens.next, "]")) {
28971 advance(",");
28972 }
28973 }
28974 advance("]");
28975 } else if (checkPunctuator(firstToken, "{")) {
28976
28977 if (!openingParsed) {
28978 advance("{");
28979 }
28980 if (checkPunctuator(state.tokens.next, "}")) {
28981 warning("W137", state.tokens.curr);
28982 }
28983 while (!checkPunctuator(state.tokens.next, "}")) {
28984 assignmentProperty(context);
28985 if (checkPunctuator(state.tokens.next, "=")) {
28986 advance("=");
28987 id = state.tokens.prev;
28988 value = expression(context, 10);
28989 if (value && value.identifier && value.value === "undefined") {
28990 warning("W080", id, id.value);
28991 }
28992 }
28993 if (!checkPunctuator(state.tokens.next, "}")) {
28994 advance(",");
28995 if (checkPunctuator(state.tokens.next, "}")) {
28996 // Trailing comma
28997 // ObjectBindingPattern: { BindingPropertyList , }
28998 break;
28999 }
29000 }
29001 }
29002 advance("}");
29003 }
29004 return identifiers;
29005 }
29006
29007 function destructuringPatternMatch(tokens, value) {
29008 var first = value.first;
29009
29010 if (!first)
29011 return;
29012
29013 _.zip(tokens, Array.isArray(first) ? first : [ first ]).forEach(function(val) {
29014 var token = val[0];
29015 var value = val[1];
29016
29017 if (token && value)
29018 token.first = value;
29019 else if (token && token.first && !value)
29020 /* istanbul ignore next */
29021 warning("W080", token.first, token.first.value);
29022 });
29023 }
29024
29025 function blockVariableStatement(type, statement, context) {
29026 // used for both let and const statements
29027
29028 var noin = context & prodParams.noin;
29029 var inexport = context & prodParams.export;
29030 var isLet = type === "let";
29031 var isConst = type === "const";
29032 var tokens, lone, value, letblock;
29033
29034 if (!state.inES6()) {
29035 warning("W104", state.tokens.curr, type, "6");
29036 }
29037
29038 if (isLet && isMozillaLet()) {
29039 advance("(");
29040 state.funct["(scope)"].stack();
29041 letblock = true;
29042 statement.declaration = false;
29043 }
29044
29045 statement.first = [];
29046 for (;;) {
29047 var names = [];
29048 if (_.includes(["{", "["], state.tokens.next.value)) {
29049 tokens = destructuringPattern(context);
29050 lone = false;
29051 } else {
29052 tokens = [ { id: identifier(context), token: state.tokens.curr } ];
29053 lone = true;
29054 }
29055
29056 // A `const` declaration without an initializer is permissible within the
29057 // head of for-in and for-of statements. If this binding list is being
29058 // parsed as part of a `for` statement of any kind, allow the initializer
29059 // to be omitted. Although this may erroneously allow such forms from
29060 // "C-style" `for` statements (i.e. `for (const x;;) {}`, the `for`
29061 // statement logic includes dedicated logic to issue the error for such
29062 // cases.
29063 if (!noin && isConst && state.tokens.next.id !== "=") {
29064 warning("E012", state.tokens.curr, state.tokens.curr.value);
29065 }
29066
29067 for (var t in tokens) {
29068 if (tokens.hasOwnProperty(t)) {
29069 t = tokens[t];
29070
29071 // It is a Syntax Error if the BoundNames of BindingList contains
29072 // "let".
29073 if (t.id === "let") {
29074 /* istanbul ignore next */
29075 warning("W024", t.token, t.id);
29076 }
29077
29078 if (state.funct["(scope)"].block.isGlobal()) {
29079 if (predefined[t.id] === false) {
29080 warning("W079", t.token, t.id);
29081 }
29082 }
29083 if (t.id) {
29084 state.funct["(scope)"].addbinding(t.id, {
29085 type: type,
29086 token: t.token });
29087 names.push(t.token);
29088 }
29089 }
29090 }
29091
29092 if (state.tokens.next.id === "=") {
29093 statement.hasInitializer = true;
29094
29095 advance("=");
29096 if (!noin && peek(0).id === "=" && state.tokens.next.identifier) {
29097 warning("W120", state.tokens.next, state.tokens.next.value);
29098 }
29099 var id = state.tokens.prev;
29100 value = expression(context, 10);
29101 if (value) {
29102 if (value.identifier && value.value === "undefined") {
29103 warning("W080", id, id.value);
29104 }
29105 if (!lone) {
29106 destructuringPatternMatch(names, value);
29107 }
29108 }
29109 }
29110
29111 // Bindings are not immediately initialized in for-in and for-of
29112 // statements. As with `const` initializers (described above), the `for`
29113 // statement parsing logic includes
29114 if (state.tokens.next.value !== "in" && state.tokens.next.value !== "of") {
29115 for (t in tokens) {
29116 if (tokens.hasOwnProperty(t)) {
29117 t = tokens[t];
29118 state.funct["(scope)"].initialize(t.id);
29119
29120 if (lone && inexport) {
29121 state.funct["(scope)"].setExported(t.token.value, t.token);
29122 }
29123 }
29124 }
29125 }
29126
29127 statement.first = statement.first.concat(names);
29128
29129 if (state.tokens.next.id !== ",") {
29130 break;
29131 }
29132
29133 statement.hasComma = true;
29134 advance(",");
29135 checkComma();
29136 }
29137 if (letblock) {
29138 advance(")");
29139 block(context, true, true);
29140 statement.block = true;
29141 state.funct["(scope)"].unstack();
29142 }
29143
29144 return statement;
29145 }
29146
29147 var conststatement = stmt("const", function(context) {
29148 return blockVariableStatement("const", this, context);
29149 });
29150 conststatement.exps = true;
29151 conststatement.declaration = true;
29152
29153
29154 /**
29155 * Determine if the current `let` token designates the beginning of a "let
29156 * block" or "let expression" as implemented in the Mozilla SpiderMonkey
29157 * engine.
29158 *
29159 * This function will only return `true` if Mozilla extensions have been
29160 * enabled. It would be preferable to detect the language feature regardless
29161 * of the parser's state because this would allow JSHint to instruct users to
29162 * enable the `moz` option where necessary. This is not possible because the
29163 * language extension is not compatible with standard JavaScript. For
29164 * example, the following program code may describe a "let block" or a
29165 * function invocation:
29166 *
29167 * let(x)
29168 * {
29169 * typeof x;
29170 * }
29171 *
29172 * @returns {boolean}
29173 */
29174 function isMozillaLet() {
29175 return state.tokens.next.id === "(" && state.inMoz();
29176 }
29177 var letstatement = stmt("let", function(context) {
29178 return blockVariableStatement("let", this, context);
29179 });
29180 letstatement.nud = function(context, rbp) {
29181 if (isMozillaLet()) {
29182 // create a new block scope we use only for the current expression
29183 state.funct["(scope)"].stack();
29184 advance("(");
29185 state.tokens.prev.fud(context);
29186 advance(")");
29187 expression(context, rbp);
29188 state.funct["(scope)"].unstack();
29189 } else {
29190 this.exps = false;
29191 return state.syntax["(identifier)"].nud.apply(this, arguments);
29192 }
29193 };
29194 letstatement.meta = { es5: true, isFutureReservedWord: false, strictOnly: true };
29195 letstatement.exps = true;
29196 letstatement.declaration = true;
29197 letstatement.useFud = function(context) {
29198 var next = state.tokens.next;
29199 var nextIsBindingName;
29200
29201 if (this.line !== next.line && !state.inES6()) {
29202 return false;
29203 }
29204
29205 // JSHint generally interprets `let` as a reserved word even though it is
29206 // not considered as such by the ECMAScript specification because doing so
29207 // simplifies parsing logic. It is special-cased here so that code such as
29208 //
29209 // let
29210 // let
29211 //
29212 // is correctly interpreted as an invalid LexicalBinding. (Without this
29213 // consideration, the code above would be parsed as two
29214 // IdentifierReferences.)
29215 nextIsBindingName = next.identifier && (!isReserved(context, next) ||
29216 next.id === "let");
29217
29218 return nextIsBindingName || checkPunctuators(next, ["{", "["]) ||
29219 isMozillaLet();
29220 };
29221
29222 var varstatement = stmt("var", function(context) {
29223 var noin = context & prodParams.noin;
29224 var inexport = context & prodParams.export;
29225 var tokens, lone, value, id;
29226
29227 this.first = [];
29228 for (;;) {
29229 var names = [];
29230 if (_.includes(["{", "["], state.tokens.next.value)) {
29231 tokens = destructuringPattern(context);
29232 lone = false;
29233 } else {
29234 tokens = [];
29235 id = identifier(context);
29236
29237 if (id) {
29238 tokens.push({ id: id, token: state.tokens.curr });
29239 }
29240
29241 lone = true;
29242 }
29243
29244 if (state.option.varstmt) {
29245 warning("W132", this);
29246 }
29247
29248
29249 for (var t in tokens) {
29250 if (tokens.hasOwnProperty(t)) {
29251 t = tokens[t];
29252 if (state.funct["(global)"] && !state.impliedClosure()) {
29253 if (predefined[t.id] === false) {
29254 warning("W079", t.token, t.id);
29255 } else if (state.option.futurehostile === false) {
29256 if ((!state.inES5() && vars.ecmaIdentifiers[5][t.id] === false) ||
29257 (!state.inES6() && vars.ecmaIdentifiers[6][t.id] === false)) {
29258 warning("W129", t.token, t.id);
29259 }
29260 }
29261 }
29262 if (t.id) {
29263 state.funct["(scope)"].addbinding(t.id, {
29264 type: "var",
29265 token: t.token });
29266
29267 if (lone && inexport) {
29268 state.funct["(scope)"].setExported(t.id, t.token);
29269 }
29270 names.push(t.token);
29271 }
29272 }
29273 }
29274
29275 if (state.tokens.next.id === "=") {
29276 this.hasInitializer = true;
29277
29278 state.nameStack.set(state.tokens.curr);
29279
29280 advance("=");
29281 if (peek(0).id === "=" && state.tokens.next.identifier) {
29282 if (!noin &&
29283 !state.funct["(params)"] ||
29284 state.funct["(params)"].indexOf(state.tokens.next.value) === -1) {
29285 warning("W120", state.tokens.next, state.tokens.next.value);
29286 }
29287 }
29288 id = state.tokens.prev;
29289 value = expression(context, 10);
29290 if (value) {
29291 if (!state.funct["(loopage)"] && value.identifier &&
29292 value.value === "undefined") {
29293 warning("W080", id, id.value);
29294 }
29295 if (!lone) {
29296 destructuringPatternMatch(names, value);
29297 }
29298 }
29299 }
29300
29301 this.first = this.first.concat(names);
29302
29303 if (state.tokens.next.id !== ",") {
29304 break;
29305 }
29306 this.hasComma = true;
29307 advance(",");
29308 checkComma();
29309 }
29310
29311 return this;
29312 });
29313 varstatement.exps = true;
29314
29315 blockstmt("function", function(context) {
29316 var inexport = context & prodParams.export;
29317 var generator = false;
29318 var isAsync = context & prodParams.preAsync;
29319 var labelType = "";
29320
29321 if (isAsync) {
29322 labelType = "async ";
29323 }
29324
29325 if (state.tokens.next.value === "*") {
29326 if (isAsync && !state.inES9()) {
29327 warning("W119", state.tokens.prev, "async generators", "9");
29328 } else if (!isAsync && !state.inES6(true)) {
29329 warning("W119", state.tokens.next, "function*", "6");
29330 }
29331
29332 advance("*");
29333 labelType += "generator ";
29334 generator = true;
29335 }
29336
29337 labelType += "function";
29338
29339 if (inblock) {
29340 warning("W082", state.tokens.curr);
29341 }
29342 var nameToken = optionalidentifier(context) ? state.tokens.curr : null;
29343
29344 if (!nameToken) {
29345 if (!inexport) {
29346 warning("W025");
29347 }
29348 } else {
29349 state.funct["(scope)"].addbinding(nameToken.value, {
29350 type: labelType,
29351 token: state.tokens.curr,
29352 initialized: true });
29353
29354 if (inexport) {
29355 state.funct["(scope)"].setExported(nameToken.value, state.tokens.prev);
29356 }
29357 }
29358
29359 var f = doFunction(context, {
29360 name: nameToken && nameToken.value,
29361 statement: this,
29362 type: generator ? "generator" : null,
29363 ignoreLoopFunc: inblock // a declaration may already have warned
29364 });
29365
29366 // If the function declaration is strict because the surrounding code is
29367 // strict, the invalid name will trigger E008 when the scope manager
29368 // attempts to create a binding in the strict environment record. An error
29369 // should only be signaled here when the function itself enables strict
29370 // mode (the scope manager will not report an error because a declaration
29371 // does not introduce a binding into the function's environment record).
29372 var enablesStrictMode = f["(isStrict)"] && !state.isStrict();
29373 if (nameToken && (f["(name)"] === "arguments" || f["(name)"] === "eval") &&
29374 enablesStrictMode) {
29375 error("E008", nameToken);
29376 }
29377
29378 if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) {
29379 /* istanbul ignore next */
29380 error("E039");
29381 }
29382 return this;
29383 }).declaration = true;
29384
29385 prefix("function", function(context) {
29386 var generator = false;
29387 var isAsync = context & prodParams.preAsync;
29388
29389 if (state.tokens.next.value === "*") {
29390 if (isAsync && !state.inES9()) {
29391 warning("W119", state.tokens.prev, "async generators", "9");
29392 } else if (!isAsync && !state.inES6(true)) {
29393 warning("W119", state.tokens.curr, "function*", "6");
29394 }
29395
29396 advance("*");
29397 generator = true;
29398 }
29399
29400 // This context modification restricts the use of `await` as the optional
29401 // BindingIdentifier in async function expressions.
29402 var nameToken = optionalidentifier(isAsync ? context | prodParams.async : context) ?
29403 state.tokens.curr : null;
29404
29405 var f = doFunction(context, {
29406 name: nameToken && nameToken.value,
29407 type: generator ? "generator" : null
29408 });
29409
29410 if (generator && nameToken && nameToken.value === "yield") {
29411 error("E024", nameToken, "yield");
29412 }
29413
29414 if (nameToken && (f["(name)"] === "arguments" || f["(name)"] === "eval") &&
29415 f["(isStrict)"]) {
29416 error("E008", nameToken);
29417 }
29418
29419 return this;
29420 });
29421
29422 blockstmt("if", function(context) {
29423 var t = state.tokens.next;
29424 increaseComplexityCount();
29425 advance("(");
29426 var expr = expression(context, 0);
29427
29428 if (!expr) {
29429 quit("E041", this);
29430 }
29431
29432 checkCondAssignment(expr);
29433
29434 // When the if is within a for-in loop, check if the condition
29435 // starts with a negation operator
29436 var forinifcheck = null;
29437 if (state.option.forin && state.forinifcheckneeded) {
29438 state.forinifcheckneeded = false; // We only need to analyze the first if inside the loop
29439 forinifcheck = state.forinifchecks[state.forinifchecks.length - 1];
29440 if (expr.type === "(punctuator)" && expr.value === "!") {
29441 forinifcheck.type = "(negative)";
29442 } else {
29443 forinifcheck.type = "(positive)";
29444 }
29445 }
29446
29447 advance(")", t);
29448 var s = block(context, true, true);
29449
29450 // When the if is within a for-in loop and the condition has a negative form,
29451 // check if the body contains nothing but a continue statement
29452 if (forinifcheck && forinifcheck.type === "(negative)") {
29453 if (s && s[0] && s[0].type === "(identifier)" && s[0].value === "continue") {
29454 forinifcheck.type = "(negative-with-continue)";
29455 }
29456 }
29457
29458 if (state.tokens.next.id === "else") {
29459 advance("else");
29460 if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") {
29461 statement(context);
29462 } else {
29463 block(context, true, true);
29464 }
29465 }
29466 return this;
29467 });
29468
29469 blockstmt("try", function(context) {
29470 var b;
29471 var hasParameter = false;
29472
29473 function catchParameter() {
29474 advance("(");
29475
29476 if (checkPunctuators(state.tokens.next, ["[", "{"])) {
29477 var tokens = destructuringPattern(context);
29478 _.each(tokens, function(token) {
29479 if (token.id) {
29480 state.funct["(scope)"].addParam(token.id, token, "exception");
29481 }
29482 });
29483 } else if (state.tokens.next.type !== "(identifier)") {
29484 warning("E030", state.tokens.next, state.tokens.next.value);
29485 } else {
29486 // only advance if an identifier is present. This allows JSHint to
29487 // recover from the case where no value is specified.
29488 state.funct["(scope)"].addParam(identifier(context), state.tokens.curr, "exception");
29489 }
29490
29491 if (state.tokens.next.value === "if") {
29492 if (!state.inMoz()) {
29493 warning("W118", state.tokens.curr, "catch filter");
29494 }
29495 advance("if");
29496 expression(context, 0);
29497 }
29498
29499 advance(")");
29500 }
29501
29502 block(context | prodParams.tryClause, true);
29503
29504 while (state.tokens.next.id === "catch") {
29505 increaseComplexityCount();
29506 if (b && (!state.inMoz())) {
29507 warning("W118", state.tokens.next, "multiple catch blocks");
29508 }
29509 advance("catch");
29510 if (state.tokens.next.id !== "{") {
29511 state.funct["(scope)"].stack("catchparams");
29512 hasParameter = true;
29513 catchParameter();
29514 } else if (!state.inES10()) {
29515 warning("W119", state.tokens.curr, "optional catch binding", "10");
29516 }
29517 block(context, false);
29518
29519 if (hasParameter) {
29520 state.funct["(scope)"].unstack();
29521 hasParameter = false;
29522 }
29523 b = true;
29524 }
29525
29526 if (state.tokens.next.id === "finally") {
29527 advance("finally");
29528 block(context, true);
29529 return;
29530 }
29531
29532 if (!b) {
29533 error("E021", state.tokens.next, "catch", state.tokens.next.value);
29534 }
29535
29536 return this;
29537 });
29538
29539 blockstmt("while", function(context) {
29540 var t = state.tokens.next;
29541 state.funct["(breakage)"] += 1;
29542 state.funct["(loopage)"] += 1;
29543 increaseComplexityCount();
29544 advance("(");
29545 checkCondAssignment(expression(context, 0));
29546 advance(")", t);
29547 block(context, true, true);
29548 state.funct["(breakage)"] -= 1;
29549 state.funct["(loopage)"] -= 1;
29550 return this;
29551 }).labelled = true;
29552
29553 blockstmt("with", function(context) {
29554 var t = state.tokens.next;
29555 if (state.isStrict()) {
29556 error("E010", state.tokens.curr);
29557 } else if (!state.option.withstmt) {
29558 warning("W085", state.tokens.curr);
29559 }
29560
29561 advance("(");
29562 expression(context, 0);
29563 advance(")", t);
29564 block(context, true, true);
29565
29566 return this;
29567 });
29568
29569 blockstmt("switch", function(context) {
29570 var t = state.tokens.next;
29571 var g = false;
29572 var noindent = false;
29573 var seenCase = false;
29574
29575 state.funct["(breakage)"] += 1;
29576 advance("(");
29577 checkCondAssignment(expression(context, 0));
29578 advance(")", t);
29579 t = state.tokens.next;
29580 advance("{");
29581 state.funct["(scope)"].stack();
29582
29583 if (state.tokens.next.from === indent)
29584 noindent = true;
29585
29586 if (!noindent)
29587 indent += state.option.indent;
29588
29589 for (;;) {
29590 switch (state.tokens.next.id) {
29591 case "case":
29592 switch (state.funct["(verb)"]) {
29593 case "yield":
29594 case "break":
29595 case "case":
29596 case "continue":
29597 case "return":
29598 case "switch":
29599 case "throw":
29600 break;
29601 case "default":
29602 if (state.option.leanswitch) {
29603 warning("W145", state.tokens.next);
29604 }
29605
29606 break;
29607 default:
29608 // You can tell JSHint that you don't use break intentionally by
29609 // adding a comment /* falls through */ on a line just before
29610 // the next `case`.
29611 if (!state.tokens.curr.caseFallsThrough) {
29612 warning("W086", state.tokens.curr, "case");
29613 }
29614 }
29615
29616 advance("case");
29617 expression(context, 0);
29618 seenCase = true;
29619 increaseComplexityCount();
29620 g = true;
29621 advance(":");
29622 state.funct["(verb)"] = "case";
29623 break;
29624 case "default":
29625 switch (state.funct["(verb)"]) {
29626 case "yield":
29627 case "break":
29628 case "continue":
29629 case "return":
29630 case "throw":
29631 break;
29632 case "case":
29633 if (state.option.leanswitch) {
29634 warning("W145", state.tokens.curr);
29635 }
29636
29637 break;
29638 default:
29639 // Do not display a warning if 'default' is the first statement or if
29640 // there is a special /* falls through */ comment.
29641 if (seenCase && !state.tokens.curr.caseFallsThrough) {
29642 warning("W086", state.tokens.curr, "default");
29643 }
29644 }
29645
29646 advance("default");
29647 g = true;
29648 advance(":");
29649 state.funct["(verb)"] = "default";
29650 break;
29651 case "}":
29652 if (!noindent)
29653 indent -= state.option.indent;
29654
29655 advance("}", t);
29656 state.funct["(scope)"].unstack();
29657 state.funct["(breakage)"] -= 1;
29658 state.funct["(verb)"] = undefined;
29659 return;
29660 /* istanbul ignore next */
29661 case "(end)":
29662 error("E023", state.tokens.next, "}");
29663 return;
29664 default:
29665 indent += state.option.indent;
29666 if (g) {
29667 switch (state.tokens.curr.id) {
29668 /* istanbul ignore next */
29669 case ",":
29670 error("E040");
29671 return;
29672 case ":":
29673 g = false;
29674 statements(context);
29675 break;
29676 /* istanbul ignore next */
29677 default:
29678 error("E025", state.tokens.curr);
29679 return;
29680 }
29681 } else {
29682 /* istanbul ignore else */
29683 if (state.tokens.curr.id === ":") {
29684 advance(":");
29685 error("E024", state.tokens.curr, ":");
29686 statements(context);
29687 } else {
29688 error("E021", state.tokens.next, "case", state.tokens.next.value);
29689 return;
29690 }
29691 }
29692 indent -= state.option.indent;
29693 }
29694 }
29695 }).labelled = true;
29696
29697 stmt("debugger", function() {
29698 if (!state.option.debug) {
29699 warning("W087", this);
29700 }
29701 return this;
29702 }).exps = true;
29703
29704 (function() {
29705 var x = stmt("do", function(context) {
29706 state.funct["(breakage)"] += 1;
29707 state.funct["(loopage)"] += 1;
29708 increaseComplexityCount();
29709
29710 this.first = block(context, true, true);
29711 advance("while");
29712 var t = state.tokens.next;
29713 advance("(");
29714 checkCondAssignment(expression(context, 0));
29715 advance(")", t);
29716 state.funct["(breakage)"] -= 1;
29717 state.funct["(loopage)"] -= 1;
29718 return this;
29719 });
29720 x.labelled = true;
29721 x.exps = true;
29722 }());
29723
29724 blockstmt("for", function(context) {
29725 var s, t = state.tokens.next;
29726 var letscope = false;
29727 var isAsync = false;
29728 var foreachtok = null;
29729
29730 if (t.value === "each") {
29731 foreachtok = t;
29732 advance("each");
29733 if (!state.inMoz()) {
29734 warning("W118", state.tokens.curr, "for each");
29735 }
29736 }
29737
29738 if (state.tokens.next.identifier && state.tokens.next.value === "await") {
29739 advance("await");
29740 isAsync = true;
29741
29742 if (!(context & prodParams.async)) {
29743 error("E024", state.tokens.curr, "await");
29744 } else if (!state.inES9()) {
29745 warning("W119", state.tokens.curr, "asynchronous iteration", "9");
29746 }
29747 }
29748
29749 increaseComplexityCount();
29750 advance("(");
29751
29752 // what kind of for(…) statement it is? for(…of…)? for(…in…)? for(…;…;…)?
29753 var nextop; // contains the token of the "in" or "of" operator
29754 var comma; // First comma punctuator at level 0
29755 var initializer; // First initializer at level 0
29756 var bindingPower;
29757 var targets;
29758 var target;
29759 var decl;
29760 var afterNext = peek();
29761
29762 var headContext = context | prodParams.noin;
29763
29764 if (state.tokens.next.id === "var") {
29765 advance("var");
29766 decl = state.tokens.curr.fud(headContext);
29767 comma = decl.hasComma ? decl : null;
29768 initializer = decl.hasInitializer ? decl : null;
29769 } else if (state.tokens.next.id === "const" ||
29770 // The "let" keyword only signals a lexical binding if it is followed by
29771 // an identifier, `{`, or `[`. Otherwise, it should be parsed as an
29772 // IdentifierReference (i.e. in a subsquent branch).
29773 (state.tokens.next.id === "let" &&
29774 ((afterNext.identifier && afterNext.id !== "in") ||
29775 checkPunctuators(afterNext, ["{", "["])))) {
29776 advance(state.tokens.next.id);
29777 // create a new block scope
29778 letscope = true;
29779 state.funct["(scope)"].stack();
29780 decl = state.tokens.curr.fud(headContext);
29781 comma = decl.hasComma ? decl : null;
29782 initializer = decl.hasInitializer ? decl : null;
29783 } else if (!checkPunctuator(state.tokens.next, ";")) {
29784 targets = [];
29785
29786 while (state.tokens.next.value !== "in" &&
29787 state.tokens.next.value !== "of" &&
29788 !checkPunctuator(state.tokens.next, ";")) {
29789
29790 if (checkPunctuators(state.tokens.next, ["{", "["])) {
29791 destructuringPattern(headContext, { assignment: true })
29792 .forEach(function(elem) {
29793 this.push(elem.token);
29794 }, targets);
29795 if (checkPunctuator(state.tokens.next, "=")) {
29796 advance("=");
29797 initializer = state.tokens.curr;
29798 expression(headContext, 10);
29799 }
29800 } else {
29801 target = expression(headContext, 10);
29802
29803 if (target) {
29804 if (target.type === "(identifier)") {
29805 targets.push(target);
29806 } else if (checkPunctuator(target, "=")) {
29807 initializer = target;
29808 targets.push(target);
29809 }
29810 }
29811 }
29812
29813 if (checkPunctuator(state.tokens.next, ",")) {
29814 advance(",");
29815
29816 if (!comma) {
29817 comma = state.tokens.curr;
29818 }
29819 }
29820 }
29821
29822 //checkLeftSideAssign(target, nextop);
29823
29824 // In the event of a syntax error, do not issue warnings regarding the
29825 // implicit creation of bindings.
29826 if (!initializer && !comma) {
29827 targets.forEach(function(token) {
29828 if (!state.funct["(scope)"].has(token.value)) {
29829 warning("W088", token, token.value);
29830 }
29831 });
29832 }
29833 }
29834
29835 nextop = state.tokens.next;
29836
29837 if (isAsync && nextop.value !== "of") {
29838 error("E066", nextop);
29839 }
29840
29841 // if we're in a for (… in|of …) statement
29842 if (_.includes(["in", "of"], nextop.value)) {
29843 if (nextop.value === "of") {
29844 bindingPower = 20;
29845
29846 if (!state.inES6()) {
29847 warning("W104", nextop, "for of", "6");
29848 }
29849 } else {
29850 bindingPower = 0;
29851 }
29852 if (comma) {
29853 error("W133", comma, nextop.value, "more than one ForBinding");
29854 }
29855 if (initializer) {
29856 error("W133", initializer, nextop.value, "initializer is forbidden");
29857 }
29858 if (target && !comma && !initializer) {
29859 checkLeftSideAssign(context, target, nextop);
29860 }
29861
29862 advance(nextop.value);
29863
29864 // The binding power is variable because for-in statements accept any
29865 // Expression in this position, while for-of statements are limited to
29866 // AssignmentExpressions. For example:
29867 //
29868 // for ( LeftHandSideExpression in Expression ) Statement
29869 // for ( LeftHandSideExpression of AssignmentExpression ) Statement
29870 expression(context, bindingPower);
29871 advance(")", t);
29872
29873 if (nextop.value === "in" && state.option.forin) {
29874 state.forinifcheckneeded = true;
29875
29876 if (state.forinifchecks === undefined) {
29877 state.forinifchecks = [];
29878 }
29879
29880 // Push a new for-in-if check onto the stack. The type will be modified
29881 // when the loop's body is parsed and a suitable if statement exists.
29882 state.forinifchecks.push({
29883 type: "(none)"
29884 });
29885 }
29886
29887 state.funct["(breakage)"] += 1;
29888 state.funct["(loopage)"] += 1;
29889
29890 s = block(context, true, true);
29891
29892 if (nextop.value === "in" && state.option.forin) {
29893 if (state.forinifchecks && state.forinifchecks.length > 0) {
29894 var check = state.forinifchecks.pop();
29895
29896 if (// No if statement or not the first statement in loop body
29897 s && s.length > 0 && (typeof s[0] !== "object" || s[0].value !== "if") ||
29898 // Positive if statement is not the only one in loop body
29899 check.type === "(positive)" && s.length > 1 ||
29900 // Negative if statement but no continue
29901 check.type === "(negative)") {
29902 warning("W089", this);
29903 }
29904 }
29905
29906 // Reset the flag in case no if statement was contained in the loop body
29907 state.forinifcheckneeded = false;
29908 }
29909
29910 state.funct["(breakage)"] -= 1;
29911 state.funct["(loopage)"] -= 1;
29912
29913 } else {
29914 if (foreachtok) {
29915 error("E045", foreachtok);
29916 }
29917
29918 advance(";");
29919 if (decl && decl.first && decl.first[0]) {
29920 if (decl.value === "const" && !decl.hasInitializer) {
29921 warning("E012", decl, decl.first[0].value);
29922 }
29923
29924 decl.first.forEach(function(token) {
29925 state.funct["(scope)"].initialize(token.value);
29926 });
29927 }
29928
29929 // start loopage after the first ; as the next two expressions are executed
29930 // on every loop
29931 state.funct["(loopage)"] += 1;
29932 if (state.tokens.next.id !== ";") {
29933 checkCondAssignment(expression(context, 0));
29934 }
29935
29936 advance(";");
29937 if (state.tokens.next.id === ";") {
29938 error("E021", state.tokens.next, ")", ";");
29939 }
29940 if (state.tokens.next.id !== ")") {
29941 for (;;) {
29942 expression(context, 0);
29943 if (state.tokens.next.id !== ",") {
29944 break;
29945 }
29946 advance(",");
29947 checkComma();
29948 }
29949 }
29950 advance(")", t);
29951 state.funct["(breakage)"] += 1;
29952 block(context, true, true);
29953 state.funct["(breakage)"] -= 1;
29954 state.funct["(loopage)"] -= 1;
29955 }
29956
29957 // unstack loop blockscope
29958 if (letscope) {
29959 state.funct["(scope)"].unstack();
29960 }
29961 return this;
29962 }).labelled = true;
29963
29964
29965 stmt("break", function() {
29966 var v = state.tokens.next.value;
29967
29968 if (state.tokens.next.identifier &&
29969 sameLine(state.tokens.curr, state.tokens.next)) {
29970 if (!state.funct["(scope)"].funct.hasLabel(v)) {
29971 warning("W090", state.tokens.next, v);
29972 }
29973 this.first = state.tokens.next;
29974 advance();
29975 } else {
29976 if (state.funct["(breakage)"] === 0)
29977 warning("W052", state.tokens.next, this.value);
29978 }
29979
29980 reachable(this);
29981
29982 return this;
29983 }).exps = true;
29984
29985
29986 stmt("continue", function() {
29987 var v = state.tokens.next.value;
29988
29989 if (state.funct["(breakage)"] === 0 || !state.funct["(loopage)"]) {
29990 warning("W052", state.tokens.next, this.value);
29991 }
29992
29993 if (state.tokens.next.identifier) {
29994 if (sameLine(state.tokens.curr, state.tokens.next)) {
29995 if (!state.funct["(scope)"].funct.hasLabel(v)) {
29996 warning("W090", state.tokens.next, v);
29997 }
29998 this.first = state.tokens.next;
29999 advance();
30000 }
30001 }
30002
30003 reachable(this);
30004
30005 return this;
30006 }).exps = true;
30007
30008
30009 stmt("return", function(context) {
30010 if (sameLine(this, state.tokens.next)) {
30011 if (state.tokens.next.id !== ";" && !state.tokens.next.reach) {
30012 this.first = expression(context, 0);
30013
30014 if (this.first &&
30015 this.first.type === "(punctuator)" && this.first.value === "=" &&
30016 !this.first.paren && !state.option.boss) {
30017 warning("W093", this.first);
30018 }
30019
30020 if (state.option.noreturnawait && context & prodParams.async &&
30021 !(context & prodParams.tryClause) &&
30022 this.first.identifier && this.first.value === "await") {
30023 warning("W146", this.first);
30024 }
30025 }
30026 } else {
30027 if (state.tokens.next.type === "(punctuator)" &&
30028 ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) {
30029 nolinebreak(this); // always warn (Line breaking error)
30030 }
30031 }
30032
30033 reachable(this);
30034
30035 return this;
30036 }).exps = true;
30037
30038 prefix("await", function(context) {
30039 if (context & prodParams.async) {
30040 // If the parameters of the current function scope have not been defined,
30041 // it is because the current expression is contained within the parameter
30042 // list.
30043 if (!state.funct["(params)"]) {
30044 error("E024", this, "await");
30045 }
30046
30047 expression(context, 10);
30048 return this;
30049 } else {
30050 this.exps = false;
30051 return state.syntax["(identifier)"].nud.apply(this, arguments);
30052 }
30053 }).exps = true;
30054
30055 (function(asyncSymbol) {
30056 asyncSymbol.meta = { es5: true, isFutureReservedWord: true, strictOnly: true };
30057 asyncSymbol.isFunc = function() {
30058 var next = state.tokens.next;
30059 var afterParens;
30060
30061 if (this.line !== next.line) {
30062 return false;
30063 }
30064
30065 if (next.id === "function") {
30066 return true;
30067 }
30068
30069 if (next.id === "(") {
30070 afterParens = peekThroughParens(0);
30071
30072 return afterParens.id === "=>";
30073 }
30074
30075 if (next.identifier) {
30076 return peek().id === "=>";
30077 }
30078
30079 return false;
30080 };
30081 asyncSymbol.useFud = asyncSymbol.isFunc;
30082 // async function declaration
30083 asyncSymbol.fud = function(context) {
30084 if (!state.inES8()) {
30085 warning("W119", this, "async functions", "8");
30086 }
30087 context |= prodParams.preAsync;
30088 context |= prodParams.initial;
30089 this.func = expression(context, 0);
30090 this.block = this.func.block;
30091 this.exps = this.func.exps;
30092 return this;
30093 };
30094 asyncSymbol.exps = true;
30095 delete asyncSymbol.reserved;
30096 }(prefix("async", function(context, rbp) {
30097 if (this.isFunc(context)) {
30098 if (!state.inES8()) {
30099 warning("W119", this, "async functions", "8");
30100 }
30101
30102 context |= prodParams.preAsync;
30103 this.func = expression(context, rbp);
30104 this.identifier = false;
30105 return this;
30106 }
30107
30108 this.exps = false;
30109 return state.syntax["(identifier)"].nud.apply(this, arguments);
30110 })));
30111
30112 (function(yieldSymbol) {
30113 yieldSymbol.rbp = yieldSymbol.lbp = 25;
30114 yieldSymbol.exps = true;
30115 })(prefix("yield", function(context) {
30116 if (state.inMoz()) {
30117 return mozYield.call(this, context);
30118 }
30119
30120 if (!(context & prodParams.yield)) {
30121 this.exps = false;
30122 return state.syntax["(identifier)"].nud.apply(this, arguments);
30123 }
30124
30125 var prev = state.tokens.prev;
30126
30127 // If the parameters of the current function scope have not been defined,
30128 // it is because the current expression is contained within the parameter
30129 // list.
30130 if (!state.funct["(params)"]) {
30131 error("E024", this, "yield");
30132 }
30133
30134 if (!this.beginsStmt && prev.lbp > 30 && !checkPunctuators(prev, ["("])) {
30135 error("E061", this);
30136 }
30137
30138 if (!state.inES6()) {
30139 warning("W104", state.tokens.curr, "yield", "6");
30140 }
30141 state.funct["(yielded)"] = true;
30142
30143 if (state.tokens.next.value === "*") {
30144 advance("*");
30145 }
30146
30147 // Parse operand
30148 if (state.tokens.curr.value === "*" || sameLine(state.tokens.curr, state.tokens.next)) {
30149 if (state.tokens.next.nud) {
30150
30151 nobreaknonadjacent(state.tokens.curr, state.tokens.next);
30152 this.first = expression(context, 10);
30153
30154 if (this.first.type === "(punctuator)" && this.first.value === "=" &&
30155 !this.first.paren && !state.option.boss) {
30156 warning("W093", this.first);
30157 }
30158 } else if (state.tokens.next.led) {
30159 if (state.tokens.next.id !== ",") {
30160 error("W017", state.tokens.next);
30161 }
30162 }
30163 }
30164
30165 return this;
30166 }));
30167
30168 /**
30169 * Parsing logic for non-standard Mozilla implementation of `yield`
30170 * expressions.
30171 */
30172 var mozYield = function(context) {
30173 var prev = state.tokens.prev;
30174 if (state.inES6(true) && !(context & prodParams.yield)) {
30175 error("E046", state.tokens.curr, "yield");
30176 }
30177 state.funct["(yielded)"] = true;
30178 var delegatingYield = false;
30179
30180 if (state.tokens.next.value === "*") {
30181 delegatingYield = true;
30182 advance("*");
30183 }
30184
30185 if (sameLine(this, state.tokens.next)) {
30186 if (delegatingYield ||
30187 (state.tokens.next.id !== ";" && !state.option.asi &&
30188 !state.tokens.next.reach && state.tokens.next.nud)) {
30189
30190 nobreaknonadjacent(state.tokens.curr, state.tokens.next);
30191 this.first = expression(context, 10);
30192
30193 if (this.first.type === "(punctuator)" && this.first.value === "=" &&
30194 !this.first.paren && !state.option.boss) {
30195 warning("W093", this.first);
30196 }
30197 }
30198 if (state.tokens.next.id !== ")" &&
30199 (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()))) {
30200 error("E050", this);
30201 }
30202 } else if (!state.option.asi) {
30203 nolinebreak(this); // always warn (Line breaking error)
30204 }
30205 return this;
30206 };
30207
30208 stmt("throw", function(context) {
30209 nolinebreak(this);
30210 this.first = expression(context, 20);
30211
30212 reachable(this);
30213
30214 return this;
30215 }).exps = true;
30216
30217 stmt("import", function(context) {
30218 if (!state.funct["(scope)"].block.isGlobal()) {
30219 error("E053", state.tokens.curr, "Import");
30220 }
30221
30222 if (!state.inES6()) {
30223 warning("W119", state.tokens.curr, "import", "6");
30224 }
30225
30226 if (state.tokens.next.type === "(string)") {
30227 // ModuleSpecifier :: StringLiteral
30228 advance("(string)");
30229 return this;
30230 }
30231
30232 if (state.tokens.next.identifier) {
30233 // ImportClause :: ImportedDefaultBinding
30234 this.name = identifier(context);
30235 // Import bindings are immutable (see ES6 8.1.1.5.5)
30236 state.funct["(scope)"].addbinding(this.name, {
30237 type: "import",
30238 initialized: true,
30239 token: state.tokens.curr });
30240
30241 if (state.tokens.next.value === ",") {
30242 // ImportClause :: ImportedDefaultBinding , NameSpaceImport
30243 // ImportClause :: ImportedDefaultBinding , NamedImports
30244 advance(",");
30245 // At this point, we intentionally fall through to continue matching
30246 // either NameSpaceImport or NamedImports.
30247 // Discussion:
30248 // https://github.com/jshint/jshint/pull/2144#discussion_r23978406
30249 } else {
30250 advance("from");
30251 advance("(string)");
30252 return this;
30253 }
30254 }
30255
30256 if (state.tokens.next.id === "*") {
30257 // ImportClause :: NameSpaceImport
30258 advance("*");
30259 advance("as");
30260 if (state.tokens.next.identifier) {
30261 this.name = identifier(context);
30262 // Import bindings are immutable (see ES6 8.1.1.5.5)
30263 state.funct["(scope)"].addbinding(this.name, {
30264 type: "import",
30265 initialized: true,
30266 token: state.tokens.curr });
30267 }
30268 } else {
30269 // ImportClause :: NamedImports
30270 advance("{");
30271 for (;;) {
30272 if (state.tokens.next.value === "}") {
30273 advance("}");
30274 break;
30275 }
30276 var importName;
30277 if (state.tokens.next.type === "default") {
30278 importName = "default";
30279 advance("default");
30280 } else {
30281 importName = identifier(context);
30282 }
30283 if (state.tokens.next.value === "as") {
30284 advance("as");
30285 importName = identifier(context);
30286 }
30287
30288 // Import bindings are immutable (see ES6 8.1.1.5.5)
30289 state.funct["(scope)"].addbinding(importName, {
30290 type: "import",
30291 initialized: true,
30292 token: state.tokens.curr });
30293
30294 if (state.tokens.next.value === ",") {
30295 advance(",");
30296 } else if (state.tokens.next.value === "}") {
30297 advance("}");
30298 break;
30299 } else {
30300 error("E024", state.tokens.next, state.tokens.next.value);
30301 break;
30302 }
30303 }
30304 }
30305
30306 // FromClause
30307 advance("from");
30308 advance("(string)");
30309
30310 // Support for ES2015 modules was released without warning for `import`
30311 // declarations that lack bindings. Issuing a warning would therefor
30312 // constitute a breaking change.
30313 // TODO: enable this warning in JSHint 3
30314 // if (hasBindings) {
30315 // warning("W142", this, "import", moduleSpecifier);
30316 // }
30317
30318 return this;
30319 }).exps = true;
30320
30321 stmt("export", function(context) {
30322 var ok = true;
30323 var token;
30324 var identifier;
30325 var moduleSpecifier;
30326 context = context | prodParams.export;
30327
30328 if (!state.inES6()) {
30329 warning("W119", state.tokens.curr, "export", "6");
30330 ok = false;
30331 }
30332
30333 if (!state.funct["(scope)"].block.isGlobal()) {
30334 error("E053", state.tokens.curr, "Export");
30335 ok = false;
30336 }
30337
30338 if (state.tokens.next.value === "*") {
30339 // ExportDeclaration :: export * FromClause
30340 advance("*");
30341 advance("from");
30342 advance("(string)");
30343 return this;
30344 }
30345
30346 if (state.tokens.next.type === "default") {
30347 // ExportDeclaration ::
30348 // export default [lookahead ∉ { function, class }] AssignmentExpression[In] ;
30349 // export default HoistableDeclaration
30350 // export default ClassDeclaration
30351
30352 // because the 'name' of a default-exported function is, confusingly, 'default'
30353 // see https://bocoup.com/blog/whats-in-a-function-name
30354 state.nameStack.set(state.tokens.next);
30355
30356 advance("default");
30357 var exportType = state.tokens.next.id;
30358 if (exportType === "function") {
30359 this.block = true;
30360 advance("function");
30361 state.syntax["function"].fud(context);
30362 } else if (exportType === "async" && peek().id === "function") {
30363 this.block = true;
30364 advance("async");
30365 advance("function");
30366 state.syntax["function"].fud(context | prodParams.preAsync);
30367 } else if (exportType === "class") {
30368 this.block = true;
30369 advance("class");
30370 state.syntax["class"].fud(context);
30371 } else {
30372 token = expression(context, 10);
30373 if (token.identifier) {
30374 identifier = token.value;
30375 state.funct["(scope)"].setExported(identifier, token);
30376 }
30377 }
30378 return this;
30379 }
30380 if (state.tokens.next.value === "{") {
30381 // ExportDeclaration :: export ExportClause
30382 advance("{");
30383 var exportedTokens = [];
30384 while (!checkPunctuator(state.tokens.next, "}")) {
30385 if (!state.tokens.next.identifier) {
30386 /* istanbul ignore next */
30387 error("E030", state.tokens.next, state.tokens.next.value);
30388 }
30389 advance();
30390
30391 exportedTokens.push(state.tokens.curr);
30392
30393 if (state.tokens.next.value === "as") {
30394 advance("as");
30395 if (!state.tokens.next.identifier) {
30396 /* istanbul ignore next */
30397 error("E030", state.tokens.next, state.tokens.next.value);
30398 }
30399 advance();
30400 }
30401
30402 if (!checkPunctuator(state.tokens.next, "}")) {
30403 advance(",");
30404 }
30405 }
30406 advance("}");
30407 if (state.tokens.next.value === "from") {
30408 // ExportDeclaration :: export ExportClause FromClause
30409 advance("from");
30410 moduleSpecifier = state.tokens.next;
30411 advance("(string)");
30412 } else if (ok) {
30413 exportedTokens.forEach(function(token) {
30414 state.funct["(scope)"].setExported(token.value, token);
30415 });
30416 }
30417
30418 if (exportedTokens.length === 0) {
30419 if (moduleSpecifier) {
30420 warning("W142", this, "export", moduleSpecifier.value);
30421 } else {
30422 warning("W141", this, "export");
30423 }
30424 }
30425
30426 return this;
30427 } else if (state.tokens.next.id === "var") {
30428 // ExportDeclaration :: export VariableStatement
30429 advance("var");
30430 state.tokens.curr.fud(context);
30431 } else if (state.tokens.next.id === "let") {
30432 // ExportDeclaration :: export VariableStatement
30433 advance("let");
30434 state.tokens.curr.fud(context);
30435 } else if (state.tokens.next.id === "const") {
30436 // ExportDeclaration :: export VariableStatement
30437 advance("const");
30438 state.tokens.curr.fud(context);
30439 } else if (state.tokens.next.id === "function") {
30440 // ExportDeclaration :: export Declaration
30441 this.block = true;
30442 advance("function");
30443 state.syntax["function"].fud(context);
30444 } else if (state.tokens.next.id === "async" && peek().id === "function") {
30445 // ExportDeclaration :: export Declaration
30446 this.block = true;
30447 advance("async");
30448 advance("function");
30449 state.syntax["function"].fud(context | prodParams.preAsync);
30450 } else if (state.tokens.next.id === "class") {
30451 // ExportDeclaration :: export Declaration
30452 this.block = true;
30453 advance("class");
30454 state.syntax["class"].fud(context);
30455 } else {
30456 /* istanbul ignore next */
30457 error("E024", state.tokens.next, state.tokens.next.value);
30458 }
30459
30460 return this;
30461 }).exps = true;
30462
30463 /**
30464 * Determine if SuperCall or SuperProperty may be used in the current context
30465 * (as described by the provided "functor" object).
30466 *
30467 * @param {string} type - one of "property" or "call"
30468 * @param {object} funct - a "functor" object describing the current function
30469 * context
30470 *
30471 * @returns {boolean}
30472 */
30473 function supportsSuper(type, funct) {
30474 if (type === "call" && funct["(async)"]) {
30475 return false;
30476 }
30477
30478 if (type === "property" && funct["(method)"]) {
30479 return true;
30480 }
30481
30482 if (type === "call" && funct["(statement)"] &&
30483 funct["(statement)"].id === "class") {
30484 return true;
30485 }
30486
30487 if (funct["(arrow)"]) {
30488 return supportsSuper(type, funct["(context)"]);
30489 }
30490
30491 return false;
30492 }
30493
30494 var superNud = function() {
30495 var next = state.tokens.next;
30496
30497 if (checkPunctuators(next, ["[", "."])) {
30498 if (!supportsSuper("property", state.funct)) {
30499 error("E063", this);
30500 }
30501 } else if (checkPunctuator(next, "(")) {
30502 if (!supportsSuper("call", state.funct)) {
30503 error("E064", this);
30504 }
30505 } else {
30506 error("E024", next, next.value || next.id);
30507 }
30508
30509 return this;
30510 };
30511
30512 // Future Reserved Words
30513
30514 FutureReservedWord("abstract");
30515 FutureReservedWord("boolean");
30516 FutureReservedWord("byte");
30517 FutureReservedWord("char");
30518 FutureReservedWord("double");
30519 FutureReservedWord("enum", { es5: true });
30520 FutureReservedWord("export", { es5: true });
30521 FutureReservedWord("extends", { es5: true });
30522 FutureReservedWord("final");
30523 FutureReservedWord("float");
30524 FutureReservedWord("goto");
30525 FutureReservedWord("implements", { es5: true, strictOnly: true });
30526 FutureReservedWord("import", { es5: true });
30527 FutureReservedWord("int");
30528 FutureReservedWord("interface", { es5: true, strictOnly: true });
30529 FutureReservedWord("long");
30530 FutureReservedWord("native");
30531 FutureReservedWord("package", { es5: true, strictOnly: true });
30532 FutureReservedWord("private", { es5: true, strictOnly: true });
30533 FutureReservedWord("protected", { es5: true, strictOnly: true });
30534 FutureReservedWord("public", { es5: true, strictOnly: true });
30535 FutureReservedWord("short");
30536 FutureReservedWord("static", { es5: true, strictOnly: true });
30537 FutureReservedWord("synchronized");
30538 FutureReservedWord("transient");
30539 FutureReservedWord("volatile");
30540
30541 // this function is used to determine whether a squarebracket or a curlybracket
30542 // expression is a comprehension array, destructuring assignment or a json value.
30543
30544 var lookupBlockType = function() {
30545 var pn, pn1, prev;
30546 var i = -1;
30547 var bracketStack = 0;
30548 var ret = {};
30549 if (checkPunctuators(state.tokens.curr, ["[", "{"])) {
30550 bracketStack += 1;
30551 }
30552 do {
30553 prev = i === -1 ? state.tokens.curr : pn;
30554 pn = i === -1 ? state.tokens.next : peek(i);
30555 pn1 = peek(i + 1);
30556 i = i + 1;
30557 if (checkPunctuators(pn, ["[", "{"])) {
30558 bracketStack += 1;
30559 } else if (checkPunctuators(pn, ["]", "}"])) {
30560 bracketStack -= 1;
30561 }
30562 if (bracketStack === 1 && pn.identifier && pn.value === "for" &&
30563 !checkPunctuator(prev, ".")) {
30564 ret.isCompArray = true;
30565 ret.notJson = true;
30566 break;
30567 }
30568 if (bracketStack === 0 && checkPunctuators(pn, ["}", "]"])) {
30569 if (pn1.value === "=") {
30570 ret.isDestAssign = true;
30571 ret.notJson = true;
30572 break;
30573 } else if (pn1.value === ".") {
30574 ret.notJson = true;
30575 break;
30576 }
30577 }
30578 if (checkPunctuator(pn, ";")) {
30579 ret.notJson = true;
30580 }
30581 } while (bracketStack > 0 && pn.id !== "(end)");
30582 return ret;
30583 };
30584
30585 /**
30586 * Update an object used to track property names within object initializers
30587 * and class bodies. Produce warnings in response to duplicated names.
30588 *
30589 * @param {object} props - a collection of all properties of the object or
30590 * class to which the current property is being
30591 * assigned
30592 * @param {string} name - the property name
30593 * @param {object} tkn - the token defining the property
30594 * @param {boolean} [isClass] - whether the accessor is part of an ES6 Class
30595 * definition
30596 * @param {boolean} [isStatic] - whether the accessor is a static method
30597 * @param {boolean} [isComputed] - whether the property is a computed expression like [Symbol.iterator]
30598 */
30599 function saveProperty(props, name, tkn, isClass, isStatic, isComputed) {
30600 if (tkn.identifier) {
30601 name = tkn.value;
30602 }
30603 var key = name;
30604 if (isClass && isStatic) {
30605 key = "static " + name;
30606 }
30607
30608 if (props[key] && name !== "__proto__" && !isComputed) {
30609 var msg = ["key", "class method", "static class method"];
30610 msg = msg[(isClass || false) + (isStatic || false)];
30611 warning("W075", state.tokens.next, msg, name);
30612 } else {
30613 props[key] = Object.create(null);
30614 }
30615
30616 props[key].basic = true;
30617 props[key].basictkn = tkn;
30618 }
30619
30620 /**
30621 * Update an object used to track property names within object initializers
30622 * and class bodies. Produce warnings in response to duplicated names.
30623 *
30624 * @param {string} accessorType - Either "get" or "set"
30625 * @param {object} props - a collection of all properties of the object or
30626 * class to which the current accessor is being
30627 * assigned
30628 * @param {object} tkn - the identifier token representing the accessor name
30629 * @param {boolean} [isClass] - whether the accessor is part of an ES6 Class
30630 * definition
30631 * @param {boolean} [isStatic] - whether the accessor is a static method
30632 */
30633 function saveAccessor(accessorType, props, name, tkn, isClass, isStatic) {
30634 var flagName = accessorType === "get" ? "getterToken" : "setterToken";
30635 var key = name;
30636 state.tokens.curr.accessorType = accessorType;
30637 state.nameStack.set(tkn);
30638 if (isClass && isStatic) {
30639 key = "static " + name;
30640 }
30641
30642 if (props[key]) {
30643 if ((props[key].basic || props[key][flagName]) && name !== "__proto__") {
30644 var msg = "";
30645 if (isClass) {
30646 if (isStatic) {
30647 msg += "static ";
30648 }
30649 msg += accessorType + "ter method";
30650 } else {
30651 msg = "key";
30652 }
30653 warning("W075", state.tokens.next, msg, name);
30654 }
30655 } else {
30656 props[key] = Object.create(null);
30657 }
30658
30659 props[key][flagName] = tkn;
30660 if (isStatic) {
30661 props[key].static = true;
30662 }
30663 }
30664
30665 /**
30666 * Parse a computed property name within object initializers and class bodies
30667 * as introduced by ES2015. For example:
30668 *
30669 * void {
30670 * [object.method()]: null
30671 * };
30672 *
30673 * @param {number} context - the parsing context
30674 *
30675 * @returns {object} - the token value that describes the expression which
30676 * defines the property name
30677 */
30678 function computedPropertyName(context) {
30679 advance("[");
30680
30681 // Explicitly reclassify token as a delimeter to prevent its later
30682 // interpretation as an "infix" operator.
30683 state.tokens.curr.delim = true;
30684 state.tokens.curr.lbp = 0;
30685
30686 if (!state.inES6()) {
30687 warning("W119", state.tokens.curr, "computed property names", "6");
30688 }
30689 var value = expression(context & ~prodParams.noin, 10);
30690 advance("]");
30691 return value;
30692 }
30693
30694 /**
30695 * Test whether a given token is a punctuator whose `value` property matches
30696 * one of the specified values. This function explicitly verifies the token's
30697 * `type` property so that like-valued string literals (e.g. `";"`) do not
30698 * produce false positives.
30699 *
30700 * @param {Token} token
30701 * @param {Array.<string>} values
30702 *
30703 * @returns {boolean}
30704 */
30705 function checkPunctuators(token, values) {
30706 if (token.type === "(punctuator)") {
30707 return _.includes(values, token.value);
30708 }
30709 return false;
30710 }
30711
30712 /**
30713 * Test whether a given token is a punctuator whose `value` property matches
30714 * the specified value. This function explicitly verifies the token's `type`
30715 * property so that like-valued string literals (e.g. `";"`) do not produce
30716 * false positives.
30717 *
30718 * @param {Token} token
30719 * @param {string} value
30720 *
30721 * @returns {boolean}
30722 */
30723 function checkPunctuator(token, value) {
30724 return token.type === "(punctuator)" && token.value === value;
30725 }
30726
30727 // Check whether this function has been reached for a destructuring assign with undeclared values
30728 function destructuringAssignOrJsonValue(context) {
30729 // lookup for the assignment (ECMAScript 6 only)
30730 // if it has semicolons, it is a block, so go parse it as a block
30731 // or it's not a block, but there are assignments, check for undeclared variables
30732
30733 var block = lookupBlockType();
30734 if (block.notJson) {
30735 if (!state.inES6() && block.isDestAssign) {
30736 /* istanbul ignore next */
30737 warning("W104", state.tokens.curr, "destructuring assignment", "6");
30738 }
30739 statements(context);
30740 // otherwise parse json value
30741 } else {
30742 state.option.laxbreak = true;
30743 state.jsonMode = true;
30744 jsonValue();
30745 }
30746 }
30747
30748 /**
30749 * Parse and define the three states of a list comprehension in order to
30750 * avoid defining global variables, but keeping them to the list
30751 * comprehension scope only. The order of the states are as follows:
30752 *
30753 * - "use" - which will be the returned iterative part of the list
30754 * comprehension
30755 * - "define" - which will define the variables local to the list
30756 * comprehension
30757 * - "filter" - which will help filter out values
30758 */
30759 var arrayComprehension = function() {
30760 var CompArray = function() {
30761 this.mode = "use";
30762 this.variables = [];
30763 };
30764 var _carrays = [];
30765 var _current;
30766 function declare(v) {
30767 var l = _current.variables.filter(function(elt) {
30768 // if it has, change its undef state
30769 if (elt.value === v) {
30770 elt.undef = false;
30771 return v;
30772 }
30773 }).length;
30774 return l !== 0;
30775 }
30776 function use(v) {
30777 var l = _current.variables.filter(function(elt) {
30778 // and if it has been defined
30779 if (elt.value === v && !elt.undef) {
30780 if (elt.unused === true) {
30781 elt.unused = false;
30782 }
30783 return v;
30784 }
30785 }).length;
30786 // otherwise we warn about it
30787 return (l === 0);
30788 }
30789 return { stack: function() {
30790 _current = new CompArray();
30791 _carrays.push(_current);
30792 },
30793 unstack: function() {
30794 _current.variables.filter(function(v) {
30795 if (v.unused)
30796 warning("W098", v.token, v.token.raw_text || v.value);
30797 if (v.undef)
30798 state.funct["(scope)"].block.use(v.value, v.token);
30799 });
30800 _carrays.splice(-1, 1);
30801 _current = _carrays[_carrays.length - 1];
30802 },
30803 setState: function(s) {
30804 if (_.includes(["use", "define", "generate", "filter"], s))
30805 _current.mode = s;
30806 },
30807 check: function(v) {
30808 if (!_current) {
30809 return;
30810 }
30811 // When we are in "use" state of the list comp, we enqueue that var
30812 if (_current && _current.mode === "use") {
30813 if (use(v)) {
30814 _current.variables.push({
30815 token: state.tokens.curr,
30816 value: v,
30817 undef: true,
30818 unused: false
30819 });
30820 }
30821 return true;
30822 // When we are in "define" state of the list comp,
30823 } else if (_current && _current.mode === "define") {
30824 // check if the variable has been used previously
30825 if (!declare(v)) {
30826 _current.variables.push({
30827 token: state.tokens.curr,
30828 value: v,
30829 undef: false,
30830 unused: true
30831 });
30832 }
30833 return true;
30834 // When we are in the "generate" state of the list comp,
30835 } else if (_current && _current.mode === "generate") {
30836 state.funct["(scope)"].block.use(v, state.tokens.curr);
30837 return true;
30838 // When we are in "filter" state,
30839 } else if (_current && _current.mode === "filter") {
30840 // we check whether current variable has been declared
30841 if (use(v)) {
30842 // if not we warn about it
30843 /* istanbul ignore next */
30844 state.funct["(scope)"].block.use(v, state.tokens.curr);
30845 }
30846 return true;
30847 }
30848 /* istanbul ignore next */
30849 return false;
30850 }
30851 };
30852 };
30853
30854
30855 /**
30856 * Parse input according to the JSON format.
30857 *
30858 * http://json.org/
30859 */
30860 function jsonValue() {
30861 function jsonObject() {
30862 var o = {}, t = state.tokens.next;
30863 advance("{");
30864 if (state.tokens.next.id !== "}") {
30865 for (;;) {
30866 if (state.tokens.next.id === "(end)") {
30867 error("E026", state.tokens.next, t.line);
30868 } else if (state.tokens.next.id === "}") {
30869 warning("W094", state.tokens.curr);
30870 break;
30871 } else if (state.tokens.next.id === ",") {
30872 error("E028", state.tokens.next);
30873 } else if (state.tokens.next.id !== "(string)") {
30874 warning("W095", state.tokens.next, state.tokens.next.value);
30875 }
30876 if (o[state.tokens.next.value] === true) {
30877 warning("W075", state.tokens.next, "key", state.tokens.next.value);
30878 } else if ((state.tokens.next.value === "__proto__" &&
30879 !state.option.proto) || (state.tokens.next.value === "__iterator__" &&
30880 !state.option.iterator)) {
30881 warning("W096", state.tokens.next, state.tokens.next.value);
30882 } else {
30883 o[state.tokens.next.value] = true;
30884 }
30885 advance();
30886 advance(":");
30887 jsonValue();
30888 if (state.tokens.next.id !== ",") {
30889 break;
30890 }
30891 advance(",");
30892 }
30893 }
30894 advance("}");
30895 }
30896
30897 function jsonArray() {
30898 var t = state.tokens.next;
30899 advance("[");
30900 if (state.tokens.next.id !== "]") {
30901 for (;;) {
30902 if (state.tokens.next.id === "(end)") {
30903 error("E027", state.tokens.next, t.line);
30904 } else if (state.tokens.next.id === "]") {
30905 warning("W094", state.tokens.curr);
30906 break;
30907 } else if (state.tokens.next.id === ",") {
30908 error("E028", state.tokens.next);
30909 }
30910 jsonValue();
30911 if (state.tokens.next.id !== ",") {
30912 break;
30913 }
30914 advance(",");
30915 }
30916 }
30917 advance("]");
30918 }
30919
30920 switch (state.tokens.next.id) {
30921 case "{":
30922 jsonObject();
30923 break;
30924 case "[":
30925 jsonArray();
30926 break;
30927 case "true":
30928 case "false":
30929 case "null":
30930 case "(number)":
30931 case "(string)":
30932 advance();
30933 break;
30934 case "-":
30935 advance("-");
30936 advance("(number)");
30937 break;
30938 default:
30939 error("E003", state.tokens.next);
30940 }
30941 }
30942
30943 /**
30944 * Lint dynamically-evaluated code, appending any resulting errors/warnings
30945 * into the global `errors` array.
30946 *
30947 * @param {array} internals - collection of "internals" objects describing
30948 * string tokens that contain evaluated code
30949 * @param {object} options - linting options to apply
30950 * @param {object} globals - globally-defined bindings for the evaluated code
30951 */
30952 function lintEvalCode(internals, options, globals) {
30953 var priorErrorCount, idx, jdx, internal;
30954
30955 for (idx = 0; idx < internals.length; idx += 1) {
30956 internal = internals[idx];
30957 options.scope = internal.elem;
30958 priorErrorCount = JSHINT.errors.length;
30959
30960 itself(internal.code, options, globals);
30961
30962 for (jdx = priorErrorCount; jdx < JSHINT.errors.length; jdx += 1) {
30963 JSHINT.errors[jdx].line += internal.token.line - 1;
30964 }
30965 }
30966 }
30967
30968 var escapeRegex = function(str) {
30969 return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
30970 };
30971
30972 // The actual JSHINT function itself.
30973 var itself = function(s, o, g) {
30974 var x, reIgnoreStr, reIgnore;
30975 var optionKeys, newOptionObj, newIgnoredObj;
30976
30977 o = _.clone(o);
30978 state.reset();
30979 newOptionObj = state.option;
30980 newIgnoredObj = state.ignored;
30981
30982 if (o && o.scope) {
30983 JSHINT.scope = o.scope;
30984 } else {
30985 JSHINT.errors = [];
30986 JSHINT.internals = [];
30987 JSHINT.blacklist = {};
30988 JSHINT.scope = "(main)";
30989 }
30990
30991 predefined = Object.create(null);
30992 combine(predefined, vars.ecmaIdentifiers[3]);
30993 combine(predefined, vars.reservedVars);
30994
30995 declared = Object.create(null);
30996 var exported = Object.create(null); // Variables that live outside the current file
30997
30998 function each(obj, cb) {
30999 if (!obj)
31000 return;
31001
31002 if (!Array.isArray(obj) && typeof obj === "object")
31003 obj = Object.keys(obj);
31004
31005 obj.forEach(cb);
31006 }
31007
31008 if (o) {
31009
31010 each([o.predef, o.globals], function(dict) {
31011 each(dict, function(item) {
31012 var slice, prop;
31013
31014 if (item[0] === "-") {
31015 slice = item.slice(1);
31016 JSHINT.blacklist[slice] = slice;
31017 // remove from predefined if there
31018 delete predefined[slice];
31019 } else {
31020 prop = Object.getOwnPropertyDescriptor(dict, item);
31021 predefined[item] = prop ? prop.value : false;
31022 }
31023 });
31024 });
31025
31026 each(o.exported || null, function(item) {
31027 exported[item] = true;
31028 });
31029
31030 delete o.predef;
31031 delete o.exported;
31032
31033 optionKeys = Object.keys(o);
31034 for (x = 0; x < optionKeys.length; x++) {
31035 if (/^-W\d{3}$/g.test(optionKeys[x])) {
31036 newIgnoredObj[optionKeys[x].slice(1)] = true;
31037 } else {
31038 var optionKey = optionKeys[x];
31039 newOptionObj[optionKey] = o[optionKey];
31040 }
31041 }
31042 }
31043
31044 state.option = newOptionObj;
31045 state.ignored = newIgnoredObj;
31046
31047 state.option.indent = state.option.indent || 4;
31048 state.option.maxerr = state.option.maxerr || 50;
31049
31050 indent = 1;
31051
31052 var scopeManagerInst = scopeManager(state, predefined, exported, declared);
31053 scopeManagerInst.on("warning", function(ev) {
31054 warning.apply(null, [ ev.code, ev.token].concat(ev.data));
31055 });
31056
31057 scopeManagerInst.on("error", function(ev) {
31058 /* istanbul ignore next */
31059 error.apply(null, [ ev.code, ev.token ].concat(ev.data));
31060 });
31061
31062 state.funct = functor("(global)", null, {
31063 "(global)" : true,
31064 "(scope)" : scopeManagerInst,
31065 "(comparray)" : arrayComprehension(),
31066 "(metrics)" : createMetrics(state.tokens.next)
31067 });
31068
31069 functions = [state.funct];
31070 member = {};
31071 membersOnly = null;
31072 inblock = false;
31073 lookahead = [];
31074
31075 if (!isString(s) && !Array.isArray(s)) {
31076 errorAt("E004", 0);
31077 return false;
31078 }
31079
31080 api = {
31081 get isJSON() {
31082 /* istanbul ignore next */
31083 return state.jsonMode;
31084 },
31085
31086 getOption: function(name) {
31087 return state.option[name] || null;
31088 },
31089
31090 getCache: function(name) {
31091 return state.cache[name];
31092 },
31093
31094 setCache: function(name, value) {
31095 state.cache[name] = value;
31096 },
31097
31098 warn: function(code, data) {
31099 warningAt.apply(null, [ code, data.line, data.char ].concat(data.data));
31100 },
31101
31102 on: function(names, listener) {
31103 names.split(" ").forEach(function(name) {
31104 emitter.on(name, listener);
31105 }.bind(this));
31106 }
31107 };
31108
31109 emitter.removeAllListeners();
31110 (extraModules || []).forEach(function(func) {
31111 func(api);
31112 });
31113
31114 state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"];
31115 if (o && o.ignoreDelimiters) {
31116
31117 if (!Array.isArray(o.ignoreDelimiters)) {
31118 /* istanbul ignore next */
31119 o.ignoreDelimiters = [o.ignoreDelimiters];
31120 }
31121
31122 o.ignoreDelimiters.forEach(function(delimiterPair) {
31123 if (!delimiterPair.start || !delimiterPair.end)
31124 return;
31125
31126 reIgnoreStr = escapeRegex(delimiterPair.start) +
31127 "[\\s\\S]*?" +
31128 escapeRegex(delimiterPair.end);
31129
31130 reIgnore = new RegExp(reIgnoreStr, "ig");
31131
31132 s = s.replace(reIgnore, function(match) {
31133 return match.replace(/./g, " ");
31134 });
31135 });
31136 }
31137
31138 lex = new Lexer(s);
31139
31140 lex.on("warning", function(ev) {
31141 warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data));
31142 });
31143
31144 lex.on("error", function(ev) {
31145 errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data));
31146 });
31147
31148 lex.on("fatal", function(ev) {
31149 quit("E041", ev);
31150 });
31151
31152 lex.on("Identifier", function(ev) {
31153 emitter.emit("Identifier", ev);
31154 });
31155
31156 lex.on("String", function(ev) {
31157 emitter.emit("String", ev);
31158 });
31159
31160 lex.on("Number", function(ev) {
31161 emitter.emit("Number", ev);
31162 });
31163
31164 // Check options
31165 var name;
31166 for (name in o) {
31167 if (_.has(o, name)) {
31168 checkOption(name, true, state.tokens.curr);
31169 }
31170 }
31171 if (o) {
31172 for (name in o.unstable) {
31173 if (_.has(o.unstable, name)) {
31174 checkOption(name, false, state.tokens.curr);
31175 }
31176 }
31177 }
31178
31179 try {
31180 applyOptions();
31181
31182 // combine the passed globals after we've assumed all our options
31183 combine(predefined, g || {});
31184
31185 //reset values
31186 checkComma.first = true;
31187
31188 advance();
31189 switch (state.tokens.next.id) {
31190 case "{":
31191 case "[":
31192 destructuringAssignOrJsonValue(0);
31193 break;
31194 default:
31195 directives();
31196
31197 if (state.directive["use strict"]) {
31198 if (!state.allowsGlobalUsd()) {
31199 warning("W097", state.tokens.prev);
31200 }
31201 }
31202
31203 statements(0);
31204 }
31205
31206 if (state.tokens.next.id !== "(end)") {
31207 quit("E041", state.tokens.curr);
31208 }
31209
31210 state.funct["(scope)"].unstack();
31211
31212 } catch (err) {
31213 if (err && err.name === "JSHintError") {
31214 var nt = state.tokens.next || {};
31215 JSHINT.errors.push({
31216 scope : "(main)",
31217 raw : err.raw,
31218 code : err.code,
31219 reason : err.reason,
31220 line : err.line || nt.line,
31221 character : err.character || nt.from
31222 });
31223 } else {
31224 /* istanbul ignore next */
31225 throw err;
31226 }
31227 }
31228
31229 // Loop over the listed "internals", and check them as well.
31230 if (JSHINT.scope === "(main)") {
31231 lintEvalCode(JSHINT.internals, o || {}, g);
31232 }
31233
31234 return JSHINT.errors.length === 0;
31235 };
31236
31237 // Modules.
31238 itself.addModule = function(func) {
31239 extraModules.push(func);
31240 };
31241
31242 itself.addModule(style.register);
31243
31244 // Data summary.
31245 itself.data = function() {
31246 var data = {
31247 functions: [],
31248 options: state.option
31249 };
31250
31251 var fu, f, i, n, globals;
31252
31253 if (itself.errors.length) {
31254 data.errors = itself.errors;
31255 }
31256
31257 if (state.jsonMode) {
31258 /* istanbul ignore next */
31259 data.json = true;
31260 }
31261
31262 var impliedGlobals = state.funct["(scope)"].getImpliedGlobals();
31263 if (impliedGlobals.length > 0) {
31264 data.implieds = impliedGlobals;
31265 }
31266
31267 globals = state.funct["(scope)"].getUsedOrDefinedGlobals();
31268 if (globals.length > 0) {
31269 data.globals = globals;
31270 }
31271
31272 for (i = 1; i < functions.length; i += 1) {
31273 f = functions[i];
31274 fu = {};
31275
31276 fu.name = f["(name)"];
31277 fu.param = f["(params)"];
31278 fu.line = f["(line)"];
31279 fu.character = f["(character)"];
31280 fu.last = f["(last)"];
31281 fu.lastcharacter = f["(lastcharacter)"];
31282
31283 fu.metrics = {
31284 complexity: f["(metrics)"].ComplexityCount,
31285 parameters: f["(metrics)"].arity,
31286 statements: f["(metrics)"].statementCount
31287 };
31288
31289 data.functions.push(fu);
31290 }
31291
31292 var unuseds = state.funct["(scope)"].getUnuseds();
31293 if (unuseds.length > 0) {
31294 data.unused = unuseds;
31295 }
31296
31297 for (n in member) {
31298 if (typeof member[n] === "number") {
31299 data.member = member;
31300 break;
31301 }
31302 }
31303
31304 return data;
31305 };
31306
31307 itself.jshint = itself;
31308
31309 return itself;
31310 }());
31311
31312 // Make JSHINT a Node module, if possible.
31313 if (typeof exports === "object" && exports) {
31314 exports.JSHINT = JSHINT;
31315 }
31316
31317 },{"./lex.js":17,"./messages.js":18,"./options.js":20,"./prod-params.js":21,"./reg.js":22,"./scope-manager.js":23,"./state.js":24,"./style.js":25,"./vars.js":26,"console-browserify":14,"events":9,"lodash":16}]},{},[]);
31318
31319 JSHINT = require('jshint').JSHINT;
31320 if (typeof exports === 'object' && exports) exports.JSHINT = JSHINT;
31321 }());