[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 /*! 2.9.5 */ 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 var str = '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,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,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2137,2138,2139,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,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,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,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,3073,3074,3075,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,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,3330,3331,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,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,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,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6600,6601,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,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,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,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,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,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,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,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,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,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,65075,65076,65101,65102,65103,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65343'; 32 var arr = str.split(',').map(function(code) { 33 return parseInt(code, 10); 34 }); 35 module.exports = arr; 36 },{}],3:[function(require,module,exports){ 37 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,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,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,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,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,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,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,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,2425,2426,2427,2428,2429,2430,2431,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,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,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,3125,3126,3127,3128,3129,3133,3160,3161,3168,3169,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,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,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,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,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,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,6593,6594,6595,6596,6597,6598,6599,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,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,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,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,11823,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,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,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,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,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,42896,42897,42898,42899,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,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,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,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,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,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'; 38 var arr = str.split(',').map(function(code) { 39 return parseInt(code, 10); 40 }); 41 module.exports = arr; 42 },{}],4:[function(require,module,exports){ 43 // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 44 // 45 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! 46 // 47 // Originally from narwhal.js (http://narwhaljs.org) 48 // Copyright (c) 2009 Thomas Robinson <280north.com> 49 // 50 // Permission is hereby granted, free of charge, to any person obtaining a copy 51 // of this software and associated documentation files (the 'Software'), to 52 // deal in the Software without restriction, including without limitation the 53 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 54 // sell copies of the Software, and to permit persons to whom the Software is 55 // furnished to do so, subject to the following conditions: 56 // 57 // The above copyright notice and this permission notice shall be included in 58 // all copies or substantial portions of the Software. 59 // 60 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 61 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 62 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 63 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 64 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 65 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 66 67 // when used in node, this will actually load the util module we depend on 68 // versus loading the builtin util module as happens otherwise 69 // this is a bug in node module loading as far as I am concerned 70 var util = require('util/'); 71 72 var pSlice = Array.prototype.slice; 73 var hasOwn = Object.prototype.hasOwnProperty; 74 75 // 1. The assert module provides functions that throw 76 // AssertionError's when particular conditions are not met. The 77 // assert module must conform to the following interface. 78 79 var assert = module.exports = ok; 80 81 // 2. The AssertionError is defined in assert. 82 // new assert.AssertionError({ message: message, 83 // actual: actual, 84 // expected: expected }) 85 86 assert.AssertionError = function AssertionError(options) { 87 this.name = 'AssertionError'; 88 this.actual = options.actual; 89 this.expected = options.expected; 90 this.operator = options.operator; 91 if (options.message) { 92 this.message = options.message; 93 this.generatedMessage = false; 94 } else { 95 this.message = getMessage(this); 96 this.generatedMessage = true; 97 } 98 var stackStartFunction = options.stackStartFunction || fail; 99 100 if (Error.captureStackTrace) { 101 Error.captureStackTrace(this, stackStartFunction); 102 } 103 else { 104 // non v8 browsers so we can have a stacktrace 105 var err = new Error(); 106 if (err.stack) { 107 var out = err.stack; 108 109 // try to strip useless frames 110 var fn_name = stackStartFunction.name; 111 var idx = out.indexOf('\n' + fn_name); 112 if (idx >= 0) { 113 // once we have located the function frame 114 // we need to strip out everything before it (and its line) 115 var next_line = out.indexOf('\n', idx + 1); 116 out = out.substring(next_line + 1); 117 } 118 119 this.stack = out; 120 } 121 } 122 }; 123 124 // assert.AssertionError instanceof Error 125 util.inherits(assert.AssertionError, Error); 126 127 function replacer(key, value) { 128 if (util.isUndefined(value)) { 129 return '' + value; 130 } 131 if (util.isNumber(value) && !isFinite(value)) { 132 return value.toString(); 133 } 134 if (util.isFunction(value) || util.isRegExp(value)) { 135 return value.toString(); 136 } 137 return value; 138 } 139 140 function truncate(s, n) { 141 if (util.isString(s)) { 142 return s.length < n ? s : s.slice(0, n); 143 } else { 144 return s; 145 } 146 } 147 148 function getMessage(self) { 149 return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + 150 self.operator + ' ' + 151 truncate(JSON.stringify(self.expected, replacer), 128); 152 } 153 154 // At present only the three keys mentioned above are used and 155 // understood by the spec. Implementations or sub modules can pass 156 // other keys to the AssertionError's constructor - they will be 157 // ignored. 158 159 // 3. All of the following functions must throw an AssertionError 160 // when a corresponding condition is not met, with a message that 161 // may be undefined if not provided. All assertion methods provide 162 // both the actual and expected values to the assertion error for 163 // display purposes. 164 165 function fail(actual, expected, message, operator, stackStartFunction) { 166 throw new assert.AssertionError({ 167 message: message, 168 actual: actual, 169 expected: expected, 170 operator: operator, 171 stackStartFunction: stackStartFunction 172 }); 173 } 174 175 // EXTENSION! allows for well behaved errors defined elsewhere. 176 assert.fail = fail; 177 178 // 4. Pure assertion tests whether a value is truthy, as determined 179 // by !!guard. 180 // assert.ok(guard, message_opt); 181 // This statement is equivalent to assert.equal(true, !!guard, 182 // message_opt);. To test strictly for the value true, use 183 // assert.strictEqual(true, guard, message_opt);. 184 185 function ok(value, message) { 186 if (!value) fail(value, true, message, '==', assert.ok); 187 } 188 assert.ok = ok; 189 190 // 5. The equality assertion tests shallow, coercive equality with 191 // ==. 192 // assert.equal(actual, expected, message_opt); 193 194 assert.equal = function equal(actual, expected, message) { 195 if (actual != expected) fail(actual, expected, message, '==', assert.equal); 196 }; 197 198 // 6. The non-equality assertion tests for whether two objects are not equal 199 // with != assert.notEqual(actual, expected, message_opt); 200 201 assert.notEqual = function notEqual(actual, expected, message) { 202 if (actual == expected) { 203 fail(actual, expected, message, '!=', assert.notEqual); 204 } 205 }; 206 207 // 7. The equivalence assertion tests a deep equality relation. 208 // assert.deepEqual(actual, expected, message_opt); 209 210 assert.deepEqual = function deepEqual(actual, expected, message) { 211 if (!_deepEqual(actual, expected)) { 212 fail(actual, expected, message, 'deepEqual', assert.deepEqual); 213 } 214 }; 215 216 function _deepEqual(actual, expected) { 217 // 7.1. All identical values are equivalent, as determined by ===. 218 if (actual === expected) { 219 return true; 220 221 } else if (util.isBuffer(actual) && util.isBuffer(expected)) { 222 if (actual.length != expected.length) return false; 223 224 for (var i = 0; i < actual.length; i++) { 225 if (actual[i] !== expected[i]) return false; 226 } 227 228 return true; 229 230 // 7.2. If the expected value is a Date object, the actual value is 231 // equivalent if it is also a Date object that refers to the same time. 232 } else if (util.isDate(actual) && util.isDate(expected)) { 233 return actual.getTime() === expected.getTime(); 234 235 // 7.3 If the expected value is a RegExp object, the actual value is 236 // equivalent if it is also a RegExp object with the same source and 237 // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). 238 } else if (util.isRegExp(actual) && util.isRegExp(expected)) { 239 return actual.source === expected.source && 240 actual.global === expected.global && 241 actual.multiline === expected.multiline && 242 actual.lastIndex === expected.lastIndex && 243 actual.ignoreCase === expected.ignoreCase; 244 245 // 7.4. Other pairs that do not both pass typeof value == 'object', 246 // equivalence is determined by ==. 247 } else if (!util.isObject(actual) && !util.isObject(expected)) { 248 return actual == expected; 249 250 // 7.5 For all other Object pairs, including Array objects, equivalence is 251 // determined by having the same number of owned properties (as verified 252 // with Object.prototype.hasOwnProperty.call), the same set of keys 253 // (although not necessarily the same order), equivalent values for every 254 // corresponding key, and an identical 'prototype' property. Note: this 255 // accounts for both named and indexed properties on Arrays. 256 } else { 257 return objEquiv(actual, expected); 258 } 259 } 260 261 function isArguments(object) { 262 return Object.prototype.toString.call(object) == '[object Arguments]'; 263 } 264 265 function objEquiv(a, b) { 266 if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) 267 return false; 268 // an identical 'prototype' property. 269 if (a.prototype !== b.prototype) return false; 270 // if one is a primitive, the other must be same 271 if (util.isPrimitive(a) || util.isPrimitive(b)) { 272 return a === b; 273 } 274 var aIsArgs = isArguments(a), 275 bIsArgs = isArguments(b); 276 if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) 277 return false; 278 if (aIsArgs) { 279 a = pSlice.call(a); 280 b = pSlice.call(b); 281 return _deepEqual(a, b); 282 } 283 var ka = objectKeys(a), 284 kb = objectKeys(b), 285 key, i; 286 // having the same number of owned properties (keys incorporates 287 // hasOwnProperty) 288 if (ka.length != kb.length) 289 return false; 290 //the same set of keys (although not necessarily the same order), 291 ka.sort(); 292 kb.sort(); 293 //~~~cheap key test 294 for (i = ka.length - 1; i >= 0; i--) { 295 if (ka[i] != kb[i]) 296 return false; 297 } 298 //equivalent values for every corresponding key, and 299 //~~~possibly expensive deep test 300 for (i = ka.length - 1; i >= 0; i--) { 301 key = ka[i]; 302 if (!_deepEqual(a[key], b[key])) return false; 303 } 304 return true; 305 } 306 307 // 8. The non-equivalence assertion tests for any deep inequality. 308 // assert.notDeepEqual(actual, expected, message_opt); 309 310 assert.notDeepEqual = function notDeepEqual(actual, expected, message) { 311 if (_deepEqual(actual, expected)) { 312 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); 313 } 314 }; 315 316 // 9. The strict equality assertion tests strict equality, as determined by ===. 317 // assert.strictEqual(actual, expected, message_opt); 318 319 assert.strictEqual = function strictEqual(actual, expected, message) { 320 if (actual !== expected) { 321 fail(actual, expected, message, '===', assert.strictEqual); 322 } 323 }; 324 325 // 10. The strict non-equality assertion tests for strict inequality, as 326 // determined by !==. assert.notStrictEqual(actual, expected, message_opt); 327 328 assert.notStrictEqual = function notStrictEqual(actual, expected, message) { 329 if (actual === expected) { 330 fail(actual, expected, message, '!==', assert.notStrictEqual); 331 } 332 }; 333 334 function expectedException(actual, expected) { 335 if (!actual || !expected) { 336 return false; 337 } 338 339 if (Object.prototype.toString.call(expected) == '[object RegExp]') { 340 return expected.test(actual); 341 } else if (actual instanceof expected) { 342 return true; 343 } else if (expected.call({}, actual) === true) { 344 return true; 345 } 346 347 return false; 348 } 349 350 function _throws(shouldThrow, block, expected, message) { 351 var actual; 352 353 if (util.isString(expected)) { 354 message = expected; 355 expected = null; 356 } 357 358 try { 359 block(); 360 } catch (e) { 361 actual = e; 362 } 363 364 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + 365 (message ? ' ' + message : '.'); 366 367 if (shouldThrow && !actual) { 368 fail(actual, expected, 'Missing expected exception' + message); 369 } 370 371 if (!shouldThrow && expectedException(actual, expected)) { 372 fail(actual, expected, 'Got unwanted exception' + message); 373 } 374 375 if ((shouldThrow && actual && expected && 376 !expectedException(actual, expected)) || (!shouldThrow && actual)) { 377 throw actual; 378 } 379 } 380 381 // 11. Expected to throw an error: 382 // assert.throws(block, Error_opt, message_opt); 383 384 assert.throws = function(block, /*optional*/error, /*optional*/message) { 385 _throws.apply(this, [true].concat(pSlice.call(arguments))); 386 }; 387 388 // EXTENSION! This is annoying to write outside this module. 389 assert.doesNotThrow = function(block, /*optional*/message) { 390 _throws.apply(this, [false].concat(pSlice.call(arguments))); 391 }; 392 393 assert.ifError = function(err) { if (err) {throw err;}}; 394 395 var objectKeys = Object.keys || function (obj) { 396 var keys = []; 397 for (var key in obj) { 398 if (hasOwn.call(obj, key)) keys.push(key); 399 } 400 return keys; 401 }; 402 403 },{"util/":9}],5:[function(require,module,exports){ 404 // Copyright Joyent, Inc. and other Node contributors. 405 // 406 // Permission is hereby granted, free of charge, to any person obtaining a 407 // copy of this software and associated documentation files (the 408 // "Software"), to deal in the Software without restriction, including 409 // without limitation the rights to use, copy, modify, merge, publish, 410 // distribute, sublicense, and/or sell copies of the Software, and to permit 411 // persons to whom the Software is furnished to do so, subject to the 412 // following conditions: 413 // 414 // The above copyright notice and this permission notice shall be included 415 // in all copies or substantial portions of the Software. 416 // 417 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 418 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 419 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 420 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 421 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 422 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 423 // USE OR OTHER DEALINGS IN THE SOFTWARE. 424 425 function EventEmitter() { 426 this._events = this._events || {}; 427 this._maxListeners = this._maxListeners || undefined; 428 } 429 module.exports = EventEmitter; 430 431 // Backwards-compat with node 0.10.x 432 EventEmitter.EventEmitter = EventEmitter; 433 434 EventEmitter.prototype._events = undefined; 435 EventEmitter.prototype._maxListeners = undefined; 436 437 // By default EventEmitters will print a warning if more than 10 listeners are 438 // added to it. This is a useful default which helps finding memory leaks. 439 EventEmitter.defaultMaxListeners = 10; 440 441 // Obviously not all Emitters should be limited to 10. This function allows 442 // that to be increased. Set to zero for unlimited. 443 EventEmitter.prototype.setMaxListeners = function(n) { 444 if (!isNumber(n) || n < 0 || isNaN(n)) 445 throw TypeError('n must be a positive number'); 446 this._maxListeners = n; 447 return this; 448 }; 449 450 EventEmitter.prototype.emit = function(type) { 451 var er, handler, len, args, i, listeners; 452 453 if (!this._events) 454 this._events = {}; 455 456 // If there is no 'error' event listener then throw. 457 if (type === 'error') { 458 if (!this._events.error || 459 (isObject(this._events.error) && !this._events.error.length)) { 460 er = arguments[1]; 461 if (er instanceof Error) { 462 throw er; // Unhandled 'error' event 463 } 464 throw TypeError('Uncaught, unspecified "error" event.'); 465 } 466 } 467 468 handler = this._events[type]; 469 470 if (isUndefined(handler)) 471 return false; 472 473 if (isFunction(handler)) { 474 switch (arguments.length) { 475 // fast cases 476 case 1: 477 handler.call(this); 478 break; 479 case 2: 480 handler.call(this, arguments[1]); 481 break; 482 case 3: 483 handler.call(this, arguments[1], arguments[2]); 484 break; 485 // slower 486 default: 487 len = arguments.length; 488 args = new Array(len - 1); 489 for (i = 1; i < len; i++) 490 args[i - 1] = arguments[i]; 491 handler.apply(this, args); 492 } 493 } else if (isObject(handler)) { 494 len = arguments.length; 495 args = new Array(len - 1); 496 for (i = 1; i < len; i++) 497 args[i - 1] = arguments[i]; 498 499 listeners = handler.slice(); 500 len = listeners.length; 501 for (i = 0; i < len; i++) 502 listeners[i].apply(this, args); 503 } 504 505 return true; 506 }; 507 508 EventEmitter.prototype.addListener = function(type, listener) { 509 var m; 510 511 if (!isFunction(listener)) 512 throw TypeError('listener must be a function'); 513 514 if (!this._events) 515 this._events = {}; 516 517 // To avoid recursion in the case that type === "newListener"! Before 518 // adding it to the listeners, first emit "newListener". 519 if (this._events.newListener) 520 this.emit('newListener', type, 521 isFunction(listener.listener) ? 522 listener.listener : listener); 523 524 if (!this._events[type]) 525 // Optimize the case of one listener. Don't need the extra array object. 526 this._events[type] = listener; 527 else if (isObject(this._events[type])) 528 // If we've already got an array, just append. 529 this._events[type].push(listener); 530 else 531 // Adding the second element, need to change to array. 532 this._events[type] = [this._events[type], listener]; 533 534 // Check for listener leak 535 if (isObject(this._events[type]) && !this._events[type].warned) { 536 var m; 537 if (!isUndefined(this._maxListeners)) { 538 m = this._maxListeners; 539 } else { 540 m = EventEmitter.defaultMaxListeners; 541 } 542 543 if (m && m > 0 && this._events[type].length > m) { 544 this._events[type].warned = true; 545 console.error('(node) warning: possible EventEmitter memory ' + 546 'leak detected. %d listeners added. ' + 547 'Use emitter.setMaxListeners() to increase limit.', 548 this._events[type].length); 549 if (typeof console.trace === 'function') { 550 // not supported in IE 10 551 console.trace(); 552 } 553 } 554 } 555 556 return this; 557 }; 558 559 EventEmitter.prototype.on = EventEmitter.prototype.addListener; 560 561 EventEmitter.prototype.once = function(type, listener) { 562 if (!isFunction(listener)) 563 throw TypeError('listener must be a function'); 564 565 var fired = false; 566 567 function g() { 568 this.removeListener(type, g); 569 570 if (!fired) { 571 fired = true; 572 listener.apply(this, arguments); 573 } 574 } 575 576 g.listener = listener; 577 this.on(type, g); 578 579 return this; 580 }; 581 582 // emits a 'removeListener' event iff the listener was removed 583 EventEmitter.prototype.removeListener = function(type, listener) { 584 var list, position, length, i; 585 586 if (!isFunction(listener)) 587 throw TypeError('listener must be a function'); 588 589 if (!this._events || !this._events[type]) 590 return this; 591 592 list = this._events[type]; 593 length = list.length; 594 position = -1; 595 596 if (list === listener || 597 (isFunction(list.listener) && list.listener === listener)) { 598 delete this._events[type]; 599 if (this._events.removeListener) 600 this.emit('removeListener', type, listener); 601 602 } else if (isObject(list)) { 603 for (i = length; i-- > 0;) { 604 if (list[i] === listener || 605 (list[i].listener && list[i].listener === listener)) { 606 position = i; 607 break; 608 } 609 } 610 611 if (position < 0) 612 return this; 613 614 if (list.length === 1) { 615 list.length = 0; 616 delete this._events[type]; 617 } else { 618 list.splice(position, 1); 619 } 620 621 if (this._events.removeListener) 622 this.emit('removeListener', type, listener); 623 } 624 625 return this; 626 }; 627 628 EventEmitter.prototype.removeAllListeners = function(type) { 629 var key, listeners; 630 631 if (!this._events) 632 return this; 633 634 // not listening for removeListener, no need to emit 635 if (!this._events.removeListener) { 636 if (arguments.length === 0) 637 this._events = {}; 638 else if (this._events[type]) 639 delete this._events[type]; 640 return this; 641 } 642 643 // emit removeListener for all listeners on all events 644 if (arguments.length === 0) { 645 for (key in this._events) { 646 if (key === 'removeListener') continue; 647 this.removeAllListeners(key); 648 } 649 this.removeAllListeners('removeListener'); 650 this._events = {}; 651 return this; 652 } 653 654 listeners = this._events[type]; 655 656 if (isFunction(listeners)) { 657 this.removeListener(type, listeners); 658 } else { 659 // LIFO order 660 while (listeners.length) 661 this.removeListener(type, listeners[listeners.length - 1]); 662 } 663 delete this._events[type]; 664 665 return this; 666 }; 667 668 EventEmitter.prototype.listeners = function(type) { 669 var ret; 670 if (!this._events || !this._events[type]) 671 ret = []; 672 else if (isFunction(this._events[type])) 673 ret = [this._events[type]]; 674 else 675 ret = this._events[type].slice(); 676 return ret; 677 }; 678 679 EventEmitter.listenerCount = function(emitter, type) { 680 var ret; 681 if (!emitter._events || !emitter._events[type]) 682 ret = 0; 683 else if (isFunction(emitter._events[type])) 684 ret = 1; 685 else 686 ret = emitter._events[type].length; 687 return ret; 688 }; 689 690 function isFunction(arg) { 691 return typeof arg === 'function'; 692 } 693 694 function isNumber(arg) { 695 return typeof arg === 'number'; 696 } 697 698 function isObject(arg) { 699 return typeof arg === 'object' && arg !== null; 700 } 701 702 function isUndefined(arg) { 703 return arg === void 0; 704 } 705 706 },{}],6:[function(require,module,exports){ 707 // shim for using process in browser 708 709 var process = module.exports = {}; 710 var queue = []; 711 var draining = false; 712 713 function drainQueue() { 714 if (draining) { 715 return; 716 } 717 draining = true; 718 var currentQueue; 719 var len = queue.length; 720 while(len) { 721 currentQueue = queue; 722 queue = []; 723 var i = -1; 724 while (++i < len) { 725 currentQueue[i](); 726 } 727 len = queue.length; 728 } 729 draining = false; 730 } 731 process.nextTick = function (fun) { 732 queue.push(fun); 733 if (!draining) { 734 setTimeout(drainQueue, 0); 735 } 736 }; 737 738 process.title = 'browser'; 739 process.browser = true; 740 process.env = {}; 741 process.argv = []; 742 process.version = ''; // empty string to avoid regexp issues 743 process.versions = {}; 744 745 function noop() {} 746 747 process.on = noop; 748 process.addListener = noop; 749 process.once = noop; 750 process.off = noop; 751 process.removeListener = noop; 752 process.removeAllListeners = noop; 753 process.emit = noop; 754 755 process.binding = function (name) { 756 throw new Error('process.binding is not supported'); 757 }; 758 759 // TODO(shtylman) 760 process.cwd = function () { return '/' }; 761 process.chdir = function (dir) { 762 throw new Error('process.chdir is not supported'); 763 }; 764 process.umask = function() { return 0; }; 765 766 },{}],7:[function(require,module,exports){ 767 if (typeof Object.create === 'function') { 768 // implementation from standard node.js 'util' module 769 module.exports = function inherits(ctor, superCtor) { 770 ctor.super_ = superCtor 771 ctor.prototype = Object.create(superCtor.prototype, { 772 constructor: { 773 value: ctor, 774 enumerable: false, 775 writable: true, 776 configurable: true 777 } 778 }); 779 }; 780 } else { 781 // old school shim for old browsers 782 module.exports = function inherits(ctor, superCtor) { 783 ctor.super_ = superCtor 784 var TempCtor = function () {} 785 TempCtor.prototype = superCtor.prototype 786 ctor.prototype = new TempCtor() 787 ctor.prototype.constructor = ctor 788 } 789 } 790 791 },{}],8:[function(require,module,exports){ 792 module.exports = function isBuffer(arg) { 793 return arg && typeof arg === 'object' 794 && typeof arg.copy === 'function' 795 && typeof arg.fill === 'function' 796 && typeof arg.readUInt8 === 'function'; 797 } 798 },{}],9:[function(require,module,exports){ 799 (function (process,global){ 800 // Copyright Joyent, Inc. and other Node contributors. 801 // 802 // Permission is hereby granted, free of charge, to any person obtaining a 803 // copy of this software and associated documentation files (the 804 // "Software"), to deal in the Software without restriction, including 805 // without limitation the rights to use, copy, modify, merge, publish, 806 // distribute, sublicense, and/or sell copies of the Software, and to permit 807 // persons to whom the Software is furnished to do so, subject to the 808 // following conditions: 809 // 810 // The above copyright notice and this permission notice shall be included 811 // in all copies or substantial portions of the Software. 812 // 813 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 814 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 815 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 816 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 817 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 818 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 819 // USE OR OTHER DEALINGS IN THE SOFTWARE. 820 821 var formatRegExp = /%[sdj%]/g; 822 exports.format = function(f) { 823 if (!isString(f)) { 824 var objects = []; 825 for (var i = 0; i < arguments.length; i++) { 826 objects.push(inspect(arguments[i])); 827 } 828 return objects.join(' '); 829 } 830 831 var i = 1; 832 var args = arguments; 833 var len = args.length; 834 var str = String(f).replace(formatRegExp, function(x) { 835 if (x === '%%') return '%'; 836 if (i >= len) return x; 837 switch (x) { 838 case '%s': return String(args[i++]); 839 case '%d': return Number(args[i++]); 840 case '%j': 841 try { 842 return JSON.stringify(args[i++]); 843 } catch (_) { 844 return '[Circular]'; 845 } 846 default: 847 return x; 848 } 849 }); 850 for (var x = args[i]; i < len; x = args[++i]) { 851 if (isNull(x) || !isObject(x)) { 852 str += ' ' + x; 853 } else { 854 str += ' ' + inspect(x); 855 } 856 } 857 return str; 858 }; 859 860 861 // Mark that a method should not be used. 862 // Returns a modified function which warns once by default. 863 // If --no-deprecation is set, then it is a no-op. 864 exports.deprecate = function(fn, msg) { 865 // Allow for deprecating things in the process of starting up. 866 if (isUndefined(global.process)) { 867 return function() { 868 return exports.deprecate(fn, msg).apply(this, arguments); 869 }; 870 } 871 872 if (process.noDeprecation === true) { 873 return fn; 874 } 875 876 var warned = false; 877 function deprecated() { 878 if (!warned) { 879 if (process.throwDeprecation) { 880 throw new Error(msg); 881 } else if (process.traceDeprecation) { 882 console.trace(msg); 883 } else { 884 console.error(msg); 885 } 886 warned = true; 887 } 888 return fn.apply(this, arguments); 889 } 890 891 return deprecated; 892 }; 893 894 895 var debugs = {}; 896 var debugEnviron; 897 exports.debuglog = function(set) { 898 if (isUndefined(debugEnviron)) 899 debugEnviron = process.env.NODE_DEBUG || ''; 900 set = set.toUpperCase(); 901 if (!debugs[set]) { 902 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { 903 var pid = process.pid; 904 debugs[set] = function() { 905 var msg = exports.format.apply(exports, arguments); 906 console.error('%s %d: %s', set, pid, msg); 907 }; 908 } else { 909 debugs[set] = function() {}; 910 } 911 } 912 return debugs[set]; 913 }; 914 915 916 /** 917 * Echos the value of a value. Trys to print the value out 918 * in the best way possible given the different types. 919 * 920 * @param {Object} obj The object to print out. 921 * @param {Object} opts Optional options object that alters the output. 922 */ 923 /* legacy: obj, showHidden, depth, colors*/ 924 function inspect(obj, opts) { 925 // default options 926 var ctx = { 927 seen: [], 928 stylize: stylizeNoColor 929 }; 930 // legacy... 931 if (arguments.length >= 3) ctx.depth = arguments[2]; 932 if (arguments.length >= 4) ctx.colors = arguments[3]; 933 if (isBoolean(opts)) { 934 // legacy... 935 ctx.showHidden = opts; 936 } else if (opts) { 937 // got an "options" object 938 exports._extend(ctx, opts); 939 } 940 // set default options 941 if (isUndefined(ctx.showHidden)) ctx.showHidden = false; 942 if (isUndefined(ctx.depth)) ctx.depth = 2; 943 if (isUndefined(ctx.colors)) ctx.colors = false; 944 if (isUndefined(ctx.customInspect)) ctx.customInspect = true; 945 if (ctx.colors) ctx.stylize = stylizeWithColor; 946 return formatValue(ctx, obj, ctx.depth); 947 } 948 exports.inspect = inspect; 949 950 951 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics 952 inspect.colors = { 953 'bold' : [1, 22], 954 'italic' : [3, 23], 955 'underline' : [4, 24], 956 'inverse' : [7, 27], 957 'white' : [37, 39], 958 'grey' : [90, 39], 959 'black' : [30, 39], 960 'blue' : [34, 39], 961 'cyan' : [36, 39], 962 'green' : [32, 39], 963 'magenta' : [35, 39], 964 'red' : [31, 39], 965 'yellow' : [33, 39] 966 }; 967 968 // Don't use 'blue' not visible on cmd.exe 969 inspect.styles = { 970 'special': 'cyan', 971 'number': 'yellow', 972 'boolean': 'yellow', 973 'undefined': 'grey', 974 'null': 'bold', 975 'string': 'green', 976 'date': 'magenta', 977 // "name": intentionally not styling 978 'regexp': 'red' 979 }; 980 981 982 function stylizeWithColor(str, styleType) { 983 var style = inspect.styles[styleType]; 984 985 if (style) { 986 return '\u001b[' + inspect.colors[style][0] + 'm' + str + 987 '\u001b[' + inspect.colors[style][1] + 'm'; 988 } else { 989 return str; 990 } 991 } 992 993 994 function stylizeNoColor(str, styleType) { 995 return str; 996 } 997 998 999 function arrayToHash(array) { 1000 var hash = {}; 1001 1002 array.forEach(function(val, idx) { 1003 hash[val] = true; 1004 }); 1005 1006 return hash; 1007 } 1008 1009 1010 function formatValue(ctx, value, recurseTimes) { 1011 // Provide a hook for user-specified inspect functions. 1012 // Check that value is an object with an inspect function on it 1013 if (ctx.customInspect && 1014 value && 1015 isFunction(value.inspect) && 1016 // Filter out the util module, it's inspect function is special 1017 value.inspect !== exports.inspect && 1018 // Also filter out any prototype objects using the circular check. 1019 !(value.constructor && value.constructor.prototype === value)) { 1020 var ret = value.inspect(recurseTimes, ctx); 1021 if (!isString(ret)) { 1022 ret = formatValue(ctx, ret, recurseTimes); 1023 } 1024 return ret; 1025 } 1026 1027 // Primitive types cannot have properties 1028 var primitive = formatPrimitive(ctx, value); 1029 if (primitive) { 1030 return primitive; 1031 } 1032 1033 // Look up the keys of the object. 1034 var keys = Object.keys(value); 1035 var visibleKeys = arrayToHash(keys); 1036 1037 if (ctx.showHidden) { 1038 keys = Object.getOwnPropertyNames(value); 1039 } 1040 1041 // IE doesn't make error fields non-enumerable 1042 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx 1043 if (isError(value) 1044 && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { 1045 return formatError(value); 1046 } 1047 1048 // Some type of object without properties can be shortcutted. 1049 if (keys.length === 0) { 1050 if (isFunction(value)) { 1051 var name = value.name ? ': ' + value.name : ''; 1052 return ctx.stylize('[Function' + name + ']', 'special'); 1053 } 1054 if (isRegExp(value)) { 1055 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); 1056 } 1057 if (isDate(value)) { 1058 return ctx.stylize(Date.prototype.toString.call(value), 'date'); 1059 } 1060 if (isError(value)) { 1061 return formatError(value); 1062 } 1063 } 1064 1065 var base = '', array = false, braces = ['{', '}']; 1066 1067 // Make Array say that they are Array 1068 if (isArray(value)) { 1069 array = true; 1070 braces = ['[', ']']; 1071 } 1072 1073 // Make functions say that they are functions 1074 if (isFunction(value)) { 1075 var n = value.name ? ': ' + value.name : ''; 1076 base = ' [Function' + n + ']'; 1077 } 1078 1079 // Make RegExps say that they are RegExps 1080 if (isRegExp(value)) { 1081 base = ' ' + RegExp.prototype.toString.call(value); 1082 } 1083 1084 // Make dates with properties first say the date 1085 if (isDate(value)) { 1086 base = ' ' + Date.prototype.toUTCString.call(value); 1087 } 1088 1089 // Make error with message first say the error 1090 if (isError(value)) { 1091 base = ' ' + formatError(value); 1092 } 1093 1094 if (keys.length === 0 && (!array || value.length == 0)) { 1095 return braces[0] + base + braces[1]; 1096 } 1097 1098 if (recurseTimes < 0) { 1099 if (isRegExp(value)) { 1100 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); 1101 } else { 1102 return ctx.stylize('[Object]', 'special'); 1103 } 1104 } 1105 1106 ctx.seen.push(value); 1107 1108 var output; 1109 if (array) { 1110 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); 1111 } else { 1112 output = keys.map(function(key) { 1113 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); 1114 }); 1115 } 1116 1117 ctx.seen.pop(); 1118 1119 return reduceToSingleString(output, base, braces); 1120 } 1121 1122 1123 function formatPrimitive(ctx, value) { 1124 if (isUndefined(value)) 1125 return ctx.stylize('undefined', 'undefined'); 1126 if (isString(value)) { 1127 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') 1128 .replace(/'/g, "\\'") 1129 .replace(/\\"/g, '"') + '\''; 1130 return ctx.stylize(simple, 'string'); 1131 } 1132 if (isNumber(value)) 1133 return ctx.stylize('' + value, 'number'); 1134 if (isBoolean(value)) 1135 return ctx.stylize('' + value, 'boolean'); 1136 // For some reason typeof null is "object", so special case here. 1137 if (isNull(value)) 1138 return ctx.stylize('null', 'null'); 1139 } 1140 1141 1142 function formatError(value) { 1143 return '[' + Error.prototype.toString.call(value) + ']'; 1144 } 1145 1146 1147 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { 1148 var output = []; 1149 for (var i = 0, l = value.length; i < l; ++i) { 1150 if (hasOwnProperty(value, String(i))) { 1151 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, 1152 String(i), true)); 1153 } else { 1154 output.push(''); 1155 } 1156 } 1157 keys.forEach(function(key) { 1158 if (!key.match(/^\d+$/)) { 1159 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, 1160 key, true)); 1161 } 1162 }); 1163 return output; 1164 } 1165 1166 1167 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { 1168 var name, str, desc; 1169 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; 1170 if (desc.get) { 1171 if (desc.set) { 1172 str = ctx.stylize('[Getter/Setter]', 'special'); 1173 } else { 1174 str = ctx.stylize('[Getter]', 'special'); 1175 } 1176 } else { 1177 if (desc.set) { 1178 str = ctx.stylize('[Setter]', 'special'); 1179 } 1180 } 1181 if (!hasOwnProperty(visibleKeys, key)) { 1182 name = '[' + key + ']'; 1183 } 1184 if (!str) { 1185 if (ctx.seen.indexOf(desc.value) < 0) { 1186 if (isNull(recurseTimes)) { 1187 str = formatValue(ctx, desc.value, null); 1188 } else { 1189 str = formatValue(ctx, desc.value, recurseTimes - 1); 1190 } 1191 if (str.indexOf('\n') > -1) { 1192 if (array) { 1193 str = str.split('\n').map(function(line) { 1194 return ' ' + line; 1195 }).join('\n').substr(2); 1196 } else { 1197 str = '\n' + str.split('\n').map(function(line) { 1198 return ' ' + line; 1199 }).join('\n'); 1200 } 1201 } 1202 } else { 1203 str = ctx.stylize('[Circular]', 'special'); 1204 } 1205 } 1206 if (isUndefined(name)) { 1207 if (array && key.match(/^\d+$/)) { 1208 return str; 1209 } 1210 name = JSON.stringify('' + key); 1211 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { 1212 name = name.substr(1, name.length - 2); 1213 name = ctx.stylize(name, 'name'); 1214 } else { 1215 name = name.replace(/'/g, "\\'") 1216 .replace(/\\"/g, '"') 1217 .replace(/(^"|"$)/g, "'"); 1218 name = ctx.stylize(name, 'string'); 1219 } 1220 } 1221 1222 return name + ': ' + str; 1223 } 1224 1225 1226 function reduceToSingleString(output, base, braces) { 1227 var numLinesEst = 0; 1228 var length = output.reduce(function(prev, cur) { 1229 numLinesEst++; 1230 if (cur.indexOf('\n') >= 0) numLinesEst++; 1231 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; 1232 }, 0); 1233 1234 if (length > 60) { 1235 return braces[0] + 1236 (base === '' ? '' : base + '\n ') + 1237 ' ' + 1238 output.join(',\n ') + 1239 ' ' + 1240 braces[1]; 1241 } 1242 1243 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; 1244 } 1245 1246 1247 // NOTE: These type checking functions intentionally don't use `instanceof` 1248 // because it is fragile and can be easily faked with `Object.create()`. 1249 function isArray(ar) { 1250 return Array.isArray(ar); 1251 } 1252 exports.isArray = isArray; 1253 1254 function isBoolean(arg) { 1255 return typeof arg === 'boolean'; 1256 } 1257 exports.isBoolean = isBoolean; 1258 1259 function isNull(arg) { 1260 return arg === null; 1261 } 1262 exports.isNull = isNull; 1263 1264 function isNullOrUndefined(arg) { 1265 return arg == null; 1266 } 1267 exports.isNullOrUndefined = isNullOrUndefined; 1268 1269 function isNumber(arg) { 1270 return typeof arg === 'number'; 1271 } 1272 exports.isNumber = isNumber; 1273 1274 function isString(arg) { 1275 return typeof arg === 'string'; 1276 } 1277 exports.isString = isString; 1278 1279 function isSymbol(arg) { 1280 return typeof arg === 'symbol'; 1281 } 1282 exports.isSymbol = isSymbol; 1283 1284 function isUndefined(arg) { 1285 return arg === void 0; 1286 } 1287 exports.isUndefined = isUndefined; 1288 1289 function isRegExp(re) { 1290 return isObject(re) && objectToString(re) === '[object RegExp]'; 1291 } 1292 exports.isRegExp = isRegExp; 1293 1294 function isObject(arg) { 1295 return typeof arg === 'object' && arg !== null; 1296 } 1297 exports.isObject = isObject; 1298 1299 function isDate(d) { 1300 return isObject(d) && objectToString(d) === '[object Date]'; 1301 } 1302 exports.isDate = isDate; 1303 1304 function isError(e) { 1305 return isObject(e) && 1306 (objectToString(e) === '[object Error]' || e instanceof Error); 1307 } 1308 exports.isError = isError; 1309 1310 function isFunction(arg) { 1311 return typeof arg === 'function'; 1312 } 1313 exports.isFunction = isFunction; 1314 1315 function isPrimitive(arg) { 1316 return arg === null || 1317 typeof arg === 'boolean' || 1318 typeof arg === 'number' || 1319 typeof arg === 'string' || 1320 typeof arg === 'symbol' || // ES6 symbol 1321 typeof arg === 'undefined'; 1322 } 1323 exports.isPrimitive = isPrimitive; 1324 1325 exports.isBuffer = require('./support/isBuffer'); 1326 1327 function objectToString(o) { 1328 return Object.prototype.toString.call(o); 1329 } 1330 1331 1332 function pad(n) { 1333 return n < 10 ? '0' + n.toString(10) : n.toString(10); 1334 } 1335 1336 1337 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 1338 'Oct', 'Nov', 'Dec']; 1339 1340 // 26 Feb 16:19:34 1341 function timestamp() { 1342 var d = new Date(); 1343 var time = [pad(d.getHours()), 1344 pad(d.getMinutes()), 1345 pad(d.getSeconds())].join(':'); 1346 return [d.getDate(), months[d.getMonth()], time].join(' '); 1347 } 1348 1349 1350 // log is just a thin wrapper to console.log that prepends a timestamp 1351 exports.log = function() { 1352 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); 1353 }; 1354 1355 1356 /** 1357 * Inherit the prototype methods from one constructor into another. 1358 * 1359 * The Function.prototype.inherits from lang.js rewritten as a standalone 1360 * function (not on Function.prototype). NOTE: If this file is to be loaded 1361 * during bootstrapping this function needs to be rewritten using some native 1362 * functions as prototype setup using normal JavaScript does not work as 1363 * expected during bootstrapping (see mirror.js in r114903). 1364 * 1365 * @param {function} ctor Constructor function which needs to inherit the 1366 * prototype. 1367 * @param {function} superCtor Constructor function to inherit prototype from. 1368 */ 1369 exports.inherits = require('inherits'); 1370 1371 exports._extend = function(origin, add) { 1372 // Don't do anything if add isn't an object 1373 if (!add || !isObject(add)) return origin; 1374 1375 var keys = Object.keys(add); 1376 var i = keys.length; 1377 while (i--) { 1378 origin[keys[i]] = add[keys[i]]; 1379 } 1380 return origin; 1381 }; 1382 1383 function hasOwnProperty(obj, prop) { 1384 return Object.prototype.hasOwnProperty.call(obj, prop); 1385 } 1386 1387 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 1388 },{"./support/isBuffer":8,"_process":6,"inherits":7}],10:[function(require,module,exports){ 1389 (function (global){ 1390 /*global window, global*/ 1391 var util = require("util") 1392 var assert = require("assert") 1393 var now = require("date-now") 1394 1395 var slice = Array.prototype.slice 1396 var console 1397 var times = {} 1398 1399 if (typeof global !== "undefined" && global.console) { 1400 console = global.console 1401 } else if (typeof window !== "undefined" && window.console) { 1402 console = window.console 1403 } else { 1404 console = {} 1405 } 1406 1407 var functions = [ 1408 [log, "log"], 1409 [info, "info"], 1410 [warn, "warn"], 1411 [error, "error"], 1412 [time, "time"], 1413 [timeEnd, "timeEnd"], 1414 [trace, "trace"], 1415 [dir, "dir"], 1416 [consoleAssert, "assert"] 1417 ] 1418 1419 for (var i = 0; i < functions.length; i++) { 1420 var tuple = functions[i] 1421 var f = tuple[0] 1422 var name = tuple[1] 1423 1424 if (!console[name]) { 1425 console[name] = f 1426 } 1427 } 1428 1429 module.exports = console 1430 1431 function log() {} 1432 1433 function info() { 1434 console.log.apply(console, arguments) 1435 } 1436 1437 function warn() { 1438 console.log.apply(console, arguments) 1439 } 1440 1441 function error() { 1442 console.warn.apply(console, arguments) 1443 } 1444 1445 function time(label) { 1446 times[label] = now() 1447 } 1448 1449 function timeEnd(label) { 1450 var time = times[label] 1451 if (!time) { 1452 throw new Error("No such label: " + label) 1453 } 1454 1455 var duration = now() - time 1456 console.log(label + ": " + duration + "ms") 1457 } 1458 1459 function trace() { 1460 var err = new Error() 1461 err.name = "Trace" 1462 err.message = util.format.apply(null, arguments) 1463 console.error(err.stack) 1464 } 1465 1466 function dir(object) { 1467 console.log(util.inspect(object) + "\n") 1468 } 1469 1470 function consoleAssert(expression) { 1471 if (!expression) { 1472 var arr = slice.call(arguments, 1) 1473 assert.ok(false, util.format.apply(null, arr)) 1474 } 1475 } 1476 1477 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 1478 },{"assert":4,"date-now":11,"util":9}],11:[function(require,module,exports){ 1479 module.exports = now 1480 1481 function now() { 1482 return new Date().getTime() 1483 } 1484 1485 },{}],12:[function(require,module,exports){ 1486 (function (global){ 1487 /** 1488 * @license 1489 * lodash 3.7.0 (Custom Build) <https://lodash.com/> 1490 * Build: `lodash modern -d -o ./index.js` 1491 * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/> 1492 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> 1493 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 1494 * Available under MIT license <https://lodash.com/license> 1495 */ 1496 ;(function() { 1497 1498 /** Used as a safe reference for `undefined` in pre-ES5 environments. */ 1499 var undefined; 1500 1501 /** Used as the semantic version number. */ 1502 var VERSION = '3.7.0'; 1503 1504 /** Used to compose bitmasks for wrapper metadata. */ 1505 var BIND_FLAG = 1, 1506 BIND_KEY_FLAG = 2, 1507 CURRY_BOUND_FLAG = 4, 1508 CURRY_FLAG = 8, 1509 CURRY_RIGHT_FLAG = 16, 1510 PARTIAL_FLAG = 32, 1511 PARTIAL_RIGHT_FLAG = 64, 1512 ARY_FLAG = 128, 1513 REARG_FLAG = 256; 1514 1515 /** Used as default options for `_.trunc`. */ 1516 var DEFAULT_TRUNC_LENGTH = 30, 1517 DEFAULT_TRUNC_OMISSION = '...'; 1518 1519 /** Used to detect when a function becomes hot. */ 1520 var HOT_COUNT = 150, 1521 HOT_SPAN = 16; 1522 1523 /** Used to indicate the type of lazy iteratees. */ 1524 var LAZY_DROP_WHILE_FLAG = 0, 1525 LAZY_FILTER_FLAG = 1, 1526 LAZY_MAP_FLAG = 2; 1527 1528 /** Used as the `TypeError` message for "Functions" methods. */ 1529 var FUNC_ERROR_TEXT = 'Expected a function'; 1530 1531 /** Used as the internal argument placeholder. */ 1532 var PLACEHOLDER = '__lodash_placeholder__'; 1533 1534 /** `Object#toString` result references. */ 1535 var argsTag = '[object Arguments]', 1536 arrayTag = '[object Array]', 1537 boolTag = '[object Boolean]', 1538 dateTag = '[object Date]', 1539 errorTag = '[object Error]', 1540 funcTag = '[object Function]', 1541 mapTag = '[object Map]', 1542 numberTag = '[object Number]', 1543 objectTag = '[object Object]', 1544 regexpTag = '[object RegExp]', 1545 setTag = '[object Set]', 1546 stringTag = '[object String]', 1547 weakMapTag = '[object WeakMap]'; 1548 1549 var arrayBufferTag = '[object ArrayBuffer]', 1550 float32Tag = '[object Float32Array]', 1551 float64Tag = '[object Float64Array]', 1552 int8Tag = '[object Int8Array]', 1553 int16Tag = '[object Int16Array]', 1554 int32Tag = '[object Int32Array]', 1555 uint8Tag = '[object Uint8Array]', 1556 uint8ClampedTag = '[object Uint8ClampedArray]', 1557 uint16Tag = '[object Uint16Array]', 1558 uint32Tag = '[object Uint32Array]'; 1559 1560 /** Used to match empty string literals in compiled template source. */ 1561 var reEmptyStringLeading = /\b__p \+= '';/g, 1562 reEmptyStringMiddle = /\b(__p \+=) '' \+/g, 1563 reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; 1564 1565 /** Used to match HTML entities and HTML characters. */ 1566 var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g, 1567 reUnescapedHtml = /[&<>"'`]/g, 1568 reHasEscapedHtml = RegExp(reEscapedHtml.source), 1569 reHasUnescapedHtml = RegExp(reUnescapedHtml.source); 1570 1571 /** Used to match template delimiters. */ 1572 var reEscape = /<%-([\s\S]+?)%>/g, 1573 reEvaluate = /<%([\s\S]+?)%>/g, 1574 reInterpolate = /<%=([\s\S]+?)%>/g; 1575 1576 /** Used to match property names within property paths. */ 1577 var reIsDeepProp = /\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/, 1578 reIsPlainProp = /^\w*$/, 1579 rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; 1580 1581 /** 1582 * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special). 1583 * In addition to special characters the forward slash is escaped to allow for 1584 * easier `eval` use and `Function` compilation. 1585 */ 1586 var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g, 1587 reHasRegExpChars = RegExp(reRegExpChars.source); 1588 1589 /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */ 1590 var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g; 1591 1592 /** Used to match backslashes in property paths. */ 1593 var reEscapeChar = /\\(\\)?/g; 1594 1595 /** Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components). */ 1596 var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; 1597 1598 /** Used to match `RegExp` flags from their coerced string values. */ 1599 var reFlags = /\w*$/; 1600 1601 /** Used to detect hexadecimal string values. */ 1602 var reHasHexPrefix = /^0[xX]/; 1603 1604 /** Used to detect host constructors (Safari > 5). */ 1605 var reIsHostCtor = /^\[object .+?Constructor\]$/; 1606 1607 /** Used to match latin-1 supplementary letters (excluding mathematical operators). */ 1608 var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g; 1609 1610 /** Used to ensure capturing order of template delimiters. */ 1611 var reNoMatch = /($^)/; 1612 1613 /** Used to match unescaped characters in compiled string literals. */ 1614 var reUnescapedString = /['\n\r\u2028\u2029\\]/g; 1615 1616 /** Used to match words to create compound words. */ 1617 var reWords = (function() { 1618 var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]', 1619 lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+'; 1620 1621 return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g'); 1622 }()); 1623 1624 /** Used to detect and test for whitespace. */ 1625 var whitespace = ( 1626 // Basic whitespace characters. 1627 ' \t\x0b\f\xa0\ufeff' + 1628 1629 // Line terminators. 1630 '\n\r\u2028\u2029' + 1631 1632 // Unicode category "Zs" space separators. 1633 '\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000' 1634 ); 1635 1636 /** Used to assign default `context` object properties. */ 1637 var contextProps = [ 1638 'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array', 1639 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number', 1640 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document', 1641 'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array', 1642 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', 1643 'window' 1644 ]; 1645 1646 /** Used to make template sourceURLs easier to identify. */ 1647 var templateCounter = -1; 1648 1649 /** Used to identify `toStringTag` values of typed arrays. */ 1650 var typedArrayTags = {}; 1651 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = 1652 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = 1653 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = 1654 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = 1655 typedArrayTags[uint32Tag] = true; 1656 typedArrayTags[argsTag] = typedArrayTags[arrayTag] = 1657 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = 1658 typedArrayTags[dateTag] = typedArrayTags[errorTag] = 1659 typedArrayTags[funcTag] = typedArrayTags[mapTag] = 1660 typedArrayTags[numberTag] = typedArrayTags[objectTag] = 1661 typedArrayTags[regexpTag] = typedArrayTags[setTag] = 1662 typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; 1663 1664 /** Used to identify `toStringTag` values supported by `_.clone`. */ 1665 var cloneableTags = {}; 1666 cloneableTags[argsTag] = cloneableTags[arrayTag] = 1667 cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = 1668 cloneableTags[dateTag] = cloneableTags[float32Tag] = 1669 cloneableTags[float64Tag] = cloneableTags[int8Tag] = 1670 cloneableTags[int16Tag] = cloneableTags[int32Tag] = 1671 cloneableTags[numberTag] = cloneableTags[objectTag] = 1672 cloneableTags[regexpTag] = cloneableTags[stringTag] = 1673 cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = 1674 cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; 1675 cloneableTags[errorTag] = cloneableTags[funcTag] = 1676 cloneableTags[mapTag] = cloneableTags[setTag] = 1677 cloneableTags[weakMapTag] = false; 1678 1679 /** Used as an internal `_.debounce` options object by `_.throttle`. */ 1680 var debounceOptions = { 1681 'leading': false, 1682 'maxWait': 0, 1683 'trailing': false 1684 }; 1685 1686 /** Used to map latin-1 supplementary letters to basic latin letters. */ 1687 var deburredLetters = { 1688 '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', 1689 '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', 1690 '\xc7': 'C', '\xe7': 'c', 1691 '\xd0': 'D', '\xf0': 'd', 1692 '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', 1693 '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', 1694 '\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', 1695 '\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', 1696 '\xd1': 'N', '\xf1': 'n', 1697 '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', 1698 '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', 1699 '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', 1700 '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', 1701 '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', 1702 '\xc6': 'Ae', '\xe6': 'ae', 1703 '\xde': 'Th', '\xfe': 'th', 1704 '\xdf': 'ss' 1705 }; 1706 1707 /** Used to map characters to HTML entities. */ 1708 var htmlEscapes = { 1709 '&': '&', 1710 '<': '<', 1711 '>': '>', 1712 '"': '"', 1713 "'": ''', 1714 '`': '`' 1715 }; 1716 1717 /** Used to map HTML entities to characters. */ 1718 var htmlUnescapes = { 1719 '&': '&', 1720 '<': '<', 1721 '>': '>', 1722 '"': '"', 1723 ''': "'", 1724 '`': '`' 1725 }; 1726 1727 /** Used to determine if values are of the language type `Object`. */ 1728 var objectTypes = { 1729 'function': true, 1730 'object': true 1731 }; 1732 1733 /** Used to escape characters for inclusion in compiled string literals. */ 1734 var stringEscapes = { 1735 '\\': '\\', 1736 "'": "'", 1737 '\n': 'n', 1738 '\r': 'r', 1739 '\u2028': 'u2028', 1740 '\u2029': 'u2029' 1741 }; 1742 1743 /** Detect free variable `exports`. */ 1744 var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; 1745 1746 /** Detect free variable `module`. */ 1747 var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; 1748 1749 /** Detect free variable `global` from Node.js. */ 1750 var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global; 1751 1752 /** Detect free variable `self`. */ 1753 var freeSelf = objectTypes[typeof self] && self && self.Object && self; 1754 1755 /** Detect free variable `window`. */ 1756 var freeWindow = objectTypes[typeof window] && window && window.Object && window; 1757 1758 /** Detect the popular CommonJS extension `module.exports`. */ 1759 var moduleExports = freeModule && freeModule.exports === freeExports && freeExports; 1760 1761 /** 1762 * Used as a reference to the global object. 1763 * 1764 * The `this` value is used if it is the global object to avoid Greasemonkey's 1765 * restricted `window` object, otherwise the `window` object is used. 1766 */ 1767 var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this; 1768 1769 /*--------------------------------------------------------------------------*/ 1770 1771 /** 1772 * The base implementation of `compareAscending` which compares values and 1773 * sorts them in ascending order without guaranteeing a stable sort. 1774 * 1775 * @private 1776 * @param {*} value The value to compare to `other`. 1777 * @param {*} other The value to compare to `value`. 1778 * @returns {number} Returns the sort order indicator for `value`. 1779 */ 1780 function baseCompareAscending(value, other) { 1781 if (value !== other) { 1782 var valIsReflexive = value === value, 1783 othIsReflexive = other === other; 1784 1785 if (value > other || !valIsReflexive || (value === undefined && othIsReflexive)) { 1786 return 1; 1787 } 1788 if (value < other || !othIsReflexive || (other === undefined && valIsReflexive)) { 1789 return -1; 1790 } 1791 } 1792 return 0; 1793 } 1794 1795 /** 1796 * The base implementation of `_.findIndex` and `_.findLastIndex` without 1797 * support for callback shorthands and `this` binding. 1798 * 1799 * @private 1800 * @param {Array} array The array to search. 1801 * @param {Function} predicate The function invoked per iteration. 1802 * @param {boolean} [fromRight] Specify iterating from right to left. 1803 * @returns {number} Returns the index of the matched value, else `-1`. 1804 */ 1805 function baseFindIndex(array, predicate, fromRight) { 1806 var length = array.length, 1807 index = fromRight ? length : -1; 1808 1809 while ((fromRight ? index-- : ++index < length)) { 1810 if (predicate(array[index], index, array)) { 1811 return index; 1812 } 1813 } 1814 return -1; 1815 } 1816 1817 /** 1818 * The base implementation of `_.indexOf` without support for binary searches. 1819 * 1820 * @private 1821 * @param {Array} array The array to search. 1822 * @param {*} value The value to search for. 1823 * @param {number} fromIndex The index to search from. 1824 * @returns {number} Returns the index of the matched value, else `-1`. 1825 */ 1826 function baseIndexOf(array, value, fromIndex) { 1827 if (value !== value) { 1828 return indexOfNaN(array, fromIndex); 1829 } 1830 var index = fromIndex - 1, 1831 length = array.length; 1832 1833 while (++index < length) { 1834 if (array[index] === value) { 1835 return index; 1836 } 1837 } 1838 return -1; 1839 } 1840 1841 /** 1842 * The base implementation of `_.isFunction` without support for environments 1843 * with incorrect `typeof` results. 1844 * 1845 * @private 1846 * @param {*} value The value to check. 1847 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 1848 */ 1849 function baseIsFunction(value) { 1850 // Avoid a Chakra JIT bug in compatibility modes of IE 11. 1851 // See https://github.com/jashkenas/underscore/issues/1621 for more details. 1852 return typeof value == 'function' || false; 1853 } 1854 1855 /** 1856 * Converts `value` to a string if it is not one. An empty string is returned 1857 * for `null` or `undefined` values. 1858 * 1859 * @private 1860 * @param {*} value The value to process. 1861 * @returns {string} Returns the string. 1862 */ 1863 function baseToString(value) { 1864 if (typeof value == 'string') { 1865 return value; 1866 } 1867 return value == null ? '' : (value + ''); 1868 } 1869 1870 /** 1871 * Used by `_.max` and `_.min` as the default callback for string values. 1872 * 1873 * @private 1874 * @param {string} string The string to inspect. 1875 * @returns {number} Returns the code unit of the first character of the string. 1876 */ 1877 function charAtCallback(string) { 1878 return string.charCodeAt(0); 1879 } 1880 1881 /** 1882 * Used by `_.trim` and `_.trimLeft` to get the index of the first character 1883 * of `string` that is not found in `chars`. 1884 * 1885 * @private 1886 * @param {string} string The string to inspect. 1887 * @param {string} chars The characters to find. 1888 * @returns {number} Returns the index of the first character not found in `chars`. 1889 */ 1890 function charsLeftIndex(string, chars) { 1891 var index = -1, 1892 length = string.length; 1893 1894 while (++index < length && chars.indexOf(string.charAt(index)) > -1) {} 1895 return index; 1896 } 1897 1898 /** 1899 * Used by `_.trim` and `_.trimRight` to get the index of the last character 1900 * of `string` that is not found in `chars`. 1901 * 1902 * @private 1903 * @param {string} string The string to inspect. 1904 * @param {string} chars The characters to find. 1905 * @returns {number} Returns the index of the last character not found in `chars`. 1906 */ 1907 function charsRightIndex(string, chars) { 1908 var index = string.length; 1909 1910 while (index-- && chars.indexOf(string.charAt(index)) > -1) {} 1911 return index; 1912 } 1913 1914 /** 1915 * Used by `_.sortBy` to compare transformed elements of a collection and stable 1916 * sort them in ascending order. 1917 * 1918 * @private 1919 * @param {Object} object The object to compare to `other`. 1920 * @param {Object} other The object to compare to `object`. 1921 * @returns {number} Returns the sort order indicator for `object`. 1922 */ 1923 function compareAscending(object, other) { 1924 return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index); 1925 } 1926 1927 /** 1928 * Used by `_.sortByOrder` to compare multiple properties of each element 1929 * in a collection and stable sort them in the following order: 1930 * 1931 * If `orders` is unspecified, sort in ascending order for all properties. 1932 * Otherwise, for each property, sort in ascending order if its corresponding value in 1933 * orders is true, and descending order if false. 1934 * 1935 * @private 1936 * @param {Object} object The object to compare to `other`. 1937 * @param {Object} other The object to compare to `object`. 1938 * @param {boolean[]} orders The order to sort by for each property. 1939 * @returns {number} Returns the sort order indicator for `object`. 1940 */ 1941 function compareMultiple(object, other, orders) { 1942 var index = -1, 1943 objCriteria = object.criteria, 1944 othCriteria = other.criteria, 1945 length = objCriteria.length, 1946 ordersLength = orders.length; 1947 1948 while (++index < length) { 1949 var result = baseCompareAscending(objCriteria[index], othCriteria[index]); 1950 if (result) { 1951 if (index >= ordersLength) { 1952 return result; 1953 } 1954 return result * (orders[index] ? 1 : -1); 1955 } 1956 } 1957 // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications 1958 // that causes it, under certain circumstances, to provide the same value for 1959 // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 1960 // for more details. 1961 // 1962 // This also ensures a stable sort in V8 and other engines. 1963 // See https://code.google.com/p/v8/issues/detail?id=90 for more details. 1964 return object.index - other.index; 1965 } 1966 1967 /** 1968 * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters. 1969 * 1970 * @private 1971 * @param {string} letter The matched letter to deburr. 1972 * @returns {string} Returns the deburred letter. 1973 */ 1974 function deburrLetter(letter) { 1975 return deburredLetters[letter]; 1976 } 1977 1978 /** 1979 * Used by `_.escape` to convert characters to HTML entities. 1980 * 1981 * @private 1982 * @param {string} chr The matched character to escape. 1983 * @returns {string} Returns the escaped character. 1984 */ 1985 function escapeHtmlChar(chr) { 1986 return htmlEscapes[chr]; 1987 } 1988 1989 /** 1990 * Used by `_.template` to escape characters for inclusion in compiled 1991 * string literals. 1992 * 1993 * @private 1994 * @param {string} chr The matched character to escape. 1995 * @returns {string} Returns the escaped character. 1996 */ 1997 function escapeStringChar(chr) { 1998 return '\\' + stringEscapes[chr]; 1999 } 2000 2001 /** 2002 * Gets the index at which the first occurrence of `NaN` is found in `array`. 2003 * 2004 * @private 2005 * @param {Array} array The array to search. 2006 * @param {number} fromIndex The index to search from. 2007 * @param {boolean} [fromRight] Specify iterating from right to left. 2008 * @returns {number} Returns the index of the matched `NaN`, else `-1`. 2009 */ 2010 function indexOfNaN(array, fromIndex, fromRight) { 2011 var length = array.length, 2012 index = fromIndex + (fromRight ? 0 : -1); 2013 2014 while ((fromRight ? index-- : ++index < length)) { 2015 var other = array[index]; 2016 if (other !== other) { 2017 return index; 2018 } 2019 } 2020 return -1; 2021 } 2022 2023 /** 2024 * Checks if `value` is object-like. 2025 * 2026 * @private 2027 * @param {*} value The value to check. 2028 * @returns {boolean} Returns `true` if `value` is object-like, else `false`. 2029 */ 2030 function isObjectLike(value) { 2031 return !!value && typeof value == 'object'; 2032 } 2033 2034 /** 2035 * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a 2036 * character code is whitespace. 2037 * 2038 * @private 2039 * @param {number} charCode The character code to inspect. 2040 * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`. 2041 */ 2042 function isSpace(charCode) { 2043 return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 || 2044 (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279))); 2045 } 2046 2047 /** 2048 * Replaces all `placeholder` elements in `array` with an internal placeholder 2049 * and returns an array of their indexes. 2050 * 2051 * @private 2052 * @param {Array} array The array to modify. 2053 * @param {*} placeholder The placeholder to replace. 2054 * @returns {Array} Returns the new array of placeholder indexes. 2055 */ 2056 function replaceHolders(array, placeholder) { 2057 var index = -1, 2058 length = array.length, 2059 resIndex = -1, 2060 result = []; 2061 2062 while (++index < length) { 2063 if (array[index] === placeholder) { 2064 array[index] = PLACEHOLDER; 2065 result[++resIndex] = index; 2066 } 2067 } 2068 return result; 2069 } 2070 2071 /** 2072 * An implementation of `_.uniq` optimized for sorted arrays without support 2073 * for callback shorthands and `this` binding. 2074 * 2075 * @private 2076 * @param {Array} array The array to inspect. 2077 * @param {Function} [iteratee] The function invoked per iteration. 2078 * @returns {Array} Returns the new duplicate-value-free array. 2079 */ 2080 function sortedUniq(array, iteratee) { 2081 var seen, 2082 index = -1, 2083 length = array.length, 2084 resIndex = -1, 2085 result = []; 2086 2087 while (++index < length) { 2088 var value = array[index], 2089 computed = iteratee ? iteratee(value, index, array) : value; 2090 2091 if (!index || seen !== computed) { 2092 seen = computed; 2093 result[++resIndex] = value; 2094 } 2095 } 2096 return result; 2097 } 2098 2099 /** 2100 * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace 2101 * character of `string`. 2102 * 2103 * @private 2104 * @param {string} string The string to inspect. 2105 * @returns {number} Returns the index of the first non-whitespace character. 2106 */ 2107 function trimmedLeftIndex(string) { 2108 var index = -1, 2109 length = string.length; 2110 2111 while (++index < length && isSpace(string.charCodeAt(index))) {} 2112 return index; 2113 } 2114 2115 /** 2116 * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace 2117 * character of `string`. 2118 * 2119 * @private 2120 * @param {string} string The string to inspect. 2121 * @returns {number} Returns the index of the last non-whitespace character. 2122 */ 2123 function trimmedRightIndex(string) { 2124 var index = string.length; 2125 2126 while (index-- && isSpace(string.charCodeAt(index))) {} 2127 return index; 2128 } 2129 2130 /** 2131 * Used by `_.unescape` to convert HTML entities to characters. 2132 * 2133 * @private 2134 * @param {string} chr The matched character to unescape. 2135 * @returns {string} Returns the unescaped character. 2136 */ 2137 function unescapeHtmlChar(chr) { 2138 return htmlUnescapes[chr]; 2139 } 2140 2141 /*--------------------------------------------------------------------------*/ 2142 2143 /** 2144 * Create a new pristine `lodash` function using the given `context` object. 2145 * 2146 * @static 2147 * @memberOf _ 2148 * @category Utility 2149 * @param {Object} [context=root] The context object. 2150 * @returns {Function} Returns a new `lodash` function. 2151 * @example 2152 * 2153 * _.mixin({ 'foo': _.constant('foo') }); 2154 * 2155 * var lodash = _.runInContext(); 2156 * lodash.mixin({ 'bar': lodash.constant('bar') }); 2157 * 2158 * _.isFunction(_.foo); 2159 * // => true 2160 * _.isFunction(_.bar); 2161 * // => false 2162 * 2163 * lodash.isFunction(lodash.foo); 2164 * // => false 2165 * lodash.isFunction(lodash.bar); 2166 * // => true 2167 * 2168 * // using `context` to mock `Date#getTime` use in `_.now` 2169 * var mock = _.runInContext({ 2170 * 'Date': function() { 2171 * return { 'getTime': getTimeMock }; 2172 * } 2173 * }); 2174 * 2175 * // or creating a suped-up `defer` in Node.js 2176 * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; 2177 */ 2178 function runInContext(context) { 2179 // Avoid issues with some ES3 environments that attempt to use values, named 2180 // after built-in constructors like `Object`, for the creation of literals. 2181 // ES5 clears this up by stating that literals must use built-in constructors. 2182 // See https://es5.github.io/#x11.1.5 for more details. 2183 context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root; 2184 2185 /** Native constructor references. */ 2186 var Array = context.Array, 2187 Date = context.Date, 2188 Error = context.Error, 2189 Function = context.Function, 2190 Math = context.Math, 2191 Number = context.Number, 2192 Object = context.Object, 2193 RegExp = context.RegExp, 2194 String = context.String, 2195 TypeError = context.TypeError; 2196 2197 /** Used for native method references. */ 2198 var arrayProto = Array.prototype, 2199 objectProto = Object.prototype, 2200 stringProto = String.prototype; 2201 2202 /** Used to detect DOM support. */ 2203 var document = (document = context.window) && document.document; 2204 2205 /** Used to resolve the decompiled source of functions. */ 2206 var fnToString = Function.prototype.toString; 2207 2208 /** Used to check objects for own properties. */ 2209 var hasOwnProperty = objectProto.hasOwnProperty; 2210 2211 /** Used to generate unique IDs. */ 2212 var idCounter = 0; 2213 2214 /** 2215 * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) 2216 * of values. 2217 */ 2218 var objToString = objectProto.toString; 2219 2220 /** Used to restore the original `_` reference in `_.noConflict`. */ 2221 var oldDash = context._; 2222 2223 /** Used to detect if a method is native. */ 2224 var reIsNative = RegExp('^' + 2225 escapeRegExp(objToString) 2226 .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' 2227 ); 2228 2229 /** Native method references. */ 2230 var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer, 2231 bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice, 2232 ceil = Math.ceil, 2233 clearTimeout = context.clearTimeout, 2234 floor = Math.floor, 2235 getOwnPropertySymbols = isNative(getOwnPropertySymbols = Object.getOwnPropertySymbols) && getOwnPropertySymbols, 2236 getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, 2237 push = arrayProto.push, 2238 preventExtensions = isNative(Object.preventExtensions = Object.preventExtensions) && preventExtensions, 2239 propertyIsEnumerable = objectProto.propertyIsEnumerable, 2240 Set = isNative(Set = context.Set) && Set, 2241 setTimeout = context.setTimeout, 2242 splice = arrayProto.splice, 2243 Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array, 2244 WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap; 2245 2246 /** Used to clone array buffers. */ 2247 var Float64Array = (function() { 2248 // Safari 5 errors when using an array buffer to initialize a typed array 2249 // where the array buffer's `byteLength` is not a multiple of the typed 2250 // array's `BYTES_PER_ELEMENT`. 2251 try { 2252 var func = isNative(func = context.Float64Array) && func, 2253 result = new func(new ArrayBuffer(10), 0, 1) && func; 2254 } catch(e) {} 2255 return result; 2256 }()); 2257 2258 /** Used as `baseAssign`. */ 2259 var nativeAssign = (function() { 2260 // Avoid `Object.assign` in Firefox 34-37 which have an early implementation 2261 // with a now defunct try/catch behavior. See https://bugzilla.mozilla.org/show_bug.cgi?id=1103344 2262 // for more details. 2263 // 2264 // Use `Object.preventExtensions` on a plain object instead of simply using 2265 // `Object('x')` because Chrome and IE fail to throw an error when attempting 2266 // to assign values to readonly indexes of strings in strict mode. 2267 var object = { '1': 0 }, 2268 func = preventExtensions && isNative(func = Object.assign) && func; 2269 2270 try { func(preventExtensions(object), 'xo'); } catch(e) {} 2271 return !object[1] && func; 2272 }()); 2273 2274 /* Native method references for those with the same name as other `lodash` methods. */ 2275 var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray, 2276 nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate, 2277 nativeIsFinite = context.isFinite, 2278 nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys, 2279 nativeMax = Math.max, 2280 nativeMin = Math.min, 2281 nativeNow = isNative(nativeNow = Date.now) && nativeNow, 2282 nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite, 2283 nativeParseInt = context.parseInt, 2284 nativeRandom = Math.random; 2285 2286 /** Used as references for `-Infinity` and `Infinity`. */ 2287 var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY, 2288 POSITIVE_INFINITY = Number.POSITIVE_INFINITY; 2289 2290 /** Used as references for the maximum length and index of an array. */ 2291 var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1, 2292 MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, 2293 HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; 2294 2295 /** Used as the size, in bytes, of each `Float64Array` element. */ 2296 var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0; 2297 2298 /** 2299 * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) 2300 * of an array-like value. 2301 */ 2302 var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; 2303 2304 /** Used to store function metadata. */ 2305 var metaMap = WeakMap && new WeakMap; 2306 2307 /** Used to lookup unminified function names. */ 2308 var realNames = {}; 2309 2310 /*------------------------------------------------------------------------*/ 2311 2312 /** 2313 * Creates a `lodash` object which wraps `value` to enable implicit chaining. 2314 * Methods that operate on and return arrays, collections, and functions can 2315 * be chained together. Methods that return a boolean or single value will 2316 * automatically end the chain returning the unwrapped value. Explicit chaining 2317 * may be enabled using `_.chain`. The execution of chained methods is lazy, 2318 * that is, execution is deferred until `_#value` is implicitly or explicitly 2319 * called. 2320 * 2321 * Lazy evaluation allows several methods to support shortcut fusion. Shortcut 2322 * fusion is an optimization that merges iteratees to avoid creating intermediate 2323 * arrays and reduce the number of iteratee executions. 2324 * 2325 * Chaining is supported in custom builds as long as the `_#value` method is 2326 * directly or indirectly included in the build. 2327 * 2328 * In addition to lodash methods, wrappers have `Array` and `String` methods. 2329 * 2330 * The wrapper `Array` methods are: 2331 * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, 2332 * `splice`, and `unshift` 2333 * 2334 * The wrapper `String` methods are: 2335 * `replace` and `split` 2336 * 2337 * The wrapper methods that support shortcut fusion are: 2338 * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`, 2339 * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`, 2340 * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`, 2341 * and `where` 2342 * 2343 * The chainable wrapper methods are: 2344 * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`, 2345 * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`, 2346 * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`, 2347 * `difference`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `fill`, 2348 * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`, 2349 * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`, 2350 * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`, 2351 * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`, 2352 * `merge`, `mixin`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`, 2353 * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`, 2354 * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`, 2355 * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`, 2356 * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, 2357 * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`, 2358 * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`, 2359 * `without`, `wrap`, `xor`, `zip`, and `zipObject` 2360 * 2361 * The wrapper methods that are **not** chainable by default are: 2362 * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`, 2363 * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, 2364 * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`, 2365 * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`, 2366 * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite` 2367 * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, 2368 * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, 2369 * `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`, `noConflict`, 2370 * `noop`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, 2371 * `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`, `shift`, `size`, 2372 * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, `startsWith`, 2373 * `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, `unescape`, 2374 * `uniqueId`, `value`, and `words` 2375 * 2376 * The wrapper method `sample` will return a wrapped value when `n` is provided, 2377 * otherwise an unwrapped value is returned. 2378 * 2379 * @name _ 2380 * @constructor 2381 * @category Chain 2382 * @param {*} value The value to wrap in a `lodash` instance. 2383 * @returns {Object} Returns the new `lodash` wrapper instance. 2384 * @example 2385 * 2386 * var wrapped = _([1, 2, 3]); 2387 * 2388 * // returns an unwrapped value 2389 * wrapped.reduce(function(total, n) { 2390 * return total + n; 2391 * }); 2392 * // => 6 2393 * 2394 * // returns a wrapped value 2395 * var squares = wrapped.map(function(n) { 2396 * return n * n; 2397 * }); 2398 * 2399 * _.isArray(squares); 2400 * // => false 2401 * 2402 * _.isArray(squares.value()); 2403 * // => true 2404 */ 2405 function lodash(value) { 2406 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { 2407 if (value instanceof LodashWrapper) { 2408 return value; 2409 } 2410 if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) { 2411 return wrapperClone(value); 2412 } 2413 } 2414 return new LodashWrapper(value); 2415 } 2416 2417 /** 2418 * The function whose prototype all chaining wrappers inherit from. 2419 * 2420 * @private 2421 */ 2422 function baseLodash() { 2423 // No operation performed. 2424 } 2425 2426 /** 2427 * The base constructor for creating `lodash` wrapper objects. 2428 * 2429 * @private 2430 * @param {*} value The value to wrap. 2431 * @param {boolean} [chainAll] Enable chaining for all wrapper methods. 2432 * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value. 2433 */ 2434 function LodashWrapper(value, chainAll, actions) { 2435 this.__wrapped__ = value; 2436 this.__actions__ = actions || []; 2437 this.__chain__ = !!chainAll; 2438 } 2439 2440 /** 2441 * An object environment feature flags. 2442 * 2443 * @static 2444 * @memberOf _ 2445 * @type Object 2446 */ 2447 var support = lodash.support = {}; 2448 2449 (function(x) { 2450 var Ctor = function() { this.x = x; }, 2451 object = { '0': x, 'length': x }, 2452 props = []; 2453 2454 Ctor.prototype = { 'valueOf': x, 'y': x }; 2455 for (var key in new Ctor) { props.push(key); } 2456 2457 /** 2458 * Detect if functions can be decompiled by `Function#toString` 2459 * (all but Firefox OS certified apps, older Opera mobile browsers, and 2460 * the PlayStation 3; forced `false` for Windows 8 apps). 2461 * 2462 * @memberOf _.support 2463 * @type boolean 2464 */ 2465 support.funcDecomp = /\bthis\b/.test(function() { return this; }); 2466 2467 /** 2468 * Detect if `Function#name` is supported (all but IE). 2469 * 2470 * @memberOf _.support 2471 * @type boolean 2472 */ 2473 support.funcNames = typeof Function.name == 'string'; 2474 2475 /** 2476 * Detect if the DOM is supported. 2477 * 2478 * @memberOf _.support 2479 * @type boolean 2480 */ 2481 try { 2482 support.dom = document.createDocumentFragment().nodeType === 11; 2483 } catch(e) { 2484 support.dom = false; 2485 } 2486 2487 /** 2488 * Detect if `arguments` object indexes are non-enumerable. 2489 * 2490 * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object 2491 * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat 2492 * `arguments` object indexes as non-enumerable and fail `hasOwnProperty` 2493 * checks for indexes that exceed the number of function parameters and 2494 * whose associated argument values are `0`. 2495 * 2496 * @memberOf _.support 2497 * @type boolean 2498 */ 2499 try { 2500 support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1); 2501 } catch(e) { 2502 support.nonEnumArgs = true; 2503 } 2504 }(1, 0)); 2505 2506 /** 2507 * By default, the template delimiters used by lodash are like those in 2508 * embedded Ruby (ERB). Change the following template settings to use 2509 * alternative delimiters. 2510 * 2511 * @static 2512 * @memberOf _ 2513 * @type Object 2514 */ 2515 lodash.templateSettings = { 2516 2517 /** 2518 * Used to detect `data` property values to be HTML-escaped. 2519 * 2520 * @memberOf _.templateSettings 2521 * @type RegExp 2522 */ 2523 'escape': reEscape, 2524 2525 /** 2526 * Used to detect code to be evaluated. 2527 * 2528 * @memberOf _.templateSettings 2529 * @type RegExp 2530 */ 2531 'evaluate': reEvaluate, 2532 2533 /** 2534 * Used to detect `data` property values to inject. 2535 * 2536 * @memberOf _.templateSettings 2537 * @type RegExp 2538 */ 2539 'interpolate': reInterpolate, 2540 2541 /** 2542 * Used to reference the data object in the template text. 2543 * 2544 * @memberOf _.templateSettings 2545 * @type string 2546 */ 2547 'variable': '', 2548 2549 /** 2550 * Used to import variables into the compiled template. 2551 * 2552 * @memberOf _.templateSettings 2553 * @type Object 2554 */ 2555 'imports': { 2556 2557 /** 2558 * A reference to the `lodash` function. 2559 * 2560 * @memberOf _.templateSettings.imports 2561 * @type Function 2562 */ 2563 '_': lodash 2564 } 2565 }; 2566 2567 /*------------------------------------------------------------------------*/ 2568 2569 /** 2570 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. 2571 * 2572 * @private 2573 * @param {*} value The value to wrap. 2574 */ 2575 function LazyWrapper(value) { 2576 this.__wrapped__ = value; 2577 this.__actions__ = null; 2578 this.__dir__ = 1; 2579 this.__dropCount__ = 0; 2580 this.__filtered__ = false; 2581 this.__iteratees__ = null; 2582 this.__takeCount__ = POSITIVE_INFINITY; 2583 this.__views__ = null; 2584 } 2585 2586 /** 2587 * Creates a clone of the lazy wrapper object. 2588 * 2589 * @private 2590 * @name clone 2591 * @memberOf LazyWrapper 2592 * @returns {Object} Returns the cloned `LazyWrapper` object. 2593 */ 2594 function lazyClone() { 2595 var actions = this.__actions__, 2596 iteratees = this.__iteratees__, 2597 views = this.__views__, 2598 result = new LazyWrapper(this.__wrapped__); 2599 2600 result.__actions__ = actions ? arrayCopy(actions) : null; 2601 result.__dir__ = this.__dir__; 2602 result.__filtered__ = this.__filtered__; 2603 result.__iteratees__ = iteratees ? arrayCopy(iteratees) : null; 2604 result.__takeCount__ = this.__takeCount__; 2605 result.__views__ = views ? arrayCopy(views) : null; 2606 return result; 2607 } 2608 2609 /** 2610 * Reverses the direction of lazy iteration. 2611 * 2612 * @private 2613 * @name reverse 2614 * @memberOf LazyWrapper 2615 * @returns {Object} Returns the new reversed `LazyWrapper` object. 2616 */ 2617 function lazyReverse() { 2618 if (this.__filtered__) { 2619 var result = new LazyWrapper(this); 2620 result.__dir__ = -1; 2621 result.__filtered__ = true; 2622 } else { 2623 result = this.clone(); 2624 result.__dir__ *= -1; 2625 } 2626 return result; 2627 } 2628 2629 /** 2630 * Extracts the unwrapped value from its lazy wrapper. 2631 * 2632 * @private 2633 * @name value 2634 * @memberOf LazyWrapper 2635 * @returns {*} Returns the unwrapped value. 2636 */ 2637 function lazyValue() { 2638 var array = this.__wrapped__.value(); 2639 if (!isArray(array)) { 2640 return baseWrapperValue(array, this.__actions__); 2641 } 2642 var dir = this.__dir__, 2643 isRight = dir < 0, 2644 view = getView(0, array.length, this.__views__), 2645 start = view.start, 2646 end = view.end, 2647 length = end - start, 2648 index = isRight ? end : (start - 1), 2649 takeCount = nativeMin(length, this.__takeCount__), 2650 iteratees = this.__iteratees__, 2651 iterLength = iteratees ? iteratees.length : 0, 2652 resIndex = 0, 2653 result = []; 2654 2655 outer: 2656 while (length-- && resIndex < takeCount) { 2657 index += dir; 2658 2659 var iterIndex = -1, 2660 value = array[index]; 2661 2662 while (++iterIndex < iterLength) { 2663 var data = iteratees[iterIndex], 2664 iteratee = data.iteratee, 2665 type = data.type; 2666 2667 if (type == LAZY_DROP_WHILE_FLAG) { 2668 if (data.done && (isRight ? (index > data.index) : (index < data.index))) { 2669 data.count = 0; 2670 data.done = false; 2671 } 2672 data.index = index; 2673 if (!data.done) { 2674 var limit = data.limit; 2675 if (!(data.done = limit > -1 ? (data.count++ >= limit) : !iteratee(value))) { 2676 continue outer; 2677 } 2678 } 2679 } else { 2680 var computed = iteratee(value); 2681 if (type == LAZY_MAP_FLAG) { 2682 value = computed; 2683 } else if (!computed) { 2684 if (type == LAZY_FILTER_FLAG) { 2685 continue outer; 2686 } else { 2687 break outer; 2688 } 2689 } 2690 } 2691 } 2692 result[resIndex++] = value; 2693 } 2694 return result; 2695 } 2696 2697 /*------------------------------------------------------------------------*/ 2698 2699 /** 2700 * Creates a cache object to store key/value pairs. 2701 * 2702 * @private 2703 * @static 2704 * @name Cache 2705 * @memberOf _.memoize 2706 */ 2707 function MapCache() { 2708 this.__data__ = {}; 2709 } 2710 2711 /** 2712 * Removes `key` and its value from the cache. 2713 * 2714 * @private 2715 * @name delete 2716 * @memberOf _.memoize.Cache 2717 * @param {string} key The key of the value to remove. 2718 * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`. 2719 */ 2720 function mapDelete(key) { 2721 return this.has(key) && delete this.__data__[key]; 2722 } 2723 2724 /** 2725 * Gets the cached value for `key`. 2726 * 2727 * @private 2728 * @name get 2729 * @memberOf _.memoize.Cache 2730 * @param {string} key The key of the value to get. 2731 * @returns {*} Returns the cached value. 2732 */ 2733 function mapGet(key) { 2734 return key == '__proto__' ? undefined : this.__data__[key]; 2735 } 2736 2737 /** 2738 * Checks if a cached value for `key` exists. 2739 * 2740 * @private 2741 * @name has 2742 * @memberOf _.memoize.Cache 2743 * @param {string} key The key of the entry to check. 2744 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. 2745 */ 2746 function mapHas(key) { 2747 return key != '__proto__' && hasOwnProperty.call(this.__data__, key); 2748 } 2749 2750 /** 2751 * Sets `value` to `key` of the cache. 2752 * 2753 * @private 2754 * @name set 2755 * @memberOf _.memoize.Cache 2756 * @param {string} key The key of the value to cache. 2757 * @param {*} value The value to cache. 2758 * @returns {Object} Returns the cache object. 2759 */ 2760 function mapSet(key, value) { 2761 if (key != '__proto__') { 2762 this.__data__[key] = value; 2763 } 2764 return this; 2765 } 2766 2767 /*------------------------------------------------------------------------*/ 2768 2769 /** 2770 * 2771 * Creates a cache object to store unique values. 2772 * 2773 * @private 2774 * @param {Array} [values] The values to cache. 2775 */ 2776 function SetCache(values) { 2777 var length = values ? values.length : 0; 2778 2779 this.data = { 'hash': nativeCreate(null), 'set': new Set }; 2780 while (length--) { 2781 this.push(values[length]); 2782 } 2783 } 2784 2785 /** 2786 * Checks if `value` is in `cache` mimicking the return signature of 2787 * `_.indexOf` by returning `0` if the value is found, else `-1`. 2788 * 2789 * @private 2790 * @param {Object} cache The cache to search. 2791 * @param {*} value The value to search for. 2792 * @returns {number} Returns `0` if `value` is found, else `-1`. 2793 */ 2794 function cacheIndexOf(cache, value) { 2795 var data = cache.data, 2796 result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value]; 2797 2798 return result ? 0 : -1; 2799 } 2800 2801 /** 2802 * Adds `value` to the cache. 2803 * 2804 * @private 2805 * @name push 2806 * @memberOf SetCache 2807 * @param {*} value The value to cache. 2808 */ 2809 function cachePush(value) { 2810 var data = this.data; 2811 if (typeof value == 'string' || isObject(value)) { 2812 data.set.add(value); 2813 } else { 2814 data.hash[value] = true; 2815 } 2816 } 2817 2818 /*------------------------------------------------------------------------*/ 2819 2820 /** 2821 * Copies the values of `source` to `array`. 2822 * 2823 * @private 2824 * @param {Array} source The array to copy values from. 2825 * @param {Array} [array=[]] The array to copy values to. 2826 * @returns {Array} Returns `array`. 2827 */ 2828 function arrayCopy(source, array) { 2829 var index = -1, 2830 length = source.length; 2831 2832 array || (array = Array(length)); 2833 while (++index < length) { 2834 array[index] = source[index]; 2835 } 2836 return array; 2837 } 2838 2839 /** 2840 * A specialized version of `_.forEach` for arrays without support for callback 2841 * shorthands and `this` binding. 2842 * 2843 * @private 2844 * @param {Array} array The array to iterate over. 2845 * @param {Function} iteratee The function invoked per iteration. 2846 * @returns {Array} Returns `array`. 2847 */ 2848 function arrayEach(array, iteratee) { 2849 var index = -1, 2850 length = array.length; 2851 2852 while (++index < length) { 2853 if (iteratee(array[index], index, array) === false) { 2854 break; 2855 } 2856 } 2857 return array; 2858 } 2859 2860 /** 2861 * A specialized version of `_.forEachRight` for arrays without support for 2862 * callback shorthands and `this` binding. 2863 * 2864 * @private 2865 * @param {Array} array The array to iterate over. 2866 * @param {Function} iteratee The function invoked per iteration. 2867 * @returns {Array} Returns `array`. 2868 */ 2869 function arrayEachRight(array, iteratee) { 2870 var length = array.length; 2871 2872 while (length--) { 2873 if (iteratee(array[length], length, array) === false) { 2874 break; 2875 } 2876 } 2877 return array; 2878 } 2879 2880 /** 2881 * A specialized version of `_.every` for arrays without support for callback 2882 * shorthands and `this` binding. 2883 * 2884 * @private 2885 * @param {Array} array The array to iterate over. 2886 * @param {Function} predicate The function invoked per iteration. 2887 * @returns {boolean} Returns `true` if all elements pass the predicate check, 2888 * else `false`. 2889 */ 2890 function arrayEvery(array, predicate) { 2891 var index = -1, 2892 length = array.length; 2893 2894 while (++index < length) { 2895 if (!predicate(array[index], index, array)) { 2896 return false; 2897 } 2898 } 2899 return true; 2900 } 2901 2902 /** 2903 * A specialized version of `_.filter` for arrays without support for callback 2904 * shorthands and `this` binding. 2905 * 2906 * @private 2907 * @param {Array} array The array to iterate over. 2908 * @param {Function} predicate The function invoked per iteration. 2909 * @returns {Array} Returns the new filtered array. 2910 */ 2911 function arrayFilter(array, predicate) { 2912 var index = -1, 2913 length = array.length, 2914 resIndex = -1, 2915 result = []; 2916 2917 while (++index < length) { 2918 var value = array[index]; 2919 if (predicate(value, index, array)) { 2920 result[++resIndex] = value; 2921 } 2922 } 2923 return result; 2924 } 2925 2926 /** 2927 * A specialized version of `_.map` for arrays without support for callback 2928 * shorthands and `this` binding. 2929 * 2930 * @private 2931 * @param {Array} array The array to iterate over. 2932 * @param {Function} iteratee The function invoked per iteration. 2933 * @returns {Array} Returns the new mapped array. 2934 */ 2935 function arrayMap(array, iteratee) { 2936 var index = -1, 2937 length = array.length, 2938 result = Array(length); 2939 2940 while (++index < length) { 2941 result[index] = iteratee(array[index], index, array); 2942 } 2943 return result; 2944 } 2945 2946 /** 2947 * A specialized version of `_.max` for arrays without support for iteratees. 2948 * 2949 * @private 2950 * @param {Array} array The array to iterate over. 2951 * @returns {*} Returns the maximum value. 2952 */ 2953 function arrayMax(array) { 2954 var index = -1, 2955 length = array.length, 2956 result = NEGATIVE_INFINITY; 2957 2958 while (++index < length) { 2959 var value = array[index]; 2960 if (value > result) { 2961 result = value; 2962 } 2963 } 2964 return result; 2965 } 2966 2967 /** 2968 * A specialized version of `_.min` for arrays without support for iteratees. 2969 * 2970 * @private 2971 * @param {Array} array The array to iterate over. 2972 * @returns {*} Returns the minimum value. 2973 */ 2974 function arrayMin(array) { 2975 var index = -1, 2976 length = array.length, 2977 result = POSITIVE_INFINITY; 2978 2979 while (++index < length) { 2980 var value = array[index]; 2981 if (value < result) { 2982 result = value; 2983 } 2984 } 2985 return result; 2986 } 2987 2988 /** 2989 * A specialized version of `_.reduce` for arrays without support for callback 2990 * shorthands and `this` binding. 2991 * 2992 * @private 2993 * @param {Array} array The array to iterate over. 2994 * @param {Function} iteratee The function invoked per iteration. 2995 * @param {*} [accumulator] The initial value. 2996 * @param {boolean} [initFromArray] Specify using the first element of `array` 2997 * as the initial value. 2998 * @returns {*} Returns the accumulated value. 2999 */ 3000 function arrayReduce(array, iteratee, accumulator, initFromArray) { 3001 var index = -1, 3002 length = array.length; 3003 3004 if (initFromArray && length) { 3005 accumulator = array[++index]; 3006 } 3007 while (++index < length) { 3008 accumulator = iteratee(accumulator, array[index], index, array); 3009 } 3010 return accumulator; 3011 } 3012 3013 /** 3014 * A specialized version of `_.reduceRight` for arrays without support for 3015 * callback shorthands and `this` binding. 3016 * 3017 * @private 3018 * @param {Array} array The array to iterate over. 3019 * @param {Function} iteratee The function invoked per iteration. 3020 * @param {*} [accumulator] The initial value. 3021 * @param {boolean} [initFromArray] Specify using the last element of `array` 3022 * as the initial value. 3023 * @returns {*} Returns the accumulated value. 3024 */ 3025 function arrayReduceRight(array, iteratee, accumulator, initFromArray) { 3026 var length = array.length; 3027 if (initFromArray && length) { 3028 accumulator = array[--length]; 3029 } 3030 while (length--) { 3031 accumulator = iteratee(accumulator, array[length], length, array); 3032 } 3033 return accumulator; 3034 } 3035 3036 /** 3037 * A specialized version of `_.some` for arrays without support for callback 3038 * shorthands and `this` binding. 3039 * 3040 * @private 3041 * @param {Array} array The array to iterate over. 3042 * @param {Function} predicate The function invoked per iteration. 3043 * @returns {boolean} Returns `true` if any element passes the predicate check, 3044 * else `false`. 3045 */ 3046 function arraySome(array, predicate) { 3047 var index = -1, 3048 length = array.length; 3049 3050 while (++index < length) { 3051 if (predicate(array[index], index, array)) { 3052 return true; 3053 } 3054 } 3055 return false; 3056 } 3057 3058 /** 3059 * A specialized version of `_.sum` for arrays without support for iteratees. 3060 * 3061 * @private 3062 * @param {Array} array The array to iterate over. 3063 * @returns {number} Returns the sum. 3064 */ 3065 function arraySum(array) { 3066 var length = array.length, 3067 result = 0; 3068 3069 while (length--) { 3070 result += +array[length] || 0; 3071 } 3072 return result; 3073 } 3074 3075 /** 3076 * Used by `_.defaults` to customize its `_.assign` use. 3077 * 3078 * @private 3079 * @param {*} objectValue The destination object property value. 3080 * @param {*} sourceValue The source object property value. 3081 * @returns {*} Returns the value to assign to the destination object. 3082 */ 3083 function assignDefaults(objectValue, sourceValue) { 3084 return objectValue === undefined ? sourceValue : objectValue; 3085 } 3086 3087 /** 3088 * Used by `_.template` to customize its `_.assign` use. 3089 * 3090 * **Note:** This function is like `assignDefaults` except that it ignores 3091 * inherited property values when checking if a property is `undefined`. 3092 * 3093 * @private 3094 * @param {*} objectValue The destination object property value. 3095 * @param {*} sourceValue The source object property value. 3096 * @param {string} key The key associated with the object and source values. 3097 * @param {Object} object The destination object. 3098 * @returns {*} Returns the value to assign to the destination object. 3099 */ 3100 function assignOwnDefaults(objectValue, sourceValue, key, object) { 3101 return (objectValue === undefined || !hasOwnProperty.call(object, key)) 3102 ? sourceValue 3103 : objectValue; 3104 } 3105 3106 /** 3107 * A specialized version of `_.assign` for customizing assigned values without 3108 * support for argument juggling, multiple sources, and `this` binding `customizer` 3109 * functions. 3110 * 3111 * @private 3112 * @param {Object} object The destination object. 3113 * @param {Object} source The source object. 3114 * @param {Function} customizer The function to customize assigned values. 3115 * @returns {Object} Returns `object`. 3116 */ 3117 function assignWith(object, source, customizer) { 3118 var props = keys(source); 3119 push.apply(props, getSymbols(source)); 3120 3121 var index = -1, 3122 length = props.length; 3123 3124 while (++index < length) { 3125 var key = props[index], 3126 value = object[key], 3127 result = customizer(value, source[key], key, object, source); 3128 3129 if ((result === result ? (result !== value) : (value === value)) || 3130 (value === undefined && !(key in object))) { 3131 object[key] = result; 3132 } 3133 } 3134 return object; 3135 } 3136 3137 /** 3138 * The base implementation of `_.assign` without support for argument juggling, 3139 * multiple sources, and `customizer` functions. 3140 * 3141 * @private 3142 * @param {Object} object The destination object. 3143 * @param {Object} source The source object. 3144 * @returns {Object} Returns `object`. 3145 */ 3146 var baseAssign = nativeAssign || function(object, source) { 3147 return source == null 3148 ? object 3149 : baseCopy(source, getSymbols(source), baseCopy(source, keys(source), object)); 3150 }; 3151 3152 /** 3153 * The base implementation of `_.at` without support for string collections 3154 * and individual key arguments. 3155 * 3156 * @private 3157 * @param {Array|Object} collection The collection to iterate over. 3158 * @param {number[]|string[]} props The property names or indexes of elements to pick. 3159 * @returns {Array} Returns the new array of picked elements. 3160 */ 3161 function baseAt(collection, props) { 3162 var index = -1, 3163 length = collection.length, 3164 isArr = isLength(length), 3165 propsLength = props.length, 3166 result = Array(propsLength); 3167 3168 while(++index < propsLength) { 3169 var key = props[index]; 3170 if (isArr) { 3171 result[index] = isIndex(key, length) ? collection[key] : undefined; 3172 } else { 3173 result[index] = collection[key]; 3174 } 3175 } 3176 return result; 3177 } 3178 3179 /** 3180 * Copies properties of `source` to `object`. 3181 * 3182 * @private 3183 * @param {Object} source The object to copy properties from. 3184 * @param {Array} props The property names to copy. 3185 * @param {Object} [object={}] The object to copy properties to. 3186 * @returns {Object} Returns `object`. 3187 */ 3188 function baseCopy(source, props, object) { 3189 object || (object = {}); 3190 3191 var index = -1, 3192 length = props.length; 3193 3194 while (++index < length) { 3195 var key = props[index]; 3196 object[key] = source[key]; 3197 } 3198 return object; 3199 } 3200 3201 /** 3202 * The base implementation of `_.callback` which supports specifying the 3203 * number of arguments to provide to `func`. 3204 * 3205 * @private 3206 * @param {*} [func=_.identity] The value to convert to a callback. 3207 * @param {*} [thisArg] The `this` binding of `func`. 3208 * @param {number} [argCount] The number of arguments to provide to `func`. 3209 * @returns {Function} Returns the callback. 3210 */ 3211 function baseCallback(func, thisArg, argCount) { 3212 var type = typeof func; 3213 if (type == 'function') { 3214 return thisArg === undefined 3215 ? func 3216 : bindCallback(func, thisArg, argCount); 3217 } 3218 if (func == null) { 3219 return identity; 3220 } 3221 if (type == 'object') { 3222 return baseMatches(func); 3223 } 3224 return thisArg === undefined 3225 ? property(func) 3226 : baseMatchesProperty(func, thisArg); 3227 } 3228 3229 /** 3230 * The base implementation of `_.clone` without support for argument juggling 3231 * and `this` binding `customizer` functions. 3232 * 3233 * @private 3234 * @param {*} value The value to clone. 3235 * @param {boolean} [isDeep] Specify a deep clone. 3236 * @param {Function} [customizer] The function to customize cloning values. 3237 * @param {string} [key] The key of `value`. 3238 * @param {Object} [object] The object `value` belongs to. 3239 * @param {Array} [stackA=[]] Tracks traversed source objects. 3240 * @param {Array} [stackB=[]] Associates clones with source counterparts. 3241 * @returns {*} Returns the cloned value. 3242 */ 3243 function baseClone(value, isDeep, customizer, key, object, stackA, stackB) { 3244 var result; 3245 if (customizer) { 3246 result = object ? customizer(value, key, object) : customizer(value); 3247 } 3248 if (result !== undefined) { 3249 return result; 3250 } 3251 if (!isObject(value)) { 3252 return value; 3253 } 3254 var isArr = isArray(value); 3255 if (isArr) { 3256 result = initCloneArray(value); 3257 if (!isDeep) { 3258 return arrayCopy(value, result); 3259 } 3260 } else { 3261 var tag = objToString.call(value), 3262 isFunc = tag == funcTag; 3263 3264 if (tag == objectTag || tag == argsTag || (isFunc && !object)) { 3265 result = initCloneObject(isFunc ? {} : value); 3266 if (!isDeep) { 3267 return baseAssign(result, value); 3268 } 3269 } else { 3270 return cloneableTags[tag] 3271 ? initCloneByTag(value, tag, isDeep) 3272 : (object ? value : {}); 3273 } 3274 } 3275 // Check for circular references and return corresponding clone. 3276 stackA || (stackA = []); 3277 stackB || (stackB = []); 3278 3279 var length = stackA.length; 3280 while (length--) { 3281 if (stackA[length] == value) { 3282 return stackB[length]; 3283 } 3284 } 3285 // Add the source value to the stack of traversed objects and associate it with its clone. 3286 stackA.push(value); 3287 stackB.push(result); 3288 3289 // Recursively populate clone (susceptible to call stack limits). 3290 (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { 3291 result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB); 3292 }); 3293 return result; 3294 } 3295 3296 /** 3297 * The base implementation of `_.create` without support for assigning 3298 * properties to the created object. 3299 * 3300 * @private 3301 * @param {Object} prototype The object to inherit from. 3302 * @returns {Object} Returns the new object. 3303 */ 3304 var baseCreate = (function() { 3305 function Object() {} 3306 return function(prototype) { 3307 if (isObject(prototype)) { 3308 Object.prototype = prototype; 3309 var result = new Object; 3310 Object.prototype = null; 3311 } 3312 return result || context.Object(); 3313 }; 3314 }()); 3315 3316 /** 3317 * The base implementation of `_.delay` and `_.defer` which accepts an index 3318 * of where to slice the arguments to provide to `func`. 3319 * 3320 * @private 3321 * @param {Function} func The function to delay. 3322 * @param {number} wait The number of milliseconds to delay invocation. 3323 * @param {Object} args The arguments provide to `func`. 3324 * @returns {number} Returns the timer id. 3325 */ 3326 function baseDelay(func, wait, args) { 3327 if (typeof func != 'function') { 3328 throw new TypeError(FUNC_ERROR_TEXT); 3329 } 3330 return setTimeout(function() { func.apply(undefined, args); }, wait); 3331 } 3332 3333 /** 3334 * The base implementation of `_.difference` which accepts a single array 3335 * of values to exclude. 3336 * 3337 * @private 3338 * @param {Array} array The array to inspect. 3339 * @param {Array} values The values to exclude. 3340 * @returns {Array} Returns the new array of filtered values. 3341 */ 3342 function baseDifference(array, values) { 3343 var length = array ? array.length : 0, 3344 result = []; 3345 3346 if (!length) { 3347 return result; 3348 } 3349 var index = -1, 3350 indexOf = getIndexOf(), 3351 isCommon = indexOf == baseIndexOf, 3352 cache = (isCommon && values.length >= 200) ? createCache(values) : null, 3353 valuesLength = values.length; 3354 3355 if (cache) { 3356 indexOf = cacheIndexOf; 3357 isCommon = false; 3358 values = cache; 3359 } 3360 outer: 3361 while (++index < length) { 3362 var value = array[index]; 3363 3364 if (isCommon && value === value) { 3365 var valuesIndex = valuesLength; 3366 while (valuesIndex--) { 3367 if (values[valuesIndex] === value) { 3368 continue outer; 3369 } 3370 } 3371 result.push(value); 3372 } 3373 else if (indexOf(values, value, 0) < 0) { 3374 result.push(value); 3375 } 3376 } 3377 return result; 3378 } 3379 3380 /** 3381 * The base implementation of `_.forEach` without support for callback 3382 * shorthands and `this` binding. 3383 * 3384 * @private 3385 * @param {Array|Object|string} collection The collection to iterate over. 3386 * @param {Function} iteratee The function invoked per iteration. 3387 * @returns {Array|Object|string} Returns `collection`. 3388 */ 3389 var baseEach = createBaseEach(baseForOwn); 3390 3391 /** 3392 * The base implementation of `_.forEachRight` without support for callback 3393 * shorthands and `this` binding. 3394 * 3395 * @private 3396 * @param {Array|Object|string} collection The collection to iterate over. 3397 * @param {Function} iteratee The function invoked per iteration. 3398 * @returns {Array|Object|string} Returns `collection`. 3399 */ 3400 var baseEachRight = createBaseEach(baseForOwnRight, true); 3401 3402 /** 3403 * The base implementation of `_.every` without support for callback 3404 * shorthands and `this` binding. 3405 * 3406 * @private 3407 * @param {Array|Object|string} collection The collection to iterate over. 3408 * @param {Function} predicate The function invoked per iteration. 3409 * @returns {boolean} Returns `true` if all elements pass the predicate check, 3410 * else `false` 3411 */ 3412 function baseEvery(collection, predicate) { 3413 var result = true; 3414 baseEach(collection, function(value, index, collection) { 3415 result = !!predicate(value, index, collection); 3416 return result; 3417 }); 3418 return result; 3419 } 3420 3421 /** 3422 * The base implementation of `_.fill` without an iteratee call guard. 3423 * 3424 * @private 3425 * @param {Array} array The array to fill. 3426 * @param {*} value The value to fill `array` with. 3427 * @param {number} [start=0] The start position. 3428 * @param {number} [end=array.length] The end position. 3429 * @returns {Array} Returns `array`. 3430 */ 3431 function baseFill(array, value, start, end) { 3432 var length = array.length; 3433 3434 start = start == null ? 0 : (+start || 0); 3435 if (start < 0) { 3436 start = -start > length ? 0 : (length + start); 3437 } 3438 end = (end === undefined || end > length) ? length : (+end || 0); 3439 if (end < 0) { 3440 end += length; 3441 } 3442 length = start > end ? 0 : (end >>> 0); 3443 start >>>= 0; 3444 3445 while (start < length) { 3446 array[start++] = value; 3447 } 3448 return array; 3449 } 3450 3451 /** 3452 * The base implementation of `_.filter` without support for callback 3453 * shorthands and `this` binding. 3454 * 3455 * @private 3456 * @param {Array|Object|string} collection The collection to iterate over. 3457 * @param {Function} predicate The function invoked per iteration. 3458 * @returns {Array} Returns the new filtered array. 3459 */ 3460 function baseFilter(collection, predicate) { 3461 var result = []; 3462 baseEach(collection, function(value, index, collection) { 3463 if (predicate(value, index, collection)) { 3464 result.push(value); 3465 } 3466 }); 3467 return result; 3468 } 3469 3470 /** 3471 * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`, 3472 * without support for callback shorthands and `this` binding, which iterates 3473 * over `collection` using the provided `eachFunc`. 3474 * 3475 * @private 3476 * @param {Array|Object|string} collection The collection to search. 3477 * @param {Function} predicate The function invoked per iteration. 3478 * @param {Function} eachFunc The function to iterate over `collection`. 3479 * @param {boolean} [retKey] Specify returning the key of the found element 3480 * instead of the element itself. 3481 * @returns {*} Returns the found element or its key, else `undefined`. 3482 */ 3483 function baseFind(collection, predicate, eachFunc, retKey) { 3484 var result; 3485 eachFunc(collection, function(value, key, collection) { 3486 if (predicate(value, key, collection)) { 3487 result = retKey ? key : value; 3488 return false; 3489 } 3490 }); 3491 return result; 3492 } 3493 3494 /** 3495 * The base implementation of `_.flatten` with added support for restricting 3496 * flattening and specifying the start index. 3497 * 3498 * @private 3499 * @param {Array} array The array to flatten. 3500 * @param {boolean} isDeep Specify a deep flatten. 3501 * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects. 3502 * @returns {Array} Returns the new flattened array. 3503 */ 3504 function baseFlatten(array, isDeep, isStrict) { 3505 var index = -1, 3506 length = array.length, 3507 resIndex = -1, 3508 result = []; 3509 3510 while (++index < length) { 3511 var value = array[index]; 3512 3513 if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) { 3514 if (isDeep) { 3515 // Recursively flatten arrays (susceptible to call stack limits). 3516 value = baseFlatten(value, isDeep, isStrict); 3517 } 3518 var valIndex = -1, 3519 valLength = value.length; 3520 3521 result.length += valLength; 3522 while (++valIndex < valLength) { 3523 result[++resIndex] = value[valIndex]; 3524 } 3525 } else if (!isStrict) { 3526 result[++resIndex] = value; 3527 } 3528 } 3529 return result; 3530 } 3531 3532 /** 3533 * The base implementation of `baseForIn` and `baseForOwn` which iterates 3534 * over `object` properties returned by `keysFunc` invoking `iteratee` for 3535 * each property. Iteratee functions may exit iteration early by explicitly 3536 * returning `false`. 3537 * 3538 * @private 3539 * @param {Object} object The object to iterate over. 3540 * @param {Function} iteratee The function invoked per iteration. 3541 * @param {Function} keysFunc The function to get the keys of `object`. 3542 * @returns {Object} Returns `object`. 3543 */ 3544 var baseFor = createBaseFor(); 3545 3546 /** 3547 * This function is like `baseFor` except that it iterates over properties 3548 * in the opposite order. 3549 * 3550 * @private 3551 * @param {Object} object The object to iterate over. 3552 * @param {Function} iteratee The function invoked per iteration. 3553 * @param {Function} keysFunc The function to get the keys of `object`. 3554 * @returns {Object} Returns `object`. 3555 */ 3556 var baseForRight = createBaseFor(true); 3557 3558 /** 3559 * The base implementation of `_.forIn` without support for callback 3560 * shorthands and `this` binding. 3561 * 3562 * @private 3563 * @param {Object} object The object to iterate over. 3564 * @param {Function} iteratee The function invoked per iteration. 3565 * @returns {Object} Returns `object`. 3566 */ 3567 function baseForIn(object, iteratee) { 3568 return baseFor(object, iteratee, keysIn); 3569 } 3570 3571 /** 3572 * The base implementation of `_.forOwn` without support for callback 3573 * shorthands and `this` binding. 3574 * 3575 * @private 3576 * @param {Object} object The object to iterate over. 3577 * @param {Function} iteratee The function invoked per iteration. 3578 * @returns {Object} Returns `object`. 3579 */ 3580 function baseForOwn(object, iteratee) { 3581 return baseFor(object, iteratee, keys); 3582 } 3583 3584 /** 3585 * The base implementation of `_.forOwnRight` without support for callback 3586 * shorthands and `this` binding. 3587 * 3588 * @private 3589 * @param {Object} object The object to iterate over. 3590 * @param {Function} iteratee The function invoked per iteration. 3591 * @returns {Object} Returns `object`. 3592 */ 3593 function baseForOwnRight(object, iteratee) { 3594 return baseForRight(object, iteratee, keys); 3595 } 3596 3597 /** 3598 * The base implementation of `_.functions` which creates an array of 3599 * `object` function property names filtered from those provided. 3600 * 3601 * @private 3602 * @param {Object} object The object to inspect. 3603 * @param {Array} props The property names to filter. 3604 * @returns {Array} Returns the new array of filtered property names. 3605 */ 3606 function baseFunctions(object, props) { 3607 var index = -1, 3608 length = props.length, 3609 resIndex = -1, 3610 result = []; 3611 3612 while (++index < length) { 3613 var key = props[index]; 3614 if (isFunction(object[key])) { 3615 result[++resIndex] = key; 3616 } 3617 } 3618 return result; 3619 } 3620 3621 /** 3622 * The base implementation of `get` without support for string paths 3623 * and default values. 3624 * 3625 * @private 3626 * @param {Object} object The object to query. 3627 * @param {Array} path The path of the property to get. 3628 * @param {string} [pathKey] The key representation of path. 3629 * @returns {*} Returns the resolved value. 3630 */ 3631 function baseGet(object, path, pathKey) { 3632 if (object == null) { 3633 return; 3634 } 3635 if (pathKey !== undefined && pathKey in toObject(object)) { 3636 path = [pathKey]; 3637 } 3638 var index = -1, 3639 length = path.length; 3640 3641 while (object != null && ++index < length) { 3642 var result = object = object[path[index]]; 3643 } 3644 return result; 3645 } 3646 3647 /** 3648 * The base implementation of `_.isEqual` without support for `this` binding 3649 * `customizer` functions. 3650 * 3651 * @private 3652 * @param {*} value The value to compare. 3653 * @param {*} other The other value to compare. 3654 * @param {Function} [customizer] The function to customize comparing values. 3655 * @param {boolean} [isLoose] Specify performing partial comparisons. 3656 * @param {Array} [stackA] Tracks traversed `value` objects. 3657 * @param {Array} [stackB] Tracks traversed `other` objects. 3658 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. 3659 */ 3660 function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { 3661 // Exit early for identical values. 3662 if (value === other) { 3663 // Treat `+0` vs. `-0` as not equal. 3664 return value !== 0 || (1 / value == 1 / other); 3665 } 3666 var valType = typeof value, 3667 othType = typeof other; 3668 3669 // Exit early for unlike primitive values. 3670 if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') || 3671 value == null || other == null) { 3672 // Return `false` unless both values are `NaN`. 3673 return value !== value && other !== other; 3674 } 3675 return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); 3676 } 3677 3678 /** 3679 * A specialized version of `baseIsEqual` for arrays and objects which performs 3680 * deep comparisons and tracks traversed objects enabling objects with circular 3681 * references to be compared. 3682 * 3683 * @private 3684 * @param {Object} object The object to compare. 3685 * @param {Object} other The other object to compare. 3686 * @param {Function} equalFunc The function to determine equivalents of values. 3687 * @param {Function} [customizer] The function to customize comparing objects. 3688 * @param {boolean} [isLoose] Specify performing partial comparisons. 3689 * @param {Array} [stackA=[]] Tracks traversed `value` objects. 3690 * @param {Array} [stackB=[]] Tracks traversed `other` objects. 3691 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 3692 */ 3693 function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { 3694 var objIsArr = isArray(object), 3695 othIsArr = isArray(other), 3696 objTag = arrayTag, 3697 othTag = arrayTag; 3698 3699 if (!objIsArr) { 3700 objTag = objToString.call(object); 3701 if (objTag == argsTag) { 3702 objTag = objectTag; 3703 } else if (objTag != objectTag) { 3704 objIsArr = isTypedArray(object); 3705 } 3706 } 3707 if (!othIsArr) { 3708 othTag = objToString.call(other); 3709 if (othTag == argsTag) { 3710 othTag = objectTag; 3711 } else if (othTag != objectTag) { 3712 othIsArr = isTypedArray(other); 3713 } 3714 } 3715 var objIsObj = objTag == objectTag, 3716 othIsObj = othTag == objectTag, 3717 isSameTag = objTag == othTag; 3718 3719 if (isSameTag && !(objIsArr || objIsObj)) { 3720 return equalByTag(object, other, objTag); 3721 } 3722 if (!isLoose) { 3723 var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), 3724 othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); 3725 3726 if (valWrapped || othWrapped) { 3727 return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); 3728 } 3729 } 3730 if (!isSameTag) { 3731 return false; 3732 } 3733 // Assume cyclic values are equal. 3734 // For more information on detecting circular references see https://es5.github.io/#JO. 3735 stackA || (stackA = []); 3736 stackB || (stackB = []); 3737 3738 var length = stackA.length; 3739 while (length--) { 3740 if (stackA[length] == object) { 3741 return stackB[length] == other; 3742 } 3743 } 3744 // Add `object` and `other` to the stack of traversed objects. 3745 stackA.push(object); 3746 stackB.push(other); 3747 3748 var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); 3749 3750 stackA.pop(); 3751 stackB.pop(); 3752 3753 return result; 3754 } 3755 3756 /** 3757 * The base implementation of `_.isMatch` without support for callback 3758 * shorthands and `this` binding. 3759 * 3760 * @private 3761 * @param {Object} object The object to inspect. 3762 * @param {Array} props The source property names to match. 3763 * @param {Array} values The source values to match. 3764 * @param {Array} strictCompareFlags Strict comparison flags for source values. 3765 * @param {Function} [customizer] The function to customize comparing objects. 3766 * @returns {boolean} Returns `true` if `object` is a match, else `false`. 3767 */ 3768 function baseIsMatch(object, props, values, strictCompareFlags, customizer) { 3769 var index = -1, 3770 length = props.length, 3771 noCustomizer = !customizer; 3772 3773 while (++index < length) { 3774 if ((noCustomizer && strictCompareFlags[index]) 3775 ? values[index] !== object[props[index]] 3776 : !(props[index] in object) 3777 ) { 3778 return false; 3779 } 3780 } 3781 index = -1; 3782 while (++index < length) { 3783 var key = props[index], 3784 objValue = object[key], 3785 srcValue = values[index]; 3786 3787 if (noCustomizer && strictCompareFlags[index]) { 3788 var result = objValue !== undefined || (key in object); 3789 } else { 3790 result = customizer ? customizer(objValue, srcValue, key) : undefined; 3791 if (result === undefined) { 3792 result = baseIsEqual(srcValue, objValue, customizer, true); 3793 } 3794 } 3795 if (!result) { 3796 return false; 3797 } 3798 } 3799 return true; 3800 } 3801 3802 /** 3803 * The base implementation of `_.map` without support for callback shorthands 3804 * and `this` binding. 3805 * 3806 * @private 3807 * @param {Array|Object|string} collection The collection to iterate over. 3808 * @param {Function} iteratee The function invoked per iteration. 3809 * @returns {Array} Returns the new mapped array. 3810 */ 3811 function baseMap(collection, iteratee) { 3812 var index = -1, 3813 length = getLength(collection), 3814 result = isLength(length) ? Array(length) : []; 3815 3816 baseEach(collection, function(value, key, collection) { 3817 result[++index] = iteratee(value, key, collection); 3818 }); 3819 return result; 3820 } 3821 3822 /** 3823 * The base implementation of `_.matches` which does not clone `source`. 3824 * 3825 * @private 3826 * @param {Object} source The object of property values to match. 3827 * @returns {Function} Returns the new function. 3828 */ 3829 function baseMatches(source) { 3830 var props = keys(source), 3831 length = props.length; 3832 3833 if (!length) { 3834 return constant(true); 3835 } 3836 if (length == 1) { 3837 var key = props[0], 3838 value = source[key]; 3839 3840 if (isStrictComparable(value)) { 3841 return function(object) { 3842 if (object == null) { 3843 return false; 3844 } 3845 return object[key] === value && (value !== undefined || (key in toObject(object))); 3846 }; 3847 } 3848 } 3849 var values = Array(length), 3850 strictCompareFlags = Array(length); 3851 3852 while (length--) { 3853 value = source[props[length]]; 3854 values[length] = value; 3855 strictCompareFlags[length] = isStrictComparable(value); 3856 } 3857 return function(object) { 3858 return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags); 3859 }; 3860 } 3861 3862 /** 3863 * The base implementation of `_.matchesProperty` which does not which does 3864 * not clone `value`. 3865 * 3866 * @private 3867 * @param {string} path The path of the property to get. 3868 * @param {*} value The value to compare. 3869 * @returns {Function} Returns the new function. 3870 */ 3871 function baseMatchesProperty(path, value) { 3872 var isArr = isArray(path), 3873 isCommon = isKey(path) && isStrictComparable(value), 3874 pathKey = (path + ''); 3875 3876 path = toPath(path); 3877 return function(object) { 3878 if (object == null) { 3879 return false; 3880 } 3881 var key = pathKey; 3882 object = toObject(object); 3883 if ((isArr || !isCommon) && !(key in object)) { 3884 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); 3885 if (object == null) { 3886 return false; 3887 } 3888 key = last(path); 3889 object = toObject(object); 3890 } 3891 return object[key] === value 3892 ? (value !== undefined || (key in object)) 3893 : baseIsEqual(value, object[key], null, true); 3894 }; 3895 } 3896 3897 /** 3898 * The base implementation of `_.merge` without support for argument juggling, 3899 * multiple sources, and `this` binding `customizer` functions. 3900 * 3901 * @private 3902 * @param {Object} object The destination object. 3903 * @param {Object} source The source object. 3904 * @param {Function} [customizer] The function to customize merging properties. 3905 * @param {Array} [stackA=[]] Tracks traversed source objects. 3906 * @param {Array} [stackB=[]] Associates values with source counterparts. 3907 * @returns {Object} Returns `object`. 3908 */ 3909 function baseMerge(object, source, customizer, stackA, stackB) { 3910 if (!isObject(object)) { 3911 return object; 3912 } 3913 var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source)); 3914 if (!isSrcArr) { 3915 var props = keys(source); 3916 push.apply(props, getSymbols(source)); 3917 } 3918 arrayEach(props || source, function(srcValue, key) { 3919 if (props) { 3920 key = srcValue; 3921 srcValue = source[key]; 3922 } 3923 if (isObjectLike(srcValue)) { 3924 stackA || (stackA = []); 3925 stackB || (stackB = []); 3926 baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); 3927 } 3928 else { 3929 var value = object[key], 3930 result = customizer ? customizer(value, srcValue, key, object, source) : undefined, 3931 isCommon = result === undefined; 3932 3933 if (isCommon) { 3934 result = srcValue; 3935 } 3936 if ((isSrcArr || result !== undefined) && 3937 (isCommon || (result === result ? (result !== value) : (value === value)))) { 3938 object[key] = result; 3939 } 3940 } 3941 }); 3942 return object; 3943 } 3944 3945 /** 3946 * A specialized version of `baseMerge` for arrays and objects which performs 3947 * deep merges and tracks traversed objects enabling objects with circular 3948 * references to be merged. 3949 * 3950 * @private 3951 * @param {Object} object The destination object. 3952 * @param {Object} source The source object. 3953 * @param {string} key The key of the value to merge. 3954 * @param {Function} mergeFunc The function to merge values. 3955 * @param {Function} [customizer] The function to customize merging properties. 3956 * @param {Array} [stackA=[]] Tracks traversed source objects. 3957 * @param {Array} [stackB=[]] Associates values with source counterparts. 3958 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 3959 */ 3960 function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) { 3961 var length = stackA.length, 3962 srcValue = source[key]; 3963 3964 while (length--) { 3965 if (stackA[length] == srcValue) { 3966 object[key] = stackB[length]; 3967 return; 3968 } 3969 } 3970 var value = object[key], 3971 result = customizer ? customizer(value, srcValue, key, object, source) : undefined, 3972 isCommon = result === undefined; 3973 3974 if (isCommon) { 3975 result = srcValue; 3976 if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) { 3977 result = isArray(value) 3978 ? value 3979 : (getLength(value) ? arrayCopy(value) : []); 3980 } 3981 else if (isPlainObject(srcValue) || isArguments(srcValue)) { 3982 result = isArguments(value) 3983 ? toPlainObject(value) 3984 : (isPlainObject(value) ? value : {}); 3985 } 3986 else { 3987 isCommon = false; 3988 } 3989 } 3990 // Add the source value to the stack of traversed objects and associate 3991 // it with its merged value. 3992 stackA.push(srcValue); 3993 stackB.push(result); 3994 3995 if (isCommon) { 3996 // Recursively merge objects and arrays (susceptible to call stack limits). 3997 object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB); 3998 } else if (result === result ? (result !== value) : (value === value)) { 3999 object[key] = result; 4000 } 4001 } 4002 4003 /** 4004 * The base implementation of `_.property` without support for deep paths. 4005 * 4006 * @private 4007 * @param {string} key The key of the property to get. 4008 * @returns {Function} Returns the new function. 4009 */ 4010 function baseProperty(key) { 4011 return function(object) { 4012 return object == null ? undefined : object[key]; 4013 }; 4014 } 4015 4016 /** 4017 * A specialized version of `baseProperty` which supports deep paths. 4018 * 4019 * @private 4020 * @param {Array|string} path The path of the property to get. 4021 * @returns {Function} Returns the new function. 4022 */ 4023 function basePropertyDeep(path) { 4024 var pathKey = (path + ''); 4025 path = toPath(path); 4026 return function(object) { 4027 return baseGet(object, path, pathKey); 4028 }; 4029 } 4030 4031 /** 4032 * The base implementation of `_.pullAt` without support for individual 4033 * index arguments and capturing the removed elements. 4034 * 4035 * @private 4036 * @param {Array} array The array to modify. 4037 * @param {number[]} indexes The indexes of elements to remove. 4038 * @returns {Array} Returns `array`. 4039 */ 4040 function basePullAt(array, indexes) { 4041 var length = indexes.length; 4042 while (length--) { 4043 var index = parseFloat(indexes[length]); 4044 if (index != previous && isIndex(index)) { 4045 var previous = index; 4046 splice.call(array, index, 1); 4047 } 4048 } 4049 return array; 4050 } 4051 4052 /** 4053 * The base implementation of `_.random` without support for argument juggling 4054 * and returning floating-point numbers. 4055 * 4056 * @private 4057 * @param {number} min The minimum possible value. 4058 * @param {number} max The maximum possible value. 4059 * @returns {number} Returns the random number. 4060 */ 4061 function baseRandom(min, max) { 4062 return min + floor(nativeRandom() * (max - min + 1)); 4063 } 4064 4065 /** 4066 * The base implementation of `_.reduce` and `_.reduceRight` without support 4067 * for callback shorthands and `this` binding, which iterates over `collection` 4068 * using the provided `eachFunc`. 4069 * 4070 * @private 4071 * @param {Array|Object|string} collection The collection to iterate over. 4072 * @param {Function} iteratee The function invoked per iteration. 4073 * @param {*} accumulator The initial value. 4074 * @param {boolean} initFromCollection Specify using the first or last element 4075 * of `collection` as the initial value. 4076 * @param {Function} eachFunc The function to iterate over `collection`. 4077 * @returns {*} Returns the accumulated value. 4078 */ 4079 function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) { 4080 eachFunc(collection, function(value, index, collection) { 4081 accumulator = initFromCollection 4082 ? (initFromCollection = false, value) 4083 : iteratee(accumulator, value, index, collection); 4084 }); 4085 return accumulator; 4086 } 4087 4088 /** 4089 * The base implementation of `setData` without support for hot loop detection. 4090 * 4091 * @private 4092 * @param {Function} func The function to associate metadata with. 4093 * @param {*} data The metadata. 4094 * @returns {Function} Returns `func`. 4095 */ 4096 var baseSetData = !metaMap ? identity : function(func, data) { 4097 metaMap.set(func, data); 4098 return func; 4099 }; 4100 4101 /** 4102 * The base implementation of `_.slice` without an iteratee call guard. 4103 * 4104 * @private 4105 * @param {Array} array The array to slice. 4106 * @param {number} [start=0] The start position. 4107 * @param {number} [end=array.length] The end position. 4108 * @returns {Array} Returns the slice of `array`. 4109 */ 4110 function baseSlice(array, start, end) { 4111 var index = -1, 4112 length = array.length; 4113 4114 start = start == null ? 0 : (+start || 0); 4115 if (start < 0) { 4116 start = -start > length ? 0 : (length + start); 4117 } 4118 end = (end === undefined || end > length) ? length : (+end || 0); 4119 if (end < 0) { 4120 end += length; 4121 } 4122 length = start > end ? 0 : ((end - start) >>> 0); 4123 start >>>= 0; 4124 4125 var result = Array(length); 4126 while (++index < length) { 4127 result[index] = array[index + start]; 4128 } 4129 return result; 4130 } 4131 4132 /** 4133 * The base implementation of `_.some` without support for callback shorthands 4134 * and `this` binding. 4135 * 4136 * @private 4137 * @param {Array|Object|string} collection The collection to iterate over. 4138 * @param {Function} predicate The function invoked per iteration. 4139 * @returns {boolean} Returns `true` if any element passes the predicate check, 4140 * else `false`. 4141 */ 4142 function baseSome(collection, predicate) { 4143 var result; 4144 4145 baseEach(collection, function(value, index, collection) { 4146 result = predicate(value, index, collection); 4147 return !result; 4148 }); 4149 return !!result; 4150 } 4151 4152 /** 4153 * The base implementation of `_.sortBy` which uses `comparer` to define 4154 * the sort order of `array` and replaces criteria objects with their 4155 * corresponding values. 4156 * 4157 * @private 4158 * @param {Array} array The array to sort. 4159 * @param {Function} comparer The function to define sort order. 4160 * @returns {Array} Returns `array`. 4161 */ 4162 function baseSortBy(array, comparer) { 4163 var length = array.length; 4164 4165 array.sort(comparer); 4166 while (length--) { 4167 array[length] = array[length].value; 4168 } 4169 return array; 4170 } 4171 4172 /** 4173 * The base implementation of `_.sortByOrder` without param guards. 4174 * 4175 * @private 4176 * @param {Array|Object|string} collection The collection to iterate over. 4177 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. 4178 * @param {boolean[]} orders The sort orders of `iteratees`. 4179 * @returns {Array} Returns the new sorted array. 4180 */ 4181 function baseSortByOrder(collection, iteratees, orders) { 4182 var callback = getCallback(), 4183 index = -1; 4184 4185 iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); }); 4186 4187 var result = baseMap(collection, function(value) { 4188 var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); }); 4189 return { 'criteria': criteria, 'index': ++index, 'value': value }; 4190 }); 4191 4192 return baseSortBy(result, function(object, other) { 4193 return compareMultiple(object, other, orders); 4194 }); 4195 } 4196 4197 /** 4198 * The base implementation of `_.sum` without support for callback shorthands 4199 * and `this` binding. 4200 * 4201 * @private 4202 * @param {Array|Object|string} collection The collection to iterate over. 4203 * @param {Function} iteratee The function invoked per iteration. 4204 * @returns {number} Returns the sum. 4205 */ 4206 function baseSum(collection, iteratee) { 4207 var result = 0; 4208 baseEach(collection, function(value, index, collection) { 4209 result += +iteratee(value, index, collection) || 0; 4210 }); 4211 return result; 4212 } 4213 4214 /** 4215 * The base implementation of `_.uniq` without support for callback shorthands 4216 * and `this` binding. 4217 * 4218 * @private 4219 * @param {Array} array The array to inspect. 4220 * @param {Function} [iteratee] The function invoked per iteration. 4221 * @returns {Array} Returns the new duplicate-value-free array. 4222 */ 4223 function baseUniq(array, iteratee) { 4224 var index = -1, 4225 indexOf = getIndexOf(), 4226 length = array.length, 4227 isCommon = indexOf == baseIndexOf, 4228 isLarge = isCommon && length >= 200, 4229 seen = isLarge ? createCache() : null, 4230 result = []; 4231 4232 if (seen) { 4233 indexOf = cacheIndexOf; 4234 isCommon = false; 4235 } else { 4236 isLarge = false; 4237 seen = iteratee ? [] : result; 4238 } 4239 outer: 4240 while (++index < length) { 4241 var value = array[index], 4242 computed = iteratee ? iteratee(value, index, array) : value; 4243 4244 if (isCommon && value === value) { 4245 var seenIndex = seen.length; 4246 while (seenIndex--) { 4247 if (seen[seenIndex] === computed) { 4248 continue outer; 4249 } 4250 } 4251 if (iteratee) { 4252 seen.push(computed); 4253 } 4254 result.push(value); 4255 } 4256 else if (indexOf(seen, computed, 0) < 0) { 4257 if (iteratee || isLarge) { 4258 seen.push(computed); 4259 } 4260 result.push(value); 4261 } 4262 } 4263 return result; 4264 } 4265 4266 /** 4267 * The base implementation of `_.values` and `_.valuesIn` which creates an 4268 * array of `object` property values corresponding to the property names 4269 * of `props`. 4270 * 4271 * @private 4272 * @param {Object} object The object to query. 4273 * @param {Array} props The property names to get values for. 4274 * @returns {Object} Returns the array of property values. 4275 */ 4276 function baseValues(object, props) { 4277 var index = -1, 4278 length = props.length, 4279 result = Array(length); 4280 4281 while (++index < length) { 4282 result[index] = object[props[index]]; 4283 } 4284 return result; 4285 } 4286 4287 /** 4288 * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`, 4289 * and `_.takeWhile` without support for callback shorthands and `this` binding. 4290 * 4291 * @private 4292 * @param {Array} array The array to query. 4293 * @param {Function} predicate The function invoked per iteration. 4294 * @param {boolean} [isDrop] Specify dropping elements instead of taking them. 4295 * @param {boolean} [fromRight] Specify iterating from right to left. 4296 * @returns {Array} Returns the slice of `array`. 4297 */ 4298 function baseWhile(array, predicate, isDrop, fromRight) { 4299 var length = array.length, 4300 index = fromRight ? length : -1; 4301 4302 while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {} 4303 return isDrop 4304 ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) 4305 : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); 4306 } 4307 4308 /** 4309 * The base implementation of `wrapperValue` which returns the result of 4310 * performing a sequence of actions on the unwrapped `value`, where each 4311 * successive action is supplied the return value of the previous. 4312 * 4313 * @private 4314 * @param {*} value The unwrapped value. 4315 * @param {Array} actions Actions to peform to resolve the unwrapped value. 4316 * @returns {*} Returns the resolved value. 4317 */ 4318 function baseWrapperValue(value, actions) { 4319 var result = value; 4320 if (result instanceof LazyWrapper) { 4321 result = result.value(); 4322 } 4323 var index = -1, 4324 length = actions.length; 4325 4326 while (++index < length) { 4327 var args = [result], 4328 action = actions[index]; 4329 4330 push.apply(args, action.args); 4331 result = action.func.apply(action.thisArg, args); 4332 } 4333 return result; 4334 } 4335 4336 /** 4337 * Performs a binary search of `array` to determine the index at which `value` 4338 * should be inserted into `array` in order to maintain its sort order. 4339 * 4340 * @private 4341 * @param {Array} array The sorted array to inspect. 4342 * @param {*} value The value to evaluate. 4343 * @param {boolean} [retHighest] Specify returning the highest qualified index. 4344 * @returns {number} Returns the index at which `value` should be inserted 4345 * into `array`. 4346 */ 4347 function binaryIndex(array, value, retHighest) { 4348 var low = 0, 4349 high = array ? array.length : low; 4350 4351 if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { 4352 while (low < high) { 4353 var mid = (low + high) >>> 1, 4354 computed = array[mid]; 4355 4356 if (retHighest ? (computed <= value) : (computed < value)) { 4357 low = mid + 1; 4358 } else { 4359 high = mid; 4360 } 4361 } 4362 return high; 4363 } 4364 return binaryIndexBy(array, value, identity, retHighest); 4365 } 4366 4367 /** 4368 * This function is like `binaryIndex` except that it invokes `iteratee` for 4369 * `value` and each element of `array` to compute their sort ranking. The 4370 * iteratee is invoked with one argument; (value). 4371 * 4372 * @private 4373 * @param {Array} array The sorted array to inspect. 4374 * @param {*} value The value to evaluate. 4375 * @param {Function} iteratee The function invoked per iteration. 4376 * @param {boolean} [retHighest] Specify returning the highest qualified index. 4377 * @returns {number} Returns the index at which `value` should be inserted 4378 * into `array`. 4379 */ 4380 function binaryIndexBy(array, value, iteratee, retHighest) { 4381 value = iteratee(value); 4382 4383 var low = 0, 4384 high = array ? array.length : 0, 4385 valIsNaN = value !== value, 4386 valIsUndef = value === undefined; 4387 4388 while (low < high) { 4389 var mid = floor((low + high) / 2), 4390 computed = iteratee(array[mid]), 4391 isReflexive = computed === computed; 4392 4393 if (valIsNaN) { 4394 var setLow = isReflexive || retHighest; 4395 } else if (valIsUndef) { 4396 setLow = isReflexive && (retHighest || computed !== undefined); 4397 } else { 4398 setLow = retHighest ? (computed <= value) : (computed < value); 4399 } 4400 if (setLow) { 4401 low = mid + 1; 4402 } else { 4403 high = mid; 4404 } 4405 } 4406 return nativeMin(high, MAX_ARRAY_INDEX); 4407 } 4408 4409 /** 4410 * A specialized version of `baseCallback` which only supports `this` binding 4411 * and specifying the number of arguments to provide to `func`. 4412 * 4413 * @private 4414 * @param {Function} func The function to bind. 4415 * @param {*} thisArg The `this` binding of `func`. 4416 * @param {number} [argCount] The number of arguments to provide to `func`. 4417 * @returns {Function} Returns the callback. 4418 */ 4419 function bindCallback(func, thisArg, argCount) { 4420 if (typeof func != 'function') { 4421 return identity; 4422 } 4423 if (thisArg === undefined) { 4424 return func; 4425 } 4426 switch (argCount) { 4427 case 1: return function(value) { 4428 return func.call(thisArg, value); 4429 }; 4430 case 3: return function(value, index, collection) { 4431 return func.call(thisArg, value, index, collection); 4432 }; 4433 case 4: return function(accumulator, value, index, collection) { 4434 return func.call(thisArg, accumulator, value, index, collection); 4435 }; 4436 case 5: return function(value, other, key, object, source) { 4437 return func.call(thisArg, value, other, key, object, source); 4438 }; 4439 } 4440 return function() { 4441 return func.apply(thisArg, arguments); 4442 }; 4443 } 4444 4445 /** 4446 * Creates a clone of the given array buffer. 4447 * 4448 * @private 4449 * @param {ArrayBuffer} buffer The array buffer to clone. 4450 * @returns {ArrayBuffer} Returns the cloned array buffer. 4451 */ 4452 function bufferClone(buffer) { 4453 return bufferSlice.call(buffer, 0); 4454 } 4455 if (!bufferSlice) { 4456 // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`. 4457 bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) { 4458 var byteLength = buffer.byteLength, 4459 floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0, 4460 offset = floatLength * FLOAT64_BYTES_PER_ELEMENT, 4461 result = new ArrayBuffer(byteLength); 4462 4463 if (floatLength) { 4464 var view = new Float64Array(result, 0, floatLength); 4465 view.set(new Float64Array(buffer, 0, floatLength)); 4466 } 4467 if (byteLength != offset) { 4468 view = new Uint8Array(result, offset); 4469 view.set(new Uint8Array(buffer, offset)); 4470 } 4471 return result; 4472 }; 4473 } 4474 4475 /** 4476 * Creates an array that is the composition of partially applied arguments, 4477 * placeholders, and provided arguments into a single array of arguments. 4478 * 4479 * @private 4480 * @param {Array|Object} args The provided arguments. 4481 * @param {Array} partials The arguments to prepend to those provided. 4482 * @param {Array} holders The `partials` placeholder indexes. 4483 * @returns {Array} Returns the new array of composed arguments. 4484 */ 4485 function composeArgs(args, partials, holders) { 4486 var holdersLength = holders.length, 4487 argsIndex = -1, 4488 argsLength = nativeMax(args.length - holdersLength, 0), 4489 leftIndex = -1, 4490 leftLength = partials.length, 4491 result = Array(argsLength + leftLength); 4492 4493 while (++leftIndex < leftLength) { 4494 result[leftIndex] = partials[leftIndex]; 4495 } 4496 while (++argsIndex < holdersLength) { 4497 result[holders[argsIndex]] = args[argsIndex]; 4498 } 4499 while (argsLength--) { 4500 result[leftIndex++] = args[argsIndex++]; 4501 } 4502 return result; 4503 } 4504 4505 /** 4506 * This function is like `composeArgs` except that the arguments composition 4507 * is tailored for `_.partialRight`. 4508 * 4509 * @private 4510 * @param {Array|Object} args The provided arguments. 4511 * @param {Array} partials The arguments to append to those provided. 4512 * @param {Array} holders The `partials` placeholder indexes. 4513 * @returns {Array} Returns the new array of composed arguments. 4514 */ 4515 function composeArgsRight(args, partials, holders) { 4516 var holdersIndex = -1, 4517 holdersLength = holders.length, 4518 argsIndex = -1, 4519 argsLength = nativeMax(args.length - holdersLength, 0), 4520 rightIndex = -1, 4521 rightLength = partials.length, 4522 result = Array(argsLength + rightLength); 4523 4524 while (++argsIndex < argsLength) { 4525 result[argsIndex] = args[argsIndex]; 4526 } 4527 var pad = argsIndex; 4528 while (++rightIndex < rightLength) { 4529 result[pad + rightIndex] = partials[rightIndex]; 4530 } 4531 while (++holdersIndex < holdersLength) { 4532 result[pad + holders[holdersIndex]] = args[argsIndex++]; 4533 } 4534 return result; 4535 } 4536 4537 /** 4538 * Creates a function that aggregates a collection, creating an accumulator 4539 * object composed from the results of running each element in the collection 4540 * through an iteratee. 4541 * 4542 * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`, 4543 * and `_.partition`. 4544 * 4545 * @private 4546 * @param {Function} setter The function to set keys and values of the accumulator object. 4547 * @param {Function} [initializer] The function to initialize the accumulator object. 4548 * @returns {Function} Returns the new aggregator function. 4549 */ 4550 function createAggregator(setter, initializer) { 4551 return function(collection, iteratee, thisArg) { 4552 var result = initializer ? initializer() : {}; 4553 iteratee = getCallback(iteratee, thisArg, 3); 4554 4555 if (isArray(collection)) { 4556 var index = -1, 4557 length = collection.length; 4558 4559 while (++index < length) { 4560 var value = collection[index]; 4561 setter(result, value, iteratee(value, index, collection), collection); 4562 } 4563 } else { 4564 baseEach(collection, function(value, key, collection) { 4565 setter(result, value, iteratee(value, key, collection), collection); 4566 }); 4567 } 4568 return result; 4569 }; 4570 } 4571 4572 /** 4573 * Creates a function that assigns properties of source object(s) to a given 4574 * destination object. 4575 * 4576 * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`. 4577 * 4578 * @private 4579 * @param {Function} assigner The function to assign values. 4580 * @returns {Function} Returns the new assigner function. 4581 */ 4582 function createAssigner(assigner) { 4583 return restParam(function(object, sources) { 4584 var index = -1, 4585 length = object == null ? 0 : sources.length, 4586 customizer = length > 2 && sources[length - 2], 4587 guard = length > 2 && sources[2], 4588 thisArg = length > 1 && sources[length - 1]; 4589 4590 if (typeof customizer == 'function') { 4591 customizer = bindCallback(customizer, thisArg, 5); 4592 length -= 2; 4593 } else { 4594 customizer = typeof thisArg == 'function' ? thisArg : null; 4595 length -= (customizer ? 1 : 0); 4596 } 4597 if (guard && isIterateeCall(sources[0], sources[1], guard)) { 4598 customizer = length < 3 ? null : customizer; 4599 length = 1; 4600 } 4601 while (++index < length) { 4602 var source = sources[index]; 4603 if (source) { 4604 assigner(object, source, customizer); 4605 } 4606 } 4607 return object; 4608 }); 4609 } 4610 4611 /** 4612 * Creates a `baseEach` or `baseEachRight` function. 4613 * 4614 * @private 4615 * @param {Function} eachFunc The function to iterate over a collection. 4616 * @param {boolean} [fromRight] Specify iterating from right to left. 4617 * @returns {Function} Returns the new base function. 4618 */ 4619 function createBaseEach(eachFunc, fromRight) { 4620 return function(collection, iteratee) { 4621 var length = collection ? getLength(collection) : 0; 4622 if (!isLength(length)) { 4623 return eachFunc(collection, iteratee); 4624 } 4625 var index = fromRight ? length : -1, 4626 iterable = toObject(collection); 4627 4628 while ((fromRight ? index-- : ++index < length)) { 4629 if (iteratee(iterable[index], index, iterable) === false) { 4630 break; 4631 } 4632 } 4633 return collection; 4634 }; 4635 } 4636 4637 /** 4638 * Creates a base function for `_.forIn` or `_.forInRight`. 4639 * 4640 * @private 4641 * @param {boolean} [fromRight] Specify iterating from right to left. 4642 * @returns {Function} Returns the new base function. 4643 */ 4644 function createBaseFor(fromRight) { 4645 return function(object, iteratee, keysFunc) { 4646 var iterable = toObject(object), 4647 props = keysFunc(object), 4648 length = props.length, 4649 index = fromRight ? length : -1; 4650 4651 while ((fromRight ? index-- : ++index < length)) { 4652 var key = props[index]; 4653 if (iteratee(iterable[key], key, iterable) === false) { 4654 break; 4655 } 4656 } 4657 return object; 4658 }; 4659 } 4660 4661 /** 4662 * Creates a function that wraps `func` and invokes it with the `this` 4663 * binding of `thisArg`. 4664 * 4665 * @private 4666 * @param {Function} func The function to bind. 4667 * @param {*} [thisArg] The `this` binding of `func`. 4668 * @returns {Function} Returns the new bound function. 4669 */ 4670 function createBindWrapper(func, thisArg) { 4671 var Ctor = createCtorWrapper(func); 4672 4673 function wrapper() { 4674 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; 4675 return fn.apply(thisArg, arguments); 4676 } 4677 return wrapper; 4678 } 4679 4680 /** 4681 * Creates a `Set` cache object to optimize linear searches of large arrays. 4682 * 4683 * @private 4684 * @param {Array} [values] The values to cache. 4685 * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`. 4686 */ 4687 var createCache = !(nativeCreate && Set) ? constant(null) : function(values) { 4688 return new SetCache(values); 4689 }; 4690 4691 /** 4692 * Creates a function that produces compound words out of the words in a 4693 * given string. 4694 * 4695 * @private 4696 * @param {Function} callback The function to combine each word. 4697 * @returns {Function} Returns the new compounder function. 4698 */ 4699 function createCompounder(callback) { 4700 return function(string) { 4701 var index = -1, 4702 array = words(deburr(string)), 4703 length = array.length, 4704 result = ''; 4705 4706 while (++index < length) { 4707 result = callback(result, array[index], index); 4708 } 4709 return result; 4710 }; 4711 } 4712 4713 /** 4714 * Creates a function that produces an instance of `Ctor` regardless of 4715 * whether it was invoked as part of a `new` expression or by `call` or `apply`. 4716 * 4717 * @private 4718 * @param {Function} Ctor The constructor to wrap. 4719 * @returns {Function} Returns the new wrapped function. 4720 */ 4721 function createCtorWrapper(Ctor) { 4722 return function() { 4723 var thisBinding = baseCreate(Ctor.prototype), 4724 result = Ctor.apply(thisBinding, arguments); 4725 4726 // Mimic the constructor's `return` behavior. 4727 // See https://es5.github.io/#x13.2.2 for more details. 4728 return isObject(result) ? result : thisBinding; 4729 }; 4730 } 4731 4732 /** 4733 * Creates a `_.curry` or `_.curryRight` function. 4734 * 4735 * @private 4736 * @param {boolean} flag The curry bit flag. 4737 * @returns {Function} Returns the new curry function. 4738 */ 4739 function createCurry(flag) { 4740 function curryFunc(func, arity, guard) { 4741 if (guard && isIterateeCall(func, arity, guard)) { 4742 arity = null; 4743 } 4744 var result = createWrapper(func, flag, null, null, null, null, null, arity); 4745 result.placeholder = curryFunc.placeholder; 4746 return result; 4747 } 4748 return curryFunc; 4749 } 4750 4751 /** 4752 * Creates a `_.max` or `_.min` function. 4753 * 4754 * @private 4755 * @param {Function} arrayFunc The function to get the extremum value from an array. 4756 * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum, 4757 * extremum value. 4758 * @returns {Function} Returns the new extremum function. 4759 */ 4760 function createExtremum(arrayFunc, isMin) { 4761 return function(collection, iteratee, thisArg) { 4762 if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { 4763 iteratee = null; 4764 } 4765 var func = getCallback(), 4766 noIteratee = iteratee == null; 4767 4768 if (!(func === baseCallback && noIteratee)) { 4769 noIteratee = false; 4770 iteratee = func(iteratee, thisArg, 3); 4771 } 4772 if (noIteratee) { 4773 var isArr = isArray(collection); 4774 if (!isArr && isString(collection)) { 4775 iteratee = charAtCallback; 4776 } else { 4777 return arrayFunc(isArr ? collection : toIterable(collection)); 4778 } 4779 } 4780 return extremumBy(collection, iteratee, isMin); 4781 }; 4782 } 4783 4784 /** 4785 * Creates a `_.find` or `_.findLast` function. 4786 * 4787 * @private 4788 * @param {Function} eachFunc The function to iterate over a collection. 4789 * @param {boolean} [fromRight] Specify iterating from right to left. 4790 * @returns {Function} Returns the new find function. 4791 */ 4792 function createFind(eachFunc, fromRight) { 4793 return function(collection, predicate, thisArg) { 4794 predicate = getCallback(predicate, thisArg, 3); 4795 if (isArray(collection)) { 4796 var index = baseFindIndex(collection, predicate, fromRight); 4797 return index > -1 ? collection[index] : undefined; 4798 } 4799 return baseFind(collection, predicate, eachFunc); 4800 } 4801 } 4802 4803 /** 4804 * Creates a `_.findIndex` or `_.findLastIndex` function. 4805 * 4806 * @private 4807 * @param {boolean} [fromRight] Specify iterating from right to left. 4808 * @returns {Function} Returns the new find function. 4809 */ 4810 function createFindIndex(fromRight) { 4811 return function(array, predicate, thisArg) { 4812 if (!(array && array.length)) { 4813 return -1; 4814 } 4815 predicate = getCallback(predicate, thisArg, 3); 4816 return baseFindIndex(array, predicate, fromRight); 4817 }; 4818 } 4819 4820 /** 4821 * Creates a `_.findKey` or `_.findLastKey` function. 4822 * 4823 * @private 4824 * @param {Function} objectFunc The function to iterate over an object. 4825 * @returns {Function} Returns the new find function. 4826 */ 4827 function createFindKey(objectFunc) { 4828 return function(object, predicate, thisArg) { 4829 predicate = getCallback(predicate, thisArg, 3); 4830 return baseFind(object, predicate, objectFunc, true); 4831 }; 4832 } 4833 4834 /** 4835 * Creates a `_.flow` or `_.flowRight` function. 4836 * 4837 * @private 4838 * @param {boolean} [fromRight] Specify iterating from right to left. 4839 * @returns {Function} Returns the new flow function. 4840 */ 4841 function createFlow(fromRight) { 4842 return function() { 4843 var length = arguments.length; 4844 if (!length) { 4845 return function() { return arguments[0]; }; 4846 } 4847 var wrapper, 4848 index = fromRight ? length : -1, 4849 leftIndex = 0, 4850 funcs = Array(length); 4851 4852 while ((fromRight ? index-- : ++index < length)) { 4853 var func = funcs[leftIndex++] = arguments[index]; 4854 if (typeof func != 'function') { 4855 throw new TypeError(FUNC_ERROR_TEXT); 4856 } 4857 var funcName = wrapper ? '' : getFuncName(func); 4858 wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper; 4859 } 4860 index = wrapper ? -1 : length; 4861 while (++index < length) { 4862 func = funcs[index]; 4863 funcName = getFuncName(func); 4864 4865 var data = funcName == 'wrapper' ? getData(func) : null; 4866 if (data && isLaziable(data[0])) { 4867 wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); 4868 } else { 4869 wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func); 4870 } 4871 } 4872 return function() { 4873 var args = arguments; 4874 if (wrapper && args.length == 1 && isArray(args[0])) { 4875 return wrapper.plant(args[0]).value(); 4876 } 4877 var index = 0, 4878 result = funcs[index].apply(this, args); 4879 4880 while (++index < length) { 4881 result = funcs[index].call(this, result); 4882 } 4883 return result; 4884 }; 4885 }; 4886 } 4887 4888 /** 4889 * Creates a function for `_.forEach` or `_.forEachRight`. 4890 * 4891 * @private 4892 * @param {Function} arrayFunc The function to iterate over an array. 4893 * @param {Function} eachFunc The function to iterate over a collection. 4894 * @returns {Function} Returns the new each function. 4895 */ 4896 function createForEach(arrayFunc, eachFunc) { 4897 return function(collection, iteratee, thisArg) { 4898 return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) 4899 ? arrayFunc(collection, iteratee) 4900 : eachFunc(collection, bindCallback(iteratee, thisArg, 3)); 4901 }; 4902 } 4903 4904 /** 4905 * Creates a function for `_.forIn` or `_.forInRight`. 4906 * 4907 * @private 4908 * @param {Function} objectFunc The function to iterate over an object. 4909 * @returns {Function} Returns the new each function. 4910 */ 4911 function createForIn(objectFunc) { 4912 return function(object, iteratee, thisArg) { 4913 if (typeof iteratee != 'function' || thisArg !== undefined) { 4914 iteratee = bindCallback(iteratee, thisArg, 3); 4915 } 4916 return objectFunc(object, iteratee, keysIn); 4917 }; 4918 } 4919 4920 /** 4921 * Creates a function for `_.forOwn` or `_.forOwnRight`. 4922 * 4923 * @private 4924 * @param {Function} objectFunc The function to iterate over an object. 4925 * @returns {Function} Returns the new each function. 4926 */ 4927 function createForOwn(objectFunc) { 4928 return function(object, iteratee, thisArg) { 4929 if (typeof iteratee != 'function' || thisArg !== undefined) { 4930 iteratee = bindCallback(iteratee, thisArg, 3); 4931 } 4932 return objectFunc(object, iteratee); 4933 }; 4934 } 4935 4936 /** 4937 * Creates a function for `_.padLeft` or `_.padRight`. 4938 * 4939 * @private 4940 * @param {boolean} [fromRight] Specify padding from the right. 4941 * @returns {Function} Returns the new pad function. 4942 */ 4943 function createPadDir(fromRight) { 4944 return function(string, length, chars) { 4945 string = baseToString(string); 4946 return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string)); 4947 }; 4948 } 4949 4950 /** 4951 * Creates a `_.partial` or `_.partialRight` function. 4952 * 4953 * @private 4954 * @param {boolean} flag The partial bit flag. 4955 * @returns {Function} Returns the new partial function. 4956 */ 4957 function createPartial(flag) { 4958 var partialFunc = restParam(function(func, partials) { 4959 var holders = replaceHolders(partials, partialFunc.placeholder); 4960 return createWrapper(func, flag, null, partials, holders); 4961 }); 4962 return partialFunc; 4963 } 4964 4965 /** 4966 * Creates a function for `_.reduce` or `_.reduceRight`. 4967 * 4968 * @private 4969 * @param {Function} arrayFunc The function to iterate over an array. 4970 * @param {Function} eachFunc The function to iterate over a collection. 4971 * @returns {Function} Returns the new each function. 4972 */ 4973 function createReduce(arrayFunc, eachFunc) { 4974 return function(collection, iteratee, accumulator, thisArg) { 4975 var initFromArray = arguments.length < 3; 4976 return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) 4977 ? arrayFunc(collection, iteratee, accumulator, initFromArray) 4978 : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc); 4979 }; 4980 } 4981 4982 /** 4983 * Creates a function that wraps `func` and invokes it with optional `this` 4984 * binding of, partial application, and currying. 4985 * 4986 * @private 4987 * @param {Function|string} func The function or method name to reference. 4988 * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details. 4989 * @param {*} [thisArg] The `this` binding of `func`. 4990 * @param {Array} [partials] The arguments to prepend to those provided to the new function. 4991 * @param {Array} [holders] The `partials` placeholder indexes. 4992 * @param {Array} [partialsRight] The arguments to append to those provided to the new function. 4993 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. 4994 * @param {Array} [argPos] The argument positions of the new function. 4995 * @param {number} [ary] The arity cap of `func`. 4996 * @param {number} [arity] The arity of `func`. 4997 * @returns {Function} Returns the new wrapped function. 4998 */ 4999 function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { 5000 var isAry = bitmask & ARY_FLAG, 5001 isBind = bitmask & BIND_FLAG, 5002 isBindKey = bitmask & BIND_KEY_FLAG, 5003 isCurry = bitmask & CURRY_FLAG, 5004 isCurryBound = bitmask & CURRY_BOUND_FLAG, 5005 isCurryRight = bitmask & CURRY_RIGHT_FLAG; 5006 5007 var Ctor = !isBindKey && createCtorWrapper(func), 5008 key = func; 5009 5010 function wrapper() { 5011 // Avoid `arguments` object use disqualifying optimizations by 5012 // converting it to an array before providing it to other functions. 5013 var length = arguments.length, 5014 index = length, 5015 args = Array(length); 5016 5017 while (index--) { 5018 args[index] = arguments[index]; 5019 } 5020 if (partials) { 5021 args = composeArgs(args, partials, holders); 5022 } 5023 if (partialsRight) { 5024 args = composeArgsRight(args, partialsRight, holdersRight); 5025 } 5026 if (isCurry || isCurryRight) { 5027 var placeholder = wrapper.placeholder, 5028 argsHolders = replaceHolders(args, placeholder); 5029 5030 length -= argsHolders.length; 5031 if (length < arity) { 5032 var newArgPos = argPos ? arrayCopy(argPos) : null, 5033 newArity = nativeMax(arity - length, 0), 5034 newsHolders = isCurry ? argsHolders : null, 5035 newHoldersRight = isCurry ? null : argsHolders, 5036 newPartials = isCurry ? args : null, 5037 newPartialsRight = isCurry ? null : args; 5038 5039 bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); 5040 bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); 5041 5042 if (!isCurryBound) { 5043 bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); 5044 } 5045 var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity], 5046 result = createHybridWrapper.apply(undefined, newData); 5047 5048 if (isLaziable(func)) { 5049 setData(result, newData); 5050 } 5051 result.placeholder = placeholder; 5052 return result; 5053 } 5054 } 5055 var thisBinding = isBind ? thisArg : this; 5056 if (isBindKey) { 5057 func = thisBinding[key]; 5058 } 5059 if (argPos) { 5060 args = reorder(args, argPos); 5061 } 5062 if (isAry && ary < args.length) { 5063 args.length = ary; 5064 } 5065 var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func; 5066 return fn.apply(thisBinding, args); 5067 } 5068 return wrapper; 5069 } 5070 5071 /** 5072 * Creates the padding required for `string` based on the given `length`. 5073 * The `chars` string is truncated if the number of characters exceeds `length`. 5074 * 5075 * @private 5076 * @param {string} string The string to create padding for. 5077 * @param {number} [length=0] The padding length. 5078 * @param {string} [chars=' '] The string used as padding. 5079 * @returns {string} Returns the pad for `string`. 5080 */ 5081 function createPadding(string, length, chars) { 5082 var strLength = string.length; 5083 length = +length; 5084 5085 if (strLength >= length || !nativeIsFinite(length)) { 5086 return ''; 5087 } 5088 var padLength = length - strLength; 5089 chars = chars == null ? ' ' : (chars + ''); 5090 return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength); 5091 } 5092 5093 /** 5094 * Creates a function that wraps `func` and invokes it with the optional `this` 5095 * binding of `thisArg` and the `partials` prepended to those provided to 5096 * the wrapper. 5097 * 5098 * @private 5099 * @param {Function} func The function to partially apply arguments to. 5100 * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details. 5101 * @param {*} thisArg The `this` binding of `func`. 5102 * @param {Array} partials The arguments to prepend to those provided to the new function. 5103 * @returns {Function} Returns the new bound function. 5104 */ 5105 function createPartialWrapper(func, bitmask, thisArg, partials) { 5106 var isBind = bitmask & BIND_FLAG, 5107 Ctor = createCtorWrapper(func); 5108 5109 function wrapper() { 5110 // Avoid `arguments` object use disqualifying optimizations by 5111 // converting it to an array before providing it `func`. 5112 var argsIndex = -1, 5113 argsLength = arguments.length, 5114 leftIndex = -1, 5115 leftLength = partials.length, 5116 args = Array(argsLength + leftLength); 5117 5118 while (++leftIndex < leftLength) { 5119 args[leftIndex] = partials[leftIndex]; 5120 } 5121 while (argsLength--) { 5122 args[leftIndex++] = arguments[++argsIndex]; 5123 } 5124 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; 5125 return fn.apply(isBind ? thisArg : this, args); 5126 } 5127 return wrapper; 5128 } 5129 5130 /** 5131 * Creates a `_.sortedIndex` or `_.sortedLastIndex` function. 5132 * 5133 * @private 5134 * @param {boolean} [retHighest] Specify returning the highest qualified index. 5135 * @returns {Function} Returns the new index function. 5136 */ 5137 function createSortedIndex(retHighest) { 5138 return function(array, value, iteratee, thisArg) { 5139 var func = getCallback(iteratee); 5140 return (func === baseCallback && iteratee == null) 5141 ? binaryIndex(array, value, retHighest) 5142 : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest); 5143 }; 5144 } 5145 5146 /** 5147 * Creates a function that either curries or invokes `func` with optional 5148 * `this` binding and partially applied arguments. 5149 * 5150 * @private 5151 * @param {Function|string} func The function or method name to reference. 5152 * @param {number} bitmask The bitmask of flags. 5153 * The bitmask may be composed of the following flags: 5154 * 1 - `_.bind` 5155 * 2 - `_.bindKey` 5156 * 4 - `_.curry` or `_.curryRight` of a bound function 5157 * 8 - `_.curry` 5158 * 16 - `_.curryRight` 5159 * 32 - `_.partial` 5160 * 64 - `_.partialRight` 5161 * 128 - `_.rearg` 5162 * 256 - `_.ary` 5163 * @param {*} [thisArg] The `this` binding of `func`. 5164 * @param {Array} [partials] The arguments to be partially applied. 5165 * @param {Array} [holders] The `partials` placeholder indexes. 5166 * @param {Array} [argPos] The argument positions of the new function. 5167 * @param {number} [ary] The arity cap of `func`. 5168 * @param {number} [arity] The arity of `func`. 5169 * @returns {Function} Returns the new wrapped function. 5170 */ 5171 function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { 5172 var isBindKey = bitmask & BIND_KEY_FLAG; 5173 if (!isBindKey && typeof func != 'function') { 5174 throw new TypeError(FUNC_ERROR_TEXT); 5175 } 5176 var length = partials ? partials.length : 0; 5177 if (!length) { 5178 bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); 5179 partials = holders = null; 5180 } 5181 length -= (holders ? holders.length : 0); 5182 if (bitmask & PARTIAL_RIGHT_FLAG) { 5183 var partialsRight = partials, 5184 holdersRight = holders; 5185 5186 partials = holders = null; 5187 } 5188 var data = isBindKey ? null : getData(func), 5189 newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity]; 5190 5191 if (data) { 5192 mergeData(newData, data); 5193 bitmask = newData[1]; 5194 arity = newData[9]; 5195 } 5196 newData[9] = arity == null 5197 ? (isBindKey ? 0 : func.length) 5198 : (nativeMax(arity - length, 0) || 0); 5199 5200 if (bitmask == BIND_FLAG) { 5201 var result = createBindWrapper(newData[0], newData[2]); 5202 } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) { 5203 result = createPartialWrapper.apply(undefined, newData); 5204 } else { 5205 result = createHybridWrapper.apply(undefined, newData); 5206 } 5207 var setter = data ? baseSetData : setData; 5208 return setter(result, newData); 5209 } 5210 5211 /** 5212 * A specialized version of `baseIsEqualDeep` for arrays with support for 5213 * partial deep comparisons. 5214 * 5215 * @private 5216 * @param {Array} array The array to compare. 5217 * @param {Array} other The other array to compare. 5218 * @param {Function} equalFunc The function to determine equivalents of values. 5219 * @param {Function} [customizer] The function to customize comparing arrays. 5220 * @param {boolean} [isLoose] Specify performing partial comparisons. 5221 * @param {Array} [stackA] Tracks traversed `value` objects. 5222 * @param {Array} [stackB] Tracks traversed `other` objects. 5223 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. 5224 */ 5225 function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { 5226 var index = -1, 5227 arrLength = array.length, 5228 othLength = other.length, 5229 result = true; 5230 5231 if (arrLength != othLength && !(isLoose && othLength > arrLength)) { 5232 return false; 5233 } 5234 // Deep compare the contents, ignoring non-numeric properties. 5235 while (result && ++index < arrLength) { 5236 var arrValue = array[index], 5237 othValue = other[index]; 5238 5239 result = undefined; 5240 if (customizer) { 5241 result = isLoose 5242 ? customizer(othValue, arrValue, index) 5243 : customizer(arrValue, othValue, index); 5244 } 5245 if (result === undefined) { 5246 // Recursively compare arrays (susceptible to call stack limits). 5247 if (isLoose) { 5248 var othIndex = othLength; 5249 while (othIndex--) { 5250 othValue = other[othIndex]; 5251 result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); 5252 if (result) { 5253 break; 5254 } 5255 } 5256 } else { 5257 result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); 5258 } 5259 } 5260 } 5261 return !!result; 5262 } 5263 5264 /** 5265 * A specialized version of `baseIsEqualDeep` for comparing objects of 5266 * the same `toStringTag`. 5267 * 5268 * **Note:** This function only supports comparing values with tags of 5269 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. 5270 * 5271 * @private 5272 * @param {Object} value The object to compare. 5273 * @param {Object} other The other object to compare. 5274 * @param {string} tag The `toStringTag` of the objects to compare. 5275 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 5276 */ 5277 function equalByTag(object, other, tag) { 5278 switch (tag) { 5279 case boolTag: 5280 case dateTag: 5281 // Coerce dates and booleans to numbers, dates to milliseconds and booleans 5282 // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. 5283 return +object == +other; 5284 5285 case errorTag: 5286 return object.name == other.name && object.message == other.message; 5287 5288 case numberTag: 5289 // Treat `NaN` vs. `NaN` as equal. 5290 return (object != +object) 5291 ? other != +other 5292 // But, treat `-0` vs. `+0` as not equal. 5293 : (object == 0 ? ((1 / object) == (1 / other)) : object == +other); 5294 5295 case regexpTag: 5296 case stringTag: 5297 // Coerce regexes to strings and treat strings primitives and string 5298 // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. 5299 return object == (other + ''); 5300 } 5301 return false; 5302 } 5303 5304 /** 5305 * A specialized version of `baseIsEqualDeep` for objects with support for 5306 * partial deep comparisons. 5307 * 5308 * @private 5309 * @param {Object} object The object to compare. 5310 * @param {Object} other The other object to compare. 5311 * @param {Function} equalFunc The function to determine equivalents of values. 5312 * @param {Function} [customizer] The function to customize comparing values. 5313 * @param {boolean} [isLoose] Specify performing partial comparisons. 5314 * @param {Array} [stackA] Tracks traversed `value` objects. 5315 * @param {Array} [stackB] Tracks traversed `other` objects. 5316 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 5317 */ 5318 function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { 5319 var objProps = keys(object), 5320 objLength = objProps.length, 5321 othProps = keys(other), 5322 othLength = othProps.length; 5323 5324 if (objLength != othLength && !isLoose) { 5325 return false; 5326 } 5327 var skipCtor = isLoose, 5328 index = -1; 5329 5330 while (++index < objLength) { 5331 var key = objProps[index], 5332 result = isLoose ? key in other : hasOwnProperty.call(other, key); 5333 5334 if (result) { 5335 var objValue = object[key], 5336 othValue = other[key]; 5337 5338 result = undefined; 5339 if (customizer) { 5340 result = isLoose 5341 ? customizer(othValue, objValue, key) 5342 : customizer(objValue, othValue, key); 5343 } 5344 if (result === undefined) { 5345 // Recursively compare objects (susceptible to call stack limits). 5346 result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB); 5347 } 5348 } 5349 if (!result) { 5350 return false; 5351 } 5352 skipCtor || (skipCtor = key == 'constructor'); 5353 } 5354 if (!skipCtor) { 5355 var objCtor = object.constructor, 5356 othCtor = other.constructor; 5357 5358 // Non `Object` object instances with different constructors are not equal. 5359 if (objCtor != othCtor && 5360 ('constructor' in object && 'constructor' in other) && 5361 !(typeof objCtor == 'function' && objCtor instanceof objCtor && 5362 typeof othCtor == 'function' && othCtor instanceof othCtor)) { 5363 return false; 5364 } 5365 } 5366 return true; 5367 } 5368 5369 /** 5370 * Gets the extremum value of `collection` invoking `iteratee` for each value 5371 * in `collection` to generate the criterion by which the value is ranked. 5372 * The `iteratee` is invoked with three arguments: (value, index, collection). 5373 * 5374 * @private 5375 * @param {Array|Object|string} collection The collection to iterate over. 5376 * @param {Function} iteratee The function invoked per iteration. 5377 * @param {boolean} [isMin] Specify returning the minimum, instead of the 5378 * maximum, extremum value. 5379 * @returns {*} Returns the extremum value. 5380 */ 5381 function extremumBy(collection, iteratee, isMin) { 5382 var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY, 5383 computed = exValue, 5384 result = computed; 5385 5386 baseEach(collection, function(value, index, collection) { 5387 var current = iteratee(value, index, collection); 5388 if ((isMin ? (current < computed) : (current > computed)) || 5389 (current === exValue && current === result)) { 5390 computed = current; 5391 result = value; 5392 } 5393 }); 5394 return result; 5395 } 5396 5397 /** 5398 * Gets the appropriate "callback" function. If the `_.callback` method is 5399 * customized this function returns the custom method, otherwise it returns 5400 * the `baseCallback` function. If arguments are provided the chosen function 5401 * is invoked with them and its result is returned. 5402 * 5403 * @private 5404 * @returns {Function} Returns the chosen function or its result. 5405 */ 5406 function getCallback(func, thisArg, argCount) { 5407 var result = lodash.callback || callback; 5408 result = result === callback ? baseCallback : result; 5409 return argCount ? result(func, thisArg, argCount) : result; 5410 } 5411 5412 /** 5413 * Gets metadata for `func`. 5414 * 5415 * @private 5416 * @param {Function} func The function to query. 5417 * @returns {*} Returns the metadata for `func`. 5418 */ 5419 var getData = !metaMap ? noop : function(func) { 5420 return metaMap.get(func); 5421 }; 5422 5423 /** 5424 * Gets the name of `func`. 5425 * 5426 * @private 5427 * @param {Function} func The function to query. 5428 * @returns {string} Returns the function name. 5429 */ 5430 var getFuncName = (function() { 5431 if (!support.funcNames) { 5432 return constant(''); 5433 } 5434 if (constant.name == 'constant') { 5435 return baseProperty('name'); 5436 } 5437 return function(func) { 5438 var result = func.name, 5439 array = realNames[result], 5440 length = array ? array.length : 0; 5441 5442 while (length--) { 5443 var data = array[length], 5444 otherFunc = data.func; 5445 5446 if (otherFunc == null || otherFunc == func) { 5447 return data.name; 5448 } 5449 } 5450 return result; 5451 }; 5452 }()); 5453 5454 /** 5455 * Gets the appropriate "indexOf" function. If the `_.indexOf` method is 5456 * customized this function returns the custom method, otherwise it returns 5457 * the `baseIndexOf` function. If arguments are provided the chosen function 5458 * is invoked with them and its result is returned. 5459 * 5460 * @private 5461 * @returns {Function|number} Returns the chosen function or its result. 5462 */ 5463 function getIndexOf(collection, target, fromIndex) { 5464 var result = lodash.indexOf || indexOf; 5465 result = result === indexOf ? baseIndexOf : result; 5466 return collection ? result(collection, target, fromIndex) : result; 5467 } 5468 5469 /** 5470 * Gets the "length" property value of `object`. 5471 * 5472 * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) 5473 * in Safari on iOS 8.1 ARM64. 5474 * 5475 * @private 5476 * @param {Object} object The object to query. 5477 * @returns {*} Returns the "length" value. 5478 */ 5479 var getLength = baseProperty('length'); 5480 5481 /** 5482 * Creates an array of the own symbols of `object`. 5483 * 5484 * @private 5485 * @param {Object} object The object to query. 5486 * @returns {Array} Returns the array of symbols. 5487 */ 5488 var getSymbols = !getOwnPropertySymbols ? constant([]) : function(object) { 5489 return getOwnPropertySymbols(toObject(object)); 5490 }; 5491 5492 /** 5493 * Gets the view, applying any `transforms` to the `start` and `end` positions. 5494 * 5495 * @private 5496 * @param {number} start The start of the view. 5497 * @param {number} end The end of the view. 5498 * @param {Array} [transforms] The transformations to apply to the view. 5499 * @returns {Object} Returns an object containing the `start` and `end` 5500 * positions of the view. 5501 */ 5502 function getView(start, end, transforms) { 5503 var index = -1, 5504 length = transforms ? transforms.length : 0; 5505 5506 while (++index < length) { 5507 var data = transforms[index], 5508 size = data.size; 5509 5510 switch (data.type) { 5511 case 'drop': start += size; break; 5512 case 'dropRight': end -= size; break; 5513 case 'take': end = nativeMin(end, start + size); break; 5514 case 'takeRight': start = nativeMax(start, end - size); break; 5515 } 5516 } 5517 return { 'start': start, 'end': end }; 5518 } 5519 5520 /** 5521 * Initializes an array clone. 5522 * 5523 * @private 5524 * @param {Array} array The array to clone. 5525 * @returns {Array} Returns the initialized clone. 5526 */ 5527 function initCloneArray(array) { 5528 var length = array.length, 5529 result = new array.constructor(length); 5530 5531 // Add array properties assigned by `RegExp#exec`. 5532 if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { 5533 result.index = array.index; 5534 result.input = array.input; 5535 } 5536 return result; 5537 } 5538 5539 /** 5540 * Initializes an object clone. 5541 * 5542 * @private 5543 * @param {Object} object The object to clone. 5544 * @returns {Object} Returns the initialized clone. 5545 */ 5546 function initCloneObject(object) { 5547 var Ctor = object.constructor; 5548 if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) { 5549 Ctor = Object; 5550 } 5551 return new Ctor; 5552 } 5553 5554 /** 5555 * Initializes an object clone based on its `toStringTag`. 5556 * 5557 * **Note:** This function only supports cloning values with tags of 5558 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. 5559 * 5560 * @private 5561 * @param {Object} object The object to clone. 5562 * @param {string} tag The `toStringTag` of the object to clone. 5563 * @param {boolean} [isDeep] Specify a deep clone. 5564 * @returns {Object} Returns the initialized clone. 5565 */ 5566 function initCloneByTag(object, tag, isDeep) { 5567 var Ctor = object.constructor; 5568 switch (tag) { 5569 case arrayBufferTag: 5570 return bufferClone(object); 5571 5572 case boolTag: 5573 case dateTag: 5574 return new Ctor(+object); 5575 5576 case float32Tag: case float64Tag: 5577 case int8Tag: case int16Tag: case int32Tag: 5578 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: 5579 var buffer = object.buffer; 5580 return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length); 5581 5582 case numberTag: 5583 case stringTag: 5584 return new Ctor(object); 5585 5586 case regexpTag: 5587 var result = new Ctor(object.source, reFlags.exec(object)); 5588 result.lastIndex = object.lastIndex; 5589 } 5590 return result; 5591 } 5592 5593 /** 5594 * Invokes the method at `path` on `object`. 5595 * 5596 * @private 5597 * @param {Object} object The object to query. 5598 * @param {Array|string} path The path of the method to invoke. 5599 * @param {Array} args The arguments to invoke the method with. 5600 * @returns {*} Returns the result of the invoked method. 5601 */ 5602 function invokePath(object, path, args) { 5603 if (object != null && !isKey(path, object)) { 5604 path = toPath(path); 5605 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); 5606 path = last(path); 5607 } 5608 var func = object == null ? object : object[path]; 5609 return func == null ? undefined : func.apply(object, args); 5610 } 5611 5612 /** 5613 * Checks if `value` is a valid array-like index. 5614 * 5615 * @private 5616 * @param {*} value The value to check. 5617 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. 5618 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. 5619 */ 5620 function isIndex(value, length) { 5621 value = +value; 5622 length = length == null ? MAX_SAFE_INTEGER : length; 5623 return value > -1 && value % 1 == 0 && value < length; 5624 } 5625 5626 /** 5627 * Checks if the provided arguments are from an iteratee call. 5628 * 5629 * @private 5630 * @param {*} value The potential iteratee value argument. 5631 * @param {*} index The potential iteratee index or key argument. 5632 * @param {*} object The potential iteratee object argument. 5633 * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. 5634 */ 5635 function isIterateeCall(value, index, object) { 5636 if (!isObject(object)) { 5637 return false; 5638 } 5639 var type = typeof index; 5640 if (type == 'number') { 5641 var length = getLength(object), 5642 prereq = isLength(length) && isIndex(index, length); 5643 } else { 5644 prereq = type == 'string' && index in object; 5645 } 5646 if (prereq) { 5647 var other = object[index]; 5648 return value === value ? (value === other) : (other !== other); 5649 } 5650 return false; 5651 } 5652 5653 /** 5654 * Checks if `value` is a property name and not a property path. 5655 * 5656 * @private 5657 * @param {*} value The value to check. 5658 * @param {Object} [object] The object to query keys on. 5659 * @returns {boolean} Returns `true` if `value` is a property name, else `false`. 5660 */ 5661 function isKey(value, object) { 5662 var type = typeof value; 5663 if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { 5664 return true; 5665 } 5666 if (isArray(value)) { 5667 return false; 5668 } 5669 var result = !reIsDeepProp.test(value); 5670 return result || (object != null && value in toObject(object)); 5671 } 5672 5673 /** 5674 * Checks if `func` has a lazy counterpart. 5675 * 5676 * @private 5677 * @param {Function} func The function to check. 5678 * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`. 5679 */ 5680 function isLaziable(func) { 5681 var funcName = getFuncName(func); 5682 return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype; 5683 } 5684 5685 /** 5686 * Checks if `value` is a valid array-like length. 5687 * 5688 * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). 5689 * 5690 * @private 5691 * @param {*} value The value to check. 5692 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. 5693 */ 5694 function isLength(value) { 5695 return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; 5696 } 5697 5698 /** 5699 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. 5700 * 5701 * @private 5702 * @param {*} value The value to check. 5703 * @returns {boolean} Returns `true` if `value` if suitable for strict 5704 * equality comparisons, else `false`. 5705 */ 5706 function isStrictComparable(value) { 5707 return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value)); 5708 } 5709 5710 /** 5711 * Merges the function metadata of `source` into `data`. 5712 * 5713 * Merging metadata reduces the number of wrappers required to invoke a function. 5714 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` 5715 * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg` 5716 * augment function arguments, making the order in which they are executed important, 5717 * preventing the merging of metadata. However, we make an exception for a safe 5718 * common case where curried functions have `_.ary` and or `_.rearg` applied. 5719 * 5720 * @private 5721 * @param {Array} data The destination metadata. 5722 * @param {Array} source The source metadata. 5723 * @returns {Array} Returns `data`. 5724 */ 5725 function mergeData(data, source) { 5726 var bitmask = data[1], 5727 srcBitmask = source[1], 5728 newBitmask = bitmask | srcBitmask, 5729 isCommon = newBitmask < ARY_FLAG; 5730 5731 var isCombo = 5732 (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) || 5733 (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) || 5734 (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG); 5735 5736 // Exit early if metadata can't be merged. 5737 if (!(isCommon || isCombo)) { 5738 return data; 5739 } 5740 // Use source `thisArg` if available. 5741 if (srcBitmask & BIND_FLAG) { 5742 data[2] = source[2]; 5743 // Set when currying a bound function. 5744 newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG; 5745 } 5746 // Compose partial arguments. 5747 var value = source[3]; 5748 if (value) { 5749 var partials = data[3]; 5750 data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value); 5751 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]); 5752 } 5753 // Compose partial right arguments. 5754 value = source[5]; 5755 if (value) { 5756 partials = data[5]; 5757 data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value); 5758 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]); 5759 } 5760 // Use source `argPos` if available. 5761 value = source[7]; 5762 if (value) { 5763 data[7] = arrayCopy(value); 5764 } 5765 // Use source `ary` if it's smaller. 5766 if (srcBitmask & ARY_FLAG) { 5767 data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); 5768 } 5769 // Use source `arity` if one is not provided. 5770 if (data[9] == null) { 5771 data[9] = source[9]; 5772 } 5773 // Use source `func` and merge bitmasks. 5774 data[0] = source[0]; 5775 data[1] = newBitmask; 5776 5777 return data; 5778 } 5779 5780 /** 5781 * A specialized version of `_.pick` that picks `object` properties specified 5782 * by `props`. 5783 * 5784 * @private 5785 * @param {Object} object The source object. 5786 * @param {string[]} props The property names to pick. 5787 * @returns {Object} Returns the new object. 5788 */ 5789 function pickByArray(object, props) { 5790 object = toObject(object); 5791 5792 var index = -1, 5793 length = props.length, 5794 result = {}; 5795 5796 while (++index < length) { 5797 var key = props[index]; 5798 if (key in object) { 5799 result[key] = object[key]; 5800 } 5801 } 5802 return result; 5803 } 5804 5805 /** 5806 * A specialized version of `_.pick` that picks `object` properties `predicate` 5807 * returns truthy for. 5808 * 5809 * @private 5810 * @param {Object} object The source object. 5811 * @param {Function} predicate The function invoked per iteration. 5812 * @returns {Object} Returns the new object. 5813 */ 5814 function pickByCallback(object, predicate) { 5815 var result = {}; 5816 baseForIn(object, function(value, key, object) { 5817 if (predicate(value, key, object)) { 5818 result[key] = value; 5819 } 5820 }); 5821 return result; 5822 } 5823 5824 /** 5825 * Reorder `array` according to the specified indexes where the element at 5826 * the first index is assigned as the first element, the element at 5827 * the second index is assigned as the second element, and so on. 5828 * 5829 * @private 5830 * @param {Array} array The array to reorder. 5831 * @param {Array} indexes The arranged array indexes. 5832 * @returns {Array} Returns `array`. 5833 */ 5834 function reorder(array, indexes) { 5835 var arrLength = array.length, 5836 length = nativeMin(indexes.length, arrLength), 5837 oldArray = arrayCopy(array); 5838 5839 while (length--) { 5840 var index = indexes[length]; 5841 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; 5842 } 5843 return array; 5844 } 5845 5846 /** 5847 * Sets metadata for `func`. 5848 * 5849 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short 5850 * period of time, it will trip its breaker and transition to an identity function 5851 * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070) 5852 * for more details. 5853 * 5854 * @private 5855 * @param {Function} func The function to associate metadata with. 5856 * @param {*} data The metadata. 5857 * @returns {Function} Returns `func`. 5858 */ 5859 var setData = (function() { 5860 var count = 0, 5861 lastCalled = 0; 5862 5863 return function(key, value) { 5864 var stamp = now(), 5865 remaining = HOT_SPAN - (stamp - lastCalled); 5866 5867 lastCalled = stamp; 5868 if (remaining > 0) { 5869 if (++count >= HOT_COUNT) { 5870 return key; 5871 } 5872 } else { 5873 count = 0; 5874 } 5875 return baseSetData(key, value); 5876 }; 5877 }()); 5878 5879 /** 5880 * A fallback implementation of `_.isPlainObject` which checks if `value` 5881 * is an object created by the `Object` constructor or has a `[[Prototype]]` 5882 * of `null`. 5883 * 5884 * @private 5885 * @param {*} value The value to check. 5886 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. 5887 */ 5888 function shimIsPlainObject(value) { 5889 var Ctor, 5890 support = lodash.support; 5891 5892 // Exit early for non `Object` objects. 5893 if (!(isObjectLike(value) && objToString.call(value) == objectTag) || 5894 (!hasOwnProperty.call(value, 'constructor') && 5895 (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { 5896 return false; 5897 } 5898 // IE < 9 iterates inherited properties before own properties. If the first 5899 // iterated property is an object's own property then there are no inherited 5900 // enumerable properties. 5901 var result; 5902 // In most environments an object's own properties are iterated before 5903 // its inherited properties. If the last iterated property is an object's 5904 // own property then there are no inherited enumerable properties. 5905 baseForIn(value, function(subValue, key) { 5906 result = key; 5907 }); 5908 return result === undefined || hasOwnProperty.call(value, result); 5909 } 5910 5911 /** 5912 * A fallback implementation of `Object.keys` which creates an array of the 5913 * own enumerable property names of `object`. 5914 * 5915 * @private 5916 * @param {Object} object The object to query. 5917 * @returns {Array} Returns the array of property names. 5918 */ 5919 function shimKeys(object) { 5920 var props = keysIn(object), 5921 propsLength = props.length, 5922 length = propsLength && object.length, 5923 support = lodash.support; 5924 5925 var allowIndexes = length && isLength(length) && 5926 (isArray(object) || (support.nonEnumArgs && isArguments(object))); 5927 5928 var index = -1, 5929 result = []; 5930 5931 while (++index < propsLength) { 5932 var key = props[index]; 5933 if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { 5934 result.push(key); 5935 } 5936 } 5937 return result; 5938 } 5939 5940 /** 5941 * Converts `value` to an array-like object if it is not one. 5942 * 5943 * @private 5944 * @param {*} value The value to process. 5945 * @returns {Array|Object} Returns the array-like object. 5946 */ 5947 function toIterable(value) { 5948 if (value == null) { 5949 return []; 5950 } 5951 if (!isLength(getLength(value))) { 5952 return values(value); 5953 } 5954 return isObject(value) ? value : Object(value); 5955 } 5956 5957 /** 5958 * Converts `value` to an object if it is not one. 5959 * 5960 * @private 5961 * @param {*} value The value to process. 5962 * @returns {Object} Returns the object. 5963 */ 5964 function toObject(value) { 5965 return isObject(value) ? value : Object(value); 5966 } 5967 5968 /** 5969 * Converts `value` to property path array if it is not one. 5970 * 5971 * @private 5972 * @param {*} value The value to process. 5973 * @returns {Array} Returns the property path array. 5974 */ 5975 function toPath(value) { 5976 if (isArray(value)) { 5977 return value; 5978 } 5979 var result = []; 5980 baseToString(value).replace(rePropName, function(match, number, quote, string) { 5981 result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); 5982 }); 5983 return result; 5984 } 5985 5986 /** 5987 * Creates a clone of `wrapper`. 5988 * 5989 * @private 5990 * @param {Object} wrapper The wrapper to clone. 5991 * @returns {Object} Returns the cloned wrapper. 5992 */ 5993 function wrapperClone(wrapper) { 5994 return wrapper instanceof LazyWrapper 5995 ? wrapper.clone() 5996 : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__)); 5997 } 5998 5999 /*------------------------------------------------------------------------*/ 6000 6001 /** 6002 * Creates an array of elements split into groups the length of `size`. 6003 * If `collection` can't be split evenly, the final chunk will be the remaining 6004 * elements. 6005 * 6006 * @static 6007 * @memberOf _ 6008 * @category Array 6009 * @param {Array} array The array to process. 6010 * @param {number} [size=1] The length of each chunk. 6011 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 6012 * @returns {Array} Returns the new array containing chunks. 6013 * @example 6014 * 6015 * _.chunk(['a', 'b', 'c', 'd'], 2); 6016 * // => [['a', 'b'], ['c', 'd']] 6017 * 6018 * _.chunk(['a', 'b', 'c', 'd'], 3); 6019 * // => [['a', 'b', 'c'], ['d']] 6020 */ 6021 function chunk(array, size, guard) { 6022 if (guard ? isIterateeCall(array, size, guard) : size == null) { 6023 size = 1; 6024 } else { 6025 size = nativeMax(+size || 1, 1); 6026 } 6027 var index = 0, 6028 length = array ? array.length : 0, 6029 resIndex = -1, 6030 result = Array(ceil(length / size)); 6031 6032 while (index < length) { 6033 result[++resIndex] = baseSlice(array, index, (index += size)); 6034 } 6035 return result; 6036 } 6037 6038 /** 6039 * Creates an array with all falsey values removed. The values `false`, `null`, 6040 * `0`, `""`, `undefined`, and `NaN` are falsey. 6041 * 6042 * @static 6043 * @memberOf _ 6044 * @category Array 6045 * @param {Array} array The array to compact. 6046 * @returns {Array} Returns the new array of filtered values. 6047 * @example 6048 * 6049 * _.compact([0, 1, false, 2, '', 3]); 6050 * // => [1, 2, 3] 6051 */ 6052 function compact(array) { 6053 var index = -1, 6054 length = array ? array.length : 0, 6055 resIndex = -1, 6056 result = []; 6057 6058 while (++index < length) { 6059 var value = array[index]; 6060 if (value) { 6061 result[++resIndex] = value; 6062 } 6063 } 6064 return result; 6065 } 6066 6067 /** 6068 * Creates an array excluding all values of the provided arrays using 6069 * `SameValueZero` for equality comparisons. 6070 * 6071 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 6072 * comparisons are like strict equality comparisons, e.g. `===`, except that 6073 * `NaN` matches `NaN`. 6074 * 6075 * @static 6076 * @memberOf _ 6077 * @category Array 6078 * @param {Array} array The array to inspect. 6079 * @param {...Array} [values] The arrays of values to exclude. 6080 * @returns {Array} Returns the new array of filtered values. 6081 * @example 6082 * 6083 * _.difference([1, 2, 3], [4, 2]); 6084 * // => [1, 3] 6085 */ 6086 var difference = restParam(function(array, values) { 6087 return (isArray(array) || isArguments(array)) 6088 ? baseDifference(array, baseFlatten(values, false, true)) 6089 : []; 6090 }); 6091 6092 /** 6093 * Creates a slice of `array` with `n` elements dropped from the beginning. 6094 * 6095 * @static 6096 * @memberOf _ 6097 * @category Array 6098 * @param {Array} array The array to query. 6099 * @param {number} [n=1] The number of elements to drop. 6100 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 6101 * @returns {Array} Returns the slice of `array`. 6102 * @example 6103 * 6104 * _.drop([1, 2, 3]); 6105 * // => [2, 3] 6106 * 6107 * _.drop([1, 2, 3], 2); 6108 * // => [3] 6109 * 6110 * _.drop([1, 2, 3], 5); 6111 * // => [] 6112 * 6113 * _.drop([1, 2, 3], 0); 6114 * // => [1, 2, 3] 6115 */ 6116 function drop(array, n, guard) { 6117 var length = array ? array.length : 0; 6118 if (!length) { 6119 return []; 6120 } 6121 if (guard ? isIterateeCall(array, n, guard) : n == null) { 6122 n = 1; 6123 } 6124 return baseSlice(array, n < 0 ? 0 : n); 6125 } 6126 6127 /** 6128 * Creates a slice of `array` with `n` elements dropped from the end. 6129 * 6130 * @static 6131 * @memberOf _ 6132 * @category Array 6133 * @param {Array} array The array to query. 6134 * @param {number} [n=1] The number of elements to drop. 6135 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 6136 * @returns {Array} Returns the slice of `array`. 6137 * @example 6138 * 6139 * _.dropRight([1, 2, 3]); 6140 * // => [1, 2] 6141 * 6142 * _.dropRight([1, 2, 3], 2); 6143 * // => [1] 6144 * 6145 * _.dropRight([1, 2, 3], 5); 6146 * // => [] 6147 * 6148 * _.dropRight([1, 2, 3], 0); 6149 * // => [1, 2, 3] 6150 */ 6151 function dropRight(array, n, guard) { 6152 var length = array ? array.length : 0; 6153 if (!length) { 6154 return []; 6155 } 6156 if (guard ? isIterateeCall(array, n, guard) : n == null) { 6157 n = 1; 6158 } 6159 n = length - (+n || 0); 6160 return baseSlice(array, 0, n < 0 ? 0 : n); 6161 } 6162 6163 /** 6164 * Creates a slice of `array` excluding elements dropped from the end. 6165 * Elements are dropped until `predicate` returns falsey. The predicate is 6166 * bound to `thisArg` and invoked with three arguments: (value, index, array). 6167 * 6168 * If a property name is provided for `predicate` the created `_.property` 6169 * style callback returns the property value of the given element. 6170 * 6171 * If a value is also provided for `thisArg` the created `_.matchesProperty` 6172 * style callback returns `true` for elements that have a matching property 6173 * value, else `false`. 6174 * 6175 * If an object is provided for `predicate` the created `_.matches` style 6176 * callback returns `true` for elements that match the properties of the given 6177 * object, else `false`. 6178 * 6179 * @static 6180 * @memberOf _ 6181 * @category Array 6182 * @param {Array} array The array to query. 6183 * @param {Function|Object|string} [predicate=_.identity] The function invoked 6184 * per iteration. 6185 * @param {*} [thisArg] The `this` binding of `predicate`. 6186 * @returns {Array} Returns the slice of `array`. 6187 * @example 6188 * 6189 * _.dropRightWhile([1, 2, 3], function(n) { 6190 * return n > 1; 6191 * }); 6192 * // => [1] 6193 * 6194 * var users = [ 6195 * { 'user': 'barney', 'active': true }, 6196 * { 'user': 'fred', 'active': false }, 6197 * { 'user': 'pebbles', 'active': false } 6198 * ]; 6199 * 6200 * // using the `_.matches` callback shorthand 6201 * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); 6202 * // => ['barney', 'fred'] 6203 * 6204 * // using the `_.matchesProperty` callback shorthand 6205 * _.pluck(_.dropRightWhile(users, 'active', false), 'user'); 6206 * // => ['barney'] 6207 * 6208 * // using the `_.property` callback shorthand 6209 * _.pluck(_.dropRightWhile(users, 'active'), 'user'); 6210 * // => ['barney', 'fred', 'pebbles'] 6211 */ 6212 function dropRightWhile(array, predicate, thisArg) { 6213 return (array && array.length) 6214 ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true) 6215 : []; 6216 } 6217 6218 /** 6219 * Creates a slice of `array` excluding elements dropped from the beginning. 6220 * Elements are dropped until `predicate` returns falsey. The predicate is 6221 * bound to `thisArg` and invoked with three arguments: (value, index, array). 6222 * 6223 * If a property name is provided for `predicate` the created `_.property` 6224 * style callback returns the property value of the given element. 6225 * 6226 * If a value is also provided for `thisArg` the created `_.matchesProperty` 6227 * style callback returns `true` for elements that have a matching property 6228 * value, else `false`. 6229 * 6230 * If an object is provided for `predicate` the created `_.matches` style 6231 * callback returns `true` for elements that have the properties of the given 6232 * object, else `false`. 6233 * 6234 * @static 6235 * @memberOf _ 6236 * @category Array 6237 * @param {Array} array The array to query. 6238 * @param {Function|Object|string} [predicate=_.identity] The function invoked 6239 * per iteration. 6240 * @param {*} [thisArg] The `this` binding of `predicate`. 6241 * @returns {Array} Returns the slice of `array`. 6242 * @example 6243 * 6244 * _.dropWhile([1, 2, 3], function(n) { 6245 * return n < 3; 6246 * }); 6247 * // => [3] 6248 * 6249 * var users = [ 6250 * { 'user': 'barney', 'active': false }, 6251 * { 'user': 'fred', 'active': false }, 6252 * { 'user': 'pebbles', 'active': true } 6253 * ]; 6254 * 6255 * // using the `_.matches` callback shorthand 6256 * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user'); 6257 * // => ['fred', 'pebbles'] 6258 * 6259 * // using the `_.matchesProperty` callback shorthand 6260 * _.pluck(_.dropWhile(users, 'active', false), 'user'); 6261 * // => ['pebbles'] 6262 * 6263 * // using the `_.property` callback shorthand 6264 * _.pluck(_.dropWhile(users, 'active'), 'user'); 6265 * // => ['barney', 'fred', 'pebbles'] 6266 */ 6267 function dropWhile(array, predicate, thisArg) { 6268 return (array && array.length) 6269 ? baseWhile(array, getCallback(predicate, thisArg, 3), true) 6270 : []; 6271 } 6272 6273 /** 6274 * Fills elements of `array` with `value` from `start` up to, but not 6275 * including, `end`. 6276 * 6277 * **Note:** This method mutates `array`. 6278 * 6279 * @static 6280 * @memberOf _ 6281 * @category Array 6282 * @param {Array} array The array to fill. 6283 * @param {*} value The value to fill `array` with. 6284 * @param {number} [start=0] The start position. 6285 * @param {number} [end=array.length] The end position. 6286 * @returns {Array} Returns `array`. 6287 * @example 6288 * 6289 * var array = [1, 2, 3]; 6290 * 6291 * _.fill(array, 'a'); 6292 * console.log(array); 6293 * // => ['a', 'a', 'a'] 6294 * 6295 * _.fill(Array(3), 2); 6296 * // => [2, 2, 2] 6297 * 6298 * _.fill([4, 6, 8], '*', 1, 2); 6299 * // => [4, '*', 8] 6300 */ 6301 function fill(array, value, start, end) { 6302 var length = array ? array.length : 0; 6303 if (!length) { 6304 return []; 6305 } 6306 if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { 6307 start = 0; 6308 end = length; 6309 } 6310 return baseFill(array, value, start, end); 6311 } 6312 6313 /** 6314 * This method is like `_.find` except that it returns the index of the first 6315 * element `predicate` returns truthy for instead of the element itself. 6316 * 6317 * If a property name is provided for `predicate` the created `_.property` 6318 * style callback returns the property value of the given element. 6319 * 6320 * If a value is also provided for `thisArg` the created `_.matchesProperty` 6321 * style callback returns `true` for elements that have a matching property 6322 * value, else `false`. 6323 * 6324 * If an object is provided for `predicate` the created `_.matches` style 6325 * callback returns `true` for elements that have the properties of the given 6326 * object, else `false`. 6327 * 6328 * @static 6329 * @memberOf _ 6330 * @category Array 6331 * @param {Array} array The array to search. 6332 * @param {Function|Object|string} [predicate=_.identity] The function invoked 6333 * per iteration. 6334 * @param {*} [thisArg] The `this` binding of `predicate`. 6335 * @returns {number} Returns the index of the found element, else `-1`. 6336 * @example 6337 * 6338 * var users = [ 6339 * { 'user': 'barney', 'active': false }, 6340 * { 'user': 'fred', 'active': false }, 6341 * { 'user': 'pebbles', 'active': true } 6342 * ]; 6343 * 6344 * _.findIndex(users, function(chr) { 6345 * return chr.user == 'barney'; 6346 * }); 6347 * // => 0 6348 * 6349 * // using the `_.matches` callback shorthand 6350 * _.findIndex(users, { 'user': 'fred', 'active': false }); 6351 * // => 1 6352 * 6353 * // using the `_.matchesProperty` callback shorthand 6354 * _.findIndex(users, 'active', false); 6355 * // => 0 6356 * 6357 * // using the `_.property` callback shorthand 6358 * _.findIndex(users, 'active'); 6359 * // => 2 6360 */ 6361 var findIndex = createFindIndex(); 6362 6363 /** 6364 * This method is like `_.findIndex` except that it iterates over elements 6365 * of `collection` from right to left. 6366 * 6367 * If a property name is provided for `predicate` the created `_.property` 6368 * style callback returns the property value of the given element. 6369 * 6370 * If a value is also provided for `thisArg` the created `_.matchesProperty` 6371 * style callback returns `true` for elements that have a matching property 6372 * value, else `false`. 6373 * 6374 * If an object is provided for `predicate` the created `_.matches` style 6375 * callback returns `true` for elements that have the properties of the given 6376 * object, else `false`. 6377 * 6378 * @static 6379 * @memberOf _ 6380 * @category Array 6381 * @param {Array} array The array to search. 6382 * @param {Function|Object|string} [predicate=_.identity] The function invoked 6383 * per iteration. 6384 * @param {*} [thisArg] The `this` binding of `predicate`. 6385 * @returns {number} Returns the index of the found element, else `-1`. 6386 * @example 6387 * 6388 * var users = [ 6389 * { 'user': 'barney', 'active': true }, 6390 * { 'user': 'fred', 'active': false }, 6391 * { 'user': 'pebbles', 'active': false } 6392 * ]; 6393 * 6394 * _.findLastIndex(users, function(chr) { 6395 * return chr.user == 'pebbles'; 6396 * }); 6397 * // => 2 6398 * 6399 * // using the `_.matches` callback shorthand 6400 * _.findLastIndex(users, { 'user': 'barney', 'active': true }); 6401 * // => 0 6402 * 6403 * // using the `_.matchesProperty` callback shorthand 6404 * _.findLastIndex(users, 'active', false); 6405 * // => 2 6406 * 6407 * // using the `_.property` callback shorthand 6408 * _.findLastIndex(users, 'active'); 6409 * // => 0 6410 */ 6411 var findLastIndex = createFindIndex(true); 6412 6413 /** 6414 * Gets the first element of `array`. 6415 * 6416 * @static 6417 * @memberOf _ 6418 * @alias head 6419 * @category Array 6420 * @param {Array} array The array to query. 6421 * @returns {*} Returns the first element of `array`. 6422 * @example 6423 * 6424 * _.first([1, 2, 3]); 6425 * // => 1 6426 * 6427 * _.first([]); 6428 * // => undefined 6429 */ 6430 function first(array) { 6431 return array ? array[0] : undefined; 6432 } 6433 6434 /** 6435 * Flattens a nested array. If `isDeep` is `true` the array is recursively 6436 * flattened, otherwise it is only flattened a single level. 6437 * 6438 * @static 6439 * @memberOf _ 6440 * @category Array 6441 * @param {Array} array The array to flatten. 6442 * @param {boolean} [isDeep] Specify a deep flatten. 6443 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 6444 * @returns {Array} Returns the new flattened array. 6445 * @example 6446 * 6447 * _.flatten([1, [2, 3, [4]]]); 6448 * // => [1, 2, 3, [4]] 6449 * 6450 * // using `isDeep` 6451 * _.flatten([1, [2, 3, [4]]], true); 6452 * // => [1, 2, 3, 4] 6453 */ 6454 function flatten(array, isDeep, guard) { 6455 var length = array ? array.length : 0; 6456 if (guard && isIterateeCall(array, isDeep, guard)) { 6457 isDeep = false; 6458 } 6459 return length ? baseFlatten(array, isDeep) : []; 6460 } 6461 6462 /** 6463 * Recursively flattens a nested array. 6464 * 6465 * @static 6466 * @memberOf _ 6467 * @category Array 6468 * @param {Array} array The array to recursively flatten. 6469 * @returns {Array} Returns the new flattened array. 6470 * @example 6471 * 6472 * _.flattenDeep([1, [2, 3, [4]]]); 6473 * // => [1, 2, 3, 4] 6474 */ 6475 function flattenDeep(array) { 6476 var length = array ? array.length : 0; 6477 return length ? baseFlatten(array, true) : []; 6478 } 6479 6480 /** 6481 * Gets the index at which the first occurrence of `value` is found in `array` 6482 * using `SameValueZero` for equality comparisons. If `fromIndex` is negative, 6483 * it is used as the offset from the end of `array`. If `array` is sorted 6484 * providing `true` for `fromIndex` performs a faster binary search. 6485 * 6486 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 6487 * comparisons are like strict equality comparisons, e.g. `===`, except that 6488 * `NaN` matches `NaN`. 6489 * 6490 * @static 6491 * @memberOf _ 6492 * @category Array 6493 * @param {Array} array The array to search. 6494 * @param {*} value The value to search for. 6495 * @param {boolean|number} [fromIndex=0] The index to search from or `true` 6496 * to perform a binary search on a sorted array. 6497 * @returns {number} Returns the index of the matched value, else `-1`. 6498 * @example 6499 * 6500 * _.indexOf([1, 2, 1, 2], 2); 6501 * // => 1 6502 * 6503 * // using `fromIndex` 6504 * _.indexOf([1, 2, 1, 2], 2, 2); 6505 * // => 3 6506 * 6507 * // performing a binary search 6508 * _.indexOf([1, 1, 2, 2], 2, true); 6509 * // => 2 6510 */ 6511 function indexOf(array, value, fromIndex) { 6512 var length = array ? array.length : 0; 6513 if (!length) { 6514 return -1; 6515 } 6516 if (typeof fromIndex == 'number') { 6517 fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; 6518 } else if (fromIndex) { 6519 var index = binaryIndex(array, value), 6520 other = array[index]; 6521 6522 if (value === value ? (value === other) : (other !== other)) { 6523 return index; 6524 } 6525 return -1; 6526 } 6527 return baseIndexOf(array, value, fromIndex || 0); 6528 } 6529 6530 /** 6531 * Gets all but the last element of `array`. 6532 * 6533 * @static 6534 * @memberOf _ 6535 * @category Array 6536 * @param {Array} array The array to query. 6537 * @returns {Array} Returns the slice of `array`. 6538 * @example 6539 * 6540 * _.initial([1, 2, 3]); 6541 * // => [1, 2] 6542 */ 6543 function initial(array) { 6544 return dropRight(array, 1); 6545 } 6546 6547 /** 6548 * Creates an array of unique values in all provided arrays using `SameValueZero` 6549 * for equality comparisons. 6550 * 6551 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 6552 * comparisons are like strict equality comparisons, e.g. `===`, except that 6553 * `NaN` matches `NaN`. 6554 * 6555 * @static 6556 * @memberOf _ 6557 * @category Array 6558 * @param {...Array} [arrays] The arrays to inspect. 6559 * @returns {Array} Returns the new array of shared values. 6560 * @example 6561 * _.intersection([1, 2], [4, 2], [2, 1]); 6562 * // => [2] 6563 */ 6564 function intersection() { 6565 var args = [], 6566 argsIndex = -1, 6567 argsLength = arguments.length, 6568 caches = [], 6569 indexOf = getIndexOf(), 6570 isCommon = indexOf == baseIndexOf, 6571 result = []; 6572 6573 while (++argsIndex < argsLength) { 6574 var value = arguments[argsIndex]; 6575 if (isArray(value) || isArguments(value)) { 6576 args.push(value); 6577 caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null); 6578 } 6579 } 6580 argsLength = args.length; 6581 if (argsLength < 2) { 6582 return result; 6583 } 6584 var array = args[0], 6585 index = -1, 6586 length = array ? array.length : 0, 6587 seen = caches[0]; 6588 6589 outer: 6590 while (++index < length) { 6591 value = array[index]; 6592 if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) { 6593 argsIndex = argsLength; 6594 while (--argsIndex) { 6595 var cache = caches[argsIndex]; 6596 if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) { 6597 continue outer; 6598 } 6599 } 6600 if (seen) { 6601 seen.push(value); 6602 } 6603 result.push(value); 6604 } 6605 } 6606 return result; 6607 } 6608 6609 /** 6610 * Gets the last element of `array`. 6611 * 6612 * @static 6613 * @memberOf _ 6614 * @category Array 6615 * @param {Array} array The array to query. 6616 * @returns {*} Returns the last element of `array`. 6617 * @example 6618 * 6619 * _.last([1, 2, 3]); 6620 * // => 3 6621 */ 6622 function last(array) { 6623 var length = array ? array.length : 0; 6624 return length ? array[length - 1] : undefined; 6625 } 6626 6627 /** 6628 * This method is like `_.indexOf` except that it iterates over elements of 6629 * `array` from right to left. 6630 * 6631 * @static 6632 * @memberOf _ 6633 * @category Array 6634 * @param {Array} array The array to search. 6635 * @param {*} value The value to search for. 6636 * @param {boolean|number} [fromIndex=array.length-1] The index to search from 6637 * or `true` to perform a binary search on a sorted array. 6638 * @returns {number} Returns the index of the matched value, else `-1`. 6639 * @example 6640 * 6641 * _.lastIndexOf([1, 2, 1, 2], 2); 6642 * // => 3 6643 * 6644 * // using `fromIndex` 6645 * _.lastIndexOf([1, 2, 1, 2], 2, 2); 6646 * // => 1 6647 * 6648 * // performing a binary search 6649 * _.lastIndexOf([1, 1, 2, 2], 2, true); 6650 * // => 3 6651 */ 6652 function lastIndexOf(array, value, fromIndex) { 6653 var length = array ? array.length : 0; 6654 if (!length) { 6655 return -1; 6656 } 6657 var index = length; 6658 if (typeof fromIndex == 'number') { 6659 index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1; 6660 } else if (fromIndex) { 6661 index = binaryIndex(array, value, true) - 1; 6662 var other = array[index]; 6663 if (value === value ? (value === other) : (other !== other)) { 6664 return index; 6665 } 6666 return -1; 6667 } 6668 if (value !== value) { 6669 return indexOfNaN(array, index, true); 6670 } 6671 while (index--) { 6672 if (array[index] === value) { 6673 return index; 6674 } 6675 } 6676 return -1; 6677 } 6678 6679 /** 6680 * Removes all provided values from `array` using `SameValueZero` for equality 6681 * comparisons. 6682 * 6683 * **Notes:** 6684 * - Unlike `_.without`, this method mutates `array` 6685 * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 6686 * comparisons are like strict equality comparisons, e.g. `===`, except 6687 * that `NaN` matches `NaN` 6688 * 6689 * @static 6690 * @memberOf _ 6691 * @category Array 6692 * @param {Array} array The array to modify. 6693 * @param {...*} [values] The values to remove. 6694 * @returns {Array} Returns `array`. 6695 * @example 6696 * 6697 * var array = [1, 2, 3, 1, 2, 3]; 6698 * 6699 * _.pull(array, 2, 3); 6700 * console.log(array); 6701 * // => [1, 1] 6702 */ 6703 function pull() { 6704 var args = arguments, 6705 array = args[0]; 6706 6707 if (!(array && array.length)) { 6708 return array; 6709 } 6710 var index = 0, 6711 indexOf = getIndexOf(), 6712 length = args.length; 6713 6714 while (++index < length) { 6715 var fromIndex = 0, 6716 value = args[index]; 6717 6718 while ((fromIndex = indexOf(array, value, fromIndex)) > -1) { 6719 splice.call(array, fromIndex, 1); 6720 } 6721 } 6722 return array; 6723 } 6724 6725 /** 6726 * Removes elements from `array` corresponding to the given indexes and returns 6727 * an array of the removed elements. Indexes may be specified as an array of 6728 * indexes or as individual arguments. 6729 * 6730 * **Note:** Unlike `_.at`, this method mutates `array`. 6731 * 6732 * @static 6733 * @memberOf _ 6734 * @category Array 6735 * @param {Array} array The array to modify. 6736 * @param {...(number|number[])} [indexes] The indexes of elements to remove, 6737 * specified as individual indexes or arrays of indexes. 6738 * @returns {Array} Returns the new array of removed elements. 6739 * @example 6740 * 6741 * var array = [5, 10, 15, 20]; 6742 * var evens = _.pullAt(array, 1, 3); 6743 * 6744 * console.log(array); 6745 * // => [5, 15] 6746 * 6747 * console.log(evens); 6748 * // => [10, 20] 6749 */ 6750 var pullAt = restParam(function(array, indexes) { 6751 array || (array = []); 6752 indexes = baseFlatten(indexes); 6753 6754 var result = baseAt(array, indexes); 6755 basePullAt(array, indexes.sort(baseCompareAscending)); 6756 return result; 6757 }); 6758 6759 /** 6760 * Removes all elements from `array` that `predicate` returns truthy for 6761 * and returns an array of the removed elements. The predicate is bound to 6762 * `thisArg` and invoked with three arguments: (value, index, array). 6763 * 6764 * If a property name is provided for `predicate` the created `_.property` 6765 * style callback returns the property value of the given element. 6766 * 6767 * If a value is also provided for `thisArg` the created `_.matchesProperty` 6768 * style callback returns `true` for elements that have a matching property 6769 * value, else `false`. 6770 * 6771 * If an object is provided for `predicate` the created `_.matches` style 6772 * callback returns `true` for elements that have the properties of the given 6773 * object, else `false`. 6774 * 6775 * **Note:** Unlike `_.filter`, this method mutates `array`. 6776 * 6777 * @static 6778 * @memberOf _ 6779 * @category Array 6780 * @param {Array} array The array to modify. 6781 * @param {Function|Object|string} [predicate=_.identity] The function invoked 6782 * per iteration. 6783 * @param {*} [thisArg] The `this` binding of `predicate`. 6784 * @returns {Array} Returns the new array of removed elements. 6785 * @example 6786 * 6787 * var array = [1, 2, 3, 4]; 6788 * var evens = _.remove(array, function(n) { 6789 * return n % 2 == 0; 6790 * }); 6791 * 6792 * console.log(array); 6793 * // => [1, 3] 6794 * 6795 * console.log(evens); 6796 * // => [2, 4] 6797 */ 6798 function remove(array, predicate, thisArg) { 6799 var result = []; 6800 if (!(array && array.length)) { 6801 return result; 6802 } 6803 var index = -1, 6804 indexes = [], 6805 length = array.length; 6806 6807 predicate = getCallback(predicate, thisArg, 3); 6808 while (++index < length) { 6809 var value = array[index]; 6810 if (predicate(value, index, array)) { 6811 result.push(value); 6812 indexes.push(index); 6813 } 6814 } 6815 basePullAt(array, indexes); 6816 return result; 6817 } 6818 6819 /** 6820 * Gets all but the first element of `array`. 6821 * 6822 * @static 6823 * @memberOf _ 6824 * @alias tail 6825 * @category Array 6826 * @param {Array} array The array to query. 6827 * @returns {Array} Returns the slice of `array`. 6828 * @example 6829 * 6830 * _.rest([1, 2, 3]); 6831 * // => [2, 3] 6832 */ 6833 function rest(array) { 6834 return drop(array, 1); 6835 } 6836 6837 /** 6838 * Creates a slice of `array` from `start` up to, but not including, `end`. 6839 * 6840 * **Note:** This method is used instead of `Array#slice` to support node 6841 * lists in IE < 9 and to ensure dense arrays are returned. 6842 * 6843 * @static 6844 * @memberOf _ 6845 * @category Array 6846 * @param {Array} array The array to slice. 6847 * @param {number} [start=0] The start position. 6848 * @param {number} [end=array.length] The end position. 6849 * @returns {Array} Returns the slice of `array`. 6850 */ 6851 function slice(array, start, end) { 6852 var length = array ? array.length : 0; 6853 if (!length) { 6854 return []; 6855 } 6856 if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { 6857 start = 0; 6858 end = length; 6859 } 6860 return baseSlice(array, start, end); 6861 } 6862 6863 /** 6864 * Uses a binary search to determine the lowest index at which `value` should 6865 * be inserted into `array` in order to maintain its sort order. If an iteratee 6866 * function is provided it is invoked for `value` and each element of `array` 6867 * to compute their sort ranking. The iteratee is bound to `thisArg` and 6868 * invoked with one argument; (value). 6869 * 6870 * If a property name is provided for `iteratee` the created `_.property` 6871 * style callback returns the property value of the given element. 6872 * 6873 * If a value is also provided for `thisArg` the created `_.matchesProperty` 6874 * style callback returns `true` for elements that have a matching property 6875 * value, else `false`. 6876 * 6877 * If an object is provided for `iteratee` the created `_.matches` style 6878 * callback returns `true` for elements that have the properties of the given 6879 * object, else `false`. 6880 * 6881 * @static 6882 * @memberOf _ 6883 * @category Array 6884 * @param {Array} array The sorted array to inspect. 6885 * @param {*} value The value to evaluate. 6886 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 6887 * per iteration. 6888 * @param {*} [thisArg] The `this` binding of `iteratee`. 6889 * @returns {number} Returns the index at which `value` should be inserted 6890 * into `array`. 6891 * @example 6892 * 6893 * _.sortedIndex([30, 50], 40); 6894 * // => 1 6895 * 6896 * _.sortedIndex([4, 4, 5, 5], 5); 6897 * // => 2 6898 * 6899 * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } }; 6900 * 6901 * // using an iteratee function 6902 * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) { 6903 * return this.data[word]; 6904 * }, dict); 6905 * // => 1 6906 * 6907 * // using the `_.property` callback shorthand 6908 * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x'); 6909 * // => 1 6910 */ 6911 var sortedIndex = createSortedIndex(); 6912 6913 /** 6914 * This method is like `_.sortedIndex` except that it returns the highest 6915 * index at which `value` should be inserted into `array` in order to 6916 * maintain its sort order. 6917 * 6918 * @static 6919 * @memberOf _ 6920 * @category Array 6921 * @param {Array} array The sorted array to inspect. 6922 * @param {*} value The value to evaluate. 6923 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 6924 * per iteration. 6925 * @param {*} [thisArg] The `this` binding of `iteratee`. 6926 * @returns {number} Returns the index at which `value` should be inserted 6927 * into `array`. 6928 * @example 6929 * 6930 * _.sortedLastIndex([4, 4, 5, 5], 5); 6931 * // => 4 6932 */ 6933 var sortedLastIndex = createSortedIndex(true); 6934 6935 /** 6936 * Creates a slice of `array` with `n` elements taken from the beginning. 6937 * 6938 * @static 6939 * @memberOf _ 6940 * @category Array 6941 * @param {Array} array The array to query. 6942 * @param {number} [n=1] The number of elements to take. 6943 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 6944 * @returns {Array} Returns the slice of `array`. 6945 * @example 6946 * 6947 * _.take([1, 2, 3]); 6948 * // => [1] 6949 * 6950 * _.take([1, 2, 3], 2); 6951 * // => [1, 2] 6952 * 6953 * _.take([1, 2, 3], 5); 6954 * // => [1, 2, 3] 6955 * 6956 * _.take([1, 2, 3], 0); 6957 * // => [] 6958 */ 6959 function take(array, n, guard) { 6960 var length = array ? array.length : 0; 6961 if (!length) { 6962 return []; 6963 } 6964 if (guard ? isIterateeCall(array, n, guard) : n == null) { 6965 n = 1; 6966 } 6967 return baseSlice(array, 0, n < 0 ? 0 : n); 6968 } 6969 6970 /** 6971 * Creates a slice of `array` with `n` elements taken from the end. 6972 * 6973 * @static 6974 * @memberOf _ 6975 * @category Array 6976 * @param {Array} array The array to query. 6977 * @param {number} [n=1] The number of elements to take. 6978 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 6979 * @returns {Array} Returns the slice of `array`. 6980 * @example 6981 * 6982 * _.takeRight([1, 2, 3]); 6983 * // => [3] 6984 * 6985 * _.takeRight([1, 2, 3], 2); 6986 * // => [2, 3] 6987 * 6988 * _.takeRight([1, 2, 3], 5); 6989 * // => [1, 2, 3] 6990 * 6991 * _.takeRight([1, 2, 3], 0); 6992 * // => [] 6993 */ 6994 function takeRight(array, n, guard) { 6995 var length = array ? array.length : 0; 6996 if (!length) { 6997 return []; 6998 } 6999 if (guard ? isIterateeCall(array, n, guard) : n == null) { 7000 n = 1; 7001 } 7002 n = length - (+n || 0); 7003 return baseSlice(array, n < 0 ? 0 : n); 7004 } 7005 7006 /** 7007 * Creates a slice of `array` with elements taken from the end. Elements are 7008 * taken until `predicate` returns falsey. The predicate is bound to `thisArg` 7009 * and invoked with three arguments: (value, index, array). 7010 * 7011 * If a property name is provided for `predicate` the created `_.property` 7012 * style callback returns the property value of the given element. 7013 * 7014 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7015 * style callback returns `true` for elements that have a matching property 7016 * value, else `false`. 7017 * 7018 * If an object is provided for `predicate` the created `_.matches` style 7019 * callback returns `true` for elements that have the properties of the given 7020 * object, else `false`. 7021 * 7022 * @static 7023 * @memberOf _ 7024 * @category Array 7025 * @param {Array} array The array to query. 7026 * @param {Function|Object|string} [predicate=_.identity] The function invoked 7027 * per iteration. 7028 * @param {*} [thisArg] The `this` binding of `predicate`. 7029 * @returns {Array} Returns the slice of `array`. 7030 * @example 7031 * 7032 * _.takeRightWhile([1, 2, 3], function(n) { 7033 * return n > 1; 7034 * }); 7035 * // => [2, 3] 7036 * 7037 * var users = [ 7038 * { 'user': 'barney', 'active': true }, 7039 * { 'user': 'fred', 'active': false }, 7040 * { 'user': 'pebbles', 'active': false } 7041 * ]; 7042 * 7043 * // using the `_.matches` callback shorthand 7044 * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); 7045 * // => ['pebbles'] 7046 * 7047 * // using the `_.matchesProperty` callback shorthand 7048 * _.pluck(_.takeRightWhile(users, 'active', false), 'user'); 7049 * // => ['fred', 'pebbles'] 7050 * 7051 * // using the `_.property` callback shorthand 7052 * _.pluck(_.takeRightWhile(users, 'active'), 'user'); 7053 * // => [] 7054 */ 7055 function takeRightWhile(array, predicate, thisArg) { 7056 return (array && array.length) 7057 ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true) 7058 : []; 7059 } 7060 7061 /** 7062 * Creates a slice of `array` with elements taken from the beginning. Elements 7063 * are taken until `predicate` returns falsey. The predicate is bound to 7064 * `thisArg` and invoked with three arguments: (value, index, array). 7065 * 7066 * If a property name is provided for `predicate` the created `_.property` 7067 * style callback returns the property value of the given element. 7068 * 7069 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7070 * style callback returns `true` for elements that have a matching property 7071 * value, else `false`. 7072 * 7073 * If an object is provided for `predicate` the created `_.matches` style 7074 * callback returns `true` for elements that have the properties of the given 7075 * object, else `false`. 7076 * 7077 * @static 7078 * @memberOf _ 7079 * @category Array 7080 * @param {Array} array The array to query. 7081 * @param {Function|Object|string} [predicate=_.identity] The function invoked 7082 * per iteration. 7083 * @param {*} [thisArg] The `this` binding of `predicate`. 7084 * @returns {Array} Returns the slice of `array`. 7085 * @example 7086 * 7087 * _.takeWhile([1, 2, 3], function(n) { 7088 * return n < 3; 7089 * }); 7090 * // => [1, 2] 7091 * 7092 * var users = [ 7093 * { 'user': 'barney', 'active': false }, 7094 * { 'user': 'fred', 'active': false}, 7095 * { 'user': 'pebbles', 'active': true } 7096 * ]; 7097 * 7098 * // using the `_.matches` callback shorthand 7099 * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user'); 7100 * // => ['barney'] 7101 * 7102 * // using the `_.matchesProperty` callback shorthand 7103 * _.pluck(_.takeWhile(users, 'active', false), 'user'); 7104 * // => ['barney', 'fred'] 7105 * 7106 * // using the `_.property` callback shorthand 7107 * _.pluck(_.takeWhile(users, 'active'), 'user'); 7108 * // => [] 7109 */ 7110 function takeWhile(array, predicate, thisArg) { 7111 return (array && array.length) 7112 ? baseWhile(array, getCallback(predicate, thisArg, 3)) 7113 : []; 7114 } 7115 7116 /** 7117 * Creates an array of unique values, in order, of the provided arrays using 7118 * `SameValueZero` for equality comparisons. 7119 * 7120 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 7121 * comparisons are like strict equality comparisons, e.g. `===`, except that 7122 * `NaN` matches `NaN`. 7123 * 7124 * @static 7125 * @memberOf _ 7126 * @category Array 7127 * @param {...Array} [arrays] The arrays to inspect. 7128 * @returns {Array} Returns the new array of combined values. 7129 * @example 7130 * 7131 * _.union([1, 2], [4, 2], [2, 1]); 7132 * // => [1, 2, 4] 7133 */ 7134 var union = restParam(function(arrays) { 7135 return baseUniq(baseFlatten(arrays, false, true)); 7136 }); 7137 7138 /** 7139 * Creates a duplicate-free version of an array, using `SameValueZero` for 7140 * equality comparisons, in which only the first occurence of each element 7141 * is kept. Providing `true` for `isSorted` performs a faster search algorithm 7142 * for sorted arrays. If an iteratee function is provided it is invoked for 7143 * each element in the array to generate the criterion by which uniqueness 7144 * is computed. The `iteratee` is bound to `thisArg` and invoked with three 7145 * arguments: (value, index, array). 7146 * 7147 * If a property name is provided for `iteratee` the created `_.property` 7148 * style callback returns the property value of the given element. 7149 * 7150 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7151 * style callback returns `true` for elements that have a matching property 7152 * value, else `false`. 7153 * 7154 * If an object is provided for `iteratee` the created `_.matches` style 7155 * callback returns `true` for elements that have the properties of the given 7156 * object, else `false`. 7157 * 7158 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 7159 * comparisons are like strict equality comparisons, e.g. `===`, except that 7160 * `NaN` matches `NaN`. 7161 * 7162 * @static 7163 * @memberOf _ 7164 * @alias unique 7165 * @category Array 7166 * @param {Array} array The array to inspect. 7167 * @param {boolean} [isSorted] Specify the array is sorted. 7168 * @param {Function|Object|string} [iteratee] The function invoked per iteration. 7169 * @param {*} [thisArg] The `this` binding of `iteratee`. 7170 * @returns {Array} Returns the new duplicate-value-free array. 7171 * @example 7172 * 7173 * _.uniq([2, 1, 2]); 7174 * // => [2, 1] 7175 * 7176 * // using `isSorted` 7177 * _.uniq([1, 1, 2], true); 7178 * // => [1, 2] 7179 * 7180 * // using an iteratee function 7181 * _.uniq([1, 2.5, 1.5, 2], function(n) { 7182 * return this.floor(n); 7183 * }, Math); 7184 * // => [1, 2.5] 7185 * 7186 * // using the `_.property` callback shorthand 7187 * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); 7188 * // => [{ 'x': 1 }, { 'x': 2 }] 7189 */ 7190 function uniq(array, isSorted, iteratee, thisArg) { 7191 var length = array ? array.length : 0; 7192 if (!length) { 7193 return []; 7194 } 7195 if (isSorted != null && typeof isSorted != 'boolean') { 7196 thisArg = iteratee; 7197 iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted; 7198 isSorted = false; 7199 } 7200 var func = getCallback(); 7201 if (!(func === baseCallback && iteratee == null)) { 7202 iteratee = func(iteratee, thisArg, 3); 7203 } 7204 return (isSorted && getIndexOf() == baseIndexOf) 7205 ? sortedUniq(array, iteratee) 7206 : baseUniq(array, iteratee); 7207 } 7208 7209 /** 7210 * This method is like `_.zip` except that it accepts an array of grouped 7211 * elements and creates an array regrouping the elements to their pre-`_.zip` 7212 * configuration. 7213 * 7214 * @static 7215 * @memberOf _ 7216 * @category Array 7217 * @param {Array} array The array of grouped elements to process. 7218 * @returns {Array} Returns the new array of regrouped elements. 7219 * @example 7220 * 7221 * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]); 7222 * // => [['fred', 30, true], ['barney', 40, false]] 7223 * 7224 * _.unzip(zipped); 7225 * // => [['fred', 'barney'], [30, 40], [true, false]] 7226 */ 7227 function unzip(array) { 7228 var index = -1, 7229 length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0, 7230 result = Array(length); 7231 7232 while (++index < length) { 7233 result[index] = arrayMap(array, baseProperty(index)); 7234 } 7235 return result; 7236 } 7237 7238 /** 7239 * Creates an array excluding all provided values using `SameValueZero` for 7240 * equality comparisons. 7241 * 7242 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 7243 * comparisons are like strict equality comparisons, e.g. `===`, except that 7244 * `NaN` matches `NaN`. 7245 * 7246 * @static 7247 * @memberOf _ 7248 * @category Array 7249 * @param {Array} array The array to filter. 7250 * @param {...*} [values] The values to exclude. 7251 * @returns {Array} Returns the new array of filtered values. 7252 * @example 7253 * 7254 * _.without([1, 2, 1, 3], 1, 2); 7255 * // => [3] 7256 */ 7257 var without = restParam(function(array, values) { 7258 return (isArray(array) || isArguments(array)) 7259 ? baseDifference(array, values) 7260 : []; 7261 }); 7262 7263 /** 7264 * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) 7265 * of the provided arrays. 7266 * 7267 * @static 7268 * @memberOf _ 7269 * @category Array 7270 * @param {...Array} [arrays] The arrays to inspect. 7271 * @returns {Array} Returns the new array of values. 7272 * @example 7273 * 7274 * _.xor([1, 2], [4, 2]); 7275 * // => [1, 4] 7276 */ 7277 function xor() { 7278 var index = -1, 7279 length = arguments.length; 7280 7281 while (++index < length) { 7282 var array = arguments[index]; 7283 if (isArray(array) || isArguments(array)) { 7284 var result = result 7285 ? baseDifference(result, array).concat(baseDifference(array, result)) 7286 : array; 7287 } 7288 } 7289 return result ? baseUniq(result) : []; 7290 } 7291 7292 /** 7293 * Creates an array of grouped elements, the first of which contains the first 7294 * elements of the given arrays, the second of which contains the second elements 7295 * of the given arrays, and so on. 7296 * 7297 * @static 7298 * @memberOf _ 7299 * @category Array 7300 * @param {...Array} [arrays] The arrays to process. 7301 * @returns {Array} Returns the new array of grouped elements. 7302 * @example 7303 * 7304 * _.zip(['fred', 'barney'], [30, 40], [true, false]); 7305 * // => [['fred', 30, true], ['barney', 40, false]] 7306 */ 7307 var zip = restParam(unzip); 7308 7309 /** 7310 * The inverse of `_.pairs`; this method returns an object composed from arrays 7311 * of property names and values. Provide either a single two dimensional array, 7312 * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names 7313 * and one of corresponding values. 7314 * 7315 * @static 7316 * @memberOf _ 7317 * @alias object 7318 * @category Array 7319 * @param {Array} props The property names. 7320 * @param {Array} [values=[]] The property values. 7321 * @returns {Object} Returns the new object. 7322 * @example 7323 * 7324 * _.zipObject([['fred', 30], ['barney', 40]]); 7325 * // => { 'fred': 30, 'barney': 40 } 7326 * 7327 * _.zipObject(['fred', 'barney'], [30, 40]); 7328 * // => { 'fred': 30, 'barney': 40 } 7329 */ 7330 function zipObject(props, values) { 7331 var index = -1, 7332 length = props ? props.length : 0, 7333 result = {}; 7334 7335 if (length && !values && !isArray(props[0])) { 7336 values = []; 7337 } 7338 while (++index < length) { 7339 var key = props[index]; 7340 if (values) { 7341 result[key] = values[index]; 7342 } else if (key) { 7343 result[key[0]] = key[1]; 7344 } 7345 } 7346 return result; 7347 } 7348 7349 /*------------------------------------------------------------------------*/ 7350 7351 /** 7352 * Creates a `lodash` object that wraps `value` with explicit method 7353 * chaining enabled. 7354 * 7355 * @static 7356 * @memberOf _ 7357 * @category Chain 7358 * @param {*} value The value to wrap. 7359 * @returns {Object} Returns the new `lodash` wrapper instance. 7360 * @example 7361 * 7362 * var users = [ 7363 * { 'user': 'barney', 'age': 36 }, 7364 * { 'user': 'fred', 'age': 40 }, 7365 * { 'user': 'pebbles', 'age': 1 } 7366 * ]; 7367 * 7368 * var youngest = _.chain(users) 7369 * .sortBy('age') 7370 * .map(function(chr) { 7371 * return chr.user + ' is ' + chr.age; 7372 * }) 7373 * .first() 7374 * .value(); 7375 * // => 'pebbles is 1' 7376 */ 7377 function chain(value) { 7378 var result = lodash(value); 7379 result.__chain__ = true; 7380 return result; 7381 } 7382 7383 /** 7384 * This method invokes `interceptor` and returns `value`. The interceptor is 7385 * bound to `thisArg` and invoked with one argument; (value). The purpose of 7386 * this method is to "tap into" a method chain in order to perform operations 7387 * on intermediate results within the chain. 7388 * 7389 * @static 7390 * @memberOf _ 7391 * @category Chain 7392 * @param {*} value The value to provide to `interceptor`. 7393 * @param {Function} interceptor The function to invoke. 7394 * @param {*} [thisArg] The `this` binding of `interceptor`. 7395 * @returns {*} Returns `value`. 7396 * @example 7397 * 7398 * _([1, 2, 3]) 7399 * .tap(function(array) { 7400 * array.pop(); 7401 * }) 7402 * .reverse() 7403 * .value(); 7404 * // => [2, 1] 7405 */ 7406 function tap(value, interceptor, thisArg) { 7407 interceptor.call(thisArg, value); 7408 return value; 7409 } 7410 7411 /** 7412 * This method is like `_.tap` except that it returns the result of `interceptor`. 7413 * 7414 * @static 7415 * @memberOf _ 7416 * @category Chain 7417 * @param {*} value The value to provide to `interceptor`. 7418 * @param {Function} interceptor The function to invoke. 7419 * @param {*} [thisArg] The `this` binding of `interceptor`. 7420 * @returns {*} Returns the result of `interceptor`. 7421 * @example 7422 * 7423 * _(' abc ') 7424 * .chain() 7425 * .trim() 7426 * .thru(function(value) { 7427 * return [value]; 7428 * }) 7429 * .value(); 7430 * // => ['abc'] 7431 */ 7432 function thru(value, interceptor, thisArg) { 7433 return interceptor.call(thisArg, value); 7434 } 7435 7436 /** 7437 * Enables explicit method chaining on the wrapper object. 7438 * 7439 * @name chain 7440 * @memberOf _ 7441 * @category Chain 7442 * @returns {Object} Returns the new `lodash` wrapper instance. 7443 * @example 7444 * 7445 * var users = [ 7446 * { 'user': 'barney', 'age': 36 }, 7447 * { 'user': 'fred', 'age': 40 } 7448 * ]; 7449 * 7450 * // without explicit chaining 7451 * _(users).first(); 7452 * // => { 'user': 'barney', 'age': 36 } 7453 * 7454 * // with explicit chaining 7455 * _(users).chain() 7456 * .first() 7457 * .pick('user') 7458 * .value(); 7459 * // => { 'user': 'barney' } 7460 */ 7461 function wrapperChain() { 7462 return chain(this); 7463 } 7464 7465 /** 7466 * Executes the chained sequence and returns the wrapped result. 7467 * 7468 * @name commit 7469 * @memberOf _ 7470 * @category Chain 7471 * @returns {Object} Returns the new `lodash` wrapper instance. 7472 * @example 7473 * 7474 * var array = [1, 2]; 7475 * var wrapper = _(array).push(3); 7476 * 7477 * console.log(array); 7478 * // => [1, 2] 7479 * 7480 * wrapper = wrapper.commit(); 7481 * console.log(array); 7482 * // => [1, 2, 3] 7483 * 7484 * wrapper.last(); 7485 * // => 3 7486 * 7487 * console.log(array); 7488 * // => [1, 2, 3] 7489 */ 7490 function wrapperCommit() { 7491 return new LodashWrapper(this.value(), this.__chain__); 7492 } 7493 7494 /** 7495 * Creates a clone of the chained sequence planting `value` as the wrapped value. 7496 * 7497 * @name plant 7498 * @memberOf _ 7499 * @category Chain 7500 * @returns {Object} Returns the new `lodash` wrapper instance. 7501 * @example 7502 * 7503 * var array = [1, 2]; 7504 * var wrapper = _(array).map(function(value) { 7505 * return Math.pow(value, 2); 7506 * }); 7507 * 7508 * var other = [3, 4]; 7509 * var otherWrapper = wrapper.plant(other); 7510 * 7511 * otherWrapper.value(); 7512 * // => [9, 16] 7513 * 7514 * wrapper.value(); 7515 * // => [1, 4] 7516 */ 7517 function wrapperPlant(value) { 7518 var result, 7519 parent = this; 7520 7521 while (parent instanceof baseLodash) { 7522 var clone = wrapperClone(parent); 7523 if (result) { 7524 previous.__wrapped__ = clone; 7525 } else { 7526 result = clone; 7527 } 7528 var previous = clone; 7529 parent = parent.__wrapped__; 7530 } 7531 previous.__wrapped__ = value; 7532 return result; 7533 } 7534 7535 /** 7536 * Reverses the wrapped array so the first element becomes the last, the 7537 * second element becomes the second to last, and so on. 7538 * 7539 * **Note:** This method mutates the wrapped array. 7540 * 7541 * @name reverse 7542 * @memberOf _ 7543 * @category Chain 7544 * @returns {Object} Returns the new reversed `lodash` wrapper instance. 7545 * @example 7546 * 7547 * var array = [1, 2, 3]; 7548 * 7549 * _(array).reverse().value() 7550 * // => [3, 2, 1] 7551 * 7552 * console.log(array); 7553 * // => [3, 2, 1] 7554 */ 7555 function wrapperReverse() { 7556 var value = this.__wrapped__; 7557 if (value instanceof LazyWrapper) { 7558 if (this.__actions__.length) { 7559 value = new LazyWrapper(this); 7560 } 7561 return new LodashWrapper(value.reverse(), this.__chain__); 7562 } 7563 return this.thru(function(value) { 7564 return value.reverse(); 7565 }); 7566 } 7567 7568 /** 7569 * Produces the result of coercing the unwrapped value to a string. 7570 * 7571 * @name toString 7572 * @memberOf _ 7573 * @category Chain 7574 * @returns {string} Returns the coerced string value. 7575 * @example 7576 * 7577 * _([1, 2, 3]).toString(); 7578 * // => '1,2,3' 7579 */ 7580 function wrapperToString() { 7581 return (this.value() + ''); 7582 } 7583 7584 /** 7585 * Executes the chained sequence to extract the unwrapped value. 7586 * 7587 * @name value 7588 * @memberOf _ 7589 * @alias run, toJSON, valueOf 7590 * @category Chain 7591 * @returns {*} Returns the resolved unwrapped value. 7592 * @example 7593 * 7594 * _([1, 2, 3]).value(); 7595 * // => [1, 2, 3] 7596 */ 7597 function wrapperValue() { 7598 return baseWrapperValue(this.__wrapped__, this.__actions__); 7599 } 7600 7601 /*------------------------------------------------------------------------*/ 7602 7603 /** 7604 * Creates an array of elements corresponding to the given keys, or indexes, 7605 * of `collection`. Keys may be specified as individual arguments or as arrays 7606 * of keys. 7607 * 7608 * @static 7609 * @memberOf _ 7610 * @category Collection 7611 * @param {Array|Object|string} collection The collection to iterate over. 7612 * @param {...(number|number[]|string|string[])} [props] The property names 7613 * or indexes of elements to pick, specified individually or in arrays. 7614 * @returns {Array} Returns the new array of picked elements. 7615 * @example 7616 * 7617 * _.at(['a', 'b', 'c'], [0, 2]); 7618 * // => ['a', 'c'] 7619 * 7620 * _.at(['barney', 'fred', 'pebbles'], 0, 2); 7621 * // => ['barney', 'pebbles'] 7622 */ 7623 var at = restParam(function(collection, props) { 7624 var length = collection ? getLength(collection) : 0; 7625 if (isLength(length)) { 7626 collection = toIterable(collection); 7627 } 7628 return baseAt(collection, baseFlatten(props)); 7629 }); 7630 7631 /** 7632 * Creates an object composed of keys generated from the results of running 7633 * each element of `collection` through `iteratee`. The corresponding value 7634 * of each key is the number of times the key was returned by `iteratee`. 7635 * The `iteratee` is bound to `thisArg` and invoked with three arguments: 7636 * (value, index|key, collection). 7637 * 7638 * If a property name is provided for `iteratee` the created `_.property` 7639 * style callback returns the property value of the given element. 7640 * 7641 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7642 * style callback returns `true` for elements that have a matching property 7643 * value, else `false`. 7644 * 7645 * If an object is provided for `iteratee` the created `_.matches` style 7646 * callback returns `true` for elements that have the properties of the given 7647 * object, else `false`. 7648 * 7649 * @static 7650 * @memberOf _ 7651 * @category Collection 7652 * @param {Array|Object|string} collection The collection to iterate over. 7653 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 7654 * per iteration. 7655 * @param {*} [thisArg] The `this` binding of `iteratee`. 7656 * @returns {Object} Returns the composed aggregate object. 7657 * @example 7658 * 7659 * _.countBy([4.3, 6.1, 6.4], function(n) { 7660 * return Math.floor(n); 7661 * }); 7662 * // => { '4': 1, '6': 2 } 7663 * 7664 * _.countBy([4.3, 6.1, 6.4], function(n) { 7665 * return this.floor(n); 7666 * }, Math); 7667 * // => { '4': 1, '6': 2 } 7668 * 7669 * _.countBy(['one', 'two', 'three'], 'length'); 7670 * // => { '3': 2, '5': 1 } 7671 */ 7672 var countBy = createAggregator(function(result, value, key) { 7673 hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1); 7674 }); 7675 7676 /** 7677 * Checks if `predicate` returns truthy for **all** elements of `collection`. 7678 * The predicate is bound to `thisArg` and invoked with three arguments: 7679 * (value, index|key, collection). 7680 * 7681 * If a property name is provided for `predicate` the created `_.property` 7682 * style callback returns the property value of the given element. 7683 * 7684 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7685 * style callback returns `true` for elements that have a matching property 7686 * value, else `false`. 7687 * 7688 * If an object is provided for `predicate` the created `_.matches` style 7689 * callback returns `true` for elements that have the properties of the given 7690 * object, else `false`. 7691 * 7692 * @static 7693 * @memberOf _ 7694 * @alias all 7695 * @category Collection 7696 * @param {Array|Object|string} collection The collection to iterate over. 7697 * @param {Function|Object|string} [predicate=_.identity] The function invoked 7698 * per iteration. 7699 * @param {*} [thisArg] The `this` binding of `predicate`. 7700 * @returns {boolean} Returns `true` if all elements pass the predicate check, 7701 * else `false`. 7702 * @example 7703 * 7704 * _.every([true, 1, null, 'yes'], Boolean); 7705 * // => false 7706 * 7707 * var users = [ 7708 * { 'user': 'barney', 'active': false }, 7709 * { 'user': 'fred', 'active': false } 7710 * ]; 7711 * 7712 * // using the `_.matches` callback shorthand 7713 * _.every(users, { 'user': 'barney', 'active': false }); 7714 * // => false 7715 * 7716 * // using the `_.matchesProperty` callback shorthand 7717 * _.every(users, 'active', false); 7718 * // => true 7719 * 7720 * // using the `_.property` callback shorthand 7721 * _.every(users, 'active'); 7722 * // => false 7723 */ 7724 function every(collection, predicate, thisArg) { 7725 var func = isArray(collection) ? arrayEvery : baseEvery; 7726 if (thisArg && isIterateeCall(collection, predicate, thisArg)) { 7727 predicate = null; 7728 } 7729 if (typeof predicate != 'function' || thisArg !== undefined) { 7730 predicate = getCallback(predicate, thisArg, 3); 7731 } 7732 return func(collection, predicate); 7733 } 7734 7735 /** 7736 * Iterates over elements of `collection`, returning an array of all elements 7737 * `predicate` returns truthy for. The predicate is bound to `thisArg` and 7738 * invoked with three arguments: (value, index|key, collection). 7739 * 7740 * If a property name is provided for `predicate` the created `_.property` 7741 * style callback returns the property value of the given element. 7742 * 7743 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7744 * style callback returns `true` for elements that have a matching property 7745 * value, else `false`. 7746 * 7747 * If an object is provided for `predicate` the created `_.matches` style 7748 * callback returns `true` for elements that have the properties of the given 7749 * object, else `false`. 7750 * 7751 * @static 7752 * @memberOf _ 7753 * @alias select 7754 * @category Collection 7755 * @param {Array|Object|string} collection The collection to iterate over. 7756 * @param {Function|Object|string} [predicate=_.identity] The function invoked 7757 * per iteration. 7758 * @param {*} [thisArg] The `this` binding of `predicate`. 7759 * @returns {Array} Returns the new filtered array. 7760 * @example 7761 * 7762 * _.filter([4, 5, 6], function(n) { 7763 * return n % 2 == 0; 7764 * }); 7765 * // => [4, 6] 7766 * 7767 * var users = [ 7768 * { 'user': 'barney', 'age': 36, 'active': true }, 7769 * { 'user': 'fred', 'age': 40, 'active': false } 7770 * ]; 7771 * 7772 * // using the `_.matches` callback shorthand 7773 * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user'); 7774 * // => ['barney'] 7775 * 7776 * // using the `_.matchesProperty` callback shorthand 7777 * _.pluck(_.filter(users, 'active', false), 'user'); 7778 * // => ['fred'] 7779 * 7780 * // using the `_.property` callback shorthand 7781 * _.pluck(_.filter(users, 'active'), 'user'); 7782 * // => ['barney'] 7783 */ 7784 function filter(collection, predicate, thisArg) { 7785 var func = isArray(collection) ? arrayFilter : baseFilter; 7786 predicate = getCallback(predicate, thisArg, 3); 7787 return func(collection, predicate); 7788 } 7789 7790 /** 7791 * Iterates over elements of `collection`, returning the first element 7792 * `predicate` returns truthy for. The predicate is bound to `thisArg` and 7793 * invoked with three arguments: (value, index|key, collection). 7794 * 7795 * If a property name is provided for `predicate` the created `_.property` 7796 * style callback returns the property value of the given element. 7797 * 7798 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7799 * style callback returns `true` for elements that have a matching property 7800 * value, else `false`. 7801 * 7802 * If an object is provided for `predicate` the created `_.matches` style 7803 * callback returns `true` for elements that have the properties of the given 7804 * object, else `false`. 7805 * 7806 * @static 7807 * @memberOf _ 7808 * @alias detect 7809 * @category Collection 7810 * @param {Array|Object|string} collection The collection to search. 7811 * @param {Function|Object|string} [predicate=_.identity] The function invoked 7812 * per iteration. 7813 * @param {*} [thisArg] The `this` binding of `predicate`. 7814 * @returns {*} Returns the matched element, else `undefined`. 7815 * @example 7816 * 7817 * var users = [ 7818 * { 'user': 'barney', 'age': 36, 'active': true }, 7819 * { 'user': 'fred', 'age': 40, 'active': false }, 7820 * { 'user': 'pebbles', 'age': 1, 'active': true } 7821 * ]; 7822 * 7823 * _.result(_.find(users, function(chr) { 7824 * return chr.age < 40; 7825 * }), 'user'); 7826 * // => 'barney' 7827 * 7828 * // using the `_.matches` callback shorthand 7829 * _.result(_.find(users, { 'age': 1, 'active': true }), 'user'); 7830 * // => 'pebbles' 7831 * 7832 * // using the `_.matchesProperty` callback shorthand 7833 * _.result(_.find(users, 'active', false), 'user'); 7834 * // => 'fred' 7835 * 7836 * // using the `_.property` callback shorthand 7837 * _.result(_.find(users, 'active'), 'user'); 7838 * // => 'barney' 7839 */ 7840 var find = createFind(baseEach); 7841 7842 /** 7843 * This method is like `_.find` except that it iterates over elements of 7844 * `collection` from right to left. 7845 * 7846 * @static 7847 * @memberOf _ 7848 * @category Collection 7849 * @param {Array|Object|string} collection The collection to search. 7850 * @param {Function|Object|string} [predicate=_.identity] The function invoked 7851 * per iteration. 7852 * @param {*} [thisArg] The `this` binding of `predicate`. 7853 * @returns {*} Returns the matched element, else `undefined`. 7854 * @example 7855 * 7856 * _.findLast([1, 2, 3, 4], function(n) { 7857 * return n % 2 == 1; 7858 * }); 7859 * // => 3 7860 */ 7861 var findLast = createFind(baseEachRight, true); 7862 7863 /** 7864 * Performs a deep comparison between each element in `collection` and the 7865 * source object, returning the first element that has equivalent property 7866 * values. 7867 * 7868 * **Note:** This method supports comparing arrays, booleans, `Date` objects, 7869 * numbers, `Object` objects, regexes, and strings. Objects are compared by 7870 * their own, not inherited, enumerable properties. For comparing a single 7871 * own or inherited property value see `_.matchesProperty`. 7872 * 7873 * @static 7874 * @memberOf _ 7875 * @category Collection 7876 * @param {Array|Object|string} collection The collection to search. 7877 * @param {Object} source The object of property values to match. 7878 * @returns {*} Returns the matched element, else `undefined`. 7879 * @example 7880 * 7881 * var users = [ 7882 * { 'user': 'barney', 'age': 36, 'active': true }, 7883 * { 'user': 'fred', 'age': 40, 'active': false } 7884 * ]; 7885 * 7886 * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user'); 7887 * // => 'barney' 7888 * 7889 * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user'); 7890 * // => 'fred' 7891 */ 7892 function findWhere(collection, source) { 7893 return find(collection, baseMatches(source)); 7894 } 7895 7896 /** 7897 * Iterates over elements of `collection` invoking `iteratee` for each element. 7898 * The `iteratee` is bound to `thisArg` and invoked with three arguments: 7899 * (value, index|key, collection). Iteratee functions may exit iteration early 7900 * by explicitly returning `false`. 7901 * 7902 * **Note:** As with other "Collections" methods, objects with a "length" property 7903 * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn` 7904 * may be used for object iteration. 7905 * 7906 * @static 7907 * @memberOf _ 7908 * @alias each 7909 * @category Collection 7910 * @param {Array|Object|string} collection The collection to iterate over. 7911 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 7912 * @param {*} [thisArg] The `this` binding of `iteratee`. 7913 * @returns {Array|Object|string} Returns `collection`. 7914 * @example 7915 * 7916 * _([1, 2]).forEach(function(n) { 7917 * console.log(n); 7918 * }).value(); 7919 * // => logs each value from left to right and returns the array 7920 * 7921 * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) { 7922 * console.log(n, key); 7923 * }); 7924 * // => logs each value-key pair and returns the object (iteration order is not guaranteed) 7925 */ 7926 var forEach = createForEach(arrayEach, baseEach); 7927 7928 /** 7929 * This method is like `_.forEach` except that it iterates over elements of 7930 * `collection` from right to left. 7931 * 7932 * @static 7933 * @memberOf _ 7934 * @alias eachRight 7935 * @category Collection 7936 * @param {Array|Object|string} collection The collection to iterate over. 7937 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 7938 * @param {*} [thisArg] The `this` binding of `iteratee`. 7939 * @returns {Array|Object|string} Returns `collection`. 7940 * @example 7941 * 7942 * _([1, 2]).forEachRight(function(n) { 7943 * console.log(n); 7944 * }).value(); 7945 * // => logs each value from right to left and returns the array 7946 */ 7947 var forEachRight = createForEach(arrayEachRight, baseEachRight); 7948 7949 /** 7950 * Creates an object composed of keys generated from the results of running 7951 * each element of `collection` through `iteratee`. The corresponding value 7952 * of each key is an array of the elements responsible for generating the key. 7953 * The `iteratee` is bound to `thisArg` and invoked with three arguments: 7954 * (value, index|key, collection). 7955 * 7956 * If a property name is provided for `iteratee` the created `_.property` 7957 * style callback returns the property value of the given element. 7958 * 7959 * If a value is also provided for `thisArg` the created `_.matchesProperty` 7960 * style callback returns `true` for elements that have a matching property 7961 * value, else `false`. 7962 * 7963 * If an object is provided for `iteratee` the created `_.matches` style 7964 * callback returns `true` for elements that have the properties of the given 7965 * object, else `false`. 7966 * 7967 * @static 7968 * @memberOf _ 7969 * @category Collection 7970 * @param {Array|Object|string} collection The collection to iterate over. 7971 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 7972 * per iteration. 7973 * @param {*} [thisArg] The `this` binding of `iteratee`. 7974 * @returns {Object} Returns the composed aggregate object. 7975 * @example 7976 * 7977 * _.groupBy([4.2, 6.1, 6.4], function(n) { 7978 * return Math.floor(n); 7979 * }); 7980 * // => { '4': [4.2], '6': [6.1, 6.4] } 7981 * 7982 * _.groupBy([4.2, 6.1, 6.4], function(n) { 7983 * return this.floor(n); 7984 * }, Math); 7985 * // => { '4': [4.2], '6': [6.1, 6.4] } 7986 * 7987 * // using the `_.property` callback shorthand 7988 * _.groupBy(['one', 'two', 'three'], 'length'); 7989 * // => { '3': ['one', 'two'], '5': ['three'] } 7990 */ 7991 var groupBy = createAggregator(function(result, value, key) { 7992 if (hasOwnProperty.call(result, key)) { 7993 result[key].push(value); 7994 } else { 7995 result[key] = [value]; 7996 } 7997 }); 7998 7999 /** 8000 * Checks if `value` is in `collection` using `SameValueZero` for equality 8001 * comparisons. If `fromIndex` is negative, it is used as the offset from 8002 * the end of `collection`. 8003 * 8004 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) 8005 * comparisons are like strict equality comparisons, e.g. `===`, except that 8006 * `NaN` matches `NaN`. 8007 * 8008 * @static 8009 * @memberOf _ 8010 * @alias contains, include 8011 * @category Collection 8012 * @param {Array|Object|string} collection The collection to search. 8013 * @param {*} target The value to search for. 8014 * @param {number} [fromIndex=0] The index to search from. 8015 * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. 8016 * @returns {boolean} Returns `true` if a matching element is found, else `false`. 8017 * @example 8018 * 8019 * _.includes([1, 2, 3], 1); 8020 * // => true 8021 * 8022 * _.includes([1, 2, 3], 1, 2); 8023 * // => false 8024 * 8025 * _.includes({ 'user': 'fred', 'age': 40 }, 'fred'); 8026 * // => true 8027 * 8028 * _.includes('pebbles', 'eb'); 8029 * // => true 8030 */ 8031 function includes(collection, target, fromIndex, guard) { 8032 var length = collection ? getLength(collection) : 0; 8033 if (!isLength(length)) { 8034 collection = values(collection); 8035 length = collection.length; 8036 } 8037 if (!length) { 8038 return false; 8039 } 8040 if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) { 8041 fromIndex = 0; 8042 } else { 8043 fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); 8044 } 8045 return (typeof collection == 'string' || !isArray(collection) && isString(collection)) 8046 ? (fromIndex < length && collection.indexOf(target, fromIndex) > -1) 8047 : (getIndexOf(collection, target, fromIndex) > -1); 8048 } 8049 8050 /** 8051 * Creates an object composed of keys generated from the results of running 8052 * each element of `collection` through `iteratee`. The corresponding value 8053 * of each key is the last element responsible for generating the key. The 8054 * iteratee function is bound to `thisArg` and invoked with three arguments: 8055 * (value, index|key, collection). 8056 * 8057 * If a property name is provided for `iteratee` the created `_.property` 8058 * style callback returns the property value of the given element. 8059 * 8060 * If a value is also provided for `thisArg` the created `_.matchesProperty` 8061 * style callback returns `true` for elements that have a matching property 8062 * value, else `false`. 8063 * 8064 * If an object is provided for `iteratee` the created `_.matches` style 8065 * callback returns `true` for elements that have the properties of the given 8066 * object, else `false`. 8067 * 8068 * @static 8069 * @memberOf _ 8070 * @category Collection 8071 * @param {Array|Object|string} collection The collection to iterate over. 8072 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 8073 * per iteration. 8074 * @param {*} [thisArg] The `this` binding of `iteratee`. 8075 * @returns {Object} Returns the composed aggregate object. 8076 * @example 8077 * 8078 * var keyData = [ 8079 * { 'dir': 'left', 'code': 97 }, 8080 * { 'dir': 'right', 'code': 100 } 8081 * ]; 8082 * 8083 * _.indexBy(keyData, 'dir'); 8084 * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } 8085 * 8086 * _.indexBy(keyData, function(object) { 8087 * return String.fromCharCode(object.code); 8088 * }); 8089 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } 8090 * 8091 * _.indexBy(keyData, function(object) { 8092 * return this.fromCharCode(object.code); 8093 * }, String); 8094 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } 8095 */ 8096 var indexBy = createAggregator(function(result, value, key) { 8097 result[key] = value; 8098 }); 8099 8100 /** 8101 * Invokes the method at `path` on each element in `collection`, returning 8102 * an array of the results of each invoked method. Any additional arguments 8103 * are provided to each invoked method. If `methodName` is a function it is 8104 * invoked for, and `this` bound to, each element in `collection`. 8105 * 8106 * @static 8107 * @memberOf _ 8108 * @category Collection 8109 * @param {Array|Object|string} collection The collection to iterate over. 8110 * @param {Array|Function|string} path The path of the method to invoke or 8111 * the function invoked per iteration. 8112 * @param {...*} [args] The arguments to invoke the method with. 8113 * @returns {Array} Returns the array of results. 8114 * @example 8115 * 8116 * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); 8117 * // => [[1, 5, 7], [1, 2, 3]] 8118 * 8119 * _.invoke([123, 456], String.prototype.split, ''); 8120 * // => [['1', '2', '3'], ['4', '5', '6']] 8121 */ 8122 var invoke = restParam(function(collection, path, args) { 8123 var index = -1, 8124 isFunc = typeof path == 'function', 8125 isProp = isKey(path), 8126 length = getLength(collection), 8127 result = isLength(length) ? Array(length) : []; 8128 8129 baseEach(collection, function(value) { 8130 var func = isFunc ? path : (isProp && value != null && value[path]); 8131 result[++index] = func ? func.apply(value, args) : invokePath(value, path, args); 8132 }); 8133 return result; 8134 }); 8135 8136 /** 8137 * Creates an array of values by running each element in `collection` through 8138 * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three 8139 * arguments: (value, index|key, collection). 8140 * 8141 * If a property name is provided for `iteratee` the created `_.property` 8142 * style callback returns the property value of the given element. 8143 * 8144 * If a value is also provided for `thisArg` the created `_.matchesProperty` 8145 * style callback returns `true` for elements that have a matching property 8146 * value, else `false`. 8147 * 8148 * If an object is provided for `iteratee` the created `_.matches` style 8149 * callback returns `true` for elements that have the properties of the given 8150 * object, else `false`. 8151 * 8152 * Many lodash methods are guarded to work as interatees for methods like 8153 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. 8154 * 8155 * The guarded methods are: 8156 * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`, 8157 * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`, 8158 * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`, 8159 * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words` 8160 * 8161 * @static 8162 * @memberOf _ 8163 * @alias collect 8164 * @category Collection 8165 * @param {Array|Object|string} collection The collection to iterate over. 8166 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 8167 * per iteration. 8168 * @param {*} [thisArg] The `this` binding of `iteratee`. 8169 * @returns {Array} Returns the new mapped array. 8170 * @example 8171 * 8172 * function timesThree(n) { 8173 * return n * 3; 8174 * } 8175 * 8176 * _.map([1, 2], timesThree); 8177 * // => [3, 6] 8178 * 8179 * _.map({ 'a': 1, 'b': 2 }, timesThree); 8180 * // => [3, 6] (iteration order is not guaranteed) 8181 * 8182 * var users = [ 8183 * { 'user': 'barney' }, 8184 * { 'user': 'fred' } 8185 * ]; 8186 * 8187 * // using the `_.property` callback shorthand 8188 * _.map(users, 'user'); 8189 * // => ['barney', 'fred'] 8190 */ 8191 function map(collection, iteratee, thisArg) { 8192 var func = isArray(collection) ? arrayMap : baseMap; 8193 iteratee = getCallback(iteratee, thisArg, 3); 8194 return func(collection, iteratee); 8195 } 8196 8197 /** 8198 * Creates an array of elements split into two groups, the first of which 8199 * contains elements `predicate` returns truthy for, while the second of which 8200 * contains elements `predicate` returns falsey for. The predicate is bound 8201 * to `thisArg` and invoked with three arguments: (value, index|key, collection). 8202 * 8203 * If a property name is provided for `predicate` the created `_.property` 8204 * style callback returns the property value of the given element. 8205 * 8206 * If a value is also provided for `thisArg` the created `_.matchesProperty` 8207 * style callback returns `true` for elements that have a matching property 8208 * value, else `false`. 8209 * 8210 * If an object is provided for `predicate` the created `_.matches` style 8211 * callback returns `true` for elements that have the properties of the given 8212 * object, else `false`. 8213 * 8214 * @static 8215 * @memberOf _ 8216 * @category Collection 8217 * @param {Array|Object|string} collection The collection to iterate over. 8218 * @param {Function|Object|string} [predicate=_.identity] The function invoked 8219 * per iteration. 8220 * @param {*} [thisArg] The `this` binding of `predicate`. 8221 * @returns {Array} Returns the array of grouped elements. 8222 * @example 8223 * 8224 * _.partition([1, 2, 3], function(n) { 8225 * return n % 2; 8226 * }); 8227 * // => [[1, 3], [2]] 8228 * 8229 * _.partition([1.2, 2.3, 3.4], function(n) { 8230 * return this.floor(n) % 2; 8231 * }, Math); 8232 * // => [[1.2, 3.4], [2.3]] 8233 * 8234 * var users = [ 8235 * { 'user': 'barney', 'age': 36, 'active': false }, 8236 * { 'user': 'fred', 'age': 40, 'active': true }, 8237 * { 'user': 'pebbles', 'age': 1, 'active': false } 8238 * ]; 8239 * 8240 * var mapper = function(array) { 8241 * return _.pluck(array, 'user'); 8242 * }; 8243 * 8244 * // using the `_.matches` callback shorthand 8245 * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper); 8246 * // => [['pebbles'], ['barney', 'fred']] 8247 * 8248 * // using the `_.matchesProperty` callback shorthand 8249 * _.map(_.partition(users, 'active', false), mapper); 8250 * // => [['barney', 'pebbles'], ['fred']] 8251 * 8252 * // using the `_.property` callback shorthand 8253 * _.map(_.partition(users, 'active'), mapper); 8254 * // => [['fred'], ['barney', 'pebbles']] 8255 */ 8256 var partition = createAggregator(function(result, value, key) { 8257 result[key ? 0 : 1].push(value); 8258 }, function() { return [[], []]; }); 8259 8260 /** 8261 * Gets the property value of `path` from all elements in `collection`. 8262 * 8263 * @static 8264 * @memberOf _ 8265 * @category Collection 8266 * @param {Array|Object|string} collection The collection to iterate over. 8267 * @param {Array|string} path The path of the property to pluck. 8268 * @returns {Array} Returns the property values. 8269 * @example 8270 * 8271 * var users = [ 8272 * { 'user': 'barney', 'age': 36 }, 8273 * { 'user': 'fred', 'age': 40 } 8274 * ]; 8275 * 8276 * _.pluck(users, 'user'); 8277 * // => ['barney', 'fred'] 8278 * 8279 * var userIndex = _.indexBy(users, 'user'); 8280 * _.pluck(userIndex, 'age'); 8281 * // => [36, 40] (iteration order is not guaranteed) 8282 */ 8283 function pluck(collection, path) { 8284 return map(collection, property(path)); 8285 } 8286 8287 /** 8288 * Reduces `collection` to a value which is the accumulated result of running 8289 * each element in `collection` through `iteratee`, where each successive 8290 * invocation is supplied the return value of the previous. If `accumulator` 8291 * is not provided the first element of `collection` is used as the initial 8292 * value. The `iteratee` is bound to `thisArg` and invoked with four arguments: 8293 * (accumulator, value, index|key, collection). 8294 * 8295 * Many lodash methods are guarded to work as interatees for methods like 8296 * `_.reduce`, `_.reduceRight`, and `_.transform`. 8297 * 8298 * The guarded methods are: 8299 * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder` 8300 * 8301 * @static 8302 * @memberOf _ 8303 * @alias foldl, inject 8304 * @category Collection 8305 * @param {Array|Object|string} collection The collection to iterate over. 8306 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 8307 * @param {*} [accumulator] The initial value. 8308 * @param {*} [thisArg] The `this` binding of `iteratee`. 8309 * @returns {*} Returns the accumulated value. 8310 * @example 8311 * 8312 * _.reduce([1, 2], function(total, n) { 8313 * return total + n; 8314 * }); 8315 * // => 3 8316 * 8317 * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) { 8318 * result[key] = n * 3; 8319 * return result; 8320 * }, {}); 8321 * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed) 8322 */ 8323 var reduce = createReduce(arrayReduce, baseEach); 8324 8325 /** 8326 * This method is like `_.reduce` except that it iterates over elements of 8327 * `collection` from right to left. 8328 * 8329 * @static 8330 * @memberOf _ 8331 * @alias foldr 8332 * @category Collection 8333 * @param {Array|Object|string} collection The collection to iterate over. 8334 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 8335 * @param {*} [accumulator] The initial value. 8336 * @param {*} [thisArg] The `this` binding of `iteratee`. 8337 * @returns {*} Returns the accumulated value. 8338 * @example 8339 * 8340 * var array = [[0, 1], [2, 3], [4, 5]]; 8341 * 8342 * _.reduceRight(array, function(flattened, other) { 8343 * return flattened.concat(other); 8344 * }, []); 8345 * // => [4, 5, 2, 3, 0, 1] 8346 */ 8347 var reduceRight = createReduce(arrayReduceRight, baseEachRight); 8348 8349 /** 8350 * The opposite of `_.filter`; this method returns the elements of `collection` 8351 * that `predicate` does **not** return truthy for. 8352 * 8353 * If a property name is provided for `predicate` the created `_.property` 8354 * style callback returns the property value of the given element. 8355 * 8356 * If a value is also provided for `thisArg` the created `_.matchesProperty` 8357 * style callback returns `true` for elements that have a matching property 8358 * value, else `false`. 8359 * 8360 * If an object is provided for `predicate` the created `_.matches` style 8361 * callback returns `true` for elements that have the properties of the given 8362 * object, else `false`. 8363 * 8364 * @static 8365 * @memberOf _ 8366 * @category Collection 8367 * @param {Array|Object|string} collection The collection to iterate over. 8368 * @param {Function|Object|string} [predicate=_.identity] The function invoked 8369 * per iteration. 8370 * @param {*} [thisArg] The `this` binding of `predicate`. 8371 * @returns {Array} Returns the new filtered array. 8372 * @example 8373 * 8374 * _.reject([1, 2, 3, 4], function(n) { 8375 * return n % 2 == 0; 8376 * }); 8377 * // => [1, 3] 8378 * 8379 * var users = [ 8380 * { 'user': 'barney', 'age': 36, 'active': false }, 8381 * { 'user': 'fred', 'age': 40, 'active': true } 8382 * ]; 8383 * 8384 * // using the `_.matches` callback shorthand 8385 * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user'); 8386 * // => ['barney'] 8387 * 8388 * // using the `_.matchesProperty` callback shorthand 8389 * _.pluck(_.reject(users, 'active', false), 'user'); 8390 * // => ['fred'] 8391 * 8392 * // using the `_.property` callback shorthand 8393 * _.pluck(_.reject(users, 'active'), 'user'); 8394 * // => ['barney'] 8395 */ 8396 function reject(collection, predicate, thisArg) { 8397 var func = isArray(collection) ? arrayFilter : baseFilter; 8398 predicate = getCallback(predicate, thisArg, 3); 8399 return func(collection, function(value, index, collection) { 8400 return !predicate(value, index, collection); 8401 }); 8402 } 8403 8404 /** 8405 * Gets a random element or `n` random elements from a collection. 8406 * 8407 * @static 8408 * @memberOf _ 8409 * @category Collection 8410 * @param {Array|Object|string} collection The collection to sample. 8411 * @param {number} [n] The number of elements to sample. 8412 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 8413 * @returns {*} Returns the random sample(s). 8414 * @example 8415 * 8416 * _.sample([1, 2, 3, 4]); 8417 * // => 2 8418 * 8419 * _.sample([1, 2, 3, 4], 2); 8420 * // => [3, 1] 8421 */ 8422 function sample(collection, n, guard) { 8423 if (guard ? isIterateeCall(collection, n, guard) : n == null) { 8424 collection = toIterable(collection); 8425 var length = collection.length; 8426 return length > 0 ? collection[baseRandom(0, length - 1)] : undefined; 8427 } 8428 var result = shuffle(collection); 8429 result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length); 8430 return result; 8431 } 8432 8433 /** 8434 * Creates an array of shuffled values, using a version of the 8435 * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). 8436 * 8437 * @static 8438 * @memberOf _ 8439 * @category Collection 8440 * @param {Array|Object|string} collection The collection to shuffle. 8441 * @returns {Array} Returns the new shuffled array. 8442 * @example 8443 * 8444 * _.shuffle([1, 2, 3, 4]); 8445 * // => [4, 1, 3, 2] 8446 */ 8447 function shuffle(collection) { 8448 collection = toIterable(collection); 8449 8450 var index = -1, 8451 length = collection.length, 8452 result = Array(length); 8453 8454 while (++index < length) { 8455 var rand = baseRandom(0, index); 8456 if (index != rand) { 8457 result[index] = result[rand]; 8458 } 8459 result[rand] = collection[index]; 8460 } 8461 return result; 8462 } 8463 8464 /** 8465 * Gets the size of `collection` by returning its length for array-like 8466 * values or the number of own enumerable properties for objects. 8467 * 8468 * @static 8469 * @memberOf _ 8470 * @category Collection 8471 * @param {Array|Object|string} collection The collection to inspect. 8472 * @returns {number} Returns the size of `collection`. 8473 * @example 8474 * 8475 * _.size([1, 2, 3]); 8476 * // => 3 8477 * 8478 * _.size({ 'a': 1, 'b': 2 }); 8479 * // => 2 8480 * 8481 * _.size('pebbles'); 8482 * // => 7 8483 */ 8484 function size(collection) { 8485 var length = collection ? getLength(collection) : 0; 8486 return isLength(length) ? length : keys(collection).length; 8487 } 8488 8489 /** 8490 * Checks if `predicate` returns truthy for **any** element of `collection`. 8491 * The function returns as soon as it finds a passing value and does not iterate 8492 * over the entire collection. The predicate is bound to `thisArg` and invoked 8493 * with three arguments: (value, index|key, collection). 8494 * 8495 * If a property name is provided for `predicate` the created `_.property` 8496 * style callback returns the property value of the given element. 8497 * 8498 * If a value is also provided for `thisArg` the created `_.matchesProperty` 8499 * style callback returns `true` for elements that have a matching property 8500 * value, else `false`. 8501 * 8502 * If an object is provided for `predicate` the created `_.matches` style 8503 * callback returns `true` for elements that have the properties of the given 8504 * object, else `false`. 8505 * 8506 * @static 8507 * @memberOf _ 8508 * @alias any 8509 * @category Collection 8510 * @param {Array|Object|string} collection The collection to iterate over. 8511 * @param {Function|Object|string} [predicate=_.identity] The function invoked 8512 * per iteration. 8513 * @param {*} [thisArg] The `this` binding of `predicate`. 8514 * @returns {boolean} Returns `true` if any element passes the predicate check, 8515 * else `false`. 8516 * @example 8517 * 8518 * _.some([null, 0, 'yes', false], Boolean); 8519 * // => true 8520 * 8521 * var users = [ 8522 * { 'user': 'barney', 'active': true }, 8523 * { 'user': 'fred', 'active': false } 8524 * ]; 8525 * 8526 * // using the `_.matches` callback shorthand 8527 * _.some(users, { 'user': 'barney', 'active': false }); 8528 * // => false 8529 * 8530 * // using the `_.matchesProperty` callback shorthand 8531 * _.some(users, 'active', false); 8532 * // => true 8533 * 8534 * // using the `_.property` callback shorthand 8535 * _.some(users, 'active'); 8536 * // => true 8537 */ 8538 function some(collection, predicate, thisArg) { 8539 var func = isArray(collection) ? arraySome : baseSome; 8540 if (thisArg && isIterateeCall(collection, predicate, thisArg)) { 8541 predicate = null; 8542 } 8543 if (typeof predicate != 'function' || thisArg !== undefined) { 8544 predicate = getCallback(predicate, thisArg, 3); 8545 } 8546 return func(collection, predicate); 8547 } 8548 8549 /** 8550 * Creates an array of elements, sorted in ascending order by the results of 8551 * running each element in a collection through `iteratee`. This method performs 8552 * a stable sort, that is, it preserves the original sort order of equal elements. 8553 * The `iteratee` is bound to `thisArg` and invoked with three arguments: 8554 * (value, index|key, collection). 8555 * 8556 * If a property name is provided for `iteratee` the created `_.property` 8557 * style callback returns the property value of the given element. 8558 * 8559 * If a value is also provided for `thisArg` the created `_.matchesProperty` 8560 * style callback returns `true` for elements that have a matching property 8561 * value, else `false`. 8562 * 8563 * If an object is provided for `iteratee` the created `_.matches` style 8564 * callback returns `true` for elements that have the properties of the given 8565 * object, else `false`. 8566 * 8567 * @static 8568 * @memberOf _ 8569 * @category Collection 8570 * @param {Array|Object|string} collection The collection to iterate over. 8571 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 8572 * per iteration. 8573 * @param {*} [thisArg] The `this` binding of `iteratee`. 8574 * @returns {Array} Returns the new sorted array. 8575 * @example 8576 * 8577 * _.sortBy([1, 2, 3], function(n) { 8578 * return Math.sin(n); 8579 * }); 8580 * // => [3, 1, 2] 8581 * 8582 * _.sortBy([1, 2, 3], function(n) { 8583 * return this.sin(n); 8584 * }, Math); 8585 * // => [3, 1, 2] 8586 * 8587 * var users = [ 8588 * { 'user': 'fred' }, 8589 * { 'user': 'pebbles' }, 8590 * { 'user': 'barney' } 8591 * ]; 8592 * 8593 * // using the `_.property` callback shorthand 8594 * _.pluck(_.sortBy(users, 'user'), 'user'); 8595 * // => ['barney', 'fred', 'pebbles'] 8596 */ 8597 function sortBy(collection, iteratee, thisArg) { 8598 if (collection == null) { 8599 return []; 8600 } 8601 if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { 8602 iteratee = null; 8603 } 8604 var index = -1; 8605 iteratee = getCallback(iteratee, thisArg, 3); 8606 8607 var result = baseMap(collection, function(value, key, collection) { 8608 return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value }; 8609 }); 8610 return baseSortBy(result, compareAscending); 8611 } 8612 8613 /** 8614 * This method is like `_.sortBy` except that it can sort by multiple iteratees 8615 * or property names. 8616 * 8617 * If a property name is provided for an iteratee the created `_.property` 8618 * style callback returns the property value of the given element. 8619 * 8620 * If an object is provided for an iteratee the created `_.matches` style 8621 * callback returns `true` for elements that have the properties of the given 8622 * object, else `false`. 8623 * 8624 * @static 8625 * @memberOf _ 8626 * @category Collection 8627 * @param {Array|Object|string} collection The collection to iterate over. 8628 * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees 8629 * The iteratees to sort by, specified as individual values or arrays of values. 8630 * @returns {Array} Returns the new sorted array. 8631 * @example 8632 * 8633 * var users = [ 8634 * { 'user': 'fred', 'age': 48 }, 8635 * { 'user': 'barney', 'age': 36 }, 8636 * { 'user': 'fred', 'age': 42 }, 8637 * { 'user': 'barney', 'age': 34 } 8638 * ]; 8639 * 8640 * _.map(_.sortByAll(users, ['user', 'age']), _.values); 8641 * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]] 8642 * 8643 * _.map(_.sortByAll(users, 'user', function(chr) { 8644 * return Math.floor(chr.age / 10); 8645 * }), _.values); 8646 * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] 8647 */ 8648 var sortByAll = restParam(function(collection, iteratees) { 8649 if (collection == null) { 8650 return []; 8651 } 8652 var guard = iteratees[2]; 8653 if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) { 8654 iteratees.length = 1; 8655 } 8656 return baseSortByOrder(collection, baseFlatten(iteratees), []); 8657 }); 8658 8659 /** 8660 * This method is like `_.sortByAll` except that it allows specifying the 8661 * sort orders of the iteratees to sort by. A truthy value in `orders` will 8662 * sort the corresponding property name in ascending order while a falsey 8663 * value will sort it in descending order. 8664 * 8665 * If a property name is provided for an iteratee the created `_.property` 8666 * style callback returns the property value of the given element. 8667 * 8668 * If an object is provided for an iteratee the created `_.matches` style 8669 * callback returns `true` for elements that have the properties of the given 8670 * object, else `false`. 8671 * 8672 * @static 8673 * @memberOf _ 8674 * @category Collection 8675 * @param {Array|Object|string} collection The collection to iterate over. 8676 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. 8677 * @param {boolean[]} orders The sort orders of `iteratees`. 8678 * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. 8679 * @returns {Array} Returns the new sorted array. 8680 * @example 8681 * 8682 * var users = [ 8683 * { 'user': 'fred', 'age': 48 }, 8684 * { 'user': 'barney', 'age': 34 }, 8685 * { 'user': 'fred', 'age': 42 }, 8686 * { 'user': 'barney', 'age': 36 } 8687 * ]; 8688 * 8689 * // sort by `user` in ascending order and by `age` in descending order 8690 * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values); 8691 * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] 8692 */ 8693 function sortByOrder(collection, iteratees, orders, guard) { 8694 if (collection == null) { 8695 return []; 8696 } 8697 if (guard && isIterateeCall(iteratees, orders, guard)) { 8698 orders = null; 8699 } 8700 if (!isArray(iteratees)) { 8701 iteratees = iteratees == null ? [] : [iteratees]; 8702 } 8703 if (!isArray(orders)) { 8704 orders = orders == null ? [] : [orders]; 8705 } 8706 return baseSortByOrder(collection, iteratees, orders); 8707 } 8708 8709 /** 8710 * Performs a deep comparison between each element in `collection` and the 8711 * source object, returning an array of all elements that have equivalent 8712 * property values. 8713 * 8714 * **Note:** This method supports comparing arrays, booleans, `Date` objects, 8715 * numbers, `Object` objects, regexes, and strings. Objects are compared by 8716 * their own, not inherited, enumerable properties. For comparing a single 8717 * own or inherited property value see `_.matchesProperty`. 8718 * 8719 * @static 8720 * @memberOf _ 8721 * @category Collection 8722 * @param {Array|Object|string} collection The collection to search. 8723 * @param {Object} source The object of property values to match. 8724 * @returns {Array} Returns the new filtered array. 8725 * @example 8726 * 8727 * var users = [ 8728 * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] }, 8729 * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] } 8730 * ]; 8731 * 8732 * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user'); 8733 * // => ['barney'] 8734 * 8735 * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user'); 8736 * // => ['fred'] 8737 */ 8738 function where(collection, source) { 8739 return filter(collection, baseMatches(source)); 8740 } 8741 8742 /*------------------------------------------------------------------------*/ 8743 8744 /** 8745 * Gets the number of milliseconds that have elapsed since the Unix epoch 8746 * (1 January 1970 00:00:00 UTC). 8747 * 8748 * @static 8749 * @memberOf _ 8750 * @category Date 8751 * @example 8752 * 8753 * _.defer(function(stamp) { 8754 * console.log(_.now() - stamp); 8755 * }, _.now()); 8756 * // => logs the number of milliseconds it took for the deferred function to be invoked 8757 */ 8758 var now = nativeNow || function() { 8759 return new Date().getTime(); 8760 }; 8761 8762 /*------------------------------------------------------------------------*/ 8763 8764 /** 8765 * The opposite of `_.before`; this method creates a function that invokes 8766 * `func` once it is called `n` or more times. 8767 * 8768 * @static 8769 * @memberOf _ 8770 * @category Function 8771 * @param {number} n The number of calls before `func` is invoked. 8772 * @param {Function} func The function to restrict. 8773 * @returns {Function} Returns the new restricted function. 8774 * @example 8775 * 8776 * var saves = ['profile', 'settings']; 8777 * 8778 * var done = _.after(saves.length, function() { 8779 * console.log('done saving!'); 8780 * }); 8781 * 8782 * _.forEach(saves, function(type) { 8783 * asyncSave({ 'type': type, 'complete': done }); 8784 * }); 8785 * // => logs 'done saving!' after the two async saves have completed 8786 */ 8787 function after(n, func) { 8788 if (typeof func != 'function') { 8789 if (typeof n == 'function') { 8790 var temp = n; 8791 n = func; 8792 func = temp; 8793 } else { 8794 throw new TypeError(FUNC_ERROR_TEXT); 8795 } 8796 } 8797 n = nativeIsFinite(n = +n) ? n : 0; 8798 return function() { 8799 if (--n < 1) { 8800 return func.apply(this, arguments); 8801 } 8802 }; 8803 } 8804 8805 /** 8806 * Creates a function that accepts up to `n` arguments ignoring any 8807 * additional arguments. 8808 * 8809 * @static 8810 * @memberOf _ 8811 * @category Function 8812 * @param {Function} func The function to cap arguments for. 8813 * @param {number} [n=func.length] The arity cap. 8814 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 8815 * @returns {Function} Returns the new function. 8816 * @example 8817 * 8818 * _.map(['6', '8', '10'], _.ary(parseInt, 1)); 8819 * // => [6, 8, 10] 8820 */ 8821 function ary(func, n, guard) { 8822 if (guard && isIterateeCall(func, n, guard)) { 8823 n = null; 8824 } 8825 n = (func && n == null) ? func.length : nativeMax(+n || 0, 0); 8826 return createWrapper(func, ARY_FLAG, null, null, null, null, n); 8827 } 8828 8829 /** 8830 * Creates a function that invokes `func`, with the `this` binding and arguments 8831 * of the created function, while it is called less than `n` times. Subsequent 8832 * calls to the created function return the result of the last `func` invocation. 8833 * 8834 * @static 8835 * @memberOf _ 8836 * @category Function 8837 * @param {number} n The number of calls at which `func` is no longer invoked. 8838 * @param {Function} func The function to restrict. 8839 * @returns {Function} Returns the new restricted function. 8840 * @example 8841 * 8842 * jQuery('#add').on('click', _.before(5, addContactToList)); 8843 * // => allows adding up to 4 contacts to the list 8844 */ 8845 function before(n, func) { 8846 var result; 8847 if (typeof func != 'function') { 8848 if (typeof n == 'function') { 8849 var temp = n; 8850 n = func; 8851 func = temp; 8852 } else { 8853 throw new TypeError(FUNC_ERROR_TEXT); 8854 } 8855 } 8856 return function() { 8857 if (--n > 0) { 8858 result = func.apply(this, arguments); 8859 } 8860 if (n <= 1) { 8861 func = null; 8862 } 8863 return result; 8864 }; 8865 } 8866 8867 /** 8868 * Creates a function that invokes `func` with the `this` binding of `thisArg` 8869 * and prepends any additional `_.bind` arguments to those provided to the 8870 * bound function. 8871 * 8872 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, 8873 * may be used as a placeholder for partially applied arguments. 8874 * 8875 * **Note:** Unlike native `Function#bind` this method does not set the "length" 8876 * property of bound functions. 8877 * 8878 * @static 8879 * @memberOf _ 8880 * @category Function 8881 * @param {Function} func The function to bind. 8882 * @param {*} thisArg The `this` binding of `func`. 8883 * @param {...*} [partials] The arguments to be partially applied. 8884 * @returns {Function} Returns the new bound function. 8885 * @example 8886 * 8887 * var greet = function(greeting, punctuation) { 8888 * return greeting + ' ' + this.user + punctuation; 8889 * }; 8890 * 8891 * var object = { 'user': 'fred' }; 8892 * 8893 * var bound = _.bind(greet, object, 'hi'); 8894 * bound('!'); 8895 * // => 'hi fred!' 8896 * 8897 * // using placeholders 8898 * var bound = _.bind(greet, object, _, '!'); 8899 * bound('hi'); 8900 * // => 'hi fred!' 8901 */ 8902 var bind = restParam(function(func, thisArg, partials) { 8903 var bitmask = BIND_FLAG; 8904 if (partials.length) { 8905 var holders = replaceHolders(partials, bind.placeholder); 8906 bitmask |= PARTIAL_FLAG; 8907 } 8908 return createWrapper(func, bitmask, thisArg, partials, holders); 8909 }); 8910 8911 /** 8912 * Binds methods of an object to the object itself, overwriting the existing 8913 * method. Method names may be specified as individual arguments or as arrays 8914 * of method names. If no method names are provided all enumerable function 8915 * properties, own and inherited, of `object` are bound. 8916 * 8917 * **Note:** This method does not set the "length" property of bound functions. 8918 * 8919 * @static 8920 * @memberOf _ 8921 * @category Function 8922 * @param {Object} object The object to bind and assign the bound methods to. 8923 * @param {...(string|string[])} [methodNames] The object method names to bind, 8924 * specified as individual method names or arrays of method names. 8925 * @returns {Object} Returns `object`. 8926 * @example 8927 * 8928 * var view = { 8929 * 'label': 'docs', 8930 * 'onClick': function() { 8931 * console.log('clicked ' + this.label); 8932 * } 8933 * }; 8934 * 8935 * _.bindAll(view); 8936 * jQuery('#docs').on('click', view.onClick); 8937 * // => logs 'clicked docs' when the element is clicked 8938 */ 8939 var bindAll = restParam(function(object, methodNames) { 8940 methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object); 8941 8942 var index = -1, 8943 length = methodNames.length; 8944 8945 while (++index < length) { 8946 var key = methodNames[index]; 8947 object[key] = createWrapper(object[key], BIND_FLAG, object); 8948 } 8949 return object; 8950 }); 8951 8952 /** 8953 * Creates a function that invokes the method at `object[key]` and prepends 8954 * any additional `_.bindKey` arguments to those provided to the bound function. 8955 * 8956 * This method differs from `_.bind` by allowing bound functions to reference 8957 * methods that may be redefined or don't yet exist. 8958 * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) 8959 * for more details. 8960 * 8961 * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic 8962 * builds, may be used as a placeholder for partially applied arguments. 8963 * 8964 * @static 8965 * @memberOf _ 8966 * @category Function 8967 * @param {Object} object The object the method belongs to. 8968 * @param {string} key The key of the method. 8969 * @param {...*} [partials] The arguments to be partially applied. 8970 * @returns {Function} Returns the new bound function. 8971 * @example 8972 * 8973 * var object = { 8974 * 'user': 'fred', 8975 * 'greet': function(greeting, punctuation) { 8976 * return greeting + ' ' + this.user + punctuation; 8977 * } 8978 * }; 8979 * 8980 * var bound = _.bindKey(object, 'greet', 'hi'); 8981 * bound('!'); 8982 * // => 'hi fred!' 8983 * 8984 * object.greet = function(greeting, punctuation) { 8985 * return greeting + 'ya ' + this.user + punctuation; 8986 * }; 8987 * 8988 * bound('!'); 8989 * // => 'hiya fred!' 8990 * 8991 * // using placeholders 8992 * var bound = _.bindKey(object, 'greet', _, '!'); 8993 * bound('hi'); 8994 * // => 'hiya fred!' 8995 */ 8996 var bindKey = restParam(function(object, key, partials) { 8997 var bitmask = BIND_FLAG | BIND_KEY_FLAG; 8998 if (partials.length) { 8999 var holders = replaceHolders(partials, bindKey.placeholder); 9000 bitmask |= PARTIAL_FLAG; 9001 } 9002 return createWrapper(key, bitmask, object, partials, holders); 9003 }); 9004 9005 /** 9006 * Creates a function that accepts one or more arguments of `func` that when 9007 * called either invokes `func` returning its result, if all `func` arguments 9008 * have been provided, or returns a function that accepts one or more of the 9009 * remaining `func` arguments, and so on. The arity of `func` may be specified 9010 * if `func.length` is not sufficient. 9011 * 9012 * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, 9013 * may be used as a placeholder for provided arguments. 9014 * 9015 * **Note:** This method does not set the "length" property of curried functions. 9016 * 9017 * @static 9018 * @memberOf _ 9019 * @category Function 9020 * @param {Function} func The function to curry. 9021 * @param {number} [arity=func.length] The arity of `func`. 9022 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 9023 * @returns {Function} Returns the new curried function. 9024 * @example 9025 * 9026 * var abc = function(a, b, c) { 9027 * return [a, b, c]; 9028 * }; 9029 * 9030 * var curried = _.curry(abc); 9031 * 9032 * curried(1)(2)(3); 9033 * // => [1, 2, 3] 9034 * 9035 * curried(1, 2)(3); 9036 * // => [1, 2, 3] 9037 * 9038 * curried(1, 2, 3); 9039 * // => [1, 2, 3] 9040 * 9041 * // using placeholders 9042 * curried(1)(_, 3)(2); 9043 * // => [1, 2, 3] 9044 */ 9045 var curry = createCurry(CURRY_FLAG); 9046 9047 /** 9048 * This method is like `_.curry` except that arguments are applied to `func` 9049 * in the manner of `_.partialRight` instead of `_.partial`. 9050 * 9051 * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic 9052 * builds, may be used as a placeholder for provided arguments. 9053 * 9054 * **Note:** This method does not set the "length" property of curried functions. 9055 * 9056 * @static 9057 * @memberOf _ 9058 * @category Function 9059 * @param {Function} func The function to curry. 9060 * @param {number} [arity=func.length] The arity of `func`. 9061 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 9062 * @returns {Function} Returns the new curried function. 9063 * @example 9064 * 9065 * var abc = function(a, b, c) { 9066 * return [a, b, c]; 9067 * }; 9068 * 9069 * var curried = _.curryRight(abc); 9070 * 9071 * curried(3)(2)(1); 9072 * // => [1, 2, 3] 9073 * 9074 * curried(2, 3)(1); 9075 * // => [1, 2, 3] 9076 * 9077 * curried(1, 2, 3); 9078 * // => [1, 2, 3] 9079 * 9080 * // using placeholders 9081 * curried(3)(1, _)(2); 9082 * // => [1, 2, 3] 9083 */ 9084 var curryRight = createCurry(CURRY_RIGHT_FLAG); 9085 9086 /** 9087 * Creates a function that delays invoking `func` until after `wait` milliseconds 9088 * have elapsed since the last time it was invoked. The created function comes 9089 * with a `cancel` method to cancel delayed invocations. Provide an options 9090 * object to indicate that `func` should be invoked on the leading and/or 9091 * trailing edge of the `wait` timeout. Subsequent calls to the debounced 9092 * function return the result of the last `func` invocation. 9093 * 9094 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked 9095 * on the trailing edge of the timeout only if the the debounced function is 9096 * invoked more than once during the `wait` timeout. 9097 * 9098 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) 9099 * for details over the differences between `_.debounce` and `_.throttle`. 9100 * 9101 * @static 9102 * @memberOf _ 9103 * @category Function 9104 * @param {Function} func The function to debounce. 9105 * @param {number} [wait=0] The number of milliseconds to delay. 9106 * @param {Object} [options] The options object. 9107 * @param {boolean} [options.leading=false] Specify invoking on the leading 9108 * edge of the timeout. 9109 * @param {number} [options.maxWait] The maximum time `func` is allowed to be 9110 * delayed before it is invoked. 9111 * @param {boolean} [options.trailing=true] Specify invoking on the trailing 9112 * edge of the timeout. 9113 * @returns {Function} Returns the new debounced function. 9114 * @example 9115 * 9116 * // avoid costly calculations while the window size is in flux 9117 * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); 9118 * 9119 * // invoke `sendMail` when the click event is fired, debouncing subsequent calls 9120 * jQuery('#postbox').on('click', _.debounce(sendMail, 300, { 9121 * 'leading': true, 9122 * 'trailing': false 9123 * })); 9124 * 9125 * // ensure `batchLog` is invoked once after 1 second of debounced calls 9126 * var source = new EventSource('/stream'); 9127 * jQuery(source).on('message', _.debounce(batchLog, 250, { 9128 * 'maxWait': 1000 9129 * })); 9130 * 9131 * // cancel a debounced call 9132 * var todoChanges = _.debounce(batchLog, 1000); 9133 * Object.observe(models.todo, todoChanges); 9134 * 9135 * Object.observe(models, function(changes) { 9136 * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) { 9137 * todoChanges.cancel(); 9138 * } 9139 * }, ['delete']); 9140 * 9141 * // ...at some point `models.todo` is changed 9142 * models.todo.completed = true; 9143 * 9144 * // ...before 1 second has passed `models.todo` is deleted 9145 * // which cancels the debounced `todoChanges` call 9146 * delete models.todo; 9147 */ 9148 function debounce(func, wait, options) { 9149 var args, 9150 maxTimeoutId, 9151 result, 9152 stamp, 9153 thisArg, 9154 timeoutId, 9155 trailingCall, 9156 lastCalled = 0, 9157 maxWait = false, 9158 trailing = true; 9159 9160 if (typeof func != 'function') { 9161 throw new TypeError(FUNC_ERROR_TEXT); 9162 } 9163 wait = wait < 0 ? 0 : (+wait || 0); 9164 if (options === true) { 9165 var leading = true; 9166 trailing = false; 9167 } else if (isObject(options)) { 9168 leading = options.leading; 9169 maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait); 9170 trailing = 'trailing' in options ? options.trailing : trailing; 9171 } 9172 9173 function cancel() { 9174 if (timeoutId) { 9175 clearTimeout(timeoutId); 9176 } 9177 if (maxTimeoutId) { 9178 clearTimeout(maxTimeoutId); 9179 } 9180 maxTimeoutId = timeoutId = trailingCall = undefined; 9181 } 9182 9183 function delayed() { 9184 var remaining = wait - (now() - stamp); 9185 if (remaining <= 0 || remaining > wait) { 9186 if (maxTimeoutId) { 9187 clearTimeout(maxTimeoutId); 9188 } 9189 var isCalled = trailingCall; 9190 maxTimeoutId = timeoutId = trailingCall = undefined; 9191 if (isCalled) { 9192 lastCalled = now(); 9193 result = func.apply(thisArg, args); 9194 if (!timeoutId && !maxTimeoutId) { 9195 args = thisArg = null; 9196 } 9197 } 9198 } else { 9199 timeoutId = setTimeout(delayed, remaining); 9200 } 9201 } 9202 9203 function maxDelayed() { 9204 if (timeoutId) { 9205 clearTimeout(timeoutId); 9206 } 9207 maxTimeoutId = timeoutId = trailingCall = undefined; 9208 if (trailing || (maxWait !== wait)) { 9209 lastCalled = now(); 9210 result = func.apply(thisArg, args); 9211 if (!timeoutId && !maxTimeoutId) { 9212 args = thisArg = null; 9213 } 9214 } 9215 } 9216 9217 function debounced() { 9218 args = arguments; 9219 stamp = now(); 9220 thisArg = this; 9221 trailingCall = trailing && (timeoutId || !leading); 9222 9223 if (maxWait === false) { 9224 var leadingCall = leading && !timeoutId; 9225 } else { 9226 if (!maxTimeoutId && !leading) { 9227 lastCalled = stamp; 9228 } 9229 var remaining = maxWait - (stamp - lastCalled), 9230 isCalled = remaining <= 0 || remaining > maxWait; 9231 9232 if (isCalled) { 9233 if (maxTimeoutId) { 9234 maxTimeoutId = clearTimeout(maxTimeoutId); 9235 } 9236 lastCalled = stamp; 9237 result = func.apply(thisArg, args); 9238 } 9239 else if (!maxTimeoutId) { 9240 maxTimeoutId = setTimeout(maxDelayed, remaining); 9241 } 9242 } 9243 if (isCalled && timeoutId) { 9244 timeoutId = clearTimeout(timeoutId); 9245 } 9246 else if (!timeoutId && wait !== maxWait) { 9247 timeoutId = setTimeout(delayed, wait); 9248 } 9249 if (leadingCall) { 9250 isCalled = true; 9251 result = func.apply(thisArg, args); 9252 } 9253 if (isCalled && !timeoutId && !maxTimeoutId) { 9254 args = thisArg = null; 9255 } 9256 return result; 9257 } 9258 debounced.cancel = cancel; 9259 return debounced; 9260 } 9261 9262 /** 9263 * Defers invoking the `func` until the current call stack has cleared. Any 9264 * additional arguments are provided to `func` when it is invoked. 9265 * 9266 * @static 9267 * @memberOf _ 9268 * @category Function 9269 * @param {Function} func The function to defer. 9270 * @param {...*} [args] The arguments to invoke the function with. 9271 * @returns {number} Returns the timer id. 9272 * @example 9273 * 9274 * _.defer(function(text) { 9275 * console.log(text); 9276 * }, 'deferred'); 9277 * // logs 'deferred' after one or more milliseconds 9278 */ 9279 var defer = restParam(function(func, args) { 9280 return baseDelay(func, 1, args); 9281 }); 9282 9283 /** 9284 * Invokes `func` after `wait` milliseconds. Any additional arguments are 9285 * provided to `func` when it is invoked. 9286 * 9287 * @static 9288 * @memberOf _ 9289 * @category Function 9290 * @param {Function} func The function to delay. 9291 * @param {number} wait The number of milliseconds to delay invocation. 9292 * @param {...*} [args] The arguments to invoke the function with. 9293 * @returns {number} Returns the timer id. 9294 * @example 9295 * 9296 * _.delay(function(text) { 9297 * console.log(text); 9298 * }, 1000, 'later'); 9299 * // => logs 'later' after one second 9300 */ 9301 var delay = restParam(function(func, wait, args) { 9302 return baseDelay(func, wait, args); 9303 }); 9304 9305 /** 9306 * Creates a function that returns the result of invoking the provided 9307 * functions with the `this` binding of the created function, where each 9308 * successive invocation is supplied the return value of the previous. 9309 * 9310 * @static 9311 * @memberOf _ 9312 * @category Function 9313 * @param {...Function} [funcs] Functions to invoke. 9314 * @returns {Function} Returns the new function. 9315 * @example 9316 * 9317 * function square(n) { 9318 * return n * n; 9319 * } 9320 * 9321 * var addSquare = _.flow(_.add, square); 9322 * addSquare(1, 2); 9323 * // => 9 9324 */ 9325 var flow = createFlow(); 9326 9327 /** 9328 * This method is like `_.flow` except that it creates a function that 9329 * invokes the provided functions from right to left. 9330 * 9331 * @static 9332 * @memberOf _ 9333 * @alias backflow, compose 9334 * @category Function 9335 * @param {...Function} [funcs] Functions to invoke. 9336 * @returns {Function} Returns the new function. 9337 * @example 9338 * 9339 * function square(n) { 9340 * return n * n; 9341 * } 9342 * 9343 * var addSquare = _.flowRight(square, _.add); 9344 * addSquare(1, 2); 9345 * // => 9 9346 */ 9347 var flowRight = createFlow(true); 9348 9349 /** 9350 * Creates a function that memoizes the result of `func`. If `resolver` is 9351 * provided it determines the cache key for storing the result based on the 9352 * arguments provided to the memoized function. By default, the first argument 9353 * provided to the memoized function is coerced to a string and used as the 9354 * cache key. The `func` is invoked with the `this` binding of the memoized 9355 * function. 9356 * 9357 * **Note:** The cache is exposed as the `cache` property on the memoized 9358 * function. Its creation may be customized by replacing the `_.memoize.Cache` 9359 * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object) 9360 * method interface of `get`, `has`, and `set`. 9361 * 9362 * @static 9363 * @memberOf _ 9364 * @category Function 9365 * @param {Function} func The function to have its output memoized. 9366 * @param {Function} [resolver] The function to resolve the cache key. 9367 * @returns {Function} Returns the new memoizing function. 9368 * @example 9369 * 9370 * var upperCase = _.memoize(function(string) { 9371 * return string.toUpperCase(); 9372 * }); 9373 * 9374 * upperCase('fred'); 9375 * // => 'FRED' 9376 * 9377 * // modifying the result cache 9378 * upperCase.cache.set('fred', 'BARNEY'); 9379 * upperCase('fred'); 9380 * // => 'BARNEY' 9381 * 9382 * // replacing `_.memoize.Cache` 9383 * var object = { 'user': 'fred' }; 9384 * var other = { 'user': 'barney' }; 9385 * var identity = _.memoize(_.identity); 9386 * 9387 * identity(object); 9388 * // => { 'user': 'fred' } 9389 * identity(other); 9390 * // => { 'user': 'fred' } 9391 * 9392 * _.memoize.Cache = WeakMap; 9393 * var identity = _.memoize(_.identity); 9394 * 9395 * identity(object); 9396 * // => { 'user': 'fred' } 9397 * identity(other); 9398 * // => { 'user': 'barney' } 9399 */ 9400 function memoize(func, resolver) { 9401 if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { 9402 throw new TypeError(FUNC_ERROR_TEXT); 9403 } 9404 var memoized = function() { 9405 var args = arguments, 9406 cache = memoized.cache, 9407 key = resolver ? resolver.apply(this, args) : args[0]; 9408 9409 if (cache.has(key)) { 9410 return cache.get(key); 9411 } 9412 var result = func.apply(this, args); 9413 cache.set(key, result); 9414 return result; 9415 }; 9416 memoized.cache = new memoize.Cache; 9417 return memoized; 9418 } 9419 9420 /** 9421 * Creates a function that negates the result of the predicate `func`. The 9422 * `func` predicate is invoked with the `this` binding and arguments of the 9423 * created function. 9424 * 9425 * @static 9426 * @memberOf _ 9427 * @category Function 9428 * @param {Function} predicate The predicate to negate. 9429 * @returns {Function} Returns the new function. 9430 * @example 9431 * 9432 * function isEven(n) { 9433 * return n % 2 == 0; 9434 * } 9435 * 9436 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); 9437 * // => [1, 3, 5] 9438 */ 9439 function negate(predicate) { 9440 if (typeof predicate != 'function') { 9441 throw new TypeError(FUNC_ERROR_TEXT); 9442 } 9443 return function() { 9444 return !predicate.apply(this, arguments); 9445 }; 9446 } 9447 9448 /** 9449 * Creates a function that is restricted to invoking `func` once. Repeat calls 9450 * to the function return the value of the first call. The `func` is invoked 9451 * with the `this` binding and arguments of the created function. 9452 * 9453 * @static 9454 * @memberOf _ 9455 * @category Function 9456 * @param {Function} func The function to restrict. 9457 * @returns {Function} Returns the new restricted function. 9458 * @example 9459 * 9460 * var initialize = _.once(createApplication); 9461 * initialize(); 9462 * initialize(); 9463 * // `initialize` invokes `createApplication` once 9464 */ 9465 function once(func) { 9466 return before(2, func); 9467 } 9468 9469 /** 9470 * Creates a function that invokes `func` with `partial` arguments prepended 9471 * to those provided to the new function. This method is like `_.bind` except 9472 * it does **not** alter the `this` binding. 9473 * 9474 * The `_.partial.placeholder` value, which defaults to `_` in monolithic 9475 * builds, may be used as a placeholder for partially applied arguments. 9476 * 9477 * **Note:** This method does not set the "length" property of partially 9478 * applied functions. 9479 * 9480 * @static 9481 * @memberOf _ 9482 * @category Function 9483 * @param {Function} func The function to partially apply arguments to. 9484 * @param {...*} [partials] The arguments to be partially applied. 9485 * @returns {Function} Returns the new partially applied function. 9486 * @example 9487 * 9488 * var greet = function(greeting, name) { 9489 * return greeting + ' ' + name; 9490 * }; 9491 * 9492 * var sayHelloTo = _.partial(greet, 'hello'); 9493 * sayHelloTo('fred'); 9494 * // => 'hello fred' 9495 * 9496 * // using placeholders 9497 * var greetFred = _.partial(greet, _, 'fred'); 9498 * greetFred('hi'); 9499 * // => 'hi fred' 9500 */ 9501 var partial = createPartial(PARTIAL_FLAG); 9502 9503 /** 9504 * This method is like `_.partial` except that partially applied arguments 9505 * are appended to those provided to the new function. 9506 * 9507 * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic 9508 * builds, may be used as a placeholder for partially applied arguments. 9509 * 9510 * **Note:** This method does not set the "length" property of partially 9511 * applied functions. 9512 * 9513 * @static 9514 * @memberOf _ 9515 * @category Function 9516 * @param {Function} func The function to partially apply arguments to. 9517 * @param {...*} [partials] The arguments to be partially applied. 9518 * @returns {Function} Returns the new partially applied function. 9519 * @example 9520 * 9521 * var greet = function(greeting, name) { 9522 * return greeting + ' ' + name; 9523 * }; 9524 * 9525 * var greetFred = _.partialRight(greet, 'fred'); 9526 * greetFred('hi'); 9527 * // => 'hi fred' 9528 * 9529 * // using placeholders 9530 * var sayHelloTo = _.partialRight(greet, 'hello', _); 9531 * sayHelloTo('fred'); 9532 * // => 'hello fred' 9533 */ 9534 var partialRight = createPartial(PARTIAL_RIGHT_FLAG); 9535 9536 /** 9537 * Creates a function that invokes `func` with arguments arranged according 9538 * to the specified indexes where the argument value at the first index is 9539 * provided as the first argument, the argument value at the second index is 9540 * provided as the second argument, and so on. 9541 * 9542 * @static 9543 * @memberOf _ 9544 * @category Function 9545 * @param {Function} func The function to rearrange arguments for. 9546 * @param {...(number|number[])} indexes The arranged argument indexes, 9547 * specified as individual indexes or arrays of indexes. 9548 * @returns {Function} Returns the new function. 9549 * @example 9550 * 9551 * var rearged = _.rearg(function(a, b, c) { 9552 * return [a, b, c]; 9553 * }, 2, 0, 1); 9554 * 9555 * rearged('b', 'c', 'a') 9556 * // => ['a', 'b', 'c'] 9557 * 9558 * var map = _.rearg(_.map, [1, 0]); 9559 * map(function(n) { 9560 * return n * 3; 9561 * }, [1, 2, 3]); 9562 * // => [3, 6, 9] 9563 */ 9564 var rearg = restParam(function(func, indexes) { 9565 return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes)); 9566 }); 9567 9568 /** 9569 * Creates a function that invokes `func` with the `this` binding of the 9570 * created function and arguments from `start` and beyond provided as an array. 9571 * 9572 * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters). 9573 * 9574 * @static 9575 * @memberOf _ 9576 * @category Function 9577 * @param {Function} func The function to apply a rest parameter to. 9578 * @param {number} [start=func.length-1] The start position of the rest parameter. 9579 * @returns {Function} Returns the new function. 9580 * @example 9581 * 9582 * var say = _.restParam(function(what, names) { 9583 * return what + ' ' + _.initial(names).join(', ') + 9584 * (_.size(names) > 1 ? ', & ' : '') + _.last(names); 9585 * }); 9586 * 9587 * say('hello', 'fred', 'barney', 'pebbles'); 9588 * // => 'hello fred, barney, & pebbles' 9589 */ 9590 function restParam(func, start) { 9591 if (typeof func != 'function') { 9592 throw new TypeError(FUNC_ERROR_TEXT); 9593 } 9594 start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); 9595 return function() { 9596 var args = arguments, 9597 index = -1, 9598 length = nativeMax(args.length - start, 0), 9599 rest = Array(length); 9600 9601 while (++index < length) { 9602 rest[index] = args[start + index]; 9603 } 9604 switch (start) { 9605 case 0: return func.call(this, rest); 9606 case 1: return func.call(this, args[0], rest); 9607 case 2: return func.call(this, args[0], args[1], rest); 9608 } 9609 var otherArgs = Array(start + 1); 9610 index = -1; 9611 while (++index < start) { 9612 otherArgs[index] = args[index]; 9613 } 9614 otherArgs[start] = rest; 9615 return func.apply(this, otherArgs); 9616 }; 9617 } 9618 9619 /** 9620 * Creates a function that invokes `func` with the `this` binding of the created 9621 * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3). 9622 * 9623 * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator). 9624 * 9625 * @static 9626 * @memberOf _ 9627 * @category Function 9628 * @param {Function} func The function to spread arguments over. 9629 * @returns {Function} Returns the new function. 9630 * @example 9631 * 9632 * var say = _.spread(function(who, what) { 9633 * return who + ' says ' + what; 9634 * }); 9635 * 9636 * say(['fred', 'hello']); 9637 * // => 'fred says hello' 9638 * 9639 * // with a Promise 9640 * var numbers = Promise.all([ 9641 * Promise.resolve(40), 9642 * Promise.resolve(36) 9643 * ]); 9644 * 9645 * numbers.then(_.spread(function(x, y) { 9646 * return x + y; 9647 * })); 9648 * // => a Promise of 76 9649 */ 9650 function spread(func) { 9651 if (typeof func != 'function') { 9652 throw new TypeError(FUNC_ERROR_TEXT); 9653 } 9654 return function(array) { 9655 return func.apply(this, array); 9656 }; 9657 } 9658 9659 /** 9660 * Creates a function that only invokes `func` at most once per every `wait` 9661 * milliseconds. The created function comes with a `cancel` method to cancel 9662 * delayed invocations. Provide an options object to indicate that `func` 9663 * should be invoked on the leading and/or trailing edge of the `wait` timeout. 9664 * Subsequent calls to the throttled function return the result of the last 9665 * `func` call. 9666 * 9667 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked 9668 * on the trailing edge of the timeout only if the the throttled function is 9669 * invoked more than once during the `wait` timeout. 9670 * 9671 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) 9672 * for details over the differences between `_.throttle` and `_.debounce`. 9673 * 9674 * @static 9675 * @memberOf _ 9676 * @category Function 9677 * @param {Function} func The function to throttle. 9678 * @param {number} [wait=0] The number of milliseconds to throttle invocations to. 9679 * @param {Object} [options] The options object. 9680 * @param {boolean} [options.leading=true] Specify invoking on the leading 9681 * edge of the timeout. 9682 * @param {boolean} [options.trailing=true] Specify invoking on the trailing 9683 * edge of the timeout. 9684 * @returns {Function} Returns the new throttled function. 9685 * @example 9686 * 9687 * // avoid excessively updating the position while scrolling 9688 * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); 9689 * 9690 * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes 9691 * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, { 9692 * 'trailing': false 9693 * })); 9694 * 9695 * // cancel a trailing throttled call 9696 * jQuery(window).on('popstate', throttled.cancel); 9697 */ 9698 function throttle(func, wait, options) { 9699 var leading = true, 9700 trailing = true; 9701 9702 if (typeof func != 'function') { 9703 throw new TypeError(FUNC_ERROR_TEXT); 9704 } 9705 if (options === false) { 9706 leading = false; 9707 } else if (isObject(options)) { 9708 leading = 'leading' in options ? !!options.leading : leading; 9709 trailing = 'trailing' in options ? !!options.trailing : trailing; 9710 } 9711 debounceOptions.leading = leading; 9712 debounceOptions.maxWait = +wait; 9713 debounceOptions.trailing = trailing; 9714 return debounce(func, wait, debounceOptions); 9715 } 9716 9717 /** 9718 * Creates a function that provides `value` to the wrapper function as its 9719 * first argument. Any additional arguments provided to the function are 9720 * appended to those provided to the wrapper function. The wrapper is invoked 9721 * with the `this` binding of the created function. 9722 * 9723 * @static 9724 * @memberOf _ 9725 * @category Function 9726 * @param {*} value The value to wrap. 9727 * @param {Function} wrapper The wrapper function. 9728 * @returns {Function} Returns the new function. 9729 * @example 9730 * 9731 * var p = _.wrap(_.escape, function(func, text) { 9732 * return '<p>' + func(text) + '</p>'; 9733 * }); 9734 * 9735 * p('fred, barney, & pebbles'); 9736 * // => '<p>fred, barney, & pebbles</p>' 9737 */ 9738 function wrap(value, wrapper) { 9739 wrapper = wrapper == null ? identity : wrapper; 9740 return createWrapper(wrapper, PARTIAL_FLAG, null, [value], []); 9741 } 9742 9743 /*------------------------------------------------------------------------*/ 9744 9745 /** 9746 * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned, 9747 * otherwise they are assigned by reference. If `customizer` is provided it is 9748 * invoked to produce the cloned values. If `customizer` returns `undefined` 9749 * cloning is handled by the method instead. The `customizer` is bound to 9750 * `thisArg` and invoked with two argument; (value [, index|key, object]). 9751 * 9752 * **Note:** This method is loosely based on the 9753 * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). 9754 * The enumerable properties of `arguments` objects and objects created by 9755 * constructors other than `Object` are cloned to plain `Object` objects. An 9756 * empty object is returned for uncloneable values such as functions, DOM nodes, 9757 * Maps, Sets, and WeakMaps. 9758 * 9759 * @static 9760 * @memberOf _ 9761 * @category Lang 9762 * @param {*} value The value to clone. 9763 * @param {boolean} [isDeep] Specify a deep clone. 9764 * @param {Function} [customizer] The function to customize cloning values. 9765 * @param {*} [thisArg] The `this` binding of `customizer`. 9766 * @returns {*} Returns the cloned value. 9767 * @example 9768 * 9769 * var users = [ 9770 * { 'user': 'barney' }, 9771 * { 'user': 'fred' } 9772 * ]; 9773 * 9774 * var shallow = _.clone(users); 9775 * shallow[0] === users[0]; 9776 * // => true 9777 * 9778 * var deep = _.clone(users, true); 9779 * deep[0] === users[0]; 9780 * // => false 9781 * 9782 * // using a customizer callback 9783 * var el = _.clone(document.body, function(value) { 9784 * if (_.isElement(value)) { 9785 * return value.cloneNode(false); 9786 * } 9787 * }); 9788 * 9789 * el === document.body 9790 * // => false 9791 * el.nodeName 9792 * // => BODY 9793 * el.childNodes.length; 9794 * // => 0 9795 */ 9796 function clone(value, isDeep, customizer, thisArg) { 9797 if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) { 9798 isDeep = false; 9799 } 9800 else if (typeof isDeep == 'function') { 9801 thisArg = customizer; 9802 customizer = isDeep; 9803 isDeep = false; 9804 } 9805 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1); 9806 return baseClone(value, isDeep, customizer); 9807 } 9808 9809 /** 9810 * Creates a deep clone of `value`. If `customizer` is provided it is invoked 9811 * to produce the cloned values. If `customizer` returns `undefined` cloning 9812 * is handled by the method instead. The `customizer` is bound to `thisArg` 9813 * and invoked with two argument; (value [, index|key, object]). 9814 * 9815 * **Note:** This method is loosely based on the 9816 * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). 9817 * The enumerable properties of `arguments` objects and objects created by 9818 * constructors other than `Object` are cloned to plain `Object` objects. An 9819 * empty object is returned for uncloneable values such as functions, DOM nodes, 9820 * Maps, Sets, and WeakMaps. 9821 * 9822 * @static 9823 * @memberOf _ 9824 * @category Lang 9825 * @param {*} value The value to deep clone. 9826 * @param {Function} [customizer] The function to customize cloning values. 9827 * @param {*} [thisArg] The `this` binding of `customizer`. 9828 * @returns {*} Returns the deep cloned value. 9829 * @example 9830 * 9831 * var users = [ 9832 * { 'user': 'barney' }, 9833 * { 'user': 'fred' } 9834 * ]; 9835 * 9836 * var deep = _.cloneDeep(users); 9837 * deep[0] === users[0]; 9838 * // => false 9839 * 9840 * // using a customizer callback 9841 * var el = _.cloneDeep(document.body, function(value) { 9842 * if (_.isElement(value)) { 9843 * return value.cloneNode(true); 9844 * } 9845 * }); 9846 * 9847 * el === document.body 9848 * // => false 9849 * el.nodeName 9850 * // => BODY 9851 * el.childNodes.length; 9852 * // => 20 9853 */ 9854 function cloneDeep(value, customizer, thisArg) { 9855 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1); 9856 return baseClone(value, true, customizer); 9857 } 9858 9859 /** 9860 * Checks if `value` is classified as an `arguments` object. 9861 * 9862 * @static 9863 * @memberOf _ 9864 * @category Lang 9865 * @param {*} value The value to check. 9866 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 9867 * @example 9868 * 9869 * _.isArguments(function() { return arguments; }()); 9870 * // => true 9871 * 9872 * _.isArguments([1, 2, 3]); 9873 * // => false 9874 */ 9875 function isArguments(value) { 9876 var length = isObjectLike(value) ? value.length : undefined; 9877 return isLength(length) && objToString.call(value) == argsTag; 9878 } 9879 9880 /** 9881 * Checks if `value` is classified as an `Array` object. 9882 * 9883 * @static 9884 * @memberOf _ 9885 * @category Lang 9886 * @param {*} value The value to check. 9887 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 9888 * @example 9889 * 9890 * _.isArray([1, 2, 3]); 9891 * // => true 9892 * 9893 * _.isArray(function() { return arguments; }()); 9894 * // => false 9895 */ 9896 var isArray = nativeIsArray || function(value) { 9897 return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; 9898 }; 9899 9900 /** 9901 * Checks if `value` is classified as a boolean primitive or object. 9902 * 9903 * @static 9904 * @memberOf _ 9905 * @category Lang 9906 * @param {*} value The value to check. 9907 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 9908 * @example 9909 * 9910 * _.isBoolean(false); 9911 * // => true 9912 * 9913 * _.isBoolean(null); 9914 * // => false 9915 */ 9916 function isBoolean(value) { 9917 return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag); 9918 } 9919 9920 /** 9921 * Checks if `value` is classified as a `Date` object. 9922 * 9923 * @static 9924 * @memberOf _ 9925 * @category Lang 9926 * @param {*} value The value to check. 9927 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 9928 * @example 9929 * 9930 * _.isDate(new Date); 9931 * // => true 9932 * 9933 * _.isDate('Mon April 23 2012'); 9934 * // => false 9935 */ 9936 function isDate(value) { 9937 return isObjectLike(value) && objToString.call(value) == dateTag; 9938 } 9939 9940 /** 9941 * Checks if `value` is a DOM element. 9942 * 9943 * @static 9944 * @memberOf _ 9945 * @category Lang 9946 * @param {*} value The value to check. 9947 * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. 9948 * @example 9949 * 9950 * _.isElement(document.body); 9951 * // => true 9952 * 9953 * _.isElement('<body>'); 9954 * // => false 9955 */ 9956 function isElement(value) { 9957 return !!value && value.nodeType === 1 && isObjectLike(value) && 9958 (objToString.call(value).indexOf('Element') > -1); 9959 } 9960 // Fallback for environments without DOM support. 9961 if (!support.dom) { 9962 isElement = function(value) { 9963 return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value); 9964 }; 9965 } 9966 9967 /** 9968 * Checks if `value` is empty. A value is considered empty unless it is an 9969 * `arguments` object, array, string, or jQuery-like collection with a length 9970 * greater than `0` or an object with own enumerable properties. 9971 * 9972 * @static 9973 * @memberOf _ 9974 * @category Lang 9975 * @param {Array|Object|string} value The value to inspect. 9976 * @returns {boolean} Returns `true` if `value` is empty, else `false`. 9977 * @example 9978 * 9979 * _.isEmpty(null); 9980 * // => true 9981 * 9982 * _.isEmpty(true); 9983 * // => true 9984 * 9985 * _.isEmpty(1); 9986 * // => true 9987 * 9988 * _.isEmpty([1, 2, 3]); 9989 * // => false 9990 * 9991 * _.isEmpty({ 'a': 1 }); 9992 * // => false 9993 */ 9994 function isEmpty(value) { 9995 if (value == null) { 9996 return true; 9997 } 9998 var length = getLength(value); 9999 if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) || 10000 (isObjectLike(value) && isFunction(value.splice)))) { 10001 return !length; 10002 } 10003 return !keys(value).length; 10004 } 10005 10006 /** 10007 * Performs a deep comparison between two values to determine if they are 10008 * equivalent. If `customizer` is provided it is invoked to compare values. 10009 * If `customizer` returns `undefined` comparisons are handled by the method 10010 * instead. The `customizer` is bound to `thisArg` and invoked with three 10011 * arguments: (value, other [, index|key]). 10012 * 10013 * **Note:** This method supports comparing arrays, booleans, `Date` objects, 10014 * numbers, `Object` objects, regexes, and strings. Objects are compared by 10015 * their own, not inherited, enumerable properties. Functions and DOM nodes 10016 * are **not** supported. Provide a customizer function to extend support 10017 * for comparing other values. 10018 * 10019 * @static 10020 * @memberOf _ 10021 * @category Lang 10022 * @param {*} value The value to compare. 10023 * @param {*} other The other value to compare. 10024 * @param {Function} [customizer] The function to customize value comparisons. 10025 * @param {*} [thisArg] The `this` binding of `customizer`. 10026 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. 10027 * @example 10028 * 10029 * var object = { 'user': 'fred' }; 10030 * var other = { 'user': 'fred' }; 10031 * 10032 * object == other; 10033 * // => false 10034 * 10035 * _.isEqual(object, other); 10036 * // => true 10037 * 10038 * // using a customizer callback 10039 * var array = ['hello', 'goodbye']; 10040 * var other = ['hi', 'goodbye']; 10041 * 10042 * _.isEqual(array, other, function(value, other) { 10043 * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) { 10044 * return true; 10045 * } 10046 * }); 10047 * // => true 10048 */ 10049 function isEqual(value, other, customizer, thisArg) { 10050 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3); 10051 if (!customizer && isStrictComparable(value) && isStrictComparable(other)) { 10052 return value === other; 10053 } 10054 var result = customizer ? customizer(value, other) : undefined; 10055 return result === undefined ? baseIsEqual(value, other, customizer) : !!result; 10056 } 10057 10058 /** 10059 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, 10060 * `SyntaxError`, `TypeError`, or `URIError` object. 10061 * 10062 * @static 10063 * @memberOf _ 10064 * @category Lang 10065 * @param {*} value The value to check. 10066 * @returns {boolean} Returns `true` if `value` is an error object, else `false`. 10067 * @example 10068 * 10069 * _.isError(new Error); 10070 * // => true 10071 * 10072 * _.isError(Error); 10073 * // => false 10074 */ 10075 function isError(value) { 10076 return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag; 10077 } 10078 10079 /** 10080 * Checks if `value` is a finite primitive number. 10081 * 10082 * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite). 10083 * 10084 * @static 10085 * @memberOf _ 10086 * @category Lang 10087 * @param {*} value The value to check. 10088 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. 10089 * @example 10090 * 10091 * _.isFinite(10); 10092 * // => true 10093 * 10094 * _.isFinite('10'); 10095 * // => false 10096 * 10097 * _.isFinite(true); 10098 * // => false 10099 * 10100 * _.isFinite(Object(10)); 10101 * // => false 10102 * 10103 * _.isFinite(Infinity); 10104 * // => false 10105 */ 10106 var isFinite = nativeNumIsFinite || function(value) { 10107 return typeof value == 'number' && nativeIsFinite(value); 10108 }; 10109 10110 /** 10111 * Checks if `value` is classified as a `Function` object. 10112 * 10113 * @static 10114 * @memberOf _ 10115 * @category Lang 10116 * @param {*} value The value to check. 10117 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 10118 * @example 10119 * 10120 * _.isFunction(_); 10121 * // => true 10122 * 10123 * _.isFunction(/abc/); 10124 * // => false 10125 */ 10126 var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) { 10127 // The use of `Object#toString` avoids issues with the `typeof` operator 10128 // in older versions of Chrome and Safari which return 'function' for regexes 10129 // and Safari 8 equivalents which return 'object' for typed array constructors. 10130 return objToString.call(value) == funcTag; 10131 }; 10132 10133 /** 10134 * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. 10135 * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) 10136 * 10137 * @static 10138 * @memberOf _ 10139 * @category Lang 10140 * @param {*} value The value to check. 10141 * @returns {boolean} Returns `true` if `value` is an object, else `false`. 10142 * @example 10143 * 10144 * _.isObject({}); 10145 * // => true 10146 * 10147 * _.isObject([1, 2, 3]); 10148 * // => true 10149 * 10150 * _.isObject(1); 10151 * // => false 10152 */ 10153 function isObject(value) { 10154 // Avoid a V8 JIT bug in Chrome 19-20. 10155 // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. 10156 var type = typeof value; 10157 return type == 'function' || (!!value && type == 'object'); 10158 } 10159 10160 /** 10161 * Performs a deep comparison between `object` and `source` to determine if 10162 * `object` contains equivalent property values. If `customizer` is provided 10163 * it is invoked to compare values. If `customizer` returns `undefined` 10164 * comparisons are handled by the method instead. The `customizer` is bound 10165 * to `thisArg` and invoked with three arguments: (value, other, index|key). 10166 * 10167 * **Note:** This method supports comparing properties of arrays, booleans, 10168 * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions 10169 * and DOM nodes are **not** supported. Provide a customizer function to extend 10170 * support for comparing other values. 10171 * 10172 * @static 10173 * @memberOf _ 10174 * @category Lang 10175 * @param {Object} object The object to inspect. 10176 * @param {Object} source The object of property values to match. 10177 * @param {Function} [customizer] The function to customize value comparisons. 10178 * @param {*} [thisArg] The `this` binding of `customizer`. 10179 * @returns {boolean} Returns `true` if `object` is a match, else `false`. 10180 * @example 10181 * 10182 * var object = { 'user': 'fred', 'age': 40 }; 10183 * 10184 * _.isMatch(object, { 'age': 40 }); 10185 * // => true 10186 * 10187 * _.isMatch(object, { 'age': 36 }); 10188 * // => false 10189 * 10190 * // using a customizer callback 10191 * var object = { 'greeting': 'hello' }; 10192 * var source = { 'greeting': 'hi' }; 10193 * 10194 * _.isMatch(object, source, function(value, other) { 10195 * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined; 10196 * }); 10197 * // => true 10198 */ 10199 function isMatch(object, source, customizer, thisArg) { 10200 var props = keys(source), 10201 length = props.length; 10202 10203 if (!length) { 10204 return true; 10205 } 10206 if (object == null) { 10207 return false; 10208 } 10209 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3); 10210 object = toObject(object); 10211 if (!customizer && length == 1) { 10212 var key = props[0], 10213 value = source[key]; 10214 10215 if (isStrictComparable(value)) { 10216 return value === object[key] && (value !== undefined || (key in object)); 10217 } 10218 } 10219 var values = Array(length), 10220 strictCompareFlags = Array(length); 10221 10222 while (length--) { 10223 value = values[length] = source[props[length]]; 10224 strictCompareFlags[length] = isStrictComparable(value); 10225 } 10226 return baseIsMatch(object, props, values, strictCompareFlags, customizer); 10227 } 10228 10229 /** 10230 * Checks if `value` is `NaN`. 10231 * 10232 * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4) 10233 * which returns `true` for `undefined` and other non-numeric values. 10234 * 10235 * @static 10236 * @memberOf _ 10237 * @category Lang 10238 * @param {*} value The value to check. 10239 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. 10240 * @example 10241 * 10242 * _.isNaN(NaN); 10243 * // => true 10244 * 10245 * _.isNaN(new Number(NaN)); 10246 * // => true 10247 * 10248 * isNaN(undefined); 10249 * // => true 10250 * 10251 * _.isNaN(undefined); 10252 * // => false 10253 */ 10254 function isNaN(value) { 10255 // An `NaN` primitive is the only value that is not equal to itself. 10256 // Perform the `toStringTag` check first to avoid errors with some host objects in IE. 10257 return isNumber(value) && value != +value; 10258 } 10259 10260 /** 10261 * Checks if `value` is a native function. 10262 * 10263 * @static 10264 * @memberOf _ 10265 * @category Lang 10266 * @param {*} value The value to check. 10267 * @returns {boolean} Returns `true` if `value` is a native function, else `false`. 10268 * @example 10269 * 10270 * _.isNative(Array.prototype.push); 10271 * // => true 10272 * 10273 * _.isNative(_); 10274 * // => false 10275 */ 10276 function isNative(value) { 10277 if (value == null) { 10278 return false; 10279 } 10280 if (objToString.call(value) == funcTag) { 10281 return reIsNative.test(fnToString.call(value)); 10282 } 10283 return isObjectLike(value) && reIsHostCtor.test(value); 10284 } 10285 10286 /** 10287 * Checks if `value` is `null`. 10288 * 10289 * @static 10290 * @memberOf _ 10291 * @category Lang 10292 * @param {*} value The value to check. 10293 * @returns {boolean} Returns `true` if `value` is `null`, else `false`. 10294 * @example 10295 * 10296 * _.isNull(null); 10297 * // => true 10298 * 10299 * _.isNull(void 0); 10300 * // => false 10301 */ 10302 function isNull(value) { 10303 return value === null; 10304 } 10305 10306 /** 10307 * Checks if `value` is classified as a `Number` primitive or object. 10308 * 10309 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified 10310 * as numbers, use the `_.isFinite` method. 10311 * 10312 * @static 10313 * @memberOf _ 10314 * @category Lang 10315 * @param {*} value The value to check. 10316 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 10317 * @example 10318 * 10319 * _.isNumber(8.4); 10320 * // => true 10321 * 10322 * _.isNumber(NaN); 10323 * // => true 10324 * 10325 * _.isNumber('8.4'); 10326 * // => false 10327 */ 10328 function isNumber(value) { 10329 return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag); 10330 } 10331 10332 /** 10333 * Checks if `value` is a plain object, that is, an object created by the 10334 * `Object` constructor or one with a `[[Prototype]]` of `null`. 10335 * 10336 * **Note:** This method assumes objects created by the `Object` constructor 10337 * have no inherited enumerable properties. 10338 * 10339 * @static 10340 * @memberOf _ 10341 * @category Lang 10342 * @param {*} value The value to check. 10343 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. 10344 * @example 10345 * 10346 * function Foo() { 10347 * this.a = 1; 10348 * } 10349 * 10350 * _.isPlainObject(new Foo); 10351 * // => false 10352 * 10353 * _.isPlainObject([1, 2, 3]); 10354 * // => false 10355 * 10356 * _.isPlainObject({ 'x': 0, 'y': 0 }); 10357 * // => true 10358 * 10359 * _.isPlainObject(Object.create(null)); 10360 * // => true 10361 */ 10362 var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) { 10363 if (!(value && objToString.call(value) == objectTag)) { 10364 return false; 10365 } 10366 var valueOf = value.valueOf, 10367 objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto); 10368 10369 return objProto 10370 ? (value == objProto || getPrototypeOf(value) == objProto) 10371 : shimIsPlainObject(value); 10372 }; 10373 10374 /** 10375 * Checks if `value` is classified as a `RegExp` object. 10376 * 10377 * @static 10378 * @memberOf _ 10379 * @category Lang 10380 * @param {*} value The value to check. 10381 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 10382 * @example 10383 * 10384 * _.isRegExp(/abc/); 10385 * // => true 10386 * 10387 * _.isRegExp('/abc/'); 10388 * // => false 10389 */ 10390 function isRegExp(value) { 10391 return (isObjectLike(value) && objToString.call(value) == regexpTag) || false; 10392 } 10393 10394 /** 10395 * Checks if `value` is classified as a `String` primitive or object. 10396 * 10397 * @static 10398 * @memberOf _ 10399 * @category Lang 10400 * @param {*} value The value to check. 10401 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 10402 * @example 10403 * 10404 * _.isString('abc'); 10405 * // => true 10406 * 10407 * _.isString(1); 10408 * // => false 10409 */ 10410 function isString(value) { 10411 return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); 10412 } 10413 10414 /** 10415 * Checks if `value` is classified as a typed array. 10416 * 10417 * @static 10418 * @memberOf _ 10419 * @category Lang 10420 * @param {*} value The value to check. 10421 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 10422 * @example 10423 * 10424 * _.isTypedArray(new Uint8Array); 10425 * // => true 10426 * 10427 * _.isTypedArray([]); 10428 * // => false 10429 */ 10430 function isTypedArray(value) { 10431 return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; 10432 } 10433 10434 /** 10435 * Checks if `value` is `undefined`. 10436 * 10437 * @static 10438 * @memberOf _ 10439 * @category Lang 10440 * @param {*} value The value to check. 10441 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. 10442 * @example 10443 * 10444 * _.isUndefined(void 0); 10445 * // => true 10446 * 10447 * _.isUndefined(null); 10448 * // => false 10449 */ 10450 function isUndefined(value) { 10451 return value === undefined; 10452 } 10453 10454 /** 10455 * Converts `value` to an array. 10456 * 10457 * @static 10458 * @memberOf _ 10459 * @category Lang 10460 * @param {*} value The value to convert. 10461 * @returns {Array} Returns the converted array. 10462 * @example 10463 * 10464 * (function() { 10465 * return _.toArray(arguments).slice(1); 10466 * }(1, 2, 3)); 10467 * // => [2, 3] 10468 */ 10469 function toArray(value) { 10470 var length = value ? getLength(value) : 0; 10471 if (!isLength(length)) { 10472 return values(value); 10473 } 10474 if (!length) { 10475 return []; 10476 } 10477 return arrayCopy(value); 10478 } 10479 10480 /** 10481 * Converts `value` to a plain object flattening inherited enumerable 10482 * properties of `value` to own properties of the plain object. 10483 * 10484 * @static 10485 * @memberOf _ 10486 * @category Lang 10487 * @param {*} value The value to convert. 10488 * @returns {Object} Returns the converted plain object. 10489 * @example 10490 * 10491 * function Foo() { 10492 * this.b = 2; 10493 * } 10494 * 10495 * Foo.prototype.c = 3; 10496 * 10497 * _.assign({ 'a': 1 }, new Foo); 10498 * // => { 'a': 1, 'b': 2 } 10499 * 10500 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); 10501 * // => { 'a': 1, 'b': 2, 'c': 3 } 10502 */ 10503 function toPlainObject(value) { 10504 return baseCopy(value, keysIn(value)); 10505 } 10506 10507 /*------------------------------------------------------------------------*/ 10508 10509 /** 10510 * Assigns own enumerable properties of source object(s) to the destination 10511 * object. Subsequent sources overwrite property assignments of previous sources. 10512 * If `customizer` is provided it is invoked to produce the assigned values. 10513 * The `customizer` is bound to `thisArg` and invoked with five arguments: 10514 * (objectValue, sourceValue, key, object, source). 10515 * 10516 * **Note:** This method mutates `object` and is based on 10517 * [`Object.assign`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign). 10518 * 10519 * 10520 * @static 10521 * @memberOf _ 10522 * @alias extend 10523 * @category Object 10524 * @param {Object} object The destination object. 10525 * @param {...Object} [sources] The source objects. 10526 * @param {Function} [customizer] The function to customize assigned values. 10527 * @param {*} [thisArg] The `this` binding of `customizer`. 10528 * @returns {Object} Returns `object`. 10529 * @example 10530 * 10531 * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); 10532 * // => { 'user': 'fred', 'age': 40 } 10533 * 10534 * // using a customizer callback 10535 * var defaults = _.partialRight(_.assign, function(value, other) { 10536 * return _.isUndefined(value) ? other : value; 10537 * }); 10538 * 10539 * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); 10540 * // => { 'user': 'barney', 'age': 36 } 10541 */ 10542 var assign = createAssigner(function(object, source, customizer) { 10543 return customizer 10544 ? assignWith(object, source, customizer) 10545 : baseAssign(object, source); 10546 }); 10547 10548 /** 10549 * Creates an object that inherits from the given `prototype` object. If a 10550 * `properties` object is provided its own enumerable properties are assigned 10551 * to the created object. 10552 * 10553 * @static 10554 * @memberOf _ 10555 * @category Object 10556 * @param {Object} prototype The object to inherit from. 10557 * @param {Object} [properties] The properties to assign to the object. 10558 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 10559 * @returns {Object} Returns the new object. 10560 * @example 10561 * 10562 * function Shape() { 10563 * this.x = 0; 10564 * this.y = 0; 10565 * } 10566 * 10567 * function Circle() { 10568 * Shape.call(this); 10569 * } 10570 * 10571 * Circle.prototype = _.create(Shape.prototype, { 10572 * 'constructor': Circle 10573 * }); 10574 * 10575 * var circle = new Circle; 10576 * circle instanceof Circle; 10577 * // => true 10578 * 10579 * circle instanceof Shape; 10580 * // => true 10581 */ 10582 function create(prototype, properties, guard) { 10583 var result = baseCreate(prototype); 10584 if (guard && isIterateeCall(prototype, properties, guard)) { 10585 properties = null; 10586 } 10587 return properties ? baseAssign(result, properties) : result; 10588 } 10589 10590 /** 10591 * Assigns own enumerable properties of source object(s) to the destination 10592 * object for all destination properties that resolve to `undefined`. Once a 10593 * property is set, additional values of the same property are ignored. 10594 * 10595 * **Note:** This method mutates `object`. 10596 * 10597 * @static 10598 * @memberOf _ 10599 * @category Object 10600 * @param {Object} object The destination object. 10601 * @param {...Object} [sources] The source objects. 10602 * @returns {Object} Returns `object`. 10603 * @example 10604 * 10605 * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); 10606 * // => { 'user': 'barney', 'age': 36 } 10607 */ 10608 var defaults = restParam(function(args) { 10609 var object = args[0]; 10610 if (object == null) { 10611 return object; 10612 } 10613 args.push(assignDefaults); 10614 return assign.apply(undefined, args); 10615 }); 10616 10617 /** 10618 * This method is like `_.find` except that it returns the key of the first 10619 * element `predicate` returns truthy for instead of the element itself. 10620 * 10621 * If a property name is provided for `predicate` the created `_.property` 10622 * style callback returns the property value of the given element. 10623 * 10624 * If a value is also provided for `thisArg` the created `_.matchesProperty` 10625 * style callback returns `true` for elements that have a matching property 10626 * value, else `false`. 10627 * 10628 * If an object is provided for `predicate` the created `_.matches` style 10629 * callback returns `true` for elements that have the properties of the given 10630 * object, else `false`. 10631 * 10632 * @static 10633 * @memberOf _ 10634 * @category Object 10635 * @param {Object} object The object to search. 10636 * @param {Function|Object|string} [predicate=_.identity] The function invoked 10637 * per iteration. 10638 * @param {*} [thisArg] The `this` binding of `predicate`. 10639 * @returns {string|undefined} Returns the key of the matched element, else `undefined`. 10640 * @example 10641 * 10642 * var users = { 10643 * 'barney': { 'age': 36, 'active': true }, 10644 * 'fred': { 'age': 40, 'active': false }, 10645 * 'pebbles': { 'age': 1, 'active': true } 10646 * }; 10647 * 10648 * _.findKey(users, function(chr) { 10649 * return chr.age < 40; 10650 * }); 10651 * // => 'barney' (iteration order is not guaranteed) 10652 * 10653 * // using the `_.matches` callback shorthand 10654 * _.findKey(users, { 'age': 1, 'active': true }); 10655 * // => 'pebbles' 10656 * 10657 * // using the `_.matchesProperty` callback shorthand 10658 * _.findKey(users, 'active', false); 10659 * // => 'fred' 10660 * 10661 * // using the `_.property` callback shorthand 10662 * _.findKey(users, 'active'); 10663 * // => 'barney' 10664 */ 10665 var findKey = createFindKey(baseForOwn); 10666 10667 /** 10668 * This method is like `_.findKey` except that it iterates over elements of 10669 * a collection in the opposite order. 10670 * 10671 * If a property name is provided for `predicate` the created `_.property` 10672 * style callback returns the property value of the given element. 10673 * 10674 * If a value is also provided for `thisArg` the created `_.matchesProperty` 10675 * style callback returns `true` for elements that have a matching property 10676 * value, else `false`. 10677 * 10678 * If an object is provided for `predicate` the created `_.matches` style 10679 * callback returns `true` for elements that have the properties of the given 10680 * object, else `false`. 10681 * 10682 * @static 10683 * @memberOf _ 10684 * @category Object 10685 * @param {Object} object The object to search. 10686 * @param {Function|Object|string} [predicate=_.identity] The function invoked 10687 * per iteration. 10688 * @param {*} [thisArg] The `this` binding of `predicate`. 10689 * @returns {string|undefined} Returns the key of the matched element, else `undefined`. 10690 * @example 10691 * 10692 * var users = { 10693 * 'barney': { 'age': 36, 'active': true }, 10694 * 'fred': { 'age': 40, 'active': false }, 10695 * 'pebbles': { 'age': 1, 'active': true } 10696 * }; 10697 * 10698 * _.findLastKey(users, function(chr) { 10699 * return chr.age < 40; 10700 * }); 10701 * // => returns `pebbles` assuming `_.findKey` returns `barney` 10702 * 10703 * // using the `_.matches` callback shorthand 10704 * _.findLastKey(users, { 'age': 36, 'active': true }); 10705 * // => 'barney' 10706 * 10707 * // using the `_.matchesProperty` callback shorthand 10708 * _.findLastKey(users, 'active', false); 10709 * // => 'fred' 10710 * 10711 * // using the `_.property` callback shorthand 10712 * _.findLastKey(users, 'active'); 10713 * // => 'pebbles' 10714 */ 10715 var findLastKey = createFindKey(baseForOwnRight); 10716 10717 /** 10718 * Iterates over own and inherited enumerable properties of an object invoking 10719 * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked 10720 * with three arguments: (value, key, object). Iteratee functions may exit 10721 * iteration early by explicitly returning `false`. 10722 * 10723 * @static 10724 * @memberOf _ 10725 * @category Object 10726 * @param {Object} object The object to iterate over. 10727 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 10728 * @param {*} [thisArg] The `this` binding of `iteratee`. 10729 * @returns {Object} Returns `object`. 10730 * @example 10731 * 10732 * function Foo() { 10733 * this.a = 1; 10734 * this.b = 2; 10735 * } 10736 * 10737 * Foo.prototype.c = 3; 10738 * 10739 * _.forIn(new Foo, function(value, key) { 10740 * console.log(key); 10741 * }); 10742 * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed) 10743 */ 10744 var forIn = createForIn(baseFor); 10745 10746 /** 10747 * This method is like `_.forIn` except that it iterates over properties of 10748 * `object` in the opposite order. 10749 * 10750 * @static 10751 * @memberOf _ 10752 * @category Object 10753 * @param {Object} object The object to iterate over. 10754 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 10755 * @param {*} [thisArg] The `this` binding of `iteratee`. 10756 * @returns {Object} Returns `object`. 10757 * @example 10758 * 10759 * function Foo() { 10760 * this.a = 1; 10761 * this.b = 2; 10762 * } 10763 * 10764 * Foo.prototype.c = 3; 10765 * 10766 * _.forInRight(new Foo, function(value, key) { 10767 * console.log(key); 10768 * }); 10769 * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c' 10770 */ 10771 var forInRight = createForIn(baseForRight); 10772 10773 /** 10774 * Iterates over own enumerable properties of an object invoking `iteratee` 10775 * for each property. The `iteratee` is bound to `thisArg` and invoked with 10776 * three arguments: (value, key, object). Iteratee functions may exit iteration 10777 * early by explicitly returning `false`. 10778 * 10779 * @static 10780 * @memberOf _ 10781 * @category Object 10782 * @param {Object} object The object to iterate over. 10783 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 10784 * @param {*} [thisArg] The `this` binding of `iteratee`. 10785 * @returns {Object} Returns `object`. 10786 * @example 10787 * 10788 * function Foo() { 10789 * this.a = 1; 10790 * this.b = 2; 10791 * } 10792 * 10793 * Foo.prototype.c = 3; 10794 * 10795 * _.forOwn(new Foo, function(value, key) { 10796 * console.log(key); 10797 * }); 10798 * // => logs 'a' and 'b' (iteration order is not guaranteed) 10799 */ 10800 var forOwn = createForOwn(baseForOwn); 10801 10802 /** 10803 * This method is like `_.forOwn` except that it iterates over properties of 10804 * `object` in the opposite order. 10805 * 10806 * @static 10807 * @memberOf _ 10808 * @category Object 10809 * @param {Object} object The object to iterate over. 10810 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 10811 * @param {*} [thisArg] The `this` binding of `iteratee`. 10812 * @returns {Object} Returns `object`. 10813 * @example 10814 * 10815 * function Foo() { 10816 * this.a = 1; 10817 * this.b = 2; 10818 * } 10819 * 10820 * Foo.prototype.c = 3; 10821 * 10822 * _.forOwnRight(new Foo, function(value, key) { 10823 * console.log(key); 10824 * }); 10825 * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b' 10826 */ 10827 var forOwnRight = createForOwn(baseForOwnRight); 10828 10829 /** 10830 * Creates an array of function property names from all enumerable properties, 10831 * own and inherited, of `object`. 10832 * 10833 * @static 10834 * @memberOf _ 10835 * @alias methods 10836 * @category Object 10837 * @param {Object} object The object to inspect. 10838 * @returns {Array} Returns the new array of property names. 10839 * @example 10840 * 10841 * _.functions(_); 10842 * // => ['after', 'ary', 'assign', ...] 10843 */ 10844 function functions(object) { 10845 return baseFunctions(object, keysIn(object)); 10846 } 10847 10848 /** 10849 * Gets the property value of `path` on `object`. If the resolved value is 10850 * `undefined` the `defaultValue` is used in its place. 10851 * 10852 * @static 10853 * @memberOf _ 10854 * @category Object 10855 * @param {Object} object The object to query. 10856 * @param {Array|string} path The path of the property to get. 10857 * @param {*} [defaultValue] The value returned if the resolved value is `undefined`. 10858 * @returns {*} Returns the resolved value. 10859 * @example 10860 * 10861 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; 10862 * 10863 * _.get(object, 'a[0].b.c'); 10864 * // => 3 10865 * 10866 * _.get(object, ['a', '0', 'b', 'c']); 10867 * // => 3 10868 * 10869 * _.get(object, 'a.b.c', 'default'); 10870 * // => 'default' 10871 */ 10872 function get(object, path, defaultValue) { 10873 var result = object == null ? undefined : baseGet(object, toPath(path), path + ''); 10874 return result === undefined ? defaultValue : result; 10875 } 10876 10877 /** 10878 * Checks if `path` is a direct property. 10879 * 10880 * @static 10881 * @memberOf _ 10882 * @category Object 10883 * @param {Object} object The object to query. 10884 * @param {Array|string} path The path to check. 10885 * @returns {boolean} Returns `true` if `path` is a direct property, else `false`. 10886 * @example 10887 * 10888 * var object = { 'a': { 'b': { 'c': 3 } } }; 10889 * 10890 * _.has(object, 'a'); 10891 * // => true 10892 * 10893 * _.has(object, 'a.b.c'); 10894 * // => true 10895 * 10896 * _.has(object, ['a', 'b', 'c']); 10897 * // => true 10898 */ 10899 function has(object, path) { 10900 if (object == null) { 10901 return false; 10902 } 10903 var result = hasOwnProperty.call(object, path); 10904 if (!result && !isKey(path)) { 10905 path = toPath(path); 10906 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); 10907 path = last(path); 10908 result = object != null && hasOwnProperty.call(object, path); 10909 } 10910 return result; 10911 } 10912 10913 /** 10914 * Creates an object composed of the inverted keys and values of `object`. 10915 * If `object` contains duplicate values, subsequent values overwrite property 10916 * assignments of previous values unless `multiValue` is `true`. 10917 * 10918 * @static 10919 * @memberOf _ 10920 * @category Object 10921 * @param {Object} object The object to invert. 10922 * @param {boolean} [multiValue] Allow multiple values per key. 10923 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 10924 * @returns {Object} Returns the new inverted object. 10925 * @example 10926 * 10927 * var object = { 'a': 1, 'b': 2, 'c': 1 }; 10928 * 10929 * _.invert(object); 10930 * // => { '1': 'c', '2': 'b' } 10931 * 10932 * // with `multiValue` 10933 * _.invert(object, true); 10934 * // => { '1': ['a', 'c'], '2': ['b'] } 10935 */ 10936 function invert(object, multiValue, guard) { 10937 if (guard && isIterateeCall(object, multiValue, guard)) { 10938 multiValue = null; 10939 } 10940 var index = -1, 10941 props = keys(object), 10942 length = props.length, 10943 result = {}; 10944 10945 while (++index < length) { 10946 var key = props[index], 10947 value = object[key]; 10948 10949 if (multiValue) { 10950 if (hasOwnProperty.call(result, value)) { 10951 result[value].push(key); 10952 } else { 10953 result[value] = [key]; 10954 } 10955 } 10956 else { 10957 result[value] = key; 10958 } 10959 } 10960 return result; 10961 } 10962 10963 /** 10964 * Creates an array of the own enumerable property names of `object`. 10965 * 10966 * **Note:** Non-object values are coerced to objects. See the 10967 * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys) 10968 * for more details. 10969 * 10970 * @static 10971 * @memberOf _ 10972 * @category Object 10973 * @param {Object} object The object to query. 10974 * @returns {Array} Returns the array of property names. 10975 * @example 10976 * 10977 * function Foo() { 10978 * this.a = 1; 10979 * this.b = 2; 10980 * } 10981 * 10982 * Foo.prototype.c = 3; 10983 * 10984 * _.keys(new Foo); 10985 * // => ['a', 'b'] (iteration order is not guaranteed) 10986 * 10987 * _.keys('hi'); 10988 * // => ['0', '1'] 10989 */ 10990 var keys = !nativeKeys ? shimKeys : function(object) { 10991 if (object) { 10992 var Ctor = object.constructor, 10993 length = object.length; 10994 } 10995 if ((typeof Ctor == 'function' && Ctor.prototype === object) || 10996 (typeof object != 'function' && isLength(length))) { 10997 return shimKeys(object); 10998 } 10999 return isObject(object) ? nativeKeys(object) : []; 11000 }; 11001 11002 /** 11003 * Creates an array of the own and inherited enumerable property names of `object`. 11004 * 11005 * **Note:** Non-object values are coerced to objects. 11006 * 11007 * @static 11008 * @memberOf _ 11009 * @category Object 11010 * @param {Object} object The object to query. 11011 * @returns {Array} Returns the array of property names. 11012 * @example 11013 * 11014 * function Foo() { 11015 * this.a = 1; 11016 * this.b = 2; 11017 * } 11018 * 11019 * Foo.prototype.c = 3; 11020 * 11021 * _.keysIn(new Foo); 11022 * // => ['a', 'b', 'c'] (iteration order is not guaranteed) 11023 */ 11024 function keysIn(object) { 11025 if (object == null) { 11026 return []; 11027 } 11028 if (!isObject(object)) { 11029 object = Object(object); 11030 } 11031 var length = object.length; 11032 length = (length && isLength(length) && 11033 (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0; 11034 11035 var Ctor = object.constructor, 11036 index = -1, 11037 isProto = typeof Ctor == 'function' && Ctor.prototype === object, 11038 result = Array(length), 11039 skipIndexes = length > 0; 11040 11041 while (++index < length) { 11042 result[index] = (index + ''); 11043 } 11044 for (var key in object) { 11045 if (!(skipIndexes && isIndex(key, length)) && 11046 !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { 11047 result.push(key); 11048 } 11049 } 11050 return result; 11051 } 11052 11053 /** 11054 * Creates an object with the same keys as `object` and values generated by 11055 * running each own enumerable property of `object` through `iteratee`. The 11056 * iteratee function is bound to `thisArg` and invoked with three arguments: 11057 * (value, key, object). 11058 * 11059 * If a property name is provided for `iteratee` the created `_.property` 11060 * style callback returns the property value of the given element. 11061 * 11062 * If a value is also provided for `thisArg` the created `_.matchesProperty` 11063 * style callback returns `true` for elements that have a matching property 11064 * value, else `false`. 11065 * 11066 * If an object is provided for `iteratee` the created `_.matches` style 11067 * callback returns `true` for elements that have the properties of the given 11068 * object, else `false`. 11069 * 11070 * @static 11071 * @memberOf _ 11072 * @category Object 11073 * @param {Object} object The object to iterate over. 11074 * @param {Function|Object|string} [iteratee=_.identity] The function invoked 11075 * per iteration. 11076 * @param {*} [thisArg] The `this` binding of `iteratee`. 11077 * @returns {Object} Returns the new mapped object. 11078 * @example 11079 * 11080 * _.mapValues({ 'a': 1, 'b': 2 }, function(n) { 11081 * return n * 3; 11082 * }); 11083 * // => { 'a': 3, 'b': 6 } 11084 * 11085 * var users = { 11086 * 'fred': { 'user': 'fred', 'age': 40 }, 11087 * 'pebbles': { 'user': 'pebbles', 'age': 1 } 11088 * }; 11089 * 11090 * // using the `_.property` callback shorthand 11091 * _.mapValues(users, 'age'); 11092 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) 11093 */ 11094 function mapValues(object, iteratee, thisArg) { 11095 var result = {}; 11096 iteratee = getCallback(iteratee, thisArg, 3); 11097 11098 baseForOwn(object, function(value, key, object) { 11099 result[key] = iteratee(value, key, object); 11100 }); 11101 return result; 11102 } 11103 11104 /** 11105 * Recursively merges own enumerable properties of the source object(s), that 11106 * don't resolve to `undefined` into the destination object. Subsequent sources 11107 * overwrite property assignments of previous sources. If `customizer` is 11108 * provided it is invoked to produce the merged values of the destination and 11109 * source properties. If `customizer` returns `undefined` merging is handled 11110 * by the method instead. The `customizer` is bound to `thisArg` and invoked 11111 * with five arguments: (objectValue, sourceValue, key, object, source). 11112 * 11113 * @static 11114 * @memberOf _ 11115 * @category Object 11116 * @param {Object} object The destination object. 11117 * @param {...Object} [sources] The source objects. 11118 * @param {Function} [customizer] The function to customize assigned values. 11119 * @param {*} [thisArg] The `this` binding of `customizer`. 11120 * @returns {Object} Returns `object`. 11121 * @example 11122 * 11123 * var users = { 11124 * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }] 11125 * }; 11126 * 11127 * var ages = { 11128 * 'data': [{ 'age': 36 }, { 'age': 40 }] 11129 * }; 11130 * 11131 * _.merge(users, ages); 11132 * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } 11133 * 11134 * // using a customizer callback 11135 * var object = { 11136 * 'fruits': ['apple'], 11137 * 'vegetables': ['beet'] 11138 * }; 11139 * 11140 * var other = { 11141 * 'fruits': ['banana'], 11142 * 'vegetables': ['carrot'] 11143 * }; 11144 * 11145 * _.merge(object, other, function(a, b) { 11146 * if (_.isArray(a)) { 11147 * return a.concat(b); 11148 * } 11149 * }); 11150 * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] } 11151 */ 11152 var merge = createAssigner(baseMerge); 11153 11154 /** 11155 * The opposite of `_.pick`; this method creates an object composed of the 11156 * own and inherited enumerable properties of `object` that are not omitted. 11157 * Property names may be specified as individual arguments or as arrays of 11158 * property names. If `predicate` is provided it is invoked for each property 11159 * of `object` omitting the properties `predicate` returns truthy for. The 11160 * predicate is bound to `thisArg` and invoked with three arguments: 11161 * (value, key, object). 11162 * 11163 * @static 11164 * @memberOf _ 11165 * @category Object 11166 * @param {Object} object The source object. 11167 * @param {Function|...(string|string[])} [predicate] The function invoked per 11168 * iteration or property names to omit, specified as individual property 11169 * names or arrays of property names. 11170 * @param {*} [thisArg] The `this` binding of `predicate`. 11171 * @returns {Object} Returns the new object. 11172 * @example 11173 * 11174 * var object = { 'user': 'fred', 'age': 40 }; 11175 * 11176 * _.omit(object, 'age'); 11177 * // => { 'user': 'fred' } 11178 * 11179 * _.omit(object, _.isNumber); 11180 * // => { 'user': 'fred' } 11181 */ 11182 var omit = restParam(function(object, props) { 11183 if (object == null) { 11184 return {}; 11185 } 11186 if (typeof props[0] != 'function') { 11187 var props = arrayMap(baseFlatten(props), String); 11188 return pickByArray(object, baseDifference(keysIn(object), props)); 11189 } 11190 var predicate = bindCallback(props[0], props[1], 3); 11191 return pickByCallback(object, function(value, key, object) { 11192 return !predicate(value, key, object); 11193 }); 11194 }); 11195 11196 /** 11197 * Creates a two dimensional array of the key-value pairs for `object`, 11198 * e.g. `[[key1, value1], [key2, value2]]`. 11199 * 11200 * @static 11201 * @memberOf _ 11202 * @category Object 11203 * @param {Object} object The object to query. 11204 * @returns {Array} Returns the new array of key-value pairs. 11205 * @example 11206 * 11207 * _.pairs({ 'barney': 36, 'fred': 40 }); 11208 * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) 11209 */ 11210 function pairs(object) { 11211 var index = -1, 11212 props = keys(object), 11213 length = props.length, 11214 result = Array(length); 11215 11216 while (++index < length) { 11217 var key = props[index]; 11218 result[index] = [key, object[key]]; 11219 } 11220 return result; 11221 } 11222 11223 /** 11224 * Creates an object composed of the picked `object` properties. Property 11225 * names may be specified as individual arguments or as arrays of property 11226 * names. If `predicate` is provided it is invoked for each property of `object` 11227 * picking the properties `predicate` returns truthy for. The predicate is 11228 * bound to `thisArg` and invoked with three arguments: (value, key, object). 11229 * 11230 * @static 11231 * @memberOf _ 11232 * @category Object 11233 * @param {Object} object The source object. 11234 * @param {Function|...(string|string[])} [predicate] The function invoked per 11235 * iteration or property names to pick, specified as individual property 11236 * names or arrays of property names. 11237 * @param {*} [thisArg] The `this` binding of `predicate`. 11238 * @returns {Object} Returns the new object. 11239 * @example 11240 * 11241 * var object = { 'user': 'fred', 'age': 40 }; 11242 * 11243 * _.pick(object, 'user'); 11244 * // => { 'user': 'fred' } 11245 * 11246 * _.pick(object, _.isString); 11247 * // => { 'user': 'fred' } 11248 */ 11249 var pick = restParam(function(object, props) { 11250 if (object == null) { 11251 return {}; 11252 } 11253 return typeof props[0] == 'function' 11254 ? pickByCallback(object, bindCallback(props[0], props[1], 3)) 11255 : pickByArray(object, baseFlatten(props)); 11256 }); 11257 11258 /** 11259 * This method is like `_.get` except that if the resolved value is a function 11260 * it is invoked with the `this` binding of its parent object and its result 11261 * is returned. 11262 * 11263 * @static 11264 * @memberOf _ 11265 * @category Object 11266 * @param {Object} object The object to query. 11267 * @param {Array|string} path The path of the property to resolve. 11268 * @param {*} [defaultValue] The value returned if the resolved value is `undefined`. 11269 * @returns {*} Returns the resolved value. 11270 * @example 11271 * 11272 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; 11273 * 11274 * _.result(object, 'a[0].b.c1'); 11275 * // => 3 11276 * 11277 * _.result(object, 'a[0].b.c2'); 11278 * // => 4 11279 * 11280 * _.result(object, 'a.b.c', 'default'); 11281 * // => 'default' 11282 * 11283 * _.result(object, 'a.b.c', _.constant('default')); 11284 * // => 'default' 11285 */ 11286 function result(object, path, defaultValue) { 11287 var result = object == null ? undefined : object[path]; 11288 if (result === undefined) { 11289 if (object != null && !isKey(path, object)) { 11290 path = toPath(path); 11291 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); 11292 result = object == null ? undefined : object[last(path)]; 11293 } 11294 result = result === undefined ? defaultValue : result; 11295 } 11296 return isFunction(result) ? result.call(object) : result; 11297 } 11298 11299 /** 11300 * Sets the property value of `path` on `object`. If a portion of `path` 11301 * does not exist it is created. 11302 * 11303 * @static 11304 * @memberOf _ 11305 * @category Object 11306 * @param {Object} object The object to augment. 11307 * @param {Array|string} path The path of the property to set. 11308 * @param {*} value The value to set. 11309 * @returns {Object} Returns `object`. 11310 * @example 11311 * 11312 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; 11313 * 11314 * _.set(object, 'a[0].b.c', 4); 11315 * console.log(object.a[0].b.c); 11316 * // => 4 11317 * 11318 * _.set(object, 'x[0].y.z', 5); 11319 * console.log(object.x[0].y.z); 11320 * // => 5 11321 */ 11322 function set(object, path, value) { 11323 if (object == null) { 11324 return object; 11325 } 11326 var pathKey = (path + ''); 11327 path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path); 11328 11329 var index = -1, 11330 length = path.length, 11331 endIndex = length - 1, 11332 nested = object; 11333 11334 while (nested != null && ++index < length) { 11335 var key = path[index]; 11336 if (isObject(nested)) { 11337 if (index == endIndex) { 11338 nested[key] = value; 11339 } else if (nested[key] == null) { 11340 nested[key] = isIndex(path[index + 1]) ? [] : {}; 11341 } 11342 } 11343 nested = nested[key]; 11344 } 11345 return object; 11346 } 11347 11348 /** 11349 * An alternative to `_.reduce`; this method transforms `object` to a new 11350 * `accumulator` object which is the result of running each of its own enumerable 11351 * properties through `iteratee`, with each invocation potentially mutating 11352 * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked 11353 * with four arguments: (accumulator, value, key, object). Iteratee functions 11354 * may exit iteration early by explicitly returning `false`. 11355 * 11356 * @static 11357 * @memberOf _ 11358 * @category Object 11359 * @param {Array|Object} object The object to iterate over. 11360 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 11361 * @param {*} [accumulator] The custom accumulator value. 11362 * @param {*} [thisArg] The `this` binding of `iteratee`. 11363 * @returns {*} Returns the accumulated value. 11364 * @example 11365 * 11366 * _.transform([2, 3, 4], function(result, n) { 11367 * result.push(n *= n); 11368 * return n % 2 == 0; 11369 * }); 11370 * // => [4, 9] 11371 * 11372 * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) { 11373 * result[key] = n * 3; 11374 * }); 11375 * // => { 'a': 3, 'b': 6 } 11376 */ 11377 function transform(object, iteratee, accumulator, thisArg) { 11378 var isArr = isArray(object) || isTypedArray(object); 11379 iteratee = getCallback(iteratee, thisArg, 4); 11380 11381 if (accumulator == null) { 11382 if (isArr || isObject(object)) { 11383 var Ctor = object.constructor; 11384 if (isArr) { 11385 accumulator = isArray(object) ? new Ctor : []; 11386 } else { 11387 accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype); 11388 } 11389 } else { 11390 accumulator = {}; 11391 } 11392 } 11393 (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) { 11394 return iteratee(accumulator, value, index, object); 11395 }); 11396 return accumulator; 11397 } 11398 11399 /** 11400 * Creates an array of the own enumerable property values of `object`. 11401 * 11402 * **Note:** Non-object values are coerced to objects. 11403 * 11404 * @static 11405 * @memberOf _ 11406 * @category Object 11407 * @param {Object} object The object to query. 11408 * @returns {Array} Returns the array of property values. 11409 * @example 11410 * 11411 * function Foo() { 11412 * this.a = 1; 11413 * this.b = 2; 11414 * } 11415 * 11416 * Foo.prototype.c = 3; 11417 * 11418 * _.values(new Foo); 11419 * // => [1, 2] (iteration order is not guaranteed) 11420 * 11421 * _.values('hi'); 11422 * // => ['h', 'i'] 11423 */ 11424 function values(object) { 11425 return baseValues(object, keys(object)); 11426 } 11427 11428 /** 11429 * Creates an array of the own and inherited enumerable property values 11430 * of `object`. 11431 * 11432 * **Note:** Non-object values are coerced to objects. 11433 * 11434 * @static 11435 * @memberOf _ 11436 * @category Object 11437 * @param {Object} object The object to query. 11438 * @returns {Array} Returns the array of property values. 11439 * @example 11440 * 11441 * function Foo() { 11442 * this.a = 1; 11443 * this.b = 2; 11444 * } 11445 * 11446 * Foo.prototype.c = 3; 11447 * 11448 * _.valuesIn(new Foo); 11449 * // => [1, 2, 3] (iteration order is not guaranteed) 11450 */ 11451 function valuesIn(object) { 11452 return baseValues(object, keysIn(object)); 11453 } 11454 11455 /*------------------------------------------------------------------------*/ 11456 11457 /** 11458 * Checks if `n` is between `start` and up to but not including, `end`. If 11459 * `end` is not specified it is set to `start` with `start` then set to `0`. 11460 * 11461 * @static 11462 * @memberOf _ 11463 * @category Number 11464 * @param {number} n The number to check. 11465 * @param {number} [start=0] The start of the range. 11466 * @param {number} end The end of the range. 11467 * @returns {boolean} Returns `true` if `n` is in the range, else `false`. 11468 * @example 11469 * 11470 * _.inRange(3, 2, 4); 11471 * // => true 11472 * 11473 * _.inRange(4, 8); 11474 * // => true 11475 * 11476 * _.inRange(4, 2); 11477 * // => false 11478 * 11479 * _.inRange(2, 2); 11480 * // => false 11481 * 11482 * _.inRange(1.2, 2); 11483 * // => true 11484 * 11485 * _.inRange(5.2, 4); 11486 * // => false 11487 */ 11488 function inRange(value, start, end) { 11489 start = +start || 0; 11490 if (typeof end === 'undefined') { 11491 end = start; 11492 start = 0; 11493 } else { 11494 end = +end || 0; 11495 } 11496 return value >= nativeMin(start, end) && value < nativeMax(start, end); 11497 } 11498 11499 /** 11500 * Produces a random number between `min` and `max` (inclusive). If only one 11501 * argument is provided a number between `0` and the given number is returned. 11502 * If `floating` is `true`, or either `min` or `max` are floats, a floating-point 11503 * number is returned instead of an integer. 11504 * 11505 * @static 11506 * @memberOf _ 11507 * @category Number 11508 * @param {number} [min=0] The minimum possible value. 11509 * @param {number} [max=1] The maximum possible value. 11510 * @param {boolean} [floating] Specify returning a floating-point number. 11511 * @returns {number} Returns the random number. 11512 * @example 11513 * 11514 * _.random(0, 5); 11515 * // => an integer between 0 and 5 11516 * 11517 * _.random(5); 11518 * // => also an integer between 0 and 5 11519 * 11520 * _.random(5, true); 11521 * // => a floating-point number between 0 and 5 11522 * 11523 * _.random(1.2, 5.2); 11524 * // => a floating-point number between 1.2 and 5.2 11525 */ 11526 function random(min, max, floating) { 11527 if (floating && isIterateeCall(min, max, floating)) { 11528 max = floating = null; 11529 } 11530 var noMin = min == null, 11531 noMax = max == null; 11532 11533 if (floating == null) { 11534 if (noMax && typeof min == 'boolean') { 11535 floating = min; 11536 min = 1; 11537 } 11538 else if (typeof max == 'boolean') { 11539 floating = max; 11540 noMax = true; 11541 } 11542 } 11543 if (noMin && noMax) { 11544 max = 1; 11545 noMax = false; 11546 } 11547 min = +min || 0; 11548 if (noMax) { 11549 max = min; 11550 min = 0; 11551 } else { 11552 max = +max || 0; 11553 } 11554 if (floating || min % 1 || max % 1) { 11555 var rand = nativeRandom(); 11556 return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max); 11557 } 11558 return baseRandom(min, max); 11559 } 11560 11561 /*------------------------------------------------------------------------*/ 11562 11563 /** 11564 * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). 11565 * 11566 * @static 11567 * @memberOf _ 11568 * @category String 11569 * @param {string} [string=''] The string to convert. 11570 * @returns {string} Returns the camel cased string. 11571 * @example 11572 * 11573 * _.camelCase('Foo Bar'); 11574 * // => 'fooBar' 11575 * 11576 * _.camelCase('--foo-bar'); 11577 * // => 'fooBar' 11578 * 11579 * _.camelCase('__foo_bar__'); 11580 * // => 'fooBar' 11581 */ 11582 var camelCase = createCompounder(function(result, word, index) { 11583 word = word.toLowerCase(); 11584 return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word); 11585 }); 11586 11587 /** 11588 * Capitalizes the first character of `string`. 11589 * 11590 * @static 11591 * @memberOf _ 11592 * @category String 11593 * @param {string} [string=''] The string to capitalize. 11594 * @returns {string} Returns the capitalized string. 11595 * @example 11596 * 11597 * _.capitalize('fred'); 11598 * // => 'Fred' 11599 */ 11600 function capitalize(string) { 11601 string = baseToString(string); 11602 return string && (string.charAt(0).toUpperCase() + string.slice(1)); 11603 } 11604 11605 /** 11606 * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) 11607 * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). 11608 * 11609 * @static 11610 * @memberOf _ 11611 * @category String 11612 * @param {string} [string=''] The string to deburr. 11613 * @returns {string} Returns the deburred string. 11614 * @example 11615 * 11616 * _.deburr('déjà vu'); 11617 * // => 'deja vu' 11618 */ 11619 function deburr(string) { 11620 string = baseToString(string); 11621 return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, ''); 11622 } 11623 11624 /** 11625 * Checks if `string` ends with the given target string. 11626 * 11627 * @static 11628 * @memberOf _ 11629 * @category String 11630 * @param {string} [string=''] The string to search. 11631 * @param {string} [target] The string to search for. 11632 * @param {number} [position=string.length] The position to search from. 11633 * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`. 11634 * @example 11635 * 11636 * _.endsWith('abc', 'c'); 11637 * // => true 11638 * 11639 * _.endsWith('abc', 'b'); 11640 * // => false 11641 * 11642 * _.endsWith('abc', 'b', 2); 11643 * // => true 11644 */ 11645 function endsWith(string, target, position) { 11646 string = baseToString(string); 11647 target = (target + ''); 11648 11649 var length = string.length; 11650 position = position === undefined 11651 ? length 11652 : nativeMin(position < 0 ? 0 : (+position || 0), length); 11653 11654 position -= target.length; 11655 return position >= 0 && string.indexOf(target, position) == position; 11656 } 11657 11658 /** 11659 * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to 11660 * their corresponding HTML entities. 11661 * 11662 * **Note:** No other characters are escaped. To escape additional characters 11663 * use a third-party library like [_he_](https://mths.be/he). 11664 * 11665 * Though the ">" character is escaped for symmetry, characters like 11666 * ">" and "/" don't require escaping in HTML and have no special meaning 11667 * unless they're part of a tag or unquoted attribute value. 11668 * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) 11669 * (under "semi-related fun fact") for more details. 11670 * 11671 * Backticks are escaped because in Internet Explorer < 9, they can break out 11672 * of attribute values or HTML comments. See [#59](https://html5sec.org/#59), 11673 * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and 11674 * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/) 11675 * for more details. 11676 * 11677 * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping) 11678 * to reduce XSS vectors. 11679 * 11680 * @static 11681 * @memberOf _ 11682 * @category String 11683 * @param {string} [string=''] The string to escape. 11684 * @returns {string} Returns the escaped string. 11685 * @example 11686 * 11687 * _.escape('fred, barney, & pebbles'); 11688 * // => 'fred, barney, & pebbles' 11689 */ 11690 function escape(string) { 11691 // Reset `lastIndex` because in IE < 9 `String#replace` does not. 11692 string = baseToString(string); 11693 return (string && reHasUnescapedHtml.test(string)) 11694 ? string.replace(reUnescapedHtml, escapeHtmlChar) 11695 : string; 11696 } 11697 11698 /** 11699 * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?", 11700 * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`. 11701 * 11702 * @static 11703 * @memberOf _ 11704 * @category String 11705 * @param {string} [string=''] The string to escape. 11706 * @returns {string} Returns the escaped string. 11707 * @example 11708 * 11709 * _.escapeRegExp('[lodash](https://lodash.com/)'); 11710 * // => '\[lodash\]\(https:\/\/lodash\.com\/\)' 11711 */ 11712 function escapeRegExp(string) { 11713 string = baseToString(string); 11714 return (string && reHasRegExpChars.test(string)) 11715 ? string.replace(reRegExpChars, '\\$&') 11716 : string; 11717 } 11718 11719 /** 11720 * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). 11721 * 11722 * @static 11723 * @memberOf _ 11724 * @category String 11725 * @param {string} [string=''] The string to convert. 11726 * @returns {string} Returns the kebab cased string. 11727 * @example 11728 * 11729 * _.kebabCase('Foo Bar'); 11730 * // => 'foo-bar' 11731 * 11732 * _.kebabCase('fooBar'); 11733 * // => 'foo-bar' 11734 * 11735 * _.kebabCase('__foo_bar__'); 11736 * // => 'foo-bar' 11737 */ 11738 var kebabCase = createCompounder(function(result, word, index) { 11739 return result + (index ? '-' : '') + word.toLowerCase(); 11740 }); 11741 11742 /** 11743 * Pads `string` on the left and right sides if it is shorter than `length`. 11744 * Padding characters are truncated if they can't be evenly divided by `length`. 11745 * 11746 * @static 11747 * @memberOf _ 11748 * @category String 11749 * @param {string} [string=''] The string to pad. 11750 * @param {number} [length=0] The padding length. 11751 * @param {string} [chars=' '] The string used as padding. 11752 * @returns {string} Returns the padded string. 11753 * @example 11754 * 11755 * _.pad('abc', 8); 11756 * // => ' abc ' 11757 * 11758 * _.pad('abc', 8, '_-'); 11759 * // => '_-abc_-_' 11760 * 11761 * _.pad('abc', 3); 11762 * // => 'abc' 11763 */ 11764 function pad(string, length, chars) { 11765 string = baseToString(string); 11766 length = +length; 11767 11768 var strLength = string.length; 11769 if (strLength >= length || !nativeIsFinite(length)) { 11770 return string; 11771 } 11772 var mid = (length - strLength) / 2, 11773 leftLength = floor(mid), 11774 rightLength = ceil(mid); 11775 11776 chars = createPadding('', rightLength, chars); 11777 return chars.slice(0, leftLength) + string + chars; 11778 } 11779 11780 /** 11781 * Pads `string` on the left side if it is shorter than `length`. Padding 11782 * characters are truncated if they exceed `length`. 11783 * 11784 * @static 11785 * @memberOf _ 11786 * @category String 11787 * @param {string} [string=''] The string to pad. 11788 * @param {number} [length=0] The padding length. 11789 * @param {string} [chars=' '] The string used as padding. 11790 * @returns {string} Returns the padded string. 11791 * @example 11792 * 11793 * _.padLeft('abc', 6); 11794 * // => ' abc' 11795 * 11796 * _.padLeft('abc', 6, '_-'); 11797 * // => '_-_abc' 11798 * 11799 * _.padLeft('abc', 3); 11800 * // => 'abc' 11801 */ 11802 var padLeft = createPadDir(); 11803 11804 /** 11805 * Pads `string` on the right side if it is shorter than `length`. Padding 11806 * characters are truncated if they exceed `length`. 11807 * 11808 * @static 11809 * @memberOf _ 11810 * @category String 11811 * @param {string} [string=''] The string to pad. 11812 * @param {number} [length=0] The padding length. 11813 * @param {string} [chars=' '] The string used as padding. 11814 * @returns {string} Returns the padded string. 11815 * @example 11816 * 11817 * _.padRight('abc', 6); 11818 * // => 'abc ' 11819 * 11820 * _.padRight('abc', 6, '_-'); 11821 * // => 'abc_-_' 11822 * 11823 * _.padRight('abc', 3); 11824 * // => 'abc' 11825 */ 11826 var padRight = createPadDir(true); 11827 11828 /** 11829 * Converts `string` to an integer of the specified radix. If `radix` is 11830 * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal, 11831 * in which case a `radix` of `16` is used. 11832 * 11833 * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E) 11834 * of `parseInt`. 11835 * 11836 * @static 11837 * @memberOf _ 11838 * @category String 11839 * @param {string} string The string to convert. 11840 * @param {number} [radix] The radix to interpret `value` by. 11841 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 11842 * @returns {number} Returns the converted integer. 11843 * @example 11844 * 11845 * _.parseInt('08'); 11846 * // => 8 11847 * 11848 * _.map(['6', '08', '10'], _.parseInt); 11849 * // => [6, 8, 10] 11850 */ 11851 function parseInt(string, radix, guard) { 11852 if (guard && isIterateeCall(string, radix, guard)) { 11853 radix = 0; 11854 } 11855 return nativeParseInt(string, radix); 11856 } 11857 // Fallback for environments with pre-ES5 implementations. 11858 if (nativeParseInt(whitespace + '08') != 8) { 11859 parseInt = function(string, radix, guard) { 11860 // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`. 11861 // Chrome fails to trim leading <BOM> whitespace characters. 11862 // See https://code.google.com/p/v8/issues/detail?id=3109 for more details. 11863 if (guard ? isIterateeCall(string, radix, guard) : radix == null) { 11864 radix = 0; 11865 } else if (radix) { 11866 radix = +radix; 11867 } 11868 string = trim(string); 11869 return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10)); 11870 }; 11871 } 11872 11873 /** 11874 * Repeats the given string `n` times. 11875 * 11876 * @static 11877 * @memberOf _ 11878 * @category String 11879 * @param {string} [string=''] The string to repeat. 11880 * @param {number} [n=0] The number of times to repeat the string. 11881 * @returns {string} Returns the repeated string. 11882 * @example 11883 * 11884 * _.repeat('*', 3); 11885 * // => '***' 11886 * 11887 * _.repeat('abc', 2); 11888 * // => 'abcabc' 11889 * 11890 * _.repeat('abc', 0); 11891 * // => '' 11892 */ 11893 function repeat(string, n) { 11894 var result = ''; 11895 string = baseToString(string); 11896 n = +n; 11897 if (n < 1 || !string || !nativeIsFinite(n)) { 11898 return result; 11899 } 11900 // Leverage the exponentiation by squaring algorithm for a faster repeat. 11901 // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. 11902 do { 11903 if (n % 2) { 11904 result += string; 11905 } 11906 n = floor(n / 2); 11907 string += string; 11908 } while (n); 11909 11910 return result; 11911 } 11912 11913 /** 11914 * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case). 11915 * 11916 * @static 11917 * @memberOf _ 11918 * @category String 11919 * @param {string} [string=''] The string to convert. 11920 * @returns {string} Returns the snake cased string. 11921 * @example 11922 * 11923 * _.snakeCase('Foo Bar'); 11924 * // => 'foo_bar' 11925 * 11926 * _.snakeCase('fooBar'); 11927 * // => 'foo_bar' 11928 * 11929 * _.snakeCase('--foo-bar'); 11930 * // => 'foo_bar' 11931 */ 11932 var snakeCase = createCompounder(function(result, word, index) { 11933 return result + (index ? '_' : '') + word.toLowerCase(); 11934 }); 11935 11936 /** 11937 * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). 11938 * 11939 * @static 11940 * @memberOf _ 11941 * @category String 11942 * @param {string} [string=''] The string to convert. 11943 * @returns {string} Returns the start cased string. 11944 * @example 11945 * 11946 * _.startCase('--foo-bar'); 11947 * // => 'Foo Bar' 11948 * 11949 * _.startCase('fooBar'); 11950 * // => 'Foo Bar' 11951 * 11952 * _.startCase('__foo_bar__'); 11953 * // => 'Foo Bar' 11954 */ 11955 var startCase = createCompounder(function(result, word, index) { 11956 return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1)); 11957 }); 11958 11959 /** 11960 * Checks if `string` starts with the given target string. 11961 * 11962 * @static 11963 * @memberOf _ 11964 * @category String 11965 * @param {string} [string=''] The string to search. 11966 * @param {string} [target] The string to search for. 11967 * @param {number} [position=0] The position to search from. 11968 * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`. 11969 * @example 11970 * 11971 * _.startsWith('abc', 'a'); 11972 * // => true 11973 * 11974 * _.startsWith('abc', 'b'); 11975 * // => false 11976 * 11977 * _.startsWith('abc', 'b', 1); 11978 * // => true 11979 */ 11980 function startsWith(string, target, position) { 11981 string = baseToString(string); 11982 position = position == null 11983 ? 0 11984 : nativeMin(position < 0 ? 0 : (+position || 0), string.length); 11985 11986 return string.lastIndexOf(target, position) == position; 11987 } 11988 11989 /** 11990 * Creates a compiled template function that can interpolate data properties 11991 * in "interpolate" delimiters, HTML-escape interpolated data properties in 11992 * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data 11993 * properties may be accessed as free variables in the template. If a setting 11994 * object is provided it takes precedence over `_.templateSettings` values. 11995 * 11996 * **Note:** In the development build `_.template` utilizes 11997 * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) 11998 * for easier debugging. 11999 * 12000 * For more information on precompiling templates see 12001 * [lodash's custom builds documentation](https://lodash.com/custom-builds). 12002 * 12003 * For more information on Chrome extension sandboxes see 12004 * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). 12005 * 12006 * @static 12007 * @memberOf _ 12008 * @category String 12009 * @param {string} [string=''] The template string. 12010 * @param {Object} [options] The options object. 12011 * @param {RegExp} [options.escape] The HTML "escape" delimiter. 12012 * @param {RegExp} [options.evaluate] The "evaluate" delimiter. 12013 * @param {Object} [options.imports] An object to import into the template as free variables. 12014 * @param {RegExp} [options.interpolate] The "interpolate" delimiter. 12015 * @param {string} [options.sourceURL] The sourceURL of the template's compiled source. 12016 * @param {string} [options.variable] The data object variable name. 12017 * @param- {Object} [otherOptions] Enables the legacy `options` param signature. 12018 * @returns {Function} Returns the compiled template function. 12019 * @example 12020 * 12021 * // using the "interpolate" delimiter to create a compiled template 12022 * var compiled = _.template('hello <%= user %>!'); 12023 * compiled({ 'user': 'fred' }); 12024 * // => 'hello fred!' 12025 * 12026 * // using the HTML "escape" delimiter to escape data property values 12027 * var compiled = _.template('<b><%- value %></b>'); 12028 * compiled({ 'value': '<script>' }); 12029 * // => '<b><script></b>' 12030 * 12031 * // using the "evaluate" delimiter to execute JavaScript and generate HTML 12032 * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>'); 12033 * compiled({ 'users': ['fred', 'barney'] }); 12034 * // => '<li>fred</li><li>barney</li>' 12035 * 12036 * // using the internal `print` function in "evaluate" delimiters 12037 * var compiled = _.template('<% print("hello " + user); %>!'); 12038 * compiled({ 'user': 'barney' }); 12039 * // => 'hello barney!' 12040 * 12041 * // using the ES delimiter as an alternative to the default "interpolate" delimiter 12042 * var compiled = _.template('hello ${ user }!'); 12043 * compiled({ 'user': 'pebbles' }); 12044 * // => 'hello pebbles!' 12045 * 12046 * // using custom template delimiters 12047 * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; 12048 * var compiled = _.template('hello {{ user }}!'); 12049 * compiled({ 'user': 'mustache' }); 12050 * // => 'hello mustache!' 12051 * 12052 * // using backslashes to treat delimiters as plain text 12053 * var compiled = _.template('<%= "\\<%- value %\\>" %>'); 12054 * compiled({ 'value': 'ignored' }); 12055 * // => '<%- value %>' 12056 * 12057 * // using the `imports` option to import `jQuery` as `jq` 12058 * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>'; 12059 * var compiled = _.template(text, { 'imports': { 'jq': jQuery } }); 12060 * compiled({ 'users': ['fred', 'barney'] }); 12061 * // => '<li>fred</li><li>barney</li>' 12062 * 12063 * // using the `sourceURL` option to specify a custom sourceURL for the template 12064 * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' }); 12065 * compiled(data); 12066 * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector 12067 * 12068 * // using the `variable` option to ensure a with-statement isn't used in the compiled template 12069 * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' }); 12070 * compiled.source; 12071 * // => function(data) { 12072 * // var __t, __p = ''; 12073 * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!'; 12074 * // return __p; 12075 * // } 12076 * 12077 * // using the `source` property to inline compiled templates for meaningful 12078 * // line numbers in error messages and a stack trace 12079 * fs.writeFileSync(path.join(cwd, 'jst.js'), '\ 12080 * var JST = {\ 12081 * "main": ' + _.template(mainText).source + '\ 12082 * };\ 12083 * '); 12084 */ 12085 function template(string, options, otherOptions) { 12086 // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/) 12087 // and Laura Doktorova's doT.js (https://github.com/olado/doT). 12088 var settings = lodash.templateSettings; 12089 12090 if (otherOptions && isIterateeCall(string, options, otherOptions)) { 12091 options = otherOptions = null; 12092 } 12093 string = baseToString(string); 12094 options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults); 12095 12096 var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults), 12097 importsKeys = keys(imports), 12098 importsValues = baseValues(imports, importsKeys); 12099 12100 var isEscaping, 12101 isEvaluating, 12102 index = 0, 12103 interpolate = options.interpolate || reNoMatch, 12104 source = "__p += '"; 12105 12106 // Compile the regexp to match each delimiter. 12107 var reDelimiters = RegExp( 12108 (options.escape || reNoMatch).source + '|' + 12109 interpolate.source + '|' + 12110 (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' + 12111 (options.evaluate || reNoMatch).source + '|$' 12112 , 'g'); 12113 12114 // Use a sourceURL for easier debugging. 12115 var sourceURL = '//# sourceURL=' + 12116 ('sourceURL' in options 12117 ? options.sourceURL 12118 : ('lodash.templateSources[' + (++templateCounter) + ']') 12119 ) + '\n'; 12120 12121 string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) { 12122 interpolateValue || (interpolateValue = esTemplateValue); 12123 12124 // Escape characters that can't be included in string literals. 12125 source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar); 12126 12127 // Replace delimiters with snippets. 12128 if (escapeValue) { 12129 isEscaping = true; 12130 source += "' +\n__e(" + escapeValue + ") +\n'"; 12131 } 12132 if (evaluateValue) { 12133 isEvaluating = true; 12134 source += "';\n" + evaluateValue + ";\n__p += '"; 12135 } 12136 if (interpolateValue) { 12137 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; 12138 } 12139 index = offset + match.length; 12140 12141 // The JS engine embedded in Adobe products requires returning the `match` 12142 // string in order to produce the correct `offset` value. 12143 return match; 12144 }); 12145 12146 source += "';\n"; 12147 12148 // If `variable` is not specified wrap a with-statement around the generated 12149 // code to add the data object to the top of the scope chain. 12150 var variable = options.variable; 12151 if (!variable) { 12152 source = 'with (obj) {\n' + source + '\n}\n'; 12153 } 12154 // Cleanup code by stripping empty strings. 12155 source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source) 12156 .replace(reEmptyStringMiddle, '$1') 12157 .replace(reEmptyStringTrailing, '$1;'); 12158 12159 // Frame code as the function body. 12160 source = 'function(' + (variable || 'obj') + ') {\n' + 12161 (variable 12162 ? '' 12163 : 'obj || (obj = {});\n' 12164 ) + 12165 "var __t, __p = ''" + 12166 (isEscaping 12167 ? ', __e = _.escape' 12168 : '' 12169 ) + 12170 (isEvaluating 12171 ? ', __j = Array.prototype.join;\n' + 12172 "function print() { __p += __j.call(arguments, '') }\n" 12173 : ';\n' 12174 ) + 12175 source + 12176 'return __p\n}'; 12177 12178 var result = attempt(function() { 12179 return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues); 12180 }); 12181 12182 // Provide the compiled function's source by its `toString` method or 12183 // the `source` property as a convenience for inlining compiled templates. 12184 result.source = source; 12185 if (isError(result)) { 12186 throw result; 12187 } 12188 return result; 12189 } 12190 12191 /** 12192 * Removes leading and trailing whitespace or specified characters from `string`. 12193 * 12194 * @static 12195 * @memberOf _ 12196 * @category String 12197 * @param {string} [string=''] The string to trim. 12198 * @param {string} [chars=whitespace] The characters to trim. 12199 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 12200 * @returns {string} Returns the trimmed string. 12201 * @example 12202 * 12203 * _.trim(' abc '); 12204 * // => 'abc' 12205 * 12206 * _.trim('-_-abc-_-', '_-'); 12207 * // => 'abc' 12208 * 12209 * _.map([' foo ', ' bar '], _.trim); 12210 * // => ['foo', 'bar'] 12211 */ 12212 function trim(string, chars, guard) { 12213 var value = string; 12214 string = baseToString(string); 12215 if (!string) { 12216 return string; 12217 } 12218 if (guard ? isIterateeCall(value, chars, guard) : chars == null) { 12219 return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1); 12220 } 12221 chars = (chars + ''); 12222 return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1); 12223 } 12224 12225 /** 12226 * Removes leading whitespace or specified characters from `string`. 12227 * 12228 * @static 12229 * @memberOf _ 12230 * @category String 12231 * @param {string} [string=''] The string to trim. 12232 * @param {string} [chars=whitespace] The characters to trim. 12233 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 12234 * @returns {string} Returns the trimmed string. 12235 * @example 12236 * 12237 * _.trimLeft(' abc '); 12238 * // => 'abc ' 12239 * 12240 * _.trimLeft('-_-abc-_-', '_-'); 12241 * // => 'abc-_-' 12242 */ 12243 function trimLeft(string, chars, guard) { 12244 var value = string; 12245 string = baseToString(string); 12246 if (!string) { 12247 return string; 12248 } 12249 if (guard ? isIterateeCall(value, chars, guard) : chars == null) { 12250 return string.slice(trimmedLeftIndex(string)); 12251 } 12252 return string.slice(charsLeftIndex(string, (chars + ''))); 12253 } 12254 12255 /** 12256 * Removes trailing whitespace or specified characters from `string`. 12257 * 12258 * @static 12259 * @memberOf _ 12260 * @category String 12261 * @param {string} [string=''] The string to trim. 12262 * @param {string} [chars=whitespace] The characters to trim. 12263 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 12264 * @returns {string} Returns the trimmed string. 12265 * @example 12266 * 12267 * _.trimRight(' abc '); 12268 * // => ' abc' 12269 * 12270 * _.trimRight('-_-abc-_-', '_-'); 12271 * // => '-_-abc' 12272 */ 12273 function trimRight(string, chars, guard) { 12274 var value = string; 12275 string = baseToString(string); 12276 if (!string) { 12277 return string; 12278 } 12279 if (guard ? isIterateeCall(value, chars, guard) : chars == null) { 12280 return string.slice(0, trimmedRightIndex(string) + 1); 12281 } 12282 return string.slice(0, charsRightIndex(string, (chars + '')) + 1); 12283 } 12284 12285 /** 12286 * Truncates `string` if it is longer than the given maximum string length. 12287 * The last characters of the truncated string are replaced with the omission 12288 * string which defaults to "...". 12289 * 12290 * @static 12291 * @memberOf _ 12292 * @category String 12293 * @param {string} [string=''] The string to truncate. 12294 * @param {Object|number} [options] The options object or maximum string length. 12295 * @param {number} [options.length=30] The maximum string length. 12296 * @param {string} [options.omission='...'] The string to indicate text is omitted. 12297 * @param {RegExp|string} [options.separator] The separator pattern to truncate to. 12298 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 12299 * @returns {string} Returns the truncated string. 12300 * @example 12301 * 12302 * _.trunc('hi-diddly-ho there, neighborino'); 12303 * // => 'hi-diddly-ho there, neighbo...' 12304 * 12305 * _.trunc('hi-diddly-ho there, neighborino', 24); 12306 * // => 'hi-diddly-ho there, n...' 12307 * 12308 * _.trunc('hi-diddly-ho there, neighborino', { 12309 * 'length': 24, 12310 * 'separator': ' ' 12311 * }); 12312 * // => 'hi-diddly-ho there,...' 12313 * 12314 * _.trunc('hi-diddly-ho there, neighborino', { 12315 * 'length': 24, 12316 * 'separator': /,? +/ 12317 * }); 12318 * // => 'hi-diddly-ho there...' 12319 * 12320 * _.trunc('hi-diddly-ho there, neighborino', { 12321 * 'omission': ' [...]' 12322 * }); 12323 * // => 'hi-diddly-ho there, neig [...]' 12324 */ 12325 function trunc(string, options, guard) { 12326 if (guard && isIterateeCall(string, options, guard)) { 12327 options = null; 12328 } 12329 var length = DEFAULT_TRUNC_LENGTH, 12330 omission = DEFAULT_TRUNC_OMISSION; 12331 12332 if (options != null) { 12333 if (isObject(options)) { 12334 var separator = 'separator' in options ? options.separator : separator; 12335 length = 'length' in options ? (+options.length || 0) : length; 12336 omission = 'omission' in options ? baseToString(options.omission) : omission; 12337 } else { 12338 length = +options || 0; 12339 } 12340 } 12341 string = baseToString(string); 12342 if (length >= string.length) { 12343 return string; 12344 } 12345 var end = length - omission.length; 12346 if (end < 1) { 12347 return omission; 12348 } 12349 var result = string.slice(0, end); 12350 if (separator == null) { 12351 return result + omission; 12352 } 12353 if (isRegExp(separator)) { 12354 if (string.slice(end).search(separator)) { 12355 var match, 12356 newEnd, 12357 substring = string.slice(0, end); 12358 12359 if (!separator.global) { 12360 separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g'); 12361 } 12362 separator.lastIndex = 0; 12363 while ((match = separator.exec(substring))) { 12364 newEnd = match.index; 12365 } 12366 result = result.slice(0, newEnd == null ? end : newEnd); 12367 } 12368 } else if (string.indexOf(separator, end) != end) { 12369 var index = result.lastIndexOf(separator); 12370 if (index > -1) { 12371 result = result.slice(0, index); 12372 } 12373 } 12374 return result + omission; 12375 } 12376 12377 /** 12378 * The inverse of `_.escape`; this method converts the HTML entities 12379 * `&`, `<`, `>`, `"`, `'`, and ``` in `string` to their 12380 * corresponding characters. 12381 * 12382 * **Note:** No other HTML entities are unescaped. To unescape additional HTML 12383 * entities use a third-party library like [_he_](https://mths.be/he). 12384 * 12385 * @static 12386 * @memberOf _ 12387 * @category String 12388 * @param {string} [string=''] The string to unescape. 12389 * @returns {string} Returns the unescaped string. 12390 * @example 12391 * 12392 * _.unescape('fred, barney, & pebbles'); 12393 * // => 'fred, barney, & pebbles' 12394 */ 12395 function unescape(string) { 12396 string = baseToString(string); 12397 return (string && reHasEscapedHtml.test(string)) 12398 ? string.replace(reEscapedHtml, unescapeHtmlChar) 12399 : string; 12400 } 12401 12402 /** 12403 * Splits `string` into an array of its words. 12404 * 12405 * @static 12406 * @memberOf _ 12407 * @category String 12408 * @param {string} [string=''] The string to inspect. 12409 * @param {RegExp|string} [pattern] The pattern to match words. 12410 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 12411 * @returns {Array} Returns the words of `string`. 12412 * @example 12413 * 12414 * _.words('fred, barney, & pebbles'); 12415 * // => ['fred', 'barney', 'pebbles'] 12416 * 12417 * _.words('fred, barney, & pebbles', /[^, ]+/g); 12418 * // => ['fred', 'barney', '&', 'pebbles'] 12419 */ 12420 function words(string, pattern, guard) { 12421 if (guard && isIterateeCall(string, pattern, guard)) { 12422 pattern = null; 12423 } 12424 string = baseToString(string); 12425 return string.match(pattern || reWords) || []; 12426 } 12427 12428 /*------------------------------------------------------------------------*/ 12429 12430 /** 12431 * Attempts to invoke `func`, returning either the result or the caught error 12432 * object. Any additional arguments are provided to `func` when it is invoked. 12433 * 12434 * @static 12435 * @memberOf _ 12436 * @category Utility 12437 * @param {Function} func The function to attempt. 12438 * @returns {*} Returns the `func` result or error object. 12439 * @example 12440 * 12441 * // avoid throwing errors for invalid selectors 12442 * var elements = _.attempt(function(selector) { 12443 * return document.querySelectorAll(selector); 12444 * }, '>_>'); 12445 * 12446 * if (_.isError(elements)) { 12447 * elements = []; 12448 * } 12449 */ 12450 var attempt = restParam(function(func, args) { 12451 try { 12452 return func.apply(undefined, args); 12453 } catch(e) { 12454 return isError(e) ? e : new Error(e); 12455 } 12456 }); 12457 12458 /** 12459 * Creates a function that invokes `func` with the `this` binding of `thisArg` 12460 * and arguments of the created function. If `func` is a property name the 12461 * created callback returns the property value for a given element. If `func` 12462 * is an object the created callback returns `true` for elements that contain 12463 * the equivalent object properties, otherwise it returns `false`. 12464 * 12465 * @static 12466 * @memberOf _ 12467 * @alias iteratee 12468 * @category Utility 12469 * @param {*} [func=_.identity] The value to convert to a callback. 12470 * @param {*} [thisArg] The `this` binding of `func`. 12471 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. 12472 * @returns {Function} Returns the callback. 12473 * @example 12474 * 12475 * var users = [ 12476 * { 'user': 'barney', 'age': 36 }, 12477 * { 'user': 'fred', 'age': 40 } 12478 * ]; 12479 * 12480 * // wrap to create custom callback shorthands 12481 * _.callback = _.wrap(_.callback, function(callback, func, thisArg) { 12482 * var match = /^(.+?)__([gl]t)(.+)$/.exec(func); 12483 * if (!match) { 12484 * return callback(func, thisArg); 12485 * } 12486 * return function(object) { 12487 * return match[2] == 'gt' 12488 * ? object[match[1]] > match[3] 12489 * : object[match[1]] < match[3]; 12490 * }; 12491 * }); 12492 * 12493 * _.filter(users, 'age__gt36'); 12494 * // => [{ 'user': 'fred', 'age': 40 }] 12495 */ 12496 function callback(func, thisArg, guard) { 12497 if (guard && isIterateeCall(func, thisArg, guard)) { 12498 thisArg = null; 12499 } 12500 return baseCallback(func, thisArg); 12501 } 12502 12503 /** 12504 * Creates a function that returns `value`. 12505 * 12506 * @static 12507 * @memberOf _ 12508 * @category Utility 12509 * @param {*} value The value to return from the new function. 12510 * @returns {Function} Returns the new function. 12511 * @example 12512 * 12513 * var object = { 'user': 'fred' }; 12514 * var getter = _.constant(object); 12515 * 12516 * getter() === object; 12517 * // => true 12518 */ 12519 function constant(value) { 12520 return function() { 12521 return value; 12522 }; 12523 } 12524 12525 /** 12526 * This method returns the first argument provided to it. 12527 * 12528 * @static 12529 * @memberOf _ 12530 * @category Utility 12531 * @param {*} value Any value. 12532 * @returns {*} Returns `value`. 12533 * @example 12534 * 12535 * var object = { 'user': 'fred' }; 12536 * 12537 * _.identity(object) === object; 12538 * // => true 12539 */ 12540 function identity(value) { 12541 return value; 12542 } 12543 12544 /** 12545 * Creates a function which performs a deep comparison between a given object 12546 * and `source`, returning `true` if the given object has equivalent property 12547 * values, else `false`. 12548 * 12549 * **Note:** This method supports comparing arrays, booleans, `Date` objects, 12550 * numbers, `Object` objects, regexes, and strings. Objects are compared by 12551 * their own, not inherited, enumerable properties. For comparing a single 12552 * own or inherited property value see `_.matchesProperty`. 12553 * 12554 * @static 12555 * @memberOf _ 12556 * @category Utility 12557 * @param {Object} source The object of property values to match. 12558 * @returns {Function} Returns the new function. 12559 * @example 12560 * 12561 * var users = [ 12562 * { 'user': 'barney', 'age': 36, 'active': true }, 12563 * { 'user': 'fred', 'age': 40, 'active': false } 12564 * ]; 12565 * 12566 * _.filter(users, _.matches({ 'age': 40, 'active': false })); 12567 * // => [{ 'user': 'fred', 'age': 40, 'active': false }] 12568 */ 12569 function matches(source) { 12570 return baseMatches(baseClone(source, true)); 12571 } 12572 12573 /** 12574 * Creates a function which compares the property value of `path` on a given 12575 * object to `value`. 12576 * 12577 * **Note:** This method supports comparing arrays, booleans, `Date` objects, 12578 * numbers, `Object` objects, regexes, and strings. Objects are compared by 12579 * their own, not inherited, enumerable properties. 12580 * 12581 * @static 12582 * @memberOf _ 12583 * @category Utility 12584 * @param {Array|string} path The path of the property to get. 12585 * @param {*} value The value to compare. 12586 * @returns {Function} Returns the new function. 12587 * @example 12588 * 12589 * var users = [ 12590 * { 'user': 'barney' }, 12591 * { 'user': 'fred' } 12592 * ]; 12593 * 12594 * _.find(users, _.matchesProperty('user', 'fred')); 12595 * // => { 'user': 'fred' } 12596 */ 12597 function matchesProperty(path, value) { 12598 return baseMatchesProperty(path, baseClone(value, true)); 12599 } 12600 12601 /** 12602 * Creates a function which invokes the method at `path` on a given object. 12603 * 12604 * @static 12605 * @memberOf _ 12606 * @category Utility 12607 * @param {Array|string} path The path of the method to invoke. 12608 * @returns {Function} Returns the new function. 12609 * @example 12610 * 12611 * var objects = [ 12612 * { 'a': { 'b': { 'c': _.constant(2) } } }, 12613 * { 'a': { 'b': { 'c': _.constant(1) } } } 12614 * ]; 12615 * 12616 * _.map(objects, _.method('a.b.c')); 12617 * // => [2, 1] 12618 * 12619 * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c'); 12620 * // => [1, 2] 12621 */ 12622 var method = restParam(function(path, args) { 12623 return function(object) { 12624 return invokePath(object, path, args); 12625 } 12626 }); 12627 12628 /** 12629 * The opposite of `_.method`; this method creates a function which invokes 12630 * the method at a given path on `object`. 12631 * 12632 * @static 12633 * @memberOf _ 12634 * @category Utility 12635 * @param {Object} object The object to query. 12636 * @returns {Function} Returns the new function. 12637 * @example 12638 * 12639 * var array = _.times(3, _.constant), 12640 * object = { 'a': array, 'b': array, 'c': array }; 12641 * 12642 * _.map(['a[2]', 'c[0]'], _.methodOf(object)); 12643 * // => [2, 0] 12644 * 12645 * _.map([['a', '2'], ['c', '0']], _.methodOf(object)); 12646 * // => [2, 0] 12647 */ 12648 var methodOf = restParam(function(object, args) { 12649 return function(path) { 12650 return invokePath(object, path, args); 12651 }; 12652 }); 12653 12654 /** 12655 * Adds all own enumerable function properties of a source object to the 12656 * destination object. If `object` is a function then methods are added to 12657 * its prototype as well. 12658 * 12659 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to 12660 * avoid conflicts caused by modifying the original. 12661 * 12662 * @static 12663 * @memberOf _ 12664 * @category Utility 12665 * @param {Function|Object} [object=lodash] The destination object. 12666 * @param {Object} source The object of functions to add. 12667 * @param {Object} [options] The options object. 12668 * @param {boolean} [options.chain=true] Specify whether the functions added 12669 * are chainable. 12670 * @returns {Function|Object} Returns `object`. 12671 * @example 12672 * 12673 * function vowels(string) { 12674 * return _.filter(string, function(v) { 12675 * return /[aeiou]/i.test(v); 12676 * }); 12677 * } 12678 * 12679 * // use `_.runInContext` to avoid conflicts (esp. in Node.js) 12680 * var _ = require('lodash').runInContext(); 12681 * 12682 * _.mixin({ 'vowels': vowels }); 12683 * _.vowels('fred'); 12684 * // => ['e'] 12685 * 12686 * _('fred').vowels().value(); 12687 * // => ['e'] 12688 * 12689 * _.mixin({ 'vowels': vowels }, { 'chain': false }); 12690 * _('fred').vowels(); 12691 * // => ['e'] 12692 */ 12693 function mixin(object, source, options) { 12694 if (options == null) { 12695 var isObj = isObject(source), 12696 props = isObj && keys(source), 12697 methodNames = props && props.length && baseFunctions(source, props); 12698 12699 if (!(methodNames ? methodNames.length : isObj)) { 12700 methodNames = false; 12701 options = source; 12702 source = object; 12703 object = this; 12704 } 12705 } 12706 if (!methodNames) { 12707 methodNames = baseFunctions(source, keys(source)); 12708 } 12709 var chain = true, 12710 index = -1, 12711 isFunc = isFunction(object), 12712 length = methodNames.length; 12713 12714 if (options === false) { 12715 chain = false; 12716 } else if (isObject(options) && 'chain' in options) { 12717 chain = options.chain; 12718 } 12719 while (++index < length) { 12720 var methodName = methodNames[index], 12721 func = source[methodName]; 12722 12723 object[methodName] = func; 12724 if (isFunc) { 12725 object.prototype[methodName] = (function(func) { 12726 return function() { 12727 var chainAll = this.__chain__; 12728 if (chain || chainAll) { 12729 var result = object(this.__wrapped__), 12730 actions = result.__actions__ = arrayCopy(this.__actions__); 12731 12732 actions.push({ 'func': func, 'args': arguments, 'thisArg': object }); 12733 result.__chain__ = chainAll; 12734 return result; 12735 } 12736 var args = [this.value()]; 12737 push.apply(args, arguments); 12738 return func.apply(object, args); 12739 }; 12740 }(func)); 12741 } 12742 } 12743 return object; 12744 } 12745 12746 /** 12747 * Reverts the `_` variable to its previous value and returns a reference to 12748 * the `lodash` function. 12749 * 12750 * @static 12751 * @memberOf _ 12752 * @category Utility 12753 * @returns {Function} Returns the `lodash` function. 12754 * @example 12755 * 12756 * var lodash = _.noConflict(); 12757 */ 12758 function noConflict() { 12759 context._ = oldDash; 12760 return this; 12761 } 12762 12763 /** 12764 * A no-operation function which returns `undefined` regardless of the 12765 * arguments it receives. 12766 * 12767 * @static 12768 * @memberOf _ 12769 * @category Utility 12770 * @example 12771 * 12772 * var object = { 'user': 'fred' }; 12773 * 12774 * _.noop(object) === undefined; 12775 * // => true 12776 */ 12777 function noop() { 12778 // No operation performed. 12779 } 12780 12781 /** 12782 * Creates a function which returns the property value at `path` on a 12783 * given object. 12784 * 12785 * @static 12786 * @memberOf _ 12787 * @category Utility 12788 * @param {Array|string} path The path of the property to get. 12789 * @returns {Function} Returns the new function. 12790 * @example 12791 * 12792 * var objects = [ 12793 * { 'a': { 'b': { 'c': 2 } } }, 12794 * { 'a': { 'b': { 'c': 1 } } } 12795 * ]; 12796 * 12797 * _.map(objects, _.property('a.b.c')); 12798 * // => [2, 1] 12799 * 12800 * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); 12801 * // => [1, 2] 12802 */ 12803 function property(path) { 12804 return isKey(path) ? baseProperty(path) : basePropertyDeep(path); 12805 } 12806 12807 /** 12808 * The opposite of `_.property`; this method creates a function which returns 12809 * the property value at a given path on `object`. 12810 * 12811 * @static 12812 * @memberOf _ 12813 * @category Utility 12814 * @param {Object} object The object to query. 12815 * @returns {Function} Returns the new function. 12816 * @example 12817 * 12818 * var array = [0, 1, 2], 12819 * object = { 'a': array, 'b': array, 'c': array }; 12820 * 12821 * _.map(['a[2]', 'c[0]'], _.propertyOf(object)); 12822 * // => [2, 0] 12823 * 12824 * _.map([['a', '2'], ['c', '0']], _.propertyOf(object)); 12825 * // => [2, 0] 12826 */ 12827 function propertyOf(object) { 12828 return function(path) { 12829 return baseGet(object, toPath(path), path + ''); 12830 }; 12831 } 12832 12833 /** 12834 * Creates an array of numbers (positive and/or negative) progressing from 12835 * `start` up to, but not including, `end`. If `end` is not specified it is 12836 * set to `start` with `start` then set to `0`. If `end` is less than `start` 12837 * a zero-length range is created unless a negative `step` is specified. 12838 * 12839 * @static 12840 * @memberOf _ 12841 * @category Utility 12842 * @param {number} [start=0] The start of the range. 12843 * @param {number} end The end of the range. 12844 * @param {number} [step=1] The value to increment or decrement by. 12845 * @returns {Array} Returns the new array of numbers. 12846 * @example 12847 * 12848 * _.range(4); 12849 * // => [0, 1, 2, 3] 12850 * 12851 * _.range(1, 5); 12852 * // => [1, 2, 3, 4] 12853 * 12854 * _.range(0, 20, 5); 12855 * // => [0, 5, 10, 15] 12856 * 12857 * _.range(0, -4, -1); 12858 * // => [0, -1, -2, -3] 12859 * 12860 * _.range(1, 4, 0); 12861 * // => [1, 1, 1] 12862 * 12863 * _.range(0); 12864 * // => [] 12865 */ 12866 function range(start, end, step) { 12867 if (step && isIterateeCall(start, end, step)) { 12868 end = step = null; 12869 } 12870 start = +start || 0; 12871 step = step == null ? 1 : (+step || 0); 12872 12873 if (end == null) { 12874 end = start; 12875 start = 0; 12876 } else { 12877 end = +end || 0; 12878 } 12879 // Use `Array(length)` so engines like Chakra and V8 avoid slower modes. 12880 // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details. 12881 var index = -1, 12882 length = nativeMax(ceil((end - start) / (step || 1)), 0), 12883 result = Array(length); 12884 12885 while (++index < length) { 12886 result[index] = start; 12887 start += step; 12888 } 12889 return result; 12890 } 12891 12892 /** 12893 * Invokes the iteratee function `n` times, returning an array of the results 12894 * of each invocation. The `iteratee` is bound to `thisArg` and invoked with 12895 * one argument; (index). 12896 * 12897 * @static 12898 * @memberOf _ 12899 * @category Utility 12900 * @param {number} n The number of times to invoke `iteratee`. 12901 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 12902 * @param {*} [thisArg] The `this` binding of `iteratee`. 12903 * @returns {Array} Returns the array of results. 12904 * @example 12905 * 12906 * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false)); 12907 * // => [3, 6, 4] 12908 * 12909 * _.times(3, function(n) { 12910 * mage.castSpell(n); 12911 * }); 12912 * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` 12913 * 12914 * _.times(3, function(n) { 12915 * this.cast(n); 12916 * }, mage); 12917 * // => also invokes `mage.castSpell(n)` three times 12918 */ 12919 function times(n, iteratee, thisArg) { 12920 n = floor(n); 12921 12922 // Exit early to avoid a JSC JIT bug in Safari 8 12923 // where `Array(0)` is treated as `Array(1)`. 12924 if (n < 1 || !nativeIsFinite(n)) { 12925 return []; 12926 } 12927 var index = -1, 12928 result = Array(nativeMin(n, MAX_ARRAY_LENGTH)); 12929 12930 iteratee = bindCallback(iteratee, thisArg, 1); 12931 while (++index < n) { 12932 if (index < MAX_ARRAY_LENGTH) { 12933 result[index] = iteratee(index); 12934 } else { 12935 iteratee(index); 12936 } 12937 } 12938 return result; 12939 } 12940 12941 /** 12942 * Generates a unique ID. If `prefix` is provided the ID is appended to it. 12943 * 12944 * @static 12945 * @memberOf _ 12946 * @category Utility 12947 * @param {string} [prefix] The value to prefix the ID with. 12948 * @returns {string} Returns the unique ID. 12949 * @example 12950 * 12951 * _.uniqueId('contact_'); 12952 * // => 'contact_104' 12953 * 12954 * _.uniqueId(); 12955 * // => '105' 12956 */ 12957 function uniqueId(prefix) { 12958 var id = ++idCounter; 12959 return baseToString(prefix) + id; 12960 } 12961 12962 /*------------------------------------------------------------------------*/ 12963 12964 /** 12965 * Adds two numbers. 12966 * 12967 * @static 12968 * @memberOf _ 12969 * @category Math 12970 * @param {number} augend The first number to add. 12971 * @param {number} addend The second number to add. 12972 * @returns {number} Returns the sum. 12973 * @example 12974 * 12975 * _.add(6, 4); 12976 * // => 10 12977 */ 12978 function add(augend, addend) { 12979 return (+augend || 0) + (+addend || 0); 12980 } 12981 12982 /** 12983 * Gets the maximum value of `collection`. If `collection` is empty or falsey 12984 * `-Infinity` is returned. If an iteratee function is provided it is invoked 12985 * for each value in `collection` to generate the criterion by which the value 12986 * is ranked. The `iteratee` is bound to `thisArg` and invoked with three 12987 * arguments: (value, index, collection). 12988 * 12989 * If a property name is provided for `iteratee` the created `_.property` 12990 * style callback returns the property value of the given element. 12991 * 12992 * If a value is also provided for `thisArg` the created `_.matchesProperty` 12993 * style callback returns `true` for elements that have a matching property 12994 * value, else `false`. 12995 * 12996 * If an object is provided for `iteratee` the created `_.matches` style 12997 * callback returns `true` for elements that have the properties of the given 12998 * object, else `false`. 12999 * 13000 * @static 13001 * @memberOf _ 13002 * @category Math 13003 * @param {Array|Object|string} collection The collection to iterate over. 13004 * @param {Function|Object|string} [iteratee] The function invoked per iteration. 13005 * @param {*} [thisArg] The `this` binding of `iteratee`. 13006 * @returns {*} Returns the maximum value. 13007 * @example 13008 * 13009 * _.max([4, 2, 8, 6]); 13010 * // => 8 13011 * 13012 * _.max([]); 13013 * // => -Infinity 13014 * 13015 * var users = [ 13016 * { 'user': 'barney', 'age': 36 }, 13017 * { 'user': 'fred', 'age': 40 } 13018 * ]; 13019 * 13020 * _.max(users, function(chr) { 13021 * return chr.age; 13022 * }); 13023 * // => { 'user': 'fred', 'age': 40 } 13024 * 13025 * // using the `_.property` callback shorthand 13026 * _.max(users, 'age'); 13027 * // => { 'user': 'fred', 'age': 40 } 13028 */ 13029 var max = createExtremum(arrayMax); 13030 13031 /** 13032 * Gets the minimum value of `collection`. If `collection` is empty or falsey 13033 * `Infinity` is returned. If an iteratee function is provided it is invoked 13034 * for each value in `collection` to generate the criterion by which the value 13035 * is ranked. The `iteratee` is bound to `thisArg` and invoked with three 13036 * arguments: (value, index, collection). 13037 * 13038 * If a property name is provided for `iteratee` the created `_.property` 13039 * style callback returns the property value of the given element. 13040 * 13041 * If a value is also provided for `thisArg` the created `_.matchesProperty` 13042 * style callback returns `true` for elements that have a matching property 13043 * value, else `false`. 13044 * 13045 * If an object is provided for `iteratee` the created `_.matches` style 13046 * callback returns `true` for elements that have the properties of the given 13047 * object, else `false`. 13048 * 13049 * @static 13050 * @memberOf _ 13051 * @category Math 13052 * @param {Array|Object|string} collection The collection to iterate over. 13053 * @param {Function|Object|string} [iteratee] The function invoked per iteration. 13054 * @param {*} [thisArg] The `this` binding of `iteratee`. 13055 * @returns {*} Returns the minimum value. 13056 * @example 13057 * 13058 * _.min([4, 2, 8, 6]); 13059 * // => 2 13060 * 13061 * _.min([]); 13062 * // => Infinity 13063 * 13064 * var users = [ 13065 * { 'user': 'barney', 'age': 36 }, 13066 * { 'user': 'fred', 'age': 40 } 13067 * ]; 13068 * 13069 * _.min(users, function(chr) { 13070 * return chr.age; 13071 * }); 13072 * // => { 'user': 'barney', 'age': 36 } 13073 * 13074 * // using the `_.property` callback shorthand 13075 * _.min(users, 'age'); 13076 * // => { 'user': 'barney', 'age': 36 } 13077 */ 13078 var min = createExtremum(arrayMin, true); 13079 13080 /** 13081 * Gets the sum of the values in `collection`. 13082 * 13083 * @static 13084 * @memberOf _ 13085 * @category Math 13086 * @param {Array|Object|string} collection The collection to iterate over. 13087 * @param {Function|Object|string} [iteratee] The function invoked per iteration. 13088 * @param {*} [thisArg] The `this` binding of `iteratee`. 13089 * @returns {number} Returns the sum. 13090 * @example 13091 * 13092 * _.sum([4, 6]); 13093 * // => 10 13094 * 13095 * _.sum({ 'a': 4, 'b': 6 }); 13096 * // => 10 13097 * 13098 * var objects = [ 13099 * { 'n': 4 }, 13100 * { 'n': 6 } 13101 * ]; 13102 * 13103 * _.sum(objects, function(object) { 13104 * return object.n; 13105 * }); 13106 * // => 10 13107 * 13108 * // using the `_.property` callback shorthand 13109 * _.sum(objects, 'n'); 13110 * // => 10 13111 */ 13112 function sum(collection, iteratee, thisArg) { 13113 if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { 13114 iteratee = null; 13115 } 13116 var func = getCallback(), 13117 noIteratee = iteratee == null; 13118 13119 if (!(func === baseCallback && noIteratee)) { 13120 noIteratee = false; 13121 iteratee = func(iteratee, thisArg, 3); 13122 } 13123 return noIteratee 13124 ? arraySum(isArray(collection) ? collection : toIterable(collection)) 13125 : baseSum(collection, iteratee); 13126 } 13127 13128 /*------------------------------------------------------------------------*/ 13129 13130 // Ensure wrappers are instances of `baseLodash`. 13131 lodash.prototype = baseLodash.prototype; 13132 13133 LodashWrapper.prototype = baseCreate(baseLodash.prototype); 13134 LodashWrapper.prototype.constructor = LodashWrapper; 13135 13136 LazyWrapper.prototype = baseCreate(baseLodash.prototype); 13137 LazyWrapper.prototype.constructor = LazyWrapper; 13138 13139 // Add functions to the `Map` cache. 13140 MapCache.prototype['delete'] = mapDelete; 13141 MapCache.prototype.get = mapGet; 13142 MapCache.prototype.has = mapHas; 13143 MapCache.prototype.set = mapSet; 13144 13145 // Add functions to the `Set` cache. 13146 SetCache.prototype.push = cachePush; 13147 13148 // Assign cache to `_.memoize`. 13149 memoize.Cache = MapCache; 13150 13151 // Add functions that return wrapped values when chaining. 13152 lodash.after = after; 13153 lodash.ary = ary; 13154 lodash.assign = assign; 13155 lodash.at = at; 13156 lodash.before = before; 13157 lodash.bind = bind; 13158 lodash.bindAll = bindAll; 13159 lodash.bindKey = bindKey; 13160 lodash.callback = callback; 13161 lodash.chain = chain; 13162 lodash.chunk = chunk; 13163 lodash.compact = compact; 13164 lodash.constant = constant; 13165 lodash.countBy = countBy; 13166 lodash.create = create; 13167 lodash.curry = curry; 13168 lodash.curryRight = curryRight; 13169 lodash.debounce = debounce; 13170 lodash.defaults = defaults; 13171 lodash.defer = defer; 13172 lodash.delay = delay; 13173 lodash.difference = difference; 13174 lodash.drop = drop; 13175 lodash.dropRight = dropRight; 13176 lodash.dropRightWhile = dropRightWhile; 13177 lodash.dropWhile = dropWhile; 13178 lodash.fill = fill; 13179 lodash.filter = filter; 13180 lodash.flatten = flatten; 13181 lodash.flattenDeep = flattenDeep; 13182 lodash.flow = flow; 13183 lodash.flowRight = flowRight; 13184 lodash.forEach = forEach; 13185 lodash.forEachRight = forEachRight; 13186 lodash.forIn = forIn; 13187 lodash.forInRight = forInRight; 13188 lodash.forOwn = forOwn; 13189 lodash.forOwnRight = forOwnRight; 13190 lodash.functions = functions; 13191 lodash.groupBy = groupBy; 13192 lodash.indexBy = indexBy; 13193 lodash.initial = initial; 13194 lodash.intersection = intersection; 13195 lodash.invert = invert; 13196 lodash.invoke = invoke; 13197 lodash.keys = keys; 13198 lodash.keysIn = keysIn; 13199 lodash.map = map; 13200 lodash.mapValues = mapValues; 13201 lodash.matches = matches; 13202 lodash.matchesProperty = matchesProperty; 13203 lodash.memoize = memoize; 13204 lodash.merge = merge; 13205 lodash.method = method; 13206 lodash.methodOf = methodOf; 13207 lodash.mixin = mixin; 13208 lodash.negate = negate; 13209 lodash.omit = omit; 13210 lodash.once = once; 13211 lodash.pairs = pairs; 13212 lodash.partial = partial; 13213 lodash.partialRight = partialRight; 13214 lodash.partition = partition; 13215 lodash.pick = pick; 13216 lodash.pluck = pluck; 13217 lodash.property = property; 13218 lodash.propertyOf = propertyOf; 13219 lodash.pull = pull; 13220 lodash.pullAt = pullAt; 13221 lodash.range = range; 13222 lodash.rearg = rearg; 13223 lodash.reject = reject; 13224 lodash.remove = remove; 13225 lodash.rest = rest; 13226 lodash.restParam = restParam; 13227 lodash.set = set; 13228 lodash.shuffle = shuffle; 13229 lodash.slice = slice; 13230 lodash.sortBy = sortBy; 13231 lodash.sortByAll = sortByAll; 13232 lodash.sortByOrder = sortByOrder; 13233 lodash.spread = spread; 13234 lodash.take = take; 13235 lodash.takeRight = takeRight; 13236 lodash.takeRightWhile = takeRightWhile; 13237 lodash.takeWhile = takeWhile; 13238 lodash.tap = tap; 13239 lodash.throttle = throttle; 13240 lodash.thru = thru; 13241 lodash.times = times; 13242 lodash.toArray = toArray; 13243 lodash.toPlainObject = toPlainObject; 13244 lodash.transform = transform; 13245 lodash.union = union; 13246 lodash.uniq = uniq; 13247 lodash.unzip = unzip; 13248 lodash.values = values; 13249 lodash.valuesIn = valuesIn; 13250 lodash.where = where; 13251 lodash.without = without; 13252 lodash.wrap = wrap; 13253 lodash.xor = xor; 13254 lodash.zip = zip; 13255 lodash.zipObject = zipObject; 13256 13257 // Add aliases. 13258 lodash.backflow = flowRight; 13259 lodash.collect = map; 13260 lodash.compose = flowRight; 13261 lodash.each = forEach; 13262 lodash.eachRight = forEachRight; 13263 lodash.extend = assign; 13264 lodash.iteratee = callback; 13265 lodash.methods = functions; 13266 lodash.object = zipObject; 13267 lodash.select = filter; 13268 lodash.tail = rest; 13269 lodash.unique = uniq; 13270 13271 // Add functions to `lodash.prototype`. 13272 mixin(lodash, lodash); 13273 13274 /*------------------------------------------------------------------------*/ 13275 13276 // Add functions that return unwrapped values when chaining. 13277 lodash.add = add; 13278 lodash.attempt = attempt; 13279 lodash.camelCase = camelCase; 13280 lodash.capitalize = capitalize; 13281 lodash.clone = clone; 13282 lodash.cloneDeep = cloneDeep; 13283 lodash.deburr = deburr; 13284 lodash.endsWith = endsWith; 13285 lodash.escape = escape; 13286 lodash.escapeRegExp = escapeRegExp; 13287 lodash.every = every; 13288 lodash.find = find; 13289 lodash.findIndex = findIndex; 13290 lodash.findKey = findKey; 13291 lodash.findLast = findLast; 13292 lodash.findLastIndex = findLastIndex; 13293 lodash.findLastKey = findLastKey; 13294 lodash.findWhere = findWhere; 13295 lodash.first = first; 13296 lodash.get = get; 13297 lodash.has = has; 13298 lodash.identity = identity; 13299 lodash.includes = includes; 13300 lodash.indexOf = indexOf; 13301 lodash.inRange = inRange; 13302 lodash.isArguments = isArguments; 13303 lodash.isArray = isArray; 13304 lodash.isBoolean = isBoolean; 13305 lodash.isDate = isDate; 13306 lodash.isElement = isElement; 13307 lodash.isEmpty = isEmpty; 13308 lodash.isEqual = isEqual; 13309 lodash.isError = isError; 13310 lodash.isFinite = isFinite; 13311 lodash.isFunction = isFunction; 13312 lodash.isMatch = isMatch; 13313 lodash.isNaN = isNaN; 13314 lodash.isNative = isNative; 13315 lodash.isNull = isNull; 13316 lodash.isNumber = isNumber; 13317 lodash.isObject = isObject; 13318 lodash.isPlainObject = isPlainObject; 13319 lodash.isRegExp = isRegExp; 13320 lodash.isString = isString; 13321 lodash.isTypedArray = isTypedArray; 13322 lodash.isUndefined = isUndefined; 13323 lodash.kebabCase = kebabCase; 13324 lodash.last = last; 13325 lodash.lastIndexOf = lastIndexOf; 13326 lodash.max = max; 13327 lodash.min = min; 13328 lodash.noConflict = noConflict; 13329 lodash.noop = noop; 13330 lodash.now = now; 13331 lodash.pad = pad; 13332 lodash.padLeft = padLeft; 13333 lodash.padRight = padRight; 13334 lodash.parseInt = parseInt; 13335 lodash.random = random; 13336 lodash.reduce = reduce; 13337 lodash.reduceRight = reduceRight; 13338 lodash.repeat = repeat; 13339 lodash.result = result; 13340 lodash.runInContext = runInContext; 13341 lodash.size = size; 13342 lodash.snakeCase = snakeCase; 13343 lodash.some = some; 13344 lodash.sortedIndex = sortedIndex; 13345 lodash.sortedLastIndex = sortedLastIndex; 13346 lodash.startCase = startCase; 13347 lodash.startsWith = startsWith; 13348 lodash.sum = sum; 13349 lodash.template = template; 13350 lodash.trim = trim; 13351 lodash.trimLeft = trimLeft; 13352 lodash.trimRight = trimRight; 13353 lodash.trunc = trunc; 13354 lodash.unescape = unescape; 13355 lodash.uniqueId = uniqueId; 13356 lodash.words = words; 13357 13358 // Add aliases. 13359 lodash.all = every; 13360 lodash.any = some; 13361 lodash.contains = includes; 13362 lodash.detect = find; 13363 lodash.foldl = reduce; 13364 lodash.foldr = reduceRight; 13365 lodash.head = first; 13366 lodash.include = includes; 13367 lodash.inject = reduce; 13368 13369 mixin(lodash, (function() { 13370 var source = {}; 13371 baseForOwn(lodash, function(func, methodName) { 13372 if (!lodash.prototype[methodName]) { 13373 source[methodName] = func; 13374 } 13375 }); 13376 return source; 13377 }()), false); 13378 13379 /*------------------------------------------------------------------------*/ 13380 13381 // Add functions capable of returning wrapped and unwrapped values when chaining. 13382 lodash.sample = sample; 13383 13384 lodash.prototype.sample = function(n) { 13385 if (!this.__chain__ && n == null) { 13386 return sample(this.value()); 13387 } 13388 return this.thru(function(value) { 13389 return sample(value, n); 13390 }); 13391 }; 13392 13393 /*------------------------------------------------------------------------*/ 13394 13395 /** 13396 * The semantic version number. 13397 * 13398 * @static 13399 * @memberOf _ 13400 * @type string 13401 */ 13402 lodash.VERSION = VERSION; 13403 13404 // Assign default placeholders. 13405 arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) { 13406 lodash[methodName].placeholder = lodash; 13407 }); 13408 13409 // Add `LazyWrapper` methods that accept an `iteratee` value. 13410 arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) { 13411 var isFilter = type != LAZY_MAP_FLAG, 13412 isDropWhile = type == LAZY_DROP_WHILE_FLAG; 13413 13414 LazyWrapper.prototype[methodName] = function(iteratee, thisArg) { 13415 var filtered = this.__filtered__, 13416 result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone(), 13417 iteratees = result.__iteratees__ || (result.__iteratees__ = []); 13418 13419 iteratees.push({ 13420 'done': false, 13421 'count': 0, 13422 'index': 0, 13423 'iteratee': getCallback(iteratee, thisArg, 1), 13424 'limit': -1, 13425 'type': type 13426 }); 13427 13428 result.__filtered__ = filtered || isFilter; 13429 return result; 13430 }; 13431 }); 13432 13433 // Add `LazyWrapper` methods for `_.drop` and `_.take` variants. 13434 arrayEach(['drop', 'take'], function(methodName, index) { 13435 var whileName = methodName + 'While'; 13436 13437 LazyWrapper.prototype[methodName] = function(n) { 13438 var filtered = this.__filtered__, 13439 result = (filtered && !index) ? this.dropWhile() : this.clone(); 13440 13441 n = n == null ? 1 : nativeMax(floor(n) || 0, 0); 13442 if (filtered) { 13443 if (index) { 13444 result.__takeCount__ = nativeMin(result.__takeCount__, n); 13445 } else { 13446 last(result.__iteratees__).limit = n; 13447 } 13448 } else { 13449 var views = result.__views__ || (result.__views__ = []); 13450 views.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') }); 13451 } 13452 return result; 13453 }; 13454 13455 LazyWrapper.prototype[methodName + 'Right'] = function(n) { 13456 return this.reverse()[methodName](n).reverse(); 13457 }; 13458 13459 LazyWrapper.prototype[methodName + 'RightWhile'] = function(predicate, thisArg) { 13460 return this.reverse()[whileName](predicate, thisArg).reverse(); 13461 }; 13462 }); 13463 13464 // Add `LazyWrapper` methods for `_.first` and `_.last`. 13465 arrayEach(['first', 'last'], function(methodName, index) { 13466 var takeName = 'take' + (index ? 'Right' : ''); 13467 13468 LazyWrapper.prototype[methodName] = function() { 13469 return this[takeName](1).value()[0]; 13470 }; 13471 }); 13472 13473 // Add `LazyWrapper` methods for `_.initial` and `_.rest`. 13474 arrayEach(['initial', 'rest'], function(methodName, index) { 13475 var dropName = 'drop' + (index ? '' : 'Right'); 13476 13477 LazyWrapper.prototype[methodName] = function() { 13478 return this[dropName](1); 13479 }; 13480 }); 13481 13482 // Add `LazyWrapper` methods for `_.pluck` and `_.where`. 13483 arrayEach(['pluck', 'where'], function(methodName, index) { 13484 var operationName = index ? 'filter' : 'map', 13485 createCallback = index ? baseMatches : property; 13486 13487 LazyWrapper.prototype[methodName] = function(value) { 13488 return this[operationName](createCallback(value)); 13489 }; 13490 }); 13491 13492 LazyWrapper.prototype.compact = function() { 13493 return this.filter(identity); 13494 }; 13495 13496 LazyWrapper.prototype.reject = function(predicate, thisArg) { 13497 predicate = getCallback(predicate, thisArg, 1); 13498 return this.filter(function(value) { 13499 return !predicate(value); 13500 }); 13501 }; 13502 13503 LazyWrapper.prototype.slice = function(start, end) { 13504 start = start == null ? 0 : (+start || 0); 13505 var result = start < 0 ? this.takeRight(-start) : this.drop(start); 13506 13507 if (end !== undefined) { 13508 end = (+end || 0); 13509 result = end < 0 ? result.dropRight(-end) : result.take(end - start); 13510 } 13511 return result; 13512 }; 13513 13514 LazyWrapper.prototype.toArray = function() { 13515 return this.drop(0); 13516 }; 13517 13518 // Add `LazyWrapper` methods to `lodash.prototype`. 13519 baseForOwn(LazyWrapper.prototype, function(func, methodName) { 13520 var lodashFunc = lodash[methodName]; 13521 if (!lodashFunc) { 13522 return; 13523 } 13524 var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName), 13525 retUnwrapped = /^(?:first|last)$/.test(methodName); 13526 13527 lodash.prototype[methodName] = function() { 13528 var args = arguments, 13529 length = args.length, 13530 chainAll = this.__chain__, 13531 value = this.__wrapped__, 13532 isHybrid = !!this.__actions__.length, 13533 isLazy = value instanceof LazyWrapper, 13534 iteratee = args[0], 13535 useLazy = isLazy || isArray(value); 13536 13537 if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) { 13538 // avoid lazy use if the iteratee has a "length" value other than `1` 13539 isLazy = useLazy = false; 13540 } 13541 var onlyLazy = isLazy && !isHybrid; 13542 if (retUnwrapped && !chainAll) { 13543 return onlyLazy 13544 ? func.call(value) 13545 : lodashFunc.call(lodash, this.value()); 13546 } 13547 var interceptor = function(value) { 13548 var otherArgs = [value]; 13549 push.apply(otherArgs, args); 13550 return lodashFunc.apply(lodash, otherArgs); 13551 }; 13552 if (useLazy) { 13553 var wrapper = onlyLazy ? value : new LazyWrapper(this), 13554 result = func.apply(wrapper, args); 13555 13556 if (!retUnwrapped && (isHybrid || result.__actions__)) { 13557 var actions = result.__actions__ || (result.__actions__ = []); 13558 actions.push({ 'func': thru, 'args': [interceptor], 'thisArg': lodash }); 13559 } 13560 return new LodashWrapper(result, chainAll); 13561 } 13562 return this.thru(interceptor); 13563 }; 13564 }); 13565 13566 // Add `Array` and `String` methods to `lodash.prototype`. 13567 arrayEach(['concat', 'join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) { 13568 var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName], 13569 chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', 13570 retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName); 13571 13572 lodash.prototype[methodName] = function() { 13573 var args = arguments; 13574 if (retUnwrapped && !this.__chain__) { 13575 return func.apply(this.value(), args); 13576 } 13577 return this[chainName](function(value) { 13578 return func.apply(value, args); 13579 }); 13580 }; 13581 }); 13582 13583 // Map minified function names to their real names. 13584 baseForOwn(LazyWrapper.prototype, function(func, methodName) { 13585 var lodashFunc = lodash[methodName]; 13586 if (lodashFunc) { 13587 var key = lodashFunc.name, 13588 names = realNames[key] || (realNames[key] = []); 13589 13590 names.push({ 'name': methodName, 'func': lodashFunc }); 13591 } 13592 }); 13593 13594 realNames[createHybridWrapper(null, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': null }]; 13595 13596 // Add functions to the lazy wrapper. 13597 LazyWrapper.prototype.clone = lazyClone; 13598 LazyWrapper.prototype.reverse = lazyReverse; 13599 LazyWrapper.prototype.value = lazyValue; 13600 13601 // Add chaining functions to the `lodash` wrapper. 13602 lodash.prototype.chain = wrapperChain; 13603 lodash.prototype.commit = wrapperCommit; 13604 lodash.prototype.plant = wrapperPlant; 13605 lodash.prototype.reverse = wrapperReverse; 13606 lodash.prototype.toString = wrapperToString; 13607 lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; 13608 13609 // Add function aliases to the `lodash` wrapper. 13610 lodash.prototype.collect = lodash.prototype.map; 13611 lodash.prototype.head = lodash.prototype.first; 13612 lodash.prototype.select = lodash.prototype.filter; 13613 lodash.prototype.tail = lodash.prototype.rest; 13614 13615 return lodash; 13616 } 13617 13618 /*--------------------------------------------------------------------------*/ 13619 13620 // Export lodash. 13621 var _ = runInContext(); 13622 13623 // Some AMD build optimizers like r.js check for condition patterns like the following: 13624 if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { 13625 // Expose lodash to the global object when an AMD loader is present to avoid 13626 // errors in cases where lodash is loaded by a script tag and not intended 13627 // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for 13628 // more details. 13629 root._ = _; 13630 13631 // Define as an anonymous module so, through path mapping, it can be 13632 // referenced as the "underscore" module. 13633 define(function() { 13634 return _; 13635 }); 13636 } 13637 // Check for `exports` after `define` in case a build optimizer adds an `exports` object. 13638 else if (freeExports && freeModule) { 13639 // Export for Node.js or RingoJS. 13640 if (moduleExports) { 13641 (freeModule.exports = _)._ = _; 13642 } 13643 // Export for Narwhal or Rhino -require. 13644 else { 13645 freeExports._ = _; 13646 } 13647 } 13648 else { 13649 // Export for a browser or Rhino. 13650 root._ = _; 13651 } 13652 }.call(this)); 13653 13654 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 13655 },{}],13:[function(require,module,exports){ 13656 /* 13657 * Lexical analysis and token construction. 13658 */ 13659 13660 "use strict"; 13661 13662 var _ = require("lodash"); 13663 var events = require("events"); 13664 var reg = require("./reg.js"); 13665 var state = require("./state.js").state; 13666 13667 var unicodeData = require("../data/ascii-identifier-data.js"); 13668 var asciiIdentifierStartTable = unicodeData.asciiIdentifierStartTable; 13669 var asciiIdentifierPartTable = unicodeData.asciiIdentifierPartTable; 13670 var nonAsciiIdentifierStartTable = require("../data/non-ascii-identifier-start.js"); 13671 var nonAsciiIdentifierPartTable = require("../data/non-ascii-identifier-part-only.js"); 13672 13673 // Some of these token types are from JavaScript Parser API 13674 // while others are specific to JSHint parser. 13675 // JS Parser API: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API 13676 13677 var Token = { 13678 Identifier: 1, 13679 Punctuator: 2, 13680 NumericLiteral: 3, 13681 StringLiteral: 4, 13682 Comment: 5, 13683 Keyword: 6, 13684 NullLiteral: 7, 13685 BooleanLiteral: 8, 13686 RegExp: 9, 13687 TemplateHead: 10, 13688 TemplateMiddle: 11, 13689 TemplateTail: 12, 13690 NoSubstTemplate: 13 13691 }; 13692 13693 var Context = { 13694 Block: 1, 13695 Template: 2 13696 }; 13697 13698 function isHex(str) { 13699 return /^[0-9a-fA-F]+$/.test(str); 13700 } 13701 13702 function isHexDigit(str) { 13703 return str.length === 1 && isHex(str); 13704 } 13705 13706 // Object that handles postponed lexing verifications that checks the parsed 13707 // environment state. 13708 13709 function asyncTrigger() { 13710 var _checks = []; 13711 13712 return { 13713 push: function(fn) { 13714 _checks.push(fn); 13715 }, 13716 13717 check: function() { 13718 for (var check = 0; check < _checks.length; ++check) { 13719 _checks[check](); 13720 } 13721 13722 _checks.splice(0, _checks.length); 13723 } 13724 }; 13725 } 13726 13727 /* 13728 * Lexer for JSHint. 13729 * 13730 * This object does a char-by-char scan of the provided source code 13731 * and produces a sequence of tokens. 13732 * 13733 * var lex = new Lexer("var i = 0;"); 13734 * lex.start(); 13735 * lex.token(); // returns the next token 13736 * 13737 * You have to use the token() method to move the lexer forward 13738 * but you don't have to use its return value to get tokens. In addition 13739 * to token() method returning the next token, the Lexer object also 13740 * emits events. 13741 * 13742 * lex.on("Identifier", function(data) { 13743 * if (data.name.indexOf("_") >= 0) { 13744 * // Produce a warning. 13745 * } 13746 * }); 13747 * 13748 * Note that the token() method returns tokens in a JSLint-compatible 13749 * format while the event emitter uses a slightly modified version of 13750 * Mozilla's JavaScript Parser API. Eventually, we will move away from 13751 * JSLint format. 13752 */ 13753 function Lexer(source) { 13754 var lines = source; 13755 13756 if (typeof lines === "string") { 13757 lines = lines 13758 .replace(/\r\n/g, "\n") 13759 .replace(/\r/g, "\n") 13760 .split("\n"); 13761 } 13762 13763 // If the first line is a shebang (#!), make it a blank and move on. 13764 // Shebangs are used by Node scripts. 13765 13766 if (lines[0] && lines[0].substr(0, 2) === "#!") { 13767 if (lines[0].indexOf("node") !== -1) { 13768 state.option.node = true; 13769 } 13770 lines[0] = ""; 13771 } 13772 13773 this.emitter = new events.EventEmitter(); 13774 this.source = source; 13775 this.setLines(lines); 13776 this.prereg = true; 13777 13778 this.line = 0; 13779 this.char = 1; 13780 this.from = 1; 13781 this.input = ""; 13782 this.inComment = false; 13783 this.context = []; 13784 this.templateStarts = []; 13785 13786 for (var i = 0; i < state.option.indent; i += 1) { 13787 state.tab += " "; 13788 } 13789 } 13790 13791 Lexer.prototype = { 13792 _lines: [], 13793 13794 inContext: function(ctxType) { 13795 return this.context.length > 0 && this.context[this.context.length - 1].type === ctxType; 13796 }, 13797 13798 pushContext: function(ctxType) { 13799 this.context.push({ type: ctxType }); 13800 }, 13801 13802 popContext: function() { 13803 return this.context.pop(); 13804 }, 13805 13806 isContext: function(context) { 13807 return this.context.length > 0 && this.context[this.context.length - 1] === context; 13808 }, 13809 13810 currentContext: function() { 13811 return this.context.length > 0 && this.context[this.context.length - 1]; 13812 }, 13813 13814 getLines: function() { 13815 this._lines = state.lines; 13816 return this._lines; 13817 }, 13818 13819 setLines: function(val) { 13820 this._lines = val; 13821 state.lines = this._lines; 13822 }, 13823 13824 /* 13825 * Return the next i character without actually moving the 13826 * char pointer. 13827 */ 13828 peek: function(i) { 13829 return this.input.charAt(i || 0); 13830 }, 13831 13832 /* 13833 * Move the char pointer forward i times. 13834 */ 13835 skip: function(i) { 13836 i = i || 1; 13837 this.char += i; 13838 this.input = this.input.slice(i); 13839 }, 13840 13841 /* 13842 * Subscribe to a token event. The API for this method is similar 13843 * Underscore.js i.e. you can subscribe to multiple events with 13844 * one call: 13845 * 13846 * lex.on("Identifier Number", function(data) { 13847 * // ... 13848 * }); 13849 */ 13850 on: function(names, listener) { 13851 names.split(" ").forEach(function(name) { 13852 this.emitter.on(name, listener); 13853 }.bind(this)); 13854 }, 13855 13856 /* 13857 * Trigger a token event. All arguments will be passed to each 13858 * listener. 13859 */ 13860 trigger: function() { 13861 this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments)); 13862 }, 13863 13864 /* 13865 * Postpone a token event. the checking condition is set as 13866 * last parameter, and the trigger function is called in a 13867 * stored callback. To be later called using the check() function 13868 * by the parser. This avoids parser's peek() to give the lexer 13869 * a false context. 13870 */ 13871 triggerAsync: function(type, args, checks, fn) { 13872 checks.push(function() { 13873 if (fn()) { 13874 this.trigger(type, args); 13875 } 13876 }.bind(this)); 13877 }, 13878 13879 /* 13880 * Extract a punctuator out of the next sequence of characters 13881 * or return 'null' if its not possible. 13882 * 13883 * This method's implementation was heavily influenced by the 13884 * scanPunctuator function in the Esprima parser's source code. 13885 */ 13886 scanPunctuator: function() { 13887 var ch1 = this.peek(); 13888 var ch2, ch3, ch4; 13889 13890 switch (ch1) { 13891 // Most common single-character punctuators 13892 case ".": 13893 if ((/^[0-9]$/).test(this.peek(1))) { 13894 return null; 13895 } 13896 if (this.peek(1) === "." && this.peek(2) === ".") { 13897 return { 13898 type: Token.Punctuator, 13899 value: "..." 13900 }; 13901 } 13902 /* falls through */ 13903 case "(": 13904 case ")": 13905 case ";": 13906 case ",": 13907 case "[": 13908 case "]": 13909 case ":": 13910 case "~": 13911 case "?": 13912 return { 13913 type: Token.Punctuator, 13914 value: ch1 13915 }; 13916 13917 // A block/object opener 13918 case "{": 13919 this.pushContext(Context.Block); 13920 return { 13921 type: Token.Punctuator, 13922 value: ch1 13923 }; 13924 13925 // A block/object closer 13926 case "}": 13927 if (this.inContext(Context.Block)) { 13928 this.popContext(); 13929 } 13930 return { 13931 type: Token.Punctuator, 13932 value: ch1 13933 }; 13934 13935 // A pound sign (for Node shebangs) 13936 case "#": 13937 return { 13938 type: Token.Punctuator, 13939 value: ch1 13940 }; 13941 13942 // We're at the end of input 13943 case "": 13944 return null; 13945 } 13946 13947 // Peek more characters 13948 13949 ch2 = this.peek(1); 13950 ch3 = this.peek(2); 13951 ch4 = this.peek(3); 13952 13953 // 4-character punctuator: >>>= 13954 13955 if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") { 13956 return { 13957 type: Token.Punctuator, 13958 value: ">>>=" 13959 }; 13960 } 13961 13962 // 3-character punctuators: === !== >>> <<= >>= 13963 13964 if (ch1 === "=" && ch2 === "=" && ch3 === "=") { 13965 return { 13966 type: Token.Punctuator, 13967 value: "===" 13968 }; 13969 } 13970 13971 if (ch1 === "!" && ch2 === "=" && ch3 === "=") { 13972 return { 13973 type: Token.Punctuator, 13974 value: "!==" 13975 }; 13976 } 13977 13978 if (ch1 === ">" && ch2 === ">" && ch3 === ">") { 13979 return { 13980 type: Token.Punctuator, 13981 value: ">>>" 13982 }; 13983 } 13984 13985 if (ch1 === "<" && ch2 === "<" && ch3 === "=") { 13986 return { 13987 type: Token.Punctuator, 13988 value: "<<=" 13989 }; 13990 } 13991 13992 if (ch1 === ">" && ch2 === ">" && ch3 === "=") { 13993 return { 13994 type: Token.Punctuator, 13995 value: ">>=" 13996 }; 13997 } 13998 13999 // Fat arrow punctuator 14000 if (ch1 === "=" && ch2 === ">") { 14001 return { 14002 type: Token.Punctuator, 14003 value: ch1 + ch2 14004 }; 14005 } 14006 14007 // 2-character punctuators: <= >= == != ++ -- << >> && || 14008 // += -= *= %= &= |= ^= /= 14009 if (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) { 14010 return { 14011 type: Token.Punctuator, 14012 value: ch1 + ch2 14013 }; 14014 } 14015 14016 if ("<>=!+-*%&|^/".indexOf(ch1) >= 0) { 14017 if (ch2 === "=") { 14018 return { 14019 type: Token.Punctuator, 14020 value: ch1 + ch2 14021 }; 14022 } 14023 14024 return { 14025 type: Token.Punctuator, 14026 value: ch1 14027 }; 14028 } 14029 14030 return null; 14031 }, 14032 14033 /* 14034 * Extract a comment out of the next sequence of characters and/or 14035 * lines or return 'null' if its not possible. Since comments can 14036 * span across multiple lines this method has to move the char 14037 * pointer. 14038 * 14039 * In addition to normal JavaScript comments (// and /*) this method 14040 * also recognizes JSHint- and JSLint-specific comments such as 14041 * /*jshint, /*jslint, /*globals and so on. 14042 */ 14043 scanComments: function(checks) { 14044 var ch1 = this.peek(); 14045 var ch2 = this.peek(1); 14046 var rest = this.input.substr(2); 14047 var startLine = this.line; 14048 var startChar = this.char; 14049 var self = this; 14050 14051 // Create a comment token object and make sure it 14052 // has all the data JSHint needs to work with special 14053 // comments. 14054 14055 function commentToken(label, body, opt) { 14056 var special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"]; 14057 var isSpecial = false; 14058 var value = label + body; 14059 var commentType = "plain"; 14060 opt = opt || {}; 14061 14062 if (opt.isMultiline) { 14063 value += "*/"; 14064 } 14065 14066 body = body.replace(/\n/g, " "); 14067 14068 if (label === "/*" && reg.fallsThrough.test(body)) { 14069 isSpecial = true; 14070 commentType = "falls through"; 14071 } 14072 14073 special.forEach(function(str) { 14074 if (isSpecial) { 14075 return; 14076 } 14077 14078 // Don't recognize any special comments other than jshint for single-line 14079 // comments. This introduced many problems with legit comments. 14080 if (label === "//" && str !== "jshint") { 14081 return; 14082 } 14083 14084 if (body.charAt(str.length) === " " && body.substr(0, str.length) === str) { 14085 isSpecial = true; 14086 label = label + str; 14087 body = body.substr(str.length); 14088 } 14089 14090 if (!isSpecial && body.charAt(0) === " " && body.charAt(str.length + 1) === " " && 14091 body.substr(1, str.length) === str) { 14092 isSpecial = true; 14093 label = label + " " + str; 14094 body = body.substr(str.length + 1); 14095 } 14096 14097 if (!isSpecial) { 14098 return; 14099 } 14100 14101 switch (str) { 14102 case "member": 14103 commentType = "members"; 14104 break; 14105 case "global": 14106 commentType = "globals"; 14107 break; 14108 default: 14109 var options = body.split(":").map(function(v) { 14110 return v.replace(/^\s+/, "").replace(/\s+$/, ""); 14111 }); 14112 14113 if (options.length === 2) { 14114 switch (options[0]) { 14115 case "ignore": 14116 switch (options[1]) { 14117 case "start": 14118 self.ignoringLinterErrors = true; 14119 isSpecial = false; 14120 break; 14121 case "end": 14122 self.ignoringLinterErrors = false; 14123 isSpecial = false; 14124 break; 14125 } 14126 } 14127 } 14128 14129 commentType = str; 14130 } 14131 }); 14132 14133 return { 14134 type: Token.Comment, 14135 commentType: commentType, 14136 value: value, 14137 body: body, 14138 isSpecial: isSpecial, 14139 isMultiline: opt.isMultiline || false, 14140 isMalformed: opt.isMalformed || false 14141 }; 14142 } 14143 14144 // End of unbegun comment. Raise an error and skip that input. 14145 if (ch1 === "*" && ch2 === "/") { 14146 this.trigger("error", { 14147 code: "E018", 14148 line: startLine, 14149 character: startChar 14150 }); 14151 14152 this.skip(2); 14153 return null; 14154 } 14155 14156 // Comments must start either with // or /* 14157 if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) { 14158 return null; 14159 } 14160 14161 // One-line comment 14162 if (ch2 === "/") { 14163 this.skip(this.input.length); // Skip to the EOL. 14164 return commentToken("//", rest); 14165 } 14166 14167 var body = ""; 14168 14169 /* Multi-line comment */ 14170 if (ch2 === "*") { 14171 this.inComment = true; 14172 this.skip(2); 14173 14174 while (this.peek() !== "*" || this.peek(1) !== "/") { 14175 if (this.peek() === "") { // End of Line 14176 body += "\n"; 14177 14178 // If we hit EOF and our comment is still unclosed, 14179 // trigger an error and end the comment implicitly. 14180 if (!this.nextLine(checks)) { 14181 this.trigger("error", { 14182 code: "E017", 14183 line: startLine, 14184 character: startChar 14185 }); 14186 14187 this.inComment = false; 14188 return commentToken("/*", body, { 14189 isMultiline: true, 14190 isMalformed: true 14191 }); 14192 } 14193 } else { 14194 body += this.peek(); 14195 this.skip(); 14196 } 14197 } 14198 14199 this.skip(2); 14200 this.inComment = false; 14201 return commentToken("/*", body, { isMultiline: true }); 14202 } 14203 }, 14204 14205 /* 14206 * Extract a keyword out of the next sequence of characters or 14207 * return 'null' if its not possible. 14208 */ 14209 scanKeyword: function() { 14210 var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input); 14211 var keywords = [ 14212 "if", "in", "do", "var", "for", "new", 14213 "try", "let", "this", "else", "case", 14214 "void", "with", "enum", "while", "break", 14215 "catch", "throw", "const", "yield", "class", 14216 "super", "return", "typeof", "delete", 14217 "switch", "export", "import", "default", 14218 "finally", "extends", "function", "continue", 14219 "debugger", "instanceof" 14220 ]; 14221 14222 if (result && keywords.indexOf(result[0]) >= 0) { 14223 return { 14224 type: Token.Keyword, 14225 value: result[0] 14226 }; 14227 } 14228 14229 return null; 14230 }, 14231 14232 /* 14233 * Extract a JavaScript identifier out of the next sequence of 14234 * characters or return 'null' if its not possible. In addition, 14235 * to Identifier this method can also produce BooleanLiteral 14236 * (true/false) and NullLiteral (null). 14237 */ 14238 scanIdentifier: function() { 14239 var id = ""; 14240 var index = 0; 14241 var type, char; 14242 14243 function isNonAsciiIdentifierStart(code) { 14244 return nonAsciiIdentifierStartTable.indexOf(code) > -1; 14245 } 14246 14247 function isNonAsciiIdentifierPart(code) { 14248 return isNonAsciiIdentifierStart(code) || nonAsciiIdentifierPartTable.indexOf(code) > -1; 14249 } 14250 14251 var readUnicodeEscapeSequence = function() { 14252 /*jshint validthis:true */ 14253 index += 1; 14254 14255 if (this.peek(index) !== "u") { 14256 return null; 14257 } 14258 14259 var sequence = this.peek(index + 1) + this.peek(index + 2) + 14260 this.peek(index + 3) + this.peek(index + 4); 14261 var code; 14262 14263 if (isHex(sequence)) { 14264 code = parseInt(sequence, 16); 14265 14266 if (asciiIdentifierPartTable[code] || isNonAsciiIdentifierPart(code)) { 14267 index += 5; 14268 return "\\u" + sequence; 14269 } 14270 14271 return null; 14272 } 14273 14274 return null; 14275 }.bind(this); 14276 14277 var getIdentifierStart = function() { 14278 /*jshint validthis:true */ 14279 var chr = this.peek(index); 14280 var code = chr.charCodeAt(0); 14281 14282 if (code === 92) { 14283 return readUnicodeEscapeSequence(); 14284 } 14285 14286 if (code < 128) { 14287 if (asciiIdentifierStartTable[code]) { 14288 index += 1; 14289 return chr; 14290 } 14291 14292 return null; 14293 } 14294 14295 if (isNonAsciiIdentifierStart(code)) { 14296 index += 1; 14297 return chr; 14298 } 14299 14300 return null; 14301 }.bind(this); 14302 14303 var getIdentifierPart = function() { 14304 /*jshint validthis:true */ 14305 var chr = this.peek(index); 14306 var code = chr.charCodeAt(0); 14307 14308 if (code === 92) { 14309 return readUnicodeEscapeSequence(); 14310 } 14311 14312 if (code < 128) { 14313 if (asciiIdentifierPartTable[code]) { 14314 index += 1; 14315 return chr; 14316 } 14317 14318 return null; 14319 } 14320 14321 if (isNonAsciiIdentifierPart(code)) { 14322 index += 1; 14323 return chr; 14324 } 14325 14326 return null; 14327 }.bind(this); 14328 14329 function removeEscapeSequences(id) { 14330 return id.replace(/\\u([0-9a-fA-F]{4})/g, function(m0, codepoint) { 14331 return String.fromCharCode(parseInt(codepoint, 16)); 14332 }); 14333 } 14334 14335 char = getIdentifierStart(); 14336 if (char === null) { 14337 return null; 14338 } 14339 14340 id = char; 14341 for (;;) { 14342 char = getIdentifierPart(); 14343 14344 if (char === null) { 14345 break; 14346 } 14347 14348 id += char; 14349 } 14350 14351 switch (id) { 14352 case "true": 14353 case "false": 14354 type = Token.BooleanLiteral; 14355 break; 14356 case "null": 14357 type = Token.NullLiteral; 14358 break; 14359 default: 14360 type = Token.Identifier; 14361 } 14362 14363 return { 14364 type: type, 14365 value: removeEscapeSequences(id), 14366 text: id, 14367 tokenLength: id.length 14368 }; 14369 }, 14370 14371 /* 14372 * Extract a numeric literal out of the next sequence of 14373 * characters or return 'null' if its not possible. This method 14374 * supports all numeric literals described in section 7.8.3 14375 * of the EcmaScript 5 specification. 14376 * 14377 * This method's implementation was heavily influenced by the 14378 * scanNumericLiteral function in the Esprima parser's source code. 14379 */ 14380 scanNumericLiteral: function(checks) { 14381 var index = 0; 14382 var value = ""; 14383 var length = this.input.length; 14384 var char = this.peek(index); 14385 var bad; 14386 var isAllowedDigit = isDecimalDigit; 14387 var base = 10; 14388 var isLegacy = false; 14389 14390 function isDecimalDigit(str) { 14391 return (/^[0-9]$/).test(str); 14392 } 14393 14394 function isOctalDigit(str) { 14395 return (/^[0-7]$/).test(str); 14396 } 14397 14398 function isBinaryDigit(str) { 14399 return (/^[01]$/).test(str); 14400 } 14401 14402 function isIdentifierStart(ch) { 14403 return (ch === "$") || (ch === "_") || (ch === "\\") || 14404 (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"); 14405 } 14406 14407 // Numbers must start either with a decimal digit or a point. 14408 14409 if (char !== "." && !isDecimalDigit(char)) { 14410 return null; 14411 } 14412 14413 if (char !== ".") { 14414 value = this.peek(index); 14415 index += 1; 14416 char = this.peek(index); 14417 14418 if (value === "0") { 14419 // Base-16 numbers. 14420 if (char === "x" || char === "X") { 14421 isAllowedDigit = isHexDigit; 14422 base = 16; 14423 14424 index += 1; 14425 value += char; 14426 } 14427 14428 // Base-8 numbers. 14429 if (char === "o" || char === "O") { 14430 isAllowedDigit = isOctalDigit; 14431 base = 8; 14432 14433 if (!state.inES6(true)) { 14434 this.triggerAsync( 14435 "warning", 14436 { 14437 code: "W119", 14438 line: this.line, 14439 character: this.char, 14440 data: [ "Octal integer literal", "6" ] 14441 }, 14442 checks, 14443 function() { return true; } 14444 ); 14445 } 14446 14447 index += 1; 14448 value += char; 14449 } 14450 14451 // Base-2 numbers. 14452 if (char === "b" || char === "B") { 14453 isAllowedDigit = isBinaryDigit; 14454 base = 2; 14455 14456 if (!state.inES6(true)) { 14457 this.triggerAsync( 14458 "warning", 14459 { 14460 code: "W119", 14461 line: this.line, 14462 character: this.char, 14463 data: [ "Binary integer literal", "6" ] 14464 }, 14465 checks, 14466 function() { return true; } 14467 ); 14468 } 14469 14470 index += 1; 14471 value += char; 14472 } 14473 14474 // Legacy base-8 numbers. 14475 if (isOctalDigit(char)) { 14476 isAllowedDigit = isOctalDigit; 14477 base = 8; 14478 isLegacy = true; 14479 bad = false; 14480 14481 index += 1; 14482 value += char; 14483 } 14484 14485 // Decimal numbers that start with '0' such as '09' are illegal 14486 // but we still parse them and return as malformed. 14487 14488 if (!isOctalDigit(char) && isDecimalDigit(char)) { 14489 index += 1; 14490 value += char; 14491 } 14492 } 14493 14494 while (index < length) { 14495 char = this.peek(index); 14496 14497 if (isLegacy && isDecimalDigit(char)) { 14498 // Numbers like '019' (note the 9) are not valid octals 14499 // but we still parse them and mark as malformed. 14500 bad = true; 14501 } else if (!isAllowedDigit(char)) { 14502 break; 14503 } 14504 value += char; 14505 index += 1; 14506 } 14507 14508 if (isAllowedDigit !== isDecimalDigit) { 14509 if (!isLegacy && value.length <= 2) { // 0x 14510 return { 14511 type: Token.NumericLiteral, 14512 value: value, 14513 isMalformed: true 14514 }; 14515 } 14516 14517 if (index < length) { 14518 char = this.peek(index); 14519 if (isIdentifierStart(char)) { 14520 return null; 14521 } 14522 } 14523 14524 return { 14525 type: Token.NumericLiteral, 14526 value: value, 14527 base: base, 14528 isLegacy: isLegacy, 14529 isMalformed: false 14530 }; 14531 } 14532 } 14533 14534 // Decimal digits. 14535 14536 if (char === ".") { 14537 value += char; 14538 index += 1; 14539 14540 while (index < length) { 14541 char = this.peek(index); 14542 if (!isDecimalDigit(char)) { 14543 break; 14544 } 14545 value += char; 14546 index += 1; 14547 } 14548 } 14549 14550 // Exponent part. 14551 14552 if (char === "e" || char === "E") { 14553 value += char; 14554 index += 1; 14555 char = this.peek(index); 14556 14557 if (char === "+" || char === "-") { 14558 value += this.peek(index); 14559 index += 1; 14560 } 14561 14562 char = this.peek(index); 14563 if (isDecimalDigit(char)) { 14564 value += char; 14565 index += 1; 14566 14567 while (index < length) { 14568 char = this.peek(index); 14569 if (!isDecimalDigit(char)) { 14570 break; 14571 } 14572 value += char; 14573 index += 1; 14574 } 14575 } else { 14576 return null; 14577 } 14578 } 14579 14580 if (index < length) { 14581 char = this.peek(index); 14582 if (isIdentifierStart(char)) { 14583 return null; 14584 } 14585 } 14586 14587 return { 14588 type: Token.NumericLiteral, 14589 value: value, 14590 base: base, 14591 isMalformed: !isFinite(value) 14592 }; 14593 }, 14594 14595 14596 // Assumes previously parsed character was \ (=== '\\') and was not skipped. 14597 scanEscapeSequence: function(checks) { 14598 var allowNewLine = false; 14599 var jump = 1; 14600 this.skip(); 14601 var char = this.peek(); 14602 14603 switch (char) { 14604 case "'": 14605 this.triggerAsync("warning", { 14606 code: "W114", 14607 line: this.line, 14608 character: this.char, 14609 data: [ "\\'" ] 14610 }, checks, function() {return state.jsonMode; }); 14611 break; 14612 case "b": 14613 char = "\\b"; 14614 break; 14615 case "f": 14616 char = "\\f"; 14617 break; 14618 case "n": 14619 char = "\\n"; 14620 break; 14621 case "r": 14622 char = "\\r"; 14623 break; 14624 case "t": 14625 char = "\\t"; 14626 break; 14627 case "0": 14628 char = "\\0"; 14629 14630 // Octal literals fail in strict mode. 14631 // Check if the number is between 00 and 07. 14632 var n = parseInt(this.peek(1), 10); 14633 this.triggerAsync("warning", { 14634 code: "W115", 14635 line: this.line, 14636 character: this.char 14637 }, checks, 14638 function() { return n >= 0 && n <= 7 && state.isStrict(); }); 14639 break; 14640 case "1": 14641 case "2": 14642 case "3": 14643 case "4": 14644 case "5": 14645 case "6": 14646 case "7": 14647 char = "\\" + char; 14648 this.triggerAsync("warning", { 14649 code: "W115", 14650 line: this.line, 14651 character: this.char 14652 }, checks, 14653 function() { return state.isStrict(); }); 14654 break; 14655 case "u": 14656 var sequence = this.input.substr(1, 4); 14657 var code = parseInt(sequence, 16); 14658 if (!isHex(sequence)) { 14659 // This condition unequivocally describes a syntax error. 14660 // TODO: Re-factor as an "error" (not a "warning"). 14661 this.trigger("warning", { 14662 code: "W052", 14663 line: this.line, 14664 character: this.char, 14665 data: [ "u" + sequence ] 14666 }); 14667 } 14668 char = String.fromCharCode(code); 14669 jump = 5; 14670 break; 14671 case "v": 14672 this.triggerAsync("warning", { 14673 code: "W114", 14674 line: this.line, 14675 character: this.char, 14676 data: [ "\\v" ] 14677 }, checks, function() { return state.jsonMode; }); 14678 14679 char = "\v"; 14680 break; 14681 case "x": 14682 var x = parseInt(this.input.substr(1, 2), 16); 14683 14684 this.triggerAsync("warning", { 14685 code: "W114", 14686 line: this.line, 14687 character: this.char, 14688 data: [ "\\x-" ] 14689 }, checks, function() { return state.jsonMode; }); 14690 14691 char = String.fromCharCode(x); 14692 jump = 3; 14693 break; 14694 case "\\": 14695 char = "\\\\"; 14696 break; 14697 case "\"": 14698 char = "\\\""; 14699 break; 14700 case "/": 14701 break; 14702 case "": 14703 allowNewLine = true; 14704 char = ""; 14705 break; 14706 } 14707 14708 return { char: char, jump: jump, allowNewLine: allowNewLine }; 14709 }, 14710 14711 /* 14712 * Extract a template literal out of the next sequence of characters 14713 * and/or lines or return 'null' if its not possible. Since template 14714 * literals can span across multiple lines, this method has to move 14715 * the char pointer. 14716 */ 14717 scanTemplateLiteral: function(checks) { 14718 var tokenType; 14719 var value = ""; 14720 var ch; 14721 var startLine = this.line; 14722 var startChar = this.char; 14723 var depth = this.templateStarts.length; 14724 14725 if (this.peek() === "`") { 14726 if (!state.inES6(true)) { 14727 this.triggerAsync( 14728 "warning", 14729 { 14730 code: "W119", 14731 line: this.line, 14732 character: this.char, 14733 data: ["template literal syntax", "6"] 14734 }, 14735 checks, 14736 function() { return true; } 14737 ); 14738 } 14739 // Template must start with a backtick. 14740 tokenType = Token.TemplateHead; 14741 this.templateStarts.push({ line: this.line, char: this.char }); 14742 depth = this.templateStarts.length; 14743 this.skip(1); 14744 this.pushContext(Context.Template); 14745 } else if (this.inContext(Context.Template) && this.peek() === "}") { 14746 // If we're in a template context, and we have a '}', lex a TemplateMiddle. 14747 tokenType = Token.TemplateMiddle; 14748 } else { 14749 // Go lex something else. 14750 return null; 14751 } 14752 14753 while (this.peek() !== "`") { 14754 while ((ch = this.peek()) === "") { 14755 value += "\n"; 14756 if (!this.nextLine(checks)) { 14757 // Unclosed template literal --- point to the starting "`" 14758 var startPos = this.templateStarts.pop(); 14759 this.trigger("error", { 14760 code: "E052", 14761 line: startPos.line, 14762 character: startPos.char 14763 }); 14764 return { 14765 type: tokenType, 14766 value: value, 14767 startLine: startLine, 14768 startChar: startChar, 14769 isUnclosed: true, 14770 depth: depth, 14771 context: this.popContext() 14772 }; 14773 } 14774 } 14775 14776 if (ch === '$' && this.peek(1) === '{') { 14777 value += '${'; 14778 this.skip(2); 14779 return { 14780 type: tokenType, 14781 value: value, 14782 startLine: startLine, 14783 startChar: startChar, 14784 isUnclosed: false, 14785 depth: depth, 14786 context: this.currentContext() 14787 }; 14788 } else if (ch === '\\') { 14789 var escape = this.scanEscapeSequence(checks); 14790 value += escape.char; 14791 this.skip(escape.jump); 14792 } else if (ch !== '`') { 14793 // Otherwise, append the value and continue. 14794 value += ch; 14795 this.skip(1); 14796 } 14797 } 14798 14799 // Final value is either NoSubstTemplate or TemplateTail 14800 tokenType = tokenType === Token.TemplateHead ? Token.NoSubstTemplate : Token.TemplateTail; 14801 this.skip(1); 14802 this.templateStarts.pop(); 14803 14804 return { 14805 type: tokenType, 14806 value: value, 14807 startLine: startLine, 14808 startChar: startChar, 14809 isUnclosed: false, 14810 depth: depth, 14811 context: this.popContext() 14812 }; 14813 }, 14814 14815 /* 14816 * Extract a string out of the next sequence of characters and/or 14817 * lines or return 'null' if its not possible. Since strings can 14818 * span across multiple lines this method has to move the char 14819 * pointer. 14820 * 14821 * This method recognizes pseudo-multiline JavaScript strings: 14822 * 14823 * var str = "hello\ 14824 * world"; 14825 */ 14826 scanStringLiteral: function(checks) { 14827 /*jshint loopfunc:true */ 14828 var quote = this.peek(); 14829 14830 // String must start with a quote. 14831 if (quote !== "\"" && quote !== "'") { 14832 return null; 14833 } 14834 14835 // In JSON strings must always use double quotes. 14836 this.triggerAsync("warning", { 14837 code: "W108", 14838 line: this.line, 14839 character: this.char // +1? 14840 }, checks, function() { return state.jsonMode && quote !== "\""; }); 14841 14842 var value = ""; 14843 var startLine = this.line; 14844 var startChar = this.char; 14845 var allowNewLine = false; 14846 14847 this.skip(); 14848 14849 while (this.peek() !== quote) { 14850 if (this.peek() === "") { // End Of Line 14851 14852 // If an EOL is not preceded by a backslash, show a warning 14853 // and proceed like it was a legit multi-line string where 14854 // author simply forgot to escape the newline symbol. 14855 // 14856 // Another approach is to implicitly close a string on EOL 14857 // but it generates too many false positives. 14858 14859 if (!allowNewLine) { 14860 // This condition unequivocally describes a syntax error. 14861 // TODO: Re-factor as an "error" (not a "warning"). 14862 this.trigger("warning", { 14863 code: "W112", 14864 line: this.line, 14865 character: this.char 14866 }); 14867 } else { 14868 allowNewLine = false; 14869 14870 // Otherwise show a warning if multistr option was not set. 14871 // For JSON, show warning no matter what. 14872 14873 this.triggerAsync("warning", { 14874 code: "W043", 14875 line: this.line, 14876 character: this.char 14877 }, checks, function() { return !state.option.multistr; }); 14878 14879 this.triggerAsync("warning", { 14880 code: "W042", 14881 line: this.line, 14882 character: this.char 14883 }, checks, function() { return state.jsonMode && state.option.multistr; }); 14884 } 14885 14886 // If we get an EOF inside of an unclosed string, show an 14887 // error and implicitly close it at the EOF point. 14888 14889 if (!this.nextLine(checks)) { 14890 this.trigger("error", { 14891 code: "E029", 14892 line: startLine, 14893 character: startChar 14894 }); 14895 14896 return { 14897 type: Token.StringLiteral, 14898 value: value, 14899 startLine: startLine, 14900 startChar: startChar, 14901 isUnclosed: true, 14902 quote: quote 14903 }; 14904 } 14905 14906 } else { // Any character other than End Of Line 14907 14908 allowNewLine = false; 14909 var char = this.peek(); 14910 var jump = 1; // A length of a jump, after we're done 14911 // parsing this character. 14912 14913 if (char < " ") { 14914 // Warn about a control character in a string. 14915 this.triggerAsync( 14916 "warning", 14917 { 14918 code: "W113", 14919 line: this.line, 14920 character: this.char, 14921 data: [ "<non-printable>" ] 14922 }, 14923 checks, 14924 function() { return true; } 14925 ); 14926 } 14927 14928 // Special treatment for some escaped characters. 14929 if (char === "\\") { 14930 var parsed = this.scanEscapeSequence(checks); 14931 char = parsed.char; 14932 jump = parsed.jump; 14933 allowNewLine = parsed.allowNewLine; 14934 } 14935 14936 value += char; 14937 this.skip(jump); 14938 } 14939 } 14940 14941 this.skip(); 14942 return { 14943 type: Token.StringLiteral, 14944 value: value, 14945 startLine: startLine, 14946 startChar: startChar, 14947 isUnclosed: false, 14948 quote: quote 14949 }; 14950 }, 14951 14952 /* 14953 * Extract a regular expression out of the next sequence of 14954 * characters and/or lines or return 'null' if its not possible. 14955 * 14956 * This method is platform dependent: it accepts almost any 14957 * regular expression values but then tries to compile and run 14958 * them using system's RegExp object. This means that there are 14959 * rare edge cases where one JavaScript engine complains about 14960 * your regular expression while others don't. 14961 */ 14962 scanRegExp: function(checks) { 14963 var index = 0; 14964 var length = this.input.length; 14965 var char = this.peek(); 14966 var value = char; 14967 var body = ""; 14968 var flags = []; 14969 var malformed = false; 14970 var isCharSet = false; 14971 var terminated, malformedDesc; 14972 14973 var scanUnexpectedChars = function() { 14974 // Unexpected control character 14975 if (char < " ") { 14976 malformed = true; 14977 this.triggerAsync( 14978 "warning", 14979 { 14980 code: "W048", 14981 line: this.line, 14982 character: this.char 14983 }, 14984 checks, 14985 function() { return true; } 14986 ); 14987 } 14988 14989 // Unexpected escaped character 14990 if (char === "<") { 14991 malformed = true; 14992 this.triggerAsync( 14993 "warning", 14994 { 14995 code: "W049", 14996 line: this.line, 14997 character: this.char, 14998 data: [ char ] 14999 }, 15000 checks, 15001 function() { return true; } 15002 ); 15003 } 15004 }.bind(this); 15005 15006 // Regular expressions must start with '/' 15007 if (!this.prereg || char !== "/") { 15008 return null; 15009 } 15010 15011 index += 1; 15012 terminated = false; 15013 15014 // Try to get everything in between slashes. A couple of 15015 // cases aside (see scanUnexpectedChars) we don't really 15016 // care whether the resulting expression is valid or not. 15017 // We will check that later using the RegExp object. 15018 15019 while (index < length) { 15020 char = this.peek(index); 15021 value += char; 15022 body += char; 15023 15024 if (isCharSet) { 15025 if (char === "]") { 15026 if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") { 15027 isCharSet = false; 15028 } 15029 } 15030 15031 if (char === "\\") { 15032 index += 1; 15033 char = this.peek(index); 15034 body += char; 15035 value += char; 15036 15037 scanUnexpectedChars(); 15038 } 15039 15040 index += 1; 15041 continue; 15042 } 15043 15044 if (char === "\\") { 15045 index += 1; 15046 char = this.peek(index); 15047 body += char; 15048 value += char; 15049 15050 scanUnexpectedChars(); 15051 15052 if (char === "/") { 15053 index += 1; 15054 continue; 15055 } 15056 15057 if (char === "[") { 15058 index += 1; 15059 continue; 15060 } 15061 } 15062 15063 if (char === "[") { 15064 isCharSet = true; 15065 index += 1; 15066 continue; 15067 } 15068 15069 if (char === "/") { 15070 body = body.substr(0, body.length - 1); 15071 terminated = true; 15072 index += 1; 15073 break; 15074 } 15075 15076 index += 1; 15077 } 15078 15079 // A regular expression that was never closed is an 15080 // error from which we cannot recover. 15081 15082 if (!terminated) { 15083 this.trigger("error", { 15084 code: "E015", 15085 line: this.line, 15086 character: this.from 15087 }); 15088 15089 return void this.trigger("fatal", { 15090 line: this.line, 15091 from: this.from 15092 }); 15093 } 15094 15095 // Parse flags (if any). 15096 15097 while (index < length) { 15098 char = this.peek(index); 15099 if (!/[gimy]/.test(char)) { 15100 break; 15101 } 15102 if (char === "y") { 15103 if (!state.inES6(true)) { 15104 this.triggerAsync( 15105 "warning", 15106 { 15107 code: "W119", 15108 line: this.line, 15109 character: this.char, 15110 data: [ "Sticky RegExp flag", "6" ] 15111 }, 15112 checks, 15113 function() { return true; } 15114 ); 15115 } 15116 if (value.indexOf("y") > -1) { 15117 malformedDesc = "Duplicate RegExp flag"; 15118 } 15119 } else { 15120 flags.push(char); 15121 } 15122 value += char; 15123 index += 1; 15124 } 15125 15126 // Check regular expression for correctness. 15127 15128 try { 15129 new RegExp(body, flags.join("")); 15130 } catch (err) { 15131 /** 15132 * Because JSHint relies on the current engine's RegExp parser to 15133 * validate RegExp literals, the description (exposed as the "data" 15134 * property on the error object) is platform dependent. 15135 */ 15136 malformedDesc = err.message; 15137 } 15138 15139 if (malformedDesc) { 15140 malformed = true; 15141 this.trigger("error", { 15142 code: "E016", 15143 line: this.line, 15144 character: this.char, 15145 data: [ malformedDesc ] 15146 }); 15147 } 15148 15149 return { 15150 type: Token.RegExp, 15151 value: value, 15152 flags: flags, 15153 isMalformed: malformed 15154 }; 15155 }, 15156 15157 /* 15158 * Scan for any occurrence of non-breaking spaces. Non-breaking spaces 15159 * can be mistakenly typed on OS X with option-space. Non UTF-8 web 15160 * pages with non-breaking pages produce syntax errors. 15161 */ 15162 scanNonBreakingSpaces: function() { 15163 return state.option.nonbsp ? 15164 this.input.search(/(\u00A0)/) : -1; 15165 }, 15166 15167 /* 15168 * Scan for characters that get silently deleted by one or more browsers. 15169 */ 15170 scanUnsafeChars: function() { 15171 return this.input.search(reg.unsafeChars); 15172 }, 15173 15174 /* 15175 * Produce the next raw token or return 'null' if no tokens can be matched. 15176 * This method skips over all space characters. 15177 */ 15178 next: function(checks) { 15179 this.from = this.char; 15180 15181 // Move to the next non-space character. 15182 while (/\s/.test(this.peek())) { 15183 this.from += 1; 15184 this.skip(); 15185 } 15186 15187 // Methods that work with multi-line structures and move the 15188 // character pointer. 15189 15190 var match = this.scanComments(checks) || 15191 this.scanStringLiteral(checks) || 15192 this.scanTemplateLiteral(checks); 15193 15194 if (match) { 15195 return match; 15196 } 15197 15198 // Methods that don't move the character pointer. 15199 15200 match = 15201 this.scanRegExp(checks) || 15202 this.scanPunctuator() || 15203 this.scanKeyword() || 15204 this.scanIdentifier() || 15205 this.scanNumericLiteral(checks); 15206 15207 if (match) { 15208 this.skip(match.tokenLength || match.value.length); 15209 return match; 15210 } 15211 15212 // No token could be matched, give up. 15213 15214 return null; 15215 }, 15216 15217 /* 15218 * Switch to the next line and reset all char pointers. Once 15219 * switched, this method also checks for other minor warnings. 15220 */ 15221 nextLine: function(checks) { 15222 var char; 15223 15224 if (this.line >= this.getLines().length) { 15225 return false; 15226 } 15227 15228 this.input = this.getLines()[this.line]; 15229 this.line += 1; 15230 this.char = 1; 15231 this.from = 1; 15232 15233 var inputTrimmed = this.input.trim(); 15234 15235 var startsWith = function() { 15236 return _.some(arguments, function(prefix) { 15237 return inputTrimmed.indexOf(prefix) === 0; 15238 }); 15239 }; 15240 15241 var endsWith = function() { 15242 return _.some(arguments, function(suffix) { 15243 return inputTrimmed.indexOf(suffix, inputTrimmed.length - suffix.length) !== -1; 15244 }); 15245 }; 15246 15247 // If we are ignoring linter errors, replace the input with empty string 15248 // if it doesn't already at least start or end a multi-line comment 15249 if (this.ignoringLinterErrors === true) { 15250 if (!startsWith("/*", "//") && !(this.inComment && endsWith("*/"))) { 15251 this.input = ""; 15252 } 15253 } 15254 15255 char = this.scanNonBreakingSpaces(); 15256 if (char >= 0) { 15257 this.triggerAsync( 15258 "warning", 15259 { code: "W125", line: this.line, character: char + 1 }, 15260 checks, 15261 function() { return true; } 15262 ); 15263 } 15264 15265 this.input = this.input.replace(/\t/g, state.tab); 15266 char = this.scanUnsafeChars(); 15267 15268 if (char >= 0) { 15269 this.triggerAsync( 15270 "warning", 15271 { code: "W100", line: this.line, character: char }, 15272 checks, 15273 function() { return true; } 15274 ); 15275 } 15276 15277 // If there is a limit on line length, warn when lines get too 15278 // long. 15279 15280 if (!this.ignoringLinterErrors && state.option.maxlen && 15281 state.option.maxlen < this.input.length) { 15282 var inComment = this.inComment || 15283 startsWith.call(inputTrimmed, "//") || 15284 startsWith.call(inputTrimmed, "/*"); 15285 15286 var shouldTriggerError = !inComment || !reg.maxlenException.test(inputTrimmed); 15287 15288 if (shouldTriggerError) { 15289 this.triggerAsync( 15290 "warning", 15291 { code: "W101", line: this.line, character: this.input.length }, 15292 checks, 15293 function() { return true; } 15294 ); 15295 } 15296 } 15297 15298 return true; 15299 }, 15300 15301 /* 15302 * Produce the next token. This function is called by advance() to get 15303 * the next token. It returns a token in a JSLint-compatible format. 15304 */ 15305 token: function() { 15306 /*jshint loopfunc:true */ 15307 var checks = asyncTrigger(); 15308 var token; 15309 15310 15311 function isReserved(token, isProperty) { 15312 if (!token.reserved) { 15313 return false; 15314 } 15315 var meta = token.meta; 15316 15317 if (meta && meta.isFutureReservedWord && state.inES5()) { 15318 // ES3 FutureReservedWord in an ES5 environment. 15319 if (!meta.es5) { 15320 return false; 15321 } 15322 15323 // Some ES5 FutureReservedWord identifiers are active only 15324 // within a strict mode environment. 15325 if (meta.strictOnly) { 15326 if (!state.option.strict && !state.isStrict()) { 15327 return false; 15328 } 15329 } 15330 15331 if (isProperty) { 15332 return false; 15333 } 15334 } 15335 15336 return true; 15337 } 15338 15339 // Produce a token object. 15340 var create = function(type, value, isProperty, token) { 15341 /*jshint validthis:true */ 15342 var obj; 15343 15344 if (type !== "(endline)" && type !== "(end)") { 15345 this.prereg = false; 15346 } 15347 15348 if (type === "(punctuator)") { 15349 switch (value) { 15350 case ".": 15351 case ")": 15352 case "~": 15353 case "#": 15354 case "]": 15355 case "++": 15356 case "--": 15357 this.prereg = false; 15358 break; 15359 default: 15360 this.prereg = true; 15361 } 15362 15363 obj = Object.create(state.syntax[value] || state.syntax["(error)"]); 15364 } 15365 15366 if (type === "(identifier)") { 15367 if (value === "return" || value === "case" || value === "yield" || 15368 value === "typeof" || value === "instanceof") { 15369 this.prereg = true; 15370 } 15371 15372 if (_.has(state.syntax, value)) { 15373 obj = Object.create(state.syntax[value] || state.syntax["(error)"]); 15374 15375 // If this can't be a reserved keyword, reset the object. 15376 if (!isReserved(obj, isProperty && type === "(identifier)")) { 15377 obj = null; 15378 } 15379 } 15380 } 15381 15382 if (type === "(template)" || type === "(template middle)") { 15383 this.prereg = true; 15384 } 15385 15386 if (!obj) { 15387 obj = Object.create(state.syntax[type]); 15388 } 15389 15390 obj.identifier = (type === "(identifier)"); 15391 obj.type = obj.type || type; 15392 obj.value = value; 15393 obj.line = this.line; 15394 obj.character = this.char; 15395 obj.from = this.from; 15396 if (obj.identifier && token) obj.raw_text = token.text || token.value; 15397 if (token && token.startLine && token.startLine !== this.line) { 15398 obj.startLine = token.startLine; 15399 } 15400 if (token && token.context) { 15401 // Context of current token 15402 obj.context = token.context; 15403 } 15404 if (token && token.depth) { 15405 // Nested template depth 15406 obj.depth = token.depth; 15407 } 15408 if (token && token.isUnclosed) { 15409 // Mark token as unclosed string / template literal 15410 obj.isUnclosed = token.isUnclosed; 15411 } 15412 15413 if (isProperty && obj.identifier) { 15414 obj.isProperty = isProperty; 15415 } 15416 15417 obj.check = checks.check; 15418 15419 return obj; 15420 }.bind(this); 15421 15422 for (;;) { 15423 if (!this.input.length) { 15424 if (this.nextLine(checks)) { 15425 return create("(endline)", ""); 15426 } 15427 15428 if (this.exhausted) { 15429 return null; 15430 } 15431 15432 this.exhausted = true; 15433 return create("(end)", ""); 15434 } 15435 15436 token = this.next(checks); 15437 15438 if (!token) { 15439 if (this.input.length) { 15440 // Unexpected character. 15441 this.trigger("error", { 15442 code: "E024", 15443 line: this.line, 15444 character: this.char, 15445 data: [ this.peek() ] 15446 }); 15447 15448 this.input = ""; 15449 } 15450 15451 continue; 15452 } 15453 15454 switch (token.type) { 15455 case Token.StringLiteral: 15456 this.triggerAsync("String", { 15457 line: this.line, 15458 char: this.char, 15459 from: this.from, 15460 startLine: token.startLine, 15461 startChar: token.startChar, 15462 value: token.value, 15463 quote: token.quote 15464 }, checks, function() { return true; }); 15465 15466 return create("(string)", token.value, null, token); 15467 15468 case Token.TemplateHead: 15469 this.trigger("TemplateHead", { 15470 line: this.line, 15471 char: this.char, 15472 from: this.from, 15473 startLine: token.startLine, 15474 startChar: token.startChar, 15475 value: token.value 15476 }); 15477 return create("(template)", token.value, null, token); 15478 15479 case Token.TemplateMiddle: 15480 this.trigger("TemplateMiddle", { 15481 line: this.line, 15482 char: this.char, 15483 from: this.from, 15484 startLine: token.startLine, 15485 startChar: token.startChar, 15486 value: token.value 15487 }); 15488 return create("(template middle)", token.value, null, token); 15489 15490 case Token.TemplateTail: 15491 this.trigger("TemplateTail", { 15492 line: this.line, 15493 char: this.char, 15494 from: this.from, 15495 startLine: token.startLine, 15496 startChar: token.startChar, 15497 value: token.value 15498 }); 15499 return create("(template tail)", token.value, null, token); 15500 15501 case Token.NoSubstTemplate: 15502 this.trigger("NoSubstTemplate", { 15503 line: this.line, 15504 char: this.char, 15505 from: this.from, 15506 startLine: token.startLine, 15507 startChar: token.startChar, 15508 value: token.value 15509 }); 15510 return create("(no subst template)", token.value, null, token); 15511 15512 case Token.Identifier: 15513 this.triggerAsync("Identifier", { 15514 line: this.line, 15515 char: this.char, 15516 from: this.from, 15517 name: token.value, 15518 raw_name: token.text, 15519 isProperty: state.tokens.curr.id === "." 15520 }, checks, function() { return true; }); 15521 15522 /* falls through */ 15523 case Token.Keyword: 15524 case Token.NullLiteral: 15525 case Token.BooleanLiteral: 15526 return create("(identifier)", token.value, state.tokens.curr.id === ".", token); 15527 15528 case Token.NumericLiteral: 15529 if (token.isMalformed) { 15530 // This condition unequivocally describes a syntax error. 15531 // TODO: Re-factor as an "error" (not a "warning"). 15532 this.trigger("warning", { 15533 code: "W045", 15534 line: this.line, 15535 character: this.char, 15536 data: [ token.value ] 15537 }); 15538 } 15539 15540 this.triggerAsync("warning", { 15541 code: "W114", 15542 line: this.line, 15543 character: this.char, 15544 data: [ "0x-" ] 15545 }, checks, function() { return token.base === 16 && state.jsonMode; }); 15546 15547 this.triggerAsync("warning", { 15548 code: "W115", 15549 line: this.line, 15550 character: this.char 15551 }, checks, function() { 15552 return state.isStrict() && token.base === 8 && token.isLegacy; 15553 }); 15554 15555 this.trigger("Number", { 15556 line: this.line, 15557 char: this.char, 15558 from: this.from, 15559 value: token.value, 15560 base: token.base, 15561 isMalformed: token.malformed 15562 }); 15563 15564 return create("(number)", token.value); 15565 15566 case Token.RegExp: 15567 return create("(regexp)", token.value); 15568 15569 case Token.Comment: 15570 state.tokens.curr.comment = true; 15571 15572 if (token.isSpecial) { 15573 return { 15574 id: '(comment)', 15575 value: token.value, 15576 body: token.body, 15577 type: token.commentType, 15578 isSpecial: token.isSpecial, 15579 line: this.line, 15580 character: this.char, 15581 from: this.from 15582 }; 15583 } 15584 15585 break; 15586 15587 case "": 15588 break; 15589 15590 default: 15591 return create("(punctuator)", token.value); 15592 } 15593 } 15594 } 15595 }; 15596 15597 exports.Lexer = Lexer; 15598 exports.Context = Context; 15599 15600 },{"../data/ascii-identifier-data.js":1,"../data/non-ascii-identifier-part-only.js":2,"../data/non-ascii-identifier-start.js":3,"./reg.js":17,"./state.js":19,"events":5,"lodash":12}],14:[function(require,module,exports){ 15601 "use strict"; 15602 15603 var _ = require("lodash"); 15604 15605 var errors = { 15606 // JSHint options 15607 E001: "Bad option: '{a}'.", 15608 E002: "Bad option value.", 15609 15610 // JSHint input 15611 E003: "Expected a JSON value.", 15612 E004: "Input is neither a string nor an array of strings.", 15613 E005: "Input is empty.", 15614 E006: "Unexpected early end of program.", 15615 15616 // Strict mode 15617 E007: "Missing \"use strict\" statement.", 15618 E008: "Strict violation.", 15619 E009: "Option 'validthis' can't be used in a global scope.", 15620 E010: "'with' is not allowed in strict mode.", 15621 15622 // Constants 15623 E011: "'{a}' has already been declared.", 15624 E012: "const '{a}' is initialized to 'undefined'.", 15625 E013: "Attempting to override '{a}' which is a constant.", 15626 15627 // Regular expressions 15628 E014: "A regular expression literal can be confused with '/='.", 15629 E015: "Unclosed regular expression.", 15630 E016: "Invalid regular expression.", 15631 15632 // Tokens 15633 E017: "Unclosed comment.", 15634 E018: "Unbegun comment.", 15635 E019: "Unmatched '{a}'.", 15636 E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", 15637 E021: "Expected '{a}' and instead saw '{b}'.", 15638 E022: "Line breaking error '{a}'.", 15639 E023: "Missing '{a}'.", 15640 E024: "Unexpected '{a}'.", 15641 E025: "Missing ':' on a case clause.", 15642 E026: "Missing '}' to match '{' from line {a}.", 15643 E027: "Missing ']' to match '[' from line {a}.", 15644 E028: "Illegal comma.", 15645 E029: "Unclosed string.", 15646 15647 // Everything else 15648 E030: "Expected an identifier and instead saw '{a}'.", 15649 E031: "Bad assignment.", // FIXME: Rephrase 15650 E032: "Expected a small integer or 'false' and instead saw '{a}'.", 15651 E033: "Expected an operator and instead saw '{a}'.", 15652 E034: "get/set are ES5 features.", 15653 E035: "Missing property name.", 15654 E036: "Expected to see a statement and instead saw a block.", 15655 E037: null, 15656 E038: null, 15657 E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.", 15658 E040: "Each value should have its own case label.", 15659 E041: "Unrecoverable syntax error.", 15660 E042: "Stopping.", 15661 E043: "Too many errors.", 15662 E044: null, 15663 E045: "Invalid for each loop.", 15664 E046: "Yield expressions may only occur within generator functions.", 15665 E047: null, 15666 E048: "{a} declaration not directly within block.", 15667 E049: "A {a} cannot be named '{b}'.", 15668 E050: "Mozilla requires the yield expression to be parenthesized here.", 15669 E051: null, 15670 E052: "Unclosed template literal.", 15671 E053: "{a} declarations are only allowed at the top level of module scope.", 15672 E054: "Class properties must be methods. Expected '(' but instead saw '{a}'.", 15673 E055: "The '{a}' option cannot be set after any executable code.", 15674 E056: "'{a}' was used before it was declared, which is illegal for '{b}' variables.", 15675 E057: "Invalid meta property: '{a}.{b}'.", 15676 E058: "Missing semicolon.", 15677 E059: "Incompatible values for the '{a}' and '{b}' linting options.", 15678 E060: "Non-callable values cannot be used as the second operand to instanceof.", 15679 E061: "Invalid position for 'yield' expression (consider wrapping in parenthesis)." 15680 }; 15681 15682 var warnings = { 15683 W001: "'hasOwnProperty' is a really bad name.", 15684 W002: "Value of '{a}' may be overwritten in IE 8 and earlier.", 15685 W003: "'{a}' was used before it was defined.", 15686 W004: "'{a}' is already defined.", 15687 W005: "A dot following a number can be confused with a decimal point.", 15688 W006: "Confusing minuses.", 15689 W007: "Confusing plusses.", 15690 W008: "A leading decimal point can be confused with a dot: '{a}'.", 15691 W009: "The array literal notation [] is preferable.", 15692 W010: "The object literal notation {} is preferable.", 15693 W011: null, 15694 W012: null, 15695 W013: null, 15696 W014: "Misleading line break before '{a}'; readers may interpret this as an expression boundary.", 15697 W015: null, 15698 W016: "Unexpected use of '{a}'.", 15699 W017: "Bad operand.", 15700 W018: "Confusing use of '{a}'.", 15701 W019: "Use the isNaN function to compare with NaN.", 15702 W020: "Read only.", 15703 W021: "Reassignment of '{a}', which is is a {b}. " + 15704 "Use 'var' or 'let' to declare bindings that may change.", 15705 W022: "Do not assign to the exception parameter.", 15706 W023: "Expected an identifier in an assignment and instead saw a function invocation.", 15707 W024: "Expected an identifier and instead saw '{a}' (a reserved word).", 15708 W025: "Missing name in function declaration.", 15709 W026: "Inner functions should be listed at the top of the outer function.", 15710 W027: "Unreachable '{a}' after '{b}'.", 15711 W028: "Label '{a}' on {b} statement.", 15712 W030: "Expected an assignment or function call and instead saw an expression.", 15713 W031: "Do not use 'new' for side effects.", 15714 W032: "Unnecessary semicolon.", 15715 W033: "Missing semicolon.", 15716 W034: "Unnecessary directive \"{a}\".", 15717 W035: "Empty block.", 15718 W036: "Unexpected /*member '{a}'.", 15719 W037: "'{a}' is a statement label.", 15720 W038: "'{a}' used out of scope.", 15721 W039: "'{a}' is not allowed.", 15722 W040: "If a strict mode function is executed using function invocation, " + 15723 "its 'this' value will be undefined.", 15724 W041: null, 15725 W042: "Avoid EOL escaping.", 15726 W043: "Bad escaping of EOL. Use option multistr if needed.", 15727 W044: "Bad or unnecessary escaping.", /* TODO(caitp): remove W044 */ 15728 W045: "Bad number '{a}'.", 15729 W046: "Don't use extra leading zeros '{a}'.", 15730 W047: "A trailing decimal point can be confused with a dot: '{a}'.", 15731 W048: "Unexpected control character in regular expression.", 15732 W049: "Unexpected escaped character '{a}' in regular expression.", 15733 W050: "JavaScript URL.", 15734 W051: "Variables should not be deleted.", 15735 W052: "Unexpected '{a}'.", 15736 W053: "Do not use {a} as a constructor.", 15737 W054: "The Function constructor is a form of eval.", 15738 W055: "A constructor name should start with an uppercase letter.", 15739 W056: "Bad constructor.", 15740 W057: "Weird construction. Is 'new' necessary?", 15741 W058: "Missing '()' invoking a constructor.", 15742 W059: "Avoid arguments.{a}.", 15743 W060: "document.write can be a form of eval.", 15744 W061: "eval can be harmful.", 15745 W062: "Wrap an immediate function invocation in parens " + 15746 "to assist the reader in understanding that the expression " + 15747 "is the result of a function, and not the function itself.", 15748 W063: "Math is not a function.", 15749 W064: "Missing 'new' prefix when invoking a constructor.", 15750 W065: "Missing radix parameter.", 15751 W066: "Implied eval. Consider passing a function instead of a string.", 15752 W067: "Bad invocation.", 15753 W068: "Wrapping non-IIFE function literals in parens is unnecessary.", 15754 W069: "['{a}'] is better written in dot notation.", 15755 W070: "Extra comma. (it breaks older versions of IE)", 15756 W071: "This function has too many statements. ({a})", 15757 W072: "This function has too many parameters. ({a})", 15758 W073: "Blocks are nested too deeply. ({a})", 15759 W074: "This function's cyclomatic complexity is too high. ({a})", 15760 W075: "Duplicate {a} '{b}'.", 15761 W076: "Unexpected parameter '{a}' in get {b} function.", 15762 W077: "Expected a single parameter in set {a} function.", 15763 W078: "Setter is defined without getter.", 15764 W079: "Redefinition of '{a}'.", 15765 W080: "It's not necessary to initialize '{a}' to 'undefined'.", 15766 W081: null, 15767 W082: "Function declarations should not be placed in blocks. " + 15768 "Use a function expression or move the statement to the top of " + 15769 "the outer function.", 15770 W083: "Functions declared within loops referencing an outer scoped " + 15771 "variable may lead to confusing semantics.", 15772 W084: "Expected a conditional expression and instead saw an assignment.", 15773 W085: "Don't use 'with'.", 15774 W086: "Expected a 'break' statement before '{a}'.", 15775 W087: "Forgotten 'debugger' statement?", 15776 W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.", 15777 W089: "The body of a for in should be wrapped in an if statement to filter " + 15778 "unwanted properties from the prototype.", 15779 W090: "'{a}' is not a statement label.", 15780 W091: null, 15781 W093: "Did you mean to return a conditional instead of an assignment?", 15782 W094: "Unexpected comma.", 15783 W095: "Expected a string and instead saw {a}.", 15784 W096: "The '{a}' key may produce unexpected results.", 15785 W097: "Use the function form of \"use strict\".", 15786 W098: "'{a}' is defined but never used.", 15787 W099: null, 15788 W100: "This character may get silently deleted by one or more browsers.", 15789 W101: "Line is too long.", 15790 W102: null, 15791 W103: "The '{a}' property is deprecated.", 15792 W104: "'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).", 15793 W105: "Unexpected {a} in '{b}'.", 15794 W106: "Identifier '{a}' is not in camel case.", 15795 W107: "Script URL.", 15796 W108: "Strings must use doublequote.", 15797 W109: "Strings must use singlequote.", 15798 W110: "Mixed double and single quotes.", 15799 W112: "Unclosed string.", 15800 W113: "Control character in string: {a}.", 15801 W114: "Avoid {a}.", 15802 W115: "Octal literals are not allowed in strict mode.", 15803 W116: "Expected '{a}' and instead saw '{b}'.", 15804 W117: "'{a}' is not defined.", 15805 W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).", 15806 W119: "'{a}' is only available in ES{b} (use 'esversion: {b}').", 15807 W120: "You might be leaking a variable ({a}) here.", 15808 W121: "Extending prototype of native object: '{a}'.", 15809 W122: "Invalid typeof value '{a}'", 15810 W123: "'{a}' is already defined in outer scope.", 15811 W124: "A generator function should contain at least one yield expression.", 15812 W125: "This line contains non-breaking spaces: http://jshint.com/docs/options/#nonbsp", 15813 W126: "Unnecessary grouping operator.", 15814 W127: "Unexpected use of a comma operator.", 15815 W128: "Empty array elements require elision=true.", 15816 W129: "'{a}' is defined in a future version of JavaScript. Use a " + 15817 "different variable name to avoid migration issues.", 15818 W130: "Invalid element after rest element.", 15819 W131: "Invalid parameter after rest parameter.", 15820 W132: "`var` declarations are forbidden. Use `let` or `const` instead.", 15821 W133: "Invalid for-{a} loop left-hand-side: {b}.", 15822 W134: "The '{a}' option is only available when linting ECMAScript {b} code.", 15823 W135: "{a} may not be supported by non-browser environments.", 15824 W136: "'{a}' must be in function scope.", 15825 W137: "Empty destructuring.", 15826 W138: "Regular parameters should not come after default parameters.", 15827 W139: "Function expressions should not be used as the second operand to instanceof.", 15828 W140: "Missing comma." 15829 }; 15830 15831 var info = { 15832 I001: "Comma warnings can be turned off with 'laxcomma'.", 15833 I002: null, 15834 I003: "ES5 option is now set per default" 15835 }; 15836 15837 exports.errors = {}; 15838 exports.warnings = {}; 15839 exports.info = {}; 15840 15841 _.each(errors, function(desc, code) { 15842 exports.errors[code] = { code: code, desc: desc }; 15843 }); 15844 15845 _.each(warnings, function(desc, code) { 15846 exports.warnings[code] = { code: code, desc: desc }; 15847 }); 15848 15849 _.each(info, function(desc, code) { 15850 exports.info[code] = { code: code, desc: desc }; 15851 }); 15852 15853 },{"lodash":12}],15:[function(require,module,exports){ 15854 "use strict"; 15855 15856 function NameStack() { 15857 this._stack = []; 15858 } 15859 15860 Object.defineProperty(NameStack.prototype, "length", { 15861 get: function() { 15862 return this._stack.length; 15863 } 15864 }); 15865 15866 /** 15867 * Create a new entry in the stack. Useful for tracking names across 15868 * expressions. 15869 */ 15870 NameStack.prototype.push = function() { 15871 this._stack.push(null); 15872 }; 15873 15874 /** 15875 * Discard the most recently-created name on the stack. 15876 */ 15877 NameStack.prototype.pop = function() { 15878 this._stack.pop(); 15879 }; 15880 15881 /** 15882 * Update the most recent name on the top of the stack. 15883 * 15884 * @param {object} token The token to consider as the source for the most 15885 * recent name. 15886 */ 15887 NameStack.prototype.set = function(token) { 15888 this._stack[this.length - 1] = token; 15889 }; 15890 15891 /** 15892 * Generate a string representation of the most recent name. 15893 * 15894 * @returns {string} 15895 */ 15896 NameStack.prototype.infer = function() { 15897 var nameToken = this._stack[this.length - 1]; 15898 var prefix = ""; 15899 var type; 15900 15901 // During expected operation, the topmost entry on the stack will only 15902 // reflect the current function's name when the function is declared without 15903 // the `function` keyword (i.e. for in-line accessor methods). In other 15904 // cases, the `function` expression itself will introduce an empty entry on 15905 // the top of the stack, and this should be ignored. 15906 if (!nameToken || nameToken.type === "class") { 15907 nameToken = this._stack[this.length - 2]; 15908 } 15909 15910 if (!nameToken) { 15911 return "(empty)"; 15912 } 15913 15914 type = nameToken.type; 15915 15916 if (type !== "(string)" && type !== "(number)" && type !== "(identifier)" && type !== "default") { 15917 return "(expression)"; 15918 } 15919 15920 if (nameToken.accessorType) { 15921 prefix = nameToken.accessorType + " "; 15922 } 15923 15924 return prefix + nameToken.value; 15925 }; 15926 15927 module.exports = NameStack; 15928 15929 },{}],16:[function(require,module,exports){ 15930 "use strict"; 15931 15932 // These are the JSHint boolean options. 15933 exports.bool = { 15934 enforcing: { 15935 15936 /** 15937 * This option prohibits the use of bitwise operators such as `^` (XOR), 15938 * `|` (OR) and others. Bitwise operators are very rare in JavaScript 15939 * programs and quite often `&` is simply a mistyped `&&`. 15940 */ 15941 bitwise : true, 15942 15943 /** 15944 * 15945 * This options prohibits overwriting prototypes of native objects such as 15946 * `Array`, `Date` and so on. 15947 * 15948 * // jshint freeze:true 15949 * Array.prototype.count = function (value) { return 4; }; 15950 * // -> Warning: Extending prototype of native object: 'Array'. 15951 */ 15952 freeze : true, 15953 15954 /** 15955 * This option allows you to force all variable names to use either 15956 * camelCase style or UPPER_CASE with underscores. 15957 * 15958 * @deprecated JSHint is limiting its scope to issues of code correctness. 15959 * If you would like to enforce rules relating to code style, 15960 * check out [the JSCS 15961 * project](https://github.com/jscs-dev/node-jscs). 15962 */ 15963 camelcase : true, 15964 15965 /** 15966 * This option requires you to always put curly braces around blocks in 15967 * loops and conditionals. JavaScript allows you to omit curly braces when 15968 * the block consists of only one statement, for example: 15969 * 15970 * while (day) 15971 * shuffle(); 15972 * 15973 * However, in some circumstances, it can lead to bugs (you'd think that 15974 * `sleep()` is a part of the loop while in reality it is not): 15975 * 15976 * while (day) 15977 * shuffle(); 15978 * sleep(); 15979 */ 15980 curly : true, 15981 15982 /** 15983 * This options prohibits the use of `==` and `!=` in favor of `===` and 15984 * `!==`. The former try to coerce values before comparing them which can 15985 * lead to some unexpected results. The latter don't do any coercion so 15986 * they are generally safer. If you would like to learn more about type 15987 * coercion in JavaScript, we recommend [Truth, Equality and 15988 * JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/) 15989 * by Angus Croll. 15990 */ 15991 eqeqeq : true, 15992 15993 /** 15994 * This option enables warnings about the use of identifiers which are 15995 * defined in future versions of JavaScript. Although overwriting them has 15996 * no effect in contexts where they are not implemented, this practice can 15997 * cause issues when migrating codebases to newer versions of the language. 15998 */ 15999 futurehostile: true, 16000 16001 /** 16002 * This option tells JSHint that your code needs to adhere to ECMAScript 3 16003 * specification. Use this option if you need your program to be executable 16004 * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy 16005 * JavaScript environments. 16006 * 16007 * @deprecated Use `esversion: 3` instead. 16008 */ 16009 es3 : true, 16010 16011 /** 16012 * This option enables syntax first defined in [the ECMAScript 5.1 16013 * specification](http://es5.github.io/). This includes allowing reserved 16014 * keywords as object properties. 16015 * 16016 * @deprecated Use `esversion: 5` instead. 16017 */ 16018 es5 : true, 16019 16020 /** 16021 * This option requires all `for in` loops to filter object's items. The 16022 * for in statement allows for looping through the names of all of the 16023 * properties of an object including those inherited through the prototype 16024 * chain. This behavior can lead to unexpected items in your object so it 16025 * is generally safer to always filter inherited properties out as shown in 16026 * the example: 16027 * 16028 * for (key in obj) { 16029 * if (obj.hasOwnProperty(key)) { 16030 * // We are sure that obj[key] belongs to the object and was not inherited. 16031 * } 16032 * } 16033 * 16034 * For more in-depth understanding of `for in` loops in JavaScript, read 16035 * [Exploring JavaScript for-in 16036 * loops](http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/) 16037 * by Angus Croll. 16038 */ 16039 forin : true, 16040 16041 /** 16042 * This option prohibits the use of immediate function invocations without 16043 * wrapping them in parentheses. Wrapping parentheses assists readers of 16044 * your code in understanding that the expression is the result of a 16045 * function, and not the function itself. 16046 * 16047 * @deprecated JSHint is limiting its scope to issues of code correctness. 16048 * If you would like to enforce rules relating to code style, 16049 * check out [the JSCS 16050 * project](https://github.com/jscs-dev/node-jscs). 16051 */ 16052 immed : true, 16053 16054 /** 16055 * This option requires you to capitalize names of constructor functions. 16056 * Capitalizing functions that are intended to be used with `new` operator 16057 * is just a convention that helps programmers to visually distinguish 16058 * constructor functions from other types of functions to help spot 16059 * mistakes when using `this`. 16060 * 16061 * Not doing so won't break your code in any browsers or environments but 16062 * it will be a bit harder to figure out—by reading the code—if the 16063 * function was supposed to be used with or without new. And this is 16064 * important because when the function that was intended to be used with 16065 * `new` is used without it, `this` will point to the global object instead 16066 * of a new object. 16067 * 16068 * @deprecated JSHint is limiting its scope to issues of code correctness. 16069 * If you would like to enforce rules relating to code style, 16070 * check out [the JSCS 16071 * project](https://github.com/jscs-dev/node-jscs). 16072 */ 16073 newcap : true, 16074 16075 /** 16076 * This option prohibits the use of `arguments.caller` and 16077 * `arguments.callee`. Both `.caller` and `.callee` make quite a few 16078 * optimizations impossible so they were deprecated in future versions of 16079 * JavaScript. In fact, ECMAScript 5 forbids the use of `arguments.callee` 16080 * in strict mode. 16081 */ 16082 noarg : true, 16083 16084 /** 16085 * This option prohibits the use of the comma operator. When misused, the 16086 * comma operator can obscure the value of a statement and promote 16087 * incorrect code. 16088 */ 16089 nocomma : true, 16090 16091 /** 16092 * This option warns when you have an empty block in your code. JSLint was 16093 * originally warning for all empty blocks and we simply made it optional. 16094 * There were no studies reporting that empty blocks in JavaScript break 16095 * your code in any way. 16096 * 16097 * @deprecated JSHint is limiting its scope to issues of code correctness. 16098 * If you would like to enforce rules relating to code style, 16099 * check out [the JSCS 16100 * project](https://github.com/jscs-dev/node-jscs). 16101 */ 16102 noempty : true, 16103 16104 /** 16105 * This option warns about "non-breaking whitespace" characters. These 16106 * characters can be entered with option-space on Mac computers and have a 16107 * potential of breaking non-UTF8 web pages. 16108 */ 16109 nonbsp : true, 16110 16111 /** 16112 * This option prohibits the use of constructor functions for side-effects. 16113 * Some people like to call constructor functions without assigning its 16114 * result to any variable: 16115 * 16116 * new MyConstructor(); 16117 * 16118 * There is no advantage in this approach over simply calling 16119 * `MyConstructor` since the object that the operator `new` creates isn't 16120 * used anywhere so you should generally avoid constructors like this one. 16121 */ 16122 nonew : true, 16123 16124 /** 16125 * This option prohibits the use of explicitly undeclared variables. This 16126 * option is very useful for spotting leaking and mistyped variables. 16127 * 16128 * // jshint undef:true 16129 * 16130 * function test() { 16131 * var myVar = 'Hello, World'; 16132 * console.log(myvar); // Oops, typoed here. JSHint with undef will complain 16133 * } 16134 * 16135 * If your variable is defined in another file, you can use the `global` 16136 * directive to tell JSHint about it. 16137 */ 16138 undef : true, 16139 16140 /** 16141 * This option prohibits the use of the grouping operator when it is not 16142 * strictly required. Such usage commonly reflects a misunderstanding of 16143 * unary operators, for example: 16144 * 16145 * // jshint singleGroups: true 16146 * 16147 * delete(obj.attr); // Warning: Unnecessary grouping operator. 16148 */ 16149 singleGroups: false, 16150 16151 /** 16152 * When set to true, the use of VariableStatements are forbidden. 16153 * For example: 16154 * 16155 * // jshint varstmt: true 16156 * 16157 * var a; // Warning: `var` declarations are forbidden. Use `let` or `const` instead. 16158 */ 16159 varstmt: false, 16160 16161 /** 16162 * This option is a short hand for the most strict JSHint configuration as 16163 * available in JSHint version 2.6.3. It enables all enforcing options and 16164 * disables all relaxing options that were defined in that release. 16165 * 16166 * @deprecated The option cannot be maintained without automatically opting 16167 * users in to new features. This can lead to unexpected 16168 * warnings/errors in when upgrading between minor versions of 16169 * JSHint. 16170 */ 16171 enforceall : false, 16172 16173 /** 16174 * This option warns when a comma is not placed after the last element in an 16175 * array or object literal. Due to bugs in old versions of IE, trailing 16176 * commas used to be discouraged, but since ES5 their semantics were 16177 * standardized. (See 16178 * [#11.1.4](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.4) and 16179 * [#11.1.5](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5).) 16180 * Now, they help to prevent the same [visual 16181 * ambiguities](http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.2) 16182 * that the strict usage of semicolons helps prevent. 16183 * 16184 * For example, this code might have worked last Tuesday: 16185 * 16186 * [ 16187 * b + c 16188 * ].forEach(print); 16189 * 16190 * But if one adds an element to the array and forgets to compensate for the 16191 * missing comma, no syntax error is thrown, and a linter cannot determine 16192 * if this was a mistake or an intentional function invocation. 16193 * 16194 * [ 16195 * b + c 16196 * (d + e) 16197 * ].forEach(print); 16198 * 16199 * If one always appends a list item with a comma, this ambiguity cannot 16200 * occur: 16201 * 16202 * [ 16203 * b + c, 16204 * ].forEach(print); 16205 * 16206 * [ 16207 * b + c, 16208 * (d + e), 16209 * ].forEach(print); 16210 */ 16211 trailingcomma: false 16212 }, 16213 relaxing: { 16214 16215 /** 16216 * This option suppresses warnings about missing semicolons. There is a lot 16217 * of FUD about semicolon spread by quite a few people in the community. 16218 * The common myths are that semicolons are required all the time (they are 16219 * not) and that they are unreliable. JavaScript has rules about semicolons 16220 * which are followed by *all* browsers so it is up to you to decide 16221 * whether you should or should not use semicolons in your code. 16222 * 16223 * For more information about semicolons in JavaScript read [An Open Letter 16224 * to JavaScript Leaders Regarding 16225 * Semicolons](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding) 16226 * by Isaac Schlueter and [JavaScript Semicolon 16227 * Insertion](http://inimino.org/~inimino/blog/javascript_semicolons). 16228 */ 16229 asi : true, 16230 16231 /** 16232 * This option suppresses warnings about multi-line strings. Multi-line 16233 * strings can be dangerous in JavaScript because all hell breaks loose if 16234 * you accidentally put a whitespace in between the escape character (`\`) 16235 * and a new line. 16236 * 16237 * Note that even though this option allows correct multi-line strings, it 16238 * still warns about multi-line strings without escape characters or with 16239 * anything in between the escape character and a whitespace. 16240 * 16241 * // jshint multistr:true 16242 * 16243 * var text = "Hello\ 16244 * World"; // All good. 16245 * 16246 * text = "Hello 16247 * World"; // Warning, no escape character. 16248 * 16249 * text = "Hello\ 16250 * World"; // Warning, there is a space after \ 16251 * 16252 * @deprecated JSHint is limiting its scope to issues of code correctness. 16253 * If you would like to enforce rules relating to code style, 16254 * check out [the JSCS 16255 * project](https://github.com/jscs-dev/node-jscs). 16256 */ 16257 multistr : true, 16258 16259 /** 16260 * This option suppresses warnings about the `debugger` statements in your 16261 * code. 16262 */ 16263 debug : true, 16264 16265 /** 16266 * This option suppresses warnings about the use of assignments in cases 16267 * where comparisons are expected. More often than not, code like `if (a = 16268 * 10) {}` is a typo. However, it can be useful in cases like this one: 16269 * 16270 * for (var i = 0, person; person = people[i]; i++) {} 16271 * 16272 * You can silence this error on a per-use basis by surrounding the assignment 16273 * with parenthesis, such as: 16274 * 16275 * for (var i = 0, person; (person = people[i]); i++) {} 16276 */ 16277 boss : true, 16278 16279 /** 16280 * This option suppresses warnings about the use of `eval`. The use of 16281 * `eval` is discouraged because it can make your code vulnerable to 16282 * various injection attacks and it makes it hard for JavaScript 16283 * interpreter to do certain optimizations. 16284 */ 16285 evil : true, 16286 16287 /** 16288 * This option suppresses warnings about declaring variables inside of 16289 * control 16290 * structures while accessing them later from the outside. Even though 16291 * JavaScript has only two real scopes—global and function—such practice 16292 * leads to confusion among people new to the language and hard-to-debug 16293 * bugs. This is why, by default, JSHint warns about variables that are 16294 * used outside of their intended scope. 16295 * 16296 * function test() { 16297 * if (true) { 16298 * var x = 0; 16299 * } 16300 * 16301 * x += 1; // Default: 'x' used out of scope. 16302 * // No warning when funcscope:true 16303 * } 16304 */ 16305 funcscope : true, 16306 16307 /** 16308 * This option suppresses warnings about the use of global strict mode. 16309 * Global strict mode can break third-party widgets so it is not 16310 * recommended. 16311 * 16312 * For more info about strict mode see the `strict` option. 16313 * 16314 * @deprecated Use `strict: "global"`. 16315 */ 16316 globalstrict: true, 16317 16318 /** 16319 * This option suppresses warnings about the `__iterator__` property. This 16320 * property is not supported by all browsers so use it carefully. 16321 */ 16322 iterator : true, 16323 16324 /** 16325 * This option suppresses warnings about invalid `typeof` operator values. 16326 * This operator has only [a limited set of possible return 16327 * values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof). 16328 * By default, JSHint warns when you compare its result with an invalid 16329 * value which often can be a typo. 16330 * 16331 * // 'fuction' instead of 'function' 16332 * if (typeof a == "fuction") { // Invalid typeof value 'fuction' 16333 * // ... 16334 * } 16335 * 16336 * Do not use this option unless you're absolutely sure you don't want 16337 * these checks. 16338 */ 16339 notypeof : true, 16340 16341 /** 16342 * This option prohibits the use of unary increment and decrement 16343 * operators. Some people think that `++` and `--` reduces the quality of 16344 * their coding styles and there are programming languages—such as 16345 * Python—that go completely without these operators. 16346 */ 16347 plusplus : true, 16348 16349 /** 16350 * This option suppresses warnings about the `__proto__` property. 16351 */ 16352 proto : true, 16353 16354 /** 16355 * This option suppresses warnings about the use of script-targeted 16356 * URLs—such as `javascript:...`. 16357 */ 16358 scripturl : true, 16359 16360 /** 16361 * This option suppresses warnings about using `[]` notation when it can be 16362 * expressed in dot notation: `person['name']` vs. `person.name`. 16363 * 16364 * @deprecated JSHint is limiting its scope to issues of code correctness. 16365 * If you would like to enforce rules relating to code style, 16366 * check out [the JSCS 16367 * project](https://github.com/jscs-dev/node-jscs). 16368 */ 16369 sub : true, 16370 16371 /** 16372 * This option suppresses warnings about "weird" constructions like 16373 * `new function () { ... }` and `new Object;`. Such constructions are 16374 * sometimes used to produce singletons in JavaScript: 16375 * 16376 * var singleton = new function() { 16377 * var privateVar; 16378 * 16379 * this.publicMethod = function () {} 16380 * this.publicMethod2 = function () {} 16381 * }; 16382 */ 16383 supernew : true, 16384 16385 /** 16386 * This option suppresses most of the warnings about possibly unsafe line 16387 * breakings in your code. It doesn't suppress warnings about comma-first 16388 * coding style. To suppress those you have to use `laxcomma` (see below). 16389 * 16390 * @deprecated JSHint is limiting its scope to issues of code correctness. 16391 * If you would like to enforce rules relating to code style, 16392 * check out [the JSCS 16393 * project](https://github.com/jscs-dev/node-jscs). 16394 */ 16395 laxbreak : true, 16396 16397 /** 16398 * This option suppresses warnings about comma-first coding style: 16399 * 16400 * var obj = { 16401 * name: 'Anton' 16402 * , handle: 'valueof' 16403 * , role: 'SW Engineer' 16404 * }; 16405 * 16406 * @deprecated JSHint is limiting its scope to issues of code correctness. 16407 * If you would like to enforce rules relating to code style, 16408 * check out [the JSCS 16409 * project](https://github.com/jscs-dev/node-jscs). 16410 */ 16411 laxcomma : true, 16412 16413 /** 16414 * This option suppresses warnings about possible strict violations when 16415 * the code is running in strict mode and you use `this` in a 16416 * non-constructor function. You should use this option—in a function scope 16417 * only—when you are positive that your use of `this` is valid in the 16418 * strict mode (for example, if you call your function using 16419 * `Function.call`). 16420 * 16421 * **Note:** This option can be used only inside of a function scope. 16422 * JSHint will fail with an error if you will try to set this option 16423 * globally. 16424 */ 16425 validthis : true, 16426 16427 /** 16428 * This option suppresses warnings about the use of the `with` statement. 16429 * The semantics of the `with` statement can cause confusion among 16430 * developers and accidental definition of global variables. 16431 * 16432 * More info: 16433 * 16434 * * [with Statement Considered 16435 * Harmful](http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/) 16436 */ 16437 withstmt : true, 16438 16439 /** 16440 * This options tells JSHint that your code uses Mozilla JavaScript 16441 * extensions. Unless you develop specifically for the Firefox web browser 16442 * you don't need this option. 16443 * 16444 * More info: 16445 * 16446 * * [New in JavaScript 16447 * 1.7](https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7) 16448 */ 16449 moz : true, 16450 16451 /** 16452 * This option suppresses warnings about generator functions with no 16453 * `yield` statement in them. 16454 */ 16455 noyield : true, 16456 16457 /** 16458 * This option suppresses warnings about `== null` comparisons. Such 16459 * comparisons are often useful when you want to check if a variable is 16460 * `null` or `undefined`. 16461 */ 16462 eqnull : true, 16463 16464 /** 16465 * This option suppresses warnings about missing semicolons, but only when 16466 * the semicolon is omitted for the last statement in a one-line block: 16467 * 16468 * var name = (function() { return 'Anton' }()); 16469 * 16470 * This is a very niche use case that is useful only when you use automatic 16471 * JavaScript code generators. 16472 */ 16473 lastsemic : true, 16474 16475 /** 16476 * This option suppresses warnings about functions inside of loops. 16477 * Defining functions inside of loops can lead to bugs such as this one: 16478 * 16479 * var nums = []; 16480 * 16481 * for (var i = 0; i < 10; i++) { 16482 * nums[i] = function (j) { 16483 * return i + j; 16484 * }; 16485 * } 16486 * 16487 * nums[0](2); // Prints 12 instead of 2 16488 * 16489 * To fix the code above you need to copy the value of `i`: 16490 * 16491 * var nums = []; 16492 * 16493 * for (var i = 0; i < 10; i++) { 16494 * (function (i) { 16495 * nums[i] = function (j) { 16496 * return i + j; 16497 * }; 16498 * }(i)); 16499 * } 16500 */ 16501 loopfunc : true, 16502 16503 /** 16504 * This option suppresses warnings about the use of expressions where 16505 * normally you would expect to see assignments or function calls. Most of 16506 * the time, such code is a typo. However, it is not forbidden by the spec 16507 * and that's why this warning is optional. 16508 */ 16509 expr : true, 16510 16511 /** 16512 * This option tells JSHint that your code uses ECMAScript 6 specific 16513 * syntax. Note that not all browsers implement these features. 16514 * 16515 * More info: 16516 * 16517 * * [Specification for ECMAScript 16518 * 6](http://www.ecma-international.org/ecma-262/6.0/index.html) 16519 * 16520 * @deprecated Use `esversion: 6` instead. 16521 */ 16522 esnext : true, 16523 16524 /** 16525 * This option tells JSHint that your code uses ES3 array elision elements, 16526 * or empty elements (for example, `[1, , , 4, , , 7]`). 16527 */ 16528 elision : true, 16529 }, 16530 16531 // Third party globals 16532 environments: { 16533 16534 /** 16535 * This option defines globals exposed by the 16536 * [MooTools](http://mootools.net/) JavaScript framework. 16537 */ 16538 mootools : true, 16539 16540 /** 16541 * This option defines globals exposed by 16542 * [CouchDB](http://couchdb.apache.org/). CouchDB is a document-oriented 16543 * database that can be queried and indexed in a MapReduce fashion using 16544 * JavaScript. 16545 */ 16546 couch : true, 16547 16548 /** 16549 * This option defines globals exposed by [the Jasmine unit testing 16550 * framework](https://jasmine.github.io/). 16551 */ 16552 jasmine : true, 16553 16554 /** 16555 * This option defines globals exposed by the [jQuery](http://jquery.com/) 16556 * JavaScript library. 16557 */ 16558 jquery : true, 16559 16560 /** 16561 * This option defines globals available when your code is running inside 16562 * of the Node runtime environment. [Node.js](http://nodejs.org/) is a 16563 * server-side JavaScript environment that uses an asynchronous 16564 * event-driven model. This option also skips some warnings that make sense 16565 * in the browser environments but don't make sense in Node such as 16566 * file-level `use strict` pragmas and `console.log` statements. 16567 */ 16568 node : true, 16569 16570 /** 16571 * This option defines globals exposed by [the QUnit unit testing 16572 * framework](http://qunitjs.com/). 16573 */ 16574 qunit : true, 16575 16576 /** 16577 * This option defines globals available when your code is running inside 16578 * of the Rhino runtime environment. [Rhino](http://www.mozilla.org/rhino/) 16579 * is an open-source implementation of JavaScript written entirely in Java. 16580 */ 16581 rhino : true, 16582 16583 /** 16584 * This option defines globals exposed by [the ShellJS 16585 * library](http://documentup.com/arturadib/shelljs). 16586 */ 16587 shelljs : true, 16588 16589 /** 16590 * This option defines globals exposed by the 16591 * [Prototype](http://www.prototypejs.org/) JavaScript framework. 16592 */ 16593 prototypejs : true, 16594 16595 /** 16596 * This option defines globals exposed by the [YUI](http://yuilibrary.com/) 16597 * JavaScript framework. 16598 */ 16599 yui : true, 16600 16601 /** 16602 * This option defines globals exposed by the "BDD" and "TDD" UIs of the 16603 * [Mocha unit testing framework](http://mochajs.org/). 16604 */ 16605 mocha : true, 16606 16607 /** 16608 * This option informs JSHint that the input code describes an ECMAScript 6 16609 * module. All module code is interpreted as strict mode code. 16610 */ 16611 module : true, 16612 16613 /** 16614 * This option defines globals available when your code is running as a 16615 * script for the [Windows Script 16616 * Host](http://en.wikipedia.org/wiki/Windows_Script_Host). 16617 */ 16618 wsh : true, 16619 16620 /** 16621 * This option defines globals available when your code is running inside 16622 * of a Web Worker. [Web 16623 * Workers](https://developer.mozilla.org/en/Using_web_workers) provide a 16624 * simple means for web content to run scripts in background threads. 16625 */ 16626 worker : true, 16627 16628 /** 16629 * This option defines non-standard but widely adopted globals such as 16630 * `escape` and `unescape`. 16631 */ 16632 nonstandard : true, 16633 16634 /** 16635 * This option defines globals exposed by modern browsers: all the way from 16636 * good old `document` and `navigator` to the HTML5 `FileReader` and other 16637 * new developments in the browser world. 16638 * 16639 * **Note:** This option doesn't expose variables like `alert` or 16640 * `console`. See option `devel` for more information. 16641 */ 16642 browser : true, 16643 16644 /** 16645 * This option defines globals available when using [the Browserify 16646 * tool](http://browserify.org/) to build a project. 16647 */ 16648 browserify : true, 16649 16650 /** 16651 * This option defines globals that are usually used for logging poor-man's 16652 * debugging: `console`, `alert`, etc. It is usually a good idea to not 16653 * ship them in production because, for example, `console.log` breaks in 16654 * legacy versions of Internet Explorer. 16655 */ 16656 devel : true, 16657 16658 /** 16659 * This option defines globals exposed by the [Dojo 16660 * Toolkit](http://dojotoolkit.org/). 16661 */ 16662 dojo : true, 16663 16664 /** 16665 * This option defines globals for typed array constructors. 16666 * 16667 * More info: 16668 * 16669 * * [JavaScript typed 16670 * arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) 16671 */ 16672 typed : true, 16673 16674 /** 16675 * This option defines globals available when your core is running inside 16676 * of the PhantomJS runtime environment. [PhantomJS](http://phantomjs.org/) 16677 * is a headless WebKit scriptable with a JavaScript API. It has fast and 16678 * native support for various web standards: DOM handling, CSS selector, 16679 * JSON, Canvas, and SVG. 16680 */ 16681 phantom : true 16682 }, 16683 16684 // Obsolete options 16685 obsolete: { 16686 onecase : true, // if one case switch statements should be allowed 16687 regexp : true, // if the . should not be allowed in regexp literals 16688 regexdash : true // if unescaped first/last dash (-) inside brackets 16689 // should be tolerated 16690 } 16691 }; 16692 16693 // These are the JSHint options that can take any value 16694 // (we use this object to detect invalid options) 16695 exports.val = { 16696 16697 /** 16698 * This option lets you set the maximum length of a line. 16699 * 16700 * @deprecated JSHint is limiting its scope to issues of code correctness. If 16701 * you would like to enforce rules relating to code style, check 16702 * out [the JSCS project](https://github.com/jscs-dev/node-jscs). 16703 */ 16704 maxlen : false, 16705 16706 /** 16707 * This option sets a specific tab width for your code. 16708 * 16709 * @deprecated JSHint is limiting its scope to issues of code correctness. If 16710 * you would like to enforce rules relating to code style, check 16711 * out [the JSCS project](https://github.com/jscs-dev/node-jscs). 16712 */ 16713 indent : false, 16714 16715 /** 16716 * This options allows you to set the maximum amount of warnings JSHint will 16717 * produce before giving up. Default is 50. 16718 */ 16719 maxerr : false, 16720 16721 /** 16722 * This option allows you to control which variables JSHint considers to be 16723 * implicitly defined in the environment. Configure it with an array of 16724 * string values. Prefixing a variable name with a hyphen (-) character will 16725 * remove that name from the collection of predefined variables. 16726 * 16727 * JSHint will consider variables declared in this way to be read-only. 16728 * 16729 * This option cannot be specified in-line; it may only be used via the 16730 * JavaScript API or from an external configuration file. 16731 */ 16732 predef : false, 16733 16734 /** 16735 * This option can be used to specify a white list of global variables that 16736 * are not formally defined in the source code. This is most useful when 16737 * combined with the `undef` option in order to suppress warnings for 16738 * project-specific global variables. 16739 * 16740 * Setting an entry to `true` enables reading and writing to that variable. 16741 * Setting it to `false` will trigger JSHint to consider that variable 16742 * read-only. 16743 * 16744 * See also the "environment" options: a set of options to be used as short 16745 * hand for enabling global variables defined in common JavaScript 16746 * environments. 16747 * 16748 * To configure `globals` within an individual file, see [Inline 16749 * Configuration](http://jshint.com/docs/#inline-configuration). 16750 */ 16751 globals : false, 16752 16753 /** 16754 * This option enforces the consistency of quotation marks used throughout 16755 * your code. It accepts three values: `true` if you don't want to enforce 16756 * one particular style but want some consistency, `"single"` if you want to 16757 * allow only single quotes and `"double"` if you want to allow only double 16758 * quotes. 16759 * 16760 * @deprecated JSHint is limiting its scope to issues of code correctness. If 16761 * you would like to enforce rules relating to code style, check 16762 * out [the JSCS project](https://github.com/jscs-dev/node-jscs). 16763 */ 16764 quotmark : false, 16765 16766 scope : false, 16767 16768 /** 16769 * This option lets you set the max number of statements allowed per function: 16770 * 16771 * // jshint maxstatements:4 16772 * 16773 * function main() { 16774 * var i = 0; 16775 * var j = 0; 16776 * 16777 * // Function declarations count as one statement. Their bodies 16778 * // don't get taken into account for the outer function. 16779 * function inner() { 16780 * var i2 = 1; 16781 * var j2 = 1; 16782 * 16783 * return i2 + j2; 16784 * } 16785 * 16786 * j = i + j; 16787 * return j; // JSHint: Too many statements per function. (5) 16788 * } 16789 */ 16790 maxstatements: false, 16791 16792 /** 16793 * This option lets you control how nested do you want your blocks to be: 16794 * 16795 * // jshint maxdepth:2 16796 * 16797 * function main(meaning) { 16798 * var day = true; 16799 * 16800 * if (meaning === 42) { 16801 * while (day) { 16802 * shuffle(); 16803 * 16804 * if (tired) { // JSHint: Blocks are nested too deeply (3). 16805 * sleep(); 16806 * } 16807 * } 16808 * } 16809 * } 16810 */ 16811 maxdepth : false, 16812 16813 /** 16814 * This option lets you set the max number of formal parameters allowed per 16815 * function: 16816 * 16817 * // jshint maxparams:3 16818 * 16819 * function login(request, onSuccess) { 16820 * // ... 16821 * } 16822 * 16823 * // JSHint: Too many parameters per function (4). 16824 * function logout(request, isManual, whereAmI, onSuccess) { 16825 * // ... 16826 * } 16827 */ 16828 maxparams : false, 16829 16830 /** 16831 * This option lets you control cyclomatic complexity throughout your code. 16832 * Cyclomatic complexity measures the number of linearly independent paths 16833 * through a program's source code. Read more about [cyclomatic complexity on 16834 * Wikipedia](http://en.wikipedia.org/wiki/Cyclomatic_complexity). 16835 */ 16836 maxcomplexity: false, 16837 16838 /** 16839 * This option suppresses warnings about variable shadowing i.e. declaring a 16840 * variable that had been already declared somewhere in the outer scope. 16841 * 16842 * - "inner" - check for variables defined in the same scope only 16843 * - "outer" - check for variables defined in outer scopes as well 16844 * - false - same as inner 16845 * - true - allow variable shadowing 16846 */ 16847 shadow : false, 16848 16849 /** 16850 * This option requires the code to run in ECMAScript 5's strict mode. 16851 * [Strict mode](https://developer.mozilla.org/en/JavaScript/Strict_mode) 16852 * is a way to opt in to a restricted variant of JavaScript. Strict mode 16853 * eliminates some JavaScript pitfalls that didn't cause errors by changing 16854 * them to produce errors. It also fixes mistakes that made it difficult 16855 * for the JavaScript engines to perform certain optimizations. 16856 * 16857 * - "global" - there must be a `"use strict";` directive at global level 16858 * - "implied" - lint the code as if there is the `"use strict";` directive 16859 * - false - disable warnings about strict mode 16860 * - true - there must be a `"use strict";` directive at function level; 16861 * this is preferable for scripts intended to be loaded in web 16862 * browsers directly because enabling strict mode globally 16863 * could adversely effect other scripts running on the same 16864 * page 16865 */ 16866 strict : true, 16867 16868 /** 16869 * This option warns when you define and never use your variables. It is very 16870 * useful for general code cleanup, especially when used in addition to 16871 * `undef`. 16872 * 16873 * // jshint unused:true 16874 * 16875 * function test(a, b) { 16876 * var c, d = 2; 16877 * 16878 * return a + d; 16879 * } 16880 * 16881 * test(1, 2); 16882 * 16883 * // Line 3: 'b' was defined but never used. 16884 * // Line 4: 'c' was defined but never used. 16885 * 16886 * In addition to that, this option will warn you about unused global 16887 * variables declared via the `global` directive. 16888 * 16889 * When set to `true`, unused parameters that are followed by a used 16890 * parameter will not produce warnings. This option can be set to `vars` to 16891 * only check for variables, not function parameters, or `strict` to check 16892 * all variables and parameters. 16893 */ 16894 unused : true, 16895 16896 /** 16897 * This option prohibits the use of a variable before it was defined. 16898 * JavaScript has function scope only and, in addition to that, all variables 16899 * are always moved—or hoisted— to the top of the function. This behavior can 16900 * lead to some very nasty bugs and that's why it is safer to always use 16901 * variable only after they have been explicitly defined. 16902 * 16903 * Setting this option to "nofunc" will allow function declarations to be 16904 * ignored. 16905 * 16906 * For more in-depth understanding of scoping and hoisting in JavaScript, 16907 * read [JavaScript Scoping and 16908 * Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting) 16909 * by Ben Cherry. 16910 */ 16911 latedef : false, 16912 16913 ignore : false, // start/end ignoring lines of code, bypassing the lexer 16914 // start - start ignoring lines, including the current line 16915 // end - stop ignoring lines, starting on the next line 16916 // line - ignore warnings / errors for just a single line 16917 // (this option does not bypass the lexer) 16918 16919 ignoreDelimiters: false, // array of start/end delimiters used to ignore 16920 // certain chunks from code 16921 16922 /** 16923 * This option is used to specify the ECMAScript version to which the code 16924 * must adhere. It can assume one of the following values: 16925 * - `3` - If you need your program to be executable 16926 * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy 16927 * JavaScript environments 16928 * - `5` - To enable syntax first defined in [the ECMAScript 5.1 16929 * specification](http://www.ecma-international.org/ecma-262/5.1/index.html). 16930 * This includes allowing reserved keywords as object properties. 16931 * - `6` - To tell JSHint that your code uses [ECMAScript 16932 * 6](http://www.ecma-international.org/ecma-262/6.0/index.html) specific 16933 * syntax. Note that not all browsers implement them. 16934 */ 16935 esversion: 5 16936 }; 16937 16938 // These are JSHint boolean options which are shared with JSLint 16939 // where the definition in JSHint is opposite JSLint 16940 exports.inverted = { 16941 bitwise : true, 16942 forin : true, 16943 newcap : true, 16944 plusplus: true, 16945 regexp : true, 16946 undef : true, 16947 16948 // Inverted and renamed, use JSHint name here 16949 eqeqeq : true, 16950 strict : true 16951 }; 16952 16953 exports.validNames = Object.keys(exports.val) 16954 .concat(Object.keys(exports.bool.relaxing)) 16955 .concat(Object.keys(exports.bool.enforcing)) 16956 .concat(Object.keys(exports.bool.obsolete)) 16957 .concat(Object.keys(exports.bool.environments)); 16958 16959 // These are JSHint boolean options which are shared with JSLint 16960 // where the name has been changed but the effect is unchanged 16961 exports.renamed = { 16962 eqeq : "eqeqeq", 16963 windows: "wsh", 16964 sloppy : "strict" 16965 }; 16966 16967 exports.removed = { 16968 nomen: true, 16969 onevar: true, 16970 passfail: true, 16971 white: true, 16972 gcl: true, 16973 smarttabs: true, 16974 trailing: true 16975 }; 16976 16977 // Add options here which should not be automatically enforced by 16978 // `enforceall`. 16979 exports.noenforceall = { 16980 varstmt: true, 16981 strict: true 16982 }; 16983 16984 },{}],17:[function(require,module,exports){ 16985 /* 16986 * Regular expressions. Some of these are stupidly long. 16987 */ 16988 16989 /*jshint maxlen:1000 */ 16990 16991 "use strict"; 16992 16993 // Unsafe comment or string (ax) 16994 exports.unsafeString = 16995 /@cc|<\/?|script|\]\s*\]|<\s*!|</i; 16996 16997 // Unsafe characters that are silently deleted by one or more browsers (cx) 16998 exports.unsafeChars = 16999 /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; 17000 17001 // Characters in strings that need escaping (nx and nxg) 17002 exports.needEsc = 17003 /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; 17004 17005 exports.needEscGlobal = 17006 /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; 17007 17008 // Star slash (lx) 17009 exports.starSlash = /\*\//; 17010 17011 // Identifier (ix) 17012 exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; 17013 17014 // JavaScript URL (jx) 17015 exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i; 17016 17017 // Catches /* falls through */ comments (ft) 17018 exports.fallsThrough = /^\s*falls?\sthrough\s*$/; 17019 17020 // very conservative rule (eg: only one space between the start of the comment and the first character) 17021 // to relax the maxlen option 17022 exports.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/; 17023 17024 },{}],18:[function(require,module,exports){ 17025 "use strict"; 17026 17027 var _ = require("lodash"); 17028 var events = require("events"); 17029 17030 // Used to denote membership in lookup tables (a primitive value such as `true` 17031 // would be silently rejected for the property name "__proto__" in some 17032 // environments) 17033 var marker = {}; 17034 17035 /** 17036 * Creates a scope manager that handles variables and labels, storing usages 17037 * and resolving when variables are used and undefined 17038 */ 17039 var scopeManager = function(state, predefined, exported, declared) { 17040 17041 var _current; 17042 var _scopeStack = []; 17043 17044 function _newScope(type) { 17045 _current = { 17046 "(labels)": Object.create(null), 17047 "(usages)": Object.create(null), 17048 "(breakLabels)": Object.create(null), 17049 "(parent)": _current, 17050 "(type)": type, 17051 "(params)": (type === "functionparams" || type === "catchparams") ? [] : null 17052 }; 17053 _scopeStack.push(_current); 17054 } 17055 17056 _newScope("global"); 17057 _current["(predefined)"] = predefined; 17058 17059 var _currentFunctBody = _current; // this is the block after the params = function 17060 17061 var usedPredefinedAndGlobals = Object.create(null); 17062 var impliedGlobals = Object.create(null); 17063 var unuseds = []; 17064 var emitter = new events.EventEmitter(); 17065 17066 function warning(code, token) { 17067 emitter.emit("warning", { 17068 code: code, 17069 token: token, 17070 data: _.slice(arguments, 2) 17071 }); 17072 } 17073 17074 function error(code, token) { 17075 emitter.emit("warning", { 17076 code: code, 17077 token: token, 17078 data: _.slice(arguments, 2) 17079 }); 17080 } 17081 17082 function _setupUsages(labelName) { 17083 if (!_current["(usages)"][labelName]) { 17084 _current["(usages)"][labelName] = { 17085 "(modified)": [], 17086 "(reassigned)": [], 17087 "(tokens)": [] 17088 }; 17089 } 17090 } 17091 17092 var _getUnusedOption = function(unused_opt) { 17093 if (unused_opt === undefined) { 17094 unused_opt = state.option.unused; 17095 } 17096 17097 if (unused_opt === true) { 17098 unused_opt = "last-param"; 17099 } 17100 17101 return unused_opt; 17102 }; 17103 17104 var _warnUnused = function(name, tkn, type, unused_opt) { 17105 var line = tkn.line; 17106 var chr = tkn.from; 17107 var raw_name = tkn.raw_text || name; 17108 17109 unused_opt = _getUnusedOption(unused_opt); 17110 17111 var warnable_types = { 17112 "vars": ["var"], 17113 "last-param": ["var", "param"], 17114 "strict": ["var", "param", "last-param"] 17115 }; 17116 17117 if (unused_opt) { 17118 if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) { 17119 warning("W098", { line: line, from: chr }, raw_name); 17120 } 17121 } 17122 17123 // inconsistent - see gh-1894 17124 if (unused_opt || type === "var") { 17125 unuseds.push({ 17126 name: name, 17127 line: line, 17128 character: chr 17129 }); 17130 } 17131 }; 17132 17133 /** 17134 * Checks the current scope for unused identifiers 17135 */ 17136 function _checkForUnused() { 17137 // function params are handled specially 17138 // assume that parameters are the only thing declared in the param scope 17139 if (_current["(type)"] === "functionparams") { 17140 _checkParams(); 17141 return; 17142 } 17143 var curentLabels = _current["(labels)"]; 17144 for (var labelName in curentLabels) { 17145 if (curentLabels[labelName]) { 17146 if (curentLabels[labelName]["(type)"] !== "exception" && 17147 curentLabels[labelName]["(unused)"]) { 17148 _warnUnused(labelName, curentLabels[labelName]["(token)"], "var"); 17149 } 17150 } 17151 } 17152 } 17153 17154 /** 17155 * Checks the current scope for unused parameters 17156 * Must be called in a function parameter scope 17157 */ 17158 function _checkParams() { 17159 var params = _current["(params)"]; 17160 17161 if (!params) { 17162 return; 17163 } 17164 17165 var param = params.pop(); 17166 var unused_opt; 17167 17168 while (param) { 17169 var label = _current["(labels)"][param]; 17170 17171 unused_opt = _getUnusedOption(state.funct["(unusedOption)"]); 17172 17173 // 'undefined' is a special case for (function(window, undefined) { ... })(); 17174 // patterns. 17175 if (param === "undefined") 17176 return; 17177 17178 if (label["(unused)"]) { 17179 _warnUnused(param, label["(token)"], "param", state.funct["(unusedOption)"]); 17180 } else if (unused_opt === "last-param") { 17181 return; 17182 } 17183 17184 param = params.pop(); 17185 } 17186 } 17187 17188 /** 17189 * Finds the relevant label's scope, searching from nearest outwards 17190 * @returns {Object} the scope the label was found in 17191 */ 17192 function _getLabel(labelName) { 17193 for (var i = _scopeStack.length - 1 ; i >= 0; --i) { 17194 var scopeLabels = _scopeStack[i]["(labels)"]; 17195 if (scopeLabels[labelName]) { 17196 return scopeLabels; 17197 } 17198 } 17199 } 17200 17201 function usedSoFarInCurrentFunction(labelName) { 17202 // used so far in this whole function and any sub functions 17203 for (var i = _scopeStack.length - 1; i >= 0; i--) { 17204 var current = _scopeStack[i]; 17205 if (current["(usages)"][labelName]) { 17206 return current["(usages)"][labelName]; 17207 } 17208 if (current === _currentFunctBody) { 17209 break; 17210 } 17211 } 17212 return false; 17213 } 17214 17215 function _checkOuterShadow(labelName, token) { 17216 17217 // only check if shadow is outer 17218 if (state.option.shadow !== "outer") { 17219 return; 17220 } 17221 17222 var isGlobal = _currentFunctBody["(type)"] === "global", 17223 isNewFunction = _current["(type)"] === "functionparams"; 17224 17225 var outsideCurrentFunction = !isGlobal; 17226 for (var i = 0; i < _scopeStack.length; i++) { 17227 var stackItem = _scopeStack[i]; 17228 17229 if (!isNewFunction && _scopeStack[i + 1] === _currentFunctBody) { 17230 outsideCurrentFunction = false; 17231 } 17232 if (outsideCurrentFunction && stackItem["(labels)"][labelName]) { 17233 warning("W123", token, labelName); 17234 } 17235 if (stackItem["(breakLabels)"][labelName]) { 17236 warning("W123", token, labelName); 17237 } 17238 } 17239 } 17240 17241 function _latedefWarning(type, labelName, token) { 17242 if (state.option.latedef) { 17243 // if either latedef is strict and this is a function 17244 // or this is not a function 17245 if ((state.option.latedef === true && type === "function") || 17246 type !== "function") { 17247 warning("W003", token, labelName); 17248 } 17249 } 17250 } 17251 17252 var scopeManagerInst = { 17253 17254 on: function(names, listener) { 17255 names.split(" ").forEach(function(name) { 17256 emitter.on(name, listener); 17257 }); 17258 }, 17259 17260 isPredefined: function(labelName) { 17261 return !this.has(labelName) && _.has(_scopeStack[0]["(predefined)"], labelName); 17262 }, 17263 17264 /** 17265 * Tell the manager we are entering a new block of code 17266 * @param {string} [type] - The type of the block. Valid values are 17267 * "functionparams", "catchparams" and 17268 * "functionouter" 17269 */ 17270 stack: function(type) { 17271 var previousScope = _current; 17272 _newScope(type); 17273 17274 if (!type && previousScope["(type)"] === "functionparams") { 17275 17276 _current["(isFuncBody)"] = true; 17277 _current["(context)"] = _currentFunctBody; 17278 _currentFunctBody = _current; 17279 } 17280 }, 17281 17282 unstack: function() { 17283 // jshint proto: true 17284 var subScope = _scopeStack.length > 1 ? _scopeStack[_scopeStack.length - 2] : null; 17285 var isUnstackingFunctionBody = _current === _currentFunctBody, 17286 isUnstackingFunctionParams = _current["(type)"] === "functionparams", 17287 isUnstackingFunctionOuter = _current["(type)"] === "functionouter"; 17288 17289 var i, j; 17290 var currentUsages = _current["(usages)"]; 17291 var currentLabels = _current["(labels)"]; 17292 var usedLabelNameList = Object.keys(currentUsages); 17293 17294 if (currentUsages.__proto__ && usedLabelNameList.indexOf("__proto__") === -1) { 17295 usedLabelNameList.push("__proto__"); 17296 } 17297 17298 for (i = 0; i < usedLabelNameList.length; i++) { 17299 var usedLabelName = usedLabelNameList[i]; 17300 17301 var usage = currentUsages[usedLabelName]; 17302 var usedLabel = currentLabels[usedLabelName]; 17303 if (usedLabel) { 17304 var usedLabelType = usedLabel["(type)"]; 17305 var isImmutable = usedLabelType === "const" || usedLabelType === "import"; 17306 17307 if (usedLabel["(useOutsideOfScope)"] && !state.option.funcscope) { 17308 var usedTokens = usage["(tokens)"]; 17309 if (usedTokens) { 17310 for (j = 0; j < usedTokens.length; j++) { 17311 // Keep the consistency of https://github.com/jshint/jshint/issues/2409 17312 if (usedLabel["(function)"] === usedTokens[j]["(function)"]) { 17313 error("W038", usedTokens[j], usedLabelName); 17314 } 17315 } 17316 } 17317 } 17318 17319 // mark the label used 17320 _current["(labels)"][usedLabelName]["(unused)"] = false; 17321 17322 // check for modifying a const 17323 if (isImmutable && usage["(modified)"]) { 17324 for (j = 0; j < usage["(modified)"].length; j++) { 17325 error("E013", usage["(modified)"][j], usedLabelName); 17326 } 17327 } 17328 17329 // check for re-assigning a function declaration 17330 if ((usedLabelType === "function" || usedLabelType === "class") && 17331 usage["(reassigned)"]) { 17332 for (j = 0; j < usage["(reassigned)"].length; j++) { 17333 if (!usage["(reassigned)"][j].ignoreW021) { 17334 warning("W021", usage["(reassigned)"][j], usedLabelName, usedLabelType); 17335 } 17336 } 17337 } 17338 continue; 17339 } 17340 17341 if (isUnstackingFunctionOuter) { 17342 state.funct["(isCapturing)"] = true; 17343 } 17344 17345 if (subScope) { 17346 // not exiting the global scope, so copy the usage down in case its an out of scope usage 17347 if (!subScope["(usages)"][usedLabelName]) { 17348 subScope["(usages)"][usedLabelName] = usage; 17349 if (isUnstackingFunctionBody) { 17350 subScope["(usages)"][usedLabelName]["(onlyUsedSubFunction)"] = true; 17351 } 17352 } else { 17353 var subScopeUsage = subScope["(usages)"][usedLabelName]; 17354 subScopeUsage["(modified)"] = subScopeUsage["(modified)"].concat(usage["(modified)"]); 17355 subScopeUsage["(tokens)"] = subScopeUsage["(tokens)"].concat(usage["(tokens)"]); 17356 subScopeUsage["(reassigned)"] = 17357 subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]); 17358 } 17359 } else { 17360 // this is exiting global scope, so we finalise everything here - we are at the end of the file 17361 if (typeof _current["(predefined)"][usedLabelName] === "boolean") { 17362 17363 // remove the declared token, so we know it is used 17364 delete declared[usedLabelName]; 17365 17366 // note it as used so it can be reported 17367 usedPredefinedAndGlobals[usedLabelName] = marker; 17368 17369 // check for re-assigning a read-only (set to false) predefined 17370 if (_current["(predefined)"][usedLabelName] === false && usage["(reassigned)"]) { 17371 for (j = 0; j < usage["(reassigned)"].length; j++) { 17372 if (!usage["(reassigned)"][j].ignoreW020) { 17373 warning("W020", usage["(reassigned)"][j]); 17374 } 17375 } 17376 } 17377 } 17378 else { 17379 // label usage is not predefined and we have not found a declaration 17380 // so report as undeclared 17381 if (usage["(tokens)"]) { 17382 for (j = 0; j < usage["(tokens)"].length; j++) { 17383 var undefinedToken = usage["(tokens)"][j]; 17384 // if its not a forgiven undefined (e.g. typof x) 17385 if (!undefinedToken.forgiveUndef) { 17386 // if undef is on and undef was on when the token was defined 17387 if (state.option.undef && !undefinedToken.ignoreUndef) { 17388 warning("W117", undefinedToken, usedLabelName); 17389 } 17390 if (impliedGlobals[usedLabelName]) { 17391 impliedGlobals[usedLabelName].line.push(undefinedToken.line); 17392 } else { 17393 impliedGlobals[usedLabelName] = { 17394 name: usedLabelName, 17395 line: [undefinedToken.line] 17396 }; 17397 } 17398 } 17399 } 17400 } 17401 } 17402 } 17403 } 17404 17405 // if exiting the global scope, we can warn about declared globals that haven't been used yet 17406 if (!subScope) { 17407 Object.keys(declared) 17408 .forEach(function(labelNotUsed) { 17409 _warnUnused(labelNotUsed, declared[labelNotUsed], "var"); 17410 }); 17411 } 17412 17413 // If this is not a function boundary, transfer function-scoped labels to 17414 // the parent block (a rough simulation of variable hoisting). Previously 17415 // existing labels in the parent block should take precedence so that things and stuff. 17416 if (subScope && !isUnstackingFunctionBody && 17417 !isUnstackingFunctionParams && !isUnstackingFunctionOuter) { 17418 var labelNames = Object.keys(currentLabels); 17419 for (i = 0; i < labelNames.length; i++) { 17420 17421 var defLabelName = labelNames[i]; 17422 var defLabel = currentLabels[defLabelName]; 17423 17424 if (!defLabel["(blockscoped)"] && defLabel["(type)"] !== "exception") { 17425 var shadowed = subScope["(labels)"][defLabelName]; 17426 17427 // Do not overwrite a label if it exists in the parent scope 17428 // because it is shared by adjacent blocks. Copy the `unused` 17429 // property so that any references found within the current block 17430 // are counted toward that higher-level declaration. 17431 if (shadowed) { 17432 shadowed["(unused)"] &= defLabel["(unused)"]; 17433 17434 // "Hoist" the variable to the parent block, decorating the label 17435 // so that future references, though technically valid, can be 17436 // reported as "out-of-scope" in the absence of the `funcscope` 17437 // option. 17438 } else { 17439 defLabel["(useOutsideOfScope)"] = 17440 // Do not warn about out-of-scope usages in the global scope 17441 _currentFunctBody["(type)"] !== "global" && 17442 // When a higher scope contains a binding for the label, the 17443 // label is a re-declaration and should not prompt "used 17444 // out-of-scope" warnings. 17445 !this.funct.has(defLabelName, { excludeCurrent: true }); 17446 17447 subScope["(labels)"][defLabelName] = defLabel; 17448 } 17449 17450 delete currentLabels[defLabelName]; 17451 } 17452 } 17453 } 17454 17455 _checkForUnused(); 17456 17457 _scopeStack.pop(); 17458 if (isUnstackingFunctionBody) { 17459 _currentFunctBody = _scopeStack[_.findLastIndex(_scopeStack, function(scope) { 17460 // if function or if global (which is at the bottom so it will only return true if we call back) 17461 return scope["(isFuncBody)"] || scope["(type)"] === "global"; 17462 })]; 17463 } 17464 17465 _current = subScope; 17466 }, 17467 17468 /** 17469 * Add a param to the current scope 17470 * @param {string} labelName 17471 * @param {Token} token 17472 * @param {string} [type="param"] param type 17473 */ 17474 addParam: function(labelName, token, type) { 17475 type = type || "param"; 17476 17477 if (type === "exception") { 17478 // if defined in the current function 17479 var previouslyDefinedLabelType = this.funct.labeltype(labelName); 17480 if (previouslyDefinedLabelType && previouslyDefinedLabelType !== "exception") { 17481 // and has not been used yet in the current function scope 17482 if (!state.option.node) { 17483 warning("W002", state.tokens.next, labelName); 17484 } 17485 } 17486 } 17487 17488 // The variable was declared in the current scope 17489 if (_.has(_current["(labels)"], labelName)) { 17490 _current["(labels)"][labelName].duplicated = true; 17491 17492 // The variable was declared in an outer scope 17493 } else { 17494 // if this scope has the variable defined, it's a re-definition error 17495 _checkOuterShadow(labelName, token, type); 17496 17497 _current["(labels)"][labelName] = { 17498 "(type)" : type, 17499 "(token)": token, 17500 "(unused)": true }; 17501 17502 _current["(params)"].push(labelName); 17503 } 17504 17505 if (_.has(_current["(usages)"], labelName)) { 17506 var usage = _current["(usages)"][labelName]; 17507 // if its in a sub function it is not necessarily an error, just latedef 17508 if (usage["(onlyUsedSubFunction)"]) { 17509 _latedefWarning(type, labelName, token); 17510 } else { 17511 // this is a clear illegal usage for block scoped variables 17512 warning("E056", token, labelName, type); 17513 } 17514 } 17515 }, 17516 17517 validateParams: function() { 17518 // This method only concerns errors for function parameters 17519 if (_currentFunctBody["(type)"] === "global") { 17520 return; 17521 } 17522 17523 var isStrict = state.isStrict(); 17524 var currentFunctParamScope = _currentFunctBody["(parent)"]; 17525 17526 if (!currentFunctParamScope["(params)"]) { 17527 return; 17528 } 17529 17530 currentFunctParamScope["(params)"].forEach(function(labelName) { 17531 var label = currentFunctParamScope["(labels)"][labelName]; 17532 17533 if (label && label.duplicated) { 17534 if (isStrict) { 17535 warning("E011", label["(token)"], labelName); 17536 } else if (state.option.shadow !== true) { 17537 warning("W004", label["(token)"], labelName); 17538 } 17539 } 17540 }); 17541 }, 17542 17543 getUsedOrDefinedGlobals: function() { 17544 // jshint proto: true 17545 var list = Object.keys(usedPredefinedAndGlobals); 17546 17547 // If `__proto__` is used as a global variable name, its entry in the 17548 // lookup table may not be enumerated by `Object.keys` (depending on the 17549 // environment). 17550 if (usedPredefinedAndGlobals.__proto__ === marker && 17551 list.indexOf("__proto__") === -1) { 17552 list.push("__proto__"); 17553 } 17554 17555 return list; 17556 }, 17557 17558 /** 17559 * Gets an array of implied globals 17560 * @returns {Array.<{ name: string, line: Array.<number>}>} 17561 */ 17562 getImpliedGlobals: function() { 17563 // jshint proto: true 17564 var values = _.values(impliedGlobals); 17565 var hasProto = false; 17566 17567 // If `__proto__` is an implied global variable, its entry in the lookup 17568 // table may not be enumerated by `_.values` (depending on the 17569 // environment). 17570 if (impliedGlobals.__proto__) { 17571 hasProto = values.some(function(value) { 17572 return value.name === "__proto__"; 17573 }); 17574 17575 if (!hasProto) { 17576 values.push(impliedGlobals.__proto__); 17577 } 17578 } 17579 17580 return values; 17581 }, 17582 17583 /** 17584 * Returns a list of unused variables 17585 * @returns {Array} 17586 */ 17587 getUnuseds: function() { 17588 return unuseds; 17589 }, 17590 17591 has: function(labelName) { 17592 return Boolean(_getLabel(labelName)); 17593 }, 17594 17595 labeltype: function(labelName) { 17596 // returns a labels type or null if not present 17597 var scopeLabels = _getLabel(labelName); 17598 if (scopeLabels) { 17599 return scopeLabels[labelName]["(type)"]; 17600 } 17601 return null; 17602 }, 17603 17604 /** 17605 * for the exported options, indicating a variable is used outside the file 17606 */ 17607 addExported: function(labelName) { 17608 var globalLabels = _scopeStack[0]["(labels)"]; 17609 if (_.has(declared, labelName)) { 17610 // remove the declared token, so we know it is used 17611 delete declared[labelName]; 17612 } else if (_.has(globalLabels, labelName)) { 17613 globalLabels[labelName]["(unused)"] = false; 17614 } else { 17615 for (var i = 1; i < _scopeStack.length; i++) { 17616 var scope = _scopeStack[i]; 17617 // if `scope.(type)` is not defined, it is a block scope 17618 if (!scope["(type)"]) { 17619 if (_.has(scope["(labels)"], labelName) && 17620 !scope["(labels)"][labelName]["(blockscoped)"]) { 17621 scope["(labels)"][labelName]["(unused)"] = false; 17622 return; 17623 } 17624 } else { 17625 break; 17626 } 17627 } 17628 exported[labelName] = true; 17629 } 17630 }, 17631 17632 /** 17633 * Mark an indentifier as es6 module exported 17634 */ 17635 setExported: function(labelName, token) { 17636 this.block.use(labelName, token); 17637 }, 17638 17639 initialize: function(labelName) { 17640 if (_current["(labels)"][labelName]) { 17641 _current["(labels)"][labelName]["(initialized)"] = true; 17642 } 17643 }, 17644 17645 /** 17646 * adds an indentifier to the relevant current scope and creates warnings/errors as necessary 17647 * @param {string} labelName 17648 * @param {Object} opts 17649 * @param {String} opts.type - the type of the label e.g. "param", "var", "let, "const", "import", "function" 17650 * @param {Token} opts.token - the token pointing at the declaration 17651 * @param {boolean} opts.initialized - whether the binding should be created in an "initialized" state. 17652 */ 17653 addlabel: function(labelName, opts) { 17654 17655 var type = opts.type; 17656 var token = opts.token; 17657 var isblockscoped = type === "let" || type === "const" || 17658 type === "class" || type === "import"; 17659 var ishoisted = type === "function" || type === "import"; 17660 var isexported = (isblockscoped ? _current : _currentFunctBody)["(type)"] === "global" && 17661 _.has(exported, labelName); 17662 17663 // outer shadow check (inner is only on non-block scoped) 17664 _checkOuterShadow(labelName, token, type); 17665 17666 if (isblockscoped) { 17667 17668 var declaredInCurrentScope = _current["(labels)"][labelName]; 17669 // for block scoped variables, params are seen in the current scope as the root function 17670 // scope, so check these too. 17671 if (!declaredInCurrentScope && _current === _currentFunctBody && 17672 _current["(type)"] !== "global") { 17673 declaredInCurrentScope = !!_currentFunctBody["(parent)"]["(labels)"][labelName]; 17674 } 17675 17676 // if its not already defined (which is an error, so ignore) and is used in TDZ 17677 if (!declaredInCurrentScope && _current["(usages)"][labelName]) { 17678 var usage = _current["(usages)"][labelName]; 17679 // if its in a sub function it is not necessarily an error, just latedef 17680 if (usage["(onlyUsedSubFunction)"] || ishoisted) { 17681 _latedefWarning(type, labelName, token); 17682 } else if (!ishoisted) { 17683 // this is a clear illegal usage for block scoped variables 17684 warning("E056", token, labelName, type); 17685 } 17686 } 17687 17688 // if this scope has the variable defined, its a re-definition error 17689 if (declaredInCurrentScope) { 17690 warning("E011", token, labelName); 17691 } 17692 else if (state.option.shadow === "outer") { 17693 17694 // if shadow is outer, for block scope we want to detect any shadowing within this function 17695 if (scopeManagerInst.funct.has(labelName)) { 17696 warning("W004", token, labelName); 17697 } 17698 } 17699 17700 scopeManagerInst.block.add( 17701 labelName, type, token, !isexported, opts.initialized 17702 ); 17703 17704 } else { 17705 17706 var declaredInCurrentFunctionScope = scopeManagerInst.funct.has(labelName); 17707 17708 // check for late definition, ignore if already declared 17709 if (!declaredInCurrentFunctionScope && usedSoFarInCurrentFunction(labelName)) { 17710 _latedefWarning(type, labelName, token); 17711 } 17712 17713 // defining with a var or a function when a block scope variable of the same name 17714 // is in scope is an error 17715 if (scopeManagerInst.funct.has(labelName, { onlyBlockscoped: true })) { 17716 warning("E011", token, labelName); 17717 } else if (state.option.shadow !== true) { 17718 // now since we didn't get any block scope variables, test for var/function 17719 // shadowing 17720 if (declaredInCurrentFunctionScope && labelName !== "__proto__") { 17721 17722 // see https://github.com/jshint/jshint/issues/2400 17723 if (_currentFunctBody["(type)"] !== "global") { 17724 warning("W004", token, labelName); 17725 } 17726 } 17727 } 17728 17729 scopeManagerInst.funct.add(labelName, type, token, !isexported); 17730 17731 if (_currentFunctBody["(type)"] === "global" && !state.impliedClosure()) { 17732 usedPredefinedAndGlobals[labelName] = marker; 17733 } 17734 } 17735 }, 17736 17737 funct: { 17738 /** 17739 * Returns the label type given certain options 17740 * @param labelName 17741 * @param {Object=} options 17742 * @param {Boolean=} options.onlyBlockscoped - only include block scoped labels 17743 * @param {Boolean=} options.excludeParams - exclude the param scope 17744 * @param {Boolean=} options.excludeCurrent - exclude the current scope 17745 * @returns {String} 17746 */ 17747 labeltype: function(labelName, options) { 17748 var onlyBlockscoped = options && options.onlyBlockscoped; 17749 var excludeParams = options && options.excludeParams; 17750 var currentScopeIndex = _scopeStack.length - (options && options.excludeCurrent ? 2 : 1); 17751 for (var i = currentScopeIndex; i >= 0; i--) { 17752 var current = _scopeStack[i]; 17753 if (current["(labels)"][labelName] && 17754 (!onlyBlockscoped || current["(labels)"][labelName]["(blockscoped)"])) { 17755 return current["(labels)"][labelName]["(type)"]; 17756 } 17757 var scopeCheck = excludeParams ? _scopeStack[ i - 1 ] : current; 17758 if (scopeCheck && scopeCheck["(type)"] === "functionparams") { 17759 return null; 17760 } 17761 } 17762 return null; 17763 }, 17764 /** 17765 * Returns if a break label exists in the function scope 17766 * @param {string} labelName 17767 * @returns {boolean} 17768 */ 17769 hasBreakLabel: function(labelName) { 17770 for (var i = _scopeStack.length - 1; i >= 0; i--) { 17771 var current = _scopeStack[i]; 17772 17773 if (current["(breakLabels)"][labelName]) { 17774 return true; 17775 } 17776 if (current["(type)"] === "functionparams") { 17777 return false; 17778 } 17779 } 17780 return false; 17781 }, 17782 /** 17783 * Returns if the label is in the current function scope 17784 * See scopeManager.funct.labelType for options 17785 */ 17786 has: function(labelName, options) { 17787 return Boolean(this.labeltype(labelName, options)); 17788 }, 17789 17790 /** 17791 * Adds a new function scoped variable 17792 * see block.add for block scoped 17793 */ 17794 add: function(labelName, type, tok, unused) { 17795 _current["(labels)"][labelName] = { 17796 "(type)" : type, 17797 "(token)": tok, 17798 "(blockscoped)": false, 17799 "(function)": _currentFunctBody, 17800 "(unused)": unused }; 17801 } 17802 }, 17803 17804 block: { 17805 17806 /** 17807 * is the current block global? 17808 * @returns Boolean 17809 */ 17810 isGlobal: function() { 17811 return _current["(type)"] === "global"; 17812 }, 17813 17814 use: function(labelName, token) { 17815 17816 // if resolves to current function params, then do not store usage just resolve 17817 // this is because function(a) { var a; a = a; } will resolve to the param, not 17818 // to the unset var 17819 // first check the param is used 17820 var paramScope = _currentFunctBody["(parent)"]; 17821 if (paramScope && paramScope["(labels)"][labelName] && 17822 paramScope["(labels)"][labelName]["(type)"] === "param") { 17823 17824 // then check its not declared by a block scope variable 17825 if (!scopeManagerInst.funct.has(labelName, 17826 { excludeParams: true, onlyBlockscoped: true })) { 17827 paramScope["(labels)"][labelName]["(unused)"] = false; 17828 } 17829 } 17830 17831 if (token && (state.ignored.W117 || state.option.undef === false)) { 17832 token.ignoreUndef = true; 17833 } 17834 17835 _setupUsages(labelName); 17836 17837 _current["(usages)"][labelName]["(onlyUsedSubFunction)"] = false; 17838 17839 if (token) { 17840 token["(function)"] = _currentFunctBody; 17841 _current["(usages)"][labelName]["(tokens)"].push(token); 17842 } 17843 17844 // blockscoped vars can't be used within their initializer (TDZ) 17845 var label = _current["(labels)"][labelName]; 17846 if (label && label["(blockscoped)"] && !label["(initialized)"]) { 17847 error("E056", token, labelName, label["(type)"]); 17848 } 17849 }, 17850 17851 reassign: function(labelName, token) { 17852 token.ignoreW020 = state.ignored.W020; 17853 token.ignoreW021 = state.ignored.W021; 17854 17855 this.modify(labelName, token); 17856 17857 _current["(usages)"][labelName]["(reassigned)"].push(token); 17858 }, 17859 17860 modify: function(labelName, token) { 17861 17862 _setupUsages(labelName); 17863 17864 _current["(usages)"][labelName]["(onlyUsedSubFunction)"] = false; 17865 _current["(usages)"][labelName]["(modified)"].push(token); 17866 }, 17867 17868 /** 17869 * Adds a new variable 17870 */ 17871 add: function(labelName, type, tok, unused, initialized) { 17872 _current["(labels)"][labelName] = { 17873 "(type)" : type, 17874 "(token)": tok, 17875 "(initialized)": !!initialized, 17876 "(blockscoped)": true, 17877 "(unused)": unused }; 17878 }, 17879 17880 addBreakLabel: function(labelName, opts) { 17881 var token = opts.token; 17882 if (scopeManagerInst.funct.hasBreakLabel(labelName)) { 17883 warning("E011", token, labelName); 17884 } 17885 else if (state.option.shadow === "outer") { 17886 if (scopeManagerInst.funct.has(labelName)) { 17887 warning("W004", token, labelName); 17888 } else { 17889 _checkOuterShadow(labelName, token); 17890 } 17891 } 17892 _current["(breakLabels)"][labelName] = token; 17893 } 17894 } 17895 }; 17896 return scopeManagerInst; 17897 }; 17898 17899 module.exports = scopeManager; 17900 17901 },{"events":5,"lodash":12}],19:[function(require,module,exports){ 17902 "use strict"; 17903 var NameStack = require("./name-stack.js"); 17904 17905 var state = { 17906 syntax: {}, 17907 17908 /** 17909 * Determine if the code currently being linted is strict mode code. 17910 * 17911 * @returns {boolean} 17912 */ 17913 isStrict: function() { 17914 return this.directive["use strict"] || this.inClassBody || 17915 this.option.module || this.option.strict === "implied"; 17916 }, 17917 17918 /** 17919 * Determine if the current state warrants a warning for statements outside 17920 * of strict mode code. 17921 * 17922 * While emitting warnings based on function scope would be more intuitive 17923 * (and less noisy), JSHint observes statement-based semantics in order to 17924 * preserve legacy behavior. 17925 * 17926 * This method does not take the state of the parser into account, making no 17927 * distinction between global code and function code. Because the "missing 17928 * 'use strict'" warning is *also* reported at function boundaries, this 17929 * function interprets `strict` option values `true` and `undefined` as 17930 * equivalent. 17931 */ 17932 stmtMissingStrict: function() { 17933 if (this.option.strict === "global") { 17934 return true; 17935 } 17936 17937 if (this.option.strict === false) { 17938 return false; 17939 } 17940 17941 if (this.option.globalstrict) { 17942 return true; 17943 } 17944 17945 return false; 17946 }, 17947 17948 allowsGlobalUsd: function() { 17949 return this.option.strict === "global" || this.option.globalstrict || 17950 this.option.module || this.impliedClosure(); 17951 }, 17952 17953 /** 17954 * Determine if the current configuration describes an environment that is 17955 * wrapped in an immediately-invoked function expression prior to evaluation. 17956 * 17957 * @returns {boolean} 17958 */ 17959 impliedClosure: function() { 17960 return this.option.node || this.option.phantom || this.option.browserify; 17961 }, 17962 17963 // Assumption: chronologically ES3 < ES5 < ES6 < Moz 17964 17965 inMoz: function() { 17966 return this.option.moz; 17967 }, 17968 17969 /** 17970 * @param {boolean} strict - When `true`, only consider ES6 when in 17971 * "esversion: 6" code. 17972 */ 17973 inES6: function(strict) { 17974 if (strict) { 17975 return this.esVersion === 6; 17976 } 17977 return this.option.moz || this.esVersion >= 6; 17978 }, 17979 17980 /** 17981 * @param {boolean} strict - When `true`, return `true` only when 17982 * esVersion is exactly 5 17983 */ 17984 inES5: function(strict) { 17985 if (strict) { 17986 return (!this.esVersion || this.esVersion === 5) && !this.option.moz; 17987 } 17988 return !this.esVersion || this.esVersion >= 5 || this.option.moz; 17989 }, 17990 17991 /** 17992 * Determine the current version of the input language by inspecting the 17993 * value of all ECMAScript-version-related options. This logic is necessary 17994 * to ensure compatibility with deprecated options `es3`, `es5`, and 17995 * `esnext`, and it may be drastically simplified when those options are 17996 * removed. 17997 * 17998 * @returns {string|null} - the name of any incompatible option detected, 17999 * `null` otherwise 18000 */ 18001 inferEsVersion: function() { 18002 var badOpt = null; 18003 18004 if (this.option.esversion) { 18005 if (this.option.es3) { 18006 badOpt = "es3"; 18007 } else if (this.option.es5) { 18008 badOpt = "es5"; 18009 } else if (this.option.esnext) { 18010 badOpt = "esnext"; 18011 } 18012 18013 if (badOpt) { 18014 return badOpt; 18015 } 18016 18017 if (this.option.esversion === 2015) { 18018 this.esVersion = 6; 18019 } else { 18020 this.esVersion = this.option.esversion; 18021 } 18022 } else if (this.option.es3) { 18023 this.esVersion = 3; 18024 } else if (this.option.esnext) { 18025 this.esVersion = 6; 18026 } 18027 18028 return null; 18029 }, 18030 18031 reset: function() { 18032 this.tokens = { 18033 prev: null, 18034 next: null, 18035 curr: null 18036 }; 18037 18038 this.option = {}; 18039 this.esVersion = 5; 18040 this.funct = null; 18041 this.ignored = {}; 18042 this.directive = {}; 18043 this.jsonMode = false; 18044 this.jsonWarnings = []; 18045 this.lines = []; 18046 this.tab = ""; 18047 this.cache = {}; // Node.JS doesn't have Map. Sniff. 18048 this.ignoredLines = {}; 18049 this.forinifcheckneeded = false; 18050 this.nameStack = new NameStack(); 18051 this.inClassBody = false; 18052 } 18053 }; 18054 18055 exports.state = state; 18056 18057 },{"./name-stack.js":15}],20:[function(require,module,exports){ 18058 "use strict"; 18059 18060 exports.register = function(linter) { 18061 // Check for properties named __proto__. This special property was 18062 // deprecated and then re-introduced for ES6. 18063 18064 linter.on("Identifier", function style_scanProto(data) { 18065 if (linter.getOption("proto")) { 18066 return; 18067 } 18068 18069 if (data.name === "__proto__") { 18070 linter.warn("W103", { 18071 line: data.line, 18072 char: data.char, 18073 data: [ data.name, "6" ] 18074 }); 18075 } 18076 }); 18077 18078 // Check for properties named __iterator__. This is a special property 18079 // available only in browsers with JavaScript 1.7 implementation, but 18080 // it is deprecated for ES6 18081 18082 linter.on("Identifier", function style_scanIterator(data) { 18083 if (linter.getOption("iterator")) { 18084 return; 18085 } 18086 18087 if (data.name === "__iterator__") { 18088 linter.warn("W103", { 18089 line: data.line, 18090 char: data.char, 18091 data: [ data.name ] 18092 }); 18093 } 18094 }); 18095 18096 // Check that all identifiers are using camelCase notation. 18097 // Exceptions: names like MY_VAR and _myVar. 18098 18099 linter.on("Identifier", function style_scanCamelCase(data) { 18100 if (!linter.getOption("camelcase")) { 18101 return; 18102 } 18103 18104 if (data.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) { 18105 linter.warn("W106", { 18106 line: data.line, 18107 char: data.char, 18108 data: [ data.name ] 18109 }); 18110 } 18111 }); 18112 18113 // Enforce consistency in style of quoting. 18114 18115 linter.on("String", function style_scanQuotes(data) { 18116 var quotmark = linter.getOption("quotmark"); 18117 var code; 18118 18119 if (!quotmark) { 18120 return; 18121 } 18122 18123 // If quotmark is set to 'single' warn about all double-quotes. 18124 18125 if (quotmark === "single" && data.quote !== "'") { 18126 code = "W109"; 18127 } 18128 18129 // If quotmark is set to 'double' warn about all single-quotes. 18130 18131 if (quotmark === "double" && data.quote !== "\"") { 18132 code = "W108"; 18133 } 18134 18135 // If quotmark is set to true, remember the first quotation style 18136 // and then warn about all others. 18137 18138 if (quotmark === true) { 18139 if (!linter.getCache("quotmark")) { 18140 linter.setCache("quotmark", data.quote); 18141 } 18142 18143 if (linter.getCache("quotmark") !== data.quote) { 18144 code = "W110"; 18145 } 18146 } 18147 18148 if (code) { 18149 linter.warn(code, { 18150 line: data.line, 18151 char: data.char, 18152 }); 18153 } 18154 }); 18155 18156 linter.on("Number", function style_scanNumbers(data) { 18157 if (data.value.charAt(0) === ".") { 18158 // Warn about a leading decimal point. 18159 linter.warn("W008", { 18160 line: data.line, 18161 char: data.char, 18162 data: [ data.value ] 18163 }); 18164 } 18165 18166 if (data.value.substr(data.value.length - 1) === ".") { 18167 // Warn about a trailing decimal point. 18168 linter.warn("W047", { 18169 line: data.line, 18170 char: data.char, 18171 data: [ data.value ] 18172 }); 18173 } 18174 18175 if (/^00+/.test(data.value)) { 18176 // Multiple leading zeroes. 18177 linter.warn("W046", { 18178 line: data.line, 18179 char: data.char, 18180 data: [ data.value ] 18181 }); 18182 } 18183 }); 18184 18185 // Warn about script URLs. 18186 18187 linter.on("String", function style_scanJavaScriptURLs(data) { 18188 var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i; 18189 18190 if (linter.getOption("scripturl")) { 18191 return; 18192 } 18193 18194 if (re.test(data.value)) { 18195 linter.warn("W107", { 18196 line: data.line, 18197 char: data.char 18198 }); 18199 } 18200 }); 18201 }; 18202 18203 },{}],21:[function(require,module,exports){ 18204 // jshint -W001 18205 18206 "use strict"; 18207 18208 // Identifiers provided by the ECMAScript standard. 18209 18210 exports.reservedVars = { 18211 arguments : false, 18212 NaN : false 18213 }; 18214 18215 exports.ecmaIdentifiers = { 18216 3: { 18217 Array : false, 18218 Boolean : false, 18219 Date : false, 18220 decodeURI : false, 18221 decodeURIComponent : false, 18222 encodeURI : false, 18223 encodeURIComponent : false, 18224 Error : false, 18225 "eval" : false, 18226 EvalError : false, 18227 Function : false, 18228 hasOwnProperty : false, 18229 isFinite : false, 18230 isNaN : false, 18231 Math : false, 18232 Number : false, 18233 Object : false, 18234 parseInt : false, 18235 parseFloat : false, 18236 RangeError : false, 18237 ReferenceError : false, 18238 RegExp : false, 18239 String : false, 18240 SyntaxError : false, 18241 TypeError : false, 18242 URIError : false 18243 }, 18244 5: { 18245 JSON : false 18246 }, 18247 6: { 18248 ArrayBuffer : false, 18249 DataView : false, 18250 Float32Array : false, 18251 Float64Array : false, 18252 Int8Array : false, 18253 Int16Array : false, 18254 Int32Array : false, 18255 Map : false, 18256 Promise : false, 18257 Proxy : false, 18258 Reflect : false, 18259 Set : false, 18260 Symbol : false, 18261 Uint8Array : false, 18262 Uint16Array : false, 18263 Uint32Array : false, 18264 Uint8ClampledArray : false, 18265 WeakMap : false, 18266 WeakSet : false 18267 } 18268 }; 18269 18270 // Global variables commonly provided by a web browser environment. 18271 18272 exports.browser = { 18273 Audio : false, 18274 Blob : false, 18275 addEventListener : false, 18276 applicationCache : false, 18277 atob : false, 18278 blur : false, 18279 btoa : false, 18280 cancelAnimationFrame : false, 18281 CanvasGradient : false, 18282 CanvasPattern : false, 18283 CanvasRenderingContext2D: false, 18284 CSS : false, 18285 clearInterval : false, 18286 clearTimeout : false, 18287 close : false, 18288 closed : false, 18289 Comment : false, 18290 CompositionEvent : false, 18291 CustomEvent : false, 18292 DOMParser : false, 18293 defaultStatus : false, 18294 Document : false, 18295 document : false, 18296 DocumentFragment : false, 18297 Element : false, 18298 ElementTimeControl : false, 18299 Event : false, 18300 event : false, 18301 fetch : false, 18302 File : false, 18303 FileList : false, 18304 FileReader : false, 18305 FormData : false, 18306 focus : false, 18307 frames : false, 18308 getComputedStyle : false, 18309 HTMLElement : false, 18310 HTMLAnchorElement : false, 18311 HTMLBaseElement : false, 18312 HTMLBlockquoteElement: false, 18313 HTMLBodyElement : false, 18314 HTMLBRElement : false, 18315 HTMLButtonElement : false, 18316 HTMLCanvasElement : false, 18317 HTMLCollection : false, 18318 HTMLDirectoryElement : false, 18319 HTMLDivElement : false, 18320 HTMLDListElement : false, 18321 HTMLFieldSetElement : false, 18322 HTMLFontElement : false, 18323 HTMLFormElement : false, 18324 HTMLFrameElement : false, 18325 HTMLFrameSetElement : false, 18326 HTMLHeadElement : false, 18327 HTMLHeadingElement : false, 18328 HTMLHRElement : false, 18329 HTMLHtmlElement : false, 18330 HTMLIFrameElement : false, 18331 HTMLImageElement : false, 18332 HTMLInputElement : false, 18333 HTMLIsIndexElement : false, 18334 HTMLLabelElement : false, 18335 HTMLLayerElement : false, 18336 HTMLLegendElement : false, 18337 HTMLLIElement : false, 18338 HTMLLinkElement : false, 18339 HTMLMapElement : false, 18340 HTMLMenuElement : false, 18341 HTMLMetaElement : false, 18342 HTMLModElement : false, 18343 HTMLObjectElement : false, 18344 HTMLOListElement : false, 18345 HTMLOptGroupElement : false, 18346 HTMLOptionElement : false, 18347 HTMLParagraphElement : false, 18348 HTMLParamElement : false, 18349 HTMLPreElement : false, 18350 HTMLQuoteElement : false, 18351 HTMLScriptElement : false, 18352 HTMLSelectElement : false, 18353 HTMLStyleElement : false, 18354 HTMLTableCaptionElement: false, 18355 HTMLTableCellElement : false, 18356 HTMLTableColElement : false, 18357 HTMLTableElement : false, 18358 HTMLTableRowElement : false, 18359 HTMLTableSectionElement: false, 18360 HTMLTemplateElement : false, 18361 HTMLTextAreaElement : false, 18362 HTMLTitleElement : false, 18363 HTMLUListElement : false, 18364 HTMLVideoElement : false, 18365 history : false, 18366 Image : false, 18367 Intl : false, 18368 length : false, 18369 localStorage : false, 18370 location : false, 18371 matchMedia : false, 18372 MediaRecorder : false, 18373 MessageChannel : false, 18374 MessageEvent : false, 18375 MessagePort : false, 18376 MouseEvent : false, 18377 moveBy : false, 18378 moveTo : false, 18379 MutationObserver : false, 18380 name : false, 18381 Node : false, 18382 NodeFilter : false, 18383 NodeList : false, 18384 Notification : false, 18385 navigator : false, 18386 onbeforeunload : true, 18387 onblur : true, 18388 onerror : true, 18389 onfocus : true, 18390 onload : true, 18391 onresize : true, 18392 onunload : true, 18393 open : false, 18394 openDatabase : false, 18395 opener : false, 18396 Option : false, 18397 parent : false, 18398 performance : false, 18399 print : false, 18400 Range : false, 18401 requestAnimationFrame : false, 18402 removeEventListener : false, 18403 resizeBy : false, 18404 resizeTo : false, 18405 screen : false, 18406 scroll : false, 18407 scrollBy : false, 18408 scrollTo : false, 18409 sessionStorage : false, 18410 setInterval : false, 18411 setTimeout : false, 18412 SharedWorker : false, 18413 status : false, 18414 Storage : false, 18415 SVGAElement : false, 18416 SVGAltGlyphDefElement: false, 18417 SVGAltGlyphElement : false, 18418 SVGAltGlyphItemElement: false, 18419 SVGAngle : false, 18420 SVGAnimateColorElement: false, 18421 SVGAnimateElement : false, 18422 SVGAnimateMotionElement: false, 18423 SVGAnimateTransformElement: false, 18424 SVGAnimatedAngle : false, 18425 SVGAnimatedBoolean : false, 18426 SVGAnimatedEnumeration: false, 18427 SVGAnimatedInteger : false, 18428 SVGAnimatedLength : false, 18429 SVGAnimatedLengthList: false, 18430 SVGAnimatedNumber : false, 18431 SVGAnimatedNumberList: false, 18432 SVGAnimatedPathData : false, 18433 SVGAnimatedPoints : false, 18434 SVGAnimatedPreserveAspectRatio: false, 18435 SVGAnimatedRect : false, 18436 SVGAnimatedString : false, 18437 SVGAnimatedTransformList: false, 18438 SVGAnimationElement : false, 18439 SVGCSSRule : false, 18440 SVGCircleElement : false, 18441 SVGClipPathElement : false, 18442 SVGColor : false, 18443 SVGColorProfileElement: false, 18444 SVGColorProfileRule : false, 18445 SVGComponentTransferFunctionElement: false, 18446 SVGCursorElement : false, 18447 SVGDefsElement : false, 18448 SVGDescElement : false, 18449 SVGDocument : false, 18450 SVGElement : false, 18451 SVGElementInstance : false, 18452 SVGElementInstanceList: false, 18453 SVGEllipseElement : false, 18454 SVGExternalResourcesRequired: false, 18455 SVGFEBlendElement : false, 18456 SVGFEColorMatrixElement: false, 18457 SVGFEComponentTransferElement: false, 18458 SVGFECompositeElement: false, 18459 SVGFEConvolveMatrixElement: false, 18460 SVGFEDiffuseLightingElement: false, 18461 SVGFEDisplacementMapElement: false, 18462 SVGFEDistantLightElement: false, 18463 SVGFEFloodElement : false, 18464 SVGFEFuncAElement : false, 18465 SVGFEFuncBElement : false, 18466 SVGFEFuncGElement : false, 18467 SVGFEFuncRElement : false, 18468 SVGFEGaussianBlurElement: false, 18469 SVGFEImageElement : false, 18470 SVGFEMergeElement : false, 18471 SVGFEMergeNodeElement: false, 18472 SVGFEMorphologyElement: false, 18473 SVGFEOffsetElement : false, 18474 SVGFEPointLightElement: false, 18475 SVGFESpecularLightingElement: false, 18476 SVGFESpotLightElement: false, 18477 SVGFETileElement : false, 18478 SVGFETurbulenceElement: false, 18479 SVGFilterElement : false, 18480 SVGFilterPrimitiveStandardAttributes: false, 18481 SVGFitToViewBox : false, 18482 SVGFontElement : false, 18483 SVGFontFaceElement : false, 18484 SVGFontFaceFormatElement: false, 18485 SVGFontFaceNameElement: false, 18486 SVGFontFaceSrcElement: false, 18487 SVGFontFaceUriElement: false, 18488 SVGForeignObjectElement: false, 18489 SVGGElement : false, 18490 SVGGlyphElement : false, 18491 SVGGlyphRefElement : false, 18492 SVGGradientElement : false, 18493 SVGHKernElement : false, 18494 SVGICCColor : false, 18495 SVGImageElement : false, 18496 SVGLangSpace : false, 18497 SVGLength : false, 18498 SVGLengthList : false, 18499 SVGLineElement : false, 18500 SVGLinearGradientElement: false, 18501 SVGLocatable : false, 18502 SVGMPathElement : false, 18503 SVGMarkerElement : false, 18504 SVGMaskElement : false, 18505 SVGMatrix : false, 18506 SVGMetadataElement : false, 18507 SVGMissingGlyphElement: false, 18508 SVGNumber : false, 18509 SVGNumberList : false, 18510 SVGPaint : false, 18511 SVGPathElement : false, 18512 SVGPathSeg : false, 18513 SVGPathSegArcAbs : false, 18514 SVGPathSegArcRel : false, 18515 SVGPathSegClosePath : false, 18516 SVGPathSegCurvetoCubicAbs: false, 18517 SVGPathSegCurvetoCubicRel: false, 18518 SVGPathSegCurvetoCubicSmoothAbs: false, 18519 SVGPathSegCurvetoCubicSmoothRel: false, 18520 SVGPathSegCurvetoQuadraticAbs: false, 18521 SVGPathSegCurvetoQuadraticRel: false, 18522 SVGPathSegCurvetoQuadraticSmoothAbs: false, 18523 SVGPathSegCurvetoQuadraticSmoothRel: false, 18524 SVGPathSegLinetoAbs : false, 18525 SVGPathSegLinetoHorizontalAbs: false, 18526 SVGPathSegLinetoHorizontalRel: false, 18527 SVGPathSegLinetoRel : false, 18528 SVGPathSegLinetoVerticalAbs: false, 18529 SVGPathSegLinetoVerticalRel: false, 18530 SVGPathSegList : false, 18531 SVGPathSegMovetoAbs : false, 18532 SVGPathSegMovetoRel : false, 18533 SVGPatternElement : false, 18534 SVGPoint : false, 18535 SVGPointList : false, 18536 SVGPolygonElement : false, 18537 SVGPolylineElement : false, 18538 SVGPreserveAspectRatio: false, 18539 SVGRadialGradientElement: false, 18540 SVGRect : false, 18541 SVGRectElement : false, 18542 SVGRenderingIntent : false, 18543 SVGSVGElement : false, 18544 SVGScriptElement : false, 18545 SVGSetElement : false, 18546 SVGStopElement : false, 18547 SVGStringList : false, 18548 SVGStylable : false, 18549 SVGStyleElement : false, 18550 SVGSwitchElement : false, 18551 SVGSymbolElement : false, 18552 SVGTRefElement : false, 18553 SVGTSpanElement : false, 18554 SVGTests : false, 18555 SVGTextContentElement: false, 18556 SVGTextElement : false, 18557 SVGTextPathElement : false, 18558 SVGTextPositioningElement: false, 18559 SVGTitleElement : false, 18560 SVGTransform : false, 18561 SVGTransformList : false, 18562 SVGTransformable : false, 18563 SVGURIReference : false, 18564 SVGUnitTypes : false, 18565 SVGUseElement : false, 18566 SVGVKernElement : false, 18567 SVGViewElement : false, 18568 SVGViewSpec : false, 18569 SVGZoomAndPan : false, 18570 Text : false, 18571 TextDecoder : false, 18572 TextEncoder : false, 18573 TimeEvent : false, 18574 top : false, 18575 URL : false, 18576 WebGLActiveInfo : false, 18577 WebGLBuffer : false, 18578 WebGLContextEvent : false, 18579 WebGLFramebuffer : false, 18580 WebGLProgram : false, 18581 WebGLRenderbuffer : false, 18582 WebGLRenderingContext: false, 18583 WebGLShader : false, 18584 WebGLShaderPrecisionFormat: false, 18585 WebGLTexture : false, 18586 WebGLUniformLocation : false, 18587 WebSocket : false, 18588 window : false, 18589 Window : false, 18590 Worker : false, 18591 XDomainRequest : false, 18592 XMLHttpRequest : false, 18593 XMLSerializer : false, 18594 XPathEvaluator : false, 18595 XPathException : false, 18596 XPathExpression : false, 18597 XPathNamespace : false, 18598 XPathNSResolver : false, 18599 XPathResult : false 18600 }; 18601 18602 exports.devel = { 18603 alert : false, 18604 confirm: false, 18605 console: false, 18606 Debug : false, 18607 opera : false, 18608 prompt : false 18609 }; 18610 18611 exports.worker = { 18612 importScripts : true, 18613 onmessage : true, 18614 postMessage : true, 18615 self : true, 18616 FileReaderSync : true 18617 }; 18618 18619 // Widely adopted global names that are not part of ECMAScript standard 18620 exports.nonstandard = { 18621 escape : false, 18622 unescape: false 18623 }; 18624 18625 // Globals provided by popular JavaScript environments. 18626 18627 exports.couch = { 18628 "require" : false, 18629 respond : false, 18630 getRow : false, 18631 emit : false, 18632 send : false, 18633 start : false, 18634 sum : false, 18635 log : false, 18636 exports : false, 18637 module : false, 18638 provides : false 18639 }; 18640 18641 exports.node = { 18642 __filename : false, 18643 __dirname : false, 18644 GLOBAL : false, 18645 global : false, 18646 module : false, 18647 require : false, 18648 18649 // These globals are writeable because Node allows the following 18650 // usage pattern: var Buffer = require("buffer").Buffer; 18651 18652 Buffer : true, 18653 console : true, 18654 exports : true, 18655 process : true, 18656 setTimeout : true, 18657 clearTimeout : true, 18658 setInterval : true, 18659 clearInterval : true, 18660 setImmediate : true, // v0.9.1+ 18661 clearImmediate: true // v0.9.1+ 18662 }; 18663 18664 exports.browserify = { 18665 __filename : false, 18666 __dirname : false, 18667 global : false, 18668 module : false, 18669 require : false, 18670 Buffer : true, 18671 exports : true, 18672 process : true 18673 }; 18674 18675 exports.phantom = { 18676 phantom : true, 18677 require : true, 18678 WebPage : true, 18679 console : true, // in examples, but undocumented 18680 exports : true // v1.7+ 18681 }; 18682 18683 exports.qunit = { 18684 asyncTest : false, 18685 deepEqual : false, 18686 equal : false, 18687 expect : false, 18688 module : false, 18689 notDeepEqual : false, 18690 notEqual : false, 18691 notOk : false, 18692 notPropEqual : false, 18693 notStrictEqual : false, 18694 ok : false, 18695 propEqual : false, 18696 QUnit : false, 18697 raises : false, 18698 start : false, 18699 stop : false, 18700 strictEqual : false, 18701 test : false, 18702 "throws" : false 18703 }; 18704 18705 exports.rhino = { 18706 defineClass : false, 18707 deserialize : false, 18708 gc : false, 18709 help : false, 18710 importClass : false, 18711 importPackage: false, 18712 "java" : false, 18713 load : false, 18714 loadClass : false, 18715 Packages : false, 18716 print : false, 18717 quit : false, 18718 readFile : false, 18719 readUrl : false, 18720 runCommand : false, 18721 seal : false, 18722 serialize : false, 18723 spawn : false, 18724 sync : false, 18725 toint32 : false, 18726 version : false 18727 }; 18728 18729 exports.shelljs = { 18730 target : false, 18731 echo : false, 18732 exit : false, 18733 cd : false, 18734 pwd : false, 18735 ls : false, 18736 find : false, 18737 cp : false, 18738 rm : false, 18739 mv : false, 18740 mkdir : false, 18741 test : false, 18742 cat : false, 18743 sed : false, 18744 grep : false, 18745 which : false, 18746 dirs : false, 18747 pushd : false, 18748 popd : false, 18749 env : false, 18750 exec : false, 18751 chmod : false, 18752 config : false, 18753 error : false, 18754 tempdir : false 18755 }; 18756 18757 exports.typed = { 18758 ArrayBuffer : false, 18759 ArrayBufferView : false, 18760 DataView : false, 18761 Float32Array : false, 18762 Float64Array : false, 18763 Int16Array : false, 18764 Int32Array : false, 18765 Int8Array : false, 18766 Uint16Array : false, 18767 Uint32Array : false, 18768 Uint8Array : false, 18769 Uint8ClampedArray : false 18770 }; 18771 18772 exports.wsh = { 18773 ActiveXObject : true, 18774 Enumerator : true, 18775 GetObject : true, 18776 ScriptEngine : true, 18777 ScriptEngineBuildVersion : true, 18778 ScriptEngineMajorVersion : true, 18779 ScriptEngineMinorVersion : true, 18780 VBArray : true, 18781 WSH : true, 18782 WScript : true, 18783 XDomainRequest : true 18784 }; 18785 18786 // Globals provided by popular JavaScript libraries. 18787 18788 exports.dojo = { 18789 dojo : false, 18790 dijit : false, 18791 dojox : false, 18792 define : false, 18793 "require": false 18794 }; 18795 18796 exports.jquery = { 18797 "$" : false, 18798 jQuery : false 18799 }; 18800 18801 exports.mootools = { 18802 "$" : false, 18803 "$$" : false, 18804 Asset : false, 18805 Browser : false, 18806 Chain : false, 18807 Class : false, 18808 Color : false, 18809 Cookie : false, 18810 Core : false, 18811 Document : false, 18812 DomReady : false, 18813 DOMEvent : false, 18814 DOMReady : false, 18815 Drag : false, 18816 Element : false, 18817 Elements : false, 18818 Event : false, 18819 Events : false, 18820 Fx : false, 18821 Group : false, 18822 Hash : false, 18823 HtmlTable : false, 18824 IFrame : false, 18825 IframeShim : false, 18826 InputValidator: false, 18827 instanceOf : false, 18828 Keyboard : false, 18829 Locale : false, 18830 Mask : false, 18831 MooTools : false, 18832 Native : false, 18833 Options : false, 18834 OverText : false, 18835 Request : false, 18836 Scroller : false, 18837 Slick : false, 18838 Slider : false, 18839 Sortables : false, 18840 Spinner : false, 18841 Swiff : false, 18842 Tips : false, 18843 Type : false, 18844 typeOf : false, 18845 URI : false, 18846 Window : false 18847 }; 18848 18849 exports.prototypejs = { 18850 "$" : false, 18851 "$$" : false, 18852 "$A" : false, 18853 "$F" : false, 18854 "$H" : false, 18855 "$R" : false, 18856 "$break" : false, 18857 "$continue" : false, 18858 "$w" : false, 18859 Abstract : false, 18860 Ajax : false, 18861 Class : false, 18862 Enumerable : false, 18863 Element : false, 18864 Event : false, 18865 Field : false, 18866 Form : false, 18867 Hash : false, 18868 Insertion : false, 18869 ObjectRange : false, 18870 PeriodicalExecuter: false, 18871 Position : false, 18872 Prototype : false, 18873 Selector : false, 18874 Template : false, 18875 Toggle : false, 18876 Try : false, 18877 Autocompleter : false, 18878 Builder : false, 18879 Control : false, 18880 Draggable : false, 18881 Draggables : false, 18882 Droppables : false, 18883 Effect : false, 18884 Sortable : false, 18885 SortableObserver : false, 18886 Sound : false, 18887 Scriptaculous : false 18888 }; 18889 18890 exports.yui = { 18891 YUI : false, 18892 Y : false, 18893 YUI_config: false 18894 }; 18895 18896 exports.mocha = { 18897 // Global (for config etc.) 18898 mocha : false, 18899 // BDD 18900 describe : false, 18901 xdescribe : false, 18902 it : false, 18903 xit : false, 18904 context : false, 18905 xcontext : false, 18906 before : false, 18907 after : false, 18908 beforeEach : false, 18909 afterEach : false, 18910 // TDD 18911 suite : false, 18912 test : false, 18913 setup : false, 18914 teardown : false, 18915 suiteSetup : false, 18916 suiteTeardown : false 18917 }; 18918 18919 exports.jasmine = { 18920 jasmine : false, 18921 describe : false, 18922 xdescribe : false, 18923 it : false, 18924 xit : false, 18925 beforeEach : false, 18926 afterEach : false, 18927 setFixtures : false, 18928 loadFixtures: false, 18929 spyOn : false, 18930 expect : false, 18931 // Jasmine 1.3 18932 runs : false, 18933 waitsFor : false, 18934 waits : false, 18935 // Jasmine 2.1 18936 beforeAll : false, 18937 afterAll : false, 18938 fail : false, 18939 fdescribe : false, 18940 fit : false, 18941 pending : false 18942 }; 18943 18944 },{}],"jshint":[function(require,module,exports){ 18945 /*! 18946 * JSHint, by JSHint Community. 18947 * 18948 * This file (and this file only) is licensed under the same slightly modified 18949 * MIT license that JSLint is. It stops evil-doers everywhere: 18950 * 18951 * Copyright (c) 2002 Douglas Crockford (www.JSLint.com) 18952 * 18953 * Permission is hereby granted, free of charge, to any person obtaining 18954 * a copy of this software and associated documentation files (the "Software"), 18955 * to deal in the Software without restriction, including without limitation 18956 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18957 * and/or sell copies of the Software, and to permit persons to whom 18958 * the Software is furnished to do so, subject to the following conditions: 18959 * 18960 * The above copyright notice and this permission notice shall be included 18961 * in all copies or substantial portions of the Software. 18962 * 18963 * The Software shall be used for Good, not Evil. 18964 * 18965 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18966 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18967 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18968 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18969 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18970 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18971 * DEALINGS IN THE SOFTWARE. 18972 * 18973 */ 18974 18975 /*jshint quotmark:double */ 18976 /*exported console */ 18977 18978 var _ = require("lodash"); 18979 var events = require("events"); 18980 var vars = require("./vars.js"); 18981 var messages = require("./messages.js"); 18982 var Lexer = require("./lex.js").Lexer; 18983 var reg = require("./reg.js"); 18984 var state = require("./state.js").state; 18985 var style = require("./style.js"); 18986 var options = require("./options.js"); 18987 var scopeManager = require("./scope-manager.js"); 18988 18989 // We need this module here because environments such as IE and Rhino 18990 // don't necessarilly expose the 'console' API and browserify uses 18991 // it to log things. It's a sad state of affair, really. 18992 var console = require("console-browserify"); 18993 18994 // We build the application inside a function so that we produce only a singleton 18995 // variable. That function will be invoked immediately, and its return value is 18996 // the JSHINT function itself. 18997 18998 var JSHINT = (function() { 18999 "use strict"; 19000 19001 var api, // Extension API 19002 19003 // These are operators that should not be used with the ! operator. 19004 bang = { 19005 "<" : true, 19006 "<=" : true, 19007 "==" : true, 19008 "===": true, 19009 "!==": true, 19010 "!=" : true, 19011 ">" : true, 19012 ">=" : true, 19013 "+" : true, 19014 "-" : true, 19015 "*" : true, 19016 "/" : true, 19017 "%" : true 19018 }, 19019 19020 declared, // Globals that were declared using /*global ... */ syntax. 19021 19022 functionicity = [ 19023 "closure", "exception", "global", "label", 19024 "outer", "unused", "var" 19025 ], 19026 19027 functions, // All of the functions 19028 19029 inblock, 19030 indent, 19031 lookahead, 19032 lex, 19033 member, 19034 membersOnly, 19035 predefined, // Global variables defined by option 19036 19037 stack, 19038 urls, 19039 19040 extraModules = [], 19041 emitter = new events.EventEmitter(); 19042 19043 function checkOption(name, t) { 19044 name = name.trim(); 19045 19046 if (/^[+-]W\d{3}$/g.test(name)) { 19047 return true; 19048 } 19049 19050 if (options.validNames.indexOf(name) === -1) { 19051 if (t.type !== "jslint" && !_.has(options.removed, name)) { 19052 error("E001", t, name); 19053 return false; 19054 } 19055 } 19056 19057 return true; 19058 } 19059 19060 function isString(obj) { 19061 return Object.prototype.toString.call(obj) === "[object String]"; 19062 } 19063 19064 function isIdentifier(tkn, value) { 19065 if (!tkn) 19066 return false; 19067 19068 if (!tkn.identifier || tkn.value !== value) 19069 return false; 19070 19071 return true; 19072 } 19073 19074 function isReserved(token) { 19075 if (!token.reserved) { 19076 return false; 19077 } 19078 var meta = token.meta; 19079 19080 if (meta && meta.isFutureReservedWord) { 19081 if (meta.moduleOnly && !state.option.module) { 19082 return false; 19083 } 19084 19085 if (state.inES5()) { 19086 // ES3 FutureReservedWord in an ES5 environment. 19087 if (!meta.es5) { 19088 return false; 19089 } 19090 19091 // Some ES5 FutureReservedWord identifiers are active only 19092 // within a strict mode environment. 19093 if (meta.strictOnly) { 19094 if (!state.option.strict && !state.isStrict()) { 19095 return false; 19096 } 19097 } 19098 19099 if (token.isProperty) { 19100 return false; 19101 } 19102 } 19103 } 19104 19105 return true; 19106 } 19107 19108 function supplant(str, data) { 19109 return str.replace(/\{([^{}]*)\}/g, function(a, b) { 19110 var r = data[b]; 19111 return typeof r === "string" || typeof r === "number" ? r : a; 19112 }); 19113 } 19114 19115 function combine(dest, src) { 19116 Object.keys(src).forEach(function(name) { 19117 if (_.has(JSHINT.blacklist, name)) return; 19118 dest[name] = src[name]; 19119 }); 19120 } 19121 19122 function processenforceall() { 19123 if (state.option.enforceall) { 19124 for (var enforceopt in options.bool.enforcing) { 19125 if (state.option[enforceopt] === undefined && 19126 !options.noenforceall[enforceopt]) { 19127 state.option[enforceopt] = true; 19128 } 19129 } 19130 for (var relaxopt in options.bool.relaxing) { 19131 if (state.option[relaxopt] === undefined) { 19132 state.option[relaxopt] = false; 19133 } 19134 } 19135 } 19136 } 19137 19138 /** 19139 * Apply all linting options according to the status of the `state` object. 19140 */ 19141 function applyOptions() { 19142 var badESOpt = null; 19143 processenforceall(); 19144 19145 /** 19146 * TODO: Remove in JSHint 3 19147 */ 19148 badESOpt = state.inferEsVersion(); 19149 if (badESOpt) { 19150 quit("E059", state.tokens.next, "esversion", badESOpt); 19151 } 19152 19153 if (state.inES5()) { 19154 combine(predefined, vars.ecmaIdentifiers[5]); 19155 } 19156 19157 if (state.inES6()) { 19158 combine(predefined, vars.ecmaIdentifiers[6]); 19159 } 19160 19161 /** 19162 * Use `in` to check for the presence of any explicitly-specified value for 19163 * `globalstrict` because both `true` and `false` should trigger an error. 19164 */ 19165 if (state.option.strict === "global" && "globalstrict" in state.option) { 19166 quit("E059", state.tokens.next, "strict", "globalstrict"); 19167 } 19168 19169 if (state.option.module) { 19170 /** 19171 * TODO: Extend this restriction to *all* ES6-specific options. 19172 */ 19173 if (!state.inES6()) { 19174 warning("W134", state.tokens.next, "module", 6); 19175 } 19176 } 19177 19178 if (state.option.couch) { 19179 combine(predefined, vars.couch); 19180 } 19181 19182 if (state.option.qunit) { 19183 combine(predefined, vars.qunit); 19184 } 19185 19186 if (state.option.rhino) { 19187 combine(predefined, vars.rhino); 19188 } 19189 19190 if (state.option.shelljs) { 19191 combine(predefined, vars.shelljs); 19192 combine(predefined, vars.node); 19193 } 19194 if (state.option.typed) { 19195 combine(predefined, vars.typed); 19196 } 19197 19198 if (state.option.phantom) { 19199 combine(predefined, vars.phantom); 19200 } 19201 19202 if (state.option.prototypejs) { 19203 combine(predefined, vars.prototypejs); 19204 } 19205 19206 if (state.option.node) { 19207 combine(predefined, vars.node); 19208 combine(predefined, vars.typed); 19209 } 19210 19211 if (state.option.devel) { 19212 combine(predefined, vars.devel); 19213 } 19214 19215 if (state.option.dojo) { 19216 combine(predefined, vars.dojo); 19217 } 19218 19219 if (state.option.browser) { 19220 combine(predefined, vars.browser); 19221 combine(predefined, vars.typed); 19222 } 19223 19224 if (state.option.browserify) { 19225 combine(predefined, vars.browser); 19226 combine(predefined, vars.typed); 19227 combine(predefined, vars.browserify); 19228 } 19229 19230 if (state.option.nonstandard) { 19231 combine(predefined, vars.nonstandard); 19232 } 19233 19234 if (state.option.jasmine) { 19235 combine(predefined, vars.jasmine); 19236 } 19237 19238 if (state.option.jquery) { 19239 combine(predefined, vars.jquery); 19240 } 19241 19242 if (state.option.mootools) { 19243 combine(predefined, vars.mootools); 19244 } 19245 19246 if (state.option.worker) { 19247 combine(predefined, vars.worker); 19248 } 19249 19250 if (state.option.wsh) { 19251 combine(predefined, vars.wsh); 19252 } 19253 19254 if (state.option.yui) { 19255 combine(predefined, vars.yui); 19256 } 19257 19258 if (state.option.mocha) { 19259 combine(predefined, vars.mocha); 19260 } 19261 } 19262 19263 // Produce an error warning. 19264 function quit(code, token, a, b) { 19265 var percentage = Math.floor((token.line / state.lines.length) * 100); 19266 var message = messages.errors[code].desc; 19267 19268 var exception = { 19269 name: "JSHintError", 19270 line: token.line, 19271 character: token.from, 19272 message: message + " (" + percentage + "% scanned).", 19273 raw: message, 19274 code: code, 19275 a: a, 19276 b: b 19277 }; 19278 19279 exception.reason = supplant(message, exception) + " (" + percentage + 19280 "% scanned)."; 19281 19282 throw exception; 19283 } 19284 19285 function removeIgnoredMessages() { 19286 var ignored = state.ignoredLines; 19287 19288 if (_.isEmpty(ignored)) return; 19289 JSHINT.errors = _.reject(JSHINT.errors, function(err) { return ignored[err.line] }); 19290 } 19291 19292 function warning(code, t, a, b, c, d) { 19293 var ch, l, w, msg; 19294 19295 if (/^W\d{3}$/.test(code)) { 19296 if (state.ignored[code]) 19297 return; 19298 19299 msg = messages.warnings[code]; 19300 } else if (/E\d{3}/.test(code)) { 19301 msg = messages.errors[code]; 19302 } else if (/I\d{3}/.test(code)) { 19303 msg = messages.info[code]; 19304 } 19305 19306 t = t || state.tokens.next || {}; 19307 if (t.id === "(end)") { // `~ 19308 t = state.tokens.curr; 19309 } 19310 19311 l = t.line; 19312 ch = t.from; 19313 19314 w = { 19315 id: "(error)", 19316 raw: msg.desc, 19317 code: msg.code, 19318 evidence: state.lines[l - 1] || "", 19319 line: l, 19320 character: ch, 19321 scope: JSHINT.scope, 19322 a: a, 19323 b: b, 19324 c: c, 19325 d: d 19326 }; 19327 19328 w.reason = supplant(msg.desc, w); 19329 JSHINT.errors.push(w); 19330 19331 removeIgnoredMessages(); 19332 19333 if (JSHINT.errors.length >= state.option.maxerr) 19334 quit("E043", t); 19335 19336 return w; 19337 } 19338 19339 function warningAt(m, l, ch, a, b, c, d) { 19340 return warning(m, { 19341 line: l, 19342 from: ch 19343 }, a, b, c, d); 19344 } 19345 19346 function error(m, t, a, b, c, d) { 19347 warning(m, t, a, b, c, d); 19348 } 19349 19350 function errorAt(m, l, ch, a, b, c, d) { 19351 return error(m, { 19352 line: l, 19353 from: ch 19354 }, a, b, c, d); 19355 } 19356 19357 // Tracking of "internal" scripts, like eval containing a static string 19358 function addEvalCode(elem, token) { 19359 JSHINT.internals.push({ 19360 id: "(internal)", 19361 elem: elem, 19362 token: token, 19363 code: token.value.replace(/([^\\])(\\*)\2\\n/g, "$1\n") 19364 }); 19365 } 19366 19367 /** 19368 * Process an inline linting directive 19369 * 19370 * @param {Token} directiveToken - the directive-bearing comment token 19371 * @param {Token} previous - the token that preceeds the directive 19372 */ 19373 function lintingDirective(directiveToken, previous) { 19374 var body = directiveToken.body.split(",") 19375 .map(function(s) { return s.trim(); }); 19376 var predef = {}; 19377 19378 if (directiveToken.type === "falls through") { 19379 previous.caseFallsThrough = true; 19380 return; 19381 } 19382 19383 if (directiveToken.type === "globals") { 19384 body.forEach(function(g, idx) { 19385 g = g.split(":"); 19386 var key = (g[0] || "").trim(); 19387 var val = (g[1] || "").trim(); 19388 19389 if (key === "-" || !key.length) { 19390 // Ignore trailing comma 19391 if (idx > 0 && idx === body.length - 1) { 19392 return; 19393 } 19394 error("E002", directiveToken); 19395 return; 19396 } 19397 19398 if (key.charAt(0) === "-") { 19399 key = key.slice(1); 19400 val = false; 19401 19402 JSHINT.blacklist[key] = key; 19403 delete predefined[key]; 19404 } else { 19405 predef[key] = (val === "true"); 19406 } 19407 }); 19408 19409 combine(predefined, predef); 19410 19411 for (var key in predef) { 19412 if (_.has(predef, key)) { 19413 declared[key] = directiveToken; 19414 } 19415 } 19416 } 19417 19418 if (directiveToken.type === "exported") { 19419 body.forEach(function(e, idx) { 19420 if (!e.length) { 19421 // Ignore trailing comma 19422 if (idx > 0 && idx === body.length - 1) { 19423 return; 19424 } 19425 error("E002", directiveToken); 19426 return; 19427 } 19428 19429 state.funct["(scope)"].addExported(e); 19430 }); 19431 } 19432 19433 if (directiveToken.type === "members") { 19434 membersOnly = membersOnly || {}; 19435 19436 body.forEach(function(m) { 19437 var ch1 = m.charAt(0); 19438 var ch2 = m.charAt(m.length - 1); 19439 19440 if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) { 19441 m = m 19442 .substr(1, m.length - 2) 19443 .replace("\\\"", "\""); 19444 } 19445 19446 membersOnly[m] = false; 19447 }); 19448 } 19449 19450 var numvals = [ 19451 "maxstatements", 19452 "maxparams", 19453 "maxdepth", 19454 "maxcomplexity", 19455 "maxerr", 19456 "maxlen", 19457 "indent" 19458 ]; 19459 19460 if (directiveToken.type === "jshint" || directiveToken.type === "jslint") { 19461 body.forEach(function(g) { 19462 g = g.split(":"); 19463 var key = (g[0] || "").trim(); 19464 var val = (g[1] || "").trim(); 19465 19466 if (!checkOption(key, directiveToken)) { 19467 return; 19468 } 19469 19470 if (numvals.indexOf(key) >= 0) { 19471 // GH988 - numeric options can be disabled by setting them to `false` 19472 if (val !== "false") { 19473 val = +val; 19474 19475 if (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) { 19476 error("E032", directiveToken, g[1].trim()); 19477 return; 19478 } 19479 19480 state.option[key] = val; 19481 } else { 19482 state.option[key] = key === "indent" ? 4 : false; 19483 } 19484 19485 return; 19486 } 19487 19488 if (key === "validthis") { 19489 // `validthis` is valid only within a function scope. 19490 19491 if (state.funct["(global)"]) 19492 return void error("E009"); 19493 19494 if (val !== "true" && val !== "false") 19495 return void error("E002", directiveToken); 19496 19497 state.option.validthis = (val === "true"); 19498 return; 19499 } 19500 19501 if (key === "quotmark") { 19502 switch (val) { 19503 case "true": 19504 case "false": 19505 state.option.quotmark = (val === "true"); 19506 break; 19507 case "double": 19508 case "single": 19509 state.option.quotmark = val; 19510 break; 19511 default: 19512 error("E002", directiveToken); 19513 } 19514 return; 19515 } 19516 19517 if (key === "shadow") { 19518 switch (val) { 19519 case "true": 19520 state.option.shadow = true; 19521 break; 19522 case "outer": 19523 state.option.shadow = "outer"; 19524 break; 19525 case "false": 19526 case "inner": 19527 state.option.shadow = "inner"; 19528 break; 19529 default: 19530 error("E002", directiveToken); 19531 } 19532 return; 19533 } 19534 19535 if (key === "unused") { 19536 switch (val) { 19537 case "true": 19538 state.option.unused = true; 19539 break; 19540 case "false": 19541 state.option.unused = false; 19542 break; 19543 case "vars": 19544 case "strict": 19545 state.option.unused = val; 19546 break; 19547 default: 19548 error("E002", directiveToken); 19549 } 19550 return; 19551 } 19552 19553 if (key === "latedef") { 19554 switch (val) { 19555 case "true": 19556 state.option.latedef = true; 19557 break; 19558 case "false": 19559 state.option.latedef = false; 19560 break; 19561 case "nofunc": 19562 state.option.latedef = "nofunc"; 19563 break; 19564 default: 19565 error("E002", directiveToken); 19566 } 19567 return; 19568 } 19569 19570 if (key === "ignore") { 19571 switch (val) { 19572 case "line": 19573 state.ignoredLines[directiveToken.line] = true; 19574 removeIgnoredMessages(); 19575 break; 19576 default: 19577 error("E002", directiveToken); 19578 } 19579 return; 19580 } 19581 19582 if (key === "strict") { 19583 switch (val) { 19584 case "true": 19585 state.option.strict = true; 19586 break; 19587 case "false": 19588 state.option.strict = false; 19589 break; 19590 case "global": 19591 case "implied": 19592 state.option.strict = val; 19593 break; 19594 default: 19595 error("E002", directiveToken); 19596 } 19597 return; 19598 } 19599 19600 if (key === "module") { 19601 /** 19602 * TODO: Extend this restriction to *all* "environmental" options. 19603 */ 19604 if (!hasParsedCode(state.funct)) { 19605 error("E055", directiveToken, "module"); 19606 } 19607 } 19608 19609 if (key === "esversion") { 19610 switch (val) { 19611 case "3": 19612 case "5": 19613 case "6": 19614 case "2015": 19615 state.option.moz = false; 19616 state.option.esversion = +val; 19617 break; 19618 default: 19619 error("E002", directiveToken); 19620 } 19621 if (!hasParsedCode(state.funct)) { 19622 error("E055", directiveToken, "esversion"); 19623 } 19624 return; 19625 } 19626 19627 var match = /^([+-])(W\d{3})$/g.exec(key); 19628 if (match) { 19629 // ignore for -W..., unignore for +W... 19630 state.ignored[match[2]] = (match[1] === "-"); 19631 return; 19632 } 19633 19634 var tn; 19635 if (val === "true" || val === "false") { 19636 if (directiveToken.type === "jslint") { 19637 tn = options.renamed[key] || key; 19638 state.option[tn] = (val === "true"); 19639 19640 if (options.inverted[tn] !== undefined) { 19641 state.option[tn] = !state.option[tn]; 19642 } 19643 } else { 19644 state.option[key] = (val === "true"); 19645 } 19646 19647 return; 19648 } 19649 19650 error("E002", directiveToken); 19651 }); 19652 19653 applyOptions(); 19654 } 19655 } 19656 19657 /** 19658 * Return a token beyond the token available in `state.tokens.next`. If no 19659 * such token exists, return the "(end)" token. This function is used to 19660 * determine parsing strategies in cases where the value of the next token 19661 * does not provide sufficient information, as is the case with `for` loops, 19662 * e.g.: 19663 * 19664 * for ( var i in ... 19665 * 19666 * versus: 19667 * 19668 * for ( var i = ... 19669 * 19670 * @param {number} [p] - offset of desired token; defaults to 0 19671 * 19672 * @returns {token} 19673 */ 19674 function peek(p) { 19675 var i = p || 0, j = lookahead.length, t; 19676 19677 if (i < j) { 19678 return lookahead[i]; 19679 } 19680 19681 while (j <= i) { 19682 t = lex.token(); 19683 19684 // When the lexer is exhausted, this function should produce the "(end)" 19685 // token, even in cases where the requested token is beyond the end of 19686 // the input stream. 19687 if (!t) { 19688 // If the lookahead buffer is empty, the expected "(end)" token was 19689 // already emitted by the most recent invocation of `advance` and is 19690 // available as the next token. 19691 if (!lookahead.length) { 19692 return state.tokens.next; 19693 } 19694 19695 return lookahead[j - 1]; 19696 } 19697 19698 lookahead[j] = t; 19699 j += 1; 19700 } 19701 19702 return t; 19703 } 19704 19705 function peekIgnoreEOL() { 19706 var i = 0; 19707 var t; 19708 do { 19709 t = peek(i++); 19710 } while (t.id === "(endline)"); 19711 return t; 19712 } 19713 19714 // Produce the next token. It looks for programming errors. 19715 19716 function advance(id, t) { 19717 19718 switch (state.tokens.curr.id) { 19719 case "(number)": 19720 if (state.tokens.next.id === ".") { 19721 warning("W005", state.tokens.curr); 19722 } 19723 break; 19724 case "-": 19725 if (state.tokens.next.id === "-" || state.tokens.next.id === "--") { 19726 warning("W006"); 19727 } 19728 break; 19729 case "+": 19730 if (state.tokens.next.id === "+" || state.tokens.next.id === "++") { 19731 warning("W007"); 19732 } 19733 break; 19734 } 19735 19736 if (id && state.tokens.next.id !== id) { 19737 if (t) { 19738 if (state.tokens.next.id === "(end)") { 19739 error("E019", t, t.id); 19740 } else { 19741 error("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value); 19742 } 19743 } else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) { 19744 warning("W116", state.tokens.next, id, state.tokens.next.value); 19745 } 19746 } 19747 19748 state.tokens.prev = state.tokens.curr; 19749 state.tokens.curr = state.tokens.next; 19750 for (;;) { 19751 state.tokens.next = lookahead.shift() || lex.token(); 19752 19753 if (!state.tokens.next) { // No more tokens left, give up 19754 quit("E041", state.tokens.curr); 19755 } 19756 19757 if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") { 19758 return; 19759 } 19760 19761 if (state.tokens.next.check) { 19762 state.tokens.next.check(); 19763 } 19764 19765 if (state.tokens.next.isSpecial) { 19766 lintingDirective(state.tokens.next, state.tokens.curr); 19767 } else { 19768 if (state.tokens.next.id !== "(endline)") { 19769 break; 19770 } 19771 } 19772 } 19773 } 19774 19775 /** 19776 * Determine whether a given token is an operator. 19777 * 19778 * @param {token} token 19779 * 19780 * @returns {boolean} 19781 */ 19782 function isOperator(token) { 19783 return token.first || token.right || token.left || token.id === "yield"; 19784 } 19785 19786 function isEndOfExpr(curr, next) { 19787 if (arguments.length === 0) { 19788 curr = state.tokens.curr; 19789 next = state.tokens.next; 19790 } 19791 19792 if (next.id === ";" || next.id === "}" || next.id === ":") { 19793 return true; 19794 } 19795 if (next.infix === curr.infix || curr.ltBoundary === "after" || 19796 next.ltBoundary === "before") { 19797 return curr.line !== startLine(next); 19798 } 19799 return false; 19800 } 19801 19802 // This is the heart of JSHINT, the Pratt parser. In addition to parsing, it 19803 // is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is 19804 // like .nud except that it is only used on the first token of a statement. 19805 // Having .fud makes it much easier to define statement-oriented languages like 19806 // JavaScript. I retained Pratt's nomenclature. 19807 19808 // .nud Null denotation 19809 // .fud First null denotation 19810 // .led Left denotation 19811 // lbp Left binding power 19812 // rbp Right binding power 19813 19814 // They are elements of the parsing method called Top Down Operator Precedence. 19815 19816 function expression(rbp, initial) { 19817 var left, isArray = false, isObject = false, isLetExpr = false; 19818 19819 state.nameStack.push(); 19820 19821 // if current expression is a let expression 19822 if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") { 19823 if (!state.inMoz()) { 19824 warning("W118", state.tokens.next, "let expressions"); 19825 } 19826 isLetExpr = true; 19827 // create a new block scope we use only for the current expression 19828 state.funct["(scope)"].stack(); 19829 advance("let"); 19830 advance("("); 19831 state.tokens.prev.fud(); 19832 advance(")"); 19833 } 19834 19835 if (state.tokens.next.id === "(end)") 19836 error("E006", state.tokens.curr); 19837 19838 var isDangerous = 19839 state.option.asi && 19840 state.tokens.prev.line !== startLine(state.tokens.curr) && 19841 _.contains(["]", ")"], state.tokens.prev.id) && 19842 _.contains(["[", "("], state.tokens.curr.id); 19843 19844 if (isDangerous) 19845 warning("W014", state.tokens.curr, state.tokens.curr.id); 19846 19847 advance(); 19848 19849 if (initial) { 19850 state.funct["(verb)"] = state.tokens.curr.value; 19851 state.tokens.curr.beginsStmt = true; 19852 } 19853 19854 if (initial === true && state.tokens.curr.fud) { 19855 left = state.tokens.curr.fud(); 19856 } else { 19857 if (state.tokens.curr.nud) { 19858 left = state.tokens.curr.nud(rbp); 19859 } else { 19860 error("E030", state.tokens.curr, state.tokens.curr.id); 19861 } 19862 19863 while (rbp < state.tokens.next.lbp && !isEndOfExpr()) { 19864 isArray = state.tokens.curr.value === "Array"; 19865 isObject = state.tokens.curr.value === "Object"; 19866 19867 // #527, new Foo.Array(), Foo.Array(), new Foo.Object(), Foo.Object() 19868 // Line breaks in IfStatement heads exist to satisfy the checkJSHint 19869 // "Line too long." error. 19870 if (left && (left.value || (left.first && left.first.value))) { 19871 // If the left.value is not "new", or the left.first.value is a "." 19872 // then safely assume that this is not "new Array()" and possibly 19873 // not "new Object()"... 19874 if (left.value !== "new" || 19875 (left.first && left.first.value && left.first.value === ".")) { 19876 isArray = false; 19877 // ...In the case of Object, if the left.value and state.tokens.curr.value 19878 // are not equal, then safely assume that this not "new Object()" 19879 if (left.value !== state.tokens.curr.value) { 19880 isObject = false; 19881 } 19882 } 19883 } 19884 19885 advance(); 19886 19887 if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { 19888 warning("W009", state.tokens.curr); 19889 } 19890 19891 if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { 19892 warning("W010", state.tokens.curr); 19893 } 19894 19895 if (left && state.tokens.curr.led) { 19896 left = state.tokens.curr.led(left); 19897 } else { 19898 error("E033", state.tokens.curr, state.tokens.curr.id); 19899 } 19900 } 19901 } 19902 if (isLetExpr) { 19903 state.funct["(scope)"].unstack(); 19904 } 19905 19906 state.nameStack.pop(); 19907 19908 return left; 19909 } 19910 19911 19912 // Functions for conformance of style. 19913 19914 function startLine(token) { 19915 return token.startLine || token.line; 19916 } 19917 19918 function nobreaknonadjacent(left, right) { 19919 left = left || state.tokens.curr; 19920 right = right || state.tokens.next; 19921 if (!state.option.laxbreak && left.line !== startLine(right)) { 19922 warning("W014", right, right.value); 19923 } 19924 } 19925 19926 function nolinebreak(t) { 19927 t = t || state.tokens.curr; 19928 if (t.line !== startLine(state.tokens.next)) { 19929 warning("E022", t, t.value); 19930 } 19931 } 19932 19933 function nobreakcomma(left, right) { 19934 if (left.line !== startLine(right)) { 19935 if (!state.option.laxcomma) { 19936 if (parseComma.first) { 19937 warning("I001"); 19938 parseComma.first = false; 19939 } 19940 warning("W014", left, right.value); 19941 } 19942 } 19943 } 19944 19945 function parseComma(opts) { 19946 opts = opts || {}; 19947 19948 if (!opts.peek) { 19949 nobreakcomma(state.tokens.curr, state.tokens.next); 19950 advance(","); 19951 } else { 19952 nobreakcomma(state.tokens.prev, state.tokens.curr); 19953 } 19954 19955 if (state.tokens.next.identifier && !(opts.property && state.inES5())) { 19956 // Keywords that cannot follow a comma operator. 19957 switch (state.tokens.next.value) { 19958 case "break": 19959 case "case": 19960 case "catch": 19961 case "continue": 19962 case "default": 19963 case "do": 19964 case "else": 19965 case "finally": 19966 case "for": 19967 case "if": 19968 case "in": 19969 case "instanceof": 19970 case "return": 19971 case "switch": 19972 case "throw": 19973 case "try": 19974 case "var": 19975 case "let": 19976 case "while": 19977 case "with": 19978 error("E024", state.tokens.next, state.tokens.next.value); 19979 return false; 19980 } 19981 } 19982 19983 if (state.tokens.next.type === "(punctuator)") { 19984 switch (state.tokens.next.value) { 19985 case "}": 19986 case "]": 19987 case ",": 19988 if (opts.allowTrailing) { 19989 return true; 19990 } 19991 19992 /* falls through */ 19993 case ")": 19994 error("E024", state.tokens.next, state.tokens.next.value); 19995 return false; 19996 } 19997 } 19998 return true; 19999 } 20000 20001 // Functional constructors for making the symbols that will be inherited by 20002 // tokens. 20003 20004 function symbol(s, p) { 20005 var x = state.syntax[s]; 20006 if (!x || typeof x !== "object") { 20007 state.syntax[s] = x = { 20008 id: s, 20009 lbp: p, 20010 value: s 20011 }; 20012 } 20013 return x; 20014 } 20015 20016 function delim(s) { 20017 var x = symbol(s, 0); 20018 x.delim = true; 20019 return x; 20020 } 20021 20022 function stmt(s, f) { 20023 var x = delim(s); 20024 x.identifier = x.reserved = true; 20025 x.fud = f; 20026 return x; 20027 } 20028 20029 function blockstmt(s, f) { 20030 var x = stmt(s, f); 20031 x.block = true; 20032 return x; 20033 } 20034 20035 function reserveName(x) { 20036 var c = x.id.charAt(0); 20037 if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) { 20038 x.identifier = x.reserved = true; 20039 } 20040 return x; 20041 } 20042 20043 function prefix(s, f) { 20044 var x = symbol(s, 150); 20045 reserveName(x); 20046 20047 x.nud = (typeof f === "function") ? f : function() { 20048 this.arity = "unary"; 20049 this.right = expression(150); 20050 20051 if (this.id === "++" || this.id === "--") { 20052 if (state.option.plusplus) { 20053 warning("W016", this, this.id); 20054 } else if (this.right && (!this.right.identifier || isReserved(this.right)) && 20055 this.right.id !== "." && this.right.id !== "[") { 20056 warning("W017", this); 20057 } 20058 20059 if (this.right && this.right.isMetaProperty) { 20060 error("E031", this); 20061 // detect increment/decrement of a const 20062 // in the case of a.b, right will be the "." punctuator 20063 } else if (this.right && this.right.identifier) { 20064 state.funct["(scope)"].block.modify(this.right.value, this); 20065 } 20066 } 20067 20068 return this; 20069 }; 20070 20071 return x; 20072 } 20073 20074 function type(s, f) { 20075 var x = delim(s); 20076 x.type = s; 20077 x.nud = f; 20078 return x; 20079 } 20080 20081 function reserve(name, func) { 20082 var x = type(name, func); 20083 x.identifier = true; 20084 x.reserved = true; 20085 return x; 20086 } 20087 20088 function FutureReservedWord(name, meta) { 20089 var x = type(name, (meta && meta.nud) || function() { 20090 return this; 20091 }); 20092 20093 meta = meta || {}; 20094 meta.isFutureReservedWord = true; 20095 20096 x.value = name; 20097 x.identifier = true; 20098 x.reserved = true; 20099 x.meta = meta; 20100 20101 return x; 20102 } 20103 20104 function reservevar(s, v) { 20105 return reserve(s, function() { 20106 if (typeof v === "function") { 20107 v(this); 20108 } 20109 return this; 20110 }); 20111 } 20112 20113 function infix(s, f, p, w) { 20114 var x = symbol(s, p); 20115 reserveName(x); 20116 x.infix = true; 20117 x.led = function(left) { 20118 if (!w) { 20119 nobreaknonadjacent(state.tokens.prev, state.tokens.curr); 20120 } 20121 if ((s === "in" || s === "instanceof") && left.id === "!") { 20122 warning("W018", left, "!"); 20123 } 20124 if (typeof f === "function") { 20125 return f(left, this); 20126 } else { 20127 this.left = left; 20128 this.right = expression(p); 20129 return this; 20130 } 20131 }; 20132 return x; 20133 } 20134 20135 function application(s) { 20136 var x = symbol(s, 42); 20137 20138 x.infix = true; 20139 x.led = function(left) { 20140 nobreaknonadjacent(state.tokens.prev, state.tokens.curr); 20141 20142 this.left = left; 20143 this.right = doFunction({ type: "arrow", loneArg: left }); 20144 return this; 20145 }; 20146 return x; 20147 } 20148 20149 function relation(s, f) { 20150 var x = symbol(s, 100); 20151 20152 x.infix = true; 20153 x.led = function(left) { 20154 nobreaknonadjacent(state.tokens.prev, state.tokens.curr); 20155 this.left = left; 20156 var right = this.right = expression(100); 20157 20158 if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) { 20159 warning("W019", this); 20160 } else if (f) { 20161 f.apply(this, [left, right]); 20162 } 20163 20164 if (!left || !right) { 20165 quit("E041", state.tokens.curr); 20166 } 20167 20168 if (left.id === "!") { 20169 warning("W018", left, "!"); 20170 } 20171 20172 if (right.id === "!") { 20173 warning("W018", right, "!"); 20174 } 20175 20176 return this; 20177 }; 20178 return x; 20179 } 20180 20181 var typeofValues = {}; 20182 typeofValues.legacy = [ 20183 // E4X extended the `typeof` operator to return "xml" for the XML and 20184 // XMLList types it introduced. 20185 // Ref: 11.3.2 The typeof Operator 20186 // http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf 20187 "xml", 20188 // IE<9 reports "unknown" when the `typeof` operator is applied to an 20189 // object existing across a COM+ bridge. In lieu of official documentation 20190 // (which does not exist), see: 20191 // http://robertnyman.com/2005/12/21/what-is-typeof-unknown/ 20192 "unknown" 20193 ]; 20194 typeofValues.es3 = [ 20195 "undefined", "boolean", "number", "string", "function", "object", 20196 ]; 20197 typeofValues.es3 = typeofValues.es3.concat(typeofValues.legacy); 20198 typeofValues.es6 = typeofValues.es3.concat("symbol"); 20199 20200 // Checks whether the 'typeof' operator is used with the correct 20201 // value. For docs on 'typeof' see: 20202 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof 20203 function isTypoTypeof(left, right, state) { 20204 var values; 20205 20206 if (state.option.notypeof) 20207 return false; 20208 20209 if (!left || !right) 20210 return false; 20211 20212 values = state.inES6() ? typeofValues.es6 : typeofValues.es3; 20213 20214 if (right.type === "(identifier)" && right.value === "typeof" && left.type === "(string)") 20215 return !_.contains(values, left.value); 20216 20217 return false; 20218 } 20219 20220 function isGlobalEval(left, state) { 20221 var isGlobal = false; 20222 20223 // permit methods to refer to an "eval" key in their own context 20224 if (left.type === "this" && state.funct["(context)"] === null) { 20225 isGlobal = true; 20226 } 20227 // permit use of "eval" members of objects 20228 else if (left.type === "(identifier)") { 20229 if (state.option.node && left.value === "global") { 20230 isGlobal = true; 20231 } 20232 20233 else if (state.option.browser && (left.value === "window" || left.value === "document")) { 20234 isGlobal = true; 20235 } 20236 } 20237 20238 return isGlobal; 20239 } 20240 20241 function findNativePrototype(left) { 20242 var natives = [ 20243 "Array", "ArrayBuffer", "Boolean", "Collator", "DataView", "Date", 20244 "DateTimeFormat", "Error", "EvalError", "Float32Array", "Float64Array", 20245 "Function", "Infinity", "Intl", "Int16Array", "Int32Array", "Int8Array", 20246 "Iterator", "Number", "NumberFormat", "Object", "RangeError", 20247 "ReferenceError", "RegExp", "StopIteration", "String", "SyntaxError", 20248 "TypeError", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray", 20249 "URIError" 20250 ]; 20251 20252 function walkPrototype(obj) { 20253 if (typeof obj !== "object") return; 20254 return obj.right === "prototype" ? obj : walkPrototype(obj.left); 20255 } 20256 20257 function walkNative(obj) { 20258 while (!obj.identifier && typeof obj.left === "object") 20259 obj = obj.left; 20260 20261 if (obj.identifier && natives.indexOf(obj.value) >= 0 && 20262 state.funct["(scope)"].isPredefined(obj.value)) { 20263 return obj.value; 20264 } 20265 } 20266 20267 var prototype = walkPrototype(left); 20268 if (prototype) return walkNative(prototype); 20269 } 20270 20271 /** 20272 * Checks the left hand side of an assignment for issues, returns if ok 20273 * @param {token} left - the left hand side of the assignment 20274 * @param {token=} assignToken - the token for the assignment, used for reporting 20275 * @param {object=} options - optional object 20276 * @param {boolean} options.allowDestructuring - whether to allow destructuting binding 20277 * @returns {boolean} Whether the left hand side is OK 20278 */ 20279 function checkLeftSideAssign(left, assignToken, options) { 20280 20281 var allowDestructuring = options && options.allowDestructuring; 20282 20283 assignToken = assignToken || left; 20284 20285 if (state.option.freeze) { 20286 var nativeObject = findNativePrototype(left); 20287 if (nativeObject) 20288 warning("W121", left, nativeObject); 20289 } 20290 if (checkPunctuator(left, "...")) { 20291 left = left.right; 20292 } 20293 20294 if (left.identifier && !left.isMetaProperty) { 20295 // reassign also calls modify 20296 // but we are specific in order to catch function re-assignment 20297 // and globals re-assignment 20298 state.funct["(scope)"].block.reassign(left.value, left); 20299 } 20300 20301 if (left.id === ".") { 20302 if (!left.left || left.left.value === "arguments" && !state.isStrict()) { 20303 warning("E031", assignToken); 20304 } 20305 20306 state.nameStack.set(state.tokens.prev); 20307 return true; 20308 } else if (left.id === "{" || left.id === "[") { 20309 if (!allowDestructuring || !left.destructAssign) { 20310 if (left.id === "{" || !left.left) { 20311 warning("E031", assignToken); 20312 } else if (left.left.value === "arguments" && !state.isStrict()) { 20313 warning("E031", assignToken); 20314 } 20315 } 20316 20317 if (left.id === "[") { 20318 state.nameStack.set(left.right); 20319 } 20320 20321 return true; 20322 } else if (left.identifier && !isReserved(left) && !left.isMetaProperty) { 20323 if (state.funct["(scope)"].labeltype(left.value) === "exception") { 20324 warning("W022", left); 20325 } 20326 state.nameStack.set(left); 20327 return true; 20328 } 20329 20330 if (left === state.syntax["function"]) { 20331 warning("W023", state.tokens.curr); 20332 } else { 20333 error("E031", assignToken); 20334 } 20335 20336 return false; 20337 } 20338 20339 function assignop(s, f, p) { 20340 var x = infix(s, typeof f === "function" ? f : function(left, that) { 20341 that.left = left; 20342 20343 checkLeftSideAssign(left, that, { allowDestructuring: true }); 20344 20345 that.right = expression(10); 20346 20347 return that; 20348 }, p); 20349 20350 x.exps = true; 20351 x.assign = true; 20352 return x; 20353 } 20354 20355 20356 function bitwise(s, f, p) { 20357 var x = symbol(s, p); 20358 reserveName(x); 20359 x.infix = true; 20360 x.led = (typeof f === "function") ? f : function(left) { 20361 if (state.option.bitwise) { 20362 warning("W016", this, this.id); 20363 } 20364 this.left = left; 20365 this.right = expression(p); 20366 return this; 20367 }; 20368 return x; 20369 } 20370 20371 function bitwiseassignop(s) { 20372 return assignop(s, function(left, that) { 20373 if (state.option.bitwise) { 20374 warning("W016", that, that.id); 20375 } 20376 20377 checkLeftSideAssign(left, that); 20378 20379 that.right = expression(10); 20380 20381 return that; 20382 }, 20); 20383 } 20384 20385 function suffix(s) { 20386 var x = symbol(s, 150); 20387 20388 x.led = function(left) { 20389 // this = suffix e.g. "++" punctuator 20390 // left = symbol operated e.g. "a" identifier or "a.b" punctuator 20391 if (state.option.plusplus) { 20392 warning("W016", this, this.id); 20393 } else if ((!left.identifier || isReserved(left)) && left.id !== "." && left.id !== "[") { 20394 warning("W017", this); 20395 } 20396 20397 if (left.isMetaProperty) { 20398 error("E031", this); 20399 // detect increment/decrement of a const 20400 // in the case of a.b, left will be the "." punctuator 20401 } else if (left && left.identifier) { 20402 state.funct["(scope)"].block.modify(left.value, left); 20403 } 20404 20405 this.left = left; 20406 return this; 20407 }; 20408 return x; 20409 } 20410 20411 // fnparam means that this identifier is being defined as a function 20412 // argument (see identifier()) 20413 // prop means that this identifier is that of an object property 20414 20415 function optionalidentifier(fnparam, prop, preserve) { 20416 if (!state.tokens.next.identifier) { 20417 return; 20418 } 20419 20420 if (!preserve) { 20421 advance(); 20422 } 20423 20424 var curr = state.tokens.curr; 20425 var val = state.tokens.curr.value; 20426 20427 if (!isReserved(curr)) { 20428 return val; 20429 } 20430 20431 if (prop) { 20432 if (state.inES5()) { 20433 return val; 20434 } 20435 } 20436 20437 if (fnparam && val === "undefined") { 20438 return val; 20439 } 20440 20441 warning("W024", state.tokens.curr, state.tokens.curr.id); 20442 return val; 20443 } 20444 20445 // fnparam means that this identifier is being defined as a function 20446 // argument 20447 // prop means that this identifier is that of an object property 20448 function identifier(fnparam, prop) { 20449 var i = optionalidentifier(fnparam, prop, false); 20450 if (i) { 20451 return i; 20452 } 20453 20454 // parameter destructuring with rest operator 20455 if (state.tokens.next.value === "...") { 20456 if (!state.inES6(true)) { 20457 warning("W119", state.tokens.next, "spread/rest operator", "6"); 20458 } 20459 advance(); 20460 20461 if (checkPunctuator(state.tokens.next, "...")) { 20462 warning("E024", state.tokens.next, "..."); 20463 while (checkPunctuator(state.tokens.next, "...")) { 20464 advance(); 20465 } 20466 } 20467 20468 if (!state.tokens.next.identifier) { 20469 warning("E024", state.tokens.curr, state.tokens.next.id); 20470 return; 20471 } 20472 20473 return identifier(fnparam, prop); 20474 } else { 20475 error("E030", state.tokens.next, state.tokens.next.value); 20476 20477 // The token should be consumed after a warning is issued so the parser 20478 // can continue as though an identifier were found. The semicolon token 20479 // should not be consumed in this way so that the parser interprets it as 20480 // a statement delimeter; 20481 if (state.tokens.next.id !== ";") { 20482 advance(); 20483 } 20484 } 20485 } 20486 20487 20488 function reachable(controlToken) { 20489 var i = 0, t; 20490 if (state.tokens.next.id !== ";" || controlToken.inBracelessBlock) { 20491 return; 20492 } 20493 for (;;) { 20494 do { 20495 t = peek(i); 20496 i += 1; 20497 } while (t.id !== "(end)" && t.id === "(comment)"); 20498 20499 if (t.reach) { 20500 return; 20501 } 20502 if (t.id !== "(endline)") { 20503 if (t.id === "function") { 20504 if (state.option.latedef === true) { 20505 warning("W026", t); 20506 } 20507 break; 20508 } 20509 20510 warning("W027", t, t.value, controlToken.value); 20511 break; 20512 } 20513 } 20514 } 20515 20516 /** 20517 * Consume the semicolon that delimits the statement currently being parsed, 20518 * emitting relevant warnings/errors as appropriate. 20519 * 20520 * @param {token} stmt - token describing the statement under consideration 20521 */ 20522 function parseFinalSemicolon(stmt) { 20523 if (state.tokens.next.id !== ";") { 20524 // don't complain about unclosed templates / strings 20525 if (state.tokens.next.isUnclosed) return advance(); 20526 20527 var sameLine = startLine(state.tokens.next) === state.tokens.curr.line && 20528 state.tokens.next.id !== "(end)"; 20529 var blockEnd = checkPunctuator(state.tokens.next, "}"); 20530 20531 if (sameLine && !blockEnd && !(stmt.id === "do" && state.inES6(true))) { 20532 errorAt("E058", state.tokens.curr.line, state.tokens.curr.character); 20533 } else if (!state.option.asi) { 20534 // If this is the last statement in a block that ends on 20535 // the same line *and* option lastsemic is on, ignore the warning. 20536 // Otherwise, complain about missing semicolon. 20537 if (!(blockEnd && sameLine && state.option.lastsemic)) { 20538 warningAt("W033", state.tokens.curr.line, state.tokens.curr.character); 20539 } 20540 } 20541 } else { 20542 advance(";"); 20543 } 20544 } 20545 20546 function statement() { 20547 var i = indent, r, t = state.tokens.next, hasOwnScope = false; 20548 20549 if (t.id === ";") { 20550 advance(";"); 20551 return; 20552 } 20553 20554 // Is this a labelled statement? 20555 var res = isReserved(t); 20556 20557 // We're being more tolerant here: if someone uses 20558 // a FutureReservedWord as a label, we warn but proceed 20559 // anyway. 20560 20561 if (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") { 20562 warning("W024", t, t.id); 20563 res = false; 20564 } 20565 20566 if (t.identifier && !res && peek().id === ":") { 20567 advance(); 20568 advance(":"); 20569 20570 hasOwnScope = true; 20571 state.funct["(scope)"].stack(); 20572 state.funct["(scope)"].block.addBreakLabel(t.value, { token: state.tokens.curr }); 20573 20574 if (!state.tokens.next.labelled && state.tokens.next.value !== "{") { 20575 warning("W028", state.tokens.next, t.value, state.tokens.next.value); 20576 } 20577 20578 state.tokens.next.label = t.value; 20579 t = state.tokens.next; 20580 } 20581 20582 // Is it a lonely block? 20583 20584 if (t.id === "{") { 20585 // Is it a switch case block? 20586 // 20587 // switch (foo) { 20588 // case bar: { <= here. 20589 // ... 20590 // } 20591 // } 20592 var iscase = (state.funct["(verb)"] === "case" && state.tokens.curr.value === ":"); 20593 block(true, true, false, false, iscase); 20594 20595 if (hasOwnScope) { 20596 state.funct["(scope)"].unstack(); 20597 } 20598 20599 return; 20600 } 20601 20602 // Parse the statement. 20603 20604 r = expression(0, true); 20605 20606 if (r && !(r.identifier && r.value === "function") && 20607 !(r.type === "(punctuator)" && r.left && 20608 r.left.identifier && r.left.value === "function")) { 20609 if (!state.isStrict() && state.stmtMissingStrict()) { 20610 warning("E007"); 20611 } 20612 } 20613 20614 // Look for the final semicolon. 20615 20616 if (!t.block) { 20617 if (!state.option.expr && (!r || !r.exps)) { 20618 warning("W030", state.tokens.curr); 20619 } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") { 20620 warning("W031", t); 20621 } 20622 parseFinalSemicolon(t); 20623 } 20624 20625 20626 // Restore the indentation. 20627 20628 indent = i; 20629 if (hasOwnScope) { 20630 state.funct["(scope)"].unstack(); 20631 } 20632 return r; 20633 } 20634 20635 20636 function statements() { 20637 var a = [], p; 20638 20639 while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") { 20640 if (state.tokens.next.id === ";") { 20641 p = peek(); 20642 20643 if (!p || (p.id !== "(" && p.id !== "[")) { 20644 warning("W032"); 20645 } 20646 20647 advance(";"); 20648 } else { 20649 a.push(statement()); 20650 } 20651 } 20652 return a; 20653 } 20654 20655 20656 /* 20657 * read all directives 20658 */ 20659 function directives() { 20660 var current = state.tokens.next; 20661 while (state.tokens.next.id === "(string)") { 20662 var next = peekIgnoreEOL(); 20663 if (!isEndOfExpr(current, next)) { 20664 break; 20665 } 20666 current = next; 20667 20668 advance(); 20669 var directive = state.tokens.curr.value; 20670 if (state.directive[directive] || 20671 (directive === "use strict" && state.option.strict === "implied")) { 20672 warning("W034", state.tokens.curr, directive); 20673 } 20674 20675 // there's no directive negation, so always set to true 20676 state.directive[directive] = true; 20677 20678 parseFinalSemicolon(current); 20679 } 20680 20681 if (state.isStrict()) { 20682 state.option.undef = true; 20683 } 20684 } 20685 20686 20687 /* 20688 * Parses a single block. A block is a sequence of statements wrapped in 20689 * braces. 20690 * 20691 * ordinary - true for everything but function bodies and try blocks. 20692 * stmt - true if block can be a single statement (e.g. in if/for/while). 20693 * isfunc - true if block is a function body 20694 * isfatarrow - true if its a body of a fat arrow function 20695 * iscase - true if block is a switch case block 20696 */ 20697 function block(ordinary, stmt, isfunc, isfatarrow, iscase) { 20698 var a, 20699 b = inblock, 20700 old_indent = indent, 20701 m, 20702 t, 20703 line, 20704 d; 20705 20706 inblock = ordinary; 20707 20708 t = state.tokens.next; 20709 20710 var metrics = state.funct["(metrics)"]; 20711 metrics.nestedBlockDepth += 1; 20712 metrics.verifyMaxNestedBlockDepthPerFunction(); 20713 20714 if (state.tokens.next.id === "{") { 20715 advance("{"); 20716 20717 // create a new block scope 20718 state.funct["(scope)"].stack(); 20719 state.funct["(noblockscopedvar)"] = false; 20720 20721 line = state.tokens.curr.line; 20722 if (state.tokens.next.id !== "}") { 20723 indent += state.option.indent; 20724 while (!ordinary && state.tokens.next.from > indent) { 20725 indent += state.option.indent; 20726 } 20727 20728 if (isfunc) { 20729 m = {}; 20730 for (d in state.directive) { 20731 if (_.has(state.directive, d)) { 20732 m[d] = state.directive[d]; 20733 } 20734 } 20735 directives(); 20736 20737 if (state.option.strict && state.funct["(context)"]["(global)"]) { 20738 if (!m["use strict"] && !state.isStrict()) { 20739 warning("E007"); 20740 } 20741 } 20742 } 20743 20744 a = statements(); 20745 20746 metrics.statementCount += a.length; 20747 20748 indent -= state.option.indent; 20749 } 20750 20751 advance("}", t); 20752 20753 if (isfunc) { 20754 state.funct["(scope)"].validateParams(); 20755 if (m) { 20756 state.directive = m; 20757 } 20758 } 20759 20760 state.funct["(scope)"].unstack(); 20761 20762 indent = old_indent; 20763 } else if (!ordinary) { 20764 if (isfunc) { 20765 state.funct["(scope)"].stack(); 20766 20767 m = {}; 20768 if (stmt && !isfatarrow && !state.inMoz()) { 20769 error("W118", state.tokens.curr, "function closure expressions"); 20770 } 20771 20772 if (!stmt) { 20773 for (d in state.directive) { 20774 if (_.has(state.directive, d)) { 20775 m[d] = state.directive[d]; 20776 } 20777 } 20778 } 20779 expression(10); 20780 20781 if (state.option.strict && state.funct["(context)"]["(global)"]) { 20782 if (!m["use strict"] && !state.isStrict()) { 20783 warning("E007"); 20784 } 20785 } 20786 20787 state.funct["(scope)"].unstack(); 20788 } else { 20789 error("E021", state.tokens.next, "{", state.tokens.next.value); 20790 } 20791 } else { 20792 20793 // check to avoid let declaration not within a block 20794 // though is fine inside for loop initializer section 20795 state.funct["(noblockscopedvar)"] = state.tokens.next.id !== "for"; 20796 state.funct["(scope)"].stack(); 20797 20798 if (!stmt || state.option.curly) { 20799 warning("W116", state.tokens.next, "{", state.tokens.next.value); 20800 } 20801 20802 state.tokens.next.inBracelessBlock = true; 20803 indent += state.option.indent; 20804 // test indentation only if statement is in new line 20805 a = [statement()]; 20806 indent -= state.option.indent; 20807 20808 state.funct["(scope)"].unstack(); 20809 delete state.funct["(noblockscopedvar)"]; 20810 } 20811 20812 // Don't clear and let it propagate out if it is "break", "return" or similar in switch case 20813 switch (state.funct["(verb)"]) { 20814 case "break": 20815 case "continue": 20816 case "return": 20817 case "throw": 20818 if (iscase) { 20819 break; 20820 } 20821 20822 /* falls through */ 20823 default: 20824 state.funct["(verb)"] = null; 20825 } 20826 20827 inblock = b; 20828 if (ordinary && state.option.noempty && (!a || a.length === 0)) { 20829 warning("W035", state.tokens.prev); 20830 } 20831 metrics.nestedBlockDepth -= 1; 20832 return a; 20833 } 20834 20835 20836 function countMember(m) { 20837 if (membersOnly && typeof membersOnly[m] !== "boolean") { 20838 warning("W036", state.tokens.curr, m); 20839 } 20840 if (typeof member[m] === "number") { 20841 member[m] += 1; 20842 } else { 20843 member[m] = 1; 20844 } 20845 } 20846 20847 // Build the syntax table by declaring the syntactic elements of the language. 20848 20849 type("(number)", function() { 20850 return this; 20851 }); 20852 20853 type("(string)", function() { 20854 return this; 20855 }); 20856 20857 state.syntax["(identifier)"] = { 20858 type: "(identifier)", 20859 lbp: 0, 20860 identifier: true, 20861 20862 nud: function() { 20863 var v = this.value; 20864 20865 // If this identifier is the lone parameter to a shorthand "fat arrow" 20866 // function definition, i.e. 20867 // 20868 // x => x; 20869 // 20870 // ...it should not be considered as a variable in the current scope. It 20871 // will be added to the scope of the new function when the next token is 20872 // parsed, so it can be safely ignored for now. 20873 if (state.tokens.next.id === "=>") { 20874 return this; 20875 } 20876 20877 if (!state.funct["(comparray)"].check(v)) { 20878 state.funct["(scope)"].block.use(v, state.tokens.curr); 20879 } 20880 return this; 20881 }, 20882 20883 led: function() { 20884 error("E033", state.tokens.next, state.tokens.next.value); 20885 } 20886 }; 20887 20888 var baseTemplateSyntax = { 20889 identifier: false, 20890 template: true, 20891 }; 20892 state.syntax["(template)"] = _.extend({ 20893 lbp: 155, 20894 type: "(template)", 20895 nud: doTemplateLiteral, 20896 led: doTemplateLiteral, 20897 noSubst: false 20898 }, baseTemplateSyntax); 20899 20900 state.syntax["(template middle)"] = _.extend({ 20901 lbp: 0, 20902 type: "(template middle)", 20903 middle: true, 20904 noSubst: false 20905 }, baseTemplateSyntax); 20906 20907 state.syntax["(template tail)"] = _.extend({ 20908 lbp: 0, 20909 type: "(template tail)", 20910 tail: true, 20911 noSubst: false 20912 }, baseTemplateSyntax); 20913 20914 state.syntax["(no subst template)"] = _.extend({ 20915 lbp: 155, 20916 type: "(template)", 20917 nud: doTemplateLiteral, 20918 led: doTemplateLiteral, 20919 noSubst: true, 20920 tail: true // mark as tail, since it's always the last component 20921 }, baseTemplateSyntax); 20922 20923 type("(regexp)", function() { 20924 return this; 20925 }); 20926 20927 // ECMAScript parser 20928 20929 delim("(endline)"); 20930 (function(x) { 20931 x.line = x.from = 0; 20932 })(delim("(begin)")); 20933 delim("(end)").reach = true; 20934 delim("(error)").reach = true; 20935 delim("}").reach = true; 20936 delim(")"); 20937 delim("]"); 20938 delim("\"").reach = true; 20939 delim("'").reach = true; 20940 delim(";"); 20941 delim(":").reach = true; 20942 delim("#"); 20943 20944 reserve("else"); 20945 reserve("case").reach = true; 20946 reserve("catch"); 20947 reserve("default").reach = true; 20948 reserve("finally"); 20949 reservevar("arguments", function(x) { 20950 if (state.isStrict() && state.funct["(global)"]) { 20951 warning("E008", x); 20952 } 20953 }); 20954 reservevar("eval"); 20955 reservevar("false"); 20956 reservevar("Infinity"); 20957 reservevar("null"); 20958 reservevar("this", function(x) { 20959 if (state.isStrict() && !isMethod() && 20960 !state.option.validthis && ((state.funct["(statement)"] && 20961 state.funct["(name)"].charAt(0) > "Z") || state.funct["(global)"])) { 20962 warning("W040", x); 20963 } 20964 }); 20965 reservevar("true"); 20966 reservevar("undefined"); 20967 20968 assignop("=", "assign", 20); 20969 assignop("+=", "assignadd", 20); 20970 assignop("-=", "assignsub", 20); 20971 assignop("*=", "assignmult", 20); 20972 assignop("/=", "assigndiv", 20).nud = function() { 20973 error("E014"); 20974 }; 20975 assignop("%=", "assignmod", 20); 20976 20977 bitwiseassignop("&="); 20978 bitwiseassignop("|="); 20979 bitwiseassignop("^="); 20980 bitwiseassignop("<<="); 20981 bitwiseassignop(">>="); 20982 bitwiseassignop(">>>="); 20983 infix(",", function(left, that) { 20984 var expr; 20985 that.exprs = [left]; 20986 20987 if (state.option.nocomma) { 20988 warning("W127"); 20989 } 20990 20991 if (!parseComma({ peek: true })) { 20992 return that; 20993 } 20994 while (true) { 20995 if (!(expr = expression(10))) { 20996 break; 20997 } 20998 that.exprs.push(expr); 20999 if (state.tokens.next.value !== "," || !parseComma()) { 21000 break; 21001 } 21002 } 21003 return that; 21004 }, 10, true); 21005 21006 infix("?", function(left, that) { 21007 increaseComplexityCount(); 21008 that.left = left; 21009 that.right = expression(10); 21010 advance(":"); 21011 that["else"] = expression(10); 21012 return that; 21013 }, 30); 21014 21015 var orPrecendence = 40; 21016 infix("||", function(left, that) { 21017 increaseComplexityCount(); 21018 that.left = left; 21019 that.right = expression(orPrecendence); 21020 return that; 21021 }, orPrecendence); 21022 infix("&&", "and", 50); 21023 bitwise("|", "bitor", 70); 21024 bitwise("^", "bitxor", 80); 21025 bitwise("&", "bitand", 90); 21026 relation("==", function(left, right) { 21027 var eqnull = state.option.eqnull && 21028 ((left && left.value) === "null" || (right && right.value) === "null"); 21029 21030 switch (true) { 21031 case !eqnull && state.option.eqeqeq: 21032 this.from = this.character; 21033 warning("W116", this, "===", "=="); 21034 break; 21035 case isTypoTypeof(right, left, state): 21036 warning("W122", this, right.value); 21037 break; 21038 case isTypoTypeof(left, right, state): 21039 warning("W122", this, left.value); 21040 break; 21041 } 21042 21043 return this; 21044 }); 21045 relation("===", function(left, right) { 21046 if (isTypoTypeof(right, left, state)) { 21047 warning("W122", this, right.value); 21048 } else if (isTypoTypeof(left, right, state)) { 21049 warning("W122", this, left.value); 21050 } 21051 return this; 21052 }); 21053 relation("!=", function(left, right) { 21054 var eqnull = state.option.eqnull && 21055 ((left && left.value) === "null" || (right && right.value) === "null"); 21056 21057 if (!eqnull && state.option.eqeqeq) { 21058 this.from = this.character; 21059 warning("W116", this, "!==", "!="); 21060 } else if (isTypoTypeof(right, left, state)) { 21061 warning("W122", this, right.value); 21062 } else if (isTypoTypeof(left, right, state)) { 21063 warning("W122", this, left.value); 21064 } 21065 return this; 21066 }); 21067 relation("!==", function(left, right) { 21068 if (isTypoTypeof(right, left, state)) { 21069 warning("W122", this, right.value); 21070 } else if (isTypoTypeof(left, right, state)) { 21071 warning("W122", this, left.value); 21072 } 21073 return this; 21074 }); 21075 relation("<"); 21076 relation(">"); 21077 relation("<="); 21078 relation(">="); 21079 bitwise("<<", "shiftleft", 120); 21080 bitwise(">>", "shiftright", 120); 21081 bitwise(">>>", "shiftrightunsigned", 120); 21082 infix("in", "in", 120); 21083 infix("instanceof", function(left, token) { 21084 var right; 21085 var scope = state.funct["(scope)"]; 21086 token.left = left; 21087 token.right = right = expression(120); 21088 21089 // This condition reflects a syntax error which will be reported by the 21090 // `expression` function. 21091 if (!right) { 21092 return token; 21093 } 21094 21095 if (right.id === "(number)" || 21096 right.id === "(string)" || 21097 right.value === "null" || 21098 (right.value === "undefined" && !scope.has("undefined")) || 21099 right.arity === "unary" || 21100 right.id === "{" || 21101 (right.id === "[" && !right.right) || 21102 right.id === "(regexp)" || 21103 (right.id === "(template)" && !right.tag)) { 21104 error("E060"); 21105 } 21106 21107 if (right.id === "function") { 21108 warning("W139"); 21109 } 21110 21111 return token; 21112 }, 120); 21113 infix("+", function(left, that) { 21114 var right; 21115 that.left = left; 21116 that.right = right = expression(130); 21117 21118 if (left && right && left.id === "(string)" && right.id === "(string)") { 21119 left.value += right.value; 21120 left.character = right.character; 21121 if (!state.option.scripturl && reg.javascriptURL.test(left.value)) { 21122 warning("W050", left); 21123 } 21124 return left; 21125 } 21126 21127 return that; 21128 }, 130); 21129 prefix("+", "num"); 21130 prefix("+++", function() { 21131 warning("W007"); 21132 this.arity = "unary"; 21133 this.right = expression(150); 21134 return this; 21135 }); 21136 infix("+++", function(left) { 21137 warning("W007"); 21138 this.left = left; 21139 this.right = expression(130); 21140 return this; 21141 }, 130); 21142 infix("-", "sub", 130); 21143 prefix("-", "neg"); 21144 prefix("---", function() { 21145 warning("W006"); 21146 this.arity = "unary"; 21147 this.right = expression(150); 21148 return this; 21149 }); 21150 infix("---", function(left) { 21151 warning("W006"); 21152 this.left = left; 21153 this.right = expression(130); 21154 return this; 21155 }, 130); 21156 infix("*", "mult", 140); 21157 infix("/", "div", 140); 21158 infix("%", "mod", 140); 21159 21160 suffix("++"); 21161 prefix("++", "preinc"); 21162 state.syntax["++"].exps = true; 21163 state.syntax["++"].ltBoundary = "before"; 21164 21165 suffix("--"); 21166 prefix("--", "predec"); 21167 state.syntax["--"].exps = true; 21168 state.syntax["--"].ltBoundary = "before"; 21169 21170 prefix("delete", function() { 21171 var p = expression(10); 21172 if (!p) { 21173 return this; 21174 } 21175 21176 if (p.id !== "." && p.id !== "[") { 21177 warning("W051"); 21178 } 21179 this.first = p; 21180 21181 // The `delete` operator accepts unresolvable references when not in strict 21182 // mode, so the operand may be undefined. 21183 if (p.identifier && !state.isStrict()) { 21184 p.forgiveUndef = true; 21185 } 21186 return this; 21187 }).exps = true; 21188 21189 prefix("~", function() { 21190 if (state.option.bitwise) { 21191 warning("W016", this, "~"); 21192 } 21193 this.arity = "unary"; 21194 this.right = expression(150); 21195 return this; 21196 }); 21197 21198 prefix("...", function() { 21199 if (!state.inES6(true)) { 21200 warning("W119", this, "spread/rest operator", "6"); 21201 } 21202 21203 // TODO: Allow all AssignmentExpression 21204 // once parsing permits. 21205 // 21206 // How to handle eg. number, boolean when the built-in 21207 // prototype of may have an @@iterator definition? 21208 // 21209 // Number.prototype[Symbol.iterator] = function * () { 21210 // yield this.valueOf(); 21211 // }; 21212 // 21213 // var a = [ ...1 ]; 21214 // console.log(a); // [1]; 21215 // 21216 // for (let n of [...10]) { 21217 // console.log(n); 21218 // } 21219 // // 10 21220 // 21221 // 21222 // Boolean.prototype[Symbol.iterator] = function * () { 21223 // yield this.valueOf(); 21224 // }; 21225 // 21226 // var a = [ ...true ]; 21227 // console.log(a); // [true]; 21228 // 21229 // for (let n of [...false]) { 21230 // console.log(n); 21231 // } 21232 // // false 21233 // 21234 if (!state.tokens.next.identifier && 21235 state.tokens.next.type !== "(string)" && 21236 !checkPunctuators(state.tokens.next, ["[", "("])) { 21237 21238 error("E030", state.tokens.next, state.tokens.next.value); 21239 } 21240 this.right = expression(150); 21241 return this; 21242 }); 21243 21244 prefix("!", function() { 21245 this.arity = "unary"; 21246 this.right = expression(150); 21247 21248 if (!this.right) { // '!' followed by nothing? Give up. 21249 quit("E041", this); 21250 } 21251 21252 if (bang[this.right.id] === true) { 21253 warning("W018", this, "!"); 21254 } 21255 return this; 21256 }); 21257 21258 prefix("typeof", (function() { 21259 var p = expression(150); 21260 this.first = this.right = p; 21261 21262 if (!p) { // 'typeof' followed by nothing? Give up. 21263 quit("E041", this); 21264 } 21265 21266 // The `typeof` operator accepts unresolvable references, so the operand 21267 // may be undefined. 21268 if (p.identifier) { 21269 p.forgiveUndef = true; 21270 } 21271 return this; 21272 })); 21273 prefix("new", function() { 21274 var mp = metaProperty("target", function() { 21275 if (!state.inES6(true)) { 21276 warning("W119", state.tokens.prev, "new.target", "6"); 21277 } 21278 var inFunction, c = state.funct; 21279 while (c) { 21280 inFunction = !c["(global)"]; 21281 if (!c["(arrow)"]) { break; } 21282 c = c["(context)"]; 21283 } 21284 if (!inFunction) { 21285 warning("W136", state.tokens.prev, "new.target"); 21286 } 21287 }); 21288 if (mp) { return mp; } 21289 21290 var c = expression(155), i; 21291 if (c && c.id !== "function") { 21292 if (c.identifier) { 21293 c["new"] = true; 21294 switch (c.value) { 21295 case "Number": 21296 case "String": 21297 case "Boolean": 21298 case "Math": 21299 case "JSON": 21300 warning("W053", state.tokens.prev, c.value); 21301 break; 21302 case "Symbol": 21303 if (state.inES6()) { 21304 warning("W053", state.tokens.prev, c.value); 21305 } 21306 break; 21307 case "Function": 21308 if (!state.option.evil) { 21309 warning("W054"); 21310 } 21311 break; 21312 case "Date": 21313 case "RegExp": 21314 case "this": 21315 break; 21316 default: 21317 if (c.id !== "function") { 21318 i = c.value.substr(0, 1); 21319 if (state.option.newcap && (i < "A" || i > "Z") && 21320 !state.funct["(scope)"].isPredefined(c.value)) { 21321 warning("W055", state.tokens.curr); 21322 } 21323 } 21324 } 21325 } else { 21326 if (c.id !== "." && c.id !== "[" && c.id !== "(") { 21327 warning("W056", state.tokens.curr); 21328 } 21329 } 21330 } else { 21331 if (!state.option.supernew) 21332 warning("W057", this); 21333 } 21334 if (state.tokens.next.id !== "(" && !state.option.supernew) { 21335 warning("W058", state.tokens.curr, state.tokens.curr.value); 21336 } 21337 this.first = this.right = c; 21338 return this; 21339 }); 21340 state.syntax["new"].exps = true; 21341 21342 prefix("void").exps = true; 21343 21344 infix(".", function(left, that) { 21345 var m = identifier(false, true); 21346 21347 if (typeof m === "string") { 21348 countMember(m); 21349 } 21350 21351 that.left = left; 21352 that.right = m; 21353 21354 if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") { 21355 warning("W001"); 21356 } 21357 21358 if (left && left.value === "arguments" && (m === "callee" || m === "caller")) { 21359 if (state.option.noarg) 21360 warning("W059", left, m); 21361 else if (state.isStrict()) 21362 error("E008"); 21363 } else if (!state.option.evil && left && left.value === "document" && 21364 (m === "write" || m === "writeln")) { 21365 warning("W060", left); 21366 } 21367 21368 if (!state.option.evil && (m === "eval" || m === "execScript")) { 21369 if (isGlobalEval(left, state)) { 21370 warning("W061"); 21371 } 21372 } 21373 21374 return that; 21375 }, 160, true); 21376 21377 infix("(", function(left, that) { 21378 if (state.option.immed && left && !left.immed && left.id === "function") { 21379 warning("W062"); 21380 } 21381 21382 var n = 0; 21383 var p = []; 21384 21385 if (left) { 21386 if (left.type === "(identifier)") { 21387 if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { 21388 if ("Array Number String Boolean Date Object Error Symbol".indexOf(left.value) === -1) { 21389 if (left.value === "Math") { 21390 warning("W063", left); 21391 } else if (state.option.newcap) { 21392 warning("W064", left); 21393 } 21394 } 21395 } 21396 } 21397 } 21398 21399 if (state.tokens.next.id !== ")") { 21400 for (;;) { 21401 p[p.length] = expression(10); 21402 n += 1; 21403 if (state.tokens.next.id !== ",") { 21404 break; 21405 } 21406 parseComma(); 21407 } 21408 } 21409 21410 advance(")"); 21411 21412 if (typeof left === "object") { 21413 if (!state.inES5() && left.value === "parseInt" && n === 1) { 21414 warning("W065", state.tokens.curr); 21415 } 21416 if (!state.option.evil) { 21417 if (left.value === "eval" || left.value === "Function" || 21418 left.value === "execScript") { 21419 warning("W061", left); 21420 21421 // This conditional expression was initially implemented with a typo 21422 // which prevented the branch's execution in all cases. While 21423 // enabling the code will produce behavior that is consistent with 21424 // the other forms of code evaluation that follow, such a change is 21425 // also technically incompatable with prior versions of JSHint (due 21426 // to the fact that the behavior was never formally documented). This 21427 // branch should be enabled as part of a major release. 21428 //if (p[0] && p[0].id === "(string)") { 21429 // addEvalCode(left, p[0]); 21430 //} 21431 } else if (p[0] && p[0].id === "(string)" && 21432 (left.value === "setTimeout" || 21433 left.value === "setInterval")) { 21434 warning("W066", left); 21435 addEvalCode(left, p[0]); 21436 21437 // window.setTimeout/setInterval 21438 } else if (p[0] && p[0].id === "(string)" && 21439 left.value === "." && 21440 left.left.value === "window" && 21441 (left.right === "setTimeout" || 21442 left.right === "setInterval")) { 21443 warning("W066", left); 21444 addEvalCode(left, p[0]); 21445 } 21446 } 21447 if (!left.identifier && left.id !== "." && left.id !== "[" && left.id !== "=>" && 21448 left.id !== "(" && left.id !== "&&" && left.id !== "||" && left.id !== "?" && 21449 !(state.inES6() && left["(name)"])) { 21450 warning("W067", that); 21451 } 21452 } 21453 21454 that.left = left; 21455 return that; 21456 }, 155, true).exps = true; 21457 21458 prefix("(", function(rbp) { 21459 var pn = state.tokens.next, pn1, i = -1; 21460 var ret, triggerFnExpr, first, last; 21461 var parens = 1; 21462 var opening = state.tokens.curr; 21463 var preceeding = state.tokens.prev; 21464 var isNecessary = !state.option.singleGroups; 21465 21466 do { 21467 if (pn.value === "(") { 21468 parens += 1; 21469 } else if (pn.value === ")") { 21470 parens -= 1; 21471 } 21472 21473 i += 1; 21474 pn1 = pn; 21475 pn = peek(i); 21476 } while (!(parens === 0 && pn1.value === ")") && pn.type !== "(end)"); 21477 21478 if (state.tokens.next.id === "function") { 21479 triggerFnExpr = state.tokens.next.immed = true; 21480 } 21481 21482 // If the balanced grouping operator is followed by a "fat arrow", the 21483 // current token marks the beginning of a "fat arrow" function and parsing 21484 // should proceed accordingly. 21485 if (pn.value === "=>") { 21486 return doFunction({ type: "arrow", parsedOpening: true }); 21487 } 21488 21489 var exprs = []; 21490 21491 if (state.tokens.next.id !== ")") { 21492 for (;;) { 21493 exprs.push(expression(10)); 21494 21495 if (state.tokens.next.id !== ",") { 21496 break; 21497 } 21498 21499 if (state.option.nocomma) { 21500 warning("W127"); 21501 } 21502 21503 parseComma(); 21504 } 21505 } 21506 21507 advance(")", this); 21508 if (state.option.immed && exprs[0] && exprs[0].id === "function") { 21509 if (state.tokens.next.id !== "(" && 21510 state.tokens.next.id !== "." && state.tokens.next.id !== "[") { 21511 warning("W068", this); 21512 } 21513 } 21514 21515 if (!exprs.length) { 21516 return; 21517 } 21518 if (exprs.length > 1) { 21519 ret = Object.create(state.syntax[","]); 21520 ret.exprs = exprs; 21521 21522 first = exprs[0]; 21523 last = exprs[exprs.length - 1]; 21524 } else { 21525 ret = first = last = exprs[0]; 21526 21527 if (!isNecessary) { 21528 isNecessary = 21529 // Used to distinguish from an ExpressionStatement which may not 21530 // begin with the `{` and `function` tokens 21531 (opening.beginsStmt && (ret.id === "{" || triggerFnExpr || isFunctor(ret))) || 21532 // Used to signal that a function expression is being supplied to 21533 // some other operator. 21534 (triggerFnExpr && 21535 // For parenthesis wrapping a function expression to be considered 21536 // necessary, the grouping operator should be the left-hand-side of 21537 // some other operator--either within the parenthesis or directly 21538 // following them. 21539 (!isEndOfExpr() || state.tokens.prev.id !== "}")) || 21540 // Used to demarcate an arrow function as the left-hand side of some 21541 // operator. 21542 (isFunctor(ret) && !isEndOfExpr()) || 21543 // Used as the return value of a single-statement arrow function 21544 (ret.id === "{" && preceeding.id === "=>") || 21545 // Used to delineate an integer number literal from a dereferencing 21546 // punctuator (otherwise interpreted as a decimal point) 21547 (ret.type === "(number)" && 21548 checkPunctuator(pn, ".") && /^\d+$/.test(ret.value)) || 21549 // Used to wrap object destructuring assignment 21550 (opening.beginsStmt && ret.id === "=" && ret.left.id === "{"); 21551 } 21552 } 21553 21554 if (ret) { 21555 // The operator may be necessary to override the default binding power of 21556 // neighboring operators (whenever there is an operator in use within the 21557 // first expression *or* the current group contains multiple expressions) 21558 if (!isNecessary && (isOperator(first) || ret.exprs)) { 21559 isNecessary = 21560 (rbp > first.lbp) || 21561 (rbp > 0 && rbp === first.lbp) || 21562 (!isEndOfExpr() && last.lbp < state.tokens.next.lbp); 21563 } 21564 21565 if (!isNecessary) { 21566 warning("W126", opening); 21567 } 21568 21569 ret.paren = true; 21570 } 21571 21572 return ret; 21573 }); 21574 21575 application("=>"); 21576 21577 infix("[", function(left, that) { 21578 var e = expression(10), s; 21579 if (e && e.type === "(string)") { 21580 if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) { 21581 if (isGlobalEval(left, state)) { 21582 warning("W061"); 21583 } 21584 } 21585 21586 countMember(e.value); 21587 if (!state.option.sub && reg.identifier.test(e.value)) { 21588 s = state.syntax[e.value]; 21589 if (!s || !isReserved(s)) { 21590 warning("W069", state.tokens.prev, e.value); 21591 } 21592 } 21593 } 21594 advance("]", that); 21595 21596 if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") { 21597 warning("W001"); 21598 } 21599 21600 that.left = left; 21601 that.right = e; 21602 return that; 21603 }, 160, true); 21604 21605 function comprehensiveArrayExpression() { 21606 var res = {}; 21607 res.exps = true; 21608 state.funct["(comparray)"].stack(); 21609 21610 // Handle reversed for expressions, used in spidermonkey 21611 var reversed = false; 21612 if (state.tokens.next.value !== "for") { 21613 reversed = true; 21614 if (!state.inMoz()) { 21615 warning("W116", state.tokens.next, "for", state.tokens.next.value); 21616 } 21617 state.funct["(comparray)"].setState("use"); 21618 res.right = expression(10); 21619 } 21620 21621 advance("for"); 21622 if (state.tokens.next.value === "each") { 21623 advance("each"); 21624 if (!state.inMoz()) { 21625 warning("W118", state.tokens.curr, "for each"); 21626 } 21627 } 21628 advance("("); 21629 state.funct["(comparray)"].setState("define"); 21630 res.left = expression(130); 21631 if (_.contains(["in", "of"], state.tokens.next.value)) { 21632 advance(); 21633 } else { 21634 error("E045", state.tokens.curr); 21635 } 21636 state.funct["(comparray)"].setState("generate"); 21637 expression(10); 21638 21639 advance(")"); 21640 if (state.tokens.next.value === "if") { 21641 advance("if"); 21642 advance("("); 21643 state.funct["(comparray)"].setState("filter"); 21644 res.filter = expression(10); 21645 advance(")"); 21646 } 21647 21648 if (!reversed) { 21649 state.funct["(comparray)"].setState("use"); 21650 res.right = expression(10); 21651 } 21652 21653 advance("]"); 21654 state.funct["(comparray)"].unstack(); 21655 return res; 21656 } 21657 21658 prefix("[", function() { 21659 var blocktype = lookupBlockType(); 21660 if (blocktype.isCompArray) { 21661 if (!state.option.esnext && !state.inMoz()) { 21662 warning("W118", state.tokens.curr, "array comprehension"); 21663 } 21664 return comprehensiveArrayExpression(); 21665 } else if (blocktype.isDestAssign) { 21666 this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true }); 21667 return this; 21668 } 21669 var b = state.tokens.curr.line !== startLine(state.tokens.next); 21670 this.first = []; 21671 if (b) { 21672 indent += state.option.indent; 21673 if (state.tokens.next.from === indent + state.option.indent) { 21674 indent += state.option.indent; 21675 } 21676 } 21677 while (state.tokens.next.id !== "(end)") { 21678 while (state.tokens.next.id === ",") { 21679 if (!state.option.elision) { 21680 if (!state.inES5()) { 21681 // Maintain compat with old options --- ES5 mode without 21682 // elision=true will warn once per comma 21683 warning("W070"); 21684 } else { 21685 warning("W128"); 21686 do { 21687 advance(","); 21688 } while (state.tokens.next.id === ","); 21689 continue; 21690 } 21691 } 21692 advance(","); 21693 } 21694 21695 if (state.tokens.next.id === "]") { 21696 break; 21697 } 21698 21699 this.first.push(expression(10)); 21700 if (state.tokens.next.id === ",") { 21701 parseComma({ allowTrailing: true }); 21702 if (state.tokens.next.id === "]" && !state.inES5()) { 21703 warning("W070", state.tokens.curr); 21704 break; 21705 } 21706 } else { 21707 if (state.option.trailingcomma && state.inES5()) { 21708 warningAt("W140", state.tokens.curr.line, state.tokens.curr.character); 21709 } 21710 break; 21711 } 21712 } 21713 if (b) { 21714 indent -= state.option.indent; 21715 } 21716 advance("]", this); 21717 return this; 21718 }); 21719 21720 21721 function isMethod() { 21722 return state.funct["(statement)"] && state.funct["(statement)"].type === "class" || 21723 state.funct["(context)"] && state.funct["(context)"]["(verb)"] === "class"; 21724 } 21725 21726 21727 function isPropertyName(token) { 21728 return token.identifier || token.id === "(string)" || token.id === "(number)"; 21729 } 21730 21731 21732 function propertyName(preserveOrToken) { 21733 var id; 21734 var preserve = true; 21735 if (typeof preserveOrToken === "object") { 21736 id = preserveOrToken; 21737 } else { 21738 preserve = preserveOrToken; 21739 id = optionalidentifier(false, true, preserve); 21740 } 21741 21742 if (!id) { 21743 if (state.tokens.next.id === "(string)") { 21744 id = state.tokens.next.value; 21745 if (!preserve) { 21746 advance(); 21747 } 21748 } else if (state.tokens.next.id === "(number)") { 21749 id = state.tokens.next.value.toString(); 21750 if (!preserve) { 21751 advance(); 21752 } 21753 } 21754 } else if (typeof id === "object") { 21755 if (id.id === "(string)" || id.id === "(identifier)") id = id.value; 21756 else if (id.id === "(number)") id = id.value.toString(); 21757 } 21758 21759 if (id === "hasOwnProperty") { 21760 warning("W001"); 21761 } 21762 21763 return id; 21764 } 21765 21766 /** 21767 * @param {Object} [options] 21768 * @param {token} [options.loneArg] The argument to the function in cases 21769 * where it was defined using the 21770 * single-argument shorthand. 21771 * @param {bool} [options.parsedOpening] Whether the opening parenthesis has 21772 * already been parsed. 21773 * @returns {{ arity: number, params: Array.<string>}} 21774 */ 21775 function functionparams(options) { 21776 var next; 21777 var paramsIds = []; 21778 var ident; 21779 var tokens = []; 21780 var t; 21781 var pastDefault = false; 21782 var pastRest = false; 21783 var arity = 0; 21784 var loneArg = options && options.loneArg; 21785 21786 if (loneArg && loneArg.identifier === true) { 21787 state.funct["(scope)"].addParam(loneArg.value, loneArg); 21788 return { arity: 1, params: [ loneArg.value ] }; 21789 } 21790 21791 next = state.tokens.next; 21792 21793 if (!options || !options.parsedOpening) { 21794 advance("("); 21795 } 21796 21797 if (state.tokens.next.id === ")") { 21798 advance(")"); 21799 return; 21800 } 21801 21802 function addParam(addParamArgs) { 21803 state.funct["(scope)"].addParam.apply(state.funct["(scope)"], addParamArgs); 21804 } 21805 21806 for (;;) { 21807 arity++; 21808 // are added to the param scope 21809 var currentParams = []; 21810 21811 if (_.contains(["{", "["], state.tokens.next.id)) { 21812 tokens = destructuringPattern(); 21813 for (t in tokens) { 21814 t = tokens[t]; 21815 if (t.id) { 21816 paramsIds.push(t.id); 21817 currentParams.push([t.id, t.token]); 21818 } 21819 } 21820 } else { 21821 if (checkPunctuator(state.tokens.next, "...")) pastRest = true; 21822 ident = identifier(true); 21823 if (ident) { 21824 paramsIds.push(ident); 21825 currentParams.push([ident, state.tokens.curr]); 21826 } else { 21827 // Skip invalid parameter. 21828 while (!checkPunctuators(state.tokens.next, [",", ")"])) advance(); 21829 } 21830 } 21831 21832 // It is valid to have a regular argument after a default argument 21833 // since undefined can be used for missing parameters. Still warn as it is 21834 // a possible code smell. 21835 if (pastDefault) { 21836 if (state.tokens.next.id !== "=") { 21837 error("W138", state.tokens.current); 21838 } 21839 } 21840 if (state.tokens.next.id === "=") { 21841 if (!state.inES6()) { 21842 warning("W119", state.tokens.next, "default parameters", "6"); 21843 } 21844 advance("="); 21845 pastDefault = true; 21846 expression(10); 21847 } 21848 21849 // now we have evaluated the default expression, add the variable to the param scope 21850 currentParams.forEach(addParam); 21851 21852 if (state.tokens.next.id === ",") { 21853 if (pastRest) { 21854 warning("W131", state.tokens.next); 21855 } 21856 parseComma(); 21857 } else { 21858 advance(")", next); 21859 return { arity: arity, params: paramsIds }; 21860 } 21861 } 21862 } 21863 21864 function functor(name, token, overwrites) { 21865 var funct = { 21866 "(name)" : name, 21867 "(breakage)" : 0, 21868 "(loopage)" : 0, 21869 "(tokens)" : {}, 21870 "(properties)": {}, 21871 21872 "(catch)" : false, 21873 "(global)" : false, 21874 21875 "(line)" : null, 21876 "(character)" : null, 21877 "(metrics)" : null, 21878 "(statement)" : null, 21879 "(context)" : null, 21880 "(scope)" : null, 21881 "(comparray)" : null, 21882 "(generator)" : null, 21883 "(arrow)" : null, 21884 "(params)" : null 21885 }; 21886 21887 if (token) { 21888 _.extend(funct, { 21889 "(line)" : token.line, 21890 "(character)": token.character, 21891 "(metrics)" : createMetrics(token) 21892 }); 21893 } 21894 21895 _.extend(funct, overwrites); 21896 21897 if (funct["(context)"]) { 21898 funct["(scope)"] = funct["(context)"]["(scope)"]; 21899 funct["(comparray)"] = funct["(context)"]["(comparray)"]; 21900 } 21901 21902 return funct; 21903 } 21904 21905 function isFunctor(token) { 21906 return "(scope)" in token; 21907 } 21908 21909 /** 21910 * Determine if the parser has begun parsing executable code. 21911 * 21912 * @param {Token} funct - The current "functor" token 21913 * 21914 * @returns {boolean} 21915 */ 21916 function hasParsedCode(funct) { 21917 return funct["(global)"] && !funct["(verb)"]; 21918 } 21919 21920 /** 21921 * This function is used as both a null-denotation method *and* a 21922 * left-denotation method, meaning the first parameter is overloaded. 21923 */ 21924 function doTemplateLiteral(leftOrRbp) { 21925 // ASSERT: this.type === "(template)" 21926 // jshint validthis: true 21927 var ctx = this.context; 21928 var noSubst = this.noSubst; 21929 var depth = this.depth; 21930 var left = typeof leftOrRbp === "number" ? null : leftOrRbp; 21931 21932 if (!noSubst) { 21933 while (!end()) { 21934 if (!state.tokens.next.template || state.tokens.next.depth > depth) { 21935 expression(0); // should probably have different rbp? 21936 } else { 21937 // skip template start / middle 21938 advance(); 21939 } 21940 } 21941 } 21942 21943 return { 21944 id: "(template)", 21945 type: "(template)", 21946 tag: left 21947 }; 21948 21949 function end() { 21950 if (state.tokens.curr.template && state.tokens.curr.tail && 21951 state.tokens.curr.context === ctx) return true; 21952 var complete = (state.tokens.next.template && state.tokens.next.tail && 21953 state.tokens.next.context === ctx); 21954 if (complete) advance(); 21955 return complete || state.tokens.next.isUnclosed; 21956 } 21957 } 21958 21959 /** 21960 * @param {Object} [options] 21961 * @param {token} [options.name] The identifier belonging to the function (if 21962 * any) 21963 * @param {boolean} [options.statement] The statement that triggered creation 21964 * of the current function. 21965 * @param {string} [options.type] If specified, either "generator" or "arrow" 21966 * @param {token} [options.loneArg] The argument to the function in cases 21967 * where it was defined using the 21968 * single-argument shorthand 21969 * @param {bool} [options.parsedOpening] Whether the opening parenthesis has 21970 * already been parsed 21971 * @param {token} [options.classExprBinding] Define a function with this 21972 * identifier in the new function's 21973 * scope, mimicking the bahavior of 21974 * class expression names within 21975 * the body of member functions. 21976 */ 21977 function doFunction(options) { 21978 var f, token, name, statement, classExprBinding, isGenerator, isArrow, ignoreLoopFunc; 21979 var oldOption = state.option; 21980 var oldIgnored = state.ignored; 21981 21982 if (options) { 21983 name = options.name; 21984 statement = options.statement; 21985 classExprBinding = options.classExprBinding; 21986 isGenerator = options.type === "generator"; 21987 isArrow = options.type === "arrow"; 21988 ignoreLoopFunc = options.ignoreLoopFunc; 21989 } 21990 21991 state.option = Object.create(state.option); 21992 state.ignored = Object.create(state.ignored); 21993 21994 state.funct = functor(name || state.nameStack.infer(), state.tokens.next, { 21995 "(statement)": statement, 21996 "(context)": state.funct, 21997 "(arrow)": isArrow, 21998 "(generator)": isGenerator 21999 }); 22000 22001 f = state.funct; 22002 token = state.tokens.curr; 22003 token.funct = state.funct; 22004 22005 functions.push(state.funct); 22006 22007 // So that the function is available to itself and referencing itself is not 22008 // seen as a closure, add the function name to a new scope, but do not 22009 // test for unused (unused: false) 22010 // it is a new block scope so that params can override it, it can be block scoped 22011 // but declarations inside the function don't cause already declared error 22012 state.funct["(scope)"].stack("functionouter"); 22013 var internallyAccessibleName = name || classExprBinding; 22014 if (internallyAccessibleName) { 22015 state.funct["(scope)"].block.add(internallyAccessibleName, 22016 classExprBinding ? "class" : "function", state.tokens.curr, false); 22017 } 22018 22019 // create the param scope (params added in functionparams) 22020 state.funct["(scope)"].stack("functionparams"); 22021 22022 var paramsInfo = functionparams(options); 22023 22024 if (paramsInfo) { 22025 state.funct["(params)"] = paramsInfo.params; 22026 state.funct["(metrics)"].arity = paramsInfo.arity; 22027 state.funct["(metrics)"].verifyMaxParametersPerFunction(); 22028 } else { 22029 state.funct["(metrics)"].arity = 0; 22030 } 22031 22032 if (isArrow) { 22033 if (!state.inES6(true)) { 22034 warning("W119", state.tokens.curr, "arrow function syntax (=>)", "6"); 22035 } 22036 22037 if (!options.loneArg) { 22038 advance("=>"); 22039 } 22040 } 22041 22042 block(false, true, true, isArrow); 22043 22044 if (!state.option.noyield && isGenerator && 22045 state.funct["(generator)"] !== "yielded") { 22046 warning("W124", state.tokens.curr); 22047 } 22048 22049 state.funct["(metrics)"].verifyMaxStatementsPerFunction(); 22050 state.funct["(metrics)"].verifyMaxComplexityPerFunction(); 22051 state.funct["(unusedOption)"] = state.option.unused; 22052 state.option = oldOption; 22053 state.ignored = oldIgnored; 22054 state.funct["(last)"] = state.tokens.curr.line; 22055 state.funct["(lastcharacter)"] = state.tokens.curr.character; 22056 22057 // unstack the params scope 22058 state.funct["(scope)"].unstack(); // also does usage and label checks 22059 22060 // unstack the function outer stack 22061 state.funct["(scope)"].unstack(); 22062 22063 state.funct = state.funct["(context)"]; 22064 22065 if (!ignoreLoopFunc && !state.option.loopfunc && state.funct["(loopage)"]) { 22066 // If the function we just parsed accesses any non-local variables 22067 // trigger a warning. Otherwise, the function is safe even within 22068 // a loop. 22069 if (f["(isCapturing)"]) { 22070 warning("W083", token); 22071 } 22072 } 22073 22074 return f; 22075 } 22076 22077 function createMetrics(functionStartToken) { 22078 return { 22079 statementCount: 0, 22080 nestedBlockDepth: -1, 22081 ComplexityCount: 1, 22082 arity: 0, 22083 22084 verifyMaxStatementsPerFunction: function() { 22085 if (state.option.maxstatements && 22086 this.statementCount > state.option.maxstatements) { 22087 warning("W071", functionStartToken, this.statementCount); 22088 } 22089 }, 22090 22091 verifyMaxParametersPerFunction: function() { 22092 if (_.isNumber(state.option.maxparams) && 22093 this.arity > state.option.maxparams) { 22094 warning("W072", functionStartToken, this.arity); 22095 } 22096 }, 22097 22098 verifyMaxNestedBlockDepthPerFunction: function() { 22099 if (state.option.maxdepth && 22100 this.nestedBlockDepth > 0 && 22101 this.nestedBlockDepth === state.option.maxdepth + 1) { 22102 warning("W073", null, this.nestedBlockDepth); 22103 } 22104 }, 22105 22106 verifyMaxComplexityPerFunction: function() { 22107 var max = state.option.maxcomplexity; 22108 var cc = this.ComplexityCount; 22109 if (max && cc > max) { 22110 warning("W074", functionStartToken, cc); 22111 } 22112 } 22113 }; 22114 } 22115 22116 function increaseComplexityCount() { 22117 state.funct["(metrics)"].ComplexityCount += 1; 22118 } 22119 22120 // Parse assignments that were found instead of conditionals. 22121 // For example: if (a = 1) { ... } 22122 22123 function checkCondAssignment(expr) { 22124 var id, paren; 22125 if (expr) { 22126 id = expr.id; 22127 paren = expr.paren; 22128 if (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) { 22129 id = expr.id; 22130 paren = paren || expr.paren; 22131 } 22132 } 22133 switch (id) { 22134 case "=": 22135 case "+=": 22136 case "-=": 22137 case "*=": 22138 case "%=": 22139 case "&=": 22140 case "|=": 22141 case "^=": 22142 case "/=": 22143 if (!paren && !state.option.boss) { 22144 warning("W084"); 22145 } 22146 } 22147 } 22148 22149 /** 22150 * @param {object} props Collection of property descriptors for a given 22151 * object. 22152 */ 22153 function checkProperties(props) { 22154 // Check for lonely setters if in the ES5 mode. 22155 if (state.inES5()) { 22156 for (var name in props) { 22157 if (props[name] && props[name].setterToken && !props[name].getterToken) { 22158 warning("W078", props[name].setterToken); 22159 } 22160 } 22161 } 22162 } 22163 22164 function metaProperty(name, c) { 22165 if (checkPunctuator(state.tokens.next, ".")) { 22166 var left = state.tokens.curr.id; 22167 advance("."); 22168 var id = identifier(); 22169 state.tokens.curr.isMetaProperty = true; 22170 if (name !== id) { 22171 error("E057", state.tokens.prev, left, id); 22172 } else { 22173 c(); 22174 } 22175 return state.tokens.curr; 22176 } 22177 } 22178 22179 (function(x) { 22180 x.nud = function() { 22181 var b, f, i, p, t, isGeneratorMethod = false, nextVal; 22182 var props = Object.create(null); // All properties, including accessors 22183 22184 b = state.tokens.curr.line !== startLine(state.tokens.next); 22185 if (b) { 22186 indent += state.option.indent; 22187 if (state.tokens.next.from === indent + state.option.indent) { 22188 indent += state.option.indent; 22189 } 22190 } 22191 22192 var blocktype = lookupBlockType(); 22193 if (blocktype.isDestAssign) { 22194 this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true }); 22195 return this; 22196 } 22197 22198 for (;;) { 22199 if (state.tokens.next.id === "}") { 22200 break; 22201 } 22202 22203 nextVal = state.tokens.next.value; 22204 if (state.tokens.next.identifier && 22205 (peekIgnoreEOL().id === "," || peekIgnoreEOL().id === "}")) { 22206 if (!state.inES6()) { 22207 warning("W104", state.tokens.next, "object short notation", "6"); 22208 } 22209 i = propertyName(true); 22210 saveProperty(props, i, state.tokens.next); 22211 22212 expression(10); 22213 22214 } else if (peek().id !== ":" && (nextVal === "get" || nextVal === "set")) { 22215 advance(nextVal); 22216 22217 if (!state.inES5()) { 22218 error("E034"); 22219 } 22220 22221 i = propertyName(); 22222 22223 // ES6 allows for get() {...} and set() {...} method 22224 // definition shorthand syntax, so we don't produce an error 22225 // if linting ECMAScript 6 code. 22226 if (!i && !state.inES6()) { 22227 error("E035"); 22228 } 22229 22230 // We don't want to save this getter unless it's an actual getter 22231 // and not an ES6 concise method 22232 if (i) { 22233 saveAccessor(nextVal, props, i, state.tokens.curr); 22234 } 22235 22236 t = state.tokens.next; 22237 f = doFunction(); 22238 p = f["(params)"]; 22239 22240 // Don't warn about getter/setter pairs if this is an ES6 concise method 22241 if (nextVal === "get" && i && p) { 22242 warning("W076", t, p[0], i); 22243 } else if (nextVal === "set" && i && f["(metrics)"].arity !== 1) { 22244 warning("W077", t, i); 22245 } 22246 } else { 22247 if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") { 22248 if (!state.inES6()) { 22249 warning("W104", state.tokens.next, "generator functions", "6"); 22250 } 22251 advance("*"); 22252 isGeneratorMethod = true; 22253 } else { 22254 isGeneratorMethod = false; 22255 } 22256 22257 if (state.tokens.next.id === "[") { 22258 i = computedPropertyName(); 22259 state.nameStack.set(i); 22260 } else { 22261 state.nameStack.set(state.tokens.next); 22262 i = propertyName(); 22263 saveProperty(props, i, state.tokens.next); 22264 22265 if (typeof i !== "string") { 22266 break; 22267 } 22268 } 22269 22270 if (state.tokens.next.value === "(") { 22271 if (!state.inES6()) { 22272 warning("W104", state.tokens.curr, "concise methods", "6"); 22273 } 22274 doFunction({ type: isGeneratorMethod ? "generator" : null }); 22275 } else { 22276 advance(":"); 22277 expression(10); 22278 } 22279 } 22280 22281 countMember(i); 22282 22283 if (state.tokens.next.id === ",") { 22284 parseComma({ allowTrailing: true, property: true }); 22285 if (state.tokens.next.id === ",") { 22286 warning("W070", state.tokens.curr); 22287 } else if (state.tokens.next.id === "}" && !state.inES5()) { 22288 warning("W070", state.tokens.curr); 22289 } 22290 } else { 22291 if (state.option.trailingcomma && state.inES5()) { 22292 warningAt("W140", state.tokens.curr.line, state.tokens.curr.character); 22293 } 22294 break; 22295 } 22296 } 22297 if (b) { 22298 indent -= state.option.indent; 22299 } 22300 advance("}", this); 22301 22302 checkProperties(props); 22303 22304 return this; 22305 }; 22306 x.fud = function() { 22307 error("E036", state.tokens.curr); 22308 }; 22309 }(delim("{"))); 22310 22311 function destructuringPattern(options) { 22312 var isAssignment = options && options.assignment; 22313 22314 if (!state.inES6()) { 22315 warning("W104", state.tokens.curr, 22316 isAssignment ? "destructuring assignment" : "destructuring binding", "6"); 22317 } 22318 22319 return destructuringPatternRecursive(options); 22320 } 22321 22322 function destructuringPatternRecursive(options) { 22323 var ids; 22324 var identifiers = []; 22325 var openingParsed = options && options.openingParsed; 22326 var isAssignment = options && options.assignment; 22327 var recursiveOptions = isAssignment ? { assignment: isAssignment } : null; 22328 var firstToken = openingParsed ? state.tokens.curr : state.tokens.next; 22329 22330 var nextInnerDE = function() { 22331 var ident; 22332 if (checkPunctuators(state.tokens.next, ["[", "{"])) { 22333 ids = destructuringPatternRecursive(recursiveOptions); 22334 for (var id in ids) { 22335 id = ids[id]; 22336 identifiers.push({ id: id.id, token: id.token }); 22337 } 22338 } else if (checkPunctuator(state.tokens.next, ",")) { 22339 identifiers.push({ id: null, token: state.tokens.curr }); 22340 } else if (checkPunctuator(state.tokens.next, "(")) { 22341 advance("("); 22342 nextInnerDE(); 22343 advance(")"); 22344 } else { 22345 var is_rest = checkPunctuator(state.tokens.next, "..."); 22346 22347 if (isAssignment) { 22348 var assignTarget = expression(20); 22349 if (assignTarget) { 22350 checkLeftSideAssign(assignTarget); 22351 22352 // if the target was a simple identifier, add it to the list to return 22353 if (assignTarget.identifier) { 22354 ident = assignTarget.value; 22355 } 22356 } 22357 } else { 22358 ident = identifier(); 22359 } 22360 if (ident) { 22361 identifiers.push({ id: ident, token: state.tokens.curr }); 22362 } 22363 return is_rest; 22364 } 22365 return false; 22366 }; 22367 var assignmentProperty = function() { 22368 var id; 22369 if (checkPunctuator(state.tokens.next, "[")) { 22370 advance("["); 22371 expression(10); 22372 advance("]"); 22373 advance(":"); 22374 nextInnerDE(); 22375 } else if (state.tokens.next.id === "(string)" || 22376 state.tokens.next.id === "(number)") { 22377 advance(); 22378 advance(":"); 22379 nextInnerDE(); 22380 } else { 22381 // this id will either be the property name or the property name and the assigning identifier 22382 id = identifier(); 22383 if (checkPunctuator(state.tokens.next, ":")) { 22384 advance(":"); 22385 nextInnerDE(); 22386 } else if (id) { 22387 // in this case we are assigning (not declaring), so check assignment 22388 if (isAssignment) { 22389 checkLeftSideAssign(state.tokens.curr); 22390 } 22391 identifiers.push({ id: id, token: state.tokens.curr }); 22392 } 22393 } 22394 }; 22395 22396 var id, value; 22397 if (checkPunctuator(firstToken, "[")) { 22398 if (!openingParsed) { 22399 advance("["); 22400 } 22401 if (checkPunctuator(state.tokens.next, "]")) { 22402 warning("W137", state.tokens.curr); 22403 } 22404 var element_after_rest = false; 22405 while (!checkPunctuator(state.tokens.next, "]")) { 22406 if (nextInnerDE() && !element_after_rest && 22407 checkPunctuator(state.tokens.next, ",")) { 22408 warning("W130", state.tokens.next); 22409 element_after_rest = true; 22410 } 22411 if (checkPunctuator(state.tokens.next, "=")) { 22412 if (checkPunctuator(state.tokens.prev, "...")) { 22413 advance("]"); 22414 } else { 22415 advance("="); 22416 } 22417 id = state.tokens.prev; 22418 value = expression(10); 22419 if (value && value.type === "undefined") { 22420 warning("W080", id, id.value); 22421 } 22422 } 22423 if (!checkPunctuator(state.tokens.next, "]")) { 22424 advance(","); 22425 } 22426 } 22427 advance("]"); 22428 } else if (checkPunctuator(firstToken, "{")) { 22429 22430 if (!openingParsed) { 22431 advance("{"); 22432 } 22433 if (checkPunctuator(state.tokens.next, "}")) { 22434 warning("W137", state.tokens.curr); 22435 } 22436 while (!checkPunctuator(state.tokens.next, "}")) { 22437 assignmentProperty(); 22438 if (checkPunctuator(state.tokens.next, "=")) { 22439 advance("="); 22440 id = state.tokens.prev; 22441 value = expression(10); 22442 if (value && value.type === "undefined") { 22443 warning("W080", id, id.value); 22444 } 22445 } 22446 if (!checkPunctuator(state.tokens.next, "}")) { 22447 advance(","); 22448 if (checkPunctuator(state.tokens.next, "}")) { 22449 // Trailing comma 22450 // ObjectBindingPattern: { BindingPropertyList , } 22451 break; 22452 } 22453 } 22454 } 22455 advance("}"); 22456 } 22457 return identifiers; 22458 } 22459 22460 function destructuringPatternMatch(tokens, value) { 22461 var first = value.first; 22462 22463 if (!first) 22464 return; 22465 22466 _.zip(tokens, Array.isArray(first) ? first : [ first ]).forEach(function(val) { 22467 var token = val[0]; 22468 var value = val[1]; 22469 22470 if (token && value) 22471 token.first = value; 22472 else if (token && token.first && !value) 22473 warning("W080", token.first, token.first.value); 22474 }); 22475 } 22476 22477 function blockVariableStatement(type, statement, context) { 22478 // used for both let and const statements 22479 22480 var prefix = context && context.prefix; 22481 var inexport = context && context.inexport; 22482 var isLet = type === "let"; 22483 var isConst = type === "const"; 22484 var tokens, lone, value, letblock; 22485 22486 if (!state.inES6()) { 22487 warning("W104", state.tokens.curr, type, "6"); 22488 } 22489 22490 if (isLet && state.tokens.next.value === "(") { 22491 if (!state.inMoz()) { 22492 warning("W118", state.tokens.next, "let block"); 22493 } 22494 advance("("); 22495 state.funct["(scope)"].stack(); 22496 letblock = true; 22497 } else if (state.funct["(noblockscopedvar)"]) { 22498 error("E048", state.tokens.curr, isConst ? "Const" : "Let"); 22499 } 22500 22501 statement.first = []; 22502 for (;;) { 22503 var names = []; 22504 if (_.contains(["{", "["], state.tokens.next.value)) { 22505 tokens = destructuringPattern(); 22506 lone = false; 22507 } else { 22508 tokens = [ { id: identifier(), token: state.tokens.curr } ]; 22509 lone = true; 22510 } 22511 22512 if (!prefix && isConst && state.tokens.next.id !== "=") { 22513 warning("E012", state.tokens.curr, state.tokens.curr.value); 22514 } 22515 22516 for (var t in tokens) { 22517 if (tokens.hasOwnProperty(t)) { 22518 t = tokens[t]; 22519 if (state.funct["(scope)"].block.isGlobal()) { 22520 if (predefined[t.id] === false) { 22521 warning("W079", t.token, t.id); 22522 } 22523 } 22524 if (t.id && !state.funct["(noblockscopedvar)"]) { 22525 state.funct["(scope)"].addlabel(t.id, { 22526 type: type, 22527 token: t.token }); 22528 names.push(t.token); 22529 } 22530 } 22531 } 22532 22533 if (state.tokens.next.id === "=") { 22534 advance("="); 22535 if (!prefix && peek(0).id === "=" && state.tokens.next.identifier) { 22536 warning("W120", state.tokens.next, state.tokens.next.value); 22537 } 22538 var id = state.tokens.prev; 22539 // don't accept `in` in expression if prefix is used for ForIn/Of loop. 22540 value = expression(prefix ? 120 : 10); 22541 if (!prefix && value && value.type === "undefined") { 22542 warning("W080", id, id.value); 22543 } 22544 if (lone) { 22545 tokens[0].first = value; 22546 } else { 22547 destructuringPatternMatch(names, value); 22548 } 22549 } 22550 22551 if (!prefix) { 22552 for (t in tokens) { 22553 if (tokens.hasOwnProperty(t)) { 22554 t = tokens[t]; 22555 state.funct["(scope)"].initialize(t.id); 22556 22557 if (lone && inexport) { 22558 state.funct["(scope)"].setExported(t.token.value, t.token); 22559 } 22560 } 22561 } 22562 } 22563 22564 statement.first = statement.first.concat(names); 22565 22566 if (state.tokens.next.id !== ",") { 22567 break; 22568 } 22569 parseComma(); 22570 } 22571 if (letblock) { 22572 advance(")"); 22573 block(true, true); 22574 statement.block = true; 22575 state.funct["(scope)"].unstack(); 22576 } 22577 22578 return statement; 22579 } 22580 22581 var conststatement = stmt("const", function(context) { 22582 return blockVariableStatement("const", this, context); 22583 }); 22584 conststatement.exps = true; 22585 22586 var letstatement = stmt("let", function(context) { 22587 return blockVariableStatement("let", this, context); 22588 }); 22589 letstatement.exps = true; 22590 22591 var varstatement = stmt("var", function(context) { 22592 var prefix = context && context.prefix; 22593 var inexport = context && context.inexport; 22594 var tokens, lone, value; 22595 22596 this.first = []; 22597 for (;;) { 22598 var names = []; 22599 if (_.contains(["{", "["], state.tokens.next.value)) { 22600 tokens = destructuringPattern(); 22601 lone = false; 22602 } else { 22603 tokens = [ { id: identifier(), token: state.tokens.curr } ]; 22604 lone = true; 22605 } 22606 22607 if (state.option.varstmt) { 22608 warning("W132", this); 22609 } 22610 22611 this.first = this.first.concat(names); 22612 22613 for (var t in tokens) { 22614 if (tokens.hasOwnProperty(t)) { 22615 t = tokens[t]; 22616 if (state.funct["(global)"] && !state.impliedClosure()) { 22617 if (predefined[t.id] === false) { 22618 warning("W079", t.token, t.id); 22619 } else if (state.option.futurehostile === false) { 22620 if ((!state.inES5() && vars.ecmaIdentifiers[5][t.id] === false) || 22621 (!state.inES6() && vars.ecmaIdentifiers[6][t.id] === false)) { 22622 warning("W129", t.token, t.id); 22623 } 22624 } 22625 } 22626 if (t.id) { 22627 state.funct["(scope)"].addlabel(t.id, { 22628 type: "var", 22629 token: t.token }); 22630 22631 if (lone && inexport) { 22632 state.funct["(scope)"].setExported(t.id, t.token); 22633 } 22634 names.push(t.token); 22635 } 22636 } 22637 } 22638 22639 if (state.tokens.next.id === "=") { 22640 state.nameStack.set(state.tokens.curr); 22641 22642 advance("="); 22643 if (peek(0).id === "=" && state.tokens.next.identifier) { 22644 if (!prefix && 22645 !state.funct["(params)"] || 22646 state.funct["(params)"].indexOf(state.tokens.next.value) === -1) { 22647 warning("W120", state.tokens.next, state.tokens.next.value); 22648 } 22649 } 22650 var id = state.tokens.prev; 22651 // don't accept `in` in expression if prefix is used for ForIn/Of loop. 22652 value = expression(prefix ? 120 : 10); 22653 if (value && !prefix && !state.funct["(loopage)"] && value.type === "undefined") { 22654 warning("W080", id, id.value); 22655 } 22656 if (lone) { 22657 tokens[0].first = value; 22658 } else { 22659 destructuringPatternMatch(names, value); 22660 } 22661 } 22662 22663 if (state.tokens.next.id !== ",") { 22664 break; 22665 } 22666 parseComma(); 22667 } 22668 22669 return this; 22670 }); 22671 varstatement.exps = true; 22672 22673 blockstmt("class", function(rbp) { 22674 return classdef.call(this, rbp, true); 22675 }); 22676 22677 function classdef(rbp, isStatement) { 22678 22679 /*jshint validthis:true */ 22680 if (!state.inES6()) { 22681 warning("W104", state.tokens.curr, "class", "6"); 22682 } 22683 if (isStatement) { 22684 // BindingIdentifier 22685 this.name = identifier(); 22686 22687 state.funct["(scope)"].addlabel(this.name, { 22688 type: "class", 22689 token: state.tokens.curr }); 22690 22691 } else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") { 22692 // BindingIdentifier(opt) 22693 this.name = identifier(); 22694 this.namedExpr = true; 22695 } else { 22696 this.name = state.nameStack.infer(); 22697 } 22698 22699 classtail(this); 22700 22701 if (isStatement) { 22702 state.funct["(scope)"].initialize(this.name); 22703 } 22704 22705 return this; 22706 } 22707 22708 function classtail(c) { 22709 var wasInClassBody = state.inClassBody; 22710 // ClassHeritage(opt) 22711 if (state.tokens.next.value === "extends") { 22712 advance("extends"); 22713 c.heritage = expression(10); 22714 } 22715 22716 state.inClassBody = true; 22717 advance("{"); 22718 // ClassBody(opt) 22719 c.body = classbody(c); 22720 advance("}"); 22721 state.inClassBody = wasInClassBody; 22722 } 22723 22724 function classbody(c) { 22725 var name; 22726 var isStatic; 22727 var isGenerator; 22728 var getset; 22729 var props = Object.create(null); 22730 var staticProps = Object.create(null); 22731 var computed; 22732 for (var i = 0; state.tokens.next.id !== "}"; ++i) { 22733 name = state.tokens.next; 22734 isStatic = false; 22735 isGenerator = false; 22736 getset = null; 22737 22738 // The ES6 grammar for ClassElement includes the `;` token, but it is 22739 // defined only as a placeholder to facilitate future language 22740 // extensions. In ES6 code, it serves no purpose. 22741 if (name.id === ";") { 22742 warning("W032"); 22743 advance(";"); 22744 continue; 22745 } 22746 22747 if (name.id === "*") { 22748 isGenerator = true; 22749 advance("*"); 22750 name = state.tokens.next; 22751 } 22752 if (name.id === "[") { 22753 name = computedPropertyName(); 22754 computed = true; 22755 } else if (isPropertyName(name)) { 22756 // Non-Computed PropertyName 22757 advance(); 22758 computed = false; 22759 if (name.identifier && name.value === "static") { 22760 if (checkPunctuator(state.tokens.next, "*")) { 22761 isGenerator = true; 22762 advance("*"); 22763 } 22764 if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") { 22765 computed = state.tokens.next.id === "["; 22766 isStatic = true; 22767 name = state.tokens.next; 22768 if (state.tokens.next.id === "[") { 22769 name = computedPropertyName(); 22770 } else advance(); 22771 } 22772 } 22773 22774 if (name.identifier && (name.value === "get" || name.value === "set")) { 22775 if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") { 22776 computed = state.tokens.next.id === "["; 22777 getset = name; 22778 name = state.tokens.next; 22779 if (state.tokens.next.id === "[") { 22780 name = computedPropertyName(); 22781 } else advance(); 22782 } 22783 } 22784 } else { 22785 warning("W052", state.tokens.next, state.tokens.next.value || state.tokens.next.type); 22786 advance(); 22787 continue; 22788 } 22789 22790 if (!checkPunctuator(state.tokens.next, "(")) { 22791 // error --- class properties must be methods 22792 error("E054", state.tokens.next, state.tokens.next.value); 22793 while (state.tokens.next.id !== "}" && 22794 !checkPunctuator(state.tokens.next, "(")) { 22795 advance(); 22796 } 22797 if (state.tokens.next.value !== "(") { 22798 doFunction({ statement: c }); 22799 } 22800 } 22801 22802 if (!computed) { 22803 // We don't know how to determine if we have duplicate computed property names :( 22804 if (getset) { 22805 saveAccessor( 22806 getset.value, isStatic ? staticProps : props, name.value, name, true, isStatic); 22807 } else { 22808 if (name.value === "constructor") { 22809 state.nameStack.set(c); 22810 } else { 22811 state.nameStack.set(name); 22812 } 22813 saveProperty(isStatic ? staticProps : props, name.value, name, true, isStatic); 22814 } 22815 } 22816 22817 if (getset && name.value === "constructor") { 22818 var propDesc = getset.value === "get" ? "class getter method" : "class setter method"; 22819 error("E049", name, propDesc, "constructor"); 22820 } else if (name.value === "prototype") { 22821 error("E049", name, "class method", "prototype"); 22822 } 22823 22824 propertyName(name); 22825 22826 doFunction({ 22827 statement: c, 22828 type: isGenerator ? "generator" : null, 22829 classExprBinding: c.namedExpr ? c.name : null 22830 }); 22831 } 22832 22833 checkProperties(props); 22834 } 22835 22836 blockstmt("function", function(context) { 22837 var inexport = context && context.inexport; 22838 var generator = false; 22839 if (state.tokens.next.value === "*") { 22840 advance("*"); 22841 if (state.inES6(true)) { 22842 generator = true; 22843 } else { 22844 warning("W119", state.tokens.curr, "function*", "6"); 22845 } 22846 } 22847 if (inblock) { 22848 warning("W082", state.tokens.curr); 22849 } 22850 var i = optionalidentifier(); 22851 22852 state.funct["(scope)"].addlabel(i, { 22853 type: "function", 22854 token: state.tokens.curr }); 22855 22856 if (i === undefined) { 22857 warning("W025"); 22858 } else if (inexport) { 22859 state.funct["(scope)"].setExported(i, state.tokens.prev); 22860 } 22861 22862 doFunction({ 22863 name: i, 22864 statement: this, 22865 type: generator ? "generator" : null, 22866 ignoreLoopFunc: inblock // a declaration may already have warned 22867 }); 22868 if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) { 22869 error("E039"); 22870 } 22871 return this; 22872 }); 22873 22874 prefix("function", function() { 22875 var generator = false; 22876 22877 if (state.tokens.next.value === "*") { 22878 if (!state.inES6()) { 22879 warning("W119", state.tokens.curr, "function*", "6"); 22880 } 22881 advance("*"); 22882 generator = true; 22883 } 22884 22885 var i = optionalidentifier(); 22886 doFunction({ name: i, type: generator ? "generator" : null }); 22887 return this; 22888 }); 22889 22890 blockstmt("if", function() { 22891 var t = state.tokens.next; 22892 increaseComplexityCount(); 22893 state.condition = true; 22894 advance("("); 22895 var expr = expression(0); 22896 22897 if (!expr) { 22898 quit("E041", this); 22899 } 22900 22901 checkCondAssignment(expr); 22902 22903 // When the if is within a for-in loop, check if the condition 22904 // starts with a negation operator 22905 var forinifcheck = null; 22906 if (state.option.forin && state.forinifcheckneeded) { 22907 state.forinifcheckneeded = false; // We only need to analyze the first if inside the loop 22908 forinifcheck = state.forinifchecks[state.forinifchecks.length - 1]; 22909 if (expr.type === "(punctuator)" && expr.value === "!") { 22910 forinifcheck.type = "(negative)"; 22911 } else { 22912 forinifcheck.type = "(positive)"; 22913 } 22914 } 22915 22916 advance(")", t); 22917 state.condition = false; 22918 var s = block(true, true); 22919 22920 // When the if is within a for-in loop and the condition has a negative form, 22921 // check if the body contains nothing but a continue statement 22922 if (forinifcheck && forinifcheck.type === "(negative)") { 22923 if (s && s[0] && s[0].type === "(identifier)" && s[0].value === "continue") { 22924 forinifcheck.type = "(negative-with-continue)"; 22925 } 22926 } 22927 22928 if (state.tokens.next.id === "else") { 22929 advance("else"); 22930 if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") { 22931 statement(); 22932 } else { 22933 block(true, true); 22934 } 22935 } 22936 return this; 22937 }); 22938 22939 blockstmt("try", function() { 22940 var b; 22941 22942 function doCatch() { 22943 advance("catch"); 22944 advance("("); 22945 22946 state.funct["(scope)"].stack("catchparams"); 22947 22948 if (checkPunctuators(state.tokens.next, ["[", "{"])) { 22949 var tokens = destructuringPattern(); 22950 _.each(tokens, function(token) { 22951 if (token.id) { 22952 state.funct["(scope)"].addParam(token.id, token, "exception"); 22953 } 22954 }); 22955 } else if (state.tokens.next.type !== "(identifier)") { 22956 warning("E030", state.tokens.next, state.tokens.next.value); 22957 } else { 22958 // only advance if we have an identifier so we can continue parsing in the most common error - that no param is given. 22959 state.funct["(scope)"].addParam(identifier(), state.tokens.curr, "exception"); 22960 } 22961 22962 if (state.tokens.next.value === "if") { 22963 if (!state.inMoz()) { 22964 warning("W118", state.tokens.curr, "catch filter"); 22965 } 22966 advance("if"); 22967 expression(0); 22968 } 22969 22970 advance(")"); 22971 22972 block(false); 22973 22974 state.funct["(scope)"].unstack(); 22975 } 22976 22977 block(true); 22978 22979 while (state.tokens.next.id === "catch") { 22980 increaseComplexityCount(); 22981 if (b && (!state.inMoz())) { 22982 warning("W118", state.tokens.next, "multiple catch blocks"); 22983 } 22984 doCatch(); 22985 b = true; 22986 } 22987 22988 if (state.tokens.next.id === "finally") { 22989 advance("finally"); 22990 block(true); 22991 return; 22992 } 22993 22994 if (!b) { 22995 error("E021", state.tokens.next, "catch", state.tokens.next.value); 22996 } 22997 22998 return this; 22999 }); 23000 23001 blockstmt("while", function() { 23002 var t = state.tokens.next; 23003 state.funct["(breakage)"] += 1; 23004 state.funct["(loopage)"] += 1; 23005 increaseComplexityCount(); 23006 advance("("); 23007 checkCondAssignment(expression(0)); 23008 advance(")", t); 23009 block(true, true); 23010 state.funct["(breakage)"] -= 1; 23011 state.funct["(loopage)"] -= 1; 23012 return this; 23013 }).labelled = true; 23014 23015 blockstmt("with", function() { 23016 var t = state.tokens.next; 23017 if (state.isStrict()) { 23018 error("E010", state.tokens.curr); 23019 } else if (!state.option.withstmt) { 23020 warning("W085", state.tokens.curr); 23021 } 23022 23023 advance("("); 23024 expression(0); 23025 advance(")", t); 23026 block(true, true); 23027 23028 return this; 23029 }); 23030 23031 blockstmt("switch", function() { 23032 var t = state.tokens.next; 23033 var g = false; 23034 var noindent = false; 23035 23036 state.funct["(breakage)"] += 1; 23037 advance("("); 23038 checkCondAssignment(expression(0)); 23039 advance(")", t); 23040 t = state.tokens.next; 23041 advance("{"); 23042 23043 if (state.tokens.next.from === indent) 23044 noindent = true; 23045 23046 if (!noindent) 23047 indent += state.option.indent; 23048 23049 this.cases = []; 23050 23051 for (;;) { 23052 switch (state.tokens.next.id) { 23053 case "case": 23054 switch (state.funct["(verb)"]) { 23055 case "yield": 23056 case "break": 23057 case "case": 23058 case "continue": 23059 case "return": 23060 case "switch": 23061 case "throw": 23062 break; 23063 default: 23064 // You can tell JSHint that you don't use break intentionally by 23065 // adding a comment /* falls through */ on a line just before 23066 // the next `case`. 23067 if (!state.tokens.curr.caseFallsThrough) { 23068 warning("W086", state.tokens.curr, "case"); 23069 } 23070 } 23071 23072 advance("case"); 23073 this.cases.push(expression(0)); 23074 increaseComplexityCount(); 23075 g = true; 23076 advance(":"); 23077 state.funct["(verb)"] = "case"; 23078 break; 23079 case "default": 23080 switch (state.funct["(verb)"]) { 23081 case "yield": 23082 case "break": 23083 case "continue": 23084 case "return": 23085 case "throw": 23086 break; 23087 default: 23088 // Do not display a warning if 'default' is the first statement or if 23089 // there is a special /* falls through */ comment. 23090 if (this.cases.length) { 23091 if (!state.tokens.curr.caseFallsThrough) { 23092 warning("W086", state.tokens.curr, "default"); 23093 } 23094 } 23095 } 23096 23097 advance("default"); 23098 g = true; 23099 advance(":"); 23100 break; 23101 case "}": 23102 if (!noindent) 23103 indent -= state.option.indent; 23104 23105 advance("}", t); 23106 state.funct["(breakage)"] -= 1; 23107 state.funct["(verb)"] = undefined; 23108 return; 23109 case "(end)": 23110 error("E023", state.tokens.next, "}"); 23111 return; 23112 default: 23113 indent += state.option.indent; 23114 if (g) { 23115 switch (state.tokens.curr.id) { 23116 case ",": 23117 error("E040"); 23118 return; 23119 case ":": 23120 g = false; 23121 statements(); 23122 break; 23123 default: 23124 error("E025", state.tokens.curr); 23125 return; 23126 } 23127 } else { 23128 if (state.tokens.curr.id === ":") { 23129 advance(":"); 23130 error("E024", state.tokens.curr, ":"); 23131 statements(); 23132 } else { 23133 error("E021", state.tokens.next, "case", state.tokens.next.value); 23134 return; 23135 } 23136 } 23137 indent -= state.option.indent; 23138 } 23139 } 23140 return this; 23141 }).labelled = true; 23142 23143 stmt("debugger", function() { 23144 if (!state.option.debug) { 23145 warning("W087", this); 23146 } 23147 return this; 23148 }).exps = true; 23149 23150 (function() { 23151 var x = stmt("do", function() { 23152 state.funct["(breakage)"] += 1; 23153 state.funct["(loopage)"] += 1; 23154 increaseComplexityCount(); 23155 23156 this.first = block(true, true); 23157 advance("while"); 23158 var t = state.tokens.next; 23159 advance("("); 23160 checkCondAssignment(expression(0)); 23161 advance(")", t); 23162 state.funct["(breakage)"] -= 1; 23163 state.funct["(loopage)"] -= 1; 23164 return this; 23165 }); 23166 x.labelled = true; 23167 x.exps = true; 23168 }()); 23169 23170 blockstmt("for", function() { 23171 var s, t = state.tokens.next; 23172 var letscope = false; 23173 var foreachtok = null; 23174 23175 if (t.value === "each") { 23176 foreachtok = t; 23177 advance("each"); 23178 if (!state.inMoz()) { 23179 warning("W118", state.tokens.curr, "for each"); 23180 } 23181 } 23182 23183 increaseComplexityCount(); 23184 advance("("); 23185 23186 // what kind of for(…) statement it is? for(…of…)? for(…in…)? for(…;…;…)? 23187 var nextop; // contains the token of the "in" or "of" operator 23188 var i = 0; 23189 var inof = ["in", "of"]; 23190 var level = 0; // BindingPattern "level" --- level 0 === no BindingPattern 23191 var comma; // First comma punctuator at level 0 23192 var initializer; // First initializer at level 0 23193 var bindingPower; 23194 var targets; 23195 var target; 23196 23197 // If initial token is a BindingPattern, count it as such. 23198 if (checkPunctuators(state.tokens.next, ["{", "["])) ++level; 23199 do { 23200 nextop = peek(i); 23201 ++i; 23202 if (checkPunctuators(nextop, ["{", "["])) ++level; 23203 else if (checkPunctuators(nextop, ["}", "]"])) --level; 23204 if (level < 0) break; 23205 if (level === 0) { 23206 if (!comma && checkPunctuator(nextop, ",")) comma = nextop; 23207 else if (!initializer && checkPunctuator(nextop, "=")) initializer = nextop; 23208 } 23209 } while (level > 0 || !_.contains(inof, nextop.value) && nextop.value !== ";" && 23210 nextop.type !== "(end)"); // Is this a JSCS bug? This looks really weird. 23211 23212 // if we're in a for (… in|of …) statement 23213 if (_.contains(inof, nextop.value)) { 23214 if (nextop.value === "of") { 23215 bindingPower = 20; 23216 if (!state.inES6()) { 23217 warning("W104", nextop, "for of", "6"); 23218 } 23219 } else { 23220 bindingPower = 0; 23221 } 23222 23223 if (initializer) { 23224 error("W133", comma, nextop.value, "initializer is forbidden"); 23225 } 23226 23227 if (comma) { 23228 error("W133", comma, nextop.value, "more than one ForBinding"); 23229 } 23230 23231 if (state.tokens.next.id === "var") { 23232 advance("var"); 23233 state.tokens.curr.fud({ prefix: true }); 23234 } else if (state.tokens.next.id === "let" || state.tokens.next.id === "const") { 23235 advance(state.tokens.next.id); 23236 // create a new block scope 23237 letscope = true; 23238 state.funct["(scope)"].stack(); 23239 state.tokens.curr.fud({ prefix: true }); 23240 } else { 23241 targets = []; 23242 23243 // The following parsing logic recognizes initializers and the comma 23244 // operator despite the fact that they are not supported by the 23245 // grammar. Doing so allows JSHint to emit more a meaningful error 23246 // message (i.e. W133) in response to a common programming mistake. 23247 do { 23248 if (checkPunctuators(state.tokens.next, ["{", "["])) { 23249 destructuringPattern({ assignment: true }).forEach(function(elem) { 23250 this.push(elem.token); 23251 }, targets); 23252 } else { 23253 target = expression(120); 23254 23255 if (target.type === "(identifier)") { 23256 targets.push(target); 23257 } 23258 23259 checkLeftSideAssign(target, nextop); 23260 } 23261 23262 if (checkPunctuator(state.tokens.next, "=")) { 23263 advance("="); 23264 expression(120); 23265 } 23266 23267 if (checkPunctuator(state.tokens.next, ",")) { 23268 advance(","); 23269 } 23270 } while (state.tokens.next !== nextop); 23271 23272 // In the event of a syntax error, do no issue warnings regarding the 23273 // implicit creation of bindings. 23274 if (!initializer && !comma) { 23275 targets.forEach(function(token) { 23276 if (!state.funct["(scope)"].has(token.value)) { 23277 warning("W088", token, token.value); 23278 } 23279 }); 23280 } 23281 } 23282 23283 advance(nextop.value); 23284 // The binding power is variable because for-in statements accept any 23285 // Expression in this position, while for-of statements are limited to 23286 // AssignmentExpressions. For example: 23287 // 23288 // for ( LeftHandSideExpression in Expression ) Statement 23289 // for ( LeftHandSideExpression of AssignmentExpression ) Statement 23290 expression(bindingPower); 23291 advance(")", t); 23292 23293 if (nextop.value === "in" && state.option.forin) { 23294 state.forinifcheckneeded = true; 23295 23296 if (state.forinifchecks === undefined) { 23297 state.forinifchecks = []; 23298 } 23299 23300 // Push a new for-in-if check onto the stack. The type will be modified 23301 // when the loop's body is parsed and a suitable if statement exists. 23302 state.forinifchecks.push({ 23303 type: "(none)" 23304 }); 23305 } 23306 23307 state.funct["(breakage)"] += 1; 23308 state.funct["(loopage)"] += 1; 23309 23310 s = block(true, true); 23311 23312 if (nextop.value === "in" && state.option.forin) { 23313 if (state.forinifchecks && state.forinifchecks.length > 0) { 23314 var check = state.forinifchecks.pop(); 23315 23316 if (// No if statement or not the first statement in loop body 23317 s && s.length > 0 && (typeof s[0] !== "object" || s[0].value !== "if") || 23318 // Positive if statement is not the only one in loop body 23319 check.type === "(positive)" && s.length > 1 || 23320 // Negative if statement but no continue 23321 check.type === "(negative)") { 23322 warning("W089", this); 23323 } 23324 } 23325 23326 // Reset the flag in case no if statement was contained in the loop body 23327 state.forinifcheckneeded = false; 23328 } 23329 23330 state.funct["(breakage)"] -= 1; 23331 state.funct["(loopage)"] -= 1; 23332 } else { 23333 if (foreachtok) { 23334 error("E045", foreachtok); 23335 } 23336 if (state.tokens.next.id !== ";") { 23337 if (state.tokens.next.id === "var") { 23338 advance("var"); 23339 state.tokens.curr.fud(); 23340 } else if (state.tokens.next.id === "let") { 23341 advance("let"); 23342 // create a new block scope 23343 letscope = true; 23344 state.funct["(scope)"].stack(); 23345 state.tokens.curr.fud(); 23346 } else { 23347 for (;;) { 23348 expression(0, "for"); 23349 if (state.tokens.next.id !== ",") { 23350 break; 23351 } 23352 parseComma(); 23353 } 23354 } 23355 } 23356 nolinebreak(state.tokens.curr); 23357 advance(";"); 23358 23359 // start loopage after the first ; as the next two expressions are executed 23360 // on every loop 23361 state.funct["(loopage)"] += 1; 23362 if (state.tokens.next.id !== ";") { 23363 checkCondAssignment(expression(0)); 23364 } 23365 nolinebreak(state.tokens.curr); 23366 advance(";"); 23367 if (state.tokens.next.id === ";") { 23368 error("E021", state.tokens.next, ")", ";"); 23369 } 23370 if (state.tokens.next.id !== ")") { 23371 for (;;) { 23372 expression(0, "for"); 23373 if (state.tokens.next.id !== ",") { 23374 break; 23375 } 23376 parseComma(); 23377 } 23378 } 23379 advance(")", t); 23380 state.funct["(breakage)"] += 1; 23381 block(true, true); 23382 state.funct["(breakage)"] -= 1; 23383 state.funct["(loopage)"] -= 1; 23384 23385 } 23386 // unstack loop blockscope 23387 if (letscope) { 23388 state.funct["(scope)"].unstack(); 23389 } 23390 return this; 23391 }).labelled = true; 23392 23393 23394 stmt("break", function() { 23395 var v = state.tokens.next.value; 23396 23397 if (!state.option.asi) 23398 nolinebreak(this); 23399 23400 if (state.tokens.next.id !== ";" && !state.tokens.next.reach && 23401 state.tokens.curr.line === startLine(state.tokens.next)) { 23402 if (!state.funct["(scope)"].funct.hasBreakLabel(v)) { 23403 warning("W090", state.tokens.next, v); 23404 } 23405 this.first = state.tokens.next; 23406 advance(); 23407 } else { 23408 if (state.funct["(breakage)"] === 0) 23409 warning("W052", state.tokens.next, this.value); 23410 } 23411 23412 reachable(this); 23413 23414 return this; 23415 }).exps = true; 23416 23417 23418 stmt("continue", function() { 23419 var v = state.tokens.next.value; 23420 23421 if (state.funct["(breakage)"] === 0 || !state.funct["(loopage)"]) { 23422 warning("W052", state.tokens.next, this.value); 23423 } 23424 23425 if (!state.option.asi) 23426 nolinebreak(this); 23427 23428 if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { 23429 if (state.tokens.curr.line === startLine(state.tokens.next)) { 23430 if (!state.funct["(scope)"].funct.hasBreakLabel(v)) { 23431 warning("W090", state.tokens.next, v); 23432 } 23433 this.first = state.tokens.next; 23434 advance(); 23435 } 23436 } 23437 23438 reachable(this); 23439 23440 return this; 23441 }).exps = true; 23442 23443 23444 stmt("return", function() { 23445 if (this.line === startLine(state.tokens.next)) { 23446 if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { 23447 this.first = expression(0); 23448 23449 if (this.first && 23450 this.first.type === "(punctuator)" && this.first.value === "=" && 23451 !this.first.paren && !state.option.boss) { 23452 warningAt("W093", this.first.line, this.first.character); 23453 } 23454 } 23455 } else { 23456 if (state.tokens.next.type === "(punctuator)" && 23457 ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) { 23458 nolinebreak(this); // always warn (Line breaking error) 23459 } 23460 } 23461 23462 reachable(this); 23463 23464 return this; 23465 }).exps = true; 23466 23467 (function(x) { 23468 x.exps = true; 23469 x.lbp = 25; 23470 x.ltBoundary = "after"; 23471 }(prefix("yield", function() { 23472 if (state.inMoz()) { 23473 return mozYield.call(this); 23474 } 23475 var prev = state.tokens.prev; 23476 23477 if (!this.beginsStmt && prev.lbp > 30 && !checkPunctuators(prev, ["("])) { 23478 error("E061", this); 23479 } 23480 23481 if (state.inES6(true) && !state.funct["(generator)"]) { 23482 // If it's a yield within a catch clause inside a generator then that's ok 23483 if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) { 23484 error("E046", state.tokens.curr, "yield"); 23485 } 23486 } else if (!state.inES6()) { 23487 warning("W104", state.tokens.curr, "yield", "6"); 23488 } 23489 state.funct["(generator)"] = "yielded"; 23490 var delegatingYield = false; 23491 23492 if (state.tokens.next.value === "*") { 23493 delegatingYield = true; 23494 advance("*"); 23495 } 23496 23497 // Parse operand 23498 if (!isEndOfExpr() && state.tokens.next.id !== ",") { 23499 if (state.tokens.next.nud) { 23500 23501 nobreaknonadjacent(state.tokens.curr, state.tokens.next); 23502 this.first = expression(10); 23503 23504 if (this.first.type === "(punctuator)" && this.first.value === "=" && 23505 !this.first.paren && !state.option.boss) { 23506 warningAt("W093", this.first.line, this.first.character); 23507 } 23508 } else if (state.tokens.next.led) { 23509 if (state.tokens.next.id !== ",") { 23510 error("W017", state.tokens.next); 23511 } 23512 } 23513 } 23514 23515 return this; 23516 }))); 23517 23518 /** 23519 * Parsing logic for non-standard Mozilla implementation of `yield` 23520 * expressions. 23521 */ 23522 var mozYield = function() { 23523 var prev = state.tokens.prev; 23524 if (state.inES6(true) && !state.funct["(generator)"]) { 23525 // If it's a yield within a catch clause inside a generator then that's ok 23526 if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) { 23527 error("E046", state.tokens.curr, "yield"); 23528 } 23529 } 23530 state.funct["(generator)"] = "yielded"; 23531 var delegatingYield = false; 23532 23533 if (state.tokens.next.value === "*") { 23534 delegatingYield = true; 23535 advance("*"); 23536 } 23537 23538 if (this.line === startLine(state.tokens.next)) { 23539 if (delegatingYield || 23540 (state.tokens.next.id !== ";" && !state.option.asi && 23541 !state.tokens.next.reach && state.tokens.next.nud)) { 23542 23543 nobreaknonadjacent(state.tokens.curr, state.tokens.next); 23544 this.first = expression(10); 23545 23546 if (this.first.type === "(punctuator)" && this.first.value === "=" && 23547 !this.first.paren && !state.option.boss) { 23548 warningAt("W093", this.first.line, this.first.character); 23549 } 23550 } 23551 23552 if (state.tokens.next.id !== ")" && 23553 (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) { 23554 error("E050", this); 23555 } 23556 } else if (!state.option.asi) { 23557 nolinebreak(this); // always warn (Line breaking error) 23558 } 23559 return this; 23560 }; 23561 23562 stmt("throw", function() { 23563 nolinebreak(this); 23564 this.first = expression(20); 23565 23566 reachable(this); 23567 23568 return this; 23569 }).exps = true; 23570 23571 stmt("import", function() { 23572 if (!state.funct["(scope)"].block.isGlobal()) { 23573 error("E053", state.tokens.curr, "Import"); 23574 } 23575 23576 if (!state.inES6()) { 23577 warning("W119", state.tokens.curr, "import", "6"); 23578 } 23579 23580 if (state.tokens.next.type === "(string)") { 23581 // ModuleSpecifier :: StringLiteral 23582 advance("(string)"); 23583 return this; 23584 } 23585 23586 if (state.tokens.next.identifier) { 23587 // ImportClause :: ImportedDefaultBinding 23588 this.name = identifier(); 23589 // Import bindings are immutable (see ES6 8.1.1.5.5) 23590 state.funct["(scope)"].addlabel(this.name, { 23591 type: "import", 23592 initialized: true, 23593 token: state.tokens.curr }); 23594 23595 if (state.tokens.next.value === ",") { 23596 // ImportClause :: ImportedDefaultBinding , NameSpaceImport 23597 // ImportClause :: ImportedDefaultBinding , NamedImports 23598 advance(","); 23599 // At this point, we intentionally fall through to continue matching 23600 // either NameSpaceImport or NamedImports. 23601 // Discussion: 23602 // https://github.com/jshint/jshint/pull/2144#discussion_r23978406 23603 } else { 23604 advance("from"); 23605 advance("(string)"); 23606 return this; 23607 } 23608 } 23609 23610 if (state.tokens.next.id === "*") { 23611 // ImportClause :: NameSpaceImport 23612 advance("*"); 23613 advance("as"); 23614 if (state.tokens.next.identifier) { 23615 this.name = identifier(); 23616 // Import bindings are immutable (see ES6 8.1.1.5.5) 23617 state.funct["(scope)"].addlabel(this.name, { 23618 type: "import", 23619 initialized: true, 23620 token: state.tokens.curr }); 23621 } 23622 } else { 23623 // ImportClause :: NamedImports 23624 advance("{"); 23625 for (;;) { 23626 if (state.tokens.next.value === "}") { 23627 advance("}"); 23628 break; 23629 } 23630 var importName; 23631 if (state.tokens.next.type === "default") { 23632 importName = "default"; 23633 advance("default"); 23634 } else { 23635 importName = identifier(); 23636 } 23637 if (state.tokens.next.value === "as") { 23638 advance("as"); 23639 importName = identifier(); 23640 } 23641 23642 // Import bindings are immutable (see ES6 8.1.1.5.5) 23643 state.funct["(scope)"].addlabel(importName, { 23644 type: "import", 23645 initialized: true, 23646 token: state.tokens.curr }); 23647 23648 if (state.tokens.next.value === ",") { 23649 advance(","); 23650 } else if (state.tokens.next.value === "}") { 23651 advance("}"); 23652 break; 23653 } else { 23654 error("E024", state.tokens.next, state.tokens.next.value); 23655 break; 23656 } 23657 } 23658 } 23659 23660 // FromClause 23661 advance("from"); 23662 advance("(string)"); 23663 return this; 23664 }).exps = true; 23665 23666 stmt("export", function() { 23667 var ok = true; 23668 var token; 23669 var identifier; 23670 23671 if (!state.inES6()) { 23672 warning("W119", state.tokens.curr, "export", "6"); 23673 ok = false; 23674 } 23675 23676 if (!state.funct["(scope)"].block.isGlobal()) { 23677 error("E053", state.tokens.curr, "Export"); 23678 ok = false; 23679 } 23680 23681 if (state.tokens.next.value === "*") { 23682 // ExportDeclaration :: export * FromClause 23683 advance("*"); 23684 advance("from"); 23685 advance("(string)"); 23686 return this; 23687 } 23688 23689 if (state.tokens.next.type === "default") { 23690 // ExportDeclaration :: 23691 // export default [lookahead ∉ { function, class }] AssignmentExpression[In] ; 23692 // export default HoistableDeclaration 23693 // export default ClassDeclaration 23694 state.nameStack.set(state.tokens.next); 23695 advance("default"); 23696 var exportType = state.tokens.next.id; 23697 if (exportType === "function" || exportType === "class") { 23698 this.block = true; 23699 } 23700 23701 token = peek(); 23702 23703 expression(10); 23704 23705 identifier = token.value; 23706 23707 if (this.block) { 23708 state.funct["(scope)"].addlabel(identifier, { 23709 type: exportType, 23710 initialized: true, 23711 token: token }); 23712 23713 state.funct["(scope)"].setExported(identifier, token); 23714 } 23715 23716 return this; 23717 } 23718 23719 if (state.tokens.next.value === "{") { 23720 // ExportDeclaration :: export ExportClause 23721 advance("{"); 23722 var exportedTokens = []; 23723 for (;;) { 23724 if (!state.tokens.next.identifier) { 23725 error("E030", state.tokens.next, state.tokens.next.value); 23726 } 23727 advance(); 23728 23729 exportedTokens.push(state.tokens.curr); 23730 23731 if (state.tokens.next.value === "as") { 23732 advance("as"); 23733 if (!state.tokens.next.identifier) { 23734 error("E030", state.tokens.next, state.tokens.next.value); 23735 } 23736 advance(); 23737 } 23738 23739 if (state.tokens.next.value === ",") { 23740 advance(","); 23741 } else if (state.tokens.next.value === "}") { 23742 advance("}"); 23743 break; 23744 } else { 23745 error("E024", state.tokens.next, state.tokens.next.value); 23746 break; 23747 } 23748 } 23749 if (state.tokens.next.value === "from") { 23750 // ExportDeclaration :: export ExportClause FromClause 23751 advance("from"); 23752 advance("(string)"); 23753 } else if (ok) { 23754 exportedTokens.forEach(function(token) { 23755 state.funct["(scope)"].setExported(token.value, token); 23756 }); 23757 } 23758 return this; 23759 } 23760 23761 if (state.tokens.next.id === "var") { 23762 // ExportDeclaration :: export VariableStatement 23763 advance("var"); 23764 state.tokens.curr.fud({ inexport:true }); 23765 } else if (state.tokens.next.id === "let") { 23766 // ExportDeclaration :: export VariableStatement 23767 advance("let"); 23768 state.tokens.curr.fud({ inexport:true }); 23769 } else if (state.tokens.next.id === "const") { 23770 // ExportDeclaration :: export VariableStatement 23771 advance("const"); 23772 state.tokens.curr.fud({ inexport:true }); 23773 } else if (state.tokens.next.id === "function") { 23774 // ExportDeclaration :: export Declaration 23775 this.block = true; 23776 advance("function"); 23777 state.syntax["function"].fud({ inexport:true }); 23778 } else if (state.tokens.next.id === "class") { 23779 // ExportDeclaration :: export Declaration 23780 this.block = true; 23781 advance("class"); 23782 var classNameToken = state.tokens.next; 23783 state.syntax["class"].fud(); 23784 state.funct["(scope)"].setExported(classNameToken.value, classNameToken); 23785 } else { 23786 error("E024", state.tokens.next, state.tokens.next.value); 23787 } 23788 23789 return this; 23790 }).exps = true; 23791 23792 // Future Reserved Words 23793 23794 FutureReservedWord("abstract"); 23795 FutureReservedWord("await", { es5: true, moduleOnly: true }); 23796 FutureReservedWord("boolean"); 23797 FutureReservedWord("byte"); 23798 FutureReservedWord("char"); 23799 FutureReservedWord("class", { es5: true, nud: classdef }); 23800 FutureReservedWord("double"); 23801 FutureReservedWord("enum", { es5: true }); 23802 FutureReservedWord("export", { es5: true }); 23803 FutureReservedWord("extends", { es5: true }); 23804 FutureReservedWord("final"); 23805 FutureReservedWord("float"); 23806 FutureReservedWord("goto"); 23807 FutureReservedWord("implements", { es5: true, strictOnly: true }); 23808 FutureReservedWord("import", { es5: true }); 23809 FutureReservedWord("int"); 23810 FutureReservedWord("interface", { es5: true, strictOnly: true }); 23811 FutureReservedWord("long"); 23812 FutureReservedWord("native"); 23813 FutureReservedWord("package", { es5: true, strictOnly: true }); 23814 FutureReservedWord("private", { es5: true, strictOnly: true }); 23815 FutureReservedWord("protected", { es5: true, strictOnly: true }); 23816 FutureReservedWord("public", { es5: true, strictOnly: true }); 23817 FutureReservedWord("short"); 23818 FutureReservedWord("static", { es5: true, strictOnly: true }); 23819 FutureReservedWord("super", { es5: true }); 23820 FutureReservedWord("synchronized"); 23821 FutureReservedWord("transient"); 23822 FutureReservedWord("volatile"); 23823 23824 // this function is used to determine whether a squarebracket or a curlybracket 23825 // expression is a comprehension array, destructuring assignment or a json value. 23826 23827 var lookupBlockType = function() { 23828 var pn, pn1, prev; 23829 var i = -1; 23830 var bracketStack = 0; 23831 var ret = {}; 23832 if (checkPunctuators(state.tokens.curr, ["[", "{"])) { 23833 bracketStack += 1; 23834 } 23835 do { 23836 prev = i === -1 ? state.tokens.curr : pn; 23837 pn = i === -1 ? state.tokens.next : peek(i); 23838 pn1 = peek(i + 1); 23839 i = i + 1; 23840 if (checkPunctuators(pn, ["[", "{"])) { 23841 bracketStack += 1; 23842 } else if (checkPunctuators(pn, ["]", "}"])) { 23843 bracketStack -= 1; 23844 } 23845 if (bracketStack === 1 && pn.identifier && pn.value === "for" && 23846 !checkPunctuator(prev, ".")) { 23847 ret.isCompArray = true; 23848 ret.notJson = true; 23849 break; 23850 } 23851 if (bracketStack === 0 && checkPunctuators(pn, ["}", "]"])) { 23852 if (pn1.value === "=") { 23853 ret.isDestAssign = true; 23854 ret.notJson = true; 23855 break; 23856 } else if (pn1.value === ".") { 23857 ret.notJson = true; 23858 break; 23859 } 23860 } 23861 if (checkPunctuator(pn, ";")) { 23862 ret.isBlock = true; 23863 ret.notJson = true; 23864 } 23865 } while (bracketStack > 0 && pn.id !== "(end)"); 23866 return ret; 23867 }; 23868 23869 function saveProperty(props, name, tkn, isClass, isStatic) { 23870 var msg = ["key", "class method", "static class method"]; 23871 msg = msg[(isClass || false) + (isStatic || false)]; 23872 if (tkn.identifier) { 23873 name = tkn.value; 23874 } 23875 23876 if (props[name] && name !== "__proto__") { 23877 warning("W075", state.tokens.next, msg, name); 23878 } else { 23879 props[name] = Object.create(null); 23880 } 23881 23882 props[name].basic = true; 23883 props[name].basictkn = tkn; 23884 } 23885 23886 /** 23887 * @param {string} accessorType - Either "get" or "set" 23888 * @param {object} props - a collection of all properties of the object to 23889 * which the current accessor is being assigned 23890 * @param {object} tkn - the identifier token representing the accessor name 23891 * @param {boolean} isClass - whether the accessor is part of an ES6 Class 23892 * definition 23893 * @param {boolean} isStatic - whether the accessor is a static method 23894 */ 23895 function saveAccessor(accessorType, props, name, tkn, isClass, isStatic) { 23896 var flagName = accessorType === "get" ? "getterToken" : "setterToken"; 23897 var msg = ""; 23898 23899 if (isClass) { 23900 if (isStatic) { 23901 msg += "static "; 23902 } 23903 msg += accessorType + "ter method"; 23904 } else { 23905 msg = "key"; 23906 } 23907 23908 state.tokens.curr.accessorType = accessorType; 23909 state.nameStack.set(tkn); 23910 23911 if (props[name]) { 23912 if ((props[name].basic || props[name][flagName]) && name !== "__proto__") { 23913 warning("W075", state.tokens.next, msg, name); 23914 } 23915 } else { 23916 props[name] = Object.create(null); 23917 } 23918 23919 props[name][flagName] = tkn; 23920 } 23921 23922 function computedPropertyName() { 23923 advance("["); 23924 if (!state.inES6()) { 23925 warning("W119", state.tokens.curr, "computed property names", "6"); 23926 } 23927 var value = expression(10); 23928 advance("]"); 23929 return value; 23930 } 23931 23932 /** 23933 * Test whether a given token is a punctuator matching one of the specified values 23934 * @param {Token} token 23935 * @param {Array.<string>} values 23936 * @returns {boolean} 23937 */ 23938 function checkPunctuators(token, values) { 23939 if (token.type === "(punctuator)") { 23940 return _.contains(values, token.value); 23941 } 23942 return false; 23943 } 23944 23945 /** 23946 * Test whether a given token is a punctuator matching the specified value 23947 * @param {Token} token 23948 * @param {string} value 23949 * @returns {boolean} 23950 */ 23951 function checkPunctuator(token, value) { 23952 return token.type === "(punctuator)" && token.value === value; 23953 } 23954 23955 // Check whether this function has been reached for a destructuring assign with undeclared values 23956 function destructuringAssignOrJsonValue() { 23957 // lookup for the assignment (ECMAScript 6 only) 23958 // if it has semicolons, it is a block, so go parse it as a block 23959 // or it's not a block, but there are assignments, check for undeclared variables 23960 23961 var block = lookupBlockType(); 23962 if (block.notJson) { 23963 if (!state.inES6() && block.isDestAssign) { 23964 warning("W104", state.tokens.curr, "destructuring assignment", "6"); 23965 } 23966 statements(); 23967 // otherwise parse json value 23968 } else { 23969 state.option.laxbreak = true; 23970 state.jsonMode = true; 23971 jsonValue(); 23972 } 23973 } 23974 23975 // array comprehension parsing function 23976 // parses and defines the three states of the list comprehension in order 23977 // to avoid defining global variables, but keeping them to the list comprehension scope 23978 // only. The order of the states are as follows: 23979 // * "use" which will be the returned iterative part of the list comprehension 23980 // * "define" which will define the variables local to the list comprehension 23981 // * "filter" which will help filter out values 23982 23983 var arrayComprehension = function() { 23984 var CompArray = function() { 23985 this.mode = "use"; 23986 this.variables = []; 23987 }; 23988 var _carrays = []; 23989 var _current; 23990 function declare(v) { 23991 var l = _current.variables.filter(function(elt) { 23992 // if it has, change its undef state 23993 if (elt.value === v) { 23994 elt.undef = false; 23995 return v; 23996 } 23997 }).length; 23998 return l !== 0; 23999 } 24000 function use(v) { 24001 var l = _current.variables.filter(function(elt) { 24002 // and if it has been defined 24003 if (elt.value === v && !elt.undef) { 24004 if (elt.unused === true) { 24005 elt.unused = false; 24006 } 24007 return v; 24008 } 24009 }).length; 24010 // otherwise we warn about it 24011 return (l === 0); 24012 } 24013 return { stack: function() { 24014 _current = new CompArray(); 24015 _carrays.push(_current); 24016 }, 24017 unstack: function() { 24018 _current.variables.filter(function(v) { 24019 if (v.unused) 24020 warning("W098", v.token, v.raw_text || v.value); 24021 if (v.undef) 24022 state.funct["(scope)"].block.use(v.value, v.token); 24023 }); 24024 _carrays.splice(-1, 1); 24025 _current = _carrays[_carrays.length - 1]; 24026 }, 24027 setState: function(s) { 24028 if (_.contains(["use", "define", "generate", "filter"], s)) 24029 _current.mode = s; 24030 }, 24031 check: function(v) { 24032 if (!_current) { 24033 return; 24034 } 24035 // When we are in "use" state of the list comp, we enqueue that var 24036 if (_current && _current.mode === "use") { 24037 if (use(v)) { 24038 _current.variables.push({ 24039 funct: state.funct, 24040 token: state.tokens.curr, 24041 value: v, 24042 undef: true, 24043 unused: false 24044 }); 24045 } 24046 return true; 24047 // When we are in "define" state of the list comp, 24048 } else if (_current && _current.mode === "define") { 24049 // check if the variable has been used previously 24050 if (!declare(v)) { 24051 _current.variables.push({ 24052 funct: state.funct, 24053 token: state.tokens.curr, 24054 value: v, 24055 undef: false, 24056 unused: true 24057 }); 24058 } 24059 return true; 24060 // When we are in the "generate" state of the list comp, 24061 } else if (_current && _current.mode === "generate") { 24062 state.funct["(scope)"].block.use(v, state.tokens.curr); 24063 return true; 24064 // When we are in "filter" state, 24065 } else if (_current && _current.mode === "filter") { 24066 // we check whether current variable has been declared 24067 if (use(v)) { 24068 // if not we warn about it 24069 state.funct["(scope)"].block.use(v, state.tokens.curr); 24070 } 24071 return true; 24072 } 24073 return false; 24074 } 24075 }; 24076 }; 24077 24078 24079 // Parse JSON 24080 24081 function jsonValue() { 24082 function jsonObject() { 24083 var o = {}, t = state.tokens.next; 24084 advance("{"); 24085 if (state.tokens.next.id !== "}") { 24086 for (;;) { 24087 if (state.tokens.next.id === "(end)") { 24088 error("E026", state.tokens.next, t.line); 24089 } else if (state.tokens.next.id === "}") { 24090 warning("W094", state.tokens.curr); 24091 break; 24092 } else if (state.tokens.next.id === ",") { 24093 error("E028", state.tokens.next); 24094 } else if (state.tokens.next.id !== "(string)") { 24095 warning("W095", state.tokens.next, state.tokens.next.value); 24096 } 24097 if (o[state.tokens.next.value] === true) { 24098 warning("W075", state.tokens.next, "key", state.tokens.next.value); 24099 } else if ((state.tokens.next.value === "__proto__" && 24100 !state.option.proto) || (state.tokens.next.value === "__iterator__" && 24101 !state.option.iterator)) { 24102 warning("W096", state.tokens.next, state.tokens.next.value); 24103 } else { 24104 o[state.tokens.next.value] = true; 24105 } 24106 advance(); 24107 advance(":"); 24108 jsonValue(); 24109 if (state.tokens.next.id !== ",") { 24110 break; 24111 } 24112 advance(","); 24113 } 24114 } 24115 advance("}"); 24116 } 24117 24118 function jsonArray() { 24119 var t = state.tokens.next; 24120 advance("["); 24121 if (state.tokens.next.id !== "]") { 24122 for (;;) { 24123 if (state.tokens.next.id === "(end)") { 24124 error("E027", state.tokens.next, t.line); 24125 } else if (state.tokens.next.id === "]") { 24126 warning("W094", state.tokens.curr); 24127 break; 24128 } else if (state.tokens.next.id === ",") { 24129 error("E028", state.tokens.next); 24130 } 24131 jsonValue(); 24132 if (state.tokens.next.id !== ",") { 24133 break; 24134 } 24135 advance(","); 24136 } 24137 } 24138 advance("]"); 24139 } 24140 24141 switch (state.tokens.next.id) { 24142 case "{": 24143 jsonObject(); 24144 break; 24145 case "[": 24146 jsonArray(); 24147 break; 24148 case "true": 24149 case "false": 24150 case "null": 24151 case "(number)": 24152 case "(string)": 24153 advance(); 24154 break; 24155 case "-": 24156 advance("-"); 24157 advance("(number)"); 24158 break; 24159 default: 24160 error("E003", state.tokens.next); 24161 } 24162 } 24163 24164 /** 24165 * Lint dynamically-evaluated code, appending any resulting errors/warnings 24166 * into the global `errors` array. 24167 * 24168 * @param {array} internals - collection of "internals" objects describing 24169 * string tokens that contain evaluated code 24170 * @param {object} options - linting options to apply 24171 * @param {object} globals - globally-defined bindings for the evaluated code 24172 */ 24173 function lintEvalCode(internals, options, globals) { 24174 var priorErrorCount, idx, jdx, internal; 24175 24176 for (idx = 0; idx < internals.length; idx += 1) { 24177 internal = internals[idx]; 24178 options.scope = internal.elem; 24179 priorErrorCount = JSHINT.errors.length; 24180 24181 itself(internal.code, options, globals); 24182 24183 for (jdx = priorErrorCount; jdx < JSHINT.errors.length; jdx += 1) { 24184 JSHINT.errors[jdx].line += internal.token.line - 1; 24185 } 24186 } 24187 } 24188 24189 var escapeRegex = function(str) { 24190 return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); 24191 }; 24192 24193 // The actual JSHINT function itself. 24194 var itself = function(s, o, g) { 24195 var x, reIgnoreStr, reIgnore; 24196 var optionKeys; 24197 var newOptionObj = {}; 24198 var newIgnoredObj = {}; 24199 24200 o = _.clone(o); 24201 state.reset(); 24202 24203 if (o && o.scope) { 24204 JSHINT.scope = o.scope; 24205 } else { 24206 JSHINT.errors = []; 24207 JSHINT.undefs = []; 24208 JSHINT.internals = []; 24209 JSHINT.blacklist = {}; 24210 JSHINT.scope = "(main)"; 24211 } 24212 24213 predefined = Object.create(null); 24214 combine(predefined, vars.ecmaIdentifiers[3]); 24215 combine(predefined, vars.reservedVars); 24216 24217 combine(predefined, g || {}); 24218 24219 declared = Object.create(null); 24220 var exported = Object.create(null); // Variables that live outside the current file 24221 24222 function each(obj, cb) { 24223 if (!obj) 24224 return; 24225 24226 if (!Array.isArray(obj) && typeof obj === "object") 24227 obj = Object.keys(obj); 24228 24229 obj.forEach(cb); 24230 } 24231 24232 if (o) { 24233 each(o.predef || null, function(item) { 24234 var slice, prop; 24235 24236 if (item[0] === "-") { 24237 slice = item.slice(1); 24238 JSHINT.blacklist[slice] = slice; 24239 // remove from predefined if there 24240 delete predefined[slice]; 24241 } else { 24242 prop = Object.getOwnPropertyDescriptor(o.predef, item); 24243 predefined[item] = prop ? prop.value : false; 24244 } 24245 }); 24246 24247 each(o.exported || null, function(item) { 24248 exported[item] = true; 24249 }); 24250 24251 delete o.predef; 24252 delete o.exported; 24253 24254 optionKeys = Object.keys(o); 24255 for (x = 0; x < optionKeys.length; x++) { 24256 if (/^-W\d{3}$/g.test(optionKeys[x])) { 24257 newIgnoredObj[optionKeys[x].slice(1)] = true; 24258 } else { 24259 var optionKey = optionKeys[x]; 24260 newOptionObj[optionKey] = o[optionKey]; 24261 } 24262 } 24263 } 24264 24265 state.option = newOptionObj; 24266 state.ignored = newIgnoredObj; 24267 24268 state.option.indent = state.option.indent || 4; 24269 state.option.maxerr = state.option.maxerr || 50; 24270 24271 indent = 1; 24272 24273 var scopeManagerInst = scopeManager(state, predefined, exported, declared); 24274 scopeManagerInst.on("warning", function(ev) { 24275 warning.apply(null, [ ev.code, ev.token].concat(ev.data)); 24276 }); 24277 24278 scopeManagerInst.on("error", function(ev) { 24279 error.apply(null, [ ev.code, ev.token ].concat(ev.data)); 24280 }); 24281 24282 state.funct = functor("(global)", null, { 24283 "(global)" : true, 24284 "(scope)" : scopeManagerInst, 24285 "(comparray)" : arrayComprehension(), 24286 "(metrics)" : createMetrics(state.tokens.next) 24287 }); 24288 24289 functions = [state.funct]; 24290 urls = []; 24291 stack = null; 24292 member = {}; 24293 membersOnly = null; 24294 inblock = false; 24295 lookahead = []; 24296 24297 if (!isString(s) && !Array.isArray(s)) { 24298 errorAt("E004", 0); 24299 return false; 24300 } 24301 24302 api = { 24303 get isJSON() { 24304 return state.jsonMode; 24305 }, 24306 24307 getOption: function(name) { 24308 return state.option[name] || null; 24309 }, 24310 24311 getCache: function(name) { 24312 return state.cache[name]; 24313 }, 24314 24315 setCache: function(name, value) { 24316 state.cache[name] = value; 24317 }, 24318 24319 warn: function(code, data) { 24320 warningAt.apply(null, [ code, data.line, data.char ].concat(data.data)); 24321 }, 24322 24323 on: function(names, listener) { 24324 names.split(" ").forEach(function(name) { 24325 emitter.on(name, listener); 24326 }.bind(this)); 24327 } 24328 }; 24329 24330 emitter.removeAllListeners(); 24331 (extraModules || []).forEach(function(func) { 24332 func(api); 24333 }); 24334 24335 state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"]; 24336 24337 if (o && o.ignoreDelimiters) { 24338 24339 if (!Array.isArray(o.ignoreDelimiters)) { 24340 o.ignoreDelimiters = [o.ignoreDelimiters]; 24341 } 24342 24343 o.ignoreDelimiters.forEach(function(delimiterPair) { 24344 if (!delimiterPair.start || !delimiterPair.end) 24345 return; 24346 24347 reIgnoreStr = escapeRegex(delimiterPair.start) + 24348 "[\\s\\S]*?" + 24349 escapeRegex(delimiterPair.end); 24350 24351 reIgnore = new RegExp(reIgnoreStr, "ig"); 24352 24353 s = s.replace(reIgnore, function(match) { 24354 return match.replace(/./g, " "); 24355 }); 24356 }); 24357 } 24358 24359 lex = new Lexer(s); 24360 24361 lex.on("warning", function(ev) { 24362 warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data)); 24363 }); 24364 24365 lex.on("error", function(ev) { 24366 errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data)); 24367 }); 24368 24369 lex.on("fatal", function(ev) { 24370 quit("E041", ev); 24371 }); 24372 24373 lex.on("Identifier", function(ev) { 24374 emitter.emit("Identifier", ev); 24375 }); 24376 24377 lex.on("String", function(ev) { 24378 emitter.emit("String", ev); 24379 }); 24380 24381 lex.on("Number", function(ev) { 24382 emitter.emit("Number", ev); 24383 }); 24384 24385 // Check options 24386 for (var name in o) { 24387 if (_.has(o, name)) { 24388 checkOption(name, state.tokens.curr); 24389 } 24390 } 24391 24392 try { 24393 applyOptions(); 24394 24395 // combine the passed globals after we've assumed all our options 24396 combine(predefined, g || {}); 24397 24398 //reset values 24399 parseComma.first = true; 24400 24401 advance(); 24402 switch (state.tokens.next.id) { 24403 case "{": 24404 case "[": 24405 destructuringAssignOrJsonValue(); 24406 break; 24407 default: 24408 directives(); 24409 24410 if (state.directive["use strict"]) { 24411 if (!state.allowsGlobalUsd()) { 24412 warning("W097", state.tokens.prev); 24413 } 24414 } 24415 24416 statements(); 24417 } 24418 24419 if (state.tokens.next.id !== "(end)") { 24420 quit("E041", state.tokens.curr); 24421 } 24422 24423 state.funct["(scope)"].unstack(); 24424 24425 } catch (err) { 24426 if (err && err.name === "JSHintError") { 24427 var nt = state.tokens.next || {}; 24428 JSHINT.errors.push({ 24429 scope : "(main)", 24430 raw : err.raw, 24431 code : err.code, 24432 reason : err.reason, 24433 line : err.line || nt.line, 24434 character : err.character || nt.from 24435 }); 24436 } else { 24437 throw err; 24438 } 24439 } 24440 24441 // Loop over the listed "internals", and check them as well. 24442 if (JSHINT.scope === "(main)") { 24443 lintEvalCode(JSHINT.internals, o || {}, g); 24444 } 24445 24446 return JSHINT.errors.length === 0; 24447 }; 24448 24449 // Modules. 24450 itself.addModule = function(func) { 24451 extraModules.push(func); 24452 }; 24453 24454 itself.addModule(style.register); 24455 24456 // Data summary. 24457 itself.data = function() { 24458 var data = { 24459 functions: [], 24460 options: state.option 24461 }; 24462 24463 var fu, f, i, j, n, globals; 24464 24465 if (itself.errors.length) { 24466 data.errors = itself.errors; 24467 } 24468 24469 if (state.jsonMode) { 24470 data.json = true; 24471 } 24472 24473 var impliedGlobals = state.funct["(scope)"].getImpliedGlobals(); 24474 if (impliedGlobals.length > 0) { 24475 data.implieds = impliedGlobals; 24476 } 24477 24478 if (urls.length > 0) { 24479 data.urls = urls; 24480 } 24481 24482 globals = state.funct["(scope)"].getUsedOrDefinedGlobals(); 24483 if (globals.length > 0) { 24484 data.globals = globals; 24485 } 24486 24487 for (i = 1; i < functions.length; i += 1) { 24488 f = functions[i]; 24489 fu = {}; 24490 24491 for (j = 0; j < functionicity.length; j += 1) { 24492 fu[functionicity[j]] = []; 24493 } 24494 24495 for (j = 0; j < functionicity.length; j += 1) { 24496 if (fu[functionicity[j]].length === 0) { 24497 delete fu[functionicity[j]]; 24498 } 24499 } 24500 24501 fu.name = f["(name)"]; 24502 fu.param = f["(params)"]; 24503 fu.line = f["(line)"]; 24504 fu.character = f["(character)"]; 24505 fu.last = f["(last)"]; 24506 fu.lastcharacter = f["(lastcharacter)"]; 24507 24508 fu.metrics = { 24509 complexity: f["(metrics)"].ComplexityCount, 24510 parameters: f["(metrics)"].arity, 24511 statements: f["(metrics)"].statementCount 24512 }; 24513 24514 data.functions.push(fu); 24515 } 24516 24517 var unuseds = state.funct["(scope)"].getUnuseds(); 24518 if (unuseds.length > 0) { 24519 data.unused = unuseds; 24520 } 24521 24522 for (n in member) { 24523 if (typeof member[n] === "number") { 24524 data.member = member; 24525 break; 24526 } 24527 } 24528 24529 return data; 24530 }; 24531 24532 itself.jshint = itself; 24533 24534 return itself; 24535 }()); 24536 24537 // Make JSHINT a Node module, if possible. 24538 if (typeof exports === "object" && exports) { 24539 exports.JSHINT = JSHINT; 24540 } 24541 24542 },{"./lex.js":13,"./messages.js":14,"./options.js":16,"./reg.js":17,"./scope-manager.js":18,"./state.js":19,"./style.js":20,"./vars.js":21,"console-browserify":10,"events":5,"lodash":12}]},{},[]); 24543 24544 JSHINT = require('jshint').JSHINT; 24545 if (typeof exports === 'object' && exports) exports.JSHINT = JSHINT; 24546 }());
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Jan 23 01:00:03 2018 | Cross-referenced by PHPXref 0.7.1 |