mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-06 09:47:48 +00:00
Compare commits
5799 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
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://github.com/lodash/lodash/blob/master/CODE_OF_CONDUCT.md)
|
||||||
|
& [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. 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 [jQuery Foundation](https://jquery.org/).
|
||||||
|
As such, we request that all contributors sign the jQuery Foundation
|
||||||
|
[contributor license agreement (CLA)](https://contribute.jquery.org/CLA/).
|
||||||
|
|
||||||
|
For more information about CLAs, please check out Alex Russell’s excellent post,
|
||||||
|
[“Why Do I Need to Sign This?”](http://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`, `collection`, & `callback` 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`.
|
||||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,4 +1,9 @@
|
|||||||
*.custom.*
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
dist/
|
*.custom.*
|
||||||
node_modules/
|
*.log
|
||||||
|
*.map
|
||||||
|
lodash.compat.min.js
|
||||||
|
coverage
|
||||||
|
node_modules
|
||||||
|
.opt-in
|
||||||
|
.opt-out
|
||||||
|
|||||||
96
.jscsrc
Normal file
96
.jscsrc
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"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,
|
||||||
|
|
||||||
|
"jsDoc": {
|
||||||
|
"checkRedundantAccess": true,
|
||||||
|
"checkTypes": true,
|
||||||
|
"requireNewlineAfterDescription": true,
|
||||||
|
"requireParamDescription": true,
|
||||||
|
"requireParamTypes": true,
|
||||||
|
"requireReturnTypes": true
|
||||||
|
}
|
||||||
|
}
|
||||||
17
.npmignore
17
.npmignore
@@ -1,17 +0,0 @@
|
|||||||
*.custom.*
|
|
||||||
*.min.*
|
|
||||||
.*
|
|
||||||
dist/
|
|
||||||
doc/*.php
|
|
||||||
node_modules/
|
|
||||||
perf/*.html
|
|
||||||
perf/*.sh
|
|
||||||
test/*.html
|
|
||||||
test/*-ui.js
|
|
||||||
test/*.sh
|
|
||||||
vendor/backbone/
|
|
||||||
vendor/docdown/
|
|
||||||
vendor/qunit/qunit/*.css
|
|
||||||
vendor/underscore/
|
|
||||||
vendor/requirejs/
|
|
||||||
vendor/firebug-lite/
|
|
||||||
77
.travis.yml
Normal file
77
.travis.yml
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
language: node_js
|
||||||
|
sudo: false
|
||||||
|
node_js:
|
||||||
|
- "5"
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- BIN="node" ISTANBUL=false OPTION=""
|
||||||
|
- SAUCE_LABS=false SAUCE_USERNAME="lodash"
|
||||||
|
- secure: "tg1JFsIFnxzLaTboFPOnm+aJCuMm5+JdhLlESlqg9x3fwro++7KCnwHKLNovhchaPe4otC43ZMB/nfWhDnDm11dKbm/V6HlTkED+dadTsaLxVDg6J+7yK41QhokBPJOxLV78iDaNaAQVYEirAgZ0yn8kFubxmNKV+bpCGQNc9yU="
|
||||||
|
matrix:
|
||||||
|
-
|
||||||
|
- BIN="phantomjs"
|
||||||
|
- ISTANBUL=true
|
||||||
|
- SAUCE_LABS=true
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- node_js: "0.10"
|
||||||
|
env:
|
||||||
|
- node_js: "0.12"
|
||||||
|
env:
|
||||||
|
- node_js: "4"
|
||||||
|
env:
|
||||||
|
git:
|
||||||
|
depth: 10
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
notifications:
|
||||||
|
webhooks:
|
||||||
|
urls:
|
||||||
|
- https://webhooks.gitter.im/e/4aab6358b0e9aed0b628
|
||||||
|
on_success: change
|
||||||
|
on_failure: always
|
||||||
|
before_install:
|
||||||
|
- "nvm use $TRAVIS_NODE_VERSION"
|
||||||
|
- "npm set loglevel error"
|
||||||
|
- "npm set progress false"
|
||||||
|
- "npm i -g npm@\"^2.0.0\""
|
||||||
|
- |
|
||||||
|
PATTERN[0]="|\s*if\s*\(isHostObject\b[\s\S]+?\}(?=\n)|"
|
||||||
|
PATTERN[1]="|\s*if\s*\(enumerate\b[\s\S]+?\};\s*\}|"
|
||||||
|
PATTERN[2]="|\s*while\s*\([^)]+\)\s*\{\s*iteratee\(index\);\s*\}|"
|
||||||
|
PATTERN[3]="|\s*else\s*\{\s*assocSet\(data\b[\s\S]+?\}|"
|
||||||
|
PATTERN[4]="|\bcase\s+(?:dataView|set|map|weakMap)CtorString:.+|g"
|
||||||
|
PATTERN[5]="|\bindex,\s*iterable\)\s*===\s*false\)[^}]+?(break;)|"
|
||||||
|
PATTERN[6]="|\s*if\s*\(\!lodashFunc\)\s*\{\s*return;\s*\}|"
|
||||||
|
PATTERN[7]="|\s*define\([\s\S]+?\);|"
|
||||||
|
PATTERN[8]="|\s*root\._\s*=\s*_;|"
|
||||||
|
|
||||||
|
if [ $ISTANBUL == true ]; then
|
||||||
|
set -e
|
||||||
|
for PTRN in ${PATTERN[@]}; do
|
||||||
|
node ./test/remove.js "$PTRN" ./lodash.js
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
- "git clone --depth=10 --branch=master git://github.com/lodash/lodash-cli ./node_modules/lodash-cli && mkdir $_/node_modules && cd $_ && ln -s ../../../ ./lodash && cd ../ && npm i && cd ../../"
|
||||||
|
- "node ./node_modules/lodash-cli/bin/lodash -o ./dist/lodash.js"
|
||||||
|
script:
|
||||||
|
- "[ $ISTANBUL == false ] || istanbul cover -x \"**/vendor/**\" --report lcovonly ./test/test.js -- ./lodash.js"
|
||||||
|
- "[ $ISTANBUL == false ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || (cat ./coverage/lcov.info | coveralls) || true"
|
||||||
|
- "[ $ISTANBUL == false ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || (cat ./coverage/coverage.json | codecov) || true"
|
||||||
|
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || cd ./test"
|
||||||
|
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || $BIN $OPTION ./test.js ../lodash.js"
|
||||||
|
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || $BIN $OPTION ./test.js ../dist/lodash.min.js"
|
||||||
|
- "[ $SAUCE_LABS == false ] || rm -rf ./node_modules/lodash"
|
||||||
|
- "[ $SAUCE_LABS == false ] || ($BIN ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./node_modules/lodash && node ./node_modules/lodash-cli/bin/lodash -d -o ./node_modules/lodash/lodash.js)"
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./node_modules/lodash-cli/bin/lodash core -o ./dist/lodash.core.js"
|
||||||
|
- "[ $SAUCE_LABS == false ] || npm run build"
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash tests\" runner=\"test/index.html?build=../dist/lodash.js&noglobals=true\" tags=\"development\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash tests\" runner=\"test/index.html?build=../dist/lodash.min.js&noglobals=true\" tags=\"production\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash-fp tests\" runner=\"test/fp.html?noglobals=true\" tags=\"development\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.js\" tags=\"development,underscore\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.min.js\" tags=\"production,underscore\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.js\" tags=\"development,backbone\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.min.js\" tags=\"production,backbone\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.core.js\" tags=\"development,backbone\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.core.min.js\" tags=\"production,backbone\""
|
||||||
74
CODE_OF_CONDUCT.md
Normal file
74
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at [coc@lodash.com](mailto:coc@lodash.com).
|
||||||
|
The project team will review and investigate all complaints, and will respond in
|
||||||
|
a way that it deems appropriate to the circumstances. The project team is obligated
|
||||||
|
to maintain confidentiality with regard to the reporter of an incident. Further
|
||||||
|
details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
||||||
@@ -1,6 +1,16 @@
|
|||||||
Copyright 2010-2012 Mathias Bynens <http://mathiasbynens.be/>
|
Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
||||||
Based on JSLitmus.js, copyright Robert Kieffer <http://broofa.com/>
|
|
||||||
Modified by John-David Dalton <http://allyoucanleet.com/>
|
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
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
@@ -20,3 +30,18 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
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.
|
|
||||||
297
README.md
297
README.md
@@ -1,273 +1,52 @@
|
|||||||
# Lo-Dash <sup>v0.4.1</sup>
|
# lodash v4.11.0
|
||||||
|
|
||||||
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).
|
The [Lodash](https://lodash.com/) library exported as a [UMD](https://github.com/umdjs/umd) module.
|
||||||
|
|
||||||
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.
|
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
|
||||||
|
```bash
|
||||||
|
$ npm run build
|
||||||
|
$ lodash -o ./dist/lodash.js
|
||||||
|
$ lodash core -o ./dist/lodash.core.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
[](https://gitter.im/lodash/lodash)
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
* [API Documentation](https://lodash.com/docs)
|
||||||
|
* [FP Guide](https://github.com/lodash/lodash/wiki/FP-Guide)
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
* [Development source](https://raw.github.com/bestiejs/lodash/v0.4.1/lodash.js)
|
Lodash is released under the [MIT license](https://raw.githubusercontent.com/lodash/lodash/4.11.0/LICENSE) & supports [modern environments](#support).<br>
|
||||||
* [Production source](https://raw.github.com/bestiejs/lodash/v0.4.1/lodash.min.js)
|
Review the [build differences](https://github.com/lodash/lodash/wiki/build-differences) & pick one that’s right for you.
|
||||||
* CDN copies of ≤ [v0.3.2](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/0.3.2/lodash.min.js) are available on [cdnjs](http://cdnjs.com/) thanks to [CloudFlare](http://www.cloudflare.com/)
|
|
||||||
* For optimal performance, [create a custom build](https://github.com/bestiejs/lodash#custom-builds) with only the features you need
|
|
||||||
|
|
||||||
## Dive in
|
* [Core build](https://raw.githubusercontent.com/lodash/lodash/4.11.0/dist/lodash.core.js) ([~4 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.11.0/dist/lodash.core.min.js))
|
||||||
|
* [Full build](https://raw.githubusercontent.com/lodash/lodash/4.11.0/dist/lodash.js) ([~21 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.11.0/dist/lodash.min.js))
|
||||||
|
* [CDN copies](https://www.jsdelivr.com/projects/lodash)
|
||||||
|
|
||||||
We’ve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests).
|
## Why Lodash?
|
||||||
|
|
||||||
Create your own benchmarks at [jsPerf](http://jsperf.com), or [search](http://jsperf.com/search?q=lodash) for existing ones.
|
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:
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/lodash/wiki/Roadmap).
|
* Iterating arrays, objects, & strings
|
||||||
|
* Manipulating & testing values
|
||||||
|
* Creating composite functions
|
||||||
|
|
||||||
## Screencasts
|
## Module Formats
|
||||||
|
|
||||||
For more information check out these screencasts over Lo-Dash:
|
Lodash is available in a [variety of builds](https://lodash.com/custom-builds) & module formats.
|
||||||
|
|
||||||
* [Introducing Lo-Dash](https://vimeo.com/44154599)
|
* [lodash](https://www.npmjs.com/package/lodash) & [per method packages](https://www.npmjs.com/browse/keyword/lodash-modularized)
|
||||||
* [Optimizations and custom builds](https://vimeo.com/44154601)
|
* [lodash-amd](https://www.npmjs.com/package/lodash-amd)
|
||||||
* [Lo-Dash’s origin and why it’s a better utility belt](https://vimeo.com/44154600)
|
* [lodash-es](https://www.npmjs.com/package/lodash-es) & [babel-plugin-lodash](https://www.npmjs.com/package/babel-plugin-lodash)
|
||||||
|
* [lodash/fp](https://github.com/lodash/lodash/tree/4.11.0-npm/fp)
|
||||||
|
|
||||||
## Features
|
## Further Reading
|
||||||
|
|
||||||
* AMD loader support ([RequireJS](http://requirejs.org/), [curl.js](https://github.com/cujojs/curl), etc.)
|
* [Contributing](https://github.com/lodash/lodash/blob/4.11.0/.github/CONTRIBUTING.md)
|
||||||
* [_.bind](http://lodash.com/docs#bind) supports *"lazy"* binding
|
* [Release Notes](https://github.com/lodash/lodash/releases/tag/4.0.0)
|
||||||
* [_.debounce](http://lodash.com/docs#debounce)’ed functions match [_.throttle](http://lodash.com/docs#throttle)’ed functions’ return value behavior
|
* [Wiki (Changelog, Roadmap, etc.)](https://github.com/lodash/lodash/wiki)
|
||||||
* [_.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
|
|
||||||
* [_.template](http://lodash.com/docs#template) utilizes [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) for easier debugging
|
|
||||||
* [_.contains](http://lodash.com/docs#contains), [_.size](http://lodash.com/docs#size), [_.toArray](http://lodash.com/docs#toArray),
|
|
||||||
[and more…](http://lodash.com/docs "_.every, _.filter, _.find, _.forEach, _.groupBy, _.invoke, _.map, _.pluck, _.reduce, _.reduceRight, _.reject, _.some, _sortBy") accept strings
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Lo-Dash has been tested in at least Chrome 5-20, Firefox 1.5-13, IE 6-9, Opera 9.25-12, Safari 3.0.4-5.1.7, Node.js 0.4.8-0.8.2, 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.
|
|
||||||
|
|
||||||
* Backbone builds, containing all methods required by Backbone, may be created using the `backbone` modifier argument.
|
|
||||||
~~~ bash
|
|
||||||
lodash backbone
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Legacy builds, tailored for older browsers without [ES5 support](http://es5.github.com/), may be created using the `legacy` modifier argument.
|
|
||||||
~~~ bash
|
|
||||||
lodash legacy
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Mobile builds, with IE < 9 bug fixes and method compilation removed, may be created using the `mobile` modifier argument.
|
|
||||||
~~~ bash
|
|
||||||
lodash 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
|
|
||||||
lodash category=collections,functions
|
|
||||||
lodash category="collections, functions"
|
|
||||||
~~~
|
|
||||||
|
|
||||||
2. Use the `include` argument to pass the names of methods to include in the build.
|
|
||||||
~~~ bash
|
|
||||||
lodash include=each,filter,map
|
|
||||||
lodash include="each, filter, map"
|
|
||||||
~~~
|
|
||||||
|
|
||||||
3. Use the `exclude` argument to pass the names of methods to exclude from the build.
|
|
||||||
~~~ bash
|
|
||||||
lodash exclude=union,uniq,zip
|
|
||||||
lodash exclude="union, uniq, zip"
|
|
||||||
~~~
|
|
||||||
|
|
||||||
All arguments, except `include` with `exclude` and `mobile` with `legacy`, may be combined.
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
lodash backbone mobile category=functions include=pick,uniq
|
|
||||||
lodash backbone legacy category=utilities exclude=first,last
|
|
||||||
~~~
|
|
||||||
|
|
||||||
The `lodash` command-line utility is available when Lo-Dash is installed as a global package (i.e. `npm install -g lodash`).
|
|
||||||
|
|
||||||
Custom builds are saved to `lodash.custom.js` and `lodash.custom.min.js`.
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
In browsers:
|
|
||||||
|
|
||||||
~~~ html
|
|
||||||
<script src="lodash.js"></script>
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Using [npm](http://npmjs.org/):
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
npm install lodash
|
|
||||||
npm install -g lodash
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
var _ = require('lodash');
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In [Narwhal](http://narwhaljs.org/) and [RingoJS v0.7.0-](http://ringojs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
var _ = require('lodash')._;
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In [Rhino](http://www.mozilla.org/rhino/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
load('lodash.js');
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In an AMD loader like [RequireJS](http://requirejs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'underscore': 'path/to/lodash'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['underscore'], function(_) {
|
|
||||||
console.log(_.VERSION);
|
|
||||||
});
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Closed Underscore.js issues <sup>(20+)</sup>
|
|
||||||
|
|
||||||
* 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), [#659](https://github.com/documentcloud/underscore/issues/659), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L306-312)]
|
|
||||||
* Ensure array-like objects with invalid `length` properties are treated like regular objects [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L257-263), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L607-621), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L863-866)]
|
|
||||||
* Ensure *"Arrays"* methods allow falsey `array` arguments [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L931-970)]
|
|
||||||
* Ensure *"Collections"* methods allow string `collection` arguments [[#247](https://github.com/documentcloud/underscore/issues/247), [#276](https://github.com/documentcloud/underscore/issues/276), [#561](https://github.com/documentcloud/underscore/pull/561), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L265-283), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L623-640), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L868-871)]
|
|
||||||
* Ensure templates compiled with errors are inspectable [[#666](https://github.com/documentcloud/underscore/issues/666), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L737-744)]
|
|
||||||
* Fix cross-browser object iteration bugs [[#376](https://github.com/documentcloud/underscore/issues/376), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L195-207), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L317-342), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L438-449), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L457-459), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L477-497), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L667-669)]
|
|
||||||
* 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/v0.4.1/test/test.js#L86-92)]
|
|
||||||
* Register as an AMD module, but still export to global [[#431](https://github.com/documentcloud/underscore/pull/431), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L70-84)]
|
|
||||||
* `_(…)` should return passed wrapper instances [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L104-107)]
|
|
||||||
* `_.contains` should work with strings [[#667](https://github.com/documentcloud/underscore/pull/667), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L138-147)]
|
|
||||||
* `_.escape` should return an empty string when passed `null` or `undefined` [[#407](https://github.com/documentcloud/underscore/issues/427), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L176-179)]
|
|
||||||
* `_.forEach` should be chainable [[#142](https://github.com/documentcloud/underscore/issues/142), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L252-255)]
|
|
||||||
* `_.groupBy` should add values to own, not inherited, properties [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L357-364)]
|
|
||||||
* `_isNaN(new Number(NaN))` should return `true` [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L467-469)]
|
|
||||||
* `_.reduceRight` should pass correct callback arguments when iterating objects [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L591-605)]
|
|
||||||
* `_.size` should return the `length` of string values [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L650-652)]
|
|
||||||
* `_.size` shouldn't error on falsey values [[#650](https://github.com/documentcloud/underscore/pull/650), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L654-661)]
|
|
||||||
* `_.size` should work with `arguments` objects cross-browser [[#653](https://github.com/documentcloud/underscore/issues/653), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L663-665)]
|
|
||||||
* `_.sortedIndex` should support arrays with high `length` values [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L707-716)]
|
|
||||||
* `_.template` should not augment the `options` object [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L731-735)]
|
|
||||||
* `_.throttle` should work when called in a tight loop [[#502](https://github.com/documentcloud/underscore/issues/502), [test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L814-824)]
|
|
||||||
* `_.zipObject` should accept less than two arguments [[test](https://github.com/bestiejs/lodash/blob/v0.4.1/test/test.js#L893-895)]
|
|
||||||
|
|
||||||
## 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`
|
|
||||||
* `_.isArguments`
|
|
||||||
* `_.isDate`
|
|
||||||
* `_.isEmpty`
|
|
||||||
* `_.isEqual`
|
|
||||||
* `_.isFinite`
|
|
||||||
* `_.isFunction`
|
|
||||||
* `_.isObject`
|
|
||||||
* `_.isNumber`
|
|
||||||
* `_.isRegExp`
|
|
||||||
* `_.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
|
|
||||||
|
|
||||||
## Release Notes
|
|
||||||
|
|
||||||
### <sup>v0.4.1</sup>
|
|
||||||
|
|
||||||
* Fixed `_.template` regression
|
|
||||||
* Optimized build process to detect and remove more unused variables
|
|
||||||
|
|
||||||
### <sup>v0.4.0</sup>
|
|
||||||
|
|
||||||
* Added `bin` and `scripts` entries to package.json
|
|
||||||
* Added `legacy` build option
|
|
||||||
* Added cross-browser support for passing strings to *"Collections"* methods
|
|
||||||
* Added `_.zipObject`
|
|
||||||
* Leveraged `_.indexOf`'s `fromIndex` in `_.difference` and `_.without`
|
|
||||||
* Optimized compiled templates
|
|
||||||
* Optimized inlining the `iteratorTemplate` for builds
|
|
||||||
* Optimized object iteration for *"Collections"* methods
|
|
||||||
* Optimized partially applied `_.bind` in V8
|
|
||||||
* Made compiled templates more debuggable
|
|
||||||
* Made `_.size` work with falsey values and consistent cross-browser with `arguments` objects
|
|
||||||
* Moved `_.groupBy` and `_.sortBy` back to the *"Collections"* category
|
|
||||||
* Removed `arguments` object from `_.range`
|
|
||||||
|
|
||||||
The full changelog is available [here](https://github.com/bestiejs/lodash/wiki/Changelog).
|
|
||||||
|
|
||||||
## 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")
|
|
||||||
|
|||||||
915
build.js
915
build.js
@@ -1,915 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** Load modules */
|
|
||||||
var fs = require('fs'),
|
|
||||||
path = require('path'),
|
|
||||||
vm = require('vm'),
|
|
||||||
minify = require(path.join(__dirname, 'build', 'minify'));
|
|
||||||
|
|
||||||
/** The current working directory */
|
|
||||||
var cwd = process.cwd();
|
|
||||||
|
|
||||||
/** Flag used to specify a backbone build */
|
|
||||||
var isBackbone = process.argv.indexOf('backbone') > -1;
|
|
||||||
|
|
||||||
/** Flag used to specify a legacy build */
|
|
||||||
var isLegacy = process.argv.indexOf('legacy') > -1;
|
|
||||||
|
|
||||||
/** Flag used to specify a mobile build */
|
|
||||||
var isMobile = !isLegacy && 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');
|
|
||||||
|
|
||||||
/** Load customized Lo-Dash module */
|
|
||||||
var lodash = (function() {
|
|
||||||
var sandbox = {};
|
|
||||||
|
|
||||||
if (isLegacy) {
|
|
||||||
['isBindFast', 'isKeysFast', 'nativeBind', 'nativeIsArray', 'nativeKeys'].forEach(function(varName) {
|
|
||||||
source = replaceVar(source, varName, 'false');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else if (isMobile) {
|
|
||||||
source = replaceVar(source, 'isKeysFast', 'false');
|
|
||||||
}
|
|
||||||
vm.runInNewContext(source, sandbox);
|
|
||||||
return sandbox._;
|
|
||||||
}());
|
|
||||||
|
|
||||||
/** 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 Backbone's Lo-Dash dependencies */
|
|
||||||
var backboneDependencies = [
|
|
||||||
'bind',
|
|
||||||
'bindAll',
|
|
||||||
'clone',
|
|
||||||
'contains',
|
|
||||||
'escape',
|
|
||||||
'every',
|
|
||||||
'extend',
|
|
||||||
'filter',
|
|
||||||
'find',
|
|
||||||
'first',
|
|
||||||
'forEach',
|
|
||||||
'groupBy',
|
|
||||||
'has',
|
|
||||||
'indexOf',
|
|
||||||
'initial',
|
|
||||||
'invoke',
|
|
||||||
'isArray',
|
|
||||||
'isEmpty',
|
|
||||||
'isEqual',
|
|
||||||
'isFunction',
|
|
||||||
'isObject',
|
|
||||||
'isRegExp',
|
|
||||||
'keys',
|
|
||||||
'last',
|
|
||||||
'lastIndexOf',
|
|
||||||
'map',
|
|
||||||
'max',
|
|
||||||
'min',
|
|
||||||
'mixin',
|
|
||||||
'reduce',
|
|
||||||
'reduceRight',
|
|
||||||
'reject',
|
|
||||||
'rest',
|
|
||||||
'shuffle',
|
|
||||||
'size',
|
|
||||||
'some',
|
|
||||||
'sortBy',
|
|
||||||
'sortedIndex',
|
|
||||||
'toArray',
|
|
||||||
'uniqueId',
|
|
||||||
'without'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to track function dependencies */
|
|
||||||
var dependencyMap = {
|
|
||||||
'after': [],
|
|
||||||
'bind': [],
|
|
||||||
'bindAll': ['bind', 'functions'],
|
|
||||||
'chain': ['mixin'],
|
|
||||||
'clone': ['extend', 'isArray'],
|
|
||||||
'compact': [],
|
|
||||||
'compose': [],
|
|
||||||
'contains': [],
|
|
||||||
'debounce': [],
|
|
||||||
'defaults': [],
|
|
||||||
'defer': [],
|
|
||||||
'delay': [],
|
|
||||||
'difference': ['indexOf'],
|
|
||||||
'escape': [],
|
|
||||||
'every': ['identity'],
|
|
||||||
'extend': [],
|
|
||||||
'filter': ['identity'],
|
|
||||||
'find': [],
|
|
||||||
'first': [],
|
|
||||||
'flatten': ['isArray'],
|
|
||||||
'forEach': [],
|
|
||||||
'forIn': [],
|
|
||||||
'forOwn': [],
|
|
||||||
'functions': [],
|
|
||||||
'groupBy': [],
|
|
||||||
'has': [],
|
|
||||||
'identity': [],
|
|
||||||
'indexOf': ['sortedIndex'],
|
|
||||||
'initial': [],
|
|
||||||
'intersection': ['every', 'indexOf'],
|
|
||||||
'invoke': [],
|
|
||||||
'isArguments': [],
|
|
||||||
'isArray': [],
|
|
||||||
'isBoolean': [],
|
|
||||||
'isDate': [],
|
|
||||||
'isElement': [],
|
|
||||||
'isEmpty': [],
|
|
||||||
'isEqual': [],
|
|
||||||
'isFinite': [],
|
|
||||||
'isFunction': [],
|
|
||||||
'isNaN': [],
|
|
||||||
'isNull': [],
|
|
||||||
'isNumber': [],
|
|
||||||
'isObject': [],
|
|
||||||
'isRegExp': [],
|
|
||||||
'isString': [],
|
|
||||||
'isUndefined': [],
|
|
||||||
'keys': [],
|
|
||||||
'last': [],
|
|
||||||
'lastIndexOf': [],
|
|
||||||
'map': ['identity'],
|
|
||||||
'max': [],
|
|
||||||
'memoize': [],
|
|
||||||
'min': [],
|
|
||||||
'mixin': ['forEach', 'functions'],
|
|
||||||
'noConflict': [],
|
|
||||||
'once': [],
|
|
||||||
'partial': [],
|
|
||||||
'pick': [],
|
|
||||||
'pluck': [],
|
|
||||||
'range': [],
|
|
||||||
'reduce': [],
|
|
||||||
'reduceRight': ['keys'],
|
|
||||||
'reject': ['identity'],
|
|
||||||
'rest': [],
|
|
||||||
'result': [],
|
|
||||||
'shuffle': [],
|
|
||||||
'size': ['keys'],
|
|
||||||
'some': ['identity'],
|
|
||||||
'sortBy': [],
|
|
||||||
'sortedIndex': ['bind'],
|
|
||||||
'tap': [],
|
|
||||||
'template': ['escape'],
|
|
||||||
'throttle': [],
|
|
||||||
'times': [],
|
|
||||||
'toArray': ['values'],
|
|
||||||
'union': ['indexOf'],
|
|
||||||
'uniq': ['identity', 'indexOf'],
|
|
||||||
'uniqueId': [],
|
|
||||||
'values': [],
|
|
||||||
'without': ['indexOf'],
|
|
||||||
'wrap': [],
|
|
||||||
'zip': ['max', 'pluck'],
|
|
||||||
'zipObject': []
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to `iteratorTemplate` */
|
|
||||||
var iteratorOptions = [
|
|
||||||
'args',
|
|
||||||
'array',
|
|
||||||
'arrayBranch',
|
|
||||||
'beforeLoop',
|
|
||||||
'bottom',
|
|
||||||
'exit',
|
|
||||||
'firstArg',
|
|
||||||
'hasDontEnumBug',
|
|
||||||
'inLoop',
|
|
||||||
'init',
|
|
||||||
'isKeysFast',
|
|
||||||
'iteratee',
|
|
||||||
'object',
|
|
||||||
'objectBranch',
|
|
||||||
'noCharByIndex',
|
|
||||||
'shadowed',
|
|
||||||
'top',
|
|
||||||
'useHas'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Collections of method names */
|
|
||||||
var excludeMethods,
|
|
||||||
includeMethods,
|
|
||||||
allMethods = Object.keys(dependencyMap);
|
|
||||||
|
|
||||||
/** Used to specify whether filtering is for exclusion or inclusion */
|
|
||||||
var filterType = process.argv.reduce(function(result, value) {
|
|
||||||
if (result) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
var pair = value.match(/^(exclude|include)=(.*)$/);
|
|
||||||
if (!pair) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// remove nonexistent method names
|
|
||||||
var methodNames = lodash.intersection(allMethods, pair[2].split(/, */).map(getRealName));
|
|
||||||
|
|
||||||
if (pair[1] == 'exclude') {
|
|
||||||
excludeMethods = methodNames;
|
|
||||||
} else {
|
|
||||||
includeMethods = methodNames;
|
|
||||||
}
|
|
||||||
// return `filterType`
|
|
||||||
return pair[1];
|
|
||||||
}, '');
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the aliases associated with a given function name.
|
|
||||||
*
|
|
||||||
* @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 a given name.
|
|
||||||
*
|
|
||||||
* @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 (lodash.contains(dependencies, funcName)) {
|
|
||||||
result.push(otherName);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an array of dependencies for a given function name. If passed an array
|
|
||||||
* of dependencies it will return an array containing the given dependencies
|
|
||||||
* plus any additional detected sub-dependencies.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array|String} funcName A single function name or array of
|
|
||||||
* dependencies to query.
|
|
||||||
* @returns {Array} Returns an array of function dependencies.
|
|
||||||
*/
|
|
||||||
function getDependencies(funcName) {
|
|
||||||
var dependencies = Array.isArray(funcName) ? funcName : dependencyMap[funcName];
|
|
||||||
if (!dependencies) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
// recursively accumulate the dependencies of the `funcName` function, and
|
|
||||||
// the dependencies of its dependencies, and so on.
|
|
||||||
return lodash.uniq(dependencies.reduce(function(result, otherName) {
|
|
||||||
result.push.apply(result, getDependencies(otherName).concat(otherName));
|
|
||||||
return result;
|
|
||||||
}, []));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the formatted source of the given function.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Function} func The function to process.
|
|
||||||
* @returns {String} Returns the formatted source.
|
|
||||||
*/
|
|
||||||
function getFunctionSource(func) {
|
|
||||||
var source = func.source || (func + '');
|
|
||||||
|
|
||||||
// all leading whitespace
|
|
||||||
return source.replace(/\n(?:.*)/g, function(match, index) {
|
|
||||||
match = match.slice(1);
|
|
||||||
return (
|
|
||||||
match == '}' && source.indexOf('}', index + 2) == -1 ? '\n ' : '\n '
|
|
||||||
) + match;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the `_.isArguments` fallback snippet from `source`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to inspect.
|
|
||||||
* @returns {String} Returns the `isArguments` fallback snippet.
|
|
||||||
*/
|
|
||||||
function getIsArgumentsFallback(source) {
|
|
||||||
return (source.match(/(?:\s*\/\/.*)*\s*if *\(!(?:lodash\.)?isArguments[^)]+\)[\s\S]+?};\s*}/) || [''])[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the real name, not alias, of a given function name.
|
|
||||||
*
|
|
||||||
* @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 `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 `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 `createIterator` in `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');
|
|
||||||
if (snippet) {
|
|
||||||
// clip the snippet the `factory` assignment
|
|
||||||
snippet = snippet.match(/Function\([\s\S]+$/)[0];
|
|
||||||
var modified = snippet.replace(RegExp('\\b' + refName + '\\b,? *', 'g'), '');
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
}
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the `funcName` function declaration, expression, or assignment and
|
|
||||||
* associated code from `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 the `_.isArguments` fallback from `source`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the source with the `isArguments` fallback removed.
|
|
||||||
*/
|
|
||||||
function removeIsArgumentsFallback(source) {
|
|
||||||
return source.replace(getIsArgumentsFallback(source), '');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the `Object.keys` object iteration optimization from `source`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the modified source.
|
|
||||||
*/
|
|
||||||
function removeKeysOptimization(source) {
|
|
||||||
return removeVar(source, 'isKeysFast')
|
|
||||||
// remove `isKeysFast` from `beforeLoop.object` of `mapIteratorOptions`
|
|
||||||
.replace(/=\s*'\s*\+\s*\(isKeysFast.+/, "= []'")
|
|
||||||
// remove `isKeysFast` from `inLoop.object` of `mapIteratorOptions`, `invoke`, `pluck`, and `sortBy`
|
|
||||||
.replace(/'\s*\+\s*\(isKeysFast[^)]+?\)\s*\+\s*'/g, '.push')
|
|
||||||
// remove data object property assignment in `createIterator`
|
|
||||||
.replace(/\s*.+?\.isKeysFast *=.+/, '')
|
|
||||||
// remove optimized branch in `iteratorTemplate`
|
|
||||||
.replace(/(?: *\/\/.*\n)*\s*'( *)<% *if *\(isKeysFast[\s\S]+?'\1<% *} *else *\{ *%>.+\n([\s\S]+?) *'\1<% *} *%>.+/, '$2');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a given variable from `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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Searches `source` for a `varName` variable declaration and replaces its
|
|
||||||
* assigned value with `varValue`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The source to inspect.
|
|
||||||
* @param {String} varName The name of the variable to replace.
|
|
||||||
* @returns {String} Returns the source with the variable replaced.
|
|
||||||
*/
|
|
||||||
function replaceVar(source, varName, varValue) {
|
|
||||||
// replace a variable that's not part of a declaration list
|
|
||||||
source = source.replace(RegExp(
|
|
||||||
'(( +)var ' + varName + ' *= *)' +
|
|
||||||
'(?:.+?;|(?:Function\\(.+?|.*?[^,])\\n[\\s\\S]+?\\n\\2.+?;)\\n'
|
|
||||||
), '$1' + varValue + ';\n');
|
|
||||||
|
|
||||||
// replace a varaible at the start or middle of a declaration list
|
|
||||||
source = source.replace(RegExp('((?:var|\\n) +' + varName + ' *=).+?,'), '$1 ' + varValue + ',');
|
|
||||||
|
|
||||||
// replace a variable at the end of a variable declaration list
|
|
||||||
source = source.replace(RegExp('(,\\s*' + varName + ' *=).+?;'), '$1 ' + varValue + ';');
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// Backbone build
|
|
||||||
if (isBackbone) {
|
|
||||||
// add any additional sub-dependencies
|
|
||||||
backboneDependencies = getDependencies(backboneDependencies);
|
|
||||||
|
|
||||||
if (filterType == 'exclude') {
|
|
||||||
// remove excluded methods from `backboneDependencies`
|
|
||||||
includeMethods = lodash.without.apply(lodash, [backboneDependencies].concat(excludeMethods));
|
|
||||||
}
|
|
||||||
else if (filterType) {
|
|
||||||
// merge backbone dependencies into `includeMethods`
|
|
||||||
includeMethods = lodash.union(includeMethods, backboneDependencies);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// include only the Backbone dependencies
|
|
||||||
includeMethods = backboneDependencies;
|
|
||||||
}
|
|
||||||
filterType = 'include';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// add category methods
|
|
||||||
process.argv.some(function(value) {
|
|
||||||
var categories = value.match(/^category=(.*)$/);
|
|
||||||
if (!categories) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// resolve method names belonging to each category
|
|
||||||
var categoryMethods = categories.reduce(function(result, category) {
|
|
||||||
return result.concat(allMethods.filter(function(funcName) {
|
|
||||||
return RegExp('@category ' + category + '\\b', 'i').test(matchFunction(source, funcName));
|
|
||||||
}));
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
if (filterType == 'exclude') {
|
|
||||||
// remove excluded methods from `categoryMethods`
|
|
||||||
includeMethods = lodash.without.apply(lodash, [categoryMethods].concat(excludeMethods));
|
|
||||||
}
|
|
||||||
else if (filterType) {
|
|
||||||
// merge `categoryMethods` into `includeMethods`
|
|
||||||
includeMethods = lodash.union(includeMethods, categoryMethods);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// include only the `categoryMethods`
|
|
||||||
includeMethods = categoryMethods;
|
|
||||||
}
|
|
||||||
filterType = 'include';
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// custom build
|
|
||||||
(function() {
|
|
||||||
// exit early if "exclude" or "include" options aren't specified
|
|
||||||
if (!filterType) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (filterType == 'exclude') {
|
|
||||||
// remove methods that are named in `excludeMethods` and their dependants
|
|
||||||
excludeMethods.forEach(function(funcName) {
|
|
||||||
getDependants(funcName).concat(funcName).forEach(function(otherName) {
|
|
||||||
source = removeFunction(source, otherName);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// add dependencies to `includeMethods`
|
|
||||||
includeMethods = getDependencies(includeMethods);
|
|
||||||
|
|
||||||
// remove methods that aren't named in `includeMethods`
|
|
||||||
lodash.each(allMethods, function(otherName) {
|
|
||||||
if (!lodash.contains(includeMethods, otherName)) {
|
|
||||||
source = removeFunction(source, otherName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove `isArguments` fallback before `isArguments` is transformed by
|
|
||||||
// other parts of the build process
|
|
||||||
if (isRemoved(source, 'isArguments')) {
|
|
||||||
source = removeIsArgumentsFallback(source);
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// simplify template snippets
|
|
||||||
source = source.replace(
|
|
||||||
RegExp(
|
|
||||||
"'else if \\(thisArg\\) \\{\\\\n' \\+\\s*" +
|
|
||||||
"' callback = iteratorBind\\(callback, thisArg\\)\\\\n' \\+\\s*" +
|
|
||||||
"'}'"
|
|
||||||
, 'g'),
|
|
||||||
"'else if (thisArg) callback = iteratorBind(callback, thisArg)'"
|
|
||||||
);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// DRY out isType functions
|
|
||||||
(function() {
|
|
||||||
var iteratorName = lodash.find(['forEach', 'forOwn'], function(funcName) {
|
|
||||||
return !isRemoved(source, funcName);
|
|
||||||
});
|
|
||||||
|
|
||||||
// skip this optimization if there are no iteration methods to use
|
|
||||||
if (!iteratorName) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var snippet,
|
|
||||||
funcNames = [],
|
|
||||||
objectSnippets = [],
|
|
||||||
token = '__isTypeToken__';
|
|
||||||
|
|
||||||
// build replacement code
|
|
||||||
lodash.forOwn({
|
|
||||||
'Arguments': "'[object Arguments]'",
|
|
||||||
'Date': 'dateClass',
|
|
||||||
'Function': 'funcClass',
|
|
||||||
'Number': 'numberClass',
|
|
||||||
'RegExp': 'regexpClass',
|
|
||||||
'String': 'stringClass'
|
|
||||||
}, function(value, key) {
|
|
||||||
// skip `isArguments` if a legacy build
|
|
||||||
if (isLegacy && key == 'Arguments') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var funcName = 'is' + key,
|
|
||||||
funcCode = matchFunction(source, funcName);
|
|
||||||
|
|
||||||
if (funcCode) {
|
|
||||||
if (!snippet) {
|
|
||||||
// use snippet to mark the insert position
|
|
||||||
snippet = funcCode;
|
|
||||||
}
|
|
||||||
funcNames.push(funcName);
|
|
||||||
objectSnippets.push("'" + key + "': " + value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// skip this optimization if there are less than 2 isType functions
|
|
||||||
if (funcNames.length < 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// add a token to mark the position to insert new code
|
|
||||||
source = source.replace(snippet, '\n' + token + '\n' + snippet);
|
|
||||||
|
|
||||||
// remove existing isType functions
|
|
||||||
funcNames.forEach(function(funcName) {
|
|
||||||
source = removeFunction(source, funcName);
|
|
||||||
});
|
|
||||||
|
|
||||||
// replace token with new DRY code
|
|
||||||
source = source.replace(token,
|
|
||||||
' // add `_.' + funcNames.join('`, `_.') + '`\n' +
|
|
||||||
' ' + iteratorName + '({\n ' + objectSnippets.join(',\n ') + '\n }, function(className, key) {\n' +
|
|
||||||
" lodash['is' + key] = function(value) {\n" +
|
|
||||||
' return toString.call(value) == className;\n' +
|
|
||||||
' };\n' +
|
|
||||||
' });'
|
|
||||||
);
|
|
||||||
|
|
||||||
// tweak `isArguments` fallback
|
|
||||||
snippet = !isLegacy && getIsArgumentsFallback(source);
|
|
||||||
if (snippet) {
|
|
||||||
var modified = '\n' + snippet.replace(/isArguments/g, 'lodash.$&');
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
if (isLegacy) {
|
|
||||||
['isBindFast', 'nativeBind', 'nativeIsArray', 'nativeKeys'].forEach(function(varName) {
|
|
||||||
source = removeVar(source, varName);
|
|
||||||
});
|
|
||||||
|
|
||||||
['bind', 'isArray'].forEach(function(funcName) {
|
|
||||||
var snippet = matchFunction(source, funcName),
|
|
||||||
modified = snippet;
|
|
||||||
|
|
||||||
// remove native `Function#bind` branch in `_.bind`
|
|
||||||
if (funcName == 'bind' ) {
|
|
||||||
modified = modified.replace(/(?:\s*\/\/.*)*\s*else if *\(isBindFast[^}]+}/, '');
|
|
||||||
}
|
|
||||||
// remove native `Array.isArray` branch in `_.isArray`
|
|
||||||
else if (funcName == 'isArray') {
|
|
||||||
modified = modified.replace(/nativeIsArray * \|\|/, '');
|
|
||||||
}
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
});
|
|
||||||
|
|
||||||
// replace `_.keys` with `shimKeys`
|
|
||||||
if (!isRemoved(source, 'keys')) {
|
|
||||||
source = source.replace(
|
|
||||||
matchFunction(source, 'keys').replace(/[\s\S]+?var keys *=/, ''),
|
|
||||||
matchFunction(source, 'shimKeys').replace(/[\s\S]+?var shimKeys *=/, '')
|
|
||||||
);
|
|
||||||
|
|
||||||
source = removeFunction(source, 'shimKeys');
|
|
||||||
}
|
|
||||||
// replace `_.isArguments` with fallback
|
|
||||||
if (!isRemoved(source, 'isArguments')) {
|
|
||||||
source = source.replace(
|
|
||||||
matchFunction(source, 'isArguments').replace(/[\s\S]+?var isArguments *=/, ''),
|
|
||||||
getIsArgumentsFallback(source).match(/isArguments *=([\s\S]+?) *};/)[1] + ' };\n'
|
|
||||||
);
|
|
||||||
|
|
||||||
source = removeIsArgumentsFallback(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
source = removeVar(source, 'reNative');
|
|
||||||
source = removeFromCreateIterator(source, 'nativeKeys');
|
|
||||||
source = removeKeysOptimization(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMobile) {
|
|
||||||
// inline all 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, format, and inject the compiled function's source code
|
|
||||||
source = source.replace(reFunc, '$1' + getFunctionSource(lodash[funcName]) + ';\n');
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove JScript [[DontEnum]] fix from `_.isEqual`
|
|
||||||
source = source.replace(/(?:\s*\/\/.*)*\n( +)if *\(result *&& *hasDontEnumBug[\s\S]+?\n\1}/, '');
|
|
||||||
|
|
||||||
// remove IE `shift` and `splice` fix from mutator Array functions mixin
|
|
||||||
source = source.replace(/(?:\s*\/\/.*)*\n( +)if *\(value.length *=== *0[\s\S]+?\n\1}/, '');
|
|
||||||
|
|
||||||
// remove `noCharByIndex` from `_.reduceRight`
|
|
||||||
source = source.replace(/noCharByIndex *&&[^:]+: *([^;]+)/g, '$1');
|
|
||||||
|
|
||||||
// remove `noArraySliceOnStrings` from `_.toArray`
|
|
||||||
source = source.replace(/noArraySliceOnStrings *\?[^:]+: *([^)]+)/g, '$1');
|
|
||||||
|
|
||||||
source = removeVar(source, 'extendIteratorOptions');
|
|
||||||
source = removeVar(source, 'hasDontEnumBug');
|
|
||||||
source = removeVar(source, 'iteratorTemplate');
|
|
||||||
source = removeVar(source, 'noArraySliceOnStrings');
|
|
||||||
source = removeVar(source, 'noCharByIndex');
|
|
||||||
source = removeIsArgumentsFallback(source);
|
|
||||||
source = removeKeysOptimization(source);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// inline `iteratorTemplate` template
|
|
||||||
source = source.replace(/(( +)var iteratorTemplate *= *)[\s\S]+?\n\2.+?;\n/, (function() {
|
|
||||||
var snippet = getFunctionSource(lodash._iteratorTemplate);
|
|
||||||
|
|
||||||
// prepend data object references to property names to avoid having to
|
|
||||||
// use a with-statement
|
|
||||||
iteratorOptions.forEach(function(property) {
|
|
||||||
if (property == 'iteratee') {
|
|
||||||
// use a more fine-grained regexp for the `iteratee` property because
|
|
||||||
// it's a compiled variable as well as a data property
|
|
||||||
snippet = snippet.replace(/(__t *= *\( *)(iteratee)/, '$1obj.$2');
|
|
||||||
} else {
|
|
||||||
snippet = snippet.replace(RegExp('([^\\w.])\\b' + property + '\\b', 'g'), '$1obj.' + property);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove unnecessary code
|
|
||||||
snippet = snippet
|
|
||||||
.replace(/var __t.+/, "var __p = '';")
|
|
||||||
.replace(/function print[^}]+}/, '')
|
|
||||||
.replace(/'(?:\\n|\s)+'/g, "''")
|
|
||||||
.replace(/__p *\+= *' *';/g, '')
|
|
||||||
.replace(/(__p *\+= *)' *' *\+/g, '$1')
|
|
||||||
.replace(/(\{) *;|; *(\})/g, '$1$2')
|
|
||||||
.replace(/\(\(__t *= *\( *([^)]+) *\)\) *== *null *\? *'' *: *__t\)/g, '$1');
|
|
||||||
|
|
||||||
// remove the with-statement
|
|
||||||
snippet = snippet.replace(/ *with *\(.+?\) *{/, '\n').replace(/}([^}]*}[^}]*$)/, '$1');
|
|
||||||
|
|
||||||
// minor cleanup
|
|
||||||
snippet = snippet
|
|
||||||
.replace(/obj *\|\| *\(obj *= *\{}\);/, '')
|
|
||||||
.replace(/var __p = '';\s*__p \+=/, 'var __p =');
|
|
||||||
|
|
||||||
// remove comments, including sourceURLs
|
|
||||||
snippet = snippet.replace(/\s*\/\/.*(?:\n|$)/g, '');
|
|
||||||
|
|
||||||
return '$1' + snippet + ';\n';
|
|
||||||
}()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// remove associated functions, variables, and code snippets that the minifier may miss
|
|
||||||
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, 'sortBy')) {
|
|
||||||
source = removeFunction(source, 'compareAscending');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'template')) {
|
|
||||||
// remove `templateSettings` assignment
|
|
||||||
source = source.replace(/(?:\n +\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\/)?\n *lodash\.templateSettings[\s\S]+?};\n/, '');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'toArray')) {
|
|
||||||
source = removeVar(source, 'noArraySliceOnStrings');
|
|
||||||
}
|
|
||||||
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');
|
|
||||||
source = removeVar(source, 'isBindFast');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'isArray')) {
|
|
||||||
source = removeVar(source, 'nativeIsArray');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'keys')) {
|
|
||||||
source = removeFunction(source, 'shimKeys');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'clone', 'isObject', 'keys')) {
|
|
||||||
source = removeVar(source, 'objectTypes');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'bind', 'isArray', 'keys')) {
|
|
||||||
source = removeVar(source, 'reNative');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'isEmpty', 'isEqual', 'isString', 'size')) {
|
|
||||||
source = removeVar(source, 'stringClass');
|
|
||||||
}
|
|
||||||
if ((source.match(/\bcreateIterator\b/g) || []).length < 2) {
|
|
||||||
source = removeFunction(source, 'createIterator');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'createIterator', 'extend', 'isEqual')) {
|
|
||||||
source = removeVar(source, 'hasDontEnumBug');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'createIterator', 'keys')) {
|
|
||||||
source = removeVar(source, 'nativeKeys');
|
|
||||||
}
|
|
||||||
if (isRemoved(source, 'createIterator', 'reduceRight')) {
|
|
||||||
source = removeVar(source, 'noCharByIndex');
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove pseudo private properties
|
|
||||||
source = source.replace(/(?:(?:\s*\/\/.*)*\s*lodash\._[^=]+=.+\n)+/g, '\n');
|
|
||||||
|
|
||||||
// consolidate consecutive horizontal rule comment separators
|
|
||||||
source = source.replace(/(?:\s*\/\*-+\*\/\s*){2,}/g, function(separators) {
|
|
||||||
return separators.match(/^\s*/)[0] + separators.slice(separators.lastIndexOf('/*'));
|
|
||||||
});
|
|
||||||
|
|
||||||
// cleanup code
|
|
||||||
source = source.replace(/^ *;\n/gm, '');
|
|
||||||
|
|
||||||
// begin the minification process
|
|
||||||
if (filterType || isBackbone || isLegacy || isMobile) {
|
|
||||||
fs.writeFileSync(path.join(cwd, 'lodash.custom.js'), source);
|
|
||||||
minify(source, 'lodash.custom.min', function(result) {
|
|
||||||
fs.writeFileSync(path.join(cwd, 'lodash.custom.min.js'), result);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
minify(source, 'lodash.min', function(result) {
|
|
||||||
fs.writeFileSync(path.join(cwd, 'lodash.min.js'), result);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
347
build/minify.js
347
build/minify.js
@@ -1,347 +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 Lo-Dash `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)) {
|
|
||||||
// avoid errors when called as a npm executable
|
|
||||||
try {
|
|
||||||
fs.mkdirSync(distPath);
|
|
||||||
} catch(e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// avoid errors when called as a npm executable
|
|
||||||
try {
|
|
||||||
// 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);
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// 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 Lo-Dash source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node minify.js source.js`) and write to
|
|
||||||
// `<filename>.min.js`
|
|
||||||
(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, 'utf8');
|
|
||||||
});
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
@@ -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 Lo-Dash `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 Lo-Dash 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,372 +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',
|
|
||||||
'args',
|
|
||||||
'arrayClass',
|
|
||||||
'callback',
|
|
||||||
'className',
|
|
||||||
'collection',
|
|
||||||
'compareAscending',
|
|
||||||
'ctor',
|
|
||||||
'funcClass',
|
|
||||||
'hasOwnProperty',
|
|
||||||
'identity',
|
|
||||||
'index',
|
|
||||||
'isFunc',
|
|
||||||
'iteratee',
|
|
||||||
'iteratorBind',
|
|
||||||
'length',
|
|
||||||
'methodName',
|
|
||||||
'nativeKeys',
|
|
||||||
'noaccum',
|
|
||||||
'object',
|
|
||||||
'objectTypes',
|
|
||||||
'prop',
|
|
||||||
'propIndex',
|
|
||||||
'props',
|
|
||||||
'property',
|
|
||||||
'propertyIsEnumerable',
|
|
||||||
'result',
|
|
||||||
'skipProto',
|
|
||||||
'slice',
|
|
||||||
'source',
|
|
||||||
'sourceIndex',
|
|
||||||
'stringClass',
|
|
||||||
'target',
|
|
||||||
'thisArg',
|
|
||||||
'toString',
|
|
||||||
'value'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to minify `compileIterator` option properties */
|
|
||||||
var iteratorOptions = [
|
|
||||||
'args',
|
|
||||||
'array',
|
|
||||||
'arrayBranch',
|
|
||||||
'beforeLoop',
|
|
||||||
'bottom',
|
|
||||||
'exit',
|
|
||||||
'firstArg',
|
|
||||||
'hasDontEnumBug',
|
|
||||||
'inLoop',
|
|
||||||
'init',
|
|
||||||
'isKeysFast',
|
|
||||||
'iteratee',
|
|
||||||
'object',
|
|
||||||
'objectBranch',
|
|
||||||
'noCharByIndex',
|
|
||||||
'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',
|
|
||||||
'attachEvent',
|
|
||||||
'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',
|
|
||||||
'zipObject'
|
|
||||||
];
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pre-process a given Lo-Dash `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()` in `tokenizeEscape`
|
|
||||||
source = source.replace(/_\['escape']\("/, '_.escape("');
|
|
||||||
|
|
||||||
// remove brackets from `_.escape()` in `_.template`
|
|
||||||
source = source.replace(/__e *= *_\['escape']/, '__e=_.escape');
|
|
||||||
|
|
||||||
// remove brackets from `collection.indexOf` in `_.contains`
|
|
||||||
source = source.replace("collection['indexOf'](target)", 'collection.indexOf(target)');
|
|
||||||
|
|
||||||
// remove brackets from `result[length].value` in `_.sortBy`
|
|
||||||
source = source.replace("result[length]['value']", 'result[length].value');
|
|
||||||
|
|
||||||
// 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 whitespace from `_.template` related regexpes
|
|
||||||
source = source.replace(/(?:reDelimiterCode\w+|reEmptyString\w+|reInsertVariable) *=.+/g, function(match) {
|
|
||||||
return match.replace(/ |\\n/g, '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove newline from double-quoted strings in `_.template`
|
|
||||||
source = source
|
|
||||||
.replace('"\';\\n__with ("', '"\';__with("')
|
|
||||||
.replace('"\\n}__\\n__p += \'"', '"}____p+=\'"')
|
|
||||||
.replace('"__p = \'"', '"__p=\'"')
|
|
||||||
.replace('"\';\\n"', '"\';"')
|
|
||||||
.replace("') {\\n'", "'){'")
|
|
||||||
|
|
||||||
// remove `useSourceURL` variable
|
|
||||||
source = source.replace(/(?:\n +\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\/)?\n *try *\{(?:\s*\/\/.*\n)* *var useSourceURL[\s\S]+?catch[^}]+}\n/, '');
|
|
||||||
|
|
||||||
// remove debug sourceURL use in `_.template`
|
|
||||||
source = source.replace(/(?:\s*\/\/.*\n)* *if *\(useSourceURL[^}]+}/, '');
|
|
||||||
|
|
||||||
// minify internal properties used by `_.sortBy`
|
|
||||||
(function() {
|
|
||||||
var properties = ['criteria', 'value'],
|
|
||||||
snippets = source.match(/( +)(?:function compareAscending|var sortBy)\b[\s\S]+?\n\1}/g);
|
|
||||||
|
|
||||||
if (!snippets) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
snippets.forEach(function(snippet) {
|
|
||||||
var modified = snippet,
|
|
||||||
isSortBy = /var sortBy\b/.test(modified),
|
|
||||||
isInlined = !/\bcreateIterator\b/.test(modified);
|
|
||||||
|
|
||||||
// minify properties
|
|
||||||
properties.forEach(function(property, index) {
|
|
||||||
// add quotes around properties in the inlined `_.sortBy` of the mobile
|
|
||||||
// build so Closure Compiler won't mung them
|
|
||||||
if (isSortBy && isInlined) {
|
|
||||||
modified = modified
|
|
||||||
.replace(RegExp('\\.' + property + '\\b', 'g'), "['" + minNames[index] + "']")
|
|
||||||
.replace(RegExp('\\b' + property + ' *:', 'g'), "'" + minNames[index] + "':");
|
|
||||||
}
|
|
||||||
modified = modified.replace(RegExp('\\b' + property + '\\b', 'g'), minNames[index]);
|
|
||||||
});
|
|
||||||
// replace with modified snippet
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
});
|
|
||||||
}());
|
|
||||||
|
|
||||||
// minify all compilable snippets
|
|
||||||
var snippets = source.match(
|
|
||||||
RegExp([
|
|
||||||
// match the `iteratorTemplate`
|
|
||||||
'( +)var iteratorTemplate\\b[\\s\\S]+?\\n\\1}',
|
|
||||||
// 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\\2}',
|
|
||||||
// match the the `createIterator` function
|
|
||||||
'( +)function createIterator\\b[\\s\\S]+?\\n\\3}'
|
|
||||||
].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),
|
|
||||||
modified = snippet;
|
|
||||||
|
|
||||||
// add brackets to whitelisted properties so Closure Compiler won't mung them
|
|
||||||
modified = modified.replace(RegExp('\\.(' + iteratorOptions.join('|') + ')\\b', 'g'), "['$1']");
|
|
||||||
|
|
||||||
if (isCreateIterator) {
|
|
||||||
// replace with modified snippet early and clip snippet to the `factory`
|
|
||||||
// call so other arguments aren't minified
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
snippet = modified = modified.replace(/factory\([\s\S]+$/, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
// minify snippet variables / arguments
|
|
||||||
compiledVars.forEach(function(variable, index) {
|
|
||||||
// ensure properties in compiled strings aren't minified
|
|
||||||
modified = modified.replace(RegExp('([^.]\\b)' + variable + '\\b(?!\' *[\\]:])', 'g'), '$1' + minNames[index]);
|
|
||||||
|
|
||||||
// correct `typeof x == 'object'`
|
|
||||||
if (variable == 'object') {
|
|
||||||
modified = modified.replace(RegExp("(typeof [^']+')" + minNames[index] + "'", 'g'), "$1object'");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// minify `createIterator` option property names
|
|
||||||
iteratorOptions.forEach(function(property, index) {
|
|
||||||
if (isIteratorTemplate) {
|
|
||||||
// minify property names as interpolated template variables
|
|
||||||
modified = modified.replace(RegExp('\\b' + property + '\\b', 'g'), minNames[index]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (property == 'array' || property == 'object') {
|
|
||||||
// minify "array" and "object" sub property names
|
|
||||||
modified = modified.replace(RegExp("'" + property + "'( *[\\]:])", 'g'), "'" + minNames[index] + "'$1");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// minify property name strings
|
|
||||||
modified = modified.replace(RegExp("'" + property + "'", 'g'), "'" + minNames[index] + "'");
|
|
||||||
// minify property names in regexps and accessors
|
|
||||||
if (isCreateIterator) {
|
|
||||||
modified = modified.replace(RegExp('([\\.|/])' + property + '\\b' , 'g'), '$1' + minNames[index]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// replace with modified snippet
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
});
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `preprocess`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = preprocess;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// read the Lo-Dash 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');
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
3986
dist/lodash.core.js
vendored
Normal file
3986
dist/lodash.core.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
30
dist/lodash.core.min.js
vendored
Normal file
30
dist/lodash.core.min.js
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* lodash 4.11.0 (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,t){return n.push.apply(n,t),n}function t(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===pn?i===i:r(i,c)))var c=i,f=o}return f}function r(n,t,r){var e;return r(n,function(n,r,u){return t(n,r,u)?(e=n,false):void 0}),e}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 w(t,function(t){return n[t]})}function o(n){return n&&n.Object===Object?n:null}function i(n){return gn[n]}function c(n){var t=false;if(null!=n&&typeof n.toString!="function")try{
|
||||||
|
t=!!(n+"")}catch(r){}return t}function f(n,t){return n=typeof n=="number"||yn.test(n)?+n:-1,n>-1&&0==n%1&&(null==t?9007199254740991:t)>n}function a(n){return n instanceof l?n:new l(n)}function l(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function p(n,t,r,e){var u;return(u=n===pn)||(u=En[r],u=(n===u||n!==n&&u!==u)&&!kn.call(e,r)),u?t:n}function s(n){return Z(n)?Bn(n):{}}function h(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){
|
||||||
|
n.apply(pn,r)},t)}function v(n,t){var r=true;return Cn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function y(n,t){var r=[];return Cn(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function g(t,r,e,u,o){var i=-1,c=t.length;for(e||(e=C),o||(o=[]);++i<c;){var f=t[i];r>0&&e(f)?r>1?g(f,r-1,e,u,o):n(o,f):u||(o[o.length]=f)}return o}function b(n,t){return n&&Gn(n,t,on)}function _(n,t){return y(t,function(t){return X(n[t])})}function j(n,t,r,e,u){return n===t?true:null==n||null==t||!Z(n)&&!nn(t)?n!==n&&t!==t:d(n,t,j,r,e,u);
|
||||||
|
}function d(n,t,r,e,u,o){var i=Vn(n),f=Vn(t),a="[object Array]",l="[object Array]";i||(a=Sn.call(n),a="[object Arguments]"==a?"[object Object]":a),f||(l=Sn.call(t),l="[object Arguments]"==l?"[object Object]":l);var p="[object Object]"==a&&!c(n),f="[object Object]"==l&&!c(t),l=a==l;o||(o=[]);var s=M(o,function(t){return t[0]===n});return s&&s[1]?s[1]==t:(o.push([n,t]),l&&!p?(r=i||isTypedArray(n)?I(n,t,r,e,u,o):$(n,t,a),o.pop(),r):2&u||(i=p&&kn.call(n,"__wrapped__"),a=f&&kn.call(t,"__wrapped__"),!i&&!a)?l?(r=q(n,t,r,e,u,o),
|
||||||
|
o.pop(),r):false:(i=i?n.value():n,t=a?t.value():t,r=r(i,t,e,u,o),o.pop(),r))}function m(n){return typeof n=="function"?n:null==n?an:(typeof n=="object"?x:E)(n)}function O(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function w(n,t){var r=-1,e=W(n)?Array(n.length):[];return Cn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function x(n){var t=on(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&&j(n[u],r[u],pn,3)))return false}return true}}function A(n,t){
|
||||||
|
return n=Object(n),U(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function E(n){return function(t){return null==t?pn:t[n]}}function k(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 N(n){return k(n,0,n.length)}function S(n,t){var r;return Cn(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function T(t,r){return U(r,function(t,r){return r.func.apply(r.thisArg,n([t],r.args))},t)}function F(n,t,r,e){r||(r={});
|
||||||
|
for(var u=-1,o=t.length;++u<o;){var i=t[u],c=e?e(r[i],n[i],i,r,n):n[i],f=r,a=f[i];kn.call(f,i)&&(a===c||a!==a&&c!==c)&&(c!==pn||i in f)||(f[i]=c)}return r}function R(n){return H(function(t,r){var e=-1,u=r.length,o=u>1?r[u-1]:pn,o=typeof o=="function"?(u--,o):pn;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function B(n){return function(){var t=arguments,r=s(n.prototype),t=n.apply(r,t);return Z(t)?t:r}}function D(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==xn&&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=B(n);return e}function I(n,t,r,e,u,o){var i=-1,c=1&u,f=n.length,a=t.length;if(f!=a&&!(2&u&&a>f))return false;for(a=true;++i<f;){var l=n[i],p=t[i];if(void 0!==pn){a=false;break}if(c){if(!S(t,function(n){return l===n||r(l,n,e,u,o)})){a=false;break}}else if(l!==p&&!r(l,p,e,u,o)){a=false;break}}return a}function $(n,t,r){switch(r){case"[object Boolean]":case"[object Date]":return+n==+t;case"[object Error]":
|
||||||
|
return n.name==t.name&&n.message==t.message;case"[object Number]":return n!=+n?t!=+t:n==+t;case"[object RegExp]":case"[object String]":return n==t+""}return false}function q(n,t,r,e,u,o){var i=2&u,c=on(n),f=c.length,a=on(t).length;if(f!=a&&!i)return false;for(var l=f;l--;){var p=c[l];if(!(i?p in t:kn.call(t,p)))return false}for(a=true;++l<f;){var p=c[l],s=n[p],h=t[p];if(void 0!==pn||s!==h&&!r(s,h,e,u,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 z(n){var t=n?n.length:pn;if(Y(t)&&(Vn(n)||rn(n)||Q(n))){n=String;for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);t=e}else t=null;return t}function C(n){return nn(n)&&W(n)&&(Vn(n)||Q(n))}function G(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||En)}function J(n){return n&&n.length?n[0]:pn}function M(n,t){return r(n,m(t),Cn)}function P(n,t){return Cn(n,m(t))}function U(n,t,r){return e(n,m(t),r,3>arguments.length,Cn)}function V(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");
|
||||||
|
return n=Hn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=pn),r}}function H(n){var t;if(typeof n!="function")throw new TypeError("Expected a function");return t=qn(t===pn?n.length-1:Hn(t),0),function(){for(var r=arguments,e=-1,u=qn(r.length-t,0),o=Array(u);++e<u;)o[e]=r[t+e];for(u=Array(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=o,n.apply(this,u)}}function K(){if(!arguments.length)return[];var n=arguments[0];return Vn(n)?n:[n]}function L(n,t){return n>t}function Q(n){return nn(n)&&W(n)&&kn.call(n,"callee")&&(!Dn.call(n,"callee")||"[object Arguments]"==Sn.call(n));
|
||||||
|
}function W(n){return null!=n&&Y(Jn(n))&&!X(n)}function X(n){return n=Z(n)?Sn.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function Y(n){return typeof n=="number"&&n>-1&&0==n%1&&9007199254740991>=n}function Z(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function nn(n){return!!n&&typeof n=="object"}function tn(n){return typeof n=="number"||nn(n)&&"[object Number]"==Sn.call(n)}function rn(n){return typeof n=="string"||!Vn(n)&&nn(n)&&"[object String]"==Sn.call(n)}function en(n,t){
|
||||||
|
return t>n}function un(n){return typeof n=="string"?n:null==n?"":n+""}function on(n){var t=G(n);if(!t&&!W(n))return $n(Object(n));var r,e=z(n),u=!!e,e=e||[],o=e.length;for(r in n)!kn.call(n,r)||u&&("length"==r||f(r,o))||t&&"constructor"==r||e.push(r);return e}function cn(n){for(var t=-1,r=G(n),e=O(n),u=e.length,o=z(n),i=!!o,o=o||[],c=o.length;++t<u;){var a=e[t];i&&("length"==a||f(a,c))||"constructor"==a&&(r||!kn.call(n,a))||o.push(a)}return o}function fn(n){return n?u(n,on(n)):[]}function an(n){return n;
|
||||||
|
}function ln(t,r,e){var u=on(r),o=_(r,u);null!=e||Z(r)&&(o.length||!u.length)||(e=r,r=t,t=this,o=_(r,on(r)));var i=Z(e)&&"chain"in e?e.chain:true,c=X(t);return Cn(o,function(e){var u=r[e];t[e]=u,c&&(t.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=t(this.__wrapped__);return(e.__actions__=N(this.__actions__)).push({func:u,args:arguments,thisArg:t}),e.__chain__=r,e}return u.apply(t,n([this.value()],arguments))})}),t}var pn,sn=1/0,hn=/[&<>"'`]/g,vn=RegExp(hn.source),yn=/^(?:0|[1-9]\d*)$/,gn={
|
||||||
|
"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},bn={"function":true,object:true},_n=bn[typeof exports]&&exports&&!exports.nodeType?exports:pn,jn=bn[typeof module]&&module&&!module.nodeType?module:pn,dn=jn&&jn.exports===_n?_n:pn,mn=o(bn[typeof self]&&self),On=o(bn[typeof window]&&window),wn=o(bn[typeof this]&&this),xn=o(_n&&jn&&typeof global=="object"&&global)||On!==(wn&&wn.window)&&On||mn||wn||Function("return this")(),An=Array.prototype,En=Object.prototype,kn=En.hasOwnProperty,Nn=0,Sn=En.toString,Tn=xn._,Fn=xn.Reflect,Rn=Fn?Fn.f:pn,Bn=Object.create,Dn=En.propertyIsEnumerable,In=xn.isFinite,$n=Object.keys,qn=Math.max,zn=!Dn.call({
|
||||||
|
valueOf:1},"valueOf");l.prototype=s(a.prototype),l.prototype.constructor=l;var Cn=function(n,t){return function(r,e){if(null==r)return r;if(!W(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}}(b),Gn=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}}();Rn&&!Dn.call({valueOf:1},"valueOf")&&(O=function(n){n=Rn(n);for(var t,r=[];!(t=n.next()).done;)r.push(t.value);
|
||||||
|
return r});var Jn=E("length"),Mn=H(function(n,t,r){return D(n,t,r)}),Pn=H(function(n,t){return h(n,1,t)}),Un=H(function(n,t,r){return h(n,Kn(t)||0,r)}),Vn=Array.isArray,Hn=Number,Kn=Number,Ln=R(function(n,t){F(t,on(t),n)}),Qn=R(function(n,t){F(t,cn(t),n)}),Wn=R(function(n,t,r,e){F(t,cn(t),n,e)}),Xn=H(function(n){return n.push(pn,p),Wn.apply(pn,n)}),Yn=H(function(n,t){return null==n?{}:A(n,g(t,1))}),Zn=m;a.assignIn=Qn,a.before=V,a.bind=Mn,a.chain=function(n){return n=a(n),n.__chain__=true,n},a.compact=function(n){
|
||||||
|
return y(n,Boolean)},a.concat=function(){var t=arguments.length,r=K(arguments[0]);if(2>t)return t?N(r):[];for(var e=Array(t-1);t--;)e[t-1]=arguments[t];return g(e,1),n(N(r),fn)},a.create=function(n,t){var r=s(n);return t?Ln(r,t):r},a.defaults=Xn,a.defer=Pn,a.delay=Un,a.filter=function(n,t){return y(n,m(t))},a.flatten=function(n){return n&&n.length?g(n,1):[]},a.flattenDeep=function(n){return n&&n.length?g(n,sn):[]},a.iteratee=Zn,a.keys=on,a.map=function(n,t){return w(n,m(t))},a.matches=function(n){
|
||||||
|
return x(Ln({},n))},a.mixin=ln,a.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},a.once=function(n){return V(2,n)},a.pick=Yn,a.slice=function(n,t,r){var e=n?n.length:0;return r=r===pn?e:+r,e?k(n,null==t?0:+t,r):[]},a.sortBy=function(n,t){var r=0;return t=m(t),w(w(n,function(n,e,u){return{c:n,b:r++,a:t(n,e,u)}}).sort(function(n,t){var r;n:{r=n.a;var e=t.a;if(r!==e){var u=null===r,o=r===pn,i=r===r,c=null===e,f=e===pn,a=e===e;
|
||||||
|
if(r>e&&!c||!i||u&&!f&&a||o&&a){r=1;break n}if(e>r&&!u||!a||c&&!o&&i||f&&i){r=-1;break n}}r=0}return r||n.b-t.b}),E("c"))},a.tap=function(n,t){return t(n),n},a.thru=function(n,t){return t(n)},a.toArray=function(n){return W(n)?n.length?N(n):[]:fn(n)},a.values=fn,a.extend=Qn,ln(a,a),a.clone=function(n){return Z(n)?Vn(n)?N(n):F(n,on(n)):n},a.escape=function(n){return(n=un(n))&&vn.test(n)?n.replace(hn,i):n},a.every=function(n,t,r){return t=r?pn:t,v(n,m(t))},a.find=M,a.forEach=P,a.has=function(n,t){return null!=n&&kn.call(n,t);
|
||||||
|
},a.head=J,a.identity=an,a.indexOf=function(n,t,r){var e=n?n.length:0;r=typeof r=="number"?0>r?qn(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},a.isArguments=Q,a.isArray=Vn,a.isBoolean=function(n){return true===n||false===n||nn(n)&&"[object Boolean]"==Sn.call(n)},a.isDate=function(n){return nn(n)&&"[object Date]"==Sn.call(n)},a.isEmpty=function(n){if(W(n)&&(Vn(n)||rn(n)||X(n.splice)||Q(n)))return!n.length;for(var t in n)if(kn.call(n,t))return false;return!(zn&&on(n).length);
|
||||||
|
},a.isEqual=function(n,t){return j(n,t)},a.isFinite=function(n){return typeof n=="number"&&In(n)},a.isFunction=X,a.isNaN=function(n){return tn(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=tn,a.isObject=Z,a.isRegExp=function(n){return Z(n)&&"[object RegExp]"==Sn.call(n)},a.isString=rn,a.isUndefined=function(n){return n===pn},a.last=function(n){var t=n?n.length:0;return t?n[t-1]:pn},a.max=function(n){return n&&n.length?t(n,an,L):pn},a.min=function(n){return n&&n.length?t(n,an,en):pn},
|
||||||
|
a.noConflict=function(){return xn._===this&&(xn._=Tn),this},a.noop=function(){},a.reduce=U,a.result=function(n,t,r){return t=null==n?pn:n[t],t===pn&&(t=r),X(t)?t.call(n):t},a.size=function(n){return null==n?0:(n=W(n)?n:on(n),n.length)},a.some=function(n,t,r){return t=r?pn:t,S(n,m(t))},a.uniqueId=function(n){var t=++Nn;return un(n)+t},a.each=P,a.first=J,ln(a,function(){var n={};return b(a,function(t,r){kn.call(a.prototype,r)||(n[r]=t)}),n}(),{chain:false}),a.VERSION="4.11.0",Cn("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);a.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Vn(u)?u:[],n)}return this[r](function(r){return t.apply(Vn(r)?r:[],n)})}}),a.prototype.toJSON=a.prototype.valueOf=a.prototype.value=function(){return T(this.__wrapped__,this.__actions__)},(On||mn||{})._=a,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){
|
||||||
|
return a}):_n&&jn?(dn&&((jn.exports=a)._=a),_n._=a):xn._=a}).call(this);
|
||||||
862
dist/lodash.fp.js
vendored
Normal file
862
dist/lodash.fp.js
vendored
Normal file
@@ -0,0 +1,862 @@
|
|||||||
|
(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["fp"] = factory();
|
||||||
|
else
|
||||||
|
root["fp"] = 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, __webpack_require__) {
|
||||||
|
|
||||||
|
var baseConvert = __webpack_require__(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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') {
|
||||||
|
_ = browserConvert(_.runInContext());
|
||||||
|
}
|
||||||
|
module.exports = browserConvert;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ },
|
||||||
|
/* 1 */
|
||||||
|
/***/ function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
var mapping = __webpack_require__(2),
|
||||||
|
mutateMap = mapping.mutate,
|
||||||
|
fallbackHolder = __webpack_require__(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 immutWrap(func, cloner) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
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,
|
||||||
|
'spread': util.spread,
|
||||||
|
'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,
|
||||||
|
spread = helpers.spread,
|
||||||
|
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 methods = [],
|
||||||
|
methodNames = [];
|
||||||
|
|
||||||
|
each(keys(source), function(key) {
|
||||||
|
var value = source[key];
|
||||||
|
if (isFunction(value)) {
|
||||||
|
methodNames.push(key);
|
||||||
|
methods.push(func.prototype[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mixin(func, Object(source));
|
||||||
|
|
||||||
|
each(methodNames, function(methodName, index) {
|
||||||
|
var method = methods[index];
|
||||||
|
if (isFunction(method)) {
|
||||||
|
func.prototype[methodName] = method;
|
||||||
|
} else {
|
||||||
|
delete func.prototype[methodName];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'runInContext': function(runInContext) {
|
||||||
|
return function(context) {
|
||||||
|
return baseConvert(util, runInContext(context), options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,
|
||||||
|
result = clone(Object(object)),
|
||||||
|
nested = result;
|
||||||
|
|
||||||
|
while (nested != null && ++index < length) {
|
||||||
|
var key = path[index],
|
||||||
|
value = nested[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
nested[key] = clone(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 oldOptions = options;
|
||||||
|
return function(options) {
|
||||||
|
var newUtil = isLib ? pristine : helpers,
|
||||||
|
newFunc = isLib ? pristine[name] : func,
|
||||||
|
newOptions = assign(assign({}, oldOptions), options);
|
||||||
|
|
||||||
|
return baseConvert(newUtil, name, 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 passed
|
||||||
|
* thru `transform`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {...Function} transform The functions to transform the first argument.
|
||||||
|
* @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) {
|
||||||
|
name = mapping.aliasToReal[name] || name;
|
||||||
|
|
||||||
|
var result,
|
||||||
|
wrapped = func,
|
||||||
|
wrapper = wrappers[name];
|
||||||
|
|
||||||
|
if (wrapper) {
|
||||||
|
wrapped = wrapper(func);
|
||||||
|
}
|
||||||
|
else if (config.immutable) {
|
||||||
|
if (mutateMap.array[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneArray);
|
||||||
|
}
|
||||||
|
else if (mutateMap.object[name]) {
|
||||||
|
wrapped = immutWrap(func, createCloner(func));
|
||||||
|
}
|
||||||
|
else if (mutateMap.set[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneByPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
|
if (name == otherName) {
|
||||||
|
var aryN = !isLib && mapping.iterateeAry[name],
|
||||||
|
reargIndexes = mapping.iterateeRearg[name],
|
||||||
|
spreadStart = mapping.methodSpread[name];
|
||||||
|
|
||||||
|
result = wrapped;
|
||||||
|
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
||||||
|
result = spreadStart === undefined
|
||||||
|
? ary(result, aryKey)
|
||||||
|
: spread(result, spreadStart);
|
||||||
|
}
|
||||||
|
if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
|
||||||
|
result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
|
||||||
|
}
|
||||||
|
if (config.cap) {
|
||||||
|
if (reargIndexes) {
|
||||||
|
result = iterateeRearg(result, reargIndexes);
|
||||||
|
} else if (aryN) {
|
||||||
|
result = iterateeAry(result, aryN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (forceCurry || (config.curry && aryKey > 1)) {
|
||||||
|
forceCurry && console.log(forceCurry, name);
|
||||||
|
result = curry(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(name, func);
|
||||||
|
if (mapping.placeholder[name]) {
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ },
|
||||||
|
/* 2 */
|
||||||
|
/***/ 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',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
|
||||||
|
// Ramda aliases.
|
||||||
|
'__': 'placeholder',
|
||||||
|
'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',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'identical': 'eq',
|
||||||
|
'init': 'initial',
|
||||||
|
'invertObj': 'invert',
|
||||||
|
'juxt': 'over',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'prop': 'get',
|
||||||
|
'propEq': 'matchesProperty',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'whereEq': 'filter',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
||||||
|
'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
|
||||||
|
'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
|
||||||
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
|
'uniqueId', 'words'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
|
||||||
|
'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
||||||
|
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
||||||
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
|
||||||
|
'eq', 'every', 'filter', 'find', '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', 'minBy', 'multiply', 'nth',
|
||||||
|
'omit', 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
|
||||||
|
'partial', 'partialRight', 'partition', 'pick', 'pickBy', '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',
|
||||||
|
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'invokeArgs',
|
||||||
|
'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', 'mergeWith',
|
||||||
|
'orderBy', 'padChars', 'padCharsEnd', 'padCharsStart', 'pullAllBy',
|
||||||
|
'pullAllWith', '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,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastIndex': 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 = {
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'isEqualWith': [1, 2, 0],
|
||||||
|
'isMatchWith': [2, 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],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'invokeArgs': 2,
|
||||||
|
'invokeArgsMap': 2,
|
||||||
|
'partial': 1,
|
||||||
|
'partialRight': 1,
|
||||||
|
'without': 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 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,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'merge': 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 = {
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'getOr': 'get',
|
||||||
|
'invokeArgs': 'invoke',
|
||||||
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'padChars': 'pad',
|
||||||
|
'padCharsEnd': 'padEnd',
|
||||||
|
'padCharsStart': 'padStart',
|
||||||
|
'restFrom': 'rest',
|
||||||
|
'spreadFrom': 'spread',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip fixing their arity. */
|
||||||
|
exports.skipFixed = {
|
||||||
|
'castArray': true,
|
||||||
|
'flow': true,
|
||||||
|
'flowRight': true,
|
||||||
|
'iteratee': true,
|
||||||
|
'mixin': 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,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'without': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ },
|
||||||
|
/* 3 */
|
||||||
|
/***/ function(module, exports) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default argument placeholder value for methods.
|
||||||
|
*
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
module.exports = {};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }
|
||||||
|
/******/ ])
|
||||||
|
});
|
||||||
|
;
|
||||||
16
dist/lodash.fp.min.js
vendored
Normal file
16
dist/lodash.fp.min.js
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
!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 _&&(_=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(){var r=arguments.length;if(!r)return i;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 f(t,e){e=F(e);for(var r=-1,n=e.length,i=M(Object(t)),a=i;null!=a&&++r<n;){var o=e[r],s=a[o];null!=s&&(a[o]=M(Object(s))),a=a[o]}return i}function h(t){return N.runInContext.convert(t)(void 0)}function y(t,e){var r=d;return function(n){var i=R?B:j,a=R?B[t]:e,o=w(w({},r),n);return u(i,t,a,o)}}function g(t,e){return v(t,function(t){return"function"==typeof t?i(t,e):t})}function m(t,e){return v(t,function(t){var r=e.length;return n(L(i(t,r),e),r)})}function v(t,e){return function(){
|
||||||
|
var r=arguments.length;if(!r)return t();for(var n=Array(r);r--;)n[r]=arguments[r];var i=I.rearg?0:r-1;return n[i]=e(n[i]),t.apply(void 0,n)}}function x(t,e){t=p.aliasToReal[t]||t;var r,n=e,i=_[t];return i?n=i(e):I.immutable&&(l.array[t]?n=s(e,a):l.object[t]?n=s(e,o(e)):l.set[t]&&(n=s(e,f))),P(T,function(e){return P(p.aryMethod[e],function(i){if(t==i){var a=!R&&p.iterateeAry[t],o=p.iterateeRearg[t],s=p.methodSpread[t];return r=n,!I.fixed||!k&&p.skipFixed[t]||(r=void 0===s?C(r,e):D(r,s)),I.rearg&&e>1&&(E||!p.skipRearg[t])&&(r=L(r,p.methodRearg[t]||p.aryRearg[e])),
|
||||||
|
I.cap&&(o?r=m(r,o):a&&(r=g(r,a))),(b||I.curry&&e>1)&&(b&&console.log(b,t),r=q(r,e)),!1}}),!r}),r||(r=n),r==e&&(r=b?q(r,1):function(){return e.apply(this,arguments)}),r.convert=y(t,e),p.placeholder[t]&&(W=!0,r.placeholder=e.placeholder=O),r}var W,R="function"==typeof e,A=e===Object(e);if(A&&(d=r,r=e,e=void 0),null==r)throw new TypeError;d||(d={});var I={cap:"cap"in d?d.cap:!0,curry:"curry"in d?d.curry:!0,fixed:"fixed"in d?d.fixed:!0,immutable:"immutable"in d?d.immutable:!0,rearg:"rearg"in d?d.rearg:!0
|
||||||
|
},b="curry"in d&&d.curry,k="fixed"in d&&d.fixed,E="rearg"in d&&d.rearg,O=R?r:c,B=R?r.runInContext():void 0,j=R?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,spread:t.spread,toPath:t.toPath},C=j.ary,w=j.assign,M=j.clone,q=j.curry,P=j.forEach,S=j.isArray,z=j.isFunction,K=j.keys,L=j.rearg,D=j.spread,F=j.toPath,T=K(p.aryMethod),_={castArray:function(t){return function(){var e=arguments[0];
|
||||||
|
return S(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 I.cap&&"number"==typeof r?(r=r>2?r-2:1,a&&r>=a?n:i(n,r)):n}},mixin:function(t){return function(e){var r=this;if(!z(r))return t(r,Object(e));var n=[],i=[];return P(K(e),function(t){var a=e[t];z(a)&&(i.push(t),n.push(r.prototype[t]))}),t(r,Object(e)),P(i,function(t,e){var i=n[e];z(i)?r.prototype[t]=i:delete r.prototype[t]}),r}},runInContext:function(e){
|
||||||
|
return function(r){return u(t,e(r),d)}}};if(!A)return x(e,r);var N=r,V=[];return P(T,function(t){P(p.aryMethod[t],function(t){var e=N[p.remap[t]||t];e&&V.push([t,x(t,e)])})}),P(K(N),function(t){var e=N[t];if("function"==typeof e){for(var r=V.length;r--;)if(V[r][0]==t)return;e.convert=y(t,e),V.push([t,e])}}),P(V,function(t){N[t[0]]=t[1]}),N.convert=h,W&&(N.placeholder=O),P(K(N),function(t){P(p.realToAlias[t]||[],function(e){N[e]=N[t]})}),N}var p=r(2),l=p.mutate,c=r(3);t.exports=u},function(t,e){e.aliasToReal={
|
||||||
|
each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendWith:"assignInWith",first:"head",__:"placeholder",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",equals:"isEqual",identical:"eq",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",
|
||||||
|
pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",unapply:"rest",unnest:"flatten",useWith:"overArgs",whereEq:"filter",zipObj:"zipObject"},e.aryMethod={1:["attempt","castArray","ceil","create","curry","curryRight","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","methodOf","mixin","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words"],
|
||||||
|
2:["add","after","ary","assign","assignIn","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","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","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","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","getOr","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","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,findIndex:1,findKey:1,findLast:1,findLastIndex: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={assignInWith:[1,2,0],assignWith:[1,2,0],getOr:[2,1,0],isEqualWith:[1,2,0],
|
||||||
|
isMatchWith:[2,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],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],updateWith:[3,1,2,0],zipWith:[1,2,0]},e.methodSpread={invokeArgs:2,invokeArgsMap:2,partial:1,partialRight:1,without:1},e.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignIn:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsDeep:!0,
|
||||||
|
merge:!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={curryN:"curry",curryRightN:"curryRight",getOr:"get",invokeArgs:"invoke",invokeArgsMap:"invokeMap",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",restFrom:"rest",
|
||||||
|
spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart"},e.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!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,random:!0,range:!0,rangeRight:!0,subtract:!0,without:!0,zip:!0,zipObject:!0}},function(t,e){t.exports={}}])});
|
||||||
16023
dist/lodash.js
vendored
Normal file
16023
dist/lodash.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
125
dist/lodash.min.js
vendored
Normal file
125
dist/lodash.min.js
vendored
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* lodash 4.11.0 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
||||||
|
* Build: `lodash -o ./dist/lodash.js`
|
||||||
|
*/
|
||||||
|
;(function(){function t(t,n){return t.set(n[0],n[1]),t}function n(t,n){return t.add(n),t}function r(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}function e(t,n,r,e){for(var u=-1,o=t.length;++u<o;){var i=t[u];n(e,i,r(i),t)}return e}function u(t,n){for(var r=-1,e=t.length;++r<e&&false!==n(t[r],r,t););return t}function o(t,n){for(var r=-1,e=t.length;++r<e;)if(!n(t[r],r,t))return false;
|
||||||
|
return true}function i(t,n){for(var r=-1,e=t.length,u=0,o=[];++r<e;){var i=t[r];n(i,r,t)&&(o[u++]=i)}return o}function f(t,n){return!!t.length&&-1<d(t,n,0)}function c(t,n,r){for(var e=-1,u=t.length;++e<u;)if(r(n,t[e]))return true;return false}function a(t,n){for(var r=-1,e=t.length,u=Array(e);++r<e;)u[r]=n(t[r],r,t);return u}function l(t,n){for(var r=-1,e=n.length,u=t.length;++r<e;)t[u+r]=n[r];return t}function s(t,n,r,e){var u=-1,o=t.length;for(e&&o&&(r=t[++u]);++u<o;)r=n(r,t[u],u,t);return r}function h(t,n,r,e){
|
||||||
|
var u=t.length;for(e&&u&&(r=t[--u]);u--;)r=n(r,t[u],u,t);return r}function p(t,n){for(var r=-1,e=t.length;++r<e;)if(n(t[r],r,t))return true;return false}function _(t,n,r){for(var e=-1,u=t.length;++e<u;){var o=t[e],i=n(o);if(null!=i&&(f===q?i===i:r(i,f)))var f=i,c=o}return c}function v(t,n,r,e){var u;return r(t,function(t,r,o){return n(t,r,o)?(u=e?r:t,false):void 0}),u}function g(t,n,r){for(var e=t.length,u=r?e:-1;r?u--:++u<e;)if(n(t[u],u,t))return u;return-1}function d(t,n,r){if(n!==n)return M(t,r);--r;for(var e=t.length;++r<e;)if(t[r]===n)return r;
|
||||||
|
return-1}function y(t,n,r,e){--r;for(var u=t.length;++r<u;)if(e(t[r],n))return r;return-1}function b(t,n){var r=t?t.length:0;return r?m(t,n)/r:K}function x(t,n,r,e,u){return u(t,function(t,u,o){r=e?(e=false,t):n(r,t,u,o)}),r}function j(t,n){var r=t.length;for(t.sort(n);r--;)t[r]=t[r].c;return t}function m(t,n){for(var r,e=-1,u=t.length;++e<u;){var o=n(t[e]);o!==q&&(r=r===q?o:r+o)}return r}function w(t,n){for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);return e}function A(t,n){return a(n,function(n){return[n,t[n]];
|
||||||
|
})}function O(t){return function(n){return t(n)}}function k(t,n){return a(n,function(n){return t[n]})}function E(t,n){for(var r=-1,e=t.length;++r<e&&-1<d(n,t[r],0););return r}function I(t,n){for(var r=t.length;r--&&-1<d(n,t[r],0););return r}function S(t){return t&&t.Object===Object?t:null}function R(t,n){if(t!==n){var r=null===t,e=t===q,u=t===t,o=null===n,i=n===q,f=n===n;if(t>n&&!o||!u||r&&!i&&f||e&&f)return 1;if(n>t&&!r||!f||o&&!e&&u||i&&u)return-1}return 0}function W(t){return function(n,r){var e;
|
||||||
|
return n===q&&r===q?0:(n!==q&&(e=n),r!==q&&(e=e===q?r:t(e,r)),e)}}function B(t){return Ut[t]}function L(t){return Dt[t]}function C(t){return"\\"+Nt[t]}function M(t,n,r){var e=t.length;for(n+=r?0:-1;r?n--:++n<e;){var u=t[n];if(u!==u)return n}return-1}function z(t){var n=false;if(null!=t&&typeof t.toString!="function")try{n=!!(t+"")}catch(r){}return n}function U(t,n){return t=typeof t=="number"||jt.test(t)?+t:-1,t>-1&&0==t%1&&(null==n?9007199254740991:n)>t}function D(t){for(var n,r=[];!(n=t.next()).done;)r.push(n.value);
|
||||||
|
return r}function $(t){var n=-1,r=Array(t.size);return t.forEach(function(t,e){r[++n]=[e,t]}),r}function F(t,n){for(var r=-1,e=t.length,u=0,o=[];++r<e;){var i=t[r];i!==n&&"__lodash_placeholder__"!==i||(t[r]="__lodash_placeholder__",o[u++]=r)}return o}function N(t){var n=-1,r=Array(t.size);return t.forEach(function(t){r[++n]=t}),r}function P(t){if(!t||!Bt.test(t))return t.length;for(var n=Rt.lastIndex=0;Rt.test(t);)n++;return n}function Z(t){return $t[t]}function T(S){function jt(t){if(Le(t)&&!oi(t)&&!(t instanceof Et)){
|
||||||
|
if(t instanceof kt)return t;if(xu.call(t,"__wrapped__"))return Xr(t)}return new kt(t)}function Ot(){}function kt(t,n){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!n,this.__index__=0,this.__values__=q}function Et(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ut(){}function Dt(t){var n=-1,r=t?t.length:0;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function $t(t){var n=-1,r=t?t.length:0;
|
||||||
|
for(this.__data__=new Dt;++n<r;)this.push(t[n])}function Ft(t,n){var r=t.__data__;return qr(n)?(r=r.__data__,"__lodash_hash_undefined__"===(typeof n=="string"?r.string:r.hash)[n]):r.has(n)}function Nt(t){var n=-1,r=t?t.length:0;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function Tt(t,n){var r=Kt(t,n);return 0>r?false:(r==t.length-1?t.pop():Uu.call(t,r,1),true)}function qt(t,n){var r=Kt(t,n);return 0>r?q:t[r][1]}function Kt(t,n){for(var r=t.length;r--;)if(we(t[r][0],n))return r;return-1}function Gt(t,n,r){
|
||||||
|
var e=Kt(t,n);0>e?t.push([n,r]):t[e][1]=r}function Jt(t,n,r,e){return t===q||we(t,du[r])&&!xu.call(e,r)?n:t}function Qt(t,n,r){(r===q||we(t[n],r))&&(typeof n!="number"||r!==q||n in t)||(t[n]=r)}function Xt(t,n,r){var e=t[n];xu.call(t,n)&&we(e,r)&&(r!==q||n in t)||(t[n]=r)}function tn(t,n,r,e){return _o(t,function(t,u,o){n(e,t,r(t),o)}),e}function nn(t,n){return t&&ir(n,He(n),t)}function rn(t,n){for(var r=-1,e=null==t,u=n.length,o=Array(u);++r<u;)o[r]=e?q:Ge(t,n[r]);return o}function en(t,n,r){return t===t&&(r!==q&&(t=t>r?r:t),
|
||||||
|
n!==q&&(t=n>t?n:t)),t}function un(t,n,r,e,o,i,f){var c;if(e&&(c=i?e(t,o,i,f):e(t)),c!==q)return c;if(!Be(t))return t;if(o=oi(t)){if(c=Ur(t),!n)return or(t,c)}else{var a=Mr(t),l="[object Function]"==a||"[object GeneratorFunction]"==a;if(ii(t))return nr(t,n);if("[object Object]"==a||"[object Arguments]"==a||l&&!i){if(z(t))return i?t:{};if(c=Dr(l?{}:t),!n)return fr(t,nn(c,t))}else{if(!zt[a])return i?t:{};c=$r(t,a,un,n)}}if(f||(f=new Nt),i=f.get(t))return i;if(f.set(t,c),!o)var s=r?dn(t,He,Cr):He(t);return u(s||t,function(u,o){
|
||||||
|
s&&(o=u,u=t[o]),Xt(c,o,un(u,n,r,e,o,t,f))}),c}function on(t){var n=He(t),r=n.length;return function(e){if(null==e)return!r;for(var u=r;u--;){var o=n[u],i=t[o],f=e[o];if(f===q&&!(o in Object(e))||!i(f))return false}return true}}function fn(t){return Be(t)?Cu(t):{}}function cn(t,n,r){if(typeof t!="function")throw new vu("Expected a function");return zu(function(){t.apply(q,r)},n)}function an(t,n,r,e){var u=-1,o=f,i=true,l=t.length,s=[],h=n.length;if(!l)return s;r&&(n=a(n,O(r))),e?(o=c,i=false):n.length>=200&&(o=Ft,
|
||||||
|
i=false,n=new $t(n));t:for(;++u<l;){var p=t[u],_=r?r(p):p;if(i&&_===_){for(var v=h;v--;)if(n[v]===_)continue t;s.push(p)}else o(n,_,e)||s.push(p)}return s}function ln(t,n){var r=true;return _o(t,function(t,e,u){return r=!!n(t,e,u)}),r}function sn(t,n){var r=[];return _o(t,function(t,e,u){n(t,e,u)&&r.push(t)}),r}function hn(t,n,r,e,u){var o=-1,i=t.length;for(r||(r=Nr),u||(u=[]);++o<i;){var f=t[o];n>0&&r(f)?n>1?hn(f,n-1,r,e,u):l(u,f):e||(u[u.length]=f)}return u}function pn(t,n){return t&&go(t,n,He)}function _n(t,n){
|
||||||
|
return t&&yo(t,n,He)}function vn(t,n){return i(n,function(n){return Se(t[n])})}function gn(t,n){n=Tr(n,t)?[n]:Xn(n);for(var r=0,e=n.length;null!=t&&e>r;)t=t[n[r++]];return r&&r==e?t:q}function dn(t,n,r){return n=n(t),oi(t)?n:l(n,r(t))}function yn(t,n){return xu.call(t,n)||typeof t=="object"&&n in t&&null===Fu(Object(t))}function bn(t,n){return n in Object(t)}function xn(t,n,r){for(var e=r?c:f,u=t[0].length,o=t.length,i=o,l=Array(o),s=1/0,h=[];i--;){var p=t[i];i&&n&&(p=a(p,O(n))),s=qu(p.length,s),
|
||||||
|
l[i]=r||!n&&(120>u||120>p.length)?q:new $t(i&&p)}var p=t[0],_=-1,v=l[0];t:for(;++_<u&&s>h.length;){var g=p[_],d=n?n(g):g;if(v?!Ft(v,d):!e(h,d,r)){for(i=o;--i;){var y=l[i];if(y?!Ft(y,d):!e(t[i],d,r))continue t}v&&v.push(d),h.push(g)}}return h}function jn(t,n,r){var e={};return pn(t,function(t,u,o){n(e,r(t),u,o)}),e}function mn(t,n,e){return Tr(n,t)||(n=Xn(n),t=Yr(t,n),n=ee(n)),n=null==t?t:t[n],null==n?q:r(n,t,e)}function wn(t,n,r,e,u){if(t===n)n=true;else if(null==t||null==n||!Be(t)&&!Le(n))n=t!==t&&n!==n;else t:{
|
||||||
|
var o=oi(t),i=oi(n),f="[object Array]",c="[object Array]";o||(f=Mr(t),f="[object Arguments]"==f?"[object Object]":f),i||(c=Mr(n),c="[object Arguments]"==c?"[object Object]":c);var a="[object Object]"==f&&!z(t),i="[object Object]"==c&&!z(n);if((c=f==c)&&!a)u||(u=new Nt),n=o||Fe(t)?Er(t,n,wn,r,e,u):Ir(t,n,f,wn,r,e,u);else{if(!(2&e)&&(o=a&&xu.call(t,"__wrapped__"),f=i&&xu.call(n,"__wrapped__"),o||f)){t=o?t.value():t,n=f?n.value():n,u||(u=new Nt),n=wn(t,n,r,e,u);break t}if(c)n:if(u||(u=new Nt),o=2&e,
|
||||||
|
f=He(t),i=f.length,c=He(n).length,i==c||o){for(a=i;a--;){var l=f[a];if(!(o?l in n:yn(n,l))){n=false;break n}}if(c=u.get(t))n=c==n;else{c=true,u.set(t,n);for(var s=o;++a<i;){var l=f[a],h=t[l],p=n[l];if(r)var _=o?r(p,h,l,n,t,u):r(h,p,l,t,n,u);if(_===q?h!==p&&!wn(h,p,r,e,u):!_){c=false;break}s||(s="constructor"==l)}c&&!s&&(r=t.constructor,e=n.constructor,r!=e&&"constructor"in t&&"constructor"in n&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(c=false)),u["delete"](t),n=c}}else n=false;else n=false;
|
||||||
|
}}return n}function An(t,n,r,e){var u=r.length,o=u,i=!e;if(null==t)return!o;for(t=Object(t);u--;){var f=r[u];if(i&&f[2]?f[1]!==t[f[0]]:!(f[0]in t))return false}for(;++u<o;){var f=r[u],c=f[0],a=t[c],l=f[1];if(i&&f[2]){if(a===q&&!(c in t))return false}else{if(f=new Nt,e)var s=e(a,l,c,t,n,f);if(s===q?!wn(l,a,e,3,f):!s)return false}}return true}function On(t){return typeof t=="function"?t:null==t?iu:typeof t=="object"?oi(t)?Sn(t[0],t[1]):In(t):lu(t)}function kn(t){t=null==t?t:Object(t);var n,r=[];for(n in t)r.push(n);
|
||||||
|
return r}function En(t,n){var r=-1,e=ke(t)?Array(t.length):[];return _o(t,function(t,u,o){e[++r]=n(t,u,o)}),e}function In(t){var n=Wr(t);return 1==n.length&&n[0][2]?Gr(n[0][0],n[0][1]):function(r){return r===t||An(r,t,n)}}function Sn(t,n){return Tr(t)&&n===n&&!Be(n)?Gr(t,n):function(r){var e=Ge(r,t);return e===q&&e===n?Ye(r,t):wn(n,e,q,3)}}function Rn(t,n,r,e,o){if(t!==n){if(!oi(n)&&!Fe(n))var i=Qe(n);u(i||n,function(u,f){if(i&&(f=u,u=n[f]),Be(u)){o||(o=new Nt);var c=f,a=o,l=t[c],s=n[c],h=a.get(s);
|
||||||
|
if(h)Qt(t,c,h);else{var h=e?e(l,s,c+"",t,n,a):q,p=h===q;p&&(h=s,oi(s)||Fe(s)?oi(l)?h=l:Ee(l)?h=or(l):(p=false,h=un(s,true)):ze(s)||Oe(s)?Oe(l)?h=Ve(l):!Be(l)||r&&Se(l)?(p=false,h=un(s,true)):h=l:p=false),a.set(s,h),p&&Rn(h,s,r,e,a),a["delete"](s),Qt(t,c,h)}}else c=e?e(t[f],u,f+"",t,n,o):q,c===q&&(c=u),Qt(t,f,c)})}}function Wn(t,n){var r=t.length;return r?(n+=0>n?r:0,U(n,r)?t[n]:q):void 0}function Bn(t,n,r){var e=-1;return n=a(n.length?n:[iu],O(Rr())),t=En(t,function(t){return{a:a(n,function(n){return n(t)}),b:++e,
|
||||||
|
c:t}}),j(t,function(t,n){var e;t:{e=-1;for(var u=t.a,o=n.a,i=u.length,f=r.length;++e<i;){var c=R(u[e],o[e]);if(c){e=f>e?c*("desc"==r[e]?-1:1):c;break t}}e=t.b-n.b}return e})}function Ln(t,n){return t=Object(t),s(n,function(n,r){return r in t&&(n[r]=t[r]),n},{})}function Cn(t,n){for(var r=-1,e=dn(t,Qe,wo),u=e.length,o={};++r<u;){var i=e[r],f=t[i];n(f,i)&&(o[i]=f)}return o}function Mn(t){return function(n){return null==n?q:n[t]}}function zn(t){return function(n){return gn(n,t)}}function Un(t,n,r,e){
|
||||||
|
var u=e?y:d,o=-1,i=n.length,f=t;for(r&&(f=a(t,O(r)));++o<i;)for(var c=0,l=n[o],l=r?r(l):l;-1<(c=u(f,l,c,e));)f!==t&&Uu.call(f,c,1),Uu.call(t,c,1);return t}function Dn(t,n){for(var r=t?n.length:0,e=r-1;r--;){var u=n[r];if(e==r||u!=o){var o=u;if(U(u))Uu.call(t,u,1);else if(Tr(u,t))delete t[u];else{var u=Xn(u),i=Yr(t,u);null!=i&&delete i[ee(u)]}}}}function $n(t,n){return t+$u(Ku()*(n-t+1))}function Fn(t,n){var r="";if(!t||1>n||n>9007199254740991)return r;do n%2&&(r+=t),(n=$u(n/2))&&(t+=t);while(n);return r;
|
||||||
|
}function Nn(t,n,r,e){n=Tr(n,t)?[n]:Xn(n);for(var u=-1,o=n.length,i=o-1,f=t;null!=f&&++u<o;){var c=n[u];if(Be(f)){var a=r;if(u!=i){var l=f[c],a=e?e(l,c,f):q;a===q&&(a=null==l?U(n[u+1])?[]:{}:l)}Xt(f,c,a)}f=f[c]}return t}function Pn(t,n,r){var e=-1,u=t.length;for(0>n&&(n=-n>u?0:u+n),r=r>u?u:r,0>r&&(r+=u),u=n>r?0:r-n>>>0,n>>>=0,r=Array(u);++e<u;)r[e]=t[e+n];return r}function Zn(t,n){var r;return _o(t,function(t,e,u){return r=n(t,e,u),!r}),!!r}function Tn(t,n,r){var e=0,u=t?t.length:e;if(typeof n=="number"&&n===n&&2147483647>=u){
|
||||||
|
for(;u>e;){var o=e+u>>>1,i=t[o];(r?n>=i:n>i)&&null!==i?e=o+1:u=o}return u}return qn(t,n,iu,r)}function qn(t,n,r,e){n=r(n);for(var u=0,o=t?t.length:0,i=n!==n,f=null===n,c=n===q;o>u;){var a=$u((u+o)/2),l=r(t[a]),s=l!==q,h=l===l;(i?h||e:f?h&&s&&(e||null!=l):c?h&&(e||s):null==l?0:e?n>=l:n>l)?u=a+1:o=a}return qu(o,4294967294)}function Vn(t,n){for(var r=0,e=t.length,u=t[0],o=n?n(u):u,i=o,f=1,c=[u];++r<e;)u=t[r],o=n?n(u):u,we(o,i)||(i=o,c[f++]=u);return c}function Kn(t,n,r){var e=-1,u=f,o=t.length,i=true,a=[],l=a;
|
||||||
|
if(r)i=false,u=c;else if(o<200)l=n?[]:a;else{if(u=n?null:xo(t))return N(u);i=false,u=Ft,l=new $t}t:for(;++e<o;){var s=t[e],h=n?n(s):s;if(i&&h===h){for(var p=l.length;p--;)if(l[p]===h)continue t;n&&l.push(h),a.push(s)}else u(l,h,r)||(l!==a&&l.push(h),a.push(s))}return a}function Gn(t,n,r,e){for(var u=t.length,o=e?u:-1;(e?o--:++o<u)&&n(t[o],o,t););return r?Pn(t,e?0:o,e?o+1:u):Pn(t,e?o+1:0,e?u:o)}function Jn(t,n){var r=t;return r instanceof Et&&(r=r.value()),s(n,function(t,n){return n.func.apply(n.thisArg,l([t],n.args));
|
||||||
|
},r)}function Yn(t,n,r){for(var e=-1,u=t.length;++e<u;)var o=o?l(an(o,t[e],n,r),an(t[e],o,n,r)):t[e];return o&&o.length?Kn(o,n,r):[]}function Hn(t,n,r){for(var e=-1,u=t.length,o=n.length,i={};++e<u;)r(i,t[e],o>e?n[e]:q);return i}function Qn(t){return Ee(t)?t:[]}function Xn(t){return oi(t)?t:Oo(t)}function tr(t,n,r){var e=t.length;return r=r===q?e:r,n||e>r?Pn(t,n,r):t}function nr(t,n){if(n)return t.slice();var r=new t.constructor(t.length);return t.copy(r),r}function rr(t){var n=new t.constructor(t.byteLength);
|
||||||
|
return new Su(n).set(new Su(t)),n}function er(t,n,r,e){var u=-1,o=t.length,i=r.length,f=-1,c=n.length,a=Tu(o-i,0),l=Array(c+a);for(e=!e;++f<c;)l[f]=n[f];for(;++u<i;)(e||o>u)&&(l[r[u]]=t[u]);for(;a--;)l[f++]=t[u++];return l}function ur(t,n,r,e){var u=-1,o=t.length,i=-1,f=r.length,c=-1,a=n.length,l=Tu(o-f,0),s=Array(l+a);for(e=!e;++u<l;)s[u]=t[u];for(l=u;++c<a;)s[l+c]=n[c];for(;++i<f;)(e||o>u)&&(s[l+r[i]]=t[u++]);return s}function or(t,n){var r=-1,e=t.length;for(n||(n=Array(e));++r<e;)n[r]=t[r];return n;
|
||||||
|
}function ir(t,n,r,e){r||(r={});for(var u=-1,o=n.length;++u<o;){var i=n[u],f=e?e(r[i],t[i],i,r,t):t[i];Xt(r,i,f)}return r}function fr(t,n){return ir(t,Cr(t),n)}function cr(t,n){return function(r,u){var o=oi(r)?e:tn,i=n?n():{};return o(r,t,Rr(u),i)}}function ar(t){return je(function(n,r){var e=-1,u=r.length,o=u>1?r[u-1]:q,i=u>2?r[2]:q,o=typeof o=="function"?(u--,o):q;for(i&&Zr(r[0],r[1],i)&&(o=3>u?q:o,u=1),n=Object(n);++e<u;)(i=r[e])&&t(n,i,e,o);return n})}function lr(t,n){return function(r,e){if(null==r)return r;
|
||||||
|
if(!ke(r))return t(r,e);for(var u=r.length,o=n?u:-1,i=Object(r);(n?o--:++o<u)&&false!==e(i[o],o,i););return r}}function sr(t){return function(n,r,e){var u=-1,o=Object(n);e=e(n);for(var i=e.length;i--;){var f=e[t?i:++u];if(false===r(o[f],f,o))break}return n}}function hr(t,n,r){function e(){return(this&&this!==Yt&&this instanceof e?o:t).apply(u?r:this,arguments)}var u=1&n,o=vr(t);return e}function pr(t){return function(n){n=Ke(n);var r=Bt.test(n)?n.match(Rt):q,e=r?r[0]:n.charAt(0);return n=r?tr(r,1).join(""):n.slice(1),
|
||||||
|
e[t]()+n}}function _r(t){return function(n){return s(uu(eu(n).replace(It,"")),t,"")}}function vr(t){return function(){var n=arguments;switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3]);case 5:return new t(n[0],n[1],n[2],n[3],n[4]);case 6:return new t(n[0],n[1],n[2],n[3],n[4],n[5]);case 7:return new t(n[0],n[1],n[2],n[3],n[4],n[5],n[6])}var r=fn(t.prototype),n=t.apply(r,n);return Be(n)?n:r;
|
||||||
|
}}function gr(t,n,e){function u(){for(var i=arguments.length,f=Array(i),c=i,a=Lr(u);c--;)f[c]=arguments[c];return c=3>i&&f[0]!==a&&f[i-1]!==a?[]:F(f,a),i-=c.length,e>i?Ar(t,n,yr,u.placeholder,q,f,c,q,q,e-i):r(this&&this!==Yt&&this instanceof u?o:t,this,f)}var o=vr(t);return u}function dr(t){return je(function(n){n=hn(n,1);var r=n.length,e=r,u=kt.prototype.thru;for(t&&n.reverse();e--;){var o=n[e];if(typeof o!="function")throw new vu("Expected a function");if(u&&!i&&"wrapper"==Sr(o))var i=new kt([],true);
|
||||||
|
}for(e=i?e:r;++e<r;)var o=n[e],u=Sr(o),f="wrapper"==u?jo(o):q,i=f&&Vr(f[0])&&424==f[1]&&!f[4].length&&1==f[9]?i[Sr(f[0])].apply(i,f[3]):1==o.length&&Vr(o)?i[u]():i.thru(o);return function(){var t=arguments,e=t[0];if(i&&1==t.length&&oi(e)&&e.length>=200)return i.plant(e).value();for(var u=0,t=r?n[u].apply(this,t):e;++u<r;)t=n[u].call(this,t);return t}})}function yr(t,n,r,e,u,o,i,f,c,a){function l(){for(var d=arguments.length,y=d,b=Array(d);y--;)b[y]=arguments[y];if(_){var x,j=Lr(l),y=b.length;for(x=0;y--;)b[y]===j&&x++;
|
||||||
|
}if(e&&(b=er(b,e,u,_)),o&&(b=ur(b,o,i,_)),d-=x,_&&a>d)return j=F(b,j),Ar(t,n,yr,l.placeholder,r,b,j,f,c,a-d);if(j=h?r:this,y=p?j[t]:t,d=b.length,f){x=b.length;for(var m=qu(f.length,x),w=or(b);m--;){var A=f[m];b[m]=U(A,x)?w[A]:q}}else v&&d>1&&b.reverse();return s&&d>c&&(b.length=c),this&&this!==Yt&&this instanceof l&&(y=g||vr(y)),y.apply(j,b)}var s=128&n,h=1&n,p=2&n,_=24&n,v=512&n,g=p?q:vr(t);return l}function br(t,n){return function(r,e){return jn(r,t,n(e))}}function xr(t){return je(function(n){return n=1==n.length&&oi(n[0])?a(n[0],O(Rr())):a(hn(n,1,Pr),O(Rr())),
|
||||||
|
je(function(e){var u=this;return t(n,function(t){return r(t,u,e)})})})}function jr(t,n){n=n===q?" ":n+"";var r=n.length;return 2>r?r?Fn(n,t):n:(r=Fn(n,Du(t/P(n))),Bt.test(n)?tr(r.match(Rt),0,t).join(""):r.slice(0,t))}function mr(t,n,e,u){function o(){for(var n=-1,c=arguments.length,a=-1,l=u.length,s=Array(l+c),h=this&&this!==Yt&&this instanceof o?f:t;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++n];return r(h,i?e:this,s)}var i=1&n,f=vr(t);return o}function wr(t){return function(n,r,e){e&&typeof e!="number"&&Zr(n,r,e)&&(r=e=q),
|
||||||
|
n=qe(n),n=n===n?n:0,r===q?(r=n,n=0):r=qe(r)||0,e=e===q?r>n?1:-1:qe(e)||0;var u=-1;r=Tu(Du((r-n)/(e||1)),0);for(var o=Array(r);r--;)o[t?r:++u]=n,n+=e;return o}}function Ar(t,n,r,e,u,o,i,f,c,a){var l=8&n,s=l?i:q;i=l?q:i;var h=l?o:q;return o=l?q:o,n=(n|(l?32:64))&~(l?64:32),4&n||(n&=-4),n=[t,n,u,h,s,o,i,f,c,a],r=r.apply(q,n),Vr(t)&&Ao(r,n),r.placeholder=e,r}function Or(t){var n=pu[t];return function(t,r){if(t=qe(t),r=Ze(r)){var e=(Ke(t)+"e").split("e"),e=n(e[0]+"e"+(+e[1]+r)),e=(Ke(e)+"e").split("e");
|
||||||
|
return+(e[0]+"e"+(+e[1]-r))}return n(t)}}function kr(t,n,r,e,u,o,i,f){var c=2&n;if(!c&&typeof t!="function")throw new vu("Expected a function");var a=e?e.length:0;if(a||(n&=-97,e=u=q),i=i===q?i:Tu(Ze(i),0),f=f===q?f:Ze(f),a-=u?u.length:0,64&n){var l=e,s=u;e=u=q}var h=c?q:jo(t);return o=[t,n,r,e,u,l,s,o,i,f],h&&(r=o[1],t=h[1],n=r|t,e=128==t&&8==r||128==t&&256==r&&h[8]>=o[7].length||384==t&&h[8]>=h[7].length&&8==r,131>n||e)&&(1&t&&(o[2]=h[2],n|=1&r?0:4),(r=h[3])&&(e=o[3],o[3]=e?er(e,r,h[4]):r,o[4]=e?F(o[3],"__lodash_placeholder__"):h[4]),
|
||||||
|
(r=h[5])&&(e=o[5],o[5]=e?ur(e,r,h[6]):r,o[6]=e?F(o[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(o[7]=r),128&t&&(o[8]=null==o[8]?h[8]:qu(o[8],h[8])),null==o[9]&&(o[9]=h[9]),o[0]=h[0],o[1]=n),t=o[0],n=o[1],r=o[2],e=o[3],u=o[4],f=o[9]=null==o[9]?c?0:t.length:Tu(o[9]-a,0),!f&&24&n&&(n&=-25),(h?bo:Ao)(n&&1!=n?8==n||16==n?gr(t,n,f):32!=n&&33!=n||u.length?yr.apply(q,o):mr(t,n,r,e):hr(t,n,r),o)}function Er(t,n,r,e,u,o){var i=-1,f=2&u,c=1&u,a=t.length,l=n.length;if(!(a==l||f&&l>a))return false;if(l=o.get(t))return l==n;
|
||||||
|
for(l=true,o.set(t,n);++i<a;){var s=t[i],h=n[i];if(e)var _=f?e(h,s,i,n,t,o):e(s,h,i,t,n,o);if(_!==q){if(_)continue;l=false;break}if(c){if(!p(n,function(t){return s===t||r(s,t,e,u,o)})){l=false;break}}else if(s!==h&&!r(s,h,e,u,o)){l=false;break}}return o["delete"](t),l}function Ir(t,n,r,e,u,o,i){switch(r){case"[object DataView]":if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)break;t=t.buffer,n=n.buffer;case"[object ArrayBuffer]":if(t.byteLength!=n.byteLength||!e(new Su(t),new Su(n)))break;return true;
|
||||||
|
case"[object Boolean]":case"[object Date]":return+t==+n;case"[object Error]":return t.name==n.name&&t.message==n.message;case"[object Number]":return t!=+t?n!=+n:t==+n;case"[object RegExp]":case"[object String]":return t==n+"";case"[object Map]":var f=$;case"[object Set]":if(f||(f=N),t.size!=n.size&&!(2&o))break;return(r=i.get(t))?r==n:(o|=1,i.set(t,n),Er(f(t),f(n),e,u,o,i));case"[object Symbol]":if(ho)return ho.call(t)==ho.call(n)}return false}function Sr(t){for(var n=t.name+"",r=oo[n],e=xu.call(oo,n)?r.length:0;e--;){
|
||||||
|
var u=r[e],o=u.func;if(null==o||o==t)return u.name}return n}function Rr(){var t=jt.iteratee||fu,t=t===fu?On:t;return arguments.length?t(arguments[0],arguments[1]):t}function Wr(t){t=Xe(t);for(var n=t.length;n--;){var r=t[n][1];t[n][2]=r===r&&!Be(r)}return t}function Br(t,n){var r=t[n];return Ce(r)?r:q}function Lr(t){return(xu.call(jt,"placeholder")?jt:t).placeholder}function Cr(t){return Bu(Object(t))}function Mr(t){return wu.call(t)}function zr(t,n,r){n=Tr(n,t)?[n]:Xn(n);for(var e,u=-1,o=n.length;++u<o;){
|
||||||
|
var i=n[u];if(!(e=null!=t&&r(t,i)))break;t=t[i]}return e?e:(o=t?t.length:0,!!o&&We(o)&&U(i,o)&&(oi(t)||De(t)||Oe(t)))}function Ur(t){var n=t.length,r=t.constructor(n);return n&&"string"==typeof t[0]&&xu.call(t,"index")&&(r.index=t.index,r.input=t.input),r}function Dr(t){return typeof t.constructor!="function"||Kr(t)?{}:fn(Fu(Object(t)))}function $r(r,e,u,o){var i=r.constructor;switch(e){case"[object ArrayBuffer]":return rr(r);case"[object Boolean]":case"[object Date]":return new i(+r);case"[object DataView]":
|
||||||
|
return e=o?rr(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 e=o?rr(r.buffer):r.buffer,new r.constructor(e,r.byteOffset,r.length);case"[object Map]":return e=o?u($(r),true):$(r),s(e,t,new r.constructor);case"[object Number]":case"[object String]":
|
||||||
|
return new i(r);case"[object RegExp]":return e=new r.constructor(r.source,vt.exec(r)),e.lastIndex=r.lastIndex,e;case"[object Set]":return e=o?u(N(r),true):N(r),s(e,n,new r.constructor);case"[object Symbol]":return ho?Object(ho.call(r)):{}}}function Fr(t){var n=t?t.length:q;return We(n)&&(oi(t)||De(t)||Oe(t))?w(n,String):null}function Nr(t){return Ee(t)&&(oi(t)||Oe(t))}function Pr(t){return oi(t)&&!(2==t.length&&!Se(t[0]))}function Zr(t,n,r){if(!Be(r))return false;var e=typeof n;return("number"==e?ke(r)&&U(n,r.length):"string"==e&&n in r)?we(r[n],t):false;
|
||||||
|
}function Tr(t,n){var r=typeof t;return"number"==r||"symbol"==r?true:!oi(t)&&($e(t)||ot.test(t)||!ut.test(t)||null!=n&&t in Object(n))}function qr(t){var n=typeof t;return"number"==n||"boolean"==n||"string"==n&&"__proto__"!=t||null==t}function Vr(t){var n=Sr(t),r=jt[n];return typeof r=="function"&&n in Et.prototype?t===r?true:(n=jo(r),!!n&&t===n[0]):false}function Kr(t){var n=t&&t.constructor;return t===(typeof n=="function"&&n.prototype||du)}function Gr(t,n){return function(r){return null==r?false:r[t]===n&&(n!==q||t in Object(r));
|
||||||
|
}}function Jr(t,n,r,e,u,o){return Be(t)&&Be(n)&&Rn(t,n,q,Jr,o.set(n,t)),t}function Yr(t,n){return 1==n.length?t:gn(t,Pn(n,0,-1))}function Hr(t){return typeof t=="string"||$e(t)?t:t+""}function Qr(t){if(null!=t){try{return bu.call(t)}catch(n){}return t+""}return""}function Xr(t){if(t instanceof Et)return t.clone();var n=new kt(t.__wrapped__,t.__chain__);return n.__actions__=or(t.__actions__),n.__index__=t.__index__,n.__values__=t.__values__,n}function te(t,n,r){var e=t?t.length:0;return e?(n=r||n===q?1:Ze(n),
|
||||||
|
Pn(t,0>n?0:n,e)):[]}function ne(t,n,r){var e=t?t.length:0;return e?(n=r||n===q?1:Ze(n),n=e-n,Pn(t,0,0>n?0:n)):[]}function re(t){return t&&t.length?t[0]:q}function ee(t){var n=t?t.length:0;return n?t[n-1]:q}function ue(t,n){return t&&t.length&&n&&n.length?Un(t,n):t}function oe(t){return t?Ju.call(t):t}function ie(t){if(!t||!t.length)return[];var n=0;return t=i(t,function(t){return Ee(t)?(n=Tu(t.length,n),true):void 0}),w(n,function(n){return a(t,Mn(n))})}function fe(t,n){if(!t||!t.length)return[];var e=ie(t);
|
||||||
|
return null==n?e:a(e,function(t){return r(n,q,t)})}function ce(t){return t=jt(t),t.__chain__=true,t}function ae(t,n){return n(t)}function le(){return this}function se(t,n){return typeof n=="function"&&oi(t)?u(t,n):_o(t,Rr(n))}function he(t,n){var r;if(typeof n=="function"&&oi(t)){for(r=t.length;r--&&false!==n(t[r],r,t););r=t}else r=vo(t,Rr(n));return r}function pe(t,n){return(oi(t)?a:En)(t,Rr(n,3))}function _e(t,n,r){var e=-1,u=Pe(t),o=u.length,i=o-1;for(n=(r?Zr(t,n,r):n===q)?1:en(Ze(n),0,o);++e<n;)t=$n(e,i),
|
||||||
|
r=u[t],u[t]=u[e],u[e]=r;return u.length=n,u}function ve(t,n,r){return n=r?q:n,n=t&&null==n?t.length:n,kr(t,128,q,q,q,q,n)}function ge(t,n){var r;if(typeof n!="function")throw new vu("Expected a function");return t=Ze(t),function(){return 0<--t&&(r=n.apply(this,arguments)),1>=t&&(n=q),r}}function de(t,n,r){return n=r?q:n,t=kr(t,8,q,q,q,q,q,n),t.placeholder=de.placeholder,t}function ye(t,n,r){return n=r?q:n,t=kr(t,16,q,q,q,q,q,n),t.placeholder=ye.placeholder,t}function be(t,n,r){function e(n){var r=c,e=a;
|
||||||
|
return c=a=q,p=n,l=t.apply(e,r)}function u(t){var r=t-h;return t-=p,!h||r>=n||0>r||false!==v&&t>=v}function o(){var t=Yo();if(u(t))return i(t);var r;r=t-p,t=n-(t-h),r=false===v?t:qu(t,v-r),s=zu(o,r)}function i(t){return Ru(s),s=q,g&&c?e(t):(c=a=q,l)}function f(){var t=Yo(),r=u(t);return c=arguments,a=this,h=t,r?s===q?(p=t=h,s=zu(o,n),_?e(t):l):(Ru(s),s=zu(o,n),e(h)):(s===q&&(s=zu(o,n)),l)}var c,a,l,s,h=0,p=0,_=false,v=false,g=true;if(typeof t!="function")throw new vu("Expected a function");return n=qe(n)||0,Be(r)&&(_=!!r.leading,
|
||||||
|
v="maxWait"in r&&Tu(qe(r.maxWait)||0,n),g="trailing"in r?!!r.trailing:g),f.cancel=function(){s!==q&&Ru(s),h=p=0,c=a=s=q},f.flush=function(){return s===q?l:i(Yo())},f}function xe(t,n){function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=t.apply(this,e),r.cache=o.set(u,e),e)}if(typeof t!="function"||n&&typeof n!="function")throw new vu("Expected a function");return r.cache=new(xe.Cache||Dt),r}function je(t,n){if(typeof t!="function")throw new vu("Expected a function");
|
||||||
|
return n=Tu(n===q?t.length-1:Ze(n),0),function(){for(var e=arguments,u=-1,o=Tu(e.length-n,0),i=Array(o);++u<o;)i[u]=e[n+u];switch(n){case 0:return t.call(this,i);case 1:return t.call(this,e[0],i);case 2:return t.call(this,e[0],e[1],i)}for(o=Array(n+1),u=-1;++u<n;)o[u]=e[u];return o[n]=i,r(t,this,o)}}function me(){if(!arguments.length)return[];var t=arguments[0];return oi(t)?t:[t]}function we(t,n){return t===n||t!==t&&n!==n}function Ae(t,n){return t>n}function Oe(t){return Ee(t)&&xu.call(t,"callee")&&(!Mu.call(t,"callee")||"[object Arguments]"==wu.call(t));
|
||||||
|
}function ke(t){return null!=t&&We(mo(t))&&!Se(t)}function Ee(t){return Le(t)&&ke(t)}function Ie(t){return Le(t)?"[object Error]"==wu.call(t)||typeof t.message=="string"&&typeof t.name=="string":false}function Se(t){return t=Be(t)?wu.call(t):"","[object Function]"==t||"[object GeneratorFunction]"==t}function Re(t){return typeof t=="number"&&t==Ze(t)}function We(t){return typeof t=="number"&&t>-1&&0==t%1&&9007199254740991>=t}function Be(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function Le(t){
|
||||||
|
return!!t&&typeof t=="object"}function Ce(t){return Be(t)?(Se(t)||z(t)?Ou:bt).test(Qr(t)):false}function Me(t){return typeof t=="number"||Le(t)&&"[object Number]"==wu.call(t)}function ze(t){return!Le(t)||"[object Object]"!=wu.call(t)||z(t)?false:(t=Fu(Object(t)),null===t?true:(t=xu.call(t,"constructor")&&t.constructor,typeof t=="function"&&t instanceof t&&bu.call(t)==mu))}function Ue(t){return Be(t)&&"[object RegExp]"==wu.call(t)}function De(t){return typeof t=="string"||!oi(t)&&Le(t)&&"[object String]"==wu.call(t);
|
||||||
|
}function $e(t){return typeof t=="symbol"||Le(t)&&"[object Symbol]"==wu.call(t)}function Fe(t){return Le(t)&&We(t.length)&&!!Mt[wu.call(t)]}function Ne(t,n){return n>t}function Pe(t){if(!t)return[];if(ke(t))return De(t)?t.match(Rt):or(t);if(Lu&&t[Lu])return D(t[Lu]());var n=Mr(t);return("[object Map]"==n?$:"[object Set]"==n?N:nu)(t)}function Ze(t){if(!t)return 0===t?t:0;if(t=qe(t),t===V||t===-V)return 1.7976931348623157e308*(0>t?-1:1);var n=t%1;return t===t?n?t-n:t:0}function Te(t){return t?en(Ze(t),0,4294967295):0;
|
||||||
|
}function qe(t){if(typeof t=="number")return t;if($e(t))return K;if(Be(t)&&(t=Se(t.valueOf)?t.valueOf():t,t=Be(t)?t+"":t),typeof t!="string")return 0===t?t:+t;t=t.replace(at,"");var n=yt.test(t);return n||xt.test(t)?Zt(t.slice(2),n?2:8):dt.test(t)?K:+t}function Ve(t){return ir(t,Qe(t))}function Ke(t){if(typeof t=="string")return t;if(null==t)return"";if($e(t))return po?po.call(t):"";var n=t+"";return"0"==n&&1/t==-V?"-0":n}function Ge(t,n,r){return t=null==t?q:gn(t,n),t===q?r:t}function Je(t,n){return null!=t&&zr(t,n,yn);
|
||||||
|
}function Ye(t,n){return null!=t&&zr(t,n,bn)}function He(t){var n=Kr(t);if(!n&&!ke(t))return Zu(Object(t));var r,e=Fr(t),u=!!e,e=e||[],o=e.length;for(r in t)!yn(t,r)||u&&("length"==r||U(r,o))||n&&"constructor"==r||e.push(r);return e}function Qe(t){for(var n=-1,r=Kr(t),e=kn(t),u=e.length,o=Fr(t),i=!!o,o=o||[],f=o.length;++n<u;){var c=e[n];i&&("length"==c||U(c,f))||"constructor"==c&&(r||!xu.call(t,c))||o.push(c)}return o}function Xe(t){return A(t,He(t))}function tu(t){return A(t,Qe(t))}function nu(t){
|
||||||
|
return t?k(t,He(t)):[]}function ru(t){return Ii(Ke(t).toLowerCase())}function eu(t){return(t=Ke(t))&&t.replace(mt,B).replace(St,"")}function uu(t,n,r){return t=Ke(t),n=r?q:n,n===q&&(n=Lt.test(t)?Wt:ht),t.match(n)||[]}function ou(t){return function(){return t}}function iu(t){return t}function fu(t){return On(typeof t=="function"?t:un(t,true))}function cu(t,n,r){var e=He(n),o=vn(n,e);null!=r||Be(n)&&(o.length||!e.length)||(r=n,n=t,t=this,o=vn(n,He(n)));var i=Be(r)&&"chain"in r?r.chain:true,f=Se(t);return u(o,function(r){
|
||||||
|
var e=n[r];t[r]=e,f&&(t.prototype[r]=function(){var n=this.__chain__;if(i||n){var r=t(this.__wrapped__);return(r.__actions__=or(this.__actions__)).push({func:e,args:arguments,thisArg:t}),r.__chain__=n,r}return e.apply(t,l([this.value()],arguments))})}),t}function au(){}function lu(t){return Tr(t)?Mn(t):zn(t)}S=S?Ht.defaults({},S,Ht.pick(Yt,Ct)):Yt;var su=S.Date,hu=S.Error,pu=S.Math,_u=S.RegExp,vu=S.TypeError,gu=S.Array.prototype,du=S.Object.prototype,yu=S.String.prototype,bu=S.Function.prototype.toString,xu=du.hasOwnProperty,ju=0,mu=bu.call(Object),wu=du.toString,Au=Yt._,Ou=_u("^"+bu.call(xu).replace(ft,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ku=Vt?S.Buffer:q,Eu=S.Reflect,Iu=S.Symbol,Su=S.Uint8Array,Ru=S.clearTimeout,Wu=Eu?Eu.f:q,Bu=Object.getOwnPropertySymbols,Lu=typeof(Lu=Iu&&Iu.iterator)=="symbol"?Lu:q,Cu=Object.create,Mu=du.propertyIsEnumerable,zu=S.setTimeout,Uu=gu.splice,Du=pu.ceil,$u=pu.floor,Fu=Object.getPrototypeOf,Nu=S.isFinite,Pu=gu.join,Zu=Object.keys,Tu=pu.max,qu=pu.min,Vu=S.parseInt,Ku=pu.random,Gu=yu.replace,Ju=gu.reverse,Yu=yu.split,Hu=Br(S,"DataView"),Qu=Br(S,"Map"),Xu=Br(S,"Promise"),to=Br(S,"Set"),no=Br(S,"WeakMap"),ro=Br(Object,"create"),eo=no&&new no,uo=!Mu.call({
|
||||||
|
valueOf:1},"valueOf"),oo={},io=Qr(Hu),fo=Qr(Qu),co=Qr(Xu),ao=Qr(to),lo=Qr(no),so=Iu?Iu.prototype:q,ho=so?so.valueOf:q,po=so?so.toString:q;jt.templateSettings={escape:nt,evaluate:rt,interpolate:et,variable:"",imports:{_:jt}},jt.prototype=Ot.prototype,jt.prototype.constructor=jt,kt.prototype=fn(Ot.prototype),kt.prototype.constructor=kt,Et.prototype=fn(Ot.prototype),Et.prototype.constructor=Et,Ut.prototype=ro?ro(null):du,Dt.prototype.clear=function(){this.__data__={hash:new Ut,map:Qu?new Qu:[],string:new Ut
|
||||||
|
}},Dt.prototype["delete"]=function(t){var n=this.__data__;return qr(t)?(n=typeof t=="string"?n.string:n.hash,t=(ro?n[t]!==q:xu.call(n,t))&&delete n[t]):t=Qu?n.map["delete"](t):Tt(n.map,t),t},Dt.prototype.get=function(t){var n=this.__data__;return qr(t)?(n=typeof t=="string"?n.string:n.hash,ro?(t=n[t],t="__lodash_hash_undefined__"===t?q:t):t=xu.call(n,t)?n[t]:q):t=Qu?n.map.get(t):qt(n.map,t),t},Dt.prototype.has=function(t){var n=this.__data__;return qr(t)?(n=typeof t=="string"?n.string:n.hash,t=ro?n[t]!==q:xu.call(n,t)):t=Qu?n.map.has(t):-1<Kt(n.map,t),
|
||||||
|
t},Dt.prototype.set=function(t,n){var r=this.__data__;return qr(t)?(typeof t=="string"?r.string:r.hash)[t]=ro&&n===q?"__lodash_hash_undefined__":n:Qu?r.map.set(t,n):Gt(r.map,t,n),this},$t.prototype.push=function(t){var n=this.__data__;qr(t)?(n=n.__data__,(typeof t=="string"?n.string:n.hash)[t]="__lodash_hash_undefined__"):n.set(t,"__lodash_hash_undefined__")},Nt.prototype.clear=function(){this.__data__={array:[],map:null}},Nt.prototype["delete"]=function(t){var n=this.__data__,r=n.array;return r?Tt(r,t):n.map["delete"](t);
|
||||||
|
},Nt.prototype.get=function(t){var n=this.__data__,r=n.array;return r?qt(r,t):n.map.get(t)},Nt.prototype.has=function(t){var n=this.__data__,r=n.array;return r?-1<Kt(r,t):n.map.has(t)},Nt.prototype.set=function(t,n){var r=this.__data__,e=r.array;return e&&(199>e.length?Gt(e,t,n):(r.array=null,r.map=new Dt(e))),(r=r.map)&&r.set(t,n),this};var _o=lr(pn),vo=lr(_n,true),go=sr(),yo=sr(true);Wu&&!Mu.call({valueOf:1},"valueOf")&&(kn=function(t){return D(Wu(t))});var bo=eo?function(t,n){return eo.set(t,n),t}:iu,xo=to&&2===new to([1,2]).size?function(t){
|
||||||
|
return new to(t)}:au,jo=eo?function(t){return eo.get(t)}:au,mo=Mn("length");Bu||(Cr=function(){return[]});var wo=Bu?function(t){for(var n=[];t;)l(n,Cr(t)),t=Fu(Object(t));return n}:Cr;(Hu&&"[object DataView]"!=Mr(new Hu(new ArrayBuffer(1)))||Qu&&"[object Map]"!=Mr(new Qu)||Xu&&"[object Promise]"!=Mr(Xu.resolve())||to&&"[object Set]"!=Mr(new to)||no&&"[object WeakMap]"!=Mr(new no))&&(Mr=function(t){var n=wu.call(t);if(t=(t="[object Object]"==n?t.constructor:q)?Qr(t):q)switch(t){case io:return"[object DataView]";
|
||||||
|
case fo:return"[object Map]";case co:return"[object Promise]";case ao:return"[object Set]";case lo:return"[object WeakMap]"}return n});var Ao=function(){var t=0,n=0;return function(r,e){var u=Yo(),o=16-(u-n);if(n=u,o>0){if(150<=++t)return r}else t=0;return bo(r,e)}}(),Oo=xe(function(t){var n=[];return Ke(t).replace(it,function(t,r,e,u){n.push(e?u.replace(pt,"$1"):r||t)}),n}),ko=je(function(t,n){return Ee(t)?an(t,hn(n,1,Ee,true)):[]}),Eo=je(function(t,n){var r=ee(n);return Ee(r)&&(r=q),Ee(t)?an(t,hn(n,1,Ee,true),Rr(r)):[];
|
||||||
|
}),Io=je(function(t,n){var r=ee(n);return Ee(r)&&(r=q),Ee(t)?an(t,hn(n,1,Ee,true),q,r):[]}),So=je(function(t){var n=a(t,Qn);return n.length&&n[0]===t[0]?xn(n):[]}),Ro=je(function(t){var n=ee(t),r=a(t,Qn);return n===ee(r)?n=q:r.pop(),r.length&&r[0]===t[0]?xn(r,Rr(n)):[]}),Wo=je(function(t){var n=ee(t),r=a(t,Qn);return n===ee(r)?n=q:r.pop(),r.length&&r[0]===t[0]?xn(r,q,n):[]}),Bo=je(ue),Lo=je(function(t,n){n=a(hn(n,1),String);var r=rn(t,n);return Dn(t,n.sort(R)),r}),Co=je(function(t){return Kn(hn(t,1,Ee,true));
|
||||||
|
}),Mo=je(function(t){var n=ee(t);return Ee(n)&&(n=q),Kn(hn(t,1,Ee,true),Rr(n))}),zo=je(function(t){var n=ee(t);return Ee(n)&&(n=q),Kn(hn(t,1,Ee,true),q,n)}),Uo=je(function(t,n){return Ee(t)?an(t,n):[]}),Do=je(function(t){return Yn(i(t,Ee))}),$o=je(function(t){var n=ee(t);return Ee(n)&&(n=q),Yn(i(t,Ee),Rr(n))}),Fo=je(function(t){var n=ee(t);return Ee(n)&&(n=q),Yn(i(t,Ee),q,n)}),No=je(ie),Po=je(function(t){var n=t.length,n=n>1?t[n-1]:q,n=typeof n=="function"?(t.pop(),n):q;return fe(t,n)}),Zo=je(function(t){
|
||||||
|
function n(n){return rn(n,t)}t=hn(t,1);var r=t.length,e=r?t[0]:0,u=this.__wrapped__;return 1>=r&&!this.__actions__.length&&u instanceof Et&&U(e)?(u=u.slice(e,+e+(r?1:0)),u.__actions__.push({func:ae,args:[n],thisArg:q}),new kt(u,this.__chain__).thru(function(t){return r&&!t.length&&t.push(q),t})):this.thru(n)}),To=cr(function(t,n,r){xu.call(t,r)?++t[r]:t[r]=1}),qo=cr(function(t,n,r){xu.call(t,r)?t[r].push(n):t[r]=[n]}),Vo=je(function(t,n,e){var u=-1,o=typeof n=="function",i=Tr(n),f=ke(t)?Array(t.length):[];
|
||||||
|
return _o(t,function(t){var c=o?n:i&&null!=t?t[n]:q;f[++u]=c?r(c,t,e):mn(t,n,e)}),f}),Ko=cr(function(t,n,r){t[r]=n}),Go=cr(function(t,n,r){t[r?0:1].push(n)},function(){return[[],[]]}),Jo=je(function(t,n){if(null==t)return[];var r=n.length;return r>1&&Zr(t,n[0],n[1])?n=[]:r>2&&Zr(n[0],n[1],n[2])&&(n=[n[0]]),n=1==n.length&&oi(n[0])?n[0]:hn(n,1,Pr),Bn(t,n,[])}),Yo=su.now,Ho=je(function(t,n,r){var e=1;if(r.length)var u=F(r,Lr(Ho)),e=32|e;return kr(t,e,n,r,u)}),Qo=je(function(t,n,r){var e=3;if(r.length)var u=F(r,Lr(Qo)),e=32|e;
|
||||||
|
return kr(n,e,t,r,u)}),Xo=je(function(t,n){return cn(t,1,n)}),ti=je(function(t,n,r){return cn(t,qe(n)||0,r)});xe.Cache=Dt;var ni=je(function(t,n){n=1==n.length&&oi(n[0])?a(n[0],O(Rr())):a(hn(n,1,Pr),O(Rr()));var e=n.length;return je(function(u){for(var o=-1,i=qu(u.length,e);++o<i;)u[o]=n[o].call(this,u[o]);return r(t,this,u)})}),ri=je(function(t,n){var r=F(n,Lr(ri));return kr(t,32,q,n,r)}),ei=je(function(t,n){var r=F(n,Lr(ei));return kr(t,64,q,n,r)}),ui=je(function(t,n){return kr(t,256,q,q,q,hn(n,1));
|
||||||
|
}),oi=Array.isArray,ii=ku?function(t){return t instanceof ku}:ou(false),fi=ar(function(t,n){if(uo||Kr(n)||ke(n))ir(n,He(n),t);else for(var r in n)xu.call(n,r)&&Xt(t,r,n[r])}),ci=ar(function(t,n){if(uo||Kr(n)||ke(n))ir(n,Qe(n),t);else for(var r in n)Xt(t,r,n[r])}),ai=ar(function(t,n,r,e){ir(n,Qe(n),t,e)}),li=ar(function(t,n,r,e){ir(n,He(n),t,e)}),si=je(function(t,n){return rn(t,hn(n,1))}),hi=je(function(t){return t.push(q,Jt),r(ai,q,t)}),pi=je(function(t){return t.push(q,Jr),r(yi,q,t)}),_i=br(function(t,n,r){
|
||||||
|
t[n]=r},ou(iu)),vi=br(function(t,n,r){xu.call(t,n)?t[n].push(r):t[n]=[r]},Rr),gi=je(mn),di=ar(function(t,n,r){Rn(t,n,r)}),yi=ar(function(t,n,r,e){Rn(t,n,r,e)}),bi=je(function(t,n){return null==t?{}:(n=a(hn(n,1),Hr),Ln(t,an(dn(t,Qe,wo),n)))}),xi=je(function(t,n){return null==t?{}:Ln(t,hn(n,1))}),ji=_r(function(t,n,r){return n=n.toLowerCase(),t+(r?ru(n):n)}),mi=_r(function(t,n,r){return t+(r?"-":"")+n.toLowerCase()}),wi=_r(function(t,n,r){return t+(r?" ":"")+n.toLowerCase()}),Ai=pr("toLowerCase"),Oi=_r(function(t,n,r){
|
||||||
|
return t+(r?"_":"")+n.toLowerCase()}),ki=_r(function(t,n,r){return t+(r?" ":"")+Ii(n)}),Ei=_r(function(t,n,r){return t+(r?" ":"")+n.toUpperCase()}),Ii=pr("toUpperCase"),Si=je(function(t,n){try{return r(t,q,n)}catch(e){return Ie(e)?e:new hu(e)}}),Ri=je(function(t,n){return u(hn(n,1),function(n){t[n]=Ho(t[n],t)}),t}),Wi=dr(),Bi=dr(true),Li=je(function(t,n){return function(r){return mn(r,t,n)}}),Ci=je(function(t,n){return function(r){return mn(t,r,n)}}),Mi=xr(a),zi=xr(o),Ui=xr(p),Di=wr(),$i=wr(true),Fi=W(function(t,n){
|
||||||
|
return t+n}),Ni=Or("ceil"),Pi=W(function(t,n){return t/n}),Zi=Or("floor"),Ti=W(function(t,n){return t*n}),qi=Or("round"),Vi=W(function(t,n){return t-n});return jt.after=function(t,n){if(typeof n!="function")throw new vu("Expected a function");return t=Ze(t),function(){return 1>--t?n.apply(this,arguments):void 0}},jt.ary=ve,jt.assign=fi,jt.assignIn=ci,jt.assignInWith=ai,jt.assignWith=li,jt.at=si,jt.before=ge,jt.bind=Ho,jt.bindAll=Ri,jt.bindKey=Qo,jt.castArray=me,jt.chain=ce,jt.chunk=function(t,n,r){
|
||||||
|
if(n=(r?Zr(t,n,r):n===q)?1:Tu(Ze(n),0),r=t?t.length:0,!r||1>n)return[];for(var e=0,u=0,o=Array(Du(r/n));r>e;)o[u++]=Pn(t,e,e+=n);return o},jt.compact=function(t){for(var n=-1,r=t?t.length:0,e=0,u=[];++n<r;){var o=t[n];o&&(u[e++]=o)}return u},jt.concat=function(){var t=arguments.length,n=me(arguments[0]);if(2>t)return t?or(n):[];for(var r=Array(t-1);t--;)r[t-1]=arguments[t];for(var t=hn(r,1),r=-1,e=n.length,u=-1,o=t.length,i=Array(e+o);++r<e;)i[r]=n[r];for(;++u<o;)i[r++]=t[u];return i},jt.cond=function(t){
|
||||||
|
var n=t?t.length:0,e=Rr();return t=n?a(t,function(t){if("function"!=typeof t[1])throw new vu("Expected a function");return[e(t[0]),t[1]]}):[],je(function(e){for(var u=-1;++u<n;){var o=t[u];if(r(o[0],this,e))return r(o[1],this,e)}})},jt.conforms=function(t){return on(un(t,true))},jt.constant=ou,jt.countBy=To,jt.create=function(t,n){var r=fn(t);return n?nn(r,n):r},jt.curry=de,jt.curryRight=ye,jt.debounce=be,jt.defaults=hi,jt.defaultsDeep=pi,jt.defer=Xo,jt.delay=ti,jt.difference=ko,jt.differenceBy=Eo,
|
||||||
|
jt.differenceWith=Io,jt.drop=te,jt.dropRight=ne,jt.dropRightWhile=function(t,n){return t&&t.length?Gn(t,Rr(n,3),true,true):[]},jt.dropWhile=function(t,n){return t&&t.length?Gn(t,Rr(n,3),true):[]},jt.fill=function(t,n,r,e){var u=t?t.length:0;if(!u)return[];for(r&&typeof r!="number"&&Zr(t,n,r)&&(r=0,e=u),u=t.length,r=Ze(r),0>r&&(r=-r>u?0:u+r),e=e===q||e>u?u:Ze(e),0>e&&(e+=u),e=r>e?0:Te(e);e>r;)t[r++]=n;return t},jt.filter=function(t,n){return(oi(t)?i:sn)(t,Rr(n,3))},jt.flatMap=function(t,n){return hn(pe(t,n),1);
|
||||||
|
},jt.flatMapDeep=function(t,n){return hn(pe(t,n),V)},jt.flatMapDepth=function(t,n,r){return r=r===q?1:Ze(r),hn(pe(t,n),r)},jt.flatten=function(t){return t&&t.length?hn(t,1):[]},jt.flattenDeep=function(t){return t&&t.length?hn(t,V):[]},jt.flattenDepth=function(t,n){return t&&t.length?(n=n===q?1:Ze(n),hn(t,n)):[]},jt.flip=function(t){return kr(t,512)},jt.flow=Wi,jt.flowRight=Bi,jt.fromPairs=function(t){for(var n=-1,r=t?t.length:0,e={};++n<r;){var u=t[n];e[u[0]]=u[1]}return e},jt.functions=function(t){
|
||||||
|
return null==t?[]:vn(t,He(t))},jt.functionsIn=function(t){return null==t?[]:vn(t,Qe(t))},jt.groupBy=qo,jt.initial=function(t){return ne(t,1)},jt.intersection=So,jt.intersectionBy=Ro,jt.intersectionWith=Wo,jt.invert=_i,jt.invertBy=vi,jt.invokeMap=Vo,jt.iteratee=fu,jt.keyBy=Ko,jt.keys=He,jt.keysIn=Qe,jt.map=pe,jt.mapKeys=function(t,n){var r={};return n=Rr(n,3),pn(t,function(t,e,u){r[n(t,e,u)]=t}),r},jt.mapValues=function(t,n){var r={};return n=Rr(n,3),pn(t,function(t,e,u){r[e]=n(t,e,u)}),r},jt.matches=function(t){
|
||||||
|
return In(un(t,true))},jt.matchesProperty=function(t,n){return Sn(t,un(n,true))},jt.memoize=xe,jt.merge=di,jt.mergeWith=yi,jt.method=Li,jt.methodOf=Ci,jt.mixin=cu,jt.negate=function(t){if(typeof t!="function")throw new vu("Expected a function");return function(){return!t.apply(this,arguments)}},jt.nthArg=function(t){return t=Ze(t),je(function(n){return Wn(n,t)})},jt.omit=bi,jt.omitBy=function(t,n){return n=Rr(n),Cn(t,function(t,r){return!n(t,r)})},jt.once=function(t){return ge(2,t)},jt.orderBy=function(t,n,r,e){
|
||||||
|
return null==t?[]:(oi(n)||(n=null==n?[]:[n]),r=e?q:r,oi(r)||(r=null==r?[]:[r]),Bn(t,n,r))},jt.over=Mi,jt.overArgs=ni,jt.overEvery=zi,jt.overSome=Ui,jt.partial=ri,jt.partialRight=ei,jt.partition=Go,jt.pick=xi,jt.pickBy=function(t,n){return null==t?{}:Cn(t,Rr(n))},jt.property=lu,jt.propertyOf=function(t){return function(n){return null==t?q:gn(t,n)}},jt.pull=Bo,jt.pullAll=ue,jt.pullAllBy=function(t,n,r){return t&&t.length&&n&&n.length?Un(t,n,Rr(r)):t},jt.pullAllWith=function(t,n,r){return t&&t.length&&n&&n.length?Un(t,n,q,r):t;
|
||||||
|
},jt.pullAt=Lo,jt.range=Di,jt.rangeRight=$i,jt.rearg=ui,jt.reject=function(t,n){var r=oi(t)?i:sn;return n=Rr(n,3),r(t,function(t,r,e){return!n(t,r,e)})},jt.remove=function(t,n){var r=[];if(!t||!t.length)return r;var e=-1,u=[],o=t.length;for(n=Rr(n,3);++e<o;){var i=t[e];n(i,e,t)&&(r.push(i),u.push(e))}return Dn(t,u),r},jt.rest=je,jt.reverse=oe,jt.sampleSize=_e,jt.set=function(t,n,r){return null==t?t:Nn(t,n,r)},jt.setWith=function(t,n,r,e){return e=typeof e=="function"?e:q,null==t?t:Nn(t,n,r,e)},jt.shuffle=function(t){
|
||||||
|
return _e(t,4294967295)},jt.slice=function(t,n,r){var e=t?t.length:0;return e?(r&&typeof r!="number"&&Zr(t,n,r)?(n=0,r=e):(n=null==n?0:Ze(n),r=r===q?e:Ze(r)),Pn(t,n,r)):[]},jt.sortBy=Jo,jt.sortedUniq=function(t){return t&&t.length?Vn(t):[]},jt.sortedUniqBy=function(t,n){return t&&t.length?Vn(t,Rr(n)):[]},jt.split=function(t,n,r){return r&&typeof r!="number"&&Zr(t,n,r)&&(n=r=q),r=r===q?4294967295:r>>>0,r?(t=Ke(t))&&(typeof n=="string"||null!=n&&!Ue(n))&&(n+="",""==n&&Bt.test(t))?tr(t.match(Rt),0,r):Yu.call(t,n,r):[];
|
||||||
|
},jt.spread=function(t,n){if(typeof t!="function")throw new vu("Expected a function");return n=n===q?0:Tu(Ze(n),0),je(function(e){var u=e[n];return e=tr(e,0,n),u&&l(e,u),r(t,this,e)})},jt.tail=function(t){return te(t,1)},jt.take=function(t,n,r){return t&&t.length?(n=r||n===q?1:Ze(n),Pn(t,0,0>n?0:n)):[]},jt.takeRight=function(t,n,r){var e=t?t.length:0;return e?(n=r||n===q?1:Ze(n),n=e-n,Pn(t,0>n?0:n,e)):[]},jt.takeRightWhile=function(t,n){return t&&t.length?Gn(t,Rr(n,3),false,true):[]},jt.takeWhile=function(t,n){
|
||||||
|
return t&&t.length?Gn(t,Rr(n,3)):[]},jt.tap=function(t,n){return n(t),t},jt.throttle=function(t,n,r){var e=true,u=true;if(typeof t!="function")throw new vu("Expected a function");return Be(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),be(t,n,{leading:e,maxWait:n,trailing:u})},jt.thru=ae,jt.toArray=Pe,jt.toPairs=Xe,jt.toPairsIn=tu,jt.toPath=function(t){return oi(t)?a(t,Hr):$e(t)?[t]:or(Oo(t))},jt.toPlainObject=Ve,jt.transform=function(t,n,r){var e=oi(t)||Fe(t);if(n=Rr(n,4),null==r)if(e||Be(t)){
|
||||||
|
var o=t.constructor;r=e?oi(t)?new o:[]:Se(o)?fn(Fu(Object(t))):{}}else r={};return(e?u:pn)(t,function(t,e,u){return n(r,t,e,u)}),r},jt.unary=function(t){return ve(t,1)},jt.union=Co,jt.unionBy=Mo,jt.unionWith=zo,jt.uniq=function(t){return t&&t.length?Kn(t):[]},jt.uniqBy=function(t,n){return t&&t.length?Kn(t,Rr(n)):[]},jt.uniqWith=function(t,n){return t&&t.length?Kn(t,q,n):[]},jt.unset=function(t,n){var r;if(null==t)r=true;else{r=t;var e=n,e=Tr(e,r)?[e]:Xn(e);r=Yr(r,e),e=ee(e),r=null!=r&&Je(r,e)?delete r[e]:true;
|
||||||
|
}return r},jt.unzip=ie,jt.unzipWith=fe,jt.update=function(t,n,r){return null==t?t:Nn(t,n,(typeof r=="function"?r:iu)(gn(t,n)),void 0)},jt.updateWith=function(t,n,r,e){return e=typeof e=="function"?e:q,null!=t&&(t=Nn(t,n,(typeof r=="function"?r:iu)(gn(t,n)),e)),t},jt.values=nu,jt.valuesIn=function(t){return null==t?[]:k(t,Qe(t))},jt.without=Uo,jt.words=uu,jt.wrap=function(t,n){return n=null==n?iu:n,ri(n,t)},jt.xor=Do,jt.xorBy=$o,jt.xorWith=Fo,jt.zip=No,jt.zipObject=function(t,n){return Hn(t||[],n||[],Xt);
|
||||||
|
},jt.zipObjectDeep=function(t,n){return Hn(t||[],n||[],Nn)},jt.zipWith=Po,jt.entries=Xe,jt.entriesIn=tu,jt.extend=ci,jt.extendWith=ai,cu(jt,jt),jt.add=Fi,jt.attempt=Si,jt.camelCase=ji,jt.capitalize=ru,jt.ceil=Ni,jt.clamp=function(t,n,r){return r===q&&(r=n,n=q),r!==q&&(r=qe(r),r=r===r?r:0),n!==q&&(n=qe(n),n=n===n?n:0),en(qe(t),n,r)},jt.clone=function(t){return un(t,false,true)},jt.cloneDeep=function(t){return un(t,true,true)},jt.cloneDeepWith=function(t,n){return un(t,true,true,n)},jt.cloneWith=function(t,n){return un(t,false,true,n);
|
||||||
|
},jt.deburr=eu,jt.divide=Pi,jt.endsWith=function(t,n,r){t=Ke(t),n=typeof n=="string"?n:n+"";var e=t.length;return r=r===q?e:en(Ze(r),0,e),r-=n.length,r>=0&&t.indexOf(n,r)==r},jt.eq=we,jt.escape=function(t){return(t=Ke(t))&&tt.test(t)?t.replace(Q,L):t},jt.escapeRegExp=function(t){return(t=Ke(t))&&ct.test(t)?t.replace(ft,"\\$&"):t},jt.every=function(t,n,r){var e=oi(t)?o:ln;return r&&Zr(t,n,r)&&(n=q),e(t,Rr(n,3))},jt.find=function(t,n){if(n=Rr(n,3),oi(t)){var r=g(t,n);return r>-1?t[r]:q}return v(t,n,_o);
|
||||||
|
},jt.findIndex=function(t,n){return t&&t.length?g(t,Rr(n,3)):-1},jt.findKey=function(t,n){return v(t,Rr(n,3),pn,true)},jt.findLast=function(t,n){if(n=Rr(n,3),oi(t)){var r=g(t,n,true);return r>-1?t[r]:q}return v(t,n,vo)},jt.findLastIndex=function(t,n){return t&&t.length?g(t,Rr(n,3),true):-1},jt.findLastKey=function(t,n){return v(t,Rr(n,3),_n,true)},jt.floor=Zi,jt.forEach=se,jt.forEachRight=he,jt.forIn=function(t,n){return null==t?t:go(t,Rr(n),Qe)},jt.forInRight=function(t,n){return null==t?t:yo(t,Rr(n),Qe);
|
||||||
|
},jt.forOwn=function(t,n){return t&&pn(t,Rr(n))},jt.forOwnRight=function(t,n){return t&&_n(t,Rr(n))},jt.get=Ge,jt.gt=Ae,jt.gte=function(t,n){return t>=n},jt.has=Je,jt.hasIn=Ye,jt.head=re,jt.identity=iu,jt.includes=function(t,n,r,e){return t=ke(t)?t:nu(t),r=r&&!e?Ze(r):0,e=t.length,0>r&&(r=Tu(e+r,0)),De(t)?e>=r&&-1<t.indexOf(n,r):!!e&&-1<d(t,n,r)},jt.indexOf=function(t,n,r){var e=t?t.length:0;return e?(r=Ze(r),0>r&&(r=Tu(e+r,0)),d(t,n,r)):-1},jt.inRange=function(t,n,r){return n=qe(n)||0,r===q?(r=n,
|
||||||
|
n=0):r=qe(r)||0,t=qe(t),t>=qu(n,r)&&t<Tu(n,r)},jt.invoke=gi,jt.isArguments=Oe,jt.isArray=oi,jt.isArrayBuffer=function(t){return Le(t)&&"[object ArrayBuffer]"==wu.call(t)},jt.isArrayLike=ke,jt.isArrayLikeObject=Ee,jt.isBoolean=function(t){return true===t||false===t||Le(t)&&"[object Boolean]"==wu.call(t)},jt.isBuffer=ii,jt.isDate=function(t){return Le(t)&&"[object Date]"==wu.call(t)},jt.isElement=function(t){return!!t&&1===t.nodeType&&Le(t)&&!ze(t)},jt.isEmpty=function(t){if(ke(t)&&(oi(t)||De(t)||Se(t.splice)||Oe(t)||ii(t)))return!t.length;
|
||||||
|
if(Le(t)){var n=Mr(t);if("[object Map]"==n||"[object Set]"==n)return!t.size}for(var r in t)if(xu.call(t,r))return false;return!(uo&&He(t).length)},jt.isEqual=function(t,n){return wn(t,n)},jt.isEqualWith=function(t,n,r){var e=(r=typeof r=="function"?r:q)?r(t,n):q;return e===q?wn(t,n,r):!!e},jt.isError=Ie,jt.isFinite=function(t){return typeof t=="number"&&Nu(t)},jt.isFunction=Se,jt.isInteger=Re,jt.isLength=We,jt.isMap=function(t){return Le(t)&&"[object Map]"==Mr(t)},jt.isMatch=function(t,n){return t===n||An(t,n,Wr(n));
|
||||||
|
},jt.isMatchWith=function(t,n,r){return r=typeof r=="function"?r:q,An(t,n,Wr(n),r)},jt.isNaN=function(t){return Me(t)&&t!=+t},jt.isNative=Ce,jt.isNil=function(t){return null==t},jt.isNull=function(t){return null===t},jt.isNumber=Me,jt.isObject=Be,jt.isObjectLike=Le,jt.isPlainObject=ze,jt.isRegExp=Ue,jt.isSafeInteger=function(t){return Re(t)&&t>=-9007199254740991&&9007199254740991>=t},jt.isSet=function(t){return Le(t)&&"[object Set]"==Mr(t)},jt.isString=De,jt.isSymbol=$e,jt.isTypedArray=Fe,jt.isUndefined=function(t){
|
||||||
|
return t===q},jt.isWeakMap=function(t){return Le(t)&&"[object WeakMap]"==Mr(t)},jt.isWeakSet=function(t){return Le(t)&&"[object WeakSet]"==wu.call(t)},jt.join=function(t,n){return t?Pu.call(t,n):""},jt.kebabCase=mi,jt.last=ee,jt.lastIndexOf=function(t,n,r){var e=t?t.length:0;if(!e)return-1;var u=e;if(r!==q&&(u=Ze(r),u=(0>u?Tu(e+u,0):qu(u,e-1))+1),n!==n)return M(t,u,true);for(;u--;)if(t[u]===n)return u;return-1},jt.lowerCase=wi,jt.lowerFirst=Ai,jt.lt=Ne,jt.lte=function(t,n){return n>=t},jt.max=function(t){
|
||||||
|
return t&&t.length?_(t,iu,Ae):q},jt.maxBy=function(t,n){return t&&t.length?_(t,Rr(n),Ae):q},jt.mean=function(t){return b(t,iu)},jt.meanBy=function(t,n){return b(t,Rr(n))},jt.min=function(t){return t&&t.length?_(t,iu,Ne):q},jt.minBy=function(t,n){return t&&t.length?_(t,Rr(n),Ne):q},jt.multiply=Ti,jt.nth=function(t,n){return t&&t.length?Wn(t,Ze(n)):q},jt.noConflict=function(){return Yt._===this&&(Yt._=Au),this},jt.noop=au,jt.now=Yo,jt.pad=function(t,n,r){t=Ke(t);var e=(n=Ze(n))?P(t):0;return n&&n>e?(n=(n-e)/2,
|
||||||
|
jr($u(n),r)+t+jr(Du(n),r)):t},jt.padEnd=function(t,n,r){t=Ke(t);var e=(n=Ze(n))?P(t):0;return n&&n>e?t+jr(n-e,r):t},jt.padStart=function(t,n,r){t=Ke(t);var e=(n=Ze(n))?P(t):0;return n&&n>e?jr(n-e,r)+t:t},jt.parseInt=function(t,n,r){return r||null==n?n=0:n&&(n=+n),t=Ke(t).replace(at,""),Vu(t,n||(gt.test(t)?16:10))},jt.random=function(t,n,r){if(r&&typeof r!="boolean"&&Zr(t,n,r)&&(n=r=q),r===q&&(typeof n=="boolean"?(r=n,n=q):typeof t=="boolean"&&(r=t,t=q)),t===q&&n===q?(t=0,n=1):(t=qe(t)||0,n===q?(n=t,
|
||||||
|
t=0):n=qe(n)||0),t>n){var e=t;t=n,n=e}return r||t%1||n%1?(r=Ku(),qu(t+r*(n-t+Pt("1e-"+((r+"").length-1))),n)):$n(t,n)},jt.reduce=function(t,n,r){var e=oi(t)?s:x,u=3>arguments.length;return e(t,Rr(n,4),r,u,_o)},jt.reduceRight=function(t,n,r){var e=oi(t)?h:x,u=3>arguments.length;return e(t,Rr(n,4),r,u,vo)},jt.repeat=function(t,n,r){return n=(r?Zr(t,n,r):n===q)?1:Ze(n),Fn(Ke(t),n)},jt.replace=function(){var t=arguments,n=Ke(t[0]);return 3>t.length?n:Gu.call(n,t[1],t[2])},jt.result=function(t,n,r){n=Tr(n,t)?[n]:Xn(n);
|
||||||
|
var e=-1,u=n.length;for(u||(t=q,u=1);++e<u;){var o=null==t?q:t[n[e]];o===q&&(e=u,o=r),t=Se(o)?o.call(t):o}return t},jt.round=qi,jt.runInContext=T,jt.sample=function(t){t=ke(t)?t:nu(t);var n=t.length;return n>0?t[$n(0,n-1)]:q},jt.size=function(t){if(null==t)return 0;if(ke(t)){var n=t.length;return n&&De(t)?P(t):n}return Le(t)&&(n=Mr(t),"[object Map]"==n||"[object Set]"==n)?t.size:He(t).length},jt.snakeCase=Oi,jt.some=function(t,n,r){var e=oi(t)?p:Zn;return r&&Zr(t,n,r)&&(n=q),e(t,Rr(n,3))},jt.sortedIndex=function(t,n){
|
||||||
|
return Tn(t,n)},jt.sortedIndexBy=function(t,n,r){return qn(t,n,Rr(r))},jt.sortedIndexOf=function(t,n){var r=t?t.length:0;if(r){var e=Tn(t,n);if(r>e&&we(t[e],n))return e}return-1},jt.sortedLastIndex=function(t,n){return Tn(t,n,true)},jt.sortedLastIndexBy=function(t,n,r){return qn(t,n,Rr(r),true)},jt.sortedLastIndexOf=function(t,n){if(t&&t.length){var r=Tn(t,n,true)-1;if(we(t[r],n))return r}return-1},jt.startCase=ki,jt.startsWith=function(t,n,r){return t=Ke(t),r=en(Ze(r),0,t.length),t.lastIndexOf(n,r)==r;
|
||||||
|
},jt.subtract=Vi,jt.sum=function(t){return t&&t.length?m(t,iu):0},jt.sumBy=function(t,n){return t&&t.length?m(t,Rr(n)):0},jt.template=function(t,n,r){var e=jt.templateSettings;r&&Zr(t,n,r)&&(n=q),t=Ke(t),n=ai({},n,e,Jt),r=ai({},n.imports,e.imports,Jt);var u,o,i=He(r),f=k(r,i),c=0;r=n.interpolate||wt;var a="__p+='";r=_u((n.escape||wt).source+"|"+r.source+"|"+(r===et?_t:wt).source+"|"+(n.evaluate||wt).source+"|$","g");var l="sourceURL"in n?"//# sourceURL="+n.sourceURL+"\n":"";if(t.replace(r,function(n,r,e,i,f,l){
|
||||||
|
return e||(e=i),a+=t.slice(c,l).replace(At,C),r&&(u=true,a+="'+__e("+r+")+'"),f&&(o=true,a+="';"+f+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+n.length,n}),a+="';",(n=n.variable)||(a="with(obj){"+a+"}"),a=(o?a.replace(G,""):a).replace(J,"$1").replace(Y,"$1;"),a="function("+(n||"obj")+"){"+(n?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",n=Si(function(){return Function(i,l+"return "+a).apply(q,f);
|
||||||
|
}),n.source=a,Ie(n))throw n;return n},jt.times=function(t,n){if(t=Ze(t),1>t||t>9007199254740991)return[];var r=4294967295,e=qu(t,4294967295);for(n=Rr(n),t-=4294967295,e=w(e,n);++r<t;)n(r);return e},jt.toInteger=Ze,jt.toLength=Te,jt.toLower=function(t){return Ke(t).toLowerCase()},jt.toNumber=qe,jt.toSafeInteger=function(t){return en(Ze(t),-9007199254740991,9007199254740991)},jt.toString=Ke,jt.toUpper=function(t){return Ke(t).toUpperCase()},jt.trim=function(t,n,r){return(t=Ke(t))?r||n===q?t.replace(at,""):(n+="")?(t=t.match(Rt),
|
||||||
|
n=n.match(Rt),tr(t,E(t,n),I(t,n)+1).join("")):t:t},jt.trimEnd=function(t,n,r){return(t=Ke(t))?r||n===q?t.replace(st,""):(n+="")?(t=t.match(Rt),n=I(t,n.match(Rt))+1,tr(t,0,n).join("")):t:t},jt.trimStart=function(t,n,r){return(t=Ke(t))?r||n===q?t.replace(lt,""):(n+="")?(t=t.match(Rt),n=E(t,n.match(Rt)),tr(t,n).join("")):t:t},jt.truncate=function(t,n){var r=30,e="...";if(Be(n))var u="separator"in n?n.separator:u,r="length"in n?Ze(n.length):r,e="omission"in n?Ke(n.omission):e;t=Ke(t);var o=t.length;if(Bt.test(t))var i=t.match(Rt),o=i.length;
|
||||||
|
if(r>=o)return t;if(o=r-P(e),1>o)return e;if(r=i?tr(i,0,o).join(""):t.slice(0,o),u===q)return r+e;if(i&&(o+=r.length-o),Ue(u)){if(t.slice(o).search(u)){var f=r;for(u.global||(u=_u(u.source,Ke(vt.exec(u))+"g")),u.lastIndex=0;i=u.exec(f);)var c=i.index;r=r.slice(0,c===q?o:c)}}else t.indexOf(u,o)!=o&&(u=r.lastIndexOf(u),u>-1&&(r=r.slice(0,u)));return r+e},jt.unescape=function(t){return(t=Ke(t))&&X.test(t)?t.replace(H,Z):t},jt.uniqueId=function(t){var n=++ju;return Ke(t)+n},jt.upperCase=Ei,jt.upperFirst=Ii,
|
||||||
|
jt.each=se,jt.eachRight=he,jt.first=re,cu(jt,function(){var t={};return pn(jt,function(n,r){xu.call(jt.prototype,r)||(t[r]=n)}),t}(),{chain:false}),jt.VERSION="4.11.0",u("bind bindKey curry curryRight partial partialRight".split(" "),function(t){jt[t].placeholder=jt}),u(["drop","take"],function(t,n){Et.prototype[t]=function(r){var e=this.__filtered__;if(e&&!n)return new Et(this);r=r===q?1:Tu(Ze(r),0);var u=this.clone();return e?u.__takeCount__=qu(r,u.__takeCount__):u.__views__.push({size:qu(r,4294967295),
|
||||||
|
type:t+(0>u.__dir__?"Right":"")}),u},Et.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}}),u(["filter","map","takeWhile"],function(t,n){var r=n+1,e=1==r||3==r;Et.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({iteratee:Rr(t,3),type:r}),n.__filtered__=n.__filtered__||e,n}}),u(["head","last"],function(t,n){var r="take"+(n?"Right":"");Et.prototype[t]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(t,n){var r="drop"+(n?"":"Right");
|
||||||
|
Et.prototype[t]=function(){return this.__filtered__?new Et(this):this[r](1)}}),Et.prototype.compact=function(){return this.filter(iu)},Et.prototype.find=function(t){return this.filter(t).head()},Et.prototype.findLast=function(t){return this.reverse().find(t)},Et.prototype.invokeMap=je(function(t,n){return typeof t=="function"?new Et(this):this.map(function(r){return mn(r,t,n)})}),Et.prototype.reject=function(t){return t=Rr(t,3),this.filter(function(n){return!t(n)})},Et.prototype.slice=function(t,n){
|
||||||
|
t=Ze(t);var r=this;return r.__filtered__&&(t>0||0>n)?new Et(r):(0>t?r=r.takeRight(-t):t&&(r=r.drop(t)),n!==q&&(n=Ze(n),r=0>n?r.dropRight(-n):r.take(n-t)),r)},Et.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Et.prototype.toArray=function(){return this.take(4294967295)},pn(Et.prototype,function(t,n){var r=/^(?:filter|find|map|reject)|While$/.test(n),e=/^(?:head|last)$/.test(n),u=jt[e?"take"+("last"==n?"Right":""):n],o=e||/^find/.test(n);u&&(jt.prototype[n]=function(){
|
||||||
|
function n(t){return t=u.apply(jt,l([t],f)),e&&h?t[0]:t}var i=this.__wrapped__,f=e?[1]:arguments,c=i instanceof Et,a=f[0],s=c||oi(i);s&&r&&typeof a=="function"&&1!=a.length&&(c=s=false);var h=this.__chain__,p=!!this.__actions__.length,a=o&&!h,c=c&&!p;return!o&&s?(i=c?i:new Et(this),i=t.apply(i,f),i.__actions__.push({func:ae,args:[n],thisArg:q}),new kt(i,h)):a&&c?t.apply(this,f):(i=this.thru(n),a?e?i.value()[0]:i.value():i)})}),u("pop push shift sort splice unshift".split(" "),function(t){var n=gu[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",e=/^(?:pop|shift)$/.test(t);
|
||||||
|
jt.prototype[t]=function(){var t=arguments;if(e&&!this.__chain__){var u=this.value();return n.apply(oi(u)?u:[],t)}return this[r](function(r){return n.apply(oi(r)?r:[],t)})}}),pn(Et.prototype,function(t,n){var r=jt[n];if(r){var e=r.name+"";(oo[e]||(oo[e]=[])).push({name:n,func:r})}}),oo[yr(q,2).name]=[{name:"wrapper",func:q}],Et.prototype.clone=function(){var t=new Et(this.__wrapped__);return t.__actions__=or(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=or(this.__iteratees__),
|
||||||
|
t.__takeCount__=this.__takeCount__,t.__views__=or(this.__views__),t},Et.prototype.reverse=function(){if(this.__filtered__){var t=new Et(this);t.__dir__=-1,t.__filtered__=true}else t=this.clone(),t.__dir__*=-1;return t},Et.prototype.value=function(){var t,n=this.__wrapped__.value(),r=this.__dir__,e=oi(n),u=0>r,o=e?n.length:0;t=o;for(var i=this.__views__,f=0,c=-1,a=i.length;++c<a;){var l=i[c],s=l.size;switch(l.type){case"drop":f+=s;break;case"dropRight":t-=s;break;case"take":t=qu(t,f+s);break;case"takeRight":
|
||||||
|
f=Tu(f,t-s)}}if(t={start:f,end:t},i=t.start,f=t.end,t=f-i,u=u?f:i-1,i=this.__iteratees__,f=i.length,c=0,a=qu(t,this.__takeCount__),!e||200>o||o==t&&a==t)return Jn(n,this.__actions__);e=[];t:for(;t--&&a>c;){for(u+=r,o=-1,l=n[u];++o<f;){var h=i[o],s=h.type,h=(0,h.iteratee)(l);if(2==s)l=h;else if(!h){if(1==s)continue t;break t}}e[c++]=l}return e},jt.prototype.at=Zo,jt.prototype.chain=function(){return ce(this)},jt.prototype.commit=function(){return new kt(this.value(),this.__chain__)},jt.prototype.next=function(){
|
||||||
|
this.__values__===q&&(this.__values__=Pe(this.value()));var t=this.__index__>=this.__values__.length,n=t?q:this.__values__[this.__index__++];return{done:t,value:n}},jt.prototype.plant=function(t){for(var n,r=this;r instanceof Ot;){var e=Xr(r);e.__index__=0,e.__values__=q,n?u.__wrapped__=e:n=e;var u=e,r=r.__wrapped__}return u.__wrapped__=t,n},jt.prototype.reverse=function(){var t=this.__wrapped__;return t instanceof Et?(this.__actions__.length&&(t=new Et(this)),t=t.reverse(),t.__actions__.push({func:ae,
|
||||||
|
args:[oe],thisArg:q}),new kt(t,this.__chain__)):this.thru(oe)},jt.prototype.toJSON=jt.prototype.valueOf=jt.prototype.value=function(){return Jn(this.__wrapped__,this.__actions__)},Lu&&(jt.prototype[Lu]=le),jt}var q,V=1/0,K=NaN,G=/\b__p\+='';/g,J=/\b(__p\+=)''\+/g,Y=/(__e\(.*?\)|\b__t\))\+'';/g,H=/&(?:amp|lt|gt|quot|#39|#96);/g,Q=/[&<>"'`]/g,X=RegExp(H.source),tt=RegExp(Q.source),nt=/<%-([\s\S]+?)%>/g,rt=/<%([\s\S]+?)%>/g,et=/<%=([\s\S]+?)%>/g,ut=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ot=/^\w*$/,it=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,ft=/[\\^$.*+?()[\]{}|]/g,ct=RegExp(ft.source),at=/^\s+|\s+$/g,lt=/^\s+/,st=/\s+$/,ht=/[a-zA-Z0-9]+/g,pt=/\\(\\)?/g,_t=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,vt=/\w*$/,gt=/^0x/i,dt=/^[-+]0x[0-9a-f]+$/i,yt=/^0b[01]+$/i,bt=/^\[object .+?Constructor\]$/,xt=/^0o[0-7]+$/i,jt=/^(?:0|[1-9]\d*)$/,mt=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,wt=/($^)/,At=/['\n\r\u2028\u2029\\]/g,Ot="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*",kt="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+Ot,Et="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",It=RegExp("['\u2019]","g"),St=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]","g"),Rt=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+Et+Ot,"g"),Wt=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\\u2018\\u2019\\u201c\\u201d \\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\\u2018\\u2019\\u201c\\u201d \\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\\u2018\\u2019\\u201c\\u201d \\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\\u2018\\u2019\\u201c\\u201d \\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\\u2018\\u2019\\u201c\\u201d \\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+",kt].join("|"),"g"),Bt=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ufe0e\\ufe0f]"),Lt=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ct="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise Reflect RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Mt={};
|
||||||
|
Mt["[object Float32Array]"]=Mt["[object Float64Array]"]=Mt["[object Int8Array]"]=Mt["[object Int16Array]"]=Mt["[object Int32Array]"]=Mt["[object Uint8Array]"]=Mt["[object Uint8ClampedArray]"]=Mt["[object Uint16Array]"]=Mt["[object Uint32Array]"]=true,Mt["[object Arguments]"]=Mt["[object Array]"]=Mt["[object ArrayBuffer]"]=Mt["[object Boolean]"]=Mt["[object DataView]"]=Mt["[object Date]"]=Mt["[object Error]"]=Mt["[object Function]"]=Mt["[object Map]"]=Mt["[object Number]"]=Mt["[object Object]"]=Mt["[object RegExp]"]=Mt["[object Set]"]=Mt["[object String]"]=Mt["[object WeakMap]"]=false;
|
||||||
|
var zt={};zt["[object Arguments]"]=zt["[object Array]"]=zt["[object ArrayBuffer]"]=zt["[object DataView]"]=zt["[object Boolean]"]=zt["[object Date]"]=zt["[object Float32Array]"]=zt["[object Float64Array]"]=zt["[object Int8Array]"]=zt["[object Int16Array]"]=zt["[object Int32Array]"]=zt["[object Map]"]=zt["[object Number]"]=zt["[object Object]"]=zt["[object RegExp]"]=zt["[object Set]"]=zt["[object String]"]=zt["[object Symbol]"]=zt["[object Uint8Array]"]=zt["[object Uint8ClampedArray]"]=zt["[object Uint16Array]"]=zt["[object Uint32Array]"]=true,
|
||||||
|
zt["[object Error]"]=zt["[object Function]"]=zt["[object WeakMap]"]=false;var Ut={"\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"},Dt={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},$t={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Ft={"function":true,object:true},Nt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"
|
||||||
|
},Pt=parseFloat,Zt=parseInt,Tt=Ft[typeof exports]&&exports&&!exports.nodeType?exports:q,qt=Ft[typeof module]&&module&&!module.nodeType?module:q,Vt=qt&&qt.exports===Tt?Tt:q,Kt=S(Ft[typeof self]&&self),Gt=S(Ft[typeof window]&&window),Jt=S(Ft[typeof this]&&this),Yt=S(Tt&&qt&&typeof global=="object"&&global)||Gt!==(Jt&&Jt.window)&&Gt||Kt||Jt||Function("return this")(),Ht=T();(Gt||Kt||{})._=Ht,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){return Ht}):Tt&&qt?(Vt&&((qt.exports=Ht)._=Ht),
|
||||||
|
Tt._=Ht):Yt._=Ht}).call(this);
|
||||||
351
dist/mapping.fp.js
vendored
Normal file
351
dist/mapping.fp.js
vendored
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
(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',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
|
||||||
|
// Ramda aliases.
|
||||||
|
'__': 'placeholder',
|
||||||
|
'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',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'identical': 'eq',
|
||||||
|
'init': 'initial',
|
||||||
|
'invertObj': 'invert',
|
||||||
|
'juxt': 'over',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'prop': 'get',
|
||||||
|
'propEq': 'matchesProperty',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'whereEq': 'filter',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
||||||
|
'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
|
||||||
|
'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
|
||||||
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
|
'uniqueId', 'words'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
|
||||||
|
'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
||||||
|
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
||||||
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
|
||||||
|
'eq', 'every', 'filter', 'find', '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', 'minBy', 'multiply', 'nth',
|
||||||
|
'omit', 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
|
||||||
|
'partial', 'partialRight', 'partition', 'pick', 'pickBy', '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',
|
||||||
|
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'invokeArgs',
|
||||||
|
'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', 'mergeWith',
|
||||||
|
'orderBy', 'padChars', 'padCharsEnd', 'padCharsStart', 'pullAllBy',
|
||||||
|
'pullAllWith', '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,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastIndex': 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 = {
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'isEqualWith': [1, 2, 0],
|
||||||
|
'isMatchWith': [2, 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],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'invokeArgs': 2,
|
||||||
|
'invokeArgsMap': 2,
|
||||||
|
'partial': 1,
|
||||||
|
'partialRight': 1,
|
||||||
|
'without': 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 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,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'merge': 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 = {
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'getOr': 'get',
|
||||||
|
'invokeArgs': 'invoke',
|
||||||
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'padChars': 'pad',
|
||||||
|
'padCharsEnd': 'padEnd',
|
||||||
|
'padCharsStart': 'padStart',
|
||||||
|
'restFrom': 'rest',
|
||||||
|
'spreadFrom': 'spread',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip fixing their arity. */
|
||||||
|
exports.skipFixed = {
|
||||||
|
'castArray': true,
|
||||||
|
'flow': true,
|
||||||
|
'flowRight': true,
|
||||||
|
'iteratee': true,
|
||||||
|
'mixin': 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,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'without': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }
|
||||||
|
/******/ ])
|
||||||
|
});
|
||||||
|
;
|
||||||
11524
doc/README.md
11524
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.4.1</sup>',
|
|
||||||
'url' => 'https://github.com/bestiejs/lodash/blob/master/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;
|
|
||||||
|
|
||||||
?>
|
|
||||||
469
fp/_baseConvert.js
Normal file
469
fp/_baseConvert.js
Normal file
@@ -0,0 +1,469 @@
|
|||||||
|
var mapping = require('./_mapping'),
|
||||||
|
mutateMap = mapping.mutate,
|
||||||
|
fallbackHolder = require('./placeholder');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 immutWrap(func, cloner) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
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,
|
||||||
|
'spread': util.spread,
|
||||||
|
'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,
|
||||||
|
spread = helpers.spread,
|
||||||
|
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 methods = [],
|
||||||
|
methodNames = [];
|
||||||
|
|
||||||
|
each(keys(source), function(key) {
|
||||||
|
var value = source[key];
|
||||||
|
if (isFunction(value)) {
|
||||||
|
methodNames.push(key);
|
||||||
|
methods.push(func.prototype[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mixin(func, Object(source));
|
||||||
|
|
||||||
|
each(methodNames, function(methodName, index) {
|
||||||
|
var method = methods[index];
|
||||||
|
if (isFunction(method)) {
|
||||||
|
func.prototype[methodName] = method;
|
||||||
|
} else {
|
||||||
|
delete func.prototype[methodName];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'runInContext': function(runInContext) {
|
||||||
|
return function(context) {
|
||||||
|
return baseConvert(util, runInContext(context), options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,
|
||||||
|
result = clone(Object(object)),
|
||||||
|
nested = result;
|
||||||
|
|
||||||
|
while (nested != null && ++index < length) {
|
||||||
|
var key = path[index],
|
||||||
|
value = nested[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
nested[key] = clone(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 oldOptions = options;
|
||||||
|
return function(options) {
|
||||||
|
var newUtil = isLib ? pristine : helpers,
|
||||||
|
newFunc = isLib ? pristine[name] : func,
|
||||||
|
newOptions = assign(assign({}, oldOptions), options);
|
||||||
|
|
||||||
|
return baseConvert(newUtil, name, 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 passed
|
||||||
|
* thru `transform`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {...Function} transform The functions to transform the first argument.
|
||||||
|
* @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) {
|
||||||
|
name = mapping.aliasToReal[name] || name;
|
||||||
|
|
||||||
|
var result,
|
||||||
|
wrapped = func,
|
||||||
|
wrapper = wrappers[name];
|
||||||
|
|
||||||
|
if (wrapper) {
|
||||||
|
wrapped = wrapper(func);
|
||||||
|
}
|
||||||
|
else if (config.immutable) {
|
||||||
|
if (mutateMap.array[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneArray);
|
||||||
|
}
|
||||||
|
else if (mutateMap.object[name]) {
|
||||||
|
wrapped = immutWrap(func, createCloner(func));
|
||||||
|
}
|
||||||
|
else if (mutateMap.set[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneByPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
|
if (name == otherName) {
|
||||||
|
var aryN = !isLib && mapping.iterateeAry[name],
|
||||||
|
reargIndexes = mapping.iterateeRearg[name],
|
||||||
|
spreadStart = mapping.methodSpread[name];
|
||||||
|
|
||||||
|
result = wrapped;
|
||||||
|
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
||||||
|
result = spreadStart === undefined
|
||||||
|
? ary(result, aryKey)
|
||||||
|
: spread(result, spreadStart);
|
||||||
|
}
|
||||||
|
if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
|
||||||
|
result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
|
||||||
|
}
|
||||||
|
if (config.cap) {
|
||||||
|
if (reargIndexes) {
|
||||||
|
result = iterateeRearg(result, reargIndexes);
|
||||||
|
} else if (aryN) {
|
||||||
|
result = iterateeAry(result, aryN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (forceCurry || (config.curry && aryKey > 1)) {
|
||||||
|
forceCurry && console.log(forceCurry, name);
|
||||||
|
result = curry(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(name, func);
|
||||||
|
if (mapping.placeholder[name]) {
|
||||||
|
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') {
|
||||||
|
_ = browserConvert(_.runInContext());
|
||||||
|
}
|
||||||
|
module.exports = browserConvert;
|
||||||
289
fp/_mapping.js
Normal file
289
fp/_mapping.js
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
/** Used to map aliases to their real names. */
|
||||||
|
exports.aliasToReal = {
|
||||||
|
|
||||||
|
// Lodash aliases.
|
||||||
|
'each': 'forEach',
|
||||||
|
'eachRight': 'forEachRight',
|
||||||
|
'entries': 'toPairs',
|
||||||
|
'entriesIn': 'toPairsIn',
|
||||||
|
'extend': 'assignIn',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
|
||||||
|
// Ramda aliases.
|
||||||
|
'__': 'placeholder',
|
||||||
|
'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',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'identical': 'eq',
|
||||||
|
'init': 'initial',
|
||||||
|
'invertObj': 'invert',
|
||||||
|
'juxt': 'over',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'prop': 'get',
|
||||||
|
'propEq': 'matchesProperty',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'whereEq': 'filter',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
||||||
|
'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
|
||||||
|
'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
|
||||||
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
|
'uniqueId', 'words'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
|
||||||
|
'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
||||||
|
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
||||||
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
|
||||||
|
'eq', 'every', 'filter', 'find', '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', 'minBy', 'multiply', 'nth',
|
||||||
|
'omit', 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
|
||||||
|
'partial', 'partialRight', 'partition', 'pick', 'pickBy', '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',
|
||||||
|
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'invokeArgs',
|
||||||
|
'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', 'mergeWith',
|
||||||
|
'orderBy', 'padChars', 'padCharsEnd', 'padCharsStart', 'pullAllBy',
|
||||||
|
'pullAllWith', '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,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastIndex': 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 = {
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'isEqualWith': [1, 2, 0],
|
||||||
|
'isMatchWith': [2, 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],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'invokeArgs': 2,
|
||||||
|
'invokeArgsMap': 2,
|
||||||
|
'partial': 1,
|
||||||
|
'partialRight': 1,
|
||||||
|
'without': 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 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,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'merge': 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 = {
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'getOr': 'get',
|
||||||
|
'invokeArgs': 'invoke',
|
||||||
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'padChars': 'pad',
|
||||||
|
'padCharsEnd': 'padEnd',
|
||||||
|
'padCharsStart': 'padStart',
|
||||||
|
'restFrom': 'rest',
|
||||||
|
'spreadFrom': 'spread',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip fixing their arity. */
|
||||||
|
exports.skipFixed = {
|
||||||
|
'castArray': true,
|
||||||
|
'flow': true,
|
||||||
|
'flowRight': true,
|
||||||
|
'iteratee': true,
|
||||||
|
'mixin': 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,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'without': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': 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';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
glob = require('glob'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var 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 compiled template and base name 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), function(result, filePath) {
|
||||||
|
var 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': copy,
|
||||||
|
'globTemplate': globTemplate,
|
||||||
|
'min': min,
|
||||||
|
'write': write
|
||||||
|
};
|
||||||
9
lib/common/mapping.js
Normal file
9
lib/common/mapping.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _mapping = require('../../fp/_mapping'),
|
||||||
|
util = require('./util'),
|
||||||
|
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';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
uglify = require('uglify-js');
|
||||||
|
|
||||||
|
var 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`. For
|
||||||
|
* example, a `srcPath` of `path/to/foo.js` would have a `destPath` of `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');
|
||||||
|
}
|
||||||
|
var output = uglify.minify(srcPath, _.defaults(options || {}, uglifyOptions));
|
||||||
|
fs.writeFile(destPath, output.code, 'utf-8', callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = minify;
|
||||||
24
lib/common/uglify.options.js
Normal file
24
lib/common/uglify.options.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
'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': {
|
||||||
|
'pure_getters': true,
|
||||||
|
'unsafe': true,
|
||||||
|
'unsafe_comps': true,
|
||||||
|
'warnings': false
|
||||||
|
},
|
||||||
|
'mangle': {
|
||||||
|
'except': ['define']
|
||||||
|
},
|
||||||
|
'output': {
|
||||||
|
'ascii_only': true,
|
||||||
|
'comments': /^!|@cc_on|@license|@preserve/i,
|
||||||
|
'max_line_len': 500
|
||||||
|
}
|
||||||
|
};
|
||||||
27
lib/common/util.js
Normal file
27
lib/common/util.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a hash object. If a `properties` object is provided, its own
|
||||||
|
* enumerable properties are assigned to the created object.
|
||||||
|
*
|
||||||
|
* @memberOf util
|
||||||
|
* @param {Object} [properties] The properties to assign to the object.
|
||||||
|
* @returns {Object} Returns the new hash object.
|
||||||
|
*/
|
||||||
|
function Hash(properties) {
|
||||||
|
return _.transform(properties, function(result, value, key) {
|
||||||
|
result[key] = (_.isPlainObject(value) && !(value instanceof Hash))
|
||||||
|
? new Hash(value)
|
||||||
|
: value;
|
||||||
|
}, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hash.prototype = Object.create(null);
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
'Hash': Hash
|
||||||
|
};
|
||||||
55
lib/fp/build-dist.js
Normal file
55
lib/fp/build-dist.js
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
path = require('path'),
|
||||||
|
webpack = require('webpack');
|
||||||
|
|
||||||
|
var file = require('../common/file');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
distPath = path.join(basePath, 'dist'),
|
||||||
|
fpPath = path.join(basePath, 'fp'),
|
||||||
|
filename = 'lodash.fp.js';
|
||||||
|
|
||||||
|
var 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
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
var mappingConfig = {
|
||||||
|
'entry': path.join(fpPath, '_mapping.js'),
|
||||||
|
'output': {
|
||||||
|
'path': distPath,
|
||||||
|
'filename': 'mapping.fp.js',
|
||||||
|
'library': 'mapping',
|
||||||
|
'libraryTarget': 'umd'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
async.series([
|
||||||
|
_.partial(webpack, mappingConfig),
|
||||||
|
_.partial(webpack, fpConfig),
|
||||||
|
file.min(path.join(distPath, filename))
|
||||||
|
], onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
65
lib/fp/build-doc.js
Normal file
65
lib/fp/build-doc.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var file = require('../common/file'),
|
||||||
|
mapping = require('../common/mapping');
|
||||||
|
|
||||||
|
var templatePath = path.join(__dirname, 'template/doc'),
|
||||||
|
template = file.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
|
var argNames = ['a', 'b', 'c', 'd'];
|
||||||
|
|
||||||
|
var templateData = {
|
||||||
|
'mapping': mapping,
|
||||||
|
'toArgOrder': toArgOrder,
|
||||||
|
'toFuncList': toFuncList
|
||||||
|
};
|
||||||
|
|
||||||
|
function toArgOrder(array) {
|
||||||
|
var reordered = [];
|
||||||
|
_.each(array, function(newIndex, index) {
|
||||||
|
reordered[newIndex] = argNames[index];
|
||||||
|
});
|
||||||
|
return '`(' + reordered.join(', ') + ')`';
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFuncList(array) {
|
||||||
|
var chunks = _.chunk(array.slice().sort(), 5),
|
||||||
|
lastChunk = _.last(chunks),
|
||||||
|
last = lastChunk ? lastChunk.pop() : undefined;
|
||||||
|
|
||||||
|
chunks = _.reject(chunks, _.isEmpty);
|
||||||
|
lastChunk = _.last(chunks);
|
||||||
|
|
||||||
|
var result = '`' + _.map(chunks, function(chunk) {
|
||||||
|
return chunk.join('`, `') + '`';
|
||||||
|
}).join(',\n`');
|
||||||
|
|
||||||
|
if (last == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (_.size(chunks) > 1 || _.size(lastChunk) > 1) {
|
||||||
|
result += ',';
|
||||||
|
}
|
||||||
|
result += ' &';
|
||||||
|
result += _.size(lastChunk) < 5 ? ' ' : '\n';
|
||||||
|
return result + '`' + last + '`';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(target) {
|
||||||
|
target = path.resolve(target);
|
||||||
|
fs.writeFile(target, template.wiki(templateData), onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
120
lib/fp/build-modules.js
Normal file
120
lib/fp/build-modules.js
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
glob = require('glob'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var file = require('../common/file'),
|
||||||
|
mapping = require('../common/mapping');
|
||||||
|
|
||||||
|
var templatePath = path.join(__dirname, 'template/modules'),
|
||||||
|
template = file.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
|
var aryMethods = _.union(
|
||||||
|
mapping.aryMethod[1],
|
||||||
|
mapping.aryMethod[2],
|
||||||
|
mapping.aryMethod[3],
|
||||||
|
mapping.aryMethod[4]
|
||||||
|
);
|
||||||
|
|
||||||
|
var categories = [
|
||||||
|
'array',
|
||||||
|
'collection',
|
||||||
|
'date',
|
||||||
|
'function',
|
||||||
|
'lang',
|
||||||
|
'math',
|
||||||
|
'number',
|
||||||
|
'object',
|
||||||
|
'seq',
|
||||||
|
'string',
|
||||||
|
'util'
|
||||||
|
];
|
||||||
|
|
||||||
|
var ignored = [
|
||||||
|
'_*.js',
|
||||||
|
'core.js',
|
||||||
|
'core.min.js',
|
||||||
|
'fp.js',
|
||||||
|
'index.js',
|
||||||
|
'lodash.js',
|
||||||
|
'lodash.min.js'
|
||||||
|
];
|
||||||
|
|
||||||
|
function isAlias(funcName) {
|
||||||
|
return _.has(mapping.aliasToReal, funcName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isCategory(funcName) {
|
||||||
|
return _.includes(categories, funcName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isThru(funcName) {
|
||||||
|
return !_.includes(aryMethods, funcName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTemplate(moduleName) {
|
||||||
|
var data = {
|
||||||
|
'name': _.result(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(target) {
|
||||||
|
target = path.resolve(target);
|
||||||
|
|
||||||
|
var fpPath = path.join(target, 'fp');
|
||||||
|
|
||||||
|
// Glob existing lodash module paths.
|
||||||
|
var modulePaths = glob.sync(path.join(target, '*.js'), {
|
||||||
|
'nodir': true,
|
||||||
|
'ignore': ignored.map(function(filename) {
|
||||||
|
return path.join(target, filename);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add FP alias and remapped module paths.
|
||||||
|
_.each([mapping.aliasToReal, mapping.remap], function(data) {
|
||||||
|
_.forOwn(data, function(realName, alias) {
|
||||||
|
var modulePath = path.join(target, alias + '.js');
|
||||||
|
if (!_.includes(modulePaths, modulePath)) {
|
||||||
|
modulePaths.push(modulePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var actions = modulePaths.map(function(modulePath) {
|
||||||
|
var 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, onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
220
lib/fp/template/doc/wiki.jst
Normal file
220
lib/fp/template/doc/wiki.jst
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
## lodash/fp
|
||||||
|
|
||||||
|
The `lodash/fp` module is 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='path/to/lodash.js'></script>
|
||||||
|
<script src='path/to/lodash.fp.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 of arguments as their second parameter:<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), function(methodName) {
|
||||||
|
var 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(), function(alias) {
|
||||||
|
var 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());
|
||||||
|
```
|
||||||
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'),
|
||||||
|
'spread': require('../spread'),
|
||||||
|
'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('../<%= _.result(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('../<%= _.result(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';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var file = require('../common/file');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
distPath = path.join(basePath, 'dist'),
|
||||||
|
filename = 'lodash.js';
|
||||||
|
|
||||||
|
var baseLodash = path.join(basePath, filename),
|
||||||
|
distLodash = path.join(distPath, filename);
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
async.series([
|
||||||
|
file.copy(baseLodash, distLodash),
|
||||||
|
file.min(distLodash)
|
||||||
|
], onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
60
lib/main/build-doc.js
Normal file
60
lib/main/build-doc.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
docdown = require('docdown'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
docPath = path.join(basePath, 'doc'),
|
||||||
|
readmePath = path.join(docPath, 'README.md');
|
||||||
|
|
||||||
|
var pkg = require('../../package.json'),
|
||||||
|
version = pkg.version;
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
'base': {
|
||||||
|
'entryLinks': [
|
||||||
|
'<% if (name == "templateSettings" || !/^(?:methods|properties|seq)$/i.test(category)) {' +
|
||||||
|
'print("[Ⓝ](https://www.npmjs.com/package/lodash." + name.toLowerCase() + " \\"See the npm package\\")")' +
|
||||||
|
'} %>'
|
||||||
|
],
|
||||||
|
'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': {
|
||||||
|
'hash': 'github'
|
||||||
|
},
|
||||||
|
'site': {
|
||||||
|
'tocLink': '#docs'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function postprocess(string) {
|
||||||
|
// Fix docdown bugs.
|
||||||
|
return string
|
||||||
|
// Repair the default value of `chars`.
|
||||||
|
// See https://github.com/eslint/doctrine/issues/157 for more details.
|
||||||
|
.replace(/\bchars=''/g, "chars=' '")
|
||||||
|
// Wrap symbol property identifiers in brackets.
|
||||||
|
.replace(/\.(Symbol\.(?:[a-z]+[A-Z]?)+)/g, '[$1]');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(type) {
|
||||||
|
var options = _.defaults({}, config.base, config[type]),
|
||||||
|
markdown = docdown(options);
|
||||||
|
|
||||||
|
fs.writeFile(readmePath, postprocess(markdown), onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
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';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var file = require('../common/file');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
distPath = path.join(basePath, 'dist');
|
||||||
|
|
||||||
|
var 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']
|
||||||
|
];
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(target) {
|
||||||
|
var actions = _.map(filePairs, function(pair) {
|
||||||
|
return file.copy(pair[0], path.join(target, pair[1]));
|
||||||
|
});
|
||||||
|
|
||||||
|
async.series(actions, onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
35
lodash.min.js
vendored
35
lodash.min.js
vendored
@@ -1,35 +0,0 @@
|
|||||||
/*!
|
|
||||||
Lo-Dash 0.4.1 lodash.com/license
|
|
||||||
Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE
|
|
||||||
*/
|
|
||||||
;(function(e,t){"use strict";function s(e){return new o(e)}function o(e){if(e&&e._wrapped)return e;this._wrapped=e}function u(){for(var e,t,n,s=-1,o=arguments.length,u={e:"",f:"",j:"",q:"",c:{d:""},n:{d:""}};++s<o;)for(t in e=arguments[s],e)n=(n=e[t])==r?"":n,/d|i/.test(t)?("string"==typeof n&&(n={b:n,m:n}),u.c[t]=n.b,u.n[t]=n.m):u[t]=n;e=u.a,t=/^[^,]+/.exec(e)[0],u.l=u.l||t,u.g=t,u.h=vt,u.k=bt,u.p=$,u.r=u.r!==i,"o"in u||(u.o=gt),u.f||(u.f="if(!"+t+")return A");if("f"!=t||!u.c.i)u.c=r;t="var A",u.
|
|
||||||
j&&(t+="="+u.j),t+=";"+u.f+";"+u.q+";var l,n="+u.l+";",u.c&&(t+="var p=n.length;l=-1;",u.n&&(t+="if(p===p>>>0){"),u.o&&(t+="if(I.call(n)==F){n=n.split('')}"),t+=u.c.d+";while(++l<p){"+u.c.i+"}",u.n&&(t+="}"));if(u.n){u.c&&(t+="else{"),u.h||(t+="var B=typeof n=='function'&&z.call(n,'prototype');"),u.k&&u.r?t+="var x=r(n),w=-1,p=x.length;"+u.n.d+";while(++w<p){l=x[w];if(!(B&&l=='prototype')){"+u.n.i+"}}":(t+=u.n.d+";for(l in n){",u.h?(u.r&&(t+="if(j.call(n,l)){"),t+=u.n.i+";",u.r&&(t+="}")):(t+="if(!(B&&l=='prototype')"
|
|
||||||
,u.r&&(t+="&&j.call(n,l)"),t+="){"+u.n.i+"}"),t+="}");if(u.h){t+="var h=n.constructor;";for(n=0;7>n;n++)t+="l='"+u.p[n]+"';if(","constructor"==u.p[n]&&(t+="!(h&&h.prototype===n)&&"),t+="j.call(n,l)){"+u.n.i+"}"}u.c&&(t+="}")}return t+=u.e+";return A",Function("c,g,i,j,k,o,u,r,z,C,F,I",'"use strict";return function('+e+"){"+t+"}")(ot,a,ft,G,k,h,Et,st,Z,et,ht,tt)}function a(e,n){return e=e.a,n=n.a,e===t?1:n===t?-1:e<n?-1:e>n?1:0}function f(e,t){return K[t]}function l(e){return"\\"+St[e]}function c(
|
|
||||||
e){return wt[e]}function h(e,t){return function(n,r,i){return e.call(t,n,r,i)}}function p(){}function d(e,t){if(F.test(t))return"<e%-"+t+"%>";var n=K.length;return K[n]="'+__e("+t+")+'",J+n}function v(e,t,n,r){return e=K.length,t?K[e]="';"+t+";__p+='":n?K[e]="'+__e("+n+")+'":r&&(K[e]="'+((__t=("+r+"))==null?'':__t)+'"),J+e}function m(e,t){if(F.test(t))return"<e%="+t+"%>";var n=K.length;return K[n]="'+((__t=("+t+"))==null?'':__t)+'",J+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){var o=gt&&tt.call(e)==ht?e.split(""):e;for(i&&s&&(n=o[--i]);i--;)n=t(n,o[i],i,e);return n}o=Gt(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,t,n){if(e)return t==r||n?e[0]:et.call(e,0,t)}function b(e,t){var n=[];if(!e)return n;for(var r,i=-1,s=e.length;++i<s;)r=e[i],Kt(r)?Y.apply(n,t?r:b(r)):n.push(r);return n}function w(e,t,n){if(!e)return-1;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=r;if(!e)return i;var s=-1,o=e.length;if(!t){for(;++s<o;)e[s]>i&&(i=e[s]);return i}for(n&&(t=h(t,n));++s<o;)n=t(e[s],s,e),n>r&&(r=n,i=e[s]);return i}function S(e,t,n){return e?et.call(e,t==r||n?1:t):[]}function x(e,t,n,r){if(!e)return 0;var i=0,s=e.length;if(n){r&&(n=N(n,r));for(t=n(t);i<s;)r=i+s>>>1,n(e[r])<t?i=r+1:s=r}else for(;i<s;)r=i+s>>>1,e[r]<t?i=r+1:s=r;return i}function T(e,t,n,r){var s=
|
|
||||||
[];if(!e)return s;var o=-1,u=e.length,a=[];"function"==typeof t&&(r=n,n=t,t=i);for(n?r&&(n=h(n,r)):n=k;++o<u;)if(r=n(e[o],o,e),t?!o||a[a.length-1]!==r:0>w(a,r))a.push(r),s.push(e[o]);return s}function N(e,t){function n(){var o=arguments,u=t;return i||(e=t[r]),s.length&&(o=o.length?Q.apply(s,o):s),this instanceof n?(p.prototype=e.prototype,u=new p,(o=e.apply(u,o))&&Et[typeof o]?o:u):e.apply(u,o)}var r,i=tt.call(e)==ft;if(i){if(yt||nt&&2<arguments.length)return nt.call.apply(nt,arguments)}else r=t,
|
|
||||||
t=e;var s=et.call(arguments,2);return n}function C(e,t,s){s||(s=[]);if(e===t)return 0!==e||1/e==1/t;if(e==r||t==r)return e===t;e._chain&&(e=e._wrapped),t._chain&&(t=t._wrapped);if(e.isEqual&&tt.call(e.isEqual)==ft)return e.isEqual(t);if(t.isEqual&&tt.call(t.isEqual)==ft)return t.isEqual(e);var o=tt.call(e);if(o!=tt.call(t))return i;switch(o){case ht:return e==""+t;case lt:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case ut:case at:return+e==+t;case ct:return e.source==t.source&&e.global==t.global&&e.multiline==
|
|
||||||
t.multiline&&e.ignoreCase==t.ignoreCase}if("object"!=typeof e||"object"!=typeof t)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==ot){if(f=e.length,a=f==t.length)for(;f--&&(a=C(e[f],t[f],s)););}else{if("constructor"in e!="constructor"in t||e.constructor!=t.constructor)return i;for(var l in e)if(G.call(e,l)&&(f++,!(a=G.call(t,l)&&C(e[l],t[l],s))))break;if(a){for(l in t)if(G.call(t,l)&&!(f--))break;a=!f}if(a&&vt)for(;7>++u&&(l=$[u],!G.call(e,l)||!!(a=G.call(t,l
|
|
||||||
)&&C(e[l],t[l],s))););}return s.pop(),a}function k(e){return e}function L(e){Ht(Jt(e),function(t){var r=s[t]=e[t];o.prototype[t]=function(){var e=[this._wrapped];return arguments.length&&Y.apply(e,arguments),e=r.apply(s,e),this._chain&&(e=new o(e),e._chain=n),e}})}var n=!0,r=null,i=!1,A,O,M,_,D="object"==typeof exports&&exports&&("object"==typeof global&&global&&global==global.global&&(e=global),exports),P=Array.prototype,H=Object.prototype,B=0,j=e._,F=/[-+=!~*%&^<>|{(\/]|\[\D|\b(?:delete|in|instanceof|new|typeof|void)\b/
|
|
||||||
,I=/\b__p\+='';/g,q=/\b(__p\+=)''\+/g,R=/(__e\(.*?\)|\b__t\))\+'';/g,U=/(?:__e|__t=)\(\s*(?![\d\s"']|this\.)/g,z=RegExp("^"+(H.valueOf+"").replace(/[.*+?^=!:${}()|[\]\/\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),W=/__token__(\d+)/g,X=/[&<"']/g,V=/['\n\r\t\u2028\u2029\\]/g,$="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),J="__token__",K=[],Q=P.concat,G=H.hasOwnProperty,Y=P.push,Z=H.propertyIsEnumerable,et=P.slice,tt=H.toString
|
|
||||||
,nt=z.test(nt=et.bind)&&nt,rt=z.test(rt=Array.isArray)&&rt,it=e.isFinite,st=z.test(st=Object.keys)&&st,ot="[object Array]",ut="[object Boolean]",at="[object Date]",ft="[object Function]",lt="[object Number]",ct="[object RegExp]",ht="[object String]",pt=e.clearTimeout,dt=e.setTimeout,vt=!Z.call({valueOf:0},"valueOf"),mt="x"!=et.call("x")[0],gt="xx"!="x"[0]+Object("x")[0],yt=nt&&/\n|Opera/.test(nt+tt.call(e.opera)),bt=st&&/^.+$|true/.test(st+!!e.attachEvent),wt={"&":"&","<":"<",'"':""","'"
|
|
||||||
:"'"},Et={"boolean":i,"function":n,object:n,number:i,string:i,"undefined":i},St={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"};s.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:"obj"};var xt={a:"f,d,H",j:"f",q:"if(!d){d=k}else if(H)d=o(d,H)",i:"d(n[l],l,f)"},Tt={j:"true",i:"if(!d(n[l],l,f))return!A"},Nt={a:"t",j:"t",q:"for(var D,E=1,p=arguments.length;E<p;E++){D=arguments[E];"+(vt?"if(D){":""),l:"D"
|
|
||||||
,r:i,i:"A[l]=n[l]",e:(vt?"}":"")+"}"},Ct={j:"[]",i:"d(n[l],l,f)&&A.push(n[l])"},kt={q:"if(H)d=o(d,H)"},Lt={i:{m:xt.i}},At={j:"",f:"if(!f)return[]",d:{b:"A=Array(p)",m:"A="+(bt?"Array(p)":"[]")},i:{b:"A[l]=d(n[l],l,f)",m:"A"+(bt?"[w]=":".push")+"(d(n[l],l,f))"}},Ot=u({a:"t",f:"if(!(t&&u[typeof t]))throw TypeError()",j:"[]",i:"A.push(l)"}),Mt=u({a:"f,G",j:"false",o:i,d:{b:"if(I.call(n)==F)return f.indexOf(G)>-1"},i:"if(n[l]===G)return true"}),_t=u(xt,Tt),Dt=u(xt,Ct),Pt=u(xt,kt,{j:"",i:"if(d(n[l],l,f))return n[l]"
|
|
||||||
}),Ht=u(xt,kt),Bt=u(xt,{j:"{}",q:"var v,m=typeof d=='function';if(m&&H)d=o(d,H)",i:"v=m?d(n[l],l,f):n[l][d];(j.call(A,v)?A[v]:A[v]=[]).push(n[l])"}),jt=u(At,{a:"f,q",q:"var b=C.call(arguments,2),m=typeof q=='function'",i:{b:"A[l]=(m?q:n[l][q]).apply(n[l],b)",m:"A"+(bt?"[w]=":".push")+"((m?q:n[l][q]).apply(n[l],b))"}}),Ft=u(xt,At),It=u(At,{a:"f,y",i:{b:"A[l]=n[l][y]",m:"A"+(bt?"[w]=":".push")+"(n[l][y])"}}),qt=u({a:"f,d,a,H",j:"a",q:"var s=arguments.length<3;if(H)d=o(d,H)",d:{b:"if(s)A=f[++l]"},i:
|
|
||||||
{b:"A=d(A,n[l],l,f)",m:"A=s?(s=false,n[l]):d(A,n[l],l,f)"}}),Rt=u(xt,Ct,{i:"!"+Ct.i}),Ut=u(xt,Tt,{j:"false",i:Tt.i.replace("!","")}),zt=u(xt,At,{q:"if(typeof d=='string'){var v=d;d=function(f){return f[v]}}else if(H)d=o(d,H)",i:{b:"A[l]={a:d(n[l],l,f),b:n[l]}",m:"A"+(bt?"[w]=":".push")+"({a:d(n[l],l,f),b:n[l]})"},e:"A.sort(g);p=A.length;while(p--){A[p]=A[p].b}"}),Wt=u(Nt,{i:"if(A[l]==null)"+Nt.i}),Xt=u(Nt),Vt=u(xt,kt,Lt,{r:i}),$t=u(xt,kt,Lt),Jt=u({a:"t",j:"[]",r:i,i:"if(I.call(n[l])==i)A.push(l)"
|
|
||||||
,e:"A.sort()"});Ht({Arguments:"[object Arguments]",Date:at,Function:ft,Number:lt,RegExp:ct,String:ht},function(e,t){s["is"+t]=function(t){return tt.call(t)==e}}),s.isArguments(arguments)||(s.isArguments=function(e){return!!e&&!!G.call(e,"callee")});var Kt=rt||function(e){return tt.call(e)==ot},Qt=u({a:"J",j:"true",q:"var e=I.call(J);if(e==c||e==F)return!J.length",i:{m:"return false"}}),Gt=st?function(e){return"function"==typeof e&&Z.call(e,"prototype")?Ot(e):st(e)}:Ot,Yt=u({a:"t",j:"[]",i:"A.push(n[l])"
|
|
||||||
});s.VERSION="0.4.1",s.after=function(e,t){return 1>e?t():function(){if(1>--e)return t.apply(this,arguments)}},s.bind=N,s.bindAll=function(e){var t=arguments,n=1;1==t.length&&(n=0,t=Jt(e));for(var r=t.length;n<r;n++)e[t[n]]=N(e[t[n]],e);return e},s.chain=function(e){return e=new o(e),e._chain=n,e},s.clone=function(e){return e&&Et[typeof e]?Kt(e)?e.slice():Xt({},e):e},s.compact=function(e){var t=[];if(!e)return t;for(var n=-1,r=e.length;++n<r;)e[n]&&t.push(e[n]);return t},s.compose=function(){var e=
|
|
||||||
arguments;return function(){for(var t=arguments,n=e.length;n--;)t=[e[n].apply(this,t)];return t[0]}},s.contains=Mt,s.debounce=function(e,t,n){function i(){a=r,n||e.apply(u,s)}var s,o,u,a;return function(){var r=n&&!a;return s=arguments,u=this,pt(a),a=dt(i,t),r&&(o=e.apply(u,s)),o}},s.defaults=Wt,s.defer=function(e){var n=et.call(arguments,1);return dt(function(){return e.apply(t,n)},1)},s.delay=function(e,n){var r=et.call(arguments,2);return dt(function(){return e.apply(t,r)},n)},s.difference=function(
|
|
||||||
e){var t=[];if(!e)return t;for(var n=-1,r=e.length,i=Q.apply(t,arguments);++n<r;)0>w(i,e[n],r)&&t.push(e[n]);return t},s.escape=function(e){return e==r?"":(e+"").replace(X,c)},s.every=_t,s.extend=Xt,s.filter=Dt,s.find=Pt,s.first=y,s.flatten=b,s.forEach=Ht,s.forIn=Vt,s.forOwn=$t,s.functions=Jt,s.groupBy=Bt,s.has=function(e,t){return G.call(e,t)},s.identity=k,s.indexOf=w,s.initial=function(e,t,n){return e?et.call(e,0,-(t==r||n?1:t)):[]},s.intersection=function(e){var t=[];if(!e)return t;for(var n,r=-1
|
|
||||||
,i=e.length,s=et.call(arguments,1);++r<i;)n=e[r],0>w(t,n)&&_t(s,function(e){return-1<w(e,n)})&&t.push(n);return t},s.invoke=jt,s.isArray=Kt,s.isBoolean=function(e){return e===n||e===i||tt.call(e)==ut},s.isElement=function(e){return!!e&&1==e.nodeType},s.isEmpty=Qt,s.isEqual=C,s.isFinite=function(e){return it(e)&&tt.call(e)==lt},s.isNaN=function(e){return tt.call(e)==lt&&e!=+e},s.isNull=function(e){return e===r},s.isObject=function(e){return e&&Et[typeof e]},s.isUndefined=function(e){return e===t},
|
|
||||||
s.keys=Gt,s.last=function(e,t,n){if(e){var i=e.length;return t==r||n?e[i-1]:et.call(e,-t||i)}},s.lastIndexOf=function(e,t,n){if(!e)return-1;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},s.map=Ft,s.max=E,s.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return G.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},s.min=function(e,t,n){var r=Infinity,i=r;if(!e)return i;var s=-1,o=e.length
|
|
||||||
;if(!t){for(;++s<o;)e[s]<i&&(i=e[s]);return i}for(n&&(t=h(t,n));++s<o;)n=t(e[s],s,e),n<r&&(r=n,i=e[s]);return i},s.mixin=L,s.noConflict=function(){return e._=j,this},s.once=function(e){var t,r=i;return function(){return r?t:(r=n,t=e.apply(this,arguments))}},s.partial=function(e){var t=et.call(arguments,1),n=t.length;return function(){var r;return r=arguments,r.length&&(t.length=n,Y.apply(t,r)),r=1==t.length?e.call(this,t[0]):e.apply(this,t),t.length=n,r}},s.pick=function(e){for(var t,n=0,r=Q.apply
|
|
||||||
(P,arguments),i=r.length,s={};++n<i;)t=r[n],t in e&&(s[t]=e[t]);return s},s.pluck=It,s.range=function(e,t,n){n||(n=1),t==r&&(t=e||0,e=0);for(var i=-1,t=Math.max(0,Math.ceil((t-e)/n)),s=Array(t);++i<t;)s[i]=e,e+=n;return s},s.reduce=qt,s.reduceRight=g,s.reject=Rt,s.rest=S,s.result=function(e,t){if(!e)return r;var n=e[t];return tt.call(n)==ft?e[t]():n},s.shuffle=function(e){if(!e)return[];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},s.size=
|
|
||||||
function(e){if(!e)return 0;var t=e.length;return t===t>>>0?e.length:Gt(e).length},s.some=Ut,s.sortBy=zt,s.sortedIndex=x,s.tap=function(e,t){return t(e),e},s.template=function(e,t,n){n||(n={});var i,o;i=n.escape;var u=n.evaluate,a=n.interpolate,c=s.templateSettings,n=n.variable;i==r&&(i=c.escape),u==r&&(u=c.evaluate),a==r&&(a=c.interpolate),i&&(e=e.replace(i,d)),a&&(e=e.replace(a,m)),u!=A&&(A=u,_=RegExp((u?u.source:"($^)")+"|<e%-([\\s\\S]+?)%>|<e%=([\\s\\S]+?)%>","g")),i=K.length,e=e.replace(_,v),
|
|
||||||
i=i!=K.length,e="__p += '"+e.replace(V,l).replace(W,f)+"';",K.length=0,n||(n=c.variable||O||"obj",i?e="with("+n+"){"+e+"}":(n!=O&&(O=n,M=RegExp("(\\(\\s*)"+n+"\\."+n+"\\b","g")),e=e.replace(U,"$&"+n+".").replace(M,"$1__d"))),e=(i?e.replace(I,""):e).replace(q,"$1").replace(R,"$1;"),e="function("+n+"){"+n+"||("+n+"={});var __t,__p='',__e=_.escape"+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":",__d="+n+"."+n+"||"+n+";")+e+"return __p}";try{o=Function("_","return "+e)(
|
|
||||||
s)}catch(h){o=function(){throw h}}return t?o(t):(o.source=e,o)},s.throttle=function(e,t){function n(){a=new Date,u=r,e.apply(o,i)}var i,s,o,u,a=0;return function(){var r=new Date,f=t-(r-a);return i=arguments,o=this,0>=f?(a=r,s=e.apply(o,i)):u||(u=dt(n,f)),s}},s.times=function(e,t,n){var r=-1;if(n)for(;++r<e;)t.call(n,r);else for(;++r<e;)t(r)},s.toArray=function(e){if(!e)return[];if(e.toArray&&tt.call(e.toArray)==ft)return e.toArray();var t=e.length;return t===t>>>0?(mt?tt.call(e)==ht:"string"==typeof
|
|
||||||
e)?e.split(""):et.call(e):Yt(e)},s.union=function(){for(var e=-1,t=[],n=Q.apply(t,arguments),r=n.length;++e<r;)0>w(t,n[e])&&t.push(n[e]);return t},s.uniq=T,s.uniqueId=function(e){var t=B++;return e?e+t:t},s.values=Yt,s.without=function(e){var t=[];if(!e)return t;for(var n=-1,r=e.length;++n<r;)0>w(arguments,e[n],1)&&t.push(e[n]);return t},s.wrap=function(e,t){return function(){var n=[e];return arguments.length&&Y.apply(n,arguments),t.apply(this,n)}},s.zip=function(e){if(!e)return[];for(var t=-1,n=
|
|
||||||
E(It(arguments,"length")),r=Array(n);++t<n;)r[t]=It(arguments,t);return r},s.zipObject=function(e,t){if(!e)return{};var n=-1,r=e.length,i={};for(t||(t=[]);++n<r;)i[e[n]]=t[n];return i},s.all=_t,s.any=Ut,s.collect=Ft,s.detect=Pt,s.each=Ht,s.foldl=qt,s.foldr=g,s.head=y,s.include=Mt,s.inject=qt,s.methods=Jt,s.select=Dt,s.tail=S,s.take=y,s.unique=T,o.prototype=s.prototype,L(s),o.prototype.chain=function(){return this._chain=n,this},o.prototype.value=function(){return this._wrapped},Ht("pop push reverse shift sort splice unshift"
|
|
||||||
.split(" "),function(e){var t=P[e];o.prototype[e]=function(){var e=this._wrapped;return t.apply(e,arguments),e.length===0&&delete e[0],this._chain&&(e=new o(e),e._chain=n),e}}),Ht(["concat","join","slice"],function(e){var t=P[e];o.prototype[e]=function(){var e=t.apply(this._wrapped,arguments);return this._chain&&(e=new o(e),e._chain=n),e}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(e._=s,define(function(){return s})):D?"object"==typeof module&&module&&module.s==D?(module
|
|
||||||
.s=s)._=s:D._=s:e._=s})(this);
|
|
||||||
89
package.json
89
package.json
@@ -1,49 +1,52 @@
|
|||||||
{
|
{
|
||||||
"name": "lodash",
|
"name": "lodash",
|
||||||
"version": "0.4.1",
|
"version": "4.11.0",
|
||||||
"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": [
|
"devDependencies": {
|
||||||
"browser",
|
"async": "^1.5.2",
|
||||||
"client",
|
"benchmark": "^2.1.0",
|
||||||
"functional",
|
"chalk": "^1.1.3",
|
||||||
"performance",
|
"codecov.io": "~0.1.6",
|
||||||
"server",
|
"coveralls": "^2.11.9",
|
||||||
"speed",
|
"curl-amd": "~0.8.12",
|
||||||
"util"
|
"docdown": "~0.5.1",
|
||||||
],
|
"dojo": "^1.11.1",
|
||||||
"licenses": [
|
"ecstatic": "^1.4.0",
|
||||||
{
|
"fs-extra": "~0.26.7",
|
||||||
"type": "MIT",
|
"glob": "^7.0.3",
|
||||||
"url": "http://lodash.com/license"
|
"istanbul": "0.4.3",
|
||||||
}
|
"jquery": "^2.2.3",
|
||||||
],
|
"jscs": "^2.11.0",
|
||||||
"author": {
|
"lodash": "4.10.0",
|
||||||
"name": "John-David Dalton",
|
"platform": "^1.3.1",
|
||||||
"email": "john@fusejs.com",
|
"qunit-extras": "^1.5.0",
|
||||||
"web": "http://allyoucanleet.com/"
|
"qunitjs": "~1.23.1",
|
||||||
|
"request": "^2.69.0",
|
||||||
|
"requirejs": "^2.2.0",
|
||||||
|
"sauce-tunnel": "^2.4.0",
|
||||||
|
"uglify-js": "2.6.2",
|
||||||
|
"webpack": "^1.12.15"
|
||||||
},
|
},
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/bestiejs/lodash/issues"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/bestiejs/lodash.git"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"lodash": "./build.js"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"doc": "./doc",
|
|
||||||
"test": "./test"
|
|
||||||
},
|
|
||||||
"engines": [
|
|
||||||
"node",
|
|
||||||
"rhino"
|
|
||||||
],
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node build",
|
"build": "npm run build:main && npm run build:fp",
|
||||||
"test": "node test/test"
|
"build:fp": "node lib/fp/build-dist.js",
|
||||||
|
"build:fp-modules": "node lib/fp/build-modules.js",
|
||||||
|
"build:main": "node lib/main/build-dist.js",
|
||||||
|
"build:main-modules": "node lib/main/build-modules.js",
|
||||||
|
"doc": "node lib/main/build-doc github",
|
||||||
|
"doc:fp": "node lib/fp/build-doc",
|
||||||
|
"doc:site": "node lib/main/build-doc site",
|
||||||
|
"pretest": "npm run build",
|
||||||
|
"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",
|
||||||
|
"style:perf": "jscs perf/*.js perf/**/*.js",
|
||||||
|
"style:test": "jscs test/*.js test/**/*.js",
|
||||||
|
"test": "npm run test:main && npm run test:fp",
|
||||||
|
"test:fp": "node test/test-fp",
|
||||||
|
"test:main": "node test/test",
|
||||||
|
"validate": "npm run style && npm run test"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
131
perf/asset/perf-ui.js
Normal file
131
perf/asset/perf-ui.js
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
;(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 = {};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers an event listener on an element.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Element} element The element.
|
||||||
|
* @param {string} eventName The name of the event.
|
||||||
|
* @param {Function} handler The event handler.
|
||||||
|
* @returns {Element} The element.
|
||||||
|
*/
|
||||||
|
function addListener(element, eventName, handler) {
|
||||||
|
if (typeof element.addEventListener != 'undefined') {
|
||||||
|
element.addEventListener(eventName, handler, false);
|
||||||
|
} else if (typeof element.attachEvent != 'undefined') {
|
||||||
|
element.attachEvent('on' + eventName, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Initialize controls.
|
||||||
|
addListener(window, '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</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;
|
||||||
|
}());
|
||||||
|
|
||||||
|
addListener(buildList, 'change', eventHandler);
|
||||||
|
addListener(otherList, '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,68 @@
|
|||||||
<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: 2em;
|
||||||
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 0 0.5em 2em;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<script src="../lodash.min.js"></script>
|
<div id="perf-toolbar"></div>
|
||||||
|
<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>
|
||||||
|
|||||||
2257
perf/perf.js
2257
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
|
|
||||||
170
test/asset/test-ui.js
Normal file
170
test/asset/test-ui.js
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
;(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 = {};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers an event listener on an element.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Element} element The element.
|
||||||
|
* @param {string} eventName The name of the event.
|
||||||
|
* @param {Function} handler The event handler.
|
||||||
|
* @returns {Element} The element.
|
||||||
|
*/
|
||||||
|
function addListener(element, eventName, handler) {
|
||||||
|
if (typeof element.addEventListener != 'undefined') {
|
||||||
|
element.addEventListener(eventName, handler, false);
|
||||||
|
} else if (typeof element.attachEvent != 'undefined') {
|
||||||
|
element.attachEvent('on' + eventName, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Initialize controls.
|
||||||
|
addListener(window, '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.appendChild(span1);
|
||||||
|
toolbar.appendChild(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;
|
||||||
|
}());
|
||||||
|
|
||||||
|
addListener(buildList, 'change', eventHandler);
|
||||||
|
addListener(loaderList, 'change', eventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
var span1 = document.createElement('span');
|
||||||
|
span1.style.cssText = 'float:right';
|
||||||
|
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.style.cssText = 'float:right';
|
||||||
|
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>';
|
||||||
|
|
||||||
|
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));
|
||||||
15
test/asset/worker.js
Normal file
15
test/asset/worker.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
@@ -3,39 +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>
|
|
||||||
<h1 id="qunit-header"><a href="#">Backbone Speed Suite</a></h1>
|
|
||||||
<div id="qunit-fixture">
|
|
||||||
<div id='testElement'>
|
|
||||||
<h1>Test</h1>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="../vendor/backbone/test/vendor/json2.js"></script>
|
|
||||||
<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 src="test-ui.js"></script>
|
|
||||||
<script>
|
<script>
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/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/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>
|
||||||
|
QUnit.config.asyncRetries = 10;
|
||||||
|
QUnit.config.hidepassed = true;
|
||||||
|
|
||||||
|
var mixinPrereqs = (function() {
|
||||||
|
var aliasToReal = {
|
||||||
|
'indexBy': 'keyBy',
|
||||||
|
'invoke': 'invokeMap'
|
||||||
|
};
|
||||||
|
|
||||||
|
var keyMap = {
|
||||||
|
'rest': 'tail'
|
||||||
|
};
|
||||||
|
|
||||||
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
|
return function(_) {
|
||||||
|
lodash.defaultsDeep(_, { 'templateSettings': lodash.templateSettings });
|
||||||
|
lodash.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(_))));
|
||||||
|
|
||||||
|
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];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
// 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'
|
||||||
|
], function() {
|
||||||
|
QUnit.start();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}());
|
||||||
</script>
|
</script>
|
||||||
<script src="../vendor/backbone/backbone.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>
|
|
||||||
</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>
|
||||||
365
test/index.html
365
test/index.html
@@ -2,63 +2,350 @@
|
|||||||
<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>
|
||||||
<div id="qunit"></div>
|
|
||||||
<script src="../vendor/qunit/qunit/qunit.js"></script>
|
|
||||||
<script src="test-ui.js"></script>
|
|
||||||
<script>
|
<script>
|
||||||
// set a bad shim
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
Object._keys = Object.keys;
|
if (location.port == '9001') {
|
||||||
Object.keys = function() { return []; };
|
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="exports"></div>
|
||||||
|
<div id="module"></div>
|
||||||
|
<script>
|
||||||
|
function setProperty(object, key, value) {
|
||||||
|
try {
|
||||||
|
Object.defineProperty(object, key, {
|
||||||
|
'configurable': true,
|
||||||
|
'enumerable': false,
|
||||||
|
'writable': true,
|
||||||
|
'value': value
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
object[key] = value;
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
// load Lo-Dash and expose it to the bad `Object.keys` shim
|
function addBizarroMethods() {
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/script>');
|
var funcProto = Function.prototype,
|
||||||
|
objectProto = Object.prototype;
|
||||||
|
|
||||||
|
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', (function() {
|
||||||
|
function object() {}
|
||||||
|
return function(prototype) {
|
||||||
|
if (prototype === Object(prototype)) {
|
||||||
|
object.prototype = prototype;
|
||||||
|
var result = new object;
|
||||||
|
object.prototype = undefined;
|
||||||
|
}
|
||||||
|
return result || {};
|
||||||
|
};
|
||||||
|
}()));
|
||||||
|
|
||||||
|
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>
|
||||||
<script>
|
<script>
|
||||||
// store Lo-Dash to test for bad shim detection
|
// Store lodash to test for bad extensions/shims.
|
||||||
var lodashBadShim = _;
|
if (!ui.isModularize) {
|
||||||
|
var lodashBizarro = window._;
|
||||||
// restore nativeKeys
|
window._ = undefined;
|
||||||
Object.keys = Object._keys;
|
removeBizarroMethods();
|
||||||
delete Object._keys;
|
}
|
||||||
|
// Load test scripts.
|
||||||
// set to test `_.noConflict`
|
document.write((ui.isForeign || ui.urlParams.loader == 'none')
|
||||||
_ = 1;
|
? '<script src="' + ui.buildPath + '"><\/script><script src="test.js"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
// load Lo-Dash again to overwrite the existing `_` value
|
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/script>');
|
|
||||||
|
|
||||||
// load test.js if not using require.js
|
|
||||||
document.write(QUnit.urlParams.norequire
|
|
||||||
? '<script src="test.js"><\/script>'
|
|
||||||
: '<script src="../vendor/requirejs/require.js"><\/script>'
|
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
// load Lo-Dash as a module
|
|
||||||
var lodashModule,
|
var lodashModule,
|
||||||
|
shimmedModule,
|
||||||
underscoreModule;
|
underscoreModule;
|
||||||
|
|
||||||
window.require && require({
|
(function() {
|
||||||
'baseUrl': '../vendor/requirejs/',
|
if (window.curl) {
|
||||||
'urlArgs': 't=' + (+new Date),
|
curl.config({ 'apiName': 'require' });
|
||||||
'paths': {
|
|
||||||
'lodash': '../../' + QUnit.config.lodashFilename,
|
|
||||||
'underscore': './../../' + QUnit.config.lodashFilename
|
|
||||||
}
|
}
|
||||||
},
|
if (ui.isForeign || !window.require) {
|
||||||
['lodash', 'underscore'], function(lodash, underscore) {
|
return;
|
||||||
lodashModule = lodash.noConflict();
|
}
|
||||||
|
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';
|
lodashModule.moduleName = 'lodash';
|
||||||
|
|
||||||
underscoreModule = underscore.noConflict();
|
if (shimmed) {
|
||||||
|
shimmedModule = shimmed.result(shimmed, 'noConflict') || shimmed;
|
||||||
|
shimmedModule.moduleName = 'shimmed';
|
||||||
|
}
|
||||||
|
if (underscore) {
|
||||||
|
underscoreModule = underscore.result(underscore, 'noConflict') || underscore;
|
||||||
underscoreModule.moduleName = 'underscore';
|
underscoreModule.moduleName = 'underscore';
|
||||||
|
}
|
||||||
|
window._ = lodash;
|
||||||
|
|
||||||
require(['test.js']);
|
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
|
|
||||||
922
test/saucelabs.js
Normal file
922
test/saucelabs.js
Normal file
@@ -0,0 +1,922 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** Environment shortcut. */
|
||||||
|
var env = process.env;
|
||||||
|
|
||||||
|
if (env.TRAVIS_SECURE_ENV_VARS == 'false') {
|
||||||
|
console.log('Skipping Sauce Labs jobs; secure environment variables are unavailable');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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', '49'],
|
||||||
|
['Windows 10', 'chrome', '48'],
|
||||||
|
['Windows 10', 'firefox', '45'],
|
||||||
|
['Windows 10', 'firefox', '44'],
|
||||||
|
['Windows 10', 'microsoftedge', '13'],
|
||||||
|
['Windows 10', 'internet explorer', '11'],
|
||||||
|
['Windows 8', 'internet explorer', '10'],
|
||||||
|
['Windows 7', 'internet explorer', '9'],
|
||||||
|
// ['OS X 10.10', 'ipad', '9.1'],
|
||||||
|
['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] || capitalizeWords(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capitalizes the first character of each word in `string`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string to augment.
|
||||||
|
* @returns {string} Returns the augmented string.
|
||||||
|
*/
|
||||||
|
function capitalizeWords(string) {
|
||||||
|
return _.map(string.split(' '), _.capitalize).join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 = _.result(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 = _.result(res, 'statusCode'),
|
||||||
|
taskId = _.first(_.result(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 = _.result(body, 'completed', false),
|
||||||
|
data = _.first(_.result(body, 'js tests')),
|
||||||
|
elapsed = (_.now() - this.timestamp) / 1000,
|
||||||
|
jobId = _.result(data, 'job_id', null),
|
||||||
|
jobResult = _.result(data, 'result', null),
|
||||||
|
jobStatus = _.result(data, 'status', ''),
|
||||||
|
jobUrl = _.result(data, 'url', null),
|
||||||
|
expired = (elapsed >= queueTimeout && !_.includes(jobStatus, 'in progress')),
|
||||||
|
options = this.options,
|
||||||
|
platform = options.platforms[0];
|
||||||
|
|
||||||
|
if (_.isObject(jobResult)) {
|
||||||
|
var message = _.result(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 ' + capitalizeWords(platform[0]),
|
||||||
|
errored = !jobResult || !jobResult.passed || reError.test(message) || reError.test(jobStatus),
|
||||||
|
failures = _.result(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 (typeof 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 ' + capitalizeWords(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 jobs = this.jobs,
|
||||||
|
active = jobs.active,
|
||||||
|
queue = jobs.queue,
|
||||||
|
throttled = this.throttled;
|
||||||
|
|
||||||
|
while (queue.length && (active.length < throttled)) {
|
||||||
|
active.push(queue.shift().start());
|
||||||
|
}
|
||||||
|
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);
|
||||||
1774
test/test-fp.js
Normal file
1774
test/test-fp.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,90 +0,0 @@
|
|||||||
;(function(window) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** `QUnit.addEvent` shortcut */
|
|
||||||
var addEvent = QUnit.addEvent;
|
|
||||||
|
|
||||||
/** The Lo-Dash build to load */
|
|
||||||
var build = (/build=([^&]+)/.exec(location.search) || [])[1];
|
|
||||||
|
|
||||||
/** A flag to determine if RequireJS should be loaded */
|
|
||||||
var norequire = /[?&]norequire=true(?:&|$)/.test(location.search);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// assign `QUnit.config` properties
|
|
||||||
QUnit.config.lodashFilename = (function() {
|
|
||||||
switch (build) {
|
|
||||||
case 'prod': return 'lodash.min';
|
|
||||||
case 'custom': return 'lodash.custom.min';
|
|
||||||
case 'custom-debug': return 'lodash.custom';
|
|
||||||
}
|
|
||||||
return 'lodash';
|
|
||||||
}());
|
|
||||||
|
|
||||||
// assign `QUnit.urlParams` properties
|
|
||||||
QUnit.extend(QUnit.urlParams, {
|
|
||||||
'build': build,
|
|
||||||
'norequire': norequire
|
|
||||||
});
|
|
||||||
|
|
||||||
// initialize the build dropdown
|
|
||||||
addEvent(window, 'load', function() {
|
|
||||||
function eventHandler(event) {
|
|
||||||
var search = location.search.replace(/^\?|&?(?:build|norequire)=[^&]*&?/g, '');
|
|
||||||
if (event.stopPropagation) {
|
|
||||||
event.stopPropagation();
|
|
||||||
} else {
|
|
||||||
event.cancelBubble = true;
|
|
||||||
}
|
|
||||||
location.href =
|
|
||||||
location.href.split('?')[0] + '?' +
|
|
||||||
(search ? search + '&' : '') + 'build=' +
|
|
||||||
dropdown[dropdown.selectedIndex].value +
|
|
||||||
(checkbox.checked ? '&norequire=true' : '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
var header = document.getElementById('qunit-header');
|
|
||||||
if (header) {
|
|
||||||
header.appendChild(label1);
|
|
||||||
header.appendChild(label2);
|
|
||||||
|
|
||||||
dropdown.selectedIndex = (function() {
|
|
||||||
switch (build) {
|
|
||||||
case 'prod': return 1;
|
|
||||||
case 'custom': return 2;
|
|
||||||
case 'custom-debug': return 3;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}());
|
|
||||||
|
|
||||||
checkbox.checked = norequire;
|
|
||||||
addEvent(checkbox, 'click', eventHandler);
|
|
||||||
addEvent(dropdown, 'change', eventHandler);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setTimeout(init, 15);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var label1 = document.createElement('label');
|
|
||||||
label1.innerHTML =
|
|
||||||
'<input name="norequire" type="checkbox">norequire</label>';
|
|
||||||
|
|
||||||
var label2 = document.createElement('label');
|
|
||||||
label2.innerHTML =
|
|
||||||
'<select name="build">' +
|
|
||||||
'<option value="dev">developement</option>' +
|
|
||||||
'<option value="prod">production</option>' +
|
|
||||||
'<option value="custom">custom</option>' +
|
|
||||||
'<option value="custom-debug">custom (debug)</option>' +
|
|
||||||
'</select>build';
|
|
||||||
|
|
||||||
var checkbox = label1.firstChild,
|
|
||||||
dropdown = label2.firstChild;
|
|
||||||
|
|
||||||
init();
|
|
||||||
});
|
|
||||||
|
|
||||||
}(this));
|
|
||||||
25923
test/test.js
25923
test/test.js
File diff suppressed because it is too large
Load Diff
@@ -3,40 +3,482 @@
|
|||||||
<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">
|
|
||||||
<div id="map-test">
|
|
||||||
<div id="id1"></div>
|
|
||||||
<div id="id2"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="../vendor/backbone/test/vendor/json2.js"></script>
|
|
||||||
<script src="../vendor/underscore/test/vendor/jquery.js"></script>
|
|
||||||
<script src="../vendor/underscore/test/vendor/qunit.js"></script>
|
|
||||||
<script src="../vendor/underscore/test/vendor/jslitmus.js"></script>
|
|
||||||
<script src="test-ui.js"></script>
|
|
||||||
<script>
|
<script>
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/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>
|
||||||
<script src="../vendor/underscore/test/collections.js"></script>
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
<script src="../vendor/underscore/test/arrays.js"></script>
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
<script src="../vendor/underscore/test/functions.js"></script>
|
<script src="../node_modules/jquery/dist/jquery.js"></script>
|
||||||
<script src="../vendor/underscore/test/objects.js"></script>
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
<script src="../vendor/underscore/test/utility.js"></script>
|
<script src="./asset/test-ui.js"></script>
|
||||||
<script src="../vendor/underscore/test/chaining.js"></script>
|
<script src="../lodash.js"></script>
|
||||||
<script type="text/html" id="template">
|
<script>
|
||||||
<%
|
QUnit.config.asyncRetries = 10;
|
||||||
// a comment
|
QUnit.config.hidepassed = true;
|
||||||
if (data) { data += 12345; }; %>
|
QUnit.config.excused = {
|
||||||
<li><%= data %></li>
|
'Arrays': {
|
||||||
|
'chunk': [
|
||||||
|
'defaults to empty array (chunk size 0)'
|
||||||
|
],
|
||||||
|
'difference': [
|
||||||
|
'can perform an OO-style difference'
|
||||||
|
],
|
||||||
|
'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'
|
||||||
|
],
|
||||||
|
'head': [
|
||||||
|
'is an alias for first'
|
||||||
|
],
|
||||||
|
'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'
|
||||||
|
],
|
||||||
|
'range': [
|
||||||
|
'range with two arguments a & b, b<a generates an empty array'
|
||||||
|
],
|
||||||
|
'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': [
|
||||||
|
'true'
|
||||||
|
],
|
||||||
|
'each': [
|
||||||
|
'context object property accessed'
|
||||||
|
],
|
||||||
|
'every': [
|
||||||
|
'Can be called with object',
|
||||||
|
'Died on test #15',
|
||||||
|
'context works'
|
||||||
|
],
|
||||||
|
'filter': [
|
||||||
|
'given context',
|
||||||
|
'[{"a":1,"b":2},{"a":1,"b":3},{"a":1,"b":4}]',
|
||||||
|
'[{"a":1,"b":2},{"a":2,"b":2}]',
|
||||||
|
'Empty object accepts all items',
|
||||||
|
'OO-filter'
|
||||||
|
],
|
||||||
|
'find': [
|
||||||
|
'{"a":1,"b":4}',
|
||||||
|
'undefined when not found',
|
||||||
|
'undefined when searching empty list',
|
||||||
|
'works on objects',
|
||||||
|
'undefined',
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'findWhere': [
|
||||||
|
'checks properties given function'
|
||||||
|
],
|
||||||
|
'groupBy': [
|
||||||
|
'true'
|
||||||
|
],
|
||||||
|
'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',
|
||||||
|
'function(a){[code]}'
|
||||||
|
],
|
||||||
|
'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>',
|
||||||
|
'<span id="id1"></span>'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Functions': {
|
||||||
|
'debounce asap': true,
|
||||||
|
'debounce asap cancel': true,
|
||||||
|
'debounce after system time is set backwards': true,
|
||||||
|
'debounce asap recursively': 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': [
|
||||||
|
'stores a memo to the last value',
|
||||||
|
'provides context'
|
||||||
|
],
|
||||||
|
'bind': [
|
||||||
|
'Died on test #2'
|
||||||
|
],
|
||||||
|
'bindAll': [
|
||||||
|
'throws an error for bindAll with no functions named'
|
||||||
|
],
|
||||||
|
'memoize': [
|
||||||
|
'{"bar":"BAR","foo":"FOO"}',
|
||||||
|
'Died on test #8'
|
||||||
|
],
|
||||||
|
'partial':[
|
||||||
|
'can partially apply with placeholders',
|
||||||
|
'accepts more arguments than the number of placeholders',
|
||||||
|
'accepts fewer arguments than the number of placeholders',
|
||||||
|
'unfilled placeholders are undefined',
|
||||||
|
'keeps prototype',
|
||||||
|
'allows the placeholder to be swapped out'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'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',
|
||||||
|
'[]'
|
||||||
|
],
|
||||||
|
'defaults': [
|
||||||
|
'defaults skips nulls',
|
||||||
|
'defaults skips undefined'
|
||||||
|
],
|
||||||
|
'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`',
|
||||||
|
'false'
|
||||||
|
],
|
||||||
|
'isFinite': [
|
||||||
|
'Numeric strings are numbers',
|
||||||
|
'Number instances can be finite'
|
||||||
|
],
|
||||||
|
'isMatch': [
|
||||||
|
'doesnt falsey match constructor on undefined/null'
|
||||||
|
],
|
||||||
|
'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'
|
||||||
|
],
|
||||||
|
'matcher': [
|
||||||
|
'null matches null',
|
||||||
|
'treats primitives as empty'
|
||||||
|
],
|
||||||
|
'omit': [
|
||||||
|
'can accept a predicate',
|
||||||
|
'function is given context'
|
||||||
|
],
|
||||||
|
'pick': [
|
||||||
|
'can accept a predicate and context',
|
||||||
|
'function is given context'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Utility': {
|
||||||
|
'noConflict (node vm)': true,
|
||||||
|
'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 });
|
||||||
|
lodash.mixin(_, lodash.pick(lodash, lodash.difference(lodash.functions(lodash), lodash.functions(_))));
|
||||||
|
|
||||||
|
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];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
require(getConfig(), [moduleId], function(lodash) {
|
||||||
|
mixinPrereqs(lodash);
|
||||||
|
require(getConfig(), [
|
||||||
|
'test/collections',
|
||||||
|
'test/arrays',
|
||||||
|
'test/functions',
|
||||||
|
'test/objects',
|
||||||
|
'test/cross-document',
|
||||||
|
'test/utility',
|
||||||
|
'test/chaining'
|
||||||
|
], function() {
|
||||||
|
QUnit.start();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}());
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
2
vendor/backbone/LICENSE
vendored
2
vendor/backbone/LICENSE
vendored
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010-2012 Jeremy Ashkenas, DocumentCloud
|
Copyright (c) 2010-2016 Jeremy Ashkenas, DocumentCloud
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
|||||||
26
vendor/backbone/README.md
vendored
26
vendor/backbone/README.md
vendored
@@ -1,26 +0,0 @@
|
|||||||
____ __ __
|
|
||||||
/\ _`\ /\ \ /\ \ __
|
|
||||||
\ \ \ \ \ __ ___\ \ \/'\\ \ \____ ___ ___ __ /\_\ ____
|
|
||||||
\ \ _ <' /'__`\ /'___\ \ , < \ \ '__`\ / __`\ /' _ `\ /'__`\ \/\ \ /',__\
|
|
||||||
\ \ \ \ \/\ \ \.\_/\ \__/\ \ \\`\\ \ \ \ \/\ \ \ \/\ \/\ \/\ __/ __ \ \ \/\__, `\
|
|
||||||
\ \____/\ \__/.\_\ \____\\ \_\ \_\ \_,__/\ \____/\ \_\ \_\ \____\/\_\_\ \ \/\____/
|
|
||||||
\/___/ \/__/\/_/\/____/ \/_/\/_/\/___/ \/___/ \/_/\/_/\/____/\/_/\ \_\ \/___/
|
|
||||||
\ \____/
|
|
||||||
\/___/
|
|
||||||
(_'_______________________________________________________________________________'_)
|
|
||||||
(_.———————————————————————————————————————————————————————————————————————————————._)
|
|
||||||
|
|
||||||
|
|
||||||
Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.
|
|
||||||
|
|
||||||
For Docs, License, Tests, pre-packed downloads, and everything else, really, see:
|
|
||||||
http://backbonejs.org
|
|
||||||
|
|
||||||
To suggest a feature, report a bug, or general discussion:
|
|
||||||
http://github.com/documentcloud/backbone/issues/
|
|
||||||
|
|
||||||
All contributors are listed here:
|
|
||||||
http://github.com/documentcloud/backbone/contributors
|
|
||||||
|
|
||||||
Special thanks to Robert Kieffer for the original philosophy behind Backbone.
|
|
||||||
http://github.com/broofa
|
|
||||||
2357
vendor/backbone/backbone.js
vendored
2357
vendor/backbone/backbone.js
vendored
File diff suppressed because it is too large
Load Diff
2111
vendor/backbone/test/collection.js
vendored
2111
vendor/backbone/test/collection.js
vendored
File diff suppressed because it is too large
Load Diff
679
vendor/backbone/test/events.js
vendored
679
vendor/backbone/test/events.js
vendored
@@ -1,79 +1,394 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
module("Backbone.Events");
|
QUnit.module('Backbone.Events');
|
||||||
|
|
||||||
test("Events: on and trigger", 2, function() {
|
QUnit.test('on and trigger', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(2);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
obj.on('event', function() { obj.counter += 1; });
|
obj.on('event', function() { obj.counter += 1; });
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter,1,'counter should be incremented.');
|
assert.equal(obj.counter, 1, 'counter should be incremented.');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 5, 'counter should be incremented five times.');
|
assert.equal(obj.counter, 5, 'counter should be incremented five times.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: binding and triggering multiple events", 4, function() {
|
QUnit.test('binding and triggering multiple events', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(4);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
obj.on('a b c', function() { obj.counter += 1; });
|
obj.on('a b c', function() { obj.counter += 1; });
|
||||||
|
|
||||||
obj.trigger('a');
|
obj.trigger('a');
|
||||||
equal(obj.counter, 1);
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
obj.trigger('a b');
|
obj.trigger('a b');
|
||||||
equal(obj.counter, 3);
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
obj.trigger('c');
|
obj.trigger('c');
|
||||||
equal(obj.counter, 4);
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
obj.off('a c');
|
obj.off('a c');
|
||||||
obj.trigger('a b c');
|
obj.trigger('a b c');
|
||||||
equal(obj.counter, 5);
|
assert.equal(obj.counter, 5);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: trigger all for each event", 3, function() {
|
QUnit.test('binding and triggering with event maps', function(assert) {
|
||||||
var a, b, obj = { counter: 0 };
|
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);
|
_.extend(obj, Backbone.Events);
|
||||||
obj.on('all', function(event) {
|
obj.on('all', function(event) {
|
||||||
obj.counter++;
|
obj.counter++;
|
||||||
if (event == 'a') a = true;
|
if (event === 'a') a = true;
|
||||||
if (event == 'b') b = true;
|
if (event === 'b') b = true;
|
||||||
})
|
})
|
||||||
.trigger('a b');
|
.trigger('a b');
|
||||||
ok(a);
|
assert.ok(a);
|
||||||
ok(b);
|
assert.ok(b);
|
||||||
equal(obj.counter, 2);
|
assert.equal(obj.counter, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: on, then unbind all functions", 1, function() {
|
QUnit.test('on, then unbind all functions', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(1);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
var callback = function() { obj.counter += 1; };
|
var callback = function() { obj.counter += 1; };
|
||||||
obj.on('event', callback);
|
obj.on('event', callback);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.off('event');
|
obj.off('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 1, 'counter should have only been incremented once.');
|
assert.equal(obj.counter, 1, 'counter should have only been incremented once.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: bind two callbacks, unbind only one", 2, function() {
|
QUnit.test('bind two callbacks, unbind only one', function(assert) {
|
||||||
var obj = { counterA: 0, counterB: 0 };
|
assert.expect(2);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
var callback = function() { obj.counterA += 1; };
|
var callback = function() { obj.counterA += 1; };
|
||||||
obj.on('event', callback);
|
obj.on('event', callback);
|
||||||
obj.on('event', function() { obj.counterB += 1; });
|
obj.on('event', function() { obj.counterB += 1; });
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.off('event', callback);
|
obj.off('event', callback);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
equal(obj.counterB, 2, 'counterB should have been incremented twice.');
|
assert.equal(obj.counterB, 2, 'counterB should have been incremented twice.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: unbind a callback in the midst of it firing", 1, function() {
|
QUnit.test('unbind a callback in the midst of it firing', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
var obj = {counter: 0};
|
var obj = {counter: 0};
|
||||||
_.extend(obj, Backbone.Events);
|
_.extend(obj, Backbone.Events);
|
||||||
var callback = function() {
|
var callback = function() {
|
||||||
@@ -84,12 +399,13 @@ $(document).ready(function() {
|
|||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 1, 'the callback should have been unbound.');
|
assert.equal(obj.counter, 1, 'the callback should have been unbound.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: two binds that unbind themeselves", 2, function() {
|
QUnit.test('two binds that unbind themeselves', function(assert) {
|
||||||
var obj = { counterA: 0, counterB: 0 };
|
assert.expect(2);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
var incrA = function(){ obj.counterA += 1; obj.off('event', incrA); };
|
var incrA = function(){ obj.counterA += 1; obj.off('event', incrA); };
|
||||||
var incrB = function(){ obj.counterB += 1; obj.off('event', incrB); };
|
var incrB = function(){ obj.counterB += 1; obj.off('event', incrB); };
|
||||||
obj.on('event', incrA);
|
obj.on('event', incrA);
|
||||||
@@ -97,49 +413,64 @@ $(document).ready(function() {
|
|||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: bind a callback with a supplied context", 1, function () {
|
QUnit.test('bind a callback with a default context when none supplied', function(assert) {
|
||||||
var TestClass = function () {
|
assert.expect(1);
|
||||||
return this;
|
var obj = _.extend({
|
||||||
};
|
assertTrue: function() {
|
||||||
TestClass.prototype.assertTrue = function () {
|
assert.equal(this, obj, '`this` was bound to the callback');
|
||||||
ok(true, '`this` was bound to the callback');
|
}
|
||||||
};
|
}, Backbone.Events);
|
||||||
|
|
||||||
var obj = _.extend({},Backbone.Events);
|
obj.once('event', obj.assertTrue);
|
||||||
obj.on('event', function () { this.assertTrue(); }, (new TestClass));
|
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: nested trigger with unbind", 1, function () {
|
QUnit.test('bind a callback with a supplied context', function(assert) {
|
||||||
var obj = { counter: 0 };
|
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);
|
_.extend(obj, Backbone.Events);
|
||||||
var incr1 = function(){ obj.counter += 1; obj.off('event', incr1); obj.trigger('event'); };
|
var incr1 = function(){ obj.counter += 1; obj.off('event', incr1); obj.trigger('event'); };
|
||||||
var incr2 = function(){ obj.counter += 1; };
|
var incr2 = function(){ obj.counter += 1; };
|
||||||
obj.on('event', incr1);
|
obj.on('event', incr1);
|
||||||
obj.on('event', incr2);
|
obj.on('event', incr2);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 3, 'counter should have been incremented three times');
|
assert.equal(obj.counter, 3, 'counter should have been incremented three times');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: callback list is not altered during trigger", 2, function () {
|
QUnit.test('callback list is not altered during trigger', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var counter = 0, obj = _.extend({}, Backbone.Events);
|
var counter = 0, obj = _.extend({}, Backbone.Events);
|
||||||
var incr = function(){ counter++; };
|
var incr = function(){ counter++; };
|
||||||
obj.on('event', function(){ obj.on('event', incr).on('all', incr); })
|
var incrOn = function(){ obj.on('event all', incr); };
|
||||||
.trigger('event');
|
var incrOff = function(){ obj.off('event all', incr); };
|
||||||
equal(counter, 0, 'bind does not alter callback list');
|
|
||||||
obj.off()
|
obj.on('event all', incrOn).trigger('event');
|
||||||
.on('event', function(){ obj.off('event', incr).off('all', incr); })
|
assert.equal(counter, 0, 'on does not alter callback list');
|
||||||
.on('event', incr)
|
|
||||||
.on('all', incr)
|
obj.off().on('event', incrOff).on('event all', incr).trigger('event');
|
||||||
.trigger('event');
|
assert.equal(counter, 2, 'off does not alter callback list');
|
||||||
equal(counter, 2, 'unbind does not alter callback list');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1282 - 'all' callback list is retrieved after each event.", 1, function() {
|
QUnit.test("#1282 - 'all' callback list is retrieved after each event.", function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
var incr = function(){ counter++; };
|
var incr = function(){ counter++; };
|
||||||
@@ -147,49 +478,229 @@ $(document).ready(function() {
|
|||||||
obj.on('y', incr).on('all', incr);
|
obj.on('y', incr).on('all', incr);
|
||||||
})
|
})
|
||||||
.trigger('x y');
|
.trigger('x y');
|
||||||
strictEqual(counter, 2);
|
assert.strictEqual(counter, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("if no callback is provided, `on` is a noop", 0, function() {
|
QUnit.test('if no callback is provided, `on` is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
_.extend({}, Backbone.Events).on('test').trigger('test');
|
_.extend({}, Backbone.Events).on('test').trigger('test');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("remove all events for a specific context", 4, function() {
|
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);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
obj.on('x y all', function() { ok(true); });
|
obj.on('x y all', function() { assert.ok(true); });
|
||||||
obj.on('x y all', function() { ok(false); }, obj);
|
obj.on('x y all', function() { assert.ok(false); }, obj);
|
||||||
obj.off(null, null, obj);
|
obj.off(null, null, obj);
|
||||||
obj.trigger('x y');
|
obj.trigger('x y');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("remove all events for a specific callback", 4, function() {
|
QUnit.test('remove all events for a specific callback', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
var success = function() { ok(true); };
|
var success = function() { assert.ok(true); };
|
||||||
var fail = function() { ok(false); };
|
var fail = function() { assert.ok(false); };
|
||||||
obj.on('x y all', success);
|
obj.on('x y all', success);
|
||||||
obj.on('x y all', fail);
|
obj.on('x y all', fail);
|
||||||
obj.off(null, fail);
|
obj.off(null, fail);
|
||||||
obj.trigger('x y');
|
obj.trigger('x y');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("off is chainable", 3, function() {
|
QUnit.test('#1310 - off does not skip consecutive events', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
// With no events
|
obj.on('event', function() { assert.ok(false); }, obj);
|
||||||
ok(obj.off() === obj);
|
obj.on('event', function() { assert.ok(false); }, obj);
|
||||||
// When removing all events
|
|
||||||
obj.on('event', function(){}, obj);
|
|
||||||
ok(obj.off() === obj);
|
|
||||||
// When removing some events
|
|
||||||
obj.on('event', function(){}, obj);
|
|
||||||
ok(obj.off('event') === obj);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("#1310 - off does not skip consecutive events", 0, function() {
|
|
||||||
var obj = _.extend({}, Backbone.Events);
|
|
||||||
obj.on('event', function() { ok(false); }, obj);
|
|
||||||
obj.on('event', function() { ok(false); }, obj);
|
|
||||||
obj.off(null, null, obj);
|
obj.off(null, null, obj);
|
||||||
obj.trigger('event');
|
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);
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
1397
vendor/backbone/test/model.js
vendored
1397
vendor/backbone/test/model.js
vendored
File diff suppressed because it is too large
Load Diff
13
vendor/backbone/test/noconflict.js
vendored
13
vendor/backbone/test/noconflict.js
vendored
@@ -1,12 +1,13 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
module("Backbone.noConflict");
|
QUnit.module('Backbone.noConflict');
|
||||||
|
|
||||||
test('Backbone.noConflict', 2, function() {
|
QUnit.test('noConflict', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var noconflictBackbone = Backbone.noConflict();
|
var noconflictBackbone = Backbone.noConflict();
|
||||||
equal(window.Backbone, undefined, 'Returned window.Backbone');
|
assert.equal(window.Backbone, undefined, 'Returned window.Backbone');
|
||||||
window.Backbone = noconflictBackbone;
|
window.Backbone = noconflictBackbone;
|
||||||
equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
assert.equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
})();
|
||||||
|
|||||||
953
vendor/backbone/test/router.js
vendored
953
vendor/backbone/test/router.js
vendored
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() {
|
||||||
|
|
||||||
|
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;
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
275
vendor/backbone/test/sync.js
vendored
275
vendor/backbone/test/sync.js
vendored
@@ -1,160 +1,239 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
var ajax = Backbone.ajax;
|
|
||||||
var lastRequest = null;
|
|
||||||
|
|
||||||
var Library = Backbone.Collection.extend({
|
var Library = Backbone.Collection.extend({
|
||||||
url : function() { return '/library'; }
|
url: function() { return '/library'; }
|
||||||
});
|
});
|
||||||
var library;
|
var library;
|
||||||
|
|
||||||
var attrs = {
|
var attrs = {
|
||||||
title : "The Tempest",
|
title: 'The Tempest',
|
||||||
author : "Bill Shakespeare",
|
author: 'Bill Shakespeare',
|
||||||
length : 123
|
length: 123
|
||||||
};
|
};
|
||||||
|
|
||||||
module("Backbone.sync", {
|
QUnit.module('Backbone.sync', {
|
||||||
|
|
||||||
setup : function() {
|
beforeEach: function(assert) {
|
||||||
library = new Library();
|
library = new Library;
|
||||||
Backbone.ajax = function(obj) {
|
|
||||||
lastRequest = obj;
|
|
||||||
};
|
|
||||||
library.create(attrs, {wait: false});
|
library.create(attrs, {wait: false});
|
||||||
},
|
},
|
||||||
|
|
||||||
teardown: function() {
|
afterEach: function(assert) {
|
||||||
Backbone.ajax = ajax;
|
Backbone.emulateHTTP = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: read", 4, function() {
|
QUnit.test('read', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
library.fetch();
|
library.fetch();
|
||||||
equal(lastRequest.url, '/library');
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
equal(lastRequest.type, 'GET');
|
assert.equal(this.ajaxSettings.type, 'GET');
|
||||||
equal(lastRequest.dataType, 'json');
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
ok(_.isEmpty(lastRequest.data));
|
assert.ok(_.isEmpty(this.ajaxSettings.data));
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: passing data", 3, function() {
|
QUnit.test('passing data', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.fetch({data: {a: 'a', one: 1}});
|
library.fetch({data: {a: 'a', one: 1}});
|
||||||
equal(lastRequest.url, '/library');
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
equal(lastRequest.data.a, 'a');
|
assert.equal(this.ajaxSettings.data.a, 'a');
|
||||||
equal(lastRequest.data.one, 1);
|
assert.equal(this.ajaxSettings.data.one, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: create", 6, function() {
|
QUnit.test('create', function(assert) {
|
||||||
equal(lastRequest.url, '/library');
|
assert.expect(6);
|
||||||
equal(lastRequest.type, 'POST');
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
equal(lastRequest.dataType, 'json');
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
var data = JSON.parse(lastRequest.data);
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
equal(data.title, 'The Tempest');
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
equal(data.author, 'Bill Shakespeare');
|
assert.equal(data.title, 'The Tempest');
|
||||||
equal(data.length, 123);
|
assert.equal(data.author, 'Bill Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update", 7, function() {
|
QUnit.test('update', function(assert) {
|
||||||
|
assert.expect(7);
|
||||||
library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
|
library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
|
||||||
equal(lastRequest.url, '/library/1-the-tempest');
|
assert.equal(this.ajaxSettings.url, '/library/1-the-tempest');
|
||||||
equal(lastRequest.type, 'PUT');
|
assert.equal(this.ajaxSettings.type, 'PUT');
|
||||||
equal(lastRequest.dataType, 'json');
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
var data = JSON.parse(lastRequest.data);
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
equal(data.id, '1-the-tempest');
|
assert.equal(data.id, '1-the-tempest');
|
||||||
equal(data.title, 'The Tempest');
|
assert.equal(data.title, 'The Tempest');
|
||||||
equal(data.author, 'William Shakespeare');
|
assert.equal(data.author, 'William Shakespeare');
|
||||||
equal(data.length, 123);
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update with emulateHTTP and emulateJSON", 7, function() {
|
QUnit.test('update with emulateHTTP and emulateJSON', function(assert) {
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = true;
|
assert.expect(7);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateHTTP: true,
|
||||||
equal(lastRequest.type, 'POST');
|
emulateJSON: true
|
||||||
equal(lastRequest.dataType, 'json');
|
});
|
||||||
equal(lastRequest.data._method, 'PUT');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
var data = JSON.parse(lastRequest.data.model);
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
equal(data.id, '2-the-tempest');
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
equal(data.author, 'Tim Shakespeare');
|
assert.equal(this.ajaxSettings.data._method, 'PUT');
|
||||||
equal(data.length, 123);
|
var data = JSON.parse(this.ajaxSettings.data.model);
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = false;
|
assert.equal(data.id, '2-the-tempest');
|
||||||
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update with just emulateHTTP", 6, function() {
|
QUnit.test('update with just emulateHTTP', function(assert) {
|
||||||
Backbone.emulateHTTP = true;
|
assert.expect(6);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateHTTP: true
|
||||||
equal(lastRequest.type, 'POST');
|
});
|
||||||
equal(lastRequest.contentType, 'application/json');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
var data = JSON.parse(lastRequest.data);
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
equal(data.id, '2-the-tempest');
|
assert.equal(this.ajaxSettings.contentType, 'application/json');
|
||||||
equal(data.author, 'Tim Shakespeare');
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
equal(data.length, 123);
|
assert.equal(data.id, '2-the-tempest');
|
||||||
Backbone.emulateHTTP = false;
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update with just emulateJSON", 6, function() {
|
QUnit.test('update with just emulateJSON', function(assert) {
|
||||||
Backbone.emulateJSON = true;
|
assert.expect(6);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateJSON: true
|
||||||
equal(lastRequest.type, 'PUT');
|
});
|
||||||
equal(lastRequest.contentType, 'application/x-www-form-urlencoded');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
var data = JSON.parse(lastRequest.data.model);
|
assert.equal(this.ajaxSettings.type, 'PUT');
|
||||||
equal(data.id, '2-the-tempest');
|
assert.equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded');
|
||||||
equal(data.author, 'Tim Shakespeare');
|
var data = JSON.parse(this.ajaxSettings.data.model);
|
||||||
equal(data.length, 123);
|
assert.equal(data.id, '2-the-tempest');
|
||||||
Backbone.emulateJSON = false;
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: read model", 3, function() {
|
QUnit.test('read model', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
library.first().fetch();
|
library.first().fetch();
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
equal(lastRequest.type, 'GET');
|
assert.equal(this.ajaxSettings.type, 'GET');
|
||||||
ok(_.isEmpty(lastRequest.data));
|
assert.ok(_.isEmpty(this.ajaxSettings.data));
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: destroy", 3, function() {
|
QUnit.test('destroy', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
library.first().destroy({wait: true});
|
library.first().destroy({wait: true});
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
equal(lastRequest.type, 'DELETE');
|
assert.equal(this.ajaxSettings.type, 'DELETE');
|
||||||
equal(lastRequest.data, null);
|
assert.equal(this.ajaxSettings.data, null);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: destroy with emulateHTTP", 3, function() {
|
QUnit.test('destroy with emulateHTTP', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = true;
|
library.first().destroy({
|
||||||
library.first().destroy();
|
emulateHTTP: true,
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateJSON: true
|
||||||
equal(lastRequest.type, 'POST');
|
});
|
||||||
equal(JSON.stringify(lastRequest.data), '{"_method":"DELETE"}');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = false;
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
|
assert.equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: urlError", 2, function() {
|
QUnit.test('urlError', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
raises(function() {
|
assert.raises(function() {
|
||||||
model.fetch();
|
model.fetch();
|
||||||
});
|
});
|
||||||
model.fetch({url: '/one/two'});
|
model.fetch({url: '/one/two'});
|
||||||
equal(lastRequest.url, '/one/two');
|
assert.equal(this.ajaxSettings.url, '/one/two');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1052 - `options` is optional.", 0, function() {
|
QUnit.test('#1052 - `options` is optional.', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
model.url = '/test';
|
model.url = '/test';
|
||||||
Backbone.sync('create', model);
|
Backbone.sync('create', model);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Backbone.ajax", 1, function() {
|
QUnit.test('Backbone.ajax', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
Backbone.ajax = function(settings){
|
Backbone.ajax = function(settings){
|
||||||
strictEqual(settings.url, '/test');
|
assert.strictEqual(settings.url, '/test');
|
||||||
};
|
};
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
model.url = '/test';
|
model.url = '/test';
|
||||||
Backbone.sync('create', model);
|
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');
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
9266
vendor/backbone/test/vendor/jquery-1.7.1.js
vendored
9266
vendor/backbone/test/vendor/jquery-1.7.1.js
vendored
File diff suppressed because it is too large
Load Diff
649
vendor/backbone/test/vendor/jslitmus.js
vendored
649
vendor/backbone/test/vendor/jslitmus.js
vendored
@@ -1,649 +0,0 @@
|
|||||||
// JSLitmus.js
|
|
||||||
//
|
|
||||||
// Copyright (c) 2010, Robert Kieffer, http://broofa.com
|
|
||||||
// Available under MIT license (http://en.wikipedia.org/wiki/MIT_License)
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
// Private methods and state
|
|
||||||
|
|
||||||
// Get platform info but don't go crazy trying to recognize everything
|
|
||||||
// that's out there. This is just for the major platforms and OSes.
|
|
||||||
var platform = 'unknown platform', ua = navigator.userAgent;
|
|
||||||
|
|
||||||
// Detect OS
|
|
||||||
var oses = ['Windows','iPhone OS','(Intel |PPC )?Mac OS X','Linux'].join('|');
|
|
||||||
var pOS = new RegExp('((' + oses + ') [^ \);]*)').test(ua) ? RegExp.$1 : null;
|
|
||||||
if (!pOS) pOS = new RegExp('((' + oses + ')[^ \);]*)').test(ua) ? RegExp.$1 : null;
|
|
||||||
|
|
||||||
// Detect browser
|
|
||||||
var pName = /(Chrome|MSIE|Safari|Opera|Firefox)/.test(ua) ? RegExp.$1 : null;
|
|
||||||
|
|
||||||
// Detect version
|
|
||||||
var vre = new RegExp('(Version|' + pName + ')[ \/]([^ ;]*)');
|
|
||||||
var pVersion = (pName && vre.test(ua)) ? RegExp.$2 : null;
|
|
||||||
var platform = (pOS && pName && pVersion) ? pName + ' ' + pVersion + ' on ' + pOS : 'unknown platform';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A smattering of methods that are needed to implement the JSLitmus testbed.
|
|
||||||
*/
|
|
||||||
var jsl = {
|
|
||||||
/**
|
|
||||||
* Enhanced version of escape()
|
|
||||||
*/
|
|
||||||
escape: function(s) {
|
|
||||||
s = s.replace(/,/g, '\\,');
|
|
||||||
s = escape(s);
|
|
||||||
s = s.replace(/\+/g, '%2b');
|
|
||||||
s = s.replace(/ /g, '+');
|
|
||||||
return s;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an element by ID.
|
|
||||||
*/
|
|
||||||
$: function(id) {
|
|
||||||
return document.getElementById(id);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Null function
|
|
||||||
*/
|
|
||||||
F: function() {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the status shown in the UI
|
|
||||||
*/
|
|
||||||
status: function(msg) {
|
|
||||||
var el = jsl.$('jsl_status');
|
|
||||||
if (el) el.innerHTML = msg || '';
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a number to an abbreviated string like, "15K" or "10M"
|
|
||||||
*/
|
|
||||||
toLabel: function(n) {
|
|
||||||
if (n == Infinity) {
|
|
||||||
return 'Infinity';
|
|
||||||
} else if (n > 1e9) {
|
|
||||||
n = Math.round(n/1e8);
|
|
||||||
return n/10 + 'B';
|
|
||||||
} else if (n > 1e6) {
|
|
||||||
n = Math.round(n/1e5);
|
|
||||||
return n/10 + 'M';
|
|
||||||
} else if (n > 1e3) {
|
|
||||||
n = Math.round(n/1e2);
|
|
||||||
return n/10 + 'K';
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copy properties from src to dst
|
|
||||||
*/
|
|
||||||
extend: function(dst, src) {
|
|
||||||
for (var k in src) dst[k] = src[k]; return dst;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Like Array.join(), but for the key-value pairs in an object
|
|
||||||
*/
|
|
||||||
join: function(o, delimit1, delimit2) {
|
|
||||||
if (o.join) return o.join(delimit1); // If it's an array
|
|
||||||
var pairs = [];
|
|
||||||
for (var k in o) pairs.push(k + delimit1 + o[k]);
|
|
||||||
return pairs.join(delimit2);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Array#indexOf isn't supported in IE, so we use this as a cross-browser solution
|
|
||||||
*/
|
|
||||||
indexOf: function(arr, o) {
|
|
||||||
if (arr.indexOf) return arr.indexOf(o);
|
|
||||||
for (var i = 0; i < this.length; i++) if (arr[i] === o) return i;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test manages a single test (created with
|
|
||||||
* JSLitmus.test())
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
var Test = function (name, f) {
|
|
||||||
if (!f) throw new Error('Undefined test function');
|
|
||||||
if (!/function[^\(]*\(([^,\)]*)/.test(f.toString())) {
|
|
||||||
throw new Error('"' + name + '" test: Test is not a valid Function object');
|
|
||||||
}
|
|
||||||
this.loopArg = RegExp.$1;
|
|
||||||
this.name = name;
|
|
||||||
this.f = f;
|
|
||||||
};
|
|
||||||
|
|
||||||
jsl.extend(Test, /** @lends Test */ {
|
|
||||||
/** Calibration tests for establishing iteration loop overhead */
|
|
||||||
CALIBRATIONS: [
|
|
||||||
new Test('calibrating loop', function(count) {while (count--);}),
|
|
||||||
new Test('calibrating function', jsl.F)
|
|
||||||
],
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run calibration tests. Returns true if calibrations are not yet
|
|
||||||
* complete (in which case calling code should run the tests yet again).
|
|
||||||
* onCalibrated - Callback to invoke when calibrations have finished
|
|
||||||
*/
|
|
||||||
calibrate: function(onCalibrated) {
|
|
||||||
for (var i = 0; i < Test.CALIBRATIONS.length; i++) {
|
|
||||||
var cal = Test.CALIBRATIONS[i];
|
|
||||||
if (cal.running) return true;
|
|
||||||
if (!cal.count) {
|
|
||||||
cal.isCalibration = true;
|
|
||||||
cal.onStop = onCalibrated;
|
|
||||||
//cal.MIN_TIME = .1; // Do calibrations quickly
|
|
||||||
cal.run(2e4);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
jsl.extend(Test.prototype, {/** @lends Test.prototype */
|
|
||||||
/** Initial number of iterations */
|
|
||||||
INIT_COUNT: 10,
|
|
||||||
/** Max iterations allowed (i.e. used to detect bad looping functions) */
|
|
||||||
MAX_COUNT: 1e9,
|
|
||||||
/** Minimum time a test should take to get valid results (secs) */
|
|
||||||
MIN_TIME: .5,
|
|
||||||
|
|
||||||
/** Callback invoked when test state changes */
|
|
||||||
onChange: jsl.F,
|
|
||||||
|
|
||||||
/** Callback invoked when test is finished */
|
|
||||||
onStop: jsl.F,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset test state
|
|
||||||
*/
|
|
||||||
reset: function() {
|
|
||||||
delete this.count;
|
|
||||||
delete this.time;
|
|
||||||
delete this.running;
|
|
||||||
delete this.error;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the test (in a timeout). We use a timeout to make sure the browser
|
|
||||||
* has a chance to finish rendering any UI changes we've made, like
|
|
||||||
* updating the status message.
|
|
||||||
*/
|
|
||||||
run: function(count) {
|
|
||||||
count = count || this.INIT_COUNT;
|
|
||||||
jsl.status(this.name + ' x ' + count);
|
|
||||||
this.running = true;
|
|
||||||
var me = this;
|
|
||||||
setTimeout(function() {me._run(count);}, 200);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The nuts and bolts code that actually runs a test
|
|
||||||
*/
|
|
||||||
_run: function(count) {
|
|
||||||
var me = this;
|
|
||||||
|
|
||||||
// Make sure calibration tests have run
|
|
||||||
if (!me.isCalibration && Test.calibrate(function() {me.run(count);})) return;
|
|
||||||
this.error = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var start, f = this.f, now, i = count;
|
|
||||||
|
|
||||||
// Start the timer
|
|
||||||
start = new Date();
|
|
||||||
|
|
||||||
// Now for the money shot. If this is a looping function ...
|
|
||||||
if (this.loopArg) {
|
|
||||||
// ... let it do the iteration itself
|
|
||||||
f(count);
|
|
||||||
} else {
|
|
||||||
// ... otherwise do the iteration for it
|
|
||||||
while (i--) f();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get time test took (in secs)
|
|
||||||
this.time = Math.max(1,new Date() - start)/1000;
|
|
||||||
|
|
||||||
// Store iteration count and per-operation time taken
|
|
||||||
this.count = count;
|
|
||||||
this.period = this.time/count;
|
|
||||||
|
|
||||||
// Do we need to do another run?
|
|
||||||
this.running = this.time <= this.MIN_TIME;
|
|
||||||
|
|
||||||
// ... if so, compute how many times we should iterate
|
|
||||||
if (this.running) {
|
|
||||||
// Bump the count to the nearest power of 2
|
|
||||||
var x = this.MIN_TIME/this.time;
|
|
||||||
var pow = Math.pow(2, Math.max(1, Math.ceil(Math.log(x)/Math.log(2))));
|
|
||||||
count *= pow;
|
|
||||||
if (count > this.MAX_COUNT) {
|
|
||||||
throw new Error('Max count exceeded. If this test uses a looping function, make sure the iteration loop is working properly.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// Exceptions are caught and displayed in the test UI
|
|
||||||
this.reset();
|
|
||||||
this.error = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Figure out what to do next
|
|
||||||
if (this.running) {
|
|
||||||
me.run(count);
|
|
||||||
} else {
|
|
||||||
jsl.status('');
|
|
||||||
me.onStop(me);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finish up
|
|
||||||
this.onChange(this);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the number of operations per second for this test.
|
|
||||||
*
|
|
||||||
* @param normalize if true, iteration loop overhead taken into account
|
|
||||||
*/
|
|
||||||
getHz: function(/**Boolean*/ normalize) {
|
|
||||||
var p = this.period;
|
|
||||||
|
|
||||||
// Adjust period based on the calibration test time
|
|
||||||
if (normalize && !this.isCalibration) {
|
|
||||||
var cal = Test.CALIBRATIONS[this.loopArg ? 0 : 1];
|
|
||||||
|
|
||||||
// If the period is within 20% of the calibration time, then zero the
|
|
||||||
// it out
|
|
||||||
p = p < cal.period*1.2 ? 0 : p - cal.period;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Math.round(1/p);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a friendly string describing the test
|
|
||||||
*/
|
|
||||||
toString: function() {
|
|
||||||
return this.name + ' - ' + this.time/this.count + ' secs';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// CSS we need for the UI
|
|
||||||
var STYLESHEET = '<style> \
|
|
||||||
#jslitmus {font-family:sans-serif; font-size: 12px;} \
|
|
||||||
#jslitmus a {text-decoration: none;} \
|
|
||||||
#jslitmus a:hover {text-decoration: underline;} \
|
|
||||||
#jsl_status { \
|
|
||||||
margin-top: 10px; \
|
|
||||||
font-size: 10px; \
|
|
||||||
color: #888; \
|
|
||||||
} \
|
|
||||||
A IMG {border:none} \
|
|
||||||
#test_results { \
|
|
||||||
margin-top: 10px; \
|
|
||||||
font-size: 12px; \
|
|
||||||
font-family: sans-serif; \
|
|
||||||
border-collapse: collapse; \
|
|
||||||
border-spacing: 0px; \
|
|
||||||
} \
|
|
||||||
#test_results th, #test_results td { \
|
|
||||||
border: solid 1px #ccc; \
|
|
||||||
vertical-align: top; \
|
|
||||||
padding: 3px; \
|
|
||||||
} \
|
|
||||||
#test_results th { \
|
|
||||||
vertical-align: bottom; \
|
|
||||||
background-color: #ccc; \
|
|
||||||
padding: 1px; \
|
|
||||||
font-size: 10px; \
|
|
||||||
} \
|
|
||||||
#test_results #test_platform { \
|
|
||||||
color: #444; \
|
|
||||||
text-align:center; \
|
|
||||||
} \
|
|
||||||
#test_results .test_row { \
|
|
||||||
color: #006; \
|
|
||||||
cursor: pointer; \
|
|
||||||
} \
|
|
||||||
#test_results .test_nonlooping { \
|
|
||||||
border-left-style: dotted; \
|
|
||||||
border-left-width: 2px; \
|
|
||||||
} \
|
|
||||||
#test_results .test_looping { \
|
|
||||||
border-left-style: solid; \
|
|
||||||
border-left-width: 2px; \
|
|
||||||
} \
|
|
||||||
#test_results .test_name {white-space: nowrap;} \
|
|
||||||
#test_results .test_pending { \
|
|
||||||
} \
|
|
||||||
#test_results .test_running { \
|
|
||||||
font-style: italic; \
|
|
||||||
} \
|
|
||||||
#test_results .test_done {} \
|
|
||||||
#test_results .test_done { \
|
|
||||||
text-align: right; \
|
|
||||||
font-family: monospace; \
|
|
||||||
} \
|
|
||||||
#test_results .test_error {color: #600;} \
|
|
||||||
#test_results .test_error .error_head {font-weight:bold;} \
|
|
||||||
#test_results .test_error .error_body {font-size:85%;} \
|
|
||||||
#test_results .test_row:hover td { \
|
|
||||||
background-color: #ffc; \
|
|
||||||
text-decoration: underline; \
|
|
||||||
} \
|
|
||||||
#chart { \
|
|
||||||
margin: 10px 0px; \
|
|
||||||
width: 250px; \
|
|
||||||
} \
|
|
||||||
#chart img { \
|
|
||||||
border: solid 1px #ccc; \
|
|
||||||
margin-bottom: 5px; \
|
|
||||||
} \
|
|
||||||
#chart #tiny_url { \
|
|
||||||
height: 40px; \
|
|
||||||
width: 250px; \
|
|
||||||
} \
|
|
||||||
#jslitmus_credit { \
|
|
||||||
font-size: 10px; \
|
|
||||||
color: #888; \
|
|
||||||
margin-top: 8px; \
|
|
||||||
} \
|
|
||||||
</style>';
|
|
||||||
|
|
||||||
// HTML markup for the UI
|
|
||||||
var MARKUP = '<div id="jslitmus"> \
|
|
||||||
<button onclick="JSLitmus.runAll(event)">Run Tests</button> \
|
|
||||||
<button id="stop_button" disabled="disabled" onclick="JSLitmus.stop()">Stop Tests</button> \
|
|
||||||
<br \> \
|
|
||||||
<br \> \
|
|
||||||
<input type="checkbox" style="vertical-align: middle" id="test_normalize" checked="checked" onchange="JSLitmus.renderAll()""> Normalize results \
|
|
||||||
<table id="test_results"> \
|
|
||||||
<colgroup> \
|
|
||||||
<col /> \
|
|
||||||
<col width="100" /> \
|
|
||||||
</colgroup> \
|
|
||||||
<tr><th id="test_platform" colspan="2">' + platform + '</th></tr> \
|
|
||||||
<tr><th>Test</th><th>Ops/sec</th></tr> \
|
|
||||||
<tr id="test_row_template" class="test_row" style="display:none"> \
|
|
||||||
<td class="test_name"></td> \
|
|
||||||
<td class="test_result">Ready</td> \
|
|
||||||
</tr> \
|
|
||||||
</table> \
|
|
||||||
<div id="jsl_status"></div> \
|
|
||||||
<div id="chart" style="display:none"> \
|
|
||||||
<a id="chart_link" target="_blank"><img id="chart_image"></a> \
|
|
||||||
TinyURL (for chart): \
|
|
||||||
<iframe id="tiny_url" frameBorder="0" scrolling="no" src=""></iframe> \
|
|
||||||
</div> \
|
|
||||||
<a id="jslitmus_credit" title="JSLitmus home page" href="http://code.google.com/p/jslitmus" target="_blank">Powered by JSLitmus</a> \
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The public API for creating and running tests
|
|
||||||
*/
|
|
||||||
window.JSLitmus = {
|
|
||||||
/** The list of all tests that have been registered with JSLitmus.test */
|
|
||||||
_tests: [],
|
|
||||||
/** The queue of tests that need to be run */
|
|
||||||
_queue: [],
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The parsed query parameters the current page URL. This is provided as a
|
|
||||||
* convenience for test functions - it's not used by JSLitmus proper
|
|
||||||
*/
|
|
||||||
params: {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize
|
|
||||||
*/
|
|
||||||
_init: function() {
|
|
||||||
// Parse query params into JSLitmus.params[] hash
|
|
||||||
var match = (location + '').match(/([^?#]*)(#.*)?$/);
|
|
||||||
if (match) {
|
|
||||||
var pairs = match[1].split('&');
|
|
||||||
for (var i = 0; i < pairs.length; i++) {
|
|
||||||
var pair = pairs[i].split('=');
|
|
||||||
if (pair.length > 1) {
|
|
||||||
var key = pair.shift();
|
|
||||||
var value = pair.length > 1 ? pair.join('=') : pair[0];
|
|
||||||
this.params[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write out the stylesheet. We have to do this here because IE
|
|
||||||
// doesn't honor sheets written after the document has loaded.
|
|
||||||
document.write(STYLESHEET);
|
|
||||||
|
|
||||||
// Setup the rest of the UI once the document is loaded
|
|
||||||
if (window.addEventListener) {
|
|
||||||
window.addEventListener('load', this._setup, false);
|
|
||||||
} else if (document.addEventListener) {
|
|
||||||
document.addEventListener('load', this._setup, false);
|
|
||||||
} else if (window.attachEvent) {
|
|
||||||
window.attachEvent('onload', this._setup);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the UI
|
|
||||||
*/
|
|
||||||
_setup: function() {
|
|
||||||
var el = jsl.$('jslitmus_container');
|
|
||||||
if (!el) document.body.appendChild(el = document.createElement('div'));
|
|
||||||
|
|
||||||
el.innerHTML = MARKUP;
|
|
||||||
|
|
||||||
// Render the UI for all our tests
|
|
||||||
for (var i=0; i < JSLitmus._tests.length; i++)
|
|
||||||
JSLitmus.renderTest(JSLitmus._tests[i]);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (Re)render all the test results
|
|
||||||
*/
|
|
||||||
renderAll: function() {
|
|
||||||
for (var i = 0; i < JSLitmus._tests.length; i++)
|
|
||||||
JSLitmus.renderTest(JSLitmus._tests[i]);
|
|
||||||
JSLitmus.renderChart();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (Re)render the chart graphics
|
|
||||||
*/
|
|
||||||
renderChart: function() {
|
|
||||||
var url = JSLitmus.chartUrl();
|
|
||||||
jsl.$('chart_link').href = url;
|
|
||||||
jsl.$('chart_image').src = url;
|
|
||||||
jsl.$('chart').style.display = '';
|
|
||||||
|
|
||||||
// Update the tiny URL
|
|
||||||
jsl.$('tiny_url').src = 'http://tinyurl.com/api-create.php?url='+escape(url);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (Re)render the results for a specific test
|
|
||||||
*/
|
|
||||||
renderTest: function(test) {
|
|
||||||
// Make a new row if needed
|
|
||||||
if (!test._row) {
|
|
||||||
var trow = jsl.$('test_row_template');
|
|
||||||
if (!trow) return;
|
|
||||||
|
|
||||||
test._row = trow.cloneNode(true);
|
|
||||||
test._row.style.display = '';
|
|
||||||
test._row.id = '';
|
|
||||||
test._row.onclick = function() {JSLitmus._queueTest(test);};
|
|
||||||
test._row.title = 'Run ' + test.name + ' test';
|
|
||||||
trow.parentNode.appendChild(test._row);
|
|
||||||
test._row.cells[0].innerHTML = test.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cell = test._row.cells[1];
|
|
||||||
var cns = [test.loopArg ? 'test_looping' : 'test_nonlooping'];
|
|
||||||
|
|
||||||
if (test.error) {
|
|
||||||
cns.push('test_error');
|
|
||||||
cell.innerHTML =
|
|
||||||
'<div class="error_head">' + test.error + '</div>' +
|
|
||||||
'<ul class="error_body"><li>' +
|
|
||||||
jsl.join(test.error, ': ', '</li><li>') +
|
|
||||||
'</li></ul>';
|
|
||||||
} else {
|
|
||||||
if (test.running) {
|
|
||||||
cns.push('test_running');
|
|
||||||
cell.innerHTML = 'running';
|
|
||||||
} else if (jsl.indexOf(JSLitmus._queue, test) >= 0) {
|
|
||||||
cns.push('test_pending');
|
|
||||||
cell.innerHTML = 'pending';
|
|
||||||
} else if (test.count) {
|
|
||||||
cns.push('test_done');
|
|
||||||
var hz = test.getHz(jsl.$('test_normalize').checked);
|
|
||||||
cell.innerHTML = hz != Infinity ? hz : '∞';
|
|
||||||
cell.title = 'Looped ' + test.count + ' times in ' + test.time + ' seconds';
|
|
||||||
} else {
|
|
||||||
cell.innerHTML = 'ready';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cell.className = cns.join(' ');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new test
|
|
||||||
*/
|
|
||||||
test: function(name, f) {
|
|
||||||
// Create the Test object
|
|
||||||
var test = new Test(name, f);
|
|
||||||
JSLitmus._tests.push(test);
|
|
||||||
|
|
||||||
// Re-render if the test state changes
|
|
||||||
test.onChange = JSLitmus.renderTest;
|
|
||||||
|
|
||||||
// Run the next test if this one finished
|
|
||||||
test.onStop = function(test) {
|
|
||||||
if (JSLitmus.onTestFinish) JSLitmus.onTestFinish(test);
|
|
||||||
JSLitmus.currentTest = null;
|
|
||||||
JSLitmus._nextTest();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Render the new test
|
|
||||||
this.renderTest(test);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add all tests to the run queue
|
|
||||||
*/
|
|
||||||
runAll: function(e) {
|
|
||||||
e = e || window.event;
|
|
||||||
var reverse = e && e.shiftKey, len = JSLitmus._tests.length;
|
|
||||||
for (var i = 0; i < len; i++) {
|
|
||||||
JSLitmus._queueTest(JSLitmus._tests[!reverse ? i : (len - i - 1)]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove all tests from the run queue. The current test has to finish on
|
|
||||||
* it's own though
|
|
||||||
*/
|
|
||||||
stop: function() {
|
|
||||||
while (JSLitmus._queue.length) {
|
|
||||||
var test = JSLitmus._queue.shift();
|
|
||||||
JSLitmus.renderTest(test);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the next test in the run queue
|
|
||||||
*/
|
|
||||||
_nextTest: function() {
|
|
||||||
if (!JSLitmus.currentTest) {
|
|
||||||
var test = JSLitmus._queue.shift();
|
|
||||||
if (test) {
|
|
||||||
jsl.$('stop_button').disabled = false;
|
|
||||||
JSLitmus.currentTest = test;
|
|
||||||
test.run();
|
|
||||||
JSLitmus.renderTest(test);
|
|
||||||
if (JSLitmus.onTestStart) JSLitmus.onTestStart(test);
|
|
||||||
} else {
|
|
||||||
jsl.$('stop_button').disabled = true;
|
|
||||||
JSLitmus.renderChart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a test to the run queue
|
|
||||||
*/
|
|
||||||
_queueTest: function(test) {
|
|
||||||
if (jsl.indexOf(JSLitmus._queue, test) >= 0) return;
|
|
||||||
JSLitmus._queue.push(test);
|
|
||||||
JSLitmus.renderTest(test);
|
|
||||||
JSLitmus._nextTest();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a Google Chart URL that shows the data for all tests
|
|
||||||
*/
|
|
||||||
chartUrl: function() {
|
|
||||||
var n = JSLitmus._tests.length, markers = [], data = [];
|
|
||||||
var d, min = 0, max = -1e10;
|
|
||||||
var normalize = jsl.$('test_normalize').checked;
|
|
||||||
|
|
||||||
// Gather test data
|
|
||||||
for (var i=0; i < JSLitmus._tests.length; i++) {
|
|
||||||
var test = JSLitmus._tests[i];
|
|
||||||
if (test.count) {
|
|
||||||
var hz = test.getHz(normalize);
|
|
||||||
var v = hz != Infinity ? hz : 0;
|
|
||||||
data.push(v);
|
|
||||||
markers.push('t' + jsl.escape(test.name + '(' + jsl.toLabel(hz)+ ')') + ',000000,0,' +
|
|
||||||
markers.length + ',10');
|
|
||||||
max = Math.max(v, max);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (markers.length <= 0) return null;
|
|
||||||
|
|
||||||
// Build chart title
|
|
||||||
var title = document.getElementsByTagName('title');
|
|
||||||
title = (title && title.length) ? title[0].innerHTML : null;
|
|
||||||
var chart_title = [];
|
|
||||||
if (title) chart_title.push(title);
|
|
||||||
chart_title.push('Ops/sec (' + platform + ')');
|
|
||||||
|
|
||||||
// Build labels
|
|
||||||
var labels = [jsl.toLabel(min), jsl.toLabel(max)];
|
|
||||||
|
|
||||||
var w = 250, bw = 15;
|
|
||||||
var bs = 5;
|
|
||||||
var h = markers.length*(bw + bs) + 30 + chart_title.length*20;
|
|
||||||
|
|
||||||
var params = {
|
|
||||||
chtt: escape(chart_title.join('|')),
|
|
||||||
chts: '000000,10',
|
|
||||||
cht: 'bhg', // chart type
|
|
||||||
chd: 't:' + data.join(','), // data set
|
|
||||||
chds: min + ',' + max, // max/min of data
|
|
||||||
chxt: 'x', // label axes
|
|
||||||
chxl: '0:|' + labels.join('|'), // labels
|
|
||||||
chsp: '0,1',
|
|
||||||
chm: markers.join('|'), // test names
|
|
||||||
chbh: [bw, 0, bs].join(','), // bar widths
|
|
||||||
// chf: 'bg,lg,0,eeeeee,0,eeeeee,.5,ffffff,1', // gradient
|
|
||||||
chs: w + 'x' + h
|
|
||||||
};
|
|
||||||
return 'http://chart.apis.google.com/chart?' + jsl.join(params, '=', '&');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
JSLitmus._init();
|
|
||||||
})();
|
|
||||||
236
vendor/backbone/test/vendor/qunit.css
vendored
236
vendor/backbone/test/vendor/qunit.css
vendored
@@ -1,236 +0,0 @@
|
|||||||
/**
|
|
||||||
* QUnit v1.8.0 - A JavaScript Unit Testing Framework
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/QUnit
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 John Resig, Jörn Zaefferer
|
|
||||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
|
||||||
* or GPL (GPL-LICENSE.txt) licenses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Font Family and Sizes */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
|
||||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
|
||||||
#qunit-tests { font-size: smaller; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Resets */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Header */
|
|
||||||
|
|
||||||
#qunit-header {
|
|
||||||
padding: 0.5em 0 0.5em 1em;
|
|
||||||
|
|
||||||
color: #8699a4;
|
|
||||||
background-color: #0d3349;
|
|
||||||
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1em;
|
|
||||||
font-weight: normal;
|
|
||||||
|
|
||||||
border-radius: 15px 15px 0 0;
|
|
||||||
-moz-border-radius: 15px 15px 0 0;
|
|
||||||
-webkit-border-top-right-radius: 15px;
|
|
||||||
-webkit-border-top-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #c2ccd1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a:hover,
|
|
||||||
#qunit-header a:focus {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header label {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-banner {
|
|
||||||
height: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar {
|
|
||||||
padding: 0.5em 0 0.5em 2em;
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-userAgent {
|
|
||||||
padding: 0.5em 0 0.5em 2.5em;
|
|
||||||
background-color: #2b81af;
|
|
||||||
color: #fff;
|
|
||||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Tests: Pass/Fail */
|
|
||||||
|
|
||||||
#qunit-tests {
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li {
|
|
||||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
|
||||||
border-bottom: 1px solid #fff;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li strong {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li a {
|
|
||||||
padding: 0.5em;
|
|
||||||
color: #c2ccd1;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
#qunit-tests li a:hover,
|
|
||||||
#qunit-tests li a:focus {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ol {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
padding: 0.5em;
|
|
||||||
|
|
||||||
background-color: #fff;
|
|
||||||
|
|
||||||
border-radius: 15px;
|
|
||||||
-moz-border-radius: 15px;
|
|
||||||
-webkit-border-radius: 15px;
|
|
||||||
|
|
||||||
box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-moz-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-webkit-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
margin-top: .2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests th {
|
|
||||||
text-align: right;
|
|
||||||
vertical-align: top;
|
|
||||||
padding: 0 .5em 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests td {
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests pre {
|
|
||||||
margin: 0;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests del {
|
|
||||||
background-color: #e0f2be;
|
|
||||||
color: #374e0c;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ins {
|
|
||||||
background-color: #ffcaca;
|
|
||||||
color: #500;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Test Counts */
|
|
||||||
|
|
||||||
#qunit-tests b.counts { color: black; }
|
|
||||||
#qunit-tests b.passed { color: #5E740B; }
|
|
||||||
#qunit-tests b.failed { color: #710909; }
|
|
||||||
|
|
||||||
#qunit-tests li li {
|
|
||||||
margin: 0.5em;
|
|
||||||
padding: 0.4em 0.5em 0.4em 0.5em;
|
|
||||||
background-color: #fff;
|
|
||||||
border-bottom: none;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Passing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.pass {
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #C6E746;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
|
||||||
#qunit-tests .pass .test-name { color: #366097; }
|
|
||||||
|
|
||||||
#qunit-tests .pass .test-actual,
|
|
||||||
#qunit-tests .pass .test-expected { color: #999999; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
|
||||||
|
|
||||||
/*** Failing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.fail {
|
|
||||||
color: #710909;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #EE5757;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests > li:last-child {
|
|
||||||
border-radius: 0 0 15px 15px;
|
|
||||||
-moz-border-radius: 0 0 15px 15px;
|
|
||||||
-webkit-border-bottom-right-radius: 15px;
|
|
||||||
-webkit-border-bottom-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-name,
|
|
||||||
#qunit-tests .fail .module-name { color: #000000; }
|
|
||||||
|
|
||||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-expected { color: green; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Result */
|
|
||||||
|
|
||||||
#qunit-testresult {
|
|
||||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
|
||||||
|
|
||||||
color: #2b81af;
|
|
||||||
background-color: #D2E0E6;
|
|
||||||
|
|
||||||
border-bottom: 1px solid white;
|
|
||||||
}
|
|
||||||
#qunit-testresult .module-name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Fixture */
|
|
||||||
|
|
||||||
#qunit-fixture {
|
|
||||||
position: absolute;
|
|
||||||
top: -10000px;
|
|
||||||
left: -10000px;
|
|
||||||
width: 1000px;
|
|
||||||
height: 1000px;
|
|
||||||
}
|
|
||||||
1863
vendor/backbone/test/vendor/qunit.js
vendored
1863
vendor/backbone/test/vendor/qunit.js
vendored
File diff suppressed because it is too large
Load Diff
597
vendor/backbone/test/view.js
vendored
597
vendor/backbone/test/view.js
vendored
@@ -1,230 +1,495 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
var view;
|
var view;
|
||||||
|
|
||||||
module("Backbone.View", {
|
QUnit.module('Backbone.View', {
|
||||||
|
|
||||||
|
beforeEach: function(assert) {
|
||||||
|
$('#qunit-fixture').append(
|
||||||
|
'<div id="testElement"><h1>Test</h1></div>'
|
||||||
|
);
|
||||||
|
|
||||||
setup: function() {
|
|
||||||
view = new Backbone.View({
|
view = new Backbone.View({
|
||||||
id : 'test-view',
|
id: 'test-view',
|
||||||
className : 'test-view'
|
className: 'test-view',
|
||||||
|
other: 'non-special-option'
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
afterEach: function() {
|
||||||
|
$('#testElement').remove();
|
||||||
|
$('#test-view').remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: constructor", 4, function() {
|
QUnit.test('constructor', function(assert) {
|
||||||
equal(view.el.id, 'test-view');
|
assert.expect(3);
|
||||||
equal(view.el.className, 'test-view');
|
assert.equal(view.el.id, 'test-view');
|
||||||
equal(view.options.id, 'test-view');
|
assert.equal(view.el.className, 'test-view');
|
||||||
equal(view.options.className, 'test-view');
|
assert.equal(view.el.other, void 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: jQuery", 2, function() {
|
QUnit.test('$', function(assert) {
|
||||||
view.setElement(document.body);
|
assert.expect(2);
|
||||||
ok(view.$('#qunit-header a').get(0).innerHTML.match(/Backbone Test Suite/));
|
var myView = new Backbone.View;
|
||||||
ok(view.$('#qunit-header a').get(1).innerHTML.match(/Backbone Speed Suite/));
|
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: make", 3, function() {
|
QUnit.test('$el', function(assert) {
|
||||||
var div = view.make('div', {id: 'test-div'}, "one two three");
|
assert.expect(3);
|
||||||
equal(div.tagName.toLowerCase(), 'div');
|
var myView = new Backbone.View;
|
||||||
equal(div.id, 'test-div');
|
myView.setElement('<p><a><b>test</b></a></p>');
|
||||||
equal($(div).text(), 'one two three');
|
assert.strictEqual(myView.el.nodeType, 1);
|
||||||
|
|
||||||
|
assert.ok(myView.$el instanceof Backbone.$);
|
||||||
|
assert.strictEqual(myView.$el[0], myView.el);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: make can take falsy values for content", 2, function() {
|
QUnit.test('initialize', function(assert) {
|
||||||
var div = view.make('div', {id: 'test-div'}, 0);
|
assert.expect(1);
|
||||||
equal($(div).text(), '0');
|
|
||||||
|
|
||||||
var div = view.make('div', {id: 'test-div'}, '');
|
|
||||||
equal($(div).text(), '');
|
|
||||||
});
|
|
||||||
|
|
||||||
test("View: initialize", 1, function() {
|
|
||||||
var View = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
this.one = 1;
|
this.one = 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var view = new View;
|
|
||||||
equal(view.one, 1);
|
assert.strictEqual(new View().one, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: delegateEvents", 6, function() {
|
QUnit.test('render', function(assert) {
|
||||||
var counter = 0;
|
assert.expect(1);
|
||||||
var counter2 = 0;
|
var myView = new Backbone.View;
|
||||||
view.setElement(document.body);
|
assert.equal(myView.render(), myView, '#render returns the view instance');
|
||||||
view.increment = function(){ counter++; };
|
|
||||||
view.$el.bind('click', function(){ counter2++; });
|
|
||||||
var events = {"click #qunit-banner": "increment"};
|
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(counter, 1);
|
|
||||||
equal(counter2, 1);
|
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(counter, 2);
|
|
||||||
equal(counter2, 2);
|
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(counter, 3);
|
|
||||||
equal(counter2, 3);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: delegateEvents allows functions for callbacks", 3, function() {
|
QUnit.test('delegateEvents', function(assert) {
|
||||||
view.counter = 0;
|
assert.expect(6);
|
||||||
view.setElement("#qunit-banner");
|
var counter1 = 0, counter2 = 0;
|
||||||
var events = {"click": function() { this.counter++; }};
|
|
||||||
view.delegateEvents(events);
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
$('#qunit-banner').trigger('click');
|
myView.increment = function(){ counter1++; };
|
||||||
equal(view.counter, 1);
|
myView.$el.on('click', function(){ counter2++; });
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(view.counter, 2);
|
var events = {'click h1': 'increment'};
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-banner').trigger('click');
|
myView.delegateEvents(events);
|
||||||
equal(view.counter, 3);
|
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: undelegateEvents", 6, function() {
|
QUnit.test('delegate', function(assert) {
|
||||||
var counter = 0;
|
assert.expect(3);
|
||||||
var counter2 = 0;
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
view.setElement(document.body);
|
myView.delegate('click', 'h1', function() {
|
||||||
view.increment = function(){ counter++; };
|
assert.ok(true);
|
||||||
$(view.el).unbind('click');
|
});
|
||||||
$(view.el).bind('click', function(){ counter2++; });
|
myView.delegate('click', function() {
|
||||||
var events = {"click #qunit-userAgent": "increment"};
|
assert.ok(true);
|
||||||
view.delegateEvents(events);
|
});
|
||||||
$('#qunit-userAgent').trigger('click');
|
myView.$('h1').trigger('click');
|
||||||
equal(counter, 1);
|
|
||||||
equal(counter2, 1);
|
assert.equal(myView.delegate(), myView, '#delegate returns the view instance');
|
||||||
view.undelegateEvents();
|
|
||||||
$('#qunit-userAgent').trigger('click');
|
|
||||||
equal(counter, 1);
|
|
||||||
equal(counter2, 2);
|
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-userAgent').trigger('click');
|
|
||||||
equal(counter, 2);
|
|
||||||
equal(counter2, 3);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: _ensureElement with DOM node el", 1, function() {
|
QUnit.test('delegateEvents allows functions for callbacks', function(assert) {
|
||||||
var ViewClass = Backbone.View.extend({
|
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
|
el: document.body
|
||||||
});
|
});
|
||||||
var view = new ViewClass;
|
|
||||||
equal(view.el, document.body);
|
assert.equal(new View().el, document.body);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: _ensureElement with string el", 3, function() {
|
QUnit.test('_ensureElement with string el', function(assert) {
|
||||||
var ViewClass = Backbone.View.extend({
|
assert.expect(3);
|
||||||
el: "body"
|
var View = Backbone.View.extend({
|
||||||
|
el: 'body'
|
||||||
});
|
});
|
||||||
var view = new ViewClass;
|
assert.strictEqual(new View().el, document.body);
|
||||||
strictEqual(view.el, document.body);
|
|
||||||
|
|
||||||
ViewClass = Backbone.View.extend({
|
View = Backbone.View.extend({
|
||||||
el: "#testElement > h1"
|
el: '#testElement > h1'
|
||||||
});
|
});
|
||||||
view = new ViewClass;
|
assert.strictEqual(new View().el, $('#testElement > h1').get(0));
|
||||||
strictEqual(view.el, $("#testElement > h1").get(0));
|
|
||||||
|
|
||||||
ViewClass = Backbone.View.extend({
|
View = Backbone.View.extend({
|
||||||
el: "#nonexistent"
|
el: '#nonexistent'
|
||||||
});
|
});
|
||||||
view = new ViewClass;
|
assert.ok(!new View().el);
|
||||||
ok(!view.el);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: with attributes", 2, function() {
|
QUnit.test('with className and id functions', function(assert) {
|
||||||
var view = new Backbone.View({attributes : {'class': 'one', id: 'two'}});
|
assert.expect(2);
|
||||||
equal(view.el.className, 'one');
|
var View = Backbone.View.extend({
|
||||||
equal(view.el.id, 'two');
|
className: function() {
|
||||||
|
return 'className';
|
||||||
|
},
|
||||||
|
id: function() {
|
||||||
|
return 'id';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: with attributes as a function", 1, function() {
|
assert.strictEqual(new View().el.className, 'className');
|
||||||
var viewClass = Backbone.View.extend({
|
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() {
|
attributes: function() {
|
||||||
return {'class': 'dynamic'};
|
return {'class': 'dynamic'};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
equal((new viewClass).el.className, 'dynamic');
|
|
||||||
|
assert.strictEqual(new View().el.className, 'dynamic');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: multiple views per element", 3, function() {
|
QUnit.test('should default to className/id properties', function(assert) {
|
||||||
var count = 0, ViewClass = Backbone.View.extend({
|
assert.expect(4);
|
||||||
el: $("body"),
|
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: {
|
events: {
|
||||||
"click": "click"
|
|
||||||
},
|
|
||||||
click: function() {
|
click: function() {
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
var view1 = new ViewClass;
|
|
||||||
$("body").trigger("click");
|
|
||||||
equal(1, count);
|
|
||||||
|
|
||||||
var view2 = new ViewClass;
|
|
||||||
$("body").trigger("click");
|
|
||||||
equal(3, count);
|
|
||||||
|
|
||||||
view1.delegateEvents();
|
|
||||||
$("body").trigger("click");
|
|
||||||
equal(5, count);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("View: custom events, with namespaces", 2, function() {
|
|
||||||
var count = 0;
|
|
||||||
var ViewClass = Backbone.View.extend({
|
|
||||||
el: $('body'),
|
|
||||||
events: function() {
|
|
||||||
return {"fake$event.namespaced": "run"};
|
|
||||||
},
|
|
||||||
run: function() {
|
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var view = new ViewClass;
|
var view1 = new View;
|
||||||
$('body').trigger('fake$event').trigger('fake$event');
|
$el.trigger('click');
|
||||||
equal(count, 2);
|
assert.equal(1, count);
|
||||||
$('body').unbind('.namespaced');
|
|
||||||
$('body').trigger('fake$event');
|
var view2 = new View;
|
||||||
equal(count, 2);
|
$el.trigger('click');
|
||||||
|
assert.equal(3, count);
|
||||||
|
|
||||||
|
view1.delegateEvents();
|
||||||
|
$el.trigger('click');
|
||||||
|
assert.equal(5, count);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1048 - setElement uses provided object.", 2, function() {
|
QUnit.test('custom events', function(assert) {
|
||||||
var $el = $('body');
|
assert.expect(2);
|
||||||
var view = new Backbone.View({el: $el});
|
|
||||||
ok(view.$el === $el);
|
|
||||||
view.setElement($el = $($el));
|
|
||||||
ok(view.$el === $el);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("#986 - Undelegate before changing element.", 1, function() {
|
|
||||||
var a = $('<button></button>');
|
|
||||||
var b = $('<button></button>');
|
|
||||||
var View = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
events: {click: function(e) { ok(view.el === e.target); }}
|
el: $('body'),
|
||||||
});
|
events: {
|
||||||
var view = new View({el: a});
|
fake$event: function() { assert.ok(true); }
|
||||||
view.setElement(b);
|
}
|
||||||
a.trigger('click');
|
|
||||||
b.trigger('click');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1172 - Clone attributes object", 2, function() {
|
var myView = new View;
|
||||||
var View = Backbone.View.extend({attributes: {foo: 'bar'}});
|
$('body').trigger('fake$event').trigger('fake$event');
|
||||||
var v1 = new View({id: 'foo'});
|
|
||||||
strictEqual(v1.el.id, 'foo');
|
$('body').off('fake$event');
|
||||||
var v2 = new View();
|
$('body').trigger('fake$event');
|
||||||
ok(!v2.el.id);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1228 - tagName can be provided as a function", 1, function() {
|
QUnit.test('#1048 - setElement uses provided object.', function(assert) {
|
||||||
var View = Backbone.View.extend({tagName: function(){ return 'p'; }});
|
assert.expect(2);
|
||||||
ok(new View().$el.is('p'));
|
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);
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
132
vendor/benchmark.js/README.md
vendored
132
vendor/benchmark.js/README.md
vendored
@@ -1,132 +0,0 @@
|
|||||||
# Benchmark.js <sup>v1.0.0-pre</sup>
|
|
||||||
|
|
||||||
A [robust](http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks/ "Bulletproof JavaScript benchmarks") benchmarking library that works on nearly all JavaScript platforms<sup><a name="fnref1" href="#fn1">1</a></sup>, supports high-resolution timers, and returns statistically significant results. As seen on [jsPerf](http://jsperf.com/).
|
|
||||||
|
|
||||||
## BestieJS
|
|
||||||
|
|
||||||
Benchmark.js 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.
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
The documentation for Benchmark.js can be viewed here: <http://benchmarkjs.com/docs>
|
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/benchmark.js/wiki/Roadmap).
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
In a browser or Adobe AIR:
|
|
||||||
|
|
||||||
~~~ html
|
|
||||||
<script src="benchmark.js"></script>
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Optionally, expose Java’s nanosecond timer by adding the `nano` applet to the `<body>`:
|
|
||||||
|
|
||||||
~~~ html
|
|
||||||
<applet code="nano" archive="nano.jar"></applet>
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Or enable Chrome’s microsecond timer by using the [command line switch](http://peter.sh/experiments/chromium-command-line-switches/#enable-benchmarking):
|
|
||||||
|
|
||||||
--enable-benchmarking
|
|
||||||
|
|
||||||
Via [npm](http://npmjs.org/):
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
npm install benchmark
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
var Benchmark = require('benchmark');
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Optionally, use the [microtime module](https://github.com/wadey/node-microtime) by Wade Simmons:
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
npm install microtime
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In [Narwhal](http://narwhaljs.org/) and [RingoJS v0.7.0-](http://ringojs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
var Benchmark = require('benchmark').Benchmark;
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In [Rhino](http://www.mozilla.org/rhino/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
load('benchmark.js');
|
|
||||||
~~~
|
|
||||||
|
|
||||||
In an AMD loader like [RequireJS](http://requirejs.org/):
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'benchmark': 'path/to/benchmark'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['benchmark'], function(Benchmark) {
|
|
||||||
console.log(Benchmark.version);
|
|
||||||
});
|
|
||||||
|
|
||||||
// or with platform.js
|
|
||||||
// https://github.com/bestiejs/platform.js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'benchmark': 'path/to/benchmark',
|
|
||||||
'platform': 'path/to/platform'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['benchmark', 'platform'], function(Benchmark, platform) {
|
|
||||||
Benchmark.platform = platform;
|
|
||||||
console.log(Benchmark.platform.name);
|
|
||||||
});
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Usage example:
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
var suite = new Benchmark.Suite;
|
|
||||||
|
|
||||||
// add tests
|
|
||||||
suite.add('RegExp#test', function() {
|
|
||||||
/o/.test('Hello World!');
|
|
||||||
})
|
|
||||||
.add('String#indexOf', function() {
|
|
||||||
'Hello World!'.indexOf('o') > -1;
|
|
||||||
})
|
|
||||||
// add listeners
|
|
||||||
.on('cycle', function(event) {
|
|
||||||
console.log(String(event.target));
|
|
||||||
})
|
|
||||||
.on('complete', function() {
|
|
||||||
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
|
|
||||||
})
|
|
||||||
// run async
|
|
||||||
.run({ 'async': true });
|
|
||||||
|
|
||||||
// logs:
|
|
||||||
// > RegExp#test x 4,161,532 +-0.99% (59 cycles)
|
|
||||||
// > String#indexOf x 6,139,623 +-1.00% (131 cycles)
|
|
||||||
// > Fastest is String#indexOf
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Footnotes
|
|
||||||
|
|
||||||
1. Benchmark.js has been tested in at least Adobe AIR 2.6, Chrome 5-15, Firefox 1.5-8, IE 6-10, Opera 9.25-11.52, Safari 2-5.1.1, Node.js 0.4.8-0.6.1, Narwhal 0.3.2, RingoJS 0.7-0.8, and Rhino 1.7RC3.
|
|
||||||
<a name="fn1" title="Jump back to footnote 1 in the text." href="#fnref1">↩</a>
|
|
||||||
|
|
||||||
## Authors
|
|
||||||
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
* [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")
|
|
||||||
3875
vendor/benchmark.js/benchmark.js
vendored
3875
vendor/benchmark.js/benchmark.js
vendored
File diff suppressed because it is too large
Load Diff
BIN
vendor/benchmark.js/nano.jar
vendored
BIN
vendor/benchmark.js/nano.jar
vendored
Binary file not shown.
20
vendor/docdown/LICENSE.txt
vendored
20
vendor/docdown/LICENSE.txt
vendored
@@ -1,20 +0,0 @@
|
|||||||
Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
|
|
||||||
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.
|
|
||||||
44
vendor/docdown/README.md
vendored
44
vendor/docdown/README.md
vendored
@@ -1,44 +0,0 @@
|
|||||||
# Docdown <sup>v1.0.0-pre</sup>
|
|
||||||
|
|
||||||
A simple JSDoc to Markdown documentation generator.
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
The documentation for Docdown can be viewed here: [/doc/README.md](https://github.com/jdalton/docdown/blob/master/doc/README.md#readme)
|
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/jdalton/docdown/wiki/Roadmap).
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
Usage example:
|
|
||||||
|
|
||||||
~~~ php
|
|
||||||
require("docdown.php");
|
|
||||||
|
|
||||||
// generate Markdown
|
|
||||||
$markdown = docdown(array(
|
|
||||||
"path" => $filepath,
|
|
||||||
"url" => "https://github.com/username/project/blob/master/my.js"
|
|
||||||
));
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Cloning this repo
|
|
||||||
|
|
||||||
To clone this repository just use:
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
git clone https://github.com/docdown/docdown.git
|
|
||||||
cd docdown
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Feel free to fork and send pull requests if you see improvements!
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
38
vendor/docdown/docdown.php
vendored
38
vendor/docdown/docdown.php
vendored
@@ -1,38 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*!
|
|
||||||
* Docdown v1.0.0-pre
|
|
||||||
* Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
* Available under MIT license <http://mths.be/mit>
|
|
||||||
*/
|
|
||||||
require(dirname(__FILE__) . '/src/DocDown/Generator.php');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates Markdown from JSDoc entries in a given file.
|
|
||||||
*
|
|
||||||
* @param {Array} [$options=array()] The options array.
|
|
||||||
* @returns {String} The generated Markdown.
|
|
||||||
* @example
|
|
||||||
*
|
|
||||||
* // specify a file path
|
|
||||||
* $markdown = docdown(array(
|
|
||||||
* // path to js file
|
|
||||||
* 'path' => $filepath,
|
|
||||||
* // url used to reference line numbers in code
|
|
||||||
* 'url' => 'https://github.com/username/project/blob/master/my.js'
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* // or pass raw js
|
|
||||||
* $markdown = docdown(array(
|
|
||||||
* // raw JavaScript source
|
|
||||||
* 'source' => $rawJS,
|
|
||||||
* // documentation title
|
|
||||||
* 'title' => 'My API Documentation',
|
|
||||||
* // url used to reference line numbers in code
|
|
||||||
* 'url' => 'https://github.com/username/project/blob/master/my.js'
|
|
||||||
* ));
|
|
||||||
*/
|
|
||||||
function docdown( $options = array() ) {
|
|
||||||
$gen = new Generator($options);
|
|
||||||
return $gen->generate();
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
304
vendor/docdown/src/DocDown/Entry.php
vendored
304
vendor/docdown/src/DocDown/Entry.php
vendored
@@ -1,304 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A class to simplify parsing a single JSDoc entry.
|
|
||||||
*/
|
|
||||||
class Entry {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The documentation entry.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $entry = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The language highlighter used for code examples.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $lang = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The source code.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $source = '';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Entry constructor.
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
* @param {String} $entry The documentation entry to analyse.
|
|
||||||
* @param {String} $source The source code.
|
|
||||||
* @param {String} $lang The language highlighter used for code examples.
|
|
||||||
*/
|
|
||||||
public function __construct( $entry, $source, $lang = 'js' ) {
|
|
||||||
$this->entry = $entry;
|
|
||||||
$this->lang = $lang;
|
|
||||||
$this->source = str_replace(PHP_EOL, "\n", $source);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the documentation entries from source code.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
* @memberOf Entry
|
|
||||||
* @param {String} $source The source code.
|
|
||||||
* @returns {Array} The array of entries.
|
|
||||||
*/
|
|
||||||
public static function getEntries( $source ) {
|
|
||||||
preg_match_all('#/\*\*(?![-!])[\s\S]*?\*/\s*[^\n]+#', $source, $result);
|
|
||||||
return array_pop($result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the entry is a function reference.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns `true` if the entry is a function reference, else `false`.
|
|
||||||
*/
|
|
||||||
private function isFunction() {
|
|
||||||
return !!(
|
|
||||||
$this->isCtor() ||
|
|
||||||
count($this->getParams()) ||
|
|
||||||
count($this->getReturns()) ||
|
|
||||||
preg_match('/\*\s*@function\b/', $this->entry)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the function call from the entry.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The function call.
|
|
||||||
*/
|
|
||||||
public function getCall() {
|
|
||||||
preg_match('#\*/\s*(?:function ([^(]*)|(.*?)(?=[:=,]|return\b))#', $this->entry, $result);
|
|
||||||
if ($result = array_pop($result)) {
|
|
||||||
$result = array_pop(explode('var ', trim(trim(array_pop(explode('.', $result))), "'")));
|
|
||||||
}
|
|
||||||
// resolve name
|
|
||||||
// avoid $this->getName() because it calls $this->getCall()
|
|
||||||
preg_match('#\*\s*@name\s+([^\n]+)#', $this->entry, $name);
|
|
||||||
if (count($name)) {
|
|
||||||
$name = trim($name[1]);
|
|
||||||
} else {
|
|
||||||
$name = $result;
|
|
||||||
}
|
|
||||||
// compile function call syntax
|
|
||||||
if ($this->isFunction()) {
|
|
||||||
// compose parts
|
|
||||||
$result = array($result);
|
|
||||||
$params = $this->getParams();
|
|
||||||
foreach ($params as $param) {
|
|
||||||
$result[] = $param[1];
|
|
||||||
}
|
|
||||||
// format
|
|
||||||
$result = $name .'('. implode(array_slice($result, 1), ', ') .')';
|
|
||||||
$result = str_replace(', [', ' [, ', str_replace('], [', ', ', $result));
|
|
||||||
}
|
|
||||||
return $result ? $result : $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry description.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry description.
|
|
||||||
*/
|
|
||||||
public function getDesc() {
|
|
||||||
preg_match('#/\*\*(?:\s*\*)?([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$type = $this->getType();
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
$result = ($type == 'Function' ? '' : '(' . str_replace('|', ', ', trim($type, '{}')) . '): ') . $result;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `example` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `example` data.
|
|
||||||
*/
|
|
||||||
public function getExample() {
|
|
||||||
preg_match('#\*\s*@example\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', "\n", $result[1]));
|
|
||||||
$result = '~~~ ' . $this->lang . "\n" . $result . "\n~~~";
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the line number of the entry.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Number} The line number.
|
|
||||||
*/
|
|
||||||
public function getLineNumber() {
|
|
||||||
preg_match_all('/\n/', substr($this->source, 0, strrpos($this->source, $this->entry) + strlen($this->entry)), $lines);
|
|
||||||
return count(array_pop($lines)) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `member` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @param {Number} $index The index of the array value to return.
|
|
||||||
* @returns {Array|String} The entry `member` data.
|
|
||||||
*/
|
|
||||||
public function getMembers( $index = null ) {
|
|
||||||
preg_match('#\*\s*@member(?:Of)?\s+([^\n]+)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
$result = preg_split('/,\s*/', $result);
|
|
||||||
}
|
|
||||||
return $index !== null ? @$result[$index] : $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `name` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `name` data.
|
|
||||||
*/
|
|
||||||
public function getName() {
|
|
||||||
preg_match('#\*\s*@name\s+([^\n]+)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
} else {
|
|
||||||
$result = array_shift(explode('(', $this->getCall()));
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `param` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @param {Number} $index The index of the array value to return.
|
|
||||||
* @returns {Array} The entry `param` data.
|
|
||||||
*/
|
|
||||||
public function getParams( $index = null ) {
|
|
||||||
preg_match_all('#\*\s*@param\s+\{([^}]+)\}\s+(\[[^]]+\]|[$\w]+)\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#i', $this->entry, $result);
|
|
||||||
if (count($result = array_filter(array_slice($result, 1)))) {
|
|
||||||
// repurpose array
|
|
||||||
foreach ($result as $param) {
|
|
||||||
foreach ($param as $key => $value) {
|
|
||||||
if (!is_array($result[0][$key])) {
|
|
||||||
$result[0][$key] = array();
|
|
||||||
}
|
|
||||||
$result[0][$key][] = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$result = $result[0];
|
|
||||||
}
|
|
||||||
return $index !== null ? @$result[$index] : $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `returns` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `returns` data.
|
|
||||||
*/
|
|
||||||
public function getReturns() {
|
|
||||||
preg_match('#\*\s*@returns\s+\{([^}]+)\}\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = array_map('trim', array_slice($result, 1));
|
|
||||||
$result[0] = str_replace('|', ', ', $result[0]);
|
|
||||||
$result[1] = preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]);
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `type` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `type` data.
|
|
||||||
*/
|
|
||||||
public function getType() {
|
|
||||||
preg_match('#\*\s*@type\s+([^\n]+)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
} else {
|
|
||||||
$result = $this->isFunction() ? 'Function' : 'Unknown';
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry is a constructor.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if a constructor, else false.
|
|
||||||
*/
|
|
||||||
public function isCtor() {
|
|
||||||
return !!preg_match('/\*\s*@constructor\b/', $this->entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry *is* assigned to a prototype.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if assigned to a prototype, else false.
|
|
||||||
*/
|
|
||||||
public function isPlugin() {
|
|
||||||
return !$this->isCtor() && !$this->isPrivate() && !$this->isStatic();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry is private.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if private, else false.
|
|
||||||
*/
|
|
||||||
public function isPrivate() {
|
|
||||||
return !!preg_match('/\*\s*@private\b/', $this->entry) || strrpos($this->entry, '@') === false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry is *not* assigned to a prototype.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if not assigned to a prototype, else false.
|
|
||||||
*/
|
|
||||||
public function isStatic() {
|
|
||||||
$public = !$this->isPrivate();
|
|
||||||
$result = $public && !!preg_match('/\*\s*@static\b/', $this->entry);
|
|
||||||
|
|
||||||
// set in cases where it isn't explicitly stated
|
|
||||||
if ($public && !$result) {
|
|
||||||
if ($parent = array_pop(preg_split('/[#.]/', $this->getMembers(0)))) {
|
|
||||||
foreach (Entry::getEntries($this->source) as $entry) {
|
|
||||||
$entry = new Entry($entry, $this->source);
|
|
||||||
if ($entry->getName() == $parent) {
|
|
||||||
$result = !$entry->isCtor();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
410
vendor/docdown/src/DocDown/Generator.php
vendored
410
vendor/docdown/src/DocDown/Generator.php
vendored
@@ -1,410 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require(dirname(__FILE__) . "/Entry.php");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates Markdown from JSDoc entries.
|
|
||||||
*/
|
|
||||||
class Generator {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of JSDoc entries.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @type Array
|
|
||||||
*/
|
|
||||||
public $entries = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An options array used to configure the generator.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @type Array
|
|
||||||
*/
|
|
||||||
public $options = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The entire file's source code.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $source = '';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Generator constructor.
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
* @param {String} $source The source code to parse.
|
|
||||||
* @param {Array} $options The options array.
|
|
||||||
*/
|
|
||||||
public function __construct( $source, $options = array() ) {
|
|
||||||
// juggle arguments
|
|
||||||
if (is_array($source)) {
|
|
||||||
$options = $source;
|
|
||||||
} else {
|
|
||||||
$options['source'] = $source;
|
|
||||||
}
|
|
||||||
if (isset($options['source']) && realpath($options['source'])) {
|
|
||||||
$options['path'] = $options['source'];
|
|
||||||
}
|
|
||||||
if (isset($options['path'])) {
|
|
||||||
preg_match('/(?<=\.)[a-z]+$/', $options['path'], $ext);
|
|
||||||
$options['source'] = file_get_contents($options['path']);
|
|
||||||
$ext = array_pop($ext);
|
|
||||||
|
|
||||||
if (!isset($options['lang']) && $ext) {
|
|
||||||
$options['lang'] = $ext;
|
|
||||||
}
|
|
||||||
if (!isset($options['title'])) {
|
|
||||||
$options['title'] = ucfirst(basename($options['path'])) . ' API documentation';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isset($options['lang'])) {
|
|
||||||
$options['lang'] = 'js';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->options = $options;
|
|
||||||
$this->source = str_replace(PHP_EOL, "\n", $options['source']);
|
|
||||||
$this->entries = Entry::getEntries($this->source);
|
|
||||||
|
|
||||||
foreach ($this->entries as $index => $value) {
|
|
||||||
$this->entries[$index] = new Entry($value, $this->source, $options['lang']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs common string formatting operations.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @static
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {String} $string The string to format.
|
|
||||||
* @returns {String} The formatted string.
|
|
||||||
*/
|
|
||||||
private static function format($string) {
|
|
||||||
$counter = 0;
|
|
||||||
|
|
||||||
// tokenize inline code snippets
|
|
||||||
preg_match_all('/`[^`]+`/', $string, $tokenized);
|
|
||||||
$tokenized = $tokenized[0];
|
|
||||||
foreach ($tokenized as $snippet) {
|
|
||||||
$string = str_replace($snippet, '__token' . ($counter++) .'__', $string);
|
|
||||||
}
|
|
||||||
|
|
||||||
// italicize parentheses
|
|
||||||
$string = preg_replace('/(^|\s)(\([^)]+\))/', '$1*$2*', $string);
|
|
||||||
|
|
||||||
// mark numbers as inline code
|
|
||||||
$string = preg_replace('/ (-?\d+(?:.\d+)?)(?!\.[^\n])/', ' `$1`', $string);
|
|
||||||
|
|
||||||
// detokenize inline code snippets
|
|
||||||
$counter = 0;
|
|
||||||
foreach ($tokenized as $snippet) {
|
|
||||||
$string = str_replace('__token' . ($counter++) . '__', $snippet, $string);
|
|
||||||
}
|
|
||||||
|
|
||||||
return trim($string);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modify a string by replacing named tokens with matching assoc. array values.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @static
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {String} $string The string to modify.
|
|
||||||
* @param {Array|Object} $object The template object.
|
|
||||||
* @returns {String} The modified string.
|
|
||||||
*/
|
|
||||||
private static function interpolate($string, $object) {
|
|
||||||
preg_match_all('/#\{([^}]+)\}/', $string, $tokens);
|
|
||||||
$tokens = array_unique(array_pop($tokens));
|
|
||||||
|
|
||||||
foreach ($tokens as $token) {
|
|
||||||
$pattern = '/#\{' . $token . '\}/';
|
|
||||||
$replacement = '';
|
|
||||||
|
|
||||||
if (is_object($object)) {
|
|
||||||
preg_match('/\(([^)]+?)\)$/', $token, $args);
|
|
||||||
$args = preg_split('/,\s*/', array_pop($args));
|
|
||||||
$method = 'get' . ucfirst(str_replace('/\([^)]+?\)$/', '', $token));
|
|
||||||
|
|
||||||
if (method_exists($object, $method)) {
|
|
||||||
$replacement = (string) call_user_func_array(array($object, $method), $args);
|
|
||||||
} else if (isset($object->{$token})) {
|
|
||||||
$replacement = (string) $object->{$token};
|
|
||||||
}
|
|
||||||
} else if (isset($object[$token])) {
|
|
||||||
$replacement = (string) $object[$token];
|
|
||||||
}
|
|
||||||
$string = preg_replace($pattern, trim($replacement), $string);
|
|
||||||
}
|
|
||||||
return Generator::format($string);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the entry's hash used to navigate the documentation.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {Number|Object} $entry The entry object.
|
|
||||||
* @param {String} $member The name of the member.
|
|
||||||
* @returns {String} The url hash.
|
|
||||||
*/
|
|
||||||
private function getHash( $entry, $member = '' ) {
|
|
||||||
$entry = is_numeric($entry) ? $this->entries[$entry] : $entry;
|
|
||||||
$member = !$member ? $entry->getMembers(0) : $member;
|
|
||||||
$result = ($member ? $member . ($entry->isPlugin() ? 'prototype' : '') : '') . $entry->getCall();
|
|
||||||
$result = preg_replace('/\(\[|\[\]/', '', $result);
|
|
||||||
$result = preg_replace('/[ =\'"{}.()\]]/', '', $result);
|
|
||||||
$result = preg_replace('/[[#,]/', '-', $result);
|
|
||||||
return strtolower($result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the entry's url for the specific line number.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {Number|Object} $entry The entry object.
|
|
||||||
* @returns {String} The url.
|
|
||||||
*/
|
|
||||||
private function getLineUrl( $entry ) {
|
|
||||||
$entry = is_numeric($entry) ? $this->entries($entry) : $entry;
|
|
||||||
return $this->options['url'] . '#L' . $entry->getLineNumber();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the character used to separate the entry's name from its member.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {Number|Object} $entry The entry object.
|
|
||||||
* @returns {String} The separator.
|
|
||||||
*/
|
|
||||||
private function getSeparator( $entry ) {
|
|
||||||
$entry = is_numeric($entry) ? $this->entries($entry) : $entry;
|
|
||||||
return $entry->isPlugin() ? '.prototype.' : '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates Markdown from JSDoc entries.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @returns {String} The rendered Markdown.
|
|
||||||
*/
|
|
||||||
public function generate() {
|
|
||||||
$api = array();
|
|
||||||
$compiling = false;
|
|
||||||
$openTag = "\n<!-- div -->\n";
|
|
||||||
$closeTag = "\n<!-- /div -->\n";
|
|
||||||
$result = array('# ' . $this->options['title']);
|
|
||||||
|
|
||||||
// initialize $api array
|
|
||||||
foreach ($this->entries as $entry) {
|
|
||||||
|
|
||||||
if (!$entry->isPrivate()) {
|
|
||||||
$name = $entry->getName();
|
|
||||||
$members = $entry->getMembers();
|
|
||||||
$members = count($members) ? $members : array('');
|
|
||||||
|
|
||||||
foreach ($members as $member) {
|
|
||||||
// create api category arrays
|
|
||||||
if (!isset($api[$member]) && $member) {
|
|
||||||
$api[$member] = new Entry('', '', $entry->lang);
|
|
||||||
$api[$member]->static = array();
|
|
||||||
$api[$member]->plugin = array();
|
|
||||||
}
|
|
||||||
// append entry to api category
|
|
||||||
if (!$member || $entry->isCtor() || ($entry->getType() == 'Object' &&
|
|
||||||
!preg_match('/[=:]\s*null\s*[,;]?$/', $entry->entry))) {
|
|
||||||
$member = ($member ? $member . ($entry->isPlugin() ? '#' : '.') : '') . $name;
|
|
||||||
$entry->static = @$api[$member] ? $api[$member]->static : array();
|
|
||||||
$entry->plugin = @$api[$member] ? $api[$member]->plugin : array();
|
|
||||||
$api[$member] = $entry;
|
|
||||||
}
|
|
||||||
else if ($entry->isStatic()) {
|
|
||||||
$api[$member]->static[] = $entry;
|
|
||||||
} else if (!$entry->isCtor()) {
|
|
||||||
$api[$member]->plugin[] = $entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// custom sort for root level entries
|
|
||||||
// TODO: see how well it handles deeper namespace traversal
|
|
||||||
function sortCompare($a, $b) {
|
|
||||||
$score = array( 'a' => 0, 'b' => 0);
|
|
||||||
foreach (array( 'a' => $a, 'b' => $b) as $key => $value) {
|
|
||||||
// capitalized keys that represent constructor properties are last
|
|
||||||
if (preg_match('/[#.][A-Z]/', $value)) {
|
|
||||||
$score[$key] = 0;
|
|
||||||
}
|
|
||||||
// lowercase keys with prototype properties are next to last
|
|
||||||
else if (preg_match('/#[a-z]/', $value)) {
|
|
||||||
$score[$key] = 1;
|
|
||||||
}
|
|
||||||
// lowercase keys with static properties next to first
|
|
||||||
else if (preg_match('/\.[a-z]/', $value)) {
|
|
||||||
$score[$key] = 2;
|
|
||||||
}
|
|
||||||
// lowercase keys with no properties are first
|
|
||||||
else if (preg_match('/^[^#.]+$/', $value)) {
|
|
||||||
$score[$key] = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$score = $score['b'] - $score['a'];
|
|
||||||
return $score ? $score : strcasecmp($a, $b);
|
|
||||||
}
|
|
||||||
|
|
||||||
uksort($api, 'sortCompare');
|
|
||||||
|
|
||||||
// sort static and plugin sub-entries
|
|
||||||
foreach ($api as $entry) {
|
|
||||||
foreach (array('static', 'plugin') as $kind) {
|
|
||||||
$sortBy = array( 'a' => array(), 'b' => array(), 'c' => array() );
|
|
||||||
foreach ($entry->{$kind} as $subentry) {
|
|
||||||
$name = $subentry->getName();
|
|
||||||
// functions w/o ALL-CAPs names are last
|
|
||||||
$sortBy['a'][] = $subentry->getType() == 'Function' && !preg_match('/^[A-Z_]+$/', $name);
|
|
||||||
// ALL-CAPs properties first
|
|
||||||
$sortBy['b'][] = preg_match('/^[A-Z_]+$/', $name);
|
|
||||||
// lowercase alphanumeric sort
|
|
||||||
$sortBy['c'][] = strtolower($name);
|
|
||||||
}
|
|
||||||
array_multisort($sortBy['a'], SORT_ASC, $sortBy['b'], SORT_DESC, $sortBy['c'], SORT_ASC, $entry->{$kind});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// compile TOC
|
|
||||||
$result[] = $openTag;
|
|
||||||
|
|
||||||
foreach ($api as $key => $entry) {
|
|
||||||
$entry->hash = $this->getHash($entry);
|
|
||||||
$entry->href = $this->getLineUrl($entry);
|
|
||||||
|
|
||||||
$member = $entry->getMembers(0);
|
|
||||||
$member = ($member ? $member . ($entry->isPlugin() ? '.prototype.' : '.') : '') . $entry->getName();
|
|
||||||
|
|
||||||
$entry->member = preg_replace('/' . $entry->getName() . '$/', '', $member);
|
|
||||||
|
|
||||||
$compiling = $compiling ? ($result[] = $closeTag) : true;
|
|
||||||
|
|
||||||
// add root entry
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$openTag, '## ' . (count($result) == 2 ? '<a id="toc"></a>' : '') . '`' . $member . '`',
|
|
||||||
Generator::interpolate('* [`' . $member . '`](##{hash})', $entry)
|
|
||||||
);
|
|
||||||
|
|
||||||
// add static and plugin sub-entries
|
|
||||||
foreach (array('static', 'plugin') as $kind) {
|
|
||||||
if ($kind == 'plugin' && count($entry->plugin)) {
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$closeTag,
|
|
||||||
$openTag,
|
|
||||||
'## `' . $member . ($entry->isCtor() ? '.prototype`' : '`')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
foreach ($entry->{$kind} as $subentry) {
|
|
||||||
$subentry->hash = $this->getHash($subentry);
|
|
||||||
$subentry->href = $this->getLineUrl($subentry);
|
|
||||||
$subentry->member = $member;
|
|
||||||
$subentry->separator = $this->getSeparator($subentry);
|
|
||||||
$result[] = Generator::interpolate('* [`#{member}#{separator}#{name}`](##{hash})', $subentry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
array_push($result, $closeTag, $closeTag);
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// compile content
|
|
||||||
$compiling = false;
|
|
||||||
$result[] = $openTag;
|
|
||||||
|
|
||||||
foreach ($api as $entry) {
|
|
||||||
// add root entry
|
|
||||||
$member = $entry->member . $entry->getName();
|
|
||||||
$compiling = $compiling ? ($result[] = $closeTag) : true;
|
|
||||||
|
|
||||||
array_push($result, $openTag, '## `' . $member . '`');
|
|
||||||
|
|
||||||
foreach (array($entry, 'static', 'plugin') as $kind) {
|
|
||||||
$subentries = is_string($kind) ? $entry->{$kind} : array($kind);
|
|
||||||
|
|
||||||
// title
|
|
||||||
if ($kind != 'static' && $entry->getType() != 'Object' &&
|
|
||||||
count($subentries) && $subentries[0] != $kind) {
|
|
||||||
if ($kind == 'plugin') {
|
|
||||||
$result[] = $closeTag;
|
|
||||||
}
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$openTag,
|
|
||||||
'## `' . $member . ($kind == 'plugin' ? '.prototype`' : '`')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// body
|
|
||||||
foreach ($subentries as $subentry) {
|
|
||||||
// description
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$openTag,
|
|
||||||
Generator::interpolate("### <a id=\"#{hash}\"></a>`#{member}#{separator}#{call}`\n<a href=\"##{hash}\">#</a> [Ⓢ](#{href} \"View in source\") [Ⓣ][1]\n\n#{desc}", $subentry)
|
|
||||||
);
|
|
||||||
|
|
||||||
// @param
|
|
||||||
if (count($params = $subentry->getParams())) {
|
|
||||||
array_push($result, '', '#### Arguments');
|
|
||||||
foreach ($params as $index => $param) {
|
|
||||||
$result[] = Generator::interpolate('#{num}. `#{name}` (#{type}): #{desc}', array(
|
|
||||||
'desc' => $param[2],
|
|
||||||
'name' => $param[1],
|
|
||||||
'num' => $index + 1,
|
|
||||||
'type' => $param[0]
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// @returns
|
|
||||||
if (count($returns = $subentry->getReturns())) {
|
|
||||||
array_push(
|
|
||||||
$result, '',
|
|
||||||
'#### Returns',
|
|
||||||
Generator::interpolate('(#{type}): #{desc}', array('desc' => $returns[1], 'type' => $returns[0]))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// @example
|
|
||||||
if ($example = $subentry->getExample()) {
|
|
||||||
array_push($result, '', '#### Example', $example);
|
|
||||||
}
|
|
||||||
array_push($result, "\n* * *", $closeTag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// close tags add TOC link reference
|
|
||||||
array_push($result, $closeTag, $closeTag, '', ' [1]: #toc "Jump back to the TOC."');
|
|
||||||
|
|
||||||
// cleanup whitespace
|
|
||||||
return trim(preg_replace('/ +\n/', "\n", join($result, "\n")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
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,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
http://www.JSON.org/json2.js
|
json2.js
|
||||||
2009-09-29
|
2015-05-03
|
||||||
|
|
||||||
Public Domain.
|
Public Domain.
|
||||||
|
|
||||||
@@ -17,7 +17,9 @@
|
|||||||
|
|
||||||
|
|
||||||
This file creates a global JSON object containing two methods: stringify
|
This file creates a global JSON object containing two methods: stringify
|
||||||
and parse.
|
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)
|
JSON.stringify(value, replacer, space)
|
||||||
value any JavaScript value, usually an object or array.
|
value any JavaScript value, usually an object or array.
|
||||||
@@ -48,7 +50,9 @@
|
|||||||
Date.prototype.toJSON = function (key) {
|
Date.prototype.toJSON = function (key) {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
// Format integers to have at least two digits.
|
// Format integers to have at least two digits.
|
||||||
return n < 10 ? '0' + n : n;
|
return n < 10
|
||||||
|
? '0' + n
|
||||||
|
: n;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getUTCFullYear() + '-' +
|
return this.getUTCFullYear() + '-' +
|
||||||
@@ -94,8 +98,9 @@
|
|||||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||||
|
|
||||||
text = JSON.stringify([new Date()], function (key, value) {
|
text = JSON.stringify([new Date()], function (key, value) {
|
||||||
return this[key] instanceof Date ?
|
return this[key] instanceof Date
|
||||||
'Date(' + this[key] + ')' : value;
|
? 'Date(' + this[key] + ')'
|
||||||
|
: value;
|
||||||
});
|
});
|
||||||
// text is '["Date(---current time---)"]'
|
// text is '["Date(---current time---)"]'
|
||||||
|
|
||||||
@@ -146,10 +151,12 @@
|
|||||||
redistribute.
|
redistribute.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*jslint evil: true, strict: false */
|
/*jslint
|
||||||
|
eval, for, this
|
||||||
|
*/
|
||||||
|
|
||||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
/*property
|
||||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||||
test, toJSON, toString, valueOf
|
test, toJSON, toString, valueOf
|
||||||
@@ -159,50 +166,53 @@
|
|||||||
// Create a JSON object only if one does not already exist. We create the
|
// Create a JSON object only if one does not already exist. We create the
|
||||||
// methods in a closure to avoid creating global variables.
|
// methods in a closure to avoid creating global variables.
|
||||||
|
|
||||||
if (!this.JSON) {
|
if (typeof JSON !== 'object') {
|
||||||
this.JSON = {};
|
JSON = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
(function () {
|
(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) {
|
function f(n) {
|
||||||
// Format integers to have at least two digits.
|
// Format integers to have at least two digits.
|
||||||
return n < 10 ? '0' + n : n;
|
return n < 10
|
||||||
|
? '0' + n
|
||||||
|
: n;
|
||||||
|
}
|
||||||
|
|
||||||
|
function this_value() {
|
||||||
|
return this.valueOf();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof Date.prototype.toJSON !== 'function') {
|
if (typeof Date.prototype.toJSON !== 'function') {
|
||||||
|
|
||||||
Date.prototype.toJSON = function (key) {
|
Date.prototype.toJSON = function () {
|
||||||
|
|
||||||
return isFinite(this.valueOf()) ?
|
return isFinite(this.valueOf())
|
||||||
this.getUTCFullYear() + '-' +
|
? this.getUTCFullYear() + '-' +
|
||||||
f(this.getUTCMonth() + 1) + '-' +
|
f(this.getUTCMonth() + 1) + '-' +
|
||||||
f(this.getUTCDate()) + 'T' +
|
f(this.getUTCDate()) + 'T' +
|
||||||
f(this.getUTCHours()) + ':' +
|
f(this.getUTCHours()) + ':' +
|
||||||
f(this.getUTCMinutes()) + ':' +
|
f(this.getUTCMinutes()) + ':' +
|
||||||
f(this.getUTCSeconds()) + 'Z' : null;
|
f(this.getUTCSeconds()) + 'Z'
|
||||||
|
: null;
|
||||||
};
|
};
|
||||||
|
|
||||||
String.prototype.toJSON =
|
Boolean.prototype.toJSON = this_value;
|
||||||
Number.prototype.toJSON =
|
Number.prototype.toJSON = this_value;
|
||||||
Boolean.prototype.toJSON = function (key) {
|
String.prototype.toJSON = this_value;
|
||||||
return this.valueOf();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
var gap,
|
||||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
|
||||||
gap,
|
|
||||||
indent,
|
indent,
|
||||||
meta = { // table of character substitutions
|
meta,
|
||||||
'\b': '\\b',
|
|
||||||
'\t': '\\t',
|
|
||||||
'\n': '\\n',
|
|
||||||
'\f': '\\f',
|
|
||||||
'\r': '\\r',
|
|
||||||
'"' : '\\"',
|
|
||||||
'\\': '\\\\'
|
|
||||||
},
|
|
||||||
rep;
|
rep;
|
||||||
|
|
||||||
|
|
||||||
@@ -213,14 +223,15 @@ if (!this.JSON) {
|
|||||||
// Otherwise we must also replace the offending characters with safe escape
|
// Otherwise we must also replace the offending characters with safe escape
|
||||||
// sequences.
|
// sequences.
|
||||||
|
|
||||||
escapable.lastIndex = 0;
|
rx_escapable.lastIndex = 0;
|
||||||
return escapable.test(string) ?
|
return rx_escapable.test(string)
|
||||||
'"' + string.replace(escapable, function (a) {
|
? '"' + string.replace(rx_escapable, function (a) {
|
||||||
var c = meta[a];
|
var c = meta[a];
|
||||||
return typeof c === 'string' ? c :
|
return typeof c === 'string'
|
||||||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
? c
|
||||||
}) + '"' :
|
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
'"' + string + '"';
|
}) + '"'
|
||||||
|
: '"' + string + '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -260,7 +271,9 @@ if (!this.JSON) {
|
|||||||
|
|
||||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||||
|
|
||||||
return isFinite(value) ? String(value) : 'null';
|
return isFinite(value)
|
||||||
|
? String(value)
|
||||||
|
: 'null';
|
||||||
|
|
||||||
case 'boolean':
|
case 'boolean':
|
||||||
case 'null':
|
case 'null':
|
||||||
@@ -303,11 +316,11 @@ if (!this.JSON) {
|
|||||||
// Join all of the elements together, separated with commas, and wrap them in
|
// Join all of the elements together, separated with commas, and wrap them in
|
||||||
// brackets.
|
// brackets.
|
||||||
|
|
||||||
v = partial.length === 0 ? '[]' :
|
v = partial.length === 0
|
||||||
gap ? '[\n' + gap +
|
? '[]'
|
||||||
partial.join(',\n' + gap) + '\n' +
|
: gap
|
||||||
mind + ']' :
|
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
||||||
'[' + partial.join(',') + ']';
|
: '[' + partial.join(',') + ']';
|
||||||
gap = mind;
|
gap = mind;
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
@@ -317,11 +330,15 @@ if (!this.JSON) {
|
|||||||
if (rep && typeof rep === 'object') {
|
if (rep && typeof rep === 'object') {
|
||||||
length = rep.length;
|
length = rep.length;
|
||||||
for (i = 0; i < length; i += 1) {
|
for (i = 0; i < length; i += 1) {
|
||||||
|
if (typeof rep[i] === 'string') {
|
||||||
k = rep[i];
|
k = rep[i];
|
||||||
if (typeof k === 'string') {
|
|
||||||
v = str(k, value);
|
v = str(k, value);
|
||||||
if (v) {
|
if (v) {
|
||||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
partial.push(quote(k) + (
|
||||||
|
gap
|
||||||
|
? ': '
|
||||||
|
: ':'
|
||||||
|
) + v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,10 +347,14 @@ if (!this.JSON) {
|
|||||||
// Otherwise, iterate through all of the keys in the object.
|
// Otherwise, iterate through all of the keys in the object.
|
||||||
|
|
||||||
for (k in value) {
|
for (k in value) {
|
||||||
if (Object.hasOwnProperty.call(value, k)) {
|
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||||
v = str(k, value);
|
v = str(k, value);
|
||||||
if (v) {
|
if (v) {
|
||||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
partial.push(quote(k) + (
|
||||||
|
gap
|
||||||
|
? ': '
|
||||||
|
: ':'
|
||||||
|
) + v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,9 +363,11 @@ if (!this.JSON) {
|
|||||||
// Join all of the member texts together, separated with commas,
|
// Join all of the member texts together, separated with commas,
|
||||||
// and wrap them in braces.
|
// and wrap them in braces.
|
||||||
|
|
||||||
v = partial.length === 0 ? '{}' :
|
v = partial.length === 0
|
||||||
gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
|
? '{}'
|
||||||
mind + '}' : '{' + partial.join(',') + '}';
|
: gap
|
||||||
|
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
||||||
|
: '{' + partial.join(',') + '}';
|
||||||
gap = mind;
|
gap = mind;
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
@@ -353,6 +376,15 @@ if (!this.JSON) {
|
|||||||
// If the JSON object does not yet have a stringify method, give it one.
|
// If the JSON object does not yet have a stringify method, give it one.
|
||||||
|
|
||||||
if (typeof JSON.stringify !== 'function') {
|
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) {
|
JSON.stringify = function (value, replacer, space) {
|
||||||
|
|
||||||
// The stringify method takes a value and an optional replacer, and an optional
|
// The stringify method takes a value and an optional replacer, and an optional
|
||||||
@@ -415,7 +447,7 @@ if (!this.JSON) {
|
|||||||
var k, v, value = holder[key];
|
var k, v, value = holder[key];
|
||||||
if (value && typeof value === 'object') {
|
if (value && typeof value === 'object') {
|
||||||
for (k in value) {
|
for (k in value) {
|
||||||
if (Object.hasOwnProperty.call(value, k)) {
|
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||||
v = walk(value, k);
|
v = walk(value, k);
|
||||||
if (v !== undefined) {
|
if (v !== undefined) {
|
||||||
value[k] = v;
|
value[k] = v;
|
||||||
@@ -433,9 +465,10 @@ if (!this.JSON) {
|
|||||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||||
|
|
||||||
cx.lastIndex = 0;
|
text = String(text);
|
||||||
if (cx.test(text)) {
|
rx_dangerous.lastIndex = 0;
|
||||||
text = text.replace(cx, function (a) {
|
if (rx_dangerous.test(text)) {
|
||||||
|
text = text.replace(rx_dangerous, function (a) {
|
||||||
return '\\u' +
|
return '\\u' +
|
||||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
});
|
});
|
||||||
@@ -454,10 +487,14 @@ if (!this.JSON) {
|
|||||||
// we look to see that the remaining characters are only whitespace or ']' or
|
// 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.
|
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||||
|
|
||||||
if (/^[\],:{}\s]*$/.
|
if (
|
||||||
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
|
rx_one.test(
|
||||||
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
|
text
|
||||||
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
.replace(rx_two, '@')
|
||||||
|
.replace(rx_three, ']')
|
||||||
|
.replace(rx_four, '')
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
|
||||||
// In the third stage we use the eval function to compile the text into a
|
// 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
|
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||||
@@ -469,8 +506,9 @@ replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
|||||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||||
// each name/value pair to a reviver function for possible transformation.
|
// each name/value pair to a reviver function for possible transformation.
|
||||||
|
|
||||||
return typeof reviver === 'function' ?
|
return typeof reviver === 'function'
|
||||||
walk({'': j}, '') : j;
|
? walk({'': j}, '')
|
||||||
|
: j;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||||
20
vendor/qunit-clib/LICENSE.txt
vendored
20
vendor/qunit-clib/LICENSE.txt
vendored
@@ -1,20 +0,0 @@
|
|||||||
Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
|
|
||||||
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.
|
|
||||||
65
vendor/qunit-clib/README.md
vendored
65
vendor/qunit-clib/README.md
vendored
@@ -1,65 +0,0 @@
|
|||||||
# QUnit CLIB <sup>v1.0.0-pre</sup>
|
|
||||||
## command-line interface boilerplate
|
|
||||||
|
|
||||||
QUnit CLIB helps extend QUnit's CLI support to many common CLI environments<sup><a name="fnref1" href="#fn1">1</a></sup>.
|
|
||||||
|
|
||||||
## Screenshot
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
~~~ js
|
|
||||||
(function(window) {
|
|
||||||
|
|
||||||
// use a single load function
|
|
||||||
var load = typeof require == 'function' ? require : window.load;
|
|
||||||
|
|
||||||
// load QUnit and CLIB if needed
|
|
||||||
var QUnit =
|
|
||||||
window.QUnit || (
|
|
||||||
window.setTimeout || (window.addEventListener = window.setTimeout = / /),
|
|
||||||
window.QUnit = load('path/to/qunit.js') || window.QUnit,
|
|
||||||
load('path/to/qunit-clib.js'),
|
|
||||||
(window.addEventListener || 0).test && delete window.addEventListener,
|
|
||||||
window.QUnit
|
|
||||||
);
|
|
||||||
|
|
||||||
// explicitly call `QUnit.module()` instead of `module()`
|
|
||||||
// in case we are in a CLI environment
|
|
||||||
QUnit.module('A Test Module');
|
|
||||||
|
|
||||||
test('A Test', function() {
|
|
||||||
// ...
|
|
||||||
});
|
|
||||||
|
|
||||||
// must call `QUnit.start()` if using QUnit < 1.3.0 with Node.js or any
|
|
||||||
// version of QUnit with Narwhal, Rhino, or RingoJS
|
|
||||||
if (!window.document) {
|
|
||||||
QUnit.start();
|
|
||||||
}
|
|
||||||
}(typeof global == 'object' && global || this));
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Cloning this repo
|
|
||||||
|
|
||||||
To clone this repository just use:
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
git clone https://github.com/jdalton/qunit-clib.git
|
|
||||||
cd qunit-clib
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Feel free to fork and send pull requests if you see improvements!
|
|
||||||
|
|
||||||
## Footnotes
|
|
||||||
|
|
||||||
1. QUnit CLIB has been tested in at least Node.js v0.4.8-0.6.1, Narwhal v0.3.2, RingoJS v0.7.0-0.8.0, and Rhino v1.7RC3.
|
|
||||||
<a name="fn1" title="Jump back to footnote 1 in the text." href="#fnref1">↩</a>
|
|
||||||
|
|
||||||
2. QUnit v1.3.0 does not work with Narwhal or Ringo < v0.8.0
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
311
vendor/qunit-clib/qunit-clib.js
vendored
311
vendor/qunit-clib/qunit-clib.js
vendored
@@ -1,311 +0,0 @@
|
|||||||
/*!
|
|
||||||
* QUnit CLI Boilerplate v1.0.0-pre
|
|
||||||
* Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
* Based on a gist by Jörn Zaefferer <https://gist.github.com/722381>
|
|
||||||
* Available under MIT license <http://mths.be/mit>
|
|
||||||
*/
|
|
||||||
;(function(global) {
|
|
||||||
|
|
||||||
/** Add `console.log()` support for Narwhal, Rhino, and RingoJS */
|
|
||||||
global.console || (global.console = { 'log': global.print });
|
|
||||||
|
|
||||||
/** Reduce global.QUnit.QUnit -> global.QUnit */
|
|
||||||
global.QUnit && (QUnit = QUnit.QUnit || QUnit);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/** Used as a horizontal rule in console output */
|
|
||||||
var hr = '----------------------------------------';
|
|
||||||
|
|
||||||
/** Shortcut used to convert array-like objects to arrays */
|
|
||||||
var slice = [].slice;
|
|
||||||
|
|
||||||
/** Used to resolve a value's internal [[Class]] */
|
|
||||||
var toString = {}.toString;
|
|
||||||
|
|
||||||
/** Used by timer methods */
|
|
||||||
var timer,
|
|
||||||
counter = 0,
|
|
||||||
ids = {};
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An iteration utility for arrays.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} array The array to iterate over.
|
|
||||||
* @param {Function} callback The function called per iteration.
|
|
||||||
*/
|
|
||||||
function each(array, callback) {
|
|
||||||
var index = -1,
|
|
||||||
length = array.length;
|
|
||||||
|
|
||||||
while (++index < length) {
|
|
||||||
callback(array[index], index, array);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the specified `value` is a function.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Mixed} value The value to check.
|
|
||||||
* @returns {Boolean} Returns `true` if `value` is a function, else `false`.
|
|
||||||
*/
|
|
||||||
function isFunction(value) {
|
|
||||||
return toString.call(value) == '[object Function]';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Timeout fallbacks based on the work of Andrea Giammarchi and Weston C.
|
|
||||||
* https://github.com/WebReflection/wru/blob/master/src/rhinoTimers.js
|
|
||||||
* http://stackoverflow.com/questions/2261705/how-to-run-a-javascript-function-asynchronously-without-using-settimeout
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears the delay set by `setInterval` or `setTimeout`.
|
|
||||||
*
|
|
||||||
* @memberOf global
|
|
||||||
* @param {Number} id The ID of the timeout to be cleared.
|
|
||||||
*/
|
|
||||||
function clearTimer(id) {
|
|
||||||
if (ids[id]) {
|
|
||||||
ids[id].cancel();
|
|
||||||
timer.purge();
|
|
||||||
delete ids[id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedules timer-based callbacks.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Function} fn The function to call.
|
|
||||||
* @oaram {Number} delay The number of milliseconds to delay the `fn` call.
|
|
||||||
* @param [arg1, arg2, ...] Arguments to invoke `fn` with.
|
|
||||||
* @param {Boolean} repeated A flag to specify whether `fn` is called repeatedly.
|
|
||||||
* @returns {Number} The the ID of the timeout.
|
|
||||||
*/
|
|
||||||
function schedule(fn, delay, args, repeated) {
|
|
||||||
var task = ids[++counter] = new JavaAdapter(java.util.TimerTask, {
|
|
||||||
'run': function() {
|
|
||||||
fn.apply(global, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// support non-functions
|
|
||||||
if (!isFunction(fn)) {
|
|
||||||
fn = (function(code) {
|
|
||||||
code = String(code);
|
|
||||||
return function() { eval(code); };
|
|
||||||
}(fn));
|
|
||||||
}
|
|
||||||
// used by setInterval
|
|
||||||
if (repeated) {
|
|
||||||
timer.schedule(task, delay, delay);
|
|
||||||
}
|
|
||||||
// used by setTimeout
|
|
||||||
else {
|
|
||||||
timer.schedule(task, delay);
|
|
||||||
}
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes a code snippet or function repeatedly, with a delay between each call.
|
|
||||||
*
|
|
||||||
* @memberOf global
|
|
||||||
* @param {Function|String} fn The function to call or string to evaluate.
|
|
||||||
* @oaram {Number} delay The number of milliseconds to delay each `fn` call.
|
|
||||||
* @param [arg1, arg2, ...] Arguments to invoke `fn` with.
|
|
||||||
* @returns {Number} The the ID of the timeout.
|
|
||||||
*/
|
|
||||||
function setInterval(fn, delay) {
|
|
||||||
return schedule(fn, delay, slice.call(arguments, 2), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes a code snippet or a function after specified delay.
|
|
||||||
*
|
|
||||||
* @memberOf global
|
|
||||||
* @param {Function|String} fn The function to call or string to evaluate.
|
|
||||||
* @oaram {Number} delay The number of milliseconds to delay the `fn` call.
|
|
||||||
* @param [arg1, arg2, ...] Arguments to invoke `fn` with.
|
|
||||||
* @returns {Number} The the ID of the timeout.
|
|
||||||
*/
|
|
||||||
function setTimeout(fn, delay) {
|
|
||||||
return schedule(fn, delay, slice.call(arguments, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered when all testing is completed.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with properties `failed`, `passed`,
|
|
||||||
* `runtime`, and `total`.
|
|
||||||
*/
|
|
||||||
function done(details) {
|
|
||||||
// stop `asyncTest()` from erroneously calling `done()` twice in environments w/o timeouts
|
|
||||||
if (!QUnit.doneCalled) {
|
|
||||||
console.log(hr);
|
|
||||||
console.log(' PASS: ' + details.passed + ' FAIL: ' + details.failed + ' TOTAL: ' + details.total);
|
|
||||||
console.log(' Finished in ' + details.runtime + ' milliseconds.');
|
|
||||||
console.log(hr);
|
|
||||||
|
|
||||||
// exit out of Rhino
|
|
||||||
try {
|
|
||||||
quit();
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// exit out of Node.js
|
|
||||||
try {
|
|
||||||
process.exit();
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// prevent multiple calls to `done()`
|
|
||||||
QUnit.doneCalled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered after every assertion.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with properties `actual`, `expected`,
|
|
||||||
* `message`, and `result`.
|
|
||||||
*/
|
|
||||||
function log(details) {
|
|
||||||
var expected = details.expected,
|
|
||||||
result = details.result,
|
|
||||||
type = typeof expected != 'undefined' ? 'EQ' : 'OK',
|
|
||||||
assertion = [
|
|
||||||
result ? 'PASS' : 'FAIL',
|
|
||||||
type,
|
|
||||||
details.message || 'ok'
|
|
||||||
];
|
|
||||||
|
|
||||||
if (!result && type == 'EQ') {
|
|
||||||
assertion.push('Expected: ' + expected + ', Actual: ' + details.actual);
|
|
||||||
}
|
|
||||||
QUnit.config.testStats.assertions.push(assertion.join(' | '));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered at the start of every test module.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with property `name`.
|
|
||||||
*/
|
|
||||||
function moduleStart(details) {
|
|
||||||
console.log(hr);
|
|
||||||
console.log(details.name);
|
|
||||||
console.log(hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an object into a string representation.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @type Function
|
|
||||||
* @param {Object} object The object to stringify.
|
|
||||||
* @returns {String} The result string.
|
|
||||||
*/
|
|
||||||
var parseObject = (function() {
|
|
||||||
var _parseObject = QUnit.jsDump.parsers.object;
|
|
||||||
return function(object) {
|
|
||||||
// fork to support Rhino's error objects
|
|
||||||
if (typeof object.rhinoException == 'object') {
|
|
||||||
return object.name +
|
|
||||||
' { message: "' + object.message +
|
|
||||||
'", fileName: "' + object.fileName +
|
|
||||||
'", lineNumber: ' + object.lineNumber + ' }';
|
|
||||||
}
|
|
||||||
return _parseObject(object);
|
|
||||||
};
|
|
||||||
}());
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered after a test is completed.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with properties `failed`, `name`,
|
|
||||||
* `passed`, and `total`.
|
|
||||||
*/
|
|
||||||
function testDone(details) {
|
|
||||||
var assertions = QUnit.config.testStats.assertions,
|
|
||||||
name = details.name;
|
|
||||||
|
|
||||||
if (details.failed > 0) {
|
|
||||||
console.log(' FAIL - '+ name);
|
|
||||||
each(assertions, function(value) {
|
|
||||||
console.log(' ' + value);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log(' PASS - ' + name);
|
|
||||||
}
|
|
||||||
assertions.length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An object used to hold information about the current running test.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit.config
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
QUnit.config.testStats = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of test summaries (pipe separated).
|
|
||||||
*
|
|
||||||
* @memberOf QUnit.config.testStats
|
|
||||||
* @type Array
|
|
||||||
*/
|
|
||||||
'assertions': []
|
|
||||||
};
|
|
||||||
|
|
||||||
// add shortcuts to the global
|
|
||||||
// exclude `module` because some environments have it as a built-in object
|
|
||||||
each(['asyncTest', 'deepEqual', 'equal', 'equals', 'expect', 'notDeepEqual',
|
|
||||||
'notEqual', 'notStrictEqual', 'ok', 'raises', 'same', 'start', 'stop',
|
|
||||||
'strictEqual', 'test'], function(name) {
|
|
||||||
global[name] = QUnit[name];
|
|
||||||
});
|
|
||||||
|
|
||||||
// expose timer methods to global
|
|
||||||
try {
|
|
||||||
timer = new java.util.Timer;
|
|
||||||
if (!isFunction(global.clearInterval)) {
|
|
||||||
global.clearInterval = clearTimer;
|
|
||||||
}
|
|
||||||
if (!isFunction(global.clearTimeout)) {
|
|
||||||
global.clearTimeout = clearTimer;
|
|
||||||
}
|
|
||||||
if (!isFunction(global.setInterval)) {
|
|
||||||
global.setInterval = setInterval;
|
|
||||||
}
|
|
||||||
if (!isFunction(global.setTimeout)) {
|
|
||||||
global.setTimeout = setTimeout;
|
|
||||||
}
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// add callbacks
|
|
||||||
QUnit.done(done);
|
|
||||||
QUnit.log(log);
|
|
||||||
QUnit.moduleStart(moduleStart);
|
|
||||||
QUnit.testDone(testDone);
|
|
||||||
|
|
||||||
// wrap `parseObject`
|
|
||||||
QUnit.jsDump.parsers.object = parseObject;
|
|
||||||
|
|
||||||
// must call `QUnit.start()` in the test file if using QUnit < 1.3.0 with Node.js
|
|
||||||
// or any version of QUnit with Narwhal, Rhino, or RingoJS
|
|
||||||
QUnit.init();
|
|
||||||
|
|
||||||
}(typeof global == 'object' && global || this));
|
|
||||||
48
vendor/qunit/README.md
vendored
48
vendor/qunit/README.md
vendored
@@ -1,48 +0,0 @@
|
|||||||
[QUnit](http://docs.jquery.com/QUnit) - A JavaScript Unit Testing framework.
|
|
||||||
================================
|
|
||||||
|
|
||||||
QUnit is a powerful, easy-to-use, JavaScript test suite. It's used by the jQuery
|
|
||||||
project to test its code and plugins but is capable of testing any generic
|
|
||||||
JavaScript code (and even capable of testing JavaScript code on the server-side).
|
|
||||||
|
|
||||||
QUnit is especially useful for regression testing: Whenever a bug is reported,
|
|
||||||
write a test that asserts the existence of that particular bug. Then fix it and
|
|
||||||
commit both. Every time you work on the code again, run the tests. If the bug
|
|
||||||
comes up again - a regression - you'll spot it immediately and know how to fix
|
|
||||||
it, because you know what code you just changed.
|
|
||||||
|
|
||||||
Having good unit test coverage makes safe refactoring easy and cheap. You can
|
|
||||||
run the tests after each small refactoring step and always know what change
|
|
||||||
broke something.
|
|
||||||
|
|
||||||
QUnit is similar to other unit testing frameworks like JUnit, but makes use of
|
|
||||||
the features JavaScript provides and helps with testing code in the browser, e.g.
|
|
||||||
with its stop/start facilities for testing asynchronous code.
|
|
||||||
|
|
||||||
If you are interested in helping developing QUnit, you are in the right place.
|
|
||||||
For related discussions, visit the
|
|
||||||
[QUnit and Testing forum](http://forum.jquery.com/qunit-and-testing).
|
|
||||||
|
|
||||||
Planning for a qunitjs.com site and other testing tools related work now happens
|
|
||||||
on the [jQuery Testing Team planning wiki](http://jquerytesting.pbworks.com/w/page/41556026/FrontPage).
|
|
||||||
|
|
||||||
Development
|
|
||||||
-----------
|
|
||||||
|
|
||||||
To submit patches, fork the repository, create a branch for the change. Then implement
|
|
||||||
the change, run `grunt` to lint and test it, then commit, push and create a pull request.
|
|
||||||
|
|
||||||
Include some background for the change in the commit message and `Fixes #nnn`, referring
|
|
||||||
to the issue number you're addressing.
|
|
||||||
|
|
||||||
To run `grunt`, you need `node` and `npm`, then `npm install grunt -g`.
|
|
||||||
|
|
||||||
Releases
|
|
||||||
--------
|
|
||||||
|
|
||||||
Install git-extras and run `git changelog` to update History.md.
|
|
||||||
Update qunit/qunit.js|css to the release version, commit and tag, update them
|
|
||||||
again to the next version, commit and push commits and tags.
|
|
||||||
|
|
||||||
Put the 'v' in front of the tag (unlike the 1.1.0 release). Clean up the changelog,
|
|
||||||
removing merge commits or whitespace cleanups.
|
|
||||||
236
vendor/qunit/qunit/qunit.css
vendored
236
vendor/qunit/qunit/qunit.css
vendored
@@ -1,236 +0,0 @@
|
|||||||
/**
|
|
||||||
* QUnit v1.8.0 - A JavaScript Unit Testing Framework
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/QUnit
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 John Resig, Jörn Zaefferer
|
|
||||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
|
||||||
* or GPL (GPL-LICENSE.txt) licenses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Font Family and Sizes */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
|
||||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
|
||||||
#qunit-tests { font-size: smaller; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Resets */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Header */
|
|
||||||
|
|
||||||
#qunit-header {
|
|
||||||
padding: 0.5em 0 0.5em 1em;
|
|
||||||
|
|
||||||
color: #8699a4;
|
|
||||||
background-color: #0d3349;
|
|
||||||
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1em;
|
|
||||||
font-weight: normal;
|
|
||||||
|
|
||||||
border-radius: 15px 15px 0 0;
|
|
||||||
-moz-border-radius: 15px 15px 0 0;
|
|
||||||
-webkit-border-top-right-radius: 15px;
|
|
||||||
-webkit-border-top-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #c2ccd1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a:hover,
|
|
||||||
#qunit-header a:focus {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header label {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-banner {
|
|
||||||
height: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar {
|
|
||||||
padding: 0.5em 0 0.5em 2em;
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-userAgent {
|
|
||||||
padding: 0.5em 0 0.5em 2.5em;
|
|
||||||
background-color: #2b81af;
|
|
||||||
color: #fff;
|
|
||||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Tests: Pass/Fail */
|
|
||||||
|
|
||||||
#qunit-tests {
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li {
|
|
||||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
|
||||||
border-bottom: 1px solid #fff;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li strong {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li a {
|
|
||||||
padding: 0.5em;
|
|
||||||
color: #c2ccd1;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
#qunit-tests li a:hover,
|
|
||||||
#qunit-tests li a:focus {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ol {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
padding: 0.5em;
|
|
||||||
|
|
||||||
background-color: #fff;
|
|
||||||
|
|
||||||
border-radius: 15px;
|
|
||||||
-moz-border-radius: 15px;
|
|
||||||
-webkit-border-radius: 15px;
|
|
||||||
|
|
||||||
box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-moz-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-webkit-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
margin-top: .2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests th {
|
|
||||||
text-align: right;
|
|
||||||
vertical-align: top;
|
|
||||||
padding: 0 .5em 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests td {
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests pre {
|
|
||||||
margin: 0;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests del {
|
|
||||||
background-color: #e0f2be;
|
|
||||||
color: #374e0c;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ins {
|
|
||||||
background-color: #ffcaca;
|
|
||||||
color: #500;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Test Counts */
|
|
||||||
|
|
||||||
#qunit-tests b.counts { color: black; }
|
|
||||||
#qunit-tests b.passed { color: #5E740B; }
|
|
||||||
#qunit-tests b.failed { color: #710909; }
|
|
||||||
|
|
||||||
#qunit-tests li li {
|
|
||||||
margin: 0.5em;
|
|
||||||
padding: 0.4em 0.5em 0.4em 0.5em;
|
|
||||||
background-color: #fff;
|
|
||||||
border-bottom: none;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Passing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.pass {
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #C6E746;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
|
||||||
#qunit-tests .pass .test-name { color: #366097; }
|
|
||||||
|
|
||||||
#qunit-tests .pass .test-actual,
|
|
||||||
#qunit-tests .pass .test-expected { color: #999999; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
|
||||||
|
|
||||||
/*** Failing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.fail {
|
|
||||||
color: #710909;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #EE5757;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests > li:last-child {
|
|
||||||
border-radius: 0 0 15px 15px;
|
|
||||||
-moz-border-radius: 0 0 15px 15px;
|
|
||||||
-webkit-border-bottom-right-radius: 15px;
|
|
||||||
-webkit-border-bottom-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-name,
|
|
||||||
#qunit-tests .fail .module-name { color: #000000; }
|
|
||||||
|
|
||||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-expected { color: green; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Result */
|
|
||||||
|
|
||||||
#qunit-testresult {
|
|
||||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
|
||||||
|
|
||||||
color: #2b81af;
|
|
||||||
background-color: #D2E0E6;
|
|
||||||
|
|
||||||
border-bottom: 1px solid white;
|
|
||||||
}
|
|
||||||
#qunit-testresult .module-name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Fixture */
|
|
||||||
|
|
||||||
#qunit-fixture {
|
|
||||||
position: absolute;
|
|
||||||
top: -10000px;
|
|
||||||
left: -10000px;
|
|
||||||
width: 1000px;
|
|
||||||
height: 1000px;
|
|
||||||
}
|
|
||||||
1863
vendor/qunit/qunit/qunit.js
vendored
1863
vendor/qunit/qunit/qunit.js
vendored
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user