mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-05 01:17:50 +00:00
Compare commits
6637 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
238defb150 | ||
|
|
53ba1e0c3c | ||
|
|
95d3477c22 | ||
|
|
a06d1a0313 | ||
|
|
330c8cb46e | ||
|
|
da2e8a1030 | ||
|
|
5bc9e6b8bd | ||
|
|
9a02bd5fc7 | ||
|
|
89656fdf4a | ||
|
|
4cb7bea97d | ||
|
|
eb4861c3cd | ||
|
|
170c13b5ba | ||
|
|
26a6117889 | ||
|
|
014982cb2c | ||
|
|
058361e222 | ||
|
|
e344b66af9 | ||
|
|
54cb3599e3 | ||
|
|
6c427b7a26 | ||
|
|
ce093845e1 | ||
|
|
102c5f00d7 | ||
|
|
13d315a93b | ||
|
|
2cc247ddf8 | ||
|
|
5488644658 | ||
|
|
1fe9042953 | ||
|
|
8bde34dda0 | ||
|
|
98720bea4a | ||
|
|
032637bba1 | ||
|
|
dadde87cab | ||
|
|
fcd0bbfc56 | ||
|
|
600fbbadfb | ||
|
|
3d0df11e50 | ||
|
|
2e4c997dba | ||
|
|
5aaf7e40ae | ||
|
|
57703b040d | ||
|
|
c6ff776147 | ||
|
|
9ac729e1bc | ||
|
|
6d951ccc87 | ||
|
|
3217118fab | ||
|
|
6ef973ae33 | ||
|
|
e0a65ac34a | ||
|
|
b833d83a3e | ||
|
|
220713109c | ||
|
|
cafb9822ce | ||
|
|
1b3815928d | ||
|
|
fbb67f9dbe | ||
|
|
8d24f393ac | ||
|
|
7759376b91 | ||
|
|
ccc3081be0 | ||
|
|
62b66305f2 | ||
|
|
65daae2043 | ||
|
|
0fcf43b02b | ||
|
|
46d1f53ee9 | ||
|
|
fc22665dd8 | ||
|
|
7862e5ce2d | ||
|
|
7cbffd5ebf | ||
|
|
5028267c72 | ||
|
|
6f03ef955c | ||
|
|
f75bf13ad1 | ||
|
|
d7dbf0951d | ||
|
|
daf6de6a46 | ||
|
|
7d4c3ed404 | ||
|
|
a9fd17950a | ||
|
|
b91a515258 | ||
|
|
bc5729a9de | ||
|
|
729d1a57aa | ||
|
|
73e2562cd1 | ||
|
|
849423c9d8 | ||
|
|
1c9a9f364d | ||
|
|
e485e16d28 | ||
|
|
bc49e7fe18 | ||
|
|
6a9337434f | ||
|
|
0c89b9aeb5 | ||
|
|
6f7a8501cb | ||
|
|
7a03898ffe | ||
|
|
609ae34b4e | ||
|
|
2d21faf68a | ||
|
|
26ee0c5c2a | ||
|
|
cafb5e1331 | ||
|
|
7717b8aa64 | ||
|
|
c82322c490 | ||
|
|
4af0c066ec | ||
|
|
d2b10de40b | ||
|
|
26bfb74a60 | ||
|
|
ef129e4c8c | ||
|
|
0b04309ea5 | ||
|
|
fb4852f6db | ||
|
|
5046943020 | ||
|
|
14d7f89f75 | ||
|
|
d431e97030 | ||
|
|
8f06ea259a | ||
|
|
0a0fa58e2d | ||
|
|
286f1abb87 | ||
|
|
a621ba236a | ||
|
|
a041a3782d | ||
|
|
9f8064a8b5 | ||
|
|
729f424622 | ||
|
|
6a8e978fd7 | ||
|
|
aea509c230 | ||
|
|
21113b8c87 | ||
|
|
dcf6d382c4 | ||
|
|
c541598f40 | ||
|
|
bd8e38518f | ||
|
|
067036a359 | ||
|
|
22b51ed232 | ||
|
|
054e78572b | ||
|
|
31cb06a643 | ||
|
|
ee4a5a2604 | ||
|
|
05b60871c5 | ||
|
|
03a194fcb9 | ||
|
|
52e96c38dc | ||
|
|
f5dd98cac4 | ||
|
|
b890d40b54 | ||
|
|
457a0dc703 | ||
|
|
e4837cd75d | ||
|
|
67b2c6f900 | ||
|
|
260a84c4d8 | ||
|
|
4b0db6ec6c | ||
|
|
9c4c194bb5 | ||
|
|
ac74a1ea15 | ||
|
|
e4ddf3e155 | ||
|
|
896b27ef73 | ||
|
|
bdf0b9f288 | ||
|
|
1665e5cbff | ||
|
|
6e8c0de1ff | ||
|
|
4fb41ac6a9 | ||
|
|
af983b2dd3 | ||
|
|
405d5875b8 | ||
|
|
b30f979ec7 | ||
|
|
836bd258a0 | ||
|
|
d2f74ee245 | ||
|
|
45f668b416 | ||
|
|
d29d74f687 | ||
|
|
9fba7be296 | ||
|
|
f30851bac1 | ||
|
|
d308bce09f | ||
|
|
3d7dbd140c | ||
|
|
15bd64a1b4 | ||
|
|
3c30100837 | ||
|
|
81bdb9da43 | ||
|
|
60e3a93a30 | ||
|
|
158f2839fd | ||
|
|
c7b9df4286 | ||
|
|
0eca941e22 | ||
|
|
8592f4163f | ||
|
|
29e2598a39 | ||
|
|
32e75acb9f | ||
|
|
b54501a771 | ||
|
|
6062860628 | ||
|
|
a12c3797fb | ||
|
|
48bc8b4f1a | ||
|
|
e861681963 | ||
|
|
9985e81808 | ||
|
|
ffde99b216 | ||
|
|
492caa4fd2 | ||
|
|
01c0950ae8 | ||
|
|
20fa52309c | ||
|
|
7a345b5606 | ||
|
|
b6d8116882 | ||
|
|
4495e74f77 | ||
|
|
c009349d99 | ||
|
|
26d5ba992c | ||
|
|
320ef6f933 | ||
|
|
b678bb4a74 | ||
|
|
c1c394ac60 | ||
|
|
70d3057e17 | ||
|
|
3d27920226 | ||
|
|
33a43a5f93 | ||
|
|
fac9501840 | ||
|
|
4d6aade733 | ||
|
|
d9e2c1cc34 | ||
|
|
c8c6a7e7b1 | ||
|
|
69addb855e | ||
|
|
55fb0172c0 | ||
|
|
2026cbeebd | ||
|
|
d6d01cdfa0 | ||
|
|
cb07604dc6 | ||
|
|
549def0e48 | ||
|
|
a3c215919d | ||
|
|
ab904a1047 | ||
|
|
60381f4d6c | ||
|
|
8f607295ae | ||
|
|
27218a95af | ||
|
|
8e150ad6bc | ||
|
|
c8914a890c | ||
|
|
b25a86f352 | ||
|
|
ec8e279235 | ||
|
|
1cc16029db | ||
|
|
5c912bcc62 | ||
|
|
b3742c8d3c | ||
|
|
c3a7516712 | ||
|
|
12319d5775 | ||
|
|
45e1965936 | ||
|
|
6091c8ec49 | ||
|
|
cfb7dab0f3 | ||
|
|
2d9f3cde0f | ||
|
|
e5f4770247 | ||
|
|
dc7c321514 | ||
|
|
40164659b1 | ||
|
|
7829f3d224 | ||
|
|
92359257c1 | ||
|
|
d2a2b3a8c4 | ||
|
|
4019eb65f2 | ||
|
|
4c5bead5c6 | ||
|
|
0163aae357 | ||
|
|
8fa23a94a0 | ||
|
|
8176d56c72 | ||
|
|
5add168743 | ||
|
|
27e59404d3 | ||
|
|
54f5ac7b8d | ||
|
|
5c688cc0b7 | ||
|
|
86efb0ea09 | ||
|
|
bc13666222 | ||
|
|
d1abde7d1a | ||
|
|
691db4d406 | ||
|
|
fb833b0c19 | ||
|
|
4d2181ad83 | ||
|
|
9dd291a96e | ||
|
|
1344803e7e | ||
|
|
4a5f8fa974 | ||
|
|
212e4a6407 | ||
|
|
d47123779e | ||
|
|
fc734a6371 | ||
|
|
02be5b808e | ||
|
|
0d757fdc40 | ||
|
|
0263a879c4 | ||
|
|
c309ed1c49 | ||
|
|
e58de14437 | ||
|
|
78a7fa1d14 | ||
|
|
77178a9583 | ||
|
|
d2ab33eb52 | ||
|
|
7b3194660c | ||
|
|
f627b25e9d | ||
|
|
1bbb7c9d3b | ||
|
|
08a4ae1f56 | ||
|
|
7c398f8019 | ||
|
|
6651023f7f | ||
|
|
021df666a3 | ||
|
|
d7e60cb6d0 | ||
|
|
4cd26e6860 | ||
|
|
946a3bf5c8 | ||
|
|
b10e6a01b2 | ||
|
|
e23341a118 | ||
|
|
4446fb13a3 | ||
|
|
4dfbde7716 | ||
|
|
3c03d4a1f3 | ||
|
|
a0ecdfff0b | ||
|
|
60023a23df | ||
|
|
e96442631c | ||
|
|
94750bfa3c | ||
|
|
5cc02555d0 | ||
|
|
6e2f7e2f38 | ||
|
|
de92cc32e6 | ||
|
|
e97205409d | ||
|
|
091d8e3dbf | ||
|
|
171ca53c29 | ||
|
|
5be61796d9 | ||
|
|
1aee1c6cb8 | ||
|
|
343f48b08c | ||
|
|
358ecfd2eb | ||
|
|
8066ad7e65 | ||
|
|
7ae0d0099d | ||
|
|
2e4fc41c9b | ||
|
|
71247ff556 | ||
|
|
5ef163f143 | ||
|
|
510cbfaa3f | ||
|
|
bd3fcab9c0 | ||
|
|
9841e6aa4c | ||
|
|
1bf125eebd | ||
|
|
f9936b8b54 | ||
|
|
d11aa6de06 | ||
|
|
1c4fccc0fd | ||
|
|
aa0323f04d | ||
|
|
2916e9dd11 | ||
|
|
6958d7abd4 | ||
|
|
9e661cb858 | ||
|
|
a972026c67 | ||
|
|
2b1bda7418 | ||
|
|
a6a3f3ed80 | ||
|
|
5cca51e978 | ||
|
|
7c971587dc | ||
|
|
40a13d4b86 | ||
|
|
a0971d016d | ||
|
|
410e9e3eb8 | ||
|
|
37813c3826 | ||
|
|
e00c243662 | ||
|
|
f504f5aac5 | ||
|
|
0b63f2c259 | ||
|
|
14fb27ce77 | ||
|
|
7da7d7b7e0 | ||
|
|
907add6acc | ||
|
|
f110e3ddcd | ||
|
|
ed206e5611 | ||
|
|
e4d8af175b | ||
|
|
ba7ddc8cdc | ||
|
|
389f5790a7 | ||
|
|
6071982dd9 | ||
|
|
f71c0bd4c3 | ||
|
|
50b45d013a | ||
|
|
93a047e77c | ||
|
|
a3bf0e8888 | ||
|
|
d8fa2f3e89 | ||
|
|
e361c5a5b3 | ||
|
|
3ef032cbaf | ||
|
|
36cf5a7ff3 | ||
|
|
6d930d6920 | ||
|
|
f676a8c9c1 | ||
|
|
941ffee2d3 | ||
|
|
0a71f3372f | ||
|
|
f817f68487 | ||
|
|
826975f392 | ||
|
|
5f244d3c31 | ||
|
|
71be34859f | ||
|
|
f9a4705c9c | ||
|
|
a546842792 | ||
|
|
ba86e20179 | ||
|
|
b32fc6f6e6 | ||
|
|
1f13a34687 | ||
|
|
f212b4850d | ||
|
|
1b4555afb6 | ||
|
|
358013c67e | ||
|
|
a98667ca05 | ||
|
|
02e9f4c333 | ||
|
|
d7951db01b | ||
|
|
21fba2df9f | ||
|
|
a4947139a6 | ||
|
|
c01e7580cd | ||
|
|
8b4f22ed75 | ||
|
|
669b76bf99 | ||
|
|
efee02ace7 | ||
|
|
cd8adf5611 | ||
|
|
d216106b88 | ||
|
|
6dd8fb12ad | ||
|
|
a4999575d0 | ||
|
|
fcaff8ff28 | ||
|
|
cf0b3e3212 | ||
|
|
bccb4150fd | ||
|
|
9a297b0eb5 | ||
|
|
9c4baf7645 | ||
|
|
73b2f20509 | ||
|
|
642690e692 | ||
|
|
1468c74c36 | ||
|
|
0bfa1ec2d0 | ||
|
|
7c74464d7a | ||
|
|
de051ac1ac | ||
|
|
ba0c4c413d | ||
|
|
7e6f5ef4f5 | ||
|
|
712eeb009f | ||
|
|
b54e28deb7 | ||
|
|
1f44cebac3 | ||
|
|
9c05e8392b | ||
|
|
9a67fec48a | ||
|
|
1966ac7979 | ||
|
|
8b624217c5 | ||
|
|
40499af9b9 | ||
|
|
b3bd359a0d | ||
|
|
de07e3f874 | ||
|
|
c7e8953b68 | ||
|
|
80e7fe4bf9 | ||
|
|
2bc199d7fc | ||
|
|
9b710d8e81 | ||
|
|
cc6a0ee98d | ||
|
|
c9492d79a1 | ||
|
|
94c4719c0d | ||
|
|
c253e8d7b8 | ||
|
|
98f12fb8e1 | ||
|
|
e05a40bb16 | ||
|
|
c73bb67486 | ||
|
|
3ad0cbc86d | ||
|
|
6402af7db9 | ||
|
|
6a41a79ded | ||
|
|
fbd9a804a9 | ||
|
|
694e1175a1 | ||
|
|
80dbd4cbfa | ||
|
|
d459f4ac7c | ||
|
|
2c5c4bfbea | ||
|
|
a1a68bb5d7 | ||
|
|
984a10c1b1 | ||
|
|
3c4c06cb5e | ||
|
|
8d28a5ca3f | ||
|
|
801c4a56c3 | ||
|
|
ea000e6ce7 | ||
|
|
6723cdfa07 | ||
|
|
2cf10711f5 | ||
|
|
bde171e947 | ||
|
|
2696615523 | ||
|
|
f98028d1d8 | ||
|
|
97475fc365 | ||
|
|
ea7aa52ea3 | ||
|
|
ec4ae5978b | ||
|
|
90d73143e1 | ||
|
|
249f0cd72c | ||
|
|
232cc1ab34 | ||
|
|
2cea31cb1b | ||
|
|
02c4d60861 | ||
|
|
8c9073308a | ||
|
|
8cb5455671 | ||
|
|
8bc44e3bff | ||
|
|
73f84baaec | ||
|
|
d3acace1c4 | ||
|
|
7f3539d001 | ||
|
|
3ef19f1ab1 | ||
|
|
749b2db846 | ||
|
|
a3e99b5d89 | ||
|
|
dbbb3fbb55 | ||
|
|
6eeac45d23 | ||
|
|
5669cc0a0b | ||
|
|
d986901a1c | ||
|
|
5394bbf06a | ||
|
|
d7b2f922b5 | ||
|
|
9ab55443eb | ||
|
|
67c7a43e6f | ||
|
|
26a4bfb838 | ||
|
|
e7a16b2e64 | ||
|
|
a5612ed668 | ||
|
|
f55d15692b | ||
|
|
107994859b | ||
|
|
a8d3689061 | ||
|
|
4fb4ec5328 | ||
|
|
9bc8519656 | ||
|
|
af36d2d8e5 | ||
|
|
6b0069f10f | ||
|
|
a64b629333 | ||
|
|
fc4cc977ed | ||
|
|
7483520c8c | ||
|
|
5d18fb8c70 | ||
|
|
1163bfac5c | ||
|
|
d643bbd7e4 | ||
|
|
32158935f8 | ||
|
|
50bf1ea784 | ||
|
|
fa29123c5e | ||
|
|
314c652818 | ||
|
|
a3dd60370e | ||
|
|
3d82567118 | ||
|
|
eaac5e02c0 | ||
|
|
3bd5703bdb | ||
|
|
bf80a75474 | ||
|
|
bea7016223 | ||
|
|
c8ff2b4612 | ||
|
|
6c673cd19b | ||
|
|
c1ae43e041 | ||
|
|
9605072200 | ||
|
|
9cabc7c222 | ||
|
|
b2b3391827 | ||
|
|
19e94b8889 | ||
|
|
4bee8c9ead | ||
|
|
3f1ae77306 | ||
|
|
9f6d6d7b37 | ||
|
|
adac412f58 | ||
|
|
31ca38515a | ||
|
|
4a35929979 | ||
|
|
4a0610f107 | ||
|
|
9a1b3d813a | ||
|
|
a7a4862491 | ||
|
|
5783536837 | ||
|
|
f8646d1a5d | ||
|
|
39bb7064e7 | ||
|
|
388bf6934d | ||
|
|
5122e9271c | ||
|
|
32b36435f8 | ||
|
|
807ad48bbc | ||
|
|
b5842314b4 | ||
|
|
efb4db2b86 | ||
|
|
ecbf8cd722 | ||
|
|
9992144130 | ||
|
|
1f9cba6f53 | ||
|
|
2465a6bdbd | ||
|
|
1a7199fd6b | ||
|
|
57f0a4c6d7 | ||
|
|
138cf77916 | ||
|
|
43d1ca89c2 | ||
|
|
51e619b18f | ||
|
|
21df7426e2 | ||
|
|
2f6b2ca0c7 | ||
|
|
cf1b9f9595 | ||
|
|
b0ec8339fa | ||
|
|
762748684e | ||
|
|
bdfd5880e9 | ||
|
|
9e55e5bcea | ||
|
|
887576e4a5 | ||
|
|
ccd1d6ab29 | ||
|
|
fcbb63ad60 | ||
|
|
1607e7914c | ||
|
|
68e98397ab | ||
|
|
3983d4f473 | ||
|
|
9eda959489 | ||
|
|
4880f9923c | ||
|
|
87e8a4290e | ||
|
|
fd96d59963 | ||
|
|
1a1771f0b5 | ||
|
|
22ed53260f | ||
|
|
77cf88a3bf | ||
|
|
695d74d7c5 | ||
|
|
a164735369 | ||
|
|
6ccea636b1 | ||
|
|
0ccaf76661 | ||
|
|
593f6f9f86 | ||
|
|
fbdda6df03 | ||
|
|
a7dcce3e8d | ||
|
|
ee5718003b | ||
|
|
a43065ec08 | ||
|
|
1740ee91da | ||
|
|
90f95306f9 | ||
|
|
0964f9175e | ||
|
|
dbde3f8826 | ||
|
|
33e08baf3f | ||
|
|
6e67ebab05 | ||
|
|
5fbc5303ff | ||
|
|
e582ad226a | ||
|
|
dfb71a3a50 | ||
|
|
5355f4f25e | ||
|
|
98c422d227 | ||
|
|
e18b577d20 | ||
|
|
7226df593e | ||
|
|
8a376f647e | ||
|
|
050087f6c4 | ||
|
|
c67e347255 | ||
|
|
3fdac985c7 | ||
|
|
02ff3e6258 | ||
|
|
65ce1b0bb5 | ||
|
|
7e8528104b | ||
|
|
40ac55acb6 | ||
|
|
42c639d252 | ||
|
|
d110b64ee4 | ||
|
|
a2617d810c | ||
|
|
90d07bc04c | ||
|
|
013d9db86f | ||
|
|
9d4d725bc7 | ||
|
|
9881cc9e10 | ||
|
|
01474fed0b | ||
|
|
024e6d8ae8 | ||
|
|
607ba653f7 | ||
|
|
9090c1904f | ||
|
|
158b762367 | ||
|
|
e8b3b2dc31 | ||
|
|
5d72eec742 | ||
|
|
6fe020c920 | ||
|
|
40c5a6af49 | ||
|
|
803dce242b | ||
|
|
4ed722ccd8 | ||
|
|
f35d479d5e | ||
|
|
f3af61de97 | ||
|
|
077fb89083 | ||
|
|
d4d4390846 | ||
|
|
33e54546fe | ||
|
|
bf008e0680 | ||
|
|
08694bd709 | ||
|
|
91242440fc | ||
|
|
68ae6fc212 | ||
|
|
14a16c2a7a | ||
|
|
9cbb50d3a6 | ||
|
|
47635b9978 | ||
|
|
f90c3f2483 | ||
|
|
5a67ecc142 | ||
|
|
a542f8ab54 | ||
|
|
f32349db7d | ||
|
|
32f5db3f72 | ||
|
|
670e3983b4 | ||
|
|
e1cc4d8552 | ||
|
|
8422bb37b0 | ||
|
|
ebf9b64062 | ||
|
|
56b397b506 | ||
|
|
de6cc79ac8 | ||
|
|
d28395fdb9 | ||
|
|
84b8ee7bda | ||
|
|
b56c732332 | ||
|
|
041c1b4586 | ||
|
|
0edc480d17 | ||
|
|
1a3bcb4ebd | ||
|
|
7d8c2a84b7 | ||
|
|
4faac431c4 | ||
|
|
df9ded3282 | ||
|
|
1fe8d1679e | ||
|
|
708505f2b1 | ||
|
|
b2da5ee1a7 | ||
|
|
315e751f43 | ||
|
|
dc5544223f | ||
|
|
c14728d31a | ||
|
|
7d4b154866 | ||
|
|
b69647a0c3 | ||
|
|
d054442e2c | ||
|
|
e50bf1fb44 | ||
|
|
d40b6a75da | ||
|
|
e124e7fb5f | ||
|
|
7c3a163f9c | ||
|
|
03af0791aa | ||
|
|
464885a539 | ||
|
|
346579ac7a | ||
|
|
76ed206e9b | ||
|
|
06e7c963ef | ||
|
|
573d902026 | ||
|
|
66cdfe5896 | ||
|
|
9afd4659c7 | ||
|
|
7249217600 | ||
|
|
2f20c672e0 | ||
|
|
6d02a64c47 | ||
|
|
3d078383cb | ||
|
|
64e765bf7a | ||
|
|
b5b6125730 | ||
|
|
e45984f6b8 | ||
|
|
a95cf1c26c | ||
|
|
4a19913726 | ||
|
|
52ae769bfa | ||
|
|
44d7c3887d | ||
|
|
315271996c | ||
|
|
2357704540 | ||
|
|
262049f737 | ||
|
|
04d6e351a6 | ||
|
|
9fa86ec712 | ||
|
|
901e3dcff2 | ||
|
|
43fffe3200 | ||
|
|
1123e13072 | ||
|
|
996636d25b | ||
|
|
8864095bab | ||
|
|
def9f5d84a | ||
|
|
47d024ae7b | ||
|
|
05135ca171 | ||
|
|
ca1f22a7c6 | ||
|
|
9a461a5e48 | ||
|
|
73e7bab839 | ||
|
|
572060aedc | ||
|
|
f1b63d41f8 | ||
|
|
9ee423edcf | ||
|
|
70c8651182 | ||
|
|
2b54f23dad | ||
|
|
67ef2bb008 | ||
|
|
f2b5e58500 | ||
|
|
b8fa0d9b29 | ||
|
|
264d68dec9 | ||
|
|
71f5264ee1 | ||
|
|
ce8a1feb94 | ||
|
|
05c32044e9 | ||
|
|
44927be6e2 | ||
|
|
d1779d6cdd | ||
|
|
a13d640bcc | ||
|
|
c7d4106f66 | ||
|
|
2e59faad8f | ||
|
|
6d70b64b2e | ||
|
|
767f9c6bce | ||
|
|
edd7c2f0b1 | ||
|
|
b9cfd31bd5 | ||
|
|
6883f99141 | ||
|
|
c2aee218d2 | ||
|
|
8e44d73705 | ||
|
|
9e30cc4542 | ||
|
|
963e2c23b0 | ||
|
|
7ee4bf8d02 | ||
|
|
c3c6bc9666 | ||
|
|
ef1024bb60 | ||
|
|
6c6e1c2be3 | ||
|
|
e9a08ba9a9 | ||
|
|
59546b9989 | ||
|
|
816edcce2e | ||
|
|
8accfb3372 | ||
|
|
da146a9afd | ||
|
|
cbcd5ffdc4 | ||
|
|
6f600ebeac | ||
|
|
9aa456f26f | ||
|
|
dc77d7605d | ||
|
|
f7c4410f41 | ||
|
|
9fa0ec00b8 | ||
|
|
0125ff7303 | ||
|
|
fbc91cf7ae | ||
|
|
43c26b5d6f | ||
|
|
4e38f70e0e | ||
|
|
e2c86dac63 | ||
|
|
aebc0650f8 | ||
|
|
44cf971405 | ||
|
|
c0d7418054 | ||
|
|
a0db54b53f | ||
|
|
32b813e42b | ||
|
|
3c144b8601 | ||
|
|
076e4e6db5 | ||
|
|
2ea08ccd36 | ||
|
|
fc48518f2b | ||
|
|
594c3b3406 | ||
|
|
38edd713e4 | ||
|
|
6987d70dc2 | ||
|
|
0e4b307585 | ||
|
|
c81bbe95c6 | ||
|
|
b21a87b50f | ||
|
|
e3566eb1ce | ||
|
|
0429434dbb | ||
|
|
80f35ee713 | ||
|
|
224595c837 | ||
|
|
61ace9a24b | ||
|
|
8c630ede7e | ||
|
|
ca3b583695 | ||
|
|
c2cbb06d57 | ||
|
|
f6bf8d2e6d | ||
|
|
60c89b2754 | ||
|
|
b72fba911d | ||
|
|
3930c388e4 | ||
|
|
ddf5ef0839 | ||
|
|
c66947405b | ||
|
|
ad27b62343 | ||
|
|
5283b0f407 | ||
|
|
af41f9267a | ||
|
|
6e8c984250 | ||
|
|
c2e018b2ac | ||
|
|
a47ce3cf13 | ||
|
|
ba58f35f37 | ||
|
|
30fd1693ee | ||
|
|
161c17ce7f | ||
|
|
27dfe542bd | ||
|
|
353113f17f | ||
|
|
762e858c48 | ||
|
|
db49702046 | ||
|
|
7239bf791f | ||
|
|
9cb75cae1d | ||
|
|
fdb4cf1208 | ||
|
|
714cf7b18c | ||
|
|
1a1e0e1a6b | ||
|
|
f6c14ec31f | ||
|
|
da7f413f6f | ||
|
|
3cf28953a7 | ||
|
|
080b761f7f | ||
|
|
7f6ad484ec | ||
|
|
391a930d49 | ||
|
|
a532773703 | ||
|
|
49f8aa4289 | ||
|
|
44b9b085c0 | ||
|
|
a447353977 | ||
|
|
dea6ccbf43 | ||
|
|
0c4d8836e7 | ||
|
|
ef67e07732 | ||
|
|
7e885a4ddd | ||
|
|
a3c1f42708 | ||
|
|
d3ef5a3acb | ||
|
|
5098d63a22 | ||
|
|
4275a73170 | ||
|
|
78a157d675 | ||
|
|
97a437e8e6 | ||
|
|
3c37f290a8 | ||
|
|
dcd5d470e0 | ||
|
|
b424f3b60f | ||
|
|
201ea9a9f0 | ||
|
|
2469af6c3f | ||
|
|
bfe6e06b5a | ||
|
|
091b5fbe30 | ||
|
|
93168e6018 | ||
|
|
16ed081818 | ||
|
|
c38b4b29cf | ||
|
|
a20b88d114 | ||
|
|
87912a3b3f | ||
|
|
53bde1238c | ||
|
|
fd365c27e2 | ||
|
|
4f43841699 | ||
|
|
e60e97c03f | ||
|
|
e619f8ca83 | ||
|
|
cf2f538167 | ||
|
|
17e1a6dbe8 | ||
|
|
74f6af8686 | ||
|
|
351236f526 | ||
|
|
51ad056710 | ||
|
|
6512b7f925 | ||
|
|
c7264e3f1f | ||
|
|
349ec35c48 | ||
|
|
057dd5b0a8 | ||
|
|
f6ac7cb1a1 | ||
|
|
c1958daf65 | ||
|
|
ee73c9b436 | ||
|
|
fac5e727e6 | ||
|
|
977264f55b | ||
|
|
e776e679af | ||
|
|
23901dfd45 | ||
|
|
87444e1a45 | ||
|
|
dc63bc2bd9 | ||
|
|
f4ff4f29b1 | ||
|
|
06412d5f12 | ||
|
|
bbc84903a7 | ||
|
|
e014592ea0 | ||
|
|
4305ffde18 | ||
|
|
0588dcb3e9 | ||
|
|
58afd8c364 | ||
|
|
e120d63ee2 | ||
|
|
d7f43eba6a | ||
|
|
786a92669e | ||
|
|
504aead673 | ||
|
|
8c72ffc583 | ||
|
|
27d3311b6a | ||
|
|
5e2f113d50 | ||
|
|
55e7b8764e | ||
|
|
513c0ae64d | ||
|
|
f0f6a1e382 | ||
|
|
6f3fb587e2 | ||
|
|
083c5b703a | ||
|
|
3583c56067 | ||
|
|
9999199d2b | ||
|
|
c084e358bd | ||
|
|
238d45a2cb | ||
|
|
21d056c470 | ||
|
|
0308d4de62 | ||
|
|
f2a6f6ce6a | ||
|
|
cf5d6b5bc8 | ||
|
|
7a6b64b2f6 | ||
|
|
bca11bd21e | ||
|
|
bf39a31907 | ||
|
|
792bfbb604 | ||
|
|
1ef96896d5 | ||
|
|
2293de07a7 | ||
|
|
804ad3d805 | ||
|
|
c797f83ca5 | ||
|
|
a71ac53fa7 | ||
|
|
7165ef6f5e | ||
|
|
c01e0cd7d1 | ||
|
|
a5990a4c4e | ||
|
|
75d196b01b | ||
|
|
69ce7cde7d | ||
|
|
6861734010 | ||
|
|
0f75d967d0 | ||
|
|
012bff97e0 | ||
|
|
2b58525816 | ||
|
|
579cf00d10 | ||
|
|
cfd25cec75 | ||
|
|
c267c4e06b | ||
|
|
c4a78445b3 | ||
|
|
4c8836a24a | ||
|
|
972624297b | ||
|
|
ebf9904e8a | ||
|
|
64652c263f | ||
|
|
58f93567fc | ||
|
|
f599c4817a | ||
|
|
930b034da5 | ||
|
|
c21174f7f9 | ||
|
|
e22be612e2 | ||
|
|
669bc1520e | ||
|
|
b257bb9c9e | ||
|
|
b8096df6d8 | ||
|
|
43d530ead9 | ||
|
|
9dbd665d05 | ||
|
|
3902fd1a67 | ||
|
|
642d248f99 | ||
|
|
8bd9a4d2c3 | ||
|
|
e96ee69f1c | ||
|
|
5bb899a700 | ||
|
|
431e0fa2f6 | ||
|
|
ec92292c38 | ||
|
|
45953b2ac1 | ||
|
|
d9f93d0895 | ||
|
|
252ea445ca | ||
|
|
9826d9bd46 | ||
|
|
b53f178c46 | ||
|
|
5ad5eb8f5d | ||
|
|
7add87739a | ||
|
|
2cd12c38e3 | ||
|
|
ad72b5b565 | ||
|
|
608e74a111 | ||
|
|
c36d0af5cd | ||
|
|
55c3299d5c | ||
|
|
7a3dda6105 | ||
|
|
171d9eab78 | ||
|
|
ab9d2056da | ||
|
|
4310329971 | ||
|
|
d038315f61 | ||
|
|
c0f91c9169 | ||
|
|
519a02ff34 | ||
|
|
643ce1da74 | ||
|
|
4c789197f9 | ||
|
|
277c9bdc7c | ||
|
|
455eace9c5 | ||
|
|
f263a87983 | ||
|
|
4f92fb7007 | ||
|
|
4fd43f7fe7 | ||
|
|
3fe2efa311 | ||
|
|
a7bf3352df | ||
|
|
2ddd893ca2 | ||
|
|
5d92b37550 | ||
|
|
dcec882262 | ||
|
|
de53132692 | ||
|
|
23a7871e2d | ||
|
|
792347978a | ||
|
|
61c740a4eb | ||
|
|
c3a614858b | ||
|
|
75727d073b | ||
|
|
b1d7450052 | ||
|
|
60e557b059 | ||
|
|
071e13363c | ||
|
|
acf4651c0e | ||
|
|
9b15dc2017 | ||
|
|
f4f0791e0c | ||
|
|
654976c826 | ||
|
|
50e86c70bd | ||
|
|
d135b846db | ||
|
|
ee2153364d | ||
|
|
6d76cdc1b7 | ||
|
|
259bdb6151 | ||
|
|
12438fa0d7 | ||
|
|
654df6f7f8 | ||
|
|
0dfe176fe6 | ||
|
|
0f3338013e | ||
|
|
dcc239b070 | ||
|
|
613488eaf8 | ||
|
|
97193b9680 | ||
|
|
71c0861675 | ||
|
|
f3b35919ef | ||
|
|
06316f1d47 | ||
|
|
271f64ee3f | ||
|
|
583b03ba5f | ||
|
|
16e2c06ab4 | ||
|
|
016de80ce7 | ||
|
|
577226bbd0 | ||
|
|
1670800df3 | ||
|
|
9674d67693 | ||
|
|
f65d36b3c1 | ||
|
|
8d93455076 | ||
|
|
cfe5ea264d | ||
|
|
9a4e11f6f7 | ||
|
|
24cef1a919 | ||
|
|
5fe373f7aa | ||
|
|
25eb4df563 | ||
|
|
6d587bdf34 | ||
|
|
03dd9df78e | ||
|
|
96c60bab46 | ||
|
|
811341efa1 | ||
|
|
5f94723d7f | ||
|
|
9d1536799b | ||
|
|
85057d588c | ||
|
|
234e693d92 | ||
|
|
51833b91d0 | ||
|
|
dfb7a4c078 | ||
|
|
04ddaf49f5 | ||
|
|
b7a6560d90 | ||
|
|
7d8531d6ed | ||
|
|
ab77d9d83a | ||
|
|
37454b8f42 | ||
|
|
ef95f165ff | ||
|
|
6494a072d2 | ||
|
|
984bcc556e | ||
|
|
be77e7366c | ||
|
|
01d961bad8 | ||
|
|
6eb0cb1565 | ||
|
|
b2bff1ad45 | ||
|
|
6ed9c005d7 | ||
|
|
6ef8693bf0 | ||
|
|
8c5025f935 | ||
|
|
9735961090 | ||
|
|
8d7058e6ad | ||
|
|
4d89d9a1b7 | ||
|
|
594f414b1a | ||
|
|
b61d30da1a | ||
|
|
412e19006b | ||
|
|
b8ebceadaf | ||
|
|
2b4f271899 | ||
|
|
c83857c42a | ||
|
|
b95d1d6123 | ||
|
|
7d1d7d909a | ||
|
|
c89a80357c | ||
|
|
1bbb24fa0c | ||
|
|
dd0aa991ff | ||
|
|
6f9b1b1822 | ||
|
|
65fd579ed2 | ||
|
|
f3279b7ee1 | ||
|
|
4d185ae7b5 | ||
|
|
81ee5d76b8 | ||
|
|
8bed7137c7 | ||
|
|
f8bcc5b917 | ||
|
|
81f8518d15 | ||
|
|
f88d27ccda | ||
|
|
40ed92d2af | ||
|
|
c7319d004d | ||
|
|
51a3c5d4e8 | ||
|
|
ecfa002a05 | ||
|
|
62962791b3 | ||
|
|
864e14cb20 | ||
|
|
092f90d2fc | ||
|
|
49b33d667d | ||
|
|
63b097329c | ||
|
|
2c3ab276ea | ||
|
|
c30c43d69e | ||
|
|
230c18d5d6 | ||
|
|
c16e64cd36 | ||
|
|
64704e16c1 | ||
|
|
b41103ee6b | ||
|
|
8ac1d54858 | ||
|
|
0a9af2968e | ||
|
|
7eba5a2221 | ||
|
|
19a8b3886e | ||
|
|
03716f62e8 | ||
|
|
d38000bc33 | ||
|
|
a6c88a173b | ||
|
|
0bad210dec | ||
|
|
62cc7574fc | ||
|
|
f5a134bcbd | ||
|
|
a7bb6b5383 | ||
|
|
e02ce1ea8b | ||
|
|
760a00b82f | ||
|
|
e6929e801b | ||
|
|
8682da4962 | ||
|
|
8e6f3e48d0 | ||
|
|
0589dd6909 | ||
|
|
1b8071d2c4 | ||
|
|
4debf155d7 | ||
|
|
f6df126c43 | ||
|
|
c406e33fcc | ||
|
|
9e11ebb62a | ||
|
|
16ed42b188 | ||
|
|
a19890469e | ||
|
|
cc1c1c127e | ||
|
|
3c1e95a3c2 | ||
|
|
d4c0777d2c | ||
|
|
8f00000676 | ||
|
|
4240f737d1 | ||
|
|
25121a86bb | ||
|
|
e4b3cde0a4 | ||
|
|
cf74ebeb71 | ||
|
|
d682357189 | ||
|
|
ddd4c391a1 | ||
|
|
930ee1d650 | ||
|
|
c5344d5336 | ||
|
|
d59c644a10 | ||
|
|
28171945e9 | ||
|
|
ddf9354d26 | ||
|
|
5f58b65c04 | ||
|
|
1ec20c5281 | ||
|
|
3421fab58a | ||
|
|
deeaf27b54 | ||
|
|
429be57b8a | ||
|
|
7f00e8f2f1 | ||
|
|
89f891ac86 | ||
|
|
63147cd145 | ||
|
|
2c5f026d3c | ||
|
|
c10146e2f0 | ||
|
|
548fe881d6 | ||
|
|
b560b7047b | ||
|
|
6f470abdff | ||
|
|
eabe95c4e3 | ||
|
|
fab50ec384 | ||
|
|
0f298de36a | ||
|
|
f8132e3be4 | ||
|
|
dfd865dadc | ||
|
|
98bdd67cf2 | ||
|
|
e842bec025 | ||
|
|
8278d38a8e | ||
|
|
0699d4cf3d | ||
|
|
8865633ccd | ||
|
|
7066b9a5c7 | ||
|
|
63f8b1dcec | ||
|
|
2e790fb865 | ||
|
|
ac62c24c4a | ||
|
|
629de594d5 | ||
|
|
7a69a45ccc | ||
|
|
916431118e | ||
|
|
83e584d579 | ||
|
|
bbd536fc04 | ||
|
|
0b76654b71 | ||
|
|
ff7d79d5fc | ||
|
|
b40b555386 | ||
|
|
efa1ebff16 | ||
|
|
8f0dcde98f | ||
|
|
3b1efb635b | ||
|
|
055fdfa0b4 | ||
|
|
a5a21235dc | ||
|
|
dfbcfdb0ae | ||
|
|
a1e917bac2 | ||
|
|
62a9208944 | ||
|
|
1bf8eb8cac | ||
|
|
893573485c | ||
|
|
d5231ad94b | ||
|
|
a578935621 | ||
|
|
c88c7ff6bb | ||
|
|
21f9cfa6d3 | ||
|
|
45d2fb8a30 | ||
|
|
9c162624fe | ||
|
|
80b5731709 | ||
|
|
bab4ffff62 | ||
|
|
f644c82da4 | ||
|
|
54294f15ef | ||
|
|
dfe77571fb | ||
|
|
f40f66d29b | ||
|
|
af06529283 | ||
|
|
d8da7a2142 | ||
|
|
c1f8e31775 | ||
|
|
cc4b49226b | ||
|
|
f9a2f74716 | ||
|
|
a326a6badf | ||
|
|
e21f4862e1 | ||
|
|
f0c3ac1789 | ||
|
|
e24513e6e2 | ||
|
|
a224b6f1b0 | ||
|
|
26299eb364 | ||
|
|
772c461a33 | ||
|
|
110ca4d1b5 | ||
|
|
aafb05b675 | ||
|
|
ff6fc56a15 | ||
|
|
2dfbe9fe77 | ||
|
|
4a0fe2c17b | ||
|
|
9f7e626b9a | ||
|
|
f2985bda5f | ||
|
|
1517745a6a | ||
|
|
887cb55919 | ||
|
|
5c42d0ef31 | ||
|
|
837d47a309 | ||
|
|
f3766cf889 | ||
|
|
2b8b63e59f | ||
|
|
d64583b743 | ||
|
|
9ec65d5ed5 | ||
|
|
9fe6afcdcc | ||
|
|
6a4e0fb41b | ||
|
|
b570884bb3 | ||
|
|
8f8f8e288c | ||
|
|
8698a5e0e8 | ||
|
|
ad5e30e189 | ||
|
|
19ee0c74f8 | ||
|
|
007e5aa27a | ||
|
|
2509f562b5 | ||
|
|
a58a276ffd | ||
|
|
1a5b9dcce1 | ||
|
|
1240a0dfdd | ||
|
|
0194169e79 | ||
|
|
a71c19e1b5 | ||
|
|
bfbfa719ff | ||
|
|
49389d0a2f | ||
|
|
e380062403 | ||
|
|
b83abfa9c1 | ||
|
|
48dbf203a5 | ||
|
|
23768398c5 | ||
|
|
ab73503859 | ||
|
|
a4f7d4cc2a | ||
|
|
cca5ac60d6 | ||
|
|
9f7f9fc3c5 | ||
|
|
6e2fb92e9a | ||
|
|
4f702e2381 | ||
|
|
b188f903ce | ||
|
|
7b93dc9c32 | ||
|
|
664d66a89e | ||
|
|
d9dc0e6fd1 | ||
|
|
53168e4cfd | ||
|
|
7998632685 | ||
|
|
86f2a1061c | ||
|
|
9ca02a448e | ||
|
|
17091d3a0e | ||
|
|
c94b1488e9 | ||
|
|
7b2274cb44 | ||
|
|
7c27a6f51e | ||
|
|
e91371d406 | ||
|
|
e878559fb9 | ||
|
|
36af8de116 | ||
|
|
09dd3a8fea | ||
|
|
5dd6b90692 | ||
|
|
97fd94744e | ||
|
|
0da3674d5e | ||
|
|
01d530d65e | ||
|
|
10dd42b6e4 | ||
|
|
ba2d3f7704 | ||
|
|
607fe2a5f6 | ||
|
|
4643679d79 | ||
|
|
04180c7c96 | ||
|
|
3846348f8a | ||
|
|
dc2fc9428d | ||
|
|
6e399ce311 | ||
|
|
641b544801 | ||
|
|
761a100397 | ||
|
|
cf1a4f893f | ||
|
|
19613be861 | ||
|
|
c163659713 | ||
|
|
aae02af265 | ||
|
|
cb96bf15b7 | ||
|
|
c006c28f55 | ||
|
|
d358d00531 | ||
|
|
abcebb4f48 | ||
|
|
6e74724c0f | ||
|
|
c5f6c43326 | ||
|
|
a9e8c0ba76 | ||
|
|
5388d8a7b0 | ||
|
|
ee499b36ea | ||
|
|
13e4b959a4 | ||
|
|
5a336403f9 | ||
|
|
26265c011a | ||
|
|
4a390bca1c | ||
|
|
af46ead30d | ||
|
|
de0f936e92 | ||
|
|
bf9dcfe89c | ||
|
|
df0ecd2a93 | ||
|
|
b3ebb3c3d3 | ||
|
|
0bead0c69a | ||
|
|
a055b0a04f | ||
|
|
d6f6007692 | ||
|
|
8ee7ffb2ab | ||
|
|
40ff04911e | ||
|
|
a3676618af | ||
|
|
b1ed66c6f5 | ||
|
|
53b3f81abe | ||
|
|
bd2428dde5 | ||
|
|
b7ae5f0885 | ||
|
|
8c5b64c7d7 | ||
|
|
641112dd4d | ||
|
|
1c47acd040 | ||
|
|
d58d6f45cc | ||
|
|
7efa921bab | ||
|
|
feafdb3c6a | ||
|
|
784ee6a086 | ||
|
|
3014f20b6c | ||
|
|
40bb035b09 | ||
|
|
ba32bf3b8d | ||
|
|
e9edc06aaf | ||
|
|
c91196d240 | ||
|
|
08c7bf3c85 | ||
|
|
046470a8db | ||
|
|
2b1eedb036 | ||
|
|
02bea6534c | ||
|
|
6f4099c20b | ||
|
|
39735df82f | ||
|
|
5062f22839 | ||
|
|
e397707dc9 | ||
|
|
66d6e226a9 | ||
|
|
fbfa578c11 | ||
|
|
5cd7208ef3 | ||
|
|
e5bc6a0315 | ||
|
|
495c890aac | ||
|
|
5fe4a1b05d | ||
|
|
d8bf62995b | ||
|
|
e36f7e7161 | ||
|
|
285b667c3e | ||
|
|
aefbdbb6d5 | ||
|
|
8debfc6e6c | ||
|
|
c9ca772a32 | ||
|
|
dc65792776 | ||
|
|
18ae1d7c18 | ||
|
|
d790a1b3c6 | ||
|
|
349c627110 | ||
|
|
db23fcfe9f | ||
|
|
d5a6a75639 | ||
|
|
404a7181a8 | ||
|
|
e392b8e240 | ||
|
|
6752d75ad0 | ||
|
|
e00d9821a8 | ||
|
|
1cf7093f46 | ||
|
|
88708ec00f | ||
|
|
984b0af883 | ||
|
|
8810754ada | ||
|
|
0d340b378b | ||
|
|
e30dc968ef | ||
|
|
ea942b0642 | ||
|
|
7e9d49b300 | ||
|
|
ce60ac4274 | ||
|
|
a04fc310b4 | ||
|
|
4a805ea666 | ||
|
|
1595651780 | ||
|
|
fc85cac91d | ||
|
|
73134f9dcc | ||
|
|
eb72bbe6f7 | ||
|
|
a5ae078f8f | ||
|
|
1cd9dc49a9 | ||
|
|
d64a97195b | ||
|
|
c6a3ace553 | ||
|
|
497d57ca95 | ||
|
|
3a07b411fb | ||
|
|
b0c2a8d5fd | ||
|
|
e404d214aa | ||
|
|
7f295dc6e8 | ||
|
|
d2a8203efb | ||
|
|
33bfa8f961 | ||
|
|
f944254cb8 | ||
|
|
30339cfd86 | ||
|
|
7dd5549b05 | ||
|
|
b6b59d93d7 | ||
|
|
5af68bbf94 | ||
|
|
db7debd3da | ||
|
|
29bc8d965b | ||
|
|
daeb55e99d | ||
|
|
fa4d85897c | ||
|
|
983363e0cd | ||
|
|
d95dad76b8 | ||
|
|
18f74aa5b2 | ||
|
|
e96a8f7bc6 | ||
|
|
29f39be6ad | ||
|
|
7a17967d79 | ||
|
|
de5bd32aba | ||
|
|
199b2e1a3a | ||
|
|
a43e4f10ef | ||
|
|
5522e4641d | ||
|
|
6c82ea8fc3 | ||
|
|
b4b45b7139 | ||
|
|
7ebb033016 | ||
|
|
163fdb46f0 | ||
|
|
b38cf204f7 | ||
|
|
fe5381b0f4 | ||
|
|
c99e7f1337 | ||
|
|
b61b674fec | ||
|
|
3bdaf99cfa | ||
|
|
6c85e7015a | ||
|
|
9788f7101b | ||
|
|
d0d5a3802d | ||
|
|
1f160b31ff | ||
|
|
13659e87cb | ||
|
|
ac9b0bfc1b | ||
|
|
07f7a3f3c5 | ||
|
|
22984f4eb2 | ||
|
|
2286283f98 | ||
|
|
5ca26e6ae0 | ||
|
|
e7c3afc1e5 | ||
|
|
82e9b4197b | ||
|
|
820939f014 | ||
|
|
e4c9916e17 | ||
|
|
ce88b120eb | ||
|
|
23c5101227 | ||
|
|
de3eeb2d47 | ||
|
|
03f7205e6d | ||
|
|
7bf7ab954b | ||
|
|
97612f3b31 | ||
|
|
71702d058c | ||
|
|
6a4164d9f3 | ||
|
|
d3b0eae84c | ||
|
|
0105b93f38 | ||
|
|
cae0d2c707 | ||
|
|
dcb1572240 | ||
|
|
e20f43018b | ||
|
|
01e176694f | ||
|
|
a239ccaa9a | ||
|
|
b97a05b7f2 | ||
|
|
c86754afde | ||
|
|
95da9c0dd4 | ||
|
|
567171993b | ||
|
|
60a0d554a0 | ||
|
|
f87af6c642 | ||
|
|
df849e8698 | ||
|
|
7a8ef7aeb7 | ||
|
|
25c7c8b153 | ||
|
|
8048f015e5 | ||
|
|
8a7fce41bb | ||
|
|
094a272443 | ||
|
|
552be2f5fb | ||
|
|
d99954133c | ||
|
|
c49ace5587 | ||
|
|
258ad020ed | ||
|
|
59de939c1d | ||
|
|
9d2d4f39bc | ||
|
|
f555cd2303 | ||
|
|
fcb80e926d | ||
|
|
3f1fd98bef | ||
|
|
e2280db917 | ||
|
|
627e92e7e0 | ||
|
|
5a9ca34a92 | ||
|
|
880ffcb1f6 | ||
|
|
4e35d970af | ||
|
|
42a4e09f91 | ||
|
|
b13b17e801 | ||
|
|
68d0238044 | ||
|
|
82b4f4147e | ||
|
|
6cbd2c4188 | ||
|
|
78982f3074 | ||
|
|
345746f7ab | ||
|
|
741a7b9caa | ||
|
|
7544c8fac8 | ||
|
|
a46169329d | ||
|
|
9aa56630ab | ||
|
|
01819e7a5a | ||
|
|
bae497ec5a | ||
|
|
68e0c78602 | ||
|
|
6296afd279 | ||
|
|
6d58fe912d | ||
|
|
0c45957096 | ||
|
|
aa311bd792 | ||
|
|
8858cdbe8c | ||
|
|
9d033247e9 | ||
|
|
cacae31af3 | ||
|
|
759a44e2b8 | ||
|
|
2fb778413b | ||
|
|
473d059efd | ||
|
|
67cd43d97a | ||
|
|
b77248c975 | ||
|
|
6bc58a16f6 | ||
|
|
0edbd96bb5 | ||
|
|
6ecc675670 | ||
|
|
c0a6f051fc | ||
|
|
6bc0aba800 | ||
|
|
6949f71516 | ||
|
|
f6c6de40f1 | ||
|
|
fdea9a447f | ||
|
|
2e02636fc1 | ||
|
|
17b9646c0b | ||
|
|
0a3d7e7cbc | ||
|
|
a62d70e80c | ||
|
|
96bbf74207 | ||
|
|
6cfe7fa5ea | ||
|
|
efc61ea70d | ||
|
|
e752b26f9e | ||
|
|
6b19ca1c11 | ||
|
|
42e01fd37b | ||
|
|
1df18a3e10 | ||
|
|
f31fb8bd34 | ||
|
|
1d54d868e3 | ||
|
|
4b801f423b | ||
|
|
96ef2110ce | ||
|
|
84763cab26 | ||
|
|
fc2ce9a021 | ||
|
|
a5c1421c6b | ||
|
|
1a54e43a24 | ||
|
|
1ab5a20784 | ||
|
|
1634388534 | ||
|
|
455afb0019 | ||
|
|
349dfbf182 | ||
|
|
b081b3ae2d | ||
|
|
110f86f803 | ||
|
|
ace771d4e9 | ||
|
|
7544166d11 | ||
|
|
ff5f06b9f0 | ||
|
|
06395f8436 | ||
|
|
fe3d86bf13 | ||
|
|
f92dc95c58 | ||
|
|
9058c00cfe | ||
|
|
8b6bd8442e | ||
|
|
1ef22e976d | ||
|
|
d0d86aecf8 | ||
|
|
1ef4807a8e | ||
|
|
846e813c99 | ||
|
|
73405cf042 | ||
|
|
79c873f3f8 | ||
|
|
0fc6929dd4 | ||
|
|
753a32bed7 | ||
|
|
027c572758 | ||
|
|
afb7d3e351 | ||
|
|
a5c3ae0a7e | ||
|
|
9477e46fb3 | ||
|
|
bf06df4475 | ||
|
|
e775a58496 | ||
|
|
ad15e47d4d | ||
|
|
45f7a91780 | ||
|
|
b1401d03a1 | ||
|
|
8b264e5c11 | ||
|
|
2fb4ec0d5f | ||
|
|
ddd5318bb0 | ||
|
|
3d44135df5 | ||
|
|
a98fc802fc | ||
|
|
ed364ecfee | ||
|
|
434d217bfa | ||
|
|
2386557b5e | ||
|
|
f619a6666a | ||
|
|
359ef9715e | ||
|
|
9211bc6329 | ||
|
|
a26ef1a997 | ||
|
|
c9f53b9a1c | ||
|
|
f9a3e66716 | ||
|
|
e5464fa199 | ||
|
|
9dc2f1ee29 | ||
|
|
b27143aa15 | ||
|
|
07c38311ca | ||
|
|
4a0415a6bd | ||
|
|
5d97cdbcfe | ||
|
|
7cce658fc4 | ||
|
|
84879453b1 | ||
|
|
9cc79db819 | ||
|
|
17a1663513 | ||
|
|
11538ccf90 | ||
|
|
5c51b1c4d1 | ||
|
|
5a13fe28c9 | ||
|
|
946560c998 | ||
|
|
7c5e032853 | ||
|
|
54ae91b2d9 | ||
|
|
8bd8aa3037 | ||
|
|
6fa9490a13 | ||
|
|
5dc48d1a83 | ||
|
|
9e56a92c8a | ||
|
|
ac98d81b85 | ||
|
|
05e80e32f7 | ||
|
|
7435058859 | ||
|
|
81b1d6e451 | ||
|
|
52754415e0 | ||
|
|
d51d67a5c2 | ||
|
|
c62fbd811b | ||
|
|
1df780abba | ||
|
|
150511b263 | ||
|
|
7fefa954c8 | ||
|
|
030472cee4 | ||
|
|
00c0dc233e | ||
|
|
1013bccb9c | ||
|
|
0911e77c32 | ||
|
|
4cdd33b2aa | ||
|
|
638f081390 | ||
|
|
21f28bfd0d | ||
|
|
941745cd06 | ||
|
|
8bf6bcb8a7 | ||
|
|
e7b8fd8281 | ||
|
|
b1ba01e85a | ||
|
|
a74c71e423 | ||
|
|
dba1bcf973 | ||
|
|
ed3f8cc39d | ||
|
|
f39fdc42f6 | ||
|
|
9ef191db33 | ||
|
|
9582f25835 | ||
|
|
4463975ace | ||
|
|
33cf509822 | ||
|
|
34f44e8f25 | ||
|
|
7fb738ab91 | ||
|
|
973e0812ad | ||
|
|
cd8218541a | ||
|
|
2316dff1e0 | ||
|
|
15ce24db25 | ||
|
|
b0e0a20e96 | ||
|
|
849f8e77ec | ||
|
|
f7c7dee8b0 | ||
|
|
167fad9649 | ||
|
|
9d3a298895 | ||
|
|
19b5ef7c6f | ||
|
|
9b09caa463 | ||
|
|
f08b6e2690 | ||
|
|
fa13cb5544 | ||
|
|
1427c99169 | ||
|
|
3e155bdbb9 | ||
|
|
f830612f17 | ||
|
|
3b86574b4d | ||
|
|
30d9cb9a4a | ||
|
|
cfe05b7d34 | ||
|
|
60a016ae39 | ||
|
|
6229e02806 | ||
|
|
5202294ae2 | ||
|
|
5bc50c2ef0 | ||
|
|
22b0b942ae | ||
|
|
41f86399f0 | ||
|
|
bc7f2af2ce | ||
|
|
db04398e49 | ||
|
|
56929e9725 | ||
|
|
6798259b84 | ||
|
|
20906c7bf7 | ||
|
|
560ddac75a | ||
|
|
daecf5cf01 | ||
|
|
505f8d5cda | ||
|
|
1d7fd0638d | ||
|
|
67ca691334 | ||
|
|
85da55d917 | ||
|
|
ee8567ab38 | ||
|
|
4ca2740628 | ||
|
|
23e6302329 | ||
|
|
95c6dd8992 | ||
|
|
a5b733998d | ||
|
|
68b7749a0f | ||
|
|
fb37e0767a | ||
|
|
43469b9877 | ||
|
|
5a53215506 | ||
|
|
51ce9edcf3 | ||
|
|
18481a40b2 | ||
|
|
24c0221ec5 | ||
|
|
0f928233ce | ||
|
|
e5730af949 | ||
|
|
ed23b6b89d | ||
|
|
28420ac1fc | ||
|
|
6da255f786 | ||
|
|
2396932846 | ||
|
|
89b9f46ad8 | ||
|
|
7dd0bb5005 | ||
|
|
44ecbc944b | ||
|
|
223460bbd2 | ||
|
|
1a0a9709f2 | ||
|
|
a16c282f99 | ||
|
|
aeac5b0203 | ||
|
|
afdc4b746a | ||
|
|
6c84ccd5c5 | ||
|
|
916bfed84b | ||
|
|
35bb3ac128 | ||
|
|
4f1c3887f7 | ||
|
|
ce19067cfd | ||
|
|
00f4ebe6aa | ||
|
|
5add1cfd25 | ||
|
|
c67092d72b | ||
|
|
4bb5402cca | ||
|
|
837acf1394 | ||
|
|
0d8779734d | ||
|
|
d8213454c2 | ||
|
|
e05c8677bf | ||
|
|
a5b9063088 | ||
|
|
83ea7ac136 | ||
|
|
f3075d685e | ||
|
|
a811476c1b | ||
|
|
64fe626fa6 | ||
|
|
f8236c711f | ||
|
|
b1f6bc72f4 | ||
|
|
300dee34bd | ||
|
|
1eaa112f7d | ||
|
|
8228376160 | ||
|
|
a58cd65db8 | ||
|
|
2df689524e | ||
|
|
a20ad60f13 | ||
|
|
1c781389d2 | ||
|
|
5e639d1704 | ||
|
|
8e64432e2c | ||
|
|
a8de2ca410 | ||
|
|
6343518bca | ||
|
|
351e259174 | ||
|
|
1d77e29c3c | ||
|
|
eba9b3d22a | ||
|
|
844fe1d979 | ||
|
|
0971a7820f | ||
|
|
06c6f180dc | ||
|
|
33da30266c | ||
|
|
ad8628f8e7 | ||
|
|
f42446d22f | ||
|
|
4b77b7a8b3 | ||
|
|
9e99a57615 | ||
|
|
7e648741ad | ||
|
|
b1d396bbbb | ||
|
|
380435d020 | ||
|
|
71fb66dc37 | ||
|
|
a53280f047 | ||
|
|
ccfb968b8a | ||
|
|
db731e0c91 | ||
|
|
a4b86f8368 | ||
|
|
44c697908b | ||
|
|
e3c79bd24a | ||
|
|
fb1ed531e4 | ||
|
|
a6cb6d26a4 | ||
|
|
003a5981d6 | ||
|
|
0bf38b826e | ||
|
|
4038d12f1b | ||
|
|
9d60e28aad | ||
|
|
ae92aa200f | ||
|
|
4584b857ca | ||
|
|
46bdf5d79d | ||
|
|
83720f457e | ||
|
|
0706af1543 | ||
|
|
41985d8c1a | ||
|
|
440eb0876c | ||
|
|
ac0a0ea07e | ||
|
|
4a534da00a | ||
|
|
ff4143b482 | ||
|
|
f132c0024f | ||
|
|
82a1010f64 | ||
|
|
d885a9afd0 | ||
|
|
08568fcc8f | ||
|
|
2192b7748e | ||
|
|
c96a579291 | ||
|
|
095cf94c45 | ||
|
|
f7a49778ea | ||
|
|
58b235b435 | ||
|
|
a7f1c3c883 | ||
|
|
268d411bb4 | ||
|
|
7cdf708e3c | ||
|
|
42c077de02 | ||
|
|
769f78a2b7 | ||
|
|
b69ba06db9 | ||
|
|
42d5cc584e | ||
|
|
f3d54d0975 | ||
|
|
39192ad388 | ||
|
|
19500d36c7 | ||
|
|
229f0b48cd | ||
|
|
58736f743e | ||
|
|
dc136cbf31 | ||
|
|
81e39f7c4b | ||
|
|
1cbb6f1405 | ||
|
|
1ae6e67cdc | ||
|
|
3d43cc1029 | ||
|
|
230e8d0787 | ||
|
|
8154e5e521 | ||
|
|
f4467f6033 | ||
|
|
562b04a763 | ||
|
|
9bcbcc5293 | ||
|
|
fdc15df3b3 | ||
|
|
e778458f78 | ||
|
|
0a55eff5d5 | ||
|
|
3874b5bf84 | ||
|
|
d07343a1aa | ||
|
|
a37c6db377 | ||
|
|
1f991a7cdc | ||
|
|
e99a31c2fa | ||
|
|
876fe52efc | ||
|
|
8f190b1fb1 | ||
|
|
411f3ecb3e | ||
|
|
3d31423eef | ||
|
|
68c0eb5216 | ||
|
|
39dae19974 | ||
|
|
2dd6f0124e | ||
|
|
826af968c8 | ||
|
|
70c3d325a0 | ||
|
|
6289211910 | ||
|
|
86346291a7 | ||
|
|
05d57b90a9 | ||
|
|
dd64f5eac4 | ||
|
|
e6de183651 | ||
|
|
7bd986337a | ||
|
|
6dc92df880 | ||
|
|
44abe46da4 | ||
|
|
9e334b5ece | ||
|
|
ee8a248086 | ||
|
|
8f1f98b003 | ||
|
|
a6bc1fa316 | ||
|
|
ce6c0f3082 | ||
|
|
393849384b | ||
|
|
618280340f | ||
|
|
6b77af4e5a | ||
|
|
aa8524b8ad | ||
|
|
87a813566a | ||
|
|
73a97d5762 | ||
|
|
ce4c6ec755 | ||
|
|
21b5139d98 | ||
|
|
7745c91c69 | ||
|
|
bce8f498b4 | ||
|
|
7eaacc3997 | ||
|
|
c699ff7574 | ||
|
|
11d8867d7a | ||
|
|
d4eeb8d186 | ||
|
|
a562a20b4e | ||
|
|
3ecf626ad0 | ||
|
|
766c4315e6 | ||
|
|
b9f2855034 | ||
|
|
44397f79a6 | ||
|
|
dcca9b82b1 | ||
|
|
ecef32a101 | ||
|
|
41d425319c | ||
|
|
6a49f227b4 | ||
|
|
a3ced39b12 | ||
|
|
b89045b20f | ||
|
|
4e3f3899c4 | ||
|
|
a8d865a246 | ||
|
|
cad0fbfc4d | ||
|
|
45f07d5014 | ||
|
|
64a7503196 | ||
|
|
783c23cbfb | ||
|
|
1c04dfe083 | ||
|
|
59ec97f59f | ||
|
|
c71d26c7e8 | ||
|
|
88e58aa8f9 | ||
|
|
40850f9cda | ||
|
|
be3afcf668 | ||
|
|
c1b7679cac | ||
|
|
a370c48d9c | ||
|
|
6c0e456a5e | ||
|
|
ebb993b862 | ||
|
|
3408db91b6 | ||
|
|
f0e8371997 | ||
|
|
55383b9de4 | ||
|
|
5551a8365a | ||
|
|
87fc16af19 | ||
|
|
80d91b693a | ||
|
|
977438309b | ||
|
|
28b426f19d | ||
|
|
d40c5d3de8 | ||
|
|
53702774d0 | ||
|
|
b36e659c56 | ||
|
|
0dcf028592 | ||
|
|
549918d7f9 | ||
|
|
dcb23f46a4 | ||
|
|
c152ae71e2 | ||
|
|
32cd726bd0 | ||
|
|
4f104d74ca | ||
|
|
9c44430975 | ||
|
|
1309f37a7e | ||
|
|
3ed0cc14ea | ||
|
|
73a698151f | ||
|
|
8a3842b788 | ||
|
|
73d68c9609 | ||
|
|
f6d81e1bd8 | ||
|
|
98e607e610 | ||
|
|
a7ec0c2e93 | ||
|
|
0b3e19f56e | ||
|
|
60ac7cfe74 | ||
|
|
491102f221 | ||
|
|
9db252e55d | ||
|
|
b9b94609f5 | ||
|
|
fe910d01f6 | ||
|
|
ea71539b7a | ||
|
|
3d9fd1d374 | ||
|
|
3eda8e64f3 | ||
|
|
ec8ccbcc55 | ||
|
|
1d58823405 | ||
|
|
19e0650c4f | ||
|
|
f45fc10cb1 | ||
|
|
42dff0e5fb | ||
|
|
ee9339e73b | ||
|
|
611aaa5385 | ||
|
|
e25369a306 | ||
|
|
67701944f1 | ||
|
|
ecaee16d23 | ||
|
|
b84c336855 | ||
|
|
447bafaa5b | ||
|
|
2f93e0a499 | ||
|
|
6c2ada9ffc | ||
|
|
982b9d2b0a | ||
|
|
1fe87d0348 | ||
|
|
8d8d4fa3b1 | ||
|
|
94fb8c6f92 | ||
|
|
04c7b33f90 | ||
|
|
ae76c3ee71 | ||
|
|
7d1e24d07f | ||
|
|
37955345ef | ||
|
|
4bc35e9ed4 | ||
|
|
c142cfc81d | ||
|
|
39a22bf15b | ||
|
|
eb636f9538 | ||
|
|
8a838633d1 | ||
|
|
963e297c74 | ||
|
|
d95dbf6ba8 | ||
|
|
ae032c8523 | ||
|
|
2b4a10c159 | ||
|
|
c7ef030ef5 | ||
|
|
7e726735ba | ||
|
|
3d25b2fd9b | ||
|
|
96a22aaec0 | ||
|
|
ccef887f88 | ||
|
|
7d9c6527a4 | ||
|
|
ef7191dbc1 | ||
|
|
bc2adb208c | ||
|
|
cd371ac66f | ||
|
|
9c342eb432 | ||
|
|
95f5b39aed | ||
|
|
9ce38cb43c | ||
|
|
8b57b3086e | ||
|
|
3fdec6d25e | ||
|
|
557af10067 | ||
|
|
6b2645b310 | ||
|
|
c360ee0fa4 | ||
|
|
3ac5870530 | ||
|
|
5218fd2c24 | ||
|
|
accb8e9b07 | ||
|
|
e331ea5d82 | ||
|
|
ae804b8cc7 | ||
|
|
66d72345f2 | ||
|
|
436d64f881 | ||
|
|
c3ec32cc16 | ||
|
|
4b86df4966 | ||
|
|
9fbf1955f2 | ||
|
|
2008a82017 | ||
|
|
8c04a00177 | ||
|
|
8370277352 | ||
|
|
89279009d8 | ||
|
|
182b29662d | ||
|
|
8119bcdc61 | ||
|
|
b6d40f75c9 | ||
|
|
d9570e8223 | ||
|
|
3a0fc24a6a | ||
|
|
04879d0fe5 | ||
|
|
0d9b03ced2 | ||
|
|
7be7acfe30 | ||
|
|
655f7918ea | ||
|
|
67e799ccb2 | ||
|
|
4c12319d19 | ||
|
|
3769719816 | ||
|
|
cc8e4956f5 | ||
|
|
3ad67c754f | ||
|
|
cabd4198b0 | ||
|
|
2bf80673ae | ||
|
|
2182e0696d | ||
|
|
9c44b5c384 | ||
|
|
d5f51f2881 | ||
|
|
176e17c45d | ||
|
|
7912b08c41 | ||
|
|
643ffce289 | ||
|
|
0d4d740961 | ||
|
|
68473f08d6 | ||
|
|
6c09a69991 | ||
|
|
ac16bc0e15 | ||
|
|
99287a89eb | ||
|
|
e0aaf876c2 | ||
|
|
022f79beed | ||
|
|
a6aac88561 | ||
|
|
87057095bc | ||
|
|
5afa75ce51 | ||
|
|
c525598fd9 | ||
|
|
f54cfb0ea2 | ||
|
|
91fcf837f7 | ||
|
|
64e98d897f | ||
|
|
99a5fcc665 | ||
|
|
f0c38a6419 | ||
|
|
14c2747e80 | ||
|
|
3ee2a15cde | ||
|
|
8982578edd | ||
|
|
5ec6f1085a | ||
|
|
1513e46605 | ||
|
|
b95ed73e1d | ||
|
|
ff22efb3e2 | ||
|
|
35c6db1289 | ||
|
|
602e5d2766 | ||
|
|
247c4f1068 | ||
|
|
bdb5e4642f | ||
|
|
661e9b08b6 | ||
|
|
fdf6478bc9 | ||
|
|
10229cd332 | ||
|
|
33e2499006 | ||
|
|
6ae58e74c7 | ||
|
|
689b292c24 | ||
|
|
f6a4ab62b8 | ||
|
|
e197884e07 | ||
|
|
ba095d11cc | ||
|
|
e22cb5f3b3 | ||
|
|
da993ee48d | ||
|
|
9458759810 | ||
|
|
dd27a0adc7 | ||
|
|
3fd276f8a6 | ||
|
|
33f454bb75 | ||
|
|
1fd5d501b0 | ||
|
|
e4220282c8 | ||
|
|
6dec9cb831 | ||
|
|
1ad55ec263 | ||
|
|
96f5dbfccf | ||
|
|
fd2aa1f51c | ||
|
|
74137d4eab | ||
|
|
02398e319d | ||
|
|
32d6a04107 | ||
|
|
6bff374e91 | ||
|
|
18b5cb24c2 | ||
|
|
04e8ca771b | ||
|
|
174f771612 | ||
|
|
4f0a5e937b | ||
|
|
505f02fd72 | ||
|
|
a6c7ffd664 | ||
|
|
a08d52eb48 | ||
|
|
414ad602f2 | ||
|
|
e961505e0a | ||
|
|
59278a7a85 | ||
|
|
adaf6d7955 | ||
|
|
f6624bf270 | ||
|
|
cdf03228c2 | ||
|
|
1fd710e88d | ||
|
|
dc2e760b5a | ||
|
|
150bd32f97 | ||
|
|
d9fc0f1e37 | ||
|
|
e2c7e3a107 | ||
|
|
4995aa0298 | ||
|
|
54b774e481 | ||
|
|
c85095d53f | ||
|
|
8132ed52fd | ||
|
|
eb723422c1 | ||
|
|
051e5a6308 | ||
|
|
2d3e64b51a | ||
|
|
a21b25f751 | ||
|
|
1d425b1731 | ||
|
|
141630f557 | ||
|
|
9fd48bab69 | ||
|
|
f880e39838 | ||
|
|
afb66f4b8a | ||
|
|
7e09802565 | ||
|
|
a8b3833580 | ||
|
|
bf1bcaf394 | ||
|
|
7b61569d32 | ||
|
|
9c27ed8bda | ||
|
|
c9cb64ac10 | ||
|
|
4bd5122462 | ||
|
|
4dac4328e6 | ||
|
|
f7a857744f | ||
|
|
6725e7dc49 | ||
|
|
7da4ea5ecb | ||
|
|
6d5c6b2de7 | ||
|
|
ed462747bf | ||
|
|
53b37ca98f | ||
|
|
423320f235 | ||
|
|
020a8c864f | ||
|
|
69e6389369 | ||
|
|
0eaa10f578 | ||
|
|
2740dc5efa | ||
|
|
592824781c | ||
|
|
4bef0e21e7 | ||
|
|
7d7ce728ff | ||
|
|
27159cfa00 | ||
|
|
d236e37652 | ||
|
|
940559fc76 | ||
|
|
5746169aec | ||
|
|
4aa6fdeb2a | ||
|
|
77ab121c30 | ||
|
|
9558048906 | ||
|
|
b3f6426d36 | ||
|
|
d407d8aa08 | ||
|
|
8842fa209d | ||
|
|
bc252228e1 | ||
|
|
1b3cb0f184 | ||
|
|
f607c671f8 | ||
|
|
8f431cff52 | ||
|
|
6a81a7ba8e | ||
|
|
1f713ed9d1 | ||
|
|
2cb4829536 | ||
|
|
48d5110b5d | ||
|
|
68a5e2017e | ||
|
|
63c46a9aca | ||
|
|
528bec0bb1 | ||
|
|
9c79cb7766 | ||
|
|
38ac518095 | ||
|
|
7488068d50 | ||
|
|
8e207196d3 | ||
|
|
9c35db38a0 | ||
|
|
2087736649 | ||
|
|
dd75deb27f | ||
|
|
5f42a3d4db | ||
|
|
a569b723c5 | ||
|
|
ee2078f3ea | ||
|
|
12af298e33 | ||
|
|
0429f27c54 | ||
|
|
5026f51dfd | ||
|
|
80abaafcae | ||
|
|
bc651e886d | ||
|
|
ba9cfc3b26 | ||
|
|
b5bbc18c89 | ||
|
|
e35088f9e3 | ||
|
|
1c3b325633 | ||
|
|
0415701e50 | ||
|
|
cfe813fa08 | ||
|
|
f4ff336636 | ||
|
|
a4b333ceb8 | ||
|
|
f029d7c943 | ||
|
|
53bf94ce78 | ||
|
|
406e36977e | ||
|
|
98ee746ada | ||
|
|
9e0a22f771 | ||
|
|
14e62ae8d2 | ||
|
|
1162d2edd5 | ||
|
|
a84e44b2a3 | ||
|
|
cd4f278a16 | ||
|
|
c7f34e74ac | ||
|
|
00d26a6419 | ||
|
|
eb57e522aa | ||
|
|
e9230463e8 | ||
|
|
d652f144b2 | ||
|
|
e04a512c4c | ||
|
|
c276278767 | ||
|
|
2e248d1ca8 | ||
|
|
a5df55a6e7 | ||
|
|
f7e05e438e | ||
|
|
49266dce89 | ||
|
|
3a81738455 | ||
|
|
a4ff501bb1 | ||
|
|
351c131764 | ||
|
|
799fcb354b | ||
|
|
16a29659b3 | ||
|
|
55ef0f12cc | ||
|
|
925c489cf9 | ||
|
|
3f57236c19 | ||
|
|
b4dd21fc64 | ||
|
|
8278b1e79f | ||
|
|
c313f0c135 | ||
|
|
e9bfaa7d51 | ||
|
|
0ae254d6b4 | ||
|
|
bbc7b0b59b | ||
|
|
7f284d6ed5 | ||
|
|
4744f93a47 | ||
|
|
a2fe87a63a | ||
|
|
fa61e30dd5 | ||
|
|
0fb94ad3c6 | ||
|
|
33a73fb0c4 | ||
|
|
a61eeeaa03 | ||
|
|
80f6990a43 | ||
|
|
0d5f8437f5 | ||
|
|
5e968deb4e | ||
|
|
ac1ffa2efe | ||
|
|
ed2e6d16c8 | ||
|
|
dafe807888 | ||
|
|
1320706172 | ||
|
|
fb4cf9e78f | ||
|
|
8cbb8befd4 | ||
|
|
aa303df387 | ||
|
|
e42d29611c | ||
|
|
a5213f1291 | ||
|
|
875dfec570 | ||
|
|
6edde288ee | ||
|
|
a6ead18121 | ||
|
|
7245570405 | ||
|
|
38a37f1b18 | ||
|
|
5c98ab4b8f | ||
|
|
5ddb1ef76d | ||
|
|
8b320f913d | ||
|
|
8e0011d07a | ||
|
|
e50734a6fb | ||
|
|
307dae4fac | ||
|
|
d8c5f85cd2 | ||
|
|
94c95469e1 | ||
|
|
e8244f7f07 | ||
|
|
a48f48ca95 | ||
|
|
4a4e54479a | ||
|
|
86d06e0a4c | ||
|
|
9b41ae847b | ||
|
|
012cc521f5 | ||
|
|
20695548f1 | ||
|
|
d77c5123c1 | ||
|
|
c32a6837e6 | ||
|
|
c604be31e0 | ||
|
|
0a08edb6d7 | ||
|
|
4d7aeb8b96 | ||
|
|
6b09f1f233 | ||
|
|
7364c84b6b | ||
|
|
02a28d565b | ||
|
|
2ac6e31cc3 | ||
|
|
8bad4ae636 | ||
|
|
f0010ea3a8 | ||
|
|
f86bff3bf7 | ||
|
|
99b0094dcd | ||
|
|
db86a6ff1c | ||
|
|
cbc188916d | ||
|
|
2f411230c5 | ||
|
|
b9c8c877b7 | ||
|
|
13e4ba622e | ||
|
|
7863256de5 | ||
|
|
d81e029ec0 | ||
|
|
f6500eafb6 | ||
|
|
9da03f529f | ||
|
|
1e1e4fd557 | ||
|
|
08f8e659fd | ||
|
|
fc69fe1f21 | ||
|
|
38a16805ed | ||
|
|
dfd4ae9ea4 | ||
|
|
5c9585b2b0 | ||
|
|
dc2e769d9a | ||
|
|
15a4fb7adf | ||
|
|
7bb10d56f8 | ||
|
|
650282b186 | ||
|
|
ded3cfc251 | ||
|
|
a4fee3a3ad | ||
|
|
58d7404ee4 | ||
|
|
556eee8563 | ||
|
|
1422f50ee9 | ||
|
|
1be4adf365 | ||
|
|
4510ada21e | ||
|
|
e516d99b2d | ||
|
|
b534b83756 | ||
|
|
41b537249b | ||
|
|
4a87acf1ac | ||
|
|
41d3b66867 | ||
|
|
3ef7ae24e5 | ||
|
|
824d3b75f9 | ||
|
|
38a802fed3 | ||
|
|
ee776fd0de | ||
|
|
a1f29d8f4a | ||
|
|
3e42a817a1 | ||
|
|
617dd703e1 | ||
|
|
e63d7ff9d5 | ||
|
|
7e73b27edf | ||
|
|
6898b896d1 | ||
|
|
085e2c24d3 | ||
|
|
cc77eb7855 | ||
|
|
8e9f9f6f2f | ||
|
|
51006e8304 | ||
|
|
fce2bd89c7 | ||
|
|
830be3d918 | ||
|
|
0926e5a986 | ||
|
|
b61411956c | ||
|
|
5648fe940c | ||
|
|
57ad32448f | ||
|
|
b4db3c050d | ||
|
|
3f954ca790 | ||
|
|
6e0174e879 | ||
|
|
e4873f1982 | ||
|
|
3d35817a2f | ||
|
|
8c6aef3edb | ||
|
|
5fd8939b7d | ||
|
|
4c1b578b80 | ||
|
|
f6bf81d16f | ||
|
|
2d8cc57642 | ||
|
|
3b131f0231 | ||
|
|
202ce472bb | ||
|
|
7206edec2e | ||
|
|
9e86efadbc | ||
|
|
433331adac | ||
|
|
a0cd024b39 | ||
|
|
4fbb31b4dc | ||
|
|
09bcc5aaec | ||
|
|
c921c9bd12 | ||
|
|
8f621b38bf | ||
|
|
257d957dfb | ||
|
|
a0a6f0ae87 | ||
|
|
c396b60612 | ||
|
|
98a97b1eaf | ||
|
|
7d6fcc75da | ||
|
|
ecd8b7f614 | ||
|
|
cc1bcc25b9 | ||
|
|
b792276a00 | ||
|
|
b1d52ccd82 | ||
|
|
cc0e91ac2f | ||
|
|
dfac7b4261 | ||
|
|
1258eef213 | ||
|
|
f79148fa62 | ||
|
|
4d2aa29926 | ||
|
|
f016840c53 | ||
|
|
cffeec4713 | ||
|
|
fcbe4620cd | ||
|
|
5a5e0363c2 | ||
|
|
64512ee2ae | ||
|
|
ce4f2f1326 | ||
|
|
dfebb83c35 | ||
|
|
0ba226e3c2 | ||
|
|
e0f59eccf0 | ||
|
|
820e720b0a | ||
|
|
936c5f5d3d | ||
|
|
d0b3b8de44 | ||
|
|
89d53306f3 | ||
|
|
e30a20120c | ||
|
|
790d6331f8 | ||
|
|
9121ab95ea | ||
|
|
b09e5cf5a7 | ||
|
|
b53a8e873d | ||
|
|
4c38963c6f | ||
|
|
b0d6c34565 | ||
|
|
0a9c9411f0 | ||
|
|
e253f58aac | ||
|
|
0aa8ad202a | ||
|
|
7bc5a501c4 | ||
|
|
4691a38d21 | ||
|
|
00bae752d0 | ||
|
|
e253fe0547 | ||
|
|
e35d73be8f | ||
|
|
f9f7af2430 | ||
|
|
7aef780b14 | ||
|
|
5644a20eec | ||
|
|
b135431542 | ||
|
|
efdb254b12 | ||
|
|
8fd2f0ae11 | ||
|
|
3f7ee9bd2e | ||
|
|
a049c1189e | ||
|
|
9859b1555f | ||
|
|
356e47a6a3 | ||
|
|
2c1c8fc8df | ||
|
|
e7bdd4a624 | ||
|
|
1a9069e80a | ||
|
|
484861e3ee | ||
|
|
99ba0a4927 | ||
|
|
ba3ede584e | ||
|
|
dd472f489b | ||
|
|
9f0dd40b3b | ||
|
|
edc03287aa | ||
|
|
d6dc7627b9 | ||
|
|
59773ca284 | ||
|
|
6aa01ffe05 | ||
|
|
5b3de94fee | ||
|
|
b4edf122f6 | ||
|
|
1647c4deab | ||
|
|
3efb91e86d | ||
|
|
d6f73054a5 | ||
|
|
bd9b38665d | ||
|
|
de5c2b906e | ||
|
|
4a4badcdc1 | ||
|
|
fa7ebb36dc | ||
|
|
447440776b | ||
|
|
f5714f2eb0 | ||
|
|
a3b76f9259 | ||
|
|
ba71421a23 | ||
|
|
61251b305d | ||
|
|
73464d6bb6 | ||
|
|
7f7ebed4ea | ||
|
|
5c53809269 | ||
|
|
3935d5f2f7 | ||
|
|
693704a832 | ||
|
|
b17f6eee6a | ||
|
|
ccb90f46e6 | ||
|
|
dfa4cd921e | ||
|
|
32e0afd19c | ||
|
|
5fb732c0e6 | ||
|
|
48a6c4f2bf | ||
|
|
f1597386ef | ||
|
|
731d5b6872 | ||
|
|
ce569e4bc4 | ||
|
|
f48b8d6d91 | ||
|
|
4fc94a4383 | ||
|
|
c5057905b6 | ||
|
|
3c388c76c6 | ||
|
|
a730fe13c7 | ||
|
|
4520e0710d | ||
|
|
7e42892e6a | ||
|
|
a0c580298e | ||
|
|
e7ad50d243 | ||
|
|
1394d42f58 | ||
|
|
a8e95e25ad | ||
|
|
87cb4db263 | ||
|
|
2ccda44c44 | ||
|
|
0253c7bcf1 | ||
|
|
9c7b39b7a7 | ||
|
|
5f4611fce2 | ||
|
|
c4fa2e70bf | ||
|
|
15b1a22501 | ||
|
|
51425788d8 | ||
|
|
a17d5eea47 | ||
|
|
ef909e8a54 | ||
|
|
0a24e9854b | ||
|
|
4eb2eea809 | ||
|
|
8a6705617f | ||
|
|
bbe122aba5 | ||
|
|
40409df885 | ||
|
|
7fdbdae6b9 | ||
|
|
b87a18bd80 | ||
|
|
6d650a48db | ||
|
|
54ea0eac8e | ||
|
|
4054898170 | ||
|
|
8a205e1e32 | ||
|
|
39068730e2 | ||
|
|
1e344455b8 | ||
|
|
9a01f3a337 | ||
|
|
f6ea758b85 | ||
|
|
51fb82902b | ||
|
|
3c342adb67 | ||
|
|
24d592f94f | ||
|
|
181ebf024c | ||
|
|
ecf693ac75 | ||
|
|
8266266639 | ||
|
|
0f2419357c | ||
|
|
2e57123aa2 | ||
|
|
881733e099 | ||
|
|
18f778ce11 | ||
|
|
b8060a5bcc | ||
|
|
7a34b2982f | ||
|
|
f695af587a | ||
|
|
7759615775 | ||
|
|
bbad03547d | ||
|
|
b638f86b75 | ||
|
|
ab6210dc30 | ||
|
|
9ca16e3933 | ||
|
|
76ab41a742 | ||
|
|
c6f6eb294b | ||
|
|
19836a55a3 | ||
|
|
862c7fde6d | ||
|
|
5d842273d9 | ||
|
|
33a9ebaba1 | ||
|
|
192e35882a | ||
|
|
e6b9aaf499 | ||
|
|
b821660e79 | ||
|
|
0beaf47a64 | ||
|
|
8a9e9e9a11 | ||
|
|
df17244353 | ||
|
|
ffd3e17364 | ||
|
|
211a6cc4f1 | ||
|
|
4c09879aab | ||
|
|
fd526e8754 | ||
|
|
974306d4f0 | ||
|
|
56452d9fd8 | ||
|
|
6d231fecd1 | ||
|
|
2e91cf727a | ||
|
|
64b9402e12 | ||
|
|
4bae0c0139 | ||
|
|
06bc4aa50b | ||
|
|
31a7ac1e81 | ||
|
|
c75ac3ac64 | ||
|
|
3e14d8f4dd | ||
|
|
6cde31f843 | ||
|
|
a7b70008ba | ||
|
|
8cc19d908e | ||
|
|
d58cda122d | ||
|
|
ab26945eca | ||
|
|
2da1b2af1a | ||
|
|
2586129dcd | ||
|
|
13e5d77041 | ||
|
|
d036ff6c4f | ||
|
|
1f1bc393d3 | ||
|
|
9aa34e2487 | ||
|
|
0b7bffe3b5 | ||
|
|
41f248f54d | ||
|
|
bc7cabde4e | ||
|
|
65d5bba7df | ||
|
|
340a6d195f | ||
|
|
83ac168664 | ||
|
|
8ac1a67b7d | ||
|
|
abd67d0786 | ||
|
|
9a9e4cddd7 | ||
|
|
10c44b08c9 | ||
|
|
86b19f742c | ||
|
|
cb94b03e3e | ||
|
|
a898c3d7bc | ||
|
|
86be6d7897 | ||
|
|
d3d4de12be | ||
|
|
04bac321d1 | ||
|
|
1011353729 | ||
|
|
5651993d93 | ||
|
|
c51466935c | ||
|
|
454aca7003 | ||
|
|
5ff9f01aba | ||
|
|
b5dd2e605d | ||
|
|
1bfe25f1a5 | ||
|
|
bd98779b3c | ||
|
|
7862ae6d36 | ||
|
|
dfbd78f71d | ||
|
|
e132e878d6 | ||
|
|
bb78c0ea6d | ||
|
|
1a772023d5 | ||
|
|
230f90173c | ||
|
|
fbc7c28188 | ||
|
|
5d88cb7099 | ||
|
|
caae7a5879 | ||
|
|
816f37bdc5 | ||
|
|
a2dd7171a5 | ||
|
|
a80d0bc2ca | ||
|
|
2e50d11be5 | ||
|
|
a5e2caf40b | ||
|
|
82f693a2bc | ||
|
|
349baa3550 | ||
|
|
712761ab0a | ||
|
|
e620d19422 | ||
|
|
8ba161463b | ||
|
|
d93aa183f3 | ||
|
|
29ceed91f0 | ||
|
|
7f7c7f360e | ||
|
|
c77ffa0f6a | ||
|
|
5acf5f6ee3 | ||
|
|
10c2232c39 | ||
|
|
116dbfd123 | ||
|
|
ec7dce7d5b | ||
|
|
a8c8bd8113 | ||
|
|
f57dadc362 | ||
|
|
6b7c1ad6cf | ||
|
|
67359c22d5 | ||
|
|
1881f5cb39 | ||
|
|
9f3d284c68 | ||
|
|
6921fb66d5 | ||
|
|
91849e4cd1 | ||
|
|
1fcaa481be | ||
|
|
04701cd69e | ||
|
|
f59551b89e | ||
|
|
bc34d80949 | ||
|
|
7480e481fc | ||
|
|
71ed48bb76 | ||
|
|
134bf61205 | ||
|
|
85ddabd763 | ||
|
|
889c184ba3 | ||
|
|
660bc2eb21 | ||
|
|
192667d65f | ||
|
|
4896c725b6 | ||
|
|
4bcb99a6b9 | ||
|
|
535eec5366 | ||
|
|
56cd679bcd | ||
|
|
e95ae66af0 | ||
|
|
dbb342da81 | ||
|
|
958381d3dd | ||
|
|
0a165675ce | ||
|
|
ce13b6abfd | ||
|
|
804e00cc26 | ||
|
|
f79de23be5 | ||
|
|
3404dc0b75 | ||
|
|
51c9f4f988 | ||
|
|
028ecf5561 | ||
|
|
419fb08266 | ||
|
|
1a28ef3244 | ||
|
|
6b8ffb2a85 | ||
|
|
9121b14009 | ||
|
|
9b54891474 | ||
|
|
058196e42a | ||
|
|
22743e06d5 | ||
|
|
c8b818f011 | ||
|
|
df838c98e9 | ||
|
|
595eab2614 | ||
|
|
288b6ea692 | ||
|
|
7db606857d | ||
|
|
746034a4fc | ||
|
|
f8ec95d872 | ||
|
|
ba082b74a7 | ||
|
|
ab981ce15a | ||
|
|
e143936a82 | ||
|
|
497cde7e92 | ||
|
|
948faf6cf9 | ||
|
|
56f199bd69 | ||
|
|
9e1f68d9eb | ||
|
|
7a9011c7e1 | ||
|
|
224a6c1e7c | ||
|
|
c89fe8bdbc | ||
|
|
cce9c2225e | ||
|
|
bdbc157c30 | ||
|
|
11eebfb78d | ||
|
|
4beadcc4f3 | ||
|
|
e062c8c6f2 | ||
|
|
f4709ce1f0 | ||
|
|
50e129bd8f | ||
|
|
f402dbd1e3 | ||
|
|
55af8b4cb4 | ||
|
|
005b587588 | ||
|
|
de4463d9a8 | ||
|
|
b3d577c937 | ||
|
|
51576018fd | ||
|
|
1b4f210d82 | ||
|
|
612bfd3acc | ||
|
|
4972c94aed | ||
|
|
642d77bb91 | ||
|
|
88270a7b66 | ||
|
|
29e0d37009 | ||
|
|
9c339367ad | ||
|
|
f69715d999 | ||
|
|
79990cbb27 | ||
|
|
a02be54421 | ||
|
|
20127f6a2a | ||
|
|
02a132a9d7 | ||
|
|
7c95c5e80a | ||
|
|
c0bc5657ea | ||
|
|
dfec166704 | ||
|
|
32f223c683 | ||
|
|
722eac1681 | ||
|
|
6bcbb6f7bb | ||
|
|
d266a0c0ce | ||
|
|
acf82af0bf | ||
|
|
98956056e3 | ||
|
|
ae0bb54b2d | ||
|
|
255da0a0d7 | ||
|
|
c0e8cc0254 | ||
|
|
41cec24644 | ||
|
|
2ecdedd5b4 | ||
|
|
358477c31b | ||
|
|
c1948f10a2 | ||
|
|
d33c487b29 | ||
|
|
b309b507eb | ||
|
|
daa8428b32 | ||
|
|
0529df7632 | ||
|
|
fc31fb9eba | ||
|
|
54436e341a | ||
|
|
fc35ac4d67 | ||
|
|
28a0b6f901 | ||
|
|
1b8f2c2adb | ||
|
|
6c8988ab69 | ||
|
|
e3c600a681 | ||
|
|
979e0de659 | ||
|
|
a76c10416d | ||
|
|
1276bf8c72 | ||
|
|
9ef5c5d639 | ||
|
|
69f51896c9 | ||
|
|
5f845aa6f8 | ||
|
|
87c610beaa | ||
|
|
3a331ec156 | ||
|
|
6c5ac490ab | ||
|
|
50b9840db1 | ||
|
|
41e884a1d2 | ||
|
|
15841b191d | ||
|
|
65514d89ad | ||
|
|
c6f8896826 | ||
|
|
882d84f1e6 | ||
|
|
0eba3a3678 | ||
|
|
756b28c3ab | ||
|
|
d78ebc40ae | ||
|
|
58aea21b82 | ||
|
|
c2b1d61dd1 | ||
|
|
f4d72dba06 | ||
|
|
31e81d7be2 | ||
|
|
6c9123beee | ||
|
|
0fa0397da2 | ||
|
|
b652fc7e1a | ||
|
|
c42fea0d3d | ||
|
|
48a56a848a | ||
|
|
d6937baa8e | ||
|
|
3490f8acb5 | ||
|
|
46ace7e8e8 | ||
|
|
698956e130 | ||
|
|
b25cd39953 | ||
|
|
de4f5eb2ca | ||
|
|
ccc5fa3981 | ||
|
|
b899a19184 | ||
|
|
6af7fac344 | ||
|
|
49ef2b4d54 | ||
|
|
fcc09a7375 | ||
|
|
8e9ad4df97 | ||
|
|
4dfcfd2542 | ||
|
|
12081c9bd6 | ||
|
|
abee7fdfa2 | ||
|
|
ca0bc0632b | ||
|
|
e465750cd2 | ||
|
|
934b08f720 | ||
|
|
78cc98840b | ||
|
|
d4cd7a120f | ||
|
|
4b6c91bbf1 | ||
|
|
e3be2b4451 | ||
|
|
c6ff845ecb | ||
|
|
846bde35ff | ||
|
|
69990ae226 | ||
|
|
415fc81577 | ||
|
|
b675566e23 | ||
|
|
190da0dcd4 | ||
|
|
5c40f93ca3 | ||
|
|
879c1e4992 | ||
|
|
311334c9e1 | ||
|
|
dc5268b0c0 | ||
|
|
d77ace6dc3 | ||
|
|
f0b3c1a9ab | ||
|
|
9efb73f592 | ||
|
|
569b4b29aa | ||
|
|
a61bde5b78 | ||
|
|
542dd67892 | ||
|
|
172eca6081 | ||
|
|
004aaed783 | ||
|
|
a1b15df648 | ||
|
|
b5d5bef678 | ||
|
|
421df0dff3 | ||
|
|
5b5e29cb7b | ||
|
|
db67ae12ec | ||
|
|
7dfd7ad5b9 | ||
|
|
ca5fa9e84d | ||
|
|
1afcfa4406 | ||
|
|
95b1455b62 | ||
|
|
d825937411 | ||
|
|
ee182df533 | ||
|
|
14651d8ea8 | ||
|
|
7e4ed7c1a9 | ||
|
|
13fe88c03f | ||
|
|
7b80a780c7 | ||
|
|
2b465bdf82 | ||
|
|
6d52119597 | ||
|
|
b75041173c | ||
|
|
23eba0a029 | ||
|
|
566781cab2 | ||
|
|
0ea1fc5602 | ||
|
|
2ce9e09e8b | ||
|
|
6cab7ceb0f | ||
|
|
8ae7d8aa07 | ||
|
|
ce6ccef2d0 | ||
|
|
2c6d880542 | ||
|
|
bf89287c56 | ||
|
|
df176dfe8a | ||
|
|
141a32d388 | ||
|
|
37786b76ed | ||
|
|
02b920f259 | ||
|
|
31e25f88a0 | ||
|
|
231c8a468e | ||
|
|
ae346f564f | ||
|
|
fcc0608cf2 | ||
|
|
641cd63462 | ||
|
|
0b907a3efa | ||
|
|
ce180cf2bf | ||
|
|
d97276404c | ||
|
|
d5a9b4344b | ||
|
|
e317fdfa3d | ||
|
|
150ea2639a | ||
|
|
a551348b40 | ||
|
|
3429b5d661 | ||
|
|
c8314b215b | ||
|
|
5929f7d23b | ||
|
|
85a7df3d27 | ||
|
|
e6c5a0e848 | ||
|
|
92dee72b10 | ||
|
|
4d6e57a5e6 | ||
|
|
936a1c2764 | ||
|
|
a08a3c6096 | ||
|
|
82be40eace | ||
|
|
20ba0bd1dc | ||
|
|
75ce6b82e8 | ||
|
|
9749ac56ba | ||
|
|
746f9bb778 | ||
|
|
f2dae588aa | ||
|
|
9f3f0a76aa | ||
|
|
30f28a51ca | ||
|
|
3e22344782 | ||
|
|
0b20d89d62 | ||
|
|
80d892c744 | ||
|
|
53326bef33 | ||
|
|
f05a5a3abb | ||
|
|
8581be4977 | ||
|
|
0e8277ba9e | ||
|
|
3cc2f83912 | ||
|
|
177034a498 | ||
|
|
f4d06e5183 | ||
|
|
637a6b5f7e | ||
|
|
75445b8b98 | ||
|
|
f96de55ac7 | ||
|
|
c4d4af3b5a | ||
|
|
5dfee44340 | ||
|
|
99f5857d84 | ||
|
|
520f7c6812 | ||
|
|
63d493aa1f | ||
|
|
38ab42f855 | ||
|
|
bc3771f3af | ||
|
|
9d90af409b | ||
|
|
20183bbd57 | ||
|
|
1d8efe1cf8 | ||
|
|
23354d413f | ||
|
|
715f03f5f1 | ||
|
|
ff6bbaed19 | ||
|
|
f82cbbab1c | ||
|
|
5a1b526b6c | ||
|
|
1ef92c87fb | ||
|
|
0aef515522 | ||
|
|
9b5c97666a | ||
|
|
a55d822f9a | ||
|
|
5b2bde6e0d | ||
|
|
020c5b27dc | ||
|
|
65457208e5 | ||
|
|
6eb1b98975 | ||
|
|
a927bab6b3 | ||
|
|
48e3e3e8cb | ||
|
|
b5d095401d | ||
|
|
b3e58d4794 | ||
|
|
79b064320e | ||
|
|
335b8326ee | ||
|
|
e777020e44 | ||
|
|
745d97ebe1 | ||
|
|
bb06d98a43 | ||
|
|
3500b0016c | ||
|
|
7ec916b777 | ||
|
|
3c71f79929 | ||
|
|
a83e70104c | ||
|
|
85af554bac | ||
|
|
885722afde | ||
|
|
b2f094da01 | ||
|
|
1e85ec6758 | ||
|
|
c8974aac3e | ||
|
|
ad318c04e5 | ||
|
|
db73e48206 | ||
|
|
d13972e0b8 | ||
|
|
df74b2bfcb | ||
|
|
b94b75726d | ||
|
|
9a2d38acff | ||
|
|
537f8f401e | ||
|
|
04f1a799dc | ||
|
|
74adb2f540 | ||
|
|
a129a2509f | ||
|
|
cc0b8e9d10 | ||
|
|
af8fcf234f | ||
|
|
e0dc2daf54 | ||
|
|
c066e655dc | ||
|
|
2698e6f0ea | ||
|
|
63902bde9c | ||
|
|
c876004fb2 | ||
|
|
633f37bfb6 | ||
|
|
d70bc74dc8 | ||
|
|
d7a4524e70 | ||
|
|
fe1e27fd40 | ||
|
|
8a7a099073 | ||
|
|
1b53b5f9eb | ||
|
|
8b758ee25a | ||
|
|
81c24a8478 | ||
|
|
a6f3e0b6af | ||
|
|
6e9e8127b6 | ||
|
|
63d43275d3 | ||
|
|
cb2bf7f8fa | ||
|
|
1fae760ccd | ||
|
|
4195c4c4bf | ||
|
|
13e7a1ed93 | ||
|
|
ea4357ca98 | ||
|
|
5e8255d24d | ||
|
|
003d6ec43f | ||
|
|
9749ff7c67 | ||
|
|
c88589e0e5 | ||
|
|
32ef1bb7a5 | ||
|
|
206c65904f | ||
|
|
219d4688e4 | ||
|
|
adc687f0a0 | ||
|
|
88e59c9a5a | ||
|
|
71a89a575f | ||
|
|
e3dc8dfcf4 | ||
|
|
2dd77d5bc7 | ||
|
|
0192226bb3 | ||
|
|
faf2658da2 | ||
|
|
9a1c00d2dc | ||
|
|
4a8695caff | ||
|
|
b28016bfeb | ||
|
|
4758a9e66d | ||
|
|
97bd1ef4ec | ||
|
|
2adac8bdae | ||
|
|
3c56914822 | ||
|
|
c5cc907838 | ||
|
|
0907aabacd | ||
|
|
f4290bda7f | ||
|
|
4bdb82a7a2 | ||
|
|
6a696dde3a | ||
|
|
8481684a82 | ||
|
|
03aa8b3356 | ||
|
|
64bfed2640 | ||
|
|
2edcc89303 | ||
|
|
18313f2e90 | ||
|
|
0ff96418bd | ||
|
|
1480abf0e8 | ||
|
|
e7ba75d533 | ||
|
|
044291d940 | ||
|
|
ad62efcb9e | ||
|
|
0dc59d9481 | ||
|
|
11ab3034b1 | ||
|
|
c594bda77f | ||
|
|
8218b74fb3 | ||
|
|
3d0beb1a2e | ||
|
|
515cfd48d8 | ||
|
|
1448bab5b3 | ||
|
|
2884f8acb8 | ||
|
|
075cae4efb | ||
|
|
d2b98323dd | ||
|
|
b1a81a85b1 | ||
|
|
668384649a | ||
|
|
a7252b1a7f | ||
|
|
a4e58e4d55 | ||
|
|
4241e01364 | ||
|
|
d7d7952138 | ||
|
|
9cc2253339 | ||
|
|
6831802590 | ||
|
|
9d79cc7e87 | ||
|
|
763b003a11 | ||
|
|
d560e2a558 | ||
|
|
f914f080b1 | ||
|
|
600a4e86e1 | ||
|
|
e7b4ada65f | ||
|
|
95f31be096 | ||
|
|
ad6db7eaae | ||
|
|
d7a99c6618 | ||
|
|
f20d8f5cc0 | ||
|
|
8930e6b393 | ||
|
|
f26886acb0 | ||
|
|
820ab8d486 | ||
|
|
8e425fb358 | ||
|
|
6006f499ac | ||
|
|
3caa740fc4 | ||
|
|
007ea9ea20 | ||
|
|
5d248d261d | ||
|
|
26908cba64 | ||
|
|
18d118746e | ||
|
|
9a633f5f2e | ||
|
|
5aa44e98d5 | ||
|
|
33916fa975 | ||
|
|
eab18df403 | ||
|
|
002caceb05 | ||
|
|
c250aa804a | ||
|
|
94ca50883f | ||
|
|
462c482873 | ||
|
|
e28e04a990 | ||
|
|
6438385d64 | ||
|
|
bfb08ce003 | ||
|
|
3590a06f40 | ||
|
|
23ca6c5e10 | ||
|
|
1aea5bcd50 | ||
|
|
82c5d8ed28 | ||
|
|
5dcd58a75f | ||
|
|
dc605a4ee1 | ||
|
|
fec940ab8b | ||
|
|
05fd7cecf4 | ||
|
|
2f52730b48 | ||
|
|
4c1819c7dd | ||
|
|
c58c0df30e | ||
|
|
c5902b3144 | ||
|
|
519eb424e7 | ||
|
|
03478afea4 | ||
|
|
306ef8addf | ||
|
|
d4659b261d | ||
|
|
69ce41807a | ||
|
|
cc81da5aa4 | ||
|
|
eee714f52b | ||
|
|
c976b637d8 | ||
|
|
ea93515d53 | ||
|
|
652499bdcf | ||
|
|
819862199a | ||
|
|
6c1bc1d7bb | ||
|
|
36ebe76e0a | ||
|
|
8f8d35dec7 | ||
|
|
ac1e436339 | ||
|
|
78d4812b0e | ||
|
|
6a1b7626e3 | ||
|
|
b6ccb4c96f | ||
|
|
9712ac550c | ||
|
|
5b173766c6 | ||
|
|
b535c4f321 | ||
|
|
56c5ebcb71 | ||
|
|
028234ba86 | ||
|
|
f063b4d231 | ||
|
|
508f27cc32 | ||
|
|
d4783170e5 | ||
|
|
51e459b386 | ||
|
|
1253d254af | ||
|
|
5e70574396 | ||
|
|
b5dce2f74b | ||
|
|
6113da3e68 | ||
|
|
faf6406289 | ||
|
|
7c443431d9 | ||
|
|
0f201e3fd8 | ||
|
|
bf96c30187 | ||
|
|
eb1b7b914a | ||
|
|
135bc2de52 | ||
|
|
ab2269717d | ||
|
|
b5a42cfa75 | ||
|
|
6693416d0a | ||
|
|
9cdf013933 | ||
|
|
1dfaa30520 | ||
|
|
d898fcee75 | ||
|
|
1e647a2058 | ||
|
|
10e379d862 | ||
|
|
ee456493c4 | ||
|
|
69e9c7d0be | ||
|
|
adce718d63 | ||
|
|
3a94a65f12 | ||
|
|
bbe30db1b7 | ||
|
|
68f3c43805 | ||
|
|
3c99ecda60 | ||
|
|
b1366696c4 | ||
|
|
534aeb4065 | ||
|
|
cc77a36dd9 | ||
|
|
5991068fdf | ||
|
|
913778d5ab | ||
|
|
9a8345d4f9 | ||
|
|
ba9bd3bc76 | ||
|
|
aad0070b77 | ||
|
|
d192e69811 | ||
|
|
ec8d919b93 | ||
|
|
4ce4f1d758 | ||
|
|
3aa40d4df6 | ||
|
|
ec1be41b62 | ||
|
|
c15d81545a | ||
|
|
1af8b9d16a | ||
|
|
d860cf834d | ||
|
|
63d5a3acbc | ||
|
|
132aacee89 | ||
|
|
973038da6a | ||
|
|
584da3c39b | ||
|
|
73c4829255 | ||
|
|
68942f7ec4 | ||
|
|
e914b83a1b | ||
|
|
2268376360 | ||
|
|
6bb3b9a684 | ||
|
|
9f213c119c | ||
|
|
f081e2b799 | ||
|
|
a024152c12 | ||
|
|
42d23dbc70 | ||
|
|
74786e8a25 | ||
|
|
eeb4ede60d | ||
|
|
f2eee8896c | ||
|
|
bf4a70d91c | ||
|
|
a35ab3937a | ||
|
|
5ef9a4be8a | ||
|
|
d76d7582fe | ||
|
|
44006142c7 | ||
|
|
6840b2cfe5 | ||
|
|
5613f60403 | ||
|
|
76d3959f1a | ||
|
|
b681759000 | ||
|
|
d6336c4302 | ||
|
|
35b161450a | ||
|
|
861aaf06c6 | ||
|
|
a910884e7d | ||
|
|
0e7bef9014 | ||
|
|
d942189bc6 | ||
|
|
eb16051b1e | ||
|
|
7749a7e41d | ||
|
|
dc4cef17d4 | ||
|
|
89ed40e4a4 | ||
|
|
10ee74d872 | ||
|
|
474ae1e91c | ||
|
|
0dc70ca5f3 | ||
|
|
633b1663ca | ||
|
|
153fe61b4b | ||
|
|
9734fd0353 | ||
|
|
6209c120c0 | ||
|
|
3516881e7a | ||
|
|
15398555b3 | ||
|
|
cb132fcbf4 | ||
|
|
f42f46c7d6 | ||
|
|
f1046f1cf1 | ||
|
|
4a62287139 | ||
|
|
69cd56357f | ||
|
|
b66a886682 | ||
|
|
249504b7d6 | ||
|
|
fa0086404d | ||
|
|
f243ebba91 | ||
|
|
540afb193b | ||
|
|
8294acdf1c | ||
|
|
7733d02938 | ||
|
|
9b6342e7fa | ||
|
|
22c09cb31b | ||
|
|
21e79cb54a | ||
|
|
b8cc829f4a | ||
|
|
ace0dacf15 | ||
|
|
5ca13098e3 | ||
|
|
07b13eedec | ||
|
|
d9168ed9ec | ||
|
|
fb4e2c167c | ||
|
|
10ee3585f6 | ||
|
|
5d4ba820dd | ||
|
|
a51e00e69f | ||
|
|
4dfa963851 | ||
|
|
f2d4f6ccf6 | ||
|
|
182cb8ab25 | ||
|
|
ece341d868 | ||
|
|
d72e8c2687 | ||
|
|
b0ff6f4c7b | ||
|
|
6ec5249492 | ||
|
|
c44cd76c5a | ||
|
|
37f711d72a | ||
|
|
fcf18fb965 | ||
|
|
2efd6250fb | ||
|
|
1b4bd8523d | ||
|
|
60c44910df | ||
|
|
faf67fae03 | ||
|
|
e95f547950 | ||
|
|
96b663b783 | ||
|
|
ce44f7e4b0 | ||
|
|
16a9c7d492 | ||
|
|
fc369c3448 | ||
|
|
b1a33edf0f | ||
|
|
3b805f1a24 | ||
|
|
954b4d8075 | ||
|
|
d073e2a881 | ||
|
|
044dd2af94 | ||
|
|
ee489fa8c0 | ||
|
|
035ed5f49b | ||
|
|
7dcd690f61 | ||
|
|
1c9290aded | ||
|
|
0b922b1ed1 | ||
|
|
34eec362e5 | ||
|
|
b829383864 | ||
|
|
3960235428 | ||
|
|
e91a662491 | ||
|
|
ba4da24984 | ||
|
|
70378432b7 | ||
|
|
6b63009b14 | ||
|
|
dd45fea732 | ||
|
|
ee09425cfb | ||
|
|
af02a1e024 | ||
|
|
2a86f0776c | ||
|
|
c6f73d9df8 | ||
|
|
5ab79f292b | ||
|
|
82c7a22d27 | ||
|
|
35fa977981 | ||
|
|
ecbc46a91d | ||
|
|
d2f6416e45 | ||
|
|
97a885a05c | ||
|
|
aa1edd6b94 | ||
|
|
083e401717 | ||
|
|
bdeca2edce | ||
|
|
c84e14db46 | ||
|
|
919c5bd0b3 | ||
|
|
af8a8f1e3f | ||
|
|
41d08e123f | ||
|
|
67d9656e35 | ||
|
|
1a58a70494 | ||
|
|
a477b2efd1 | ||
|
|
59c4546b8c | ||
|
|
ed1a75ef4c | ||
|
|
0cd942f152 | ||
|
|
fe7f082083 | ||
|
|
849fd71f76 | ||
|
|
4e3a72388d | ||
|
|
29e3d9eff5 | ||
|
|
64280f4285 | ||
|
|
98c6eaac3b | ||
|
|
22d965c66c | ||
|
|
2eb932ebc1 | ||
|
|
2ee0634db3 | ||
|
|
db3b6a1252 | ||
|
|
24810aeca3 | ||
|
|
c888319f22 | ||
|
|
13ee78a9c9 | ||
|
|
acaa07cf7c | ||
|
|
1a3c9939e8 | ||
|
|
56afe21022 | ||
|
|
b58bfa82e6 | ||
|
|
a6257b5901 | ||
|
|
16ad7e53ff | ||
|
|
3e4e4f2664 | ||
|
|
dc0c4fe8fb | ||
|
|
0c050bb266 | ||
|
|
47a5b227cc | ||
|
|
ed61d0c591 | ||
|
|
8ff856ecf8 | ||
|
|
93a607bea0 | ||
|
|
7bec7ba49d | ||
|
|
4c8f3bd392 | ||
|
|
74ba9eb159 | ||
|
|
d28ca4eda7 | ||
|
|
9563b5a7df | ||
|
|
d3a049c6e0 | ||
|
|
a52a3eb42f | ||
|
|
c54b21a754 | ||
|
|
cc8995cd5c | ||
|
|
2e222fbae2 | ||
|
|
cdf3b15336 | ||
|
|
a9a95de02d | ||
|
|
d4bcd4ab0c | ||
|
|
3b2ed06864 | ||
|
|
ab210b3988 | ||
|
|
70617be903 | ||
|
|
f039d5bbcb | ||
|
|
e0adb3cf9a | ||
|
|
4dd6e07b8d | ||
|
|
d69b7951e0 | ||
|
|
d915ece2e7 | ||
|
|
f1be3df112 | ||
|
|
29b7ca4c25 | ||
|
|
f478d916aa | ||
|
|
d2e50b09db | ||
|
|
23c2dd33f2 | ||
|
|
ce0c3c935c | ||
|
|
bdbafb7a2a | ||
|
|
edffe2a6fc | ||
|
|
cd69a53406 | ||
|
|
439ffa5849 | ||
|
|
4518c30cbe | ||
|
|
6683809447 | ||
|
|
cccd43a16b | ||
|
|
91d44147bb | ||
|
|
777311bbf5 | ||
|
|
9ded5dc78d | ||
|
|
5b81c4573c | ||
|
|
32b2e9f6cf | ||
|
|
a6dba44561 | ||
|
|
03fc317a3f | ||
|
|
00a8130201 | ||
|
|
74fc15cccd | ||
|
|
1d4d919f6d | ||
|
|
1826cc8870 | ||
|
|
8a6dab03c4 | ||
|
|
dffad444c3 | ||
|
|
d6f1b164f7 | ||
|
|
4011f054d6 | ||
|
|
14e9978359 | ||
|
|
98535638a2 | ||
|
|
8861c04e77 | ||
|
|
42b6f320d8 | ||
|
|
31b4a9197f | ||
|
|
f06c9d5b9b | ||
|
|
130fafd7c2 | ||
|
|
e76f79cd56 | ||
|
|
ba21718cb9 | ||
|
|
6dfb2997cb | ||
|
|
ae9ac3b439 | ||
|
|
d70b5a9886 | ||
|
|
fb2a20201c | ||
|
|
d1761558b4 | ||
|
|
5bd0a53edd | ||
|
|
53ea73238a | ||
|
|
28560cb887 | ||
|
|
0bcd12aa4e | ||
|
|
a7dfdebed6 | ||
|
|
aca07530aa | ||
|
|
c0110c6bab | ||
|
|
0ef9e0fa75 | ||
|
|
ba0751917d | ||
|
|
e3c1bfbcba | ||
|
|
5aaa0a7b5f | ||
|
|
2ca75970c0 | ||
|
|
d9c92288be | ||
|
|
e4f231502a | ||
|
|
04a61e6fd6 | ||
|
|
dc5c7d2ee8 | ||
|
|
87ac6812a3 | ||
|
|
8d4d2d62c1 | ||
|
|
68fc036b7a | ||
|
|
f053c4d532 | ||
|
|
06e4a2dbde | ||
|
|
9e0ecab0c1 | ||
|
|
996e61a383 | ||
|
|
309aa4a3f3 | ||
|
|
0906fbf995 | ||
|
|
2348ec40ee | ||
|
|
c6852f4b96 | ||
|
|
8b01139738 | ||
|
|
5ea3717152 | ||
|
|
d01a673adb | ||
|
|
571ec44c33 | ||
|
|
e5a3c12026 | ||
|
|
bb2f1aa4be | ||
|
|
59070bcd5b | ||
|
|
2f52dd88a9 | ||
|
|
79fec3ac40 | ||
|
|
6247bbf4b1 | ||
|
|
11de155432 | ||
|
|
bfe833c132 | ||
|
|
1fd1da72f4 | ||
|
|
f4c994d182 | ||
|
|
d81a6e6e89 | ||
|
|
fab5daacf8 | ||
|
|
b714c6b746 | ||
|
|
af1355a94e | ||
|
|
ebc08fd6f5 | ||
|
|
30b1445195 | ||
|
|
0d1c7a1414 | ||
|
|
7e8e7757f4 | ||
|
|
42eb180b6c | ||
|
|
dff35bc9b7 | ||
|
|
6a87ed2853 | ||
|
|
1266d49c65 | ||
|
|
c8b130b232 | ||
|
|
67a6b0f383 | ||
|
|
e7c176f904 | ||
|
|
4cc8363b5f | ||
|
|
93193d7e76 | ||
|
|
d68321ac27 | ||
|
|
b2e8359d31 | ||
|
|
a302ca3d6c | ||
|
|
670358f235 | ||
|
|
10e329f762 | ||
|
|
6a3c1bdb99 | ||
|
|
90923c965b | ||
|
|
d555241d03 | ||
|
|
3d2b6b7620 | ||
|
|
0b943b418c | ||
|
|
db12aaad11 | ||
|
|
860aa65d10 | ||
|
|
2e5e279a14 | ||
|
|
df87b9ff56 | ||
|
|
6c06ff3ca0 | ||
|
|
40d6e9c841 | ||
|
|
6a4f06f325 | ||
|
|
f7d306cb02 | ||
|
|
34bc182c22 | ||
|
|
3f8dd7e658 | ||
|
|
46341fea96 | ||
|
|
4319cdbba1 | ||
|
|
3453236830 | ||
|
|
fa2058ec77 | ||
|
|
7f823fe2a8 | ||
|
|
58e14705b5 | ||
|
|
99b7613206 | ||
|
|
545e614c04 | ||
|
|
5ea04a388d | ||
|
|
8922372f4b | ||
|
|
ceaa2c1619 | ||
|
|
4e73daab79 | ||
|
|
5b29d987c8 | ||
|
|
1cd53c051d | ||
|
|
5460d0030f | ||
|
|
d14a0ce592 | ||
|
|
a4000a3286 | ||
|
|
85fd650f5c | ||
|
|
b19033a375 | ||
|
|
33e19ce9f6 | ||
|
|
d21218fd57 | ||
|
|
9f2279c675 | ||
|
|
06bfbfaff4 | ||
|
|
562834e0d0 | ||
|
|
bdf2285f14 | ||
|
|
1780682a8d | ||
|
|
9b48bd27dd | ||
|
|
0b1e2a6107 | ||
|
|
c78edf3fff | ||
|
|
6fcd99c6da | ||
|
|
b42f3a5400 | ||
|
|
bb543920a6 | ||
|
|
0845758023 | ||
|
|
816f81260a | ||
|
|
a9583f4440 | ||
|
|
4e52c9cc65 | ||
|
|
8299dded0b | ||
|
|
5d83cafc50 | ||
|
|
9819e60aae | ||
|
|
1182eb4a9f | ||
|
|
48a0986c14 | ||
|
|
6c2f7046d1 | ||
|
|
9735bffae5 | ||
|
|
56a11910db | ||
|
|
70b00dc4e3 | ||
|
|
56c1bf01a4 | ||
|
|
022b295aaa | ||
|
|
fd977895ab | ||
|
|
ad1f3ddbad | ||
|
|
c8b159e38c | ||
|
|
7405e3c12a | ||
|
|
1b8ca164c9 | ||
|
|
74cdaa9fcb | ||
|
|
0ba331485a | ||
|
|
f5b3c0affc | ||
|
|
316ae0c785 | ||
|
|
c2d2fa2579 | ||
|
|
d683eb2dd1 | ||
|
|
470d35e96c | ||
|
|
7464d82243 | ||
|
|
c61fed32db | ||
|
|
c4cdec5531 | ||
|
|
3ad9d38063 | ||
|
|
f8b95abf0c | ||
|
|
579794666a | ||
|
|
2ef25b6338 | ||
|
|
faddd94518 | ||
|
|
cd5f9b8bd4 | ||
|
|
94fd20e864 | ||
|
|
3558eef66b | ||
|
|
ee66e2154d | ||
|
|
5500a86f0b | ||
|
|
9b1c1774cd | ||
|
|
a8e31469c5 | ||
|
|
b70bafaf51 | ||
|
|
d393349b4d | ||
|
|
0904724694 | ||
|
|
eff4825000 | ||
|
|
091c00229a | ||
|
|
126f0d6036 | ||
|
|
f99bc6d8f9 | ||
|
|
3da0117838 | ||
|
|
3d8cf6a90b | ||
|
|
ac44663f04 | ||
|
|
57113b21ed | ||
|
|
57d5ace61c | ||
|
|
f4da80e7c6 | ||
|
|
df3ca5c7c8 | ||
|
|
4b676df37f | ||
|
|
5dc04266ea | ||
|
|
dbcfe3f5d2 | ||
|
|
fdbec5b0d2 | ||
|
|
3ea129b4f8 | ||
|
|
48a7e40520 | ||
|
|
08b956cf88 | ||
|
|
93b1e1f5ac | ||
|
|
bdecf6baf5 | ||
|
|
4528311d77 | ||
|
|
0bc1761dae | ||
|
|
f690b0edf6 | ||
|
|
10851772af | ||
|
|
66e7b28195 | ||
|
|
76021fb582 | ||
|
|
db50adbd9f | ||
|
|
5c7cc146a1 | ||
|
|
fa3b384c6f | ||
|
|
3f9a878b03 | ||
|
|
ab3b972185 | ||
|
|
fb9118a044 | ||
|
|
5cce5b6707 | ||
|
|
3256c9b3f5 | ||
|
|
8b43b2b69d | ||
|
|
02a862684d | ||
|
|
c15f5b5106 | ||
|
|
0f06d51065 | ||
|
|
8abfa419e8 | ||
|
|
c3c90ab78b | ||
|
|
666be21f59 | ||
|
|
0fe8197100 | ||
|
|
d8a7a7792a | ||
|
|
82b9a0c949 | ||
|
|
a3083d2990 | ||
|
|
3c62914304 | ||
|
|
a094768469 | ||
|
|
3965f063d3 | ||
|
|
2b7c295bf1 | ||
|
|
2fd297c1e1 | ||
|
|
263c04aeb2 | ||
|
|
8f2b5e195e | ||
|
|
7e3dd2b8cc | ||
|
|
49c027537e | ||
|
|
a1a6095295 | ||
|
|
5f7dcc9b78 | ||
|
|
1705bf4f3c | ||
|
|
8612946bf5 | ||
|
|
7cf40576dd | ||
|
|
239f35d830 | ||
|
|
05ff42b767 | ||
|
|
7bab4817f2 | ||
|
|
0d87b7d720 | ||
|
|
6b72adbeee | ||
|
|
db97ae46e5 | ||
|
|
fc6c084693 | ||
|
|
9e01cc5705 | ||
|
|
f9ce45c058 | ||
|
|
056ff4b6ea | ||
|
|
52653f73b9 | ||
|
|
a06207b814 | ||
|
|
3b3ef411a4 | ||
|
|
6418f78fdb | ||
|
|
5d4187bf03 | ||
|
|
cfffad73eb | ||
|
|
ef7db87b82 | ||
|
|
212eea9cf5 | ||
|
|
da792cc272 | ||
|
|
2ae2142b35 | ||
|
|
a00f5f308a | ||
|
|
81cfde12f3 | ||
|
|
1a53d38dae | ||
|
|
b834fdbc5e | ||
|
|
1cb2db03ed | ||
|
|
57bca50ed0 | ||
|
|
94386583e2 | ||
|
|
b1ab63d549 | ||
|
|
ad56bdd354 | ||
|
|
65e30c13e2 | ||
|
|
0c54fac651 | ||
|
|
9660c22a9f | ||
|
|
31e8df4a59 | ||
|
|
8e6ecaf8d4 | ||
|
|
4d69a0ce29 | ||
|
|
1b842f86ca | ||
|
|
a2330fb630 | ||
|
|
30f0232d71 | ||
|
|
404e658a5d | ||
|
|
f5682397c2 | ||
|
|
4896810258 | ||
|
|
dd0de8b6e1 | ||
|
|
2a9f9f7ebd | ||
|
|
2f3afd3637 | ||
|
|
f0a2c88fdc | ||
|
|
c3a5b12cd3 | ||
|
|
d7b0e66270 | ||
|
|
1871ed5441 | ||
|
|
5ea6948127 | ||
|
|
9bd77d36f1 | ||
|
|
3ffa6cd1ac | ||
|
|
ad87df3168 | ||
|
|
8bd0d32fd2 | ||
|
|
f182675a6e | ||
|
|
56ce89e04f | ||
|
|
062ec036f8 | ||
|
|
8089242b2f | ||
|
|
8efa1a0032 | ||
|
|
7ce8304ce6 | ||
|
|
233adab647 | ||
|
|
475c86d100 | ||
|
|
f754654dae | ||
|
|
53ce20c0df | ||
|
|
ad91e3a344 | ||
|
|
4f2b33f80f | ||
|
|
2b24d42f8d | ||
|
|
ab70f306cd | ||
|
|
4fb83fe0a5 | ||
|
|
9c6ef34270 | ||
|
|
481eb8e5dc | ||
|
|
7cf65b899b | ||
|
|
dd70fcb9bc | ||
|
|
6dd8c05533 | ||
|
|
0b900d94f7 | ||
|
|
cf724c43cb | ||
|
|
cdf5ac4fc4 | ||
|
|
b768ce4ca4 | ||
|
|
0115503af9 | ||
|
|
08dd30c5bf | ||
|
|
72270013c8 | ||
|
|
a2a59cbeae | ||
|
|
20a38d2dbe | ||
|
|
9aade0a2da | ||
|
|
9af1d1af52 | ||
|
|
8bb69cd6da | ||
|
|
84a84a1687 | ||
|
|
462c43434b | ||
|
|
b830691611 | ||
|
|
204f1747cf | ||
|
|
13c9d80a3b | ||
|
|
64f45b061b | ||
|
|
c1202fd127 | ||
|
|
2060f3f59a | ||
|
|
1fb92df2e7 | ||
|
|
848301bf70 | ||
|
|
08b5b71fcb | ||
|
|
5414d4a9e4 | ||
|
|
b930bd7326 | ||
|
|
d1d1be49ba | ||
|
|
6ad7963347 | ||
|
|
2dcda2487a | ||
|
|
55911eac7a | ||
|
|
176b109ae7 | ||
|
|
0f12d43a59 | ||
|
|
6dfc2aca4b | ||
|
|
f5a34d5191 | ||
|
|
bc3a7f70e4 | ||
|
|
dcabee8d5e | ||
|
|
d7e290dc68 | ||
|
|
2e2341c8b2 | ||
|
|
0ee717342b | ||
|
|
9f372b3146 | ||
|
|
dd92e36feb | ||
|
|
c25738c62c | ||
|
|
c264e98e6e | ||
|
|
f2780bcbc2 | ||
|
|
050b703fc0 | ||
|
|
eed09f64f7 | ||
|
|
28c4ad1501 | ||
|
|
28d1dad629 | ||
|
|
b5f0672888 | ||
|
|
71fc4faae7 | ||
|
|
8bff1e8bc4 | ||
|
|
af67dd6610 | ||
|
|
c46c700f7c | ||
|
|
2a2de2efdc | ||
|
|
f384c42de5 | ||
|
|
bf1c54e5a3 | ||
|
|
d8f2cc50df | ||
|
|
06c25ba998 | ||
|
|
58654a3f3a | ||
|
|
32521cd1b6 | ||
|
|
e072fe6ea9 | ||
|
|
b5897fdb62 | ||
|
|
55df525f1b | ||
|
|
e6dde68924 | ||
|
|
b3e2305dea | ||
|
|
ec3e3ed1fd | ||
|
|
30fc97eef6 | ||
|
|
5939692616 | ||
|
|
9ce3176b59 | ||
|
|
497d35b03b | ||
|
|
6a1191de31 | ||
|
|
6c3a17de71 | ||
|
|
22cf82e44b | ||
|
|
10c7e49273 | ||
|
|
4900eae751 | ||
|
|
5334c599f0 | ||
|
|
ad10a1eba5 | ||
|
|
3ca626f2a9 | ||
|
|
e7ad40d8f4 | ||
|
|
d38ab1145a | ||
|
|
f31360e1a4 | ||
|
|
059fead736 | ||
|
|
4e8360c030 | ||
|
|
fbd80746a5 | ||
|
|
072a5de1c5 | ||
|
|
5c3c5a5521 | ||
|
|
461b294bc7 | ||
|
|
71de0f2d08 | ||
|
|
2ffdc4f2ef | ||
|
|
dc9b320c4a | ||
|
|
a6a93148b4 | ||
|
|
f7dc3b9ce4 | ||
|
|
12ad5d53c9 | ||
|
|
54dc1e2e15 | ||
|
|
073f715f17 | ||
|
|
7ff50893dc | ||
|
|
d128082b23 | ||
|
|
1b8f89c3f1 | ||
|
|
8eb138e0b3 | ||
|
|
8256579310 | ||
|
|
41f1fb8d95 | ||
|
|
277d91afce | ||
|
|
aaa840ebef | ||
|
|
29ffdadabb | ||
|
|
e5f19fe037 | ||
|
|
5791d71e9f | ||
|
|
104a7022fb | ||
|
|
6210b613be | ||
|
|
2ba9380616 | ||
|
|
59042bc2e2 | ||
|
|
ccfd8e51ea | ||
|
|
1aafb6c2c1 | ||
|
|
7976aa4b28 | ||
|
|
1b4e175c0c | ||
|
|
3ef955c139 | ||
|
|
51990ed0e5 | ||
|
|
138523bab3 | ||
|
|
995ec2b104 | ||
|
|
d13f8749d4 | ||
|
|
0350443810 | ||
|
|
c5841dccbb | ||
|
|
a0c50f9ef5 | ||
|
|
120020b4db | ||
|
|
676747467a | ||
|
|
e2d13541dc | ||
|
|
057cbc76b3 | ||
|
|
48035187d2 | ||
|
|
f05f60f929 | ||
|
|
3ab19e81ac | ||
|
|
532be6cd87 | ||
|
|
21a492fa43 | ||
|
|
edf83823f1 | ||
|
|
8d6f7de046 | ||
|
|
a7de4f3663 | ||
|
|
e538f16315 | ||
|
|
3f8b3e2baa | ||
|
|
a90ecde389 | ||
|
|
1ad65bb66b | ||
|
|
d85bb3bce1 | ||
|
|
8cd4732321 | ||
|
|
6957b02c27 | ||
|
|
adcadf08d1 | ||
|
|
3b36145257 | ||
|
|
c3e5eaf8da | ||
|
|
fd176107ae | ||
|
|
ad203e1461 | ||
|
|
1fe9ba5879 | ||
|
|
678321bb2f | ||
|
|
967ce824f7 | ||
|
|
336e5e0ff7 | ||
|
|
7a94f472c7 | ||
|
|
70b41a2a6e | ||
|
|
216e7f3b10 | ||
|
|
0717da6e37 | ||
|
|
3f64316e00 | ||
|
|
172eaf84b5 | ||
|
|
0c20889a17 | ||
|
|
62523d537b | ||
|
|
6643252019 | ||
|
|
13022a6bb0 | ||
|
|
fc018691e5 | ||
|
|
56666c4bf4 | ||
|
|
379da81f85 | ||
|
|
9ce6d4b72a | ||
|
|
be46c31c74 | ||
|
|
cd4029dc61 | ||
|
|
d2aa55a3bd | ||
|
|
838be0846d | ||
|
|
9414cb97b5 | ||
|
|
d6883a077a | ||
|
|
aa60b8399b | ||
|
|
cbe504df77 | ||
|
|
e0efcc1f25 | ||
|
|
c6e536a768 | ||
|
|
77ba53bda7 | ||
|
|
c2c6f1493a | ||
|
|
debaed6e5e | ||
|
|
0d6279617b | ||
|
|
3435314400 | ||
|
|
f248a8383b | ||
|
|
5458b007d1 | ||
|
|
6735291c99 | ||
|
|
6ad7a20c07 | ||
|
|
3191825ecc | ||
|
|
baee6b9738 | ||
|
|
c4a7f899db | ||
|
|
c01623ba56 | ||
|
|
81d0d5c59f | ||
|
|
cc4fdfd852 | ||
|
|
ba7be29153 | ||
|
|
4eae95b88d | ||
|
|
06d8281f16 | ||
|
|
87c21ba75e | ||
|
|
7f88a7c9bb | ||
|
|
38c57a662c | ||
|
|
36f5ddc543 | ||
|
|
8b873b6b1b | ||
|
|
68bd881ca8 | ||
|
|
c3e717a3ef | ||
|
|
d9be6f8a9a | ||
|
|
3bfb9d65f4 | ||
|
|
9ad26f943f | ||
|
|
c5112cb24e | ||
|
|
c17e1f9e75 | ||
|
|
b48b454909 | ||
|
|
6b59a924e8 | ||
|
|
87879a6784 | ||
|
|
fca5fda9da | ||
|
|
691d566482 | ||
|
|
61578f4dca | ||
|
|
9f4a7fc0da | ||
|
|
200a5d84c7 | ||
|
|
309a2ad0a3 | ||
|
|
e696331e2a | ||
|
|
c3126e24ce | ||
|
|
bde931f2f5 | ||
|
|
58b3e9f201 | ||
|
|
1423dcb619 | ||
|
|
df3540b0f9 | ||
|
|
921209580a | ||
|
|
d4e058a844 | ||
|
|
8f9eed154e | ||
|
|
1416655d53 | ||
|
|
9a147218ce | ||
|
|
34b575da03 | ||
|
|
54d22a23b5 | ||
|
|
ee10e17ce7 | ||
|
|
8ff97468cc | ||
|
|
6f898c6c97 | ||
|
|
cfeb8d053f | ||
|
|
d317171a45 | ||
|
|
9b0aadccf8 | ||
|
|
d6850ab358 | ||
|
|
c139a0d9ed | ||
|
|
67b0c4cddd | ||
|
|
ce36bf6134 | ||
|
|
e2dd65a403 | ||
|
|
a2595d5107 | ||
|
|
6dc0cf0c44 | ||
|
|
faac630001 | ||
|
|
0deacc7229 | ||
|
|
c849fe1496 | ||
|
|
4238e84ec4 | ||
|
|
df4e306c64 | ||
|
|
916c728d70 | ||
|
|
476d85915b | ||
|
|
e54b8ead72 | ||
|
|
d2444d2992 | ||
|
|
48acda2c3c | ||
|
|
264f7b1d30 | ||
|
|
fc44d54607 | ||
|
|
afc3698578 | ||
|
|
c3cd94b695 | ||
|
|
ea219f683e | ||
|
|
faf6584652 | ||
|
|
4dc41749fb | ||
|
|
2aa94301a8 | ||
|
|
d2870b6df7 | ||
|
|
5cbc44610c | ||
|
|
9032cc0ecc | ||
|
|
e48b314ad0 | ||
|
|
6fdaf905c4 | ||
|
|
79b706fb5c | ||
|
|
eaee188244 | ||
|
|
a6ac62d628 | ||
|
|
7a7f12504b | ||
|
|
55c83d17e1 | ||
|
|
8009c1b7eb | ||
|
|
1580453f4b | ||
|
|
9cc8f5dd07 | ||
|
|
7e326b8431 | ||
|
|
8bddb47fab | ||
|
|
b1b462d22b | ||
|
|
d5847faaba | ||
|
|
4c9f3aee74 | ||
|
|
ff4e0cb1c2 | ||
|
|
c159da1fbc | ||
|
|
d5e55f9dbd | ||
|
|
642ed4061a | ||
|
|
5178c3e67f | ||
|
|
e402347d73 | ||
|
|
3004c58798 | ||
|
|
15a44fe650 | ||
|
|
e37a96a94a | ||
|
|
e475a3b64c | ||
|
|
663ebd25ea | ||
|
|
e6bec0de72 | ||
|
|
f513effd47 | ||
|
|
dd05e898cc | ||
|
|
49a88e75e6 | ||
|
|
14a99471f4 | ||
|
|
bdbc181e38 | ||
|
|
133b1151bd | ||
|
|
653aab2358 | ||
|
|
13669313d4 | ||
|
|
e84d79ccf3 | ||
|
|
34077f9624 | ||
|
|
28ba64a4db | ||
|
|
0eefd3e140 | ||
|
|
20bbfc5917 | ||
|
|
9d6832224e | ||
|
|
2cf17b19dc | ||
|
|
390cf2114a | ||
|
|
8bff019b5d | ||
|
|
7d221f3be9 | ||
|
|
b8628b9772 | ||
|
|
cda4d9e1b2 | ||
|
|
f5d7a4d41e | ||
|
|
94486302f5 | ||
|
|
4f4a7409f6 | ||
|
|
60f57f9e4b | ||
|
|
2f98cd9eb0 | ||
|
|
f77586f13d | ||
|
|
fa82091989 | ||
|
|
66e9c68da4 | ||
|
|
c97c2fee37 | ||
|
|
fd03500786 | ||
|
|
83d5c31a0c | ||
|
|
7f19c10da9 | ||
|
|
c10ea527a0 | ||
|
|
5a54c1520a | ||
|
|
3f2732be7b | ||
|
|
d504b1f90f | ||
|
|
210dac058d | ||
|
|
ccb3012e5a | ||
|
|
c94f2e6f07 | ||
|
|
e31d7178b4 | ||
|
|
b3a4b8085c | ||
|
|
b56d7ab9c3 | ||
|
|
c63e270921 | ||
|
|
cffbae3a13 | ||
|
|
d2d03228ee | ||
|
|
30458fa536 | ||
|
|
0e60831f46 | ||
|
|
69238bf8e8 | ||
|
|
db483df9a6 | ||
|
|
1dc95f5d3a | ||
|
|
37caef10b1 | ||
|
|
381ecd8f70 | ||
|
|
f2a829362b | ||
|
|
fe2e994f2d | ||
|
|
95ba6bf040 | ||
|
|
6f937e8958 | ||
|
|
12f04650de | ||
|
|
f7330cce14 | ||
|
|
ba56f95da8 | ||
|
|
46704724e3 | ||
|
|
caadd5bb32 | ||
|
|
faa221f162 | ||
|
|
a814d5438a | ||
|
|
ab43c4cf2a | ||
|
|
d781e2dfb8 | ||
|
|
968ef1560f | ||
|
|
1631ceedb3 | ||
|
|
884c2af17d | ||
|
|
51ab030541 | ||
|
|
2a1e063641 | ||
|
|
62b3120ffd | ||
|
|
ea17b3d7c9 | ||
|
|
f3e98fc71c | ||
|
|
5034e11f22 | ||
|
|
560473d70b | ||
|
|
10e53509bd | ||
|
|
27afb02482 | ||
|
|
07fd0989ea | ||
|
|
d7c38aea50 | ||
|
|
20d57e27c9 | ||
|
|
4606c8092f | ||
|
|
30f256aad2 | ||
|
|
1b9dbd0e62 | ||
|
|
225c8871f9 | ||
|
|
d0333134d5 | ||
|
|
b24b8315d3 | ||
|
|
4ddc3b518b | ||
|
|
479a7e441d | ||
|
|
af5ae8d656 | ||
|
|
1365882de4 | ||
|
|
7854cd1f94 | ||
|
|
12a1a14527 | ||
|
|
a71cc552c9 | ||
|
|
e42d091502 | ||
|
|
d89d5befa0 | ||
|
|
92e5ae29c9 | ||
|
|
65aeb97e3e | ||
|
|
08a9ef1072 | ||
|
|
9c3f297e97 | ||
|
|
2554871c64 | ||
|
|
404edebdff | ||
|
|
2f2030babf | ||
|
|
b560b35175 | ||
|
|
3063b19e1d | ||
|
|
a17fb54c37 | ||
|
|
c1b8a8594d | ||
|
|
0a7fc6c48c | ||
|
|
79d59ff9ca | ||
|
|
c7d3c78e72 | ||
|
|
d56322a032 | ||
|
|
aac3c4d5c7 | ||
|
|
9ba1ddc2dd | ||
|
|
61eeaa0496 | ||
|
|
d3b6f9975c | ||
|
|
5200c8d659 | ||
|
|
e2c6f57859 | ||
|
|
b084210705 | ||
|
|
6622922468 | ||
|
|
caf31eb6d3 | ||
|
|
464691f129 | ||
|
|
afcf539e6e | ||
|
|
bf2c1a2df2 | ||
|
|
7400064cd5 | ||
|
|
7eb3754807 | ||
|
|
a9cc2fdb54 | ||
|
|
212282e77c | ||
|
|
1e8a820108 | ||
|
|
0117341b7e | ||
|
|
d21eac8b18 | ||
|
|
af4edc3b76 | ||
|
|
8a959896bf | ||
|
|
ba5107e801 | ||
|
|
d7de4a3579 | ||
|
|
175b14860e | ||
|
|
72fcb4ebda | ||
|
|
3a221f9b6e | ||
|
|
1241fb54f3 | ||
|
|
b291dcadc6 | ||
|
|
4105b19f75 | ||
|
|
b7b8ad7760 | ||
|
|
8465e3061a | ||
|
|
6b09cd61d2 | ||
|
|
aac609cc38 | ||
|
|
0b1d16f9db | ||
|
|
7374f6dc4f | ||
|
|
9577d80fc2 | ||
|
|
c550e27d21 | ||
|
|
423730da76 | ||
|
|
78a4c6f525 | ||
|
|
0d3ac21ae0 | ||
|
|
2cae3245aa | ||
|
|
e143a0ec6b | ||
|
|
35ce087f3b | ||
|
|
e787bc8ae4 | ||
|
|
4937052475 | ||
|
|
739eb67bec | ||
|
|
a3049b6f94 | ||
|
|
2f1346fefa | ||
|
|
f116db3108 | ||
|
|
87a8780cca | ||
|
|
d2de62283b | ||
|
|
11c16139c2 | ||
|
|
1c91ec69ba | ||
|
|
73429e7779 | ||
|
|
fe5aff0c72 | ||
|
|
c36d29a896 | ||
|
|
e3b5395905 | ||
|
|
3a25ecbbc9 | ||
|
|
7d63970293 | ||
|
|
ee267d23ba | ||
|
|
e0e4eed26b | ||
|
|
5b280bd60d | ||
|
|
2f9cc91b64 | ||
|
|
36bcced355 | ||
|
|
9a9b17d38d | ||
|
|
e2cd275ac5 | ||
|
|
61eb5d906c | ||
|
|
a113dc0861 | ||
|
|
6a164a235d | ||
|
|
c1eaa90c2b | ||
|
|
00e00eb7b5 | ||
|
|
0d2db28908 | ||
|
|
20202b793b | ||
|
|
62e84e73ae | ||
|
|
73f6fd49d0 | ||
|
|
4f9da35b76 | ||
|
|
cc7b413a2a | ||
|
|
fcf29f357d | ||
|
|
4fd1eae84f | ||
|
|
1c770a3c66 | ||
|
|
e152f54903 | ||
|
|
5d3a9d817a | ||
|
|
e884916275 | ||
|
|
5b7b16416b | ||
|
|
04b93aeaf2 | ||
|
|
39bdd37615 | ||
|
|
4ccb3810c2 | ||
|
|
1065ebb0aa | ||
|
|
74c08de530 | ||
|
|
b195fdbf60 | ||
|
|
f68efe6674 | ||
|
|
ed309182bf | ||
|
|
50c6b276f9 | ||
|
|
4c1a8f358a | ||
|
|
05ff79f347 | ||
|
|
3ae328898d | ||
|
|
7d35c43def | ||
|
|
d4f857b739 | ||
|
|
b6bc844b4d | ||
|
|
d06a477371 | ||
|
|
c128c029f3 | ||
|
|
a58ad5006f | ||
|
|
3c5655fc3d | ||
|
|
6ab04866ec | ||
|
|
1f07f9d127 | ||
|
|
e5ccfc4446 | ||
|
|
ec89382e35 | ||
|
|
4a7873ef77 | ||
|
|
ff2fd45ff0 | ||
|
|
e8cfeec0cf | ||
|
|
c72171d1da | ||
|
|
885b56000b | ||
|
|
3d1ee9dcf0 | ||
|
|
5d2133a483 | ||
|
|
52bb56ba43 | ||
|
|
d2edf11726 | ||
|
|
9a152c23bb | ||
|
|
8572445f57 | ||
|
|
9940d73167 | ||
|
|
8b8a9ae854 | ||
|
|
036bf92223 | ||
|
|
410969743f | ||
|
|
14da67121c | ||
|
|
681d3e09ba | ||
|
|
0ce130efa7 | ||
|
|
d14d7ade85 | ||
|
|
7b4fd28ef1 | ||
|
|
b2280b2d72 | ||
|
|
b41826c332 | ||
|
|
3d93ed9059 | ||
|
|
35a0756e5a | ||
|
|
10419366f9 | ||
|
|
8373d31013 | ||
|
|
0c89a8f145 | ||
|
|
257ac4d37e | ||
|
|
653aee8b07 | ||
|
|
88726aff8c | ||
|
|
baabdb4ac2 | ||
|
|
6277510557 | ||
|
|
e9ab17fcb1 | ||
|
|
2f9ba719d4 | ||
|
|
e259f300b1 | ||
|
|
fcc357ddd1 | ||
|
|
e613198af7 | ||
|
|
e3c1214971 | ||
|
|
1c3f9f7fbf | ||
|
|
f4a1573586 | ||
|
|
95db668c3c | ||
|
|
691e21fa78 | ||
|
|
c555681c8b | ||
|
|
ae7ef24196 | ||
|
|
f935b141f1 | ||
|
|
a893d43d16 | ||
|
|
7cb47c8494 | ||
|
|
5ef4c763b6 | ||
|
|
459b5bd89c | ||
|
|
c5237a926d | ||
|
|
2e5052a7fa | ||
|
|
cd8d9bf07c | ||
|
|
7da022ebb4 | ||
|
|
67f9c7e0f0 | ||
|
|
1812d557b6 | ||
|
|
34cde430a5 | ||
|
|
12a6b58614 | ||
|
|
cb81fccfaf | ||
|
|
1ce0fffd25 | ||
|
|
0c1c4b08c7 | ||
|
|
c875b61003 | ||
|
|
f4b34c8ca5 | ||
|
|
a6b4b5e30c | ||
|
|
64fb8f0c53 | ||
|
|
78a312f61c | ||
|
|
2c6c4426e8 | ||
|
|
a9df0601a6 | ||
|
|
4345f353a0 | ||
|
|
96b525658e | ||
|
|
9525952573 | ||
|
|
76828a87ee | ||
|
|
789eb59904 | ||
|
|
c0265f8fd9 | ||
|
|
891ebb8ff6 | ||
|
|
1111c20d54 | ||
|
|
387176e83d | ||
|
|
80a38b285d | ||
|
|
aa0c02a243 | ||
|
|
3c5932af75 | ||
|
|
f40a7d47f5 | ||
|
|
f85543c7ff | ||
|
|
36d2ff7c3b | ||
|
|
7ba673ed89 | ||
|
|
a0cba79df2 | ||
|
|
c91e8d7aa7 | ||
|
|
e85b0a81ba | ||
|
|
bfc40498bd | ||
|
|
41ac7062f8 | ||
|
|
71c19b566b | ||
|
|
0de72f3abb | ||
|
|
ce3c78d30b | ||
|
|
7152308c25 | ||
|
|
cd838d4902 | ||
|
|
f7799eee59 | ||
|
|
247718bc6c | ||
|
|
6b5521fbf7 | ||
|
|
13e00379ae | ||
|
|
347663716c | ||
|
|
69415ea966 | ||
|
|
6c71e3c583 | ||
|
|
06861ceb55 | ||
|
|
6e286473ab | ||
|
|
6091219aaf | ||
|
|
76cee1287a | ||
|
|
ff138c6d47 | ||
|
|
a89f8b8098 | ||
|
|
f4009a9944 | ||
|
|
16b479d21e | ||
|
|
0f8c20c3ab | ||
|
|
d5c3b258f3 | ||
|
|
ee4a703407 | ||
|
|
e901208721 | ||
|
|
5deb7371ab | ||
|
|
f999195f47 | ||
|
|
9b920cf813 | ||
|
|
4155e8e0ce | ||
|
|
b583530c66 | ||
|
|
43c13c22a8 | ||
|
|
32167b45ce | ||
|
|
f09ae1e2e3 | ||
|
|
086e1e1a74 | ||
|
|
1020637d79 | ||
|
|
9c30d69d55 | ||
|
|
ff673f053b | ||
|
|
2514987d3e | ||
|
|
e332a916b0 | ||
|
|
5eb7faec29 | ||
|
|
8cfebee922 | ||
|
|
f4a22f8aef | ||
|
|
5fd641e8c7 | ||
|
|
4cde537a7f | ||
|
|
56ee4c1ae5 | ||
|
|
1874ad2ff2 | ||
|
|
907ed641bf | ||
|
|
a23ccd863d | ||
|
|
8d145d7a32 | ||
|
|
4a0419e554 | ||
|
|
f23a458319 | ||
|
|
1e324103cc | ||
|
|
85d8ced299 | ||
|
|
0631b8f052 | ||
|
|
649994464c | ||
|
|
8c618780b7 | ||
|
|
0dc2e8994b | ||
|
|
d25ab4f204 | ||
|
|
ff26080c5c | ||
|
|
95bd2dde19 | ||
|
|
6ad31a5441 | ||
|
|
702a82bb38 | ||
|
|
a5e91385b0 | ||
|
|
4c690b9d4c | ||
|
|
695d6e14d4 | ||
|
|
c19f87134e | ||
|
|
3de50e8dd4 | ||
|
|
fb20dae0a8 | ||
|
|
0f8db11f53 | ||
|
|
e3f94156f1 | ||
|
|
cf468fc4d1 | ||
|
|
849cf30b95 | ||
|
|
d08febc711 | ||
|
|
53bfafb84c | ||
|
|
40809e40c2 | ||
|
|
925197ae09 | ||
|
|
07f72de63d | ||
|
|
f17f62b532 | ||
|
|
b97bbe0572 | ||
|
|
9e4cc7fdbc | ||
|
|
7dcb56ea5c | ||
|
|
a814c6d152 | ||
|
|
cbe3a0fde7 | ||
|
|
7e375370fa | ||
|
|
1d149b100b | ||
|
|
1bce75ed53 | ||
|
|
d8a72fe797 | ||
|
|
5bd8319f99 | ||
|
|
d8221b880b | ||
|
|
1316ce5ca8 | ||
|
|
d5562767a2 | ||
|
|
1a03ee8b9b | ||
|
|
d07e53e9a0 | ||
|
|
04160e6acc | ||
|
|
6f4c7ca171 | ||
|
|
2d397efcf5 | ||
|
|
ba8e59e1bd | ||
|
|
568faa526f | ||
|
|
b761fbaabe | ||
|
|
4a493a96d7 | ||
|
|
601244ba74 | ||
|
|
d606197264 | ||
|
|
1fee10e167 | ||
|
|
674802abe4 | ||
|
|
179422a84b | ||
|
|
5c9e4685db | ||
|
|
c59f8c734a | ||
|
|
d2fa2be5af | ||
|
|
2d3d66e9d1 | ||
|
|
21713801ad | ||
|
|
598e2adebe | ||
|
|
8bbb84fdc7 | ||
|
|
59b7bc7b98 | ||
|
|
55d52be3c2 | ||
|
|
3aa4e45bdb | ||
|
|
534976e64f | ||
|
|
3efa9d2030 | ||
|
|
2c4657355f | ||
|
|
68702ca43f | ||
|
|
54a0de9b52 | ||
|
|
94832f3f81 | ||
|
|
fb00ba9efd | ||
|
|
96736cf1de | ||
|
|
834c55ec6f | ||
|
|
6528a434ce | ||
|
|
a24ee0a331 | ||
|
|
e86144bb06 | ||
|
|
ce7cb16cfe | ||
|
|
754bafc069 | ||
|
|
7eff6fde7c | ||
|
|
626dac600a | ||
|
|
f1b2d4340d | ||
|
|
aea4d73e61 | ||
|
|
3d6c74ead1 | ||
|
|
c606f80fe3 | ||
|
|
250ca36f05 | ||
|
|
4c63be066f | ||
|
|
b559eeb7e6 | ||
|
|
a9742dbdc6 | ||
|
|
5feaade1c7 | ||
|
|
31747dfecd | ||
|
|
eda9484413 | ||
|
|
7e904c1d15 | ||
|
|
5f8527ba04 | ||
|
|
082e95b700 | ||
|
|
aef5c61415 | ||
|
|
68fdac532f | ||
|
|
f718284538 | ||
|
|
966283dd6d | ||
|
|
0f3ec9ad73 | ||
|
|
cb685904ef | ||
|
|
5bf545ee90 | ||
|
|
b018ada5c8 | ||
|
|
976e81be43 | ||
|
|
694cb18256 | ||
|
|
a715a5fa37 | ||
|
|
1e10c9d508 | ||
|
|
2aacfea8ea | ||
|
|
43c2cb4ba8 | ||
|
|
c93f708bc8 | ||
|
|
353416a088 | ||
|
|
93b98abb8d | ||
|
|
5e28e38c98 | ||
|
|
0e828e5b3b | ||
|
|
c331d12678 | ||
|
|
f0817b2461 | ||
|
|
d3f2cd5321 | ||
|
|
7017766591 | ||
|
|
841890c178 | ||
|
|
4f5189b0dd | ||
|
|
250ecd13bd | ||
|
|
34133b094b | ||
|
|
75c3939c88 | ||
|
|
cb44430a3f | ||
|
|
be88b5aba2 | ||
|
|
3d0f7b8e7e | ||
|
|
a53d5dc791 | ||
|
|
7f1164b6a6 | ||
|
|
2174f10db5 | ||
|
|
e3c218092c | ||
|
|
cf73ba2905 | ||
|
|
d653b951e3 | ||
|
|
900c0eafac | ||
|
|
bf6eaaf625 | ||
|
|
32f3d214cb | ||
|
|
cd62b2a209 | ||
|
|
ff25b4cb46 | ||
|
|
5c07dd995e | ||
|
|
f54cc28a43 | ||
|
|
9b1c7bb1e3 | ||
|
|
ffe8a729b7 | ||
|
|
a47f356021 | ||
|
|
7d7a34c733 | ||
|
|
e306959ebe | ||
|
|
ce16c4d37f | ||
|
|
565cc05b48 | ||
|
|
287839e498 | ||
|
|
4be0969098 | ||
|
|
f1008b1abf | ||
|
|
8d8b3c2194 | ||
|
|
6631b57fc0 | ||
|
|
88b4bc3753 | ||
|
|
23a4dde10f | ||
|
|
5a47eb8559 | ||
|
|
81cd990052 | ||
|
|
dd9e7cf665 | ||
|
|
b2f50b5327 | ||
|
|
b21fe4b2fc | ||
|
|
5f23a3143c | ||
|
|
ef136c9d00 | ||
|
|
c7e8b724c7 | ||
|
|
0243e7ba8b | ||
|
|
b3f5375283 | ||
|
|
f90f683be5 | ||
|
|
bd23666b45 | ||
|
|
a620c2ec1a | ||
|
|
a723612141 | ||
|
|
2d7d4212c1 | ||
|
|
52cca034cf | ||
|
|
79ec1f5a02 | ||
|
|
68729a9696 | ||
|
|
93383204b3 | ||
|
|
78f17bd083 | ||
|
|
ea87006150 | ||
|
|
c0027c377b | ||
|
|
77b84c1de0 | ||
|
|
a14e2fedcf | ||
|
|
0341399e54 | ||
|
|
1dcf3585fb | ||
|
|
dbb48cf086 | ||
|
|
064c8adcf2 | ||
|
|
cff83e095a | ||
|
|
ff9aecca48 | ||
|
|
53c529a12c | ||
|
|
78454ba876 | ||
|
|
c3c1702d2b | ||
|
|
bffc777b58 | ||
|
|
fcec6a8fdf | ||
|
|
a842f25f89 | ||
|
|
9f2bea8ac1 | ||
|
|
7f9a2a2d34 | ||
|
|
3225f17f5a | ||
|
|
2f8b1dff27 | ||
|
|
7884f972ea | ||
|
|
bfce264537 | ||
|
|
dee5f4c96a | ||
|
|
6bd83137fb | ||
|
|
6c6c38679a | ||
|
|
ca0c700afa | ||
|
|
cc2e434f3d | ||
|
|
4d337f0bee | ||
|
|
539c10883b | ||
|
|
ae8796a570 | ||
|
|
141227d846 | ||
|
|
bb42b87f4e | ||
|
|
866d9dacb6 | ||
|
|
006e32077c | ||
|
|
0aca1c6c7c | ||
|
|
d906d56505 | ||
|
|
3b9ebf358c | ||
|
|
1c643cda5b | ||
|
|
e5697a8070 | ||
|
|
07f1a13cbf | ||
|
|
4c88f3ad64 | ||
|
|
c099d60393 | ||
|
|
5e0d48b40f | ||
|
|
c4f8e83d02 | ||
|
|
a768c1e6c0 | ||
|
|
540325dc20 | ||
|
|
2e57f76c12 | ||
|
|
e71fd6f8b4 | ||
|
|
c721721fc5 | ||
|
|
0ab5d6a7b8 | ||
|
|
66599e5770 | ||
|
|
d7c7463380 | ||
|
|
491a4468dc | ||
|
|
c85150aaea | ||
|
|
c7ba6d2a82 | ||
|
|
ace64cf50f | ||
|
|
cd6d4f6f47 | ||
|
|
1bdf74951a | ||
|
|
eda2b38f46 | ||
|
|
f14e85d6c4 | ||
|
|
76f668dddd | ||
|
|
ce01d696a0 | ||
|
|
8179a3a349 | ||
|
|
e5c397203e | ||
|
|
60aeba732d | ||
|
|
de70ef1ef6 | ||
|
|
1d02c288b3 | ||
|
|
3776920807 | ||
|
|
7d54cde8eb | ||
|
|
1bab2061bd | ||
|
|
34e30cba0d | ||
|
|
ed600c9077 | ||
|
|
30dc6d2b19 | ||
|
|
77c3b4636e | ||
|
|
25edcbaff9 | ||
|
|
553b8fb2e0 | ||
|
|
461b401e28 | ||
|
|
d2a4611d1e | ||
|
|
65c3dbba2c | ||
|
|
7ef0b5b428 | ||
|
|
89589d7ef5 | ||
|
|
70b782c7e7 | ||
|
|
9732b0a636 | ||
|
|
00acaa56b9 | ||
|
|
1cea2be9c1 | ||
|
|
94381bd899 | ||
|
|
23d935d7ec | ||
|
|
69da13b261 | ||
|
|
a6519e0ff7 | ||
|
|
b701a36e21 | ||
|
|
24a34088d8 | ||
|
|
0eeb092aad | ||
|
|
7d4726d12e | ||
|
|
e13bf164ea | ||
|
|
07434b19ae | ||
|
|
819fa88eb7 | ||
|
|
95976814f5 | ||
|
|
0a2dd2a330 | ||
|
|
65f125d998 | ||
|
|
7a2f6ebfd5 | ||
|
|
5d89fa3f07 | ||
|
|
4a66e28584 | ||
|
|
85990bbeb3 | ||
|
|
e0311e1530 | ||
|
|
6eb4dbf9cd | ||
|
|
a90453461e | ||
|
|
7e04c9a909 | ||
|
|
e51602ccfa | ||
|
|
ca7adb59db | ||
|
|
3a12802a4b | ||
|
|
c770eab3e3 | ||
|
|
079b8e7337 | ||
|
|
2e4593eee7 | ||
|
|
3ca80a7bf3 | ||
|
|
a4c15e5fa5 | ||
|
|
a40748e3aa | ||
|
|
029aac8059 | ||
|
|
2970f66218 | ||
|
|
ef238de7a7 | ||
|
|
af05313dc5 | ||
|
|
df0d1b57a0 | ||
|
|
23cff25ed5 | ||
|
|
c70b13a650 | ||
|
|
a51c6a7670 | ||
|
|
0bdb643e14 | ||
|
|
0cbbbf1287 | ||
|
|
9a00b62d28 | ||
|
|
05dce760d6 | ||
|
|
4eaf91c3dc | ||
|
|
818c3d6140 | ||
|
|
5e19cd0084 | ||
|
|
7b06257955 | ||
|
|
2af21c8003 | ||
|
|
db6f907946 | ||
|
|
125ed8bff2 | ||
|
|
1d0f2e9d31 | ||
|
|
43efc930f4 | ||
|
|
737e18d2de | ||
|
|
445445603f | ||
|
|
5957c94958 | ||
|
|
1c41661712 | ||
|
|
1b2909605e | ||
|
|
c6a13f970f | ||
|
|
f2f57dc5a5 | ||
|
|
c6de1ab56c | ||
|
|
0392e37eed | ||
|
|
f630c4ec6c | ||
|
|
e668642b23 | ||
|
|
c4c0c050af | ||
|
|
b4ff8360ba | ||
|
|
708a2ec703 | ||
|
|
407cb2f7e6 | ||
|
|
0b22e76b85 | ||
|
|
7671187160 | ||
|
|
5695e0e6b6 | ||
|
|
e22b2f00dc | ||
|
|
2a017c3a7c | ||
|
|
ce65c3113a | ||
|
|
65a2ebb8ad | ||
|
|
f0a542b154 | ||
|
|
dfe1c940bc | ||
|
|
3cd8708368 | ||
|
|
e677161e49 | ||
|
|
818c6711d8 | ||
|
|
f60cc76f3e | ||
|
|
685321fdc5 | ||
|
|
303215d42f | ||
|
|
f313752888 | ||
|
|
28b83a486e | ||
|
|
80289bd452 | ||
|
|
054be39feb | ||
|
|
6448e049d1 | ||
|
|
8e1f7c8d6f | ||
|
|
c4e31e7a58 | ||
|
|
0860d9712e | ||
|
|
1a17cbd26b | ||
|
|
c2b1d3b551 | ||
|
|
d4fac798fc | ||
|
|
b009b23245 | ||
|
|
f276f1e2f5 | ||
|
|
154e57748f | ||
|
|
6854fee73e | ||
|
|
24240bfba4 | ||
|
|
40e32daabe | ||
|
|
008cbc8972 | ||
|
|
8a1d2b614a | ||
|
|
b79d03d9a4 | ||
|
|
83fb9f84ed | ||
|
|
c634830b9f | ||
|
|
24edd68833 | ||
|
|
6913798250 | ||
|
|
131bd2c2cd | ||
|
|
55ae55c803 | ||
|
|
63f0eea70c | ||
|
|
38aeef0760 | ||
|
|
88d5f5d76c | ||
|
|
486ba5fe0a | ||
|
|
76f85389ae | ||
|
|
3d311496e0 | ||
|
|
fdbfe0f84b | ||
|
|
8a25592904 | ||
|
|
7edf024c71 | ||
|
|
ee4d9890e7 | ||
|
|
9cc06a94ec | ||
|
|
dd6dc1d334 | ||
|
|
fb2bafb49e | ||
|
|
bc3b8e73fe | ||
|
|
4d48441102 | ||
|
|
c0fa980f70 | ||
|
|
bb3bac9933 | ||
|
|
1ac5fa544b | ||
|
|
91bb4d4b00 | ||
|
|
aecdd0fdd5 | ||
|
|
2e5f3cd25c | ||
|
|
8558c55284 | ||
|
|
b16b49aea4 | ||
|
|
09678eeef4 | ||
|
|
fad43842a4 | ||
|
|
4b448a877c | ||
|
|
f090af2292 | ||
|
|
7faaac94dd | ||
|
|
dae0b25717 | ||
|
|
de3d9dca72 | ||
|
|
a91abb3e8d | ||
|
|
dabea8b972 | ||
|
|
dedffb3560 | ||
|
|
5eb2306e9a | ||
|
|
8a2e06a713 | ||
|
|
23b495aee8 | ||
|
|
b9d314e64c | ||
|
|
5a4826e660 | ||
|
|
20bf67d352 | ||
|
|
8b4f1e1383 | ||
|
|
20297e359d | ||
|
|
de7409fd07 | ||
|
|
8498f12a9d | ||
|
|
e949eb8623 | ||
|
|
201d17bc31 | ||
|
|
143e9bd210 | ||
|
|
9ec874d8a6 | ||
|
|
2543afebf1 | ||
|
|
81a859604c | ||
|
|
d3be4bba37 | ||
|
|
6779c9eb36 | ||
|
|
733da570c8 | ||
|
|
65258d5b6a | ||
|
|
618c8bb5ad | ||
|
|
ba8684dfc7 | ||
|
|
36a1bd9e0f | ||
|
|
fe56c1c6f2 | ||
|
|
86a37e6f8d | ||
|
|
da1aad7b92 | ||
|
|
876621f8af | ||
|
|
8a908b720f | ||
|
|
dadde52c40 | ||
|
|
369dd98cbe | ||
|
|
8cdd6cd131 | ||
|
|
973bc21f37 | ||
|
|
2ba327345d | ||
|
|
138ecc4ee1 | ||
|
|
5b9a8e9bf9 | ||
|
|
e520486892 | ||
|
|
ecb91613e8 | ||
|
|
d4ac76081e | ||
|
|
63727b67ee | ||
|
|
d969dcecbf | ||
|
|
49c9a202e0 | ||
|
|
512c8de526 | ||
|
|
012a929067 | ||
|
|
bec4e8d8e4 | ||
|
|
9f0993f29b | ||
|
|
1b79448ac2 | ||
|
|
6cef7d5060 | ||
|
|
752545ec0e | ||
|
|
adbebf7ecc | ||
|
|
4d57ac0ce1 | ||
|
|
24b77d9dcb | ||
|
|
cc0f431c35 | ||
|
|
1e7927fbff | ||
|
|
129e56e570 | ||
|
|
5beef690ad | ||
|
|
b0383b0978 | ||
|
|
16c6a11b77 | ||
|
|
9117b13576 | ||
|
|
af55978918 | ||
|
|
0446a1b3a8 | ||
|
|
3986dd4c32 | ||
|
|
79afa16a7f | ||
|
|
087ed0aa6a | ||
|
|
44fa3d2d07 | ||
|
|
8654d83a33 | ||
|
|
efb78c823c | ||
|
|
3bb7f0c291 | ||
|
|
62e0db7c9b | ||
|
|
130695fcb3 | ||
|
|
05fa301ecb | ||
|
|
ee90f730b5 | ||
|
|
7b8a23453f | ||
|
|
cb44479420 | ||
|
|
afb3806326 | ||
|
|
d96bfd21b7 | ||
|
|
bbc3100bb3 | ||
|
|
ac1bb2a6bd | ||
|
|
41ef391d15 | ||
|
|
e51aa5899a | ||
|
|
38bb975abd | ||
|
|
a249b315ca | ||
|
|
eba85e1ec3 | ||
|
|
c1c92256ea | ||
|
|
58ce97c0b4 | ||
|
|
ca58bab1f0 | ||
|
|
052c484abd | ||
|
|
7a213c9d6f | ||
|
|
f4de7422b3 | ||
|
|
a3d18d0429 | ||
|
|
77fbffdc4b | ||
|
|
63ea01104b | ||
|
|
cad0f1f396 | ||
|
|
677fb93494 | ||
|
|
55cbb12701 | ||
|
|
14099813f0 | ||
|
|
b1fd4e853c | ||
|
|
c1d3fc1b78 | ||
|
|
829980a941 | ||
|
|
d1e1a90d08 | ||
|
|
d56de091f6 | ||
|
|
87bb926fef | ||
|
|
e983f93859 | ||
|
|
c721acc2fa | ||
|
|
16fd4c83ac | ||
|
|
999dfb84ee | ||
|
|
c6557e5078 | ||
|
|
f7aab02978 | ||
|
|
fdcd67dd6b | ||
|
|
6c611d71dd | ||
|
|
b7e2396269 | ||
|
|
ab62875ab1 | ||
|
|
a499fdbb13 | ||
|
|
bf2f0c38ed | ||
|
|
b14c05ccae | ||
|
|
66e7cd41b7 | ||
|
|
e9a15d9189 | ||
|
|
e4aee13e9e | ||
|
|
551f9fcdf9 | ||
|
|
2ec5e948b4 | ||
|
|
60b7f504e6 | ||
|
|
f99668f551 | ||
|
|
8ade41b270 | ||
|
|
a36a5363b4 | ||
|
|
cb22fb54e8 | ||
|
|
1dcfdfdb65 | ||
|
|
d309eb8fa1 | ||
|
|
16dfdbe314 | ||
|
|
b926ed7b00 | ||
|
|
67a6b88104 | ||
|
|
631699bf80 | ||
|
|
80801bf7d0 | ||
|
|
4850a033fa | ||
|
|
0b4029f7a1 | ||
|
|
c07ef0d92a | ||
|
|
ca48c5ddff | ||
|
|
a20c362983 | ||
|
|
7beb204b9d | ||
|
|
3e4f9451a0 | ||
|
|
6e5846d206 | ||
|
|
5965591934 | ||
|
|
78f8a03da5 | ||
|
|
4d10584233 | ||
|
|
106fa64060 | ||
|
|
95be8b2cf3 | ||
|
|
53d7c6c085 | ||
|
|
e4df75519c | ||
|
|
0438fa6816 | ||
|
|
2dab4ccf85 | ||
|
|
b338e76649 | ||
|
|
c737ab764e | ||
|
|
990e73fce6 | ||
|
|
99fac3ae1c | ||
|
|
ad0bcc7de9 | ||
|
|
8069853dda | ||
|
|
14ed669eba | ||
|
|
9ff5fa4acf | ||
|
|
d026024e8c | ||
|
|
25d1491e6b | ||
|
|
4e1415faf2 | ||
|
|
692f64a78a | ||
|
|
b20b8af5a6 | ||
|
|
d34cf636d8 | ||
|
|
3c72ea40b4 | ||
|
|
f87c7833a3 | ||
|
|
f3931140fe | ||
|
|
8459117c23 | ||
|
|
bbc0c97329 | ||
|
|
1d8b152758 | ||
|
|
1c4652448c | ||
|
|
3a34e606b8 | ||
|
|
ca55748103 | ||
|
|
43fa199cfa | ||
|
|
f288ca23ae | ||
|
|
4026714461 | ||
|
|
39a8652708 | ||
|
|
fb432465ea | ||
|
|
42bccfe1ec | ||
|
|
98566150d2 | ||
|
|
676e1705c1 | ||
|
|
172cc1ffea | ||
|
|
6845a52e92 | ||
|
|
b5dc89f0e6 | ||
|
|
ecaea51fe0 | ||
|
|
77baf08092 | ||
|
|
63ff5a2fe3 | ||
|
|
97662f4b3e | ||
|
|
38869d5035 | ||
|
|
08047d4ab7 | ||
|
|
cf33853e68 | ||
|
|
768e618ed9 | ||
|
|
025ed51f11 | ||
|
|
ab9dae3bf3 | ||
|
|
74da5dfd4b | ||
|
|
aaaf452fdc | ||
|
|
d2b97d8aea | ||
|
|
8b95216493 | ||
|
|
f933fa8c78 | ||
|
|
f955309139 | ||
|
|
9c65a82430 | ||
|
|
7b4dda9c73 | ||
|
|
9ad7d2d977 | ||
|
|
e3b4b2f667 | ||
|
|
60a1374fb4 | ||
|
|
7fcbc3c003 | ||
|
|
40421f4321 | ||
|
|
ad2683b610 | ||
|
|
7d49699e5f | ||
|
|
b34a239096 | ||
|
|
02d1251fe4 | ||
|
|
95e58ebb9f | ||
|
|
1cb2704f1b | ||
|
|
dea71f1aa9 | ||
|
|
aee975b7d8 | ||
|
|
18b6d51644 | ||
|
|
3a5ff851af | ||
|
|
cd929345e6 | ||
|
|
de232dd726 | ||
|
|
8ebe99d4f5 | ||
|
|
32f760a461 | ||
|
|
65eaab5cf4 | ||
|
|
51698944e0 | ||
|
|
64fc924357 | ||
|
|
c61a0cdd22 | ||
|
|
9a1de81fc5 | ||
|
|
3633d3cd73 | ||
|
|
9a0465eb05 | ||
|
|
088e199aa2 | ||
|
|
bc4c043d7e | ||
|
|
764299ea8a | ||
|
|
2abc87a1f2 | ||
|
|
75fa116c88 | ||
|
|
cc7575adab | ||
|
|
efb1a2c8e0 | ||
|
|
c2972fcaa0 | ||
|
|
250fd71e16 | ||
|
|
783c165201 | ||
|
|
326a3c5932 | ||
|
|
0af1a85442 | ||
|
|
10e7bb97ee | ||
|
|
c319bbc5f3 | ||
|
|
9e42f70e5f | ||
|
|
ff47152187 | ||
|
|
94b6ce5ca0 | ||
|
|
8e1020f134 | ||
|
|
be7a0fef41 | ||
|
|
9fe7bb7362 | ||
|
|
5d4b121ac1 | ||
|
|
cb424a5f78 | ||
|
|
88ab9d0756 | ||
|
|
29f4fd40ed | ||
|
|
b7f7ba06b9 | ||
|
|
94f8ac8d1d | ||
|
|
72ab38bd2f | ||
|
|
b3d5466131 | ||
|
|
bafbd8f1b6 | ||
|
|
8c1ce03183 | ||
|
|
97490b272f | ||
|
|
2afbe9514b | ||
|
|
603be609a1 | ||
|
|
4590be7b65 | ||
|
|
097a2f6582 | ||
|
|
f818e5bc51 | ||
|
|
34cf8fc43c | ||
|
|
7712765c3a | ||
|
|
eaf1304eda | ||
|
|
f97f32df0f | ||
|
|
79eecd6db4 | ||
|
|
5a75d8e788 | ||
|
|
42e58fb73a | ||
|
|
dba996b2c4 | ||
|
|
647f0dd34b | ||
|
|
a691a519e8 | ||
|
|
86075973b5 | ||
|
|
97ea15300c | ||
|
|
a150a8fd52 | ||
|
|
ad4e20da52 | ||
|
|
e43ab1e46f | ||
|
|
e32e280cf1 | ||
|
|
c1a07e0943 | ||
|
|
93fe641dbf | ||
|
|
d8194c0886 | ||
|
|
75ce4766d3 | ||
|
|
7eff3bf854 | ||
|
|
af143ae7dc | ||
|
|
a0e9140dde | ||
|
|
33e5d46c87 | ||
|
|
f74b206864 | ||
|
|
f334ebe577 | ||
|
|
9c39394d7f | ||
|
|
8ea0e6977a | ||
|
|
bf006473c0 | ||
|
|
568af27be4 | ||
|
|
bd55f86203 | ||
|
|
d95e577639 | ||
|
|
a904e54122 | ||
|
|
2a97655a8d | ||
|
|
d878718510 | ||
|
|
416227a2a2 | ||
|
|
7d1baa8798 | ||
|
|
fe2ee64ec9 | ||
|
|
96819628d6 | ||
|
|
1b30d7909c | ||
|
|
baf253d44e | ||
|
|
b7a4d50007 | ||
|
|
625b4befb5 | ||
|
|
30678f51bd | ||
|
|
7a4103dd48 | ||
|
|
bca3ff2eac | ||
|
|
28e2934a89 | ||
|
|
0563af682d | ||
|
|
5ccd63250b | ||
|
|
f262a0745d | ||
|
|
c42b63b008 | ||
|
|
e7ffb80877 | ||
|
|
919166212f | ||
|
|
deb124f645 | ||
|
|
86b1ff5125 | ||
|
|
2c8c96149f | ||
|
|
82e4cc9951 | ||
|
|
04df06404f | ||
|
|
f6fcf5fce4 | ||
|
|
ac5e92c879 | ||
|
|
37ccc80ba4 | ||
|
|
8153f97899 | ||
|
|
8dedc6d3dc | ||
|
|
807d75e13a | ||
|
|
feac1786e1 | ||
|
|
09e0f4e36c | ||
|
|
9999332107 | ||
|
|
d4ec7e5357 | ||
|
|
064b3caf08 | ||
|
|
c83d2e9513 | ||
|
|
48ff516215 | ||
|
|
cdccbb59ab | ||
|
|
2fe5a863ac | ||
|
|
7d1fccf474 | ||
|
|
0a8dbc8831 | ||
|
|
177a3c2cbd | ||
|
|
9f22e634f5 | ||
|
|
55a8c7b540 | ||
|
|
76c11fe65a | ||
|
|
b15ed00feb | ||
|
|
fc3ff34c2d | ||
|
|
5faa0f55bc | ||
|
|
77f0731c3e | ||
|
|
ffff623852 | ||
|
|
a6bc40b506 | ||
|
|
a034515019 | ||
|
|
49c8f23bf7 | ||
|
|
29b7a71812 | ||
|
|
8de3283dd1 | ||
|
|
4bbe5b3358 | ||
|
|
3dd3af4a73 | ||
|
|
7e7b129822 | ||
|
|
8bcc1d81d2 | ||
|
|
aa8e92e9a5 | ||
|
|
a8196ec99e | ||
|
|
bd3034819e | ||
|
|
7bb86c4e2a | ||
|
|
94ed21d1cf | ||
|
|
1bb7c31ee4 | ||
|
|
06d12b376c | ||
|
|
e9c8137fd8 | ||
|
|
eaaddf40d2 | ||
|
|
3e0c565019 | ||
|
|
984603112f | ||
|
|
fe29246256 | ||
|
|
84d0664112 | ||
|
|
3d3c59cea6 | ||
|
|
7940428b9b | ||
|
|
2e485b9ac5 | ||
|
|
b76aa926f6 | ||
|
|
58d81546da | ||
|
|
7a480990c6 | ||
|
|
afb10efd83 | ||
|
|
e2f05e137f | ||
|
|
d72ade9c70 | ||
|
|
64650fcdee | ||
|
|
e1acb7df13 | ||
|
|
319a30cf3a | ||
|
|
e631f1b313 | ||
|
|
617f31b47f | ||
|
|
61e9aac92d | ||
|
|
75812804f4 | ||
|
|
b60f36f211 | ||
|
|
e342c878d0 | ||
|
|
c6b3cadf55 | ||
|
|
869a361d09 | ||
|
|
f83119e188 | ||
|
|
578c4b444c | ||
|
|
d63f9be03f | ||
|
|
62fe02415a | ||
|
|
481970c763 | ||
|
|
7c8dc66ba1 | ||
|
|
20ffbf5a82 | ||
|
|
2b6f26b214 | ||
|
|
d743ec2d2b | ||
|
|
dfab332285 | ||
|
|
bbbce8a981 | ||
|
|
0dc4ccb42f | ||
|
|
b46c2c2527 | ||
|
|
3b128f844b | ||
|
|
d38b3d09ba | ||
|
|
d35c5ffa04 | ||
|
|
eb7243233e | ||
|
|
21bf629505 | ||
|
|
702022001d | ||
|
|
d9549ad634 | ||
|
|
daf91dbf95 | ||
|
|
2bc19120d9 | ||
|
|
8ddfa8cd68 | ||
|
|
076d10358e | ||
|
|
5930983641 | ||
|
|
a0c5cb51aa | ||
|
|
8e659745fd | ||
|
|
87297d2a07 | ||
|
|
8f23611f1a | ||
|
|
e2affb0f38 | ||
|
|
26e6041b7a | ||
|
|
81707a45d5 | ||
|
|
805f2b28a9 | ||
|
|
22aa02895e | ||
|
|
6bb89778b2 | ||
|
|
6631b9e78f | ||
|
|
7f7d5b32da | ||
|
|
52def444ab | ||
|
|
7d52ab7c54 | ||
|
|
852b324819 | ||
|
|
e019441ede | ||
|
|
ac8f8d0dd6 | ||
|
|
3fa2e7e12e | ||
|
|
5d099491df | ||
|
|
d7ca0f7734 | ||
|
|
5d31338b02 | ||
|
|
a44b81d240 | ||
|
|
742e499de0 | ||
|
|
eb395d6d2d | ||
|
|
a1383c34b5 | ||
|
|
e538da3959 | ||
|
|
687a072dc8 | ||
|
|
5dc9881241 | ||
|
|
0b3a7e2f0f | ||
|
|
123455a5bb | ||
|
|
34c8d8dd2e | ||
|
|
3f4c92d739 | ||
|
|
eb10245df1 | ||
|
|
2dbfcbb378 | ||
|
|
a717f5c030 | ||
|
|
3a711790c5 | ||
|
|
5d77cb0396 | ||
|
|
9972ea578b | ||
|
|
0bb3762397 | ||
|
|
fbd6e21152 | ||
|
|
bea62537df | ||
|
|
fdbe4c5bd5 | ||
|
|
91e779a52c | ||
|
|
e2c5e92cd3 | ||
|
|
5929676ea2 | ||
|
|
36e180ab91 | ||
|
|
1e8fe22553 | ||
|
|
8e1bd2d8f3 | ||
|
|
239ce262ef | ||
|
|
5be66e98c2 | ||
|
|
cacd072c15 | ||
|
|
14c6a1bf23 | ||
|
|
b27dfd4c77 | ||
|
|
4622e9658d | ||
|
|
f8bda517c3 | ||
|
|
de3d9fdb8b | ||
|
|
c6291bea52 | ||
|
|
a266e3c898 | ||
|
|
f9c34d6808 | ||
|
|
10a91cac2f | ||
|
|
f7e25e9c63 | ||
|
|
5f821a58a3 | ||
|
|
4a2ad4e6f9 | ||
|
|
4a2bbb52c1 | ||
|
|
ed401199bd | ||
|
|
eee3a263f5 | ||
|
|
eca1d9aabd | ||
|
|
33ff9cfbb6 | ||
|
|
de8e6d7174 | ||
|
|
cd9332cddf | ||
|
|
fb4a861c0d | ||
|
|
c30460df4c | ||
|
|
31e86a36f8 | ||
|
|
0b4fe85b33 | ||
|
|
99e7a1705a | ||
|
|
27c6259b53 | ||
|
|
1ecae14bae | ||
|
|
c56a09f318 | ||
|
|
ffec2699ea | ||
|
|
46faf0280c | ||
|
|
3b774ed507 | ||
|
|
9c62bbbc05 | ||
|
|
dc6b1ef47b | ||
|
|
1f8e1d2a29 | ||
|
|
b30a948601 | ||
|
|
e90568e044 | ||
|
|
c74b5ba3a2 | ||
|
|
2085d6afad | ||
|
|
8bfdbd0fed | ||
|
|
cc3dc6aff0 | ||
|
|
d01284d147 | ||
|
|
7b7d5118d6 | ||
|
|
a03a7dcb4a | ||
|
|
dfae413afc | ||
|
|
253642a85e | ||
|
|
ce64c8e7d1 | ||
|
|
d7ae0105c3 | ||
|
|
e7320e7bd3 | ||
|
|
a214565803 | ||
|
|
61f1290bea | ||
|
|
ba5e512d10 | ||
|
|
624e4bca40 | ||
|
|
613237727d | ||
|
|
fd2ddca6f2 | ||
|
|
e114c18031 | ||
|
|
49e22742de | ||
|
|
422d7942ef | ||
|
|
a63e7162bc | ||
|
|
1f973b72b8 | ||
|
|
d3dd97f167 | ||
|
|
f0f17e0041 | ||
|
|
d6fa8bf233 | ||
|
|
ec5e685a1c | ||
|
|
c88b95751c | ||
|
|
72ae25bc53 | ||
|
|
02e5cc1da8 | ||
|
|
3d092df56d | ||
|
|
912d5c700c | ||
|
|
6d3c492518 | ||
|
|
5e29e3f1cb | ||
|
|
0558495760 | ||
|
|
0471dfa2f8 | ||
|
|
7883e6544e | ||
|
|
6da87e4a79 | ||
|
|
bafe4fff93 | ||
|
|
da782398a2 | ||
|
|
4b26b46f6a | ||
|
|
0f1e69a2df | ||
|
|
85f2bd464c | ||
|
|
8a4956b736 | ||
|
|
4a369af4c7 | ||
|
|
9749305ecd | ||
|
|
639178dbdc | ||
|
|
62d038b547 | ||
|
|
9b80e3a33b | ||
|
|
0ea54f0458 | ||
|
|
374c52f71f | ||
|
|
60f63e125a | ||
|
|
7cfa7f3de4 | ||
|
|
92409831c2 | ||
|
|
e04790a628 | ||
|
|
cd7bf40508 | ||
|
|
dc378e9ce7 | ||
|
|
5fcdcec1a8 | ||
|
|
8773704c8b | ||
|
|
291fd1857e | ||
|
|
0aa4aeaddc | ||
|
|
ca81f1b2e8 | ||
|
|
fca3a14410 | ||
|
|
d105e80ed8 | ||
|
|
ce63faa597 | ||
|
|
25c1b63a00 | ||
|
|
548728abba | ||
|
|
2ebdbd565a | ||
|
|
86376616ff | ||
|
|
7c6865f948 | ||
|
|
c2da0070f5 | ||
|
|
bf2a2aed66 | ||
|
|
403ea0a0e1 | ||
|
|
27976cbe1a | ||
|
|
70147396a4 | ||
|
|
d6aed16e7c | ||
|
|
0414bae820 | ||
|
|
620866bc39 | ||
|
|
55f080e33f | ||
|
|
9f2b1b03d7 | ||
|
|
c0a0f3aaf5 | ||
|
|
7726b5c56b | ||
|
|
3daff8ab8a | ||
|
|
428c2097c7 | ||
|
|
7786583ecf | ||
|
|
9b79ea7d30 | ||
|
|
3dc8436362 | ||
|
|
9f1f2a4845 | ||
|
|
40204e8133 | ||
|
|
133b1067c5 | ||
|
|
5c8287203e | ||
|
|
061bbb1914 | ||
|
|
572168ef20 | ||
|
|
1aa27f2da3 | ||
|
|
be76614c90 | ||
|
|
e26d355fb7 | ||
|
|
d8dbcef5dd | ||
|
|
5d6a6590bf | ||
|
|
7dfdfe5b50 | ||
|
|
36fcc460f4 | ||
|
|
24b03d42d6 | ||
|
|
60275d3637 | ||
|
|
9b5b471802 | ||
|
|
1edb96f526 | ||
|
|
f949bdcfe4 | ||
|
|
21a45a940e | ||
|
|
fb61dfd39d | ||
|
|
9b5940505b | ||
|
|
8c07a67fe9 | ||
|
|
0f9687ce62 | ||
|
|
1460e46d1f | ||
|
|
692521c49d | ||
|
|
2f1d8cc196 | ||
|
|
eeabb47fb6 | ||
|
|
e078f584eb | ||
|
|
f86322545a | ||
|
|
720e19a01f | ||
|
|
3560fed86e | ||
|
|
5f8f5a9f85 | ||
|
|
1aae24b831 | ||
|
|
b544b1c3d4 | ||
|
|
f462f87183 | ||
|
|
6ed7ef25b2 | ||
|
|
bc79d09f2d | ||
|
|
5b2becb87f | ||
|
|
cd808fb5a5 | ||
|
|
c8a4e40bcf | ||
|
|
911b6c9679 | ||
|
|
03041f87c3 | ||
|
|
360c53d6ca | ||
|
|
3f1d555c71 | ||
|
|
ae1d72265c | ||
|
|
9570c65d88 | ||
|
|
3e0b04509a | ||
|
|
0884379e0b | ||
|
|
ec16532028 | ||
|
|
c8f13544a8 | ||
|
|
44bfe55413 | ||
|
|
b95c1adc86 | ||
|
|
b3a94c26d9 | ||
|
|
159c7238a8 | ||
|
|
70f40bab1d | ||
|
|
6c1a9dc14b | ||
|
|
816381a6a8 | ||
|
|
dd84bca638 | ||
|
|
a5d2019a39 | ||
|
|
26cee564c9 | ||
|
|
316b8a1375 | ||
|
|
618b25df08 | ||
|
|
8f9c4cd217 | ||
|
|
c6e2e33e87 | ||
|
|
db605ea7ca | ||
|
|
a1507d4844 | ||
|
|
c6340a64fe | ||
|
|
265b440c37 | ||
|
|
ea8e6d978d | ||
|
|
c3f5bc6bfb | ||
|
|
e322f6dbe2 | ||
|
|
83059a013c | ||
|
|
e374392450 | ||
|
|
72d505b2f1 | ||
|
|
a11bff0c7b | ||
|
|
a820ee4c82 | ||
|
|
a18be78bd3 | ||
|
|
83b5806cec | ||
|
|
4d7a1199ea | ||
|
|
d47cac563a | ||
|
|
2969290c63 | ||
|
|
277557cd99 | ||
|
|
21db7d438b | ||
|
|
61ff2da15c | ||
|
|
ad8296a535 | ||
|
|
aec3318f4c | ||
|
|
3297c3a2e2 | ||
|
|
84759de36f | ||
|
|
a562126f2f | ||
|
|
1901134601 | ||
|
|
eecb6986ee | ||
|
|
508cada017 | ||
|
|
2abae2f21a | ||
|
|
82c17dbde2 | ||
|
|
425499b3aa | ||
|
|
96605766bb | ||
|
|
161012b0a7 | ||
|
|
0669a053db | ||
|
|
ab66e77740 | ||
|
|
381cd53551 | ||
|
|
1f0e92a752 | ||
|
|
98b3496717 | ||
|
|
4200e2e4e4 | ||
|
|
e239ae1aba | ||
|
|
2acfc307b7 | ||
|
|
186f1cf714 | ||
|
|
a5cf42b7c8 | ||
|
|
fd7dba8860 | ||
|
|
32d7e365d2 | ||
|
|
1078cc1c91 | ||
|
|
c97fc370cd | ||
|
|
fca8da118e | ||
|
|
dda56405e6 | ||
|
|
f0f23d491c | ||
|
|
44c10d720a | ||
|
|
690e5a7f9c | ||
|
|
e4fdbc3cb4 | ||
|
|
fe2b86ba83 | ||
|
|
8fb9557520 | ||
|
|
25c91b398a | ||
|
|
8a524dd98f | ||
|
|
7371f8927c | ||
|
|
3d4f58d564 | ||
|
|
f0e32c88ec | ||
|
|
5ae3eccaf1 | ||
|
|
093f12254f | ||
|
|
3a8afe2969 | ||
|
|
fff5ae97f2 | ||
|
|
3c626e3ea5 | ||
|
|
26f57141a1 | ||
|
|
419aa9dcba | ||
|
|
3f15456b9c | ||
|
|
f67a2fa865 | ||
|
|
0f6de542bf | ||
|
|
1a529841e0 | ||
|
|
a9bf6a0e3b | ||
|
|
76dcd7d96e | ||
|
|
6aa1361b1a | ||
|
|
f623a4ecef | ||
|
|
aa465a12aa | ||
|
|
81ba623423 | ||
|
|
4f6f6cca0f | ||
|
|
56346f2a52 | ||
|
|
edcd3f5145 | ||
|
|
7acd3d5297 | ||
|
|
1732c16778 | ||
|
|
913d440c61 | ||
|
|
8cdb4d48f2 | ||
|
|
907ac05c00 | ||
|
|
067558529c | ||
|
|
c97e653ba1 | ||
|
|
9a935ba90c | ||
|
|
134ed51517 | ||
|
|
993dd84af9 | ||
|
|
28e3ab73fa | ||
|
|
70a5efa1d6 | ||
|
|
a51a355a53 | ||
|
|
fdd0a33571 | ||
|
|
6547d03b91 | ||
|
|
cc0c2f1b3c | ||
|
|
c80c59c692 | ||
|
|
10de191dd5 | ||
|
|
1626cec089 | ||
|
|
0404776d87 | ||
|
|
4398fca1bd | ||
|
|
e94ca12f9f | ||
|
|
036c2f6a1c | ||
|
|
611304e257 | ||
|
|
cf26447f7c | ||
|
|
e5b8e04dde | ||
|
|
bb201e6ca4 | ||
|
|
bb58d633c0 | ||
|
|
56ff8755d4 | ||
|
|
57fc027f77 | ||
|
|
bdb7c226f1 | ||
|
|
17e32017a7 | ||
|
|
2c772d0f4c | ||
|
|
769ff84a65 | ||
|
|
fd1fbd4843 | ||
|
|
eaa9430e26 | ||
|
|
2e5de88445 | ||
|
|
b4b9910203 | ||
|
|
afeeadd665 | ||
|
|
fcbeb10159 | ||
|
|
65227f601e | ||
|
|
56ae4dcd12 | ||
|
|
2b2c8e6b82 | ||
|
|
49c032315c | ||
|
|
15109f801e | ||
|
|
3de0a16a9d | ||
|
|
bb49b0c16a | ||
|
|
9561414985 | ||
|
|
db7354ab72 | ||
|
|
34396dbbec | ||
|
|
d842a2f62e | ||
|
|
a17c32bed0 | ||
|
|
fab0b91a79 | ||
|
|
88974d552d | ||
|
|
b90a38ce8b | ||
|
|
b3df27c362 | ||
|
|
854ea26ab7 | ||
|
|
e385b3499b | ||
|
|
77d323b38c | ||
|
|
64eeb091b8 | ||
|
|
65f5f8e8e2 | ||
|
|
6b3ee1aaaf | ||
|
|
27ca48c6bb | ||
|
|
2786c776e3 | ||
|
|
23cd5b906b | ||
|
|
0f9d20129d | ||
|
|
4649bd3906 | ||
|
|
3048ac2f6d | ||
|
|
8679377fcf | ||
|
|
db5264af3c | ||
|
|
059fbb9e5d | ||
|
|
01303c1e31 | ||
|
|
a8aaa793a0 | ||
|
|
c5698e82da | ||
|
|
ec12f7a5e7 | ||
|
|
b87fec554f | ||
|
|
740981376d | ||
|
|
8694364aa3 | ||
|
|
f1b1fee6e4 | ||
|
|
915596b23e | ||
|
|
6d65cb77ec | ||
|
|
51e2f8e49b | ||
|
|
0a7fc356b6 | ||
|
|
ff0f05a1c1 | ||
|
|
0ea9362d06 | ||
|
|
9d3932bd82 | ||
|
|
8c787fa7f7 | ||
|
|
2508e71324 | ||
|
|
b2f4f96ef9 | ||
|
|
fdae297fca | ||
|
|
36488fd836 | ||
|
|
ee01c944b4 | ||
|
|
d7f4f392d2 | ||
|
|
1756093618 | ||
|
|
1734c6e6bf | ||
|
|
839f345fa3 | ||
|
|
d69b5385e4 | ||
|
|
eb6b5755e7 | ||
|
|
9c65d9f957 | ||
|
|
cfa187f7d9 | ||
|
|
30d0fbeae6 | ||
|
|
9b21656314 | ||
|
|
b1b06a38af | ||
|
|
d2fffe5b88 | ||
|
|
09d560888e | ||
|
|
fa28326ed6 | ||
|
|
9ea4a6b7b6 | ||
|
|
ffa6fafcc1 | ||
|
|
4be5b80ff6 | ||
|
|
5028b07aaa | ||
|
|
7ce5dcdead | ||
|
|
7d8571b0e1 | ||
|
|
fca2fe2c8a | ||
|
|
75576577e0 | ||
|
|
eafc46f6c4 | ||
|
|
c0c36d3338 | ||
|
|
6a73b0820e | ||
|
|
bcb5eda7d8 | ||
|
|
2c833b5028 | ||
|
|
6821603980 | ||
|
|
8bec45cd58 | ||
|
|
ce0f44fb47 | ||
|
|
c740562dd8 | ||
|
|
63a1c8b63e | ||
|
|
112cdb4842 | ||
|
|
2d5f045c29 | ||
|
|
c43ff29f5d | ||
|
|
4c0e3c4db9 | ||
|
|
7995a57f77 | ||
|
|
0a47378f7f | ||
|
|
8e9a244cdd | ||
|
|
5f1a4ea08d | ||
|
|
034b19d85d | ||
|
|
68cb7ea471 | ||
|
|
d9a3ba0dd1 | ||
|
|
663e1d8336 | ||
|
|
31332f4f53 | ||
|
|
cb7163dd19 | ||
|
|
946029a3f7 | ||
|
|
69cbb6e109 | ||
|
|
6054f6bfe1 | ||
|
|
ae7b9f5fcb | ||
|
|
68dc6b9527 | ||
|
|
292cdfd5a0 | ||
|
|
28e2dee605 | ||
|
|
6d79ab2552 | ||
|
|
da17e424ea | ||
|
|
028c25afd3 | ||
|
|
9c2151dc37 | ||
|
|
9e9bd16b18 | ||
|
|
3f138aec22 | ||
|
|
e9f66e7c89 | ||
|
|
6be64b363c | ||
|
|
51230f21f5 | ||
|
|
e12540ba66 | ||
|
|
a6b1bee2af | ||
|
|
6187cdafe3 | ||
|
|
880f785d04 | ||
|
|
5aedcfd6a7 | ||
|
|
6ff1a2c236 | ||
|
|
317f888383 | ||
|
|
33f1f9abde | ||
|
|
913406b568 | ||
|
|
6a74d102a4 | ||
|
|
e9e36cebcb | ||
|
|
af6bf7a232 | ||
|
|
5720a7a5e3 | ||
|
|
449c946423 | ||
|
|
54a2a0da48 | ||
|
|
e209fedb27 | ||
|
|
12494f3008 | ||
|
|
7f60b46488 | ||
|
|
1c9ecd96d4 | ||
|
|
1f84803b91 | ||
|
|
3f6116f28f | ||
|
|
4ea0eb94d4 | ||
|
|
e222bc631a | ||
|
|
9c07c7fe4f | ||
|
|
35d74e18de | ||
|
|
266be2c25f | ||
|
|
b7cb090144 | ||
|
|
30e257bc2b | ||
|
|
fbd5679fb1 | ||
|
|
9db7234f24 | ||
|
|
220b2dc912 | ||
|
|
83c2420038 | ||
|
|
73913f450b | ||
|
|
bb966e7e6f | ||
|
|
b4adc127a4 | ||
|
|
2bc343b524 | ||
|
|
1f4d6eb0df | ||
|
|
ee936fe1a1 | ||
|
|
f6d9239b37 | ||
|
|
512e5b0240 | ||
|
|
600148f501 | ||
|
|
8791a4f696 | ||
|
|
ef40a8a925 | ||
|
|
2473e87947 | ||
|
|
bbe1dfb53d | ||
|
|
3bc27b1a02 | ||
|
|
ec4c6e140b | ||
|
|
545cc1074c | ||
|
|
9c0f4822bc | ||
|
|
5040ec109b | ||
|
|
25b216d7ef | ||
|
|
e475c847d7 | ||
|
|
e7c55c1ad6 | ||
|
|
cd8fcadd29 | ||
|
|
f78b6b30d9 | ||
|
|
cc6a991464 | ||
|
|
81d487dd89 | ||
|
|
af2795c07f | ||
|
|
178d9fb8d5 | ||
|
|
9bd12eb782 | ||
|
|
ef66650997 | ||
|
|
fcffcdde1b | ||
|
|
7de892ccac | ||
|
|
f90f2e051a | ||
|
|
24f49c8d83 | ||
|
|
a4ebaf15ab | ||
|
|
54a46dccc3 | ||
|
|
9747d5057d | ||
|
|
7f5c97d0be | ||
|
|
1933a76631 | ||
|
|
c20d7f9754 | ||
|
|
6b46dc7e89 | ||
|
|
0c1a26170c | ||
|
|
244ee08d7d | ||
|
|
a3acbca24b | ||
|
|
d77e4ed581 | ||
|
|
b928abb956 | ||
|
|
a46ef8d1a6 | ||
|
|
a5d459749f | ||
|
|
7dfa383968 | ||
|
|
036483d195 | ||
|
|
2c950f74bc | ||
|
|
2c59dcd929 | ||
|
|
658d14f31d | ||
|
|
819f4d2151 | ||
|
|
9b214d75df | ||
|
|
e0891a2d71 | ||
|
|
34a4876761 | ||
|
|
13ead0085d | ||
|
|
9e63270fc5 | ||
|
|
eccab3cd57 | ||
|
|
6446daf1a6 | ||
|
|
821602ef1c | ||
|
|
dc3512de9f | ||
|
|
36e9cb7108 | ||
|
|
42f4531720 | ||
|
|
d1fb379a40 | ||
|
|
e27bdb965c | ||
|
|
54fc6df3da | ||
|
|
9dd8f62c8a | ||
|
|
1db19148e7 | ||
|
|
93a01506e4 | ||
|
|
4767ed790c | ||
|
|
e39211347c | ||
|
|
a8cdbb65fe | ||
|
|
ff74ff4149 | ||
|
|
96e47f3d27 | ||
|
|
be52c181ea | ||
|
|
507f2ec544 | ||
|
|
fe00c628f4 | ||
|
|
e9387d322c | ||
|
|
2e3b135fe9 | ||
|
|
d28cc15be2 | ||
|
|
d15bd23800 | ||
|
|
90fe45c52d | ||
|
|
8f7be71905 | ||
|
|
5d583637c4 | ||
|
|
0efb4285c1 | ||
|
|
6dc543ca18 | ||
|
|
e93e1ddeb9 | ||
|
|
d5459f5996 | ||
|
|
c6420a910d | ||
|
|
f8e67b8e68 | ||
|
|
9ffcd382b4 | ||
|
|
725746badf | ||
|
|
9d5290de91 | ||
|
|
1bb0b58cce | ||
|
|
32f0ebbe61 | ||
|
|
25a1d74627 | ||
|
|
355b2f09bf | ||
|
|
01621f75b6 | ||
|
|
242e8a3bd6 | ||
|
|
010c26e716 | ||
|
|
e7bad10663 | ||
|
|
16242f98ce | ||
|
|
14a447b3d8 | ||
|
|
a2088fa500 | ||
|
|
87af68c092 | ||
|
|
06daad87ca | ||
|
|
0b4b86f6c9 | ||
|
|
10626904af | ||
|
|
90cca8a3eb | ||
|
|
8da0141cac | ||
|
|
39e123aaf4 | ||
|
|
24fd17f072 | ||
|
|
9270cc47b5 | ||
|
|
3721db34ab | ||
|
|
e85ae351c7 | ||
|
|
a56ba245ea | ||
|
|
d162eed4c7 | ||
|
|
43fea34f61 | ||
|
|
f7c960fc0d | ||
|
|
ee1933389a | ||
|
|
fdc9d5f1fd | ||
|
|
bad40b6125 | ||
|
|
d76ce85327 | ||
|
|
d3df072a22 | ||
|
|
4b3009a195 | ||
|
|
b72b0d60cb | ||
|
|
5841e62c66 | ||
|
|
9bd0c01702 | ||
|
|
6d86b3a950 | ||
|
|
5ff9b02c89 | ||
|
|
80934ea232 | ||
|
|
5acfa2bf3a | ||
|
|
4fada52e04 | ||
|
|
e1c8e95e11 | ||
|
|
1dfebad790 | ||
|
|
37ffe63d13 | ||
|
|
cc14c34dc2 | ||
|
|
e0cf4e644b | ||
|
|
aad55fc3db | ||
|
|
ba2b459220 | ||
|
|
086669fbe0 | ||
|
|
4cc3fcb6e8 | ||
|
|
8781053dbe | ||
|
|
bdac8974d8 | ||
|
|
9ae24141a3 | ||
|
|
e773efdc59 | ||
|
|
8f94bd1fbd | ||
|
|
d24d83d52a | ||
|
|
c938017baa | ||
|
|
728eea3ae1 | ||
|
|
88f9c1e539 | ||
|
|
76540c20f3 | ||
|
|
70761cf1d9 | ||
|
|
ace913a97d | ||
|
|
d6e269c7f6 | ||
|
|
ec10550b3a | ||
|
|
86e2374b48 | ||
|
|
d156dacbb9 | ||
|
|
1af5517da0 | ||
|
|
e5d34890a9 | ||
|
|
183b2548cf | ||
|
|
d2de489e3a | ||
|
|
90f8dbd86e | ||
|
|
3508ce19f3 | ||
|
|
00188c9818 | ||
|
|
499232f0e6 | ||
|
|
17471a12d2 | ||
|
|
de4b5eeda7 | ||
|
|
d0a0193707 | ||
|
|
5269a26b69 | ||
|
|
8dc6ad587f | ||
|
|
757339c52d | ||
|
|
6e289339d7 | ||
|
|
3ff0a44a1c | ||
|
|
0562228e9a | ||
|
|
0b6993bb7c | ||
|
|
4a19d90d48 | ||
|
|
038b1bcf7b | ||
|
|
a707c2fe8e | ||
|
|
3bb119f578 | ||
|
|
2a92600fa7 | ||
|
|
e80e1dab4d | ||
|
|
45d59d75ba | ||
|
|
28cd4c3ee9 | ||
|
|
e7c44274b0 | ||
|
|
3b2e0e34ef | ||
|
|
2276df07bd | ||
|
|
758ff03520 | ||
|
|
c3ac172960 | ||
|
|
562b4eb531 | ||
|
|
b1f8e845df | ||
|
|
bda869ea54 | ||
|
|
19cfbf082a | ||
|
|
07078bdd1f | ||
|
|
03657a98e1 | ||
|
|
b3f64abfae | ||
|
|
5d73c8f002 | ||
|
|
ba0882762d | ||
|
|
bb8855b628 | ||
|
|
883d5917f5 | ||
|
|
0275e99fe2 | ||
|
|
5d109077e5 | ||
|
|
540851ab6a | ||
|
|
6b920fa5e6 | ||
|
|
d1498bb9fb | ||
|
|
54eeef173a | ||
|
|
723ddf8cda | ||
|
|
9f12552907 | ||
|
|
a8b6fa413e | ||
|
|
76aae8ce42 | ||
|
|
ad0c287053 | ||
|
|
4a11a3559d | ||
|
|
1faa5a80e4 | ||
|
|
f1d3df1ec0 | ||
|
|
e7c94d3351 | ||
|
|
954f76dcf5 | ||
|
|
43037c0ff9 | ||
|
|
93df901b71 | ||
|
|
e97e645eda | ||
|
|
4a03ba3874 | ||
|
|
7f637e4acc | ||
|
|
8f3eeefafd | ||
|
|
5dc550a0ce | ||
|
|
6fe322da27 | ||
|
|
3cfe7c9a56 | ||
|
|
be7d5917cb | ||
|
|
ca28aa6ebd | ||
|
|
e76360c1b5 | ||
|
|
265ca8ba67 | ||
|
|
b0d942d0ec | ||
|
|
6c25905ae4 | ||
|
|
80a39393fe | ||
|
|
d4aed71abf | ||
|
|
ebb72bb992 | ||
|
|
8ffcd30b4d | ||
|
|
06804c37e2 | ||
|
|
1acca0278c | ||
|
|
639c8d4171 | ||
|
|
d77c9d3fca | ||
|
|
2c7cc2c191 | ||
|
|
d7c74b8004 | ||
|
|
aaa8003418 | ||
|
|
86890b13c6 | ||
|
|
39158b0eb6 | ||
|
|
87f1d55bc2 | ||
|
|
14343b5410 | ||
|
|
ffdac30b3c | ||
|
|
244c8dc391 | ||
|
|
e593344461 | ||
|
|
74c46f6e93 | ||
|
|
bbfd8aa249 | ||
|
|
2705a488ad | ||
|
|
850c253e08 | ||
|
|
80e0e3fcd7 | ||
|
|
2cc2d696f1 | ||
|
|
8a83a6b5be | ||
|
|
002d5338a0 | ||
|
|
743aa472f0 | ||
|
|
ba85d5d351 | ||
|
|
4e2ef908dc | ||
|
|
f5dd05ba8e | ||
|
|
17eda2a4cc | ||
|
|
d219c6e019 | ||
|
|
2dc539747b | ||
|
|
e941de50e8 | ||
|
|
63052257a2 | ||
|
|
ac5d2a714e | ||
|
|
59f78c16b1 | ||
|
|
3f7f8133df | ||
|
|
fef5e1ce2c | ||
|
|
0b97b3864f | ||
|
|
3d1330c85d | ||
|
|
041c0cc322 | ||
|
|
e72712640c | ||
|
|
6830195127 | ||
|
|
f9b5d6644d | ||
|
|
40f9eeda36 | ||
|
|
0fa0b0b1ea | ||
|
|
ff0b23f200 | ||
|
|
5456d4081b | ||
|
|
8948fae780 | ||
|
|
ee4542a699 | ||
|
|
31e4e631f9 | ||
|
|
cbf20b3271 | ||
|
|
a65fd50723 | ||
|
|
63a6aac2d8 | ||
|
|
afde4804c9 | ||
|
|
bc8ec9cd3e | ||
|
|
b63ab18e29 | ||
|
|
e7325f58c3 | ||
|
|
7b35bb8c96 | ||
|
|
e84671ce5d | ||
|
|
b01d50fe05 | ||
|
|
3f163051b1 | ||
|
|
4f1d03e1d4 | ||
|
|
fc39e4a225 | ||
|
|
bf88ad7fc8 | ||
|
|
11ba02067e | ||
|
|
952afa05ce | ||
|
|
3131cc3160 | ||
|
|
792f768479 | ||
|
|
ff312a15dd | ||
|
|
36207c9a98 | ||
|
|
b92105e888 | ||
|
|
35bd7c55d0 | ||
|
|
9f19c302d8 | ||
|
|
87b1ac776f | ||
|
|
41e401b05e | ||
|
|
d88da3589d | ||
|
|
9638c393bb | ||
|
|
9961ddc2a8 | ||
|
|
2d40dfd8d4 | ||
|
|
99c9bdf71d | ||
|
|
4fcd25ec88 | ||
|
|
440218da67 | ||
|
|
fefdb9fc8d | ||
|
|
21a0eff593 | ||
|
|
8825a094ae | ||
|
|
aa49ce5c56 | ||
|
|
1522d3385d | ||
|
|
510c41440a | ||
|
|
aa0c34ba1c | ||
|
|
af87e6ef62 | ||
|
|
30291ce6e6 | ||
|
|
890c2eb564 | ||
|
|
67a269b89c | ||
|
|
4b9ee81a78 | ||
|
|
4343f4d229 | ||
|
|
2162baa6c0 | ||
|
|
7e7f792710 | ||
|
|
1bbd9e24b0 | ||
|
|
6435aaa64f | ||
|
|
999aae0a33 | ||
|
|
ba795639b4 | ||
|
|
4c4b205721 | ||
|
|
b3c550b7c0 | ||
|
|
eb8953e784 | ||
|
|
b88b292d5d | ||
|
|
5f42c3b319 | ||
|
|
5b27ae0371 | ||
|
|
f26b1da1b5 | ||
|
|
7a853e2dcb | ||
|
|
9b22748bd0 | ||
|
|
c1e9dd3373 | ||
|
|
8cbbc47043 | ||
|
|
81b3567133 | ||
|
|
fc6568f390 | ||
|
|
8e30fe2946 | ||
|
|
6c811a3261 | ||
|
|
afbe5aa540 | ||
|
|
324afd2d6c | ||
|
|
58d94ef61e | ||
|
|
39974b0982 | ||
|
|
323d7306e2 | ||
|
|
251e228ce4 | ||
|
|
a99f3f217a | ||
|
|
e2acbee113 | ||
|
|
37b69eddf2 | ||
|
|
f0322e6f2c | ||
|
|
756587d080 | ||
|
|
1ad2c92324 | ||
|
|
e5433adf78 | ||
|
|
ed765f75d8 | ||
|
|
4136f1b377 | ||
|
|
860339b90e | ||
|
|
03254a0c0f | ||
|
|
a76081c979 | ||
|
|
71a207079f | ||
|
|
f6e724c4c5 | ||
|
|
4251b36b25 | ||
|
|
b8f39cbfdf | ||
|
|
088c621862 | ||
|
|
2459a53350 | ||
|
|
7093e9c0d4 | ||
|
|
4bc49978d1 | ||
|
|
96bac9c149 | ||
|
|
8dcc15f4d3 | ||
|
|
8183740c04 | ||
|
|
25e4231d7b | ||
|
|
3ed9e0e905 | ||
|
|
45bec0c440 | ||
|
|
5133e39d45 | ||
|
|
cb3b4e446e | ||
|
|
9829a2f3b4 | ||
|
|
7eadf11145 | ||
|
|
2a2bc44f43 | ||
|
|
9ccfa5cec9 | ||
|
|
02687f3c78 | ||
|
|
7ea7a6cbb1 | ||
|
|
a15a28fe5b | ||
|
|
265dedfae1 | ||
|
|
5ddbb8bc56 | ||
|
|
4101b8e937 | ||
|
|
56b6d50479 | ||
|
|
506f585d78 | ||
|
|
577dfb7220 | ||
|
|
7e4286adde | ||
|
|
1090228628 | ||
|
|
aeea861b73 | ||
|
|
997c43bbdd | ||
|
|
958d4dbd2e | ||
|
|
f2b350eb62 | ||
|
|
a3464780a1 | ||
|
|
fe1eb92196 | ||
|
|
0b2d26ec92 | ||
|
|
8024a25f2b | ||
|
|
d287ecbb34 | ||
|
|
d9c95e7730 | ||
|
|
c3b1af31ce | ||
|
|
465576b5cb | ||
|
|
9ecbcd0075 | ||
|
|
c1f62d72ae | ||
|
|
1b27834c41 | ||
|
|
77804907b6 | ||
|
|
9dfa2609be | ||
|
|
8ffb3ab3c4 | ||
|
|
65e1da34fa | ||
|
|
282110807c | ||
|
|
25e5f43d1c | ||
|
|
ce0441694d | ||
|
|
db29699927 | ||
|
|
9a4e2d7617 | ||
|
|
fbf64585b7 | ||
|
|
6d1c6dfd16 | ||
|
|
e78df4d981 | ||
|
|
a757b4d5dc | ||
|
|
d28036ee91 | ||
|
|
d2ba0d4e7a | ||
|
|
5787436177 | ||
|
|
f5ab24b8d2 | ||
|
|
05c0f32a24 | ||
|
|
7b918f77a9 | ||
|
|
d87929d61c | ||
|
|
a926829c33 | ||
|
|
d58e366c40 | ||
|
|
0fb4f7e1c4 | ||
|
|
6ee606e3e2 | ||
|
|
22d4a7690f | ||
|
|
f3a2f5018a | ||
|
|
d2a7589f7c | ||
|
|
f87b4e04f1 | ||
|
|
b5aa4c1f0c | ||
|
|
0c1eb6d288 | ||
|
|
8a03c5f998 | ||
|
|
60aa50ae45 | ||
|
|
aae6bbbb66 | ||
|
|
5ca903c428 | ||
|
|
e86b07f760 | ||
|
|
d7fea5dc78 | ||
|
|
c1eff5aebb | ||
|
|
f2dc490d6f | ||
|
|
b296e1b340 | ||
|
|
8adb060edb | ||
|
|
c3b984fea7 | ||
|
|
afbb2c338b | ||
|
|
6632241ab5 | ||
|
|
be50df81db | ||
|
|
9763b6e2cf | ||
|
|
812b848daf | ||
|
|
4907a7389f | ||
|
|
17dff36b65 | ||
|
|
904921d8c4 | ||
|
|
ac4c075d32 | ||
|
|
ddde64ece9 | ||
|
|
91c097e88d | ||
|
|
894658a3f5 | ||
|
|
a4454ea5f9 | ||
|
|
8ea8fa3a8a | ||
|
|
7480603295 | ||
|
|
079b749d5d | ||
|
|
4815600e85 | ||
|
|
1c63e2d295 | ||
|
|
cf13eca58c | ||
|
|
3cf4607870 | ||
|
|
23c3ba6ad7 | ||
|
|
17fc3c2317 | ||
|
|
af234cbe54 | ||
|
|
c8517c0ec9 | ||
|
|
20b226454b | ||
|
|
98eccf223a | ||
|
|
0fc2ab4d41 | ||
|
|
641b6efe7f | ||
|
|
4c83435b4b | ||
|
|
9f7319cff4 | ||
|
|
dd9baa1502 | ||
|
|
41b4d0daa1 | ||
|
|
e41b181163 | ||
|
|
288ac115d0 | ||
|
|
6774d46a6f | ||
|
|
607abf89f7 | ||
|
|
27f1e5e2f2 | ||
|
|
a457675ce1 | ||
|
|
82049096e6 | ||
|
|
6c965e0223 | ||
|
|
8b4d952929 | ||
|
|
873cc63f94 | ||
|
|
39fc839ff2 | ||
|
|
4edef4c959 | ||
|
|
1d9ced8037 | ||
|
|
4cb77d1429 | ||
|
|
b52d9d1bdd | ||
|
|
5fe7ca5e70 | ||
|
|
62fb440de2 | ||
|
|
96fbd7c7ba | ||
|
|
c9bec8e636 | ||
|
|
769e03e7f2 | ||
|
|
ab83f2d5e2 | ||
|
|
b60d0cdb17 | ||
|
|
677503dbf1 | ||
|
|
25efa29470 | ||
|
|
21a90f8f8f | ||
|
|
64e8d6ae99 | ||
|
|
16a204335e | ||
|
|
0a53f762fe | ||
|
|
6ba4778c1b | ||
|
|
0404c2266c | ||
|
|
e5e914282f | ||
|
|
9867d4bdc3 | ||
|
|
e4cb7112cf | ||
|
|
2d202e90b7 | ||
|
|
016391e442 | ||
|
|
1eff48a429 | ||
|
|
ce33af6bb5 | ||
|
|
fb9d4303f1 | ||
|
|
4e631c9e8f | ||
|
|
766d67d80d | ||
|
|
e2c2a37221 | ||
|
|
2b23020695 | ||
|
|
8d43c6b1a8 | ||
|
|
7362dd1a7c | ||
|
|
316caf7e8c | ||
|
|
87dc6631ee | ||
|
|
62246d7d43 | ||
|
|
a14be3a42c | ||
|
|
7fdf00d5e9 | ||
|
|
99e02f30fb | ||
|
|
716a5b9b5a | ||
|
|
87f880ca52 | ||
|
|
8ec7b84a78 | ||
|
|
05cf5bc8db | ||
|
|
ac25e21a0c | ||
|
|
cc1e0daaa4 | ||
|
|
f4120a9c8c | ||
|
|
e3b80a5e09 | ||
|
|
ef7cb26b01 | ||
|
|
408a5c168f | ||
|
|
0ad6ac95b2 | ||
|
|
bda4747e9c | ||
|
|
bd8f882c94 | ||
|
|
32b5b5b1c4 | ||
|
|
c1e543c9fe | ||
|
|
3908fa5c57 | ||
|
|
1b347fc185 | ||
|
|
282a5e0b01 | ||
|
|
e9d23cc1ea | ||
|
|
34173fd60f | ||
|
|
d0d3c8ef57 | ||
|
|
11912008dd | ||
|
|
c122007e17 | ||
|
|
69dfa1a175 | ||
|
|
bfea443e55 | ||
|
|
680798c28f | ||
|
|
9f0cc45c45 | ||
|
|
0ac97f467f | ||
|
|
647746ea72 | ||
|
|
7bea30b2e6 | ||
|
|
12bc852c89 | ||
|
|
0d42e84045 | ||
|
|
897b85b607 | ||
|
|
5c55cf0efb | ||
|
|
eccd6463f6 | ||
|
|
4a0897c734 | ||
|
|
c86a16df7f | ||
|
|
2ae0e9d902 | ||
|
|
bba18cd56b | ||
|
|
2f20781e16 | ||
|
|
3bee212876 | ||
|
|
6c8893a550 | ||
|
|
9c52ecc19b | ||
|
|
692c884ca2 | ||
|
|
3ef51d7fae | ||
|
|
73d95de122 | ||
|
|
04a568ac9b | ||
|
|
a45499cf04 | ||
|
|
b847d672ab | ||
|
|
3ffefdf6b5 | ||
|
|
cca4c4be80 | ||
|
|
cb9e044cb3 | ||
|
|
fd25dd83bd | ||
|
|
584bb00cfc | ||
|
|
5b9369d344 | ||
|
|
a64506a0de | ||
|
|
2fc83ef80b | ||
|
|
8bee3ebd65 | ||
|
|
99686fdd73 | ||
|
|
33bc3d6a1e | ||
|
|
90597530a4 | ||
|
|
b2af8da9a2 | ||
|
|
05dbf41fdc | ||
|
|
c56bb56708 | ||
|
|
4def1ea1dc | ||
|
|
0ba05e4de0 | ||
|
|
24fce89155 | ||
|
|
1a3c20f91d | ||
|
|
fe3e78cc1c | ||
|
|
749f49b1a0 | ||
|
|
f14010a09d | ||
|
|
0b48b9c7d4 | ||
|
|
13d62b01d1 | ||
|
|
4e7b71db1d | ||
|
|
069fc1f97b | ||
|
|
8684f75254 | ||
|
|
11cd924ce1 | ||
|
|
e2fd0cfc4e | ||
|
|
5eb3106706 | ||
|
|
1831efbe9d | ||
|
|
38edbadca5 | ||
|
|
6fcd80b979 | ||
|
|
cf5e5dbe55 | ||
|
|
a451861bf1 | ||
|
|
7313dd74a6 | ||
|
|
32b9de05f2 | ||
|
|
c79bed22f8 | ||
|
|
cdeb50132d | ||
|
|
090fb09955 | ||
|
|
54b862bd79 | ||
|
|
e37e1c109a | ||
|
|
939123785b | ||
|
|
221b347bd9 | ||
|
|
af9bf3e852 | ||
|
|
ed8746df77 | ||
|
|
bb187db49d | ||
|
|
081e72b3ea | ||
|
|
6188c38053 | ||
|
|
12b0186f5a | ||
|
|
9bccc9c53c | ||
|
|
351b2b320e | ||
|
|
94258feb09 | ||
|
|
8b0f033a78 | ||
|
|
f58f255fc8 | ||
|
|
e3eabcf648 | ||
|
|
9aa506cbd7 | ||
|
|
d8cff7b90f | ||
|
|
07e7bca9eb | ||
|
|
e1f442be90 | ||
|
|
c5d579e0e3 | ||
|
|
5271c2e08f | ||
|
|
9010a7ddbc | ||
|
|
bb95fb7d07 | ||
|
|
2edb11376d | ||
|
|
e7f5ebf912 | ||
|
|
da9758c2f3 | ||
|
|
3e11d58d73 | ||
|
|
6b35c097d6 | ||
|
|
619ba13265 | ||
|
|
529c5b8abf | ||
|
|
3a5ed6e800 | ||
|
|
52cddc015b | ||
|
|
4a01f4f65f | ||
|
|
f9768cb5a3 | ||
|
|
221e0e550c | ||
|
|
d2d1d42d0f | ||
|
|
faf018a097 | ||
|
|
a2a71a107e | ||
|
|
fc9c937e67 | ||
|
|
b4f2e9b442 | ||
|
|
1672645e73 | ||
|
|
4a42c44101 | ||
|
|
383b1a5769 | ||
|
|
77bac4cf9e | ||
|
|
e2b8e530c9 | ||
|
|
e9f752bd67 | ||
|
|
4b31921eb4 | ||
|
|
3df9fc6225 | ||
|
|
b57fe466ce | ||
|
|
bd4bff3b6b | ||
|
|
9d4618a223 | ||
|
|
93636180df | ||
|
|
fcceaa168f | ||
|
|
2639cc6138 | ||
|
|
4a99c2e928 | ||
|
|
7d5af3df05 | ||
|
|
c88b80d2a0 | ||
|
|
819d4abaa2 | ||
|
|
20630aeb47 | ||
|
|
0c0db3babb | ||
|
|
e7761f7e57 | ||
|
|
064fd497ae | ||
|
|
49c60b6b75 | ||
|
|
ca7f36506c | ||
|
|
155f0a9736 | ||
|
|
25e1eb3ce9 | ||
|
|
f2f980928b | ||
|
|
1d121a97a7 | ||
|
|
211d13da09 | ||
|
|
11343d469e | ||
|
|
d7c8041aa1 | ||
|
|
9587e30af8 | ||
|
|
76fa7affaf | ||
|
|
2971dd8672 | ||
|
|
2a33fe3564 | ||
|
|
46cdf5da70 | ||
|
|
28c801bfd4 | ||
|
|
c22cd40293 | ||
|
|
56bd430983 | ||
|
|
d873890e46 | ||
|
|
d29b8eca3c | ||
|
|
6f258000fe | ||
|
|
255211cd07 | ||
|
|
f6d28a90e3 | ||
|
|
ed66ff88a1 | ||
|
|
82e58f2bf9 | ||
|
|
797a87ca26 | ||
|
|
ec6a709393 | ||
|
|
07cbfdb424 | ||
|
|
3b9bd944fb | ||
|
|
934e585cb3 | ||
|
|
3a68f4cf54 | ||
|
|
bd00fcb875 | ||
|
|
905dd5a70f | ||
|
|
c65250ec39 | ||
|
|
607eec6ff0 | ||
|
|
14fb3bde60 | ||
|
|
6782bc8ca2 | ||
|
|
3db6841305 | ||
|
|
f478fa8029 | ||
|
|
d255f8400f | ||
|
|
a1545c60d6 | ||
|
|
ed48603ab5 | ||
|
|
23a0507439 | ||
|
|
482e013887 | ||
|
|
265727c30f | ||
|
|
4d3f4e096b | ||
|
|
7629bca62d | ||
|
|
2712f17262 | ||
|
|
86a37559ba | ||
|
|
b504a557f4 | ||
|
|
e849b46f6b | ||
|
|
738dc50a6f | ||
|
|
3138523b5b | ||
|
|
537643a4c3 | ||
|
|
04bfe098ed | ||
|
|
c507887bdd | ||
|
|
ee261313ac | ||
|
|
c9c152bc8a | ||
|
|
6c8e19a321 | ||
|
|
218e3b66f2 | ||
|
|
1d3488fa8e | ||
|
|
f4c1682592 | ||
|
|
28ac6623c7 | ||
|
|
16ab179e1d | ||
|
|
a8ff5385dc | ||
|
|
9dc33c6086 | ||
|
|
b17c576705 | ||
|
|
96f8f2891b | ||
|
|
581d73afe0 | ||
|
|
1baefebe8f | ||
|
|
39fb05033f | ||
|
|
c6093c084c | ||
|
|
dfec6d9a6d | ||
|
|
08b1261c75 | ||
|
|
2ad6faae3a | ||
|
|
4eff301db3 | ||
|
|
447e43e8f4 | ||
|
|
7457001275 | ||
|
|
fcabd5e79e | ||
|
|
594002316c | ||
|
|
eccf92ebaf | ||
|
|
ad9ddc5621 | ||
|
|
1825dd916e | ||
|
|
dfcde8171e | ||
|
|
b0361183df | ||
|
|
71fe13b249 | ||
|
|
442f51224d | ||
|
|
974678f500 | ||
|
|
8329409c03 | ||
|
|
06c2ac2724 | ||
|
|
04e9e8f9d8 | ||
|
|
7a3330cb8c | ||
|
|
cae29941ea | ||
|
|
15cf2ad076 | ||
|
|
2f16f6dc23 | ||
|
|
528aebffe4 | ||
|
|
e82b2f0cbe | ||
|
|
73e64f3e4a | ||
|
|
15f5b1f830 | ||
|
|
1b0a77f9a8 | ||
|
|
0f82ae3644 | ||
|
|
de3b01b54b | ||
|
|
c17e3646d5 | ||
|
|
26aed3e89e | ||
|
|
74caea8f8f | ||
|
|
2cf07fa072 | ||
|
|
1181cd2fd7 | ||
|
|
850d55ab45 | ||
|
|
a0c91b8754 | ||
|
|
937bdc05c8 | ||
|
|
453755bfa1 | ||
|
|
400b6fbb61 | ||
|
|
8c4e882fa3 | ||
|
|
84eec23793 | ||
|
|
7dfe69f6a5 | ||
|
|
ada6115073 | ||
|
|
e1643566f9 | ||
|
|
053a9a6317 | ||
|
|
425b976cc0 | ||
|
|
5f5f1b1e09 | ||
|
|
e6f4935c7b | ||
|
|
6452e5976b | ||
|
|
2383dff317 | ||
|
|
de3e5042fb | ||
|
|
0dcc35152c | ||
|
|
8eecfcbfaf | ||
|
|
efa3e60f89 | ||
|
|
782df659bc | ||
|
|
0aa158824f | ||
|
|
da7fb44e5d | ||
|
|
4b59ef802e | ||
|
|
be5789cd56 | ||
|
|
9adf0e5d59 | ||
|
|
e2de22470e | ||
|
|
3b7ab2e553 | ||
|
|
8617dedc46 | ||
|
|
0b8f1a9a58 | ||
|
|
16748c0920 | ||
|
|
01ec585a44 | ||
|
|
b5f2295f37 | ||
|
|
d6ca0199b7 | ||
|
|
2257c5e547 | ||
|
|
b5a3d39799 | ||
|
|
a26c3e9d3c | ||
|
|
98a09532eb | ||
|
|
d736789bbc | ||
|
|
82a6cfc03a | ||
|
|
62e9c7c75a | ||
|
|
eb32bd45e7 | ||
|
|
4b95f07923 | ||
|
|
dea8ad4c49 | ||
|
|
96553b217c | ||
|
|
3f79ed5d91 | ||
|
|
1e4283aad3 | ||
|
|
1dda31a28c | ||
|
|
10c87012be | ||
|
|
bda00bf512 | ||
|
|
c8f871ff2a | ||
|
|
58dc0b1aef | ||
|
|
4cd4d8f31a | ||
|
|
b751fd738d | ||
|
|
f97c6fb94c | ||
|
|
219138ade6 | ||
|
|
9086d189b9 | ||
|
|
d1178defe0 | ||
|
|
691a561a95 | ||
|
|
aaaac93bd0 | ||
|
|
fd790566b2 | ||
|
|
db3b429784 | ||
|
|
40ed3278d4 | ||
|
|
d174b13111 | ||
|
|
1708663b32 | ||
|
|
6fdce4ad0d | ||
|
|
fff8d5f07d | ||
|
|
9c8e1f4706 | ||
|
|
0a1036c78f | ||
|
|
0e881a7972 | ||
|
|
839e52ba30 | ||
|
|
8f7d5dcb4d | ||
|
|
1104b28bc1 | ||
|
|
48521cb1e4 | ||
|
|
17e113dafb | ||
|
|
c33825a904 | ||
|
|
b07ef98c8f | ||
|
|
b3d68893df | ||
|
|
1329599987 | ||
|
|
2adf3f364c | ||
|
|
436ee34a02 | ||
|
|
4a6e17b214 | ||
|
|
6e9cbccde6 | ||
|
|
a0cb8ec124 | ||
|
|
21217dfda3 | ||
|
|
25ba18e570 | ||
|
|
a210377f35 | ||
|
|
07b9ca457f | ||
|
|
5f1372d39c | ||
|
|
01b84c79f0 | ||
|
|
4017443b1e | ||
|
|
fd2a17d244 | ||
|
|
126804f7c3 | ||
|
|
5167bbf59e | ||
|
|
8bcdfa2793 | ||
|
|
2f9cb6a91e | ||
|
|
662be14535 | ||
|
|
d6d065cd61 | ||
|
|
ac7f045708 | ||
|
|
ffe02ad7bf | ||
|
|
db1a87d10c | ||
|
|
4bae41ffd8 | ||
|
|
be36fb979f | ||
|
|
0f66d763e0 | ||
|
|
06f4743f51 | ||
|
|
9cc11b8774 | ||
|
|
de821e55ae | ||
|
|
463b5c6e49 | ||
|
|
65ab5fdb34 | ||
|
|
d2f7a035b3 | ||
|
|
bc0b924283 | ||
|
|
56ad6af5b2 | ||
|
|
c50bb3a5a9 | ||
|
|
d993a62263 | ||
|
|
82bc52b909 | ||
|
|
f31598f916 | ||
|
|
6a9efd8ac6 | ||
|
|
a9dddb6066 | ||
|
|
40cf5c99ef | ||
|
|
42f58cbbb3 | ||
|
|
fd9c780015 | ||
|
|
383b92b207 | ||
|
|
7036ed5e2f | ||
|
|
30666aa111 | ||
|
|
9614d68baa | ||
|
|
c25fb4c743 | ||
|
|
09d5222b1f | ||
|
|
426ca78bf7 | ||
|
|
a77a0945fe | ||
|
|
5311a0f903 | ||
|
|
d421656be8 | ||
|
|
04459eaa50 | ||
|
|
3beda8eea0 | ||
|
|
5e894be06b | ||
|
|
bc8f93b596 | ||
|
|
2fb93bac99 | ||
|
|
d0c94c1aef | ||
|
|
77242bfb95 | ||
|
|
5d2d86bffc | ||
|
|
8492c13e72 | ||
|
|
e4eb5dadda | ||
|
|
8532dc4b75 | ||
|
|
1ca26ce676 | ||
|
|
d8e3e823a7 | ||
|
|
473dd7660b | ||
|
|
5afeed56ef | ||
|
|
b91b04f652 | ||
|
|
25de44a23d | ||
|
|
00cfb95971 | ||
|
|
f4ba0e1191 | ||
|
|
6499643769 | ||
|
|
f85287a444 | ||
|
|
483bc9ad87 | ||
|
|
93b89a93c1 | ||
|
|
10064c046c | ||
|
|
a5aecb9d0e | ||
|
|
de1e889f1d | ||
|
|
16f89b40c3 | ||
|
|
0e387d2cda | ||
|
|
837c15e4f9 | ||
|
|
ae7e353169 | ||
|
|
6c1bbd2344 | ||
|
|
27247e8e56 | ||
|
|
08249d78ea | ||
|
|
827091e522 | ||
|
|
13d901bf8d | ||
|
|
e69bdabc99 | ||
|
|
e8d19265e4 | ||
|
|
49e3a49dc5 | ||
|
|
82a7c01898 | ||
|
|
c0d7dbf639 | ||
|
|
569caa0bf2 | ||
|
|
f88ea1ee7d | ||
|
|
d5a8fa0b97 | ||
|
|
3f8f96edea | ||
|
|
04fb4aff28 | ||
|
|
83c6fb089e | ||
|
|
9d8d17b964 | ||
|
|
39d4842ff5 | ||
|
|
cad8473986 | ||
|
|
5f085ccb52 | ||
|
|
b406246689 | ||
|
|
cbe46afdff | ||
|
|
a59d6dc3c7 | ||
|
|
2afb2dd5fd | ||
|
|
4fc3c969d3 | ||
|
|
1796ce324b | ||
|
|
5e04c7f827 | ||
|
|
20fcede440 | ||
|
|
012c1833f2 | ||
|
|
32e8e03256 | ||
|
|
dca653cb92 | ||
|
|
0805eca979 | ||
|
|
17935a78ff | ||
|
|
e16918ee32 | ||
|
|
78471b4595 | ||
|
|
c30bcdd515 | ||
|
|
ac78c5f4e5 | ||
|
|
57a990ce25 | ||
|
|
24825b42a2 | ||
|
|
4f7323f7fc | ||
|
|
a228be85e2 | ||
|
|
fa565bdbdf | ||
|
|
2dc53223e5 | ||
|
|
958ac72805 | ||
|
|
f7297b84e7 | ||
|
|
9a7d9e7bb8 | ||
|
|
fa9df75cf7 | ||
|
|
e3ec76418b | ||
|
|
102d6d8c84 | ||
|
|
a742b5f3e2 | ||
|
|
a2a3bb291f | ||
|
|
b7c0ac7d67 | ||
|
|
13b1fc6b44 | ||
|
|
3939fcf6e7 | ||
|
|
13abbb81af | ||
|
|
019f0153c8 | ||
|
|
8abc2925e0 | ||
|
|
996c9a032a | ||
|
|
22d3794d22 | ||
|
|
ba948a38e9 | ||
|
|
e8a522c4df | ||
|
|
c60f3da32e | ||
|
|
0c92d3cbb2 | ||
|
|
e4fc8dd6fe | ||
|
|
1a849e2de0 | ||
|
|
ffdd79f86b | ||
|
|
e87e46b1b6 | ||
|
|
3ca81a4ff7 | ||
|
|
5477d3c292 | ||
|
|
08300183b3 | ||
|
|
095c77f22c | ||
|
|
09926e63a3 | ||
|
|
87d70f29a1 | ||
|
|
3a7661b111 | ||
|
|
ec976953cd | ||
|
|
1837562b50 | ||
|
|
f3bec4fc37 | ||
|
|
c2117ef4fd | ||
|
|
910804ecd1 | ||
|
|
ce5ae1dfdd | ||
|
|
2c31411ffb | ||
|
|
84d69fa2a1 | ||
|
|
2aea296d19 | ||
|
|
2b0bffc362 | ||
|
|
83356142c1 | ||
|
|
24dcc6947c | ||
|
|
a7e3136a0b | ||
|
|
71639cfea7 | ||
|
|
8c2d39fb82 | ||
|
|
e060d29337 | ||
|
|
79e9156d2f | ||
|
|
9100db55b0 | ||
|
|
141c10f6fe | ||
|
|
4613ab9dc3 | ||
|
|
061ad41b51 | ||
|
|
3a0007cd18 | ||
|
|
0044917943 | ||
|
|
0337c04278 | ||
|
|
4585acf70b | ||
|
|
2ad9bbae25 | ||
|
|
cf075df7d1 | ||
|
|
11cd9905c4 | ||
|
|
cf462542e9 | ||
|
|
b63f25a1ae | ||
|
|
7de69a21c5 | ||
|
|
21783e4ea0 | ||
|
|
53e5a756d7 | ||
|
|
8c911a2fd0 | ||
|
|
ce440e9f43 | ||
|
|
6465f8d8e6 | ||
|
|
4bdf28059a | ||
|
|
21010c6540 | ||
|
|
a5a6cabac6 | ||
|
|
f460c77f2c | ||
|
|
1c69d9213e | ||
|
|
c02c2d3b2c | ||
|
|
7adf5e763b | ||
|
|
0e4afefc7f | ||
|
|
c7f290f42e | ||
|
|
bb553b8a6a | ||
|
|
21eda2a1a3 | ||
|
|
48c13c990f | ||
|
|
a2665529f6 | ||
|
|
8d35d78eff | ||
|
|
a82a364c22 | ||
|
|
cc150ff9d2 | ||
|
|
feeb38293d | ||
|
|
5b9271ccfe | ||
|
|
e60bbc2fb7 | ||
|
|
387cc184e6 | ||
|
|
a830ddcb43 | ||
|
|
35fea30191 | ||
|
|
24b672b968 | ||
|
|
de6a3c5ab1 | ||
|
|
260ff6de3e | ||
|
|
7cb37411c9 | ||
|
|
e4e41e5ef8 | ||
|
|
985f4aafca | ||
|
|
0c25dd44b3 | ||
|
|
285f0bc6dd | ||
|
|
07a370fd24 | ||
|
|
95f07ea38a | ||
|
|
2890b92b21 | ||
|
|
8b80c5d0b5 | ||
|
|
04425786a1 | ||
|
|
15b14e12e2 | ||
|
|
b328972c4d | ||
|
|
da3156047f | ||
|
|
f9f08ba54f | ||
|
|
b43684262f | ||
|
|
2120f78bd7 | ||
|
|
2d896f22d6 | ||
|
|
9fa0aebfe9 | ||
|
|
2ddc3af5ff | ||
|
|
fd80e096ea | ||
|
|
fab2d69fce | ||
|
|
83d08e3aba | ||
|
|
bfea6bcacf | ||
|
|
feff34b021 | ||
|
|
79fbade92a | ||
|
|
bf508e453e | ||
|
|
47b51c22fa | ||
|
|
ebd16105f2 | ||
|
|
01fb1a5775 | ||
|
|
b8c2a05db9 | ||
|
|
4087dc5fe4 | ||
|
|
408029e6e0 | ||
|
|
23ff403529 | ||
|
|
be4f81f584 | ||
|
|
361c91e610 | ||
|
|
2aa2ea9675 | ||
|
|
e084225edf | ||
|
|
9ce342205b | ||
|
|
0edf50e00e | ||
|
|
1ea19daad9 | ||
|
|
32b302314e | ||
|
|
ee197e02a2 | ||
|
|
7cd6ffec2a | ||
|
|
0077580838 | ||
|
|
4d85a79fd1 | ||
|
|
a35139bb61 | ||
|
|
f72b833724 | ||
|
|
0e16bac6e2 | ||
|
|
e17564b362 | ||
|
|
90b66eddf5 | ||
|
|
2862a5849f | ||
|
|
7e839231ed | ||
|
|
fa56a4bb73 | ||
|
|
dff950748c | ||
|
|
b7374e3f8e | ||
|
|
4244b92b08 | ||
|
|
4f688028ad | ||
|
|
5a9a18501d | ||
|
|
896b8f7cf1 | ||
|
|
95bd1b014f | ||
|
|
dbdf8642bb | ||
|
|
c3cd9007d2 | ||
|
|
8079fb5bc5 | ||
|
|
80d0b5d4ed | ||
|
|
86bd847bf9 | ||
|
|
943004844a | ||
|
|
4ff12e0426 | ||
|
|
0d7bdb6fa8 | ||
|
|
6d488b6a81 | ||
|
|
f1d0263ffa | ||
|
|
24035caadb | ||
|
|
ed89a3e0f8 | ||
|
|
7088ab89f1 | ||
|
|
d4688bd76b | ||
|
|
befe0fccaf | ||
|
|
a192410498 | ||
|
|
d43ede3a11 | ||
|
|
9848ffb77f | ||
|
|
7487497d1f | ||
|
|
be11c848f4 | ||
|
|
9836b274b9 | ||
|
|
a96d14566f | ||
|
|
1c8cd8c168 | ||
|
|
5f5806a98e | ||
|
|
624b045ac0 | ||
|
|
0f8bae950e | ||
|
|
fcede42903 | ||
|
|
5defe7d975 | ||
|
|
7e79903fe8 | ||
|
|
a2fa52504c | ||
|
|
2629f85e73 | ||
|
|
8577816234 | ||
|
|
e58d47a3b2 | ||
|
|
c9c83ee7e6 | ||
|
|
139693dce6 | ||
|
|
f98193d822 | ||
|
|
8052f1ac9d | ||
|
|
4f78a06993 | ||
|
|
6c4b4b392b | ||
|
|
268fe34238 | ||
|
|
cc620205d6 | ||
|
|
f0d7c97b7b | ||
|
|
660a6e9e4c | ||
|
|
3386c2a7a5 | ||
|
|
9530efb4d4 | ||
|
|
4293515b3d | ||
|
|
61105e0679 | ||
|
|
79a289c7e2 | ||
|
|
46781e7614 | ||
|
|
1f3546a9f6 | ||
|
|
0dc88bb412 | ||
|
|
971a26c123 | ||
|
|
0976a3b721 | ||
|
|
d496361555 | ||
|
|
60ed65a73a | ||
|
|
d1407b3bd0 | ||
|
|
5ca2da76df | ||
|
|
2ac887ff74 | ||
|
|
cbdc9c0be1 | ||
|
|
b9bade8d5a | ||
|
|
eb43786641 | ||
|
|
0515db3d7c | ||
|
|
db257778c0 | ||
|
|
3b37d7489f | ||
|
|
329c7e8e05 | ||
|
|
fad9b4fa72 | ||
|
|
c1a81279ed | ||
|
|
8bb35a17d2 | ||
|
|
36415054ea | ||
|
|
3e84cbae69 | ||
|
|
f5f2bf7f46 | ||
|
|
acb6656958 | ||
|
|
9d70d7c27e | ||
|
|
648a6afb25 | ||
|
|
57ae1925b1 | ||
|
|
d49318582f | ||
|
|
83e3f830e6 | ||
|
|
04d4353c0f | ||
|
|
6d217fc097 | ||
|
|
9d7136c63c | ||
|
|
51a679d60a | ||
|
|
7d4d28614a | ||
|
|
c75cfaf692 | ||
|
|
fe6aa8a6fc | ||
|
|
a5fe1eb5fb | ||
|
|
5afd37c92c | ||
|
|
293d0409c6 | ||
|
|
4352f18dd3 | ||
|
|
0ae7fe9df5 | ||
|
|
5048f0422d | ||
|
|
c46a36f8ed | ||
|
|
90e2bd0372 | ||
|
|
10fbc8a04b | ||
|
|
fb818f3775 | ||
|
|
434e23c209 | ||
|
|
fe53bd6475 | ||
|
|
268ce91c65 | ||
|
|
3b4074bfc7 | ||
|
|
6af4652161 | ||
|
|
3717d30188 | ||
|
|
4cf2e83418 | ||
|
|
1228639103 | ||
|
|
e12d67de94 | ||
|
|
10bcb37ca5 | ||
|
|
e973598bff | ||
|
|
3a5129694d | ||
|
|
a1e0fbea8b | ||
|
|
0bf374454e | ||
|
|
5e592fbf29 | ||
|
|
ad4101bc99 | ||
|
|
2d057d92cf | ||
|
|
00d1cc9bf8 | ||
|
|
2c1ec5fe75 | ||
|
|
81b28d005d | ||
|
|
6a90616b99 | ||
|
|
d5be43695a | ||
|
|
0a93b81ae7 | ||
|
|
65f8da1654 | ||
|
|
911014db95 | ||
|
|
313ee13f18 | ||
|
|
addad04c44 | ||
|
|
e3789e5b64 | ||
|
|
410315ce35 | ||
|
|
90998da308 | ||
|
|
6fa5b13e10 | ||
|
|
93067c2d52 | ||
|
|
b2079b7007 | ||
|
|
b643dd074c | ||
|
|
a3932c75e1 | ||
|
|
1cd3b9ec47 | ||
|
|
0c77f42080 | ||
|
|
cea122db38 | ||
|
|
966f9fcd07 | ||
|
|
6ce9df8504 | ||
|
|
2a0b223896 | ||
|
|
c2db180829 | ||
|
|
3223e4ffa5 | ||
|
|
24c9b6e211 | ||
|
|
e5555dd26a | ||
|
|
ee2d0ddf8a | ||
|
|
aef130b396 | ||
|
|
fbdadec5e5 | ||
|
|
a068339079 | ||
|
|
3f07d3ec55 | ||
|
|
62e7da9d8a | ||
|
|
b60d43e5f6 | ||
|
|
a5873a3158 | ||
|
|
3a698eb0ed | ||
|
|
1e2ef542e4 | ||
|
|
94e8af4d93 | ||
|
|
250a0ab5eb | ||
|
|
2da05d88a0 | ||
|
|
7faa849a89 | ||
|
|
c5bceb8fc8 | ||
|
|
1e94b93ce6 | ||
|
|
3f7bccf2e6 | ||
|
|
181b869109 | ||
|
|
2332245be1 | ||
|
|
3c6999f3a4 | ||
|
|
5f2f15b976 | ||
|
|
47dfb5b6b7 | ||
|
|
c410c1293e | ||
|
|
ca1c732f31 | ||
|
|
5e8c373bf4 |
12
.editorconfig
Normal file
12
.editorconfig
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# This file is for unifying the coding style for different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* text=auto
|
||||||
78
.github/CONTRIBUTING.md
vendored
Normal file
78
.github/CONTRIBUTING.md
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Contributing to Lodash
|
||||||
|
|
||||||
|
Contributions are always welcome. Before contributing please read the
|
||||||
|
[code of conduct](https://js.foundation/conduct/) &
|
||||||
|
[search the issue tracker](https://github.com/lodash/lodash/issues); your issue
|
||||||
|
may have already been discussed or fixed in `master`. To contribute,
|
||||||
|
[fork](https://help.github.com/articles/fork-a-repo/) Lodash, commit your changes,
|
||||||
|
& [send a pull request](https://help.github.com/articles/using-pull-requests/).
|
||||||
|
|
||||||
|
## Feature Requests
|
||||||
|
|
||||||
|
Feature requests should be submitted in the
|
||||||
|
[issue tracker](https://github.com/lodash/lodash/issues), with a description of
|
||||||
|
the expected behavior & use case, where they’ll remain closed until sufficient interest,
|
||||||
|
[e.g. :+1: reactions](https://help.github.com/articles/about-discussions-in-issues-and-pull-requests/),
|
||||||
|
has been [shown by the community](https://github.com/lodash/lodash/issues?q=label%3A%22votes+needed%22+sort%3Areactions-%2B1-desc).
|
||||||
|
Before submitting a request, please search for similar ones in the
|
||||||
|
[closed issues](https://github.com/lodash/lodash/issues?q=is%3Aissue+is%3Aclosed+label%3Aenhancement).
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
For additions or bug fixes you should only need to modify `lodash.js`. Include
|
||||||
|
updated unit tests in the `test` directory as part of your pull request. Don’t
|
||||||
|
worry about regenerating the `dist/` or `doc/` files.
|
||||||
|
|
||||||
|
Before running the unit tests you’ll need to install, `npm i`,
|
||||||
|
[development dependencies](https://docs.npmjs.com/files/package.json#devdependencies).
|
||||||
|
Run unit tests from the command-line via `npm test`, or open `test/index.html` &
|
||||||
|
`test/fp.html` in a web browser. The [Backbone](http://backbonejs.org/) &
|
||||||
|
[Underscore](http://underscorejs.org/) test suites are included as well.
|
||||||
|
|
||||||
|
## Contributor License Agreement
|
||||||
|
|
||||||
|
Lodash is a member of the [JS Foundation](https://js.foundation/).
|
||||||
|
As such, we request that all contributors sign the JS Foundation
|
||||||
|
[contributor license agreement (CLA)](https://js.foundation/CLA/).
|
||||||
|
|
||||||
|
For more information about CLAs, please check out Alex Russell’s excellent post,
|
||||||
|
[“Why Do I Need to Sign This?”](https://infrequently.org/2008/06/why-do-i-need-to-sign-this/).
|
||||||
|
|
||||||
|
## Coding Guidelines
|
||||||
|
|
||||||
|
In addition to the following guidelines, please follow the conventions already
|
||||||
|
established in the code.
|
||||||
|
|
||||||
|
- **Spacing**:<br>
|
||||||
|
Use two spaces for indentation. No tabs.
|
||||||
|
|
||||||
|
- **Naming**:<br>
|
||||||
|
Keep variable & method names concise & descriptive.<br>
|
||||||
|
Variable names `index`, `array`, & `iteratee` are preferable to
|
||||||
|
`i`, `arr`, & `fn`.
|
||||||
|
|
||||||
|
- **Quotes**:<br>
|
||||||
|
Single-quoted strings are preferred to double-quoted strings; however,
|
||||||
|
please use a double-quoted string if the value contains a single-quote
|
||||||
|
character to avoid unnecessary escaping.
|
||||||
|
|
||||||
|
- **Comments**:<br>
|
||||||
|
Please use single-line comments to annotate significant additions, &
|
||||||
|
[JSDoc-style](http://www.2ality.com/2011/08/jsdoc-intro.html) comments for
|
||||||
|
functions.
|
||||||
|
|
||||||
|
Guidelines are enforced using [JSCS](https://www.npmjs.com/package/jscs):
|
||||||
|
```bash
|
||||||
|
$ npm run style
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
You can opt-in to a pre-push git hook by adding an `.opt-in` file to the root of
|
||||||
|
the project containing:
|
||||||
|
```txt
|
||||||
|
pre-push
|
||||||
|
```
|
||||||
|
|
||||||
|
With that, when you `git push`, the pre-push git hook will trigger and execute
|
||||||
|
`npm run validate`.
|
||||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,4 +1,4 @@
|
|||||||
*.custom.*
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
dist/
|
*.log
|
||||||
node_modules/
|
doc/*.html
|
||||||
|
node_modules
|
||||||
|
|||||||
24
.gitmodules
vendored
24
.gitmodules
vendored
@@ -1,24 +0,0 @@
|
|||||||
[submodule "vendor/benchmark.js"]
|
|
||||||
path = vendor/benchmark.js
|
|
||||||
url = git://github.com/bestiejs/benchmark.js.git
|
|
||||||
[submodule "vendor/docdown"]
|
|
||||||
path = vendor/docdown
|
|
||||||
url = git://github.com/jdalton/docdown.git
|
|
||||||
[submodule "vendor/qunit"]
|
|
||||||
path = vendor/qunit
|
|
||||||
url = git://github.com/jquery/qunit.git
|
|
||||||
[submodule "vendor/qunit-clib"]
|
|
||||||
path = vendor/qunit-clib
|
|
||||||
url = git://github.com/jdalton/qunit-clib.git
|
|
||||||
[submodule "vendor/requirejs"]
|
|
||||||
path = vendor/requirejs
|
|
||||||
url = git://github.com/jrburke/requirejs.git
|
|
||||||
[submodule "vendor/uglifyjs"]
|
|
||||||
path = vendor/uglifyjs
|
|
||||||
url = git://github.com/mishoo/UglifyJS.git
|
|
||||||
[submodule "vendor/underscore"]
|
|
||||||
path = vendor/underscore
|
|
||||||
url = git://github.com/documentcloud/underscore.git
|
|
||||||
[submodule "vendor/backbone"]
|
|
||||||
path = vendor/backbone
|
|
||||||
url = git://github.com/documentcloud/backbone.git
|
|
||||||
97
.jscsrc
Normal file
97
.jscsrc
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
"maxErrors": "2000",
|
||||||
|
"maximumLineLength": {
|
||||||
|
"value": 180,
|
||||||
|
"allExcept": ["comments", "functionSignature", "regex"]
|
||||||
|
},
|
||||||
|
"requireCurlyBraces": [
|
||||||
|
"if",
|
||||||
|
"else",
|
||||||
|
"for",
|
||||||
|
"while",
|
||||||
|
"do",
|
||||||
|
"try",
|
||||||
|
"catch"
|
||||||
|
],
|
||||||
|
"requireOperatorBeforeLineBreak": [
|
||||||
|
"=",
|
||||||
|
"+",
|
||||||
|
"-",
|
||||||
|
"/",
|
||||||
|
"*",
|
||||||
|
"==",
|
||||||
|
"===",
|
||||||
|
"!=",
|
||||||
|
"!==",
|
||||||
|
">",
|
||||||
|
">=",
|
||||||
|
"<",
|
||||||
|
"<="
|
||||||
|
],
|
||||||
|
"requireSpaceAfterKeywords": [
|
||||||
|
"if",
|
||||||
|
"else",
|
||||||
|
"for",
|
||||||
|
"while",
|
||||||
|
"do",
|
||||||
|
"switch",
|
||||||
|
"return",
|
||||||
|
"try",
|
||||||
|
"catch"
|
||||||
|
],
|
||||||
|
"requireSpaceBeforeBinaryOperators": [
|
||||||
|
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
|
||||||
|
"&=", "|=", "^=",
|
||||||
|
|
||||||
|
"+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
|
||||||
|
"|", "^", "&&", "||", "===", "==", ">=",
|
||||||
|
"<=", "<", ">", "!=", "!=="
|
||||||
|
],
|
||||||
|
"requireSpacesInFunctionExpression": {
|
||||||
|
"beforeOpeningCurlyBrace": true
|
||||||
|
},
|
||||||
|
"requireCamelCaseOrUpperCaseIdentifiers": true,
|
||||||
|
"requireDotNotation": { "allExcept": ["keywords"] },
|
||||||
|
"requireEarlyReturn": true,
|
||||||
|
"requireLineFeedAtFileEnd": true,
|
||||||
|
"requireSemicolons": true,
|
||||||
|
"requireSpaceAfterBinaryOperators": true,
|
||||||
|
"requireSpacesInConditionalExpression": true,
|
||||||
|
"requireSpaceBeforeObjectValues": true,
|
||||||
|
"requireSpaceBeforeBlockStatements": true,
|
||||||
|
"requireSpacesInForStatement": true,
|
||||||
|
|
||||||
|
"validateIndentation": 2,
|
||||||
|
"validateParameterSeparator": ", ",
|
||||||
|
"validateQuoteMarks": { "mark": "'", "escape": true },
|
||||||
|
|
||||||
|
"disallowSpacesInAnonymousFunctionExpression": {
|
||||||
|
"beforeOpeningRoundBrace": true
|
||||||
|
},
|
||||||
|
"disallowSpacesInFunctionDeclaration": {
|
||||||
|
"beforeOpeningRoundBrace": true
|
||||||
|
},
|
||||||
|
"disallowSpacesInFunctionExpression": {
|
||||||
|
"beforeOpeningRoundBrace": true
|
||||||
|
},
|
||||||
|
"disallowKeywords": ["with"],
|
||||||
|
"disallowMixedSpacesAndTabs": true,
|
||||||
|
"disallowMultipleLineBreaks": true,
|
||||||
|
"disallowNewlineBeforeBlockStatements": true,
|
||||||
|
"disallowSpaceAfterObjectKeys": true,
|
||||||
|
"disallowSpaceAfterPrefixUnaryOperators": true,
|
||||||
|
"disallowSpacesInCallExpression": true,
|
||||||
|
"disallowSpacesInsideArrayBrackets": true,
|
||||||
|
"disallowSpacesInsideParentheses": true,
|
||||||
|
"disallowTrailingWhitespace": true,
|
||||||
|
"disallowUnusedVariables": true,
|
||||||
|
|
||||||
|
"jsDoc": {
|
||||||
|
"checkRedundantAccess": true,
|
||||||
|
"checkTypes": true,
|
||||||
|
"requireNewlineAfterDescription": true,
|
||||||
|
"requireParamDescription": true,
|
||||||
|
"requireParamTypes": true,
|
||||||
|
"requireReturnTypes": true
|
||||||
|
}
|
||||||
|
}
|
||||||
11
.markdown-doctest-setup.js
Normal file
11
.markdown-doctest-setup.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
delete global['__core-js_shared__'];
|
||||||
|
|
||||||
|
const _ = require('./lodash.js');
|
||||||
|
const globals = require('lodash-doc-globals');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
'babel': false,
|
||||||
|
'globals': _.assign({ '_': _ }, globals)
|
||||||
|
};
|
||||||
19
.npmignore
19
.npmignore
@@ -1,19 +0,0 @@
|
|||||||
*.custom.*
|
|
||||||
*.min.*
|
|
||||||
.*
|
|
||||||
build.*
|
|
||||||
build/
|
|
||||||
dist/
|
|
||||||
doc/*.php
|
|
||||||
node_modules/
|
|
||||||
perf/*.html
|
|
||||||
perf/*.sh
|
|
||||||
test/*.html
|
|
||||||
test/*.sh
|
|
||||||
vendor/backbone/
|
|
||||||
vendor/closure-compiler/
|
|
||||||
vendor/docdown/
|
|
||||||
vendor/firebug-lite/
|
|
||||||
vendor/requirejs/
|
|
||||||
vendor/uglifyjs/
|
|
||||||
vendor/underscore/
|
|
||||||
135
.travis.yml
Normal file
135
.travis.yml
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
language: node_js
|
||||||
|
sudo: false
|
||||||
|
node_js:
|
||||||
|
- 7
|
||||||
|
|
||||||
|
addons:
|
||||||
|
jwt:
|
||||||
|
secure: OYhRpW+8A0Iik+9GmHwa45ZwXeBXw/6zh6I+1w2H9g/LqPRp+Nhq3f4FSpvrrfno8lO8W4h+7s6+JOzF8C8NxNda5UUygKjF9pUphgiQdqls3YZMJlC9zXVl7gQXAHi3nG1s8vWSpwpzYD9fqczE1FX9n0+R63qX3eB6C/LbPeI=
|
||||||
|
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- ~/.npm
|
||||||
|
- ~/.yarn-cache
|
||||||
|
- travis_phantomjs
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- BIN=node ISTANBUL=false OPTION=""
|
||||||
|
- SAUCE_LABS=false SAUCE_USERNAME=lodash
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
-
|
||||||
|
- BIN=phantomjs
|
||||||
|
- ISTANBUL=true
|
||||||
|
- SAUCE_LABS=true
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- node_js: 6
|
||||||
|
env:
|
||||||
|
|
||||||
|
git:
|
||||||
|
depth: 10
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
webhooks:
|
||||||
|
urls:
|
||||||
|
- https://webhooks.gitter.im/e/4aab6358b0e9aed0b628
|
||||||
|
on_success: change
|
||||||
|
on_failure: always
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
# Upgrade PhantomJS.
|
||||||
|
- |
|
||||||
|
export PHANTOMJS_VERSION=2.1.1
|
||||||
|
export PATH=$PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin:$PATH
|
||||||
|
if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then
|
||||||
|
rm -rf $PWD/travis_phantomjs
|
||||||
|
mkdir -p $PWD/travis_phantomjs
|
||||||
|
wget https://github.com/Medium/phantomjs/releases/download/v$PHANTOMJS_VERSION/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2
|
||||||
|
tar -xvf phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs
|
||||||
|
fi
|
||||||
|
phantomjs -v
|
||||||
|
|
||||||
|
# Use exact Node version.
|
||||||
|
- nvm use $TRAVIS_NODE_VERSION
|
||||||
|
|
||||||
|
# Setup package managers.
|
||||||
|
- npm set loglevel error
|
||||||
|
- npm set progress false
|
||||||
|
- npm i -g yarn@0.16.1
|
||||||
|
- yarn -V
|
||||||
|
|
||||||
|
# Remove code skipped on the coverage run.
|
||||||
|
- |
|
||||||
|
PATTERN[0]="|\s*while\s*\([^)]+\)\s*\{\s*iteratee\(index\);\s*\}|"
|
||||||
|
PATTERN[1]="|\s*else\s*\{\s*assocSet\(data\b[\s\S]+?\}|"
|
||||||
|
PATTERN[2]="|\bindex,\s*iterable\)\s*===\s*false\)[^}]+?(break;)|"
|
||||||
|
PATTERN[3]="|\bcase\s+(?:dataView|promise|set|map|weakMap)CtorString:.+|g"
|
||||||
|
PATTERN[4]="|\s*if\s*\(cache\.size\b[\s\S]+?\}|"
|
||||||
|
PATTERN[5]="|\s*if\s*\(\!lodashFunc\)\s*\{\s*return;\s*\}|"
|
||||||
|
PATTERN[6]="|\s*define\([\s\S]+?\);|"
|
||||||
|
PATTERN[7]="|\s*root\._\s*=\s*_;|"
|
||||||
|
|
||||||
|
if [ $ISTANBUL = true ]; then
|
||||||
|
set -e
|
||||||
|
for PTRN in ${PATTERN[@]}; do
|
||||||
|
node ./test/remove.js $PTRN ./lodash.js
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
install:
|
||||||
|
# Install packages.
|
||||||
|
- yarn
|
||||||
|
|
||||||
|
# Use lodash-cli from GitHub.
|
||||||
|
- git clone --depth=10 --branch=master git://github.com/lodash/lodash-cli ./node_modules/lodash-cli
|
||||||
|
- mkdir -p ./node_modules/lodash-cli/node_modules/lodash; cd $_; cp ../../../../lodash.js ./lodash.js; cp ../../../../package.json ./package.json
|
||||||
|
- cd ../../; npm i --production; cd ../../
|
||||||
|
|
||||||
|
script:
|
||||||
|
# Detect code coverage.
|
||||||
|
- |
|
||||||
|
if [ $ISTANBUL = true ]; then
|
||||||
|
istanbul cover -x "**/vendor/**" --report lcovonly ./test/test.js -- ./lodash.js
|
||||||
|
if [ $TRAVIS_SECURE_ENV_VARS = true ]; then
|
||||||
|
cat ./coverage/lcov.info | coveralls
|
||||||
|
cat ./coverage/coverage.json | codecov
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test in Node.js and PhantomJS.
|
||||||
|
- |
|
||||||
|
if [ $ISTANBUL = false ]; then
|
||||||
|
node ./node_modules/lodash-cli/bin/lodash -o ./dist/lodash.js
|
||||||
|
node ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./
|
||||||
|
node ./node_modules/lodash-cli/bin/lodash -d -o ./lodash.js
|
||||||
|
if [ $SAUCE_LABS = false ]; then
|
||||||
|
cd ./test
|
||||||
|
$BIN $OPTION ./test.js ../lodash.js
|
||||||
|
if [ $TRAVIS_SECURE_ENV_VARS = true ]; then
|
||||||
|
$BIN $OPTION ./test.js ../dist/lodash.min.js
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test in Sauce Labs.
|
||||||
|
- |
|
||||||
|
if [ $SAUCE_LABS = true ]; then
|
||||||
|
node ./node_modules/lodash-cli/bin/lodash core -o ./dist/lodash.core.js
|
||||||
|
npm run build
|
||||||
|
$BIN ./test/saucelabs.js name="lodash tests" runner="test/index.html?build=../dist/lodash.js&noglobals=true" tags=development
|
||||||
|
$BIN ./test/saucelabs.js name="lodash tests" runner="test/index.html?build=../dist/lodash.min.js&noglobals=true" tags=production
|
||||||
|
$BIN ./test/saucelabs.js name="lodash-fp tests" runner="test/fp.html?noglobals=true" tags=development
|
||||||
|
$BIN ./test/saucelabs.js name="underscore tests" runner="test/underscore.html?build=../dist/lodash.js" tags=development,underscore
|
||||||
|
$BIN ./test/saucelabs.js name="underscore tests" runner="test/underscore.html?build=../dist/lodash.min.js" tags=production,underscore
|
||||||
|
$BIN ./test/saucelabs.js name="backbone tests" runner="test/backbone.html?build=../dist/lodash.js" tags=development,backbone
|
||||||
|
$BIN ./test/saucelabs.js name="backbone tests" runner="test/backbone.html?build=../dist/lodash.min.js" tags=production,backbone
|
||||||
|
$BIN ./test/saucelabs.js name="backbone tests" runner="test/backbone.html?build=../dist/lodash.core.js" tags=development,backbone
|
||||||
|
$BIN ./test/saucelabs.js name="backbone tests" runner="test/backbone.html?build=../dist/lodash.core.min.js" tags=production,backbone
|
||||||
|
fi
|
||||||
47
LICENSE
Normal file
47
LICENSE
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
Copyright JS Foundation and other contributors <https://js.foundation/>
|
||||||
|
|
||||||
|
Based on Underscore.js, copyright Jeremy Ashkenas,
|
||||||
|
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
|
||||||
|
|
||||||
|
This software consists of voluntary contributions made by many
|
||||||
|
individuals. For exact contribution history, see the revision history
|
||||||
|
available at https://github.com/lodash/lodash
|
||||||
|
|
||||||
|
The following license applies to all parts of this software except as
|
||||||
|
documented below:
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Copyright and related rights for sample code are waived via CC0. Sample
|
||||||
|
code is defined as all source code displayed within the prose of the
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
CC0: http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Files located in the node_modules and vendor directories are externally
|
||||||
|
maintained libraries used by this software which have their own
|
||||||
|
licenses; we recommend you read them, as their terms may differ from the
|
||||||
|
terms above.
|
||||||
22
LICENSE.txt
22
LICENSE.txt
@@ -1,22 +0,0 @@
|
|||||||
Copyright 2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
Based on Underscore.js 1.3.3, copyright 2009-2012 Jeremy Ashkenas,
|
|
||||||
DocumentCloud Inc. <http://documentcloud.github.com/underscore>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
324
README.md
324
README.md
@@ -1,286 +1,80 @@
|
|||||||
# Lo-Dash <sup>v0.3.0</sup>
|
# lodash v4.17.2
|
||||||
|
|
||||||
A drop-in replacement for Underscore.js, from the devs behind [jsPerf.com](http://jsperf.com), that delivers [performance improvements](http://lodash.com/benchmarks), [bug fixes](https://github.com/bestiejs/lodash#closed-underscorejs-issues), and [additional features](https://github.com/bestiejs/lodash#features).
|
[Site](https://lodash.com/) |
|
||||||
|
[Docs](https://lodash.com/docs) |
|
||||||
|
[FP Guide](https://github.com/lodash/lodash/wiki/FP-Guide) |
|
||||||
|
[Contributing](https://github.com/lodash/lodash/blob/master/.github/CONTRIBUTING.md) |
|
||||||
|
[Wiki](https://github.com/lodash/lodash/wiki "Changelog, Roadmap, etc.") |
|
||||||
|
[Code of Conduct](https://js.foundation/conduct/) |
|
||||||
|
[Twitter](https://twitter.com/bestiejs) |
|
||||||
|
[Chat](https://gitter.im/lodash/lodash)
|
||||||
|
|
||||||
Lo-Dash’s performance is gained by avoiding slower native methods, instead opting for simplified non-ES5 compliant methods optimized for common usage, and by leveraging function compilation to reduce the number of overall function calls.
|
The [Lodash](https://lodash.com/) library exported as a [UMD](https://github.com/umdjs/umd) module.
|
||||||
|
|
||||||
|
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
|
||||||
|
```shell
|
||||||
|
$ npm run build
|
||||||
|
$ lodash -o ./dist/lodash.js
|
||||||
|
$ lodash core -o ./dist/lodash.core.js
|
||||||
|
```
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
* [Development source](https://raw.github.com/bestiejs/lodash/v0.3.0/lodash.js)
|
* [Core build](https://raw.githubusercontent.com/lodash/lodash/4.17.2/dist/lodash.core.js) ([~4 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.17.2/dist/lodash.core.min.js))
|
||||||
* [Production source](https://raw.github.com/bestiejs/lodash/v0.3.0/lodash.min.js)
|
* [Full build](https://raw.githubusercontent.com/lodash/lodash/4.17.2/dist/lodash.js) ([~23 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.17.2/dist/lodash.min.js))
|
||||||
* For optimal performance, [create a custom build](https://github.com/bestiejs/lodash#custom-builds) with only the features you need
|
* [CDN copies](https://www.jsdelivr.com/projects/lodash)
|
||||||
|
|
||||||
## Dive in
|
Lodash is released under the [MIT license](https://raw.githubusercontent.com/lodash/lodash/4.17.2/LICENSE) & supports [modern environments](#support).<br>
|
||||||
|
Review the [build differences](https://github.com/lodash/lodash/wiki/build-differences) & pick one that’s right for you.
|
||||||
|
|
||||||
We’ve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests).
|
## Installation
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/lodash/wiki/Roadmap).
|
In a browser:
|
||||||
|
```html
|
||||||
## Screencasts
|
|
||||||
|
|
||||||
For more information check out these screencasts over Lo-Dash:
|
|
||||||
|
|
||||||
* [Introducing Lo-Dash](http://dl.dropbox.com/u/513327/allyoucanleet/post/20/file/screencast.mp4)
|
|
||||||
* [Optimizations and custom builds](http://dl.dropbox.com/u/513327/allyoucanleet/post/21/file/screencast.mp4)
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
* AMD loader support (RequireJS, curl.js, etc.)
|
|
||||||
* [_.bind](http://lodash.com/docs#bind) supports *"lazy"* binding
|
|
||||||
* [_.debounce](http://lodash.com/docs#debounce)’ed functions match [_.throttle](http://lodash.com/docs#throttle)’ed functions’ return value behavior
|
|
||||||
* [_.forEach](http://lodash.com/docs#forEach) is chainable
|
|
||||||
* [_.forIn](http://lodash.com/docs#forIn) for iterating over an object’s own and inherited properties
|
|
||||||
* [_.forOwn](http://lodash.com/docs#forOwn) for iterating over an object’s own properties
|
|
||||||
* [_.groupBy](http://lodash.com/docs#groupBy), [_.sortedIndex](http://lodash.com/docs#sortedIndex), and [_.uniq](http://lodash.com/docs#uniq) accept a `thisArg` argument
|
|
||||||
* [_.indexOf](http://lodash.com/docs#indexOf) and [_.lastIndexOf](http://lodash.com/docs#lastIndexOf) accept a `fromIndex` argument
|
|
||||||
* [_.partial](http://lodash.com/docs#partial) for more functional fun
|
|
||||||
* [_.size](http://lodash.com/docs#size) supports returning the `length` of string values
|
|
||||||
* [_.template](http://lodash.com/docs#template) utilizes [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) for easier debugging
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Lo-Dash has been tested in at least Chrome 5-19, Firefox 1.5-13, IE 6-9, Opera 9.25-11.64, Safari 3.0.4-5.1.3, Node.js 0.4.8-0.6.18, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC3.
|
|
||||||
|
|
||||||
## Custom builds
|
|
||||||
|
|
||||||
Custom builds make it easy to create lightweight versions of Lo-Dash containing only the methods you need.
|
|
||||||
We handle all the method dependency and alias mapping for you.
|
|
||||||
|
|
||||||
Mobile builds, with IE bug fixes and method compilation removed, may be created by using the `mobile` argument.
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
node build mobile
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Custom builds may be created in three ways:
|
|
||||||
|
|
||||||
1. Use the `category` argument to pass the categories of methods to include in the build.<br>
|
|
||||||
Valid categories are *"arrays"*, *"chaining"*, *"collections"*, *"functions"*, *"objects"*, and *"utilities"*.
|
|
||||||
~~~ bash
|
|
||||||
node build category=collections,functions
|
|
||||||
node build category="collections, functions"
|
|
||||||
node build mobile category=collections,functions
|
|
||||||
~~~
|
|
||||||
|
|
||||||
2. Use the `include` argument to pass the names of the methods to include in the build.
|
|
||||||
~~~ bash
|
|
||||||
node build include=each,filter,map
|
|
||||||
node build include="each, filter, map"
|
|
||||||
node build mobile include=each,filter,map
|
|
||||||
~~~
|
|
||||||
|
|
||||||
3. Use the `exclude` argument to pass the names of the methods to exclude from the build.
|
|
||||||
~~~ bash
|
|
||||||
node build exclude=union,uniq,zip
|
|
||||||
node build exclude="union, uniq, zip"
|
|
||||||
node build mobile exclude=union,uniq,zip
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Custom builds are saved to `lodash.custom.js` and `lodash.custom.min.js`.
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
In browsers:
|
|
||||||
|
|
||||||
~~~ html
|
|
||||||
<script src="lodash.js"></script>
|
<script src="lodash.js"></script>
|
||||||
~~~
|
```
|
||||||
|
|
||||||
Using [npm](http://npmjs.org/):
|
Using npm:
|
||||||
|
```shell
|
||||||
|
$ npm i -g npm
|
||||||
|
$ npm i --save lodash
|
||||||
|
```
|
||||||
|
|
||||||
~~~ bash
|
In Node.js:
|
||||||
npm install lodash
|
```js
|
||||||
~~~
|
// Load the full build.
|
||||||
|
|
||||||
In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
~~~
|
// Load the core build.
|
||||||
|
var _ = require('lodash/core');
|
||||||
|
// Load the FP build for immutable auto-curried iteratee-first data-last methods.
|
||||||
|
var fp = require('lodash/fp');
|
||||||
|
|
||||||
In [Narwhal](http://narwhaljs.org/) and [RingoJS v0.7.0-](http://ringojs.org/):
|
// Load method categories.
|
||||||
|
var array = require('lodash/array');
|
||||||
|
var object = require('lodash/fp/object');
|
||||||
|
|
||||||
~~~ js
|
// Cherry-pick methods for smaller browserify/rollup/webpack bundles.
|
||||||
var _ = require('lodash')._;
|
var at = require('lodash/at');
|
||||||
~~~
|
var curryN = require('lodash/fp/curryN');
|
||||||
|
```
|
||||||
|
|
||||||
In [Rhino](http://www.mozilla.org/rhino/):
|
**Note:**<br>
|
||||||
|
Install [n_](https://www.npmjs.com/package/n_) for Lodash use in the Node.js < 6 REPL.
|
||||||
|
|
||||||
~~~ js
|
## Why Lodash?
|
||||||
load('lodash.js');
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In an AMD loader like [RequireJS](http://requirejs.org/):
|
Lodash makes JavaScript easier by taking the hassle out of working with arrays,<br>
|
||||||
|
numbers, objects, strings, etc. Lodash’s modular methods are great for:
|
||||||
|
|
||||||
~~~ js
|
* Iterating arrays, objects, & strings
|
||||||
require({
|
* Manipulating & testing values
|
||||||
'paths': {
|
* Creating composite functions
|
||||||
'underscore': 'path/to/lodash'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['underscore'], function(_) {
|
|
||||||
console.log(_.VERSION);
|
|
||||||
});
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Cloning this repo
|
## Module Formats
|
||||||
|
|
||||||
To clone this repository including all submodules, using Git 1.6.5 or later:
|
Lodash is available in a [variety of builds](https://lodash.com/custom-builds) & module formats.
|
||||||
|
|
||||||
~~~ bash
|
* [lodash](https://www.npmjs.com/package/lodash) & [per method packages](https://www.npmjs.com/browse/keyword/lodash-modularized)
|
||||||
git clone --recursive https://github.com/bestiejs/lodash.git
|
* [lodash-es](https://www.npmjs.com/package/lodash-es), [babel-plugin-lodash](https://www.npmjs.com/package/babel-plugin-lodash), & [lodash-webpack-plugin](https://www.npmjs.com/package/lodash-webpack-plugin)
|
||||||
cd lodash.js
|
* [lodash/fp](https://github.com/lodash/lodash/tree/npm/fp)
|
||||||
~~~
|
* [lodash-amd](https://www.npmjs.com/package/lodash-amd)
|
||||||
|
|
||||||
For older Git versions, just use:
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
git clone https://github.com/bestiejs/lodash.git
|
|
||||||
cd lodash
|
|
||||||
git submodule update --init
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Closed Underscore.js issues
|
|
||||||
|
|
||||||
* Allow iteration of objects with a `length` property [[#148](https://github.com/documentcloud/underscore/issues/148), [#154](https://github.com/documentcloud/underscore/issues/154), [#252](https://github.com/documentcloud/underscore/issues/252), [#448](https://github.com/documentcloud/underscore/issues/448), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L266-272)]
|
|
||||||
* Ensure array-like objects with invalid `length` properties are treated like regular objects [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L237-243), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L533-542), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L661-664)]
|
|
||||||
* Ensure `_(...)` returns passed wrapper instances [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L106-109)]
|
|
||||||
* Ensure `_.groupBy` adds values to own, not inherited, properties [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L317-324)]
|
|
||||||
* Ensure `_.sortedIndex` supports arrays with high `length` values [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L586-595)]
|
|
||||||
* Ensure `_.throttle` works when called in tight loops [[#502](https://github.com/documentcloud/underscore/issues/502), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L629-639)]
|
|
||||||
* Fix Firefox, IE, Opera, and Safari object iteration bugs [[#376](https://github.com/documentcloud/underscore/issues/376), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L175-187), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L277-302), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L379-390), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L398-400), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L418-438), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L554-556)]
|
|
||||||
* Handle arrays with `undefined` values correctly in IE < 9 [[#601](https://github.com/documentcloud/underscore/issues/601)]
|
|
||||||
* Methods should work on pages with incorrectly shimmed native methods [[#7](https://github.com/documentcloud/underscore/issues/7), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L88-94)]
|
|
||||||
* Register as AMD module, but still export to global [[#431](https://github.com/documentcloud/underscore/pull/431), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L72-86)]
|
|
||||||
* `_.forEach` should be chainable [[#142](https://github.com/documentcloud/underscore/issues/142), [test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L232-235)]
|
|
||||||
* `_isNaN(new Number(NaN))` should return `true` [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L408-410)]
|
|
||||||
* `_.reduceRight` should pass correct callback arguments when iterating objects [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L521-531)]
|
|
||||||
* `_.size` should return the `length` of string values [[test](https://github.com/bestiejs/lodash/blob/c07e1567a7a12cff2c5ee6cda81306c8bcf126f0/test/test.js#L550-552)]
|
|
||||||
|
|
||||||
## Optimized methods <sup>(50+)</sup>
|
|
||||||
|
|
||||||
* `_.bind`
|
|
||||||
* `_.bindAll`
|
|
||||||
* `_.clone`
|
|
||||||
* `_.compact`
|
|
||||||
* `_.contains`, `_.include`
|
|
||||||
* `_.defaults`
|
|
||||||
* `_.defer`
|
|
||||||
* `_.difference`
|
|
||||||
* `_.each`
|
|
||||||
* `_.escape`
|
|
||||||
* `_.every`, `_.all`
|
|
||||||
* `_.extend`
|
|
||||||
* `_.filter`, `_.select`
|
|
||||||
* `_.find`, `_.detect`
|
|
||||||
* `_.flatten`
|
|
||||||
* `_.forEach`, `_.each`
|
|
||||||
* `_.functions`, `_.methods`
|
|
||||||
* `_.groupBy`
|
|
||||||
* `_.indexOf`
|
|
||||||
* `_.intersection`
|
|
||||||
* `_.invoke`
|
|
||||||
* `_.isEmpty`
|
|
||||||
* `_.isEqual`
|
|
||||||
* `_.isFinite`
|
|
||||||
* `_.isObject`
|
|
||||||
* `_.isString`
|
|
||||||
* `_.keys`
|
|
||||||
* `_.lastIndexOf`
|
|
||||||
* `_.map`, `_.collect`
|
|
||||||
* `_.max`
|
|
||||||
* `_.memoize`
|
|
||||||
* `_.min`
|
|
||||||
* `_.mixin`
|
|
||||||
* `_.pick`
|
|
||||||
* `_.pluck`
|
|
||||||
* `_.reduce`, `_.foldl`, `_.inject`
|
|
||||||
* `_.reject`
|
|
||||||
* `_.result`
|
|
||||||
* `_.shuffle`
|
|
||||||
* `_.some`, `_.any`
|
|
||||||
* `_.sortBy`
|
|
||||||
* `_.sortedIndex`
|
|
||||||
* `_.template`
|
|
||||||
* `_.throttle`
|
|
||||||
* `_.times`
|
|
||||||
* `_.toArray`
|
|
||||||
* `_.union`
|
|
||||||
* `_.uniq`, `_.unique`
|
|
||||||
* `_.values`
|
|
||||||
* `_.without`
|
|
||||||
* `_.wrap`
|
|
||||||
* `_.zip`
|
|
||||||
* plus all `_(...)` method wrappers
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
### <sup>v0.3.0</sup>
|
|
||||||
|
|
||||||
* Added `category` build option
|
|
||||||
* Added `fromIndex` argument to `_.indexOf` and `_.lastIndexOf`
|
|
||||||
* Added `//@ sourceURL` support to `_.template`
|
|
||||||
* Added `thisArg` argument to `_.sortedIndex` and `_.uniq`
|
|
||||||
* Added `_.forIn` and `_.forOwn` methods
|
|
||||||
* Ensured array-like objects with invalid `length` properties are treated like regular objects
|
|
||||||
* Ensured `_.sortedIndex` supports arrays with high `length` values
|
|
||||||
* Fixed `prototype` property iteration bug in `_.keys` for Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
|
|
||||||
* Optimized `_.times` and `this` bindings in iterator methods
|
|
||||||
|
|
||||||
### <sup>v0.2.2</sup>
|
|
||||||
|
|
||||||
* Added `mobile` build option
|
|
||||||
* Ensured `_.find` returns `undefined` for unmatched values
|
|
||||||
* Ensured `_.templateSettings.variable` is compatible with Underscore.js
|
|
||||||
* Optimized `_.escape`
|
|
||||||
* Reduced dependencies in `_.find`
|
|
||||||
|
|
||||||
### <sup>v0.2.1</sup>
|
|
||||||
|
|
||||||
* Adjusted the Lo-Dash export order for r.js
|
|
||||||
* Ensured `_.groupBy` values are added to own, not inherited, properties
|
|
||||||
* Made `_.bind` follow ES5 spec to support a popular Backbone.js pattern
|
|
||||||
* Removed the alias `intersect`
|
|
||||||
* Simplified `_.bind`, `_.flatten`, `_.groupBy`, `_.max`, and `_.min`
|
|
||||||
|
|
||||||
### <sup>v0.2.0</sup>
|
|
||||||
|
|
||||||
* Added custom build options
|
|
||||||
* Added default `_.templateSettings.variable` value
|
|
||||||
* Added *"lazy bind"* support to `_.bind`
|
|
||||||
* Added native method overwrite detection to avoid bad native shims
|
|
||||||
* Added support for more AMD build optimizers and aliasing as the *"underscore"* module
|
|
||||||
* Added `thisArg` argument to `_.groupBy`
|
|
||||||
* Added whitespace to compiled strings
|
|
||||||
* Added `_.partial` method
|
|
||||||
* Commented the `iterationFactory` options object
|
|
||||||
* Ensured `_(...)` returns passed wrapper instances
|
|
||||||
* Ensured `_.max` and `_.min` support extremely large arrays
|
|
||||||
* Ensured `_.throttle` works in tight loops
|
|
||||||
* Fixed IE < 9 `[DontEnum]` bug and Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1’s `prototype` property iteration bug
|
|
||||||
* Inlined `_.isFunction` calls.
|
|
||||||
* Made `_.debounce`’ed functions match `_.throttle`’ed functions’ return value behavior
|
|
||||||
* Made `_.escape` no longer translate the *">"* character
|
|
||||||
* Fixed `clearTimeout` typo
|
|
||||||
* Simplified all methods in the *"Arrays"* category
|
|
||||||
* Optimized `_.debounce`, `_.escape`, `_.flatten`, `_.forEach`, `_.groupBy`, `_.intersection`, `_.invoke`, `_.isObject`, `_.max`, `_.min`, `_.pick`, `_.shuffle`, `_.sortedIndex`, `_.template`, `_.throttle`, `_.union`, `_.uniq`
|
|
||||||
|
|
||||||
### <sup>v0.1.0</sup>
|
|
||||||
|
|
||||||
* Initial release
|
|
||||||
|
|
||||||
## BestieJS
|
|
||||||
|
|
||||||
Lo-Dash is part of the BestieJS *"Best in Class"* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Kit Cambridge](http://kitcambridge.github.com/)
|
|
||||||
[](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter")
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
|
|||||||
526
build.js
526
build.js
@@ -1,526 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem and path modules */
|
|
||||||
var fs = require('fs'),
|
|
||||||
path = require('path');
|
|
||||||
|
|
||||||
/** Load other modules */
|
|
||||||
var lodash = require(path.join(__dirname, 'lodash')),
|
|
||||||
minify = require(path.join(__dirname, 'build', 'minify'));
|
|
||||||
|
|
||||||
/** Flag used to specify a mobile build */
|
|
||||||
var isMobile = process.argv.indexOf('mobile') > -1;
|
|
||||||
|
|
||||||
/** Shortcut used to convert array-like objects to arrays */
|
|
||||||
var slice = [].slice;
|
|
||||||
|
|
||||||
/** The lodash.js source */
|
|
||||||
var source = fs.readFileSync(path.join(__dirname, 'lodash.js'), 'utf8');
|
|
||||||
|
|
||||||
/** Used to associate aliases with their real names */
|
|
||||||
var aliasToRealMap = {
|
|
||||||
'all': 'every',
|
|
||||||
'any': 'some',
|
|
||||||
'collect': 'map',
|
|
||||||
'detect': 'find',
|
|
||||||
'each': 'forEach',
|
|
||||||
'foldl': 'reduce',
|
|
||||||
'foldr': 'reduceRight',
|
|
||||||
'head': 'first',
|
|
||||||
'include': 'contains',
|
|
||||||
'inject': 'reduce',
|
|
||||||
'methods': 'functions',
|
|
||||||
'select': 'filter',
|
|
||||||
'tail': 'rest',
|
|
||||||
'take': 'first',
|
|
||||||
'unique': 'uniq'
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to associate real names with their aliases */
|
|
||||||
var realToAliasMap = {
|
|
||||||
'contains': ['include'],
|
|
||||||
'every': ['all'],
|
|
||||||
'filter': ['select'],
|
|
||||||
'find': ['detect'],
|
|
||||||
'first': ['head', 'take'],
|
|
||||||
'forEach': ['each'],
|
|
||||||
'functions': ['methods'],
|
|
||||||
'map': ['collect'],
|
|
||||||
'reduce': ['foldl', 'inject'],
|
|
||||||
'reduceRight': ['foldr'],
|
|
||||||
'rest': ['tail'],
|
|
||||||
'some': ['any'],
|
|
||||||
'uniq': ['unique']
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to track function dependencies */
|
|
||||||
var dependencyMap = {
|
|
||||||
'after': [],
|
|
||||||
'bind': [],
|
|
||||||
'bindAll': ['bind'],
|
|
||||||
'chain': ['mixin'],
|
|
||||||
'clone': ['extend', 'isArray'],
|
|
||||||
'compact': [],
|
|
||||||
'compose': [],
|
|
||||||
'contains': ['createIterator'],
|
|
||||||
'createIterator': [],
|
|
||||||
'debounce': [],
|
|
||||||
'defaults': ['createIterator'],
|
|
||||||
'defer': [],
|
|
||||||
'delay': [],
|
|
||||||
'difference': ['indexOf'],
|
|
||||||
'escape': [],
|
|
||||||
'every': ['createIterator', 'identity'],
|
|
||||||
'extend': ['createIterator'],
|
|
||||||
'filter': ['createIterator', 'identity'],
|
|
||||||
'find': ['createIterator'],
|
|
||||||
'first': [],
|
|
||||||
'flatten': ['isArray'],
|
|
||||||
'forEach': ['createIterator'],
|
|
||||||
'forIn': ['createIterator'],
|
|
||||||
'forOwn': ['createIterator'],
|
|
||||||
'functions': ['createIterator'],
|
|
||||||
'groupBy': ['createIterator'],
|
|
||||||
'has': [],
|
|
||||||
'identity': [],
|
|
||||||
'indexOf': ['sortedIndex'],
|
|
||||||
'initial': [],
|
|
||||||
'intersection': ['every', 'indexOf'],
|
|
||||||
'invoke': [],
|
|
||||||
'isArguments': [],
|
|
||||||
'isArray': [],
|
|
||||||
'isBoolean': [],
|
|
||||||
'isDate': [],
|
|
||||||
'isElement': [],
|
|
||||||
'isEmpty': ['createIterator'],
|
|
||||||
'isEqual': [],
|
|
||||||
'isFinite': [],
|
|
||||||
'isFunction': [],
|
|
||||||
'isNaN': [],
|
|
||||||
'isNull': [],
|
|
||||||
'isNumber': [],
|
|
||||||
'isObject': [],
|
|
||||||
'isRegExp': [],
|
|
||||||
'isString': [],
|
|
||||||
'isUndefined': [],
|
|
||||||
'keys': ['createIterator'],
|
|
||||||
'last': [],
|
|
||||||
'lastIndexOf': [],
|
|
||||||
'map': ['createIterator', 'identity'],
|
|
||||||
'max': [],
|
|
||||||
'memoize': [],
|
|
||||||
'min': [],
|
|
||||||
'mixin': ['forEach'],
|
|
||||||
'noConflict': [],
|
|
||||||
'once': [],
|
|
||||||
'partial': [],
|
|
||||||
'pick': [],
|
|
||||||
'pluck': ['createIterator'],
|
|
||||||
'range': [],
|
|
||||||
'reduce': ['createIterator'],
|
|
||||||
'reduceRight': ['keys'],
|
|
||||||
'reject': ['createIterator', 'identity'],
|
|
||||||
'rest': [],
|
|
||||||
'result': [],
|
|
||||||
'shuffle': [],
|
|
||||||
'size': ['keys'],
|
|
||||||
'some': ['createIterator', 'identity'],
|
|
||||||
'sortBy': ['map', 'pluck'],
|
|
||||||
'sortedIndex': ['identity'],
|
|
||||||
'tap': [],
|
|
||||||
'template': ['escape'],
|
|
||||||
'throttle': [],
|
|
||||||
'times': [],
|
|
||||||
'toArray': ['values'],
|
|
||||||
'union': ['indexOf'],
|
|
||||||
'uniq': ['identity', 'indexOf'],
|
|
||||||
'uniqueId': [],
|
|
||||||
'values': ['createIterator'],
|
|
||||||
'without': ['indexOf'],
|
|
||||||
'wrap': [],
|
|
||||||
'zip': ['max', 'pluck']
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Names of all methods */
|
|
||||||
var allMethods = Object.keys(dependencyMap);
|
|
||||||
|
|
||||||
/** Names of methods to filter for the build */
|
|
||||||
var filterMethods = allMethods;
|
|
||||||
|
|
||||||
/** Used to specify whether `filterMethods` is used for exclusion or inclusion */
|
|
||||||
var filterType = process.argv.reduce(function(result, value) {
|
|
||||||
if (result) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
var pair = value.match(/^(category|exclude|include)=(.*)$/);
|
|
||||||
if (!pair) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = pair[1];
|
|
||||||
filterMethods = pair[2].split(/, */).map(getRealName);
|
|
||||||
|
|
||||||
if (result == 'category') {
|
|
||||||
// resolve method names belonging to each category
|
|
||||||
filterMethods = filterMethods.reduce(function(result, category) {
|
|
||||||
return result.concat(allMethods.filter(function(funcName) {
|
|
||||||
return RegExp('@category ' + category + '\\b', 'i').test(matchFunction(source, funcName));
|
|
||||||
}));
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// remove nonexistent method names
|
|
||||||
filterMethods = lodash.intersection(allMethods, filterMethods);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}, '');
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the aliases associated with a given `funcName`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} funcName The name of the function to get aliases for.
|
|
||||||
* @returns {Array} Returns an array of aliases.
|
|
||||||
*/
|
|
||||||
function getAliases(funcName) {
|
|
||||||
return realToAliasMap[funcName] || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an array of depenants for a function by the given `funcName`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} funcName The name of the function to query.
|
|
||||||
* @returns {Array} Returns an array of function dependants.
|
|
||||||
*/
|
|
||||||
function getDependants(funcName) {
|
|
||||||
// iterate over `dependencyMap`, adding the names of functions that
|
|
||||||
// have `funcName` as a dependency
|
|
||||||
return lodash.reduce(dependencyMap, function(result, dependencies, otherName) {
|
|
||||||
if (dependencies.indexOf(funcName) > -1) {
|
|
||||||
result.push(otherName);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an array of dependencies for a function of the given `funcName`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} funcName The name of the function to query.
|
|
||||||
* @returns {Array} Returns an array of function dependencies.
|
|
||||||
*/
|
|
||||||
function getDependencies(funcName) {
|
|
||||||
var dependencies = dependencyMap[funcName],
|
|
||||||
result = [];
|
|
||||||
|
|
||||||
if (!dependencies) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// recursively accumulate the dependencies of the `funcName` function, and
|
|
||||||
// the dependencies of its dependencies, and so on.
|
|
||||||
return dependencies.reduce(function(result, otherName) {
|
|
||||||
result.push.apply(result, getDependencies(otherName).concat(otherName));
|
|
||||||
return result;
|
|
||||||
}, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the real name, not alias, of a given `funcName`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} funcName The name of the function to resolve.
|
|
||||||
* @returns {String} Returns the real name.
|
|
||||||
*/
|
|
||||||
function getRealName(funcName) {
|
|
||||||
return aliasToRealMap[funcName] || funcName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if all functions of the given names have been removed from the `source`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to inspect.
|
|
||||||
* @param {String} [funcName1, funcName2, ...] The names of functions to check.
|
|
||||||
* @returns {Boolean} Returns `true` if all functions have been removed, else `false`.
|
|
||||||
*/
|
|
||||||
function isRemoved(source) {
|
|
||||||
return slice.call(arguments, 1).every(function(funcName) {
|
|
||||||
return !matchFunction(source, funcName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Searches the `source` for a `funcName` function declaration, expression, or
|
|
||||||
* assignment and returns the matched snippet.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to inspect.
|
|
||||||
* @param {String} funcName The name of the function to match.
|
|
||||||
* @returns {String} Returns the matched function snippet.
|
|
||||||
*/
|
|
||||||
function matchFunction(source, funcName) {
|
|
||||||
var result = source.match(RegExp(
|
|
||||||
// match multi-line comment block (could be on a single line)
|
|
||||||
'\\n +/\\*[^*]*\\*+(?:[^/][^*]*\\*+)*/\\n' +
|
|
||||||
// begin non-capturing group
|
|
||||||
'(?:' +
|
|
||||||
// match a function declaration
|
|
||||||
'( +)function ' + funcName + '\\b[\\s\\S]+?\\n\\1}|' +
|
|
||||||
// match a variable declaration with `createIterator`
|
|
||||||
' +var ' + funcName + ' *=.*?createIterator\\((?:{|[a-zA-Z])[\\s\\S]+?\\);|' +
|
|
||||||
// match a variable declaration with function expression
|
|
||||||
'( +)var ' + funcName + ' *=.*?function[\\s\\S]+?\\n\\2};' +
|
|
||||||
// end non-capturing group
|
|
||||||
')\\n'
|
|
||||||
));
|
|
||||||
|
|
||||||
return result ? result[0] : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the all references to `refName` from the `createIterator` source.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @param {String} refName The name of the reference to remove.
|
|
||||||
* @returns {String} Returns the modified source.
|
|
||||||
*/
|
|
||||||
function removeFromCreateIterator(source, refName) {
|
|
||||||
var snippet = matchFunction(source, 'createIterator'),
|
|
||||||
modified = snippet.replace(RegExp('\\b' + refName + '\\b,? *', 'g'), '');
|
|
||||||
|
|
||||||
return source.replace(snippet, modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the `funcName` function declaration, expression, or assignment and
|
|
||||||
* associated code from the `source`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @param {String} funcName The name of the function to remove.
|
|
||||||
* @returns {String} Returns the source with the function removed.
|
|
||||||
*/
|
|
||||||
function removeFunction(source, funcName) {
|
|
||||||
var modified,
|
|
||||||
snippet = matchFunction(source, funcName);
|
|
||||||
|
|
||||||
// exit early if function is not found
|
|
||||||
if (!snippet) {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
// remove function
|
|
||||||
source = source.replace(matchFunction(source, funcName), '');
|
|
||||||
|
|
||||||
// grab the method assignments snippet
|
|
||||||
snippet = source.match(/lodash\.VERSION *= *[\s\S]+?\/\*-+\*\/\n/)[0];
|
|
||||||
|
|
||||||
// remove assignment and aliases
|
|
||||||
modified = getAliases(funcName).concat(funcName).reduce(function(result, otherName) {
|
|
||||||
return result.replace(RegExp('(?:\\n *//.*\\s*)* *lodash\\.' + otherName + ' *= *.+\\n'), '');
|
|
||||||
}, snippet);
|
|
||||||
|
|
||||||
// replace with the modified snippet
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
|
|
||||||
return removeFromCreateIterator(source, funcName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a given variable from the `source`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @param {String} varName The name of the variable to remove.
|
|
||||||
* @returns {String} Returns the source with the variable removed.
|
|
||||||
*/
|
|
||||||
function removeVar(source, varName) {
|
|
||||||
source = source.replace(RegExp(
|
|
||||||
// begin non-capturing group
|
|
||||||
'(?:' +
|
|
||||||
// match multi-line comment block
|
|
||||||
'(?:\\n +/\\*[^*]*\\*+(?:[^/][^*]*\\*+)*/)?\\n' +
|
|
||||||
// match a variable declaration that's not part of a declaration list
|
|
||||||
'( +)var ' + varName + ' *= *(?:.*?;|(?:Function\\(.+?|.*?[^,])\\n[\\s\\S]+?\\n\\1.+?;)\\n|' +
|
|
||||||
// match a variable in a declaration list
|
|
||||||
'\\n +' + varName + ' *=.*?,' +
|
|
||||||
// end non-capturing group
|
|
||||||
')'
|
|
||||||
), '');
|
|
||||||
|
|
||||||
// remove a varaible at the start of a variable declaration list
|
|
||||||
source = source.replace(RegExp('(var +)' + varName + ' *=.+?,\\s+'), '$1');
|
|
||||||
|
|
||||||
// remove a variable at the end of a variable declaration list
|
|
||||||
source = source.replace(RegExp(',\\s*' + varName + ' *=.*?;'), ';');
|
|
||||||
|
|
||||||
return removeFromCreateIterator(source, varName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes non-syntax critical whitespace from a string.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the source with whitespace removed.
|
|
||||||
*/
|
|
||||||
function removeWhitespace(source) {
|
|
||||||
return source.replace(/\[object |else if|function | in |return\s+[\w']|throw |typeof |var |@ |\\\\n|\\n|\s+/g, function(match) {
|
|
||||||
return match == false || match == '\\n' ? '' : match;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// custom build
|
|
||||||
(function() {
|
|
||||||
// exit early if "category", "exclude", or "include" options aren't specified
|
|
||||||
if (!filterType) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (filterType == 'exclude') {
|
|
||||||
// remove methods that are named in `filterMethods` and their dependants
|
|
||||||
filterMethods.forEach(function(funcName) {
|
|
||||||
getDependants(funcName).concat(funcName).forEach(function(otherName) {
|
|
||||||
source = removeFunction(source, otherName);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// add dependencies to `filterMethods`
|
|
||||||
filterMethods = lodash.uniq(filterMethods.reduce(function(result, funcName) {
|
|
||||||
result.push.apply(result, getDependencies(funcName).concat(funcName));
|
|
||||||
return result;
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
// remove methods that aren't named in `filterMethods`
|
|
||||||
lodash.each(dependencyMap, function(dependencies, otherName) {
|
|
||||||
if (filterMethods.indexOf(otherName) < 0) {
|
|
||||||
source = removeFunction(source, otherName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove associated functions, variables and code snippets
|
|
||||||
if (isRemoved(source, 'isArguments')) {
|
|
||||||
// remove `isArguments` if-statement
|
|
||||||
source = source.replace(/(?:\s*\/\/.*)*\s*if *\(!isArguments[^)]+\)[\s\S]+?};?\s*}\n/, '');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'mixin')) {
|
|
||||||
// remove `LoDash` constructor
|
|
||||||
source = removeFunction(source, 'LoDash');
|
|
||||||
// remove `LoDash` calls
|
|
||||||
source = source.replace(/(?:new +LoDash(?!\()|(?:new +)?LoDash\([^)]*\));?/g, '');
|
|
||||||
// remove `LoDash.prototype` additions
|
|
||||||
source = source.replace(/(?:\s*\/\/.*)*\s*LoDash.prototype *=[\s\S]+?\/\*-+\*\//, '');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'template')) {
|
|
||||||
// remove `templateSettings` assignment
|
|
||||||
source = source.replace(/(?:\n +\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\/)?\n *lodash\.templateSettings[\s\S]+?};\n/, '');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'isArray', 'isEmpty', 'isEqual', 'size')) {
|
|
||||||
source = removeVar(source, 'arrayClass');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'bind', 'functions', 'groupBy', 'invoke', 'isEqual', 'isFunction', 'result', 'sortBy', 'toArray')) {
|
|
||||||
source = removeVar(source, 'funcClass');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'bind')) {
|
|
||||||
source = removeVar(source, 'nativeBind');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'isArray')) {
|
|
||||||
source = removeVar(source, 'nativeIsArray');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'keys')) {
|
|
||||||
source = removeVar(source, 'nativeKeys');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'clone', 'isObject', 'keys')) {
|
|
||||||
source = removeVar(source, 'objectTypes');
|
|
||||||
source = removeFromCreateIterator(source, 'objectTypes');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'bind', 'isArray', 'keys')) {
|
|
||||||
source = removeVar(source, 'reNative');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'isEmpty', 'isEqual', 'isString', 'size')) {
|
|
||||||
source = removeVar(source, 'stringClass');
|
|
||||||
}
|
|
||||||
|
|
||||||
// consolidate consecutive horizontal rule comment separators
|
|
||||||
source = source.replace(/(?:\s*\/\*-+\*\/\s*){2,}/g, function(separators) {
|
|
||||||
return separators.match(/^\s*/)[0] + separators.slice(separators.lastIndexOf('/*'));
|
|
||||||
});
|
|
||||||
}());
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
if (isMobile) {
|
|
||||||
// inline functions defined with `createIterator`
|
|
||||||
lodash.functions(lodash).forEach(function(funcName) {
|
|
||||||
// match `funcName` with pseudo private `_` prefixes removed to allow matching `shimKeys`
|
|
||||||
var reFunc = RegExp('(\\bvar ' + funcName.replace(/^_/, '') + ' *= *)createIterator\\(((?:{|[a-zA-Z])[\\s\\S]+?)\\);\\n');
|
|
||||||
|
|
||||||
// skip if not defined with `createIterator`
|
|
||||||
if (!reFunc.test(source)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// extract and format the function's code
|
|
||||||
var code = (lodash[funcName] + '').replace(/\n(?:.*)/g, function(match) {
|
|
||||||
match = match.slice(1);
|
|
||||||
return (match == '}' ? '\n ' : '\n ') + match;
|
|
||||||
});
|
|
||||||
|
|
||||||
source = source.replace(reFunc, '$1' + code + ';\n');
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove `iteratorTemplate`
|
|
||||||
source = removeVar(source, 'iteratorTemplate');
|
|
||||||
|
|
||||||
// remove JScript [[DontEnum]] fix from `isEqual`
|
|
||||||
source = source.replace(/(?:\s*\/\/.*\n)*( +)if *\(result *&& *hasDontEnumBug[\s\S]+?\n\1}\n/, '\n');
|
|
||||||
|
|
||||||
// remove IE `shift` and `splice` fix
|
|
||||||
source = source.replace(/(?:\s*\/\/.*\n)*( +)if *\(value.length *=== *0[\s\S]+?\n\1}\n/, '\n');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// inline `iteratorTemplate` template
|
|
||||||
source = source.replace(/(( +)var iteratorTemplate *= *)([\s\S]+?\n\2.+?);\n/, (function() {
|
|
||||||
// extract `iteratorTemplate` code
|
|
||||||
var code = /^function[^{]+{([\s\S]+?)}$/.exec(lodash._iteratorTemplate)[1];
|
|
||||||
|
|
||||||
code = removeWhitespace(code)
|
|
||||||
// remove unnecessary code
|
|
||||||
.replace(/\|\|\{\}|,__t,__j=Array.prototype.join|function print[^}]+}|\+''/g, '')
|
|
||||||
.replace(/(\{);|;(\})/g, '$1$2')
|
|
||||||
.replace(/\(\(__t=\(([^)]+)\)\)==null\?'':__t\)/g, '$1')
|
|
||||||
// ensure escaped characters are interpreted correctly in the string literal
|
|
||||||
.replace(/\\/g, '\\\\');
|
|
||||||
|
|
||||||
// add `code` to `Function()` as a string literal to avoid strict mode
|
|
||||||
// errors caused by the required with-statement
|
|
||||||
return '$1Function(\'obj\',\n$2 "' + code + '"\n$2);\n';
|
|
||||||
}()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove pseudo private properties
|
|
||||||
source = source.replace(/(?:(?:\s*\/\/.*)*\s*lodash\._[^=]+=.+\n)+/g, '\n');
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// begin the minification process
|
|
||||||
if (filterType || isMobile) {
|
|
||||||
fs.writeFileSync(path.join(__dirname, 'lodash.custom.js'), source);
|
|
||||||
minify(source, 'lodash.custom.min', function(result) {
|
|
||||||
fs.writeFileSync(path.join(__dirname, 'lodash.custom.min.js'), result);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
minify(source, 'lodash.min', function(result) {
|
|
||||||
fs.writeFileSync(path.join(__dirname, 'lodash.min.js'), result);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
341
build/minify.js
341
build/minify.js
@@ -1,341 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem, path, `zlib`, and child process modules */
|
|
||||||
var fs = require('fs'),
|
|
||||||
gzip = require('zlib').gzip,
|
|
||||||
path = require('path'),
|
|
||||||
spawn = require('child_process').spawn;
|
|
||||||
|
|
||||||
/** The directory that is the base of the repository */
|
|
||||||
var basePath = path.join(__dirname, '../');
|
|
||||||
|
|
||||||
/** The directory where the Closure Compiler is located */
|
|
||||||
var closurePath = path.join(basePath, 'vendor', 'closure-compiler', 'compiler.jar');
|
|
||||||
|
|
||||||
/** The distribution directory */
|
|
||||||
var distPath = path.join(basePath, 'dist');
|
|
||||||
|
|
||||||
/** Load other modules */
|
|
||||||
var preprocess = require(path.join(__dirname, 'pre-compile')),
|
|
||||||
postprocess = require(path.join(__dirname, 'post-compile')),
|
|
||||||
uglifyJS = require(path.join(basePath, 'vendor', 'uglifyjs', 'uglify-js'));
|
|
||||||
|
|
||||||
/** Closure Compiler command-line options */
|
|
||||||
var closureOptions = [
|
|
||||||
'--compilation_level=ADVANCED_OPTIMIZATIONS',
|
|
||||||
'--language_in=ECMASCRIPT5_STRICT',
|
|
||||||
'--warning_level=QUIET'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Reassign `existsSync` for older versions of Node */
|
|
||||||
fs.existsSync || (fs.existsSync = path.existsSync);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The exposed `minify` function minifies a given `source` and invokes the
|
|
||||||
* `onComplete` callback when finished.
|
|
||||||
*
|
|
||||||
* @param {String} source The source to minify.
|
|
||||||
* @param {String} workingName The name to give temporary files creates during the minification process.
|
|
||||||
* @param {Function} onComplete A function called when minification has completed.
|
|
||||||
*/
|
|
||||||
function minify(source, workingName, onComplete) {
|
|
||||||
new Minify(source, workingName, onComplete);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Minify constructor used to keep state of each `minify` invocation.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @constructor
|
|
||||||
* @param {String} source The source to minify.
|
|
||||||
* @param {String} workingName The name to give temporary files creates during the minification process.
|
|
||||||
* @param {Function} onComplete A function called when minification has completed.
|
|
||||||
*/
|
|
||||||
function Minify(source, workingName, onComplete) {
|
|
||||||
// create the destination directory if it doesn't exist
|
|
||||||
if (!fs.existsSync(distPath)) {
|
|
||||||
fs.mkdirSync(distPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.compiled = {};
|
|
||||||
this.hybrid = {};
|
|
||||||
this.uglified = {};
|
|
||||||
this.onComplete = onComplete;
|
|
||||||
this.source = source = preprocess(source);
|
|
||||||
this.workingName = workingName;
|
|
||||||
|
|
||||||
// begin the minification process
|
|
||||||
closureCompile.call(this, source, onClosureCompile.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compresses a `source` string using the Closure Compiler. Yields the
|
|
||||||
* minified result, and any exceptions encountered, to a `callback` function.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The JavaScript source to minify.
|
|
||||||
* @param {String} [message] The message to log.
|
|
||||||
* @param {Function} callback The function to call once the process completes.
|
|
||||||
*/
|
|
||||||
function closureCompile(source, message, callback) {
|
|
||||||
// the standard error stream, standard output stream, and Closure Compiler process
|
|
||||||
var error = '',
|
|
||||||
output = '',
|
|
||||||
compiler = spawn('java', ['-jar', closurePath].concat(closureOptions));
|
|
||||||
|
|
||||||
// juggle arguments
|
|
||||||
if (typeof message == 'function') {
|
|
||||||
callback = message;
|
|
||||||
message = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(message == null
|
|
||||||
? 'Compressing ' + this.workingName + ' using the Closure Compiler...'
|
|
||||||
: message
|
|
||||||
);
|
|
||||||
|
|
||||||
compiler.stdout.on('data', function(data) {
|
|
||||||
// append the data to the output stream
|
|
||||||
output += data;
|
|
||||||
});
|
|
||||||
|
|
||||||
compiler.stderr.on('data', function(data) {
|
|
||||||
// append the error message to the error stream
|
|
||||||
error += data;
|
|
||||||
});
|
|
||||||
|
|
||||||
compiler.on('exit', function(status) {
|
|
||||||
var exception = null;
|
|
||||||
|
|
||||||
// `status` contains the process exit code
|
|
||||||
if (status) {
|
|
||||||
exception = new Error(error);
|
|
||||||
exception.status = status;
|
|
||||||
}
|
|
||||||
callback(exception, output);
|
|
||||||
});
|
|
||||||
|
|
||||||
// proxy the standard input to the Closure Compiler
|
|
||||||
compiler.stdin.end(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compresses a `source` string using UglifyJS. Yields the result to a
|
|
||||||
* `callback` function. This function is synchronous; the `callback` is used
|
|
||||||
* for symmetry.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The JavaScript source to minify.
|
|
||||||
* @param {String} [message] The message to log.
|
|
||||||
* @param {Function} callback The function to call once the process completes.
|
|
||||||
*/
|
|
||||||
function uglify(source, message, callback) {
|
|
||||||
var exception,
|
|
||||||
result,
|
|
||||||
ugly = uglifyJS.uglify;
|
|
||||||
|
|
||||||
// juggle arguments
|
|
||||||
if (typeof message == 'function') {
|
|
||||||
callback = message;
|
|
||||||
message = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(message == null
|
|
||||||
? 'Compressing ' + this.workingName + ' using UglifyJS...'
|
|
||||||
: message
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
|
||||||
result = ugly.gen_code(
|
|
||||||
// enable unsafe transformations
|
|
||||||
ugly.ast_squeeze_more(
|
|
||||||
ugly.ast_squeeze(
|
|
||||||
// munge variable and function names, excluding the special `define`
|
|
||||||
// function exposed by AMD loaders
|
|
||||||
ugly.ast_mangle(uglifyJS.parser.parse(source), {
|
|
||||||
'except': ['define']
|
|
||||||
}
|
|
||||||
))), {
|
|
||||||
'ascii_only': true
|
|
||||||
});
|
|
||||||
} catch(e) {
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
// lines are restricted to 500 characters for consistency with the Closure Compiler
|
|
||||||
callback(exception, result && ugly.split_lines(result, 500));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `closureCompile()` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {String} result The resulting minified source.
|
|
||||||
*/
|
|
||||||
function onClosureCompile(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the post-processed Closure Compiler result and gzip it
|
|
||||||
this.compiled.source = result = postprocess(result);
|
|
||||||
gzip(result, onClosureGzip.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Closure Compiler `gzip` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {Buffer} result The resulting gzipped source.
|
|
||||||
*/
|
|
||||||
function onClosureGzip(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the gzipped result and report the size
|
|
||||||
this.compiled.gzip = result;
|
|
||||||
console.log('Done. Size: %d bytes.', result.length);
|
|
||||||
|
|
||||||
// next, minify the source using only UglifyJS
|
|
||||||
uglify.call(this, this.source, onUglify.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `uglify()` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {String} result The resulting minified source.
|
|
||||||
*/
|
|
||||||
function onUglify(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the post-processed Uglified result and gzip it
|
|
||||||
this.uglified.source = result = postprocess(result);
|
|
||||||
gzip(result, onUglifyGzip.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The UglifyJS `gzip` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {Buffer} result The resulting gzipped source.
|
|
||||||
*/
|
|
||||||
function onUglifyGzip(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
var message = 'Compressing ' + this.workingName + ' using hybrid minification...';
|
|
||||||
|
|
||||||
// store the gzipped result and report the size
|
|
||||||
this.uglified.gzip = result;
|
|
||||||
console.log('Done. Size: %d bytes.', result.length);
|
|
||||||
|
|
||||||
// next, minify the Closure Compiler minified source using UglifyJS
|
|
||||||
uglify.call(this, this.compiled.source, message, onHybrid.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The hybrid `uglify()` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {String} result The resulting minified source.
|
|
||||||
*/
|
|
||||||
function onHybrid(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the post-processed Uglified result and gzip it
|
|
||||||
this.hybrid.source = result = postprocess(result);
|
|
||||||
gzip(result, onHybridGzip.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The hybrid `gzip` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {Buffer} result The resulting gzipped source.
|
|
||||||
*/
|
|
||||||
function onHybridGzip(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the gzipped result and report the size
|
|
||||||
this.hybrid.gzip = result;
|
|
||||||
console.log('Done. Size: %d bytes.', result.length);
|
|
||||||
|
|
||||||
// finish by choosing the smallest compressed file
|
|
||||||
onComplete.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The callback executed after JavaScript source is minified and gzipped.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function onComplete() {
|
|
||||||
var compiled = this.compiled,
|
|
||||||
hybrid = this.hybrid,
|
|
||||||
name = this.workingName,
|
|
||||||
uglified = this.uglified;
|
|
||||||
|
|
||||||
// save the Closure Compiled version to disk
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.compiler.js'), compiled.source);
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.compiler.js.gz'), compiled.gzip);
|
|
||||||
|
|
||||||
// save the Uglified version to disk
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.uglify.js'), uglified.source);
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.uglify.js.gz'), uglified.gzip);
|
|
||||||
|
|
||||||
// save the hybrid minified version to disk
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.hybrid.js'), hybrid.source);
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.hybrid.js.gz'), hybrid.gzip);
|
|
||||||
|
|
||||||
// select the smallest gzipped file and use its minified counterpart as the
|
|
||||||
// official minified release (ties go to Closure Compiler)
|
|
||||||
var min = Math.min(compiled.gzip.length, hybrid.gzip.length, uglified.gzip.length);
|
|
||||||
|
|
||||||
// pass the minified source to the minify instances "onComplete" callback
|
|
||||||
this.onComplete(
|
|
||||||
compiled.gzip.length == min
|
|
||||||
? compiled.source
|
|
||||||
: uglified.gzip.length == min
|
|
||||||
? uglified.source
|
|
||||||
: hybrid.source
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `minify`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = minify;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// read the JavaScript source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node minify.js source.js`) and write to
|
|
||||||
// the same file
|
|
||||||
(function() {
|
|
||||||
var filePath = process.argv[2],
|
|
||||||
dirPath = path.dirname(filePath),
|
|
||||||
source = fs.readFileSync(filePath, 'utf8'),
|
|
||||||
workingName = path.basename(filePath, '.js') + '.min';
|
|
||||||
|
|
||||||
minify(source, workingName, function(result) {
|
|
||||||
fs.writeFileSync(path.join(dirPath, workingName + '.js'), result);
|
|
||||||
});
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem module */
|
|
||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
/** The minimal license/copyright template */
|
|
||||||
var licenseTemplate =
|
|
||||||
'/*!\n' +
|
|
||||||
' Lo-Dash @VERSION lodash.com/license\n' +
|
|
||||||
' Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE\n' +
|
|
||||||
'*/';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post-process a given minified JavaScript `source`, preparing it for
|
|
||||||
* deployment.
|
|
||||||
*
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the processed source.
|
|
||||||
*/
|
|
||||||
function postprocess(source) {
|
|
||||||
// exit early if snippet isn't found
|
|
||||||
var snippet = /VERSION\s*[=:]\s*([\'"])(.*?)\1/.exec(source);
|
|
||||||
if (!snippet) {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the version
|
|
||||||
var license = licenseTemplate.replace('@VERSION', snippet[2]);
|
|
||||||
|
|
||||||
// move vars exposed by Closure Compiler into the IIFE
|
|
||||||
source = source.replace(/^([^(\n]+)\s*(\(function[^)]+\){)/, '$2$1');
|
|
||||||
|
|
||||||
// use double quotes consistently
|
|
||||||
source = source.replace(/'use strict'/, '"use strict"');
|
|
||||||
|
|
||||||
// unescape properties (i.e. foo["bar"] => foo.bar)
|
|
||||||
source = source.replace(/(\w)\["([^."]+)"\]/g, '$1.$2');
|
|
||||||
|
|
||||||
// correct AMD module definition for AMD build optimizers
|
|
||||||
source = source.replace(/("function")==(typeof define)&&\(?("object")==(typeof define\.amd)(&&define\.amd)\)?/, '$2==$1&&$4==$3$5');
|
|
||||||
|
|
||||||
// add license
|
|
||||||
source = license + '\n;' + source;
|
|
||||||
|
|
||||||
// add trailing semicolon
|
|
||||||
return source.replace(/[\s;]*$/, ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `postprocess`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = postprocess;
|
|
||||||
} else {
|
|
||||||
// read the JavaScript source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node post-compile.js source.js`) and write to
|
|
||||||
// the same file
|
|
||||||
(function() {
|
|
||||||
var source = fs.readFileSync(process.argv[2], 'utf8');
|
|
||||||
fs.writeFileSync(process.argv[2], postprocess(source), 'utf8');
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
@@ -1,339 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem module */
|
|
||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
/** Used to minify variables embedded in compiled strings */
|
|
||||||
var compiledVars = [
|
|
||||||
'accumulator',
|
|
||||||
'arrayClass',
|
|
||||||
'callback',
|
|
||||||
'className',
|
|
||||||
'collection',
|
|
||||||
'ctor',
|
|
||||||
'false',
|
|
||||||
'funcClass',
|
|
||||||
'hasOwnProperty',
|
|
||||||
'identity',
|
|
||||||
'index',
|
|
||||||
'iteratorBind',
|
|
||||||
'length',
|
|
||||||
'object',
|
|
||||||
'objectTypes',
|
|
||||||
'noaccum',
|
|
||||||
'property',
|
|
||||||
'result',
|
|
||||||
'skipProto',
|
|
||||||
'source',
|
|
||||||
'sourceIndex',
|
|
||||||
'stringClass',
|
|
||||||
'target',
|
|
||||||
'thisArg',
|
|
||||||
'toString',
|
|
||||||
'true',
|
|
||||||
'undefined',
|
|
||||||
'value'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to minify `compileIterator` option properties */
|
|
||||||
var iteratorOptions = [
|
|
||||||
'args',
|
|
||||||
'array',
|
|
||||||
'arrayBranch',
|
|
||||||
'beforeLoop',
|
|
||||||
'bottom',
|
|
||||||
'exit',
|
|
||||||
'firstArg',
|
|
||||||
'hasExp',
|
|
||||||
'hasDontEnumBug',
|
|
||||||
'inLoop',
|
|
||||||
'init',
|
|
||||||
'iteratedObject',
|
|
||||||
'loopExp',
|
|
||||||
'object',
|
|
||||||
'objectBranch',
|
|
||||||
'shadowed',
|
|
||||||
'top',
|
|
||||||
'useHas'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to minify variables and string values to a single character */
|
|
||||||
var minNames = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
|
|
||||||
|
|
||||||
/** Used to protect the specified properties from getting minified */
|
|
||||||
var propWhitelist = [
|
|
||||||
'_',
|
|
||||||
'_chain',
|
|
||||||
'_wrapped',
|
|
||||||
'after',
|
|
||||||
'all',
|
|
||||||
'amd',
|
|
||||||
'any',
|
|
||||||
'bind',
|
|
||||||
'bindAll',
|
|
||||||
'chain',
|
|
||||||
'clearTimeout',
|
|
||||||
'clone',
|
|
||||||
'collect',
|
|
||||||
'compact',
|
|
||||||
'compose',
|
|
||||||
'contains',
|
|
||||||
'criteria',
|
|
||||||
'debounce',
|
|
||||||
'defaults',
|
|
||||||
'defer',
|
|
||||||
'delay',
|
|
||||||
'detect',
|
|
||||||
'difference',
|
|
||||||
'each',
|
|
||||||
'environment',
|
|
||||||
'escape',
|
|
||||||
'escape',
|
|
||||||
'evaluate',
|
|
||||||
'every',
|
|
||||||
'extend',
|
|
||||||
'filter',
|
|
||||||
'find',
|
|
||||||
'first',
|
|
||||||
'flatten',
|
|
||||||
'foldl',
|
|
||||||
'foldr',
|
|
||||||
'forEach',
|
|
||||||
'forIn',
|
|
||||||
'forOwn',
|
|
||||||
'functions',
|
|
||||||
'groupBy',
|
|
||||||
'has',
|
|
||||||
'head',
|
|
||||||
'identity',
|
|
||||||
'include',
|
|
||||||
'indexOf',
|
|
||||||
'initial',
|
|
||||||
'inject',
|
|
||||||
'interpolate',
|
|
||||||
'intersection',
|
|
||||||
'invoke',
|
|
||||||
'isArguments',
|
|
||||||
'isArray',
|
|
||||||
'isBoolean',
|
|
||||||
'isDate',
|
|
||||||
'isElement',
|
|
||||||
'isEmpty',
|
|
||||||
'isEqual',
|
|
||||||
'isEqual',
|
|
||||||
'isFinite',
|
|
||||||
'isFinite',
|
|
||||||
'isFunction',
|
|
||||||
'isNaN',
|
|
||||||
'isNull',
|
|
||||||
'isNumber',
|
|
||||||
'isObject',
|
|
||||||
'isRegExp',
|
|
||||||
'isString',
|
|
||||||
'isUndefined',
|
|
||||||
'keys',
|
|
||||||
'last',
|
|
||||||
'lastIndexOf',
|
|
||||||
'map',
|
|
||||||
'max',
|
|
||||||
'memoize',
|
|
||||||
'methods',
|
|
||||||
'min',
|
|
||||||
'mixin',
|
|
||||||
'noConflict',
|
|
||||||
'once',
|
|
||||||
'opera',
|
|
||||||
'partial',
|
|
||||||
'pick',
|
|
||||||
'pluck',
|
|
||||||
'range',
|
|
||||||
'reduce',
|
|
||||||
'reduceRight',
|
|
||||||
'reject',
|
|
||||||
'rest',
|
|
||||||
'result',
|
|
||||||
'select',
|
|
||||||
'setTimeout',
|
|
||||||
'shuffle',
|
|
||||||
'size',
|
|
||||||
'some',
|
|
||||||
'sortBy',
|
|
||||||
'sortedIndex',
|
|
||||||
'source',
|
|
||||||
'tail',
|
|
||||||
'take',
|
|
||||||
'tap',
|
|
||||||
'template',
|
|
||||||
'templateSettings',
|
|
||||||
'throttle',
|
|
||||||
'times',
|
|
||||||
'toArray',
|
|
||||||
'union',
|
|
||||||
'uniq',
|
|
||||||
'unique',
|
|
||||||
'uniqueId',
|
|
||||||
'value',
|
|
||||||
'values',
|
|
||||||
'variable',
|
|
||||||
'VERSION',
|
|
||||||
'without',
|
|
||||||
'wrap',
|
|
||||||
'zip'
|
|
||||||
];
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pre-process a given JavaScript `source`, preparing it for minification.
|
|
||||||
*
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the processed source.
|
|
||||||
*/
|
|
||||||
function preprocess(source) {
|
|
||||||
// remove copyright to add later in post-compile.js
|
|
||||||
source = source.replace(/\/\*![\s\S]+?\*\//, '');
|
|
||||||
|
|
||||||
// remove unrecognized JSDoc tags so Closure Compiler won't complain
|
|
||||||
source = source.replace(/@(?:alias|category)\b.*/g, '');
|
|
||||||
|
|
||||||
// add brackets to whitelisted properties so Closure Compiler won't mung them
|
|
||||||
// http://code.google.com/closure/compiler/docs/api-tutorial3.html#export
|
|
||||||
source = source.replace(RegExp('\\.(' + propWhitelist.join('|') + ')\\b', 'g'), "['$1']");
|
|
||||||
|
|
||||||
// remove brackets from `_.escape(__t)` in `tokenizeEscape`
|
|
||||||
source = source.replace("_['escape'](__t)", '_.escape(__t)');
|
|
||||||
|
|
||||||
// remove whitespace from string literals
|
|
||||||
source = source.replace(/'(?:(?=(\\?))\1.)*?'/g, function(string) {
|
|
||||||
// avoids removing the '\n' of the `stringEscapes` object
|
|
||||||
return string.replace(/\[object |else if|function | in |return\s+[\w']|throw |typeof |use strict|var |@ |'\\n'|\\\\n|\\n|\s+/g, function(match) {
|
|
||||||
return match == false || match == '\\n' ? '' : match;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove newline from double-quoted string in `_.template`
|
|
||||||
source = source.replace('"\';\\n"', '"\';"');
|
|
||||||
|
|
||||||
// remove debug sourceURL in `_.template`
|
|
||||||
source = source.replace(/\+(?:\s*\/\/.*)*\s*'\/\/@ sourceURL=[^;]+/, '');
|
|
||||||
|
|
||||||
// minify `_.sortBy` internal properties
|
|
||||||
(function() {
|
|
||||||
var properties = ['criteria', 'value'],
|
|
||||||
snippet = (source.match(/( +)function sortBy\b[\s\S]+?\n\1}/) || 0)[0],
|
|
||||||
result = snippet;
|
|
||||||
|
|
||||||
if (snippet) {
|
|
||||||
// minify property strings
|
|
||||||
properties.forEach(function(property, index) {
|
|
||||||
result = result.replace(RegExp("'" + property + "'", 'g'), "'" + minNames[index] + "'");
|
|
||||||
});
|
|
||||||
// replace with modified snippet
|
|
||||||
source = source.replace(snippet, result);
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
|
|
||||||
// minify all compilable snippets
|
|
||||||
var snippets = source.match(
|
|
||||||
RegExp([
|
|
||||||
// match the `iteratorTemplate`
|
|
||||||
'var iteratorTemplate\\b[\\s\\S]+?\\);\\n',
|
|
||||||
// match methods created by `createIterator` calls
|
|
||||||
'createIterator\\((?:{|[a-zA-Z]+)[\\s\\S]+?\\);\\n',
|
|
||||||
// match variables storing `createIterator` options
|
|
||||||
'( +)var [a-zA-Z]+IteratorOptions\\b[\\s\\S]+?\\n\\1}',
|
|
||||||
// match the the `createIterator` function
|
|
||||||
'( +)function createIterator\\b[\\s\\S]+?\\n\\2}'
|
|
||||||
].join('|'), 'g')
|
|
||||||
);
|
|
||||||
|
|
||||||
// exit early if no compilable snippets
|
|
||||||
if (!snippets) {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
snippets.forEach(function(snippet, index) {
|
|
||||||
var isCreateIterator = /function createIterator\b/.test(snippet),
|
|
||||||
isIteratorTemplate = /var iteratorTemplate\b/.test(snippet),
|
|
||||||
result = snippet;
|
|
||||||
|
|
||||||
|
|
||||||
// add brackets to whitelisted properties so Closure Compiler won't mung them
|
|
||||||
result = result.replace(RegExp('\\.(' + iteratorOptions.join('|') + ')\\b', 'g'), "['$1']");
|
|
||||||
|
|
||||||
if (isCreateIterator) {
|
|
||||||
// add `true` and `false` arguments to be minified
|
|
||||||
result = result
|
|
||||||
.replace(/(Function\(\s*'[\s\S]+?)undefined/, '$1true,false,undefined')
|
|
||||||
.replace(/factory\([^)]+/, '$&,true,false');
|
|
||||||
|
|
||||||
// replace with modified snippet early and clip snippet so other arguments
|
|
||||||
// aren't minified
|
|
||||||
source = source.replace(snippet, result);
|
|
||||||
snippet = result = result.replace(/factory\([\s\S]+$/, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
// minify snippet variables / arguments
|
|
||||||
compiledVars.forEach(function(variable, index) {
|
|
||||||
// ensure properties in compiled strings aren't minified
|
|
||||||
result = result.replace(RegExp('([^.]\\b)' + variable + '\\b(?!\' *[\\]:])', 'g'), '$1' + minNames[index]);
|
|
||||||
|
|
||||||
// correct `typeof x == 'object'`
|
|
||||||
if (variable == 'object') {
|
|
||||||
result = result.replace(RegExp("(typeof [^']+')" + minNames[index] + "'", 'g'), "$1object'");
|
|
||||||
}
|
|
||||||
// correct external boolean literals
|
|
||||||
else if (variable == 'true' || variable == 'false') {
|
|
||||||
result = result
|
|
||||||
.replace(RegExp(': *' + minNames[index] + '([,\\n])', 'g'), ':' + variable + '$1')
|
|
||||||
.replace(RegExp('\\b' + minNames[index] + ';', 'g'), variable + ';');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// minify `createIterator` option property names
|
|
||||||
iteratorOptions.forEach(function(property, index) {
|
|
||||||
if (isIteratorTemplate) {
|
|
||||||
// minify property names as interpolated template variables
|
|
||||||
result = result.replace(RegExp('\\b' + property + '\\b', 'g'), minNames[index]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (property == 'array' || property == 'object') {
|
|
||||||
// minify "array" and "object" sub property names
|
|
||||||
result = result.replace(RegExp("'" + property + "'( *[\\]:])", 'g'), "'" + minNames[index] + "'$1");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// minify property name strings
|
|
||||||
result = result.replace(RegExp("'" + property + "'", 'g'), "'" + minNames[index] + "'");
|
|
||||||
// minify property names in regexps and accessors
|
|
||||||
if (isCreateIterator) {
|
|
||||||
result = result.replace(RegExp('([\\.|/])' + property + '\\b' , 'g'), '$1' + minNames[index]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// replace with modified snippet
|
|
||||||
source = source.replace(snippet, result);
|
|
||||||
});
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `preprocess`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = preprocess;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// read the JavaScript source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node pre-compile.js source.js`) and write to
|
|
||||||
// the same file
|
|
||||||
(function() {
|
|
||||||
var source = fs.readFileSync(process.argv[2], 'utf8');
|
|
||||||
fs.writeFileSync(process.argv[2], preprocess(source), 'utf8');
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
3839
dist/lodash.core.js
vendored
Normal file
3839
dist/lodash.core.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
29
dist/lodash.core.min.js
vendored
Normal file
29
dist/lodash.core.min.js
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
||||||
|
* Build: `lodash core -o ./dist/lodash.core.js`
|
||||||
|
*/
|
||||||
|
;(function(){function n(n){return K(n)&&pn.call(n,"callee")&&!bn.call(n,"callee")}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?nn:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return d(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r,e){return n===nn||M(n,ln[r])&&!pn.call(e,r)?t:n}function f(n,t,r){
|
||||||
|
if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){n.apply(nn,r)},t)}function a(n,t){var r=true;return mn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function l(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===nn?i===i:r(i,c)))var c=i,f=o}return f}function p(n,t){var r=[];return mn(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function s(n,r,e,u,o){var i=-1,c=n.length;for(e||(e=D),o||(o=[]);++i<c;){var f=n[i];0<r&&e(f)?1<r?s(f,r-1,e,u,o):t(o,f):u||(o[o.length]=f);
|
||||||
|
}return o}function h(n,t){return n&&On(n,t,In)}function v(n,t){return p(t,function(t){return V(n[t])})}function y(n,t){return n>t}function b(n,t,r,e,u){return n===t||(null==n||null==t||!H(n)&&!K(t)?n!==n&&t!==t:g(n,t,r,e,b,u))}function g(n,t,r,e,u,o){var i=Nn(n),c=Nn(t),f="[object Array]",a="[object Array]";i||(f=hn.call(n),f="[object Arguments]"==f?"[object Object]":f),c||(a=hn.call(t),a="[object Arguments]"==a?"[object Object]":a);var l="[object Object]"==f,c="[object Object]"==a,a=f==a;o||(o=[]);
|
||||||
|
var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){return n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=B(n,t,r,e,u,o);else n:{switch(f){case"[object Boolean]":case"[object Date]":case"[object Number]":r=M(+n,+t);break n;case"[object Error]":r=n.name==t.name&&n.message==t.message;break n;case"[object RegExp]":case"[object String]":r=n==t+"";break n}r=false}return o.pop(),r}return 1&r||(i=l&&pn.call(n,"__wrapped__"),f=c&&pn.call(t,"__wrapped__"),!i&&!f)?!!a&&(r=R(n,t,r,e,u,o),
|
||||||
|
o.pop(),r):(i=i?n.value():n,f=f?t.value():t,r=u(i,f,r,e,o),o.pop(),r)}function _(n){return typeof n=="function"?n:null==n?Y:(typeof n=="object"?m:r)(n)}function j(n,t){return n<t}function d(n,t){var r=-1,e=U(n)?Array(n.length):[];return mn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function m(n){var t=_n(n);return function(r){var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];if(!(u in r&&b(n[u],r[u],3)))return false}return true}}function O(n,t){return n=Object(n),G(t,function(t,r){return r in n&&(t[r]=n[r]),
|
||||||
|
t},{})}function x(n){return xn(q(n,void 0,Y),n+"")}function A(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function E(n){return A(n,0,n.length)}function w(n,t){var r;return mn(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function k(n,r){return G(r,function(n,r){return r.func.apply(r.thisArg,t([n],r.args))},n)}function N(n,t,r,e){var u=!r;r||(r={});for(var o=-1,i=t.length;++o<i;){var c=t[o],f=e?e(r[c],n[c],c,r,n):nn;
|
||||||
|
if(f===nn&&(f=n[c]),u)r[c]=f;else{var a=r,l=a[c];pn.call(a,c)&&M(l,f)&&(f!==nn||c in a)||(a[c]=f)}}return r}function F(n){return x(function(t,r){var e=-1,u=r.length,o=1<u?r[u-1]:nn,o=3<n.length&&typeof o=="function"?(u--,o):nn;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function S(n){return function(){var t=arguments,r=dn(n.prototype),t=n.apply(r,t);return H(t)?t:r}}function T(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==on&&this instanceof e?u:n;++c<f;)a[c]=r[c];
|
||||||
|
for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");var u=S(n);return e}function B(n,t,r,e,u,o){var i=n.length,c=t.length;if(i!=c&&!(1&r&&c>i))return false;for(var c=-1,f=true,a=2&r?[]:nn;++c<i;){var l=n[c],p=t[c];if(void 0!==nn){f=false;break}if(a){if(!w(t,function(n,t){if(!z(a,t)&&(l===n||u(l,n,r,e,o)))return a.push(t)})){f=false;break}}else if(l!==p&&!u(l,p,r,e,o)){f=false;break}}return f}function R(n,t,r,e,u,o){var i=1&r,c=In(n),f=c.length,a=In(t).length;
|
||||||
|
if(f!=a&&!i)return false;for(var l=f;l--;){var p=c[l];if(!(i?p in t:pn.call(t,p)))return false}for(a=true;++l<f;){var p=c[l],s=n[p],h=t[p];if(void 0!==nn||s!==h&&!u(s,h,r,e,o)){a=false;break}i||(i="constructor"==p)}return a&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(a=false)),a}function D(t){return Nn(t)||n(t)}function I(n){var t=[];if(null!=n)for(var r in Object(n))t.push(r);return t}function q(n,t,r){
|
||||||
|
return t=jn(t===nn?n.length-1:t,0),function(){for(var e=arguments,u=-1,o=jn(e.length-t,0),i=Array(o);++u<o;)i[u]=e[t+u];for(u=-1,o=Array(t+1);++u<t;)o[u]=e[u];return o[t]=r(i),n.apply(this,o)}}function $(n){return(null==n?0:n.length)?s(n,1):[]}function P(n){return n&&n.length?n[0]:nn}function z(n,t,r){var e=null==n?0:n.length;r=typeof r=="number"?0>r?jn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1}function C(n,t){return mn(n,_(t))}function G(n,t,r){return e(n,_(t),r,3>arguments.length,mn);
|
||||||
|
}function J(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Fn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=nn),r}}function M(n,t){return n===t||n!==n&&t!==t}function U(n){var t;return(t=null!=n)&&(t=n.length,t=typeof t=="number"&&-1<t&&0==t%1&&9007199254740991>=t),t&&!V(n)}function V(n){return!!H(n)&&(n=hn.call(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function H(n){var t=typeof n;
|
||||||
|
return null!=n&&("object"==t||"function"==t)}function K(n){return null!=n&&typeof n=="object"}function L(n){return typeof n=="number"||K(n)&&"[object Number]"==hn.call(n)}function Q(n){return typeof n=="string"||!Nn(n)&&K(n)&&"[object String]"==hn.call(n)}function W(n){return typeof n=="string"?n:null==n?"":n+""}function X(n){return null==n?[]:u(n,In(n))}function Y(n){return n}function Z(n,r,e){var u=In(r),o=v(r,u);null!=e||H(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=v(r,In(r)));var i=!(H(e)&&"chain"in e&&!e.chain),c=V(n);
|
||||||
|
return mn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=E(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var nn,tn=1/0,rn=/[&<>"']/g,en=RegExp(rn.source),un=typeof self=="object"&&self&&self.Object===Object&&self,on=typeof global=="object"&&global&&global.Object===Object&&global||un||Function("return this")(),cn=(un=typeof exports=="object"&&exports&&!exports.nodeType&&exports)&&typeof module=="object"&&module&&!module.nodeType&&module,fn=function(n){
|
||||||
|
return function(t){return null==n?nn:n[t]}}({"&":"&","<":"<",">":">",'"':""","'":"'"}),an=Array.prototype,ln=Object.prototype,pn=ln.hasOwnProperty,sn=0,hn=ln.toString,vn=on._,yn=Object.create,bn=ln.propertyIsEnumerable,gn=on.isFinite,_n=function(n,t){return function(r){return n(t(r))}}(Object.keys,Object),jn=Math.max,dn=function(){function n(){}return function(t){return H(t)?yn?yn(t):(n.prototype=t,t=new n,n.prototype=nn,t):{}}}();i.prototype=dn(o.prototype),i.prototype.constructor=i;
|
||||||
|
var mn=function(n,t){return function(r,e){if(null==r)return r;if(!U(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(h),On=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}(),xn=Y,An=function(n){return function(t,r,e){var u=Object(t);if(!U(t)){var o=_(r);t=In(t),r=function(n){return o(u[n],n,u)}}return r=n(t,r,e),-1<r?u[o?t[r]:r]:nn}}(function(n,t,r){var e=null==n?0:n.length;
|
||||||
|
if(!e)return-1;r=null==r?0:Fn(r),0>r&&(r=jn(e+r,0));n:{for(t=_(t),e=n.length,r+=-1;++r<e;)if(t(n[r],r,n)){n=r;break n}n=-1}return n}),En=x(function(n,t,r){return T(n,t,r)}),wn=x(function(n,t){return f(n,1,t)}),kn=x(function(n,t,r){return f(n,Sn(t)||0,r)}),Nn=Array.isArray,Fn=Number,Sn=Number,Tn=F(function(n,t){N(t,_n(t),n)}),Bn=F(function(n,t){N(t,I(t),n)}),Rn=F(function(n,t,r,e){N(t,qn(t),n,e)}),Dn=x(function(n){return n.push(nn,c),Rn.apply(nn,n)}),In=_n,qn=I,$n=function(n){return xn(q(n,nn,$),n+"");
|
||||||
|
}(function(n,t){return null==n?{}:O(n,t)});o.assignIn=Bn,o.before=J,o.bind=En,o.chain=function(n){return n=o(n),n.__chain__=true,n},o.compact=function(n){return p(n,Boolean)},o.concat=function(){var n=arguments.length;if(!n)return[];for(var r=Array(n-1),e=arguments[0];n--;)r[n-1]=arguments[n];return t(Nn(e)?E(e):[e],s(r,1))},o.create=function(n,t){var r=dn(n);return null==t?r:Tn(r,t)},o.defaults=Dn,o.defer=wn,o.delay=kn,o.filter=function(n,t){return p(n,_(t))},o.flatten=$,o.flattenDeep=function(n){
|
||||||
|
return(null==n?0:n.length)?s(n,tn):[]},o.iteratee=_,o.keys=In,o.map=function(n,t){return d(n,_(t))},o.matches=function(n){return m(Tn({},n))},o.mixin=Z,o.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},o.once=function(n){return J(2,n)},o.pick=$n,o.slice=function(n,t,r){var e=null==n?0:n.length;return r=r===nn?e:+r,e?A(n,null==t?0:+t,r):[]},o.sortBy=function(n,t){var e=0;return t=_(t),d(d(n,function(n,r,u){return{
|
||||||
|
value:n,index:e++,criteria:t(n,r,u)}}).sort(function(n,t){var r;n:{r=n.criteria;var e=t.criteria;if(r!==e){var u=r!==nn,o=null===r,i=r===r,c=e!==nn,f=null===e,a=e===e;if(!f&&r>e||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&r<e||f&&u&&i||!c&&i||!a){r=-1;break n}}r=0}return r||n.index-t.index}),r("value"))},o.tap=function(n,t){return t(n),n},o.thru=function(n,t){return t(n)},o.toArray=function(n){return U(n)?n.length?E(n):[]:X(n)},o.values=X,o.extend=Bn,Z(o,o),o.clone=function(n){return H(n)?Nn(n)?E(n):N(n,_n(n)):n;
|
||||||
|
},o.escape=function(n){return(n=W(n))&&en.test(n)?n.replace(rn,fn):n},o.every=function(n,t,r){return t=r?nn:t,a(n,_(t))},o.find=An,o.forEach=C,o.has=function(n,t){return null!=n&&pn.call(n,t)},o.head=P,o.identity=Y,o.indexOf=z,o.isArguments=n,o.isArray=Nn,o.isBoolean=function(n){return true===n||false===n||K(n)&&"[object Boolean]"==hn.call(n)},o.isDate=function(n){return K(n)&&"[object Date]"==hn.call(n)},o.isEmpty=function(t){return U(t)&&(Nn(t)||Q(t)||V(t.splice)||n(t))?!t.length:!_n(t).length},o.isEqual=function(n,t){
|
||||||
|
return b(n,t)},o.isFinite=function(n){return typeof n=="number"&&gn(n)},o.isFunction=V,o.isNaN=function(n){return L(n)&&n!=+n},o.isNull=function(n){return null===n},o.isNumber=L,o.isObject=H,o.isRegExp=function(n){return K(n)&&"[object RegExp]"==hn.call(n)},o.isString=Q,o.isUndefined=function(n){return n===nn},o.last=function(n){var t=null==n?0:n.length;return t?n[t-1]:nn},o.max=function(n){return n&&n.length?l(n,Y,y):nn},o.min=function(n){return n&&n.length?l(n,Y,j):nn},o.noConflict=function(){return on._===this&&(on._=vn),
|
||||||
|
this},o.noop=function(){},o.reduce=G,o.result=function(n,t,r){return t=null==n?nn:n[t],t===nn&&(t=r),V(t)?t.call(n):t},o.size=function(n){return null==n?0:(n=U(n)?n:_n(n),n.length)},o.some=function(n,t,r){return t=r?nn:t,w(n,_(t))},o.uniqueId=function(n){var t=++sn;return W(n)+t},o.each=C,o.first=P,Z(o,function(){var n={};return h(o,function(t,r){pn.call(o.prototype,r)||(n[r]=t)}),n}(),{chain:false}),o.VERSION="4.17.2",mn("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){
|
||||||
|
var t=(/^(?:replace|split)$/.test(n)?String.prototype:an)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);o.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Nn(u)?u:[],n)}return this[r](function(r){return t.apply(Nn(r)?r:[],n)})}}),o.prototype.toJSON=o.prototype.valueOf=o.prototype.value=function(){return k(this.__wrapped__,this.__actions__)},typeof define=="function"&&typeof define.amd=="object"&&define.amd?(on._=o,
|
||||||
|
define(function(){return o})):cn?((cn.exports=o)._=o,un._=o):on._=o}).call(this);
|
||||||
1038
dist/lodash.fp.js
vendored
Normal file
1038
dist/lodash.fp.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
21
dist/lodash.fp.min.js
vendored
Normal file
21
dist/lodash.fp.min.js
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.fp=e():t.fp=e()})(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){function n(t,e){return i(t,t,e)}var i=r(1);"function"==typeof _&&"function"==typeof _.runInContext&&(_=n(_.runInContext())),
|
||||||
|
t.exports=n},function(t,e,r){function n(t,e){return 2==e?function(e,r){return t.apply(void 0,arguments)}:function(e){return t.apply(void 0,arguments)}}function i(t,e){return 2==e?function(e,r){return t(e,r)}:function(e){return t(e)}}function a(t){for(var e=t?t.length:0,r=Array(e);e--;)r[e]=t[e];return r}function o(t){return function(e){return t({},e)}}function s(t,e){return function(){for(var r=arguments.length,n=Array(r);r--;)n[r]=arguments[r];var i=n[e],a=n.length-1,o=n.slice(0,e);return i&&d.apply(o,i),
|
||||||
|
e!=a&&d.apply(o,n.slice(e+1)),t.apply(this,o)}}function l(t,e){return function(){var r=arguments.length;if(r){for(var n=Array(r);r--;)n[r]=arguments[r];var i=n[0]=e.apply(void 0,n);return t.apply(void 0,n),i}}}function u(t,e,r,d){function c(t,e){if(B.cap){var r=p.iterateeRearg[t];if(r)return x(e,r);var n=!b&&p.iterateeAry[t];if(n)return W(e,n)}return e}function h(t,e,r){return E||B.curry&&r>1?z(e,r):e}function g(t,e,r){if(B.fixed&&(F||!p.skipFixed[t])){var n=p.methodSpread[t],i=n&&n.start;return void 0===i?w(e,r):s(e,i);
|
||||||
|
}return e}function y(t,e,r){return B.rearg&&r>1&&(j||!p.skipRearg[t])?_(e,p.methodRearg[t]||p.aryRearg[r]):e}function m(t,e){e=V(e);for(var r=-1,n=e.length,i=n-1,a=D(Object(t)),o=a;null!=o&&++r<n;){var s=e[r],l=o[s];null!=l&&(o[e[r]]=D(r==i?l:Object(l))),o=o[s]}return a}function v(t){return H.runInContext.convert(t)(void 0)}function A(t,e){var r=p.aliasToReal[t]||t,n=p.remap[r]||r,i=d;return function(t){return u(b?L:S,r,b?L[n]:e,M(M({},i),t))}}function W(t,e){return I(t,function(t){return"function"==typeof t?i(t,e):t;
|
||||||
|
})}function x(t,e){return I(t,function(t){var r=e.length;return n(_(i(t,r),e),r)})}function I(t,e){return function(){var r=arguments.length;if(!r)return t();for(var n=Array(r);r--;)n[r]=arguments[r];var i=B.rearg?0:r-1;return n[i]=e(n[i]),t.apply(void 0,n)}}function R(t,e){var r,n=p.aliasToReal[t]||t,i=e,s=G[n];return s?i=s(e):B.immutable&&(p.mutate.array[n]?i=l(e,a):p.mutate.object[n]?i=l(e,o(e)):p.mutate.set[n]&&(i=l(e,m))),q(U,function(t){return q(p.aryMethod[t],function(e){if(n==e){var a=p.methodSpread[n];
|
||||||
|
return r=a&&a.afterRearg?g(n,y(n,i,t),t):y(n,g(n,i,t),t),r=c(n,r),r=h(n,r,t),!1}}),!r}),r||(r=i),r==e&&(r=E?z(r,1):function(){return e.apply(this,arguments)}),r.convert=A(n,e),p.placeholder[n]&&(O=!0,r.placeholder=e.placeholder=C),r}var O,b="function"==typeof e,k=e===Object(e);if(k&&(d=r,r=e,e=void 0),null==r)throw new TypeError;d||(d={});var B={cap:!("cap"in d)||d.cap,curry:!("curry"in d)||d.curry,fixed:!("fixed"in d)||d.fixed,immutable:!("immutable"in d)||d.immutable,rearg:!("rearg"in d)||d.rearg
|
||||||
|
},E="curry"in d&&d.curry,F="fixed"in d&&d.fixed,j="rearg"in d&&d.rearg,C=b?r:f,L=b?r.runInContext():void 0,S=b?r:{ary:t.ary,assign:t.assign,clone:t.clone,curry:t.curry,forEach:t.forEach,isArray:t.isArray,isFunction:t.isFunction,iteratee:t.iteratee,keys:t.keys,rearg:t.rearg,toInteger:t.toInteger,toPath:t.toPath},w=S.ary,M=S.assign,D=S.clone,z=S.curry,q=S.forEach,P=S.isArray,T=S.isFunction,K=S.keys,_=S.rearg,N=S.toInteger,V=S.toPath,U=K(p.aryMethod),G={castArray:function(t){return function(){var e=arguments[0];
|
||||||
|
return P(e)?t(a(e)):t.apply(void 0,arguments)}},iteratee:function(t){return function(){var e=arguments[0],r=arguments[1],n=t(e,r),a=n.length;return B.cap&&"number"==typeof r?(r=r>2?r-2:1,a&&a<=r?n:i(n,r)):n}},mixin:function(t){return function(e){var r=this;if(!T(r))return t(r,Object(e));var n=[];return q(K(e),function(t){T(e[t])&&n.push([t,r.prototype[t]])}),t(r,Object(e)),q(n,function(t){var e=t[1];T(e)?r.prototype[t[0]]=e:delete r.prototype[t[0]]}),r}},nthArg:function(t){return function(e){var r=e<0?1:N(e)+1;
|
||||||
|
return z(t(e),r)}},rearg:function(t){return function(e,r){var n=r?r.length:0;return z(t(e,r),n)}},runInContext:function(e){return function(r){return u(t,e(r),d)}}};if(!k)return R(e,r);var H=r,J=[];return q(U,function(t){q(p.aryMethod[t],function(t){var e=H[p.remap[t]||t];e&&J.push([t,R(t,e)])})}),q(K(H),function(t){var e=H[t];if("function"==typeof e){for(var r=J.length;r--;)if(J[r][0]==t)return;e.convert=A(t,e),J.push([t,e])}}),q(J,function(t){H[t[0]]=t[1]}),H.convert=v,O&&(H.placeholder=C),q(K(H),function(t){
|
||||||
|
q(p.realToAlias[t]||[],function(e){H[e]=H[t]})}),H}var p=r(2),f=r(3),d=Array.prototype.push;t.exports=u},function(t,e){e.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",
|
||||||
|
apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",
|
||||||
|
symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},e.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],
|
||||||
|
2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],
|
||||||
|
3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],
|
||||||
|
4:["fill","setWith","updateWith"]},e.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},e.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,
|
||||||
|
transform:2},e.iterateeRearg={mapKeys:[1]},e.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],
|
||||||
|
sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},e.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},e.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,
|
||||||
|
pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},e.placeholder={bind:!0,bindKey:!0,curry:!0,curryRight:!0,partial:!0,partialRight:!0},e.realToAlias=function(){var t=Object.prototype.hasOwnProperty,r=e.aliasToReal,n={};
|
||||||
|
for(var i in r){var a=r[i];t.call(n,a)?n[a].push(i):n[a]=[i]}return n}(),e.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",
|
||||||
|
mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},e.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},e.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,
|
||||||
|
lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},function(t,e){t.exports={}}])});
|
||||||
17065
dist/lodash.js
vendored
Normal file
17065
dist/lodash.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
136
dist/lodash.min.js
vendored
Normal file
136
dist/lodash.min.js
vendored
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
||||||
|
*/
|
||||||
|
;(function(){function n(n,t){return n.set(t[0],t[1]),n}function t(n,t){return n.add(t),n}function r(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function e(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function u(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&false!==t(n[r],r,n););return n}function i(n,t){for(var r=null==n?0:n.length;r--&&false!==t(n[r],r,n););
|
||||||
|
return n}function o(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return false;return true}function f(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function c(n,t){return!(null==n||!n.length)&&-1<d(n,t,0)}function a(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return true;return false}function l(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function s(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];
|
||||||
|
return n}function h(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function p(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function _(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return true;return false}function v(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,false}),e}function g(n,t,r,e){var u=n.length;for(r+=e?1:-1;e?r--:++r<u;)if(t(n[r],r,n))return r;return-1}function d(n,t,r){if(t===t)n:{
|
||||||
|
--r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=-1}else n=g(n,b,r);return n}function y(n,t,r,e){--r;for(var u=n.length;++r<u;)if(e(n[r],t))return r;return-1}function b(n){return n!==n}function x(n,t){var r=null==n?0:n.length;return r?k(n,t)/r:P}function j(n){return function(t){return null==t?F:t[n]}}function w(n){return function(t){return null==n?F:n[t]}}function m(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=false,n):t(r,n,u,i)}),r}function A(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;
|
||||||
|
return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==F&&(r=r===F?i:r+i)}return r}function E(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function O(n,t){return l(t,function(t){return[t,n[t]]})}function S(n){return function(t){return n(t)}}function I(n,t){return l(t,function(t){return n[t]})}function R(n,t){return n.has(t)}function z(n,t){for(var r=-1,e=n.length;++r<e&&-1<d(t,n[r],0););return r}function W(n,t){for(var r=n.length;r--&&-1<d(t,n[r],0););return r}function B(n){
|
||||||
|
return"\\"+Tn[n]}function L(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function U(n,t){return function(r){return n(t(r))}}function C(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&"__lodash_placeholder__"!==o||(n[r]="__lodash_placeholder__",i[u++]=r)}return i}function D(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function T(n){if(Bn.test(n)){
|
||||||
|
for(var t=zn.lastIndex=0;zn.test(n);)++t;n=t}else n=tt(n);return n}function $(n){return Bn.test(n)?n.match(zn)||[]:n.split("")}var F,N=1/0,P=NaN,Z=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],q=/\b__p\+='';/g,V=/\b(__p\+=)''\+/g,K=/(__e\(.*?\)|\b__t\))\+'';/g,G=/&(?:amp|lt|gt|quot|#39);/g,H=/[&<>"']/g,J=RegExp(G.source),Y=RegExp(H.source),Q=/<%-([\s\S]+?)%>/g,X=/<%([\s\S]+?)%>/g,nn=/<%=([\s\S]+?)%>/g,tn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,rn=/^\w*$/,en=/^\./,un=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,on=/[\\^$.*+?()[\]{}|]/g,fn=RegExp(on.source),cn=/^\s+|\s+$/g,an=/^\s+/,ln=/\s+$/,sn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,hn=/\{\n\/\* \[wrapped with (.+)\] \*/,pn=/,? & /,_n=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,vn=/\\(\\)?/g,gn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,dn=/\w*$/,yn=/^[-+]0x[0-9a-f]+$/i,bn=/^0b[01]+$/i,xn=/^\[object .+?Constructor\]$/,jn=/^0o[0-7]+$/i,wn=/^(?:0|[1-9]\d*)$/,mn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,An=/($^)/,kn=/['\n\r\u2028\u2029\\]/g,En="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",On="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+En,Sn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",In=RegExp("['\u2019]","g"),Rn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),zn=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+Sn+En,"g"),Wn=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)|\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)|\\d+",On].join("|"),"g"),Bn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),Ln=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Un="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Cn={};
|
||||||
|
Cn["[object Float32Array]"]=Cn["[object Float64Array]"]=Cn["[object Int8Array]"]=Cn["[object Int16Array]"]=Cn["[object Int32Array]"]=Cn["[object Uint8Array]"]=Cn["[object Uint8ClampedArray]"]=Cn["[object Uint16Array]"]=Cn["[object Uint32Array]"]=true,Cn["[object Arguments]"]=Cn["[object Array]"]=Cn["[object ArrayBuffer]"]=Cn["[object Boolean]"]=Cn["[object DataView]"]=Cn["[object Date]"]=Cn["[object Error]"]=Cn["[object Function]"]=Cn["[object Map]"]=Cn["[object Number]"]=Cn["[object Object]"]=Cn["[object RegExp]"]=Cn["[object Set]"]=Cn["[object String]"]=Cn["[object WeakMap]"]=false;
|
||||||
|
var Dn={};Dn["[object Arguments]"]=Dn["[object Array]"]=Dn["[object ArrayBuffer]"]=Dn["[object DataView]"]=Dn["[object Boolean]"]=Dn["[object Date]"]=Dn["[object Float32Array]"]=Dn["[object Float64Array]"]=Dn["[object Int8Array]"]=Dn["[object Int16Array]"]=Dn["[object Int32Array]"]=Dn["[object Map]"]=Dn["[object Number]"]=Dn["[object Object]"]=Dn["[object RegExp]"]=Dn["[object Set]"]=Dn["[object String]"]=Dn["[object Symbol]"]=Dn["[object Uint8Array]"]=Dn["[object Uint8ClampedArray]"]=Dn["[object Uint16Array]"]=Dn["[object Uint32Array]"]=true,
|
||||||
|
Dn["[object Error]"]=Dn["[object Function]"]=Dn["[object WeakMap]"]=false;var Mn,Tn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$n=parseFloat,Fn=parseInt,Nn=typeof global=="object"&&global&&global.Object===Object&&global,Pn=typeof self=="object"&&self&&self.Object===Object&&self,Zn=Nn||Pn||Function("return this")(),qn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Vn=qn&&typeof module=="object"&&module&&!module.nodeType&&module,Kn=Vn&&Vn.exports===qn,Gn=Kn&&Nn.process;
|
||||||
|
n:{try{Mn=Gn&&Gn.binding&&Gn.binding("util");break n}catch(n){}Mn=void 0}var Hn=Mn&&Mn.isArrayBuffer,Jn=Mn&&Mn.isDate,Yn=Mn&&Mn.isMap,Qn=Mn&&Mn.isRegExp,Xn=Mn&&Mn.isSet,nt=Mn&&Mn.isTypedArray,tt=j("length"),rt=w({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I",
|
||||||
|
"\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C",
|
||||||
|
"\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i",
|
||||||
|
"\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S",
|
||||||
|
"\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe",
|
||||||
|
"\u0149":"'n","\u017f":"s"}),et=w({"&":"&","<":"<",">":">",'"':""","'":"'"}),ut=w({"&":"&","<":"<",">":">",""":'"',"'":"'"}),it=function w(En){function On(n){if(bu(n)&&!cf(n)&&!(n instanceof Mn)){if(n instanceof zn)return n;if(fi.call(n,"__wrapped__"))return Ne(n)}return new zn(n)}function Sn(){}function zn(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=F}function Mn(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,
|
||||||
|
this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Nn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Pn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function qn(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new Pn;++t<r;)this.add(n[t])}function Vn(n){
|
||||||
|
this.size=(this.__data__=new Nn(n)).size}function Gn(n,t){var r,e=cf(n),u=!e&&ff(n),i=!e&&!u&&lf(n),o=!e&&!u&&!i&&vf(n),u=(e=e||u||i||o)?E(n.length,ti):[],f=u.length;for(r in n)!t&&!fi.call(n,r)||e&&("length"==r||i&&("offset"==r||"parent"==r)||o&&("buffer"==r||"byteLength"==r||"byteOffset"==r)||Se(r,f))||u.push(r);return u}function tt(n){var t=n.length;return t?n[ar(0,t-1)]:F}function ot(n,t){return Me(Tr(n),dt(t,0,n.length))}function ft(n){return Me(Tr(n))}function ct(n,t,r,e){return n===F||su(n,ui[r])&&!fi.call(e,r)?t:n;
|
||||||
|
}function at(n,t,r){(r===F||su(n[t],r))&&(r!==F||t in n)||vt(n,t,r)}function lt(n,t,r){var e=n[t];fi.call(n,t)&&su(e,r)&&(r!==F||t in n)||vt(n,t,r)}function st(n,t){for(var r=n.length;r--;)if(su(n[r][0],t))return r;return-1}function ht(n,t,r,e){return io(n,function(n,u,i){t(e,n,r(n),i)}),e}function pt(n,t){return n&&$r(t,Bu(t),n)}function _t(n,t){return n&&$r(t,Lu(t),n)}function vt(n,t,r){"__proto__"==t&&ki?ki(n,t,{configurable:true,enumerable:true,value:r,writable:true}):n[t]=r}function gt(n,t){for(var r=-1,e=t.length,u=Gu(e),i=null==n;++r<e;)u[r]=i?F:zu(n,t[r]);
|
||||||
|
return u}function dt(n,t,r){return n===n&&(r!==F&&(n=n<=r?n:r),t!==F&&(n=n>=t?n:t)),n}function yt(n,t,r,e,i,o){var f,c=1&t,a=2&t,l=4&t;if(r&&(f=i?r(n,e,i,o):r(n)),f!==F)return f;if(!yu(n))return n;if(e=cf(n)){if(f=Ae(n),!c)return Tr(n,f)}else{var s=go(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(lf(n))return Br(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:ke(n),!c)return a?Nr(n,_t(f,n)):Fr(n,pt(f,n))}else{if(!Dn[s])return i?n:{};f=Ee(n,s,yt,c)}}if(o||(o=new Vn),
|
||||||
|
i=o.get(n))return i;o.set(n,f);var a=l?a?ge:ve:a?Lu:Bu,p=e?F:a(n);return u(p||n,function(e,u){p&&(u=e,e=n[u]),lt(f,u,yt(e,t,r,u,n,o))}),f}function bt(n){var t=Bu(n);return function(r){return xt(r,n,t)}}function xt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Xu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===F&&!(u in n)||!i(o))return false}return true}function jt(n,t,r){if(typeof n!="function")throw new ri("Expected a function");return xo(function(){n.apply(F,r)},t)}function wt(n,t,r,e){var u=-1,i=c,o=true,f=n.length,s=[],h=t.length;
|
||||||
|
if(!f)return s;r&&(t=l(t,S(r))),e?(i=a,o=false):200<=t.length&&(i=R,o=false,t=new qn(t));n:for(;++u<f;){var p=n[u],_=null==r?p:r(p),p=e||0!==p?p:0;if(o&&_===_){for(var v=h;v--;)if(t[v]===_)continue n;s.push(p)}else i(t,_,e)||s.push(p)}return s}function mt(n,t){var r=true;return io(n,function(n,e,u){return r=!!t(n,e,u)}),r}function At(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===F?o===o&&!mu(o):r(o,f)))var f=o,c=i}return c}function kt(n,t){var r=[];return io(n,function(n,e,u){
|
||||||
|
t(n,e,u)&&r.push(n)}),r}function Et(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=Oe),u||(u=[]);++i<o;){var f=n[i];0<t&&r(f)?1<t?Et(f,t-1,r,e,u):s(u,f):e||(u[u.length]=f)}return u}function Ot(n,t){return n&&fo(n,t,Bu)}function St(n,t){return n&&co(n,t,Bu)}function It(n,t){return f(t,function(t){return vu(n[t])})}function Rt(n,t){t=zr(t,n);for(var r=0,e=t.length;null!=n&&r<e;)n=n[Te(t[r++])];return r&&r==e?n:F}function zt(n,t,r){return t=t(n),cf(n)?t:s(t,r(n))}function Wt(n){if(null==n)return n===F?"[object Undefined]":"[object Null]";
|
||||||
|
n=Xu(n);var t;if(Ai&&Ai in n){var r=fi.call(n,Ai),e=n[Ai];try{n[Ai]=F,t=true}catch(n){}var u=li.call(n);t&&(r?n[Ai]=e:delete n[Ai]),t=u}else t=li.call(n);return t}function Bt(n,t){return n>t}function Lt(n,t){return null!=n&&fi.call(n,t)}function Ut(n,t){return null!=n&&t in Xu(n)}function Ct(n,t,r){for(var e=r?a:c,u=n[0].length,i=n.length,o=i,f=Gu(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,S(t))),s=Di(p.length,s),f[o]=!r&&(t||120<=u&&120<=p.length)?new qn(o&&p):F}var p=n[0],_=-1,v=f[0];n:for(;++_<u&&h.length<s;){
|
||||||
|
var g=p[_],d=t?t(g):g,g=r||0!==g?g:0;if(v?!R(v,d):!e(h,d,r)){for(o=i;--o;){var y=f[o];if(y?!R(y,d):!e(n[o],d,r))continue n}v&&v.push(d),h.push(g)}}return h}function Dt(n,t,r){var e={};return Ot(n,function(n,u,i){t(e,r(n),u,i)}),e}function Mt(n,t,e){return t=zr(t,n),n=2>t.length?n:Rt(n,gr(t,0,-1)),t=null==n?n:n[Te(Ke(t))],null==t?F:r(t,n,e)}function Tt(n){return bu(n)&&"[object Arguments]"==Wt(n)}function $t(n){return bu(n)&&"[object ArrayBuffer]"==Wt(n)}function Ft(n){return bu(n)&&"[object Date]"==Wt(n);
|
||||||
|
}function Nt(n,t,r,e,u){if(n===t)t=true;else if(null==n||null==t||!yu(n)&&!bu(t))t=n!==n&&t!==t;else n:{var i=cf(n),o=cf(t),f="[object Array]",c="[object Array]";i||(f=go(n),f="[object Arguments]"==f?"[object Object]":f),o||(c=go(t),c="[object Arguments]"==c?"[object Object]":c);var a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&lf(n)){if(!lf(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Vn),t=i||vf(n)?he(n,t,r,e,Nt,u):pe(n,t,f,r,e,Nt,u);else{if(!(1&r)&&(i=a&&fi.call(n,"__wrapped__"),f=o&&fi.call(t,"__wrapped__"),
|
||||||
|
i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Vn),t=Nt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Vn),i=1&r,f=Bu(n),o=f.length,c=Bu(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:fi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++a<o;){var l=f[a],h=n[l],p=t[l];if(e)var _=i?e(p,h,l,t,n,u):e(h,p,l,n,t,u);if(_===F?h!==p&&!Nt(h,p,r,e,u):!_){c=false;break}s||(s="constructor"==l)}c&&!s&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(c=false)),
|
||||||
|
u.delete(n),u.delete(t),t=c}}else t=false;else t=false}}return t}function Pt(n){return bu(n)&&"[object Map]"==go(n)}function Zt(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=Xu(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return false}for(;++u<i;){var f=r[u],c=f[0],a=n[c],l=f[1];if(o&&f[2]){if(a===F&&!(c in n))return false}else{if(f=new Vn,e)var s=e(a,l,c,n,t,f);if(s===F?!Nt(l,a,3,e,f):!s)return false}}return true}function qt(n){return!(!yu(n)||ai&&ai in n)&&(vu(n)?pi:xn).test($e(n))}function Vt(n){
|
||||||
|
return bu(n)&&"[object RegExp]"==Wt(n)}function Kt(n){return bu(n)&&"[object Set]"==go(n)}function Gt(n){return bu(n)&&du(n.length)&&!!Cn[Wt(n)]}function Ht(n){return typeof n=="function"?n:null==n?Fu:typeof n=="object"?cf(n)?nr(n[0],n[1]):Xt(n):qu(n)}function Jt(n){if(!We(n))return Ui(n);var t,r=[];for(t in Xu(n))fi.call(n,t)&&"constructor"!=t&&r.push(t);return r}function Yt(n,t){return n<t}function Qt(n,t){var r=-1,e=hu(n)?Gu(n.length):[];return io(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function Xt(n){
|
||||||
|
var t=je(n);return 1==t.length&&t[0][2]?Be(t[0][0],t[0][1]):function(r){return r===n||Zt(r,n,t)}}function nr(n,t){return Re(n)&&t===t&&!yu(t)?Be(Te(n),t):function(r){var e=zu(r,n);return e===F&&e===t?Wu(r,n):Nt(t,e,3)}}function tr(n,t,r,e,u){n!==t&&fo(t,function(i,o){if(yu(i)){u||(u=new Vn);var f=u,c=n[o],a=t[o],l=f.get(a);if(l)at(n,o,l);else{var l=e?e(c,a,o+"",n,t,f):F,s=l===F;if(s){var h=cf(a),p=!h&&lf(a),_=!h&&!p&&vf(a),l=a;h||p||_?cf(c)?l=c:pu(c)?l=Tr(c):p?(s=false,l=Br(a,true)):_?(s=false,l=Ur(a,true)):l=[]:ju(a)||ff(a)?(l=c,
|
||||||
|
ff(c)?l=Iu(c):(!yu(c)||r&&vu(c))&&(l=ke(a))):s=false}s&&(f.set(a,l),tr(l,a,r,e,f),f.delete(a)),at(n,o,l)}}else f=e?e(n[o],i,o+"",n,t,u):F,f===F&&(f=i),at(n,o,f)},Lu)}function rr(n,t){var r=n.length;if(r)return t+=0>t?r:0,Se(t,r)?n[t]:F}function er(n,t,r){var e=-1;return t=l(t.length?t:[Fu],S(be())),n=Qt(n,function(n){return{a:l(t,function(t){return t(n)}),b:++e,c:n}}),A(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e<o;){var c=Cr(u[e],i[e]);if(c){e=e>=f?c:c*("desc"==r[e]?-1:1);
|
||||||
|
break n}}e=n.b-t.b}return e})}function ur(n,t){return n=Xu(n),ir(n,t,function(t,r){return Wu(n,r)})}function ir(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],f=Rt(n,o);r(f,o)&&_r(i,zr(o,n),f)}return i}function or(n){return function(t){return Rt(t,n)}}function fr(n,t,r,e){var u=e?y:d,i=-1,o=t.length,f=n;for(n===t&&(t=Tr(t)),r&&(f=l(n,S(r)));++i<o;)for(var c=0,a=t[i],a=r?r(a):a;-1<(c=u(f,a,c,e));)f!==n&&ji.call(f,c,1),ji.call(n,c,1);return n}function cr(n,t){for(var r=n?t.length:0,e=r-1;r--;){
|
||||||
|
var u=t[r];if(r==e||u!==i){var i=u;Se(u)?ji.call(n,u,1):Ar(n,u)}}}function ar(n,t){return n+Ri($i()*(t-n+1))}function lr(n,t){var r="";if(!n||1>t||9007199254740991<t)return r;do t%2&&(r+=n),(t=Ri(t/2))&&(n+=n);while(t);return r}function sr(n,t){return jo(Ue(n,t,Fu),n+"")}function hr(n){return tt(Cu(n))}function pr(n,t){var r=Cu(n);return Me(r,dt(t,0,r.length))}function _r(n,t,r,e){if(!yu(n))return n;t=zr(t,n);for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var c=Te(t[u]),a=r;if(u!=o){var l=f[c],a=e?e(l,c,f):F;
|
||||||
|
a===F&&(a=yu(l)?l:Se(t[u+1])?[]:{})}lt(f,c,a),f=f[c]}return n}function vr(n){return Me(Cu(n))}function gr(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Gu(u);++e<u;)r[e]=n[e+t];return r}function dr(n,t){var r;return io(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function yr(n,t,r){var e=0,u=null==n?e:n.length;if(typeof t=="number"&&t===t&&2147483647>=u){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!mu(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return br(n,t,Fu,r);
|
||||||
|
}function br(n,t,r,e){t=r(t);for(var u=0,i=null==n?0:n.length,o=t!==t,f=null===t,c=mu(t),a=t===F;u<i;){var l=Ri((u+i)/2),s=r(n[l]),h=s!==F,p=null===s,_=s===s,v=mu(s);(o?e||_:a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):p||v?0:e?s<=t:s<t)?u=l+1:i=l}return Di(i,4294967294)}function xr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r],f=t?t(o):o;if(!r||!su(f,c)){var c=f;i[u++]=0===o?0:o}}return i}function jr(n){return typeof n=="number"?n:mu(n)?P:+n}function wr(n){if(typeof n=="string")return n;
|
||||||
|
if(cf(n))return l(n,wr)+"";if(mu(n))return eo?eo.call(n):"";var t=n+"";return"0"==t&&1/n==-N?"-0":t}function mr(n,t,r){var e=-1,u=c,i=n.length,o=true,f=[],l=f;if(r)o=false,u=a;else if(200<=i){if(u=t?null:ho(n))return D(u);o=false,u=R,l=new qn}else l=t?[]:f;n:for(;++e<i;){var s=n[e],h=t?t(s):s,s=r||0!==s?s:0;if(o&&h===h){for(var p=l.length;p--;)if(l[p]===h)continue n;t&&l.push(h),f.push(s)}else u(l,h,r)||(l!==f&&l.push(h),f.push(s))}return f}function Ar(n,t){return t=zr(t,n),n=2>t.length?n:Rt(n,gr(t,0,-1)),
|
||||||
|
null==n||delete n[Te(Ke(t))]}function kr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?gr(n,e?0:i,e?i+1:u):gr(n,e?i+1:0,e?u:i)}function Er(n,t){var r=n;return r instanceof Mn&&(r=r.value()),h(t,function(n,t){return t.func.apply(t.thisArg,s([n],t.args))},r)}function Or(n,t,r){var e=n.length;if(2>e)return e?mr(n[0]):[];for(var u=-1,i=Gu(e);++u<e;)for(var o=n[u],f=-1;++f<e;)f!=u&&(i[u]=wt(i[u]||o,n[f],t,r));return mr(Et(i,1),t,r)}function Sr(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;)r(o,n[e],e<i?t[e]:F);
|
||||||
|
return o}function Ir(n){return pu(n)?n:[]}function Rr(n){return typeof n=="function"?n:Fu}function zr(n,t){return cf(n)?n:Re(n,t)?[n]:wo(Ru(n))}function Wr(n,t,r){var e=n.length;return r=r===F?e:r,!t&&r>=e?n:gr(n,t,r)}function Br(n,t){if(t)return n.slice();var r=n.length,r=di?di(r):new n.constructor(r);return n.copy(r),r}function Lr(n){var t=new n.constructor(n.byteLength);return new gi(t).set(new gi(n)),t}function Ur(n,t){return new n.constructor(t?Lr(n.buffer):n.buffer,n.byteOffset,n.length)}function Cr(n,t){
|
||||||
|
if(n!==t){var r=n!==F,e=null===n,u=n===n,i=mu(n),o=t!==F,f=null===t,c=t===t,a=mu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&n<t||a&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!c)return-1}return 0}function Dr(n,t,r,e){var u=-1,i=n.length,o=r.length,f=-1,c=t.length,a=Ci(i-o,0),l=Gu(c+a);for(e=!e;++f<c;)l[f]=t[f];for(;++u<o;)(e||u<i)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];return l}function Mr(n,t,r,e){var u=-1,i=n.length,o=-1,f=r.length,c=-1,a=t.length,l=Ci(i-f,0),s=Gu(l+a);
|
||||||
|
for(e=!e;++u<l;)s[u]=n[u];for(l=u;++c<a;)s[l+c]=t[c];for(;++o<f;)(e||u<i)&&(s[l+r[o]]=n[u++]);return s}function Tr(n,t){var r=-1,e=n.length;for(t||(t=Gu(e));++r<e;)t[r]=n[r];return t}function $r(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var f=t[i],c=e?e(r[f],n[f],f,r,n):F;c===F&&(c=n[f]),u?vt(r,f,c):lt(r,f,c)}return r}function Fr(n,t){return $r(n,_o(n),t)}function Nr(n,t){return $r(n,vo(n),t)}function Pr(n,t){return function(r,u){var i=cf(r)?e:ht,o=t?t():{};return i(r,n,be(u,2),o);
|
||||||
|
}}function Zr(n){return sr(function(t,r){var e=-1,u=r.length,i=1<u?r[u-1]:F,o=2<u?r[2]:F,i=3<n.length&&typeof i=="function"?(u--,i):F;for(o&&Ie(r[0],r[1],o)&&(i=3>u?F:i,u=1),t=Xu(t);++e<u;)(o=r[e])&&n(t,o,e,i);return t})}function qr(n,t){return function(r,e){if(null==r)return r;if(!hu(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=Xu(r);(t?i--:++i<u)&&false!==e(o[i],i,o););return r}}function Vr(n){return function(t,r,e){var u=-1,i=Xu(t);e=e(t);for(var o=e.length;o--;){var f=e[n?o:++u];if(false===r(i[f],f,i))break;
|
||||||
|
}return t}}function Kr(n,t,r){function e(){return(this&&this!==Zn&&this instanceof e?i:n).apply(u?r:this,arguments)}var u=1&t,i=Jr(n);return e}function Gr(n){return function(t){t=Ru(t);var r=Bn.test(t)?$(t):F,e=r?r[0]:t.charAt(0);return t=r?Wr(r,1).join(""):t.slice(1),e[n]()+t}}function Hr(n){return function(t){return h(Tu(Mu(t).replace(In,"")),n,"")}}function Jr(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:
|
||||||
|
return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=uo(n.prototype),t=n.apply(r,t);return yu(t)?t:r}}function Yr(n,t,e){function u(){for(var o=arguments.length,f=Gu(o),c=o,a=ye(u);c--;)f[c]=arguments[c];return c=3>o&&f[0]!==a&&f[o-1]!==a?[]:C(f,a),o-=c.length,o<e?ce(n,t,ne,u.placeholder,F,f,c,F,F,e-o):r(this&&this!==Zn&&this instanceof u?i:n,this,f);
|
||||||
|
}var i=Jr(n);return u}function Qr(n){return function(t,r,e){var u=Xu(t);if(!hu(t)){var i=be(r,3);t=Bu(t),r=function(n){return i(u[n],n,u)}}return r=n(t,r,e),-1<r?u[i?t[r]:r]:F}}function Xr(n){return _e(function(t){var r=t.length,e=r,u=zn.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if(typeof i!="function")throw new ri("Expected a function");if(u&&!o&&"wrapper"==de(i))var o=new zn([],true)}for(e=o?e:r;++e<r;)var i=t[e],u=de(i),f="wrapper"==u?po(i):F,o=f&&ze(f[0])&&424==f[1]&&!f[4].length&&1==f[9]?o[de(f[0])].apply(o,f[3]):1==i.length&&ze(i)?o[u]():o.thru(i);
|
||||||
|
return function(){var n=arguments,e=n[0];if(o&&1==n.length&&cf(e)&&200<=e.length)return o.plant(e).value();for(var u=0,n=r?t[u].apply(this,n):e;++u<r;)n=t[u].call(this,n);return n}})}function ne(n,t,r,e,u,i,o,f,c,a){function l(){for(var d=arguments.length,y=Gu(d),b=d;b--;)y[b]=arguments[b];if(_){var x,j=ye(l),b=y.length;for(x=0;b--;)y[b]===j&&++x}if(e&&(y=Dr(y,e,u,_)),i&&(y=Mr(y,i,o,_)),d-=x,_&&d<a)return j=C(y,j),ce(n,t,ne,l.placeholder,r,y,j,f,c,a-d);if(j=h?r:this,b=p?j[n]:n,d=y.length,f){x=y.length;
|
||||||
|
for(var w=Di(f.length,x),m=Tr(y);w--;){var A=f[w];y[w]=Se(A,x)?m[A]:F}}else v&&1<d&&y.reverse();return s&&c<d&&(y.length=c),this&&this!==Zn&&this instanceof l&&(b=g||Jr(b)),b.apply(j,y)}var s=128&t,h=1&t,p=2&t,_=24&t,v=512&t,g=p?F:Jr(n);return l}function te(n,t){return function(r,e){return Dt(r,n,t(e))}}function re(n,t){return function(r,e){var u;if(r===F&&e===F)return t;if(r!==F&&(u=r),e!==F){if(u===F)return e;typeof r=="string"||typeof e=="string"?(r=wr(r),e=wr(e)):(r=jr(r),e=jr(e)),u=n(r,e)}return u;
|
||||||
|
}}function ee(n){return _e(function(t){return t=l(t,S(be())),sr(function(e){var u=this;return n(t,function(n){return r(n,u,e)})})})}function ue(n,t){t=t===F?" ":wr(t);var r=t.length;return 2>r?r?lr(t,n):t:(r=lr(t,Ii(n/T(t))),Bn.test(t)?Wr($(r),0,n).join(""):r.slice(0,n))}function ie(n,t,e,u){function i(){for(var t=-1,c=arguments.length,a=-1,l=u.length,s=Gu(l+c),h=this&&this!==Zn&&this instanceof i?f:n;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++t];return r(h,o?e:this,s)}var o=1&t,f=Jr(n);return i;
|
||||||
|
}function oe(n){return function(t,r,e){e&&typeof e!="number"&&Ie(t,r,e)&&(r=e=F),t=ku(t),r===F?(r=t,t=0):r=ku(r),e=e===F?t<r?1:-1:ku(e);var u=-1;r=Ci(Ii((r-t)/(e||1)),0);for(var i=Gu(r);r--;)i[n?r:++u]=t,t+=e;return i}}function fe(n){return function(t,r){return typeof t=="string"&&typeof r=="string"||(t=Su(t),r=Su(r)),n(t,r)}}function ce(n,t,r,e,u,i,o,f,c,a){var l=8&t,s=l?o:F;o=l?F:o;var h=l?i:F;return i=l?F:i,t=(t|(l?32:64))&~(l?64:32),4&t||(t&=-4),u=[n,t,u,h,s,i,o,f,c,a],r=r.apply(F,u),ze(n)&&bo(r,u),
|
||||||
|
r.placeholder=e,Ce(r,n,t)}function ae(n){var t=Qu[n];return function(n,r){if(n=Su(n),r=Di(Eu(r),292)){var e=(Ru(n)+"e").split("e"),e=t(e[0]+"e"+(+e[1]+r)),e=(Ru(e)+"e").split("e");return+(e[0]+"e"+(+e[1]-r))}return t(n)}}function le(n){return function(t){var r=go(t);return"[object Map]"==r?L(t):"[object Set]"==r?M(t):O(t,n(t))}}function se(n,t,r,e,u,i,o,f){var c=2&t;if(!c&&typeof n!="function")throw new ri("Expected a function");var a=e?e.length:0;if(a||(t&=-97,e=u=F),o=o===F?o:Ci(Eu(o),0),f=f===F?f:Eu(f),
|
||||||
|
a-=u?u.length:0,64&t){var l=e,s=u;e=u=F}var h=c?F:po(n);return i=[n,t,r,e,u,l,s,i,o,f],h&&(r=i[1],n=h[1],t=r|n,e=128==n&&8==r||128==n&&256==r&&i[7].length<=h[8]||384==n&&h[7].length<=h[8]&&8==r,131>t||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Dr(e,r,h[4]):r,i[4]=e?C(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Mr(e,r,h[6]):r,i[6]=e?C(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Di(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],
|
||||||
|
i[1]=t),n=i[0],t=i[1],r=i[2],e=i[3],u=i[4],f=i[9]=null==i[9]?c?0:n.length:Ci(i[9]-a,0),!f&&24&t&&(t&=-25),Ce((h?ao:bo)(t&&1!=t?8==t||16==t?Yr(n,t,f):32!=t&&33!=t||u.length?ne.apply(F,i):ie(n,t,r,e):Kr(n,t,r),i),n,t)}function he(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t;var c=-1,a=true,l=2&r?new qn:F;for(i.set(n,t),i.set(t,n);++c<f;){var s=n[c],h=t[c];if(e)var p=o?e(h,s,c,t,n,i):e(s,h,c,n,t,i);if(p!==F){if(p)continue;a=false;break}if(l){
|
||||||
|
if(!_(t,function(n,t){if(!R(l,t)&&(s===n||u(s,n,r,e,i)))return l.push(t)})){a=false;break}}else if(s!==h&&!u(s,h,r,e,i)){a=false;break}}return i.delete(n),i.delete(t),a}function pe(n,t,r,e,u,i,o){switch(r){case"[object DataView]":if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)break;n=n.buffer,t=t.buffer;case"[object ArrayBuffer]":if(n.byteLength!=t.byteLength||!i(new gi(n),new gi(t)))break;return true;case"[object Boolean]":case"[object Date]":case"[object Number]":return su(+n,+t);case"[object Error]":
|
||||||
|
return n.name==t.name&&n.message==t.message;case"[object RegExp]":case"[object String]":return n==t+"";case"[object Map]":var f=L;case"[object Set]":if(f||(f=D),n.size!=t.size&&!(1&e))break;return(r=o.get(n))?r==t:(e|=2,o.set(n,t),t=he(f(n),f(t),e,u,i,o),o.delete(n),t);case"[object Symbol]":if(ro)return ro.call(n)==ro.call(t)}return false}function _e(n){return jo(Ue(n,F,qe),n+"")}function ve(n){return zt(n,Bu,_o)}function ge(n){return zt(n,Lu,vo)}function de(n){for(var t=n.name+"",r=Hi[t],e=fi.call(Hi,t)?r.length:0;e--;){
|
||||||
|
var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function ye(n){return(fi.call(On,"placeholder")?On:n).placeholder}function be(){var n=On.iteratee||Nu,n=n===Nu?Ht:n;return arguments.length?n(arguments[0],arguments[1]):n}function xe(n,t){var r=n.__data__,e=typeof t;return("string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t)?r[typeof t=="string"?"string":"hash"]:r.map}function je(n){for(var t=Bu(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,u===u&&!yu(u)]}return t;
|
||||||
|
}function we(n,t){var r=null==n?F:n[t];return qt(r)?r:F}function me(n,t,r){t=zr(t,n);for(var e=-1,u=t.length,i=false;++e<u;){var o=Te(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:(u=null==n?0:n.length,!!u&&du(u)&&Se(o,u)&&(cf(n)||ff(n)))}function Ae(n){var t=n.length,r=n.constructor(t);return t&&"string"==typeof n[0]&&fi.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function ke(n){return typeof n.constructor!="function"||We(n)?{}:uo(yi(n))}function Ee(r,e,u,i){var o=r.constructor;
|
||||||
|
switch(e){case"[object ArrayBuffer]":return Lr(r);case"[object Boolean]":case"[object Date]":return new o(+r);case"[object DataView]":return e=i?Lr(r.buffer):r.buffer,new r.constructor(e,r.byteOffset,r.byteLength);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Ur(r,i);case"[object Map]":return e=i?u(L(r),1):L(r),
|
||||||
|
h(e,n,new r.constructor);case"[object Number]":case"[object String]":return new o(r);case"[object RegExp]":return e=new r.constructor(r.source,dn.exec(r)),e.lastIndex=r.lastIndex,e;case"[object Set]":return e=i?u(D(r),1):D(r),h(e,t,new r.constructor);case"[object Symbol]":return ro?Xu(ro.call(r)):{}}}function Oe(n){return cf(n)||ff(n)||!!(wi&&n&&n[wi])}function Se(n,t){return t=null==t?9007199254740991:t,!!t&&(typeof n=="number"||wn.test(n))&&-1<n&&0==n%1&&n<t}function Ie(n,t,r){if(!yu(r))return false;
|
||||||
|
var e=typeof t;return!!("number"==e?hu(r)&&Se(t,r.length):"string"==e&&t in r)&&su(r[t],n)}function Re(n,t){if(cf(n))return false;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!mu(n))||(rn.test(n)||!tn.test(n)||null!=t&&n in Xu(t))}function ze(n){var t=de(n),r=On[t];return typeof r=="function"&&t in Mn.prototype&&(n===r||(t=po(r),!!t&&n===t[0]))}function We(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||ui)}function Be(n,t){return function(r){return null!=r&&(r[n]===t&&(t!==F||n in Xu(r)));
|
||||||
|
}}function Le(n,t,r,e,u,i){return yu(n)&&yu(t)&&(i.set(t,n),tr(n,t,F,Le,i),i.delete(t)),n}function Ue(n,t,e){return t=Ci(t===F?n.length-1:t,0),function(){for(var u=arguments,i=-1,o=Ci(u.length-t,0),f=Gu(o);++i<o;)f[i]=u[t+i];for(i=-1,o=Gu(t+1);++i<t;)o[i]=u[i];return o[t]=e(f),r(n,this,o)}}function Ce(n,t,r){var e=t+"";t=jo;var u,i=Fe;return u=(u=e.match(hn))?u[1].split(pn):[],r=i(u,r),(i=r.length)&&(u=i-1,r[u]=(1<i?"& ":"")+r[u],r=r.join(2<i?", ":" "),e=e.replace(sn,"{\n/* [wrapped with "+r+"] */\n")),
|
||||||
|
t(n,e)}function De(n){var t=0,r=0;return function(){var e=Mi(),u=16-(e-r);if(r=e,0<u){if(800<=++t)return arguments[0]}else t=0;return n.apply(F,arguments)}}function Me(n,t){var r=-1,e=n.length,u=e-1;for(t=t===F?e:t;++r<t;){var e=ar(r,u),i=n[e];n[e]=n[r],n[r]=i}return n.length=t,n}function Te(n){if(typeof n=="string"||mu(n))return n;var t=n+"";return"0"==t&&1/n==-N?"-0":t}function $e(n){if(null!=n){try{return oi.call(n)}catch(n){}return n+""}return""}function Fe(n,t){return u(Z,function(r){var e="_."+r[0];
|
||||||
|
t&r[1]&&!c(n,e)&&n.push(e)}),n.sort()}function Ne(n){if(n instanceof Mn)return n.clone();var t=new zn(n.__wrapped__,n.__chain__);return t.__actions__=Tr(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function Pe(n,t,r){var e=null==n?0:n.length;return e?(r=null==r?0:Eu(r),0>r&&(r=Ci(e+r,0)),g(n,be(t,3),r)):-1}function Ze(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==F&&(u=Eu(r),u=0>r?Ci(e+u,0):Di(u,e-1)),g(n,be(t,3),u,true)}function qe(n){return(null==n?0:n.length)?Et(n,1):[];
|
||||||
|
}function Ve(n){return n&&n.length?n[0]:F}function Ke(n){var t=null==n?0:n.length;return t?n[t-1]:F}function Ge(n,t){return n&&n.length&&t&&t.length?fr(n,t):n}function He(n){return null==n?n:Fi.call(n)}function Je(n){if(!n||!n.length)return[];var t=0;return n=f(n,function(n){if(pu(n))return t=Ci(n.length,t),true}),E(t,function(t){return l(n,j(t))})}function Ye(n,t){if(!n||!n.length)return[];var e=Je(n);return null==t?e:l(e,function(n){return r(t,F,n)})}function Qe(n){return n=On(n),n.__chain__=true,n;
|
||||||
|
}function Xe(n,t){return t(n)}function nu(){return this}function tu(n,t){return(cf(n)?u:io)(n,be(t,3))}function ru(n,t){return(cf(n)?i:oo)(n,be(t,3))}function eu(n,t){return(cf(n)?l:Qt)(n,be(t,3))}function uu(n,t,r){return t=r?F:t,t=n&&null==t?n.length:t,se(n,128,F,F,F,F,t)}function iu(n,t){var r;if(typeof t!="function")throw new ri("Expected a function");return n=Eu(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=F),r}}function ou(n,t,r){return t=r?F:t,n=se(n,8,F,F,F,F,F,t),n.placeholder=ou.placeholder,
|
||||||
|
n}function fu(n,t,r){return t=r?F:t,n=se(n,16,F,F,F,F,F,t),n.placeholder=fu.placeholder,n}function cu(n,t,r){function e(t){var r=c,e=a;return c=a=F,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===F||r>=t||0>r||g&&n>=l}function i(){var n=Ho();if(u(n))return o(n);var r,e=xo;r=n-_,n=t-(n-p),r=g?Di(n,l-r):n,h=e(i,r)}function o(n){return h=F,d&&c?e(n):(c=a=F,s)}function f(){var n=Ho(),r=u(n);if(c=arguments,a=this,p=n,r){if(h===F)return _=n=p,h=xo(i,t),v?e(n):s;if(g)return h=xo(i,t),e(p)}return h===F&&(h=xo(i,t)),
|
||||||
|
s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ri("Expected a function");return t=Su(t)||0,yu(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Ci(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==F&&so(h),_=0,c=p=a=h=F},f.flush=function(){return h===F?s:o(Ho())},f}function au(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e),r.cache=i.set(u,e)||i,e)}if(typeof n!="function"||null!=t&&typeof t!="function")throw new ri("Expected a function");
|
||||||
|
return r.cache=new(au.Cache||Pn),r}function lu(n){if(typeof n!="function")throw new ri("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function su(n,t){return n===t||n!==n&&t!==t}function hu(n){return null!=n&&du(n.length)&&!vu(n)}function pu(n){return bu(n)&&hu(n)}function _u(n){if(!bu(n))return false;var t=Wt(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!ju(n);
|
||||||
|
}function vu(n){return!!yu(n)&&(n=Wt(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function gu(n){return typeof n=="number"&&n==Eu(n)}function du(n){return typeof n=="number"&&-1<n&&0==n%1&&9007199254740991>=n}function yu(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function bu(n){return null!=n&&typeof n=="object"}function xu(n){return typeof n=="number"||bu(n)&&"[object Number]"==Wt(n)}function ju(n){return!(!bu(n)||"[object Object]"!=Wt(n))&&(n=yi(n),
|
||||||
|
null===n||(n=fi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&oi.call(n)==si))}function wu(n){return typeof n=="string"||!cf(n)&&bu(n)&&"[object String]"==Wt(n)}function mu(n){return typeof n=="symbol"||bu(n)&&"[object Symbol]"==Wt(n)}function Au(n){if(!n)return[];if(hu(n))return wu(n)?$(n):Tr(n);if(mi&&n[mi]){n=n[mi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return t=go(n),("[object Map]"==t?L:"[object Set]"==t?D:Cu)(n)}function ku(n){return n?(n=Su(n),
|
||||||
|
n===N||n===-N?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function Eu(n){n=ku(n);var t=n%1;return n===n?t?n-t:n:0}function Ou(n){return n?dt(Eu(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(mu(n))return P;if(yu(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=yu(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(cn,"");var t=bn.test(n);return t||jn.test(n)?Fn(n.slice(2),t?2:8):yn.test(n)?P:+n}function Iu(n){return $r(n,Lu(n))}function Ru(n){return null==n?"":wr(n);
|
||||||
|
}function zu(n,t,r){return n=null==n?F:Rt(n,t),n===F?r:n}function Wu(n,t){return null!=n&&me(n,t,Ut)}function Bu(n){return hu(n)?Gn(n):Jt(n)}function Lu(n){if(hu(n))n=Gn(n,true);else if(yu(n)){var t,r=We(n),e=[];for(t in n)("constructor"!=t||!r&&fi.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in Xu(n))t.push(r);n=t}return n}function Uu(n,t){if(null==n)return{};var r=l(ge(n),function(n){return[n]});return t=be(t),ir(n,r,function(n,r){return t(n,r[0])})}function Cu(n){return null==n?[]:I(n,Bu(n));
|
||||||
|
}function Du(n){return Ff(Ru(n).toLowerCase())}function Mu(n){return(n=Ru(n))&&n.replace(mn,rt).replace(Rn,"")}function Tu(n,t,r){return n=Ru(n),t=r?F:t,t===F?Ln.test(n)?n.match(Wn)||[]:n.match(_n)||[]:n.match(t)||[]}function $u(n){return function(){return n}}function Fu(n){return n}function Nu(n){return Ht(typeof n=="function"?n:yt(n,1))}function Pu(n,t,r){var e=Bu(t),i=It(t,e);null!=r||yu(t)&&(i.length||!e.length)||(r=t,t=n,n=this,i=It(t,Bu(t)));var o=!(yu(r)&&"chain"in r&&!r.chain),f=vu(n);return u(i,function(r){
|
||||||
|
var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Tr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function Zu(){}function qu(n){return Re(n)?j(Te(n)):or(n)}function Vu(){return[]}function Ku(){return false}En=null==En?Zn:it.defaults(Zn.Object(),En,it.pick(Zn,Un));var Gu=En.Array,Hu=En.Date,Ju=En.Error,Yu=En.Function,Qu=En.Math,Xu=En.Object,ni=En.RegExp,ti=En.String,ri=En.TypeError,ei=Gu.prototype,ui=Xu.prototype,ii=En["__core-js_shared__"],oi=Yu.prototype.toString,fi=ui.hasOwnProperty,ci=0,ai=function(){
|
||||||
|
var n=/[^.]+$/.exec(ii&&ii.keys&&ii.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),li=ui.toString,si=oi.call(Xu),hi=Zn._,pi=ni("^"+oi.call(fi).replace(on,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),_i=Kn?En.Buffer:F,vi=En.Symbol,gi=En.Uint8Array,di=_i?_i.f:F,yi=U(Xu.getPrototypeOf,Xu),bi=Xu.create,xi=ui.propertyIsEnumerable,ji=ei.splice,wi=vi?vi.isConcatSpreadable:F,mi=vi?vi.iterator:F,Ai=vi?vi.toStringTag:F,ki=function(){try{var n=we(Xu,"defineProperty");
|
||||||
|
return n({},"",{}),n}catch(n){}}(),Ei=En.clearTimeout!==Zn.clearTimeout&&En.clearTimeout,Oi=Hu&&Hu.now!==Zn.Date.now&&Hu.now,Si=En.setTimeout!==Zn.setTimeout&&En.setTimeout,Ii=Qu.ceil,Ri=Qu.floor,zi=Xu.getOwnPropertySymbols,Wi=_i?_i.isBuffer:F,Bi=En.isFinite,Li=ei.join,Ui=U(Xu.keys,Xu),Ci=Qu.max,Di=Qu.min,Mi=Hu.now,Ti=En.parseInt,$i=Qu.random,Fi=ei.reverse,Ni=we(En,"DataView"),Pi=we(En,"Map"),Zi=we(En,"Promise"),qi=we(En,"Set"),Vi=we(En,"WeakMap"),Ki=we(Xu,"create"),Gi=Vi&&new Vi,Hi={},Ji=$e(Ni),Yi=$e(Pi),Qi=$e(Zi),Xi=$e(qi),no=$e(Vi),to=vi?vi.prototype:F,ro=to?to.valueOf:F,eo=to?to.toString:F,uo=function(){
|
||||||
|
function n(){}return function(t){return yu(t)?bi?bi(t):(n.prototype=t,t=new n,n.prototype=F,t):{}}}();On.templateSettings={escape:Q,evaluate:X,interpolate:nn,variable:"",imports:{_:On}},On.prototype=Sn.prototype,On.prototype.constructor=On,zn.prototype=uo(Sn.prototype),zn.prototype.constructor=zn,Mn.prototype=uo(Sn.prototype),Mn.prototype.constructor=Mn,Tn.prototype.clear=function(){this.__data__=Ki?Ki(null):{},this.size=0},Tn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n],
|
||||||
|
this.size-=n?1:0,n},Tn.prototype.get=function(n){var t=this.__data__;return Ki?(n=t[n],"__lodash_hash_undefined__"===n?F:n):fi.call(t,n)?t[n]:F},Tn.prototype.has=function(n){var t=this.__data__;return Ki?t[n]!==F:fi.call(t,n)},Tn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Ki&&t===F?"__lodash_hash_undefined__":t,this},Nn.prototype.clear=function(){this.__data__=[],this.size=0},Nn.prototype.delete=function(n){var t=this.__data__;return n=st(t,n),!(0>n)&&(n==t.length-1?t.pop():ji.call(t,n,1),
|
||||||
|
--this.size,true)},Nn.prototype.get=function(n){var t=this.__data__;return n=st(t,n),0>n?F:t[n][1]},Nn.prototype.has=function(n){return-1<st(this.__data__,n)},Nn.prototype.set=function(n,t){var r=this.__data__,e=st(r,n);return 0>e?(++this.size,r.push([n,t])):r[e][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Tn,map:new(Pi||Nn),string:new Tn}},Pn.prototype.delete=function(n){return n=xe(this,n).delete(n),this.size-=n?1:0,n},Pn.prototype.get=function(n){return xe(this,n).get(n);
|
||||||
|
},Pn.prototype.has=function(n){return xe(this,n).has(n)},Pn.prototype.set=function(n,t){var r=xe(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},qn.prototype.add=qn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},qn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.clear=function(){this.__data__=new Nn,this.size=0},Vn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Vn.prototype.get=function(n){
|
||||||
|
return this.__data__.get(n)},Vn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Nn){var e=r.__data__;if(!Pi||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Pn(e)}return r.set(n,t),this.size=r.size,this};var io=qr(Ot),oo=qr(St,true),fo=Vr(),co=Vr(true),ao=Gi?function(n,t){return Gi.set(n,t),n}:Fu,lo=ki?function(n,t){return ki(n,"toString",{configurable:true,enumerable:false,value:$u(t),writable:true})}:Fu,so=Ei||function(n){
|
||||||
|
return Zn.clearTimeout(n)},ho=qi&&1/D(new qi([,-0]))[1]==N?function(n){return new qi(n)}:Zu,po=Gi?function(n){return Gi.get(n)}:Zu,_o=zi?U(zi,Xu):Vu,vo=zi?function(n){for(var t=[];n;)s(t,_o(n)),n=yi(n);return t}:Vu,go=Wt;(Ni&&"[object DataView]"!=go(new Ni(new ArrayBuffer(1)))||Pi&&"[object Map]"!=go(new Pi)||Zi&&"[object Promise]"!=go(Zi.resolve())||qi&&"[object Set]"!=go(new qi)||Vi&&"[object WeakMap]"!=go(new Vi))&&(go=function(n){var t=Wt(n);if(n=(n="[object Object]"==t?n.constructor:F)?$e(n):"")switch(n){
|
||||||
|
case Ji:return"[object DataView]";case Yi:return"[object Map]";case Qi:return"[object Promise]";case Xi:return"[object Set]";case no:return"[object WeakMap]"}return t});var yo=ii?vu:Ku,bo=De(ao),xo=Si||function(n,t){return Zn.setTimeout(n,t)},jo=De(lo),wo=function(n){n=au(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return en.test(n)&&t.push(""),n.replace(un,function(n,r,e,u){t.push(e?u.replace(vn,"$1"):r||n)}),t}),mo=sr(function(n,t){return pu(n)?wt(n,Et(t,1,pu,true)):[];
|
||||||
|
}),Ao=sr(function(n,t){var r=Ke(t);return pu(r)&&(r=F),pu(n)?wt(n,Et(t,1,pu,true),be(r,2)):[]}),ko=sr(function(n,t){var r=Ke(t);return pu(r)&&(r=F),pu(n)?wt(n,Et(t,1,pu,true),F,r):[]}),Eo=sr(function(n){var t=l(n,Ir);return t.length&&t[0]===n[0]?Ct(t):[]}),Oo=sr(function(n){var t=Ke(n),r=l(n,Ir);return t===Ke(r)?t=F:r.pop(),r.length&&r[0]===n[0]?Ct(r,be(t,2)):[]}),So=sr(function(n){var t=Ke(n),r=l(n,Ir);return(t=typeof t=="function"?t:F)&&r.pop(),r.length&&r[0]===n[0]?Ct(r,F,t):[]}),Io=sr(Ge),Ro=_e(function(n,t){
|
||||||
|
var r=null==n?0:n.length,e=gt(n,t);return cr(n,l(t,function(n){return Se(n,r)?+n:n}).sort(Cr)),e}),zo=sr(function(n){return mr(Et(n,1,pu,true))}),Wo=sr(function(n){var t=Ke(n);return pu(t)&&(t=F),mr(Et(n,1,pu,true),be(t,2))}),Bo=sr(function(n){var t=Ke(n),t=typeof t=="function"?t:F;return mr(Et(n,1,pu,true),F,t)}),Lo=sr(function(n,t){return pu(n)?wt(n,t):[]}),Uo=sr(function(n){return Or(f(n,pu))}),Co=sr(function(n){var t=Ke(n);return pu(t)&&(t=F),Or(f(n,pu),be(t,2))}),Do=sr(function(n){var t=Ke(n),t=typeof t=="function"?t:F;
|
||||||
|
return Or(f(n,pu),F,t)}),Mo=sr(Je),To=sr(function(n){var t=n.length,t=1<t?n[t-1]:F,t=typeof t=="function"?(n.pop(),t):F;return Ye(n,t)}),$o=_e(function(n){function t(t){return gt(t,n)}var r=n.length,e=r?n[0]:0,u=this.__wrapped__;return!(1<r||this.__actions__.length)&&u instanceof Mn&&Se(e)?(u=u.slice(e,+e+(r?1:0)),u.__actions__.push({func:Xe,args:[t],thisArg:F}),new zn(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push(F),n})):this.thru(t)}),Fo=Pr(function(n,t,r){fi.call(n,r)?++n[r]:vt(n,r,1);
|
||||||
|
}),No=Qr(Pe),Po=Qr(Ze),Zo=Pr(function(n,t,r){fi.call(n,r)?n[r].push(t):vt(n,r,[t])}),qo=sr(function(n,t,e){var u=-1,i=typeof t=="function",o=hu(n)?Gu(n.length):[];return io(n,function(n){o[++u]=i?r(t,n,e):Mt(n,t,e)}),o}),Vo=Pr(function(n,t,r){vt(n,r,t)}),Ko=Pr(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),Go=sr(function(n,t){if(null==n)return[];var r=t.length;return 1<r&&Ie(n,t[0],t[1])?t=[]:2<r&&Ie(t[0],t[1],t[2])&&(t=[t[0]]),er(n,Et(t,1),[])}),Ho=Oi||function(){return Zn.Date.now();
|
||||||
|
},Jo=sr(function(n,t,r){var e=1;if(r.length)var u=C(r,ye(Jo)),e=32|e;return se(n,e,t,r,u)}),Yo=sr(function(n,t,r){var e=3;if(r.length)var u=C(r,ye(Yo)),e=32|e;return se(t,e,n,r,u)}),Qo=sr(function(n,t){return jt(n,1,t)}),Xo=sr(function(n,t,r){return jt(n,Su(t)||0,r)});au.Cache=Pn;var nf=sr(function(n,t){t=1==t.length&&cf(t[0])?l(t[0],S(be())):l(Et(t,1),S(be()));var e=t.length;return sr(function(u){for(var i=-1,o=Di(u.length,e);++i<o;)u[i]=t[i].call(this,u[i]);return r(n,this,u)})}),tf=sr(function(n,t){
|
||||||
|
return se(n,32,F,t,C(t,ye(tf)))}),rf=sr(function(n,t){return se(n,64,F,t,C(t,ye(rf)))}),ef=_e(function(n,t){return se(n,256,F,F,F,t)}),uf=fe(Bt),of=fe(function(n,t){return n>=t}),ff=Tt(function(){return arguments}())?Tt:function(n){return bu(n)&&fi.call(n,"callee")&&!xi.call(n,"callee")},cf=Gu.isArray,af=Hn?S(Hn):$t,lf=Wi||Ku,sf=Jn?S(Jn):Ft,hf=Yn?S(Yn):Pt,pf=Qn?S(Qn):Vt,_f=Xn?S(Xn):Kt,vf=nt?S(nt):Gt,gf=fe(Yt),df=fe(function(n,t){return n<=t}),yf=Zr(function(n,t){if(We(t)||hu(t))$r(t,Bu(t),n);else for(var r in t)fi.call(t,r)&<(n,r,t[r]);
|
||||||
|
}),bf=Zr(function(n,t){$r(t,Lu(t),n)}),xf=Zr(function(n,t,r,e){$r(t,Lu(t),n,e)}),jf=Zr(function(n,t,r,e){$r(t,Bu(t),n,e)}),wf=_e(gt),mf=sr(function(n){return n.push(F,ct),r(xf,F,n)}),Af=sr(function(n){return n.push(F,Le),r(If,F,n)}),kf=te(function(n,t,r){n[t]=r},$u(Fu)),Ef=te(function(n,t,r){fi.call(n,t)?n[t].push(r):n[t]=[r]},be),Of=sr(Mt),Sf=Zr(function(n,t,r){tr(n,t,r)}),If=Zr(function(n,t,r,e){tr(n,t,r,e)}),Rf=_e(function(n,t){var r={};if(null==n)return r;var e=false;t=l(t,function(t){return t=zr(t,n),
|
||||||
|
e||(e=1<t.length),t}),$r(n,ge(n),r),e&&(r=yt(r,7));for(var u=t.length;u--;)Ar(r,t[u]);return r}),zf=_e(function(n,t){return null==n?{}:ur(n,t)}),Wf=le(Bu),Bf=le(Lu),Lf=Hr(function(n,t,r){return t=t.toLowerCase(),n+(r?Du(t):t)}),Uf=Hr(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Cf=Hr(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Df=Gr("toLowerCase"),Mf=Hr(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),Tf=Hr(function(n,t,r){return n+(r?" ":"")+Ff(t)}),$f=Hr(function(n,t,r){
|
||||||
|
return n+(r?" ":"")+t.toUpperCase()}),Ff=Gr("toUpperCase"),Nf=sr(function(n,t){try{return r(n,F,t)}catch(n){return _u(n)?n:new Ju(n)}}),Pf=_e(function(n,t){return u(t,function(t){t=Te(t),vt(n,t,Jo(n[t],n))}),n}),Zf=Xr(),qf=Xr(true),Vf=sr(function(n,t){return function(r){return Mt(r,n,t)}}),Kf=sr(function(n,t){return function(r){return Mt(n,r,t)}}),Gf=ee(l),Hf=ee(o),Jf=ee(_),Yf=oe(),Qf=oe(true),Xf=re(function(n,t){return n+t},0),nc=ae("ceil"),tc=re(function(n,t){return n/t},1),rc=ae("floor"),ec=re(function(n,t){
|
||||||
|
return n*t},1),uc=ae("round"),ic=re(function(n,t){return n-t},0);return On.after=function(n,t){if(typeof t!="function")throw new ri("Expected a function");return n=Eu(n),function(){if(1>--n)return t.apply(this,arguments)}},On.ary=uu,On.assign=yf,On.assignIn=bf,On.assignInWith=xf,On.assignWith=jf,On.at=wf,On.before=iu,On.bind=Jo,On.bindAll=Pf,On.bindKey=Yo,On.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return cf(n)?n:[n]},On.chain=Qe,On.chunk=function(n,t,r){if(t=(r?Ie(n,t,r):t===F)?1:Ci(Eu(t),0),
|
||||||
|
r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Gu(Ii(r/t));e<r;)i[u++]=gr(n,e,e+=t);return i},On.compact=function(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u},On.concat=function(){var n=arguments.length;if(!n)return[];for(var t=Gu(n-1),r=arguments[0];n--;)t[n-1]=arguments[n];return s(cf(r)?Tr(r):[r],Et(t,1))},On.cond=function(n){var t=null==n?0:n.length,e=be();return n=t?l(n,function(n){if("function"!=typeof n[1])throw new ri("Expected a function");
|
||||||
|
return[e(n[0]),n[1]]}):[],sr(function(e){for(var u=-1;++u<t;){var i=n[u];if(r(i[0],this,e))return r(i[1],this,e)}})},On.conforms=function(n){return bt(yt(n,1))},On.constant=$u,On.countBy=Fo,On.create=function(n,t){var r=uo(n);return null==t?r:pt(r,t)},On.curry=ou,On.curryRight=fu,On.debounce=cu,On.defaults=mf,On.defaultsDeep=Af,On.defer=Qo,On.delay=Xo,On.difference=mo,On.differenceBy=Ao,On.differenceWith=ko,On.drop=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Eu(t),gr(n,0>t?0:t,e)):[];
|
||||||
|
},On.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Eu(t),t=e-t,gr(n,0,0>t?0:t)):[]},On.dropRightWhile=function(n,t){return n&&n.length?kr(n,be(t,3),true,true):[]},On.dropWhile=function(n,t){return n&&n.length?kr(n,be(t,3),true):[]},On.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Ie(n,t,r)&&(r=0,e=u),u=n.length,r=Eu(r),0>r&&(r=-r>u?0:u+r),e=e===F||e>u?u:Eu(e),0>e&&(e+=u),e=r>e?0:Ou(e);r<e;)n[r++]=t;return n},On.filter=function(n,t){
|
||||||
|
return(cf(n)?f:kt)(n,be(t,3))},On.flatMap=function(n,t){return Et(eu(n,t),1)},On.flatMapDeep=function(n,t){return Et(eu(n,t),N)},On.flatMapDepth=function(n,t,r){return r=r===F?1:Eu(r),Et(eu(n,t),r)},On.flatten=qe,On.flattenDeep=function(n){return(null==n?0:n.length)?Et(n,N):[]},On.flattenDepth=function(n,t){return null!=n&&n.length?(t=t===F?1:Eu(t),Et(n,t)):[]},On.flip=function(n){return se(n,512)},On.flow=Zf,On.flowRight=qf,On.fromPairs=function(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){
|
||||||
|
var u=n[t];e[u[0]]=u[1]}return e},On.functions=function(n){return null==n?[]:It(n,Bu(n))},On.functionsIn=function(n){return null==n?[]:It(n,Lu(n))},On.groupBy=Zo,On.initial=function(n){return(null==n?0:n.length)?gr(n,0,-1):[]},On.intersection=Eo,On.intersectionBy=Oo,On.intersectionWith=So,On.invert=kf,On.invertBy=Ef,On.invokeMap=qo,On.iteratee=Nu,On.keyBy=Vo,On.keys=Bu,On.keysIn=Lu,On.map=eu,On.mapKeys=function(n,t){var r={};return t=be(t,3),Ot(n,function(n,e,u){vt(r,t(n,e,u),n)}),r},On.mapValues=function(n,t){
|
||||||
|
var r={};return t=be(t,3),Ot(n,function(n,e,u){vt(r,e,t(n,e,u))}),r},On.matches=function(n){return Xt(yt(n,1))},On.matchesProperty=function(n,t){return nr(n,yt(t,1))},On.memoize=au,On.merge=Sf,On.mergeWith=If,On.method=Vf,On.methodOf=Kf,On.mixin=Pu,On.negate=lu,On.nthArg=function(n){return n=Eu(n),sr(function(t){return rr(t,n)})},On.omit=Rf,On.omitBy=function(n,t){return Uu(n,lu(be(t)))},On.once=function(n){return iu(2,n)},On.orderBy=function(n,t,r,e){return null==n?[]:(cf(t)||(t=null==t?[]:[t]),
|
||||||
|
r=e?F:r,cf(r)||(r=null==r?[]:[r]),er(n,t,r))},On.over=Gf,On.overArgs=nf,On.overEvery=Hf,On.overSome=Jf,On.partial=tf,On.partialRight=rf,On.partition=Ko,On.pick=zf,On.pickBy=Uu,On.property=qu,On.propertyOf=function(n){return function(t){return null==n?F:Rt(n,t)}},On.pull=Io,On.pullAll=Ge,On.pullAllBy=function(n,t,r){return n&&n.length&&t&&t.length?fr(n,t,be(r,2)):n},On.pullAllWith=function(n,t,r){return n&&n.length&&t&&t.length?fr(n,t,F,r):n},On.pullAt=Ro,On.range=Yf,On.rangeRight=Qf,On.rearg=ef,On.reject=function(n,t){
|
||||||
|
return(cf(n)?f:kt)(n,lu(be(t,3)))},On.remove=function(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=be(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return cr(n,u),r},On.rest=function(n,t){if(typeof n!="function")throw new ri("Expected a function");return t=t===F?t:Eu(t),sr(n,t)},On.reverse=He,On.sampleSize=function(n,t,r){return t=(r?Ie(n,t,r):t===F)?1:Eu(t),(cf(n)?ot:pr)(n,t)},On.set=function(n,t,r){return null==n?n:_r(n,t,r)},On.setWith=function(n,t,r,e){return e=typeof e=="function"?e:F,
|
||||||
|
null==n?n:_r(n,t,r,e)},On.shuffle=function(n){return(cf(n)?ft:vr)(n)},On.slice=function(n,t,r){var e=null==n?0:n.length;return e?(r&&typeof r!="number"&&Ie(n,t,r)?(t=0,r=e):(t=null==t?0:Eu(t),r=r===F?e:Eu(r)),gr(n,t,r)):[]},On.sortBy=Go,On.sortedUniq=function(n){return n&&n.length?xr(n):[]},On.sortedUniqBy=function(n,t){return n&&n.length?xr(n,be(t,2)):[]},On.split=function(n,t,r){return r&&typeof r!="number"&&Ie(n,t,r)&&(t=r=F),r=r===F?4294967295:r>>>0,r?(n=Ru(n))&&(typeof t=="string"||null!=t&&!pf(t))&&(t=wr(t),
|
||||||
|
!t&&Bn.test(n))?Wr($(n),0,r):n.split(t,r):[]},On.spread=function(n,t){if(typeof n!="function")throw new ri("Expected a function");return t=t===F?0:Ci(Eu(t),0),sr(function(e){var u=e[t];return e=Wr(e,0,t),u&&s(e,u),r(n,this,e)})},On.tail=function(n){var t=null==n?0:n.length;return t?gr(n,1,t):[]},On.take=function(n,t,r){return n&&n.length?(t=r||t===F?1:Eu(t),gr(n,0,0>t?0:t)):[]},On.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Eu(t),t=e-t,gr(n,0>t?0:t,e)):[]},On.takeRightWhile=function(n,t){
|
||||||
|
return n&&n.length?kr(n,be(t,3),false,true):[]},On.takeWhile=function(n,t){return n&&n.length?kr(n,be(t,3)):[]},On.tap=function(n,t){return t(n),n},On.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ri("Expected a function");return yu(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),cu(n,t,{leading:e,maxWait:t,trailing:u})},On.thru=Xe,On.toArray=Au,On.toPairs=Wf,On.toPairsIn=Bf,On.toPath=function(n){return cf(n)?l(n,Te):mu(n)?[n]:Tr(wo(Ru(n)))},On.toPlainObject=Iu,
|
||||||
|
On.transform=function(n,t,r){var e=cf(n),i=e||lf(n)||vf(n);if(t=be(t,4),null==r){var o=n&&n.constructor;r=i?e?new o:[]:yu(n)&&vu(o)?uo(yi(n)):{}}return(i?u:Ot)(n,function(n,e,u){return t(r,n,e,u)}),r},On.unary=function(n){return uu(n,1)},On.union=zo,On.unionBy=Wo,On.unionWith=Bo,On.uniq=function(n){return n&&n.length?mr(n):[]},On.uniqBy=function(n,t){return n&&n.length?mr(n,be(t,2)):[]},On.uniqWith=function(n,t){return t=typeof t=="function"?t:F,n&&n.length?mr(n,F,t):[]},On.unset=function(n,t){return null==n||Ar(n,t);
|
||||||
|
},On.unzip=Je,On.unzipWith=Ye,On.update=function(n,t,r){return null==n?n:_r(n,t,Rr(r)(Rt(n,t)),void 0)},On.updateWith=function(n,t,r,e){return e=typeof e=="function"?e:F,null!=n&&(n=_r(n,t,Rr(r)(Rt(n,t)),e)),n},On.values=Cu,On.valuesIn=function(n){return null==n?[]:I(n,Lu(n))},On.without=Lo,On.words=Tu,On.wrap=function(n,t){return tf(Rr(t),n)},On.xor=Uo,On.xorBy=Co,On.xorWith=Do,On.zip=Mo,On.zipObject=function(n,t){return Sr(n||[],t||[],lt)},On.zipObjectDeep=function(n,t){return Sr(n||[],t||[],_r);
|
||||||
|
},On.zipWith=To,On.entries=Wf,On.entriesIn=Bf,On.extend=bf,On.extendWith=xf,Pu(On,On),On.add=Xf,On.attempt=Nf,On.camelCase=Lf,On.capitalize=Du,On.ceil=nc,On.clamp=function(n,t,r){return r===F&&(r=t,t=F),r!==F&&(r=Su(r),r=r===r?r:0),t!==F&&(t=Su(t),t=t===t?t:0),dt(Su(n),t,r)},On.clone=function(n){return yt(n,4)},On.cloneDeep=function(n){return yt(n,5)},On.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:F,yt(n,5,t)},On.cloneWith=function(n,t){return t=typeof t=="function"?t:F,yt(n,4,t)},
|
||||||
|
On.conformsTo=function(n,t){return null==t||xt(n,t,Bu(t))},On.deburr=Mu,On.defaultTo=function(n,t){return null==n||n!==n?t:n},On.divide=tc,On.endsWith=function(n,t,r){n=Ru(n),t=wr(t);var e=n.length,e=r=r===F?e:dt(Eu(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},On.eq=su,On.escape=function(n){return(n=Ru(n))&&Y.test(n)?n.replace(H,et):n},On.escapeRegExp=function(n){return(n=Ru(n))&&fn.test(n)?n.replace(on,"\\$&"):n},On.every=function(n,t,r){var e=cf(n)?o:mt;return r&&Ie(n,t,r)&&(t=F),e(n,be(t,3));
|
||||||
|
},On.find=No,On.findIndex=Pe,On.findKey=function(n,t){return v(n,be(t,3),Ot)},On.findLast=Po,On.findLastIndex=Ze,On.findLastKey=function(n,t){return v(n,be(t,3),St)},On.floor=rc,On.forEach=tu,On.forEachRight=ru,On.forIn=function(n,t){return null==n?n:fo(n,be(t,3),Lu)},On.forInRight=function(n,t){return null==n?n:co(n,be(t,3),Lu)},On.forOwn=function(n,t){return n&&Ot(n,be(t,3))},On.forOwnRight=function(n,t){return n&&St(n,be(t,3))},On.get=zu,On.gt=uf,On.gte=of,On.has=function(n,t){return null!=n&&me(n,t,Lt);
|
||||||
|
},On.hasIn=Wu,On.head=Ve,On.identity=Fu,On.includes=function(n,t,r,e){return n=hu(n)?n:Cu(n),r=r&&!e?Eu(r):0,e=n.length,0>r&&(r=Ci(e+r,0)),wu(n)?r<=e&&-1<n.indexOf(t,r):!!e&&-1<d(n,t,r)},On.indexOf=function(n,t,r){var e=null==n?0:n.length;return e?(r=null==r?0:Eu(r),0>r&&(r=Ci(e+r,0)),d(n,t,r)):-1},On.inRange=function(n,t,r){return t=ku(t),r===F?(r=t,t=0):r=ku(r),n=Su(n),n>=Di(t,r)&&n<Ci(t,r)},On.invoke=Of,On.isArguments=ff,On.isArray=cf,On.isArrayBuffer=af,On.isArrayLike=hu,On.isArrayLikeObject=pu,
|
||||||
|
On.isBoolean=function(n){return true===n||false===n||bu(n)&&"[object Boolean]"==Wt(n)},On.isBuffer=lf,On.isDate=sf,On.isElement=function(n){return bu(n)&&1===n.nodeType&&!ju(n)},On.isEmpty=function(n){if(null==n)return true;if(hu(n)&&(cf(n)||typeof n=="string"||typeof n.splice=="function"||lf(n)||vf(n)||ff(n)))return!n.length;var t=go(n);if("[object Map]"==t||"[object Set]"==t)return!n.size;if(We(n))return!Jt(n).length;for(var r in n)if(fi.call(n,r))return false;return true},On.isEqual=function(n,t){return Nt(n,t);
|
||||||
|
},On.isEqualWith=function(n,t,r){var e=(r=typeof r=="function"?r:F)?r(n,t):F;return e===F?Nt(n,t,F,r):!!e},On.isError=_u,On.isFinite=function(n){return typeof n=="number"&&Bi(n)},On.isFunction=vu,On.isInteger=gu,On.isLength=du,On.isMap=hf,On.isMatch=function(n,t){return n===t||Zt(n,t,je(t))},On.isMatchWith=function(n,t,r){return r=typeof r=="function"?r:F,Zt(n,t,je(t),r)},On.isNaN=function(n){return xu(n)&&n!=+n},On.isNative=function(n){if(yo(n))throw new Ju("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");
|
||||||
|
return qt(n)},On.isNil=function(n){return null==n},On.isNull=function(n){return null===n},On.isNumber=xu,On.isObject=yu,On.isObjectLike=bu,On.isPlainObject=ju,On.isRegExp=pf,On.isSafeInteger=function(n){return gu(n)&&-9007199254740991<=n&&9007199254740991>=n},On.isSet=_f,On.isString=wu,On.isSymbol=mu,On.isTypedArray=vf,On.isUndefined=function(n){return n===F},On.isWeakMap=function(n){return bu(n)&&"[object WeakMap]"==go(n)},On.isWeakSet=function(n){return bu(n)&&"[object WeakSet]"==Wt(n)},On.join=function(n,t){
|
||||||
|
return null==n?"":Li.call(n,t)},On.kebabCase=Uf,On.last=Ke,On.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==F&&(u=Eu(r),u=0>u?Ci(e+u,0):Di(u,e-1)),t===t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=g(n,b,u,true);return n},On.lowerCase=Cf,On.lowerFirst=Df,On.lt=gf,On.lte=df,On.max=function(n){return n&&n.length?At(n,Fu,Bt):F},On.maxBy=function(n,t){return n&&n.length?At(n,be(t,2),Bt):F},On.mean=function(n){return x(n,Fu)},On.meanBy=function(n,t){return x(n,be(t,2))},On.min=function(n){
|
||||||
|
return n&&n.length?At(n,Fu,Yt):F},On.minBy=function(n,t){return n&&n.length?At(n,be(t,2),Yt):F},On.stubArray=Vu,On.stubFalse=Ku,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return true},On.multiply=ec,On.nth=function(n,t){return n&&n.length?rr(n,Eu(t)):F},On.noConflict=function(){return Zn._===this&&(Zn._=hi),this},On.noop=Zu,On.now=Ho,On.pad=function(n,t,r){n=Ru(n);var e=(t=Eu(t))?T(n):0;return!t||e>=t?n:(t=(t-e)/2,ue(Ri(t),r)+n+ue(Ii(t),r))},On.padEnd=function(n,t,r){
|
||||||
|
n=Ru(n);var e=(t=Eu(t))?T(n):0;return t&&e<t?n+ue(t-e,r):n},On.padStart=function(n,t,r){n=Ru(n);var e=(t=Eu(t))?T(n):0;return t&&e<t?ue(t-e,r)+n:n},On.parseInt=function(n,t,r){return r||null==t?t=0:t&&(t=+t),Ti(Ru(n).replace(an,""),t||0)},On.random=function(n,t,r){if(r&&typeof r!="boolean"&&Ie(n,t,r)&&(t=r=F),r===F&&(typeof t=="boolean"?(r=t,t=F):typeof n=="boolean"&&(r=n,n=F)),n===F&&t===F?(n=0,t=1):(n=ku(n),t===F?(t=n,n=0):t=ku(t)),n>t){var e=n;n=t,t=e}return r||n%1||t%1?(r=$i(),Di(n+r*(t-n+$n("1e-"+((r+"").length-1))),t)):ar(n,t);
|
||||||
|
},On.reduce=function(n,t,r){var e=cf(n)?h:m,u=3>arguments.length;return e(n,be(t,4),r,u,io)},On.reduceRight=function(n,t,r){var e=cf(n)?p:m,u=3>arguments.length;return e(n,be(t,4),r,u,oo)},On.repeat=function(n,t,r){return t=(r?Ie(n,t,r):t===F)?1:Eu(t),lr(Ru(n),t)},On.replace=function(){var n=arguments,t=Ru(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},On.result=function(n,t,r){t=zr(t,n);var e=-1,u=t.length;for(u||(u=1,n=F);++e<u;){var i=null==n?F:n[Te(t[e])];i===F&&(e=u,i=r),n=vu(i)?i.call(n):i;
|
||||||
|
}return n},On.round=uc,On.runInContext=w,On.sample=function(n){return(cf(n)?tt:hr)(n)},On.size=function(n){if(null==n)return 0;if(hu(n))return wu(n)?T(n):n.length;var t=go(n);return"[object Map]"==t||"[object Set]"==t?n.size:Jt(n).length},On.snakeCase=Mf,On.some=function(n,t,r){var e=cf(n)?_:dr;return r&&Ie(n,t,r)&&(t=F),e(n,be(t,3))},On.sortedIndex=function(n,t){return yr(n,t)},On.sortedIndexBy=function(n,t,r){return br(n,t,be(r,2))},On.sortedIndexOf=function(n,t){var r=null==n?0:n.length;if(r){
|
||||||
|
var e=yr(n,t);if(e<r&&su(n[e],t))return e}return-1},On.sortedLastIndex=function(n,t){return yr(n,t,true)},On.sortedLastIndexBy=function(n,t,r){return br(n,t,be(r,2),true)},On.sortedLastIndexOf=function(n,t){if(null==n?0:n.length){var r=yr(n,t,true)-1;if(su(n[r],t))return r}return-1},On.startCase=Tf,On.startsWith=function(n,t,r){return n=Ru(n),r=dt(Eu(r),0,n.length),t=wr(t),n.slice(r,r+t.length)==t},On.subtract=ic,On.sum=function(n){return n&&n.length?k(n,Fu):0},On.sumBy=function(n,t){return n&&n.length?k(n,be(t,2)):0;
|
||||||
|
},On.template=function(n,t,r){var e=On.templateSettings;r&&Ie(n,t,r)&&(t=F),n=Ru(n),t=xf({},t,e,ct),r=xf({},t.imports,e.imports,ct);var u,i,o=Bu(r),f=I(r,o),c=0;r=t.interpolate||An;var a="__p+='";r=ni((t.escape||An).source+"|"+r.source+"|"+(r===nn?gn:An).source+"|"+(t.evaluate||An).source+"|$","g");var l="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,o,f,l){return e||(e=o),a+=n.slice(c,l).replace(kn,B),r&&(u=true,a+="'+__e("+r+")+'"),f&&(i=true,a+="';"+f+";\n__p+='"),
|
||||||
|
e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+t.length,t}),a+="';",(t=t.variable)||(a="with(obj){"+a+"}"),a=(i?a.replace(q,""):a).replace(V,"$1").replace(K,"$1;"),a="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",t=Nf(function(){return Yu(o,l+"return "+a).apply(F,f)}),t.source=a,_u(t))throw t;return t},On.times=function(n,t){if(n=Eu(n),1>n||9007199254740991<n)return[];
|
||||||
|
var r=4294967295,e=Di(n,4294967295);for(t=be(t),n-=4294967295,e=E(e,t);++r<n;)t(r);return e},On.toFinite=ku,On.toInteger=Eu,On.toLength=Ou,On.toLower=function(n){return Ru(n).toLowerCase()},On.toNumber=Su,On.toSafeInteger=function(n){return dt(Eu(n),-9007199254740991,9007199254740991)},On.toString=Ru,On.toUpper=function(n){return Ru(n).toUpperCase()},On.trim=function(n,t,r){return(n=Ru(n))&&(r||t===F)?n.replace(cn,""):n&&(t=wr(t))?(n=$(n),r=$(t),t=z(n,r),r=W(n,r)+1,Wr(n,t,r).join("")):n},On.trimEnd=function(n,t,r){
|
||||||
|
return(n=Ru(n))&&(r||t===F)?n.replace(ln,""):n&&(t=wr(t))?(n=$(n),t=W(n,$(t))+1,Wr(n,0,t).join("")):n},On.trimStart=function(n,t,r){return(n=Ru(n))&&(r||t===F)?n.replace(an,""):n&&(t=wr(t))?(n=$(n),t=z(n,$(t)),Wr(n,t).join("")):n},On.truncate=function(n,t){var r=30,e="...";if(yu(t))var u="separator"in t?t.separator:u,r="length"in t?Eu(t.length):r,e="omission"in t?wr(t.omission):e;n=Ru(n);var i=n.length;if(Bn.test(n))var o=$(n),i=o.length;if(r>=i)return n;if(i=r-T(e),1>i)return e;if(r=o?Wr(o,0,i).join(""):n.slice(0,i),
|
||||||
|
u===F)return r+e;if(o&&(i+=r.length-i),pf(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=ni(u.source,Ru(dn.exec(u))+"g")),u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===F?i:c)}}else n.indexOf(wr(u),i)!=i&&(u=r.lastIndexOf(u),-1<u&&(r=r.slice(0,u)));return r+e},On.unescape=function(n){return(n=Ru(n))&&J.test(n)?n.replace(G,ut):n},On.uniqueId=function(n){var t=++ci;return Ru(n)+t},On.upperCase=$f,On.upperFirst=Ff,On.each=tu,On.eachRight=ru,On.first=Ve,Pu(On,function(){var n={};return Ot(On,function(t,r){
|
||||||
|
fi.call(On.prototype,r)||(n[r]=t)}),n}(),{chain:false}),On.VERSION="4.17.2",u("bind bindKey curry curryRight partial partialRight".split(" "),function(n){On[n].placeholder=On}),u(["drop","take"],function(n,t){Mn.prototype[n]=function(r){var e=this.__filtered__;if(e&&!t)return new Mn(this);r=r===F?1:Ci(Eu(r),0);var u=this.clone();return e?u.__takeCount__=Di(r,u.__takeCount__):u.__views__.push({size:Di(r,4294967295),type:n+(0>u.__dir__?"Right":"")}),u},Mn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse();
|
||||||
|
}}),u(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Mn.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:be(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u(["head","last"],function(n,t){var r="take"+(t?"Right":"");Mn.prototype[n]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Mn.prototype[n]=function(){return this.__filtered__?new Mn(this):this[r](1)}}),Mn.prototype.compact=function(){
|
||||||
|
return this.filter(Fu)},Mn.prototype.find=function(n){return this.filter(n).head()},Mn.prototype.findLast=function(n){return this.reverse().find(n)},Mn.prototype.invokeMap=sr(function(n,t){return typeof n=="function"?new Mn(this):this.map(function(r){return Mt(r,n,t)})}),Mn.prototype.reject=function(n){return this.filter(lu(be(n)))},Mn.prototype.slice=function(n,t){n=Eu(n);var r=this;return r.__filtered__&&(0<n||0>t)?new Mn(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==F&&(t=Eu(t),r=0>t?r.dropRight(-t):r.take(t-n)),
|
||||||
|
r)},Mn.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Mn.prototype.toArray=function(){return this.take(4294967295)},Ot(Mn.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=On[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(On.prototype[t]=function(){function t(n){return n=u.apply(On,s([n],f)),e&&h?n[0]:n}var o=this.__wrapped__,f=e?[1]:arguments,c=o instanceof Mn,a=f[0],l=c||cf(o);l&&r&&typeof a=="function"&&1!=a.length&&(c=l=false);
|
||||||
|
var h=this.__chain__,p=!!this.__actions__.length,a=i&&!h,c=c&&!p;return!i&&l?(o=c?o:new Mn(this),o=n.apply(o,f),o.__actions__.push({func:Xe,args:[t],thisArg:F}),new zn(o,h)):a&&c?n.apply(this,f):(o=this.thru(t),a?e?o.value()[0]:o.value():o)})}),u("pop push shift sort splice unshift".split(" "),function(n){var t=ei[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);On.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(cf(u)?u:[],n);
|
||||||
|
}return this[r](function(r){return t.apply(cf(r)?r:[],n)})}}),Ot(Mn.prototype,function(n,t){var r=On[t];if(r){var e=r.name+"";(Hi[e]||(Hi[e]=[])).push({name:t,func:r})}}),Hi[ne(F,2).name]=[{name:"wrapper",func:F}],Mn.prototype.clone=function(){var n=new Mn(this.__wrapped__);return n.__actions__=Tr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Tr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Tr(this.__views__),n},Mn.prototype.reverse=function(){
|
||||||
|
if(this.__filtered__){var n=new Mn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Mn.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=cf(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,f=0,c=-1,a=o.length;++c<a;){var l=o[c],s=l.size;switch(l.type){case"drop":f+=s;break;case"dropRight":n-=s;break;case"take":n=Di(n,f+s);break;case"takeRight":f=Ci(f,n-s)}}if(n={start:f,end:n},o=n.start,f=n.end,n=f-o,u=u?f:o-1,o=this.__iteratees__,f=o.length,
|
||||||
|
c=0,a=Di(n,this.__takeCount__),!e||200>i||i==n&&a==n)return Er(t,this.__actions__);e=[];n:for(;n--&&c<a;){for(u+=r,i=-1,l=t[u];++i<f;){var h=o[i],s=h.type,h=(0,h.iteratee)(l);if(2==s)l=h;else if(!h){if(1==s)continue n;break n}}e[c++]=l}return e},On.prototype.at=$o,On.prototype.chain=function(){return Qe(this)},On.prototype.commit=function(){return new zn(this.value(),this.__chain__)},On.prototype.next=function(){this.__values__===F&&(this.__values__=Au(this.value()));var n=this.__index__>=this.__values__.length;
|
||||||
|
return{done:n,value:n?F:this.__values__[this.__index__++]}},On.prototype.plant=function(n){for(var t,r=this;r instanceof Sn;){var e=Ne(r);e.__index__=0,e.__values__=F,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},On.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Mn?(this.__actions__.length&&(n=new Mn(this)),n=n.reverse(),n.__actions__.push({func:Xe,args:[He],thisArg:F}),new zn(n,this.__chain__)):this.thru(He)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){
|
||||||
|
return Er(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,mi&&(On.prototype[mi]=nu),On}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Zn._=it, define(function(){return it})):Vn?((Vn.exports=it)._=it,qn._=it):Zn._=it}).call(this);
|
||||||
429
dist/mapping.fp.js
vendored
Normal file
429
dist/mapping.fp.js
vendored
Normal file
@@ -0,0 +1,429 @@
|
|||||||
|
(function webpackUniversalModuleDefinition(root, factory) {
|
||||||
|
if(typeof exports === 'object' && typeof module === 'object')
|
||||||
|
module.exports = factory();
|
||||||
|
else if(typeof define === 'function' && define.amd)
|
||||||
|
define([], factory);
|
||||||
|
else if(typeof exports === 'object')
|
||||||
|
exports["mapping"] = factory();
|
||||||
|
else
|
||||||
|
root["mapping"] = factory();
|
||||||
|
})(this, function() {
|
||||||
|
return /******/ (function(modules) { // webpackBootstrap
|
||||||
|
/******/ // The module cache
|
||||||
|
/******/ var installedModules = {};
|
||||||
|
|
||||||
|
/******/ // The require function
|
||||||
|
/******/ function __webpack_require__(moduleId) {
|
||||||
|
|
||||||
|
/******/ // Check if module is in cache
|
||||||
|
/******/ if(installedModules[moduleId])
|
||||||
|
/******/ return installedModules[moduleId].exports;
|
||||||
|
|
||||||
|
/******/ // Create a new module (and put it into the cache)
|
||||||
|
/******/ var module = installedModules[moduleId] = {
|
||||||
|
/******/ exports: {},
|
||||||
|
/******/ id: moduleId,
|
||||||
|
/******/ loaded: false
|
||||||
|
/******/ };
|
||||||
|
|
||||||
|
/******/ // Execute the module function
|
||||||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||||||
|
|
||||||
|
/******/ // Flag the module as loaded
|
||||||
|
/******/ module.loaded = true;
|
||||||
|
|
||||||
|
/******/ // Return the exports of the module
|
||||||
|
/******/ return module.exports;
|
||||||
|
/******/ }
|
||||||
|
|
||||||
|
|
||||||
|
/******/ // expose the modules object (__webpack_modules__)
|
||||||
|
/******/ __webpack_require__.m = modules;
|
||||||
|
|
||||||
|
/******/ // expose the module cache
|
||||||
|
/******/ __webpack_require__.c = installedModules;
|
||||||
|
|
||||||
|
/******/ // __webpack_public_path__
|
||||||
|
/******/ __webpack_require__.p = "";
|
||||||
|
|
||||||
|
/******/ // Load entry module and return exports
|
||||||
|
/******/ return __webpack_require__(0);
|
||||||
|
/******/ })
|
||||||
|
/************************************************************************/
|
||||||
|
/******/ ([
|
||||||
|
/* 0 */
|
||||||
|
/***/ function(module, exports) {
|
||||||
|
|
||||||
|
/** Used to map aliases to their real names. */
|
||||||
|
exports.aliasToReal = {
|
||||||
|
|
||||||
|
// Lodash aliases.
|
||||||
|
'each': 'forEach',
|
||||||
|
'eachRight': 'forEachRight',
|
||||||
|
'entries': 'toPairs',
|
||||||
|
'entriesIn': 'toPairsIn',
|
||||||
|
'extend': 'assignIn',
|
||||||
|
'extendAll': 'assignInAll',
|
||||||
|
'extendAllWith': 'assignInAllWith',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
|
||||||
|
// Methods that are curried variants of others.
|
||||||
|
'conforms': 'conformsTo',
|
||||||
|
'matches': 'isMatch',
|
||||||
|
'property': 'get',
|
||||||
|
|
||||||
|
// Ramda aliases.
|
||||||
|
'__': 'placeholder',
|
||||||
|
'F': 'stubFalse',
|
||||||
|
'T': 'stubTrue',
|
||||||
|
'all': 'every',
|
||||||
|
'allPass': 'overEvery',
|
||||||
|
'always': 'constant',
|
||||||
|
'any': 'some',
|
||||||
|
'anyPass': 'overSome',
|
||||||
|
'apply': 'spread',
|
||||||
|
'assoc': 'set',
|
||||||
|
'assocPath': 'set',
|
||||||
|
'complement': 'negate',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'dissoc': 'unset',
|
||||||
|
'dissocPath': 'unset',
|
||||||
|
'dropLast': 'dropRight',
|
||||||
|
'dropLastWhile': 'dropRightWhile',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'identical': 'eq',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
|
'init': 'initial',
|
||||||
|
'invertObj': 'invert',
|
||||||
|
'juxt': 'over',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'pluck': 'map',
|
||||||
|
'prop': 'get',
|
||||||
|
'propEq': 'matchesProperty',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'symmetricDifference': 'xor',
|
||||||
|
'symmetricDifferenceBy': 'xorBy',
|
||||||
|
'symmetricDifferenceWith': 'xorWith',
|
||||||
|
'takeLast': 'takeRight',
|
||||||
|
'takeLastWhile': 'takeRightWhile',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'where': 'conformsTo',
|
||||||
|
'whereEq': 'isMatch',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
|
||||||
|
'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
|
||||||
|
'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
|
||||||
|
'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
|
||||||
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
|
'uniqueId', 'words', 'zipAll'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
|
||||||
|
'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
|
||||||
|
'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
|
||||||
|
'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
|
||||||
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
|
||||||
|
'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
|
'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
|
||||||
|
'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
|
||||||
|
'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
|
||||||
|
'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
|
||||||
|
'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
|
||||||
|
'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
|
||||||
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
|
||||||
|
'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
|
||||||
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
|
'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
|
'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
|
||||||
|
'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
|
||||||
|
'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
|
||||||
|
'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
|
||||||
|
'zipObjectDeep'
|
||||||
|
],
|
||||||
|
'3': [
|
||||||
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
|
'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
|
||||||
|
'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
|
||||||
|
'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
|
||||||
|
'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
|
||||||
|
'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
|
||||||
|
'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
|
||||||
|
'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
|
||||||
|
'xorWith', 'zipWith'
|
||||||
|
],
|
||||||
|
'4': [
|
||||||
|
'fill', 'setWith', 'updateWith'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to rearg configs. */
|
||||||
|
exports.aryRearg = {
|
||||||
|
'2': [1, 0],
|
||||||
|
'3': [2, 0, 1],
|
||||||
|
'4': [3, 2, 0, 1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to their iteratee ary. */
|
||||||
|
exports.iterateeAry = {
|
||||||
|
'dropRightWhile': 1,
|
||||||
|
'dropWhile': 1,
|
||||||
|
'every': 1,
|
||||||
|
'filter': 1,
|
||||||
|
'find': 1,
|
||||||
|
'findFrom': 1,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findIndexFrom': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastFrom': 1,
|
||||||
|
'findLastIndex': 1,
|
||||||
|
'findLastIndexFrom': 1,
|
||||||
|
'findLastKey': 1,
|
||||||
|
'flatMap': 1,
|
||||||
|
'flatMapDeep': 1,
|
||||||
|
'flatMapDepth': 1,
|
||||||
|
'forEach': 1,
|
||||||
|
'forEachRight': 1,
|
||||||
|
'forIn': 1,
|
||||||
|
'forInRight': 1,
|
||||||
|
'forOwn': 1,
|
||||||
|
'forOwnRight': 1,
|
||||||
|
'map': 1,
|
||||||
|
'mapKeys': 1,
|
||||||
|
'mapValues': 1,
|
||||||
|
'partition': 1,
|
||||||
|
'reduce': 2,
|
||||||
|
'reduceRight': 2,
|
||||||
|
'reject': 1,
|
||||||
|
'remove': 1,
|
||||||
|
'some': 1,
|
||||||
|
'takeRightWhile': 1,
|
||||||
|
'takeWhile': 1,
|
||||||
|
'times': 1,
|
||||||
|
'transform': 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
|
exports.iterateeRearg = {
|
||||||
|
'mapKeys': [1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to rearg configs. */
|
||||||
|
exports.methodRearg = {
|
||||||
|
'assignInAllWith': [1, 0],
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignAllWith': [1, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'differenceBy': [1, 2, 0],
|
||||||
|
'differenceWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'intersectionBy': [1, 2, 0],
|
||||||
|
'intersectionWith': [1, 2, 0],
|
||||||
|
'isEqualWith': [1, 2, 0],
|
||||||
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeAllWith': [1, 0],
|
||||||
|
'mergeWith': [1, 2, 0],
|
||||||
|
'padChars': [2, 1, 0],
|
||||||
|
'padCharsEnd': [2, 1, 0],
|
||||||
|
'padCharsStart': [2, 1, 0],
|
||||||
|
'pullAllBy': [2, 1, 0],
|
||||||
|
'pullAllWith': [2, 1, 0],
|
||||||
|
'rangeStep': [1, 2, 0],
|
||||||
|
'rangeStepRight': [1, 2, 0],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'unionBy': [1, 2, 0],
|
||||||
|
'unionWith': [1, 2, 0],
|
||||||
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'xorBy': [1, 2, 0],
|
||||||
|
'xorWith': [1, 2, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'assignAll': { 'start': 0 },
|
||||||
|
'assignAllWith': { 'start': 0 },
|
||||||
|
'assignInAll': { 'start': 0 },
|
||||||
|
'assignInAllWith': { 'start': 0 },
|
||||||
|
'defaultsAll': { 'start': 0 },
|
||||||
|
'defaultsDeepAll': { 'start': 0 },
|
||||||
|
'invokeArgs': { 'start': 2 },
|
||||||
|
'invokeArgsMap': { 'start': 2 },
|
||||||
|
'mergeAll': { 'start': 0 },
|
||||||
|
'mergeAllWith': { 'start': 0 },
|
||||||
|
'partial': { 'start': 1 },
|
||||||
|
'partialRight': { 'start': 1 },
|
||||||
|
'without': { 'start': 1 },
|
||||||
|
'zipAll': { 'start': 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
|
exports.mutate = {
|
||||||
|
'array': {
|
||||||
|
'fill': true,
|
||||||
|
'pull': true,
|
||||||
|
'pullAll': true,
|
||||||
|
'pullAllBy': true,
|
||||||
|
'pullAllWith': true,
|
||||||
|
'pullAt': true,
|
||||||
|
'remove': true,
|
||||||
|
'reverse': true
|
||||||
|
},
|
||||||
|
'object': {
|
||||||
|
'assign': true,
|
||||||
|
'assignAll': true,
|
||||||
|
'assignAllWith': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInAll': true,
|
||||||
|
'assignInAllWith': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsAll': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'defaultsDeepAll': true,
|
||||||
|
'merge': true,
|
||||||
|
'mergeAll': true,
|
||||||
|
'mergeAllWith': true,
|
||||||
|
'mergeWith': true,
|
||||||
|
},
|
||||||
|
'set': {
|
||||||
|
'set': true,
|
||||||
|
'setWith': true,
|
||||||
|
'unset': true,
|
||||||
|
'update': true,
|
||||||
|
'updateWith': true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods with placeholder support */
|
||||||
|
exports.placeholder = {
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'curry': true,
|
||||||
|
'curryRight': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map real names to their aliases. */
|
||||||
|
exports.realToAlias = (function() {
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
|
object = exports.aliasToReal,
|
||||||
|
result = {};
|
||||||
|
|
||||||
|
for (var key in object) {
|
||||||
|
var value = object[key];
|
||||||
|
if (hasOwnProperty.call(result, value)) {
|
||||||
|
result[value].push(key);
|
||||||
|
} else {
|
||||||
|
result[value] = [key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
/** Used to map method names to other names. */
|
||||||
|
exports.remap = {
|
||||||
|
'assignAll': 'assign',
|
||||||
|
'assignAllWith': 'assignWith',
|
||||||
|
'assignInAll': 'assignIn',
|
||||||
|
'assignInAllWith': 'assignInWith',
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'defaultsAll': 'defaults',
|
||||||
|
'defaultsDeepAll': 'defaultsDeep',
|
||||||
|
'findFrom': 'find',
|
||||||
|
'findIndexFrom': 'findIndex',
|
||||||
|
'findLastFrom': 'findLast',
|
||||||
|
'findLastIndexFrom': 'findLastIndex',
|
||||||
|
'getOr': 'get',
|
||||||
|
'includesFrom': 'includes',
|
||||||
|
'indexOfFrom': 'indexOf',
|
||||||
|
'invokeArgs': 'invoke',
|
||||||
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'lastIndexOfFrom': 'lastIndexOf',
|
||||||
|
'mergeAll': 'merge',
|
||||||
|
'mergeAllWith': 'mergeWith',
|
||||||
|
'padChars': 'pad',
|
||||||
|
'padCharsEnd': 'padEnd',
|
||||||
|
'padCharsStart': 'padStart',
|
||||||
|
'propertyOf': 'get',
|
||||||
|
'rangeStep': 'range',
|
||||||
|
'rangeStepRight': 'rangeRight',
|
||||||
|
'restFrom': 'rest',
|
||||||
|
'spreadFrom': 'spread',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart',
|
||||||
|
'zipAll': 'zip'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip fixing their arity. */
|
||||||
|
exports.skipFixed = {
|
||||||
|
'castArray': true,
|
||||||
|
'flow': true,
|
||||||
|
'flowRight': true,
|
||||||
|
'iteratee': true,
|
||||||
|
'mixin': true,
|
||||||
|
'rearg': true,
|
||||||
|
'runInContext': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip rearranging arguments. */
|
||||||
|
exports.skipRearg = {
|
||||||
|
'add': true,
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'concat': true,
|
||||||
|
'difference': true,
|
||||||
|
'divide': true,
|
||||||
|
'eq': true,
|
||||||
|
'gt': true,
|
||||||
|
'gte': true,
|
||||||
|
'isEqual': true,
|
||||||
|
'lt': true,
|
||||||
|
'lte': true,
|
||||||
|
'matchesProperty': true,
|
||||||
|
'merge': true,
|
||||||
|
'multiply': true,
|
||||||
|
'overArgs': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true,
|
||||||
|
'propertyOf': true,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true,
|
||||||
|
'zipObjectDeep': true
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }
|
||||||
|
/******/ ])
|
||||||
|
});
|
||||||
|
;
|
||||||
12426
doc/README.md
12426
doc/README.md
File diff suppressed because it is too large
Load Diff
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// cleanup requested filepath
|
|
||||||
$file = isset($_GET['f']) ? $_GET['f'] : 'lodash';
|
|
||||||
$file = preg_replace('#(\.*[\/])+#', '', $file);
|
|
||||||
$file .= preg_match('/\.[a-z]+$/', $file) ? '' : '.js';
|
|
||||||
|
|
||||||
// output filename
|
|
||||||
if (isset($_GET['o'])) {
|
|
||||||
$output = $_GET['o'];
|
|
||||||
} else if (isset($_SERVER['argv'][1])) {
|
|
||||||
$output = $_SERVER['argv'][1];
|
|
||||||
} else {
|
|
||||||
$output = basename($file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
require('../vendor/docdown/docdown.php');
|
|
||||||
|
|
||||||
// generate Markdown
|
|
||||||
$markdown = docdown(array(
|
|
||||||
'path' => '../' . $file,
|
|
||||||
'title' => 'Lo-Dash <sup>v0.3.0</sup>',
|
|
||||||
'url' => 'https://github.com/bestiejs/lodash/blob/v0.3.0/lodash.js'
|
|
||||||
));
|
|
||||||
|
|
||||||
// save to a .md file
|
|
||||||
file_put_contents($output . '.md', $markdown);
|
|
||||||
|
|
||||||
// print
|
|
||||||
header('Content-Type: text/plain;charset=utf-8');
|
|
||||||
echo $markdown . PHP_EOL;
|
|
||||||
|
|
||||||
?>
|
|
||||||
567
fp/_baseConvert.js
Normal file
567
fp/_baseConvert.js
Normal file
@@ -0,0 +1,567 @@
|
|||||||
|
var mapping = require('./_mapping'),
|
||||||
|
fallbackHolder = require('./placeholder');
|
||||||
|
|
||||||
|
/** Built-in value reference. */
|
||||||
|
var push = Array.prototype.push;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function, with an arity of `n`, that invokes `func` with the
|
||||||
|
* arguments it receives.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {number} n The arity of the new function.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function baseArity(func, n) {
|
||||||
|
return n == 2
|
||||||
|
? function(a, b) { return func.apply(undefined, arguments); }
|
||||||
|
: function(a) { return func.apply(undefined, arguments); };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that invokes `func`, with up to `n` arguments, ignoring
|
||||||
|
* any additional arguments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to cap arguments for.
|
||||||
|
* @param {number} n The arity cap.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function baseAry(func, n) {
|
||||||
|
return n == 2
|
||||||
|
? function(a, b) { return func(a, b); }
|
||||||
|
: function(a) { return func(a); };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a clone of `array`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to clone.
|
||||||
|
* @returns {Array} Returns the cloned array.
|
||||||
|
*/
|
||||||
|
function cloneArray(array) {
|
||||||
|
var length = array ? array.length : 0,
|
||||||
|
result = Array(length);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
result[length] = array[length];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that clones a given object using the assignment `func`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The assignment function.
|
||||||
|
* @returns {Function} Returns the new cloner function.
|
||||||
|
*/
|
||||||
|
function createCloner(func) {
|
||||||
|
return function(object) {
|
||||||
|
return func({}, object);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is like `_.spread` except that it includes arguments after those spread.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to spread arguments over.
|
||||||
|
* @param {number} start The start position of the spread.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function spread(func, start) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length,
|
||||||
|
args = Array(length);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var array = args[start],
|
||||||
|
lastIndex = args.length - 1,
|
||||||
|
otherArgs = args.slice(0, start);
|
||||||
|
|
||||||
|
if (array) {
|
||||||
|
push.apply(otherArgs, array);
|
||||||
|
}
|
||||||
|
if (start != lastIndex) {
|
||||||
|
push.apply(otherArgs, args.slice(start + 1));
|
||||||
|
}
|
||||||
|
return func.apply(this, otherArgs);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that wraps `func` and uses `cloner` to clone the first
|
||||||
|
* argument it receives.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {Function} cloner The function to clone arguments.
|
||||||
|
* @returns {Function} Returns the new immutable function.
|
||||||
|
*/
|
||||||
|
function wrapImmutable(func, cloner) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var args = Array(length);
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var result = args[0] = cloner.apply(undefined, args);
|
||||||
|
func.apply(undefined, args);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `convert` which accepts a `util` object of methods
|
||||||
|
* required to perform conversions.
|
||||||
|
*
|
||||||
|
* @param {Object} util The util object.
|
||||||
|
* @param {string} name The name of the function to convert.
|
||||||
|
* @param {Function} func The function to convert.
|
||||||
|
* @param {Object} [options] The options object.
|
||||||
|
* @param {boolean} [options.cap=true] Specify capping iteratee arguments.
|
||||||
|
* @param {boolean} [options.curry=true] Specify currying.
|
||||||
|
* @param {boolean} [options.fixed=true] Specify fixed arity.
|
||||||
|
* @param {boolean} [options.immutable=true] Specify immutable operations.
|
||||||
|
* @param {boolean} [options.rearg=true] Specify rearranging arguments.
|
||||||
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
|
*/
|
||||||
|
function baseConvert(util, name, func, options) {
|
||||||
|
var setPlaceholder,
|
||||||
|
isLib = typeof name == 'function',
|
||||||
|
isObj = name === Object(name);
|
||||||
|
|
||||||
|
if (isObj) {
|
||||||
|
options = func;
|
||||||
|
func = name;
|
||||||
|
name = undefined;
|
||||||
|
}
|
||||||
|
if (func == null) {
|
||||||
|
throw new TypeError;
|
||||||
|
}
|
||||||
|
options || (options = {});
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
'cap': 'cap' in options ? options.cap : true,
|
||||||
|
'curry': 'curry' in options ? options.curry : true,
|
||||||
|
'fixed': 'fixed' in options ? options.fixed : true,
|
||||||
|
'immutable': 'immutable' in options ? options.immutable : true,
|
||||||
|
'rearg': 'rearg' in options ? options.rearg : true
|
||||||
|
};
|
||||||
|
|
||||||
|
var forceCurry = ('curry' in options) && options.curry,
|
||||||
|
forceFixed = ('fixed' in options) && options.fixed,
|
||||||
|
forceRearg = ('rearg' in options) && options.rearg,
|
||||||
|
placeholder = isLib ? func : fallbackHolder,
|
||||||
|
pristine = isLib ? func.runInContext() : undefined;
|
||||||
|
|
||||||
|
var helpers = isLib ? func : {
|
||||||
|
'ary': util.ary,
|
||||||
|
'assign': util.assign,
|
||||||
|
'clone': util.clone,
|
||||||
|
'curry': util.curry,
|
||||||
|
'forEach': util.forEach,
|
||||||
|
'isArray': util.isArray,
|
||||||
|
'isFunction': util.isFunction,
|
||||||
|
'iteratee': util.iteratee,
|
||||||
|
'keys': util.keys,
|
||||||
|
'rearg': util.rearg,
|
||||||
|
'toInteger': util.toInteger,
|
||||||
|
'toPath': util.toPath
|
||||||
|
};
|
||||||
|
|
||||||
|
var ary = helpers.ary,
|
||||||
|
assign = helpers.assign,
|
||||||
|
clone = helpers.clone,
|
||||||
|
curry = helpers.curry,
|
||||||
|
each = helpers.forEach,
|
||||||
|
isArray = helpers.isArray,
|
||||||
|
isFunction = helpers.isFunction,
|
||||||
|
keys = helpers.keys,
|
||||||
|
rearg = helpers.rearg,
|
||||||
|
toInteger = helpers.toInteger,
|
||||||
|
toPath = helpers.toPath;
|
||||||
|
|
||||||
|
var aryMethodKeys = keys(mapping.aryMethod);
|
||||||
|
|
||||||
|
var wrappers = {
|
||||||
|
'castArray': function(castArray) {
|
||||||
|
return function() {
|
||||||
|
var value = arguments[0];
|
||||||
|
return isArray(value)
|
||||||
|
? castArray(cloneArray(value))
|
||||||
|
: castArray.apply(undefined, arguments);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'iteratee': function(iteratee) {
|
||||||
|
return function() {
|
||||||
|
var func = arguments[0],
|
||||||
|
arity = arguments[1],
|
||||||
|
result = iteratee(func, arity),
|
||||||
|
length = result.length;
|
||||||
|
|
||||||
|
if (config.cap && typeof arity == 'number') {
|
||||||
|
arity = arity > 2 ? (arity - 2) : 1;
|
||||||
|
return (length && length <= arity) ? result : baseAry(result, arity);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'mixin': function(mixin) {
|
||||||
|
return function(source) {
|
||||||
|
var func = this;
|
||||||
|
if (!isFunction(func)) {
|
||||||
|
return mixin(func, Object(source));
|
||||||
|
}
|
||||||
|
var pairs = [];
|
||||||
|
each(keys(source), function(key) {
|
||||||
|
if (isFunction(source[key])) {
|
||||||
|
pairs.push([key, func.prototype[key]]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mixin(func, Object(source));
|
||||||
|
|
||||||
|
each(pairs, function(pair) {
|
||||||
|
var value = pair[1];
|
||||||
|
if (isFunction(value)) {
|
||||||
|
func.prototype[pair[0]] = value;
|
||||||
|
} else {
|
||||||
|
delete func.prototype[pair[0]];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'nthArg': function(nthArg) {
|
||||||
|
return function(n) {
|
||||||
|
var arity = n < 0 ? 1 : (toInteger(n) + 1);
|
||||||
|
return curry(nthArg(n), arity);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'rearg': function(rearg) {
|
||||||
|
return function(func, indexes) {
|
||||||
|
var arity = indexes ? indexes.length : 0;
|
||||||
|
return curry(rearg(func, indexes), arity);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'runInContext': function(runInContext) {
|
||||||
|
return function(context) {
|
||||||
|
return baseConvert(util, runInContext(context), options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a function with an arity capped iteratee if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castCap(name, func) {
|
||||||
|
if (config.cap) {
|
||||||
|
var indexes = mapping.iterateeRearg[name];
|
||||||
|
if (indexes) {
|
||||||
|
return iterateeRearg(func, indexes);
|
||||||
|
}
|
||||||
|
var n = !isLib && mapping.iterateeAry[name];
|
||||||
|
if (n) {
|
||||||
|
return iterateeAry(func, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a curried function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity of `func`.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castCurry(name, func, n) {
|
||||||
|
return (forceCurry || (config.curry && n > 1))
|
||||||
|
? curry(func, n)
|
||||||
|
: func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a fixed arity function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity cap.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castFixed(name, func, n) {
|
||||||
|
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
||||||
|
var data = mapping.methodSpread[name],
|
||||||
|
start = data && data.start;
|
||||||
|
|
||||||
|
return start === undefined ? ary(func, n) : spread(func, start);
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to an rearged function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity of `func`.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castRearg(name, func, n) {
|
||||||
|
return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name]))
|
||||||
|
? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n])
|
||||||
|
: func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a clone of `object` by `path`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to clone.
|
||||||
|
* @param {Array|string} path The path to clone by.
|
||||||
|
* @returns {Object} Returns the cloned object.
|
||||||
|
*/
|
||||||
|
function cloneByPath(object, path) {
|
||||||
|
path = toPath(path);
|
||||||
|
|
||||||
|
var index = -1,
|
||||||
|
length = path.length,
|
||||||
|
lastIndex = length - 1,
|
||||||
|
result = clone(Object(object)),
|
||||||
|
nested = result;
|
||||||
|
|
||||||
|
while (nested != null && ++index < length) {
|
||||||
|
var key = path[index],
|
||||||
|
value = nested[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
nested[path[index]] = clone(index == lastIndex ? value : Object(value));
|
||||||
|
}
|
||||||
|
nested = nested[key];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `lodash` to an immutable auto-curried iteratee-first data-last
|
||||||
|
* version with conversion `options` applied.
|
||||||
|
*
|
||||||
|
* @param {Object} [options] The options object. See `baseConvert` for more details.
|
||||||
|
* @returns {Function} Returns the converted `lodash`.
|
||||||
|
*/
|
||||||
|
function convertLib(options) {
|
||||||
|
return _.runInContext.convert(options)(undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a converter function for `func` of `name`.
|
||||||
|
*
|
||||||
|
* @param {string} name The name of the function to convert.
|
||||||
|
* @param {Function} func The function to convert.
|
||||||
|
* @returns {Function} Returns the new converter function.
|
||||||
|
*/
|
||||||
|
function createConverter(name, func) {
|
||||||
|
var realName = mapping.aliasToReal[name] || name,
|
||||||
|
methodName = mapping.remap[realName] || realName,
|
||||||
|
oldOptions = options;
|
||||||
|
|
||||||
|
return function(options) {
|
||||||
|
var newUtil = isLib ? pristine : helpers,
|
||||||
|
newFunc = isLib ? pristine[methodName] : func,
|
||||||
|
newOptions = assign(assign({}, oldOptions), options);
|
||||||
|
|
||||||
|
return baseConvert(newUtil, realName, newFunc, newOptions);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that wraps `func` to invoke its iteratee, with up to `n`
|
||||||
|
* arguments, ignoring any additional arguments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to cap iteratee arguments for.
|
||||||
|
* @param {number} n The arity cap.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function iterateeAry(func, n) {
|
||||||
|
return overArg(func, function(func) {
|
||||||
|
return typeof func == 'function' ? baseAry(func, n) : func;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that wraps `func` to invoke its iteratee with arguments
|
||||||
|
* arranged according to the specified `indexes` where the argument value at
|
||||||
|
* the first index is provided as the first argument, the argument value at
|
||||||
|
* the second index is provided as the second argument, and so on.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to rearrange iteratee arguments for.
|
||||||
|
* @param {number[]} indexes The arranged argument indexes.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function iterateeRearg(func, indexes) {
|
||||||
|
return overArg(func, function(func) {
|
||||||
|
var n = indexes.length;
|
||||||
|
return baseArity(rearg(baseAry(func, n), indexes), n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that invokes `func` with its first argument transformed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {Function} transform The argument transform.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function overArg(func, transform) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return func();
|
||||||
|
}
|
||||||
|
var args = Array(length);
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var index = config.rearg ? 0 : (length - 1);
|
||||||
|
args[index] = transform(args[index]);
|
||||||
|
return func.apply(undefined, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a function that wraps `func` and applys the conversions
|
||||||
|
* rules by `name`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to wrap.
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @returns {Function} Returns the converted function.
|
||||||
|
*/
|
||||||
|
function wrap(name, func) {
|
||||||
|
var result,
|
||||||
|
realName = mapping.aliasToReal[name] || name,
|
||||||
|
wrapped = func,
|
||||||
|
wrapper = wrappers[realName];
|
||||||
|
|
||||||
|
if (wrapper) {
|
||||||
|
wrapped = wrapper(func);
|
||||||
|
}
|
||||||
|
else if (config.immutable) {
|
||||||
|
if (mapping.mutate.array[realName]) {
|
||||||
|
wrapped = wrapImmutable(func, cloneArray);
|
||||||
|
}
|
||||||
|
else if (mapping.mutate.object[realName]) {
|
||||||
|
wrapped = wrapImmutable(func, createCloner(func));
|
||||||
|
}
|
||||||
|
else if (mapping.mutate.set[realName]) {
|
||||||
|
wrapped = wrapImmutable(func, cloneByPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
|
if (realName == otherName) {
|
||||||
|
var spreadData = mapping.methodSpread[realName],
|
||||||
|
afterRearg = spreadData && spreadData.afterRearg;
|
||||||
|
|
||||||
|
result = afterRearg
|
||||||
|
? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey)
|
||||||
|
: castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey);
|
||||||
|
|
||||||
|
result = castCap(realName, result);
|
||||||
|
result = castCurry(realName, result, aryKey);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return !result;
|
||||||
|
});
|
||||||
|
|
||||||
|
result || (result = wrapped);
|
||||||
|
if (result == func) {
|
||||||
|
result = forceCurry ? curry(result, 1) : function() {
|
||||||
|
return func.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
result.convert = createConverter(realName, func);
|
||||||
|
if (mapping.placeholder[realName]) {
|
||||||
|
setPlaceholder = true;
|
||||||
|
result.placeholder = func.placeholder = placeholder;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (!isObj) {
|
||||||
|
return wrap(name, func);
|
||||||
|
}
|
||||||
|
var _ = func;
|
||||||
|
|
||||||
|
// Convert methods by ary cap.
|
||||||
|
var pairs = [];
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(key) {
|
||||||
|
var func = _[mapping.remap[key] || key];
|
||||||
|
if (func) {
|
||||||
|
pairs.push([key, wrap(key, func)]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert remaining methods.
|
||||||
|
each(keys(_), function(key) {
|
||||||
|
var func = _[key];
|
||||||
|
if (typeof func == 'function') {
|
||||||
|
var length = pairs.length;
|
||||||
|
while (length--) {
|
||||||
|
if (pairs[length][0] == key) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func.convert = createConverter(key, func);
|
||||||
|
pairs.push([key, func]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assign to `_` leaving `_.prototype` unchanged to allow chaining.
|
||||||
|
each(pairs, function(pair) {
|
||||||
|
_[pair[0]] = pair[1];
|
||||||
|
});
|
||||||
|
|
||||||
|
_.convert = convertLib;
|
||||||
|
if (setPlaceholder) {
|
||||||
|
_.placeholder = placeholder;
|
||||||
|
}
|
||||||
|
// Assign aliases.
|
||||||
|
each(keys(_), function(key) {
|
||||||
|
each(mapping.realToAlias[key] || [], function(alias) {
|
||||||
|
_[alias] = _[key];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return _;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseConvert;
|
||||||
18
fp/_convertBrowser.js
Normal file
18
fp/_convertBrowser.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
var baseConvert = require('./_baseConvert');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `lodash` to an immutable auto-curried iteratee-first data-last
|
||||||
|
* version with conversion `options` applied.
|
||||||
|
*
|
||||||
|
* @param {Function} lodash The lodash function to convert.
|
||||||
|
* @param {Object} [options] The options object. See `baseConvert` for more details.
|
||||||
|
* @returns {Function} Returns the converted `lodash`.
|
||||||
|
*/
|
||||||
|
function browserConvert(lodash, options) {
|
||||||
|
return baseConvert(lodash, lodash, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof _ == 'function' && typeof _.runInContext == 'function') {
|
||||||
|
_ = browserConvert(_.runInContext());
|
||||||
|
}
|
||||||
|
module.exports = browserConvert;
|
||||||
367
fp/_mapping.js
Normal file
367
fp/_mapping.js
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
/** Used to map aliases to their real names. */
|
||||||
|
exports.aliasToReal = {
|
||||||
|
|
||||||
|
// Lodash aliases.
|
||||||
|
'each': 'forEach',
|
||||||
|
'eachRight': 'forEachRight',
|
||||||
|
'entries': 'toPairs',
|
||||||
|
'entriesIn': 'toPairsIn',
|
||||||
|
'extend': 'assignIn',
|
||||||
|
'extendAll': 'assignInAll',
|
||||||
|
'extendAllWith': 'assignInAllWith',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
|
||||||
|
// Methods that are curried variants of others.
|
||||||
|
'conforms': 'conformsTo',
|
||||||
|
'matches': 'isMatch',
|
||||||
|
'property': 'get',
|
||||||
|
|
||||||
|
// Ramda aliases.
|
||||||
|
'__': 'placeholder',
|
||||||
|
'F': 'stubFalse',
|
||||||
|
'T': 'stubTrue',
|
||||||
|
'all': 'every',
|
||||||
|
'allPass': 'overEvery',
|
||||||
|
'always': 'constant',
|
||||||
|
'any': 'some',
|
||||||
|
'anyPass': 'overSome',
|
||||||
|
'apply': 'spread',
|
||||||
|
'assoc': 'set',
|
||||||
|
'assocPath': 'set',
|
||||||
|
'complement': 'negate',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'dissoc': 'unset',
|
||||||
|
'dissocPath': 'unset',
|
||||||
|
'dropLast': 'dropRight',
|
||||||
|
'dropLastWhile': 'dropRightWhile',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'identical': 'eq',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
|
'init': 'initial',
|
||||||
|
'invertObj': 'invert',
|
||||||
|
'juxt': 'over',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'pluck': 'map',
|
||||||
|
'prop': 'get',
|
||||||
|
'propEq': 'matchesProperty',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'symmetricDifference': 'xor',
|
||||||
|
'symmetricDifferenceBy': 'xorBy',
|
||||||
|
'symmetricDifferenceWith': 'xorWith',
|
||||||
|
'takeLast': 'takeRight',
|
||||||
|
'takeLastWhile': 'takeRightWhile',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'where': 'conformsTo',
|
||||||
|
'whereEq': 'isMatch',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
|
||||||
|
'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
|
||||||
|
'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
|
||||||
|
'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
|
||||||
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
|
'uniqueId', 'words', 'zipAll'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
|
||||||
|
'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
|
||||||
|
'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
|
||||||
|
'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
|
||||||
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
|
||||||
|
'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
|
'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
|
||||||
|
'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
|
||||||
|
'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
|
||||||
|
'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
|
||||||
|
'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
|
||||||
|
'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
|
||||||
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
|
||||||
|
'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
|
||||||
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
|
'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
|
'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
|
||||||
|
'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
|
||||||
|
'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
|
||||||
|
'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
|
||||||
|
'zipObjectDeep'
|
||||||
|
],
|
||||||
|
'3': [
|
||||||
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
|
'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
|
||||||
|
'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
|
||||||
|
'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
|
||||||
|
'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
|
||||||
|
'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
|
||||||
|
'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
|
||||||
|
'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
|
||||||
|
'xorWith', 'zipWith'
|
||||||
|
],
|
||||||
|
'4': [
|
||||||
|
'fill', 'setWith', 'updateWith'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to rearg configs. */
|
||||||
|
exports.aryRearg = {
|
||||||
|
'2': [1, 0],
|
||||||
|
'3': [2, 0, 1],
|
||||||
|
'4': [3, 2, 0, 1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to their iteratee ary. */
|
||||||
|
exports.iterateeAry = {
|
||||||
|
'dropRightWhile': 1,
|
||||||
|
'dropWhile': 1,
|
||||||
|
'every': 1,
|
||||||
|
'filter': 1,
|
||||||
|
'find': 1,
|
||||||
|
'findFrom': 1,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findIndexFrom': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastFrom': 1,
|
||||||
|
'findLastIndex': 1,
|
||||||
|
'findLastIndexFrom': 1,
|
||||||
|
'findLastKey': 1,
|
||||||
|
'flatMap': 1,
|
||||||
|
'flatMapDeep': 1,
|
||||||
|
'flatMapDepth': 1,
|
||||||
|
'forEach': 1,
|
||||||
|
'forEachRight': 1,
|
||||||
|
'forIn': 1,
|
||||||
|
'forInRight': 1,
|
||||||
|
'forOwn': 1,
|
||||||
|
'forOwnRight': 1,
|
||||||
|
'map': 1,
|
||||||
|
'mapKeys': 1,
|
||||||
|
'mapValues': 1,
|
||||||
|
'partition': 1,
|
||||||
|
'reduce': 2,
|
||||||
|
'reduceRight': 2,
|
||||||
|
'reject': 1,
|
||||||
|
'remove': 1,
|
||||||
|
'some': 1,
|
||||||
|
'takeRightWhile': 1,
|
||||||
|
'takeWhile': 1,
|
||||||
|
'times': 1,
|
||||||
|
'transform': 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
|
exports.iterateeRearg = {
|
||||||
|
'mapKeys': [1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to rearg configs. */
|
||||||
|
exports.methodRearg = {
|
||||||
|
'assignInAllWith': [1, 0],
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignAllWith': [1, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'differenceBy': [1, 2, 0],
|
||||||
|
'differenceWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'intersectionBy': [1, 2, 0],
|
||||||
|
'intersectionWith': [1, 2, 0],
|
||||||
|
'isEqualWith': [1, 2, 0],
|
||||||
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeAllWith': [1, 0],
|
||||||
|
'mergeWith': [1, 2, 0],
|
||||||
|
'padChars': [2, 1, 0],
|
||||||
|
'padCharsEnd': [2, 1, 0],
|
||||||
|
'padCharsStart': [2, 1, 0],
|
||||||
|
'pullAllBy': [2, 1, 0],
|
||||||
|
'pullAllWith': [2, 1, 0],
|
||||||
|
'rangeStep': [1, 2, 0],
|
||||||
|
'rangeStepRight': [1, 2, 0],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'unionBy': [1, 2, 0],
|
||||||
|
'unionWith': [1, 2, 0],
|
||||||
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'xorBy': [1, 2, 0],
|
||||||
|
'xorWith': [1, 2, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'assignAll': { 'start': 0 },
|
||||||
|
'assignAllWith': { 'start': 0 },
|
||||||
|
'assignInAll': { 'start': 0 },
|
||||||
|
'assignInAllWith': { 'start': 0 },
|
||||||
|
'defaultsAll': { 'start': 0 },
|
||||||
|
'defaultsDeepAll': { 'start': 0 },
|
||||||
|
'invokeArgs': { 'start': 2 },
|
||||||
|
'invokeArgsMap': { 'start': 2 },
|
||||||
|
'mergeAll': { 'start': 0 },
|
||||||
|
'mergeAllWith': { 'start': 0 },
|
||||||
|
'partial': { 'start': 1 },
|
||||||
|
'partialRight': { 'start': 1 },
|
||||||
|
'without': { 'start': 1 },
|
||||||
|
'zipAll': { 'start': 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
|
exports.mutate = {
|
||||||
|
'array': {
|
||||||
|
'fill': true,
|
||||||
|
'pull': true,
|
||||||
|
'pullAll': true,
|
||||||
|
'pullAllBy': true,
|
||||||
|
'pullAllWith': true,
|
||||||
|
'pullAt': true,
|
||||||
|
'remove': true,
|
||||||
|
'reverse': true
|
||||||
|
},
|
||||||
|
'object': {
|
||||||
|
'assign': true,
|
||||||
|
'assignAll': true,
|
||||||
|
'assignAllWith': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInAll': true,
|
||||||
|
'assignInAllWith': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsAll': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'defaultsDeepAll': true,
|
||||||
|
'merge': true,
|
||||||
|
'mergeAll': true,
|
||||||
|
'mergeAllWith': true,
|
||||||
|
'mergeWith': true,
|
||||||
|
},
|
||||||
|
'set': {
|
||||||
|
'set': true,
|
||||||
|
'setWith': true,
|
||||||
|
'unset': true,
|
||||||
|
'update': true,
|
||||||
|
'updateWith': true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods with placeholder support */
|
||||||
|
exports.placeholder = {
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'curry': true,
|
||||||
|
'curryRight': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map real names to their aliases. */
|
||||||
|
exports.realToAlias = (function() {
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
|
object = exports.aliasToReal,
|
||||||
|
result = {};
|
||||||
|
|
||||||
|
for (var key in object) {
|
||||||
|
var value = object[key];
|
||||||
|
if (hasOwnProperty.call(result, value)) {
|
||||||
|
result[value].push(key);
|
||||||
|
} else {
|
||||||
|
result[value] = [key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
/** Used to map method names to other names. */
|
||||||
|
exports.remap = {
|
||||||
|
'assignAll': 'assign',
|
||||||
|
'assignAllWith': 'assignWith',
|
||||||
|
'assignInAll': 'assignIn',
|
||||||
|
'assignInAllWith': 'assignInWith',
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'defaultsAll': 'defaults',
|
||||||
|
'defaultsDeepAll': 'defaultsDeep',
|
||||||
|
'findFrom': 'find',
|
||||||
|
'findIndexFrom': 'findIndex',
|
||||||
|
'findLastFrom': 'findLast',
|
||||||
|
'findLastIndexFrom': 'findLastIndex',
|
||||||
|
'getOr': 'get',
|
||||||
|
'includesFrom': 'includes',
|
||||||
|
'indexOfFrom': 'indexOf',
|
||||||
|
'invokeArgs': 'invoke',
|
||||||
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'lastIndexOfFrom': 'lastIndexOf',
|
||||||
|
'mergeAll': 'merge',
|
||||||
|
'mergeAllWith': 'mergeWith',
|
||||||
|
'padChars': 'pad',
|
||||||
|
'padCharsEnd': 'padEnd',
|
||||||
|
'padCharsStart': 'padStart',
|
||||||
|
'propertyOf': 'get',
|
||||||
|
'rangeStep': 'range',
|
||||||
|
'rangeStepRight': 'rangeRight',
|
||||||
|
'restFrom': 'rest',
|
||||||
|
'spreadFrom': 'spread',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart',
|
||||||
|
'zipAll': 'zip'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip fixing their arity. */
|
||||||
|
exports.skipFixed = {
|
||||||
|
'castArray': true,
|
||||||
|
'flow': true,
|
||||||
|
'flowRight': true,
|
||||||
|
'iteratee': true,
|
||||||
|
'mixin': true,
|
||||||
|
'rearg': true,
|
||||||
|
'runInContext': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip rearranging arguments. */
|
||||||
|
exports.skipRearg = {
|
||||||
|
'add': true,
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'concat': true,
|
||||||
|
'difference': true,
|
||||||
|
'divide': true,
|
||||||
|
'eq': true,
|
||||||
|
'gt': true,
|
||||||
|
'gte': true,
|
||||||
|
'isEqual': true,
|
||||||
|
'lt': true,
|
||||||
|
'lte': true,
|
||||||
|
'matchesProperty': true,
|
||||||
|
'merge': true,
|
||||||
|
'multiply': true,
|
||||||
|
'overArgs': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true,
|
||||||
|
'propertyOf': true,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true,
|
||||||
|
'zipObjectDeep': true
|
||||||
|
};
|
||||||
6
fp/placeholder.js
Normal file
6
fp/placeholder.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* The default argument placeholder value for methods.
|
||||||
|
*
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
module.exports = {};
|
||||||
71
lib/common/file.js
Normal file
71
lib/common/file.js
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const glob = require('glob');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const minify = require('../common/minify.js');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a [fs.copy](https://github.com/jprichardson/node-fs-extra#copy)
|
||||||
|
* function with `srcPath` and `destPath` partially applied.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} srcPath The path of the file to copy.
|
||||||
|
* @param {string} destPath The path to copy the file to.
|
||||||
|
* @returns {Function} Returns the partially applied function.
|
||||||
|
*/
|
||||||
|
function copy(srcPath, destPath) {
|
||||||
|
return _.partial(fs.copy, srcPath, destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an object of base name and compiled template pairs that match `pattern`.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} pattern The glob pattern to be match.
|
||||||
|
* @returns {Object} Returns the object of compiled templates.
|
||||||
|
*/
|
||||||
|
function globTemplate(pattern) {
|
||||||
|
return _.transform(glob.sync(pattern), (result, filePath) => {
|
||||||
|
const key = path.basename(filePath, path.extname(filePath));
|
||||||
|
result[key] = _.template(fs.readFileSync(filePath, 'utf8'));
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a `minify` function with `srcPath` and `destPath` partially applied.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} srcPath The path of the file to minify.
|
||||||
|
* @param {string} destPath The path to write the file to.
|
||||||
|
* @returns {Function} Returns the partially applied function.
|
||||||
|
*/
|
||||||
|
function min(srcPath, destPath) {
|
||||||
|
return _.partial(minify, srcPath, destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a [fs.writeFile](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback)
|
||||||
|
* function with `filePath` and `data` partially applied.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} destPath The path to write the file to.
|
||||||
|
* @param {string} data The data to write to the file.
|
||||||
|
* @returns {Function} Returns the partially applied function.
|
||||||
|
*/
|
||||||
|
function write(destPath, data) {
|
||||||
|
return _.partial(fs.writeFile, destPath, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
copy,
|
||||||
|
globTemplate,
|
||||||
|
min,
|
||||||
|
write
|
||||||
|
};
|
||||||
9
lib/common/mapping.js
Normal file
9
lib/common/mapping.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _mapping = require('../../fp/_mapping');
|
||||||
|
const util = require('./util');
|
||||||
|
const Hash = util.Hash;
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
module.exports = new Hash(_mapping);
|
||||||
39
lib/common/minify.js
Normal file
39
lib/common/minify.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const uglify = require('uglify-js');
|
||||||
|
|
||||||
|
const uglifyOptions = require('./uglify.options');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronously minifies the file at `srcPath`, writes it to `destPath`, and
|
||||||
|
* invokes `callback` upon completion. The callback is invoked with one argument:
|
||||||
|
* (error).
|
||||||
|
*
|
||||||
|
* If unspecified, `destPath` is `srcPath` with an extension of `.min.js`.
|
||||||
|
* (e.g. the `destPath` of `path/to/foo.js` would be `path/to/foo.min.js`)
|
||||||
|
*
|
||||||
|
* @param {string} srcPath The path of the file to minify.
|
||||||
|
* @param {string} [destPath] The path to write the file to.
|
||||||
|
* @param {Function} callback The function invoked upon completion.
|
||||||
|
* @param {Object} [option] The UglifyJS options object.
|
||||||
|
*/
|
||||||
|
function minify(srcPath, destPath, callback, options) {
|
||||||
|
if (_.isFunction(destPath)) {
|
||||||
|
if (_.isObject(callback)) {
|
||||||
|
options = callback;
|
||||||
|
}
|
||||||
|
callback = destPath;
|
||||||
|
destPath = undefined;
|
||||||
|
}
|
||||||
|
if (!destPath) {
|
||||||
|
destPath = srcPath.replace(/(?=\.js$)/, '.min');
|
||||||
|
}
|
||||||
|
const output = uglify.minify(srcPath, _.defaults(options || {}, uglifyOptions));
|
||||||
|
fs.writeFile(destPath, output.code, 'utf-8', callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = minify;
|
||||||
22
lib/common/uglify.options.js
Normal file
22
lib/common/uglify.options.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The UglifyJS options object for
|
||||||
|
* [compress](https://github.com/mishoo/UglifyJS2#compressor-options),
|
||||||
|
* [mangle](https://github.com/mishoo/UglifyJS2#mangler-options), and
|
||||||
|
* [output](https://github.com/mishoo/UglifyJS2#beautifier-options) options.
|
||||||
|
*/
|
||||||
|
module.exports = {
|
||||||
|
'compress': {
|
||||||
|
'collapse_vars': true,
|
||||||
|
'negate_iife': false,
|
||||||
|
'pure_getters': true,
|
||||||
|
'unsafe': true,
|
||||||
|
'warnings': false
|
||||||
|
},
|
||||||
|
'output': {
|
||||||
|
'ascii_only': true,
|
||||||
|
'comments': /@license/,
|
||||||
|
'max_line_len': 500
|
||||||
|
}
|
||||||
|
};
|
||||||
40
lib/common/util.js
Normal file
40
lib/common/util.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a hash object. If a `properties` object is provided, its own
|
||||||
|
* enumerable properties are assigned to the created hash.
|
||||||
|
*
|
||||||
|
* @memberOf util
|
||||||
|
* @param {Object} [properties] The properties to assign to the hash.
|
||||||
|
* @returns {Object} Returns the new hash object.
|
||||||
|
*/
|
||||||
|
function Hash(properties) {
|
||||||
|
return _.transform(properties, (result, value, key) => {
|
||||||
|
result[key] = (_.isPlainObject(value) && !(value instanceof Hash))
|
||||||
|
? new Hash(value)
|
||||||
|
: value;
|
||||||
|
}, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hash.prototype = Object.create(null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method throws any error it receives.
|
||||||
|
*
|
||||||
|
* @memberOf util
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
*/
|
||||||
|
function pitch(error) {
|
||||||
|
if (error != null) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
Hash,
|
||||||
|
pitch
|
||||||
|
};
|
||||||
56
lib/fp/build-dist.js
Normal file
56
lib/fp/build-dist.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const async = require('async');
|
||||||
|
const path = require('path');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
|
||||||
|
const file = require('../common/file');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
|
const distPath = path.join(basePath, 'dist');
|
||||||
|
const fpPath = path.join(basePath, 'fp');
|
||||||
|
const filename = 'lodash.fp.js';
|
||||||
|
|
||||||
|
const fpConfig = {
|
||||||
|
'entry': path.join(fpPath, '_convertBrowser.js'),
|
||||||
|
'output': {
|
||||||
|
'path': distPath,
|
||||||
|
'filename': filename,
|
||||||
|
'library': 'fp',
|
||||||
|
'libraryTarget': 'umd'
|
||||||
|
},
|
||||||
|
'plugins': [
|
||||||
|
new webpack.optimize.OccurenceOrderPlugin,
|
||||||
|
new webpack.optimize.DedupePlugin
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
const mappingConfig = {
|
||||||
|
'entry': path.join(fpPath, '_mapping.js'),
|
||||||
|
'output': {
|
||||||
|
'path': distPath,
|
||||||
|
'filename': 'mapping.fp.js',
|
||||||
|
'library': 'mapping',
|
||||||
|
'libraryTarget': 'umd'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates browser builds of the FP converter and mappings at the `target` path.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
|
function build() {
|
||||||
|
async.series([
|
||||||
|
_.partial(webpack, mappingConfig),
|
||||||
|
_.partial(webpack, fpConfig),
|
||||||
|
file.min(path.join(distPath, filename))
|
||||||
|
], util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
78
lib/fp/build-doc.js
Normal file
78
lib/fp/build-doc.js
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const file = require('../common/file');
|
||||||
|
const mapping = require('../common/mapping');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const templatePath = path.join(__dirname, 'template/doc');
|
||||||
|
const template = file.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
|
const argNames = ['a', 'b', 'c', 'd'];
|
||||||
|
|
||||||
|
const templateData = {
|
||||||
|
mapping,
|
||||||
|
toArgOrder,
|
||||||
|
toFuncList
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts arranged argument `indexes` into a named argument string
|
||||||
|
* representation of their order.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {number[]} indexes The arranged argument indexes.
|
||||||
|
* @returns {string} Returns the named argument string.
|
||||||
|
*/
|
||||||
|
function toArgOrder(indexes) {
|
||||||
|
const reordered = [];
|
||||||
|
_.each(indexes, (newIndex, index) => {
|
||||||
|
reordered[newIndex] = argNames[index];
|
||||||
|
});
|
||||||
|
return '`(' + reordered.join(', ') + ')`';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `funcNames` into a chunked list string representation.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string[]} funcNames The function names.
|
||||||
|
* @returns {string} Returns the function list string.
|
||||||
|
*/
|
||||||
|
function toFuncList(funcNames) {
|
||||||
|
let chunks = _.chunk(funcNames.slice().sort(), 5);
|
||||||
|
let lastChunk = _.last(chunks);
|
||||||
|
const lastName = lastChunk ? lastChunk.pop() : undefined;
|
||||||
|
|
||||||
|
chunks = _.reject(chunks, _.isEmpty);
|
||||||
|
lastChunk = _.last(chunks);
|
||||||
|
|
||||||
|
let result = '`' + _.map(chunks, chunk => chunk.join('`, `') + '`').join(',\n`');
|
||||||
|
if (lastName == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (_.size(chunks) > 1 || _.size(lastChunk) > 1) {
|
||||||
|
result += ',';
|
||||||
|
}
|
||||||
|
result += ' &';
|
||||||
|
result += _.size(lastChunk) < 5 ? ' ' : '\n';
|
||||||
|
return result + '`' + lastName + '`';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the FP-Guide wiki at the `target` path.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} target The output file path.
|
||||||
|
*/
|
||||||
|
function build(target) {
|
||||||
|
target = path.resolve(target);
|
||||||
|
fs.writeFile(target, template.wiki(templateData), util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
150
lib/fp/build-modules.js
Normal file
150
lib/fp/build-modules.js
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const async = require('async');
|
||||||
|
const glob = require('glob');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const file = require('../common/file');
|
||||||
|
const mapping = require('../common/mapping');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const templatePath = path.join(__dirname, 'template/modules');
|
||||||
|
const template = file.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
|
const aryMethods = _.union(
|
||||||
|
mapping.aryMethod[1],
|
||||||
|
mapping.aryMethod[2],
|
||||||
|
mapping.aryMethod[3],
|
||||||
|
mapping.aryMethod[4]
|
||||||
|
);
|
||||||
|
|
||||||
|
const categories = [
|
||||||
|
'array',
|
||||||
|
'collection',
|
||||||
|
'date',
|
||||||
|
'function',
|
||||||
|
'lang',
|
||||||
|
'math',
|
||||||
|
'number',
|
||||||
|
'object',
|
||||||
|
'seq',
|
||||||
|
'string',
|
||||||
|
'util'
|
||||||
|
];
|
||||||
|
|
||||||
|
const ignored = [
|
||||||
|
'_*.js',
|
||||||
|
'core.js',
|
||||||
|
'core.min.js',
|
||||||
|
'fp.js',
|
||||||
|
'index.js',
|
||||||
|
'lodash.js',
|
||||||
|
'lodash.min.js'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `name` is a method alias.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name to check.
|
||||||
|
* @returns {boolean} Returns `true` if `name` is a method alias, else `false`.
|
||||||
|
*/
|
||||||
|
function isAlias(name) {
|
||||||
|
return _.has(mapping.aliasToReal, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `name` is a category name.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name to check.
|
||||||
|
* @returns {boolean} Returns `true` if `name` is a category name, else `false`.
|
||||||
|
*/
|
||||||
|
function isCategory(name) {
|
||||||
|
return _.includes(categories, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `name` belongs to a method that's passed thru and not wrapped.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name to check.
|
||||||
|
* @returns {boolean} Returns `true` if `name` is of a pass thru method,
|
||||||
|
* else `false`.
|
||||||
|
*/
|
||||||
|
function isThru(name) {
|
||||||
|
return !_.includes(aryMethods, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets metadata for `func`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to query.
|
||||||
|
* @returns {*} Returns the metadata for `func`.
|
||||||
|
*/
|
||||||
|
function getTemplate(moduleName) {
|
||||||
|
const data = {
|
||||||
|
'name': _.get(mapping.aliasToReal, moduleName, moduleName),
|
||||||
|
'mapping': mapping
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isAlias(moduleName)) {
|
||||||
|
return template.alias(data);
|
||||||
|
}
|
||||||
|
if (isCategory(moduleName)) {
|
||||||
|
return template.category(data);
|
||||||
|
}
|
||||||
|
if (isThru(moduleName)) {
|
||||||
|
return template.thru(data);
|
||||||
|
}
|
||||||
|
return template.module(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates FP modules at the `target` path.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
|
function build(target) {
|
||||||
|
target = path.resolve(target);
|
||||||
|
|
||||||
|
const fpPath = path.join(target, 'fp');
|
||||||
|
|
||||||
|
// Glob existing lodash module paths.
|
||||||
|
const modulePaths = glob.sync(path.join(target, '*.js'), {
|
||||||
|
'nodir': true,
|
||||||
|
'ignore': ignored.map(filename => {
|
||||||
|
return path.join(target, filename);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add FP alias and remapped module paths.
|
||||||
|
_.each([mapping.aliasToReal, mapping.remap], data => {
|
||||||
|
_.forOwn(data, (realName, alias) => {
|
||||||
|
const modulePath = path.join(target, alias + '.js');
|
||||||
|
if (!_.includes(modulePaths, modulePath)) {
|
||||||
|
modulePaths.push(modulePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const actions = modulePaths.map(modulePath => {
|
||||||
|
const moduleName = path.basename(modulePath, '.js');
|
||||||
|
return file.write(path.join(fpPath, moduleName + '.js'), getTemplate(moduleName));
|
||||||
|
});
|
||||||
|
|
||||||
|
actions.unshift(file.copy(path.join(__dirname, '../../fp'), fpPath));
|
||||||
|
actions.push(file.write(path.join(fpPath, '_falseOptions.js'), template._falseOptions()));
|
||||||
|
actions.push(file.write(path.join(fpPath, '_util.js'), template._util()));
|
||||||
|
actions.push(file.write(path.join(target, 'fp.js'), template.fp()));
|
||||||
|
actions.push(file.write(path.join(fpPath, 'convert.js'), template.convert()));
|
||||||
|
|
||||||
|
async.series(actions, util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
226
lib/fp/template/doc/wiki.jst
Normal file
226
lib/fp/template/doc/wiki.jst
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
## lodash/fp
|
||||||
|
|
||||||
|
The `lodash/fp` module promotes a more
|
||||||
|
[functional programming](https://en.wikipedia.org/wiki/Functional_programming)
|
||||||
|
(FP) friendly style by exporting an instance of `lodash` with its methods wrapped
|
||||||
|
to produce immutable auto-curried iteratee-first data-last methods.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
In a browser:
|
||||||
|
```html
|
||||||
|
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
|
||||||
|
<script>
|
||||||
|
// Loading `lodash.fp.js` converts `_` to its fp variant.
|
||||||
|
_.defaults({ 'a': 2, 'b': 2 })({ 'a': 1 });
|
||||||
|
// ➜ { 'a': 1, 'b': 2 }
|
||||||
|
|
||||||
|
// Use `noConflict` to restore the pre-fp variant.
|
||||||
|
var fp = _.noConflict();
|
||||||
|
|
||||||
|
_.defaults({ 'a': 1 }, { 'a': 2, 'b': 2 });
|
||||||
|
// ➜ { 'a': 1, 'b': 2 }
|
||||||
|
fp.defaults({ 'a': 2, 'b': 2 })({ 'a': 1 });
|
||||||
|
// ➜ { 'a': 1, 'b': 2 }
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
In Node.js:
|
||||||
|
```js
|
||||||
|
// Load the fp build.
|
||||||
|
var fp = require('lodash/fp');
|
||||||
|
|
||||||
|
// Load a method category.
|
||||||
|
var object = require('lodash/fp/object');
|
||||||
|
|
||||||
|
// Load a single method for smaller builds with browserify/rollup/webpack.
|
||||||
|
var extend = require('lodash/fp/extend');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Mapping
|
||||||
|
|
||||||
|
Immutable auto-curried iteratee-first data-last methods sound great, but what
|
||||||
|
does that really mean for each method? Below is a breakdown of the mapping used
|
||||||
|
to convert each method.
|
||||||
|
|
||||||
|
#### Capped Iteratee Arguments
|
||||||
|
|
||||||
|
Iteratee arguments are capped to avoid gotchas with variadic iteratees.
|
||||||
|
```js
|
||||||
|
// The `lodash/map` iteratee receives three arguments:
|
||||||
|
// (value, index|key, collection)
|
||||||
|
_.map(['6', '8', '10'], parseInt);
|
||||||
|
// ➜ [6, NaN, 2]
|
||||||
|
|
||||||
|
// The `lodash/fp/map` iteratee is capped at one argument:
|
||||||
|
// (value)
|
||||||
|
fp.map(parseInt)(['6', '8', '10']);
|
||||||
|
// ➜ [6, 8, 10]
|
||||||
|
```
|
||||||
|
|
||||||
|
Methods that cap iteratees to one argument:<br>
|
||||||
|
<%= toFuncList(_.keys(_.pickBy(mapping.iterateeAry, _.partial(_.eq, _, 1)))) %>
|
||||||
|
|
||||||
|
Methods that cap iteratees to two arguments:<br>
|
||||||
|
<%= toFuncList(_.keys(_.pickBy(mapping.iterateeAry, _.partial(_.eq, _, 2)))) %>
|
||||||
|
|
||||||
|
The iteratee of `mapKeys` is invoked with one argument: (key)
|
||||||
|
|
||||||
|
#### Fixed Arity
|
||||||
|
|
||||||
|
Methods have fixed arities to support auto-currying.
|
||||||
|
```js
|
||||||
|
// `lodash/padStart` accepts an optional `chars` param.
|
||||||
|
_.padStart('a', 3, '-')
|
||||||
|
// ➜ '--a'
|
||||||
|
|
||||||
|
// `lodash/fp/padStart` does not.
|
||||||
|
fp.padStart(3)('a');
|
||||||
|
// ➜ ' a'
|
||||||
|
fp.padCharsStart('-')(3)('a');
|
||||||
|
// ➜ '--a'
|
||||||
|
```
|
||||||
|
|
||||||
|
Methods with a fixed arity of one:<br>
|
||||||
|
<%= toFuncList(_.difference(mapping.aryMethod[1], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of two:<br>
|
||||||
|
<%= toFuncList(_.difference(mapping.aryMethod[2], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of three:<br>
|
||||||
|
<%= toFuncList(_.difference(mapping.aryMethod[3], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of four:<br>
|
||||||
|
<%= toFuncList(_.difference(mapping.aryMethod[4], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
|
#### Rearranged Arguments
|
||||||
|
|
||||||
|
Method arguments are rearranged to make composition easier.
|
||||||
|
```js
|
||||||
|
// `lodash/filter` is data-first iteratee-last:
|
||||||
|
// (collection, iteratee)
|
||||||
|
var compact = _.partial(_.filter, _, Boolean);
|
||||||
|
compact(['a', null, 'c']);
|
||||||
|
// ➜ ['a', 'c']
|
||||||
|
|
||||||
|
// `lodash/fp/filter` is iteratee-first data-last:
|
||||||
|
// (iteratee, collection)
|
||||||
|
var compact = fp.filter(Boolean);
|
||||||
|
compact(['a', null, 'c']);
|
||||||
|
// ➜ ['a', 'c']
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Most methods follow these rules
|
||||||
|
|
||||||
|
A fixed arity of two has an argument order of:<br>
|
||||||
|
<%= toArgOrder(mapping.aryRearg[2]) %>
|
||||||
|
|
||||||
|
A fixed arity of three has an argument order of:<br>
|
||||||
|
<%= toArgOrder(mapping.aryRearg[3]) %>
|
||||||
|
|
||||||
|
A fixed arity of four has an argument order of:<br>
|
||||||
|
<%= toArgOrder(mapping.aryRearg[4]) %>
|
||||||
|
|
||||||
|
##### Exceptions to the rules
|
||||||
|
|
||||||
|
Methods that accept an array as their last or only argument:<br>
|
||||||
|
<%= toFuncList(_.keys(mapping.methodSpread)) %>
|
||||||
|
|
||||||
|
Methods with unchanged argument orders:<br>
|
||||||
|
<%= toFuncList(_.keys(mapping.skipRearg)) %>
|
||||||
|
|
||||||
|
Methods with custom argument orders:<br>
|
||||||
|
<%= _.map(_.keys(mapping.methodRearg), methodName => {
|
||||||
|
const orders = mapping.methodRearg[methodName];
|
||||||
|
return ' * `_.' + methodName + '` has an order of ' + toArgOrder(orders);
|
||||||
|
}).join('\n') %>
|
||||||
|
|
||||||
|
#### New Methods
|
||||||
|
|
||||||
|
Not all variadic methods have corresponding new method variants. Feel free to
|
||||||
|
[request](https://github.com/lodash/lodash/blob/master/.github/CONTRIBUTING.md#feature-requests)
|
||||||
|
any additions.
|
||||||
|
|
||||||
|
Methods created to accommodate Lodash’s variadic methods:<br>
|
||||||
|
<%= toFuncList(_.keys(mapping.remap)) %>
|
||||||
|
|
||||||
|
#### Aliases
|
||||||
|
|
||||||
|
There are <%= _.size(mapping.aliasToReal) %> method aliases:<br>
|
||||||
|
<%= _.map(_.keys(mapping.aliasToReal).sort(), alias => {
|
||||||
|
const realName = mapping.aliasToReal[alias];
|
||||||
|
return ' * `_.' + alias + '` is an alias of `_.' + realName + '`';
|
||||||
|
}).join('\n') %>
|
||||||
|
|
||||||
|
## Placeholders
|
||||||
|
|
||||||
|
The placeholder argument, which defaults to `_`, may be used to fill in method
|
||||||
|
arguments in a different order. Placeholders are filled by the first available
|
||||||
|
arguments of the curried returned function.
|
||||||
|
```js
|
||||||
|
// The equivalent of `2 > 5`.
|
||||||
|
_.gt(2)(5);
|
||||||
|
// ➜ false
|
||||||
|
|
||||||
|
// The equivalent of `_.gt(5, 2)` or `5 > 2`.
|
||||||
|
_.gt(_, 2)(5);
|
||||||
|
// ➜ true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Chaining
|
||||||
|
|
||||||
|
The `lodash/fp` module **does not** convert chain sequence methods. See
|
||||||
|
[Izaak Schroeder’s article](https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba)
|
||||||
|
on using functional composition as an alternative to method chaining.
|
||||||
|
|
||||||
|
## Convert
|
||||||
|
|
||||||
|
Although `lodash/fp` & its method modules come pre-converted, there are times
|
||||||
|
when you may want to customize the conversion. That’s when the `convert` method
|
||||||
|
comes in handy.
|
||||||
|
```js
|
||||||
|
// Every option is `true` by default.
|
||||||
|
var _fp = fp.convert({
|
||||||
|
// Specify capping iteratee arguments.
|
||||||
|
'cap': true,
|
||||||
|
// Specify currying.
|
||||||
|
'curry': true,
|
||||||
|
// Specify fixed arity.
|
||||||
|
'fixed': true,
|
||||||
|
// Specify immutable operations.
|
||||||
|
'immutable': true,
|
||||||
|
// Specify rearranging arguments.
|
||||||
|
'rearg': true
|
||||||
|
});
|
||||||
|
|
||||||
|
// The `convert` method is available on each method too.
|
||||||
|
var mapValuesWithKey = fp.mapValues.convert({ 'cap': false });
|
||||||
|
|
||||||
|
// Here’s an example of disabling iteratee argument caps to access the `key` param.
|
||||||
|
mapValuesWithKey(function(value, key) {
|
||||||
|
return key == 'a' ? -1 : value;
|
||||||
|
})({ 'a': 1, 'b': 1 });
|
||||||
|
// => { 'a': -1, 'b': 1 }
|
||||||
|
```
|
||||||
|
|
||||||
|
Manual conversions are also possible with the `convert` module.
|
||||||
|
```js
|
||||||
|
var convert = require('lodash/fp/convert');
|
||||||
|
|
||||||
|
// Convert by name.
|
||||||
|
var assign = convert('assign', require('lodash.assign'));
|
||||||
|
|
||||||
|
// Convert by object.
|
||||||
|
var fp = convert({
|
||||||
|
'assign': require('lodash.assign'),
|
||||||
|
'chunk': require('lodash.chunk')
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert by `lodash` instance.
|
||||||
|
var fp = convert(lodash.runInContext());
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tooling
|
||||||
|
|
||||||
|
Use [eslint-plugin-lodash-fp](https://www.npmjs.com/package/eslint-plugin-lodash-fp)
|
||||||
|
to help use `lodash/fp` more efficiently.
|
||||||
7
lib/fp/template/modules/_falseOptions.jst
Normal file
7
lib/fp/template/modules/_falseOptions.jst
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
'cap': false,
|
||||||
|
'curry': false,
|
||||||
|
'fixed': false,
|
||||||
|
'immutable': false,
|
||||||
|
'rearg': false
|
||||||
|
};
|
||||||
14
lib/fp/template/modules/_util.jst
Normal file
14
lib/fp/template/modules/_util.jst
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module.exports = {
|
||||||
|
'ary': require('../ary'),
|
||||||
|
'assign': require('../_baseAssign'),
|
||||||
|
'clone': require('../clone'),
|
||||||
|
'curry': require('../curry'),
|
||||||
|
'forEach': require('../_arrayEach'),
|
||||||
|
'isArray': require('../isArray'),
|
||||||
|
'isFunction': require('../isFunction'),
|
||||||
|
'iteratee': require('../iteratee'),
|
||||||
|
'keys': require('../_baseKeys'),
|
||||||
|
'rearg': require('../rearg'),
|
||||||
|
'toInteger': require('../toInteger'),
|
||||||
|
'toPath': require('../toPath')
|
||||||
|
};
|
||||||
1
lib/fp/template/modules/alias.jst
Normal file
1
lib/fp/template/modules/alias.jst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = require('./<%= name %>');
|
||||||
2
lib/fp/template/modules/category.jst
Normal file
2
lib/fp/template/modules/category.jst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
var convert = require('./convert');
|
||||||
|
module.exports = convert(require('../<%= name %>'));
|
||||||
18
lib/fp/template/modules/convert.jst
Normal file
18
lib/fp/template/modules/convert.jst
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
var baseConvert = require('./_baseConvert'),
|
||||||
|
util = require('./_util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `func` of `name` to an immutable auto-curried iteratee-first data-last
|
||||||
|
* version with conversion `options` applied. If `name` is an object its methods
|
||||||
|
* will be converted.
|
||||||
|
*
|
||||||
|
* @param {string} name The name of the function to wrap.
|
||||||
|
* @param {Function} [func] The function to wrap.
|
||||||
|
* @param {Object} [options] The options object. See `baseConvert` for more details.
|
||||||
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
|
*/
|
||||||
|
function convert(name, func, options) {
|
||||||
|
return baseConvert(util, name, func, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = convert;
|
||||||
2
lib/fp/template/modules/fp.jst
Normal file
2
lib/fp/template/modules/fp.jst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
var _ = require('./lodash.min').runInContext();
|
||||||
|
module.exports = require('./fp/_baseConvert')(_, _);
|
||||||
5
lib/fp/template/modules/module.jst
Normal file
5
lib/fp/template/modules/module.jst
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
var convert = require('./convert'),
|
||||||
|
func = convert('<%= name %>', require('../<%= _.get(mapping.remap, name, name) %>'));
|
||||||
|
|
||||||
|
func.placeholder = require('./placeholder');
|
||||||
|
module.exports = func;
|
||||||
5
lib/fp/template/modules/thru.jst
Normal file
5
lib/fp/template/modules/thru.jst
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
var convert = require('./convert'),
|
||||||
|
func = convert('<%= name %>', require('../<%= _.get(mapping.remap, name, name) %>'), require('./_falseOptions'));
|
||||||
|
|
||||||
|
func.placeholder = require('./placeholder');
|
||||||
|
module.exports = func;
|
||||||
31
lib/main/build-dist.js
Normal file
31
lib/main/build-dist.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const async = require('async');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const file = require('../common/file');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
|
const distPath = path.join(basePath, 'dist');
|
||||||
|
const filename = 'lodash.js';
|
||||||
|
|
||||||
|
const baseLodash = path.join(basePath, filename);
|
||||||
|
const distLodash = path.join(distPath, filename);
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates browser builds of Lodash at the `target` path.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
|
function build() {
|
||||||
|
async.series([
|
||||||
|
file.copy(baseLodash, distLodash),
|
||||||
|
file.min(distLodash)
|
||||||
|
], util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
83
lib/main/build-doc.js
Normal file
83
lib/main/build-doc.js
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const docdown = require('docdown');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
|
const docPath = path.join(basePath, 'doc');
|
||||||
|
const readmePath = path.join(docPath, 'README.md');
|
||||||
|
|
||||||
|
const pkg = require('../../package.json');
|
||||||
|
const version = pkg.version;
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
'base': {
|
||||||
|
'path': path.join(basePath, 'lodash.js'),
|
||||||
|
'title': `<a href="https://lodash.com/">lodash</a> <span>v${ version }</span>`,
|
||||||
|
'toc': 'categories',
|
||||||
|
'url': `https://github.com/lodash/lodash/blob/${ version }/lodash.js`
|
||||||
|
},
|
||||||
|
'github': {
|
||||||
|
'style': 'github',
|
||||||
|
'sublinks': [npmLink('Ⓝ', 'See the npm package')]
|
||||||
|
},
|
||||||
|
'site': {
|
||||||
|
'entryLink': '<a href="${entryHref}" class="fa fa-link"></a>',
|
||||||
|
'sourceLink': '[source](${sourceHref})',
|
||||||
|
'tocHref': '',
|
||||||
|
'tocLink': '',
|
||||||
|
'sublinks': [npmLink('npm package')]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composes a npm link from `text` and optional `title`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} text The link text.
|
||||||
|
* @param {string} [title] The link title.
|
||||||
|
* @returns {string} Returns the composed npm link.
|
||||||
|
*/
|
||||||
|
function npmLink(text, title) {
|
||||||
|
return (
|
||||||
|
'<% if (name == "templateSettings" || !/^(?:methods|properties|seq)$/i.test(category)) {' +
|
||||||
|
'print(' +
|
||||||
|
'"[' + text + '](https://www.npmjs.com/package/lodash." + name.toLowerCase() + ' +
|
||||||
|
'"' + (title == null ? '' : ' \\"' + title + '\\"') + ')"' +
|
||||||
|
');' +
|
||||||
|
'} %>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post-process `markdown` to make adjustments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} markdown The markdown to process.
|
||||||
|
* @returns {string} Returns the processed markdown.
|
||||||
|
*/
|
||||||
|
function postprocess(markdown) {
|
||||||
|
// Wrap symbol property identifiers in brackets.
|
||||||
|
return markdown.replace(/\.(Symbol\.(?:[a-z]+[A-Z]?)+)/g, '[$1]');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the documentation markdown formatted for 'github' or 'site'.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} type The format type.
|
||||||
|
*/
|
||||||
|
function build(type) {
|
||||||
|
const options = _.defaults({}, config.base, config[type]);
|
||||||
|
const markdown = docdown(options);
|
||||||
|
|
||||||
|
fs.writeFile(readmePath, postprocess(markdown), util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
34
lib/main/build-modules.js
Normal file
34
lib/main/build-modules.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const async = require('async');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const file = require('../common/file');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
|
const distPath = path.join(basePath, 'dist');
|
||||||
|
|
||||||
|
const filePairs = [
|
||||||
|
[path.join(distPath, 'lodash.core.js'), 'core.js'],
|
||||||
|
[path.join(distPath, 'lodash.core.min.js'), 'core.min.js'],
|
||||||
|
[path.join(distPath, 'lodash.min.js'), 'lodash.min.js']
|
||||||
|
];
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates supplementary Lodash modules at the `target` path.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
|
function build(target) {
|
||||||
|
const actions = _.map(filePairs, pair =>
|
||||||
|
file.copy(pair[0], path.join(target, pair[1])));
|
||||||
|
|
||||||
|
async.series(actions, util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
216
lib/main/build-site.js
Normal file
216
lib/main/build-site.js
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const cheerio = require('cheerio');
|
||||||
|
const fs = require('fs');
|
||||||
|
const marky = require('marky-markdown');
|
||||||
|
const path = require('path');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
|
const docPath = path.join(basePath, 'doc');
|
||||||
|
const readmePath = path.join(docPath, 'README.md');
|
||||||
|
|
||||||
|
const highlights = {
|
||||||
|
'html': [
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'js': [
|
||||||
|
'comment',
|
||||||
|
'console',
|
||||||
|
'delimiter',
|
||||||
|
'method',
|
||||||
|
'modifier',
|
||||||
|
'name',
|
||||||
|
'numeric',
|
||||||
|
'string',
|
||||||
|
'support',
|
||||||
|
'type'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
const exts = _.keys(highlights);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts Lodash method references into documentation links.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function autoLink($) {
|
||||||
|
$('.doc-container code').each(function() {
|
||||||
|
const $code = $(this);
|
||||||
|
const html = $code.html();
|
||||||
|
if (/^_\.\w+$/.test(html)) {
|
||||||
|
const id = html.split('.')[1];
|
||||||
|
$code.replaceWith(`<a href="#${ id }"><code>_.${ id }</code></a>`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes horizontal rules from the document.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function removeHorizontalRules($) {
|
||||||
|
$('hr').remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes marky-markdown specific ids and class names.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function removeMarkyAttributes($) {
|
||||||
|
$('[id^="user-content-"]')
|
||||||
|
.attr('class', null)
|
||||||
|
.attr('id', null);
|
||||||
|
|
||||||
|
$(':header:not(h3) > a').each(function() {
|
||||||
|
const $a = $(this);
|
||||||
|
$a.replaceWith($a.html());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renames "_" id and anchor references to "lodash".
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function renameLodashId($) {
|
||||||
|
$('#_').attr('id', 'lodash');
|
||||||
|
$('[href="#_"]').attr('href', '#lodash');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repairs broken marky-markdown headers.
|
||||||
|
* See https://github.com/npm/marky-markdown/issues/217 for more details.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function repairMarkyHeaders($) {
|
||||||
|
$('p:empty + h3').prev().remove();
|
||||||
|
|
||||||
|
$('h3 ~ p:empty').each(function() {
|
||||||
|
const $p = $(this);
|
||||||
|
let node = this.prev;
|
||||||
|
while ((node = node.prev) && node.name != 'h3' && node.name != 'p') {
|
||||||
|
$p.prepend(node.next);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('h3 code em').parent().each(function() {
|
||||||
|
const $code = $(this);
|
||||||
|
$code.html($code.html().replace(/<\/?em>/g, '_'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up highlights blocks by removing extraneous class names and elements.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function tidyHighlights($) {
|
||||||
|
$('.highlight').each(function() {
|
||||||
|
let $spans;
|
||||||
|
const $parent = $(this);
|
||||||
|
const classes = $parent.find('.source,.text').first().attr('class').split(' ');
|
||||||
|
const ext = _(classes).intersection(exts).last();
|
||||||
|
|
||||||
|
$parent.addClass(ext);
|
||||||
|
|
||||||
|
// Remove line indicators for single line snippets.
|
||||||
|
$parent.children('pre').each(function() {
|
||||||
|
const $divs = $(this).children('div');
|
||||||
|
if ($divs.length == 1) {
|
||||||
|
$divs.replaceWith($divs.html());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Remove extraneous class names.
|
||||||
|
$parent.find('[class]').each(function() {
|
||||||
|
const $element = $(this);
|
||||||
|
const classes = $element.attr('class').split(' ');
|
||||||
|
const attr = _(classes).intersection(highlights[ext]).join(' ');
|
||||||
|
$element.attr('class', attr || null);
|
||||||
|
});
|
||||||
|
// Collapse nested comment highlights.
|
||||||
|
$parent.find(`[class~="comment"]`).each(function() {
|
||||||
|
const $element = $(this);
|
||||||
|
$element.text($element.text().trim());
|
||||||
|
});
|
||||||
|
// Collapse nested string highlights.
|
||||||
|
$parent.find(`[class~="string"]`).each(function() {
|
||||||
|
const $element = $(this);
|
||||||
|
$element.text($element.text());
|
||||||
|
});
|
||||||
|
// Collapse nested spans.
|
||||||
|
while (($spans = $parent.find('span:not([class])')).length) {
|
||||||
|
$spans.each(function() {
|
||||||
|
let $span = $(this);
|
||||||
|
while ($span[0] && $span[0].name == 'span' && !$span.attr('class')) {
|
||||||
|
const $parent = $span.parent();
|
||||||
|
$span.replaceWith($span.html());
|
||||||
|
$span = $parent;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the documentation HTML.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function build() {
|
||||||
|
const markdown = fs
|
||||||
|
// Load markdown.
|
||||||
|
.readFileSync(readmePath, 'utf8')
|
||||||
|
// Uncomment docdown HTML hints.
|
||||||
|
.replace(/(<)!--\s*|\s*--(>)/g, '$1$2');
|
||||||
|
|
||||||
|
const $ = cheerio.load(marky(markdown, { 'sanitize': false }));
|
||||||
|
const $header = $('h1').first().remove();
|
||||||
|
const version = $header.find('span').first().text().trim().slice(1);
|
||||||
|
|
||||||
|
// Auto-link Lodash method references.
|
||||||
|
autoLink($);
|
||||||
|
// Rename "_" id references to "lodash".
|
||||||
|
renameLodashId($);
|
||||||
|
// Remove docdown horizontal rules.
|
||||||
|
removeHorizontalRules($);
|
||||||
|
// Remove marky-markdown attribute additions.
|
||||||
|
removeMarkyAttributes($);
|
||||||
|
// Repair marky-markdown wrapping around headers.
|
||||||
|
repairMarkyHeaders($);
|
||||||
|
// Cleanup highlights.
|
||||||
|
tidyHighlights($);
|
||||||
|
|
||||||
|
const html = [
|
||||||
|
// Append YAML front matter.
|
||||||
|
'---',
|
||||||
|
'id: docs',
|
||||||
|
'layout: docs',
|
||||||
|
'title: Lodash Documentation',
|
||||||
|
'version: ' + (version || null),
|
||||||
|
'---',
|
||||||
|
'',
|
||||||
|
// Wrap in raw tags to avoid Liquid template tag processing.
|
||||||
|
'{% raw %}',
|
||||||
|
$.html().trim(),
|
||||||
|
'{% endraw %}',
|
||||||
|
''
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
|
fs.writeFile(path.join(docPath, version + '.html'), html, util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
32
lodash.min.js
vendored
32
lodash.min.js
vendored
@@ -1,32 +0,0 @@
|
|||||||
/*!
|
|
||||||
Lo-Dash 0.3.0 lodash.com/license
|
|
||||||
Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE
|
|
||||||
*/
|
|
||||||
;(function(e,t){"use strict";function s(e){return"[object Arguments]"==nt.call(e)}function o(e){return new u(e)}function u(e){if(e&&e._wrapped)return e;this._wrapped=e}function a(){for(var e,t,s,o=-1,u=arguments.length,a={e:"",f:"",k:"",q:"",c:{d:"",m:"++k<m"},o:{d:""}};++o<u;)for(t in e=arguments[o],e)s=(s=e[t])==r?"":s,/d|m|j/.test(t)?("string"==typeof s&&(s={b:s,n:s}),a.c[t]=s.b,a.o[t]=s.n):a[t]=s;e=a.a,t=a.c,s=a.o;var o=/^[^,]+/.exec(e)[0],u=s.m,f=/\S+$/.exec(u||o)[0];a.g=o,a.i=O,a.h="i.call("+
|
|
||||||
f+",k)",a.l=f,a.p=j,a.r=a.r!==i,a.f||(a.f="if(!"+o+")return r");if("n"==o||!t.j)a.c=r;return u||(s.m="k in "+f),Function("b,h,i,j,l,o,v,y,z,g,A",'"use strict";return function('+e+"){"+ft(a)+"}")(z,V,Z,k,h,R,K,nt,n,i)}function f(e,t){return I[t]}function l(e){return"\\"+U[e]}function c(e){return q[e]}function h(e,t){return function(n,r,i){return e.call(t,n,r,i)}}function p(){}function d(e,t){var n=I.length;return I[n]="'+((__t=("+t+"))==null?'':_.escape(__t))+'",F+n}function v(e,t){var n=I.length;
|
|
||||||
return I[n]="'+((__t=("+t+"))==null?'':__t)+'",F+n}function m(e,t){var n=I.length;return I[n]="';"+t+";__p+='",F+n}function g(e,t,n,r){if(!e)return n;var i=e.length,s=3>arguments.length;r&&(t=h(t,r));if(i===i>>>0){for(i&&s&&(n=e[--i]);i--;)n=t(n,e[i],i,e);return n}var o=Lt(e);for((i=o.length)&&s&&(n=e[o[--i]]);i--;)s=o[i],n=t(n,e[s],s,e);return n}function y(e,n,r){return n==t||r?e[0]:tt.call(e,0,n)}function b(e,t){for(var n,r=-1,i=e.length,s=[];++r<i;)n=e[r],kt(n)?et.apply(s,t?n:b(n)):s.push(n);return s
|
|
||||||
}function w(e,t,n){var r=-1,i=e.length;if(n){if("number"!=typeof n)return r=x(e,t),e[r]===t?r:-1;r=(0>n?Math.max(0,i+n):n)-1}for(;++r<i;)if(e[r]===t)return r;return-1}function E(e,t,n){var r=-Infinity,i=-1,s=e.length,o=r;if(!t){for(;++i<s;)e[i]>o&&(o=e[i]);return o}for(n&&(t=h(t,n));++i<s;)n=t(e[i],i,e),n>r&&(r=n,o=e[i]);return o}function S(e,n,r){return tt.call(e,n==t||r?1:n)}function x(e,t,n,r){var i,s=0,o=e.length;if(n)for(t=n.call(r,t);s<o;)i=s+o>>>1,n.call(r,e[i])<t?s=i+1:o=i;else for(;s<o;)
|
|
||||||
i=s+o>>>1,e[i]<t?s=i+1:o=i;return s}function T(e,t,n,r){var s=-1,o=e.length,u=[],a=[];"function"==typeof t&&(r=n,n=t,t=i);for(n?r&&(n=h(n,r)):n=k;++s<o;)if(r=n(e[s],s,e),t?!s||a[a.length-1]!==r:0>w(a,r))a.push(r),u.push(e[s]);return u}function N(e,t){function n(){var u=arguments,a=t;return s||(e=t[i]),o.length&&(u=u.length?Y.apply(o,u):o),this instanceof n?(p.prototype=e.prototype,a=new p,u=e.apply(a,u),R[typeof u]&&u!==r?u:a):e.apply(a,u)}var i,s=nt.call(e)==V;if(s){if(rt)return rt.call.apply(rt
|
|
||||||
,arguments)}else i=t,t=e;var o=tt.call(arguments,2);return n}function C(e,r,s){s||(s=[]);if(e===r)return 0!==e||1/e==1/r;if(e==t||r==t)return e===r;e._chain&&(e=e._wrapped),r._chain&&(r=r._wrapped);if(e.isEqual&&nt.call(e.isEqual)==V)return e.isEqual(r);if(r.isEqual&&nt.call(r.isEqual)==V)return r.isEqual(e);var o=nt.call(e);if(o!=nt.call(r))return i;switch(o){case K:return e==""+r;case $:return e!=+e?r!=+r:0==e?1/e==1/r:e==+r;case W:case X:return+e==+r;case J:return e.source==r.source&&e.global==
|
|
||||||
r.global&&e.multiline==r.multiline&&e.ignoreCase==r.ignoreCase}if("object"!=typeof e||"object"!=typeof r)return i;for(var u=s.length;u--;)if(s[u]==e)return n;var u=-1,a=n,f=0;s.push(e);if(o==z){if(f=e.length,a=f==r.length)for(;f--&&(a=C(e[f],r[f],s)););}else{if("constructor"in e!="constructor"in r||e.constructor!=r.constructor)return i;for(var l in e)if(Z.call(e,l)&&(f++,!(a=Z.call(r,l)&&C(e[l],r[l],s))))break;if(a){for(l in r)if(Z.call(r,l)&&!(f--))break;a=!f}if(a&&O)for(;7>++u&&(l=j[u],!Z.call(
|
|
||||||
e,l)||!!(a=Z.call(r,l)&&C(e[l],r[l],s))););}return s.pop(),a}function k(e){return e}function L(e){wt(Ct(e),function(t){var r=o[t]=e[t];u.prototype[t]=function(){var e=[this._wrapped];return arguments.length&&et.apply(e,arguments),e=1==e.length?r.call(o,e[0]):r.apply(o,e),this._chain&&(e=new u(e),e._chain=n),e}})}var n=!0,r=null,i=!1,A="object"==typeof exports&&exports&&("object"==typeof global&&global&&global==global.global&&(e=global),exports),O=!{valueOf:0}.propertyIsEnumerable("valueOf"),M=0,_=
|
|
||||||
e._,D=RegExp("^"+({}.valueOf+"").replace(/[.*+?^=!:${}()|[\]\/\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),P=/__token__(\d+)/g,H=/[&<"']/g,B=/['\n\r\t\u2028\u2029\\]/g,j="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),F="__token__",I=[],q={"&":"&","<":"<",'"':""","'":"'"},R={"boolean":i,"function":n,object:n,number:i,string:i,"undefined":i},U={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029"
|
|
||||||
:"u2029"},z="[object Array]",W="[object Boolean]",X="[object Date]",V="[object Function]",$="[object Number]",J="[object RegExp]",K="[object String]",Q=Array.prototype,G=Object.prototype,Y=Q.concat,Z=G.hasOwnProperty,et=Q.push,tt=Q.slice,nt=G.toString,rt=D.test(rt=tt.bind)&&/\n|Opera/.test(rt+nt.call(e.opera))&&rt,it=D.test(it=Array.isArray)&&it,st=e.isFinite,ot=D.test(ot=Object.keys)&&ot,ut=e.clearTimeout,at=e.setTimeout;o.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate
|
|
||||||
:/<%=([\s\S]+?)%>/g,variable:"obj"};var ft=Function("obj","var __p;with(obj){__p='var k,r';if(k){__p+='='+k};__p+=';'+f+';'+q+';';if(c){__p+='var m='+g+'.length;k=-1;';if(o){__p+='if(m===m>>>0){'};__p+=''+c['d']+';while('+c['m']+'){'+c['j']+'}';if(o){__p+='}'}}if(o){if(c){__p+='else{'}if(!i){__p+='var s=typeof '+l+'==\\'function\\';'};__p+=''+o['d']+';for('+o['m']+'){';if(i){if(r){__p+='if('+h+'){'};__p+=''+o['j']+';';if(r){__p+='}'}}else{__p+='if(!(s&&k==\\'prototype\\')';if(r){__p+='&&'+h};__p+='){'+o['j']+'}'};__p+='}';if(i){__p+='var f='+l+'.constructor;';for(var k=0;k<7;k++){__p+='k=\\''+p[k]+'\\';if(';if(p[k]=='constructor'){__p+='!(f&&f.prototype==='+l+')&&'};__p+=''+h+'){'+o['j']+'}'}}if(c){__p+='}'}};__p+=''+e+';return r'}return __p"
|
|
||||||
),lt={a:"e,c,x",k:"e",q:"if(!c){c=j}else if(x){c=l(c,x)}",j:"c(e[k],k,e)"},ct={k:"z",j:"if(!c(e[k],k,e))return!r"},ht={a:"n",k:"n",q:"for(var t,u=1,m=arguments.length;u<m;u++){t=arguments[u];"+(O?"if(t){":""),m:"k in t",r:i,j:"n[k]=t[k]",e:(O?"}":"")+"}"},pt={k:"[]",j:"c(e[k],k,e)&&r.push(e[k])"},dt={q:"if(x)c=l(c,x)"},vt={j:{n:lt.j}},mt={k:"",f:"if(!e)return[]",d:{b:"r=Array(m)",n:"r=[]"},j:{b:"r[k]=c(e[k],k,e)",n:"r.push(c(e[k],k,e))"}},gt=a({a:"n",f:"if(!o[typeof n]||n===null)throw TypeError()"
|
|
||||||
,k:"[]",j:"r.push(k)"}),D=a({a:"e,w",k:"g",j:"if(e[k]===w)return z"}),yt=a(lt,ct),G=a(lt,pt),bt=a(lt,dt,{k:"",j:"if(c(e[k],k,e))return e[k]"}),wt=a(lt,dt),Et=a(lt,mt),St=a(mt,{a:"e,q",j:{b:"r[k]=e[k][q]",n:"r.push(e[k][q])"}}),xt=a({a:"e,c,a,x",k:"a",q:"var p=arguments.length<3;if(x)c=l(c,x)",d:{b:"if(p)r=e[++k]"},j:{b:"r=c(r,e[k],k,e)",n:"r=p?(p=g,e[k]):c(r,e[k],k,e)"}}),pt=a(lt,pt,{j:"!"+pt.j}),ct=a(lt,ct,{k:"g",j:ct.j.replace("!","")}),Tt=a(mt,{a:"e",j:{b:"r[k]=e[k]",n:"r.push(e[k])"}}),mt=a(ht
|
|
||||||
,{j:"if(n[k]==A)"+ht.j}),Nt=a(ht),ht=a(lt,dt,vt,{r:i}),lt=a(lt,dt,vt),Ct=a({a:"n",k:"[]",r:i,j:"if(y.call(n[k])==h)r.push(k)",e:"r.sort()"});s(arguments)||(s=function(e){return!!e&&!!Z.call(e,"callee")});var kt=it||function(e){return nt.call(e)==z},it=a({a:"B",k:"z",q:"var d=y.call(B);if(d==b||d==v)return!B.length",j:{n:"return g"}}),Lt=ot?function(e){return"function"==typeof e?gt(e):ot(e)}:gt;o.VERSION="0.3.0",o.after=function(e,t){return 1>e?t():function(){if(1>--e)return t.apply(this,arguments
|
|
||||||
)}},o.bind=N,o.bindAll=function(e){var t=arguments,n=1;1==t.length&&(n=0,t=Ct(e));for(var r=t.length;n<r;n++)e[t[n]]=N(e[t[n]],e);return e},o.chain=function(e){return e=new u(e),e._chain=n,e},o.clone=function(e){return R[typeof e]&&e!==r?kt(e)?e.slice():Nt({},e):e},o.compact=function(e){for(var t=-1,n=e.length,r=[];++t<n;)e[t]&&r.push(e[t]);return r},o.compose=function(){var e=arguments;return function(){for(var t=arguments,n=e.length;n--;)t=[e[n].apply(this,t)];return t[0]}},o.contains=D,o.debounce=
|
|
||||||
function(e,n,r){function i(){a=t,r||e.apply(u,s)}var s,o,u,a;return function(){var t=r&&!a;return s=arguments,u=this,ut(a),a=at(i,n),t&&(o=e.apply(u,s)),o}},o.defaults=mt,o.defer=function(e){var n=tt.call(arguments,1);return at(function(){return e.apply(t,n)},1)},o.delay=function(e,n){var r=tt.call(arguments,2);return at(function(){return e.apply(t,r)},n)},o.difference=function(e){for(var t=-1,n=e.length,r=[],i=Y.apply(r,tt.call(arguments,1));++t<n;)0>w(i,e[t])&&r.push(e[t]);return r},o.escape=function(
|
|
||||||
e){return(e+"").replace(H,c)},o.every=yt,o.extend=Nt,o.filter=G,o.find=bt,o.first=y,o.flatten=b,o.forEach=wt,o.forIn=ht,o.forOwn=lt,o.functions=Ct,o.groupBy=function(e,t,n){var r,i=-1,s="function"==typeof t,o=e.length,u={};for(s&&n&&(t=h(t,n));++i<o;)r=e[i],n=s?t(r,i,e):r[t],(Z.call(u,n)?u[n]:u[n]=[]).push(r);return u},o.has=function(e,t){return Z.call(e,t)},o.identity=k,o.indexOf=w,o.initial=function(e,n,r){return tt.call(e,0,-(n==t||r?1:n))},o.intersection=function(e){for(var t,n=-1,r=e.length,
|
|
||||||
i=tt.call(arguments,1),s=[];++n<r;)t=e[n],0>w(s,t)&&yt(i,function(e){return-1<w(e,t)})&&s.push(t);return s},o.invoke=function(e,t){for(var n=tt.call(arguments,2),r=-1,i=e.length,s="function"==typeof t,o=[];++r<i;)o[r]=(s?t:e[r][t]).apply(e[r],n);return o},o.isArguments=s,o.isArray=kt,o.isBoolean=function(e){return e===n||e===i||nt.call(e)==W},o.isDate=function(e){return nt.call(e)==X},o.isElement=function(e){return!!e&&1==e.nodeType},o.isEmpty=it,o.isEqual=C,o.isFinite=function(e){return st(e)&&nt
|
|
||||||
.call(e)==$},o.isFunction=function(e){return nt.call(e)==V},o.isNaN=function(e){return nt.call(e)==$&&e!=+e},o.isNull=function(e){return e===r},o.isNumber=function(e){return nt.call(e)==$},o.isObject=function(e){return R[typeof e]&&e!==r},o.isRegExp=function(e){return nt.call(e)==J},o.isString=function(e){return nt.call(e)==K},o.isUndefined=function(e){return e===t},o.keys=Lt,o.last=function(e,n,r){var i=e.length;return n==t||r?e[i-1]:tt.call(e,-n||i)},o.lastIndexOf=function(e,t,n){var r=e.length
|
|
||||||
;for(n&&"number"==typeof n&&(r=(0>n?Math.max(0,r+n):Math.min(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},o.map=Et,o.max=E,o.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return Z.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},o.min=function(e,t,n){var r=Infinity,i=-1,s=e.length,o=r;if(!t){for(;++i<s;)e[i]<o&&(o=e[i]);return o}for(n&&(t=h(t,n));++i<s;)n=t(e[i],i,e),n<r&&(r=n,o=e[i]);return o},o.mixin=L,o.noConflict=function(){return e._=_,this},o.once=
|
|
||||||
function(e){var t,r=i;return function(){return r?t:(r=n,t=e.apply(this,arguments))}},o.partial=function(e){var t=tt.call(arguments,1),n=t.length;return function(){var r;return r=arguments,r.length&&(t.length=n,et.apply(t,r)),r=1==t.length?e.call(this,t[0]):e.apply(this,t),t.length=n,r}},o.pick=function(e){for(var t,n=0,r=Y.apply(Q,arguments),i=r.length,s={};++n<i;)t=r[n],t in e&&(s[t]=e[t]);return s},o.pluck=St,o.range=function(e,t,n){n||(n=1),2>arguments.length&&(t=e||0,e=0);for(var r=-1,i=Math.
|
|
||||||
max(Math.ceil((t-e)/n),0),s=Array(i);++r<i;)s[r]=e,e+=n;return s},o.reduce=xt,o.reduceRight=g,o.reject=pt,o.rest=S,o.result=function(e,t){if(!e)return r;var n=e[t];return nt.call(n)==V?e[t]():n},o.shuffle=function(e){for(var t,n=-1,r=e.length,i=Array(r);++n<r;)t=Math.floor(Math.random()*(n+1)),i[n]=i[t],i[t]=e[n];return i},o.size=function(e){var t=nt.call(e);return t==z||t==K?e.length:Lt(e).length},o.some=ct,o.sortBy=function(e,n,r){if("string"==typeof n)var i=n,n=function(e){return e[i]};else r&&
|
|
||||||
(n=h(n,r));return St(Et(e,function(t,r){return{a:n(t,r,e),b:t}}).sort(function(e,n){var r=e.a,i=n.a;return r===t?1:i===t?-1:r<i?-1:r>i?1:0}),"b")},o.sortedIndex=x,o.tap=function(e,t){return t(e),e},o.template=function(e,t,n){n||(n={});var i;i=o.templateSettings;var s=n.escape,u=n.evaluate,a=n.interpolate,n=n.variable;return s==r&&(s=i.escape),u==r&&(u=i.evaluate),a==r&&(a=i.interpolate),s&&(e=e.replace(s,d)),a&&(e=e.replace(a,v)),u&&(e=e.replace(u,m)),e="__p='"+e.replace(B,l).replace(P,f)+"';",I.
|
|
||||||
length=0,n||(n=i.variable,e="with("+n+"||{}){"+e+"}"),e="function("+n+"){var __p,__t,__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+e+"return __p}",i=Function("_","return "+e)(o),t?i(t):(i.source=e,i)},o.throttle=function(e,n){function r(){a=new Date,u=t,e.apply(o,i)}var i,s,o,u,a=0;return function(){var t=new Date,f=n-(t-a);return i=arguments,o=this,0>=f?(a=t,s=e.apply(o,i)):u||(u=at(r,f)),s}},o.times=function(e,t,n){var r=-1;if(n)for(;++r<e;)t.call(n,r);else for(;++r<e;
|
|
||||||
)t(r)},o.toArray=function(e){if(!e)return[];if(nt.call(e.toArray)==V)return e.toArray();var t=e.length;return t===t>>>0?tt.call(e):Tt(e)},o.union=function(){for(var e=-1,t=[],n=Y.apply(t,arguments),r=n.length;++e<r;)0>w(t,n[e])&&t.push(n[e]);return t},o.uniq=T,o.uniqueId=function(e){var t=M++;return e?e+t:t},o.values=Tt,o.without=function(e){for(var t=tt.call(arguments,1),n=-1,r=e.length,i=[];++n<r;)0>w(t,e[n])&&i.push(e[n]);return i},o.wrap=function(e,t){return function(){var n=[e];return arguments
|
|
||||||
.length&&et.apply(n,arguments),t.apply(this,n)}},o.zip=function(){for(var e=-1,t=E(St(arguments,"length")),n=Array(t);++e<t;)n[e]=St(arguments,e);return n},o.all=yt,o.any=ct,o.collect=Et,o.detect=bt,o.each=wt,o.foldl=xt,o.foldr=g,o.head=y,o.include=D,o.inject=xt,o.methods=Ct,o.select=G,o.tail=S,o.take=y,o.unique=T,u.prototype=o.prototype,L(o),u.prototype.chain=function(){return this._chain=n,this},u.prototype.value=function(){return this._wrapped},wt("pop push reverse shift sort splice unshift".split
|
|
||||||
(" "),function(e){var t=Q[e];u.prototype[e]=function(){var e=this._wrapped;return arguments.length?t.apply(e,arguments):t.call(e),e.length===0&&delete e[0],this._chain&&(e=new u(e),e._chain=n),e}}),wt(["concat","join","slice"],function(e){var t=Q[e];u.prototype[e]=function(){var e=this._wrapped,e=arguments.length?t.apply(e,arguments):t.call(e);return this._chain&&(e=new u(e),e._chain=n),e}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(e._=o,define(function(){return o})):A?"object"==typeof
|
|
||||||
module&&module&&module.s==A?(module.s=o)._=o:A._=o:e._=o})(this);
|
|
||||||
94
package.json
94
package.json
@@ -1,42 +1,64 @@
|
|||||||
{
|
{
|
||||||
"name": "lodash",
|
"name": "lodash",
|
||||||
"version": "0.3.0",
|
"version": "4.17.2",
|
||||||
"description": "A drop-in replacement for Underscore.js that delivers performance improvements, bug fixes, and additional features.",
|
"license": "MIT",
|
||||||
"homepage": "http://lodash.com",
|
"private": true,
|
||||||
"main": "lodash",
|
"main": "lodash.js",
|
||||||
"keywords": [
|
"engines": { "node": ">=4.0.0" },
|
||||||
"browser",
|
"scripts": {
|
||||||
"client",
|
"build": "npm run build:main && npm run build:fp",
|
||||||
"functional",
|
"build:fp": "node lib/fp/build-dist.js",
|
||||||
"performance",
|
"build:fp-modules": "node lib/fp/build-modules.js",
|
||||||
"server",
|
"build:main": "node lib/main/build-dist.js",
|
||||||
"speed",
|
"build:main-modules": "node lib/main/build-modules.js",
|
||||||
"util"
|
"doc": "node lib/main/build-doc github && npm run test:doc",
|
||||||
],
|
"doc:fp": "node lib/fp/build-doc",
|
||||||
"licenses": [
|
"doc:site": "node lib/main/build-doc site",
|
||||||
{
|
"doc:sitehtml": "optional-dev-dependency marky-markdown@^9.0.1 && npm run doc:site && node lib/main/build-site",
|
||||||
"type": "MIT",
|
"pretest": "npm run build",
|
||||||
"url": "http://lodash.com/license"
|
"style": "npm run style:main && npm run style:fp && npm run style:perf && npm run style:test",
|
||||||
}
|
"style:fp": "jscs fp/*.js lib/**/*.js",
|
||||||
],
|
"style:main": "jscs lodash.js",
|
||||||
"author": {
|
"style:perf": "jscs perf/*.js perf/**/*.js",
|
||||||
"name": "John-David Dalton",
|
"style:test": "jscs test/*.js test/**/*.js",
|
||||||
"email": "john@fusejs.com",
|
"test": "npm run test:main && npm run test:fp",
|
||||||
"web": "http://allyoucanleet.com/"
|
"test:doc": "markdown-doctest doc/*.md",
|
||||||
|
"test:fp": "node test/test-fp",
|
||||||
|
"test:main": "node test/test",
|
||||||
|
"validate": "npm run style && npm run test"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"devDependencies": {
|
||||||
"url": "https://github.com/bestiejs/lodash/issues"
|
"async": "^2.1.2",
|
||||||
|
"benchmark": "^2.1.2",
|
||||||
|
"chalk": "^1.1.3",
|
||||||
|
"cheerio": "^0.22.0",
|
||||||
|
"codecov.io": "~0.1.6",
|
||||||
|
"coveralls": "^2.11.15",
|
||||||
|
"curl-amd": "~0.8.12",
|
||||||
|
"docdown": "~0.7.1",
|
||||||
|
"dojo": "^1.11.2",
|
||||||
|
"ecstatic": "^2.1.0",
|
||||||
|
"fs-extra": "~1.0.0",
|
||||||
|
"glob": "^7.1.1",
|
||||||
|
"istanbul": "0.4.5",
|
||||||
|
"jquery": "^3.1.1",
|
||||||
|
"jscs": "^3.0.7",
|
||||||
|
"lodash": "4.17.1",
|
||||||
|
"lodash-doc-globals": "^0.1.1",
|
||||||
|
"markdown-doctest": "^0.9.0",
|
||||||
|
"optional-dev-dependency": "^2.0.0",
|
||||||
|
"platform": "^1.3.3",
|
||||||
|
"qunit-extras": "^3.0.0",
|
||||||
|
"qunitjs": "^2.0.1",
|
||||||
|
"request": "^2.78.0",
|
||||||
|
"requirejs": "^2.3.2",
|
||||||
|
"sauce-tunnel": "^2.5.0",
|
||||||
|
"uglify-js": "2.7.4",
|
||||||
|
"webpack": "^1.13.3"
|
||||||
},
|
},
|
||||||
"repository": {
|
"greenkeeper": {
|
||||||
"type": "git",
|
"ignore": [
|
||||||
"url": "https://github.com/bestiejs/lodash.git"
|
"lodash"
|
||||||
},
|
]
|
||||||
"engines": [
|
|
||||||
"node",
|
|
||||||
"rhino"
|
|
||||||
],
|
|
||||||
"directories": {
|
|
||||||
"doc": "./doc",
|
|
||||||
"test": "./test"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
112
perf/asset/perf-ui.js
Normal file
112
perf/asset/perf-ui.js
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
;(function(window) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** The base path of the lodash builds. */
|
||||||
|
var basePath = '../';
|
||||||
|
|
||||||
|
/** The lodash build to load. */
|
||||||
|
var build = (build = /build=([^&]+)/.exec(location.search)) && decodeURIComponent(build[1]);
|
||||||
|
|
||||||
|
/** The other library to load. */
|
||||||
|
var other = (other = /other=([^&]+)/.exec(location.search)) && decodeURIComponent(other[1]);
|
||||||
|
|
||||||
|
/** The `ui` object. */
|
||||||
|
var ui = {};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Initialize controls.
|
||||||
|
addEventListener('load', function() {
|
||||||
|
function eventHandler(event) {
|
||||||
|
var buildIndex = buildList.selectedIndex,
|
||||||
|
otherIndex = otherList.selectedIndex,
|
||||||
|
search = location.search.replace(/^\?|&?(?:build|other)=[^&]*&?/g, '');
|
||||||
|
|
||||||
|
if (event.stopPropagation) {
|
||||||
|
event.stopPropagation();
|
||||||
|
} else {
|
||||||
|
event.cancelBubble = true;
|
||||||
|
}
|
||||||
|
location.href =
|
||||||
|
location.href.split('?')[0] + '?' +
|
||||||
|
(search ? search + '&' : '') +
|
||||||
|
'build=' + (buildIndex < 0 ? build : buildList[buildIndex].value) + '&' +
|
||||||
|
'other=' + (otherIndex < 0 ? other : otherList[otherIndex].value);
|
||||||
|
}
|
||||||
|
|
||||||
|
var span1 = document.createElement('span');
|
||||||
|
span1.style.cssText = 'float:right';
|
||||||
|
span1.innerHTML =
|
||||||
|
'<label for="perf-build">Build: </label>' +
|
||||||
|
'<select id="perf-build">' +
|
||||||
|
'<option value="lodash">lodash (production)</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var span2 = document.createElement('span');
|
||||||
|
span2.style.cssText = 'float:right';
|
||||||
|
span2.innerHTML =
|
||||||
|
'<label for="perf-other">Other Library: </label>' +
|
||||||
|
'<select id="perf-other">' +
|
||||||
|
'<option value="underscore-dev">Underscore (development)</option>' +
|
||||||
|
'<option value="underscore">Underscore (production)</option>' +
|
||||||
|
'<option value="lodash">lodash</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var buildList = span1.lastChild,
|
||||||
|
otherList = span2.lastChild,
|
||||||
|
toolbar = document.getElementById('perf-toolbar');
|
||||||
|
|
||||||
|
toolbar.appendChild(span2);
|
||||||
|
toolbar.appendChild(span1);
|
||||||
|
|
||||||
|
buildList.selectedIndex = (function() {
|
||||||
|
switch (build) {
|
||||||
|
case 'lodash':
|
||||||
|
case null: return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
otherList.selectedIndex = (function() {
|
||||||
|
switch (other) {
|
||||||
|
case 'underscore-dev': return 0;
|
||||||
|
case 'lodash': return 2;
|
||||||
|
case 'underscore':
|
||||||
|
case null: return 1;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
buildList.addEventListener('change', eventHandler);
|
||||||
|
otherList.addEventListener('change', eventHandler);
|
||||||
|
});
|
||||||
|
|
||||||
|
// The lodash build file path.
|
||||||
|
ui.buildPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (build) {
|
||||||
|
case null: build = 'lodash';
|
||||||
|
case 'lodash': result = 'dist/lodash.min.js'; break;
|
||||||
|
default: return build;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
// The other library file path.
|
||||||
|
ui.otherPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (other) {
|
||||||
|
case 'lodash': result = 'dist/lodash.min.js'; break;
|
||||||
|
case 'underscore-dev': result = 'vendor/underscore/underscore.js'; break;
|
||||||
|
case null: other = 'underscore';
|
||||||
|
case 'underscore': result = 'vendor/underscore/underscore-min.js'; break;
|
||||||
|
default: return other;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
ui.urlParams = { 'build': build, 'other': other };
|
||||||
|
|
||||||
|
window.ui = ui;
|
||||||
|
|
||||||
|
}(this));
|
||||||
@@ -2,47 +2,79 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Lo-Dash Performance Suite</title>
|
<title>lodash Performance Suite</title>
|
||||||
<style>
|
<style>
|
||||||
html, body {
|
html, body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
applet {
|
#FirebugUI {
|
||||||
position: absolute;
|
top: 2.5em;
|
||||||
left: -9999em;
|
}
|
||||||
|
#perf-toolbar {
|
||||||
|
background-color: #EEE;
|
||||||
|
color: #5E740B;
|
||||||
|
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: small;
|
||||||
|
padding: 0.5em 1em 0.5em 1em;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
#perf-toolbar label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
#perf-toolbar span {
|
||||||
|
display: inline-block;
|
||||||
|
float: right;
|
||||||
|
line-height: 2.1em;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div id="perf-toolbar"></div>
|
||||||
<script src="../lodash.js"></script>
|
<script src="../lodash.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="../node_modules/benchmark/benchmark.js"></script>
|
||||||
|
<script src="../vendor/firebug-lite/src/firebug-lite-debug.js"></script>
|
||||||
|
<script src="./asset/perf-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
document.write('<script src="' + ui.buildPath + '"><\/script>');
|
||||||
|
</script>
|
||||||
<script>
|
<script>
|
||||||
var lodash = _.noConflict();
|
var lodash = _.noConflict();
|
||||||
</script>
|
</script>
|
||||||
<script src="../vendor/underscore/underscore.js"></script>
|
<script>
|
||||||
<script src="../vendor/benchmark.js/benchmark.js"></script>
|
document.write('<script src="' + ui.otherPath + '"><\/script>');
|
||||||
<script src="../vendor/firebug-lite/src/firebug-lite-debug.js"></script>
|
</script>
|
||||||
|
<script src="perf.js"></script>
|
||||||
<script>
|
<script>
|
||||||
(function() {
|
(function() {
|
||||||
if (!/[?&]nojava=true(?:&|$)/.test(location.search)) {
|
var measured,
|
||||||
// using innerHTML avoids an alert in some versions of IE6
|
perfNow,
|
||||||
var div = document.createElement('div');
|
begin = new Date;
|
||||||
div.innerHTML = '<applet code=nano archive="../vendor/benchmark.js/nano.jar">';
|
|
||||||
document.body.insertBefore(div.lastChild, document.body.firstChild);
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
|
|
||||||
window.onload = function() {
|
function init() {
|
||||||
var fbUI = document.getElementById('FirebugUI'),
|
var fbUI = document.getElementById('FirebugUI'),
|
||||||
fbDoc = (fbDoc = fbUI.contentWindow || fbUI.contentDocument).document || fbDoc,
|
fbDoc = fbUI && (fbDoc = fbUI.contentWindow || fbUI.contentDocument).document || fbDoc,
|
||||||
sibling = document.getElementsByTagName('script')[0],
|
fbCommandLine = fbDoc && fbDoc.getElementById('fbCommandLine');
|
||||||
script = document.createElement('script');
|
|
||||||
|
|
||||||
fbUI.style.height = fbDoc.body.style.height = fbDoc.documentElement.style.height = '100%';
|
if (!fbCommandLine) {
|
||||||
script.src = 'perf.js?t=' + (+new Date);
|
return setTimeout(init, 15);
|
||||||
sibling.parentNode.insertBefore(script, sibling);
|
}
|
||||||
};
|
fbUI.style.height = (
|
||||||
|
Math.max(document.documentElement.clientHeight, document.body.clientHeight) -
|
||||||
|
document.getElementById('perf-toolbar').clientHeight
|
||||||
|
) + 'px';
|
||||||
|
|
||||||
|
fbDoc.body.style.height = fbDoc.documentElement.style.height = '100%';
|
||||||
|
setTimeout(run, 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = init;
|
||||||
|
}());
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
2145
perf/perf.js
2145
perf/perf.js
File diff suppressed because it is too large
Load Diff
@@ -1,9 +0,0 @@
|
|||||||
cd "$(dirname "$0")"
|
|
||||||
for cmd in node narwhal ringo rhino; do
|
|
||||||
echo ""
|
|
||||||
echo "Running performance suite in $cmd..."
|
|
||||||
$cmd perf.js
|
|
||||||
done
|
|
||||||
echo ""
|
|
||||||
echo "Running performance suite in a browser..."
|
|
||||||
open index.html
|
|
||||||
155
test/asset/test-ui.js
Normal file
155
test/asset/test-ui.js
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
;(function(window) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** The base path of the lodash builds. */
|
||||||
|
var basePath = '../';
|
||||||
|
|
||||||
|
/** The lodash build to load. */
|
||||||
|
var build = (build = /build=([^&]+)/.exec(location.search)) && decodeURIComponent(build[1]);
|
||||||
|
|
||||||
|
/** The module loader to use. */
|
||||||
|
var loader = (loader = /loader=([^&]+)/.exec(location.search)) && decodeURIComponent(loader[1]);
|
||||||
|
|
||||||
|
/** The `ui` object. */
|
||||||
|
var ui = {};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Initialize controls.
|
||||||
|
addEventListener('load', function() {
|
||||||
|
function eventHandler(event) {
|
||||||
|
var buildIndex = buildList.selectedIndex,
|
||||||
|
loaderIndex = loaderList.selectedIndex,
|
||||||
|
search = location.search.replace(/^\?|&?(?:build|loader)=[^&]*&?/g, '');
|
||||||
|
|
||||||
|
if (event.stopPropagation) {
|
||||||
|
event.stopPropagation();
|
||||||
|
} else {
|
||||||
|
event.cancelBubble = true;
|
||||||
|
}
|
||||||
|
location.href =
|
||||||
|
location.href.split('?')[0] + '?' +
|
||||||
|
(search ? search + '&' : '') +
|
||||||
|
'build=' + (buildIndex < 0 ? build : buildList[buildIndex].value) + '&' +
|
||||||
|
'loader=' + (loaderIndex < 0 ? loader : loaderList[loaderIndex].value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
var toolbar = document.getElementById('qunit-testrunner-toolbar');
|
||||||
|
if (!toolbar) {
|
||||||
|
setTimeout(init, 15);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toolbar.insertBefore(span2, toolbar.lastChild);
|
||||||
|
toolbar.insertBefore(span1, span2);
|
||||||
|
|
||||||
|
buildList.selectedIndex = (function() {
|
||||||
|
switch (build) {
|
||||||
|
case 'lodash': return 1;
|
||||||
|
case 'lodash-core-dev': return 2;
|
||||||
|
case 'lodash-core': return 3;
|
||||||
|
case 'lodash-dev':
|
||||||
|
case null: return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
loaderList.selectedIndex = (function() {
|
||||||
|
switch (loader) {
|
||||||
|
case 'curl': return 1;
|
||||||
|
case 'dojo': return 2;
|
||||||
|
case 'requirejs': return 3;
|
||||||
|
case 'none':
|
||||||
|
case null: return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
buildList.addEventListener('change', eventHandler);
|
||||||
|
loaderList.addEventListener('change', eventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
var span1 = document.createElement('span');
|
||||||
|
span1.innerHTML =
|
||||||
|
'<label for="qunit-build">Build: </label>' +
|
||||||
|
'<select id="qunit-build">' +
|
||||||
|
'<option value="lodash-dev">lodash (development)</option>' +
|
||||||
|
'<option value="lodash">lodash (production)</option>' +
|
||||||
|
'<option value="lodash-core-dev">lodash-core (development)</option>' +
|
||||||
|
'<option value="lodash-core">lodash-core (production)</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var span2 = document.createElement('span');
|
||||||
|
span2.innerHTML =
|
||||||
|
'<label for="qunit-loader">Loader: </label>' +
|
||||||
|
'<select id="qunit-loader">' +
|
||||||
|
'<option value="none">None</option>' +
|
||||||
|
'<option value="curl">Curl</option>' +
|
||||||
|
'<option value="dojo">Dojo</option>' +
|
||||||
|
'<option value="requirejs">RequireJS</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
span1.style.cssText =
|
||||||
|
span2.style.cssText = 'display:inline-block;float:right;line-height:2.1em;margin-left:1em;margin-top:0;';
|
||||||
|
|
||||||
|
span1.firstChild.style.cssText =
|
||||||
|
span2.firstChild.style.cssText = 'display:inline-block;margin-right:.5em;';
|
||||||
|
|
||||||
|
var buildList = span1.lastChild,
|
||||||
|
loaderList = span2.lastChild;
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
ui.timing.loadEventEnd = +new Date;
|
||||||
|
}, 1);
|
||||||
|
|
||||||
|
init();
|
||||||
|
});
|
||||||
|
|
||||||
|
// The lodash build file path.
|
||||||
|
ui.buildPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (build) {
|
||||||
|
case 'lodash': result = 'dist/lodash.min.js'; break;
|
||||||
|
case 'lodash-core-dev': result = 'dist/lodash.core.js'; break;
|
||||||
|
case 'lodash-core': result = 'dist/lodash.core.min.js'; break;
|
||||||
|
case null: build = 'lodash-dev';
|
||||||
|
case 'lodash-dev': result = 'lodash.js'; break;
|
||||||
|
default: return build;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
// The module loader file path.
|
||||||
|
ui.loaderPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (loader) {
|
||||||
|
case 'curl': result = 'node_modules/curl-amd/dist/curl-kitchen-sink/curl.js'; break;
|
||||||
|
case 'dojo': result = 'node_modules/dojo/dojo.js'; break;
|
||||||
|
case 'requirejs': result = 'node_modules/requirejs/require.js'; break;
|
||||||
|
case null: loader = 'none'; return '';
|
||||||
|
default: return loader;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Used to indicate testing a core build.
|
||||||
|
ui.isCore = /\bcore(\.min)?\.js\b/.test(ui.buildPath);
|
||||||
|
|
||||||
|
// Used to indicate testing a foreign file.
|
||||||
|
ui.isForeign = RegExp('^(\\w+:)?//').test(build);
|
||||||
|
|
||||||
|
// Used to indicate testing a modularized build.
|
||||||
|
ui.isModularize = /\b(?:amd|commonjs|es|node|npm|(index|main)\.js)\b/.test([location.pathname, location.search]);
|
||||||
|
|
||||||
|
// Used to indicate testing in Sauce Labs' automated test cloud.
|
||||||
|
ui.isSauceLabs = location.port == '9001';
|
||||||
|
|
||||||
|
// Used to indicate that lodash is in strict mode.
|
||||||
|
ui.isStrict = /\bes\b/.test([location.pathname, location.search]);
|
||||||
|
|
||||||
|
ui.urlParams = { 'build': build, 'loader': loader };
|
||||||
|
ui.timing = { 'loadEventEnd': 0 };
|
||||||
|
|
||||||
|
window.ui = ui;
|
||||||
|
|
||||||
|
}(this));
|
||||||
17
test/asset/worker.js
Normal file
17
test/asset/worker.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
self.console || (self.console = { 'log': function() {} });
|
||||||
|
|
||||||
|
addEventListener('message', function(e) {
|
||||||
|
if (e.data) {
|
||||||
|
try {
|
||||||
|
importScripts('../' + e.data);
|
||||||
|
} catch (e) {
|
||||||
|
var lineNumber = e.lineNumber,
|
||||||
|
message = (lineNumber == null ? '' : (lineNumber + ': ')) + e.message;
|
||||||
|
|
||||||
|
self._ = { 'VERSION': message };
|
||||||
|
}
|
||||||
|
postMessage(_.VERSION);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -3,37 +3,168 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Backbone Test Suite</title>
|
<title>Backbone Test Suite</title>
|
||||||
<link rel="stylesheet" href="../vendor/backbone/test/vendor/qunit.css">
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
<style>
|
|
||||||
body > #qunit-header {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#jslitmus {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="qunit"></div>
|
<script>
|
||||||
<h1 id="qunit-header"><a href="#">Backbone Speed Suite</a></h1>
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
<div id="qunit-fixture">
|
if (location.port == '9001') {
|
||||||
<div id='testElement'>
|
window.onerror = function(message) {
|
||||||
<h1>Test</h1>
|
if (window.QUnit) {
|
||||||
</div>
|
QUnit.config.done.length = 0;
|
||||||
</div>
|
}
|
||||||
<script src="../vendor/backbone/test/vendor/json2.js"></script>
|
global_test_results = { 'message': message };
|
||||||
<script src="../vendor/backbone/test/vendor/jquery-1.7.1.js"></script>
|
};
|
||||||
<script src="../vendor/backbone/test/vendor/qunit.js"></script>
|
}
|
||||||
<script src="../vendor/backbone/test/vendor/jslitmus.js"></script>
|
</script>
|
||||||
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
|
<script src="../vendor/json-js/json2.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="./asset/test-ui.js"></script>
|
||||||
<script src="../lodash.js"></script>
|
<script src="../lodash.js"></script>
|
||||||
<script src="../vendor/backbone/backbone.js"></script>
|
<script>
|
||||||
<script src="../vendor/backbone/test/noconflict.js"></script>
|
QUnit.config.asyncRetries = 10;
|
||||||
<script src="../vendor/backbone/test/events.js"></script>
|
QUnit.config.hidepassed = true;
|
||||||
<script src="../vendor/backbone/test/model.js"></script>
|
|
||||||
<script src="../vendor/backbone/test/collection.js"></script>
|
var mixinPrereqs = (function() {
|
||||||
<script src="../vendor/backbone/test/router.js"></script>
|
var aliasToReal = {
|
||||||
<script src="../vendor/backbone/test/view.js"></script>
|
'indexBy': 'keyBy',
|
||||||
<script src="../vendor/backbone/test/sync.js"></script>
|
'invoke': 'invokeMap'
|
||||||
<script src="../vendor/backbone/test/setdomlibrary.js"></script>
|
};
|
||||||
|
|
||||||
|
var keyMap = {
|
||||||
|
'rest': 'tail'
|
||||||
|
};
|
||||||
|
|
||||||
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
|
return function(_) {
|
||||||
|
lodash(_)
|
||||||
|
.defaultsDeep({ 'templateSettings': lodash.templateSettings })
|
||||||
|
.mixin(lodash.pick(lodash, lodash.difference([
|
||||||
|
'countBy',
|
||||||
|
'debounce',
|
||||||
|
'difference',
|
||||||
|
'find',
|
||||||
|
'findIndex',
|
||||||
|
'findLastIndex',
|
||||||
|
'groupBy',
|
||||||
|
'includes',
|
||||||
|
'invert',
|
||||||
|
'invokeMap',
|
||||||
|
'keyBy',
|
||||||
|
'omit',
|
||||||
|
'partition',
|
||||||
|
'reduceRight',
|
||||||
|
'reject',
|
||||||
|
'sample',
|
||||||
|
'without'
|
||||||
|
], lodash.functions(_))))
|
||||||
|
.value();
|
||||||
|
|
||||||
|
lodash.forOwn(keyMap, function(realName, otherName) {
|
||||||
|
_[otherName] = lodash[realName];
|
||||||
|
_.prototype[otherName] = lodash.prototype[realName];
|
||||||
|
});
|
||||||
|
lodash.forOwn(aliasToReal, function(realName, alias) {
|
||||||
|
_[alias] = _[realName];
|
||||||
|
_.prototype[alias] = _.prototype[realName];
|
||||||
|
});
|
||||||
|
return _;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Load prerequisite scripts.
|
||||||
|
document.write(ui.urlParams.loader == 'none'
|
||||||
|
? '<script src="' + ui.buildPath + '"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (ui.urlParams.loader == 'none') {
|
||||||
|
mixinPrereqs(_);
|
||||||
|
document.write([
|
||||||
|
'<script src="../node_modules/jquery/dist/jquery.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/backbone.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/setup/dom-setup.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/setup/environment.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/noconflict.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/events.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/model.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/collection.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/router.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/view.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/sync.js"><\/script>'
|
||||||
|
].join('\n'));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
if (window.curl) {
|
||||||
|
curl.config({ 'apiName': 'require' });
|
||||||
|
}
|
||||||
|
if (!window.require) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var reBasename = /[\w.-]+$/,
|
||||||
|
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
|
||||||
|
modulePath = ui.buildPath.replace(/\.js$/, ''),
|
||||||
|
locationPath = modulePath.replace(reBasename, '').replace(/^\/|\/$/g, ''),
|
||||||
|
moduleMain = modulePath.match(reBasename)[0],
|
||||||
|
uid = +new Date;
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
var result = {
|
||||||
|
'baseUrl': './',
|
||||||
|
'urlArgs': 't=' + uid++,
|
||||||
|
'waitSeconds': 0,
|
||||||
|
'paths': {
|
||||||
|
'backbone': '../vendor/backbone/backbone',
|
||||||
|
'jquery': '../node_modules/jquery/dist/jquery'
|
||||||
|
},
|
||||||
|
'packages': [{
|
||||||
|
'name': 'test',
|
||||||
|
'location': '../vendor/backbone/test',
|
||||||
|
'config': {
|
||||||
|
// Work around no global being exported.
|
||||||
|
'exports': 'QUnit',
|
||||||
|
'loader': 'curl/loader/legacy'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
result.packages.push({
|
||||||
|
'name': 'underscore',
|
||||||
|
'location': locationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
result.paths.underscore = modulePath;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
|
require(getConfig(), ['underscore'], function(lodash) {
|
||||||
|
_ = mixinPrereqs(lodash);
|
||||||
|
require(getConfig(), ['backbone'], function() {
|
||||||
|
require(getConfig(), [
|
||||||
|
'test/setup/dom-setup',
|
||||||
|
'test/setup/environment',
|
||||||
|
'test/noconflict',
|
||||||
|
'test/events',
|
||||||
|
'test/model',
|
||||||
|
'test/collection',
|
||||||
|
'test/router',
|
||||||
|
'test/view',
|
||||||
|
'test/sync'
|
||||||
|
], QUnit.start);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
41
test/fp.html
Normal file
41
test/fp.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>lodash-fp Test Suite</title>
|
||||||
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
|
if (location.port == '9001') {
|
||||||
|
window.onerror = function(message) {
|
||||||
|
if (window.QUnit) {
|
||||||
|
QUnit.config.done.length = 0;
|
||||||
|
}
|
||||||
|
global_test_results = { 'message': message };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="../lodash.js"></script>
|
||||||
|
<script src="../dist/lodash.fp.js"></script>
|
||||||
|
<script src="../dist/mapping.fp.js"></script>
|
||||||
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="./test-fp.js"></script>
|
||||||
|
<div id="qunit"></div>
|
||||||
|
<script>
|
||||||
|
// Set a more readable browser name.
|
||||||
|
window.onload = function() {
|
||||||
|
var timeoutId = setInterval(function() {
|
||||||
|
var ua = document.getElementById('qunit-userAgent');
|
||||||
|
if (ua) {
|
||||||
|
ua.innerHTML = platform;
|
||||||
|
clearInterval(timeoutId);
|
||||||
|
}
|
||||||
|
}, 16);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
360
test/index.html
360
test/index.html
@@ -2,52 +2,340 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Lo-Dash Test Suite</title>
|
<title>lodash Test Suite</title>
|
||||||
<link rel="stylesheet" href="../vendor/qunit/qunit/qunit.css">
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
|
<style>
|
||||||
|
#exports, #module {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<script>
|
||||||
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
|
if (location.port == '9001') {
|
||||||
|
window.onerror = function(message) {
|
||||||
|
if (window.QUnit) {
|
||||||
|
QUnit.config.done.length = 0;
|
||||||
|
}
|
||||||
|
global_test_results = { 'message': message };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="../node_modules/lodash/lodash.js"></script>
|
||||||
|
<script>var lodashStable = _.noConflict();</script>
|
||||||
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="./asset/test-ui.js"></script>
|
||||||
<div id="qunit"></div>
|
<div id="qunit"></div>
|
||||||
<script src="../vendor/qunit/qunit/qunit.js"></script>
|
<div id="exports"></div>
|
||||||
|
<div id="module"></div>
|
||||||
<script>
|
<script>
|
||||||
var _2,
|
function setProperty(object, key, value) {
|
||||||
_3 = Object.keys;
|
try {
|
||||||
|
Object.defineProperty(object, key, {
|
||||||
Object.keys = function() { return []; };
|
'configurable': true,
|
||||||
</script>
|
'enumerable': false,
|
||||||
<script src="../lodash.js"></script>
|
'writable': true,
|
||||||
<script>
|
'value': value
|
||||||
var lodashBadKeys = _,
|
});
|
||||||
_ = 1;
|
} catch (e) {
|
||||||
|
object[key] = value;
|
||||||
Object.keys = _3;
|
|
||||||
_3 = void 0;
|
|
||||||
</script>
|
|
||||||
<script src="../lodash.js"></script>
|
|
||||||
<script src="../vendor/requirejs/require.js"></script>
|
|
||||||
<script>
|
|
||||||
if (/[?&]norequire=true(?:&|$)/.test(location.search)) {
|
|
||||||
require = define = null;
|
|
||||||
document.write('<script src="test.js"><\/script>');
|
|
||||||
}
|
}
|
||||||
else {
|
return object;
|
||||||
require({
|
|
||||||
'baseUrl': '../vendor/requirejs/',
|
|
||||||
'urlArgs': 't=' + (+new Date),
|
|
||||||
'paths': {
|
|
||||||
'lodash': '../../lodash',
|
|
||||||
'underscore': './../../lodash'
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
['lodash', 'underscore'], function(lodash, lodashAsUnderscore) {
|
|
||||||
_2 = lodash.noConflict();
|
|
||||||
_2.moduleName = 'lodash';
|
|
||||||
|
|
||||||
_3 = lodashAsUnderscore.noConflict();
|
function addBizarroMethods() {
|
||||||
_3.moduleName = 'underscore';
|
var funcProto = Function.prototype,
|
||||||
|
objectProto = Object.prototype;
|
||||||
|
|
||||||
require(['test.js']);
|
var hasOwnProperty = objectProto.hasOwnProperty,
|
||||||
|
fnToString = funcProto.toString,
|
||||||
|
nativeString = fnToString.call(objectProto.toString),
|
||||||
|
noop = function() {},
|
||||||
|
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
||||||
|
reToString = /toString/g;
|
||||||
|
|
||||||
|
function constant(value) {
|
||||||
|
return function() {
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createToString(funcName) {
|
||||||
|
return constant(nativeString.replace(reToString, funcName));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow bypassing native checks.
|
||||||
|
setProperty(funcProto, 'toString', (function() {
|
||||||
|
function wrapper() {
|
||||||
|
setProperty(funcProto, 'toString', fnToString);
|
||||||
|
var result = hasOwnProperty.call(this, 'toString') ? this.toString() : fnToString.call(this);
|
||||||
|
setProperty(funcProto, 'toString', wrapper);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return wrapper;
|
||||||
|
}()));
|
||||||
|
|
||||||
|
// Add prototype extensions.
|
||||||
|
funcProto._method = noop;
|
||||||
|
|
||||||
|
// Set bad shims.
|
||||||
|
setProperty(Object, '_create', Object.create);
|
||||||
|
setProperty(Object, 'create', undefined);
|
||||||
|
|
||||||
|
setProperty(Object, '_getOwnPropertySymbols', Object.getOwnPropertySymbols);
|
||||||
|
setProperty(Object, 'getOwnPropertySymbols', undefined);
|
||||||
|
|
||||||
|
setProperty(objectProto, '_propertyIsEnumerable', propertyIsEnumerable);
|
||||||
|
setProperty(objectProto, 'propertyIsEnumerable', function(key) {
|
||||||
|
return !(key == 'valueOf' && this && this.valueOf === 1) && _propertyIsEnumerable.call(this, key);
|
||||||
|
});
|
||||||
|
|
||||||
|
setProperty(window, '_Map', window.Map);
|
||||||
|
if (_Map) {
|
||||||
|
setProperty(window, 'Map', (function(Map) {
|
||||||
|
var count = 0;
|
||||||
|
return function() {
|
||||||
|
if (count++) {
|
||||||
|
return new Map;
|
||||||
|
}
|
||||||
|
var result = {};
|
||||||
|
setProperty(window, 'Map', Map);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}(_Map)));
|
||||||
|
|
||||||
|
setProperty(Map, 'toString', createToString('Map'));
|
||||||
|
}
|
||||||
|
setProperty(window, '_Promise', window.Promise);
|
||||||
|
setProperty(window, 'Promise', noop);
|
||||||
|
|
||||||
|
setProperty(window, '_Set', window.Set);
|
||||||
|
setProperty(window, 'Set', noop);
|
||||||
|
|
||||||
|
setProperty(window, '_Symbol', window.Symbol);
|
||||||
|
setProperty(window, 'Symbol', undefined);
|
||||||
|
|
||||||
|
setProperty(window, '_WeakMap', window.WeakMap);
|
||||||
|
setProperty(window, 'WeakMap', noop);
|
||||||
|
|
||||||
|
// Fake `WinRTError`.
|
||||||
|
setProperty(window, 'WinRTError', Error);
|
||||||
|
|
||||||
|
// Fake free variable `global`.
|
||||||
|
setProperty(window, 'exports', window);
|
||||||
|
setProperty(window, 'global', window);
|
||||||
|
setProperty(window, 'module', {});
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeBizarroMethods() {
|
||||||
|
var funcProto = Function.prototype,
|
||||||
|
objectProto = Object.prototype;
|
||||||
|
|
||||||
|
setProperty(objectProto, 'propertyIsEnumerable', objectProto._propertyIsEnumerable);
|
||||||
|
|
||||||
|
if (Object._create) {
|
||||||
|
Object.create = Object._create;
|
||||||
|
} else {
|
||||||
|
delete Object.create;
|
||||||
|
}
|
||||||
|
if (Object._getOwnPropertySymbols) {
|
||||||
|
Object.getOwnPropertySymbols = Object._getOwnPropertySymbols;
|
||||||
|
} else {
|
||||||
|
delete Object.getOwnPropertySymbols;
|
||||||
|
}
|
||||||
|
if (_Map) {
|
||||||
|
Map = _Map;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'Map', undefined);
|
||||||
|
}
|
||||||
|
if (_Promise) {
|
||||||
|
Promise = _Promise;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'Promise', undefined);
|
||||||
|
}
|
||||||
|
if (_Set) {
|
||||||
|
Set = _Set;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'Set', undefined);
|
||||||
|
}
|
||||||
|
if (_Symbol) {
|
||||||
|
Symbol = _Symbol;
|
||||||
|
}
|
||||||
|
if (_WeakMap) {
|
||||||
|
WeakMap = _WeakMap;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'WeakMap', undefined);
|
||||||
|
}
|
||||||
|
setProperty(window, '_Map', undefined);
|
||||||
|
setProperty(window, '_Promise', undefined);
|
||||||
|
setProperty(window, '_Set', undefined);
|
||||||
|
setProperty(window, '_Symbol', undefined);
|
||||||
|
setProperty(window, '_WeakMap', undefined);
|
||||||
|
|
||||||
|
setProperty(window, 'WinRTError', undefined);
|
||||||
|
|
||||||
|
setProperty(window, 'exports', document.getElementById('exports'));
|
||||||
|
setProperty(window, 'global', undefined);
|
||||||
|
setProperty(window, 'module', document.getElementById('module'));
|
||||||
|
|
||||||
|
delete funcProto._method;
|
||||||
|
delete Object._create;
|
||||||
|
delete Object._getOwnPropertySymbols;
|
||||||
|
delete objectProto._propertyIsEnumerable;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load lodash to expose it to the bad extensions/shims.
|
||||||
|
if (!ui.isModularize) {
|
||||||
|
addBizarroMethods();
|
||||||
|
document.write('<script src="' + ui.buildPath + '"><\/script>');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
// Store lodash to test for bad extensions/shims.
|
||||||
|
if (!ui.isModularize) {
|
||||||
|
var lodashBizarro = window._;
|
||||||
|
window._ = undefined;
|
||||||
|
removeBizarroMethods();
|
||||||
|
}
|
||||||
|
// Load test scripts.
|
||||||
|
document.write((ui.isForeign || ui.urlParams.loader == 'none')
|
||||||
|
? '<script src="' + ui.buildPath + '"><\/script><script src="test.js"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
var lodashModule,
|
||||||
|
shimmedModule,
|
||||||
|
underscoreModule;
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
if (window.curl) {
|
||||||
|
curl.config({ 'apiName': 'require' });
|
||||||
|
}
|
||||||
|
if (ui.isForeign || !window.require) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var reBasename = /[\w.-]+$/,
|
||||||
|
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
|
||||||
|
modulePath = ui.buildPath.replace(/\.js$/, ''),
|
||||||
|
moduleMain = modulePath.match(reBasename)[0],
|
||||||
|
locationPath = modulePath.replace(reBasename, '').replace(/^\/|\/$/g, ''),
|
||||||
|
shimmedLocationPath = './abc/../' + locationPath,
|
||||||
|
underscoreLocationPath = './xyz/../' + locationPath,
|
||||||
|
uid = +new Date;
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
var result = {
|
||||||
|
'baseUrl': './',
|
||||||
|
'urlArgs': 't=' + uid++,
|
||||||
|
'waitSeconds': 0,
|
||||||
|
'paths': {},
|
||||||
|
'packages': [{
|
||||||
|
'name': 'test',
|
||||||
|
'location': basePath + 'test',
|
||||||
|
'main': 'test',
|
||||||
|
'config': {
|
||||||
|
// Work around no global being exported.
|
||||||
|
'exports': 'QUnit',
|
||||||
|
'loader': 'curl/loader/legacy'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
'shim': {
|
||||||
|
'shimmed': {
|
||||||
|
'exports': '_'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
result.packages.push({
|
||||||
|
'name': 'lodash',
|
||||||
|
'location': locationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
}, {
|
||||||
|
'name': 'shimmed',
|
||||||
|
'location': shimmedLocationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
}, {
|
||||||
|
'name': 'underscore',
|
||||||
|
'location': underscoreLocationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
result.paths.lodash = modulePath;
|
||||||
|
result.paths.shimmed = shimmedLocationPath + '/' + moduleMain;
|
||||||
|
result.paths.underscore = underscoreLocationPath + '/' + moduleMain;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadTests() {
|
||||||
|
require(getConfig(), ['test'], function() {
|
||||||
|
QUnit.start();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadModulesAndTests() {
|
||||||
|
require(getConfig(), ['lodash', 'shimmed', 'underscore'], function(lodash, shimmed, underscore) {
|
||||||
|
lodashModule = lodash;
|
||||||
|
lodashModule.moduleName = 'lodash';
|
||||||
|
|
||||||
|
if (shimmed) {
|
||||||
|
shimmedModule = shimmed.result(shimmed, 'noConflict') || shimmed;
|
||||||
|
shimmedModule.moduleName = 'shimmed';
|
||||||
|
}
|
||||||
|
if (underscore) {
|
||||||
|
underscoreModule = underscore.result(underscore, 'noConflict') || underscore;
|
||||||
|
underscoreModule.moduleName = 'underscore';
|
||||||
|
}
|
||||||
|
window._ = lodash;
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
require(getConfig(), [
|
||||||
|
'lodash/_baseEach',
|
||||||
|
'lodash/_isIndex',
|
||||||
|
'lodash/_isIterateeCall'
|
||||||
|
], function(baseEach, isIndex, isIterateeCall) {
|
||||||
|
lodash._baseEach = baseEach;
|
||||||
|
lodash._isIndex = isIndex;
|
||||||
|
lodash._isIterateeCall = isIterateeCall;
|
||||||
|
loadTests();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
loadTests();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
|
if (window.requirejs) {
|
||||||
|
addBizarroMethods();
|
||||||
|
require(getConfig(), ['lodash'], function(lodash) {
|
||||||
|
lodashBizarro = lodash.result(lodash, 'noConflict') || lodash;
|
||||||
|
delete requirejs.s.contexts._;
|
||||||
|
|
||||||
|
removeBizarroMethods();
|
||||||
|
loadModulesAndTests();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
loadModulesAndTests();
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Set a more readable browser name.
|
||||||
|
window.onload = function() {
|
||||||
|
var timeoutId = setInterval(function() {
|
||||||
|
var ua = document.getElementById('qunit-userAgent');
|
||||||
|
if (ua) {
|
||||||
|
ua.innerHTML = platform;
|
||||||
|
clearInterval(timeoutId);
|
||||||
|
}
|
||||||
|
}, 16);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
27
test/remove.js
Normal file
27
test/remove.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('../lodash'),
|
||||||
|
fs = require('fs'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var args = (args = process.argv)
|
||||||
|
.slice((args[0] === process.execPath || args[0] === 'node') ? 2 : 0);
|
||||||
|
|
||||||
|
var filePath = path.resolve(args[1]),
|
||||||
|
reLine = /.*/gm;
|
||||||
|
|
||||||
|
var pattern = (function() {
|
||||||
|
var result = args[0],
|
||||||
|
delimiter = result.charAt(0),
|
||||||
|
lastIndex = result.lastIndexOf(delimiter);
|
||||||
|
|
||||||
|
return RegExp(result.slice(1, lastIndex), result.slice(lastIndex + 1));
|
||||||
|
}());
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
fs.writeFileSync(filePath, fs.readFileSync(filePath, 'utf8').replace(pattern, function(match) {
|
||||||
|
var snippet = _.slice(arguments, -3, -2)[0];
|
||||||
|
return match.replace(snippet, snippet.replace(reLine, ''));
|
||||||
|
}));
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
cd "$(dirname "$0")"
|
|
||||||
for cmd in rhino ringo narwhal node; do
|
|
||||||
echo ""
|
|
||||||
echo "Testing in $cmd..."
|
|
||||||
$cmd test.js
|
|
||||||
done
|
|
||||||
echo ""
|
|
||||||
echo "Testing in a browser..."
|
|
||||||
open index.html
|
|
||||||
908
test/saucelabs.js
Normal file
908
test/saucelabs.js
Normal file
@@ -0,0 +1,908 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** Environment shortcut. */
|
||||||
|
var env = process.env;
|
||||||
|
|
||||||
|
/** Load Node.js modules. */
|
||||||
|
var EventEmitter = require('events').EventEmitter,
|
||||||
|
http = require('http'),
|
||||||
|
path = require('path'),
|
||||||
|
url = require('url'),
|
||||||
|
util = require('util');
|
||||||
|
|
||||||
|
/** Load other modules. */
|
||||||
|
var _ = require('../lodash.js'),
|
||||||
|
chalk = require('chalk'),
|
||||||
|
ecstatic = require('ecstatic'),
|
||||||
|
request = require('request'),
|
||||||
|
SauceTunnel = require('sauce-tunnel');
|
||||||
|
|
||||||
|
/** Used for Sauce Labs credentials. */
|
||||||
|
var accessKey = env.SAUCE_ACCESS_KEY,
|
||||||
|
username = env.SAUCE_USERNAME;
|
||||||
|
|
||||||
|
/** Used as the default maximum number of times to retry a job and tunnel. */
|
||||||
|
var maxJobRetries = 3,
|
||||||
|
maxTunnelRetries = 3;
|
||||||
|
|
||||||
|
/** Used as the static file server middleware. */
|
||||||
|
var mount = ecstatic({
|
||||||
|
'cache': 'no-cache',
|
||||||
|
'root': process.cwd()
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Used as the list of ports supported by Sauce Connect. */
|
||||||
|
var ports = [
|
||||||
|
80, 443, 888, 2000, 2001, 2020, 2109, 2222, 2310, 3000, 3001, 3030, 3210,
|
||||||
|
3333, 4000, 4001, 4040, 4321, 4502, 4503, 4567, 5000, 5001, 5050, 5555, 5432,
|
||||||
|
6000, 6001, 6060, 6666, 6543, 7000, 7070, 7774, 7777, 8000, 8001, 8003, 8031,
|
||||||
|
8080, 8081, 8765, 8777, 8888, 9000, 9001, 9080, 9090, 9876, 9877, 9999, 49221,
|
||||||
|
55001
|
||||||
|
];
|
||||||
|
|
||||||
|
/** Used by `logInline` to clear previously logged messages. */
|
||||||
|
var prevLine = '';
|
||||||
|
|
||||||
|
/** Method shortcut. */
|
||||||
|
var push = Array.prototype.push;
|
||||||
|
|
||||||
|
/** Used to detect error messages. */
|
||||||
|
var reError = /(?:\be|E)rror\b/;
|
||||||
|
|
||||||
|
/** Used to detect valid job ids. */
|
||||||
|
var reJobId = /^[a-z0-9]{32}$/;
|
||||||
|
|
||||||
|
/** Used to display the wait throbber. */
|
||||||
|
var throbberDelay = 500,
|
||||||
|
waitCount = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used as Sauce Labs config values.
|
||||||
|
* See the [Sauce Labs documentation](https://docs.saucelabs.com/reference/test-configuration/)
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
var advisor = getOption('advisor', false),
|
||||||
|
build = getOption('build', (env.TRAVIS_COMMIT || '').slice(0, 10)),
|
||||||
|
commandTimeout = getOption('commandTimeout', 90),
|
||||||
|
compatMode = getOption('compatMode', null),
|
||||||
|
customData = Function('return {' + getOption('customData', '').replace(/^\{|}$/g, '') + '}')(),
|
||||||
|
deviceOrientation = getOption('deviceOrientation', 'portrait'),
|
||||||
|
framework = getOption('framework', 'qunit'),
|
||||||
|
idleTimeout = getOption('idleTimeout', 60),
|
||||||
|
jobName = getOption('name', 'unit tests'),
|
||||||
|
maxDuration = getOption('maxDuration', 180),
|
||||||
|
port = ports[Math.min(_.sortedIndex(ports, getOption('port', 9001)), ports.length - 1)],
|
||||||
|
publicAccess = getOption('public', true),
|
||||||
|
queueTimeout = getOption('queueTimeout', 240),
|
||||||
|
recordVideo = getOption('recordVideo', true),
|
||||||
|
recordScreenshots = getOption('recordScreenshots', false),
|
||||||
|
runner = getOption('runner', 'test/index.html').replace(/^\W+/, ''),
|
||||||
|
runnerUrl = getOption('runnerUrl', 'http://localhost:' + port + '/' + runner),
|
||||||
|
statusInterval = getOption('statusInterval', 5),
|
||||||
|
tags = getOption('tags', []),
|
||||||
|
throttled = getOption('throttled', 10),
|
||||||
|
tunneled = getOption('tunneled', true),
|
||||||
|
tunnelId = getOption('tunnelId', 'tunnel_' + (env.TRAVIS_JOB_ID || 0)),
|
||||||
|
tunnelTimeout = getOption('tunnelTimeout', 120),
|
||||||
|
videoUploadOnPass = getOption('videoUploadOnPass', false);
|
||||||
|
|
||||||
|
/** Used to convert Sauce Labs browser identifiers to their formal names. */
|
||||||
|
var browserNameMap = {
|
||||||
|
'googlechrome': 'Chrome',
|
||||||
|
'iehta': 'Internet Explorer',
|
||||||
|
'ipad': 'iPad',
|
||||||
|
'iphone': 'iPhone',
|
||||||
|
'microsoftedge': 'Edge'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** List of platforms to load the runner on. */
|
||||||
|
var platforms = [
|
||||||
|
['Linux', 'android', '5.1'],
|
||||||
|
['Windows 10', 'chrome', '54'],
|
||||||
|
['Windows 10', 'chrome', '53'],
|
||||||
|
['Windows 10', 'firefox', '49'],
|
||||||
|
['Windows 10', 'firefox', '48'],
|
||||||
|
['Windows 10', 'microsoftedge', '14'],
|
||||||
|
['Windows 10', 'internet explorer', '11'],
|
||||||
|
['Windows 8', 'internet explorer', '10'],
|
||||||
|
['Windows 7', 'internet explorer', '9'],
|
||||||
|
['OS X 10.11', 'safari', '9'],
|
||||||
|
['OS X 10.10', 'safari', '8']
|
||||||
|
];
|
||||||
|
|
||||||
|
/** Used to tailor the `platforms` array. */
|
||||||
|
var isAMD = _.includes(tags, 'amd'),
|
||||||
|
isBackbone = _.includes(tags, 'backbone'),
|
||||||
|
isModern = _.includes(tags, 'modern');
|
||||||
|
|
||||||
|
// The platforms to test IE compatibility modes.
|
||||||
|
if (compatMode) {
|
||||||
|
platforms = [
|
||||||
|
['Windows 10', 'internet explorer', '11'],
|
||||||
|
['Windows 8', 'internet explorer', '10'],
|
||||||
|
['Windows 7', 'internet explorer', '9'],
|
||||||
|
['Windows 7', 'internet explorer', '8']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// The platforms for AMD tests.
|
||||||
|
if (isAMD) {
|
||||||
|
platforms = _.filter(platforms, function(platform) {
|
||||||
|
var browser = browserName(platform[1]),
|
||||||
|
version = +platform[2];
|
||||||
|
|
||||||
|
switch (browser) {
|
||||||
|
case 'Android': return version >= 4.4;
|
||||||
|
case 'Opera': return version >= 10;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// The platforms for Backbone tests.
|
||||||
|
if (isBackbone) {
|
||||||
|
platforms = _.filter(platforms, function(platform) {
|
||||||
|
var browser = browserName(platform[1]),
|
||||||
|
version = +platform[2];
|
||||||
|
|
||||||
|
switch (browser) {
|
||||||
|
case 'Firefox': return version >= 4;
|
||||||
|
case 'Internet Explorer': return version >= 7;
|
||||||
|
case 'iPad': return version >= 5;
|
||||||
|
case 'Opera': return version >= 12;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// The platforms for modern builds.
|
||||||
|
if (isModern) {
|
||||||
|
platforms = _.filter(platforms, function(platform) {
|
||||||
|
var browser = browserName(platform[1]),
|
||||||
|
version = +platform[2];
|
||||||
|
|
||||||
|
switch (browser) {
|
||||||
|
case 'Android': return version >= 4.1;
|
||||||
|
case 'Firefox': return version >= 10;
|
||||||
|
case 'Internet Explorer': return version >= 9;
|
||||||
|
case 'iPad': return version >= 6;
|
||||||
|
case 'Opera': return version >= 12;
|
||||||
|
case 'Safari': return version >= 6;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used as the default `Job` options object. */
|
||||||
|
var jobOptions = {
|
||||||
|
'build': build,
|
||||||
|
'command-timeout': commandTimeout,
|
||||||
|
'custom-data': customData,
|
||||||
|
'device-orientation': deviceOrientation,
|
||||||
|
'framework': framework,
|
||||||
|
'idle-timeout': idleTimeout,
|
||||||
|
'max-duration': maxDuration,
|
||||||
|
'name': jobName,
|
||||||
|
'public': publicAccess,
|
||||||
|
'platforms': platforms,
|
||||||
|
'record-screenshots': recordScreenshots,
|
||||||
|
'record-video': recordVideo,
|
||||||
|
'sauce-advisor': advisor,
|
||||||
|
'tags': tags,
|
||||||
|
'url': runnerUrl,
|
||||||
|
'video-upload-on-pass': videoUploadOnPass
|
||||||
|
};
|
||||||
|
|
||||||
|
if (publicAccess === true) {
|
||||||
|
jobOptions['public'] = 'public';
|
||||||
|
}
|
||||||
|
if (tunneled) {
|
||||||
|
jobOptions['tunnel-identifier'] = tunnelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the formal browser name for a given Sauce Labs browser identifier.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} identifier The browser identifier.
|
||||||
|
* @returns {string} Returns the formal browser name.
|
||||||
|
*/
|
||||||
|
function browserName(identifier) {
|
||||||
|
return browserNameMap[identifier] || _.startCase(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value for the given option name. If no value is available the
|
||||||
|
* `defaultValue` is returned.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the option.
|
||||||
|
* @param {*} defaultValue The default option value.
|
||||||
|
* @returns {*} Returns the option value.
|
||||||
|
*/
|
||||||
|
function getOption(name, defaultValue) {
|
||||||
|
var isArr = _.isArray(defaultValue);
|
||||||
|
return _.reduce(process.argv, function(result, value) {
|
||||||
|
if (isArr) {
|
||||||
|
value = optionToArray(name, value);
|
||||||
|
return _.isEmpty(value) ? result : value;
|
||||||
|
}
|
||||||
|
value = optionToValue(name, value);
|
||||||
|
|
||||||
|
return value == null ? result : value;
|
||||||
|
}, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `value` is a job ID.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a job ID, else `false`.
|
||||||
|
*/
|
||||||
|
function isJobId(value) {
|
||||||
|
return reJobId.test(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes an inline message to standard output.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} [text=''] The text to log.
|
||||||
|
*/
|
||||||
|
function logInline(text) {
|
||||||
|
var blankLine = _.repeat(' ', _.size(prevLine));
|
||||||
|
prevLine = text = _.truncate(text, { 'length': 40 });
|
||||||
|
process.stdout.write(text + blankLine.slice(text.length) + '\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the wait throbber to standard output.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function logThrobber() {
|
||||||
|
logInline('Please wait' + _.repeat('.', (++waitCount % 3) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a comma separated option value into an array.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the option to inspect.
|
||||||
|
* @param {string} string The options string.
|
||||||
|
* @returns {Array} Returns the new converted array.
|
||||||
|
*/
|
||||||
|
function optionToArray(name, string) {
|
||||||
|
return _.compact(_.invokeMap((optionToValue(name, string) || '').split(/, */), 'trim'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the option value from an option string.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the option to inspect.
|
||||||
|
* @param {string} string The options string.
|
||||||
|
* @returns {string|undefined} Returns the option value, else `undefined`.
|
||||||
|
*/
|
||||||
|
function optionToValue(name, string) {
|
||||||
|
var result = string.match(RegExp('^' + name + '(?:=([\\s\\S]+))?$'));
|
||||||
|
if (result) {
|
||||||
|
result = _.get(result, 1);
|
||||||
|
result = result ? _.trim(result) : true;
|
||||||
|
}
|
||||||
|
if (result === 'false') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return result || undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `Job#remove` and `Tunnel#stop` callback used by `Jobs#restart`
|
||||||
|
* and `Tunnel#restart` respectively.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function onGenericRestart() {
|
||||||
|
this.restarting = false;
|
||||||
|
this.emit('restart');
|
||||||
|
this.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.put` and `SauceTunnel#stop` callback used by `Jobs#stop`
|
||||||
|
* and `Tunnel#stop` respectively.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
*/
|
||||||
|
function onGenericStop(error) {
|
||||||
|
this.running = this.stopping = false;
|
||||||
|
this.emit('stop', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.del` callback used by `Jobs#remove`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function onJobRemove(error, res, body) {
|
||||||
|
this.id = this.taskId = this.url = null;
|
||||||
|
this.removing = false;
|
||||||
|
this.emit('remove');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `Job#remove` callback used by `Jobs#reset`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function onJobReset() {
|
||||||
|
this.attempts = 0;
|
||||||
|
this.failed = this.resetting = false;
|
||||||
|
this._pollerId = this.id = this.result = this.taskId = this.url = null;
|
||||||
|
this.emit('reset');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.post` callback used by `Jobs#start`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
* @param {Object} res The response data object.
|
||||||
|
* @param {Object} body The response body JSON object.
|
||||||
|
*/
|
||||||
|
function onJobStart(error, res, body) {
|
||||||
|
this.starting = false;
|
||||||
|
|
||||||
|
if (this.stopping) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var statusCode = _.get(res, 'statusCode'),
|
||||||
|
taskId = _.first(_.get(body, 'js tests'));
|
||||||
|
|
||||||
|
if (error || !taskId || statusCode != 200) {
|
||||||
|
if (this.attempts < this.retries) {
|
||||||
|
this.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var na = 'unavailable',
|
||||||
|
bodyStr = _.isObject(body) ? '\n' + JSON.stringify(body) : na,
|
||||||
|
statusStr = _.isFinite(statusCode) ? statusCode : na;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.error('Failed to start job; status: %s, body: %s', statusStr, bodyStr);
|
||||||
|
if (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
this.failed = true;
|
||||||
|
this.emit('complete');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.running = true;
|
||||||
|
this.taskId = taskId;
|
||||||
|
this.timestamp = _.now();
|
||||||
|
this.emit('start');
|
||||||
|
this.status();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.post` callback used by `Job#status`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
* @param {Object} res The response data object.
|
||||||
|
* @param {Object} body The response body JSON object.
|
||||||
|
*/
|
||||||
|
function onJobStatus(error, res, body) {
|
||||||
|
this.checking = false;
|
||||||
|
|
||||||
|
if (!this.running || this.stopping) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var completed = _.get(body, 'completed', false),
|
||||||
|
data = _.first(_.get(body, 'js tests')),
|
||||||
|
elapsed = (_.now() - this.timestamp) / 1000,
|
||||||
|
jobId = _.get(data, 'job_id', null),
|
||||||
|
jobResult = _.get(data, 'result', null),
|
||||||
|
jobStatus = _.get(data, 'status', ''),
|
||||||
|
jobUrl = _.get(data, 'url', null),
|
||||||
|
expired = (elapsed >= queueTimeout && !_.includes(jobStatus, 'in progress')),
|
||||||
|
options = this.options,
|
||||||
|
platform = options.platforms[0];
|
||||||
|
|
||||||
|
if (_.isObject(jobResult)) {
|
||||||
|
var message = _.get(jobResult, 'message');
|
||||||
|
} else {
|
||||||
|
if (typeof jobResult == 'string') {
|
||||||
|
message = jobResult;
|
||||||
|
}
|
||||||
|
jobResult = null;
|
||||||
|
}
|
||||||
|
if (isJobId(jobId)) {
|
||||||
|
this.id = jobId;
|
||||||
|
this.result = jobResult;
|
||||||
|
this.url = jobUrl;
|
||||||
|
} else {
|
||||||
|
completed = false;
|
||||||
|
}
|
||||||
|
this.emit('status', jobStatus);
|
||||||
|
|
||||||
|
if (!completed && !expired) {
|
||||||
|
this._pollerId = _.delay(_.bind(this.status, this), this.statusInterval * 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var description = browserName(platform[1]) + ' ' + platform[2] + ' on ' + _.startCase(platform[0]),
|
||||||
|
errored = !jobResult || !jobResult.passed || reError.test(message) || reError.test(jobStatus),
|
||||||
|
failures = _.get(jobResult, 'failed'),
|
||||||
|
label = options.name + ':',
|
||||||
|
tunnel = this.tunnel;
|
||||||
|
|
||||||
|
if (errored || failures) {
|
||||||
|
if (errored && this.attempts < this.retries) {
|
||||||
|
this.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var details = 'See ' + jobUrl + ' for details.';
|
||||||
|
this.failed = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
if (failures) {
|
||||||
|
console.error(label + ' %s ' + chalk.red('failed') + ' %d test' + (failures > 1 ? 's' : '') + '. %s', description, failures, details);
|
||||||
|
}
|
||||||
|
else if (tunnel.attempts < tunnel.retries) {
|
||||||
|
tunnel.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (message === undefined) {
|
||||||
|
message = 'Results are unavailable. ' + details;
|
||||||
|
}
|
||||||
|
console.error(label, description, chalk.red('failed') + ';', message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
logInline();
|
||||||
|
console.log(label, description, chalk.green('passed'));
|
||||||
|
}
|
||||||
|
this.running = false;
|
||||||
|
this.emit('complete');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `SauceTunnel#start` callback used by `Tunnel#start`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {boolean} success The connection success indicator.
|
||||||
|
*/
|
||||||
|
function onTunnelStart(success) {
|
||||||
|
this.starting = false;
|
||||||
|
|
||||||
|
if (this._timeoutId) {
|
||||||
|
clearTimeout(this._timeoutId);
|
||||||
|
this._timeoutId = null;
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
if (this.attempts < this.retries) {
|
||||||
|
this.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logInline();
|
||||||
|
console.error('Failed to open Sauce Connect tunnel');
|
||||||
|
process.exit(2);
|
||||||
|
}
|
||||||
|
logInline();
|
||||||
|
console.log('Sauce Connect tunnel opened');
|
||||||
|
|
||||||
|
var jobs = this.jobs;
|
||||||
|
push.apply(jobs.queue, jobs.all);
|
||||||
|
|
||||||
|
this.running = true;
|
||||||
|
this.emit('start');
|
||||||
|
|
||||||
|
console.log('Starting jobs...');
|
||||||
|
this.dequeue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Job constructor.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [properties] The properties to initialize a job with.
|
||||||
|
*/
|
||||||
|
function Job(properties) {
|
||||||
|
EventEmitter.call(this);
|
||||||
|
|
||||||
|
this.options = {};
|
||||||
|
_.merge(this, properties);
|
||||||
|
_.defaults(this.options, _.cloneDeep(jobOptions));
|
||||||
|
|
||||||
|
this.attempts = 0;
|
||||||
|
this.checking = this.failed = this.removing = this.resetting = this.restarting = this.running = this.starting = this.stopping = false;
|
||||||
|
this._pollerId = this.id = this.result = this.taskId = this.url = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
util.inherits(Job, EventEmitter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is removed.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.remove = function(callback) {
|
||||||
|
this.once('remove', _.iteratee(callback));
|
||||||
|
if (this.removing) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.removing = true;
|
||||||
|
return this.stop(function() {
|
||||||
|
var onRemove = _.bind(onJobRemove, this);
|
||||||
|
if (!this.id) {
|
||||||
|
_.defer(onRemove);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
request.del(_.template('https://saucelabs.com/rest/v1/${user}/jobs/${id}')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass }
|
||||||
|
}, onRemove);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is reset.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.reset = function(callback) {
|
||||||
|
this.once('reset', _.iteratee(callback));
|
||||||
|
if (this.resetting) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.resetting = true;
|
||||||
|
return this.remove(onJobReset);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restarts the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is restarted.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.restart = function(callback) {
|
||||||
|
this.once('restart', _.iteratee(callback));
|
||||||
|
if (this.restarting) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.restarting = true;
|
||||||
|
|
||||||
|
var options = this.options,
|
||||||
|
platform = options.platforms[0],
|
||||||
|
description = browserName(platform[1]) + ' ' + platform[2] + ' on ' + _.startCase(platform[0]),
|
||||||
|
label = options.name + ':';
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('%s %s restart %d of %d', label, description, ++this.attempts, this.retries);
|
||||||
|
|
||||||
|
return this.remove(onGenericRestart);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is started.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.start = function(callback) {
|
||||||
|
this.once('start', _.iteratee(callback));
|
||||||
|
if (this.starting || this.running) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.starting = true;
|
||||||
|
request.post(_.template('https://saucelabs.com/rest/v1/${user}/js-tests')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass },
|
||||||
|
'json': this.options
|
||||||
|
}, _.bind(onJobStart, this));
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the status of a job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the status is resolved.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.status = function(callback) {
|
||||||
|
this.once('status', _.iteratee(callback));
|
||||||
|
if (this.checking || this.removing || this.resetting || this.restarting || this.starting || this.stopping) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this._pollerId = null;
|
||||||
|
this.checking = true;
|
||||||
|
request.post(_.template('https://saucelabs.com/rest/v1/${user}/js-tests/status')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass },
|
||||||
|
'json': { 'js tests': [this.taskId] }
|
||||||
|
}, _.bind(onJobStatus, this));
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is stopped.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.stop = function(callback) {
|
||||||
|
this.once('stop', _.iteratee(callback));
|
||||||
|
if (this.stopping) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.stopping = true;
|
||||||
|
if (this._pollerId) {
|
||||||
|
clearTimeout(this._pollerId);
|
||||||
|
this._pollerId = null;
|
||||||
|
this.checking = false;
|
||||||
|
}
|
||||||
|
var onStop = _.bind(onGenericStop, this);
|
||||||
|
if (!this.running || !this.id) {
|
||||||
|
_.defer(onStop);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
request.put(_.template('https://saucelabs.com/rest/v1/${user}/jobs/${id}/stop')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass }
|
||||||
|
}, onStop);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Tunnel constructor.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [properties] The properties to initialize the tunnel with.
|
||||||
|
*/
|
||||||
|
function Tunnel(properties) {
|
||||||
|
EventEmitter.call(this);
|
||||||
|
|
||||||
|
_.merge(this, properties);
|
||||||
|
|
||||||
|
var active = [],
|
||||||
|
queue = [];
|
||||||
|
|
||||||
|
var all = _.map(this.platforms, _.bind(function(platform) {
|
||||||
|
return new Job(_.merge({
|
||||||
|
'user': this.user,
|
||||||
|
'pass': this.pass,
|
||||||
|
'tunnel': this,
|
||||||
|
'options': { 'platforms': [platform] }
|
||||||
|
}, this.job));
|
||||||
|
}, this));
|
||||||
|
|
||||||
|
var completed = 0,
|
||||||
|
restarted = [],
|
||||||
|
success = true,
|
||||||
|
total = all.length,
|
||||||
|
tunnel = this;
|
||||||
|
|
||||||
|
_.invokeMap(all, 'on', 'complete', function() {
|
||||||
|
_.pull(active, this);
|
||||||
|
if (success) {
|
||||||
|
success = !this.failed;
|
||||||
|
}
|
||||||
|
if (++completed == total) {
|
||||||
|
tunnel.stop(_.partial(tunnel.emit, 'complete', success));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tunnel.dequeue();
|
||||||
|
});
|
||||||
|
|
||||||
|
_.invokeMap(all, 'on', 'restart', function() {
|
||||||
|
if (!_.includes(restarted, this)) {
|
||||||
|
restarted.push(this);
|
||||||
|
}
|
||||||
|
// Restart tunnel if all active jobs have restarted.
|
||||||
|
var threshold = Math.min(all.length, _.isFinite(throttled) ? throttled : 3);
|
||||||
|
if (tunnel.attempts < tunnel.retries &&
|
||||||
|
active.length >= threshold && _.isEmpty(_.difference(active, restarted))) {
|
||||||
|
tunnel.restart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('restart', function() {
|
||||||
|
completed = 0;
|
||||||
|
success = true;
|
||||||
|
restarted.length = 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
this._timeoutId = null;
|
||||||
|
this.attempts = 0;
|
||||||
|
this.restarting = this.running = this.starting = this.stopping = false;
|
||||||
|
this.jobs = { 'active': active, 'all': all, 'queue': queue };
|
||||||
|
this.connection = new SauceTunnel(this.user, this.pass, this.id, this.tunneled, ['-P', '0']);
|
||||||
|
}
|
||||||
|
|
||||||
|
util.inherits(Tunnel, EventEmitter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restarts the tunnel.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Function} callback The function called once the tunnel is restarted.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.restart = function(callback) {
|
||||||
|
this.once('restart', _.iteratee(callback));
|
||||||
|
if (this.restarting) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.restarting = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('Tunnel %s: restart %d of %d', this.id, ++this.attempts, this.retries);
|
||||||
|
|
||||||
|
var jobs = this.jobs,
|
||||||
|
active = jobs.active,
|
||||||
|
all = jobs.all;
|
||||||
|
|
||||||
|
var reset = _.after(all.length, _.bind(this.stop, this, onGenericRestart)),
|
||||||
|
stop = _.after(active.length, _.partial(_.invokeMap, all, 'reset', reset));
|
||||||
|
|
||||||
|
if (_.isEmpty(active)) {
|
||||||
|
_.defer(stop);
|
||||||
|
}
|
||||||
|
if (_.isEmpty(all)) {
|
||||||
|
_.defer(reset);
|
||||||
|
}
|
||||||
|
_.invokeMap(active, 'stop', function() {
|
||||||
|
_.pull(active, this);
|
||||||
|
stop();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this._timeoutId) {
|
||||||
|
clearTimeout(this._timeoutId);
|
||||||
|
this._timeoutId = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the tunnel.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Function} callback The function called once the tunnel is started.
|
||||||
|
* @param {Object} Returns the tunnel instance.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.start = function(callback) {
|
||||||
|
this.once('start', _.iteratee(callback));
|
||||||
|
if (this.starting || this.running) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.starting = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('Opening Sauce Connect tunnel...');
|
||||||
|
|
||||||
|
var onStart = _.bind(onTunnelStart, this);
|
||||||
|
if (this.timeout) {
|
||||||
|
this._timeoutId = _.delay(onStart, this.timeout * 1000, false);
|
||||||
|
}
|
||||||
|
this.connection.start(onStart);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes jobs from the queue and starts them.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Object} Returns the tunnel instance.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.dequeue = function() {
|
||||||
|
var count = 0,
|
||||||
|
jobs = this.jobs,
|
||||||
|
active = jobs.active,
|
||||||
|
queue = jobs.queue,
|
||||||
|
throttled = this.throttled;
|
||||||
|
|
||||||
|
while (queue.length && (active.length < throttled)) {
|
||||||
|
var job = queue.shift();
|
||||||
|
active.push(job);
|
||||||
|
_.delay(_.bind(job.start, job), ++count * 1000);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the tunnel.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Function} callback The function called once the tunnel is stopped.
|
||||||
|
* @param {Object} Returns the tunnel instance.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.stop = function(callback) {
|
||||||
|
this.once('stop', _.iteratee(callback));
|
||||||
|
if (this.stopping) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.stopping = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('Shutting down Sauce Connect tunnel...');
|
||||||
|
|
||||||
|
var jobs = this.jobs,
|
||||||
|
active = jobs.active;
|
||||||
|
|
||||||
|
var stop = _.after(active.length, _.bind(function() {
|
||||||
|
var onStop = _.bind(onGenericStop, this);
|
||||||
|
if (this.running) {
|
||||||
|
this.connection.stop(onStop);
|
||||||
|
} else {
|
||||||
|
onStop();
|
||||||
|
}
|
||||||
|
}, this));
|
||||||
|
|
||||||
|
jobs.queue.length = 0;
|
||||||
|
if (_.isEmpty(active)) {
|
||||||
|
_.defer(stop);
|
||||||
|
}
|
||||||
|
_.invokeMap(active, 'stop', function() {
|
||||||
|
_.pull(active, this);
|
||||||
|
stop();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this._timeoutId) {
|
||||||
|
clearTimeout(this._timeoutId);
|
||||||
|
this._timeoutId = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Cleanup any inline logs when exited via `ctrl+c`.
|
||||||
|
process.on('SIGINT', function() {
|
||||||
|
logInline();
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create a web server for the current working directory.
|
||||||
|
http.createServer(function(req, res) {
|
||||||
|
// See http://msdn.microsoft.com/en-us/library/ff955275(v=vs.85).aspx.
|
||||||
|
if (compatMode && path.extname(url.parse(req.url).pathname) == '.html') {
|
||||||
|
res.setHeader('X-UA-Compatible', 'IE=' + compatMode);
|
||||||
|
}
|
||||||
|
mount(req, res);
|
||||||
|
}).listen(port);
|
||||||
|
|
||||||
|
// Setup Sauce Connect so we can use this server from Sauce Labs.
|
||||||
|
var tunnel = new Tunnel({
|
||||||
|
'user': username,
|
||||||
|
'pass': accessKey,
|
||||||
|
'id': tunnelId,
|
||||||
|
'job': { 'retries': maxJobRetries, 'statusInterval': statusInterval },
|
||||||
|
'platforms': platforms,
|
||||||
|
'retries': maxTunnelRetries,
|
||||||
|
'throttled': throttled,
|
||||||
|
'tunneled': tunneled,
|
||||||
|
'timeout': tunnelTimeout
|
||||||
|
});
|
||||||
|
|
||||||
|
tunnel.on('complete', function(success) {
|
||||||
|
process.exit(success ? 0 : 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
tunnel.start();
|
||||||
|
|
||||||
|
setInterval(logThrobber, throbberDelay);
|
||||||
2314
test/test-fp.js
Normal file
2314
test/test-fp.js
Normal file
File diff suppressed because it is too large
Load Diff
26999
test/test.js
26999
test/test.js
File diff suppressed because it is too large
Load Diff
@@ -3,37 +3,464 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Underscore Test Suite</title>
|
<title>Underscore Test Suite</title>
|
||||||
<link rel="stylesheet" href="../vendor/underscore/test/vendor/qunit.css">
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
<style>
|
|
||||||
#jslitmus, iframe {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="qunit"></div>
|
<div id="qunit"></div>
|
||||||
<div id="qunit-fixture">
|
<script>
|
||||||
<div id="map-test">
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
<div id="id1"></div>
|
if (location.port == '9001') {
|
||||||
<div id="id2"></div>
|
window.onerror = function(message) {
|
||||||
</div>
|
if (window.QUnit) {
|
||||||
</div>
|
QUnit.config.done.length = 0;
|
||||||
<script src="../vendor/backbone/test/vendor/json2.js"></script>
|
}
|
||||||
<script src="../vendor/underscore/test/vendor/jquery.js"></script>
|
global_test_results = { 'message': message };
|
||||||
<script src="../vendor/underscore/test/vendor/qunit.js"></script>
|
};
|
||||||
<script src="../vendor/underscore/test/vendor/jslitmus.js"></script>
|
}
|
||||||
|
</script>
|
||||||
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
|
<script src="../node_modules/jquery/dist/jquery.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="./asset/test-ui.js"></script>
|
||||||
<script src="../lodash.js"></script>
|
<script src="../lodash.js"></script>
|
||||||
<script src="../vendor/underscore/test/collections.js"></script>
|
<script>
|
||||||
<script src="../vendor/underscore/test/arrays.js"></script>
|
QUnit.config.asyncRetries = 10;
|
||||||
<script src="../vendor/underscore/test/functions.js"></script>
|
QUnit.config.hidepassed = true;
|
||||||
<script src="../vendor/underscore/test/objects.js"></script>
|
QUnit.config.excused = {
|
||||||
<script src="../vendor/underscore/test/utility.js"></script>
|
'Arrays': {
|
||||||
<script src="../vendor/underscore/test/chaining.js"></script>
|
'chunk': [
|
||||||
<script type="text/html" id="template">
|
'defaults to empty array (chunk size 0)'
|
||||||
<%
|
],
|
||||||
// a comment
|
'difference': [
|
||||||
if (data) { data += 12345; }; %>
|
'can perform an OO-style difference'
|
||||||
<li><%= data %></li>
|
],
|
||||||
|
'drop': [
|
||||||
|
'is an alias for rest'
|
||||||
|
],
|
||||||
|
'first': [
|
||||||
|
'returns an empty array when n <= 0 (0 case)',
|
||||||
|
'returns an empty array when n <= 0 (negative case)',
|
||||||
|
'can fetch the first n elements',
|
||||||
|
'returns the whole array if n > length'
|
||||||
|
],
|
||||||
|
'findIndex': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'findLastIndex': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'flatten': [
|
||||||
|
'supports empty arrays',
|
||||||
|
'can flatten nested arrays',
|
||||||
|
'works on an arguments object',
|
||||||
|
'can handle very deep arrays'
|
||||||
|
],
|
||||||
|
'indexOf': [
|
||||||
|
"sorted indexOf doesn't uses binary search",
|
||||||
|
'0'
|
||||||
|
],
|
||||||
|
'initial': [
|
||||||
|
'returns all but the last n elements',
|
||||||
|
'returns an empty array when n > length',
|
||||||
|
'works on an arguments object'
|
||||||
|
],
|
||||||
|
'intersection': [
|
||||||
|
'can perform an OO-style intersection'
|
||||||
|
],
|
||||||
|
'last': [
|
||||||
|
'returns an empty array when n <= 0 (0 case)',
|
||||||
|
'returns an empty array when n <= 0 (negative case)',
|
||||||
|
'can fetch the last n elements',
|
||||||
|
'returns the whole array if n > length'
|
||||||
|
],
|
||||||
|
'lastIndexOf': [
|
||||||
|
'should treat falsey `fromIndex` values, except `0` and `NaN`, as `array.length`',
|
||||||
|
'should treat non-number `fromIndex` values as `array.length`',
|
||||||
|
'[0,-1,-1]'
|
||||||
|
],
|
||||||
|
'object': [
|
||||||
|
'an array of pairs zipped together into an object',
|
||||||
|
'an object converted to pairs and back to an object'
|
||||||
|
],
|
||||||
|
'rest': [
|
||||||
|
'returns the whole array when index is 0',
|
||||||
|
'returns elements starting at the given index',
|
||||||
|
'works on an arguments object'
|
||||||
|
],
|
||||||
|
'sortedIndex': [
|
||||||
|
'2',
|
||||||
|
'3'
|
||||||
|
],
|
||||||
|
'tail': [
|
||||||
|
'is an alias for rest'
|
||||||
|
],
|
||||||
|
'take': [
|
||||||
|
'is an alias for first'
|
||||||
|
],
|
||||||
|
'uniq': [
|
||||||
|
'uses the result of `iterator` for uniqueness comparisons (unsorted case)',
|
||||||
|
'`sorted` argument defaults to false when omitted',
|
||||||
|
'when `iterator` is a string, uses that key for comparisons (unsorted case)',
|
||||||
|
'uses the result of `iterator` for uniqueness comparisons (sorted case)',
|
||||||
|
'when `iterator` is a string, uses that key for comparisons (sorted case)',
|
||||||
|
'can use falsey pluck like iterator'
|
||||||
|
],
|
||||||
|
'union': [
|
||||||
|
'can perform an OO-style union'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Chaining': {
|
||||||
|
'pop': true,
|
||||||
|
'shift': true,
|
||||||
|
'splice': true,
|
||||||
|
'reverse/concat/unshift/pop/map': [
|
||||||
|
'can chain together array functions.'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Collections': {
|
||||||
|
'lookupIterator with contexts': true,
|
||||||
|
'Iterating objects with sketchy length properties': true,
|
||||||
|
'Resistant to collection length and properties changing while iterating': true,
|
||||||
|
'countBy': [
|
||||||
|
'{}',
|
||||||
|
'[{}]'
|
||||||
|
],
|
||||||
|
'each': [
|
||||||
|
'context object property accessed'
|
||||||
|
],
|
||||||
|
'every': [
|
||||||
|
'Can be called with object',
|
||||||
|
'Died on test #15',
|
||||||
|
'context works'
|
||||||
|
],
|
||||||
|
'filter': [
|
||||||
|
'given context',
|
||||||
|
'OO-filter'
|
||||||
|
],
|
||||||
|
'find': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'findWhere': [
|
||||||
|
'checks properties given function'
|
||||||
|
],
|
||||||
|
'groupBy': [
|
||||||
|
'{}',
|
||||||
|
'[{}]'
|
||||||
|
],
|
||||||
|
'includes': [
|
||||||
|
"doesn't delegate to binary search"
|
||||||
|
],
|
||||||
|
'invoke': [
|
||||||
|
'handles null & undefined'
|
||||||
|
],
|
||||||
|
'map': [
|
||||||
|
'tripled numbers with context',
|
||||||
|
'OO-style doubled numbers'
|
||||||
|
],
|
||||||
|
'max': [
|
||||||
|
'can handle null/undefined',
|
||||||
|
'can perform a computation-based max',
|
||||||
|
'Maximum value of an empty object',
|
||||||
|
'Maximum value of an empty array',
|
||||||
|
'Maximum value of a non-numeric collection',
|
||||||
|
'Finds correct max in array starting with num and containing a NaN',
|
||||||
|
'Finds correct max in array starting with NaN',
|
||||||
|
'Respects iterator return value of -Infinity',
|
||||||
|
'String keys use property iterator',
|
||||||
|
'Iterator context',
|
||||||
|
'Lookup falsy iterator'
|
||||||
|
],
|
||||||
|
'min': [
|
||||||
|
'can handle null/undefined',
|
||||||
|
'can perform a computation-based min',
|
||||||
|
'Minimum value of an empty object',
|
||||||
|
'Minimum value of an empty array',
|
||||||
|
'Minimum value of a non-numeric collection',
|
||||||
|
'Finds correct min in array starting with NaN',
|
||||||
|
'Respects iterator return value of Infinity',
|
||||||
|
'String keys use property iterator',
|
||||||
|
'Iterator context',
|
||||||
|
'Lookup falsy iterator'
|
||||||
|
],
|
||||||
|
'partition': [
|
||||||
|
'can reference the array index',
|
||||||
|
'Died on test #8',
|
||||||
|
'partition takes a context argument'
|
||||||
|
],
|
||||||
|
'pluck': [
|
||||||
|
'[1]'
|
||||||
|
],
|
||||||
|
'reduce': [
|
||||||
|
'can reduce with a context object'
|
||||||
|
],
|
||||||
|
'reject': [
|
||||||
|
'Returns empty list given empty array'
|
||||||
|
],
|
||||||
|
'sample': [
|
||||||
|
'behaves correctly on negative n',
|
||||||
|
'Died on test #3'
|
||||||
|
],
|
||||||
|
'some': [
|
||||||
|
'Can be called with object',
|
||||||
|
'Died on test #17',
|
||||||
|
'context works'
|
||||||
|
],
|
||||||
|
'where': [
|
||||||
|
'checks properties given function'
|
||||||
|
],
|
||||||
|
'Can use various collection methods on NodeLists': [
|
||||||
|
'<span id="id2"></span>'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Functions': {
|
||||||
|
'debounce asap': true,
|
||||||
|
'debounce asap cancel': true,
|
||||||
|
'debounce asap recursively': true,
|
||||||
|
'debounce after system time is set backwards': true,
|
||||||
|
'debounce re-entrant': true,
|
||||||
|
'throttle repeatedly with results': true,
|
||||||
|
'more throttle does not trigger leading call when leading is set to false': true,
|
||||||
|
'throttle does not trigger trailing call when trailing is set to false': true,
|
||||||
|
'before': true,
|
||||||
|
'bind': [
|
||||||
|
'Died on test #2'
|
||||||
|
],
|
||||||
|
'bindAll': [
|
||||||
|
'throws an error for bindAll with no functions named'
|
||||||
|
],
|
||||||
|
'debounce': [
|
||||||
|
'incr was debounced'
|
||||||
|
],
|
||||||
|
'iteratee': [
|
||||||
|
'"bbiz"',
|
||||||
|
'"foo"',
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'memoize': [
|
||||||
|
'{"bar":"BAR","foo":"FOO"}',
|
||||||
|
'Died on test #8'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Objects': {
|
||||||
|
'#1929 Typed Array constructors are functions': true,
|
||||||
|
'allKeys': [
|
||||||
|
'is not fooled by sparse arrays; see issue #95',
|
||||||
|
'is not fooled by sparse arrays with additional properties',
|
||||||
|
'[]'
|
||||||
|
],
|
||||||
|
'extend': [
|
||||||
|
'extending null results in null',
|
||||||
|
'extending undefined results in undefined'
|
||||||
|
],
|
||||||
|
'extendOwn': [
|
||||||
|
'extending non-objects results in returning the non-object value',
|
||||||
|
'extending undefined results in undefined'
|
||||||
|
],
|
||||||
|
'functions': [
|
||||||
|
'also looks up functions on the prototype'
|
||||||
|
],
|
||||||
|
'isEqual': [
|
||||||
|
'`0` is not equal to `-0`',
|
||||||
|
'Commutative equality is implemented for `0` and `-0`',
|
||||||
|
'`new Number(0)` and `-0` are not equal',
|
||||||
|
'Commutative equality is implemented for `new Number(0)` and `-0`',
|
||||||
|
'Invalid dates are not equal',
|
||||||
|
'false'
|
||||||
|
],
|
||||||
|
'isFinite': [
|
||||||
|
'Numeric strings are numbers',
|
||||||
|
'Number instances can be finite'
|
||||||
|
],
|
||||||
|
'isSet': [
|
||||||
|
'Died on test #9'
|
||||||
|
],
|
||||||
|
'findKey': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'keys': [
|
||||||
|
'is not fooled by sparse arrays; see issue #95',
|
||||||
|
'[]'
|
||||||
|
],
|
||||||
|
'mapObject': [
|
||||||
|
'keep context',
|
||||||
|
'called with context',
|
||||||
|
'mapValue identity'
|
||||||
|
],
|
||||||
|
'omit': [
|
||||||
|
'can accept a predicate',
|
||||||
|
'function is given context'
|
||||||
|
],
|
||||||
|
'pick': [
|
||||||
|
'can accept a predicate and context',
|
||||||
|
'function is given context'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Utility': {
|
||||||
|
'_.escape & unescape': [
|
||||||
|
'` is escaped',
|
||||||
|
'` can be unescaped',
|
||||||
|
'can escape multiple occurances of `',
|
||||||
|
'multiple occurrences of ` can be unescaped'
|
||||||
|
],
|
||||||
|
'now': [
|
||||||
|
'Produces the correct time in milliseconds'
|
||||||
|
],
|
||||||
|
'times': [
|
||||||
|
'works as a wrapper'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var mixinPrereqs = (function() {
|
||||||
|
var aliasToReal = {
|
||||||
|
'all': 'every',
|
||||||
|
'allKeys': 'keysIn',
|
||||||
|
'any': 'some',
|
||||||
|
'collect': 'map',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'detect': 'find',
|
||||||
|
'extendOwn': 'assign',
|
||||||
|
'findWhere': 'find',
|
||||||
|
'foldl': 'reduce',
|
||||||
|
'foldr': 'reduceRight',
|
||||||
|
'include': 'includes',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
|
'inject': 'reduce',
|
||||||
|
'invoke': 'invokeMap',
|
||||||
|
'mapObject': 'mapValues',
|
||||||
|
'matcher': 'matches',
|
||||||
|
'methods': 'functions',
|
||||||
|
'object': 'zipObject',
|
||||||
|
'pairs': 'toPairs',
|
||||||
|
'pluck': 'map',
|
||||||
|
'restParam': 'restArgs',
|
||||||
|
'select': 'filter',
|
||||||
|
'unique': 'uniq',
|
||||||
|
'where': 'filter'
|
||||||
|
};
|
||||||
|
|
||||||
|
var keyMap = {
|
||||||
|
'rest': 'tail',
|
||||||
|
'restArgs': 'rest'
|
||||||
|
};
|
||||||
|
|
||||||
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
|
return function(_) {
|
||||||
|
lodash(_)
|
||||||
|
.defaultsDeep({ 'templateSettings': lodash.templateSettings })
|
||||||
|
.mixin(lodash.pick(lodash, lodash.difference(lodash.functions(lodash), lodash.functions(_))))
|
||||||
|
.value();
|
||||||
|
|
||||||
|
lodash.forOwn(keyMap, function(realName, otherName) {
|
||||||
|
_[otherName] = lodash[realName];
|
||||||
|
_.prototype[otherName] = lodash.prototype[realName];
|
||||||
|
});
|
||||||
|
lodash.forOwn(aliasToReal, function(realName, alias) {
|
||||||
|
_[alias] = _[realName];
|
||||||
|
_.prototype[alias] = _.prototype[realName];
|
||||||
|
});
|
||||||
|
return _;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Only excuse in Sauce Labs.
|
||||||
|
if (!ui.isSauceLabs) {
|
||||||
|
delete QUnit.config.excused.Functions['throttle does not trigger trailing call when trailing is set to false'];
|
||||||
|
delete QUnit.config.excused.Utility.now;
|
||||||
|
}
|
||||||
|
// Load prerequisite scripts.
|
||||||
|
document.write(ui.urlParams.loader == 'none'
|
||||||
|
? '<script src="' + ui.buildPath + '"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (ui.urlParams.loader == 'none') {
|
||||||
|
mixinPrereqs(_);
|
||||||
|
document.write([
|
||||||
|
'<script src="../vendor/underscore/test/collections.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/arrays.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/functions.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/objects.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/cross-document.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/utility.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/chaining.js"><\/script>'
|
||||||
|
].join('\n'));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
if (window.curl) {
|
||||||
|
curl.config({ 'apiName': 'require' });
|
||||||
|
}
|
||||||
|
if (!window.require) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Wrap to work around tests assuming Node `require` use.
|
||||||
|
require = (function(func) {
|
||||||
|
return function() {
|
||||||
|
return arguments[0] === '..' ? window._ : func.apply(null, arguments);
|
||||||
|
};
|
||||||
|
}(require));
|
||||||
|
|
||||||
|
var reBasename = /[\w.-]+$/,
|
||||||
|
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
|
||||||
|
modulePath = ui.buildPath.replace(/\.js$/, ''),
|
||||||
|
locationPath = modulePath.replace(reBasename, '').replace(/^\/|\/$/g, ''),
|
||||||
|
moduleId = /\bunderscore\b/i.test(ui.buildPath) ? 'underscore' : 'lodash',
|
||||||
|
moduleMain = modulePath.match(reBasename)[0],
|
||||||
|
uid = +new Date;
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
var result = {
|
||||||
|
'baseUrl': './',
|
||||||
|
'urlArgs': 't=' + uid++,
|
||||||
|
'waitSeconds': 0,
|
||||||
|
'paths': {},
|
||||||
|
'packages': [{
|
||||||
|
'name': 'test',
|
||||||
|
'location': '../vendor/underscore/test',
|
||||||
|
'config': {
|
||||||
|
// Work around no global being exported.
|
||||||
|
'exports': 'QUnit',
|
||||||
|
'loader': 'curl/loader/legacy'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
result.packages.push({
|
||||||
|
'name': moduleId,
|
||||||
|
'location': locationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
result.paths[moduleId] = modulePath;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.config.autostart = false;
|
||||||
|
QUnit.config.excused.Functions.iteratee = true;
|
||||||
|
QUnit.config.excused.Utility.noConflict = true;
|
||||||
|
QUnit.config.excused.Utility['noConflict (node vm)'] = true;
|
||||||
|
|
||||||
|
require(getConfig(), [moduleId], function(lodash) {
|
||||||
|
_ = mixinPrereqs(lodash);
|
||||||
|
require(getConfig(), [
|
||||||
|
'test/collections',
|
||||||
|
'test/arrays',
|
||||||
|
'test/functions',
|
||||||
|
'test/objects',
|
||||||
|
'test/cross-document',
|
||||||
|
'test/utility',
|
||||||
|
'test/chaining'
|
||||||
|
], QUnit.start);
|
||||||
|
});
|
||||||
|
}());
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
1
vendor/backbone
vendored
1
vendor/backbone
vendored
Submodule vendor/backbone deleted from 85bd0b5132
22
vendor/backbone/LICENSE
vendored
Normal file
22
vendor/backbone/LICENSE
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
Copyright (c) 2010-2016 Jeremy Ashkenas, DocumentCloud
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
1946
vendor/backbone/backbone.js
vendored
Normal file
1946
vendor/backbone/backbone.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2023
vendor/backbone/test/collection.js
vendored
Normal file
2023
vendor/backbone/test/collection.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
706
vendor/backbone/test/events.js
vendored
Normal file
706
vendor/backbone/test/events.js
vendored
Normal file
@@ -0,0 +1,706 @@
|
|||||||
|
(function(QUnit) {
|
||||||
|
|
||||||
|
QUnit.module('Backbone.Events');
|
||||||
|
|
||||||
|
QUnit.test('on and trigger', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
obj.on('event', function() { obj.counter += 1; });
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counter, 1, 'counter should be incremented.');
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counter, 5, 'counter should be incremented five times.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('binding and triggering multiple events', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
obj.on('a b c', function() { obj.counter += 1; });
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
|
obj.off('a c');
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('binding and triggering with event maps', function(assert) {
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
var increment = function() {
|
||||||
|
this.counter += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.on({
|
||||||
|
a: increment,
|
||||||
|
b: increment,
|
||||||
|
c: increment
|
||||||
|
}, obj);
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
|
obj.off({
|
||||||
|
a: increment,
|
||||||
|
c: increment
|
||||||
|
}, obj);
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('binding and triggering multiple event names with event maps', function(assert) {
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
var increment = function() {
|
||||||
|
this.counter += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.on({
|
||||||
|
'a b c': increment
|
||||||
|
});
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
|
obj.off({
|
||||||
|
'a c': increment
|
||||||
|
});
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('binding and trigger with event maps context', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
var context = {};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
obj.on({
|
||||||
|
a: function() {
|
||||||
|
assert.strictEqual(this, context, 'defaults `context` to `callback` param');
|
||||||
|
}
|
||||||
|
}, context).trigger('a');
|
||||||
|
|
||||||
|
obj.off().on({
|
||||||
|
a: function() {
|
||||||
|
assert.strictEqual(this, context, 'will not override explicit `context` param');
|
||||||
|
}
|
||||||
|
}, this, context).trigger('a');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenTo(b, 'all', function(){ assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenTo(b, 'all', function(){ assert.ok(false); });
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('anything');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening with event maps', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var cb = function(){ assert.ok(true); };
|
||||||
|
a.listenTo(b, {event: cb});
|
||||||
|
b.trigger('event');
|
||||||
|
a.listenTo(b, {event2: cb});
|
||||||
|
b.on('event2', cb);
|
||||||
|
a.stopListening(b, {event2: cb});
|
||||||
|
b.trigger('event event2');
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('event event2');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('stopListening with omitted args', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var cb = function() { assert.ok(true); };
|
||||||
|
a.listenTo(b, 'event', cb);
|
||||||
|
b.on('event', cb);
|
||||||
|
a.listenTo(b, 'event2', cb);
|
||||||
|
a.stopListening(null, {event: cb});
|
||||||
|
b.trigger('event event2');
|
||||||
|
b.off();
|
||||||
|
a.listenTo(b, 'event event2', cb);
|
||||||
|
a.stopListening(null, 'event');
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('event2');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
// Same as the previous test, but we use once rather than having to explicitly unbind
|
||||||
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var incrA = function(){ obj.counterA += 1; obj.trigger('event'); };
|
||||||
|
var incrB = function(){ obj.counterB += 1; };
|
||||||
|
obj.listenToOnce(obj, 'event', incrA);
|
||||||
|
obj.listenToOnce(obj, 'event', incrB);
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce and stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, 'all', function() { assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenToOnce(b, 'all', function() { assert.ok(false); });
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('anything');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo, listenToOnce and stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, 'all', function() { assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenTo(b, 'all', function() { assert.ok(false); });
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('anything');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening with event maps', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenTo(b, {change: function(){ assert.ok(true); }});
|
||||||
|
b.trigger('change');
|
||||||
|
a.listenTo(b, {change: function(){ assert.ok(false); }});
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('change');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo yourself', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var e = _.extend({}, Backbone.Events);
|
||||||
|
e.listenTo(e, 'foo', function(){ assert.ok(true); });
|
||||||
|
e.trigger('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo yourself cleans yourself up with stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var e = _.extend({}, Backbone.Events);
|
||||||
|
e.listenTo(e, 'foo', function(){ assert.ok(true); });
|
||||||
|
e.trigger('foo');
|
||||||
|
e.stopListening();
|
||||||
|
e.trigger('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('stopListening cleans up references', function(assert) {
|
||||||
|
assert.expect(12);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
b.on('event', fn);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening();
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening(b);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening(b, 'event');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening(b, 'event', fn);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('stopListening cleans up references from listenToOnce', function(assert) {
|
||||||
|
assert.expect(12);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
b.on('event', fn);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening();
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening(b);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening(b, 'event');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening(b, 'event', fn);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and off cleaning up references', function(assert) {
|
||||||
|
assert.expect(8);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off();
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off('event');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off(null, fn);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off(null, null, a);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening cleaning up references', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenTo(b, 'all', function(){ assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenTo(b, 'other', function(){ assert.ok(false); });
|
||||||
|
a.stopListening(b, 'other');
|
||||||
|
a.stopListening(b, 'all');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce without context cleans up references after the event has fired', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, 'all', function(){ assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce with event maps cleans up references', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, {
|
||||||
|
one: function() { assert.ok(true); },
|
||||||
|
two: function() { assert.ok(false); }
|
||||||
|
});
|
||||||
|
b.trigger('one');
|
||||||
|
assert.equal(_.size(a._listeningTo), 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce with event maps binds the correct `this`', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, {
|
||||||
|
one: function() { assert.ok(this === a); },
|
||||||
|
two: function() { assert.ok(false); }
|
||||||
|
});
|
||||||
|
b.trigger('one');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test("listenTo with empty callback doesn't throw an error", function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var e = _.extend({}, Backbone.Events);
|
||||||
|
e.listenTo(e, 'foo', null);
|
||||||
|
e.trigger('foo');
|
||||||
|
assert.ok(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('trigger all for each event', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var a, b, obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
obj.on('all', function(event) {
|
||||||
|
obj.counter++;
|
||||||
|
if (event === 'a') a = true;
|
||||||
|
if (event === 'b') b = true;
|
||||||
|
})
|
||||||
|
.trigger('a b');
|
||||||
|
assert.ok(a);
|
||||||
|
assert.ok(b);
|
||||||
|
assert.equal(obj.counter, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('on, then unbind all functions', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var callback = function() { obj.counter += 1; };
|
||||||
|
obj.on('event', callback);
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.off('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counter, 1, 'counter should have only been incremented once.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('bind two callbacks, unbind only one', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var callback = function() { obj.counterA += 1; };
|
||||||
|
obj.on('event', callback);
|
||||||
|
obj.on('event', function() { obj.counterB += 1; });
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.off('event', callback);
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
|
assert.equal(obj.counterB, 2, 'counterB should have been incremented twice.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('unbind a callback in the midst of it firing', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var callback = function() {
|
||||||
|
obj.counter += 1;
|
||||||
|
obj.off('event', callback);
|
||||||
|
};
|
||||||
|
obj.on('event', callback);
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counter, 1, 'the callback should have been unbound.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('two binds that unbind themeselves', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var incrA = function(){ obj.counterA += 1; obj.off('event', incrA); };
|
||||||
|
var incrB = function(){ obj.counterB += 1; obj.off('event', incrB); };
|
||||||
|
obj.on('event', incrA);
|
||||||
|
obj.on('event', incrB);
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('bind a callback with a default context when none supplied', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var obj = _.extend({
|
||||||
|
assertTrue: function() {
|
||||||
|
assert.equal(this, obj, '`this` was bound to the callback');
|
||||||
|
}
|
||||||
|
}, Backbone.Events);
|
||||||
|
|
||||||
|
obj.once('event', obj.assertTrue);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('bind a callback with a supplied context', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var TestClass = function() {
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
TestClass.prototype.assertTrue = function() {
|
||||||
|
assert.ok(true, '`this` was bound to the callback');
|
||||||
|
};
|
||||||
|
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.on('event', function() { this.assertTrue(); }, new TestClass);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('nested trigger with unbind', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var incr1 = function(){ obj.counter += 1; obj.off('event', incr1); obj.trigger('event'); };
|
||||||
|
var incr2 = function(){ obj.counter += 1; };
|
||||||
|
obj.on('event', incr1);
|
||||||
|
obj.on('event', incr2);
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counter, 3, 'counter should have been incremented three times');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('callback list is not altered during trigger', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var counter = 0, obj = _.extend({}, Backbone.Events);
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var incrOn = function(){ obj.on('event all', incr); };
|
||||||
|
var incrOff = function(){ obj.off('event all', incr); };
|
||||||
|
|
||||||
|
obj.on('event all', incrOn).trigger('event');
|
||||||
|
assert.equal(counter, 0, 'on does not alter callback list');
|
||||||
|
|
||||||
|
obj.off().on('event', incrOff).on('event all', incr).trigger('event');
|
||||||
|
assert.equal(counter, 2, 'off does not alter callback list');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test("#1282 - 'all' callback list is retrieved after each event.", function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var counter = 0;
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
obj.on('x', function() {
|
||||||
|
obj.on('y', incr).on('all', incr);
|
||||||
|
})
|
||||||
|
.trigger('x y');
|
||||||
|
assert.strictEqual(counter, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('if no callback is provided, `on` is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
_.extend({}, Backbone.Events).on('test').trigger('test');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('if callback is truthy but not a function, `on` should throw an error just like jQuery', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var view = _.extend({}, Backbone.Events).on('test', 'noop');
|
||||||
|
assert.raises(function() {
|
||||||
|
view.trigger('test');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('remove all events for a specific context', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.on('x y all', function() { assert.ok(true); });
|
||||||
|
obj.on('x y all', function() { assert.ok(false); }, obj);
|
||||||
|
obj.off(null, null, obj);
|
||||||
|
obj.trigger('x y');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('remove all events for a specific callback', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
var success = function() { assert.ok(true); };
|
||||||
|
var fail = function() { assert.ok(false); };
|
||||||
|
obj.on('x y all', success);
|
||||||
|
obj.on('x y all', fail);
|
||||||
|
obj.off(null, fail);
|
||||||
|
obj.trigger('x y');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1310 - off does not skip consecutive events', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.on('event', function() { assert.ok(false); }, obj);
|
||||||
|
obj.on('event', function() { assert.ok(false); }, obj);
|
||||||
|
obj.off(null, null, obj);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
// Same as the previous test, but we use once rather than having to explicitly unbind
|
||||||
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var incrA = function(){ obj.counterA += 1; obj.trigger('event'); };
|
||||||
|
var incrB = function(){ obj.counterB += 1; };
|
||||||
|
obj.once('event', incrA);
|
||||||
|
obj.once('event', incrB);
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once variant one', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var f = function(){ assert.ok(true); };
|
||||||
|
|
||||||
|
var a = _.extend({}, Backbone.Events).once('event', f);
|
||||||
|
var b = _.extend({}, Backbone.Events).on('event', f);
|
||||||
|
|
||||||
|
a.trigger('event');
|
||||||
|
|
||||||
|
b.trigger('event');
|
||||||
|
b.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once variant two', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var f = function(){ assert.ok(true); };
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
|
||||||
|
obj
|
||||||
|
.once('event', f)
|
||||||
|
.on('event', f)
|
||||||
|
.trigger('event')
|
||||||
|
.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with off', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var f = function(){ assert.ok(true); };
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
|
||||||
|
obj.once('event', f);
|
||||||
|
obj.off('event', f);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with event maps', function(assert) {
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
var increment = function() {
|
||||||
|
this.counter += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.once({
|
||||||
|
a: increment,
|
||||||
|
b: increment,
|
||||||
|
c: increment
|
||||||
|
}, obj);
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 2);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('bind a callback with a supplied context using once with object notation', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
var context = {};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
obj.once({
|
||||||
|
a: function() {
|
||||||
|
assert.strictEqual(this, context, 'defaults `context` to `callback` param');
|
||||||
|
}
|
||||||
|
}, context).trigger('a');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with off only by context', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var context = {};
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.once('event', function(){ assert.ok(false); }, context);
|
||||||
|
obj.off(null, null, context);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Backbone object inherits Events', function(assert) {
|
||||||
|
assert.ok(Backbone.on === Backbone.Events.on);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with asynchronous events', function(assert) {
|
||||||
|
var done = assert.async();
|
||||||
|
assert.expect(1);
|
||||||
|
var func = _.debounce(function() { assert.ok(true); done(); }, 50);
|
||||||
|
var obj = _.extend({}, Backbone.Events).once('async', func);
|
||||||
|
|
||||||
|
obj.trigger('async');
|
||||||
|
obj.trigger('async');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with multiple events.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.once('x y', function() { assert.ok(true); });
|
||||||
|
obj.trigger('x y');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Off during iteration with once.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
var f = function(){ this.off('event', f); };
|
||||||
|
obj.on('event', f);
|
||||||
|
obj.once('event', function(){});
|
||||||
|
obj.on('event', function(){ assert.ok(true); });
|
||||||
|
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('`once` on `all` should work as expected', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
Backbone.once('all', function() {
|
||||||
|
assert.ok(true);
|
||||||
|
Backbone.trigger('all');
|
||||||
|
});
|
||||||
|
Backbone.trigger('all');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once without a callback is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
_.extend({}, Backbone.Events).once('event').trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce without a callback is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.listenToOnce(obj, 'event').trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('event functions are chainable', function(assert) {
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
var obj2 = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
assert.equal(obj, obj.trigger('noeventssetyet'));
|
||||||
|
assert.equal(obj, obj.off('noeventssetyet'));
|
||||||
|
assert.equal(obj, obj.stopListening('noeventssetyet'));
|
||||||
|
assert.equal(obj, obj.on('a', fn));
|
||||||
|
assert.equal(obj, obj.once('c', fn));
|
||||||
|
assert.equal(obj, obj.trigger('a'));
|
||||||
|
assert.equal(obj, obj.listenTo(obj2, 'a', fn));
|
||||||
|
assert.equal(obj, obj.listenToOnce(obj2, 'b', fn));
|
||||||
|
assert.equal(obj, obj.off('a c'));
|
||||||
|
assert.equal(obj, obj.stopListening(obj2, 'a'));
|
||||||
|
assert.equal(obj, obj.stopListening());
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#3448 - listenToOnce with space-separated events', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var one = _.extend({}, Backbone.Events);
|
||||||
|
var two = _.extend({}, Backbone.Events);
|
||||||
|
var count = 1;
|
||||||
|
one.listenToOnce(two, 'x y', function(n) { assert.ok(n === count++); });
|
||||||
|
two.trigger('x', 1);
|
||||||
|
two.trigger('x', 1);
|
||||||
|
two.trigger('y', 2);
|
||||||
|
two.trigger('y', 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
})(QUnit);
|
||||||
1448
vendor/backbone/test/model.js
vendored
Normal file
1448
vendor/backbone/test/model.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13
vendor/backbone/test/noconflict.js
vendored
Normal file
13
vendor/backbone/test/noconflict.js
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
(function(QUnit) {
|
||||||
|
|
||||||
|
QUnit.module('Backbone.noConflict');
|
||||||
|
|
||||||
|
QUnit.test('noConflict', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var noconflictBackbone = Backbone.noConflict();
|
||||||
|
assert.equal(window.Backbone, undefined, 'Returned window.Backbone');
|
||||||
|
window.Backbone = noconflictBackbone;
|
||||||
|
assert.equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
||||||
|
});
|
||||||
|
|
||||||
|
})(QUnit);
|
||||||
1081
vendor/backbone/test/router.js
vendored
Normal file
1081
vendor/backbone/test/router.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
vendor/backbone/test/setup/dom-setup.js
vendored
Normal file
4
vendor/backbone/test/setup/dom-setup.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
$('body').append(
|
||||||
|
'<div id="qunit"></div>' +
|
||||||
|
'<div id="qunit-fixture"></div>'
|
||||||
|
);
|
||||||
45
vendor/backbone/test/setup/environment.js
vendored
Normal file
45
vendor/backbone/test/setup/environment.js
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
(function(QUnit) {
|
||||||
|
|
||||||
|
var sync = Backbone.sync;
|
||||||
|
var ajax = Backbone.ajax;
|
||||||
|
var emulateHTTP = Backbone.emulateHTTP;
|
||||||
|
var emulateJSON = Backbone.emulateJSON;
|
||||||
|
var history = window.history;
|
||||||
|
var pushState = history.pushState;
|
||||||
|
var replaceState = history.replaceState;
|
||||||
|
|
||||||
|
QUnit.config.noglobals = true;
|
||||||
|
|
||||||
|
QUnit.testStart(function() {
|
||||||
|
var env = QUnit.config.current.testEnvironment;
|
||||||
|
|
||||||
|
// We never want to actually call these during tests.
|
||||||
|
history.pushState = history.replaceState = function() {};
|
||||||
|
|
||||||
|
// Capture ajax settings for comparison.
|
||||||
|
Backbone.ajax = function(settings) {
|
||||||
|
env.ajaxSettings = settings;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Capture the arguments to Backbone.sync for comparison.
|
||||||
|
Backbone.sync = function(method, model, options) {
|
||||||
|
env.syncArgs = {
|
||||||
|
method: method,
|
||||||
|
model: model,
|
||||||
|
options: options
|
||||||
|
};
|
||||||
|
sync.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.testDone(function() {
|
||||||
|
Backbone.sync = sync;
|
||||||
|
Backbone.ajax = ajax;
|
||||||
|
Backbone.emulateHTTP = emulateHTTP;
|
||||||
|
Backbone.emulateJSON = emulateJSON;
|
||||||
|
history.pushState = pushState;
|
||||||
|
history.replaceState = replaceState;
|
||||||
|
});
|
||||||
|
|
||||||
|
})(QUnit);
|
||||||
239
vendor/backbone/test/sync.js
vendored
Normal file
239
vendor/backbone/test/sync.js
vendored
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
(function(QUnit) {
|
||||||
|
|
||||||
|
var Library = Backbone.Collection.extend({
|
||||||
|
url: function() { return '/library'; }
|
||||||
|
});
|
||||||
|
var library;
|
||||||
|
|
||||||
|
var attrs = {
|
||||||
|
title: 'The Tempest',
|
||||||
|
author: 'Bill Shakespeare',
|
||||||
|
length: 123
|
||||||
|
};
|
||||||
|
|
||||||
|
QUnit.module('Backbone.sync', {
|
||||||
|
|
||||||
|
beforeEach: function(assert) {
|
||||||
|
library = new Library;
|
||||||
|
library.create(attrs, {wait: false});
|
||||||
|
},
|
||||||
|
|
||||||
|
afterEach: function(assert) {
|
||||||
|
Backbone.emulateHTTP = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('read', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
library.fetch();
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'GET');
|
||||||
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
|
assert.ok(_.isEmpty(this.ajaxSettings.data));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('passing data', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
library.fetch({data: {a: 'a', one: 1}});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
|
assert.equal(this.ajaxSettings.data.a, 'a');
|
||||||
|
assert.equal(this.ajaxSettings.data.one, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('create', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
|
assert.equal(data.title, 'The Tempest');
|
||||||
|
assert.equal(data.author, 'Bill Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('update', function(assert) {
|
||||||
|
assert.expect(7);
|
||||||
|
library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/1-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'PUT');
|
||||||
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
|
assert.equal(data.id, '1-the-tempest');
|
||||||
|
assert.equal(data.title, 'The Tempest');
|
||||||
|
assert.equal(data.author, 'William Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('update with emulateHTTP and emulateJSON', function(assert) {
|
||||||
|
assert.expect(7);
|
||||||
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
|
emulateHTTP: true,
|
||||||
|
emulateJSON: true
|
||||||
|
});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
|
assert.equal(this.ajaxSettings.data._method, 'PUT');
|
||||||
|
var data = JSON.parse(this.ajaxSettings.data.model);
|
||||||
|
assert.equal(data.id, '2-the-tempest');
|
||||||
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('update with just emulateHTTP', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
|
emulateHTTP: true
|
||||||
|
});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
|
assert.equal(this.ajaxSettings.contentType, 'application/json');
|
||||||
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
|
assert.equal(data.id, '2-the-tempest');
|
||||||
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('update with just emulateJSON', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
|
emulateJSON: true
|
||||||
|
});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'PUT');
|
||||||
|
assert.equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded');
|
||||||
|
var data = JSON.parse(this.ajaxSettings.data.model);
|
||||||
|
assert.equal(data.id, '2-the-tempest');
|
||||||
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('read model', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
|
library.first().fetch();
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'GET');
|
||||||
|
assert.ok(_.isEmpty(this.ajaxSettings.data));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('destroy', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
|
library.first().destroy({wait: true});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'DELETE');
|
||||||
|
assert.equal(this.ajaxSettings.data, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('destroy with emulateHTTP', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
|
library.first().destroy({
|
||||||
|
emulateHTTP: true,
|
||||||
|
emulateJSON: true
|
||||||
|
});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
|
assert.equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('urlError', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model();
|
||||||
|
assert.raises(function() {
|
||||||
|
model.fetch();
|
||||||
|
});
|
||||||
|
model.fetch({url: '/one/two'});
|
||||||
|
assert.equal(this.ajaxSettings.url, '/one/two');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1052 - `options` is optional.', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var model = new Backbone.Model();
|
||||||
|
model.url = '/test';
|
||||||
|
Backbone.sync('create', model);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Backbone.ajax', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
Backbone.ajax = function(settings) {
|
||||||
|
assert.strictEqual(settings.url, '/test');
|
||||||
|
};
|
||||||
|
var model = new Backbone.Model();
|
||||||
|
model.url = '/test';
|
||||||
|
Backbone.sync('create', model);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Call provided error callback on error.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
Backbone.sync('read', model, {
|
||||||
|
error: function() { assert.ok(true); }
|
||||||
|
});
|
||||||
|
this.ajaxSettings.error();
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Use Backbone.emulateHTTP as default.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
|
||||||
|
Backbone.emulateHTTP = true;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateHTTP, true);
|
||||||
|
|
||||||
|
Backbone.emulateHTTP = false;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateHTTP, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Use Backbone.emulateJSON as default.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
|
||||||
|
Backbone.emulateJSON = true;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateJSON, true);
|
||||||
|
|
||||||
|
Backbone.emulateJSON = false;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateJSON, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1756 - Call user provided beforeSend function.', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
Backbone.emulateHTTP = true;
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
var xhr = {
|
||||||
|
setRequestHeader: function(header, value) {
|
||||||
|
assert.strictEqual(header, 'X-HTTP-Method-Override');
|
||||||
|
assert.strictEqual(value, 'DELETE');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
model.sync('delete', model, {
|
||||||
|
beforeSend: function(_xhr) {
|
||||||
|
assert.ok(_xhr === xhr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assert.strictEqual(this.ajaxSettings.beforeSend(xhr), false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#2928 - Pass along `textStatus` and `errorThrown`.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
model.on('error', function(m, xhr, options) {
|
||||||
|
assert.strictEqual(options.textStatus, 'textStatus');
|
||||||
|
assert.strictEqual(options.errorThrown, 'errorThrown');
|
||||||
|
});
|
||||||
|
model.fetch();
|
||||||
|
this.ajaxSettings.error({}, 'textStatus', 'errorThrown');
|
||||||
|
});
|
||||||
|
|
||||||
|
})(QUnit);
|
||||||
516
vendor/backbone/test/view.js
vendored
Normal file
516
vendor/backbone/test/view.js
vendored
Normal file
@@ -0,0 +1,516 @@
|
|||||||
|
(function(QUnit) {
|
||||||
|
|
||||||
|
var view;
|
||||||
|
|
||||||
|
QUnit.module('Backbone.View', {
|
||||||
|
|
||||||
|
beforeEach: function() {
|
||||||
|
$('#qunit-fixture').append(
|
||||||
|
'<div id="testElement"><h1>Test</h1></div>'
|
||||||
|
);
|
||||||
|
|
||||||
|
view = new Backbone.View({
|
||||||
|
id: 'test-view',
|
||||||
|
className: 'test-view',
|
||||||
|
other: 'non-special-option'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
afterEach: function() {
|
||||||
|
$('#testElement').remove();
|
||||||
|
$('#test-view').remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('constructor', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
assert.equal(view.el.id, 'test-view');
|
||||||
|
assert.equal(view.el.className, 'test-view');
|
||||||
|
assert.equal(view.el.other, void 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('$', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View;
|
||||||
|
myView.setElement('<p><a><b>test</b></a></p>');
|
||||||
|
var result = myView.$('a b');
|
||||||
|
|
||||||
|
assert.strictEqual(result[0].innerHTML, 'test');
|
||||||
|
assert.ok(result.length === +result.length);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('$el', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var myView = new Backbone.View;
|
||||||
|
myView.setElement('<p><a><b>test</b></a></p>');
|
||||||
|
assert.strictEqual(myView.el.nodeType, 1);
|
||||||
|
|
||||||
|
assert.ok(myView.$el instanceof Backbone.$);
|
||||||
|
assert.strictEqual(myView.$el[0], myView.el);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('initialize', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
initialize: function() {
|
||||||
|
this.one = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().one, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
preinitialize: function() {
|
||||||
|
this.one = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().one, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize occurs before the view is set up', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
preinitialize: function() {
|
||||||
|
assert.equal(this.el, undefined);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var _view = new View({});
|
||||||
|
assert.notEqual(_view.el, undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('render', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var myView = new Backbone.View;
|
||||||
|
assert.equal(myView.render(), myView, '#render returns the view instance');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('delegateEvents', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
var counter1 = 0, counter2 = 0;
|
||||||
|
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.increment = function() { counter1++; };
|
||||||
|
myView.$el.on('click', function() { counter2++; });
|
||||||
|
|
||||||
|
var events = {'click h1': 'increment'};
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 1);
|
||||||
|
assert.equal(counter2, 1);
|
||||||
|
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 2);
|
||||||
|
assert.equal(counter2, 2);
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 3);
|
||||||
|
assert.equal(counter2, 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('delegate', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', 'h1', function() {
|
||||||
|
assert.ok(true);
|
||||||
|
});
|
||||||
|
myView.delegate('click', function() {
|
||||||
|
assert.ok(true);
|
||||||
|
});
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
|
||||||
|
assert.equal(myView.delegate(), myView, '#delegate returns the view instance');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('delegateEvents allows functions for callbacks', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var myView = new Backbone.View({el: '<p></p>'});
|
||||||
|
myView.counter = 0;
|
||||||
|
|
||||||
|
var events = {
|
||||||
|
click: function() {
|
||||||
|
this.counter++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
assert.equal(myView.counter, 1);
|
||||||
|
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
assert.equal(myView.counter, 2);
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
assert.equal(myView.counter, 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('delegateEvents ignore undefined methods', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var myView = new Backbone.View({el: '<p></p>'});
|
||||||
|
myView.delegateEvents({click: 'undefinedMethod'});
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegateEvents', function(assert) {
|
||||||
|
assert.expect(7);
|
||||||
|
var counter1 = 0, counter2 = 0;
|
||||||
|
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.increment = function() { counter1++; };
|
||||||
|
myView.$el.on('click', function() { counter2++; });
|
||||||
|
|
||||||
|
var events = {'click h1': 'increment'};
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 1);
|
||||||
|
assert.equal(counter2, 1);
|
||||||
|
|
||||||
|
myView.undelegateEvents();
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 1);
|
||||||
|
assert.equal(counter2, 2);
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 2);
|
||||||
|
assert.equal(counter2, 3);
|
||||||
|
|
||||||
|
assert.equal(myView.undelegateEvents(), myView, '#undelegateEvents returns the view instance');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', function() { assert.ok(false); });
|
||||||
|
myView.delegate('click', 'h1', function() { assert.ok(false); });
|
||||||
|
|
||||||
|
myView.undelegate('click');
|
||||||
|
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
|
||||||
|
assert.equal(myView.undelegate(), myView, '#undelegate returns the view instance');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate with passed handler', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
var listener = function() { assert.ok(false); };
|
||||||
|
myView.delegate('click', listener);
|
||||||
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
|
myView.undelegate('click', listener);
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate with selector', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
|
myView.delegate('click', 'h1', function() { assert.ok(false); });
|
||||||
|
myView.undelegate('click', 'h1');
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate with handler and selector', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
|
var handler = function() { assert.ok(false); };
|
||||||
|
myView.delegate('click', 'h1', handler);
|
||||||
|
myView.undelegate('click', 'h1', handler);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('tagName can be provided as a string', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
tagName: 'span'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(new View().el.tagName, 'SPAN');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('tagName can be provided as a function', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
tagName: function() {
|
||||||
|
return 'p';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.ok(new View().$el.is('p'));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_ensureElement with DOM node el', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: document.body
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(new View().el, document.body);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_ensureElement with string el', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: 'body'
|
||||||
|
});
|
||||||
|
assert.strictEqual(new View().el, document.body);
|
||||||
|
|
||||||
|
View = Backbone.View.extend({
|
||||||
|
el: '#testElement > h1'
|
||||||
|
});
|
||||||
|
assert.strictEqual(new View().el, $('#testElement > h1').get(0));
|
||||||
|
|
||||||
|
View = Backbone.View.extend({
|
||||||
|
el: '#nonexistent'
|
||||||
|
});
|
||||||
|
assert.ok(!new View().el);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('with className and id functions', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
className: function() {
|
||||||
|
return 'className';
|
||||||
|
},
|
||||||
|
id: function() {
|
||||||
|
return 'id';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().el.className, 'className');
|
||||||
|
assert.strictEqual(new View().el.id, 'id');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('with attributes', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
attributes: {
|
||||||
|
'id': 'id',
|
||||||
|
'class': 'class'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().el.className, 'class');
|
||||||
|
assert.strictEqual(new View().el.id, 'id');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('with attributes as a function', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
attributes: function() {
|
||||||
|
return {'class': 'dynamic'};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().el.className, 'dynamic');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('should default to className/id properties', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
className: 'backboneClass',
|
||||||
|
id: 'backboneId',
|
||||||
|
attributes: {
|
||||||
|
'class': 'attributeClass',
|
||||||
|
'id': 'attributeId'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View;
|
||||||
|
assert.strictEqual(myView.el.className, 'backboneClass');
|
||||||
|
assert.strictEqual(myView.el.id, 'backboneId');
|
||||||
|
assert.strictEqual(myView.$el.attr('class'), 'backboneClass');
|
||||||
|
assert.strictEqual(myView.$el.attr('id'), 'backboneId');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('multiple views per element', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var count = 0;
|
||||||
|
var $el = $('<p></p>');
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: $el,
|
||||||
|
events: {
|
||||||
|
click: function() {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var view1 = new View;
|
||||||
|
$el.trigger('click');
|
||||||
|
assert.equal(1, count);
|
||||||
|
|
||||||
|
var view2 = new View;
|
||||||
|
$el.trigger('click');
|
||||||
|
assert.equal(3, count);
|
||||||
|
|
||||||
|
view1.delegateEvents();
|
||||||
|
$el.trigger('click');
|
||||||
|
assert.equal(5, count);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('custom events', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: $('body'),
|
||||||
|
events: {
|
||||||
|
fake$event: function() { assert.ok(true); }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View;
|
||||||
|
$('body').trigger('fake$event').trigger('fake$event');
|
||||||
|
|
||||||
|
$('body').off('fake$event');
|
||||||
|
$('body').trigger('fake$event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1048 - setElement uses provided object.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var $el = $('body');
|
||||||
|
|
||||||
|
var myView = new Backbone.View({el: $el});
|
||||||
|
assert.ok(myView.$el === $el);
|
||||||
|
|
||||||
|
myView.setElement($el = $($el));
|
||||||
|
assert.ok(myView.$el === $el);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#986 - Undelegate before changing element.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var button1 = $('<button></button>');
|
||||||
|
var button2 = $('<button></button>');
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
events: {
|
||||||
|
click: function(e) {
|
||||||
|
assert.ok(myView.el === e.target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View({el: button1});
|
||||||
|
myView.setElement(button2);
|
||||||
|
|
||||||
|
button1.trigger('click');
|
||||||
|
button2.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1172 - Clone attributes object', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
attributes: {foo: 'bar'}
|
||||||
|
});
|
||||||
|
|
||||||
|
var view1 = new View({id: 'foo'});
|
||||||
|
assert.strictEqual(view1.el.id, 'foo');
|
||||||
|
|
||||||
|
var view2 = new View();
|
||||||
|
assert.ok(!view2.el.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('views stopListening', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
initialize: function() {
|
||||||
|
this.listenTo(this.model, 'all x', function() { assert.ok(false); });
|
||||||
|
this.listenTo(this.collection, 'all x', function() { assert.ok(false); });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View({
|
||||||
|
model: new Backbone.Model,
|
||||||
|
collection: new Backbone.Collection
|
||||||
|
});
|
||||||
|
|
||||||
|
myView.stopListening();
|
||||||
|
myView.model.trigger('x');
|
||||||
|
myView.collection.trigger('x');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Provide function for el.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: function() {
|
||||||
|
return '<p><a></a></p>';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View;
|
||||||
|
assert.ok(myView.$el.is('p'));
|
||||||
|
assert.ok(myView.$el.has('a'));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('events passed in options', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var counter = 0;
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: '#testElement',
|
||||||
|
increment: function() {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View({
|
||||||
|
events: {
|
||||||
|
'click h1': 'increment'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
myView.$('h1').trigger('click').trigger('click');
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('remove', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View;
|
||||||
|
document.body.appendChild(view.el);
|
||||||
|
|
||||||
|
myView.delegate('click', function() { assert.ok(false); });
|
||||||
|
myView.listenTo(myView, 'all x', function() { assert.ok(false); });
|
||||||
|
|
||||||
|
assert.equal(myView.remove(), myView, '#remove returns the view instance');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
myView.trigger('x');
|
||||||
|
|
||||||
|
// In IE8 and below, parentNode still exists but is not document.body.
|
||||||
|
assert.notEqual(myView.el.parentNode, document.body);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('setElement', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var myView = new Backbone.View({
|
||||||
|
events: {
|
||||||
|
click: function() { assert.ok(false); }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
myView.events = {
|
||||||
|
click: function() { assert.ok(true); }
|
||||||
|
};
|
||||||
|
var oldEl = myView.el;
|
||||||
|
var $oldEl = myView.$el;
|
||||||
|
|
||||||
|
myView.setElement(document.createElement('div'));
|
||||||
|
|
||||||
|
$oldEl.click();
|
||||||
|
myView.$el.click();
|
||||||
|
|
||||||
|
assert.notEqual(oldEl, myView.el);
|
||||||
|
assert.notEqual($oldEl, myView.$el);
|
||||||
|
});
|
||||||
|
|
||||||
|
})(QUnit);
|
||||||
1
vendor/benchmark.js
vendored
1
vendor/benchmark.js
vendored
Submodule vendor/benchmark.js deleted from c304a20cd6
1
vendor/docdown
vendored
1
vendor/docdown
vendored
Submodule vendor/docdown deleted from 87466c279a
1049
vendor/firebug-lite/changelog.txt
vendored
1049
vendor/firebug-lite/changelog.txt
vendored
File diff suppressed because it is too large
Load Diff
@@ -6258,7 +6258,7 @@ FBL.Firebug =
|
|||||||
{
|
{
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
version: "Firebug Lite 1.4.0",
|
version: "Firebug Lite 1.4.0",
|
||||||
revision: "$Revision: 11967 $",
|
revision: "$Revision$",
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
modules: modules,
|
modules: modules,
|
||||||
|
|||||||
519
vendor/json-js/json2.js
vendored
Normal file
519
vendor/json-js/json2.js
vendored
Normal file
@@ -0,0 +1,519 @@
|
|||||||
|
/*
|
||||||
|
json2.js
|
||||||
|
2015-05-03
|
||||||
|
|
||||||
|
Public Domain.
|
||||||
|
|
||||||
|
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||||
|
|
||||||
|
See http://www.JSON.org/js.html
|
||||||
|
|
||||||
|
|
||||||
|
This code should be minified before deployment.
|
||||||
|
See http://javascript.crockford.com/jsmin.html
|
||||||
|
|
||||||
|
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||||
|
NOT CONTROL.
|
||||||
|
|
||||||
|
|
||||||
|
This file creates a global JSON object containing two methods: stringify
|
||||||
|
and parse. This file is provides the ES5 JSON capability to ES3 systems.
|
||||||
|
If a project might run on IE8 or earlier, then this file should be included.
|
||||||
|
This file does nothing on ES5 systems.
|
||||||
|
|
||||||
|
JSON.stringify(value, replacer, space)
|
||||||
|
value any JavaScript value, usually an object or array.
|
||||||
|
|
||||||
|
replacer an optional parameter that determines how object
|
||||||
|
values are stringified for objects. It can be a
|
||||||
|
function or an array of strings.
|
||||||
|
|
||||||
|
space an optional parameter that specifies the indentation
|
||||||
|
of nested structures. If it is omitted, the text will
|
||||||
|
be packed without extra whitespace. If it is a number,
|
||||||
|
it will specify the number of spaces to indent at each
|
||||||
|
level. If it is a string (such as '\t' or ' '),
|
||||||
|
it contains the characters used to indent at each level.
|
||||||
|
|
||||||
|
This method produces a JSON text from a JavaScript value.
|
||||||
|
|
||||||
|
When an object value is found, if the object contains a toJSON
|
||||||
|
method, its toJSON method will be called and the result will be
|
||||||
|
stringified. A toJSON method does not serialize: it returns the
|
||||||
|
value represented by the name/value pair that should be serialized,
|
||||||
|
or undefined if nothing should be serialized. The toJSON method
|
||||||
|
will be passed the key associated with the value, and this will be
|
||||||
|
bound to the value
|
||||||
|
|
||||||
|
For example, this would serialize Dates as ISO strings.
|
||||||
|
|
||||||
|
Date.prototype.toJSON = function (key) {
|
||||||
|
function f(n) {
|
||||||
|
// Format integers to have at least two digits.
|
||||||
|
return n < 10
|
||||||
|
? '0' + n
|
||||||
|
: n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.getUTCFullYear() + '-' +
|
||||||
|
f(this.getUTCMonth() + 1) + '-' +
|
||||||
|
f(this.getUTCDate()) + 'T' +
|
||||||
|
f(this.getUTCHours()) + ':' +
|
||||||
|
f(this.getUTCMinutes()) + ':' +
|
||||||
|
f(this.getUTCSeconds()) + 'Z';
|
||||||
|
};
|
||||||
|
|
||||||
|
You can provide an optional replacer method. It will be passed the
|
||||||
|
key and value of each member, with this bound to the containing
|
||||||
|
object. The value that is returned from your method will be
|
||||||
|
serialized. If your method returns undefined, then the member will
|
||||||
|
be excluded from the serialization.
|
||||||
|
|
||||||
|
If the replacer parameter is an array of strings, then it will be
|
||||||
|
used to select the members to be serialized. It filters the results
|
||||||
|
such that only members with keys listed in the replacer array are
|
||||||
|
stringified.
|
||||||
|
|
||||||
|
Values that do not have JSON representations, such as undefined or
|
||||||
|
functions, will not be serialized. Such values in objects will be
|
||||||
|
dropped; in arrays they will be replaced with null. You can use
|
||||||
|
a replacer function to replace those with JSON values.
|
||||||
|
JSON.stringify(undefined) returns undefined.
|
||||||
|
|
||||||
|
The optional space parameter produces a stringification of the
|
||||||
|
value that is filled with line breaks and indentation to make it
|
||||||
|
easier to read.
|
||||||
|
|
||||||
|
If the space parameter is a non-empty string, then that string will
|
||||||
|
be used for indentation. If the space parameter is a number, then
|
||||||
|
the indentation will be that many spaces.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||||
|
// text is '["e",{"pluribus":"unum"}]'
|
||||||
|
|
||||||
|
|
||||||
|
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||||
|
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||||
|
|
||||||
|
text = JSON.stringify([new Date()], function (key, value) {
|
||||||
|
return this[key] instanceof Date
|
||||||
|
? 'Date(' + this[key] + ')'
|
||||||
|
: value;
|
||||||
|
});
|
||||||
|
// text is '["Date(---current time---)"]'
|
||||||
|
|
||||||
|
|
||||||
|
JSON.parse(text, reviver)
|
||||||
|
This method parses a JSON text to produce an object or array.
|
||||||
|
It can throw a SyntaxError exception.
|
||||||
|
|
||||||
|
The optional reviver parameter is a function that can filter and
|
||||||
|
transform the results. It receives each of the keys and values,
|
||||||
|
and its return value is used instead of the original value.
|
||||||
|
If it returns what it received, then the structure is not modified.
|
||||||
|
If it returns undefined then the member is deleted.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
// Parse the text. Values that look like ISO date strings will
|
||||||
|
// be converted to Date objects.
|
||||||
|
|
||||||
|
myData = JSON.parse(text, function (key, value) {
|
||||||
|
var a;
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
a =
|
||||||
|
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||||
|
if (a) {
|
||||||
|
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||||
|
+a[5], +a[6]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
|
||||||
|
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||||
|
var d;
|
||||||
|
if (typeof value === 'string' &&
|
||||||
|
value.slice(0, 5) === 'Date(' &&
|
||||||
|
value.slice(-1) === ')') {
|
||||||
|
d = new Date(value.slice(5, -1));
|
||||||
|
if (d) {
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
This is a reference implementation. You are free to copy, modify, or
|
||||||
|
redistribute.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*jslint
|
||||||
|
eval, for, this
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*property
|
||||||
|
JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||||
|
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||||
|
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||||
|
test, toJSON, toString, valueOf
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Create a JSON object only if one does not already exist. We create the
|
||||||
|
// methods in a closure to avoid creating global variables.
|
||||||
|
|
||||||
|
if (typeof JSON !== 'object') {
|
||||||
|
JSON = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var rx_one = /^[\],:{}\s]*$/,
|
||||||
|
rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
|
||||||
|
rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
|
||||||
|
rx_four = /(?:^|:|,)(?:\s*\[)+/g,
|
||||||
|
rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||||
|
rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
|
||||||
|
|
||||||
|
function f(n) {
|
||||||
|
// Format integers to have at least two digits.
|
||||||
|
return n < 10
|
||||||
|
? '0' + n
|
||||||
|
: n;
|
||||||
|
}
|
||||||
|
|
||||||
|
function this_value() {
|
||||||
|
return this.valueOf();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof Date.prototype.toJSON !== 'function') {
|
||||||
|
|
||||||
|
Date.prototype.toJSON = function () {
|
||||||
|
|
||||||
|
return isFinite(this.valueOf())
|
||||||
|
? this.getUTCFullYear() + '-' +
|
||||||
|
f(this.getUTCMonth() + 1) + '-' +
|
||||||
|
f(this.getUTCDate()) + 'T' +
|
||||||
|
f(this.getUTCHours()) + ':' +
|
||||||
|
f(this.getUTCMinutes()) + ':' +
|
||||||
|
f(this.getUTCSeconds()) + 'Z'
|
||||||
|
: null;
|
||||||
|
};
|
||||||
|
|
||||||
|
Boolean.prototype.toJSON = this_value;
|
||||||
|
Number.prototype.toJSON = this_value;
|
||||||
|
String.prototype.toJSON = this_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
var gap,
|
||||||
|
indent,
|
||||||
|
meta,
|
||||||
|
rep;
|
||||||
|
|
||||||
|
|
||||||
|
function quote(string) {
|
||||||
|
|
||||||
|
// If the string contains no control characters, no quote characters, and no
|
||||||
|
// backslash characters, then we can safely slap some quotes around it.
|
||||||
|
// Otherwise we must also replace the offending characters with safe escape
|
||||||
|
// sequences.
|
||||||
|
|
||||||
|
rx_escapable.lastIndex = 0;
|
||||||
|
return rx_escapable.test(string)
|
||||||
|
? '"' + string.replace(rx_escapable, function (a) {
|
||||||
|
var c = meta[a];
|
||||||
|
return typeof c === 'string'
|
||||||
|
? c
|
||||||
|
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
|
}) + '"'
|
||||||
|
: '"' + string + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function str(key, holder) {
|
||||||
|
|
||||||
|
// Produce a string from holder[key].
|
||||||
|
|
||||||
|
var i, // The loop counter.
|
||||||
|
k, // The member key.
|
||||||
|
v, // The member value.
|
||||||
|
length,
|
||||||
|
mind = gap,
|
||||||
|
partial,
|
||||||
|
value = holder[key];
|
||||||
|
|
||||||
|
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||||
|
|
||||||
|
if (value && typeof value === 'object' &&
|
||||||
|
typeof value.toJSON === 'function') {
|
||||||
|
value = value.toJSON(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we were called with a replacer function, then call the replacer to
|
||||||
|
// obtain a replacement value.
|
||||||
|
|
||||||
|
if (typeof rep === 'function') {
|
||||||
|
value = rep.call(holder, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// What happens next depends on the value's type.
|
||||||
|
|
||||||
|
switch (typeof value) {
|
||||||
|
case 'string':
|
||||||
|
return quote(value);
|
||||||
|
|
||||||
|
case 'number':
|
||||||
|
|
||||||
|
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||||
|
|
||||||
|
return isFinite(value)
|
||||||
|
? String(value)
|
||||||
|
: 'null';
|
||||||
|
|
||||||
|
case 'boolean':
|
||||||
|
case 'null':
|
||||||
|
|
||||||
|
// If the value is a boolean or null, convert it to a string. Note:
|
||||||
|
// typeof null does not produce 'null'. The case is included here in
|
||||||
|
// the remote chance that this gets fixed someday.
|
||||||
|
|
||||||
|
return String(value);
|
||||||
|
|
||||||
|
// If the type is 'object', we might be dealing with an object or an array or
|
||||||
|
// null.
|
||||||
|
|
||||||
|
case 'object':
|
||||||
|
|
||||||
|
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||||
|
// so watch out for that case.
|
||||||
|
|
||||||
|
if (!value) {
|
||||||
|
return 'null';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make an array to hold the partial results of stringifying this object value.
|
||||||
|
|
||||||
|
gap += indent;
|
||||||
|
partial = [];
|
||||||
|
|
||||||
|
// Is the value an array?
|
||||||
|
|
||||||
|
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||||
|
|
||||||
|
// The value is an array. Stringify every element. Use null as a placeholder
|
||||||
|
// for non-JSON values.
|
||||||
|
|
||||||
|
length = value.length;
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
partial[i] = str(i, value) || 'null';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join all of the elements together, separated with commas, and wrap them in
|
||||||
|
// brackets.
|
||||||
|
|
||||||
|
v = partial.length === 0
|
||||||
|
? '[]'
|
||||||
|
: gap
|
||||||
|
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
||||||
|
: '[' + partial.join(',') + ']';
|
||||||
|
gap = mind;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the replacer is an array, use it to select the members to be stringified.
|
||||||
|
|
||||||
|
if (rep && typeof rep === 'object') {
|
||||||
|
length = rep.length;
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
if (typeof rep[i] === 'string') {
|
||||||
|
k = rep[i];
|
||||||
|
v = str(k, value);
|
||||||
|
if (v) {
|
||||||
|
partial.push(quote(k) + (
|
||||||
|
gap
|
||||||
|
? ': '
|
||||||
|
: ':'
|
||||||
|
) + v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Otherwise, iterate through all of the keys in the object.
|
||||||
|
|
||||||
|
for (k in value) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||||
|
v = str(k, value);
|
||||||
|
if (v) {
|
||||||
|
partial.push(quote(k) + (
|
||||||
|
gap
|
||||||
|
? ': '
|
||||||
|
: ':'
|
||||||
|
) + v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join all of the member texts together, separated with commas,
|
||||||
|
// and wrap them in braces.
|
||||||
|
|
||||||
|
v = partial.length === 0
|
||||||
|
? '{}'
|
||||||
|
: gap
|
||||||
|
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
||||||
|
: '{' + partial.join(',') + '}';
|
||||||
|
gap = mind;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the JSON object does not yet have a stringify method, give it one.
|
||||||
|
|
||||||
|
if (typeof JSON.stringify !== 'function') {
|
||||||
|
meta = { // table of character substitutions
|
||||||
|
'\b': '\\b',
|
||||||
|
'\t': '\\t',
|
||||||
|
'\n': '\\n',
|
||||||
|
'\f': '\\f',
|
||||||
|
'\r': '\\r',
|
||||||
|
'"': '\\"',
|
||||||
|
'\\': '\\\\'
|
||||||
|
};
|
||||||
|
JSON.stringify = function (value, replacer, space) {
|
||||||
|
|
||||||
|
// The stringify method takes a value and an optional replacer, and an optional
|
||||||
|
// space parameter, and returns a JSON text. The replacer can be a function
|
||||||
|
// that can replace values, or an array of strings that will select the keys.
|
||||||
|
// A default replacer method can be provided. Use of the space parameter can
|
||||||
|
// produce text that is more easily readable.
|
||||||
|
|
||||||
|
var i;
|
||||||
|
gap = '';
|
||||||
|
indent = '';
|
||||||
|
|
||||||
|
// If the space parameter is a number, make an indent string containing that
|
||||||
|
// many spaces.
|
||||||
|
|
||||||
|
if (typeof space === 'number') {
|
||||||
|
for (i = 0; i < space; i += 1) {
|
||||||
|
indent += ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the space parameter is a string, it will be used as the indent string.
|
||||||
|
|
||||||
|
} else if (typeof space === 'string') {
|
||||||
|
indent = space;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is a replacer, it must be a function or an array.
|
||||||
|
// Otherwise, throw an error.
|
||||||
|
|
||||||
|
rep = replacer;
|
||||||
|
if (replacer && typeof replacer !== 'function' &&
|
||||||
|
(typeof replacer !== 'object' ||
|
||||||
|
typeof replacer.length !== 'number')) {
|
||||||
|
throw new Error('JSON.stringify');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a fake root object containing our value under the key of ''.
|
||||||
|
// Return the result of stringifying the value.
|
||||||
|
|
||||||
|
return str('', {'': value});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// If the JSON object does not yet have a parse method, give it one.
|
||||||
|
|
||||||
|
if (typeof JSON.parse !== 'function') {
|
||||||
|
JSON.parse = function (text, reviver) {
|
||||||
|
|
||||||
|
// The parse method takes a text and an optional reviver function, and returns
|
||||||
|
// a JavaScript value if the text is a valid JSON text.
|
||||||
|
|
||||||
|
var j;
|
||||||
|
|
||||||
|
function walk(holder, key) {
|
||||||
|
|
||||||
|
// The walk method is used to recursively walk the resulting structure so
|
||||||
|
// that modifications can be made.
|
||||||
|
|
||||||
|
var k, v, value = holder[key];
|
||||||
|
if (value && typeof value === 'object') {
|
||||||
|
for (k in value) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||||
|
v = walk(value, k);
|
||||||
|
if (v !== undefined) {
|
||||||
|
value[k] = v;
|
||||||
|
} else {
|
||||||
|
delete value[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return reviver.call(holder, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Parsing happens in four stages. In the first stage, we replace certain
|
||||||
|
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||||
|
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||||
|
|
||||||
|
text = String(text);
|
||||||
|
rx_dangerous.lastIndex = 0;
|
||||||
|
if (rx_dangerous.test(text)) {
|
||||||
|
text = text.replace(rx_dangerous, function (a) {
|
||||||
|
return '\\u' +
|
||||||
|
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// In the second stage, we run the text against regular expressions that look
|
||||||
|
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||||
|
// because they can cause invocation, and '=' because it can cause mutation.
|
||||||
|
// But just to be safe, we want to reject all unexpected forms.
|
||||||
|
|
||||||
|
// We split the second stage into 4 regexp operations in order to work around
|
||||||
|
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||||
|
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||||
|
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||||
|
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||||
|
// we look to see that the remaining characters are only whitespace or ']' or
|
||||||
|
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||||
|
|
||||||
|
if (
|
||||||
|
rx_one.test(
|
||||||
|
text
|
||||||
|
.replace(rx_two, '@')
|
||||||
|
.replace(rx_three, ']')
|
||||||
|
.replace(rx_four, '')
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
|
||||||
|
// In the third stage we use the eval function to compile the text into a
|
||||||
|
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||||
|
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||||
|
// in parens to eliminate the ambiguity.
|
||||||
|
|
||||||
|
j = eval('(' + text + ')');
|
||||||
|
|
||||||
|
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||||
|
// each name/value pair to a reviver function for possible transformation.
|
||||||
|
|
||||||
|
return typeof reviver === 'function'
|
||||||
|
? walk({'': j}, '')
|
||||||
|
: j;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||||
|
|
||||||
|
throw new SyntaxError('JSON.parse');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}());
|
||||||
1
vendor/qunit
vendored
1
vendor/qunit
vendored
Submodule vendor/qunit deleted from 3f5e8b2123
1
vendor/qunit-clib
vendored
1
vendor/qunit-clib
vendored
Submodule vendor/qunit-clib deleted from 2ed9f21633
1
vendor/requirejs
vendored
1
vendor/requirejs
vendored
Submodule vendor/requirejs deleted from 42dba3d981
1
vendor/uglifyjs
vendored
1
vendor/uglifyjs
vendored
Submodule vendor/uglifyjs deleted from e87718e2d1
1
vendor/underscore
vendored
1
vendor/underscore
vendored
Submodule vendor/underscore deleted from 7229edc46e
23
vendor/underscore/LICENSE
vendored
Normal file
23
vendor/underscore/LICENSE
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Copyright (c) 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative
|
||||||
|
Reporters & Editors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
563
vendor/underscore/test/arrays.js
vendored
Normal file
563
vendor/underscore/test/arrays.js
vendored
Normal file
@@ -0,0 +1,563 @@
|
|||||||
|
(function() {
|
||||||
|
var _ = typeof require == 'function' ? require('..') : window._;
|
||||||
|
|
||||||
|
QUnit.module('Arrays');
|
||||||
|
|
||||||
|
QUnit.test('first', function(assert) {
|
||||||
|
assert.equal(_.first([1, 2, 3]), 1, 'can pull out the first element of an array');
|
||||||
|
assert.equal(_([1, 2, 3]).first(), 1, 'can perform OO-style "first()"');
|
||||||
|
assert.deepEqual(_.first([1, 2, 3], 0), [], 'returns an empty array when n <= 0 (0 case)');
|
||||||
|
assert.deepEqual(_.first([1, 2, 3], -1), [], 'returns an empty array when n <= 0 (negative case)');
|
||||||
|
assert.deepEqual(_.first([1, 2, 3], 2), [1, 2], 'can fetch the first n elements');
|
||||||
|
assert.deepEqual(_.first([1, 2, 3], 5), [1, 2, 3], 'returns the whole array if n > length');
|
||||||
|
var result = (function(){ return _.first(arguments); }(4, 3, 2, 1));
|
||||||
|
assert.equal(result, 4, 'works on an arguments object');
|
||||||
|
result = _.map([[1, 2, 3], [1, 2, 3]], _.first);
|
||||||
|
assert.deepEqual(result, [1, 1], 'works well with _.map');
|
||||||
|
assert.equal(_.first(null), void 0, 'returns undefined when called on null');
|
||||||
|
|
||||||
|
Array.prototype[0] = 'boo';
|
||||||
|
assert.equal(_.first([]), void 0, 'return undefined when called on a empty array');
|
||||||
|
delete Array.prototype[0];
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('head', function(assert) {
|
||||||
|
assert.strictEqual(_.head, _.first, 'is an alias for first');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('take', function(assert) {
|
||||||
|
assert.strictEqual(_.take, _.first, 'is an alias for first');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('rest', function(assert) {
|
||||||
|
var numbers = [1, 2, 3, 4];
|
||||||
|
assert.deepEqual(_.rest(numbers), [2, 3, 4], 'fetches all but the first element');
|
||||||
|
assert.deepEqual(_.rest(numbers, 0), [1, 2, 3, 4], 'returns the whole array when index is 0');
|
||||||
|
assert.deepEqual(_.rest(numbers, 2), [3, 4], 'returns elements starting at the given index');
|
||||||
|
var result = (function(){ return _(arguments).rest(); }(1, 2, 3, 4));
|
||||||
|
assert.deepEqual(result, [2, 3, 4], 'works on an arguments object');
|
||||||
|
result = _.map([[1, 2, 3], [1, 2, 3]], _.rest);
|
||||||
|
assert.deepEqual(_.flatten(result), [2, 3, 2, 3], 'works well with _.map');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('tail', function(assert) {
|
||||||
|
assert.strictEqual(_.tail, _.rest, 'is an alias for rest');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('drop', function(assert) {
|
||||||
|
assert.strictEqual(_.drop, _.rest, 'is an alias for rest');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('initial', function(assert) {
|
||||||
|
assert.deepEqual(_.initial([1, 2, 3, 4, 5]), [1, 2, 3, 4], 'returns all but the last element');
|
||||||
|
assert.deepEqual(_.initial([1, 2, 3, 4], 2), [1, 2], 'returns all but the last n elements');
|
||||||
|
assert.deepEqual(_.initial([1, 2, 3, 4], 6), [], 'returns an empty array when n > length');
|
||||||
|
var result = (function(){ return _(arguments).initial(); }(1, 2, 3, 4));
|
||||||
|
assert.deepEqual(result, [1, 2, 3], 'works on an arguments object');
|
||||||
|
result = _.map([[1, 2, 3], [1, 2, 3]], _.initial);
|
||||||
|
assert.deepEqual(_.flatten(result), [1, 2, 1, 2], 'works well with _.map');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('last', function(assert) {
|
||||||
|
assert.equal(_.last([1, 2, 3]), 3, 'can pull out the last element of an array');
|
||||||
|
assert.equal(_([1, 2, 3]).last(), 3, 'can perform OO-style "last()"');
|
||||||
|
assert.deepEqual(_.last([1, 2, 3], 0), [], 'returns an empty array when n <= 0 (0 case)');
|
||||||
|
assert.deepEqual(_.last([1, 2, 3], -1), [], 'returns an empty array when n <= 0 (negative case)');
|
||||||
|
assert.deepEqual(_.last([1, 2, 3], 2), [2, 3], 'can fetch the last n elements');
|
||||||
|
assert.deepEqual(_.last([1, 2, 3], 5), [1, 2, 3], 'returns the whole array if n > length');
|
||||||
|
var result = (function(){ return _(arguments).last(); }(1, 2, 3, 4));
|
||||||
|
assert.equal(result, 4, 'works on an arguments object');
|
||||||
|
result = _.map([[1, 2, 3], [1, 2, 3]], _.last);
|
||||||
|
assert.deepEqual(result, [3, 3], 'works well with _.map');
|
||||||
|
assert.equal(_.last(null), void 0, 'returns undefined when called on null');
|
||||||
|
|
||||||
|
var arr = [];
|
||||||
|
arr[-1] = 'boo';
|
||||||
|
assert.equal(_.last(arr), void 0, 'return undefined when called on a empty array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('compact', function(assert) {
|
||||||
|
assert.deepEqual(_.compact([1, false, null, 0, '', void 0, NaN, 2]), [1, 2], 'removes all falsy values');
|
||||||
|
var result = (function(){ return _.compact(arguments); }(0, 1, false, 2, false, 3));
|
||||||
|
assert.deepEqual(result, [1, 2, 3], 'works on an arguments object');
|
||||||
|
result = _.map([[1, false, false], [false, false, 3]], _.compact);
|
||||||
|
assert.deepEqual(result, [[1], [3]], 'works well with _.map');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('flatten', function(assert) {
|
||||||
|
assert.deepEqual(_.flatten(null), [], 'supports null');
|
||||||
|
assert.deepEqual(_.flatten(void 0), [], 'supports undefined');
|
||||||
|
|
||||||
|
assert.deepEqual(_.flatten([[], [[]], []]), [], 'supports empty arrays');
|
||||||
|
assert.deepEqual(_.flatten([[], [[]], []], true), [[]], 'can shallowly flatten empty arrays');
|
||||||
|
|
||||||
|
var list = [1, [2], [3, [[[4]]]]];
|
||||||
|
assert.deepEqual(_.flatten(list), [1, 2, 3, 4], 'can flatten nested arrays');
|
||||||
|
assert.deepEqual(_.flatten(list, true), [1, 2, 3, [[[4]]]], 'can shallowly flatten nested arrays');
|
||||||
|
var result = (function(){ return _.flatten(arguments); }(1, [2], [3, [[[4]]]]));
|
||||||
|
assert.deepEqual(result, [1, 2, 3, 4], 'works on an arguments object');
|
||||||
|
list = [[1], [2], [3], [[4]]];
|
||||||
|
assert.deepEqual(_.flatten(list, true), [1, 2, 3, [4]], 'can shallowly flatten arrays containing only other arrays');
|
||||||
|
|
||||||
|
assert.equal(_.flatten([_.range(10), _.range(10), 5, 1, 3], true).length, 23, 'can flatten medium length arrays');
|
||||||
|
assert.equal(_.flatten([_.range(10), _.range(10), 5, 1, 3]).length, 23, 'can shallowly flatten medium length arrays');
|
||||||
|
assert.equal(_.flatten([new Array(1000000), _.range(56000), 5, 1, 3]).length, 1056003, 'can handle massive arrays');
|
||||||
|
assert.equal(_.flatten([new Array(1000000), _.range(56000), 5, 1, 3], true).length, 1056003, 'can handle massive arrays in shallow mode');
|
||||||
|
|
||||||
|
var x = _.range(100000);
|
||||||
|
for (var i = 0; i < 1000; i++) x = [x];
|
||||||
|
assert.deepEqual(_.flatten(x), _.range(100000), 'can handle very deep arrays');
|
||||||
|
assert.deepEqual(_.flatten(x, true), x[0], 'can handle very deep arrays in shallow mode');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('without', function(assert) {
|
||||||
|
var list = [1, 2, 1, 0, 3, 1, 4];
|
||||||
|
assert.deepEqual(_.without(list, 0, 1), [2, 3, 4], 'removes all instances of the given values');
|
||||||
|
var result = (function(){ return _.without(arguments, 0, 1); }(1, 2, 1, 0, 3, 1, 4));
|
||||||
|
assert.deepEqual(result, [2, 3, 4], 'works on an arguments object');
|
||||||
|
|
||||||
|
list = [{one: 1}, {two: 2}];
|
||||||
|
assert.deepEqual(_.without(list, {one: 1}), list, 'compares objects by reference (value case)');
|
||||||
|
assert.deepEqual(_.without(list, list[0]), [{two: 2}], 'compares objects by reference (reference case)');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('sortedIndex', function(assert) {
|
||||||
|
var numbers = [10, 20, 30, 40, 50];
|
||||||
|
var indexFor35 = _.sortedIndex(numbers, 35);
|
||||||
|
assert.equal(indexFor35, 3, 'finds the index at which a value should be inserted to retain order');
|
||||||
|
var indexFor30 = _.sortedIndex(numbers, 30);
|
||||||
|
assert.equal(indexFor30, 2, 'finds the smallest index at which a value could be inserted to retain order');
|
||||||
|
|
||||||
|
var objects = [{x: 10}, {x: 20}, {x: 30}, {x: 40}];
|
||||||
|
var iterator = function(obj){ return obj.x; };
|
||||||
|
assert.strictEqual(_.sortedIndex(objects, {x: 25}, iterator), 2, 'uses the result of `iterator` for order comparisons');
|
||||||
|
assert.strictEqual(_.sortedIndex(objects, {x: 35}, 'x'), 3, 'when `iterator` is a string, uses that key for order comparisons');
|
||||||
|
|
||||||
|
var context = {1: 2, 2: 3, 3: 4};
|
||||||
|
iterator = function(obj){ return this[obj]; };
|
||||||
|
assert.strictEqual(_.sortedIndex([1, 3], 2, iterator, context), 1, 'can execute its iterator in the given context');
|
||||||
|
|
||||||
|
var values = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,
|
||||||
|
1048575, 2097151, 4194303, 8388607, 16777215, 33554431, 67108863, 134217727, 268435455, 536870911, 1073741823, 2147483647];
|
||||||
|
var largeArray = Array(Math.pow(2, 32) - 1);
|
||||||
|
var length = values.length;
|
||||||
|
// Sparsely populate `array`
|
||||||
|
while (length--) {
|
||||||
|
largeArray[values[length]] = values[length];
|
||||||
|
}
|
||||||
|
assert.equal(_.sortedIndex(largeArray, 2147483648), 2147483648, 'works with large indexes');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('uniq', function(assert) {
|
||||||
|
var list = [1, 2, 1, 3, 1, 4];
|
||||||
|
assert.deepEqual(_.uniq(list), [1, 2, 3, 4], 'can find the unique values of an unsorted array');
|
||||||
|
list = [1, 1, 1, 2, 2, 3];
|
||||||
|
assert.deepEqual(_.uniq(list, true), [1, 2, 3], 'can find the unique values of a sorted array faster');
|
||||||
|
|
||||||
|
list = [{name: 'Moe'}, {name: 'Curly'}, {name: 'Larry'}, {name: 'Curly'}];
|
||||||
|
var expected = [{name: 'Moe'}, {name: 'Curly'}, {name: 'Larry'}];
|
||||||
|
var iterator = function(stooge) { return stooge.name; };
|
||||||
|
assert.deepEqual(_.uniq(list, false, iterator), expected, 'uses the result of `iterator` for uniqueness comparisons (unsorted case)');
|
||||||
|
assert.deepEqual(_.uniq(list, iterator), expected, '`sorted` argument defaults to false when omitted');
|
||||||
|
assert.deepEqual(_.uniq(list, 'name'), expected, 'when `iterator` is a string, uses that key for comparisons (unsorted case)');
|
||||||
|
|
||||||
|
list = [{score: 8}, {score: 10}, {score: 10}];
|
||||||
|
expected = [{score: 8}, {score: 10}];
|
||||||
|
iterator = function(item) { return item.score; };
|
||||||
|
assert.deepEqual(_.uniq(list, true, iterator), expected, 'uses the result of `iterator` for uniqueness comparisons (sorted case)');
|
||||||
|
assert.deepEqual(_.uniq(list, true, 'score'), expected, 'when `iterator` is a string, uses that key for comparisons (sorted case)');
|
||||||
|
|
||||||
|
assert.deepEqual(_.uniq([{0: 1}, {0: 1}, {0: 1}, {0: 2}], 0), [{0: 1}, {0: 2}], 'can use falsey pluck like iterator');
|
||||||
|
|
||||||
|
var result = (function(){ return _.uniq(arguments); }(1, 2, 1, 3, 1, 4));
|
||||||
|
assert.deepEqual(result, [1, 2, 3, 4], 'works on an arguments object');
|
||||||
|
|
||||||
|
var a = {}, b = {}, c = {};
|
||||||
|
assert.deepEqual(_.uniq([a, b, a, b, c]), [a, b, c], 'works on values that can be tested for equivalency but not ordered');
|
||||||
|
|
||||||
|
assert.deepEqual(_.uniq(null), [], 'returns an empty array when `array` is not iterable');
|
||||||
|
|
||||||
|
var context = {};
|
||||||
|
list = [3];
|
||||||
|
_.uniq(list, function(value, index, array) {
|
||||||
|
assert.strictEqual(this, context, 'executes its iterator in the given context');
|
||||||
|
assert.strictEqual(value, 3, 'passes its iterator the value');
|
||||||
|
assert.strictEqual(index, 0, 'passes its iterator the index');
|
||||||
|
assert.strictEqual(array, list, 'passes its iterator the entire array');
|
||||||
|
}, context);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('unique', function(assert) {
|
||||||
|
assert.strictEqual(_.unique, _.uniq, 'is an alias for uniq');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('intersection', function(assert) {
|
||||||
|
var stooges = ['moe', 'curly', 'larry'], leaders = ['moe', 'groucho'];
|
||||||
|
assert.deepEqual(_.intersection(stooges, leaders), ['moe'], 'can find the set intersection of two arrays');
|
||||||
|
assert.deepEqual(_(stooges).intersection(leaders), ['moe'], 'can perform an OO-style intersection');
|
||||||
|
var result = (function(){ return _.intersection(arguments, leaders); }('moe', 'curly', 'larry'));
|
||||||
|
assert.deepEqual(result, ['moe'], 'works on an arguments object');
|
||||||
|
var theSixStooges = ['moe', 'moe', 'curly', 'curly', 'larry', 'larry'];
|
||||||
|
assert.deepEqual(_.intersection(theSixStooges, leaders), ['moe'], 'returns a duplicate-free array');
|
||||||
|
result = _.intersection([2, 4, 3, 1], [1, 2, 3]);
|
||||||
|
assert.deepEqual(result, [2, 3, 1], 'preserves the order of the first array');
|
||||||
|
result = _.intersection(null, [1, 2, 3]);
|
||||||
|
assert.deepEqual(result, [], 'returns an empty array when passed null as the first argument');
|
||||||
|
result = _.intersection([1, 2, 3], null);
|
||||||
|
assert.deepEqual(result, [], 'returns an empty array when passed null as an argument beyond the first');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('union', function(assert) {
|
||||||
|
var result = _.union([1, 2, 3], [2, 30, 1], [1, 40]);
|
||||||
|
assert.deepEqual(result, [1, 2, 3, 30, 40], 'can find the union of a list of arrays');
|
||||||
|
|
||||||
|
result = _([1, 2, 3]).union([2, 30, 1], [1, 40]);
|
||||||
|
assert.deepEqual(result, [1, 2, 3, 30, 40], 'can perform an OO-style union');
|
||||||
|
|
||||||
|
result = _.union([1, 2, 3], [2, 30, 1], [1, 40, [1]]);
|
||||||
|
assert.deepEqual(result, [1, 2, 3, 30, 40, [1]], 'can find the union of a list of nested arrays');
|
||||||
|
|
||||||
|
result = _.union([10, 20], [1, 30, 10], [0, 40]);
|
||||||
|
assert.deepEqual(result, [10, 20, 1, 30, 0, 40], 'orders values by their first encounter');
|
||||||
|
|
||||||
|
result = (function(){ return _.union(arguments, [2, 30, 1], [1, 40]); }(1, 2, 3));
|
||||||
|
assert.deepEqual(result, [1, 2, 3, 30, 40], 'works on an arguments object');
|
||||||
|
|
||||||
|
assert.deepEqual(_.union([1, 2, 3], 4), [1, 2, 3], 'restricts the union to arrays only');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('difference', function(assert) {
|
||||||
|
var result = _.difference([1, 2, 3], [2, 30, 40]);
|
||||||
|
assert.deepEqual(result, [1, 3], 'can find the difference of two arrays');
|
||||||
|
|
||||||
|
result = _([1, 2, 3]).difference([2, 30, 40]);
|
||||||
|
assert.deepEqual(result, [1, 3], 'can perform an OO-style difference');
|
||||||
|
|
||||||
|
result = _.difference([1, 2, 3, 4], [2, 30, 40], [1, 11, 111]);
|
||||||
|
assert.deepEqual(result, [3, 4], 'can find the difference of three arrays');
|
||||||
|
|
||||||
|
result = _.difference([8, 9, 3, 1], [3, 8]);
|
||||||
|
assert.deepEqual(result, [9, 1], 'preserves the order of the first array');
|
||||||
|
|
||||||
|
result = (function(){ return _.difference(arguments, [2, 30, 40]); }(1, 2, 3));
|
||||||
|
assert.deepEqual(result, [1, 3], 'works on an arguments object');
|
||||||
|
|
||||||
|
result = _.difference([1, 2, 3], 1);
|
||||||
|
assert.deepEqual(result, [1, 2, 3], 'restrict the difference to arrays only');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('zip', function(assert) {
|
||||||
|
var names = ['moe', 'larry', 'curly'], ages = [30, 40, 50], leaders = [true];
|
||||||
|
assert.deepEqual(_.zip(names, ages, leaders), [
|
||||||
|
['moe', 30, true],
|
||||||
|
['larry', 40, void 0],
|
||||||
|
['curly', 50, void 0]
|
||||||
|
], 'zipped together arrays of different lengths');
|
||||||
|
|
||||||
|
var stooges = _.zip(['moe', 30, 'stooge 1'], ['larry', 40, 'stooge 2'], ['curly', 50, 'stooge 3']);
|
||||||
|
assert.deepEqual(stooges, [['moe', 'larry', 'curly'], [30, 40, 50], ['stooge 1', 'stooge 2', 'stooge 3']], 'zipped pairs');
|
||||||
|
|
||||||
|
// In the case of different lengths of the tuples, undefined values
|
||||||
|
// should be used as placeholder
|
||||||
|
stooges = _.zip(['moe', 30], ['larry', 40], ['curly', 50, 'extra data']);
|
||||||
|
assert.deepEqual(stooges, [['moe', 'larry', 'curly'], [30, 40, 50], [void 0, void 0, 'extra data']], 'zipped pairs with empties');
|
||||||
|
|
||||||
|
var empty = _.zip([]);
|
||||||
|
assert.deepEqual(empty, [], 'unzipped empty');
|
||||||
|
|
||||||
|
assert.deepEqual(_.zip(null), [], 'handles null');
|
||||||
|
assert.deepEqual(_.zip(), [], '_.zip() returns []');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('unzip', function(assert) {
|
||||||
|
assert.deepEqual(_.unzip(null), [], 'handles null');
|
||||||
|
|
||||||
|
assert.deepEqual(_.unzip([['a', 'b'], [1, 2]]), [['a', 1], ['b', 2]]);
|
||||||
|
|
||||||
|
// complements zip
|
||||||
|
var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
|
||||||
|
assert.deepEqual(_.unzip(zipped), [['fred', 'barney'], [30, 40], [true, false]]);
|
||||||
|
|
||||||
|
zipped = _.zip(['moe', 30], ['larry', 40], ['curly', 50, 'extra data']);
|
||||||
|
assert.deepEqual(_.unzip(zipped), [['moe', 30, void 0], ['larry', 40, void 0], ['curly', 50, 'extra data']], 'Uses length of largest array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('object', function(assert) {
|
||||||
|
var result = _.object(['moe', 'larry', 'curly'], [30, 40, 50]);
|
||||||
|
var shouldBe = {moe: 30, larry: 40, curly: 50};
|
||||||
|
assert.deepEqual(result, shouldBe, 'two arrays zipped together into an object');
|
||||||
|
|
||||||
|
result = _.object([['one', 1], ['two', 2], ['three', 3]]);
|
||||||
|
shouldBe = {one: 1, two: 2, three: 3};
|
||||||
|
assert.deepEqual(result, shouldBe, 'an array of pairs zipped together into an object');
|
||||||
|
|
||||||
|
var stooges = {moe: 30, larry: 40, curly: 50};
|
||||||
|
assert.deepEqual(_.object(_.pairs(stooges)), stooges, 'an object converted to pairs and back to an object');
|
||||||
|
|
||||||
|
assert.deepEqual(_.object(null), {}, 'handles nulls');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('indexOf', function(assert) {
|
||||||
|
var numbers = [1, 2, 3];
|
||||||
|
assert.equal(_.indexOf(numbers, 2), 1, 'can compute indexOf');
|
||||||
|
var result = (function(){ return _.indexOf(arguments, 2); }(1, 2, 3));
|
||||||
|
assert.equal(result, 1, 'works on an arguments object');
|
||||||
|
|
||||||
|
_.each([null, void 0, [], false], function(val) {
|
||||||
|
var msg = 'Handles: ' + (_.isArray(val) ? '[]' : val);
|
||||||
|
assert.equal(_.indexOf(val, 2), -1, msg);
|
||||||
|
assert.equal(_.indexOf(val, 2, -1), -1, msg);
|
||||||
|
assert.equal(_.indexOf(val, 2, -20), -1, msg);
|
||||||
|
assert.equal(_.indexOf(val, 2, 15), -1, msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
var num = 35;
|
||||||
|
numbers = [10, 20, 30, 40, 50];
|
||||||
|
var index = _.indexOf(numbers, num, true);
|
||||||
|
assert.equal(index, -1, '35 is not in the list');
|
||||||
|
|
||||||
|
numbers = [10, 20, 30, 40, 50]; num = 40;
|
||||||
|
index = _.indexOf(numbers, num, true);
|
||||||
|
assert.equal(index, 3, '40 is in the list');
|
||||||
|
|
||||||
|
numbers = [1, 40, 40, 40, 40, 40, 40, 40, 50, 60, 70]; num = 40;
|
||||||
|
assert.equal(_.indexOf(numbers, num, true), 1, '40 is in the list');
|
||||||
|
assert.equal(_.indexOf(numbers, 6, true), -1, '6 isnt in the list');
|
||||||
|
assert.equal(_.indexOf([1, 2, 5, 4, 6, 7], 5, true), -1, 'sorted indexOf doesn\'t uses binary search');
|
||||||
|
assert.ok(_.every(['1', [], {}, null], function() {
|
||||||
|
return _.indexOf(numbers, num, {}) === 1;
|
||||||
|
}), 'non-nums as fromIndex make indexOf assume sorted');
|
||||||
|
|
||||||
|
numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3];
|
||||||
|
index = _.indexOf(numbers, 2, 5);
|
||||||
|
assert.equal(index, 7, 'supports the fromIndex argument');
|
||||||
|
|
||||||
|
index = _.indexOf([,,, 0], void 0);
|
||||||
|
assert.equal(index, 0, 'treats sparse arrays as if they were dense');
|
||||||
|
|
||||||
|
var array = [1, 2, 3, 1, 2, 3];
|
||||||
|
assert.strictEqual(_.indexOf(array, 1, -3), 3, 'neg `fromIndex` starts at the right index');
|
||||||
|
assert.strictEqual(_.indexOf(array, 1, -2), -1, 'neg `fromIndex` starts at the right index');
|
||||||
|
assert.strictEqual(_.indexOf(array, 2, -3), 4);
|
||||||
|
_.each([-6, -8, -Infinity], function(fromIndex) {
|
||||||
|
assert.strictEqual(_.indexOf(array, 1, fromIndex), 0);
|
||||||
|
});
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, 3], 1, true), 0);
|
||||||
|
|
||||||
|
index = _.indexOf([], void 0, true);
|
||||||
|
assert.equal(index, -1, 'empty array with truthy `isSorted` returns -1');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('indexOf with NaN', function(assert) {
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, NaN, NaN], NaN), 2, 'Expected [1, 2, NaN] to contain NaN');
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, Infinity], NaN), -1, 'Expected [1, 2, NaN] to contain NaN');
|
||||||
|
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, NaN, NaN], NaN, 1), 2, 'startIndex does not affect result');
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, NaN, NaN], NaN, -2), 2, 'startIndex does not affect result');
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
assert.strictEqual(_.indexOf(arguments, NaN), 2, 'Expected arguments [1, 2, NaN] to contain NaN');
|
||||||
|
}(1, 2, NaN, NaN));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('indexOf with +- 0', function(assert) {
|
||||||
|
_.each([-0, +0], function(val) {
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, val, val], val), 2);
|
||||||
|
assert.strictEqual(_.indexOf([1, 2, val, val], -val), 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('lastIndexOf', function(assert) {
|
||||||
|
var numbers = [1, 0, 1];
|
||||||
|
var falsey = [void 0, '', 0, false, NaN, null, void 0];
|
||||||
|
assert.equal(_.lastIndexOf(numbers, 1), 2);
|
||||||
|
|
||||||
|
numbers = [1, 0, 1, 0, 0, 1, 0, 0, 0];
|
||||||
|
numbers.lastIndexOf = null;
|
||||||
|
assert.equal(_.lastIndexOf(numbers, 1), 5, 'can compute lastIndexOf, even without the native function');
|
||||||
|
assert.equal(_.lastIndexOf(numbers, 0), 8, 'lastIndexOf the other element');
|
||||||
|
var result = (function(){ return _.lastIndexOf(arguments, 1); }(1, 0, 1, 0, 0, 1, 0, 0, 0));
|
||||||
|
assert.equal(result, 5, 'works on an arguments object');
|
||||||
|
|
||||||
|
_.each([null, void 0, [], false], function(val) {
|
||||||
|
var msg = 'Handles: ' + (_.isArray(val) ? '[]' : val);
|
||||||
|
assert.equal(_.lastIndexOf(val, 2), -1, msg);
|
||||||
|
assert.equal(_.lastIndexOf(val, 2, -1), -1, msg);
|
||||||
|
assert.equal(_.lastIndexOf(val, 2, -20), -1, msg);
|
||||||
|
assert.equal(_.lastIndexOf(val, 2, 15), -1, msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3];
|
||||||
|
var index = _.lastIndexOf(numbers, 2, 2);
|
||||||
|
assert.equal(index, 1, 'supports the fromIndex argument');
|
||||||
|
|
||||||
|
var array = [1, 2, 3, 1, 2, 3];
|
||||||
|
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 1, 0), 0, 'starts at the correct from idx');
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 3), 5, 'should return the index of the last matched value');
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 4), -1, 'should return `-1` for an unmatched value');
|
||||||
|
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 1, 2), 0, 'should work with a positive `fromIndex`');
|
||||||
|
|
||||||
|
_.each([6, 8, Math.pow(2, 32), Infinity], function(fromIndex) {
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, void 0, fromIndex), -1);
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 1, fromIndex), 3);
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, '', fromIndex), -1);
|
||||||
|
});
|
||||||
|
|
||||||
|
var expected = _.map(falsey, function(value) {
|
||||||
|
return typeof value == 'number' ? -1 : 5;
|
||||||
|
});
|
||||||
|
|
||||||
|
var actual = _.map(falsey, function(fromIndex) {
|
||||||
|
return _.lastIndexOf(array, 3, fromIndex);
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepEqual(actual, expected, 'should treat falsey `fromIndex` values, except `0` and `NaN`, as `array.length`');
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 3, '1'), 5, 'should treat non-number `fromIndex` values as `array.length`');
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 3, true), 5, 'should treat non-number `fromIndex` values as `array.length`');
|
||||||
|
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 2, -3), 1, 'should work with a negative `fromIndex`');
|
||||||
|
assert.strictEqual(_.lastIndexOf(array, 1, -3), 3, 'neg `fromIndex` starts at the right index');
|
||||||
|
|
||||||
|
assert.deepEqual(_.map([-6, -8, -Infinity], function(fromIndex) {
|
||||||
|
return _.lastIndexOf(array, 1, fromIndex);
|
||||||
|
}), [0, -1, -1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('lastIndexOf with NaN', function(assert) {
|
||||||
|
assert.strictEqual(_.lastIndexOf([1, 2, NaN, NaN], NaN), 3, 'Expected [1, 2, NaN] to contain NaN');
|
||||||
|
assert.strictEqual(_.lastIndexOf([1, 2, Infinity], NaN), -1, 'Expected [1, 2, NaN] to contain NaN');
|
||||||
|
|
||||||
|
assert.strictEqual(_.lastIndexOf([1, 2, NaN, NaN], NaN, 2), 2, 'fromIndex does not affect result');
|
||||||
|
assert.strictEqual(_.lastIndexOf([1, 2, NaN, NaN], NaN, -2), 2, 'fromIndex does not affect result');
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
assert.strictEqual(_.lastIndexOf(arguments, NaN), 3, 'Expected arguments [1, 2, NaN] to contain NaN');
|
||||||
|
}(1, 2, NaN, NaN));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('lastIndexOf with +- 0', function(assert) {
|
||||||
|
_.each([-0, +0], function(val) {
|
||||||
|
assert.strictEqual(_.lastIndexOf([1, 2, val, val], val), 3);
|
||||||
|
assert.strictEqual(_.lastIndexOf([1, 2, val, val], -val), 3);
|
||||||
|
assert.strictEqual(_.lastIndexOf([-1, 1, 2], -val), -1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('findIndex', function(assert) {
|
||||||
|
var objects = [
|
||||||
|
{a: 0, b: 0},
|
||||||
|
{a: 1, b: 1},
|
||||||
|
{a: 2, b: 2},
|
||||||
|
{a: 0, b: 0}
|
||||||
|
];
|
||||||
|
|
||||||
|
assert.equal(_.findIndex(objects, function(obj) {
|
||||||
|
return obj.a === 0;
|
||||||
|
}), 0);
|
||||||
|
|
||||||
|
assert.equal(_.findIndex(objects, function(obj) {
|
||||||
|
return obj.b * obj.a === 4;
|
||||||
|
}), 2);
|
||||||
|
|
||||||
|
assert.equal(_.findIndex(objects, 'a'), 1, 'Uses lookupIterator');
|
||||||
|
|
||||||
|
assert.equal(_.findIndex(objects, function(obj) {
|
||||||
|
return obj.b * obj.a === 5;
|
||||||
|
}), -1);
|
||||||
|
|
||||||
|
assert.equal(_.findIndex(null, _.noop), -1);
|
||||||
|
assert.strictEqual(_.findIndex(objects, function(a) {
|
||||||
|
return a.foo === null;
|
||||||
|
}), -1);
|
||||||
|
_.findIndex([{a: 1}], function(a, key, obj) {
|
||||||
|
assert.equal(key, 0);
|
||||||
|
assert.deepEqual(obj, [{a: 1}]);
|
||||||
|
assert.strictEqual(this, objects, 'called with context');
|
||||||
|
}, objects);
|
||||||
|
|
||||||
|
var sparse = [];
|
||||||
|
sparse[20] = {a: 2, b: 2};
|
||||||
|
assert.equal(_.findIndex(sparse, function(obj) {
|
||||||
|
return obj && obj.b * obj.a === 4;
|
||||||
|
}), 20, 'Works with sparse arrays');
|
||||||
|
|
||||||
|
var array = [1, 2, 3, 4];
|
||||||
|
array.match = 55;
|
||||||
|
assert.strictEqual(_.findIndex(array, function(x) { return x === 55; }), -1, 'doesn\'t match array-likes keys');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('findLastIndex', function(assert) {
|
||||||
|
var objects = [
|
||||||
|
{a: 0, b: 0},
|
||||||
|
{a: 1, b: 1},
|
||||||
|
{a: 2, b: 2},
|
||||||
|
{a: 0, b: 0}
|
||||||
|
];
|
||||||
|
|
||||||
|
assert.equal(_.findLastIndex(objects, function(obj) {
|
||||||
|
return obj.a === 0;
|
||||||
|
}), 3);
|
||||||
|
|
||||||
|
assert.equal(_.findLastIndex(objects, function(obj) {
|
||||||
|
return obj.b * obj.a === 4;
|
||||||
|
}), 2);
|
||||||
|
|
||||||
|
assert.equal(_.findLastIndex(objects, 'a'), 2, 'Uses lookupIterator');
|
||||||
|
|
||||||
|
assert.equal(_.findLastIndex(objects, function(obj) {
|
||||||
|
return obj.b * obj.a === 5;
|
||||||
|
}), -1);
|
||||||
|
|
||||||
|
assert.equal(_.findLastIndex(null, _.noop), -1);
|
||||||
|
assert.strictEqual(_.findLastIndex(objects, function(a) {
|
||||||
|
return a.foo === null;
|
||||||
|
}), -1);
|
||||||
|
_.findLastIndex([{a: 1}], function(a, key, obj) {
|
||||||
|
assert.equal(key, 0);
|
||||||
|
assert.deepEqual(obj, [{a: 1}]);
|
||||||
|
assert.strictEqual(this, objects, 'called with context');
|
||||||
|
}, objects);
|
||||||
|
|
||||||
|
var sparse = [];
|
||||||
|
sparse[20] = {a: 2, b: 2};
|
||||||
|
assert.equal(_.findLastIndex(sparse, function(obj) {
|
||||||
|
return obj && obj.b * obj.a === 4;
|
||||||
|
}), 20, 'Works with sparse arrays');
|
||||||
|
|
||||||
|
var array = [1, 2, 3, 4];
|
||||||
|
array.match = 55;
|
||||||
|
assert.strictEqual(_.findLastIndex(array, function(x) { return x === 55; }), -1, 'doesn\'t match array-likes keys');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('range', function(assert) {
|
||||||
|
assert.deepEqual(_.range(0), [], 'range with 0 as a first argument generates an empty array');
|
||||||
|
assert.deepEqual(_.range(4), [0, 1, 2, 3], 'range with a single positive argument generates an array of elements 0,1,2,...,n-1');
|
||||||
|
assert.deepEqual(_.range(5, 8), [5, 6, 7], 'range with two arguments a & b, a<b generates an array of elements a,a+1,a+2,...,b-2,b-1');
|
||||||
|
assert.deepEqual(_.range(3, 10, 3), [3, 6, 9], 'range with three arguments a & b & c, c < b-a, a < b generates an array of elements a,a+c,a+2c,...,b - (multiplier of a) < c');
|
||||||
|
assert.deepEqual(_.range(3, 10, 15), [3], 'range with three arguments a & b & c, c > b-a, a < b generates an array with a single element, equal to a');
|
||||||
|
assert.deepEqual(_.range(12, 7, -2), [12, 10, 8], 'range with three arguments a & b & c, a > b, c < 0 generates an array of elements a,a-c,a-2c and ends with the number not less than b');
|
||||||
|
assert.deepEqual(_.range(0, -10, -1), [0, -1, -2, -3, -4, -5, -6, -7, -8, -9], 'final example in the Python docs');
|
||||||
|
assert.strictEqual(1 / _.range(-0, 1)[0], -Infinity, 'should preserve -0');
|
||||||
|
assert.deepEqual(_.range(8, 5), [8, 7, 6], 'negative range generates descending array');
|
||||||
|
assert.deepEqual(_.range(-3), [0, -1, -2], 'negative range generates descending array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('chunk', function(assert) {
|
||||||
|
assert.deepEqual(_.chunk([], 2), [], 'chunk for empty array returns an empty array');
|
||||||
|
|
||||||
|
assert.deepEqual(_.chunk([1, 2, 3], 0), [], 'chunk into parts of 0 elements returns empty array');
|
||||||
|
assert.deepEqual(_.chunk([1, 2, 3], -1), [], 'chunk into parts of negative amount of elements returns an empty array');
|
||||||
|
assert.deepEqual(_.chunk([1, 2, 3]), [], 'defaults to empty array (chunk size 0)');
|
||||||
|
|
||||||
|
assert.deepEqual(_.chunk([1, 2, 3], 1), [[1], [2], [3]], 'chunk into parts of 1 elements returns original array');
|
||||||
|
|
||||||
|
assert.deepEqual(_.chunk([1, 2, 3], 3), [[1, 2, 3]], 'chunk into parts of current array length elements returns the original array');
|
||||||
|
assert.deepEqual(_.chunk([1, 2, 3], 5), [[1, 2, 3]], 'chunk into parts of more then current array length elements returns the original array');
|
||||||
|
|
||||||
|
assert.deepEqual(_.chunk([10, 20, 30, 40, 50, 60, 70], 2), [[10, 20], [30, 40], [50, 60], [70]], 'chunk into parts of less then current array length elements');
|
||||||
|
assert.deepEqual(_.chunk([10, 20, 30, 40, 50, 60, 70], 3), [[10, 20, 30], [40, 50, 60], [70]], 'chunk into parts of less then current array length elements');
|
||||||
|
});
|
||||||
|
}());
|
||||||
99
vendor/underscore/test/chaining.js
vendored
Normal file
99
vendor/underscore/test/chaining.js
vendored
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
(function() {
|
||||||
|
var _ = typeof require == 'function' ? require('..') : window._;
|
||||||
|
|
||||||
|
QUnit.module('Chaining');
|
||||||
|
|
||||||
|
QUnit.test('map/flatten/reduce', function(assert) {
|
||||||
|
var lyrics = [
|
||||||
|
'I\'m a lumberjack and I\'m okay',
|
||||||
|
'I sleep all night and I work all day',
|
||||||
|
'He\'s a lumberjack and he\'s okay',
|
||||||
|
'He sleeps all night and he works all day'
|
||||||
|
];
|
||||||
|
var counts = _(lyrics).chain()
|
||||||
|
.map(function(line) { return line.split(''); })
|
||||||
|
.flatten()
|
||||||
|
.reduce(function(hash, l) {
|
||||||
|
hash[l] = hash[l] || 0;
|
||||||
|
hash[l]++;
|
||||||
|
return hash;
|
||||||
|
}, {})
|
||||||
|
.value();
|
||||||
|
assert.equal(counts.a, 16, 'counted all the letters in the song');
|
||||||
|
assert.equal(counts.e, 10, 'counted all the letters in the song');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('select/reject/sortBy', function(assert) {
|
||||||
|
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||||
|
numbers = _(numbers).chain().select(function(n) {
|
||||||
|
return n % 2 === 0;
|
||||||
|
}).reject(function(n) {
|
||||||
|
return n % 4 === 0;
|
||||||
|
}).sortBy(function(n) {
|
||||||
|
return -n;
|
||||||
|
}).value();
|
||||||
|
assert.deepEqual(numbers, [10, 6, 2], 'filtered and reversed the numbers');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('select/reject/sortBy in functional style', function(assert) {
|
||||||
|
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||||
|
numbers = _.chain(numbers).select(function(n) {
|
||||||
|
return n % 2 === 0;
|
||||||
|
}).reject(function(n) {
|
||||||
|
return n % 4 === 0;
|
||||||
|
}).sortBy(function(n) {
|
||||||
|
return -n;
|
||||||
|
}).value();
|
||||||
|
assert.deepEqual(numbers, [10, 6, 2], 'filtered and reversed the numbers');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('reverse/concat/unshift/pop/map', function(assert) {
|
||||||
|
var numbers = [1, 2, 3, 4, 5];
|
||||||
|
numbers = _(numbers).chain()
|
||||||
|
.reverse()
|
||||||
|
.concat([5, 5, 5])
|
||||||
|
.unshift(17)
|
||||||
|
.pop()
|
||||||
|
.map(function(n){ return n * 2; })
|
||||||
|
.value();
|
||||||
|
assert.deepEqual(numbers, [34, 10, 8, 6, 4, 2, 10, 10], 'can chain together array functions.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('splice', function(assert) {
|
||||||
|
var instance = _([1, 2, 3, 4, 5]).chain();
|
||||||
|
assert.deepEqual(instance.splice(1, 3).value(), [1, 5]);
|
||||||
|
assert.deepEqual(instance.splice(1, 0).value(), [1, 5]);
|
||||||
|
assert.deepEqual(instance.splice(1, 1).value(), [1]);
|
||||||
|
assert.deepEqual(instance.splice(0, 1).value(), [], '#397 Can create empty array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('shift', function(assert) {
|
||||||
|
var instance = _([1, 2, 3]).chain();
|
||||||
|
assert.deepEqual(instance.shift().value(), [2, 3]);
|
||||||
|
assert.deepEqual(instance.shift().value(), [3]);
|
||||||
|
assert.deepEqual(instance.shift().value(), [], '#397 Can create empty array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('pop', function(assert) {
|
||||||
|
var instance = _([1, 2, 3]).chain();
|
||||||
|
assert.deepEqual(instance.pop().value(), [1, 2]);
|
||||||
|
assert.deepEqual(instance.pop().value(), [1]);
|
||||||
|
assert.deepEqual(instance.pop().value(), [], '#397 Can create empty array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('chaining works in small stages', function(assert) {
|
||||||
|
var o = _([1, 2, 3, 4]).chain();
|
||||||
|
assert.deepEqual(o.filter(function(i) { return i < 3; }).value(), [1, 2]);
|
||||||
|
assert.deepEqual(o.filter(function(i) { return i > 2; }).value(), [3, 4]);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1562: Engine proxies for chained functions', function(assert) {
|
||||||
|
var wrapped = _(512);
|
||||||
|
assert.strictEqual(wrapped.toJSON(), 512);
|
||||||
|
assert.strictEqual(wrapped.valueOf(), 512);
|
||||||
|
assert.strictEqual(+wrapped, 512);
|
||||||
|
assert.strictEqual(wrapped.toString(), '512');
|
||||||
|
assert.strictEqual('' + wrapped, '512');
|
||||||
|
});
|
||||||
|
|
||||||
|
}());
|
||||||
896
vendor/underscore/test/collections.js
vendored
Normal file
896
vendor/underscore/test/collections.js
vendored
Normal file
@@ -0,0 +1,896 @@
|
|||||||
|
(function() {
|
||||||
|
var _ = typeof require == 'function' ? require('..') : window._;
|
||||||
|
|
||||||
|
QUnit.module('Collections');
|
||||||
|
|
||||||
|
QUnit.test('each', function(assert) {
|
||||||
|
_.each([1, 2, 3], function(num, i) {
|
||||||
|
assert.equal(num, i + 1, 'each iterators provide value and iteration count');
|
||||||
|
});
|
||||||
|
|
||||||
|
var answers = [];
|
||||||
|
_.each([1, 2, 3], function(num){ answers.push(num * this.multiplier); }, {multiplier: 5});
|
||||||
|
assert.deepEqual(answers, [5, 10, 15], 'context object property accessed');
|
||||||
|
|
||||||
|
answers = [];
|
||||||
|
_.each([1, 2, 3], function(num){ answers.push(num); });
|
||||||
|
assert.deepEqual(answers, [1, 2, 3], 'can iterate a simple array');
|
||||||
|
|
||||||
|
answers = [];
|
||||||
|
var obj = {one: 1, two: 2, three: 3};
|
||||||
|
obj.constructor.prototype.four = 4;
|
||||||
|
_.each(obj, function(value, key){ answers.push(key); });
|
||||||
|
assert.deepEqual(answers, ['one', 'two', 'three'], 'iterating over objects works, and ignores the object prototype.');
|
||||||
|
delete obj.constructor.prototype.four;
|
||||||
|
|
||||||
|
// ensure the each function is JITed
|
||||||
|
_(1000).times(function() { _.each([], function(){}); });
|
||||||
|
var count = 0;
|
||||||
|
obj = {1: 'foo', 2: 'bar', 3: 'baz'};
|
||||||
|
_.each(obj, function(){ count++; });
|
||||||
|
assert.equal(count, 3, 'the fun should be called only 3 times');
|
||||||
|
|
||||||
|
var answer = null;
|
||||||
|
_.each([1, 2, 3], function(num, index, arr){ if (_.include(arr, num)) answer = true; });
|
||||||
|
assert.ok(answer, 'can reference the original collection from inside the iterator');
|
||||||
|
|
||||||
|
answers = 0;
|
||||||
|
_.each(null, function(){ ++answers; });
|
||||||
|
assert.equal(answers, 0, 'handles a null properly');
|
||||||
|
|
||||||
|
_.each(false, function(){});
|
||||||
|
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
assert.strictEqual(_.each(a, function(){}), a);
|
||||||
|
assert.strictEqual(_.each(null, function(){}), null);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('forEach', function(assert) {
|
||||||
|
assert.strictEqual(_.forEach, _.each, 'is an alias for each');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('lookupIterator with contexts', function(assert) {
|
||||||
|
_.each([true, false, 'yes', '', 0, 1, {}], function(context) {
|
||||||
|
_.each([1], function() {
|
||||||
|
assert.equal(this, context);
|
||||||
|
}, context);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Iterating objects with sketchy length properties', function(assert) {
|
||||||
|
var functions = [
|
||||||
|
'each', 'map', 'filter', 'find',
|
||||||
|
'some', 'every', 'max', 'min',
|
||||||
|
'groupBy', 'countBy', 'partition', 'indexBy'
|
||||||
|
];
|
||||||
|
var reducers = ['reduce', 'reduceRight'];
|
||||||
|
|
||||||
|
var tricks = [
|
||||||
|
{length: '5'},
|
||||||
|
{length: {valueOf: _.constant(5)}},
|
||||||
|
{length: Math.pow(2, 53) + 1},
|
||||||
|
{length: Math.pow(2, 53)},
|
||||||
|
{length: null},
|
||||||
|
{length: -2},
|
||||||
|
{length: new Number(15)}
|
||||||
|
];
|
||||||
|
|
||||||
|
assert.expect(tricks.length * (functions.length + reducers.length + 4));
|
||||||
|
|
||||||
|
_.each(tricks, function(trick) {
|
||||||
|
var length = trick.length;
|
||||||
|
assert.strictEqual(_.size(trick), 1, 'size on obj with length: ' + length);
|
||||||
|
assert.deepEqual(_.toArray(trick), [length], 'toArray on obj with length: ' + length);
|
||||||
|
assert.deepEqual(_.shuffle(trick), [length], 'shuffle on obj with length: ' + length);
|
||||||
|
assert.deepEqual(_.sample(trick), length, 'sample on obj with length: ' + length);
|
||||||
|
|
||||||
|
|
||||||
|
_.each(functions, function(method) {
|
||||||
|
_[method](trick, function(val, key) {
|
||||||
|
assert.strictEqual(key, 'length', method + ': ran with length = ' + val);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
_.each(reducers, function(method) {
|
||||||
|
assert.strictEqual(_[method](trick), trick.length, method);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Resistant to collection length and properties changing while iterating', function(assert) {
|
||||||
|
|
||||||
|
var collection = [
|
||||||
|
'each', 'map', 'filter', 'find',
|
||||||
|
'some', 'every', 'max', 'min', 'reject',
|
||||||
|
'groupBy', 'countBy', 'partition', 'indexBy',
|
||||||
|
'reduce', 'reduceRight'
|
||||||
|
];
|
||||||
|
var array = [
|
||||||
|
'findIndex', 'findLastIndex'
|
||||||
|
];
|
||||||
|
var object = [
|
||||||
|
'mapObject', 'findKey', 'pick', 'omit'
|
||||||
|
];
|
||||||
|
|
||||||
|
_.each(collection.concat(array), function(method) {
|
||||||
|
var sparseArray = [1, 2, 3];
|
||||||
|
sparseArray.length = 100;
|
||||||
|
var answers = 0;
|
||||||
|
_[method](sparseArray, function(){
|
||||||
|
++answers;
|
||||||
|
return method === 'every' ? true : null;
|
||||||
|
}, {});
|
||||||
|
assert.equal(answers, 100, method + ' enumerates [0, length)');
|
||||||
|
|
||||||
|
var growingCollection = [1, 2, 3], count = 0;
|
||||||
|
_[method](growingCollection, function() {
|
||||||
|
if (count < 10) growingCollection.push(count++);
|
||||||
|
return method === 'every' ? true : null;
|
||||||
|
}, {});
|
||||||
|
assert.equal(count, 3, method + ' is resistant to length changes');
|
||||||
|
});
|
||||||
|
|
||||||
|
_.each(collection.concat(object), function(method) {
|
||||||
|
var changingObject = {0: 0, 1: 1}, count = 0;
|
||||||
|
_[method](changingObject, function(val) {
|
||||||
|
if (count < 10) changingObject[++count] = val + 1;
|
||||||
|
return method === 'every' ? true : null;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
assert.equal(count, 2, method + ' is resistant to property changes');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('map', function(assert) {
|
||||||
|
var doubled = _.map([1, 2, 3], function(num){ return num * 2; });
|
||||||
|
assert.deepEqual(doubled, [2, 4, 6], 'doubled numbers');
|
||||||
|
|
||||||
|
var tripled = _.map([1, 2, 3], function(num){ return num * this.multiplier; }, {multiplier: 3});
|
||||||
|
assert.deepEqual(tripled, [3, 6, 9], 'tripled numbers with context');
|
||||||
|
|
||||||
|
doubled = _([1, 2, 3]).map(function(num){ return num * 2; });
|
||||||
|
assert.deepEqual(doubled, [2, 4, 6], 'OO-style doubled numbers');
|
||||||
|
|
||||||
|
var ids = _.map({length: 2, 0: {id: '1'}, 1: {id: '2'}}, function(n){
|
||||||
|
return n.id;
|
||||||
|
});
|
||||||
|
assert.deepEqual(ids, ['1', '2'], 'Can use collection methods on Array-likes.');
|
||||||
|
|
||||||
|
assert.deepEqual(_.map(null, _.noop), [], 'handles a null properly');
|
||||||
|
|
||||||
|
assert.deepEqual(_.map([1], function() {
|
||||||
|
return this.length;
|
||||||
|
}, [5]), [1], 'called with context');
|
||||||
|
|
||||||
|
// Passing a property name like _.pluck.
|
||||||
|
var people = [{name: 'moe', age: 30}, {name: 'curly', age: 50}];
|
||||||
|
assert.deepEqual(_.map(people, 'name'), ['moe', 'curly'], 'predicate string map to object properties');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('collect', function(assert) {
|
||||||
|
assert.strictEqual(_.collect, _.map, 'is an alias for map');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('reduce', function(assert) {
|
||||||
|
var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
|
||||||
|
assert.equal(sum, 6, 'can sum up an array');
|
||||||
|
|
||||||
|
var context = {multiplier: 3};
|
||||||
|
sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num * this.multiplier; }, 0, context);
|
||||||
|
assert.equal(sum, 18, 'can reduce with a context object');
|
||||||
|
|
||||||
|
sum = _([1, 2, 3]).reduce(function(memo, num){ return memo + num; }, 0);
|
||||||
|
assert.equal(sum, 6, 'OO-style reduce');
|
||||||
|
|
||||||
|
sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; });
|
||||||
|
assert.equal(sum, 6, 'default initial value');
|
||||||
|
|
||||||
|
var prod = _.reduce([1, 2, 3, 4], function(memo, num){ return memo * num; });
|
||||||
|
assert.equal(prod, 24, 'can reduce via multiplication');
|
||||||
|
|
||||||
|
assert.strictEqual(_.reduce(null, _.noop, 138), 138, 'handles a null (with initial value) properly');
|
||||||
|
assert.equal(_.reduce([], _.noop, void 0), void 0, 'undefined can be passed as a special case');
|
||||||
|
assert.equal(_.reduce([_], _.noop), _, 'collection of length one with no initial value returns the first item');
|
||||||
|
assert.equal(_.reduce([], _.noop), void 0, 'returns undefined when collection is empty and no initial value');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('foldl', function(assert) {
|
||||||
|
assert.strictEqual(_.foldl, _.reduce, 'is an alias for reduce');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('inject', function(assert) {
|
||||||
|
assert.strictEqual(_.inject, _.reduce, 'is an alias for reduce');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('reduceRight', function(assert) {
|
||||||
|
var list = _.reduceRight(['foo', 'bar', 'baz'], function(memo, str){ return memo + str; }, '');
|
||||||
|
assert.equal(list, 'bazbarfoo', 'can perform right folds');
|
||||||
|
|
||||||
|
list = _.reduceRight(['foo', 'bar', 'baz'], function(memo, str){ return memo + str; });
|
||||||
|
assert.equal(list, 'bazbarfoo', 'default initial value');
|
||||||
|
|
||||||
|
var sum = _.reduceRight({a: 1, b: 2, c: 3}, function(memo, num){ return memo + num; });
|
||||||
|
assert.equal(sum, 6, 'default initial value on object');
|
||||||
|
|
||||||
|
assert.strictEqual(_.reduceRight(null, _.noop, 138), 138, 'handles a null (with initial value) properly');
|
||||||
|
assert.equal(_.reduceRight([_], _.noop), _, 'collection of length one with no initial value returns the first item');
|
||||||
|
|
||||||
|
assert.equal(_.reduceRight([], _.noop, void 0), void 0, 'undefined can be passed as a special case');
|
||||||
|
assert.equal(_.reduceRight([], _.noop), void 0, 'returns undefined when collection is empty and no initial value');
|
||||||
|
|
||||||
|
// Assert that the correct arguments are being passed.
|
||||||
|
|
||||||
|
var args,
|
||||||
|
init = {},
|
||||||
|
object = {a: 1, b: 2},
|
||||||
|
lastKey = _.keys(object).pop();
|
||||||
|
|
||||||
|
var expected = lastKey === 'a'
|
||||||
|
? [init, 1, 'a', object]
|
||||||
|
: [init, 2, 'b', object];
|
||||||
|
|
||||||
|
_.reduceRight(object, function() {
|
||||||
|
if (!args) args = _.toArray(arguments);
|
||||||
|
}, init);
|
||||||
|
|
||||||
|
assert.deepEqual(args, expected);
|
||||||
|
|
||||||
|
// And again, with numeric keys.
|
||||||
|
|
||||||
|
object = {2: 'a', 1: 'b'};
|
||||||
|
lastKey = _.keys(object).pop();
|
||||||
|
args = null;
|
||||||
|
|
||||||
|
expected = lastKey === '2'
|
||||||
|
? [init, 'a', '2', object]
|
||||||
|
: [init, 'b', '1', object];
|
||||||
|
|
||||||
|
_.reduceRight(object, function() {
|
||||||
|
if (!args) args = _.toArray(arguments);
|
||||||
|
}, init);
|
||||||
|
|
||||||
|
assert.deepEqual(args, expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('foldr', function(assert) {
|
||||||
|
assert.strictEqual(_.foldr, _.reduceRight, 'is an alias for reduceRight');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('find', function(assert) {
|
||||||
|
var array = [1, 2, 3, 4];
|
||||||
|
assert.strictEqual(_.find(array, function(n) { return n > 2; }), 3, 'should return first found `value`');
|
||||||
|
assert.strictEqual(_.find(array, function() { return false; }), void 0, 'should return `undefined` if `value` is not found');
|
||||||
|
|
||||||
|
array.dontmatch = 55;
|
||||||
|
assert.strictEqual(_.find(array, function(x) { return x === 55; }), void 0, 'iterates array-likes correctly');
|
||||||
|
|
||||||
|
// Matching an object like _.findWhere.
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 4}];
|
||||||
|
assert.deepEqual(_.find(list, {a: 1}), {a: 1, b: 2}, 'can be used as findWhere');
|
||||||
|
assert.deepEqual(_.find(list, {b: 4}), {a: 1, b: 4});
|
||||||
|
assert.notOk(_.find(list, {c: 1}), 'undefined when not found');
|
||||||
|
assert.notOk(_.find([], {c: 1}), 'undefined when searching empty list');
|
||||||
|
|
||||||
|
var result = _.find([1, 2, 3], function(num){ return num * 2 === 4; });
|
||||||
|
assert.equal(result, 2, 'found the first "2" and broke the loop');
|
||||||
|
|
||||||
|
var obj = {
|
||||||
|
a: {x: 1, z: 3},
|
||||||
|
b: {x: 2, z: 2},
|
||||||
|
c: {x: 3, z: 4},
|
||||||
|
d: {x: 4, z: 1}
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.deepEqual(_.find(obj, {x: 2}), {x: 2, z: 2}, 'works on objects');
|
||||||
|
assert.deepEqual(_.find(obj, {x: 2, z: 1}), void 0);
|
||||||
|
assert.deepEqual(_.find(obj, function(x) {
|
||||||
|
return x.x === 4;
|
||||||
|
}), {x: 4, z: 1});
|
||||||
|
|
||||||
|
_.findIndex([{a: 1}], function(a, key, o) {
|
||||||
|
assert.equal(key, 0);
|
||||||
|
assert.deepEqual(o, [{a: 1}]);
|
||||||
|
assert.strictEqual(this, _, 'called with context');
|
||||||
|
}, _);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('detect', function(assert) {
|
||||||
|
assert.strictEqual(_.detect, _.find, 'is an alias for find');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('filter', function(assert) {
|
||||||
|
var evenArray = [1, 2, 3, 4, 5, 6];
|
||||||
|
var evenObject = {one: 1, two: 2, three: 3};
|
||||||
|
var isEven = function(num){ return num % 2 === 0; };
|
||||||
|
|
||||||
|
assert.deepEqual(_.filter(evenArray, isEven), [2, 4, 6]);
|
||||||
|
assert.deepEqual(_.filter(evenObject, isEven), [2], 'can filter objects');
|
||||||
|
assert.deepEqual(_.filter([{}, evenObject, []], 'two'), [evenObject], 'predicate string map to object properties');
|
||||||
|
|
||||||
|
_.filter([1], function() {
|
||||||
|
assert.equal(this, evenObject, 'given context');
|
||||||
|
}, evenObject);
|
||||||
|
|
||||||
|
// Can be used like _.where.
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
|
assert.deepEqual(_.filter(list, {a: 1}), [{a: 1, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}]);
|
||||||
|
assert.deepEqual(_.filter(list, {b: 2}), [{a: 1, b: 2}, {a: 2, b: 2}]);
|
||||||
|
assert.deepEqual(_.filter(list, {}), list, 'Empty object accepts all items');
|
||||||
|
assert.deepEqual(_(list).filter({}), list, 'OO-filter');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('select', function(assert) {
|
||||||
|
assert.strictEqual(_.select, _.filter, 'is an alias for filter');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('reject', function(assert) {
|
||||||
|
var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 === 0; });
|
||||||
|
assert.deepEqual(odds, [1, 3, 5], 'rejected each even number');
|
||||||
|
|
||||||
|
var context = 'obj';
|
||||||
|
|
||||||
|
var evens = _.reject([1, 2, 3, 4, 5, 6], function(num){
|
||||||
|
assert.equal(context, 'obj');
|
||||||
|
return num % 2 !== 0;
|
||||||
|
}, context);
|
||||||
|
assert.deepEqual(evens, [2, 4, 6], 'rejected each odd number');
|
||||||
|
|
||||||
|
assert.deepEqual(_.reject([odds, {one: 1, two: 2, three: 3}], 'two'), [odds], 'predicate string map to object properties');
|
||||||
|
|
||||||
|
// Can be used like _.where.
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
|
assert.deepEqual(_.reject(list, {a: 1}), [{a: 2, b: 2}]);
|
||||||
|
assert.deepEqual(_.reject(list, {b: 2}), [{a: 1, b: 3}, {a: 1, b: 4}]);
|
||||||
|
assert.deepEqual(_.reject(list, {}), [], 'Returns empty list given empty object');
|
||||||
|
assert.deepEqual(_.reject(list, []), [], 'Returns empty list given empty array');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('every', function(assert) {
|
||||||
|
assert.ok(_.every([], _.identity), 'the empty set');
|
||||||
|
assert.ok(_.every([true, true, true], _.identity), 'every true values');
|
||||||
|
assert.notOk(_.every([true, false, true], _.identity), 'one false value');
|
||||||
|
assert.ok(_.every([0, 10, 28], function(num){ return num % 2 === 0; }), 'even numbers');
|
||||||
|
assert.notOk(_.every([0, 11, 28], function(num){ return num % 2 === 0; }), 'an odd number');
|
||||||
|
assert.strictEqual(_.every([1], _.identity), true, 'cast to boolean - true');
|
||||||
|
assert.strictEqual(_.every([0], _.identity), false, 'cast to boolean - false');
|
||||||
|
assert.notOk(_.every([void 0, void 0, void 0], _.identity), 'works with arrays of undefined');
|
||||||
|
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
|
assert.notOk(_.every(list, {a: 1, b: 2}), 'Can be called with object');
|
||||||
|
assert.ok(_.every(list, 'a'), 'String mapped to object property');
|
||||||
|
|
||||||
|
list = [{a: 1, b: 2}, {a: 2, b: 2, c: true}];
|
||||||
|
assert.ok(_.every(list, {b: 2}), 'Can be called with object');
|
||||||
|
assert.notOk(_.every(list, 'c'), 'String mapped to object property');
|
||||||
|
|
||||||
|
assert.ok(_.every({a: 1, b: 2, c: 3, d: 4}, _.isNumber), 'takes objects');
|
||||||
|
assert.notOk(_.every({a: 1, b: 2, c: 3, d: 4}, _.isObject), 'takes objects');
|
||||||
|
assert.ok(_.every(['a', 'b', 'c', 'd'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
|
assert.notOk(_.every(['a', 'b', 'c', 'd', 'f'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('all', function(assert) {
|
||||||
|
assert.strictEqual(_.all, _.every, 'is an alias for every');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('some', function(assert) {
|
||||||
|
assert.notOk(_.some([]), 'the empty set');
|
||||||
|
assert.notOk(_.some([false, false, false]), 'all false values');
|
||||||
|
assert.ok(_.some([false, false, true]), 'one true value');
|
||||||
|
assert.ok(_.some([null, 0, 'yes', false]), 'a string');
|
||||||
|
assert.notOk(_.some([null, 0, '', false]), 'falsy values');
|
||||||
|
assert.notOk(_.some([1, 11, 29], function(num){ return num % 2 === 0; }), 'all odd numbers');
|
||||||
|
assert.ok(_.some([1, 10, 29], function(num){ return num % 2 === 0; }), 'an even number');
|
||||||
|
assert.strictEqual(_.some([1], _.identity), true, 'cast to boolean - true');
|
||||||
|
assert.strictEqual(_.some([0], _.identity), false, 'cast to boolean - false');
|
||||||
|
assert.ok(_.some([false, false, true]));
|
||||||
|
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
|
assert.notOk(_.some(list, {a: 5, b: 2}), 'Can be called with object');
|
||||||
|
assert.ok(_.some(list, 'a'), 'String mapped to object property');
|
||||||
|
|
||||||
|
list = [{a: 1, b: 2}, {a: 2, b: 2, c: true}];
|
||||||
|
assert.ok(_.some(list, {b: 2}), 'Can be called with object');
|
||||||
|
assert.notOk(_.some(list, 'd'), 'String mapped to object property');
|
||||||
|
|
||||||
|
assert.ok(_.some({a: '1', b: '2', c: '3', d: '4', e: 6}, _.isNumber), 'takes objects');
|
||||||
|
assert.notOk(_.some({a: 1, b: 2, c: 3, d: 4}, _.isObject), 'takes objects');
|
||||||
|
assert.ok(_.some(['a', 'b', 'c', 'd'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
|
assert.notOk(_.some(['x', 'y', 'z'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('any', function(assert) {
|
||||||
|
assert.strictEqual(_.any, _.some, 'is an alias for some');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('includes', function(assert) {
|
||||||
|
_.each([null, void 0, 0, 1, NaN, {}, []], function(val) {
|
||||||
|
assert.strictEqual(_.includes(val, 'hasOwnProperty'), false);
|
||||||
|
});
|
||||||
|
assert.strictEqual(_.includes([1, 2, 3], 2), true, 'two is in the array');
|
||||||
|
assert.notOk(_.includes([1, 3, 9], 2), 'two is not in the array');
|
||||||
|
|
||||||
|
assert.strictEqual(_.includes([5, 4, 3, 2, 1], 5, true), true, 'doesn\'t delegate to binary search');
|
||||||
|
|
||||||
|
assert.strictEqual(_.includes({moe: 1, larry: 3, curly: 9}, 3), true, '_.includes on objects checks their values');
|
||||||
|
assert.ok(_([1, 2, 3]).includes(2), 'OO-style includes');
|
||||||
|
|
||||||
|
var numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3];
|
||||||
|
assert.strictEqual(_.includes(numbers, 1, 1), true, 'takes a fromIndex');
|
||||||
|
assert.strictEqual(_.includes(numbers, 1, -1), false, 'takes a fromIndex');
|
||||||
|
assert.strictEqual(_.includes(numbers, 1, -2), false, 'takes a fromIndex');
|
||||||
|
assert.strictEqual(_.includes(numbers, 1, -3), true, 'takes a fromIndex');
|
||||||
|
assert.strictEqual(_.includes(numbers, 1, 6), true, 'takes a fromIndex');
|
||||||
|
assert.strictEqual(_.includes(numbers, 1, 7), false, 'takes a fromIndex');
|
||||||
|
|
||||||
|
assert.ok(_.every([1, 2, 3], _.partial(_.includes, numbers)), 'fromIndex is guarded');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('include', function(assert) {
|
||||||
|
assert.strictEqual(_.include, _.includes, 'is an alias for includes');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('contains', function(assert) {
|
||||||
|
assert.strictEqual(_.contains, _.includes, 'is an alias for includes');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('includes with NaN', function(assert) {
|
||||||
|
assert.strictEqual(_.includes([1, 2, NaN, NaN], NaN), true, 'Expected [1, 2, NaN] to contain NaN');
|
||||||
|
assert.strictEqual(_.includes([1, 2, Infinity], NaN), false, 'Expected [1, 2, NaN] to contain NaN');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('includes with +- 0', function(assert) {
|
||||||
|
_.each([-0, +0], function(val) {
|
||||||
|
assert.strictEqual(_.includes([1, 2, val, val], val), true);
|
||||||
|
assert.strictEqual(_.includes([1, 2, val, val], -val), true);
|
||||||
|
assert.strictEqual(_.includes([-1, 1, 2], -val), false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
QUnit.test('invoke', function(assert) {
|
||||||
|
assert.expect(5);
|
||||||
|
var list = [[5, 1, 7], [3, 2, 1]];
|
||||||
|
var result = _.invoke(list, 'sort');
|
||||||
|
assert.deepEqual(result[0], [1, 5, 7], 'first array sorted');
|
||||||
|
assert.deepEqual(result[1], [1, 2, 3], 'second array sorted');
|
||||||
|
|
||||||
|
_.invoke([{
|
||||||
|
method: function() {
|
||||||
|
assert.deepEqual(_.toArray(arguments), [1, 2, 3], 'called with arguments');
|
||||||
|
}
|
||||||
|
}], 'method', 1, 2, 3);
|
||||||
|
|
||||||
|
assert.deepEqual(_.invoke([{a: null}, {}, {a: _.constant(1)}], 'a'), [null, void 0, 1], 'handles null & undefined');
|
||||||
|
|
||||||
|
assert.raises(function() {
|
||||||
|
_.invoke([{a: 1}], 'a');
|
||||||
|
}, TypeError, 'throws for non-functions');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('invoke w/ function reference', function(assert) {
|
||||||
|
var list = [[5, 1, 7], [3, 2, 1]];
|
||||||
|
var result = _.invoke(list, Array.prototype.sort);
|
||||||
|
assert.deepEqual(result[0], [1, 5, 7], 'first array sorted');
|
||||||
|
assert.deepEqual(result[1], [1, 2, 3], 'second array sorted');
|
||||||
|
|
||||||
|
assert.deepEqual(_.invoke([1, 2, 3], function(a) {
|
||||||
|
return a + this;
|
||||||
|
}, 5), [6, 7, 8], 'receives params from invoke');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Relevant when using ClojureScript
|
||||||
|
QUnit.test('invoke when strings have a call method', function(assert) {
|
||||||
|
String.prototype.call = function() {
|
||||||
|
return 42;
|
||||||
|
};
|
||||||
|
var list = [[5, 1, 7], [3, 2, 1]];
|
||||||
|
var s = 'foo';
|
||||||
|
assert.equal(s.call(), 42, 'call function exists');
|
||||||
|
var result = _.invoke(list, 'sort');
|
||||||
|
assert.deepEqual(result[0], [1, 5, 7], 'first array sorted');
|
||||||
|
assert.deepEqual(result[1], [1, 2, 3], 'second array sorted');
|
||||||
|
delete String.prototype.call;
|
||||||
|
assert.equal(s.call, void 0, 'call function removed');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('pluck', function(assert) {
|
||||||
|
var people = [{name: 'moe', age: 30}, {name: 'curly', age: 50}];
|
||||||
|
assert.deepEqual(_.pluck(people, 'name'), ['moe', 'curly'], 'pulls names out of objects');
|
||||||
|
assert.deepEqual(_.pluck(people, 'address'), [void 0, void 0], 'missing properties are returned as undefined');
|
||||||
|
//compat: most flexible handling of edge cases
|
||||||
|
assert.deepEqual(_.pluck([{'[object Object]': 1}], {}), [1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('where', function(assert) {
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
|
var result = _.where(list, {a: 1});
|
||||||
|
assert.equal(result.length, 3);
|
||||||
|
assert.equal(result[result.length - 1].b, 4);
|
||||||
|
result = _.where(list, {b: 2});
|
||||||
|
assert.equal(result.length, 2);
|
||||||
|
assert.equal(result[0].a, 1);
|
||||||
|
result = _.where(list, {});
|
||||||
|
assert.equal(result.length, list.length);
|
||||||
|
|
||||||
|
function test() {}
|
||||||
|
test.map = _.map;
|
||||||
|
assert.deepEqual(_.where([_, {a: 1, b: 2}, _], test), [_, _], 'checks properties given function');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('findWhere', function(assert) {
|
||||||
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 4}];
|
||||||
|
var result = _.findWhere(list, {a: 1});
|
||||||
|
assert.deepEqual(result, {a: 1, b: 2});
|
||||||
|
result = _.findWhere(list, {b: 4});
|
||||||
|
assert.deepEqual(result, {a: 1, b: 4});
|
||||||
|
|
||||||
|
result = _.findWhere(list, {c: 1});
|
||||||
|
assert.ok(_.isUndefined(result), 'undefined when not found');
|
||||||
|
|
||||||
|
result = _.findWhere([], {c: 1});
|
||||||
|
assert.ok(_.isUndefined(result), 'undefined when searching empty list');
|
||||||
|
|
||||||
|
function test() {}
|
||||||
|
test.map = _.map;
|
||||||
|
assert.equal(_.findWhere([_, {a: 1, b: 2}, _], test), _, 'checks properties given function');
|
||||||
|
|
||||||
|
function TestClass() {
|
||||||
|
this.y = 5;
|
||||||
|
this.x = 'foo';
|
||||||
|
}
|
||||||
|
var expect = {c: 1, x: 'foo', y: 5};
|
||||||
|
assert.deepEqual(_.findWhere([{y: 5, b: 6}, expect], new TestClass()), expect, 'uses class instance properties');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('max', function(assert) {
|
||||||
|
assert.equal(-Infinity, _.max(null), 'can handle null/undefined');
|
||||||
|
assert.equal(-Infinity, _.max(void 0), 'can handle null/undefined');
|
||||||
|
assert.equal(-Infinity, _.max(null, _.identity), 'can handle null/undefined');
|
||||||
|
|
||||||
|
assert.equal(_.max([1, 2, 3]), 3, 'can perform a regular Math.max');
|
||||||
|
|
||||||
|
var neg = _.max([1, 2, 3], function(num){ return -num; });
|
||||||
|
assert.equal(neg, 1, 'can perform a computation-based max');
|
||||||
|
|
||||||
|
assert.equal(-Infinity, _.max({}), 'Maximum value of an empty object');
|
||||||
|
assert.equal(-Infinity, _.max([]), 'Maximum value of an empty array');
|
||||||
|
assert.equal(_.max({a: 'a'}), -Infinity, 'Maximum value of a non-numeric collection');
|
||||||
|
|
||||||
|
assert.equal(_.max(_.range(1, 300000)), 299999, 'Maximum value of a too-big array');
|
||||||
|
|
||||||
|
assert.equal(_.max([1, 2, 3, 'test']), 3, 'Finds correct max in array starting with num and containing a NaN');
|
||||||
|
assert.equal(_.max(['test', 1, 2, 3]), 3, 'Finds correct max in array starting with NaN');
|
||||||
|
|
||||||
|
assert.equal(_.max([1, 2, 3, null]), 3, 'Finds correct max in array starting with num and containing a `null`');
|
||||||
|
assert.equal(_.max([null, 1, 2, 3]), 3, 'Finds correct max in array starting with a `null`');
|
||||||
|
|
||||||
|
assert.equal(_.max([1, 2, 3, '']), 3, 'Finds correct max in array starting with num and containing an empty string');
|
||||||
|
assert.equal(_.max(['', 1, 2, 3]), 3, 'Finds correct max in array starting with an empty string');
|
||||||
|
|
||||||
|
assert.equal(_.max([1, 2, 3, false]), 3, 'Finds correct max in array starting with num and containing a false');
|
||||||
|
assert.equal(_.max([false, 1, 2, 3]), 3, 'Finds correct max in array starting with a false');
|
||||||
|
|
||||||
|
assert.equal(_.max([0, 1, 2, 3, 4]), 4, 'Finds correct max in array containing a zero');
|
||||||
|
assert.equal(_.max([-3, -2, -1, 0]), 0, 'Finds correct max in array containing negative numbers');
|
||||||
|
|
||||||
|
assert.deepEqual(_.map([[1, 2, 3], [4, 5, 6]], _.max), [3, 6], 'Finds correct max in array when mapping through multiple arrays');
|
||||||
|
|
||||||
|
var a = {x: -Infinity};
|
||||||
|
var b = {x: -Infinity};
|
||||||
|
var iterator = function(o){ return o.x; };
|
||||||
|
assert.equal(_.max([a, b], iterator), a, 'Respects iterator return value of -Infinity');
|
||||||
|
|
||||||
|
assert.deepEqual(_.max([{a: 1}, {a: 0, b: 3}, {a: 4}, {a: 2}], 'a'), {a: 4}, 'String keys use property iterator');
|
||||||
|
|
||||||
|
assert.deepEqual(_.max([0, 2], function(c){ return c * this.x; }, {x: 1}), 2, 'Iterator context');
|
||||||
|
assert.deepEqual(_.max([[1], [2, 3], [-1, 4], [5]], 0), [5], 'Lookup falsy iterator');
|
||||||
|
assert.deepEqual(_.max([{0: 1}, {0: 2}, {0: -1}, {a: 1}], 0), {0: 2}, 'Lookup falsy iterator');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('min', function(assert) {
|
||||||
|
assert.equal(_.min(null), Infinity, 'can handle null/undefined');
|
||||||
|
assert.equal(_.min(void 0), Infinity, 'can handle null/undefined');
|
||||||
|
assert.equal(_.min(null, _.identity), Infinity, 'can handle null/undefined');
|
||||||
|
|
||||||
|
assert.equal(_.min([1, 2, 3]), 1, 'can perform a regular Math.min');
|
||||||
|
|
||||||
|
var neg = _.min([1, 2, 3], function(num){ return -num; });
|
||||||
|
assert.equal(neg, 3, 'can perform a computation-based min');
|
||||||
|
|
||||||
|
assert.equal(_.min({}), Infinity, 'Minimum value of an empty object');
|
||||||
|
assert.equal(_.min([]), Infinity, 'Minimum value of an empty array');
|
||||||
|
assert.equal(_.min({a: 'a'}), Infinity, 'Minimum value of a non-numeric collection');
|
||||||
|
|
||||||
|
assert.deepEqual(_.map([[1, 2, 3], [4, 5, 6]], _.min), [1, 4], 'Finds correct min in array when mapping through multiple arrays');
|
||||||
|
|
||||||
|
var now = new Date(9999999999);
|
||||||
|
var then = new Date(0);
|
||||||
|
assert.equal(_.min([now, then]), then);
|
||||||
|
|
||||||
|
assert.equal(_.min(_.range(1, 300000)), 1, 'Minimum value of a too-big array');
|
||||||
|
|
||||||
|
assert.equal(_.min([1, 2, 3, 'test']), 1, 'Finds correct min in array starting with num and containing a NaN');
|
||||||
|
assert.equal(_.min(['test', 1, 2, 3]), 1, 'Finds correct min in array starting with NaN');
|
||||||
|
|
||||||
|
assert.equal(_.min([1, 2, 3, null]), 1, 'Finds correct min in array starting with num and containing a `null`');
|
||||||
|
assert.equal(_.min([null, 1, 2, 3]), 1, 'Finds correct min in array starting with a `null`');
|
||||||
|
|
||||||
|
assert.equal(_.min([0, 1, 2, 3, 4]), 0, 'Finds correct min in array containing a zero');
|
||||||
|
assert.equal(_.min([-3, -2, -1, 0]), -3, 'Finds correct min in array containing negative numbers');
|
||||||
|
|
||||||
|
var a = {x: Infinity};
|
||||||
|
var b = {x: Infinity};
|
||||||
|
var iterator = function(o){ return o.x; };
|
||||||
|
assert.equal(_.min([a, b], iterator), a, 'Respects iterator return value of Infinity');
|
||||||
|
|
||||||
|
assert.deepEqual(_.min([{a: 1}, {a: 0, b: 3}, {a: 4}, {a: 2}], 'a'), {a: 0, b: 3}, 'String keys use property iterator');
|
||||||
|
|
||||||
|
assert.deepEqual(_.min([0, 2], function(c){ return c * this.x; }, {x: -1}), 2, 'Iterator context');
|
||||||
|
assert.deepEqual(_.min([[1], [2, 3], [-1, 4], [5]], 0), [-1, 4], 'Lookup falsy iterator');
|
||||||
|
assert.deepEqual(_.min([{0: 1}, {0: 2}, {0: -1}, {a: 1}], 0), {0: -1}, 'Lookup falsy iterator');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('sortBy', function(assert) {
|
||||||
|
var people = [{name: 'curly', age: 50}, {name: 'moe', age: 30}];
|
||||||
|
people = _.sortBy(people, function(person){ return person.age; });
|
||||||
|
assert.deepEqual(_.pluck(people, 'name'), ['moe', 'curly'], 'stooges sorted by age');
|
||||||
|
|
||||||
|
var list = [void 0, 4, 1, void 0, 3, 2];
|
||||||
|
assert.deepEqual(_.sortBy(list, _.identity), [1, 2, 3, 4, void 0, void 0], 'sortBy with undefined values');
|
||||||
|
|
||||||
|
list = ['one', 'two', 'three', 'four', 'five'];
|
||||||
|
var sorted = _.sortBy(list, 'length');
|
||||||
|
assert.deepEqual(sorted, ['one', 'two', 'four', 'five', 'three'], 'sorted by length');
|
||||||
|
|
||||||
|
function Pair(x, y) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
var stableArray = [
|
||||||
|
new Pair(1, 1), new Pair(1, 2),
|
||||||
|
new Pair(1, 3), new Pair(1, 4),
|
||||||
|
new Pair(1, 5), new Pair(1, 6),
|
||||||
|
new Pair(2, 1), new Pair(2, 2),
|
||||||
|
new Pair(2, 3), new Pair(2, 4),
|
||||||
|
new Pair(2, 5), new Pair(2, 6),
|
||||||
|
new Pair(void 0, 1), new Pair(void 0, 2),
|
||||||
|
new Pair(void 0, 3), new Pair(void 0, 4),
|
||||||
|
new Pair(void 0, 5), new Pair(void 0, 6)
|
||||||
|
];
|
||||||
|
|
||||||
|
var stableObject = _.object('abcdefghijklmnopqr'.split(''), stableArray);
|
||||||
|
|
||||||
|
var actual = _.sortBy(stableArray, function(pair) {
|
||||||
|
return pair.x;
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepEqual(actual, stableArray, 'sortBy should be stable for arrays');
|
||||||
|
assert.deepEqual(_.sortBy(stableArray, 'x'), stableArray, 'sortBy accepts property string');
|
||||||
|
|
||||||
|
actual = _.sortBy(stableObject, function(pair) {
|
||||||
|
return pair.x;
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepEqual(actual, stableArray, 'sortBy should be stable for objects');
|
||||||
|
|
||||||
|
list = ['q', 'w', 'e', 'r', 't', 'y'];
|
||||||
|
assert.deepEqual(_.sortBy(list), ['e', 'q', 'r', 't', 'w', 'y'], 'uses _.identity if iterator is not specified');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('groupBy', function(assert) {
|
||||||
|
var parity = _.groupBy([1, 2, 3, 4, 5, 6], function(num){ return num % 2; });
|
||||||
|
assert.ok('0' in parity && '1' in parity, 'created a group for each value');
|
||||||
|
assert.deepEqual(parity[0], [2, 4, 6], 'put each even number in the right group');
|
||||||
|
|
||||||
|
var list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];
|
||||||
|
var grouped = _.groupBy(list, 'length');
|
||||||
|
assert.deepEqual(grouped['3'], ['one', 'two', 'six', 'ten']);
|
||||||
|
assert.deepEqual(grouped['4'], ['four', 'five', 'nine']);
|
||||||
|
assert.deepEqual(grouped['5'], ['three', 'seven', 'eight']);
|
||||||
|
|
||||||
|
var context = {};
|
||||||
|
_.groupBy([{}], function(){ assert.strictEqual(this, context); }, context);
|
||||||
|
|
||||||
|
grouped = _.groupBy([4.2, 6.1, 6.4], function(num) {
|
||||||
|
return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor';
|
||||||
|
});
|
||||||
|
assert.equal(grouped.constructor.length, 1);
|
||||||
|
assert.equal(grouped.hasOwnProperty.length, 2);
|
||||||
|
|
||||||
|
var array = [{}];
|
||||||
|
_.groupBy(array, function(value, index, obj){ assert.strictEqual(obj, array); });
|
||||||
|
|
||||||
|
array = [1, 2, 1, 2, 3];
|
||||||
|
grouped = _.groupBy(array);
|
||||||
|
assert.equal(grouped['1'].length, 2);
|
||||||
|
assert.equal(grouped['3'].length, 1);
|
||||||
|
|
||||||
|
var matrix = [
|
||||||
|
[1, 2],
|
||||||
|
[1, 3],
|
||||||
|
[2, 3]
|
||||||
|
];
|
||||||
|
assert.deepEqual(_.groupBy(matrix, 0), {1: [[1, 2], [1, 3]], 2: [[2, 3]]});
|
||||||
|
assert.deepEqual(_.groupBy(matrix, 1), {2: [[1, 2]], 3: [[1, 3], [2, 3]]});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('indexBy', function(assert) {
|
||||||
|
var parity = _.indexBy([1, 2, 3, 4, 5], function(num){ return num % 2 === 0; });
|
||||||
|
assert.equal(parity['true'], 4);
|
||||||
|
assert.equal(parity['false'], 5);
|
||||||
|
|
||||||
|
var list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];
|
||||||
|
var grouped = _.indexBy(list, 'length');
|
||||||
|
assert.equal(grouped['3'], 'ten');
|
||||||
|
assert.equal(grouped['4'], 'nine');
|
||||||
|
assert.equal(grouped['5'], 'eight');
|
||||||
|
|
||||||
|
var array = [1, 2, 1, 2, 3];
|
||||||
|
grouped = _.indexBy(array);
|
||||||
|
assert.equal(grouped['1'], 1);
|
||||||
|
assert.equal(grouped['2'], 2);
|
||||||
|
assert.equal(grouped['3'], 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('countBy', function(assert) {
|
||||||
|
var parity = _.countBy([1, 2, 3, 4, 5], function(num){ return num % 2 === 0; });
|
||||||
|
assert.equal(parity['true'], 2);
|
||||||
|
assert.equal(parity['false'], 3);
|
||||||
|
|
||||||
|
var list = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];
|
||||||
|
var grouped = _.countBy(list, 'length');
|
||||||
|
assert.equal(grouped['3'], 4);
|
||||||
|
assert.equal(grouped['4'], 3);
|
||||||
|
assert.equal(grouped['5'], 3);
|
||||||
|
|
||||||
|
var context = {};
|
||||||
|
_.countBy([{}], function(){ assert.strictEqual(this, context); }, context);
|
||||||
|
|
||||||
|
grouped = _.countBy([4.2, 6.1, 6.4], function(num) {
|
||||||
|
return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor';
|
||||||
|
});
|
||||||
|
assert.equal(grouped.constructor, 1);
|
||||||
|
assert.equal(grouped.hasOwnProperty, 2);
|
||||||
|
|
||||||
|
var array = [{}];
|
||||||
|
_.countBy(array, function(value, index, obj){ assert.strictEqual(obj, array); });
|
||||||
|
|
||||||
|
array = [1, 2, 1, 2, 3];
|
||||||
|
grouped = _.countBy(array);
|
||||||
|
assert.equal(grouped['1'], 2);
|
||||||
|
assert.equal(grouped['3'], 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('shuffle', function(assert) {
|
||||||
|
assert.deepEqual(_.shuffle([1]), [1], 'behaves correctly on size 1 arrays');
|
||||||
|
var numbers = _.range(20);
|
||||||
|
var shuffled = _.shuffle(numbers);
|
||||||
|
assert.notDeepEqual(numbers, shuffled, 'does change the order'); // Chance of false negative: 1 in ~2.4*10^18
|
||||||
|
assert.notStrictEqual(numbers, shuffled, 'original object is unmodified');
|
||||||
|
assert.deepEqual(numbers, _.sortBy(shuffled), 'contains the same members before and after shuffle');
|
||||||
|
|
||||||
|
shuffled = _.shuffle({a: 1, b: 2, c: 3, d: 4});
|
||||||
|
assert.equal(shuffled.length, 4);
|
||||||
|
assert.deepEqual(shuffled.sort(), [1, 2, 3, 4], 'works on objects');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('sample', function(assert) {
|
||||||
|
assert.strictEqual(_.sample([1]), 1, 'behaves correctly when no second parameter is given');
|
||||||
|
assert.deepEqual(_.sample([1, 2, 3], -2), [], 'behaves correctly on negative n');
|
||||||
|
var numbers = _.range(10);
|
||||||
|
var allSampled = _.sample(numbers, 10).sort();
|
||||||
|
assert.deepEqual(allSampled, numbers, 'contains the same members before and after sample');
|
||||||
|
allSampled = _.sample(numbers, 20).sort();
|
||||||
|
assert.deepEqual(allSampled, numbers, 'also works when sampling more objects than are present');
|
||||||
|
assert.ok(_.contains(numbers, _.sample(numbers)), 'sampling a single element returns something from the array');
|
||||||
|
assert.strictEqual(_.sample([]), void 0, 'sampling empty array with no number returns undefined');
|
||||||
|
assert.notStrictEqual(_.sample([], 5), [], 'sampling empty array with a number returns an empty array');
|
||||||
|
assert.notStrictEqual(_.sample([1, 2, 3], 0), [], 'sampling an array with 0 picks returns an empty array');
|
||||||
|
assert.deepEqual(_.sample([1, 2], -1), [], 'sampling a negative number of picks returns an empty array');
|
||||||
|
assert.ok(_.contains([1, 2, 3], _.sample({a: 1, b: 2, c: 3})), 'sample one value from an object');
|
||||||
|
var partialSample = _.sample(_.range(1000), 10);
|
||||||
|
var partialSampleSorted = partialSample.sort();
|
||||||
|
assert.notDeepEqual(partialSampleSorted, _.range(10), 'samples from the whole array, not just the beginning');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('toArray', function(assert) {
|
||||||
|
assert.notOk(_.isArray(arguments), 'arguments object is not an array');
|
||||||
|
assert.ok(_.isArray(_.toArray(arguments)), 'arguments object converted into array');
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
assert.notStrictEqual(_.toArray(a), a, 'array is cloned');
|
||||||
|
assert.deepEqual(_.toArray(a), [1, 2, 3], 'cloned array contains same elements');
|
||||||
|
|
||||||
|
var numbers = _.toArray({one: 1, two: 2, three: 3});
|
||||||
|
assert.deepEqual(numbers, [1, 2, 3], 'object flattened into array');
|
||||||
|
|
||||||
|
var hearts = '\uD83D\uDC95';
|
||||||
|
var pair = hearts.split('');
|
||||||
|
var expected = [pair[0], hearts, '&', hearts, pair[1]];
|
||||||
|
assert.deepEqual(_.toArray(expected.join('')), expected, 'maintains astral characters');
|
||||||
|
assert.deepEqual(_.toArray(''), [], 'empty string into empty array');
|
||||||
|
|
||||||
|
if (typeof document != 'undefined') {
|
||||||
|
// test in IE < 9
|
||||||
|
var actual;
|
||||||
|
try {
|
||||||
|
actual = _.toArray(document.childNodes);
|
||||||
|
} catch (e) { /* ignored */ }
|
||||||
|
assert.deepEqual(actual, _.map(document.childNodes, _.identity), 'works on NodeList');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('size', function(assert) {
|
||||||
|
assert.equal(_.size({one: 1, two: 2, three: 3}), 3, 'can compute the size of an object');
|
||||||
|
assert.equal(_.size([1, 2, 3]), 3, 'can compute the size of an array');
|
||||||
|
assert.equal(_.size({length: 3, 0: 0, 1: 0, 2: 0}), 3, 'can compute the size of Array-likes');
|
||||||
|
|
||||||
|
var func = function() {
|
||||||
|
return _.size(arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.equal(func(1, 2, 3, 4), 4, 'can test the size of the arguments object');
|
||||||
|
|
||||||
|
assert.equal(_.size('hello'), 5, 'can compute the size of a string literal');
|
||||||
|
assert.equal(_.size(new String('hello')), 5, 'can compute the size of string object');
|
||||||
|
|
||||||
|
assert.equal(_.size(null), 0, 'handles nulls');
|
||||||
|
assert.equal(_.size(0), 0, 'handles numbers');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('partition', function(assert) {
|
||||||
|
var list = [0, 1, 2, 3, 4, 5];
|
||||||
|
assert.deepEqual(_.partition(list, function(x) { return x < 4; }), [[0, 1, 2, 3], [4, 5]], 'handles bool return values');
|
||||||
|
assert.deepEqual(_.partition(list, function(x) { return x & 1; }), [[1, 3, 5], [0, 2, 4]], 'handles 0 and 1 return values');
|
||||||
|
assert.deepEqual(_.partition(list, function(x) { return x - 3; }), [[0, 1, 2, 4, 5], [3]], 'handles other numeric return values');
|
||||||
|
assert.deepEqual(_.partition(list, function(x) { return x > 1 ? null : true; }), [[0, 1], [2, 3, 4, 5]], 'handles null return values');
|
||||||
|
assert.deepEqual(_.partition(list, function(x) { if (x < 2) return true; }), [[0, 1], [2, 3, 4, 5]], 'handles undefined return values');
|
||||||
|
assert.deepEqual(_.partition({a: 1, b: 2, c: 3}, function(x) { return x > 1; }), [[2, 3], [1]], 'handles objects');
|
||||||
|
|
||||||
|
assert.deepEqual(_.partition(list, function(x, index) { return index % 2; }), [[1, 3, 5], [0, 2, 4]], 'can reference the array index');
|
||||||
|
assert.deepEqual(_.partition(list, function(x, index, arr) { return x === arr.length - 1; }), [[5], [0, 1, 2, 3, 4]], 'can reference the collection');
|
||||||
|
|
||||||
|
// Default iterator
|
||||||
|
assert.deepEqual(_.partition([1, false, true, '']), [[1, true], [false, '']], 'Default iterator');
|
||||||
|
assert.deepEqual(_.partition([{x: 1}, {x: 0}, {x: 1}], 'x'), [[{x: 1}, {x: 1}], [{x: 0}]], 'Takes a string');
|
||||||
|
|
||||||
|
// Context
|
||||||
|
var predicate = function(x){ return x === this.x; };
|
||||||
|
assert.deepEqual(_.partition([1, 2, 3], predicate, {x: 2}), [[2], [1, 3]], 'partition takes a context argument');
|
||||||
|
|
||||||
|
assert.deepEqual(_.partition([{a: 1}, {b: 2}, {a: 1, b: 2}], {a: 1}), [[{a: 1}, {a: 1, b: 2}], [{b: 2}]], 'predicate can be object');
|
||||||
|
|
||||||
|
var object = {a: 1};
|
||||||
|
_.partition(object, function(val, key, obj) {
|
||||||
|
assert.equal(val, 1);
|
||||||
|
assert.equal(key, 'a');
|
||||||
|
assert.equal(obj, object);
|
||||||
|
assert.equal(this, predicate);
|
||||||
|
}, predicate);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (typeof document != 'undefined') {
|
||||||
|
QUnit.test('Can use various collection methods on NodeLists', function(assert) {
|
||||||
|
var parent = document.createElement('div');
|
||||||
|
parent.innerHTML = '<span id=id1></span>textnode<span id=id2></span>';
|
||||||
|
|
||||||
|
var elementChildren = _.filter(parent.childNodes, _.isElement);
|
||||||
|
assert.equal(elementChildren.length, 2);
|
||||||
|
|
||||||
|
assert.deepEqual(_.map(elementChildren, 'id'), ['id1', 'id2']);
|
||||||
|
assert.deepEqual(_.map(parent.childNodes, 'nodeType'), [1, 3, 1]);
|
||||||
|
|
||||||
|
assert.notOk(_.every(parent.childNodes, _.isElement));
|
||||||
|
assert.ok(_.some(parent.childNodes, _.isElement));
|
||||||
|
|
||||||
|
function compareNode(node) {
|
||||||
|
return _.isElement(node) ? node.id.charAt(2) : void 0;
|
||||||
|
}
|
||||||
|
assert.equal(_.max(parent.childNodes, compareNode), _.last(parent.childNodes));
|
||||||
|
assert.equal(_.min(parent.childNodes, compareNode), _.first(parent.childNodes));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}());
|
||||||
141
vendor/underscore/test/cross-document.js
vendored
Normal file
141
vendor/underscore/test/cross-document.js
vendored
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
(function() {
|
||||||
|
if (typeof document == 'undefined') return;
|
||||||
|
|
||||||
|
var _ = typeof require == 'function' ? require('..') : window._;
|
||||||
|
|
||||||
|
QUnit.module('Cross Document');
|
||||||
|
/* global iObject, iElement, iArguments, iFunction, iArray, iError, iString, iNumber, iBoolean, iDate, iRegExp, iNaN, iNull, iUndefined, ActiveXObject */
|
||||||
|
|
||||||
|
// Setup remote variables for iFrame tests.
|
||||||
|
var iframe = document.createElement('iframe');
|
||||||
|
iframe.frameBorder = iframe.height = iframe.width = 0;
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
var iDoc = (iDoc = iframe.contentDocument || iframe.contentWindow).document || iDoc;
|
||||||
|
iDoc.write(
|
||||||
|
[
|
||||||
|
'<script>',
|
||||||
|
'parent.iElement = document.createElement("div");',
|
||||||
|
'parent.iArguments = (function(){ return arguments; })(1, 2, 3);',
|
||||||
|
'parent.iArray = [1, 2, 3];',
|
||||||
|
'parent.iString = new String("hello");',
|
||||||
|
'parent.iNumber = new Number(100);',
|
||||||
|
'parent.iFunction = (function(){});',
|
||||||
|
'parent.iDate = new Date();',
|
||||||
|
'parent.iRegExp = /hi/;',
|
||||||
|
'parent.iNaN = NaN;',
|
||||||
|
'parent.iNull = null;',
|
||||||
|
'parent.iBoolean = new Boolean(false);',
|
||||||
|
'parent.iUndefined = undefined;',
|
||||||
|
'parent.iObject = {};',
|
||||||
|
'parent.iError = new Error();',
|
||||||
|
'</script>'
|
||||||
|
].join('\n')
|
||||||
|
);
|
||||||
|
iDoc.close();
|
||||||
|
|
||||||
|
QUnit.test('isEqual', function(assert) {
|
||||||
|
|
||||||
|
assert.notOk(_.isEqual(iNumber, 101));
|
||||||
|
assert.ok(_.isEqual(iNumber, 100));
|
||||||
|
|
||||||
|
// Objects from another frame.
|
||||||
|
assert.ok(_.isEqual({}, iObject), 'Objects with equivalent members created in different documents are equal');
|
||||||
|
|
||||||
|
// Array from another frame.
|
||||||
|
assert.ok(_.isEqual([1, 2, 3], iArray), 'Arrays with equivalent elements created in different documents are equal');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isEmpty', function(assert) {
|
||||||
|
assert.notOk(_([iNumber]).isEmpty(), '[1] is not empty');
|
||||||
|
assert.notOk(_.isEmpty(iArray), '[] is empty');
|
||||||
|
assert.ok(_.isEmpty(iObject), '{} is empty');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isElement', function(assert) {
|
||||||
|
assert.notOk(_.isElement('div'), 'strings are not dom elements');
|
||||||
|
assert.ok(_.isElement(document.body), 'the body tag is a DOM element');
|
||||||
|
assert.ok(_.isElement(iElement), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isArguments', function(assert) {
|
||||||
|
assert.ok(_.isArguments(iArguments), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isObject', function(assert) {
|
||||||
|
assert.ok(_.isObject(iElement), 'even from another frame');
|
||||||
|
assert.ok(_.isObject(iFunction), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isArray', function(assert) {
|
||||||
|
assert.ok(_.isArray(iArray), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isString', function(assert) {
|
||||||
|
assert.ok(_.isString(iString), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isNumber', function(assert) {
|
||||||
|
assert.ok(_.isNumber(iNumber), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isBoolean', function(assert) {
|
||||||
|
assert.ok(_.isBoolean(iBoolean), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isFunction', function(assert) {
|
||||||
|
assert.ok(_.isFunction(iFunction), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isDate', function(assert) {
|
||||||
|
assert.ok(_.isDate(iDate), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isRegExp', function(assert) {
|
||||||
|
assert.ok(_.isRegExp(iRegExp), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isNaN', function(assert) {
|
||||||
|
assert.ok(_.isNaN(iNaN), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isNull', function(assert) {
|
||||||
|
assert.ok(_.isNull(iNull), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isUndefined', function(assert) {
|
||||||
|
assert.ok(_.isUndefined(iUndefined), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('isError', function(assert) {
|
||||||
|
assert.ok(_.isError(iError), 'even from another frame');
|
||||||
|
});
|
||||||
|
|
||||||
|
if (typeof ActiveXObject != 'undefined') {
|
||||||
|
QUnit.test('IE host objects', function(assert) {
|
||||||
|
var xml = new ActiveXObject('Msxml2.DOMDocument.3.0');
|
||||||
|
assert.notOk(_.isNumber(xml));
|
||||||
|
assert.notOk(_.isBoolean(xml));
|
||||||
|
assert.notOk(_.isNaN(xml));
|
||||||
|
assert.notOk(_.isFunction(xml));
|
||||||
|
assert.notOk(_.isNull(xml));
|
||||||
|
assert.notOk(_.isUndefined(xml));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1621 IE 11 compat mode DOM elements are not functions', function(assert) {
|
||||||
|
var fn = function() {};
|
||||||
|
var xml = new ActiveXObject('Msxml2.DOMDocument.3.0');
|
||||||
|
var div = document.createElement('div');
|
||||||
|
|
||||||
|
// JIT the function
|
||||||
|
var count = 200;
|
||||||
|
while (count--) {
|
||||||
|
_.isFunction(fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.equal(_.isFunction(xml), false);
|
||||||
|
assert.equal(_.isFunction(div), false);
|
||||||
|
assert.equal(_.isFunction(fn), true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}());
|
||||||
765
vendor/underscore/test/functions.js
vendored
Normal file
765
vendor/underscore/test/functions.js
vendored
Normal file
@@ -0,0 +1,765 @@
|
|||||||
|
(function() {
|
||||||
|
var _ = typeof require == 'function' ? require('..') : window._;
|
||||||
|
|
||||||
|
QUnit.module('Functions');
|
||||||
|
QUnit.config.asyncRetries = 3;
|
||||||
|
|
||||||
|
QUnit.test('bind', function(assert) {
|
||||||
|
var context = {name: 'moe'};
|
||||||
|
var func = function(arg) { return 'name: ' + (this.name || arg); };
|
||||||
|
var bound = _.bind(func, context);
|
||||||
|
assert.equal(bound(), 'name: moe', 'can bind a function to a context');
|
||||||
|
|
||||||
|
bound = _(func).bind(context);
|
||||||
|
assert.equal(bound(), 'name: moe', 'can do OO-style binding');
|
||||||
|
|
||||||
|
bound = _.bind(func, null, 'curly');
|
||||||
|
var result = bound();
|
||||||
|
// Work around a PhantomJS bug when applying a function with null|undefined.
|
||||||
|
assert.ok(result === 'name: curly' || result === 'name: ' + window.name, 'can bind without specifying a context');
|
||||||
|
|
||||||
|
func = function(salutation, name) { return salutation + ': ' + name; };
|
||||||
|
func = _.bind(func, this, 'hello');
|
||||||
|
assert.equal(func('moe'), 'hello: moe', 'the function was partially applied in advance');
|
||||||
|
|
||||||
|
func = _.bind(func, this, 'curly');
|
||||||
|
assert.equal(func(), 'hello: curly', 'the function was completely applied in advance');
|
||||||
|
|
||||||
|
func = function(salutation, firstname, lastname) { return salutation + ': ' + firstname + ' ' + lastname; };
|
||||||
|
func = _.bind(func, this, 'hello', 'moe', 'curly');
|
||||||
|
assert.equal(func(), 'hello: moe curly', 'the function was partially applied in advance and can accept multiple arguments');
|
||||||
|
|
||||||
|
func = function(ctx, message) { assert.equal(this, ctx, message); };
|
||||||
|
_.bind(func, 0, 0, 'can bind a function to `0`')();
|
||||||
|
_.bind(func, '', '', 'can bind a function to an empty string')();
|
||||||
|
_.bind(func, false, false, 'can bind a function to `false`')();
|
||||||
|
|
||||||
|
// These tests are only meaningful when using a browser without a native bind function
|
||||||
|
// To test this with a modern browser, set underscore's nativeBind to undefined
|
||||||
|
var F = function() { return this; };
|
||||||
|
var boundf = _.bind(F, {hello: 'moe curly'});
|
||||||
|
var Boundf = boundf; // make eslint happy.
|
||||||
|
var newBoundf = new Boundf();
|
||||||
|
assert.equal(newBoundf.hello, void 0, 'function should not be bound to the context, to comply with ECMAScript 5');
|
||||||
|
assert.equal(boundf().hello, 'moe curly', "When called without the new operator, it's OK to be bound to the context");
|
||||||
|
assert.ok(newBoundf instanceof F, 'a bound instance is an instance of the original function');
|
||||||
|
|
||||||
|
assert.raises(function() { _.bind('notafunction'); }, TypeError, 'throws an error when binding to a non-function');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('partial', function(assert) {
|
||||||
|
var obj = {name: 'moe'};
|
||||||
|
var func = function() { return this.name + ' ' + _.toArray(arguments).join(' '); };
|
||||||
|
|
||||||
|
obj.func = _.partial(func, 'a', 'b');
|
||||||
|
assert.equal(obj.func('c', 'd'), 'moe a b c d', 'can partially apply');
|
||||||
|
|
||||||
|
obj.func = _.partial(func, _, 'b', _, 'd');
|
||||||
|
assert.equal(obj.func('a', 'c'), 'moe a b c d', 'can partially apply with placeholders');
|
||||||
|
|
||||||
|
func = _.partial(function() { return arguments.length; }, _, 'b', _, 'd');
|
||||||
|
assert.equal(func('a', 'c', 'e'), 5, 'accepts more arguments than the number of placeholders');
|
||||||
|
assert.equal(func('a'), 4, 'accepts fewer arguments than the number of placeholders');
|
||||||
|
|
||||||
|
func = _.partial(function() { return typeof arguments[2]; }, _, 'b', _, 'd');
|
||||||
|
assert.equal(func('a'), 'undefined', 'unfilled placeholders are undefined');
|
||||||
|
|
||||||
|
// passes context
|
||||||
|
function MyWidget(name, options) {
|
||||||
|
this.name = name;
|
||||||
|
this.options = options;
|
||||||
|
}
|
||||||
|
MyWidget.prototype.get = function() {
|
||||||
|
return this.name;
|
||||||
|
};
|
||||||
|
var MyWidgetWithCoolOpts = _.partial(MyWidget, _, {a: 1});
|
||||||
|
var widget = new MyWidgetWithCoolOpts('foo');
|
||||||
|
assert.ok(widget instanceof MyWidget, 'Can partially bind a constructor');
|
||||||
|
assert.equal(widget.get(), 'foo', 'keeps prototype');
|
||||||
|
assert.deepEqual(widget.options, {a: 1});
|
||||||
|
|
||||||
|
_.partial.placeholder = obj;
|
||||||
|
func = _.partial(function() { return arguments.length; }, obj, 'b', obj, 'd');
|
||||||
|
assert.equal(func('a'), 4, 'allows the placeholder to be swapped out');
|
||||||
|
|
||||||
|
_.partial.placeholder = {};
|
||||||
|
func = _.partial(function() { return arguments.length; }, obj, 'b', obj, 'd');
|
||||||
|
assert.equal(func('a'), 5, 'swapping the placeholder preserves previously bound arguments');
|
||||||
|
|
||||||
|
_.partial.placeholder = _;
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('bindAll', function(assert) {
|
||||||
|
var curly = {name: 'curly'};
|
||||||
|
var moe = {
|
||||||
|
name: 'moe',
|
||||||
|
getName: function() { return 'name: ' + this.name; },
|
||||||
|
sayHi: function() { return 'hi: ' + this.name; }
|
||||||
|
};
|
||||||
|
curly.getName = moe.getName;
|
||||||
|
_.bindAll(moe, 'getName', 'sayHi');
|
||||||
|
curly.sayHi = moe.sayHi;
|
||||||
|
assert.equal(curly.getName(), 'name: curly', 'unbound function is bound to current object');
|
||||||
|
assert.equal(curly.sayHi(), 'hi: moe', 'bound function is still bound to original object');
|
||||||
|
|
||||||
|
curly = {name: 'curly'};
|
||||||
|
moe = {
|
||||||
|
name: 'moe',
|
||||||
|
getName: function() { return 'name: ' + this.name; },
|
||||||
|
sayHi: function() { return 'hi: ' + this.name; },
|
||||||
|
sayLast: function() { return this.sayHi(_.last(arguments)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.raises(function() { _.bindAll(moe); }, Error, 'throws an error for bindAll with no functions named');
|
||||||
|
assert.raises(function() { _.bindAll(moe, 'sayBye'); }, TypeError, 'throws an error for bindAll if the given key is undefined');
|
||||||
|
assert.raises(function() { _.bindAll(moe, 'name'); }, TypeError, 'throws an error for bindAll if the given key is not a function');
|
||||||
|
|
||||||
|
_.bindAll(moe, 'sayHi', 'sayLast');
|
||||||
|
curly.sayHi = moe.sayHi;
|
||||||
|
assert.equal(curly.sayHi(), 'hi: moe');
|
||||||
|
|
||||||
|
var sayLast = moe.sayLast;
|
||||||
|
assert.equal(sayLast(1, 2, 3, 4, 5, 6, 7, 'Tom'), 'hi: moe', 'createCallback works with any number of arguments');
|
||||||
|
|
||||||
|
_.bindAll(moe, ['getName']);
|
||||||
|
var getName = moe.getName;
|
||||||
|
assert.equal(getName(), 'name: moe', 'flattens arguments into a single list');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('memoize', function(assert) {
|
||||||
|
var fib = function(n) {
|
||||||
|
return n < 2 ? n : fib(n - 1) + fib(n - 2);
|
||||||
|
};
|
||||||
|
assert.equal(fib(10), 55, 'a memoized version of fibonacci produces identical results');
|
||||||
|
fib = _.memoize(fib); // Redefine `fib` for memoization
|
||||||
|
assert.equal(fib(10), 55, 'a memoized version of fibonacci produces identical results');
|
||||||
|
|
||||||
|
var o = function(str) {
|
||||||
|
return str;
|
||||||
|
};
|
||||||
|
var fastO = _.memoize(o);
|
||||||
|
assert.equal(o('toString'), 'toString', 'checks hasOwnProperty');
|
||||||
|
assert.equal(fastO('toString'), 'toString', 'checks hasOwnProperty');
|
||||||
|
|
||||||
|
// Expose the cache.
|
||||||
|
var upper = _.memoize(function(s) {
|
||||||
|
return s.toUpperCase();
|
||||||
|
});
|
||||||
|
assert.equal(upper('foo'), 'FOO');
|
||||||
|
assert.equal(upper('bar'), 'BAR');
|
||||||
|
assert.deepEqual(upper.cache, {foo: 'FOO', bar: 'BAR'});
|
||||||
|
upper.cache = {foo: 'BAR', bar: 'FOO'};
|
||||||
|
assert.equal(upper('foo'), 'BAR');
|
||||||
|
assert.equal(upper('bar'), 'FOO');
|
||||||
|
|
||||||
|
var hashed = _.memoize(function(key) {
|
||||||
|
//https://github.com/jashkenas/underscore/pull/1679#discussion_r13736209
|
||||||
|
assert.ok(/[a-z]+/.test(key), 'hasher doesn\'t change keys');
|
||||||
|
return key;
|
||||||
|
}, function(key) {
|
||||||
|
return key.toUpperCase();
|
||||||
|
});
|
||||||
|
hashed('yep');
|
||||||
|
assert.deepEqual(hashed.cache, {YEP: 'yep'}, 'takes a hasher');
|
||||||
|
|
||||||
|
// Test that the hash function can be used to swizzle the key.
|
||||||
|
var objCacher = _.memoize(function(value, key) {
|
||||||
|
return {key: key, value: value};
|
||||||
|
}, function(value, key) {
|
||||||
|
return key;
|
||||||
|
});
|
||||||
|
var myObj = objCacher('a', 'alpha');
|
||||||
|
var myObjAlias = objCacher('b', 'alpha');
|
||||||
|
assert.notStrictEqual(myObj, void 0, 'object is created if second argument used as key');
|
||||||
|
assert.strictEqual(myObj, myObjAlias, 'object is cached if second argument used as key');
|
||||||
|
assert.strictEqual(myObj.value, 'a', 'object is not modified if second argument used as key');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('delay', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var delayed = false;
|
||||||
|
_.delay(function(){ delayed = true; }, 100);
|
||||||
|
setTimeout(function(){ assert.notOk(delayed, "didn't delay the function quite yet"); }, 50);
|
||||||
|
setTimeout(function(){ assert.ok(delayed, 'delayed the function'); done(); }, 150);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('defer', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var done = assert.async();
|
||||||
|
var deferred = false;
|
||||||
|
_.defer(function(bool){ deferred = bool; }, true);
|
||||||
|
_.delay(function(){ assert.ok(deferred, 'deferred the function'); done(); }, 50);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 32);
|
||||||
|
throttledIncr(); throttledIncr();
|
||||||
|
|
||||||
|
assert.equal(counter, 1, 'incr was called immediately');
|
||||||
|
_.delay(function(){ assert.equal(counter, 2, 'incr was throttled'); done(); }, 64);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle arguments', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var value = 0;
|
||||||
|
var update = function(val){ value = val; };
|
||||||
|
var throttledUpdate = _.throttle(update, 32);
|
||||||
|
throttledUpdate(1); throttledUpdate(2);
|
||||||
|
_.delay(function(){ throttledUpdate(3); }, 64);
|
||||||
|
assert.equal(value, 1, 'updated to latest value');
|
||||||
|
_.delay(function(){ assert.equal(value, 3, 'updated to latest value'); done(); }, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle once', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ return ++counter; };
|
||||||
|
var throttledIncr = _.throttle(incr, 32);
|
||||||
|
var result = throttledIncr();
|
||||||
|
_.delay(function(){
|
||||||
|
assert.equal(result, 1, 'throttled functions return their value');
|
||||||
|
assert.equal(counter, 1, 'incr was called once'); done();
|
||||||
|
}, 64);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle twice', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 32);
|
||||||
|
throttledIncr(); throttledIncr();
|
||||||
|
_.delay(function(){ assert.equal(counter, 2, 'incr was called twice'); done(); }, 64);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('more throttling', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 30);
|
||||||
|
throttledIncr(); throttledIncr();
|
||||||
|
assert.equal(counter, 1);
|
||||||
|
_.delay(function(){
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
throttledIncr();
|
||||||
|
assert.equal(counter, 3);
|
||||||
|
done();
|
||||||
|
}, 85);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle repeatedly with results', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ return ++counter; };
|
||||||
|
var throttledIncr = _.throttle(incr, 100);
|
||||||
|
var results = [];
|
||||||
|
var saveResult = function() { results.push(throttledIncr()); };
|
||||||
|
saveResult(); saveResult();
|
||||||
|
_.delay(saveResult, 50);
|
||||||
|
_.delay(saveResult, 150);
|
||||||
|
_.delay(saveResult, 160);
|
||||||
|
_.delay(saveResult, 230);
|
||||||
|
_.delay(function() {
|
||||||
|
assert.equal(results[0], 1, 'incr was called once');
|
||||||
|
assert.equal(results[1], 1, 'incr was throttled');
|
||||||
|
assert.equal(results[2], 1, 'incr was throttled');
|
||||||
|
assert.equal(results[3], 2, 'incr was called twice');
|
||||||
|
assert.equal(results[4], 2, 'incr was throttled');
|
||||||
|
assert.equal(results[5], 3, 'incr was called trailing');
|
||||||
|
done();
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle triggers trailing call when invoked repeatedly', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var limit = 48;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 32);
|
||||||
|
|
||||||
|
var stamp = new Date;
|
||||||
|
while (new Date - stamp < limit) {
|
||||||
|
throttledIncr();
|
||||||
|
}
|
||||||
|
var lastCount = counter;
|
||||||
|
assert.ok(counter > 1);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.ok(counter > lastCount);
|
||||||
|
done();
|
||||||
|
}, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle does not trigger leading call when leading is set to false', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 60, {leading: false});
|
||||||
|
|
||||||
|
throttledIncr(); throttledIncr();
|
||||||
|
assert.equal(counter, 0);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.equal(counter, 1);
|
||||||
|
done();
|
||||||
|
}, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('more throttle does not trigger leading call when leading is set to false', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 100, {leading: false});
|
||||||
|
|
||||||
|
throttledIncr();
|
||||||
|
_.delay(throttledIncr, 50);
|
||||||
|
_.delay(throttledIncr, 60);
|
||||||
|
_.delay(throttledIncr, 200);
|
||||||
|
assert.equal(counter, 0);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.equal(counter, 1);
|
||||||
|
}, 250);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
done();
|
||||||
|
}, 350);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('one more throttle with leading: false test', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 100, {leading: false});
|
||||||
|
|
||||||
|
var time = new Date;
|
||||||
|
while (new Date - time < 350) throttledIncr();
|
||||||
|
assert.ok(counter <= 3);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.ok(counter <= 4);
|
||||||
|
done();
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle does not trigger trailing call when trailing is set to false', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 60, {trailing: false});
|
||||||
|
|
||||||
|
throttledIncr(); throttledIncr(); throttledIncr();
|
||||||
|
assert.equal(counter, 1);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.equal(counter, 1);
|
||||||
|
|
||||||
|
throttledIncr(); throttledIncr();
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
done();
|
||||||
|
}, 96);
|
||||||
|
}, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle continues to function after system time is set backwards', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 100);
|
||||||
|
var origNowFunc = _.now;
|
||||||
|
|
||||||
|
throttledIncr();
|
||||||
|
assert.equal(counter, 1);
|
||||||
|
_.now = function() {
|
||||||
|
return new Date(2013, 0, 1, 1, 1, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
throttledIncr();
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
done();
|
||||||
|
_.now = origNowFunc;
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle re-entrant', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var sequence = [
|
||||||
|
['b1', 'b2'],
|
||||||
|
['c1', 'c2']
|
||||||
|
];
|
||||||
|
var value = '';
|
||||||
|
var throttledAppend;
|
||||||
|
var append = function(arg){
|
||||||
|
value += this + arg;
|
||||||
|
var args = sequence.pop();
|
||||||
|
if (args) {
|
||||||
|
throttledAppend.call(args[0], args[1]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
throttledAppend = _.throttle(append, 32);
|
||||||
|
throttledAppend.call('a1', 'a2');
|
||||||
|
assert.equal(value, 'a1a2');
|
||||||
|
_.delay(function(){
|
||||||
|
assert.equal(value, 'a1a2c1c2b1b2', 'append was throttled successfully');
|
||||||
|
done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle cancel', function(assert) {
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 32);
|
||||||
|
throttledIncr();
|
||||||
|
throttledIncr.cancel();
|
||||||
|
throttledIncr();
|
||||||
|
throttledIncr();
|
||||||
|
|
||||||
|
assert.equal(counter, 2, 'incr was called immediately');
|
||||||
|
_.delay(function(){ assert.equal(counter, 3, 'incr was throttled'); done(); }, 64);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('throttle cancel with leading: false', function(assert) {
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 32, {leading: false});
|
||||||
|
throttledIncr();
|
||||||
|
throttledIncr.cancel();
|
||||||
|
|
||||||
|
assert.equal(counter, 0, 'incr was throttled');
|
||||||
|
_.delay(function(){ assert.equal(counter, 0, 'incr was throttled'); done(); }, 64);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var debouncedIncr = _.debounce(incr, 32);
|
||||||
|
debouncedIncr(); debouncedIncr();
|
||||||
|
_.delay(debouncedIncr, 16);
|
||||||
|
_.delay(function(){ assert.equal(counter, 1, 'incr was debounced'); done(); }, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce cancel', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var debouncedIncr = _.debounce(incr, 32);
|
||||||
|
debouncedIncr();
|
||||||
|
debouncedIncr.cancel();
|
||||||
|
_.delay(function(){ assert.equal(counter, 0, 'incr was not called'); done(); }, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce asap', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
var done = assert.async();
|
||||||
|
var a, b, c;
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ return ++counter; };
|
||||||
|
var debouncedIncr = _.debounce(incr, 64, true);
|
||||||
|
a = debouncedIncr();
|
||||||
|
b = debouncedIncr();
|
||||||
|
assert.equal(a, 1);
|
||||||
|
assert.equal(b, 1);
|
||||||
|
assert.equal(counter, 1, 'incr was called immediately');
|
||||||
|
_.delay(debouncedIncr, 16);
|
||||||
|
_.delay(debouncedIncr, 32);
|
||||||
|
_.delay(debouncedIncr, 48);
|
||||||
|
_.delay(function(){
|
||||||
|
assert.equal(counter, 1, 'incr was debounced');
|
||||||
|
c = debouncedIncr();
|
||||||
|
assert.equal(c, 2);
|
||||||
|
assert.equal(counter, 2, 'incr was called again');
|
||||||
|
done();
|
||||||
|
}, 128);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce asap cancel', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var done = assert.async();
|
||||||
|
var a, b;
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ return ++counter; };
|
||||||
|
var debouncedIncr = _.debounce(incr, 64, true);
|
||||||
|
a = debouncedIncr();
|
||||||
|
debouncedIncr.cancel();
|
||||||
|
b = debouncedIncr();
|
||||||
|
assert.equal(a, 1);
|
||||||
|
assert.equal(b, 2);
|
||||||
|
assert.equal(counter, 2, 'incr was called immediately');
|
||||||
|
_.delay(debouncedIncr, 16);
|
||||||
|
_.delay(debouncedIncr, 32);
|
||||||
|
_.delay(debouncedIncr, 48);
|
||||||
|
_.delay(function(){ assert.equal(counter, 2, 'incr was debounced'); done(); }, 128);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce asap recursively', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var debouncedIncr = _.debounce(function(){
|
||||||
|
counter++;
|
||||||
|
if (counter < 10) debouncedIncr();
|
||||||
|
}, 32, true);
|
||||||
|
debouncedIncr();
|
||||||
|
assert.equal(counter, 1, 'incr was called immediately');
|
||||||
|
_.delay(function(){ assert.equal(counter, 1, 'incr was debounced'); done(); }, 96);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce after system time is set backwards', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var counter = 0;
|
||||||
|
var origNowFunc = _.now;
|
||||||
|
var debouncedIncr = _.debounce(function(){
|
||||||
|
counter++;
|
||||||
|
}, 100, true);
|
||||||
|
|
||||||
|
debouncedIncr();
|
||||||
|
assert.equal(counter, 1, 'incr was called immediately');
|
||||||
|
|
||||||
|
_.now = function() {
|
||||||
|
return new Date(2013, 0, 1, 1, 1, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
_.delay(function() {
|
||||||
|
debouncedIncr();
|
||||||
|
assert.equal(counter, 2, 'incr was debounced successfully');
|
||||||
|
done();
|
||||||
|
_.now = origNowFunc;
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('debounce re-entrant', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var sequence = [
|
||||||
|
['b1', 'b2']
|
||||||
|
];
|
||||||
|
var value = '';
|
||||||
|
var debouncedAppend;
|
||||||
|
var append = function(arg){
|
||||||
|
value += this + arg;
|
||||||
|
var args = sequence.pop();
|
||||||
|
if (args) {
|
||||||
|
debouncedAppend.call(args[0], args[1]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
debouncedAppend = _.debounce(append, 32);
|
||||||
|
debouncedAppend.call('a1', 'a2');
|
||||||
|
assert.equal(value, '');
|
||||||
|
_.delay(function(){
|
||||||
|
assert.equal(value, 'a1a2b1b2', 'append was debounced successfully');
|
||||||
|
done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once', function(assert) {
|
||||||
|
var num = 0;
|
||||||
|
var increment = _.once(function(){ return ++num; });
|
||||||
|
increment();
|
||||||
|
increment();
|
||||||
|
assert.equal(num, 1);
|
||||||
|
|
||||||
|
assert.equal(increment(), 1, 'stores a memo to the last value');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Recursive onced function.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var f = _.once(function(){
|
||||||
|
assert.ok(true);
|
||||||
|
f();
|
||||||
|
});
|
||||||
|
f();
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('wrap', function(assert) {
|
||||||
|
var greet = function(name){ return 'hi: ' + name; };
|
||||||
|
var backwards = _.wrap(greet, function(func, name){ return func(name) + ' ' + name.split('').reverse().join(''); });
|
||||||
|
assert.equal(backwards('moe'), 'hi: moe eom', 'wrapped the salutation function');
|
||||||
|
|
||||||
|
var inner = function(){ return 'Hello '; };
|
||||||
|
var obj = {name: 'Moe'};
|
||||||
|
obj.hi = _.wrap(inner, function(fn){ return fn() + this.name; });
|
||||||
|
assert.equal(obj.hi(), 'Hello Moe');
|
||||||
|
|
||||||
|
var noop = function(){};
|
||||||
|
var wrapped = _.wrap(noop, function(){ return Array.prototype.slice.call(arguments, 0); });
|
||||||
|
var ret = wrapped(['whats', 'your'], 'vector', 'victor');
|
||||||
|
assert.deepEqual(ret, [noop, ['whats', 'your'], 'vector', 'victor']);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('negate', function(assert) {
|
||||||
|
var isOdd = function(n){ return n & 1; };
|
||||||
|
assert.equal(_.negate(isOdd)(2), true, 'should return the complement of the given function');
|
||||||
|
assert.equal(_.negate(isOdd)(3), false, 'should return the complement of the given function');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('compose', function(assert) {
|
||||||
|
var greet = function(name){ return 'hi: ' + name; };
|
||||||
|
var exclaim = function(sentence){ return sentence + '!'; };
|
||||||
|
var composed = _.compose(exclaim, greet);
|
||||||
|
assert.equal(composed('moe'), 'hi: moe!', 'can compose a function that takes another');
|
||||||
|
|
||||||
|
composed = _.compose(greet, exclaim);
|
||||||
|
assert.equal(composed('moe'), 'hi: moe!', 'in this case, the functions are also commutative');
|
||||||
|
|
||||||
|
// f(g(h(x, y, z)))
|
||||||
|
function h(x, y, z) {
|
||||||
|
assert.equal(arguments.length, 3, 'First function called with multiple args');
|
||||||
|
return z * y;
|
||||||
|
}
|
||||||
|
function g(x) {
|
||||||
|
assert.equal(arguments.length, 1, 'Composed function is called with 1 argument');
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
function f(x) {
|
||||||
|
assert.equal(arguments.length, 1, 'Composed function is called with 1 argument');
|
||||||
|
return x * 2;
|
||||||
|
}
|
||||||
|
composed = _.compose(f, g, h);
|
||||||
|
assert.equal(composed(1, 2, 3), 12);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('after', function(assert) {
|
||||||
|
var testAfter = function(afterAmount, timesCalled) {
|
||||||
|
var afterCalled = 0;
|
||||||
|
var after = _.after(afterAmount, function() {
|
||||||
|
afterCalled++;
|
||||||
|
});
|
||||||
|
while (timesCalled--) after();
|
||||||
|
return afterCalled;
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.equal(testAfter(5, 5), 1, 'after(N) should fire after being called N times');
|
||||||
|
assert.equal(testAfter(5, 4), 0, 'after(N) should not fire unless called N times');
|
||||||
|
assert.equal(testAfter(0, 0), 0, 'after(0) should not fire immediately');
|
||||||
|
assert.equal(testAfter(0, 1), 1, 'after(0) should fire when first invoked');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('before', function(assert) {
|
||||||
|
var testBefore = function(beforeAmount, timesCalled) {
|
||||||
|
var beforeCalled = 0;
|
||||||
|
var before = _.before(beforeAmount, function() { beforeCalled++; });
|
||||||
|
while (timesCalled--) before();
|
||||||
|
return beforeCalled;
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.equal(testBefore(5, 5), 4, 'before(N) should not fire after being called N times');
|
||||||
|
assert.equal(testBefore(5, 4), 4, 'before(N) should fire before being called N times');
|
||||||
|
assert.equal(testBefore(0, 0), 0, 'before(0) should not fire immediately');
|
||||||
|
assert.equal(testBefore(0, 1), 0, 'before(0) should not fire when first invoked');
|
||||||
|
|
||||||
|
var context = {num: 0};
|
||||||
|
var increment = _.before(3, function(){ return ++this.num; });
|
||||||
|
_.times(10, increment, context);
|
||||||
|
assert.equal(increment(), 2, 'stores a memo to the last value');
|
||||||
|
assert.equal(context.num, 2, 'provides context');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('iteratee', function(assert) {
|
||||||
|
var identity = _.iteratee();
|
||||||
|
assert.equal(identity, _.identity, '_.iteratee is exposed as an external function.');
|
||||||
|
|
||||||
|
function fn() {
|
||||||
|
return arguments;
|
||||||
|
}
|
||||||
|
_.each([_.iteratee(fn), _.iteratee(fn, {})], function(cb) {
|
||||||
|
assert.equal(cb().length, 0);
|
||||||
|
assert.deepEqual(_.toArray(cb(1, 2, 3)), _.range(1, 4));
|
||||||
|
assert.deepEqual(_.toArray(cb(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), _.range(1, 11));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Test custom iteratee
|
||||||
|
var builtinIteratee = _.iteratee;
|
||||||
|
_.iteratee = function(value) {
|
||||||
|
// RegEx values return a function that returns the number of matches
|
||||||
|
if (_.isRegExp(value)) return function(obj) {
|
||||||
|
return (obj.match(value) || []).length;
|
||||||
|
};
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
var collection = ['foo', 'bar', 'bbiz'];
|
||||||
|
|
||||||
|
// Test all methods that claim to be transformed through `_.iteratee`
|
||||||
|
assert.deepEqual(_.countBy(collection, /b/g), {0: 1, 1: 1, 2: 1});
|
||||||
|
assert.equal(_.every(collection, /b/g), false);
|
||||||
|
assert.deepEqual(_.filter(collection, /b/g), ['bar', 'bbiz']);
|
||||||
|
assert.equal(_.find(collection, /b/g), 'bar');
|
||||||
|
assert.equal(_.findIndex(collection, /b/g), 1);
|
||||||
|
assert.equal(_.findKey(collection, /b/g), 1);
|
||||||
|
assert.equal(_.findLastIndex(collection, /b/g), 2);
|
||||||
|
assert.deepEqual(_.groupBy(collection, /b/g), {0: ['foo'], 1: ['bar'], 2: ['bbiz']});
|
||||||
|
assert.deepEqual(_.indexBy(collection, /b/g), {0: 'foo', 1: 'bar', 2: 'bbiz'});
|
||||||
|
assert.deepEqual(_.map(collection, /b/g), [0, 1, 2]);
|
||||||
|
assert.equal(_.max(collection, /b/g), 'bbiz');
|
||||||
|
assert.equal(_.min(collection, /b/g), 'foo');
|
||||||
|
assert.deepEqual(_.partition(collection, /b/g), [['bar', 'bbiz'], ['foo']]);
|
||||||
|
assert.deepEqual(_.reject(collection, /b/g), ['foo']);
|
||||||
|
assert.equal(_.some(collection, /b/g), true);
|
||||||
|
assert.deepEqual(_.sortBy(collection, /b/g), ['foo', 'bar', 'bbiz']);
|
||||||
|
assert.equal(_.sortedIndex(collection, 'blah', /b/g), 1);
|
||||||
|
assert.deepEqual(_.uniq(collection, /b/g), ['foo', 'bar', 'bbiz']);
|
||||||
|
|
||||||
|
var objCollection = {a: 'foo', b: 'bar', c: 'bbiz'};
|
||||||
|
assert.deepEqual(_.mapObject(objCollection, /b/g), {a: 0, b: 1, c: 2});
|
||||||
|
|
||||||
|
// Restore the builtin iteratee
|
||||||
|
_.iteratee = builtinIteratee;
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('restArgs', function(assert) {
|
||||||
|
assert.expect(10);
|
||||||
|
_.restArgs(function(a, args) {
|
||||||
|
assert.strictEqual(a, 1);
|
||||||
|
assert.deepEqual(args, [2, 3], 'collects rest arguments into an array');
|
||||||
|
})(1, 2, 3);
|
||||||
|
|
||||||
|
_.restArgs(function(a, args) {
|
||||||
|
assert.strictEqual(a, void 0);
|
||||||
|
assert.deepEqual(args, [], 'passes empty array if there are not enough arguments');
|
||||||
|
})();
|
||||||
|
|
||||||
|
_.restArgs(function(a, b, c, args) {
|
||||||
|
assert.strictEqual(arguments.length, 4);
|
||||||
|
assert.deepEqual(args, [4, 5], 'works on functions with many named parameters');
|
||||||
|
})(1, 2, 3, 4, 5);
|
||||||
|
|
||||||
|
var obj = {};
|
||||||
|
_.restArgs(function() {
|
||||||
|
assert.strictEqual(this, obj, 'invokes function with this context');
|
||||||
|
}).call(obj);
|
||||||
|
|
||||||
|
_.restArgs(function(array, iteratee, context) {
|
||||||
|
assert.deepEqual(array, [1, 2, 3, 4], 'startIndex can be used manually specify index of rest parameter');
|
||||||
|
assert.strictEqual(iteratee, void 0);
|
||||||
|
assert.strictEqual(context, void 0);
|
||||||
|
}, 0)(1, 2, 3, 4);
|
||||||
|
});
|
||||||
|
|
||||||
|
}());
|
||||||
1105
vendor/underscore/test/objects.js
vendored
Normal file
1105
vendor/underscore/test/objects.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
421
vendor/underscore/test/utility.js
vendored
Normal file
421
vendor/underscore/test/utility.js
vendored
Normal file
@@ -0,0 +1,421 @@
|
|||||||
|
(function() {
|
||||||
|
var _ = typeof require == 'function' ? require('..') : window._;
|
||||||
|
var templateSettings;
|
||||||
|
|
||||||
|
QUnit.module('Utility', {
|
||||||
|
|
||||||
|
beforeEach: function() {
|
||||||
|
templateSettings = _.clone(_.templateSettings);
|
||||||
|
},
|
||||||
|
|
||||||
|
afterEach: function() {
|
||||||
|
_.templateSettings = templateSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
if (typeof this == 'object') {
|
||||||
|
QUnit.test('noConflict', function(assert) {
|
||||||
|
var underscore = _.noConflict();
|
||||||
|
assert.equal(underscore.identity(1), 1);
|
||||||
|
if (typeof require != 'function') {
|
||||||
|
assert.equal(this._, void 0, 'global underscore is removed');
|
||||||
|
this._ = underscore;
|
||||||
|
} else if (typeof global !== 'undefined') {
|
||||||
|
delete global._;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof require == 'function') {
|
||||||
|
QUnit.test('noConflict (node vm)', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var done = assert.async();
|
||||||
|
var fs = require('fs');
|
||||||
|
var vm = require('vm');
|
||||||
|
var filename = __dirname + '/../underscore.js';
|
||||||
|
fs.readFile(filename, function(err, content){
|
||||||
|
var sandbox = vm.createScript(
|
||||||
|
content + 'this.underscore = this._.noConflict();',
|
||||||
|
filename
|
||||||
|
);
|
||||||
|
var context = {_: 'oldvalue'};
|
||||||
|
sandbox.runInNewContext(context);
|
||||||
|
assert.equal(context._, 'oldvalue');
|
||||||
|
assert.equal(context.underscore.VERSION, _.VERSION);
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.test('#750 - Return _ instance.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var instance = _([]);
|
||||||
|
assert.strictEqual(_(instance), instance);
|
||||||
|
assert.strictEqual(new _(instance), instance);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('identity', function(assert) {
|
||||||
|
var stooge = {name: 'moe'};
|
||||||
|
assert.equal(_.identity(stooge), stooge, 'stooge is the same as his identity');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('constant', function(assert) {
|
||||||
|
var stooge = {name: 'moe'};
|
||||||
|
assert.equal(_.constant(stooge)(), stooge, 'should create a function that returns stooge');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('noop', function(assert) {
|
||||||
|
assert.strictEqual(_.noop('curly', 'larry', 'moe'), void 0, 'should always return undefined');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('property', function(assert) {
|
||||||
|
var stooge = {name: 'moe'};
|
||||||
|
assert.equal(_.property('name')(stooge), 'moe', 'should return the property with the given name');
|
||||||
|
assert.equal(_.property('name')(null), void 0, 'should return undefined for null values');
|
||||||
|
assert.equal(_.property('name')(void 0), void 0, 'should return undefined for undefined values');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('propertyOf', function(assert) {
|
||||||
|
var stoogeRanks = _.propertyOf({curly: 2, moe: 1, larry: 3});
|
||||||
|
assert.equal(stoogeRanks('curly'), 2, 'should return the property with the given name');
|
||||||
|
assert.equal(stoogeRanks(null), void 0, 'should return undefined for null values');
|
||||||
|
assert.equal(stoogeRanks(void 0), void 0, 'should return undefined for undefined values');
|
||||||
|
|
||||||
|
function MoreStooges() { this.shemp = 87; }
|
||||||
|
MoreStooges.prototype = {curly: 2, moe: 1, larry: 3};
|
||||||
|
var moreStoogeRanks = _.propertyOf(new MoreStooges());
|
||||||
|
assert.equal(moreStoogeRanks('curly'), 2, 'should return properties from further up the prototype chain');
|
||||||
|
|
||||||
|
var nullPropertyOf = _.propertyOf(null);
|
||||||
|
assert.equal(nullPropertyOf('curly'), void 0, 'should return undefined when obj is null');
|
||||||
|
|
||||||
|
var undefPropertyOf = _.propertyOf(void 0);
|
||||||
|
assert.equal(undefPropertyOf('curly'), void 0, 'should return undefined when obj is undefined');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('random', function(assert) {
|
||||||
|
var array = _.range(1000);
|
||||||
|
var min = Math.pow(2, 31);
|
||||||
|
var max = Math.pow(2, 62);
|
||||||
|
|
||||||
|
assert.ok(_.every(array, function() {
|
||||||
|
return _.random(min, max) >= min;
|
||||||
|
}), 'should produce a random number greater than or equal to the minimum number');
|
||||||
|
|
||||||
|
assert.ok(_.some(array, function() {
|
||||||
|
return _.random(Number.MAX_VALUE) > 0;
|
||||||
|
}), 'should produce a random number when passed `Number.MAX_VALUE`');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('now', function(assert) {
|
||||||
|
var diff = _.now() - new Date().getTime();
|
||||||
|
assert.ok(diff <= 0 && diff > -5, 'Produces the correct time in milliseconds');//within 5ms
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('uniqueId', function(assert) {
|
||||||
|
var ids = [], i = 0;
|
||||||
|
while (i++ < 100) ids.push(_.uniqueId());
|
||||||
|
assert.equal(_.uniq(ids).length, ids.length, 'can generate a globally-unique stream of ids');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('times', function(assert) {
|
||||||
|
var vals = [];
|
||||||
|
_.times(3, function(i) { vals.push(i); });
|
||||||
|
assert.deepEqual(vals, [0, 1, 2], 'is 0 indexed');
|
||||||
|
//
|
||||||
|
vals = [];
|
||||||
|
_(3).times(function(i) { vals.push(i); });
|
||||||
|
assert.deepEqual(vals, [0, 1, 2], 'works as a wrapper');
|
||||||
|
// collects return values
|
||||||
|
assert.deepEqual([0, 1, 2], _.times(3, function(i) { return i; }), 'collects return values');
|
||||||
|
|
||||||
|
assert.deepEqual(_.times(0, _.identity), []);
|
||||||
|
assert.deepEqual(_.times(-1, _.identity), []);
|
||||||
|
assert.deepEqual(_.times(parseFloat('-Infinity'), _.identity), []);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('mixin', function(assert) {
|
||||||
|
var ret = _.mixin({
|
||||||
|
myReverse: function(string) {
|
||||||
|
return string.split('').reverse().join('');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assert.equal(ret, _, 'returns the _ object to facilitate chaining');
|
||||||
|
assert.equal(_.myReverse('panacea'), 'aecanap', 'mixed in a function to _');
|
||||||
|
assert.equal(_('champ').myReverse(), 'pmahc', 'mixed in a function to the OOP wrapper');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_.escape', function(assert) {
|
||||||
|
assert.equal(_.escape(null), '');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_.unescape', function(assert) {
|
||||||
|
var string = 'Curly & Moe';
|
||||||
|
assert.equal(_.unescape(null), '');
|
||||||
|
assert.equal(_.unescape(_.escape(string)), string);
|
||||||
|
assert.equal(_.unescape(string), string, 'don\'t unescape unnecessarily');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Don't care what they escape them to just that they're escaped and can be unescaped
|
||||||
|
QUnit.test('_.escape & unescape', function(assert) {
|
||||||
|
// test & (&) seperately obviously
|
||||||
|
var escapeCharacters = ['<', '>', '"', '\'', '`'];
|
||||||
|
|
||||||
|
_.each(escapeCharacters, function(escapeChar) {
|
||||||
|
var s = 'a ' + escapeChar + ' string escaped';
|
||||||
|
var e = _.escape(s);
|
||||||
|
assert.notEqual(s, e, escapeChar + ' is escaped');
|
||||||
|
assert.equal(s, _.unescape(e), escapeChar + ' can be unescaped');
|
||||||
|
|
||||||
|
s = 'a ' + escapeChar + escapeChar + escapeChar + 'some more string' + escapeChar;
|
||||||
|
e = _.escape(s);
|
||||||
|
|
||||||
|
assert.equal(e.indexOf(escapeChar), -1, 'can escape multiple occurances of ' + escapeChar);
|
||||||
|
assert.equal(_.unescape(e), s, 'multiple occurrences of ' + escapeChar + ' can be unescaped');
|
||||||
|
});
|
||||||
|
|
||||||
|
// handles multiple escape characters at once
|
||||||
|
var joiner = ' other stuff ';
|
||||||
|
var allEscaped = escapeCharacters.join(joiner);
|
||||||
|
allEscaped += allEscaped;
|
||||||
|
assert.ok(_.every(escapeCharacters, function(escapeChar) {
|
||||||
|
return allEscaped.indexOf(escapeChar) !== -1;
|
||||||
|
}), 'handles multiple characters');
|
||||||
|
assert.ok(allEscaped.indexOf(joiner) >= 0, 'can escape multiple escape characters at the same time');
|
||||||
|
|
||||||
|
// test & -> &
|
||||||
|
var str = 'some string & another string & yet another';
|
||||||
|
var escaped = _.escape(str);
|
||||||
|
|
||||||
|
assert.notStrictEqual(escaped.indexOf('&'), -1, 'handles & aka &');
|
||||||
|
assert.equal(_.unescape(str), str, 'can unescape &');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('template', function(assert) {
|
||||||
|
var basicTemplate = _.template("<%= thing %> is gettin' on my noives!");
|
||||||
|
var result = basicTemplate({thing: 'This'});
|
||||||
|
assert.equal(result, "This is gettin' on my noives!", 'can do basic attribute interpolation');
|
||||||
|
|
||||||
|
var sansSemicolonTemplate = _.template('A <% this %> B');
|
||||||
|
assert.equal(sansSemicolonTemplate(), 'A B');
|
||||||
|
|
||||||
|
var backslashTemplate = _.template('<%= thing %> is \\ridanculous');
|
||||||
|
assert.equal(backslashTemplate({thing: 'This'}), 'This is \\ridanculous');
|
||||||
|
|
||||||
|
var escapeTemplate = _.template('<%= a ? "checked=\\"checked\\"" : "" %>');
|
||||||
|
assert.equal(escapeTemplate({a: true}), 'checked="checked"', 'can handle slash escapes in interpolations.');
|
||||||
|
|
||||||
|
var fancyTemplate = _.template('<ul><% ' +
|
||||||
|
' for (var key in people) { ' +
|
||||||
|
'%><li><%= people[key] %></li><% } %></ul>');
|
||||||
|
result = fancyTemplate({people: {moe: 'Moe', larry: 'Larry', curly: 'Curly'}});
|
||||||
|
assert.equal(result, '<ul><li>Moe</li><li>Larry</li><li>Curly</li></ul>', 'can run arbitrary javascript in templates');
|
||||||
|
|
||||||
|
var escapedCharsInJavascriptTemplate = _.template('<ul><% _.each(numbers.split("\\n"), function(item) { %><li><%= item %></li><% }) %></ul>');
|
||||||
|
result = escapedCharsInJavascriptTemplate({numbers: 'one\ntwo\nthree\nfour'});
|
||||||
|
assert.equal(result, '<ul><li>one</li><li>two</li><li>three</li><li>four</li></ul>', 'Can use escaped characters (e.g. \\n) in JavaScript');
|
||||||
|
|
||||||
|
var namespaceCollisionTemplate = _.template('<%= pageCount %> <%= thumbnails[pageCount] %> <% _.each(thumbnails, function(p) { %><div class="thumbnail" rel="<%= p %>"></div><% }); %>');
|
||||||
|
result = namespaceCollisionTemplate({
|
||||||
|
pageCount: 3,
|
||||||
|
thumbnails: {
|
||||||
|
1: 'p1-thumbnail.gif',
|
||||||
|
2: 'p2-thumbnail.gif',
|
||||||
|
3: 'p3-thumbnail.gif'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assert.equal(result, '3 p3-thumbnail.gif <div class="thumbnail" rel="p1-thumbnail.gif"></div><div class="thumbnail" rel="p2-thumbnail.gif"></div><div class="thumbnail" rel="p3-thumbnail.gif"></div>');
|
||||||
|
|
||||||
|
var noInterpolateTemplate = _.template('<div><p>Just some text. Hey, I know this is silly but it aids consistency.</p></div>');
|
||||||
|
result = noInterpolateTemplate();
|
||||||
|
assert.equal(result, '<div><p>Just some text. Hey, I know this is silly but it aids consistency.</p></div>');
|
||||||
|
|
||||||
|
var quoteTemplate = _.template("It's its, not it's");
|
||||||
|
assert.equal(quoteTemplate({}), "It's its, not it's");
|
||||||
|
|
||||||
|
var quoteInStatementAndBody = _.template('<% ' +
|
||||||
|
" if(foo == 'bar'){ " +
|
||||||
|
"%>Statement quotes and 'quotes'.<% } %>");
|
||||||
|
assert.equal(quoteInStatementAndBody({foo: 'bar'}), "Statement quotes and 'quotes'.");
|
||||||
|
|
||||||
|
var withNewlinesAndTabs = _.template('This\n\t\tis: <%= x %>.\n\tok.\nend.');
|
||||||
|
assert.equal(withNewlinesAndTabs({x: 'that'}), 'This\n\t\tis: that.\n\tok.\nend.');
|
||||||
|
|
||||||
|
var template = _.template('<i><%- value %></i>');
|
||||||
|
result = template({value: '<script>'});
|
||||||
|
assert.equal(result, '<i><script></i>');
|
||||||
|
|
||||||
|
var stooge = {
|
||||||
|
name: 'Moe',
|
||||||
|
template: _.template("I'm <%= this.name %>")
|
||||||
|
};
|
||||||
|
assert.equal(stooge.template(), "I'm Moe");
|
||||||
|
|
||||||
|
template = _.template('\n ' +
|
||||||
|
' <%\n ' +
|
||||||
|
' // a comment\n ' +
|
||||||
|
' if (data) { data += 12345; }; %>\n ' +
|
||||||
|
' <li><%= data %></li>\n '
|
||||||
|
);
|
||||||
|
assert.equal(template({data: 12345}).replace(/\s/g, ''), '<li>24690</li>');
|
||||||
|
|
||||||
|
_.templateSettings = {
|
||||||
|
evaluate: /\{\{([\s\S]+?)\}\}/g,
|
||||||
|
interpolate: /\{\{=([\s\S]+?)\}\}/g
|
||||||
|
};
|
||||||
|
|
||||||
|
var custom = _.template('<ul>{{ for (var key in people) { }}<li>{{= people[key] }}</li>{{ } }}</ul>');
|
||||||
|
result = custom({people: {moe: 'Moe', larry: 'Larry', curly: 'Curly'}});
|
||||||
|
assert.equal(result, '<ul><li>Moe</li><li>Larry</li><li>Curly</li></ul>', 'can run arbitrary javascript in templates');
|
||||||
|
|
||||||
|
var customQuote = _.template("It's its, not it's");
|
||||||
|
assert.equal(customQuote({}), "It's its, not it's");
|
||||||
|
|
||||||
|
quoteInStatementAndBody = _.template("{{ if(foo == 'bar'){ }}Statement quotes and 'quotes'.{{ } }}");
|
||||||
|
assert.equal(quoteInStatementAndBody({foo: 'bar'}), "Statement quotes and 'quotes'.");
|
||||||
|
|
||||||
|
_.templateSettings = {
|
||||||
|
evaluate: /<\?([\s\S]+?)\?>/g,
|
||||||
|
interpolate: /<\?=([\s\S]+?)\?>/g
|
||||||
|
};
|
||||||
|
|
||||||
|
var customWithSpecialChars = _.template('<ul><? for (var key in people) { ?><li><?= people[key] ?></li><? } ?></ul>');
|
||||||
|
result = customWithSpecialChars({people: {moe: 'Moe', larry: 'Larry', curly: 'Curly'}});
|
||||||
|
assert.equal(result, '<ul><li>Moe</li><li>Larry</li><li>Curly</li></ul>', 'can run arbitrary javascript in templates');
|
||||||
|
|
||||||
|
var customWithSpecialCharsQuote = _.template("It's its, not it's");
|
||||||
|
assert.equal(customWithSpecialCharsQuote({}), "It's its, not it's");
|
||||||
|
|
||||||
|
quoteInStatementAndBody = _.template("<? if(foo == 'bar'){ ?>Statement quotes and 'quotes'.<? } ?>");
|
||||||
|
assert.equal(quoteInStatementAndBody({foo: 'bar'}), "Statement quotes and 'quotes'.");
|
||||||
|
|
||||||
|
_.templateSettings = {
|
||||||
|
interpolate: /\{\{(.+?)\}\}/g
|
||||||
|
};
|
||||||
|
|
||||||
|
var mustache = _.template('Hello {{planet}}!');
|
||||||
|
assert.equal(mustache({planet: 'World'}), 'Hello World!', 'can mimic mustache.js');
|
||||||
|
|
||||||
|
var templateWithNull = _.template('a null undefined {{planet}}');
|
||||||
|
assert.equal(templateWithNull({planet: 'world'}), 'a null undefined world', 'can handle missing escape and evaluate settings');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_.template provides the generated function source, when a SyntaxError occurs', function(assert) {
|
||||||
|
var source;
|
||||||
|
try {
|
||||||
|
_.template('<b><%= if x %></b>');
|
||||||
|
} catch (ex) {
|
||||||
|
source = ex.source;
|
||||||
|
}
|
||||||
|
assert.ok(/__p/.test(source));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_.template handles \\u2028 & \\u2029', function(assert) {
|
||||||
|
var tmpl = _.template('<p>\u2028<%= "\\u2028\\u2029" %>\u2029</p>');
|
||||||
|
assert.strictEqual(tmpl(), '<p>\u2028\u2028\u2029\u2029</p>');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result calls functions and returns primitives', function(assert) {
|
||||||
|
var obj = {w: '', x: 'x', y: function(){ return this.x; }};
|
||||||
|
assert.strictEqual(_.result(obj, 'w'), '');
|
||||||
|
assert.strictEqual(_.result(obj, 'x'), 'x');
|
||||||
|
assert.strictEqual(_.result(obj, 'y'), 'x');
|
||||||
|
assert.strictEqual(_.result(obj, 'z'), void 0);
|
||||||
|
assert.strictEqual(_.result(null, 'x'), void 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result returns a default value if object is null or undefined', function(assert) {
|
||||||
|
assert.strictEqual(_.result(null, 'b', 'default'), 'default');
|
||||||
|
assert.strictEqual(_.result(void 0, 'c', 'default'), 'default');
|
||||||
|
assert.strictEqual(_.result(''.match('missing'), 1, 'default'), 'default');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result returns a default value if property of object is missing', function(assert) {
|
||||||
|
assert.strictEqual(_.result({d: null}, 'd', 'default'), null);
|
||||||
|
assert.strictEqual(_.result({e: false}, 'e', 'default'), false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result only returns the default value if the object does not have the property or is undefined', function(assert) {
|
||||||
|
assert.strictEqual(_.result({}, 'b', 'default'), 'default');
|
||||||
|
assert.strictEqual(_.result({d: void 0}, 'd', 'default'), 'default');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result does not return the default if the property of an object is found in the prototype', function(assert) {
|
||||||
|
var Foo = function(){};
|
||||||
|
Foo.prototype.bar = 1;
|
||||||
|
assert.strictEqual(_.result(new Foo, 'bar', 2), 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result does use the fallback when the result of invoking the property is undefined', function(assert) {
|
||||||
|
var obj = {a: function() {}};
|
||||||
|
assert.strictEqual(_.result(obj, 'a', 'failed'), void 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('result fallback can use a function', function(assert) {
|
||||||
|
var obj = {a: [1, 2, 3]};
|
||||||
|
assert.strictEqual(_.result(obj, 'b', _.constant(5)), 5);
|
||||||
|
assert.strictEqual(_.result(obj, 'b', function() {
|
||||||
|
return this.a;
|
||||||
|
}), obj.a, 'called with context');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_.templateSettings.variable', function(assert) {
|
||||||
|
var s = '<%=data.x%>';
|
||||||
|
var data = {x: 'x'};
|
||||||
|
var tmp = _.template(s, {variable: 'data'});
|
||||||
|
assert.strictEqual(tmp(data), 'x');
|
||||||
|
_.templateSettings.variable = 'data';
|
||||||
|
assert.strictEqual(_.template(s)(data), 'x');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#547 - _.templateSettings is unchanged by custom settings.', function(assert) {
|
||||||
|
assert.notOk(_.templateSettings.variable);
|
||||||
|
_.template('', {}, {variable: 'x'});
|
||||||
|
assert.notOk(_.templateSettings.variable);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#556 - undefined template variables.', function(assert) {
|
||||||
|
var template = _.template('<%=x%>');
|
||||||
|
assert.strictEqual(template({x: null}), '');
|
||||||
|
assert.strictEqual(template({x: void 0}), '');
|
||||||
|
|
||||||
|
var templateEscaped = _.template('<%-x%>');
|
||||||
|
assert.strictEqual(templateEscaped({x: null}), '');
|
||||||
|
assert.strictEqual(templateEscaped({x: void 0}), '');
|
||||||
|
|
||||||
|
var templateWithProperty = _.template('<%=x.foo%>');
|
||||||
|
assert.strictEqual(templateWithProperty({x: {}}), '');
|
||||||
|
assert.strictEqual(templateWithProperty({x: {}}), '');
|
||||||
|
|
||||||
|
var templateWithPropertyEscaped = _.template('<%-x.foo%>');
|
||||||
|
assert.strictEqual(templateWithPropertyEscaped({x: {}}), '');
|
||||||
|
assert.strictEqual(templateWithPropertyEscaped({x: {}}), '');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('interpolate evaluates code only once.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var count = 0;
|
||||||
|
var template = _.template('<%= f() %>');
|
||||||
|
template({f: function(){ assert.notOk(count++); }});
|
||||||
|
|
||||||
|
var countEscaped = 0;
|
||||||
|
var templateEscaped = _.template('<%- f() %>');
|
||||||
|
templateEscaped({f: function(){ assert.notOk(countEscaped++); }});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#746 - _.template settings are not modified.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var settings = {};
|
||||||
|
_.template('', null, settings);
|
||||||
|
assert.deepEqual(settings, {});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#779 - delimeters are applied to unescaped text.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var template = _.template('<<\nx\n>>', null, {evaluate: /<<(.*?)>>/g});
|
||||||
|
assert.strictEqual(template(), '<<\nx\n>>');
|
||||||
|
});
|
||||||
|
|
||||||
|
}());
|
||||||
6
vendor/underscore/underscore-min.js
vendored
Normal file
6
vendor/underscore/underscore-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user