Compare commits
2350
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac6e1d2525 | ||
|
|
610b74d3a5 | ||
|
|
7f295aaacf | ||
|
|
a47669ff75 | ||
|
|
9f84eb8d4d | ||
|
|
5f36143b44 | ||
|
|
2d491dd393 | ||
|
|
63845afdc3 | ||
|
|
3cfcfff786 | ||
|
|
9f801df5dc | ||
|
|
21b8c6ea8f | ||
|
|
0807f9912c | ||
|
|
90a71ba75d | ||
|
|
2e26244992 | ||
|
|
8f1e713451 | ||
|
|
b7b5c7b0da | ||
|
|
cb42813597 | ||
|
|
91c46f465b | ||
|
|
435044dddd | ||
|
|
cccf9968e7 | ||
|
|
f1e4185193 | ||
|
|
dc538af7ba | ||
|
|
574ca07afe | ||
|
|
f18b2ed1a5 | ||
|
|
bc568e2083 | ||
|
|
bffdf9d190 | ||
|
|
e7af4563a2 | ||
|
|
5fc5adb14d | ||
|
|
f3ccf5e633 | ||
|
|
46cacc4a7d | ||
|
|
ac8edcee32 | ||
|
|
919c44c727 | ||
|
|
95921ae727 | ||
|
|
134f043e9c | ||
|
|
a7a14a66a6 | ||
|
|
148d92164a | ||
|
|
5ea1b0bce4 | ||
|
|
65aefadcdc | ||
|
|
1bc324fb9f | ||
|
|
28953ae1d9 | ||
|
|
3760e244a9 | ||
|
|
e86d755b69 | ||
|
|
6f560a1b34 | ||
|
|
6fe573ef7b | ||
|
|
2a7baf020f | ||
|
|
2e1815783a | ||
|
|
bab86c9f0b | ||
|
|
2716e9af39 | ||
|
|
9a303c4510 | ||
|
|
e547971a6f | ||
|
|
e9108ead86 | ||
|
|
6bbcb25138 | ||
|
|
98462ca34d | ||
|
|
7939dd0b44 | ||
|
|
3d966ec076 | ||
|
|
6afedb35df | ||
|
|
cdac63e05a | ||
|
|
8040cc28c4 | ||
|
|
264db40bdc | ||
|
|
2da1957c28 | ||
|
|
2297fa9c13 | ||
|
|
8175e76a77 | ||
|
|
2709dde8fa | ||
|
|
7c518efba8 | ||
|
|
b5fa2aef91 | ||
|
|
d2f6c34e85 | ||
|
|
cd1ccfadaf | ||
|
|
8ff6bff252 | ||
|
|
52f6cb2f30 | ||
|
|
e7af718a0f | ||
|
|
d211c92bf8 | ||
|
|
4acc988cfe | ||
|
|
270f236f95 | ||
|
|
2da12bb71f | ||
|
|
b479add03d | ||
|
|
ca9db6dc18 | ||
|
|
12c7c7b4ed | ||
|
|
e12c0e51c8 | ||
|
|
6683c70195 | ||
|
|
aef1cbd201 | ||
|
|
06786aff28 | ||
|
|
55439c268f | ||
|
|
3e4cf764c8 | ||
|
|
4e359f5eb9 | ||
|
|
2ff3746df2 | ||
|
|
62982d7ffb | ||
|
|
ec49cdb6ad | ||
|
|
4b64827f20 | ||
|
|
944c4cb564 | ||
|
|
db19655b60 | ||
|
|
1975f11338 | ||
|
|
59515d5276 | ||
|
|
fea9529bc8 | ||
|
|
1f6259c157 | ||
|
|
8908e12c59 | ||
|
|
a7d6bc2c5c | ||
|
|
97fd807c2c | ||
|
|
b31f7d64ec | ||
|
|
bdd574161e | ||
|
|
e23e36cbfa | ||
|
|
fb796e21e4 | ||
|
|
dd46c02f09 | ||
|
|
d1835c71b7 | ||
|
|
55332864ad | ||
|
|
96a8ef3bcc | ||
|
|
79cfbfe83b | ||
|
|
e7fa95ce8f | ||
|
|
a819dde71c | ||
|
|
281cfd366b | ||
|
|
f1ba7e76f3 | ||
|
|
2da72d9b1a | ||
|
|
4cdc18fe7e | ||
|
|
4400116bdd | ||
|
|
086d6d1ab5 | ||
|
|
02e86fd2e9 | ||
|
|
7310aa6971 | ||
|
|
4927a26c92 | ||
|
|
ee6bec2e0d | ||
|
|
def230bf30 | ||
|
|
0a4d568b06 | ||
|
|
69f8e1f1bd | ||
|
|
6f2cb4e05e | ||
|
|
db1fbb700c | ||
|
|
842a37eb7b | ||
|
|
76ff38ed10 | ||
|
|
db6b2be101 | ||
|
|
a998500839 | ||
|
|
dd5e686d03 | ||
|
|
c9f28e27d2 | ||
|
|
1bbeb4f50d | ||
|
|
410f6b261e | ||
|
|
7b21b60c11 | ||
|
|
e5d8b71d0a | ||
|
|
d96099b9d3 | ||
|
|
ffe9fc9349 | ||
|
|
b7415ba521 | ||
|
|
38e689ebb2 | ||
|
|
09caaee58d | ||
|
|
e8f8fc501d | ||
|
|
e6038b854e | ||
|
|
dad01b45e4 | ||
|
|
356250ba8c | ||
|
|
d1f7c13488 | ||
|
|
6f614eddd3 | ||
|
|
5142c94f84 | ||
|
|
c961096b70 | ||
|
|
c6050c6d21 | ||
|
|
8bbc6ae02d | ||
|
|
0adaf7d6c4 | ||
|
|
452c340112 | ||
|
|
ffabe96b15 | ||
|
|
3fc1183be6 | ||
|
|
de85ac9237 | ||
|
|
86dd573e2f | ||
|
|
b0c7d60d5a | ||
|
|
507fa102b9 | ||
|
|
95f079474e | ||
|
|
f951f313d2 | ||
|
|
50e11f22a1 | ||
|
|
6dac344a35 | ||
|
|
caf51fdc06 | ||
|
|
7d84d383d6 | ||
|
|
80d7ad8789 | ||
|
|
be5dc42eb1 | ||
|
|
c8961f60fa | ||
|
|
c757687eba | ||
|
|
dd6d59cf97 | ||
|
|
909f4ec2b7 | ||
|
|
4bf06d9ee5 | ||
|
|
587f9fc1ec | ||
|
|
841e5c5395 | ||
|
|
c383a5cc22 | ||
|
|
003ea3baa7 | ||
|
|
0fa98340c1 | ||
|
|
64e36f038e | ||
|
|
78d95048d5 | ||
|
|
c47f8dbba3 | ||
|
|
2dc206ff56 | ||
|
|
72f7811f3d | ||
|
|
c8146814df | ||
|
|
a01e5df650 | ||
|
|
9bd151cdc2 | ||
|
|
e2ed918437 | ||
|
|
bc658433e2 | ||
|
|
db1dd6f3df | ||
|
|
edca481362 | ||
|
|
bc1ca6274d | ||
|
|
2335dc7566 | ||
|
|
94ab040693 | ||
|
|
b4b4678e26 | ||
|
|
6c93d2fd85 | ||
|
|
4ca33cb007 | ||
|
|
96515fd16c | ||
|
|
d736e2d947 | ||
|
|
7631d99ce6 | ||
|
|
6ddeed82c0 | ||
|
|
ffc8242aae | ||
|
|
2767bf70d9 | ||
|
|
fa7c7794d0 | ||
|
|
015e9e54dc | ||
|
|
7dc9863b49 | ||
|
|
f13960a56a | ||
|
|
ba6370d206 | ||
|
|
32fd8c481a | ||
|
|
e9264e6f13 | ||
|
|
93e6a056d4 | ||
|
|
3610f2cbd4 | ||
|
|
0c51544e2e | ||
|
|
8f1f477054 | ||
|
|
0b72925f09 | ||
|
|
9fb477facc | ||
|
|
3c474e5551 | ||
|
|
9217f0aaf5 | ||
|
|
dddf4ccf6e | ||
|
|
4de010cb1e | ||
|
|
d2ed7a4a80 | ||
|
|
311d5c42a8 | ||
|
|
3c6a884663 | ||
|
|
1bfd0018b1 | ||
|
|
2c3a9b93c7 | ||
|
|
0961220fdd | ||
|
|
c8b2f28c7c | ||
|
|
3f7cc163ec | ||
|
|
8ede84c176 | ||
|
|
6a7f62f2c2 | ||
|
|
0b82024caa | ||
|
|
fd057ebb05 | ||
|
|
47e6958446 | ||
|
|
690fe46931 | ||
|
|
10ec7b55d0 | ||
|
|
5079db5ceb | ||
|
|
dd4f664724 | ||
|
|
932e8ca093 | ||
|
|
193e6eb9ca | ||
|
|
e28b878a68 | ||
|
|
4d6f64cf96 | ||
|
|
6441fc09e4 | ||
|
|
d8c54b4632 | ||
|
|
a8f2c9787d | ||
|
|
dfb10c1b44 | ||
|
|
95bd5b539f | ||
|
|
c811a56557 | ||
|
|
5892ddcad8 | ||
|
|
111a81766e | ||
|
|
5819045a01 | ||
|
|
b8f19e11ff | ||
|
|
d3c73579d9 | ||
|
|
5f001ee091 | ||
|
|
741c67c7cb | ||
|
|
9456406009 | ||
|
|
8464f96e40 | ||
|
|
3c23e0fb93 | ||
|
|
18807a642a | ||
|
|
975f77e907 | ||
|
|
bd42042a61 | ||
|
|
9134a7d9f6 | ||
|
|
53d65c31db | ||
|
|
612f15ebad | ||
|
|
33378c96ec | ||
|
|
703e2f51be | ||
|
|
7d8fa7f1c4 | ||
|
|
62089ef2c2 | ||
|
|
1d946aa525 | ||
|
|
19b62a632b | ||
|
|
cbd5b7fc5e | ||
|
|
58673fb385 | ||
|
|
26ea6a6c69 | ||
|
|
1727d34853 | ||
|
|
fc3b854add | ||
|
|
dba8e5d699 | ||
|
|
f3df6f7202 | ||
|
|
3cbf1eba30 | ||
|
|
4623cfbe06 | ||
|
|
d4d8e0045b | ||
|
|
ea4f1643d4 | ||
|
|
5a2ea3496e | ||
|
|
6dd77dd632 | ||
|
|
d4279b0cb7 | ||
|
|
601222a60d | ||
|
|
9c541735b7 | ||
|
|
858f7139ff | ||
|
|
a326ad3c66 | ||
|
|
33751a06fe | ||
|
|
8cbe92ca46 | ||
|
|
5587a358ce | ||
|
|
40b52dd517 | ||
|
|
5424869d8e | ||
|
|
68a2534d1b | ||
|
|
1699190334 | ||
|
|
d86d96acc1 | ||
|
|
f70dbf9cf3 | ||
|
|
33a1681536 | ||
|
|
fcb8da95ca | ||
|
|
e8148ab4dc | ||
|
|
c14f06615e | ||
|
|
1c0b28eacd | ||
|
|
d317a84b09 | ||
|
|
3972cf0194 | ||
|
|
6d408ac2b1 | ||
|
|
8338f8aaa0 | ||
|
|
fbd0561420 | ||
|
|
de854cc02c | ||
|
|
822e161e2e | ||
|
|
b60bf9fdf9 | ||
|
|
14b0a043d4 | ||
|
|
a2f5d66597 | ||
|
|
c02bc26799 | ||
|
|
932afec74a | ||
|
|
3da67e7d97 | ||
|
|
0c95b958aa | ||
|
|
8895ac329a | ||
|
|
cf0416e976 | ||
|
|
f8f3e4d9e8 | ||
|
|
d6bee9aa6d | ||
|
|
2d5e99a0d6 | ||
|
|
97b71347a6 | ||
|
|
10e3a0814f | ||
|
|
f909df204a | ||
|
|
661e6cc5da | ||
|
|
b2b911ec81 | ||
|
|
f238077944 | ||
|
|
3c930dacb8 | ||
|
|
6dcb46c0b8 | ||
|
|
27c7a5a3ad | ||
|
|
846bdfdc88 | ||
|
|
a2026cb3fd | ||
|
|
06fa539293 | ||
|
|
752f69d3ef | ||
|
|
897997b8ac | ||
|
|
526fa11c20 | ||
|
|
8eda98ff4c | ||
|
|
99d7a26b98 | ||
|
|
0aaadf9536 | ||
|
|
9adcbecce4 | ||
|
|
6605a84f2c | ||
|
|
6c9510d8f4 | ||
|
|
03a62dc23f | ||
|
|
93efacbef5 | ||
|
|
b6b28de8e2 | ||
|
|
faaed40b39 | ||
|
|
6b035f64d2 | ||
|
|
9f049dcb18 | ||
|
|
0141449e4f | ||
|
|
4ce49f259d | ||
|
|
0f35569e05 | ||
|
|
1c4dabed72 | ||
|
|
38114c0639 | ||
|
|
527c8370f1 | ||
|
|
6a9a57e2bc | ||
|
|
7b6f1b510e | ||
|
|
94bc7547d6 | ||
|
|
5a4552aaff | ||
|
|
06e314d301 | ||
|
|
8bead301ef | ||
|
|
6282445f7d | ||
|
|
bf244533f7 | ||
|
|
5ebfaf24ee | ||
|
|
0c0283dc02 | ||
|
|
375b08be87 | ||
|
|
cbc8f94b0a | ||
|
|
bdac8d163d | ||
|
|
1f61f37841 | ||
|
|
51d523ae72 | ||
|
|
3f9e4962e6 | ||
|
|
f8fc4fe56b | ||
|
|
fb64b7e412 | ||
|
|
3209cfbc45 | ||
|
|
8a99476136 | ||
|
|
eb80f8d111 | ||
|
|
afde3ce54d | ||
|
|
c4b61fec17 | ||
|
|
0b74abf300 | ||
|
|
e6c3c9f1d4 | ||
|
|
4e7560b4ed | ||
|
|
542491b278 | ||
|
|
d36439355d | ||
|
|
4a80815b39 | ||
|
|
6dc57f2566 | ||
|
|
07e8511ce1 | ||
|
|
8e927831f5 | ||
|
|
2c533d2ab3 | ||
|
|
38208750e7 | ||
|
|
df14d7c306 | ||
|
|
b3612db7d2 | ||
|
|
8d90da659e | ||
|
|
f8ddbc0622 | ||
|
|
673b7054aa | ||
|
|
1472cbf257 | ||
|
|
d806935c58 | ||
|
|
6b56eb79e1 | ||
|
|
d2aea16744 | ||
|
|
bb800f032e | ||
|
|
64b9f9443e | ||
|
|
fd2d3a0e06 | ||
|
|
08d678bdb8 | ||
|
|
418007e572 | ||
|
|
4a1bccdf75 | ||
|
|
00c0b59e9d | ||
|
|
ac82c8ff0b | ||
|
|
f4bef8a090 | ||
|
|
d8a1055bff | ||
|
|
d672ce4d80 | ||
|
|
43ec361d03 | ||
|
|
c3c99c5f76 | ||
|
|
eb1e1421ab | ||
|
|
e8a1d87919 | ||
|
|
921ba6811d | ||
|
|
906dd241b4 | ||
|
|
3f0cd2ad64 | ||
|
|
41420d1954 | ||
|
|
6e5a72b170 | ||
|
|
4b19e6aec8 | ||
|
|
58572cbc36 | ||
|
|
096d5766bf | ||
|
|
f5c5b56492 | ||
|
|
69c69d63e6 | ||
|
|
3fd8b21867 | ||
|
|
8660e8cd85 | ||
|
|
8458f725f2 | ||
|
|
366678c965 | ||
|
|
336b5668db | ||
|
|
55886269ea | ||
|
|
0b3698595b | ||
|
|
05e43a39db | ||
|
|
5737ad3db2 | ||
|
|
4ac174eb9a | ||
|
|
895eec10b4 | ||
|
|
e0d891e89a | ||
|
|
adf7734b85 | ||
|
|
5362be9c21 | ||
|
|
847ece52f2 | ||
|
|
851c59d22c | ||
|
|
0669534bba | ||
|
|
05db47e62a | ||
|
|
4a0e608d1c | ||
|
|
45fe73af86 | ||
|
|
4d9fcd657f | ||
|
|
a057deb0fe | ||
|
|
4766210a7d | ||
|
|
fd26aae6d3 | ||
|
|
c5c092cc8e | ||
|
|
58c0a21d90 | ||
|
|
8dc567f966 | ||
|
|
942b2752f5 | ||
|
|
b9259353f4 | ||
|
|
86c614dd40 | ||
|
|
1a010a16a9 | ||
|
|
d5b5726b1e | ||
|
|
d06f3b6bdf | ||
|
|
97a28f716c | ||
|
|
f54bdfcea0 | ||
|
|
5958c4b0ba | ||
|
|
7c3db881c7 | ||
|
|
51ee2e1b2c | ||
|
|
baa813004b | ||
|
|
86b5269d3d | ||
|
|
860e6dacac | ||
|
|
22025bd89e | ||
|
|
ed9301455d | ||
|
|
35df84e059 | ||
|
|
62deebf310 | ||
|
|
7ed4bd5c01 | ||
|
|
c8eb9332b4 | ||
|
|
1df55f9168 | ||
|
|
b726c6aa96 | ||
|
|
0a71962652 | ||
|
|
160946ef74 | ||
|
|
1dc67317dc | ||
|
|
08f4a2e8bf | ||
|
|
11ffdaa8f7 | ||
|
|
0f853303a4 | ||
|
|
d225eb9b16 | ||
|
|
d926e4b8bc | ||
|
|
3e2df1d4d8 | ||
|
|
d670dbf081 | ||
|
|
f510a312e3 | ||
|
|
19c44e3d31 | ||
|
|
d0848aee67 | ||
|
|
f4b4b6811c | ||
|
|
fecb3f1f7b | ||
|
|
4c924c0763 | ||
|
|
f1e8d70554 | ||
|
|
7d11bc152e | ||
|
|
fdf0a3135a | ||
|
|
3a1a455c48 | ||
|
|
3a786e835b | ||
|
|
c70181132f | ||
|
|
538615a1f5 | ||
|
|
aa20a60a1c | ||
|
|
69fa1dac6c | ||
|
|
3ab349af6e | ||
|
|
97ac7deb2f | ||
|
|
3230cafb9f | ||
|
|
394284d8de | ||
|
|
6323b174c6 | ||
|
|
3d3e0e5139 | ||
|
|
ffc7d4bacc | ||
|
|
598236a1d2 | ||
|
|
69207519bd | ||
|
|
022eb1012f | ||
|
|
0a9c59f91e | ||
|
|
7ebb22b892 | ||
|
|
3dc7fc6f14 | ||
|
|
90dea7517b | ||
|
|
eae48f9564 | ||
|
|
dd7afba5f5 | ||
|
|
73357b6777 | ||
|
|
53df6bbcc6 | ||
|
|
9871559227 | ||
|
|
9cbead1ddc | ||
|
|
6402028c17 | ||
|
|
76bd65cf53 | ||
|
|
6e4113de11 | ||
|
|
12f37f76c7 | ||
|
|
acd77b2c0a | ||
|
|
f4fb4ec00d | ||
|
|
46ae4669ea | ||
|
|
67b2dbfe98 | ||
|
|
4f3b39fbfa | ||
|
|
a28fc52309 | ||
|
|
d5f0d60794 | ||
|
|
72e65587df | ||
|
|
b4d4d90784 | ||
|
|
3f81fb759d | ||
|
|
d995b39e02 | ||
|
|
3bd09a1aa4 | ||
|
|
a6ff951c98 | ||
|
|
604b1557e8 | ||
|
|
279bd5c71a | ||
|
|
97dfb02ab6 | ||
|
|
32c7b02303 | ||
|
|
e135835e61 | ||
|
|
7ed9a8075c | ||
|
|
ead8110fb4 | ||
|
|
586b1b6c15 | ||
|
|
e1727c8d80 | ||
|
|
7bd8a7ff35 | ||
|
|
de48651ae7 | ||
|
|
9902e07be0 | ||
|
|
5e4b38895e | ||
|
|
38bbbf261a | ||
|
|
def0a52578 | ||
|
|
4f1f87bda0 | ||
|
|
15f9faa2fa | ||
|
|
7257491d8b | ||
|
|
c19b2a9ebe | ||
|
|
54e7fd0293 | ||
|
|
21f3a2082b | ||
|
|
f647eb5a7b | ||
|
|
d7b1db0081 | ||
|
|
11511316d1 | ||
|
|
95a93c2c44 | ||
|
|
815ce10c25 | ||
|
|
5f13bfe8a1 | ||
|
|
5cd494c00a | ||
|
|
5a0a8bedc1 | ||
|
|
3b9884160b | ||
|
|
5b2b01328a | ||
|
|
e5b51dcd16 | ||
|
|
4d8b816acf | ||
|
|
fa109c1b0b | ||
|
|
b987fce627 | ||
|
|
b072cc3266 | ||
|
|
366b40ea90 | ||
|
|
3d3daa205d | ||
|
|
665ebbd11a | ||
|
|
52a5a7697d | ||
|
|
97a38d516a | ||
|
|
e89475bf52 | ||
|
|
90a78b05ce | ||
|
|
8c6eff15f0 | ||
|
|
824c58b391 | ||
|
|
b97500430c | ||
|
|
bacafc67c9 | ||
|
|
f23ebcdc2d | ||
|
|
edbe8e3561 | ||
|
|
05d1e33b30 | ||
|
|
96b60ce0f5 | ||
|
|
6174bc7ffd | ||
|
|
3bd022e03a | ||
|
|
b0cc5b0b60 | ||
|
|
5493f70458 | ||
|
|
323b3d9d16 | ||
|
|
1b0742ad2a | ||
|
|
2eb7217f49 | ||
|
|
b6f5a286b0 | ||
|
|
66c496fb10 | ||
|
|
56ca588c1e | ||
|
|
e2b09caff3 | ||
|
|
a5b4a4c59f | ||
|
|
a70312a90a | ||
|
|
6c6a3238cb | ||
|
|
9af10d4bcb | ||
|
|
f6e1b4611e | ||
|
|
7bc762d357 | ||
|
|
8edf1da92b | ||
|
|
a18baf2ffe | ||
|
|
2d41bf8f2f | ||
|
|
334778bdae | ||
|
|
1b46a06eee | ||
|
|
1e860e9443 | ||
|
|
0b973672d2 | ||
|
|
868ed85c7f | ||
|
|
6f2a24ec66 | ||
|
|
e5d5899a15 | ||
|
|
243473a97d | ||
|
|
28d71b8ce2 | ||
|
|
1acbf90261 | ||
|
|
94229f84a3 | ||
|
|
cead74238a | ||
|
|
73c60ea94c | ||
|
|
73638da4db | ||
|
|
bc218b73e1 | ||
|
|
aac6632f4b | ||
|
|
fdba3fdc74 | ||
|
|
21bb61ec82 | ||
|
|
ce1203d64d | ||
|
|
56daf15c8e | ||
|
|
96faa924d8 | ||
|
|
ee8854451c | ||
|
|
0975e925a9 | ||
|
|
83d6a2169b | ||
|
|
21e7a4d966 | ||
|
|
404cd24855 | ||
|
|
b4ad72ee67 | ||
|
|
bea628b619 | ||
|
|
3637e54982 | ||
|
|
e0d1a0a612 | ||
|
|
3040996671 | ||
|
|
dd830e7500 | ||
|
|
d2dfe2c418 | ||
|
|
139fb6b6e0 | ||
|
|
c4f6976c42 | ||
|
|
ab428fc104 | ||
|
|
aa97f78acd | ||
|
|
dbce900aeb | ||
|
|
30b382e2e7 | ||
|
|
433c4abb86 | ||
|
|
64404e4092 | ||
|
|
08d483af8a | ||
|
|
fa19c17941 | ||
|
|
c896a999ad | ||
|
|
f9bca935ac | ||
|
|
7abf274d89 | ||
|
|
e2ad417306 | ||
|
|
2ea9655f6b | ||
|
|
f450d5d9de | ||
|
|
f8f4b73a09 | ||
|
|
926d96732d | ||
|
|
167113d6a3 | ||
|
|
911cb614a5 | ||
|
|
7a939b7024 | ||
|
|
6e57a60997 | ||
|
|
9f1151e699 | ||
|
|
3fbe1fb63d | ||
|
|
d4906eec5a | ||
|
|
ebe0663e74 | ||
|
|
04c89b9711 | ||
|
|
4f2bc874e5 | ||
|
|
316ac5c3c8 | ||
|
|
7882aa667e | ||
|
|
8b8d5eecbf | ||
|
|
65b76643ee | ||
|
|
f33e645113 | ||
|
|
528d30c317 | ||
|
|
7f0a3d320c | ||
|
|
8e940aeb65 | ||
|
|
a77ee60809 | ||
|
|
83383c29cd | ||
|
|
b6393141e8 | ||
|
|
10ce1827d8 | ||
|
|
605f3a12ff | ||
|
|
a33539e75f | ||
|
|
b2cca3687a | ||
|
|
628c54044f | ||
|
|
c0e7a3eece | ||
|
|
c7c13c19c1 | ||
|
|
d5f71b5878 | ||
|
|
cb589e9e26 | ||
|
|
eaeed47297 | ||
|
|
e00e5c5cd7 | ||
|
|
b3719f7166 | ||
|
|
337896974b | ||
|
|
bb7d1fc9ab | ||
|
|
07765c8d44 | ||
|
|
85cb91071e | ||
|
|
d41839845a | ||
|
|
c3d12aa55f | ||
|
|
a781e4b84c | ||
|
|
1fc0989fd2 | ||
|
|
14752260d3 | ||
|
|
84675c874f | ||
|
|
f30e6057be | ||
|
|
ba8b629f0e | ||
|
|
a0a45ff2aa | ||
|
|
325f890a0b | ||
|
|
923cac5408 | ||
|
|
23505326c7 | ||
|
|
5f1a48f523 | ||
|
|
a607d39030 | ||
|
|
96d108729e | ||
|
|
ef15adaaf8 | ||
|
|
f190b74a7e | ||
|
|
edbc2b88b6 | ||
|
|
dc000cecf1 | ||
|
|
7c95a483df | ||
|
|
27e5d73da1 | ||
|
|
6306dae92d | ||
|
|
a427ddff83 | ||
|
|
b62ee6e820 | ||
|
|
3c18666080 | ||
|
|
40968b301a | ||
|
|
05904d31fd | ||
|
|
75aeaf4ee7 | ||
|
|
ff4e67a9f6 | ||
|
|
5f672d5bd1 | ||
|
|
5cb39eba8b | ||
|
|
4d8c3c75d6 | ||
|
|
8bdd19fc06 | ||
|
|
0ec99d8ba1 | ||
|
|
929d2db5a5 | ||
|
|
a7ad77f433 | ||
|
|
9cd47d5deb | ||
|
|
3cb5691aae | ||
|
|
dce63919fa | ||
|
|
1cdbedcb96 | ||
|
|
1586712ce5 | ||
|
|
f059186494 | ||
|
|
0af0be57b0 | ||
|
|
dad2b03212 | ||
|
|
b6e307660f | ||
|
|
c21c14825a | ||
|
|
39f9c986e9 | ||
|
|
393683aebc | ||
|
|
a87fcb44a6 | ||
|
|
0a6496ddfb | ||
|
|
fa2841fac6 | ||
|
|
861e45419b | ||
|
|
15fd943456 | ||
|
|
b538bfc27e | ||
|
|
e0f32eddc4 | ||
|
|
75a704c196 | ||
|
|
6565fdbe7e | ||
|
|
6248d72852 | ||
|
|
00d1797b96 | ||
|
|
911194eba8 | ||
|
|
0fad3ae31d | ||
|
|
b6988d866a | ||
|
|
e30959a656 | ||
|
|
52eeff3466 | ||
|
|
a06ded552d | ||
|
|
e9b8a84243 | ||
|
|
1fc3cfd1f2 | ||
|
|
188b57ed7a | ||
|
|
c8620390ac | ||
|
|
b3f8ed2335 | ||
|
|
54bf504eb4 | ||
|
|
c6f3bf856b | ||
|
|
8b33a7926e | ||
|
|
a38cb90cbf | ||
|
|
1500e8e54f | ||
|
|
94fd8d5e9d | ||
|
|
373e0a2155 | ||
|
|
267298f341 | ||
|
|
359d46e94d | ||
|
|
11f5540099 | ||
|
|
680e1afcfd | ||
|
|
e4322e60cc | ||
|
|
82f2eecfe8 | ||
|
|
3e3c3c559d | ||
|
|
65f5e8e964 | ||
|
|
c5fbe93890 | ||
|
|
307d8b6165 | ||
|
|
bf08eb2f8b | ||
|
|
a569c1dfaf | ||
|
|
e48db0d231 | ||
|
|
1a5b5dbb45 | ||
|
|
56f21cabe5 | ||
|
|
7ac5afe05b | ||
|
|
b3db97f4a8 | ||
|
|
6d1a06a9d9 | ||
|
|
088643df6c | ||
|
|
fc00a0a363 | ||
|
|
7a48fdd246 | ||
|
|
89be493882 | ||
|
|
5947abf83d | ||
|
|
962db6821f | ||
|
|
f6a3df7858 | ||
|
|
090aaed3f4 | ||
|
|
71cb5aa9e4 | ||
|
|
043b29ef33 | ||
|
|
d81cf4aec3 | ||
|
|
7cb46eeb82 | ||
|
|
c3b4d54414 | ||
|
|
8b9acf2d3d | ||
|
|
08548181ed | ||
|
|
45f883c98b | ||
|
|
5f39229e47 | ||
|
|
8c5bdc2a4b | ||
|
|
7b7602bce2 | ||
|
|
a145792fac | ||
|
|
667a550f4c | ||
|
|
53e1ad8991 | ||
|
|
429c949d1f | ||
|
|
1548577d65 | ||
|
|
82e59b297f | ||
|
|
1f9c994425 | ||
|
|
fc0c7a5004 | ||
|
|
a2d0309c79 | ||
|
|
6d01fbb6e8 | ||
|
|
be270df088 | ||
|
|
88fd94e1cc | ||
|
|
e460392368 | ||
|
|
249cda99f4 | ||
|
|
327fce822a | ||
|
|
58931354a4 | ||
|
|
c8993e9832 | ||
|
|
4ee2e023aa | ||
|
|
22fa1b121e | ||
|
|
cbc6e526c3 | ||
|
|
96041faefd | ||
|
|
894c912e19 | ||
|
|
7b406a945f | ||
|
|
6ff5cc90f1 | ||
|
|
f66e56f4b5 | ||
|
|
8f09aab0ea | ||
|
|
b248b9ca2c | ||
|
|
5a6a31fefa | ||
|
|
1e485a3883 | ||
|
|
fed3246c84 | ||
|
|
daff4a9786 | ||
|
|
6e88b0c701 | ||
|
|
808f674173 | ||
|
|
ba377c9aac | ||
|
|
bb8909f552 | ||
|
|
5a4d9ffcfc | ||
|
|
5ed24a98cb | ||
|
|
6d17675ee7 | ||
|
|
e0b8bfdeae | ||
|
|
0db2009e65 | ||
|
|
5f016d74a1 | ||
|
|
02b9832750 | ||
|
|
18a888b9d4 | ||
|
|
7f20e981d2 | ||
|
|
d64e08f3c4 | ||
|
|
8bb5324896 | ||
|
|
8f2ebc6409 | ||
|
|
371318f62f | ||
|
|
6e94403dc6 | ||
|
|
c35f6905bb | ||
|
|
4eebbb3e81 | ||
|
|
8ddfc8fb4a | ||
|
|
14d2661be8 | ||
|
|
ec71bf29b8 | ||
|
|
b1b06d9c82 | ||
|
|
6feec9bdbd | ||
|
|
d00f4f281c | ||
|
|
15e3ec5263 | ||
|
|
d6ddd91fda | ||
|
|
de79e25510 | ||
|
|
08f6b4deed | ||
|
|
5cd115b54f | ||
|
|
44b6f5890c | ||
|
|
5dd5933390 | ||
|
|
d55d3f2fe1 | ||
|
|
2e9b87f0bc | ||
|
|
800c85dd03 | ||
|
|
5414f7161f | ||
|
|
98b5825475 | ||
|
|
bda21c421f | ||
|
|
ee27b06822 | ||
|
|
7504d62ab1 | ||
|
|
f66b5c91fc | ||
|
|
bf838cd561 | ||
|
|
eeb92f5915 | ||
|
|
4524fab6b9 | ||
|
|
d1a9b40ed5 | ||
|
|
96523408bd | ||
|
|
b5646e0988 | ||
|
|
645c5cc6c1 | ||
|
|
7323983d11 | ||
|
|
8650c9e4b9 | ||
|
|
7cfdb403b3 | ||
|
|
af30c69560 | ||
|
|
b49ecb5802 | ||
|
|
9f0dd8358f | ||
|
|
1fff99b5f2 | ||
|
|
f3ef65ad70 | ||
|
|
da9d59443b | ||
|
|
2e7a5c6244 | ||
|
|
0b6f04ed26 | ||
|
|
4856f6c477 | ||
|
|
0a0b499716 | ||
|
|
954888a879 | ||
|
|
f00a01c123 | ||
|
|
0efb3a6f30 | ||
|
|
d3a9a7b54c | ||
|
|
4bbf40c5b8 | ||
|
|
01ab59774b | ||
|
|
5a6f84d5d2 | ||
|
|
eea5135316 | ||
|
|
9f303966eb | ||
|
|
a31b5ea29d | ||
|
|
b6a6ee31ed | ||
|
|
9aa7556e5b | ||
|
|
12cc54b0ea | ||
|
|
f8c4eae715 | ||
|
|
f8d8d2122e | ||
|
|
157c8e92d5 | ||
|
|
bece81b10e | ||
|
|
99755e98ee | ||
|
|
541de612b2 | ||
|
|
c46d9fd04a | ||
|
|
a49695ace7 | ||
|
|
b562d45531 | ||
|
|
e9f8db58c0 | ||
|
|
ed3313b2bc | ||
|
|
7bb6a9615c | ||
|
|
e7333508c4 | ||
|
|
6e6feb6dc1 | ||
|
|
cb37e3e993 | ||
|
|
13f457eba3 | ||
|
|
e7f8900286 | ||
|
|
7199a770c0 | ||
|
|
e560bbdeb4 | ||
|
|
6479d39f93 | ||
|
|
9fc9790e93 | ||
|
|
5a50476e9d | ||
|
|
b8a8776c2e | ||
|
|
f155a341cb | ||
|
|
253e48694a | ||
|
|
30a090004b | ||
|
|
fb77443b99 | ||
|
|
06d88883d8 | ||
|
|
337c9d3241 | ||
|
|
1d6378c1fc | ||
|
|
f13cfd190e | ||
|
|
a2823b3c29 | ||
|
|
169edd4f9c | ||
|
|
d0fa094d04 | ||
|
|
6ac12d42fe | ||
|
|
a378ac8738 | ||
|
|
8b8f749006 | ||
|
|
b004a0609b | ||
|
|
82d4efcbc2 | ||
|
|
2476726a6a | ||
|
|
19a84d0cc8 | ||
|
|
a688b6fdce | ||
|
|
73e5f5d6ad | ||
|
|
014fb9408e | ||
|
|
91f2be6759 | ||
|
|
76ac6cf5b5 | ||
|
|
dbba6fa942 | ||
|
|
d0771e3392 | ||
|
|
6c8eca2f57 | ||
|
|
3aa9d8ae56 | ||
|
|
42e1764c44 | ||
|
|
5abe9bd6d5 | ||
|
|
d5492eee93 | ||
|
|
a26a59b193 | ||
|
|
3d2dbe9199 | ||
|
|
73749b8d22 | ||
|
|
50c30b7cd0 | ||
|
|
44305b9abf | ||
|
|
c98d8fd199 | ||
|
|
4adc0b7c24 | ||
|
|
1427ac632f | ||
|
|
5e4ae07575 | ||
|
|
9c7fddfb0d | ||
|
|
8ebe81b89f | ||
|
|
016ca770f5 | ||
|
|
c8948953c9 | ||
|
|
85ebd30c9c | ||
|
|
5ea6c4c449 | ||
|
|
bfa31d1c79 | ||
|
|
d4f7ce7560 | ||
|
|
0ef223d80e | ||
|
|
eb232f7bb1 | ||
|
|
ce4f44a951 | ||
|
|
f70cfb5d48 | ||
|
|
7e39be6d20 | ||
|
|
979afdbf7b | ||
|
|
e662b5ed23 | ||
|
|
fea7dcb4aa | ||
|
|
2220920afe | ||
|
|
180b3c7c5d | ||
|
|
beb7553629 | ||
|
|
75934fc5ae | ||
|
|
0882e06adc | ||
|
|
96bd755660 | ||
|
|
51c96b4d04 | ||
|
|
a529eba693 | ||
|
|
a00b5a71fc | ||
|
|
7f35dda305 | ||
|
|
fccebb059b | ||
|
|
cf1dc17298 | ||
|
|
b24eabc82a | ||
|
|
f3a26116b2 | ||
|
|
884c1ea82c | ||
|
|
c65737f554 | ||
|
|
b77a11bfc2 | ||
|
|
58fd8e3c7f | ||
|
|
a8cc2fc671 | ||
|
|
d19ebb6b13 | ||
|
|
fad02e8736 | ||
|
|
11c928bf30 | ||
|
|
b4262eb34b | ||
|
|
76c4a8a966 | ||
|
|
0a212af11e | ||
|
|
efffb46281 | ||
|
|
e2ec3ef532 | ||
|
|
d3c4dd59d2 | ||
|
|
dcebb79590 | ||
|
|
0f0b989963 | ||
|
|
4815f6c79a | ||
|
|
409063a339 | ||
|
|
c831d539b6 | ||
|
|
7aa826fc80 | ||
|
|
d603557c35 | ||
|
|
c267a5c7e0 | ||
|
|
46764ff9aa | ||
|
|
f7a041d9fc | ||
|
|
751336e5d1 | ||
|
|
b2403aedac | ||
|
|
d5f9e923c4 | ||
|
|
c3c2022029 | ||
|
|
fb08e86a4c | ||
|
|
6f4c32c04c | ||
|
|
7c74a40baf | ||
|
|
8bf60bb793 | ||
|
|
005aa959c5 | ||
|
|
d9818f6960 | ||
|
|
f90ac9dea4 | ||
|
|
e0036ca32b | ||
|
|
ad8acaf296 | ||
|
|
34a863a6ea | ||
|
|
724c7388af | ||
|
|
2bb6ef8efb | ||
|
|
baf4d3aa98 | ||
|
|
f4ca4431da | ||
|
|
19446a666e | ||
|
|
b48b09249e | ||
|
|
be282db1c2 | ||
|
|
667cf4062f | ||
|
|
ba442b1457 | ||
|
|
a07622d084 | ||
|
|
8855c92e73 | ||
|
|
6a67a6a66b | ||
|
|
6822c8137b | ||
|
|
76505aa4de | ||
|
|
40fee137d4 | ||
|
|
1f3259e907 | ||
|
|
33b0c19d43 | ||
|
|
1de59279a6 | ||
|
|
184a43ccf5 | ||
|
|
efcb71e866 | ||
|
|
7bc720be77 | ||
|
|
9ecf6d3735 | ||
|
|
ba968d6ff7 | ||
|
|
5cd86a2766 | ||
|
|
11325e6f07 | ||
|
|
5b2b7dc03e | ||
|
|
324a67c7da | ||
|
|
6b54797aec | ||
|
|
4e7529ae44 | ||
|
|
086e61bb19 | ||
|
|
c6eeeda1c3 | ||
|
|
6d642c8098 | ||
|
|
40c89a479f | ||
|
|
f43c811477 | ||
|
|
0a3277c6e7 | ||
|
|
667a8fea31 | ||
|
|
089bb027ae | ||
|
|
6667d85623 | ||
|
|
2513465c6b | ||
|
|
831266fe3c | ||
|
|
bea5cd1f52 | ||
|
|
961414559f | ||
|
|
ffa37160a5 | ||
|
|
d856d12126 | ||
|
|
1dc16932b6 | ||
|
|
db603c5ebd | ||
|
|
f837b71423 | ||
|
|
a5b7259577 | ||
|
|
3f6eeb2a30 | ||
|
|
f8434d7fe2 | ||
|
|
b5cc8ad820 | ||
|
|
20c2d96dee | ||
|
|
c08a669aff | ||
|
|
c4fe77a5ba | ||
|
|
6d6326e415 | ||
|
|
21a956eca8 | ||
|
|
da1273c135 | ||
|
|
aaf7870d88 | ||
|
|
03dffe1181 | ||
|
|
146010f3f5 | ||
|
|
6526653540 | ||
|
|
7b46a1b9ff | ||
|
|
0608f9b3c7 | ||
|
|
e63b46b004 | ||
|
|
17d9853e90 | ||
|
|
4d02639985 | ||
|
|
9677a55a5a | ||
|
|
87056a4052 | ||
|
|
aba9ee7b33 | ||
|
|
ad2baeda2f | ||
|
|
eab8a3b94e | ||
|
|
5d23032500 | ||
|
|
5a2b6db3bb | ||
|
|
546c6a3227 | ||
|
|
674018d2fc | ||
|
|
39b65284bd | ||
|
|
c0fee32c4c | ||
|
|
8428649377 | ||
|
|
430c792a9b | ||
|
|
1e029ee517 | ||
|
|
dfbc837371 | ||
|
|
3e1bb44284 | ||
|
|
aacb6adb26 | ||
|
|
95ac7454ae | ||
|
|
85389c4a60 | ||
|
|
913289e0ef | ||
|
|
84efd5bfdf | ||
|
|
33014dbd7d | ||
|
|
d0e20eb8d3 | ||
|
|
a386999567 | ||
|
|
8519481f96 | ||
|
|
97fdc095a5 | ||
|
|
915243ee4a | ||
|
|
727e447899 | ||
|
|
e6ea5824f0 | ||
|
|
8eee11cee9 | ||
|
|
7aca3049d1 | ||
|
|
03b8d0c388 | ||
|
|
aa7d01f3d6 | ||
|
|
b397c41c9e | ||
|
|
0561cc3320 | ||
|
|
6f47e92050 | ||
|
|
9a67ac7509 | ||
|
|
d922993eaf | ||
|
|
9fa2225283 | ||
|
|
35eadad96b | ||
|
|
081416475e | ||
|
|
12492c842c | ||
|
|
68e01c1e73 | ||
|
|
bdcc79ce34 | ||
|
|
869ad39ddc | ||
|
|
30e1e35090 | ||
|
|
6c185ffd09 | ||
|
|
a9435f8f32 | ||
|
|
9ea8d3ec97 | ||
|
|
d918234bb8 | ||
|
|
afbbbaa855 | ||
|
|
a844ef31a2 | ||
|
|
b469ce0504 | ||
|
|
ed2bc8c390 | ||
|
|
cb246e859e | ||
|
|
3d6b99c004 | ||
|
|
842942c0fe | ||
|
|
71c4a84833 | ||
|
|
d1bc434ced | ||
|
|
59f7448aa7 | ||
|
|
4408692565 | ||
|
|
2e8607b811 | ||
|
|
2f2890e582 | ||
|
|
e2b39be3ff | ||
|
|
7ada07a99a | ||
|
|
6b16573f6b | ||
|
|
1de49fe998 | ||
|
|
7109e66ad8 | ||
|
|
d21c2f67ba | ||
|
|
0d39add09c | ||
|
|
5e1f7ea571 | ||
|
|
35c71bd21b | ||
|
|
e6a39f246d | ||
|
|
65cd8af9e1 | ||
|
|
e916f2fc40 | ||
|
|
13da80ee85 | ||
|
|
4f4045363b | ||
|
|
9600e18c92 | ||
|
|
d5aefccadc | ||
|
|
9e64b268cf | ||
|
|
0893bf6473 | ||
|
|
21f8b814e0 | ||
|
|
10fd22ba81 | ||
|
|
a3fef6c62f | ||
|
|
d750167a00 | ||
|
|
241bf62fdc | ||
|
|
bc5574615d | ||
|
|
48cac053fd | ||
|
|
25837f6393 | ||
|
|
b281362c98 | ||
|
|
e5050bb6c8 | ||
|
|
2d0c3ef881 | ||
|
|
ee029aac10 | ||
|
|
da205c09f9 | ||
|
|
07317b86a2 | ||
|
|
79e2543266 | ||
|
|
303cbcd188 | ||
|
|
a47905541c | ||
|
|
4e988db50f | ||
|
|
9dc3d83a77 | ||
|
|
934c1b0cfe | ||
|
|
70181d95c7 | ||
|
|
8a210103c0 | ||
|
|
df96381759 | ||
|
|
2006845ff7 | ||
|
|
44f0e78086 | ||
|
|
824956a34d | ||
|
|
1e7e01b6b0 | ||
|
|
cd25aaaca6 | ||
|
|
d481047eb4 | ||
|
|
1699ac6e08 | ||
|
|
79b7188578 | ||
|
|
843f469914 | ||
|
|
71254e86f4 | ||
|
|
07328847f4 | ||
|
|
9181cbfee5 | ||
|
|
4aef22aac8 | ||
|
|
512266abf4 | ||
|
|
ef64f180a2 | ||
|
|
9e45800367 | ||
|
|
f027f7f225 | ||
|
|
6f7ac86e7f | ||
|
|
93d298ef75 | ||
|
|
121a892c9a | ||
|
|
9222e2bbdd | ||
|
|
fe78d82ace | ||
|
|
77e98d9942 | ||
|
|
2b1efae238 | ||
|
|
d70740b38c | ||
|
|
3ebb30795c | ||
|
|
5d42730e9a | ||
|
|
923777899e | ||
|
|
05b9187a3b | ||
|
|
1198baba67 | ||
|
|
d4b7cdc97c | ||
|
|
bb7e93ac2d | ||
|
|
59c0c6cfb8 | ||
|
|
8699a43a22 | ||
|
|
5529651f91 | ||
|
|
a6f225ae9d | ||
|
|
fceda31c11 | ||
|
|
e5a5281e10 | ||
|
|
ede1d89569 | ||
|
|
44b9ba96c3 | ||
|
|
7fd8bfbe4e | ||
|
|
17654633dc | ||
|
|
8fd0a54018 | ||
|
|
efe8a476da | ||
|
|
ac0f6c6b6c | ||
|
|
8c163515db | ||
|
|
7ce1e64ee8 | ||
|
|
b6e667a291 | ||
|
|
5c7522fd1f | ||
|
|
85e9223603 | ||
|
|
943e2be676 | ||
|
|
2f09df7521 | ||
|
|
445e445e49 | ||
|
|
a3925de127 | ||
|
|
f20e4bd572 | ||
|
|
816c2ac1c4 | ||
|
|
e731371ab1 | ||
|
|
5559693cb3 | ||
|
|
ca33c3b259 | ||
|
|
a78fa98b3d | ||
|
|
956dc82555 | ||
|
|
d30a824481 | ||
|
|
a643182eee | ||
|
|
e1dbc46d8d | ||
|
|
e33d8776bc | ||
|
|
f6d16883de | ||
|
|
51bdd3bbfd | ||
|
|
8f9ae78b8c | ||
|
|
584b7b8e45 | ||
|
|
f74e903f1f | ||
|
|
4cedf112f5 | ||
|
|
d607a8da0f | ||
|
|
84a12e28df | ||
|
|
54aa47d1a8 | ||
|
|
faaee4b945 | ||
|
|
0b46303f9f | ||
|
|
b98668bc60 | ||
|
|
947e8e9512 | ||
|
|
681918cb63 | ||
|
|
d0fae44430 | ||
|
|
3e752461e8 | ||
|
|
1a9e6f3b1a | ||
|
|
580275a8cf | ||
|
|
ee74771f16 | ||
|
|
81fa97d3ee | ||
|
|
00a6e9798f | ||
|
|
17a59cbdd5 | ||
|
|
d4c9a0a47a | ||
|
|
6423c22cf8 | ||
|
|
e21fbaff83 | ||
|
|
99e6a2676b | ||
|
|
ab47f40ee1 | ||
|
|
a7f000e51e | ||
|
|
0d9eabcaa0 | ||
|
|
b1c63d7f5e | ||
|
|
820c72820d | ||
|
|
300065504b | ||
|
|
8aa846b349 | ||
|
|
ae8b94b2d7 | ||
|
|
7670d55f3c | ||
|
|
528ab4e203 | ||
|
|
cf1dc90137 | ||
|
|
dd81dcc9c6 | ||
|
|
a31c949734 | ||
|
|
3536d5c413 | ||
|
|
0e50216cee | ||
|
|
16fed754a9 | ||
|
|
c7748934b8 | ||
|
|
d46b3154cc | ||
|
|
f8bcfba90e | ||
|
|
45a4ca5298 | ||
|
|
88e3a9852b | ||
|
|
cf1f023379 | ||
|
|
b4b6f5a1f7 | ||
|
|
a21eef6e84 | ||
|
|
3beca8bba5 | ||
|
|
b5d66dba8a | ||
|
|
24d01a2156 | ||
|
|
45d848cbb9 | ||
|
|
e2f649dd35 | ||
|
|
183bffbc0e | ||
|
|
a874415859 | ||
|
|
93b33ba383 | ||
|
|
26420719f3 | ||
|
|
dc6a35d656 | ||
|
|
51da0bd7b7 | ||
|
|
1afb2c6883 | ||
|
|
f78fcc2b71 | ||
|
|
fb2d30f2c9 | ||
|
|
8781e7c6ad | ||
|
|
c34317b1e5 | ||
|
|
b09730b422 | ||
|
|
0f1725a7ab | ||
|
|
b12e0358d6 | ||
|
|
7ef841746a | ||
|
|
2b52b2379e | ||
|
|
8dd5965c44 | ||
|
|
bc59521cc8 | ||
|
|
815822ef40 | ||
|
|
9e6d33cc1a | ||
|
|
44df85f2bd | ||
|
|
2c15c7087e | ||
|
|
6b281628ed | ||
|
|
9f74db0aff | ||
|
|
83ea5c7fa3 | ||
|
|
bf6fe3482b | ||
|
|
f4d6803720 | ||
|
|
23c2a16286 | ||
|
|
afc301fad2 | ||
|
|
1c0a50e48f | ||
|
|
02e119d0da | ||
|
|
06fcc383ce | ||
|
|
408b1f76e4 | ||
|
|
3a879a37e2 | ||
|
|
9e1bb50d78 | ||
|
|
25dcf426b1 | ||
|
|
7b7baaea62 | ||
|
|
36d83804d0 | ||
|
|
7c46d2e27f | ||
|
|
d4acad33ea | ||
|
|
91cc1159bc | ||
|
|
21b7068c90 | ||
|
|
682d2bf922 | ||
|
|
3ff6788405 | ||
|
|
e59a8606ab | ||
|
|
157285ddb6 | ||
|
|
f49c3e0ff7 | ||
|
|
345877b9fd | ||
|
|
37e4105585 | ||
|
|
4a05b59b4b | ||
|
|
57322d75d7 | ||
|
|
4ccc2c1f71 | ||
|
|
652b32619d | ||
|
|
57b3611965 | ||
|
|
afbf9e619a | ||
|
|
060b1da388 | ||
|
|
38024b6be4 | ||
|
|
6aede6e48b | ||
|
|
b27adfbe27 | ||
|
|
b28e3b2a00 | ||
|
|
ffe4374519 | ||
|
|
793df087ae | ||
|
|
85eadd5856 | ||
|
|
359efe0036 | ||
|
|
3186691b7b | ||
|
|
044c795f38 | ||
|
|
f7128449ca | ||
|
|
3d0c5165b7 | ||
|
|
fc6cda86df | ||
|
|
59877e181e | ||
|
|
506b1a17d1 | ||
|
|
214c2ba0ad | ||
|
|
387312bc87 | ||
|
|
3d3da04e58 | ||
|
|
7ec0cbb43c | ||
|
|
1cd834579c | ||
|
|
a11005c14b | ||
|
|
ea1480e286 | ||
|
|
f1dd328c38 | ||
|
|
44295de206 | ||
|
|
b273082492 | ||
|
|
da088d88ba | ||
|
|
fd13570074 | ||
|
|
b5630a9dae | ||
|
|
0e2cab6409 | ||
|
|
38dc587318 | ||
|
|
6fbddcb7c2 | ||
|
|
df1df2964d | ||
|
|
9b9c2546c8 | ||
|
|
6ce0e72b33 | ||
|
|
a7784d7870 | ||
|
|
306ca3e04f | ||
|
|
82988b0e08 | ||
|
|
8b27d0e249 | ||
|
|
bfae547240 | ||
|
|
0abd026f78 | ||
|
|
3362a76de7 | ||
|
|
355b6c2e7d | ||
|
|
4e3c643e43 | ||
|
|
760cb97db4 | ||
|
|
0be6f7f57e | ||
|
|
d31223fa0c | ||
|
|
86ee9befc1 | ||
|
|
d5689b061f | ||
|
|
a3c4da4455 | ||
|
|
ee9f97f917 | ||
|
|
270c7377de | ||
|
|
9044b57306 | ||
|
|
9ad815a44a | ||
|
|
b7e432228b | ||
|
|
78da30f2ad | ||
|
|
aeea53017f | ||
|
|
f21ebfc366 | ||
|
|
2549aa5809 | ||
|
|
b733b70ad8 | ||
|
|
f9f59bd7c2 | ||
|
|
58933a6bcd | ||
|
|
45d7a29a95 | ||
|
|
e9d1fdb4ee | ||
|
|
2785ca9f31 | ||
|
|
12912a62aa | ||
|
|
2c2b078514 | ||
|
|
110294103f | ||
|
|
a9f3b839ec | ||
|
|
6bd677ad6f | ||
|
|
7d1c5f3510 | ||
|
|
a49508fd20 | ||
|
|
5870213ff0 | ||
|
|
65c3d7f925 | ||
|
|
33f4fd8fee | ||
|
|
9bdc34dc42 | ||
|
|
ff654df997 | ||
|
|
b7758da2f3 | ||
|
|
747089f1a8 | ||
|
|
9ee3021b76 | ||
|
|
0c60ea66e3 | ||
|
|
c3bb312b5f | ||
|
|
7447a42d40 | ||
|
|
3e9cc367af | ||
|
|
4c1790014f | ||
|
|
03fc7a579a | ||
|
|
a53db257cf | ||
|
|
b093cab493 | ||
|
|
9b484dc819 | ||
|
|
5ab26a9f8c | ||
|
|
b800a63bd2 | ||
|
|
43a5e47fb3 | ||
|
|
319545106e | ||
|
|
39b261b8a0 | ||
|
|
c9e61d1098 | ||
|
|
0bffdaa5fc | ||
|
|
9228510834 | ||
|
|
0b002a8946 | ||
|
|
ad43ddabe6 | ||
|
|
24c022a329 | ||
|
|
0e48cee0d6 | ||
|
|
4ad1794d95 | ||
|
|
46cf25b585 | ||
|
|
b3d78fc30f | ||
|
|
556bc06da4 | ||
|
|
7e8f9c463b | ||
|
|
568c7779b6 | ||
|
|
0a0d237f4d | ||
|
|
c243ccbdce | ||
|
|
64b79d6af5 | ||
|
|
016c0f3743 | ||
|
|
fd1599e0a7 | ||
|
|
7408aa6b72 | ||
|
|
e6b2107fa9 | ||
|
|
9aff52eaad | ||
|
|
bf5bda0f85 | ||
|
|
ffbf2d0a93 | ||
|
|
82f59ef5a2 | ||
|
|
c2c40abbb4 | ||
|
|
bb54d732d0 | ||
|
|
eee4e0c676 | ||
|
|
d9457ae017 | ||
|
|
bbc0b18b19 | ||
|
|
da7651311e | ||
|
|
72846f0817 | ||
|
|
05ef3387ab | ||
|
|
eed44e5737 | ||
|
|
27c7a85a21 | ||
|
|
4f6dd046ec | ||
|
|
89fad9ada7 | ||
|
|
bc31b49b99 | ||
|
|
09444e3624 | ||
|
|
7586243a95 | ||
|
|
1e1c7801e1 | ||
|
|
a363f6ef5f | ||
|
|
334e1fd2da | ||
|
|
2e8e29e93c | ||
|
|
5e5a1a3668 | ||
|
|
b93b464ebf | ||
|
|
842ba46a95 | ||
|
|
03b27d8e8f | ||
|
|
c11b41c6ba | ||
|
|
018cc526ee | ||
|
|
edf4508e6b | ||
|
|
d26a1f0312 | ||
|
|
2984f6a453 | ||
|
|
a00058d959 | ||
|
|
8e56a457f1 | ||
|
|
74d5f021cd | ||
|
|
a37715315d | ||
|
|
d9c9977610 | ||
|
|
c2f0cbb10a | ||
|
|
a34d00d822 | ||
|
|
9924ec6963 | ||
|
|
9036201887 | ||
|
|
b2435d2430 | ||
|
|
afd6148770 | ||
|
|
b70b58a35a | ||
|
|
df963c2780 | ||
|
|
1b732c76e6 | ||
|
|
f9489b0173 | ||
|
|
18942c55ae | ||
|
|
bf34b2f1ca | ||
|
|
a717a021c2 | ||
|
|
dcf718d592 | ||
|
|
f5eeb2b839 | ||
|
|
bc435adc11 | ||
|
|
aeb8e82cbd | ||
|
|
5cb2ed3ccd | ||
|
|
93b1864d1b | ||
|
|
a6efffda45 | ||
|
|
c89d6f1a58 | ||
|
|
d4f16abfac | ||
|
|
8529f3f355 | ||
|
|
2eb136827d | ||
|
|
9594e6eb32 | ||
|
|
9e8111994a | ||
|
|
af0c2b7129 | ||
|
|
96b73a0cef | ||
|
|
6c290ee2d3 | ||
|
|
ca53e3de3a | ||
|
|
6ea3ec700a | ||
|
|
fe3355e08e | ||
|
|
42f08f5027 | ||
|
|
7a1c8882e6 | ||
|
|
2c193e7e48 | ||
|
|
9714c1c9f6 | ||
|
|
c8f72b5f14 | ||
|
|
be0439f771 | ||
|
|
43da95b4a5 | ||
|
|
3d93a63caa | ||
|
|
9550607da3 | ||
|
|
d5d9798913 | ||
|
|
6cfe08235f | ||
|
|
49eb850ff1 | ||
|
|
5a558583d2 | ||
|
|
1e5f0d0555 | ||
|
|
e2b0b03c96 | ||
|
|
b9fb9f1b34 | ||
|
|
52fd932fd8 | ||
|
|
b0cc200df7 | ||
|
|
05b32db37d | ||
|
|
41f7192532 | ||
|
|
fa420303dc | ||
|
|
b7fd539755 | ||
|
|
cfb8b03446 | ||
|
|
712601041d | ||
|
|
36093eccaf | ||
|
|
58eb6d4210 | ||
|
|
2166429cbf | ||
|
|
236ab10b11 | ||
|
|
99142fdde3 | ||
|
|
ca6755d8b5 | ||
|
|
92ad333863 | ||
|
|
4c48272b4c | ||
|
|
ab5bd1db69 | ||
|
|
5d1cd10f5d | ||
|
|
ef784be082 | ||
|
|
855c41a0e9 | ||
|
|
6ef9667f72 | ||
|
|
068d384e7a | ||
|
|
c3699a8595 | ||
|
|
2cb7513355 | ||
|
|
c58caeda4c | ||
|
|
26fc56f2b8 | ||
|
|
c44ae2f00c | ||
|
|
a00b62ffcc | ||
|
|
6a9e7aa89d | ||
|
|
6206b38a78 | ||
|
|
1767bfa70d | ||
|
|
b1d6611923 | ||
|
|
a6a713f40e | ||
|
|
e76ad04207 | ||
|
|
a231adbfdd | ||
|
|
88f97ecb4e | ||
|
|
68a471b859 | ||
|
|
9393324e1f | ||
|
|
944931f7d1 | ||
|
|
5a56be8a75 | ||
|
|
fe7aebae05 | ||
|
|
b6c3b0cdc3 | ||
|
|
fd734fadbc | ||
|
|
a3dc250698 | ||
|
|
3f2d36284f | ||
|
|
60d5184a7b | ||
|
|
da612bdc7b | ||
|
|
628a085ba8 | ||
|
|
5ae91ac620 | ||
|
|
70265c55ef | ||
|
|
7c3b5fc31e | ||
|
|
a9a830caa2 | ||
|
|
b49ff3d4ed | ||
|
|
42310fa170 | ||
|
|
bfff1d9e2f | ||
|
|
2c98777b9f | ||
|
|
4a91260a31 | ||
|
|
076971bcae | ||
|
|
01fcc9bcab | ||
|
|
f56f201bad | ||
|
|
45e579f0ef | ||
|
|
39db811361 | ||
|
|
ff87555eba | ||
|
|
6c5c2d40bc | ||
|
|
c08459e370 | ||
|
|
42418394ed | ||
|
|
64fd0e2f28 | ||
|
|
2de061203b | ||
|
|
cee0d3f03e | ||
|
|
aa19ae129b | ||
|
|
aecbf8ccb3 | ||
|
|
7e5c19f507 | ||
|
|
b178ecd494 | ||
|
|
05d5039fab | ||
|
|
1004e5a8bd | ||
|
|
dbcfe6fc6e | ||
|
|
56698aefe6 | ||
|
|
cbd2e136ed | ||
|
|
9846d7f8e4 | ||
|
|
d16c86a4d7 | ||
|
|
292e642d16 | ||
|
|
90736b52be | ||
|
|
928e8a200b | ||
|
|
2ee06eab2d | ||
|
|
01913983ea | ||
|
|
0aa2f2c44d | ||
|
|
f66d655782 | ||
|
|
4094a08198 | ||
|
|
05389da412 | ||
|
|
e38258b04b | ||
|
|
0cd0e2f730 | ||
|
|
d2c7483db1 | ||
|
|
d388c52ccd | ||
|
|
4a2954d3a4 | ||
|
|
804b9a1d71 | ||
|
|
1067efbbee | ||
|
|
d41ecbeed6 | ||
|
|
f93148b7d7 | ||
|
|
348877c7cd | ||
|
|
fb7c2573bf | ||
|
|
e4fcc77b0a | ||
|
|
5c9b79729f | ||
|
|
00d4541537 | ||
|
|
1660e563ab | ||
|
|
b94081c45b | ||
|
|
f7b59f0140 | ||
|
|
22aecbe4ba | ||
|
|
be98db9023 | ||
|
|
828e095e64 | ||
|
|
8e1e21b960 | ||
|
|
303d8815e3 | ||
|
|
ba574dda62 | ||
|
|
bf630b5f7d | ||
|
|
9b4bf148cc | ||
|
|
f5212b4aa1 | ||
|
|
eea4cdf379 | ||
|
|
e909b48fea | ||
|
|
258aabbdde | ||
|
|
478f26e75a | ||
|
|
57cc558b9b | ||
|
|
29984d4b09 | ||
|
|
e1a266e5d8 | ||
|
|
a33a7317cc | ||
|
|
1d0bcd857e | ||
|
|
040da2429f | ||
|
|
978a395421 | ||
|
|
63e5625d62 | ||
|
|
38bbae13b9 | ||
|
|
e975a8106f | ||
|
|
6a49887ad7 | ||
|
|
5565ec2ddb | ||
|
|
20b1f8eff8 | ||
|
|
34fd000df9 | ||
|
|
1132177e2d | ||
|
|
5be39c04ef | ||
|
|
0ee4593608 | ||
|
|
f301344587 | ||
|
|
d2c5c856ab | ||
|
|
5f8e4ae10c | ||
|
|
4ff30b1a9d | ||
|
|
a0b215dab6 | ||
|
|
144e82d7e2 | ||
|
|
79252ba3b0 | ||
|
|
c5286093f9 | ||
|
|
5ad194bd45 | ||
|
|
501113da44 | ||
|
|
f0a7990404 | ||
|
|
27f53ff4a6 | ||
|
|
9ec5dfc8b1 | ||
|
|
e4c1e414c8 | ||
|
|
a391650472 | ||
|
|
3cfde2b40d | ||
|
|
8bf1ed33dc | ||
|
|
422b3be0c5 | ||
|
|
c34e44c4ec | ||
|
|
a2b20eca67 | ||
|
|
d41c316bfb | ||
|
|
ca1d8aab84 | ||
|
|
32e3dcff7c | ||
|
|
9a23470622 | ||
|
|
c37a186802 | ||
|
|
84c17e3b22 | ||
|
|
64e0fca124 | ||
|
|
5c6537fd7a | ||
|
|
764a82df00 | ||
|
|
e904911fd9 | ||
|
|
a7494f72f6 | ||
|
|
b6b53b028d | ||
|
|
1743ce714a | ||
|
|
656f0c5d11 | ||
|
|
d80aebe1f4 | ||
|
|
ad48bc1962 | ||
|
|
d72fbb7098 | ||
|
|
95d5eaa09b | ||
|
|
b997a6159e | ||
|
|
1cd8b7a450 | ||
|
|
c5a8eb4261 | ||
|
|
8891c29cbd | ||
|
|
2facdfa1dd | ||
|
|
65c9fa0c21 | ||
|
|
e53c85dbaf | ||
|
|
3a231e8e61 | ||
|
|
4dc7776387 | ||
|
|
5ca043e0f1 | ||
|
|
9ef052c814 | ||
|
|
6d1690beaa | ||
|
|
171656e5be | ||
|
|
385e7f4871 | ||
|
|
89c5485784 | ||
|
|
02d191ec28 | ||
|
|
47c3090f3a | ||
|
|
476dac1ac1 | ||
|
|
8ca0d0ced4 | ||
|
|
ab197489d7 | ||
|
|
99736d187b | ||
|
|
197c09bd0d | ||
|
|
6cc634ba1f | ||
|
|
4c89ad91d2 | ||
|
|
d66233bce0 | ||
|
|
b485e6927e | ||
|
|
74b9e8bd7b | ||
|
|
545742ecc0 | ||
|
|
d9f1f65352 | ||
|
|
0904d17a5f | ||
|
|
87171b4246 | ||
|
|
78f8b56203 | ||
|
|
b79045eddb | ||
|
|
6eb67b1a3c | ||
|
|
777ec39bd9 | ||
|
|
9dcafaaa38 | ||
|
|
097e2fb653 | ||
|
|
e7aa97634b | ||
|
|
447b9f265f | ||
|
|
029a6f03b7 | ||
|
|
ae4a349d79 | ||
|
|
35728c7911 | ||
|
|
469330f270 | ||
|
|
03f9c56928 | ||
|
|
ed2a2a8975 | ||
|
|
b5380f183c | ||
|
|
f5bcaba352 | ||
|
|
5a70b23db9 | ||
|
|
fc3487e545 | ||
|
|
a4863dc8d7 | ||
|
|
af12a08e25 | ||
|
|
312dc294b3 | ||
|
|
d958dd5ee4 | ||
|
|
1ddc49b17b | ||
|
|
322541b16f | ||
|
|
00cb10f029 | ||
|
|
ed24a721ed | ||
|
|
9fc10e0f65 | ||
|
|
ab212e0565 | ||
|
|
eac0049577 | ||
|
|
9d1d51d0d7 | ||
|
|
4fd3c4ada6 | ||
|
|
dd73d8fc69 | ||
|
|
b89d37c8c5 | ||
|
|
bc4983c771 | ||
|
|
e6c186b31b | ||
|
|
b106fa55d3 | ||
|
|
981e42c5a9 | ||
|
|
c160c5a555 | ||
|
|
31c7bf5348 | ||
|
|
89bf457878 | ||
|
|
6eadf718fc | ||
|
|
effced24d1 | ||
|
|
09f399db9a | ||
|
|
2b73f6faea | ||
|
|
943662605e | ||
|
|
9a04962bd6 | ||
|
|
91a36eb9a0 | ||
|
|
c371f6bbb5 | ||
|
|
8324e2e454 | ||
|
|
30307c1b56 | ||
|
|
f139d0d2a8 | ||
|
|
33843764a7 | ||
|
|
aca7d7c571 | ||
|
|
bff72f609c | ||
|
|
adb03b7420 | ||
|
|
2094e18b60 | ||
|
|
541d8ddd40 | ||
|
|
f996172218 | ||
|
|
f9ffc1c1f3 | ||
|
|
05085ad504 | ||
|
|
64aecaf28b | ||
|
|
7b3ef45300 | ||
|
|
bd25de930b | ||
|
|
15d43c9653 | ||
|
|
5b7eba61cc | ||
|
|
2445c79805 | ||
|
|
63be2dee47 | ||
|
|
5bfef1be32 | ||
|
|
8253526f23 | ||
|
|
db19548e2c | ||
|
|
10af31f042 | ||
|
|
e7c6e17590 | ||
|
|
a3d0ceb6a5 | ||
|
|
a277ac182b | ||
|
|
0eee613a95 | ||
|
|
b76fa38e09 | ||
|
|
7679c11b5b | ||
|
|
e7ae2ab441 | ||
|
|
c0f5c8a358 | ||
|
|
dd5feb0e2c | ||
|
|
b95d05c134 | ||
|
|
87bdd0016e | ||
|
|
b9befa4e63 | ||
|
|
d9ed00ddee | ||
|
|
4c2b484c2b | ||
|
|
ff31e41fec | ||
|
|
34204f6183 | ||
|
|
6fc8763895 | ||
|
|
71dd82afe8 | ||
|
|
ea5425a528 | ||
|
|
1a0914196f | ||
|
|
9dd1adacd2 | ||
|
|
93c5268fbc | ||
|
|
98edc89fa0 | ||
|
|
3aad412102 | ||
|
|
a2ee9524fb | ||
|
|
78955a1540 | ||
|
|
f412b7e734 | ||
|
|
b13f3004e2 | ||
|
|
a093b0f8e8 | ||
|
|
d4ba13eee3 | ||
|
|
34a84c6548 | ||
|
|
6c52c1177b | ||
|
|
f9bc312f91 | ||
|
|
7283153f44 | ||
|
|
df6b2bd0e8 | ||
|
|
16831880dd | ||
|
|
f79fc98ba6 | ||
|
|
0483c75dd7 | ||
|
|
3a4dcacd56 | ||
|
|
5f6f09674e | ||
|
|
c785027c5c | ||
|
|
d2659cea5f | ||
|
|
a9b966b159 | ||
|
|
f2c23e21c5 | ||
|
|
53b973e2d3 | ||
|
|
b7a570cba2 | ||
|
|
c77b79f0d2 | ||
|
|
ef6678d8b0 | ||
|
|
21609fa9c4 | ||
|
|
accc083702 | ||
|
|
9e677f3871 | ||
|
|
55290eac30 | ||
|
|
d480502d33 | ||
|
|
c1cda16be0 | ||
|
|
8ca9df9f34 | ||
|
|
406b67b081 | ||
|
|
2c9fecf3ef | ||
|
|
6bc78b67bd | ||
|
|
5bbc46e070 | ||
|
|
6a9ceda361 | ||
|
|
ab2d5fd58f | ||
|
|
7018413777 | ||
|
|
77385616a4 | ||
|
|
c809f27bf5 | ||
|
|
493e778124 | ||
|
|
7373af50b9 | ||
|
|
309f053510 | ||
|
|
d976cf8a27 | ||
|
|
5d60a62a38 | ||
|
|
a3f7dbccea | ||
|
|
0c4cce3339 | ||
|
|
58ccbc4d3d | ||
|
|
c6cabc2087 | ||
|
|
ef1f2722fc | ||
|
|
6b4a7ee03b | ||
|
|
7745a2051d | ||
|
|
eabd5e9acc | ||
|
|
d7dcbf98ff | ||
|
|
ff4c73f3d3 | ||
|
|
dbf044b418 | ||
|
|
7a514e2492 | ||
|
|
a73e533287 | ||
|
|
0f175ac4c6 | ||
|
|
be15f1c698 | ||
|
|
a315da6041 | ||
|
|
3f43f218ac | ||
|
|
5c8ad646af | ||
|
|
77f5fddd90 | ||
|
|
eab8b1ede5 | ||
|
|
2ab0896523 | ||
|
|
639fe920df | ||
|
|
7577c84eca | ||
|
|
22c4ec2d4a | ||
|
|
8ac85881a9 | ||
|
|
724804efc6 | ||
|
|
ca57ef17fc | ||
|
|
480f015fb0 | ||
|
|
d90e087f20 | ||
|
|
3916cc0562 | ||
|
|
cb54e56417 | ||
|
|
6aa606f2fa | ||
|
|
53d13a11ce | ||
|
|
9ba2b4142d | ||
|
|
f5161a5b99 | ||
|
|
f9d5d190d5 | ||
|
|
eead9639a2 | ||
|
|
5044d5d3b4 | ||
|
|
44eed2c1df | ||
|
|
e83b182e4d | ||
|
|
888a76eda0 | ||
|
|
668364e583 | ||
|
|
35c7a2d1b6 | ||
|
|
79803178cd | ||
|
|
419ee8d8ff | ||
|
|
328b3c9409 | ||
|
|
f097508e87 | ||
|
|
e6791ee8ec | ||
|
|
cfbeba3de1 | ||
|
|
bbc7f5a734 | ||
|
|
e8726f03f3 | ||
|
|
de95c6d698 | ||
|
|
86b57447d8 | ||
|
|
c9d1efc6e7 | ||
|
|
dd1eeaddfa | ||
|
|
7f098db3de | ||
|
|
6468cbbfbd | ||
|
|
a30d61e842 | ||
|
|
e0029fdc87 | ||
|
|
712e2c32a0 | ||
|
|
f28e15b567 | ||
|
|
128e33661f | ||
|
|
3916561c62 | ||
|
|
00638d074a | ||
|
|
ca51b2d83a | ||
|
|
1a879f97a2 | ||
|
|
89d18cb7c5 | ||
|
|
4e14249707 | ||
|
|
41f2c08da8 | ||
|
|
4fca7bcfcf | ||
|
|
232725329a | ||
|
|
88247851f4 | ||
|
|
6efaec6642 | ||
|
|
b9e31e39e2 | ||
|
|
e2cd8ed391 | ||
|
|
8a1641fbfa | ||
|
|
936f069ac3 | ||
|
|
89faad730e | ||
|
|
798ab3e183 | ||
|
|
5508aa4533 | ||
|
|
81b7ebbab6 | ||
|
|
2d06e33e10 | ||
|
|
d8cc820572 | ||
|
|
d0ca46cfde | ||
|
|
513124161e | ||
|
|
7cfd8c7f79 | ||
|
|
c32ce5e795 | ||
|
|
d9c1530651 | ||
|
|
305eb071a9 | ||
|
|
10dab69c63 | ||
|
|
60ed594996 | ||
|
|
e60ddb3ee1 | ||
|
|
26b0992285 | ||
|
|
63f3ac807c | ||
|
|
ed1c33eac0 | ||
|
|
e7b7fd0bcc | ||
|
|
79d2b04721 | ||
|
|
5a8ab2d29c | ||
|
|
ed527ac394 | ||
|
|
bf09f48196 | ||
|
|
2a5af15aef | ||
|
|
1f8fe35e25 | ||
|
|
5979273a64 | ||
|
|
ef8c9e3968 | ||
|
|
baa9fdb660 | ||
|
|
35a860bb38 | ||
|
|
286939dc2c | ||
|
|
dd5b1dbdd8 | ||
|
|
fb8d3a038d | ||
|
|
ea5a25a671 | ||
|
|
d21fc4ab1d | ||
|
|
3ae3974866 | ||
|
|
71ffc3087e | ||
|
|
8f406489d4 | ||
|
|
a08d270968 | ||
|
|
48f13e4b82 | ||
|
|
51060f0e4b | ||
|
|
c583109046 | ||
|
|
cf05b693f1 | ||
|
|
d248c1ab0d | ||
|
|
34623fca94 | ||
|
|
975bdd5897 | ||
|
|
1b3380c2ca | ||
|
|
bb707b4a03 | ||
|
|
acb3b6ac85 | ||
|
|
80f6985f5f | ||
|
|
5e3a9c0579 | ||
|
|
b30d62d483 | ||
|
|
0ea1fdbd19 | ||
|
|
f068586f74 | ||
|
|
463f462e24 | ||
|
|
e0c4e3c58e | ||
|
|
5aa3ef38ba | ||
|
|
827277f6a3 | ||
|
|
46389341db | ||
|
|
a58f05a295 | ||
|
|
c0b0a0fe92 | ||
|
|
e9f471dd6f | ||
|
|
7917c5dddb | ||
|
|
de4541a3d9 | ||
|
|
77a496baa7 | ||
|
|
86e863de09 | ||
|
|
c2cfd217c2 | ||
|
|
f2366a61b0 | ||
|
|
9959393dee | ||
|
|
16facf98f1 | ||
|
|
bc8ce8832a | ||
|
|
20bcf960ef | ||
|
|
5cecd3e995 | ||
|
|
d7ead25ea4 | ||
|
|
75c0c375d1 | ||
|
|
5db4913292 | ||
|
|
a6a53b1d0d | ||
|
|
81a0c0e120 | ||
|
|
0dae71a644 | ||
|
|
f8eedaa3ea | ||
|
|
ce2d97a7e7 | ||
|
|
2cb570eaca | ||
|
|
c8c4352957 | ||
|
|
a311db4555 | ||
|
|
05c515b2da | ||
|
|
c1acf2b0fe | ||
|
|
803a2407eb | ||
|
|
a87945d1fb | ||
|
|
30793e68df | ||
|
|
9c666bf7a9 | ||
|
|
eff1dd7c34 | ||
|
|
e79a33ebb0 | ||
|
|
cb0adfdeaf | ||
|
|
6b135c343c | ||
|
|
6c92db524b | ||
|
|
b8dfd1c041 | ||
|
|
54d6347c1d | ||
|
|
4ea6e90600 | ||
|
|
4c7628a247 | ||
|
|
6c7334155a | ||
|
|
480e3ea974 | ||
|
|
1f639a5bc6 | ||
|
|
ccf3b07c3a | ||
|
|
d8508f2b72 | ||
|
|
5e13961ec8 | ||
|
|
80b1139371 | ||
|
|
635b41765c | ||
|
|
4b03686aa2 | ||
|
|
bfb0d8d639 | ||
|
|
93d4a0211d | ||
|
|
cd31bc69ef | ||
|
|
4a7b84d6de | ||
|
|
3142714c11 | ||
|
|
7ea10416a9 | ||
|
|
3e427db0f1 | ||
|
|
9f7b18d294 | ||
|
|
9af0e351b8 | ||
|
|
5c6aa2340d | ||
|
|
4424ec48cf | ||
|
|
61be34581e | ||
|
|
731978356d | ||
|
|
d5223ad1ab | ||
|
|
7cfdfab198 | ||
|
|
eb70e51ac1 | ||
|
|
1d48e7c7ae | ||
|
|
d6fc9fc8c3 | ||
|
|
8ada0976fe | ||
|
|
389ff5e9a4 | ||
|
|
5179e0228c | ||
|
|
2268526314 | ||
|
|
db4bc0eafe | ||
|
|
6edaf79df1 | ||
|
|
79cead3b59 | ||
|
|
db1b12b85c | ||
|
|
9360b7675a | ||
|
|
9c82fd17fe | ||
|
|
3a4665e473 | ||
|
|
b34f4648ee | ||
|
|
0de786d2ea | ||
|
|
ec7aafa1ff | ||
|
|
30c219716d | ||
|
|
5dd47cb89b | ||
|
|
abe856bd3f | ||
|
|
6ecb009466 | ||
|
|
3b4b2383a8 | ||
|
|
4ddd46c4a2 | ||
|
|
69ec2469b4 | ||
|
|
5789af801a | ||
|
|
7171b6302b | ||
|
|
51d4818b1e | ||
|
|
1c2875e7fc | ||
|
|
5048a88310 | ||
|
|
aef37f4362 | ||
|
|
d04641041b | ||
|
|
67b2ccea86 | ||
|
|
5ff9ca3c99 | ||
|
|
fe55df8b2f | ||
|
|
457f605898 | ||
|
|
0f2625133f | ||
|
|
fa34dbdf6f | ||
|
|
050913b0b4 | ||
|
|
a47e47d42c | ||
|
|
43d994b59a | ||
|
|
e8204d46ce | ||
|
|
fece659cfb | ||
|
|
695265b299 | ||
|
|
b652ed0b33 | ||
|
|
9a641552e4 | ||
|
|
3d18aeb5bc | ||
|
|
b545afce50 | ||
|
|
8fca98c0c9 | ||
|
|
0a98c71dfe | ||
|
|
ed75f39094 | ||
|
|
456245f23a | ||
|
|
b4529c9338 | ||
|
|
0ca7a8ab8a | ||
|
|
02f2209e8f | ||
|
|
fb72d02912 | ||
|
|
665fb25fc1 | ||
|
|
742c3c7156 | ||
|
|
637dbbba0d | ||
|
|
f2a3bc4626 | ||
|
|
e8ffa44544 | ||
|
|
bc09287666 | ||
|
|
392d9055fe | ||
|
|
0ee833d7ae | ||
|
|
3074bc00d7 | ||
|
|
cb6fb590c4 | ||
|
|
a7270b2cd2 | ||
|
|
0d925af065 | ||
|
|
7c7991e8ae | ||
|
|
54461b6ea4 | ||
|
|
6a17497fbd | ||
|
|
84f18aa4b6 | ||
|
|
73ab38563f | ||
|
|
1f2b40e4d4 | ||
|
|
1d920c5935 | ||
|
|
037a1e9c0c | ||
|
|
87e324d4d9 | ||
|
|
d1e9b489e3 | ||
|
|
34f1d538d1 | ||
|
|
fb8d2a2e01 | ||
|
|
837db5183e | ||
|
|
a556877a17 | ||
|
|
bcbd6dc4db | ||
|
|
41f7ad8d75 | ||
|
|
258d4b28da | ||
|
|
31e900c422 | ||
|
|
7b1a76871a | ||
|
|
c6f3e7672f | ||
|
|
540c31903c | ||
|
|
3e5262d7a3 | ||
|
|
2b36ffef45 | ||
|
|
4c25d2275c | ||
|
|
6c66fcdfc3 | ||
|
|
aaa972d767 | ||
|
|
45c8538426 | ||
|
|
95702724a9 | ||
|
|
98c4d3853c | ||
|
|
7c91143f39 | ||
|
|
56e6f57568 | ||
|
|
ccab456679 | ||
|
|
5af000ca43 | ||
|
|
354c8f04ae | ||
|
|
3fbd336b45 | ||
|
|
3c0b86a322 | ||
|
|
fca4b69d5a | ||
|
|
ce62072761 | ||
|
|
93dd7a8478 | ||
|
|
02fb84a312 | ||
|
|
f3e68989e5 | ||
|
|
468050a9ce | ||
|
|
f37a602da3 | ||
|
|
2979691d7e | ||
|
|
72920a0432 | ||
|
|
e81075ef04 | ||
|
|
df1a99d877 | ||
|
|
10e825dc9f | ||
|
|
07ba7933fb | ||
|
|
3059eac0fd | ||
|
|
aa33aa6d4f | ||
|
|
0a1cdeeaa3 | ||
|
|
e4bef47b7e | ||
|
|
f551f994b5 | ||
|
|
4b7a3af691 | ||
|
|
6f88a80118 | ||
|
|
e03715ee46 | ||
|
|
aafe6d8863 | ||
|
|
47005483cd | ||
|
|
378075955a | ||
|
|
2059797904 | ||
|
|
8c711242a9 | ||
|
|
481894c89b | ||
|
|
ba53275322 | ||
|
|
cfe2b4c1bd | ||
|
|
60e83f8324 | ||
|
|
ceac040d82 | ||
|
|
89d400c81a | ||
|
|
4cf7bca399 | ||
|
|
761441622e | ||
|
|
1b814abf0b | ||
|
|
62a2147e33 | ||
|
|
246dff9c87 | ||
|
|
50494beb27 | ||
|
|
ce3b3ebfd8 | ||
|
|
213090c32e | ||
|
|
adb8668197 | ||
|
|
0023677003 | ||
|
|
0b19a37ad4 | ||
|
|
9f34ae5d28 | ||
|
|
6f07b5cf08 | ||
|
|
0f39431157 | ||
|
|
bc1a470e64 | ||
|
|
09e24f5684 | ||
|
|
2f27ea4c8a | ||
|
|
d09aba70b7 | ||
|
|
69b0a80684 | ||
|
|
48f0c56a9e | ||
|
|
83833a3693 | ||
|
|
18429d52d4 | ||
|
|
58cc90083b | ||
|
|
2772161144 | ||
|
|
0e95259b14 | ||
|
|
3d9f38f1e3 | ||
|
|
ba3accd834 | ||
|
|
0786e40ebd | ||
|
|
8a56393159 | ||
|
|
5ca8a6ecfa | ||
|
|
5c82edc4be | ||
|
|
093c04bc24 | ||
|
|
131dd46a38 | ||
|
|
6b1b4fdfbb | ||
|
|
e4ad779b37 | ||
|
|
65d817624e | ||
|
|
66501189c4 | ||
|
|
4303898bb8 | ||
|
|
7d76a9d3ed | ||
|
|
1cc42f341b | ||
|
|
0b41ee0a29 | ||
|
|
66b6c4d04f | ||
|
|
6502843d6c | ||
|
|
5ecfe72e19 | ||
|
|
f28cdefffe | ||
|
|
40494f2cf1 | ||
|
|
f2664c112b | ||
|
|
41d91df355 | ||
|
|
965671dd93 | ||
|
|
c8d08e4b2c | ||
|
|
2897a9b484 | ||
|
|
d190e59d83 | ||
|
|
0bb25e8773 | ||
|
|
37e1903cb1 | ||
|
|
b402846d43 | ||
|
|
c1a6dd385a | ||
|
|
ccbef236d3 | ||
|
|
d7b9e8b2e0 | ||
|
|
deaf77d3d0 | ||
|
|
5c738f97ed | ||
|
|
c9f7f7ab08 | ||
|
|
746977d5d0 | ||
|
|
acb09bfe71 | ||
|
|
e2a1203b43 | ||
|
|
124036cea6 | ||
|
|
2ac1d82826 | ||
|
|
fa4e0c1948 | ||
|
|
735427ead0 | ||
|
|
4fa99a7e1b | ||
|
|
2f963a205a | ||
|
|
1f03f7e7c3 | ||
|
|
31689fb6ba | ||
|
|
cf7ebbd314 | ||
|
|
40a953aed5 | ||
|
|
c4d999ada7 | ||
|
|
fff6b4e155 | ||
|
|
380e08d89f | ||
|
|
96c8199092 | ||
|
|
54870cf067 | ||
|
|
8654447aac | ||
|
|
28a690cbba | ||
|
|
52d1a48c0b | ||
|
|
f45333db5e | ||
|
|
c920e45934 | ||
|
|
dd86ef4591 | ||
|
|
b9fb00f042 | ||
|
|
355d9fd995 | ||
|
|
b68c13c4f2 | ||
|
|
f2803291ab | ||
|
|
54df034c77 | ||
|
|
7317b8bc18 |
+8
-5
@@ -5,6 +5,8 @@
|
||||
!.vscode/extensions.json
|
||||
|
||||
/node_modules
|
||||
package-lock.json
|
||||
|
||||
|
||||
# 체섭 ignore
|
||||
*.log
|
||||
@@ -17,7 +19,10 @@ sess_*
|
||||
*/logs/*/*.txt
|
||||
*/logs/preserved
|
||||
err.txt
|
||||
|
||||
che/.htaccess
|
||||
kwe/.htaccess
|
||||
pwe/.htaccess
|
||||
twe/.htaccess
|
||||
hwe/.htaccess
|
||||
|
||||
d_shared
|
||||
@@ -54,13 +59,11 @@ test.*
|
||||
/pya
|
||||
/twe
|
||||
|
||||
/hwe/data
|
||||
|
||||
/vendor
|
||||
phpinfo.php
|
||||
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
|
||||
*.sqlite3
|
||||
|
||||
ingame/js/*
|
||||
ingame/css/*
|
||||
gateway/js/*
|
||||
gateway/css/*
|
||||
gateway/css/*
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"extension": ["ts"],
|
||||
"spec": "hwe/test-ts/**/*.test.ts",
|
||||
"require": [
|
||||
"ts-node/register",
|
||||
"tsconfig-paths/register"
|
||||
],
|
||||
"node-option": [
|
||||
"experimental-specifier-resolution=node",
|
||||
"loader=ts-node/esm"
|
||||
]
|
||||
}
|
||||
Vendored
+2
-2
@@ -13,7 +13,7 @@
|
||||
"/nya":true,
|
||||
"/pya":true,
|
||||
"/twe":true,
|
||||
|
||||
|
||||
},
|
||||
"search.exclude": {
|
||||
"e_lib/*":true,
|
||||
@@ -28,5 +28,5 @@
|
||||
"cSpell.words": [
|
||||
"josa",
|
||||
"sammo"
|
||||
]
|
||||
],
|
||||
}
|
||||
@@ -26,20 +26,20 @@ Docker를 이용한 설치도 제공하고 있습니다.
|
||||
|
||||
## Docker를 이용한 설치
|
||||
|
||||
https://storage.hided.net/gitea/devsam/docker 를 참고해 주세요.
|
||||
https://storage.hided.net/gogs/devsam/docker 를 참고해 주세요.
|
||||
|
||||
## 수동 설치
|
||||
|
||||
본 게임은 <code>git</code>을 이용한 업그레이드 시스템을 구현하였으므로, <code>git</code>이 필요합니다.
|
||||
또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>)에게 디렉토리 권한이 주어져야합니다.
|
||||
또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>, <code>apache</code>)에게 디렉토리 권한이 주어져야합니다.
|
||||
|
||||
### 다운로드
|
||||
|
||||
웹 데몬 user가 <code>www-data</code>인 경우 다음과 같이 입력하여 최신 배포버전과 이미지 파일을 얻을 수 있습니다.
|
||||
|
||||
```
|
||||
sudo -u www-data git clone https://storage.hided.net/gitea/devsam/core.git
|
||||
sudo -u www-data git clone https://storage.hided.net/gitea/devsam/image.git
|
||||
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/core.git
|
||||
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/image.git
|
||||
```
|
||||
|
||||
> 이미지는 hook/git_hook.php을 통해 동기화되며, 서버 설치 과정에 이미지 갱신 키를 지정하는 것으로 '훼' 서버 업데이트 시 동기화됩니다. 이미지 서버가 게임 서버와 별개여도 동작하나, php와 git을 지원해야합니다.
|
||||
|
||||
@@ -9,4 +9,4 @@ if (!class_exists('\\sammo\\RootDB')) {
|
||||
Json::dieWithReason('No DB');
|
||||
}
|
||||
|
||||
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
|
||||
APIHelper::launch(dirname(__FILE__));
|
||||
+4
-5
@@ -35,22 +35,21 @@
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"sammo\\": [
|
||||
"d_setting",
|
||||
"src/sammo"
|
||||
],
|
||||
"kakao\\": [
|
||||
"d_setting",
|
||||
"src/kakao"
|
||||
]
|
||||
},
|
||||
"classmap": [
|
||||
"d_setting/"
|
||||
],
|
||||
"exclude-from-classmap": [
|
||||
"**/*.orig.php"
|
||||
],
|
||||
"files":[
|
||||
"f_config/config.php"
|
||||
]
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.5"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Generated
+2
-1799
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "2b7ec5f1a1a908310f3d032f294eacec",
|
||||
"content-hash": "1983b89436fd8017db508592ddf542e4",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brandonwamboldt/utilphp",
|
||||
@@ -4228,1804 +4228,7 @@
|
||||
"time": "2019-08-07T17:19:21+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "doctrine/instantiator",
|
||||
"version": "1.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/instantiator.git",
|
||||
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
|
||||
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^8.0",
|
||||
"ext-pdo": "*",
|
||||
"ext-phar": "*",
|
||||
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
|
||||
"phpstan/phpstan": "^0.12",
|
||||
"phpstan/phpstan-phpunit": "^0.12",
|
||||
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marco Pivetta",
|
||||
"email": "ocramius@gmail.com",
|
||||
"homepage": "https://ocramius.github.io/"
|
||||
}
|
||||
],
|
||||
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
|
||||
"homepage": "https://www.doctrine-project.org/projects/instantiator.html",
|
||||
"keywords": [
|
||||
"constructor",
|
||||
"instantiate"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/doctrine/instantiator/issues",
|
||||
"source": "https://github.com/doctrine/instantiator/tree/1.4.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://www.doctrine-project.org/sponsorship.html",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://www.patreon.com/phpdoctrine",
|
||||
"type": "patreon"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-10T18:47:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "myclabs/deep-copy",
|
||||
"version": "1.10.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/myclabs/DeepCopy.git",
|
||||
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
|
||||
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"replace": {
|
||||
"myclabs/deep-copy": "self.version"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/collections": "^1.0",
|
||||
"doctrine/common": "^2.6",
|
||||
"phpunit/phpunit": "^7.1"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/DeepCopy/deep_copy.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"DeepCopy\\": "src/DeepCopy/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"description": "Create deep copies (clones) of your objects",
|
||||
"keywords": [
|
||||
"clone",
|
||||
"copy",
|
||||
"duplicate",
|
||||
"object",
|
||||
"object graph"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/myclabs/DeepCopy/issues",
|
||||
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-13T09:40:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v4.13.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
|
||||
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-tokenizer": "*",
|
||||
"php": ">=7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ircmaxell/php-yacc": "^0.0.7",
|
||||
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
|
||||
},
|
||||
"bin": [
|
||||
"bin/php-parse"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.9-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PhpParser\\": "lib/PhpParser"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nikita Popov"
|
||||
}
|
||||
],
|
||||
"description": "A PHP parser written in PHP",
|
||||
"keywords": [
|
||||
"parser",
|
||||
"php"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
|
||||
},
|
||||
"time": "2021-11-30T19:35:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phar-io/manifest",
|
||||
"version": "2.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phar-io/manifest.git",
|
||||
"reference": "97803eca37d319dfa7826cc2437fc020857acb53"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
|
||||
"reference": "97803eca37d319dfa7826cc2437fc020857acb53",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-phar": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"phar-io/version": "^3.0.1",
|
||||
"php": "^7.2 || ^8.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arne Blankerts",
|
||||
"email": "arne@blankerts.de",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Heuer",
|
||||
"email": "sebastian@phpeople.de",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
|
||||
"support": {
|
||||
"issues": "https://github.com/phar-io/manifest/issues",
|
||||
"source": "https://github.com/phar-io/manifest/tree/2.0.3"
|
||||
},
|
||||
"time": "2021-07-20T11:28:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phar-io/version",
|
||||
"version": "3.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phar-io/version.git",
|
||||
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
|
||||
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2 || ^8.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arne Blankerts",
|
||||
"email": "arne@blankerts.de",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Heuer",
|
||||
"email": "sebastian@phpeople.de",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Library for handling version information and constraints",
|
||||
"support": {
|
||||
"issues": "https://github.com/phar-io/version/issues",
|
||||
"source": "https://github.com/phar-io/version/tree/3.2.1"
|
||||
},
|
||||
"time": "2022-02-21T01:04:05+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpspec/prophecy",
|
||||
"version": "v1.15.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpspec/prophecy.git",
|
||||
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
|
||||
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/instantiator": "^1.2",
|
||||
"php": "^7.2 || ~8.0, <8.2",
|
||||
"phpdocumentor/reflection-docblock": "^5.2",
|
||||
"sebastian/comparator": "^3.0 || ^4.0",
|
||||
"sebastian/recursion-context": "^3.0 || ^4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpspec/phpspec": "^6.0 || ^7.0",
|
||||
"phpunit/phpunit": "^8.0 || ^9.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Prophecy\\": "src/Prophecy"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Konstantin Kudryashov",
|
||||
"email": "ever.zet@gmail.com",
|
||||
"homepage": "http://everzet.com"
|
||||
},
|
||||
{
|
||||
"name": "Marcello Duarte",
|
||||
"email": "marcello.duarte@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
||||
"homepage": "https://github.com/phpspec/prophecy",
|
||||
"keywords": [
|
||||
"Double",
|
||||
"Dummy",
|
||||
"fake",
|
||||
"mock",
|
||||
"spy",
|
||||
"stub"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/phpspec/prophecy/issues",
|
||||
"source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
|
||||
},
|
||||
"time": "2021-12-08T12:19:24+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
"version": "9.2.14",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f4d60b6afe5546421462b76cd4e633ebc364ab4",
|
||||
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"nikic/php-parser": "^4.13.0",
|
||||
"php": ">=7.3",
|
||||
"phpunit/php-file-iterator": "^3.0.3",
|
||||
"phpunit/php-text-template": "^2.0.2",
|
||||
"sebastian/code-unit-reverse-lookup": "^2.0.2",
|
||||
"sebastian/complexity": "^2.0",
|
||||
"sebastian/environment": "^5.1.2",
|
||||
"sebastian/lines-of-code": "^1.0.3",
|
||||
"sebastian/version": "^3.0.1",
|
||||
"theseer/tokenizer": "^1.2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-pcov": "*",
|
||||
"ext-xdebug": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "9.2-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
|
||||
"keywords": [
|
||||
"coverage",
|
||||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.14"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-02-28T12:38:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-file-iterator",
|
||||
"version": "3.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
|
||||
"reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
|
||||
"reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
|
||||
"keywords": [
|
||||
"filesystem",
|
||||
"iterator"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-12-02T12:48:52+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-invoker",
|
||||
"version": "3.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-invoker.git",
|
||||
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
|
||||
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-pcntl": "*",
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-pcntl": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.1-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Invoke callables with a timeout",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-invoker/",
|
||||
"keywords": [
|
||||
"process"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T05:58:55+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-text-template",
|
||||
"version": "2.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-text-template.git",
|
||||
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
|
||||
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Simple template engine.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
|
||||
"keywords": [
|
||||
"template"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T05:33:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-timer",
|
||||
"version": "5.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-timer.git",
|
||||
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
|
||||
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "5.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Utility class for timing",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-timer/",
|
||||
"keywords": [
|
||||
"timer"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T13:16:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "9.5.16",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
|
||||
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/instantiator": "^1.3.1",
|
||||
"ext-dom": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-xml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"myclabs/deep-copy": "^1.10.1",
|
||||
"phar-io/manifest": "^2.0.3",
|
||||
"phar-io/version": "^3.0.2",
|
||||
"php": ">=7.3",
|
||||
"phpspec/prophecy": "^1.12.1",
|
||||
"phpunit/php-code-coverage": "^9.2.13",
|
||||
"phpunit/php-file-iterator": "^3.0.5",
|
||||
"phpunit/php-invoker": "^3.1.1",
|
||||
"phpunit/php-text-template": "^2.0.3",
|
||||
"phpunit/php-timer": "^5.0.2",
|
||||
"sebastian/cli-parser": "^1.0.1",
|
||||
"sebastian/code-unit": "^1.0.6",
|
||||
"sebastian/comparator": "^4.0.5",
|
||||
"sebastian/diff": "^4.0.3",
|
||||
"sebastian/environment": "^5.1.3",
|
||||
"sebastian/exporter": "^4.0.3",
|
||||
"sebastian/global-state": "^5.0.1",
|
||||
"sebastian/object-enumerator": "^4.0.3",
|
||||
"sebastian/resource-operations": "^3.0.3",
|
||||
"sebastian/type": "^2.3.4",
|
||||
"sebastian/version": "^3.0.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-pdo": "*",
|
||||
"phpspec/prophecy-phpunit": "^2.0.1"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-soap": "*",
|
||||
"ext-xdebug": "*"
|
||||
},
|
||||
"bin": [
|
||||
"phpunit"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "9.5-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/Framework/Assert/Functions.php"
|
||||
],
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "The PHP Unit Testing framework.",
|
||||
"homepage": "https://phpunit.de/",
|
||||
"keywords": [
|
||||
"phpunit",
|
||||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://phpunit.de/sponsors.html",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-02-23T17:10:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/cli-parser",
|
||||
"version": "1.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/cli-parser.git",
|
||||
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
|
||||
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library for parsing CLI options",
|
||||
"homepage": "https://github.com/sebastianbergmann/cli-parser",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
|
||||
"source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T06:08:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/code-unit",
|
||||
"version": "1.0.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/code-unit.git",
|
||||
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
|
||||
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Collection of value objects that represent the PHP code units",
|
||||
"homepage": "https://github.com/sebastianbergmann/code-unit",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
|
||||
"source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T13:08:54+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/code-unit-reverse-lookup",
|
||||
"version": "2.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
|
||||
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
|
||||
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Looks up which function or method a line of code belongs to",
|
||||
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
|
||||
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T05:30:19+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/comparator",
|
||||
"version": "4.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
|
||||
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3",
|
||||
"sebastian/diff": "^4.0",
|
||||
"sebastian/exporter": "^4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
},
|
||||
{
|
||||
"name": "Jeff Welch",
|
||||
"email": "whatthejeff@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Volker Dusch",
|
||||
"email": "github@wallbash.com"
|
||||
},
|
||||
{
|
||||
"name": "Bernhard Schussek",
|
||||
"email": "bschussek@2bepublished.at"
|
||||
}
|
||||
],
|
||||
"description": "Provides the functionality to compare PHP values for equality",
|
||||
"homepage": "https://github.com/sebastianbergmann/comparator",
|
||||
"keywords": [
|
||||
"comparator",
|
||||
"compare",
|
||||
"equality"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/comparator/issues",
|
||||
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T15:49:45+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/complexity",
|
||||
"version": "2.0.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/complexity.git",
|
||||
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
|
||||
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"nikic/php-parser": "^4.7",
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library for calculating the complexity of PHP code units",
|
||||
"homepage": "https://github.com/sebastianbergmann/complexity",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/complexity/issues",
|
||||
"source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T15:52:27+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/diff",
|
||||
"version": "4.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/diff.git",
|
||||
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
|
||||
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3",
|
||||
"symfony/process": "^4.2 || ^5"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
},
|
||||
{
|
||||
"name": "Kore Nordmann",
|
||||
"email": "mail@kore-nordmann.de"
|
||||
}
|
||||
],
|
||||
"description": "Diff implementation",
|
||||
"homepage": "https://github.com/sebastianbergmann/diff",
|
||||
"keywords": [
|
||||
"diff",
|
||||
"udiff",
|
||||
"unidiff",
|
||||
"unified diff"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/diff/issues",
|
||||
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T13:10:38+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/environment",
|
||||
"version": "5.1.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/environment.git",
|
||||
"reference": "388b6ced16caa751030f6a69e588299fa09200ac"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
|
||||
"reference": "388b6ced16caa751030f6a69e588299fa09200ac",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-posix": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "5.1-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Provides functionality to handle HHVM/PHP environments",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/environment",
|
||||
"keywords": [
|
||||
"Xdebug",
|
||||
"environment",
|
||||
"hhvm"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/environment/issues",
|
||||
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T05:52:38+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/exporter",
|
||||
"version": "4.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/exporter.git",
|
||||
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
|
||||
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3",
|
||||
"sebastian/recursion-context": "^4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-mbstring": "*",
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
},
|
||||
{
|
||||
"name": "Jeff Welch",
|
||||
"email": "whatthejeff@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Volker Dusch",
|
||||
"email": "github@wallbash.com"
|
||||
},
|
||||
{
|
||||
"name": "Adam Harvey",
|
||||
"email": "aharvey@php.net"
|
||||
},
|
||||
{
|
||||
"name": "Bernhard Schussek",
|
||||
"email": "bschussek@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Provides the functionality to export PHP variables for visualization",
|
||||
"homepage": "https://www.github.com/sebastianbergmann/exporter",
|
||||
"keywords": [
|
||||
"export",
|
||||
"exporter"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/exporter/issues",
|
||||
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-11-11T14:18:36+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/global-state",
|
||||
"version": "5.0.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/global-state.git",
|
||||
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
|
||||
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3",
|
||||
"sebastian/object-reflector": "^2.0",
|
||||
"sebastian/recursion-context": "^4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-dom": "*",
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-uopz": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "5.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Snapshotting of global state",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/global-state",
|
||||
"keywords": [
|
||||
"global state"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/global-state/issues",
|
||||
"source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-02-14T08:28:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/lines-of-code",
|
||||
"version": "1.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
|
||||
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
|
||||
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"nikic/php-parser": "^4.6",
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library for counting the lines of code in PHP source code",
|
||||
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
|
||||
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-28T06:42:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/object-enumerator",
|
||||
"version": "4.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
|
||||
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
|
||||
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3",
|
||||
"sebastian/object-reflector": "^2.0",
|
||||
"sebastian/recursion-context": "^4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
|
||||
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
|
||||
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T13:12:34+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/object-reflector",
|
||||
"version": "2.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/object-reflector.git",
|
||||
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
|
||||
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Allows reflection of object attributes, including inherited and non-public ones",
|
||||
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
|
||||
"source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T13:14:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/recursion-context",
|
||||
"version": "4.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
||||
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
|
||||
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
},
|
||||
{
|
||||
"name": "Jeff Welch",
|
||||
"email": "whatthejeff@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Adam Harvey",
|
||||
"email": "aharvey@php.net"
|
||||
}
|
||||
],
|
||||
"description": "Provides functionality to recursively process PHP variables",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
|
||||
"source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-26T13:17:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/resource-operations",
|
||||
"version": "3.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/resource-operations.git",
|
||||
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
|
||||
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Provides a list of PHP built-in functions that operate on resources",
|
||||
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/resource-operations/issues",
|
||||
"source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T06:45:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/type",
|
||||
"version": "2.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/type.git",
|
||||
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
|
||||
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.3-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Collection of value objects that represent the types of the PHP type system",
|
||||
"homepage": "https://github.com/sebastianbergmann/type",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/type/issues",
|
||||
"source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-06-15T12:49:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/version",
|
||||
"version": "3.0.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/version.git",
|
||||
"reference": "c6c1022351a901512170118436c764e473f6de8c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
|
||||
"reference": "c6c1022351a901512170118436c764e473f6de8c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
||||
"homepage": "https://github.com/sebastianbergmann/version",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/version/issues",
|
||||
"source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sebastianbergmann",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T06:39:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "theseer/tokenizer",
|
||||
"version": "1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/theseer/tokenizer.git",
|
||||
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
|
||||
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-tokenizer": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"php": "^7.2 || ^8.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arne Blankerts",
|
||||
"email": "arne@blankerts.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
||||
"support": {
|
||||
"issues": "https://github.com/theseer/tokenizer/issues",
|
||||
"source": "https://github.com/theseer/tokenizer/tree/1.2.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/theseer",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-07-28T10:34:58+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
|
||||
Regular → Executable
BIN
Binary file not shown.
@@ -2,11 +2,6 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
if(!file_exists(__DIR__ . '/../vendor/autoload.php')){
|
||||
http_response_code(503);
|
||||
die('not_ready');
|
||||
}
|
||||
|
||||
require(__DIR__ . '/../vendor/autoload.php');
|
||||
|
||||
if (!class_exists('\\sammo\\RootDB')) {
|
||||
|
||||
+1
-1
@@ -118,7 +118,7 @@ $nations = $history['nations'];
|
||||
var lastMonth = <?= $e_month ?>;
|
||||
var selectYear = <?= $year ?>;
|
||||
var selectMonth = <?= $month ?>;
|
||||
var nations = <?= $nations ? JSON::encode($history['nations']) : '{}' ?>;
|
||||
var nations = <?= $nations ? $history['nations'] : '{}' ?>;
|
||||
</script>
|
||||
</head>
|
||||
|
||||
|
||||
+1
-1
@@ -5,4 +5,4 @@ namespace sammo;
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
|
||||
APIHelper::launch(dirname(__FILE__));
|
||||
+2
-5
@@ -47,7 +47,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
|
||||
], 'owner=%i', $userID);
|
||||
}
|
||||
|
||||
$plock = boolval($db->queryFirstField('SELECT plock FROM plock LIMIT 1'));
|
||||
$plock = $db->queryFirstField('SELECT plock FROM plock LIMIT 1');
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
@@ -123,7 +123,6 @@ if (!$otherTextInfo) {
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||
<?= WebUtil::printCSS('css/map.css') ?>
|
||||
<?= WebUtil::printStaticValues([
|
||||
'serverNameWithCount' => "$serverName $serverCnt",
|
||||
'serverNick' => DB::prefix(),
|
||||
'serverID' => UniqueConst::$serverID,
|
||||
'maxTurn' => GameConst::$maxTurn,
|
||||
@@ -131,8 +130,6 @@ if (!$otherTextInfo) {
|
||||
'commandList' => getCommandTable($generalObj),
|
||||
'serverNow' => TimeUtil::now(false),
|
||||
'baseColor2' => GameConst::$basecolor2,
|
||||
'lastExecuted' => $gameStor->turntime,
|
||||
'isLocked' => $plock,
|
||||
]) ?>
|
||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
|
||||
</head>
|
||||
@@ -180,7 +177,7 @@ if (!$otherTextInfo) {
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
|
||||
<div style="display:inline-block;"><?= !$plock ? ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
|
||||
</div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||
<?php if ($auctionCount > 0) : ?>
|
||||
|
||||
@@ -241,7 +241,7 @@ function do추방(General $general, int $myOfficerLevel):?string{
|
||||
}
|
||||
$general->setVar('troop', 0);
|
||||
|
||||
if($general->getNPCType() >= 2 && Util::randBool(GameConst::$npcBanMessageProb)) {
|
||||
if($general->getNPCType() >= 2 && ($env['scenario'] < 100 || Util::randBool(0.01))) {
|
||||
|
||||
$str = Util::choiceRandom([
|
||||
'날 버리다니... 곧 전장에서 복수해주겠다...',
|
||||
|
||||
@@ -44,13 +44,9 @@ class che_보물_도기 extends \sammo\BaseItem
|
||||
['쌀', 'rice']
|
||||
]);
|
||||
|
||||
$nationId = $general->getVar('nation');
|
||||
|
||||
if ($nationId != 0) {
|
||||
$db->update('nation', [
|
||||
$db->update('nation', [
|
||||
$resKey => $db->sqleval('%b + %i', $resKey, $score)
|
||||
], 'nation=%i', $nationId);
|
||||
}
|
||||
]);
|
||||
|
||||
$score = Util::round($score);
|
||||
$scoreText = number_format($score, 0);
|
||||
|
||||
@@ -168,7 +168,7 @@ class che_몰수 extends Command\NationCommand
|
||||
);
|
||||
$amountText = number_format($amount, 0);
|
||||
|
||||
if ($destGeneral->getNPCType() >= 2 && Util::randBool(GameConst::$npcSeizureMessageProb)) {
|
||||
if ($destGeneral->getNPCType() >= 2 && Util::randBool(0.01)) {
|
||||
$npcTexts = [
|
||||
'몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...',
|
||||
'사유재산까지 몰수해가면서 이 나라가 잘 될거라 믿습니까? 정말 이해할 수가 없군요...',
|
||||
|
||||
@@ -102,7 +102,7 @@ class che_물자원조 extends Command\NationCommand
|
||||
$limit = $this->nation['level'] * GameConst::$coefAidAmount;
|
||||
|
||||
if ($goldAmount > $limit || $riceAmount > $limit) {
|
||||
$this->fullConditionConstraints = [ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')];
|
||||
$this->fullConditionConstraints[ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')];
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ class che_천도 extends Command\NationCommand
|
||||
[$reqGold, $reqRice] = $this->getCost();
|
||||
|
||||
if ($this->getDistance() === null) {
|
||||
$this->fullConditionConstraints = [ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')];
|
||||
$this->fullConditionConstraints[ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')];
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -394,8 +394,4 @@ class GameConstBase
|
||||
'임', '정', '제', '조', '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해',
|
||||
'혁', '현', '화', '환', '회', '횡', '후', '훈', '휴', '흠', '흥'
|
||||
];
|
||||
|
||||
public static $npcBanMessageProb = 0.01;
|
||||
public static $npcSeizureMessageProb = 0.01;
|
||||
public static $npcMessageFreqByDay = 4;
|
||||
}
|
||||
|
||||
@@ -311,16 +311,16 @@ class GameUnitConstBase{
|
||||
|
||||
[
|
||||
1500, self::T_SIEGE, '정란',
|
||||
100, 100, 6, 0, 0, 14, 5,
|
||||
100, 100, 6, 0, 0, 15, 5,
|
||||
0, null, null, 3,
|
||||
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
|
||||
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
|
||||
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
|
||||
['높은 구조물 위에서 공격합니다.'],
|
||||
['che_성벽부상무효'], null
|
||||
],
|
||||
[
|
||||
1501, self::T_SIEGE, '충차',
|
||||
150, 100, 6, 0, 0, 18, 5,
|
||||
150, 100, 6, 0, 0, 20, 5,
|
||||
1000, null, null, 3,
|
||||
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
|
||||
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
|
||||
@@ -329,16 +329,16 @@ class GameUnitConstBase{
|
||||
],
|
||||
[
|
||||
1502, self::T_SIEGE, '벽력거',
|
||||
200, 100, 6, 10, 0, 18, 5,
|
||||
200, 100, 6, 10, 0, 25, 5,
|
||||
3000, ['업'], null, 0,
|
||||
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
|
||||
[self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833, 1106=>0.909],
|
||||
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8],
|
||||
[self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833],
|
||||
['상대에게 돌덩이를 날립니다.'],
|
||||
['che_성벽부상무효'], null
|
||||
],
|
||||
[
|
||||
1503, self::T_SIEGE, '목우',
|
||||
50, 200, 5, 0, 0, 18, 5,
|
||||
50, 200, 5, 0, 0, 30, 5,
|
||||
3000, ['성도'], null, 0,
|
||||
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8],
|
||||
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
|
||||
|
||||
@@ -2004,7 +2004,6 @@ class GeneralAI
|
||||
|
||||
//수도와 연결된 도시 탐색
|
||||
while (!$queue->isEmpty()) {
|
||||
/** @var int */
|
||||
$cityID = $queue->dequeue();
|
||||
|
||||
foreach (array_keys(CityConst::byID($cityID)->path) as $nextCityID) {
|
||||
@@ -3644,9 +3643,9 @@ class GeneralAI
|
||||
$npcType = $general->getNPCType();
|
||||
$nationID = $general->getNationID();
|
||||
|
||||
//특별 메세지 있는 경우 출력
|
||||
//특별 메세지 있는 경우 출력 하루 4번
|
||||
$term = $this->env['turnterm'];
|
||||
if ($general->getVar('npcmsg') && Util::randBool(GameConst::$npcMessageFreqByDay * $term / (60 * 24))) {
|
||||
if ($general->getVar('npcmsg') && Util::randBool($term / (6 * 60))) {
|
||||
$src = new MessageTarget(
|
||||
$general->getID(),
|
||||
$general->getVar('name'),
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
"history":[
|
||||
],
|
||||
"const": {
|
||||
"joinRuinedNPCProp":0,
|
||||
"npcBanMessageProb":1
|
||||
"joinRuinedNPCProp":0
|
||||
},
|
||||
"events":[
|
||||
[
|
||||
|
||||
@@ -7,8 +7,7 @@
|
||||
"history":[
|
||||
],
|
||||
"const": {
|
||||
"joinRuinedNPCProp":0,
|
||||
"npcBanMessageProb":1
|
||||
"joinRuinedNPCProp":0
|
||||
},
|
||||
"events":[
|
||||
[
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
"expandCityDevelIncreaseAmount": 1350,
|
||||
"expandCityWallIncreaseAmount": 1600,
|
||||
"defaultMaxGeneral":300,
|
||||
"joinRuinedNPCProp":0,
|
||||
"npcBanMessageProb":1
|
||||
"joinRuinedNPCProp":0
|
||||
},
|
||||
"events":[
|
||||
[
|
||||
|
||||
@@ -1,677 +0,0 @@
|
||||
{
|
||||
"title": "【가상모드24】 유저무쌍 멀티 유니버스!",
|
||||
"startYear": 180,
|
||||
"history": [
|
||||
"<C>●</>180년 1월:<L><b>【가상모드24】</b>유저무쌍 멀티 유니버스!</>",
|
||||
"<C>●</>180년 1월:<L><b>【이벤트】</b></>졸장과 명장, 충신과 간신, 무장과 지장, 모든 것이 뒤바뀐 세계"
|
||||
],
|
||||
"stat": {
|
||||
"total": 310,
|
||||
"min": 40,
|
||||
"max": 140
|
||||
},
|
||||
"iconPath": ".",
|
||||
"fiction": 1,
|
||||
"nation":[
|
||||
|
||||
],
|
||||
"const": {
|
||||
"npcBanMessageProb":0,
|
||||
"npcSeizureMessageProb":0,
|
||||
"npcMessageFreqByDay":8
|
||||
},
|
||||
"diplomacy":[],
|
||||
"general":[
|
||||
[0, "아회남", null, 0, null, 75, 46, 84, 0, 160, 300, null, null],
|
||||
[0, "이적", null, 0, null, 90, 86, 42, 0, 160, 300, null, null],
|
||||
[0, "윤상", null, 0, null, 89, 86, 48, 0, 160, 300, null, null],
|
||||
[0, "윤묵", null, 0, null, 84, 85, 54, 0, 160, 300, null, null],
|
||||
[0, "우금", null, 0, null, 55, 48, 78, 0, 160, 300, null, null],
|
||||
[0, "위관", null, 0, null, 71, 84, 41, 0, 160, 300, null, null],
|
||||
[0, "원윤", null, 0, null, 88, 86, 41, 0, 160, 300, null, null],
|
||||
[0, "원희", null, 0, null, 74, 87, 47, 0, 160, 300, null, null],
|
||||
[0, "염행", null, 0, null, 62, 40, 82, 0, 160, 300, null, null],
|
||||
[0, "염유", null, 0, null, 79, 80, 49, 0, 160, 300, null, null],
|
||||
[0, "원술", null, 0, null, 80, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "원상", null, 0, null, 87, 45, 88, 0, 160, 300, null, null],
|
||||
[0, "원소", null, 0, null, 50, 58, 39, 0, 160, 300, null, null],
|
||||
[0, "염상", null, 0, null, 80, 83, 39, 0, 160, 300, null, null],
|
||||
[0, "원담", null, 0, null, 80, 42, 88, 0, 160, 300, null, null],
|
||||
[0, "염포", null, 0, null, 80, 85, 38, 0, 160, 300, null, null],
|
||||
[0, "왕위", null, 0, null, 80, 60, 82, 0, 160, 300, null, null],
|
||||
[0, "왕윤", null, 0, null, 87, 88, 52, 0, 160, 300, null, null],
|
||||
[0, "왕항", null, 0, null, 64, 87, 56, 0, 160, 300, null, null],
|
||||
[0, "왕찬", null, 0, null, 85, 87, 41, 0, 160, 300, null, null],
|
||||
[0, "왕수", null, 0, null, 86, 83, 43, 0, 160, 300, null, null],
|
||||
[0, "왕숙", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
|
||||
[0, "왕준", null, 0, null, 55, 76, 46, 0, 160, 300, null, null],
|
||||
[0, "왕쌍", null, 0, null, 73, 42, 81, 0, 160, 300, null, null],
|
||||
[0, "왕창", null, 0, null, 76, 83, 51, 0, 160, 300, null, null],
|
||||
[0, "왕평", null, 0, null, 52, 39, 69, 0, 160, 300, null, null],
|
||||
[0, "왕보", null, 0, null, 78, 89, 41, 0, 160, 300, null, null],
|
||||
[0, "왕문", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
|
||||
[0, "왕릉", null, 0, null, 66, 80, 49, 0, 160, 300, null, null],
|
||||
[0, "왕루", null, 0, null, 90, 77, 41, 0, 160, 300, null, null],
|
||||
[0, "왕랑", null, 0, null, 87, 75, 49, 0, 160, 300, null, null],
|
||||
[0, "온회", null, 0, null, 78, 74, 56, 0, 160, 300, null, null],
|
||||
[0, "하안", null, 0, null, 85, 70, 58, 0, 160, 300, null, null],
|
||||
[0, "괴월", null, 0, null, 79, 72, 45, 0, 160, 300, null, null],
|
||||
[0, "괴량", null, 0, null, 72, 77, 42, 0, 160, 300, null, null],
|
||||
[0, "가화", null, 0, null, 81, 55, 89, 0, 160, 300, null, null],
|
||||
[0, "가규", null, 0, null, 62, 79, 46, 0, 160, 300, null, null],
|
||||
[0, "하의", null, 0, null, 84, 51, 84, 0, 160, 300, null, null],
|
||||
[0, "화흠", null, 0, null, 89, 87, 42, 0, 160, 300, null, null],
|
||||
[0, "가후", null, 0, null, 82, 96, 31, 0, 160, 300, null, null],
|
||||
[0, "곽가", null, 0, null, 90, 95, 43, 0, 160, 300, null, null],
|
||||
[0, "악환", null, 0, null, 75, 40, 88, 0, 160, 300, null, null],
|
||||
[0, "곽사", null, 0, null, 76, 54, 87, 0, 160, 300, null, null],
|
||||
[0, "악취", null, 0, null, 87, 44, 79, 0, 160, 300, null, null],
|
||||
[0, "곽준", null, 0, null, 67, 88, 57, 0, 160, 300, null, null],
|
||||
[0, "학소", null, 0, null, 52, 57, 7, 0, 160, 300, null, null],
|
||||
[0, "악진", null, 0, null, 60, 35, 74, 0, 160, 300, null, null],
|
||||
[0, "곽도", null, 0, null, 78, 90, 38, 0, 160, 300, null, null],
|
||||
[0, "학맹", null, 0, null, 78, 43, 87, 0, 160, 300, null, null],
|
||||
[0, "곽유지", null, 0, null, 82, 81, 41, 0, 160, 300, null, null],
|
||||
[0, "곽익", null, 0, null, 67, 71, 11, 0, 160, 300, null, null],
|
||||
[0, "곽회", null, 0, null, 50, 74, 45, 0, 160, 300, null, null],
|
||||
[0, "하후위", null, 0, null, 69, 47, 81, 0, 160, 300, null, null],
|
||||
[0, "하후연", null, 0, null, 45, 28, 58, 0, 160, 300, null, null],
|
||||
[0, "하후은", null, 0, null, 87, 52, 87, 0, 160, 300, null, null],
|
||||
[0, "하후화", null, 0, null, 90, 86, 51, 0, 160, 300, null, null],
|
||||
[0, "하후혜", null, 0, null, 90, 88, 48, 0, 160, 300, null, null],
|
||||
[0, "하후현", null, 0, null, 86, 90, 44, 0, 160, 300, null, null],
|
||||
[0, "하후상", null, 0, null, 61, 65, 35, 0, 160, 300, null, null],
|
||||
[0, "하후덕", null, 0, null, 71, 57, 90, 0, 160, 300, null, null],
|
||||
[0, "하후돈", null, 0, null, 49, 18, 32, 0, 160, 300, null, null, "부모님께 받은 신체 쫀맛탱!"],
|
||||
[0, "하후패", null, 0, null, 61, 35, 77, 0, 160, 300, null, null],
|
||||
[0, "하후무", null, 0, null, 98, 100, 73, 0, 160, 300, null, null, "나와 싸워 이길 자 누구인가!"],
|
||||
[0, "가충", null, 0, null, 86, 89, 41, 0, 160, 300, null, null],
|
||||
[0, "하진", null, 0, null, 89, 90, 45, 0, 160, 300, null, null, "돼지 잡던 내가 대장군?"],
|
||||
[0, "화웅", null, 0, null, 62, 30, 75, 0, 160, 300, null, null],
|
||||
[0, "한윤", null, 0, null, 84, 81, 35, 0, 160, 300, null, null],
|
||||
[0, "관우", null, 0, null, 44, 21, 44, 0, 160, 300, null, null, "차가 식기 전에 목을 베이고 오겠소!"],
|
||||
[0, "환계", null, 0, null, 85, 84, 52, 0, 160, 300, null, null],
|
||||
[0, "관해", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
|
||||
[0, "관구검", null, 0, null, 56, 44, 78, 0, 160, 300, null, null],
|
||||
[0, "한현", null, 0, null, 96, 51, 97, 0, 160, 300, null, null],
|
||||
[0, "한호", null, 0, null, 67, 80, 46, 0, 160, 300, null, null],
|
||||
[0, "관흥", null, 0, null, 64, 46, 78, 0, 160, 300, null, null],
|
||||
[0, "관색", null, 0, null, 66, 47, 84, 0, 160, 300, null, null],
|
||||
[0, "한수", null, 0, null, 62, 82, 51, 0, 160, 300, null, null],
|
||||
[0, "한숭", null, 0, null, 85, 85, 59, 0, 160, 300, null, null],
|
||||
[0, "관정", null, 0, null, 84, 88, 57, 0, 160, 300, null, null],
|
||||
[0, "한섬", null, 0, null, 71, 44, 94, 0, 160, 300, null, null],
|
||||
[0, "감택", null, 0, null, 84, 70, 37, 0, 160, 300, null, null],
|
||||
[0, "한충", null, 0, null, 76, 53, 82, 0, 160, 300, null, null],
|
||||
[0, "한당", null, 0, null, 64, 45, 79, 0, 160, 300, null, null],
|
||||
[0, "한덕", null, 0, null, 77, 54, 85, 0, 160, 300, null, null],
|
||||
[0, "감녕", null, 0, null, 48, 45, 56, 0, 160, 300, null, null],
|
||||
[0, "한복", null, 0, null, 82, 87, 83, 0, 160, 300, null, null],
|
||||
[0, "관평", null, 0, null, 62, 38, 80, 0, 160, 300, null, null],
|
||||
[0, "간옹", null, 0, null, 93, 91, 45, 0, 160, 300, null, null, "삼대장 간손미에서 간을 맡고 있습니다"],
|
||||
[0, "안량", null, 0, null, 52, 44, 57, 0, 160, 300, null, null],
|
||||
[0, "위연", null, 0, null, 49, 30, 60, 0, 160, 300, null, null],
|
||||
[0, "국의", null, 0, null, 56, 52, 79, 0, 160, 300, null, null],
|
||||
[0, "희지재", null, 0, null, 77, 85, 49, 0, 160, 300, null, null],
|
||||
[0, "위속", null, 0, null, 73, 52, 89, 0, 160, 300, null, null],
|
||||
[0, "위유", null, 0, null, 89, 89, 56, 0, 160, 300, null, null],
|
||||
[0, "우금2", null, 0, null, 68, 51, 82, 0, 160, 300, null, null],
|
||||
[0, "우보", null, 0, null, 82, 60, 89, 0, 160, 300, null, null],
|
||||
[0, "강유", null, 0, null, 48, 58, 27, 0, 160, 300, null, null, "제갈량 너무 멍청하네 진짜"],
|
||||
[0, "공지", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
|
||||
[0, "교유", null, 0, null, 76, 51, 82, 0, 160, 300, null, null],
|
||||
[0, "공도", null, 0, null, 81, 50, 87, 0, 160, 300, null, null],
|
||||
[0, "허공", null, 0, null, 86, 44, 76, 0, 160, 300, null, null],
|
||||
[0, "허정", null, 0, null, 87, 79, 42, 0, 160, 300, null, null],
|
||||
[0, "허저", null, 0, null, 86, 23, 96, 0, 160, 300, null, null, "조조군의 지혜주머니 호치님이시다"],
|
||||
[0, "허유", null, 0, null, 74, 89, 40, 0, 160, 300, null, null],
|
||||
[0, "기령", null, 0, null, 55, 46, 69, 0, 160, 300, null, null],
|
||||
[0, "김의", null, 0, null, 88, 82, 45, 0, 160, 300, null, null],
|
||||
[0, "김배삼결", null, 0, null, 76, 44, 81, 0, 160, 300, null, null],
|
||||
[0, "김선", null, 0, null, 88, 52, 91, 0, 160, 300, null, null],
|
||||
[0, "우번", null, 0, null, 84, 87, 33, 0, 160, 300, null, null],
|
||||
[0, "형도영", null, 0, null, 71, 41, 79, 0, 160, 300, null, null],
|
||||
[0, "엄안", null, 0, null, 58, 37, 68, 0, 160, 300, null, null],
|
||||
[0, "엄망", null, 0, null, 72, 49, 90, 0, 160, 300, null, null],
|
||||
[0, "엄준", null, 0, null, 86, 78, 39, 0, 160, 300, null, null],
|
||||
[0, "엄정", null, 0, null, 90, 85, 31, 0, 160, 300, null, null],
|
||||
[0, "엄백호", null, 0, null, 96, 69, 99, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕이다!"],
|
||||
[0, "엄여", null, 0, null, 90, 52, 96, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕 동생이다!"],
|
||||
[0, "오의", null, 0, null, 61, 47, 87, 0, 160, 300, null, null],
|
||||
[0, "황개", null, 0, null, 60, 43, 76, 0, 160, 300, null, null, "주유 이 미친 놈아!"],
|
||||
[0, "고간", null, 0, null, 66, 64, 82, 0, 160, 300, null, null],
|
||||
[0, "황권", null, 0, null, 65, 66, 32, 0, 160, 300, null, null],
|
||||
[0, "고유", null, 0, null, 83, 87, 49, 0, 160, 300, null, null],
|
||||
[0, "고순", null, 0, null, 53, 31, 60, 0, 160, 300, null, null, "함진영 그거 망한 지 오래됐음"],
|
||||
[0, "고상", null, 0, null, 72, 52, 87, 0, 160, 300, null, null],
|
||||
[0, "고승", null, 0, null, 73, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "후성", null, 0, null, 66, 55, 56, 0, 160, 300, null, null],
|
||||
[0, "후선", null, 0, null, 77, 44, 86, 0, 160, 300, null, null],
|
||||
[0, "황조", null, 0, null, 59, 51, 82, 0, 160, 300, null, null],
|
||||
[0, "공손월", null, 0, null, 66, 48, 93, 0, 160, 300, null, null],
|
||||
[0, "공손연", null, 0, null, 75, 40, 91, 0, 160, 300, null, null],
|
||||
[0, "공손공", null, 0, null, 89, 83, 41, 0, 160, 300, null, null],
|
||||
[0, "공손강", null, 0, null, 68, 44, 84, 0, 160, 300, null, null],
|
||||
[0, "공손찬", null, 0, null, 54, 38, 68, 0, 160, 300, null, null, "백마 어떻게 타요?"],
|
||||
[0, "공손속", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
|
||||
[0, "공손도", null, 0, null, 73, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "공손범", null, 0, null, 67, 41, 89, 0, 160, 300, null, null],
|
||||
[0, "황충", null, 0, null, 52, 34, 65, 0, 160, 300, null, null],
|
||||
[0, "고정", null, 0, null, 85, 57, 87, 0, 160, 300, null, null],
|
||||
[0, "고패", null, 0, null, 74, 70, 31, 0, 160, 300, null, null],
|
||||
[0, "황보숭", null, 0, null, 49, 29, 28, 0, 160, 300, null, null],
|
||||
[0, "공융", null, 0, null, 91, 86, 37, 0, 160, 300, null, null],
|
||||
[0, "고람", null, 0, null, 64, 38, 60, 0, 160, 300, null, null],
|
||||
[0, "오경", null, 0, null, 71, 43, 75, 0, 160, 300, null, null],
|
||||
[0, "호거아", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
|
||||
[0, "호진", null, 0, null, 75, 46, 88, 0, 160, 300, null, null],
|
||||
[0, "올돌골", null, 0, null, 96, 54, 99, 0, 160, 300, null, null, "남만이 낳은 천재 올돌골님이시다"],
|
||||
[0, "호반", null, 0, null, 85, 41, 81, 0, 160, 300, null, null],
|
||||
[0, "오반", null, 0, null, 66, 49, 90, 0, 160, 300, null, null],
|
||||
[0, "고옹", null, 0, null, 88, 82, 49, 0, 160, 300, null, null],
|
||||
[0, "오란", null, 0, null, 72, 50, 85, 0, 160, 300, null, null],
|
||||
[0, "채화", null, 0, null, 91, 41, 87, 0, 160, 300, null, null],
|
||||
[0, "채중", null, 0, null, 90, 46, 88, 0, 160, 300, null, null],
|
||||
[0, "채모", null, 0, null, 70, 45, 63, 0, 160, 300, null, null],
|
||||
[0, "착융", null, 0, null, 83, 51, 86, 0, 160, 300, null, null],
|
||||
[0, "사마의", null, 0, null, 41, 47, 42, 0, 160, 300, null, null, "조조 걔 별 거 아님"],
|
||||
[0, "사마염", null, 0, null, 71, 81, 43, 0, 160, 300, null, null],
|
||||
[0, "사마사", null, 0, null, 56, 76, 41, 0, 160, 300, null, null, "위나라 조진 썰 푼다"],
|
||||
[0, "사마소", null, 0, null, 55, 83, 42, 0, 160, 300, null, null],
|
||||
[0, "사마부", null, 0, null, 70, 83, 43, 0, 160, 300, null, null],
|
||||
[0, "사마랑", null, 0, null, 80, 39, 68, 0, 160, 300, null, null],
|
||||
[0, "사마가", null, 0, null, 74, 26, 85, 0, 160, 300, null, null],
|
||||
[0, "주흔", null, 0, null, 75, 89, 47, 0, 160, 300, null, null],
|
||||
[0, "주앙", null, 0, null, 66, 55, 82, 0, 160, 300, null, null],
|
||||
[0, "주지", null, 0, null, 67, 45, 89, 0, 160, 300, null, null],
|
||||
[0, "주창", null, 0, null, 72, 43, 68, 0, 160, 300, null, null],
|
||||
[0, "주태", null, 0, null, 56, 30, 52, 0, 160, 300, null, null],
|
||||
[0, "주방", null, 0, null, 88, 66, 40, 0, 160, 300, null, null],
|
||||
[0, "주유", null, 0, null, 43, 22, 43, 0, 160, 300, null, null, "동남풍이 부는구나. 황개 몸에 불을 질러라."],
|
||||
[0, "주환", null, 0, null, 53, 36, 55, 0, 160, 300, null, null],
|
||||
[0, "주거", null, 0, null, 63, 83, 58, 0, 160, 300, null, null],
|
||||
[0, "축융", null, 0, null, 98, 65, 95, 0, 160, 300, null, null],
|
||||
[0, "주준", null, 0, null, 51, 83, 54, 0, 160, 300, null, null],
|
||||
[0, "주연", null, 0, null, 54, 55, 83, 0, 160, 300, null, null],
|
||||
[0, "주치", null, 0, null, 69, 56, 68, 0, 160, 300, null, null],
|
||||
[0, "주포", null, 0, null, 72, 57, 86, 0, 160, 300, null, null],
|
||||
[0, "주령", null, 0, null, 62, 47, 87, 0, 160, 300, null, null],
|
||||
[0, "순욱", null, 0, null, 62, 72, 33, 0, 160, 300, null, null],
|
||||
[0, "순우경", null, 0, null, 62, 74, 41, 0, 160, 300, null, null],
|
||||
[0, "순심", null, 0, null, 85, 86, 22, 0, 160, 300, null, null],
|
||||
[0, "순유", null, 0, null, 60, 75, 35, 0, 160, 300, null, null],
|
||||
[0, "장완", null, 0, null, 62, 76, 31, 0, 160, 300, null, null],
|
||||
[0, "종회", null, 0, null, 52, 78, 47, 0, 160, 300, null, null],
|
||||
[0, "장간", null, 0, null, 81, 84, 64, 0, 160, 300, null, null],
|
||||
[0, "장의거", null, 0, null, 69, 91, 71, 0, 160, 300, null, null],
|
||||
[0, "장흠", null, 0, null, 62, 45, 86, 0, 160, 300, null, null],
|
||||
[0, "장제3", null, 0, null, 78, 90, 45, 0, 160, 300, null, null],
|
||||
[0, "초주", null, 0, null, 84, 87, 23, 0, 160, 300, null, null],
|
||||
[0, "초촉", null, 0, null, 75, 64, 31, 0, 160, 300, null, null],
|
||||
[0, "향총", null, 0, null, 64, 84, 53, 0, 160, 300, null, null],
|
||||
[0, "종요", null, 0, null, 61, 86, 40, 0, 160, 300, null, null],
|
||||
[0, "향랑", null, 0, null, 82, 82, 46, 0, 160, 300, null, null],
|
||||
[0, "서영", null, 0, null, 48, 50, 78, 0, 160, 300, null, null],
|
||||
[0, "제갈각", null, 0, null, 68, 83, 40, 0, 160, 300, null, null],
|
||||
[0, "제갈근", null, 0, null, 65, 26, 35, 0, 160, 300, null, null],
|
||||
[0, "제갈균", null, 0, null, 81, 55, 88, 0, 160, 300, null, null],
|
||||
[0, "제갈탄", null, 0, null, 68, 86, 44, 0, 160, 300, null, null],
|
||||
[0, "제갈량", null, 0, null, 42, 14, 22, 0, 160, 300, null, null, "헤헤헤…제갈량 바보 아니다. 엄마가 바보 아니라 그랬다."],
|
||||
[0, "서황", null, 0, null, 45, 26, 46, 0, 160, 300, null, null],
|
||||
[0, "서서", null, 0, null, 46, 26, 21, 0, 160, 300, null, null, "제갈량 어디 가서 나랑 동문이라고 하지마라"],
|
||||
[0, "서성", null, 0, null, 54, 59, 59, 0, 160, 300, null, null],
|
||||
[0, "서막", null, 0, null, 85, 80, 32, 0, 160, 300, null, null],
|
||||
[0, "신의", null, 0, null, 85, 50, 81, 0, 160, 300, null, null],
|
||||
[0, "신탐", null, 0, null, 84, 58, 86, 0, 160, 300, null, null],
|
||||
[0, "심배", null, 0, null, 60, 60, 56, 0, 160, 300, null, null],
|
||||
[0, "신비", null, 0, null, 88, 76, 51, 0, 160, 300, null, null, "뭘 봐? 인체 신비해지고 싶냐"],
|
||||
[0, "신평", null, 0, null, 71, 45, 63, 0, 160, 300, null, null],
|
||||
[0, "진복", null, 0, null, 89, 83, 47, 0, 160, 300, null, null],
|
||||
[0, "진랑", null, 0, null, 82, 60, 85, 0, 160, 300, null, null],
|
||||
[0, "휴고", null, 0, null, 77, 59, 82, 0, 160, 300, null, null],
|
||||
[0, "추단", null, 0, null, 79, 46, 76, 0, 160, 300, null, null],
|
||||
[0, "성의", null, 0, null, 66, 58, 87, 0, 160, 300, null, null],
|
||||
[0, "성공영", null, 0, null, 67, 38, 60, 0, 160, 300, null, null],
|
||||
[0, "설종", null, 0, null, 76, 74, 57, 0, 160, 300, null, null],
|
||||
[0, "단경", null, 0, null, 69, 52, 87, 0, 160, 300, null, null],
|
||||
[0, "전종", null, 0, null, 72, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "조예", null, 0, null, 88, 88, 48, 0, 160, 300, null, null],
|
||||
[0, "조휴", null, 0, null, 56, 52, 72, 0, 160, 300, null, null],
|
||||
[0, "송헌", null, 0, null, 72, 53, 84, 0, 160, 300, null, null],
|
||||
[0, "조앙", null, 0, null, 62, 40, 71, 0, 160, 300, null, null],
|
||||
[0, "조홍", null, 0, null, 60, 55, 85, 0, 160, 300, null, null],
|
||||
[0, "조순", null, 0, null, 55, 37, 77, 0, 160, 300, null, null],
|
||||
[0, "조창", null, 0, null, 54, 39, 81, 0, 160, 300, null, null],
|
||||
[0, "조식", null, 0, null, 85, 93, 14, 0, 160, 300, null, null],
|
||||
[0, "조진", null, 0, null, 52, 56, 44, 0, 160, 300, null, null],
|
||||
[0, "조인", null, 0, null, 46, 40, 60, 0, 160, 300, null, null],
|
||||
[0, "조성", null, 0, null, 86, 66, 37, 0, 160, 300, null, null],
|
||||
[0, "조조", null, 0, null, 40, 17, 13, 0, 160, 300, null, null, "미망인이 뭐예요?"],
|
||||
[0, "조충", null, 0, null, 87, 82, 36, 0, 160, 300, null, null],
|
||||
[0, "장패", null, 0, null, 62, 44, 87, 0, 160, 300, null, null],
|
||||
[0, "조비", null, 0, null, 65, 36, 53, 0, 160, 300, null, null],
|
||||
[0, "조표", null, 0, null, 86, 51, 83, 0, 160, 300, null, null],
|
||||
[0, "저수", null, 0, null, 54, 31, 45, 0, 160, 300, null, null],
|
||||
[0, "소비", null, 0, null, 71, 85, 44, 0, 160, 300, null, null],
|
||||
[0, "조무", null, 0, null, 70, 49, 71, 0, 160, 300, null, null],
|
||||
[0, "손환", null, 0, null, 58, 64, 34, 0, 160, 300, null, null],
|
||||
[0, "손견", null, 0, null, 46, 45, 22, 0, 160, 300, null, null, "강동의 고양이 손견이 간다"],
|
||||
[0, "손건", null, 0, null, 96, 93, 51, 0, 160, 300, null, null, "삼대장 간손미에서 손을 맡고 있습니다"],
|
||||
[0, "손권", null, 0, null, 54, 49, 29, 0, 160, 300, null, null],
|
||||
[0, "손교", null, 0, null, 63, 58, 88, 0, 160, 300, null, null],
|
||||
[0, "손책", null, 0, null, 47, 26, 36, 0, 160, 300, null, null],
|
||||
[0, "손소", null, 0, null, 58, 61, 32, 0, 160, 300, null, null],
|
||||
[0, "손정", null, 0, null, 74, 77, 37, 0, 160, 300, null, null],
|
||||
[0, "손중", null, 0, null, 78, 49, 80, 0, 160, 300, null, null],
|
||||
[0, "손등", null, 0, null, 78, 33, 61, 0, 160, 300, null, null],
|
||||
[0, "손유", null, 0, null, 63, 50, 39, 0, 160, 300, null, null],
|
||||
[0, "손익", null, 0, null, 73, 57, 37, 0, 160, 300, null, null],
|
||||
[0, "손례", null, 0, null, 62, 39, 81, 0, 160, 300, null, null],
|
||||
[0, "태사자", null, 0, null, 46, 22, 47, 0, 160, 300, null, null],
|
||||
[0, "대래동주", null, 0, null, 89, 57, 87, 0, 160, 300, null, null],
|
||||
[0, "대릉", null, 0, null, 70, 55, 81, 0, 160, 300, null, null],
|
||||
[0, "타사대왕", null, 0, null, 78, 27, 70, 0, 160, 300, null, null],
|
||||
[0, "담웅", null, 0, null, 82, 57, 96, 0, 160, 300, null, null],
|
||||
[0, "장윤", null, 0, null, 68, 56, 94, 0, 160, 300, null, null],
|
||||
[0, "조운", null, 0, null, 42, 22, 13, 0, 160, 300, null, null, "아두야 나 좀 살려줘"],
|
||||
[0, "장위", null, 0, null, 66, 54, 95, 0, 160, 300, null, null],
|
||||
[0, "장영", null, 0, null, 65, 56, 69, 0, 160, 300, null, null],
|
||||
[0, "장연", null, 0, null, 64, 49, 83, 0, 160, 300, null, null],
|
||||
[0, "장횡", null, 0, null, 81, 30, 70, 0, 160, 300, null, null],
|
||||
[0, "장온", null, 0, null, 88, 79, 48, 0, 160, 300, null, null],
|
||||
[0, "장개", null, 0, null, 96, 54, 82, 0, 160, 300, null, null],
|
||||
[0, "장각", null, 0, null, 53, 30, 50, 0, 160, 300, null, null],
|
||||
[0, "장기", null, 0, null, 66, 72, 54, 0, 160, 300, null, null],
|
||||
[0, "장의", null, 0, null, 61, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "장훈", null, 0, null, 68, 62, 93, 0, 160, 300, null, null],
|
||||
[0, "장굉", null, 0, null, 86, 88, 24, 0, 160, 300, null, null],
|
||||
[0, "장합", null, 0, null, 48, 22, 41, 0, 160, 300, null, null],
|
||||
[0, "조홍2", null, 0, null, 74, 68, 22, 0, 160, 300, null, null],
|
||||
[0, "장제2", null, 0, null, 70, 74, 34, 0, 160, 300, null, null],
|
||||
[0, "장수", null, 0, null, 60, 57, 89, 0, 160, 300, null, null],
|
||||
[0, "장소", null, 0, null, 59, 87, 43, 0, 160, 300, null, null],
|
||||
[0, "장송", null, 0, null, 80, 64, 45, 0, 160, 300, null, null],
|
||||
[0, "장임", null, 0, null, 55, 46, 76, 0, 160, 300, null, null],
|
||||
[0, "장제", null, 0, null, 73, 37, 60, 0, 160, 300, null, null],
|
||||
[0, "장막", null, 0, null, 88, 87, 59, 0, 160, 300, null, null],
|
||||
[0, "조범", null, 0, null, 92, 90, 58, 0, 160, 300, null, null],
|
||||
[0, "장비", null, 0, null, 43, 2, 36, 0, 160, 300, null, null, "덤비지 마….제발"],
|
||||
[0, "장포", null, 0, null, 62, 46, 82, 0, 160, 300, null, null],
|
||||
[0, "장보", null, 0, null, 57, 80, 49, 0, 160, 300, null, null],
|
||||
[0, "장만성", null, 0, null, 65, 49, 85, 0, 160, 300, null, null],
|
||||
[0, "장양", null, 0, null, 68, 50, 80, 0, 160, 300, null, null],
|
||||
[0, "장익", null, 0, null, 65, 85, 44, 0, 160, 300, null, null],
|
||||
[0, "장료", null, 0, null, 44, 26, 46, 0, 160, 300, null, null],
|
||||
[0, "장량", null, 0, null, 62, 50, 81, 0, 160, 300, null, null],
|
||||
[0, "조루", null, 0, null, 70, 91, 62, 0, 160, 300, null, null],
|
||||
[0, "장로", null, 0, null, 75, 98, 49, 0, 160, 300, null, null],
|
||||
[0, "진횡", null, 0, null, 76, 57, 84, 0, 160, 300, null, null],
|
||||
[0, "진응", null, 0, null, 78, 58, 91, 0, 160, 300, null, null],
|
||||
[0, "진기", null, 0, null, 82, 65, 92, 0, 160, 300, null, null],
|
||||
[0, "진궁", null, 0, null, 56, 85, 40, 0, 160, 300, null, null],
|
||||
[0, "진교", null, 0, null, 79, 83, 53, 0, 160, 300, null, null],
|
||||
[0, "진군", null, 0, null, 88, 13, 65, 0, 160, 300, null, null],
|
||||
[0, "진규", null, 0, null, 80, 76, 38, 0, 160, 300, null, null],
|
||||
[0, "진식", null, 0, null, 70, 59, 85, 0, 160, 300, null, null],
|
||||
[0, "진진", null, 0, null, 92, 90, 51, 0, 160, 300, null, null],
|
||||
[0, "진태", null, 0, null, 54, 72, 41, 0, 160, 300, null, null],
|
||||
[0, "진등", null, 0, null, 61, 81, 49, 0, 160, 300, null, null],
|
||||
[0, "진도", null, 0, null, 58, 52, 82, 0, 160, 300, null, null],
|
||||
[0, "진무", null, 0, null, 64, 43, 97, 0, 160, 300, null, null],
|
||||
[0, "진란", null, 0, null, 74, 51, 80, 0, 160, 300, null, null],
|
||||
[0, "진림", null, 0, null, 95, 11, 65, 0, 160, 300, null, null],
|
||||
[0, "정욱", null, 0, null, 64, 91, 36, 0, 160, 300, null, null],
|
||||
[0, "정원지", null, 0, null, 71, 56, 83, 0, 160, 300, null, null],
|
||||
[0, "정은", null, 0, null, 71, 57, 80, 0, 160, 300, null, null],
|
||||
[0, "정원", null, 0, null, 70, 54, 85, 0, 160, 300, null, null],
|
||||
[0, "정보", null, 0, null, 56, 11, 46, 0, 160, 300, null, null],
|
||||
[0, "정봉", null, 0, null, 59, 38, 71, 0, 160, 300, null, null],
|
||||
[0, "전위", null, 0, null, 41, 22, 48, 0, 160, 300, null, null, "적이 열 보 안으로 들어오거든 나부터 튄다"],
|
||||
[0, "전해", null, 0, null, 72, 55, 85, 0, 160, 300, null, null],
|
||||
[0, "전주", null, 0, null, 74, 89, 57, 0, 160, 300, null, null],
|
||||
[0, "전풍", null, 0, null, 58, 67, 24, 0, 160, 300, null, null, "아 원소 저거 진짜 사람 아니네"],
|
||||
[0, "전예", null, 0, null, 47, 55, 24, 0, 160, 300, null, null],
|
||||
[0, "동윤", null, 0, null, 90, 82, 51, 0, 160, 300, null, null],
|
||||
[0, "동화", null, 0, null, 83, 86, 45, 0, 160, 300, null, null],
|
||||
[0, "등애", null, 0, null, 48, 47, 26, 0, 160, 300, null, null, "이 산이 아닌개벼…"],
|
||||
[0, "도겸", null, 0, null, 89, 83, 56, 0, 160, 300, null, null],
|
||||
[0, "등현", null, 0, null, 79, 67, 35, 0, 160, 300, null, null],
|
||||
[0, "등지", null, 0, null, 67, 68, 49, 0, 160, 300, null, null],
|
||||
[0, "동습", null, 0, null, 68, 45, 80, 0, 160, 300, null, null],
|
||||
[0, "동승", null, 0, null, 84, 87, 55, 0, 160, 300, null, null],
|
||||
[0, "동소", null, 0, null, 86, 85, 40, 0, 160, 300, null, null],
|
||||
[0, "동탁", null, 0, null, 49, 43, 73, 0, 160, 300, null, null],
|
||||
[0, "동도나", null, 0, null, 72, 57, 89, 0, 160, 300, null, null],
|
||||
[0, "동민", null, 0, null, 89, 51, 87, 0, 160, 300, null, null],
|
||||
[0, "등무", null, 0, null, 79, 55, 91, 0, 160, 300, null, null],
|
||||
[0, "두기", null, 0, null, 66, 17, 62, 0, 160, 300, null, null],
|
||||
[0, "두예", null, 0, null, 44, 71, 35, 0, 160, 300, null, null],
|
||||
[0, "배원소", null, 0, null, 90, 45, 85, 0, 160, 300, null, null],
|
||||
[0, "마완", null, 0, null, 69, 56, 84, 0, 160, 300, null, null],
|
||||
[0, "마휴", null, 0, null, 72, 57, 90, 0, 160, 300, null, null],
|
||||
[0, "파재", null, 0, null, 66, 56, 85, 0, 160, 300, null, null],
|
||||
[0, "마준", null, 0, null, 82, 88, 39, 0, 160, 300, null, null],
|
||||
[0, "마속", null, 0, null, 69, 51, 26, 0, 160, 300, null, null],
|
||||
[0, "마대", null, 0, null, 61, 45, 78, 0, 160, 300, null, null],
|
||||
[0, "마충", null, 0, null, 62, 48, 88, 0, 160, 300, null, null],
|
||||
[0, "마초", null, 0, null, 54, 33, 46, 0, 160, 300, null, null, "서량의 븅마초 나가신다"],
|
||||
[0, "마철", null, 0, null, 70, 48, 77, 0, 160, 300, null, null],
|
||||
[0, "마등", null, 0, null, 55, 30, 58, 0, 160, 300, null, null],
|
||||
[0, "마량", null, 0, null, 87, 17, 55, 0, 160, 300, null, null],
|
||||
[0, "반준", null, 0, null, 79, 91, 48, 0, 160, 300, null, null],
|
||||
[0, "반장", null, 0, null, 64, 50, 81, 0, 160, 300, null, null],
|
||||
[0, "번조", null, 0, null, 74, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "번능", null, 0, null, 71, 19, 84, 0, 160, 300, null, null],
|
||||
[0, "반봉", null, 0, null, 84, 53, 86, 0, 160, 300, null, null],
|
||||
[0, "비의", null, 0, null, 58, 84, 42, 0, 160, 300, null, null],
|
||||
[0, "비연", null, 0, null, 80, 62, 89, 0, 160, 300, null, null],
|
||||
[0, "비시", null, 0, null, 82, 42, 75, 0, 160, 300, null, null],
|
||||
[0, "미축", null, 0, null, 90, 91, 52, 0, 160, 300, null, null, "돈도 많고 싸움도 잘하는 간손미 에이스 미축입니다"],
|
||||
[0, "미방", null, 0, null, 86, 50, 88, 0, 160, 300, null, null],
|
||||
[0, "비요", null, 0, null, 70, 88, 57, 0, 160, 300, null, null],
|
||||
[0, "무안국", null, 0, null, 70, 51, 86, 0, 160, 300, null, null],
|
||||
[0, "풍습", null, 0, null, 68, 59, 90, 0, 160, 300, null, null],
|
||||
[0, "부사인", null, 0, null, 94, 47, 83, 0, 160, 300, null, null],
|
||||
[0, "부첨", null, 0, null, 67, 45, 78, 0, 160, 300, null, null],
|
||||
[0, "부손", null, 0, null, 87, 90, 40, 0, 160, 300, null, null],
|
||||
[0, "문앙", null, 0, null, 64, 34, 75, 0, 160, 300, null, null],
|
||||
[0, "문흠", null, 0, null, 66, 61, 26, 0, 160, 300, null, null],
|
||||
[0, "문추", null, 0, null, 53, 26, 51, 0, 160, 300, null, null],
|
||||
[0, "문빙", null, 0, null, 52, 35, 55, 0, 160, 300, null, null],
|
||||
[0, "변희", null, 0, null, 84, 50, 78, 0, 160, 300, null, null],
|
||||
[0, "망아장", null, 0, null, 90, 51, 87, 0, 160, 300, null, null],
|
||||
[0, "봉기", null, 0, null, 84, 90, 46, 0, 160, 300, null, null],
|
||||
[0, "방희", null, 0, null, 80, 82, 41, 0, 160, 300, null, null],
|
||||
[0, "법정", null, 0, null, 58, 46, 11, 0, 160, 300, null, null],
|
||||
[0, "방통", null, 0, null, 51, 43, 22, 0, 160, 300, null, null],
|
||||
[0, "방덕", null, 0, null, 51, 26, 40, 0, 160, 300, null, null],
|
||||
[0, "포륭", null, 0, null, 82, 54, 91, 0, 160, 300, null, null],
|
||||
[0, "목순", null, 0, null, 88, 33, 88, 0, 160, 300, null, null],
|
||||
[0, "목록대왕", null, 0, null, 93, 59, 99, 0, 160, 300, null, null, "코끼리만 있으면 너도 한 방 나도 한 방"],
|
||||
[0, "보즐", null, 0, null, 57, 19, 59, 0, 160, 300, null, null],
|
||||
[0, "만총", null, 0, null, 52, 16, 53, 0, 160, 300, null, null],
|
||||
[0, "모개", null, 0, null, 77, 81, 20, 0, 160, 300, null, null],
|
||||
[0, "맹획", null, 0, null, 59, 12, 88, 0, 160, 300, null, null],
|
||||
[0, "맹체", null, 0, null, 65, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "맹우", null, 0, null, 90, 9, 90, 0, 160, 300, null, null],
|
||||
[0, "유섭", null, 0, null, 78, 51, 96, 0, 160, 300, null, null],
|
||||
[0, "양부", null, 0, null, 78, 86, 52, 0, 160, 300, null, null],
|
||||
[0, "옹개", null, 0, null, 67, 55, 83, 0, 160, 300, null, null],
|
||||
[0, "양의", null, 0, null, 72, 20, 58, 0, 160, 300, null, null],
|
||||
[0, "양호", null, 0, null, 46, 51, 28, 0, 160, 300, null, null],
|
||||
[0, "양홍", null, 0, null, 92, 87, 13, 0, 160, 300, null, null],
|
||||
[0, "양앙", null, 0, null, 72, 58, 92, 0, 160, 300, null, null],
|
||||
[0, "양추", null, 0, null, 88, 55, 90, 0, 160, 300, null, null],
|
||||
[0, "양수", null, 0, null, 92, 91, 1, 0, 160, 300, null, null],
|
||||
[0, "양추2", null, 0, null, 73, 56, 96, 0, 160, 300, null, null],
|
||||
[0, "양송", null, 0, null, 100, 65, 98, 0, 160, 300, null, null, "군신 악의만이 나와 비견될만 하다"],
|
||||
[0, "양임", null, 0, null, 70, 42, 84, 0, 160, 300, null, null],
|
||||
[0, "양조", null, 0, null, 87, 79, 34, 0, 160, 300, null, null],
|
||||
[0, "양백", null, 0, null, 90, 81, 31, 0, 160, 300, null, null],
|
||||
[0, "양부2", null, 0, null, 73, 90, 47, 0, 160, 300, null, null],
|
||||
[0, "양봉", null, 0, null, 74, 75, 39, 0, 160, 300, null, null],
|
||||
[0, "양봉2", null, 0, null, 86, 28, 87, 0, 160, 300, null, null],
|
||||
[0, "뇌동", null, 0, null, 71, 52, 89, 0, 160, 300, null, null],
|
||||
[0, "뇌박", null, 0, null, 78, 60, 84, 0, 160, 300, null, null],
|
||||
[0, "이이", null, 0, null, 77, 22, 81, 0, 160, 300, null, null],
|
||||
[0, "이회", null, 0, null, 61, 82, 51, 0, 160, 300, null, null],
|
||||
[0, "이각", null, 0, null, 71, 58, 86, 0, 160, 300, null, null],
|
||||
[0, "육항", null, 0, null, 46, 61, 27, 0, 160, 300, null, null],
|
||||
[0, "육적", null, 0, null, 60, 61, 28, 0, 160, 300, null, null],
|
||||
[0, "육손", null, 0, null, 45, 69, 34, 0, 160, 300, null, null],
|
||||
[0, "이엄", null, 0, null, 57, 46, 77, 0, 160, 300, null, null],
|
||||
[0, "이유", null, 0, null, 69, 84, 37, 0, 160, 300, null, null],
|
||||
[0, "이숙", null, 0, null, 87, 41, 89, 0, 160, 300, null, null],
|
||||
[0, "이통", null, 0, null, 67, 49, 78, 0, 160, 300, null, null],
|
||||
[0, "이전", null, 0, null, 62, 40, 61, 0, 160, 300, null, null],
|
||||
[0, "이풍", null, 0, null, 71, 56, 90, 0, 160, 300, null, null],
|
||||
[0, "유언", null, 0, null, 79, 82, 50, 0, 160, 300, null, null],
|
||||
[0, "유괴", null, 0, null, 69, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "유기", null, 0, null, 88, 88, 37, 0, 160, 300, null, null],
|
||||
[0, "유우", null, 0, null, 78, 87, 55, 0, 160, 300, null, null],
|
||||
[0, "유훈", null, 0, null, 90, 37, 82, 0, 160, 300, null, null],
|
||||
[0, "유현", null, 0, null, 86, 44, 89, 0, 160, 300, null, null],
|
||||
[0, "유순", null, 0, null, 77, 34, 92, 0, 160, 300, null, null],
|
||||
[0, "유장", null, 0, null, 99, 90, 47, 0, 160, 300, null, null],
|
||||
[0, "유심", null, 0, null, 80, 82, 56, 0, 160, 300, null, null],
|
||||
[0, "유선", null, 0, null, 97, 65, 96, 0, 160, 300, null, null, "촉은 제갈량이 다 말아먹었다"],
|
||||
[0, "유종", null, 0, null, 86, 88, 35, 0, 160, 300, null, null],
|
||||
[0, "유도", null, 0, null, 85, 87, 34, 0, 160, 300, null, null],
|
||||
[0, "유파", null, 0, null, 81, 38, 85, 0, 160, 300, null, null],
|
||||
[0, "유반", null, 0, null, 71, 54, 93, 0, 160, 300, null, null],
|
||||
[0, "유비", null, 0, null, 52, 18, 23, 0, 160, 300, null, null, "돗자리 좀 사주세요"],
|
||||
[0, "유표", null, 0, null, 82, 81, 28, 0, 160, 300, null, null],
|
||||
[0, "유복", null, 0, null, 76, 81, 56, 0, 160, 300, null, null],
|
||||
[0, "유벽", null, 0, null, 70, 58, 93, 0, 160, 300, null, null],
|
||||
[0, "유봉", null, 0, null, 65, 51, 32, 0, 160, 300, null, null],
|
||||
[0, "유엽", null, 0, null, 84, 65, 38, 0, 160, 300, null, null],
|
||||
[0, "유요", null, 0, null, 78, 63, 24, 0, 160, 300, null, null],
|
||||
[0, "여위황", null, 0, null, 82, 57, 86, 0, 160, 300, null, null],
|
||||
[0, "요화", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
|
||||
[0, "양흥", null, 0, null, 79, 45, 81, 0, 160, 300, null, null],
|
||||
[0, "양습", null, 0, null, 67, 80, 56, 0, 160, 300, null, null],
|
||||
[0, "양서", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
|
||||
[0, "능조", null, 0, null, 65, 29, 38, 0, 160, 300, null, null],
|
||||
[0, "능통", null, 0, null, 57, 11, 40, 0, 160, 300, null, null],
|
||||
[0, "여개", null, 0, null, 87, 80, 53, 0, 160, 300, null, null],
|
||||
[0, "여건", null, 0, null, 83, 40, 78, 0, 160, 300, null, null],
|
||||
[0, "여광", null, 0, null, 84, 41, 87, 0, 160, 300, null, null],
|
||||
[0, "여상", null, 0, null, 86, 39, 88, 0, 160, 300, null, null],
|
||||
[0, "여대", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
|
||||
[0, "여범", null, 0, null, 67, 86, 55, 0, 160, 300, null, null],
|
||||
[0, "여포", null, 0, null, 51, 10, 100, 0, 160, 300, null, null, "이기기 위한 전략만 내어드리겠습니다."],
|
||||
[0, "여몽", null, 0, null, 49, 31, 10, 0, 160, 300, null, null],
|
||||
[0, "윤직", null, 0, null, 88, 88, 47, 0, 160, 300, null, null],
|
||||
[0, "냉포", null, 0, null, 69, 48, 79, 0, 160, 300, null, null],
|
||||
[0, "누규", null, 0, null, 88, 87, 43, 0, 160, 300, null, null],
|
||||
[0, "노숙", null, 0, null, 51, 64, 17, 0, 160, 300, null, null],
|
||||
[0, "노식", null, 0, null, 54, 77, 48, 0, 160, 300, null, null],
|
||||
[0, "범강", null, 0, null, 89, 89, 34, 0, 160, 300, null, null],
|
||||
[0, "장달", null, 0, null, 87, 84, 46, 0, 160, 300, null, null],
|
||||
[0, "규람", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
|
||||
[0, "대원", null, 0, null, 82, 88, 42, 0, 160, 300, null, null],
|
||||
[0, "왕기", null, 0, null, 59, 76, 44, 0, 160, 300, null, null],
|
||||
[0, "왕상", null, 0, null, 87, 89, 52, 0, 160, 300, null, null],
|
||||
[0, "왕돈", null, 0, null, 80, 54, 94, 0, 160, 300, null, null],
|
||||
[0, "악침", null, 0, null, 67, 55, 97, 0, 160, 300, null, null],
|
||||
[0, "하제", null, 0, null, 57, 79, 48, 0, 160, 300, null, null],
|
||||
[0, "환범", null, 0, null, 81, 89, 42, 0, 160, 300, null, null],
|
||||
[0, "견초", null, 0, null, 68, 51, 83, 0, 160, 300, null, null],
|
||||
[0, "고당륭", null, 0, null, 90, 90, 44, 0, 160, 300, null, null],
|
||||
[0, "오찬", null, 0, null, 72, 91, 42, 0, 160, 300, null, null],
|
||||
[0, "호질", null, 0, null, 67, 88, 56, 0, 160, 300, null, null],
|
||||
[0, "오질", null, 0, null, 90, 89, 22, 0, 160, 300, null, null],
|
||||
[0, "호준", null, 0, null, 61, 54, 85, 0, 160, 300, null, null],
|
||||
[0, "고담", null, 0, null, 87, 87, 33, 0, 160, 300, null, null],
|
||||
[0, "최림", null, 0, null, 84, 85, 14, 0, 160, 300, null, null],
|
||||
[0, "사마망", null, 0, null, 62, 82, 47, 0, 160, 300, null, null],
|
||||
[0, "주이", null, 0, null, 70, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "전단", null, 0, null, 73, 76, 71, 0, 160, 300, null, null],
|
||||
[0, "조우", null, 0, null, 89, 83, 23, 0, 160, 300, null, null],
|
||||
[0, "조상", null, 0, null, 81, 87, 40, 0, 160, 300, null, null],
|
||||
[0, "조방", null, 0, null, 90, 86, 43, 0, 160, 300, null, null],
|
||||
[0, "태사향", null, 0, null, 83, 52, 82, 0, 160, 300, null, null],
|
||||
[0, "장휴", null, 0, null, 77, 43, 66, 0, 160, 300, null, null],
|
||||
[0, "장호", null, 0, null, 65, 56, 89, 0, 160, 300, null, null],
|
||||
[0, "조광", null, 0, null, 73, 59, 87, 0, 160, 300, null, null],
|
||||
[0, "장집", null, 0, null, 64, 81, 50, 0, 160, 300, null, null],
|
||||
[0, "장승", null, 0, null, 63, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "장소2", null, 0, null, 87, 84, 19, 0, 160, 300, null, null],
|
||||
[0, "조통", null, 0, null, 72, 53, 81, 0, 160, 300, null, null],
|
||||
[0, "진표", null, 0, null, 74, 88, 56, 0, 160, 300, null, null],
|
||||
[0, "정무", null, 0, null, 84, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "정봉2", null, 0, null, 74, 22, 74, 0, 160, 300, null, null],
|
||||
[0, "전만", null, 0, null, 89, 11, 67, 0, 160, 300, null, null],
|
||||
[0, "마균", null, 0, null, 88, 83, 29, 0, 160, 300, null, null],
|
||||
[0, "방회", null, 0, null, 71, 55, 86, 0, 160, 300, null, null],
|
||||
[0, "낙통", null, 0, null, 64, 82, 55, 0, 160, 300, null, null],
|
||||
[0, "육개", null, 0, null, 75, 79, 51, 0, 160, 300, null, null],
|
||||
[0, "유찬", null, 0, null, 62, 59, 81, 0, 160, 300, null, null],
|
||||
[0, "유소", null, 0, null, 72, 87, 56, 0, 160, 300, null, null],
|
||||
[0, "요립", null, 0, null, 88, 85, 24, 0, 160, 300, null, null],
|
||||
[0, "여거", null, 0, null, 62, 89, 49, 0, 160, 300, null, null],
|
||||
[0, "제갈첨", null, 0, null, 70, 83, 54, 0, 160, 300, null, null],
|
||||
[0, "손휴", null, 0, null, 83, 90, 52, 0, 160, 300, null, null],
|
||||
[0, "극정", null, 0, null, 90, 77, 32, 0, 160, 300, null, null],
|
||||
[0, "호분", null, 0, null, 69, 54, 80, 0, 160, 300, null, null],
|
||||
[0, "손량", null, 0, null, 88, 84, 30, 0, 160, 300, null, null],
|
||||
[0, "마막", null, 0, null, 96, 98, 71, 0, 160, 300, null, null],
|
||||
[0, "손호", null, 0, null, 89, 43, 41, 0, 160, 300, null, null],
|
||||
[0, "조모", null, 0, null, 86, 39, 81, 0, 160, 300, null, null],
|
||||
[0, "조환", null, 0, null, 90, 42, 80, 0, 160, 300, null, null],
|
||||
[0, "사마유", null, 0, null, 69, 86, 55, 0, 160, 300, null, null],
|
||||
[0, "제갈상", null, 0, null, 76, 51, 78, 0, 160, 300, null, null],
|
||||
[0, "손화", null, 0, null, 87, 71, 22, 0, 160, 300, null, null],
|
||||
[0, "염우", null, 0, null, 88, 49, 89, 0, 160, 300, null, null],
|
||||
[0, "왕경", null, 0, null, 73, 81, 59, 0, 160, 300, null, null],
|
||||
[0, "왕혼", null, 0, null, 66, 59, 80, 0, 160, 300, null, null],
|
||||
[0, "곽혁", null, 0, null, 87, 81, 30, 0, 160, 300, null, null],
|
||||
[0, "가범", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
|
||||
[0, "서질", null, 0, null, 72, 47, 86, 0, 160, 300, null, null],
|
||||
[0, "손준", null, 0, null, 76, 40, 82, 0, 160, 300, null, null],
|
||||
[0, "손침", null, 0, null, 82, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "우사", null, 0, null, 79, 86, 56, 0, 160, 300, null, null],
|
||||
[0, "진건", null, 0, null, 68, 49, 88, 0, 160, 300, null, null],
|
||||
[0, "동궐", null, 0, null, 75, 81, 44, 0, 160, 300, null, null],
|
||||
[0, "당자", null, 0, null, 79, 49, 89, 0, 160, 300, null, null],
|
||||
[0, "등충", null, 0, null, 64, 40, 81, 0, 160, 300, null, null],
|
||||
[0, "황숭", null, 0, null, 73, 70, 38, 0, 160, 300, null, null],
|
||||
[0, "화핵", null, 0, null, 80, 76, 29, 0, 160, 300, null, null],
|
||||
[0, "허의", null, 0, null, 89, 46, 85, 0, 160, 300, null, null],
|
||||
[0, "송겸", null, 0, null, 74, 42, 87, 0, 160, 300, null, null],
|
||||
[0, "호제", null, 0, null, 83, 81, 52, 0, 160, 300, null, null],
|
||||
[0, "나헌", null, 0, null, 54, 78, 38, 0, 160, 300, null, null],
|
||||
[0, "노숙2", null, 0, null, 67, 87, 46, 0, 160, 300, null, null],
|
||||
[0, "구성", null, 0, null, 77, 40, 82, 0, 160, 300, null, null],
|
||||
[0, "어부라", null, 0, null, 78, 42, 86, 0, 160, 300, null, null],
|
||||
[0, "아하소과", null, 0, null, 89, 54, 90, 0, 160, 300, null, null],
|
||||
[0, "가비능", null, 0, null, 63, 41, 88, 0, 160, 300, null, null],
|
||||
[0, "구력거", null, 0, null, 60, 42, 80, 0, 160, 300, null, null],
|
||||
[0, "강단", null, 0, null, 75, 47, 82, 0, 160, 300, null, null],
|
||||
[0, "황란", null, 0, null, 77, 45, 76, 0, 160, 300, null, null],
|
||||
[0, "호주천", null, 0, null, 70, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "종리목", null, 0, null, 56, 79, 38, 0, 160, 300, null, null],
|
||||
[0, "제갈교", null, 0, null, 78, 83, 45, 0, 160, 300, null, null],
|
||||
[0, "답돈", null, 0, null, 56, 48, 79, 0, 160, 300, null, null],
|
||||
[0, "반임", null, 0, null, 74, 41, 82, 0, 160, 300, null, null],
|
||||
[0, "보도근", null, 0, null, 76, 57, 80, 0, 160, 300, null, null],
|
||||
[0, "미당대왕", null, 0, null, 81, 51, 89, 0, 160, 300, null, null],
|
||||
[0, "유표2", null, 0, null, 67, 56, 82, 0, 160, 300, null, null],
|
||||
[0, "루반", null, 0, null, 75, 44, 81, 0, 160, 300, null, null],
|
||||
[0, "손관", null, 0, null, 68, 42, 89, 0, 160, 300, null, null],
|
||||
[0, "곽석", null, 0, null, 81, 49, 86, 0, 160, 300, null, null],
|
||||
[0, "주조", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
|
||||
[0, "장거", null, 0, null, 61, 45, 84, 0, 160, 300, null, null],
|
||||
[0, "장순", null, 0, null, 67, 49, 80, 0, 160, 300, null, null],
|
||||
[0, "철리길", null, 0, null, 63, 50, 88, 0, 160, 300, null, null],
|
||||
[0, "주삭", null, 0, null, 90, 52, 90, 0, 160, 300, null, null],
|
||||
[0, "황월영", null, 0, null, 94, 97, 58, 0, 160, 300, null, null, "어쩌다 저런 걸 남편이라고…."],
|
||||
[0, "채염", null, 0, null, 98, 99, 49, 0, 160, 300, null, null],
|
||||
[0, "소교", null, 0, null, 97, 95, 52, 0, 160, 300, null, null, "주유 너무 무능하다."],
|
||||
[0, "신헌영", null, 0, null, 85, 95, 60, 0, 160, 300, null, null],
|
||||
[0, "손상향", null, 0, null, 98, 58, 92, 0, 160, 300, null, null],
|
||||
[0, "대교", null, 0, null, 98, 90, 52, 0, 160, 300, null, null, "손책 너무 무능하다."],
|
||||
[0, "초선", null, 0, null, 99, 98, 59, 0, 160, 300, null, null, "동탁 이리와봐 한대만 맞자"],
|
||||
[0, "교모", null, 0, null, 86, 90, 31, 0, 160, 300, null, null],
|
||||
[0, "관구수", null, 0, null, 82, 28, 91, 0, 160, 300, null, null],
|
||||
[0, "관구전", null, 0, null, 77, 88, 51, 0, 160, 300, null, null],
|
||||
[0, "원유", null, 0, null, 84, 80, 47, 0, 160, 300, null, null],
|
||||
[0, "왕광", null, 0, null, 75, 86, 49, 0, 160, 300, null, null],
|
||||
[0, "신창", null, 0, null, 85, 84, 48, 0, 160, 300, null, null],
|
||||
[0, "사마주", null, 0, null, 79, 86, 49, 0, 160, 300, null, null],
|
||||
[0, "양제", null, 0, null, 73, 82, 29, 0, 160, 300, null, null],
|
||||
[0, "성만", null, 0, null, 79, 42, 90, 0, 160, 300, null, null],
|
||||
[0, "오연", null, 0, null, 74, 47, 88, 0, 160, 300, null, null],
|
||||
[0, "맹충", null, 0, null, 90, 72, 38, 0, 160, 300, null, null],
|
||||
[0, "잠혼", null, 0, null, 100, 99, 58, 0, 160, 300, null, null, "이 몸이 만부부당이라 불리는 맹장 잠혼이다."],
|
||||
[0, "사정", null, 0, null, 76, 44, 86, 0, 160, 300, null, null],
|
||||
[0, "심영", null, 0, null, 70, 43, 85, 0, 160, 300, null, null],
|
||||
[0, "도준", null, 0, null, 75, 44, 83, 0, 160, 300, null, null],
|
||||
[0, "만욱", null, 0, null, 89, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "오언", null, 0, null, 64, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "위막", null, 0, null, 86, 58, 81, 0, 160, 300, null, null],
|
||||
[0, "시삭", null, 0, null, 88, 55, 83, 0, 160, 300, null, null],
|
||||
[0, "전속", null, 0, null, 90, 40, 85, 0, 160, 300, null, null],
|
||||
[0, "장화", null, 0, null, 84, 83, 32, 0, 160, 300, null, null],
|
||||
[0, "오거", null, 0, null, 90, 19, 91, 0, 160, 300, null, null],
|
||||
[0, "추정", null, 0, null, 70, 84, 24, 0, 160, 300, null, null],
|
||||
[0, "장특", null, 0, null, 67, 86, 45, 0, 160, 300, null, null],
|
||||
[0, "곽마", null, 0, null, 72, 49, 83, 0, 160, 300, null, null],
|
||||
[0, "석포", null, 0, null, 71, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "견홍", null, 0, null, 70, 56, 87, 0, 160, 300, null, null],
|
||||
[0, "한거자", null, 0, null, 89, 81, 29, 0, 160, 300, null, null],
|
||||
[0, "휴원진", null, 0, null, 88, 22, 85, 0, 160, 300, null, null],
|
||||
[0, "곽원", null, 0, null, 74, 84, 47, 0, 160, 300, null, null],
|
||||
[0, "계옹", null, 0, null, 77, 87, 28, 0, 160, 300, null, null],
|
||||
[0, "이부", null, 0, null, 89, 84, 46, 0, 160, 300, null, null],
|
||||
[0, "왕업", null, 0, null, 87, 84, 45, 0, 160, 300, null, null],
|
||||
[0, "좌혁", null, 0, null, 78, 44, 89, 0, 160, 300, null, null],
|
||||
[0, "화타", null, 0, null, 83, 96, 37, 0, 160, 300, null, null, "가시는 길 한 방에 편안하게"],
|
||||
[0, "사마휘", null, 0, null, 85, 84, 28, 0, 160, 300, null, null, "공명과 방통은 아무 짝에도 쓸모가 없습니다"],
|
||||
[0, "우길", null, 0, null, 87, 85, 30, 0, 160, 300, null, null],
|
||||
[0, "헌제", null, 0, null, 88, 92, 52, 0, 160, 300, null, null, "한 황실의 미래는 내 알바 아니다"],
|
||||
[0, "백기", null, 0, null, 40, 42, 61, 0, 160, 300, null, null],
|
||||
[0, "한신", null, 0, null, 40, 56, 35, 0, 160, 300, null, null],
|
||||
[0, "악비", null, 0, null, 41, 48, 20, 0, 160, 300, null, null],
|
||||
[0, "항적", null, 0, null, 41, 18, 35, 0, 160, 300, null, null],
|
||||
[0, "악의", null, 0, null, 42, 27, 13, 0, 160, 300, null, null],
|
||||
[0, "영정", null, 0, null, 43, 25, 48, 0, 160, 300, null, null],
|
||||
[0, "강상", null, 0, null, 46, 40, 54, 0, 160, 300, null, null],
|
||||
[0, "전단2", null, 0, null, 44, 55, 25, 0, 160, 300, null, null],
|
||||
[0, "이목", null, 0, null, 44, 13, 42, 0, 160, 300, null, null],
|
||||
[0, "염파", null, 0, null, 43, 9, 44, 0, 160, 300, null, null],
|
||||
[0, "왕전", null, 0, null, 46, 37, 16, 0, 160, 300, null, null],
|
||||
[0, "오기", null, 0, null, 46, 74, 25, 0, 160, 300, null, null],
|
||||
[0, "곽거병", null, 0, null, 47, 16, 87, 0, 160, 300, null, null],
|
||||
[0, "영포", null, 0, null, 58, 22, 49, 0, 160, 300, null, null],
|
||||
[0, "이신", null, 0, null, 59, 37, 57, 0, 160, 300, null, null],
|
||||
[0, "몽념", null, 0, null, 53, 34, 25, 0, 160, 300, null, null],
|
||||
[0, "전기", null, 0, null, 60, 62, 36, 0, 160, 300, null, null],
|
||||
[0, "극신", null, 0, null, 64, 27, 88, 0, 160, 300, null, null],
|
||||
[0, "항연", null, 0, null, 51, 38, 22, 0, 160, 300, null, null],
|
||||
[0, "인상여", null, 0, null, 71, 14, 44, 0, 160, 300, null, null],
|
||||
[0, "장자방", null, 0, null, 68, 43, 27, 0, 160, 300, null, null],
|
||||
[0, "관이오", null, 0, null, 55, 76, 41, 0, 160, 300, null, null],
|
||||
[0, "손빈", null, 0, null, 57, 38, 12, 0, 160, 300, null, null],
|
||||
[0, "소진", null, 0, null, 50, 23, 14, 0, 160, 300, null, null],
|
||||
[0, "범증", null, 0, null, 72, 86, 46, 0, 160, 300, null, null],
|
||||
[0, "장의2", null, 0, null, 65, 87, 17, 0, 160, 300, null, null],
|
||||
[0, "공구", null, 0, null, 72, 70, 49, 0, 160, 300, null, null],
|
||||
[0, "소하", null, 0, null, 84, 23, 8, 0, 160, 300, null, null],
|
||||
[0, "한비", null, 0, null, 90, 81, 43, 0, 160, 300, null, null],
|
||||
[0, "이사", null, 0, null, 42, 16, 45, 0, 160, 300, null, null],
|
||||
[0, "전문", null, 0, null, 61, 73, 41, 0, 160, 300, null, null],
|
||||
[0, "황헐", null, 0, null, 59, 22, 42, 0, 160, 300, null, null, "헐…"],
|
||||
[0, "황호", null, 0, null, 98, 100, 67, 0, 160, 300, null, null],
|
||||
[0, "방난", null, 0, null, 52, 25, 44, 0, 160, 300, null, null],
|
||||
[0, "개섭", null, 0, null, 89, 33, 86, 0, 160, 300, null, null],
|
||||
[0, "형가", null, 0, null, 88, 41, 91, 0, 160, 300, null, null],
|
||||
[0, "유방", null, 0, null, 50, 24, 15, 0, 160, 300, null, null],
|
||||
[0, "하리", null, 0, null, 98, 96, 68, 0, 160, 300, null, null],
|
||||
[0, "헹이", null, 0, null, 93, 59, 98, 0, 160, 300, null, null],
|
||||
[0, "나나", null, 0, null, 94, 53, 93, 0, 160, 300, null, null],
|
||||
[0, "장임2", null, 0, null, 90, 89, 71, 0, 160, 300, null, null],
|
||||
[0, "하야미", null, 0, null, 96, 67, 85, 0, 160, 300, null, null],
|
||||
[0, "이시리스", null, 0, null, 94, 86, 54, 0, 160, 300, null, null],
|
||||
[0, "연채홍", null, 0, null, 97, 47, 96, 0, 160, 300, null, null],
|
||||
[0, "임사영", null, 0, null, 1, 4, 1, 0, 160, 300, null, null, "일반인 양민입니다"],
|
||||
[0, "장군보", null, 0, null, 92, 90, 62, 0, 160, 300, null, null],
|
||||
[0, "크렌스", null, 0, null, 98, 54, 93, 0, 160, 300, null, null],
|
||||
[0, "콘", null, 0, null, 90, 42, 93, 0, 160, 300, null, null],
|
||||
[0, "리즈나", null, 0, null, 97, 88, 64, 0, 160, 300, null, null, "야겜 하고 싶다"],
|
||||
[0, "오티누스", null, 0, null, 97, 47, 97, 0, 160, 300, null, null],
|
||||
[0, "네시", null, 0, null, 92, 67, 96, 0, 160, 300, null, null, "00"],
|
||||
[0, "시뉴카린", null, 0, null, 91, 90, 59, 0, 160, 300, null, null],
|
||||
[0, "Hide_D", null, 0, null, 91, 41, 95, 0, 160, 300, null, null, "버그 흥겜 힏체섭"],
|
||||
[0, "Pray", null, 0, null, 88, 94, 60, 0, 160, 300, null, null, "탈영 마렵다"],
|
||||
[0, "사스케", null, 0, null, 90, 96, 57, 0, 160, 300, null, null, "아무리 고민해도 찰진 대사가 없습니다."],
|
||||
[0, "SARS", null, 0, null, 91, 61, 92, 0, 160, 300, null, null, "아마존 주식 떡상 기원"],
|
||||
[0, "마요이", null, 0, null, 93, 59, 93, 0, 160, 300, null, null, "로열방 없습니다"],
|
||||
[0, "세정", null, 0, null, 88, 68, 92, 0, 160, 300, null, null],
|
||||
[0, "김나영", null, 0, null, 93, 90, 64, 0, 160, 300, null, null, "김나영 머리에서 김나영"],
|
||||
[0, "Cure", null, 0, null, 89, 63, 94, 0, 160, 300, null, null]
|
||||
],
|
||||
"general_ex":[
|
||||
|
||||
]
|
||||
}
|
||||
@@ -1,859 +0,0 @@
|
||||
{
|
||||
"title": "【가상모드24-b】 유저무쌍 멀티 유니버스!(천지비급)",
|
||||
"startYear": 180,
|
||||
"history": [
|
||||
"<C>●</>180년 1월:<L><b>【가상모드24-b】</b>유저무쌍 멀티 유니버스!(비급)</>",
|
||||
"<C>●</>180년 1월:<L><b>【이벤트】</b></>졸장과 명장, 충신과 간신, 무장과 지장, 모든 것이 뒤바뀐 세계"
|
||||
],
|
||||
"stat": {
|
||||
"total": 310,
|
||||
"min": 40,
|
||||
"max": 140
|
||||
},
|
||||
"const": {
|
||||
"npcBanMessageProb":0,
|
||||
"npcSeizureMessageProb":0,
|
||||
"npcMessageFreqByDay":8,
|
||||
"availableSpecialWar": [
|
||||
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
|
||||
"che_보병", "che_궁병", "che_기병", "che_공성",
|
||||
"che_돌격", "che_무쌍", "che_견고", "che_위압",
|
||||
"che_저격", "che_필살", "che_징병", "che_의술", "che_격노", "che_척사"
|
||||
],
|
||||
"allItems": {
|
||||
"horse": {
|
||||
"che_명마_01_노기": 0,
|
||||
"che_명마_02_조랑": 0,
|
||||
"che_명마_03_노새": 0,
|
||||
"che_명마_04_나귀": 0,
|
||||
"che_명마_05_갈색마": 0,
|
||||
"che_명마_06_흑색마": 0,
|
||||
|
||||
"che_명마_07_백마" : 2,
|
||||
"che_명마_07_기주마" : 2,
|
||||
"che_명마_07_오환마" : 2,
|
||||
"che_명마_07_백상" : 2,
|
||||
"che_명마_08_양주마" : 2,
|
||||
"che_명마_08_흉노마" : 2,
|
||||
"che_명마_09_과하마" : 2,
|
||||
"che_명마_09_의남백마" : 2,
|
||||
"che_명마_10_대완마" : 2,
|
||||
"che_명마_10_옥추마" : 2,
|
||||
"che_명마_11_서량마" : 2,
|
||||
"che_명마_11_화종마" : 2,
|
||||
"che_명마_12_사륜거" : 2,
|
||||
"che_명마_12_옥란백용구": 2,
|
||||
"che_명마_13_절영" : 2,
|
||||
"che_명마_13_적로" : 2,
|
||||
"che_명마_14_적란마" : 2,
|
||||
"che_명마_14_조황비전" : 2,
|
||||
"che_명마_15_한혈마" : 2,
|
||||
"che_명마_15_적토마" : 2
|
||||
},
|
||||
"weapon": {
|
||||
"che_무기_01_단도": 0,
|
||||
"che_무기_02_단궁": 0,
|
||||
"che_무기_03_단극": 0,
|
||||
"che_무기_04_목검": 0,
|
||||
"che_무기_05_죽창": 0,
|
||||
"che_무기_06_소부": 0,
|
||||
|
||||
"che_무기_07_동추": 2,
|
||||
"che_무기_07_철편": 2,
|
||||
"che_무기_07_철쇄": 2,
|
||||
"che_무기_07_맥궁": 2,
|
||||
"che_무기_08_유성추": 2,
|
||||
"che_무기_08_철질여골": 2,
|
||||
"che_무기_09_쌍철극": 2,
|
||||
"che_무기_09_동호비궁": 2,
|
||||
"che_무기_10_삼첨도": 2,
|
||||
"che_무기_10_대부": 2,
|
||||
"che_무기_11_고정도": 2,
|
||||
"che_무기_11_이광궁": 2,
|
||||
"che_무기_12_철척사모": 2,
|
||||
"che_무기_12_칠성검": 2,
|
||||
"che_무기_13_사모": 2,
|
||||
"che_무기_13_양유기궁": 2,
|
||||
"che_무기_14_언월도": 2,
|
||||
"che_무기_14_방천화극": 2,
|
||||
"che_무기_15_청홍검": 2,
|
||||
"che_무기_15_의천검": 2
|
||||
},
|
||||
"book": {
|
||||
"che_서적_01_효경전": 0,
|
||||
"che_서적_02_회남자": 0,
|
||||
"che_서적_03_변도론": 0,
|
||||
"che_서적_04_건상역주": 0,
|
||||
"che_서적_05_여씨춘추": 0,
|
||||
"che_서적_06_사민월령": 0,
|
||||
|
||||
"che_서적_07_위료자": 2,
|
||||
"che_서적_07_사마법": 2,
|
||||
"che_서적_07_한서": 2,
|
||||
"che_서적_07_논어": 2,
|
||||
"che_서적_08_전론": 2,
|
||||
"che_서적_08_사기": 2,
|
||||
"che_서적_09_장자": 2,
|
||||
"che_서적_09_역경": 2,
|
||||
"che_서적_10_시경": 2,
|
||||
"che_서적_10_구국론": 2,
|
||||
"che_서적_11_상군서": 2,
|
||||
"che_서적_11_춘추전": 2,
|
||||
"che_서적_12_산해경": 2,
|
||||
"che_서적_12_맹덕신서": 2,
|
||||
"che_서적_13_관자": 2,
|
||||
"che_서적_13_병법24편": 2,
|
||||
"che_서적_14_한비자": 2,
|
||||
"che_서적_14_오자병법": 2,
|
||||
"che_서적_15_노자": 2,
|
||||
"che_서적_15_손자병법": 2
|
||||
},
|
||||
"item": {
|
||||
"che_치료_환약": 0,
|
||||
"che_저격_수극": 0,
|
||||
"che_사기_탁주": 0,
|
||||
"che_훈련_청주": 0,
|
||||
"che_계략_이추": 0,
|
||||
"che_계략_향낭": 0,
|
||||
|
||||
"event_전투특기_격노": 0,
|
||||
"event_전투특기_견고": 0,
|
||||
"event_전투특기_공성": 0,
|
||||
"event_전투특기_궁병": 0,
|
||||
"event_전투특기_귀병": 0,
|
||||
"event_전투특기_기병": 0,
|
||||
"event_전투특기_돌격": 0,
|
||||
"event_전투특기_무쌍": 0,
|
||||
"event_전투특기_반계": 0,
|
||||
"event_전투특기_보병": 0,
|
||||
"event_전투특기_신산": 0,
|
||||
"event_전투특기_신중": 0,
|
||||
"event_전투특기_위압": 0,
|
||||
"event_전투특기_의술": 0,
|
||||
"event_전투특기_저격": 0,
|
||||
"event_전투특기_집중": 0,
|
||||
"event_전투특기_징병": 0,
|
||||
"event_전투특기_척사": 0,
|
||||
"event_전투특기_필살": 0,
|
||||
"event_전투특기_환술": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"iconPath": ".",
|
||||
"fiction": 1,
|
||||
"nation":[
|
||||
|
||||
],
|
||||
"diplomacy":[],
|
||||
"general":[
|
||||
[0, "아회남", null, 0, null, 75, 46, 84, 0, 160, 300, null, null],
|
||||
[0, "이적", null, 0, null, 90, 86, 42, 0, 160, 300, null, null],
|
||||
[0, "윤상", null, 0, null, 89, 86, 48, 0, 160, 300, null, null],
|
||||
[0, "윤묵", null, 0, null, 84, 85, 54, 0, 160, 300, null, null],
|
||||
[0, "우금", null, 0, null, 55, 48, 78, 0, 160, 300, null, null],
|
||||
[0, "위관", null, 0, null, 71, 84, 41, 0, 160, 300, null, null],
|
||||
[0, "원윤", null, 0, null, 88, 86, 41, 0, 160, 300, null, null],
|
||||
[0, "원희", null, 0, null, 74, 87, 47, 0, 160, 300, null, null],
|
||||
[0, "염행", null, 0, null, 62, 40, 82, 0, 160, 300, null, null],
|
||||
[0, "염유", null, 0, null, 79, 80, 49, 0, 160, 300, null, null],
|
||||
[0, "원술", null, 0, null, 80, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "원상", null, 0, null, 87, 45, 88, 0, 160, 300, null, null],
|
||||
[0, "원소", null, 0, null, 50, 58, 39, 0, 160, 300, null, null],
|
||||
[0, "염상", null, 0, null, 80, 83, 39, 0, 160, 300, null, null],
|
||||
[0, "원담", null, 0, null, 80, 42, 88, 0, 160, 300, null, null],
|
||||
[0, "염포", null, 0, null, 80, 85, 38, 0, 160, 300, null, null],
|
||||
[0, "왕위", null, 0, null, 80, 60, 82, 0, 160, 300, null, null],
|
||||
[0, "왕윤", null, 0, null, 87, 88, 52, 0, 160, 300, null, null],
|
||||
[0, "왕항", null, 0, null, 64, 87, 56, 0, 160, 300, null, null],
|
||||
[0, "왕찬", null, 0, null, 85, 87, 41, 0, 160, 300, null, null],
|
||||
[0, "왕수", null, 0, null, 86, 83, 43, 0, 160, 300, null, null],
|
||||
[0, "왕숙", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
|
||||
[0, "왕준", null, 0, null, 55, 76, 46, 0, 160, 300, null, null],
|
||||
[0, "왕쌍", null, 0, null, 73, 42, 81, 0, 160, 300, null, null],
|
||||
[0, "왕창", null, 0, null, 76, 83, 51, 0, 160, 300, null, null],
|
||||
[0, "왕평", null, 0, null, 52, 39, 69, 0, 160, 300, null, null],
|
||||
[0, "왕보", null, 0, null, 78, 89, 41, 0, 160, 300, null, null],
|
||||
[0, "왕문", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
|
||||
[0, "왕릉", null, 0, null, 66, 80, 49, 0, 160, 300, null, null],
|
||||
[0, "왕루", null, 0, null, 90, 77, 41, 0, 160, 300, null, null],
|
||||
[0, "왕랑", null, 0, null, 87, 75, 49, 0, 160, 300, null, null],
|
||||
[0, "온회", null, 0, null, 78, 74, 56, 0, 160, 300, null, null],
|
||||
[0, "하안", null, 0, null, 85, 70, 58, 0, 160, 300, null, null],
|
||||
[0, "괴월", null, 0, null, 79, 72, 45, 0, 160, 300, null, null],
|
||||
[0, "괴량", null, 0, null, 72, 77, 42, 0, 160, 300, null, null],
|
||||
[0, "가화", null, 0, null, 81, 55, 89, 0, 160, 300, null, null],
|
||||
[0, "가규", null, 0, null, 62, 79, 46, 0, 160, 300, null, null],
|
||||
[0, "하의", null, 0, null, 84, 51, 84, 0, 160, 300, null, null],
|
||||
[0, "화흠", null, 0, null, 89, 87, 42, 0, 160, 300, null, null],
|
||||
[0, "가후", null, 0, null, 82, 96, 31, 0, 160, 300, null, null],
|
||||
[0, "곽가", null, 0, null, 90, 95, 43, 0, 160, 300, null, null],
|
||||
[0, "악환", null, 0, null, 75, 40, 88, 0, 160, 300, null, null],
|
||||
[0, "곽사", null, 0, null, 76, 54, 87, 0, 160, 300, null, null],
|
||||
[0, "악취", null, 0, null, 87, 44, 79, 0, 160, 300, null, null],
|
||||
[0, "곽준", null, 0, null, 67, 88, 57, 0, 160, 300, null, null],
|
||||
[0, "학소", null, 0, null, 52, 57, 7, 0, 160, 300, null, null],
|
||||
[0, "악진", null, 0, null, 60, 35, 74, 0, 160, 300, null, null],
|
||||
[0, "곽도", null, 0, null, 78, 90, 38, 0, 160, 300, null, null],
|
||||
[0, "학맹", null, 0, null, 78, 43, 87, 0, 160, 300, null, null],
|
||||
[0, "곽유지", null, 0, null, 82, 81, 41, 0, 160, 300, null, null],
|
||||
[0, "곽익", null, 0, null, 67, 71, 11, 0, 160, 300, null, null],
|
||||
[0, "곽회", null, 0, null, 50, 74, 45, 0, 160, 300, null, null],
|
||||
[0, "하후위", null, 0, null, 69, 47, 81, 0, 160, 300, null, null],
|
||||
[0, "하후연", null, 0, null, 45, 28, 58, 0, 160, 300, null, null],
|
||||
[0, "하후은", null, 0, null, 87, 52, 87, 0, 160, 300, null, null],
|
||||
[0, "하후화", null, 0, null, 90, 86, 51, 0, 160, 300, null, null],
|
||||
[0, "하후혜", null, 0, null, 90, 88, 48, 0, 160, 300, null, null],
|
||||
[0, "하후현", null, 0, null, 86, 90, 44, 0, 160, 300, null, null],
|
||||
[0, "하후상", null, 0, null, 61, 65, 35, 0, 160, 300, null, null],
|
||||
[0, "하후덕", null, 0, null, 71, 57, 90, 0, 160, 300, null, null],
|
||||
[0, "하후돈", null, 0, null, 49, 18, 32, 0, 160, 300, null, null, "부모님께 받은 신체 쫀맛탱!"],
|
||||
[0, "하후패", null, 0, null, 61, 35, 77, 0, 160, 300, null, null],
|
||||
[0, "하후무", null, 0, null, 98, 100, 73, 0, 160, 300, null, null, "나와 싸워 이길 자 누구인가!"],
|
||||
[0, "가충", null, 0, null, 86, 89, 41, 0, 160, 300, null, null],
|
||||
[0, "하진", null, 0, null, 89, 90, 45, 0, 160, 300, null, null, "돼지 잡던 내가 대장군?"],
|
||||
[0, "화웅", null, 0, null, 62, 30, 75, 0, 160, 300, null, null],
|
||||
[0, "한윤", null, 0, null, 84, 81, 35, 0, 160, 300, null, null],
|
||||
[0, "관우", null, 0, null, 44, 21, 44, 0, 160, 300, null, null, "차가 식기 전에 목을 베이고 오겠소!"],
|
||||
[0, "환계", null, 0, null, 85, 84, 52, 0, 160, 300, null, null],
|
||||
[0, "관해", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
|
||||
[0, "관구검", null, 0, null, 56, 44, 78, 0, 160, 300, null, null],
|
||||
[0, "한현", null, 0, null, 96, 51, 97, 0, 160, 300, null, null],
|
||||
[0, "한호", null, 0, null, 67, 80, 46, 0, 160, 300, null, null],
|
||||
[0, "관흥", null, 0, null, 64, 46, 78, 0, 160, 300, null, null],
|
||||
[0, "관색", null, 0, null, 66, 47, 84, 0, 160, 300, null, null],
|
||||
[0, "한수", null, 0, null, 62, 82, 51, 0, 160, 300, null, null],
|
||||
[0, "한숭", null, 0, null, 85, 85, 59, 0, 160, 300, null, null],
|
||||
[0, "관정", null, 0, null, 84, 88, 57, 0, 160, 300, null, null],
|
||||
[0, "한섬", null, 0, null, 71, 44, 94, 0, 160, 300, null, null],
|
||||
[0, "감택", null, 0, null, 84, 70, 37, 0, 160, 300, null, null],
|
||||
[0, "한충", null, 0, null, 76, 53, 82, 0, 160, 300, null, null],
|
||||
[0, "한당", null, 0, null, 64, 45, 79, 0, 160, 300, null, null],
|
||||
[0, "한덕", null, 0, null, 77, 54, 85, 0, 160, 300, null, null],
|
||||
[0, "감녕", null, 0, null, 48, 45, 56, 0, 160, 300, null, null],
|
||||
[0, "한복", null, 0, null, 82, 87, 83, 0, 160, 300, null, null],
|
||||
[0, "관평", null, 0, null, 62, 38, 80, 0, 160, 300, null, null],
|
||||
[0, "간옹", null, 0, null, 93, 91, 45, 0, 160, 300, null, null, "삼대장 간손미에서 간을 맡고 있습니다"],
|
||||
[0, "안량", null, 0, null, 52, 44, 57, 0, 160, 300, null, null],
|
||||
[0, "위연", null, 0, null, 49, 30, 60, 0, 160, 300, null, null],
|
||||
[0, "국의", null, 0, null, 56, 52, 79, 0, 160, 300, null, null],
|
||||
[0, "희지재", null, 0, null, 77, 85, 49, 0, 160, 300, null, null],
|
||||
[0, "위속", null, 0, null, 73, 52, 89, 0, 160, 300, null, null],
|
||||
[0, "위유", null, 0, null, 89, 89, 56, 0, 160, 300, null, null],
|
||||
[0, "우금2", null, 0, null, 68, 51, 82, 0, 160, 300, null, null],
|
||||
[0, "우보", null, 0, null, 82, 60, 89, 0, 160, 300, null, null],
|
||||
[0, "강유", null, 0, null, 48, 58, 27, 0, 160, 300, null, null, "제갈량 너무 멍청하네 진짜"],
|
||||
[0, "공지", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
|
||||
[0, "교유", null, 0, null, 76, 51, 82, 0, 160, 300, null, null],
|
||||
[0, "공도", null, 0, null, 81, 50, 87, 0, 160, 300, null, null],
|
||||
[0, "허공", null, 0, null, 86, 44, 76, 0, 160, 300, null, null],
|
||||
[0, "허정", null, 0, null, 87, 79, 42, 0, 160, 300, null, null],
|
||||
[0, "허저", null, 0, null, 86, 23, 96, 0, 160, 300, null, null, "조조군의 지혜주머니 호치님이시다"],
|
||||
[0, "허유", null, 0, null, 74, 89, 40, 0, 160, 300, null, null],
|
||||
[0, "기령", null, 0, null, 55, 46, 69, 0, 160, 300, null, null],
|
||||
[0, "김의", null, 0, null, 88, 82, 45, 0, 160, 300, null, null],
|
||||
[0, "김배삼결", null, 0, null, 76, 44, 81, 0, 160, 300, null, null],
|
||||
[0, "김선", null, 0, null, 88, 52, 91, 0, 160, 300, null, null],
|
||||
[0, "우번", null, 0, null, 84, 87, 33, 0, 160, 300, null, null],
|
||||
[0, "형도영", null, 0, null, 71, 41, 79, 0, 160, 300, null, null],
|
||||
[0, "엄안", null, 0, null, 58, 37, 68, 0, 160, 300, null, null],
|
||||
[0, "엄망", null, 0, null, 72, 49, 90, 0, 160, 300, null, null],
|
||||
[0, "엄준", null, 0, null, 86, 78, 39, 0, 160, 300, null, null],
|
||||
[0, "엄정", null, 0, null, 90, 85, 31, 0, 160, 300, null, null],
|
||||
[0, "엄백호", null, 0, null, 96, 69, 99, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕이다!"],
|
||||
[0, "엄여", null, 0, null, 90, 52, 96, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕 동생이다!"],
|
||||
[0, "오의", null, 0, null, 61, 47, 87, 0, 160, 300, null, null],
|
||||
[0, "황개", null, 0, null, 60, 43, 76, 0, 160, 300, null, null, "주유 이 미친 놈아!"],
|
||||
[0, "고간", null, 0, null, 66, 64, 82, 0, 160, 300, null, null],
|
||||
[0, "황권", null, 0, null, 65, 66, 32, 0, 160, 300, null, null],
|
||||
[0, "고유", null, 0, null, 83, 87, 49, 0, 160, 300, null, null],
|
||||
[0, "고순", null, 0, null, 53, 31, 60, 0, 160, 300, null, null, "함진영 그거 망한 지 오래됐음"],
|
||||
[0, "고상", null, 0, null, 72, 52, 87, 0, 160, 300, null, null],
|
||||
[0, "고승", null, 0, null, 73, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "후성", null, 0, null, 66, 55, 56, 0, 160, 300, null, null],
|
||||
[0, "후선", null, 0, null, 77, 44, 86, 0, 160, 300, null, null],
|
||||
[0, "황조", null, 0, null, 59, 51, 82, 0, 160, 300, null, null],
|
||||
[0, "공손월", null, 0, null, 66, 48, 93, 0, 160, 300, null, null],
|
||||
[0, "공손연", null, 0, null, 75, 40, 91, 0, 160, 300, null, null],
|
||||
[0, "공손공", null, 0, null, 89, 83, 41, 0, 160, 300, null, null],
|
||||
[0, "공손강", null, 0, null, 68, 44, 84, 0, 160, 300, null, null],
|
||||
[0, "공손찬", null, 0, null, 54, 38, 68, 0, 160, 300, null, null, "백마 어떻게 타요?"],
|
||||
[0, "공손속", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
|
||||
[0, "공손도", null, 0, null, 73, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "공손범", null, 0, null, 67, 41, 89, 0, 160, 300, null, null],
|
||||
[0, "황충", null, 0, null, 52, 34, 65, 0, 160, 300, null, null],
|
||||
[0, "고정", null, 0, null, 85, 57, 87, 0, 160, 300, null, null],
|
||||
[0, "고패", null, 0, null, 74, 70, 31, 0, 160, 300, null, null],
|
||||
[0, "황보숭", null, 0, null, 49, 29, 28, 0, 160, 300, null, null],
|
||||
[0, "공융", null, 0, null, 91, 86, 37, 0, 160, 300, null, null],
|
||||
[0, "고람", null, 0, null, 64, 38, 60, 0, 160, 300, null, null],
|
||||
[0, "오경", null, 0, null, 71, 43, 75, 0, 160, 300, null, null],
|
||||
[0, "호거아", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
|
||||
[0, "호진", null, 0, null, 75, 46, 88, 0, 160, 300, null, null],
|
||||
[0, "올돌골", null, 0, null, 96, 54, 99, 0, 160, 300, null, null, "남만이 낳은 천재 올돌골님이시다"],
|
||||
[0, "호반", null, 0, null, 85, 41, 81, 0, 160, 300, null, null],
|
||||
[0, "오반", null, 0, null, 66, 49, 90, 0, 160, 300, null, null],
|
||||
[0, "고옹", null, 0, null, 88, 82, 49, 0, 160, 300, null, null],
|
||||
[0, "오란", null, 0, null, 72, 50, 85, 0, 160, 300, null, null],
|
||||
[0, "채화", null, 0, null, 91, 41, 87, 0, 160, 300, null, null],
|
||||
[0, "채중", null, 0, null, 90, 46, 88, 0, 160, 300, null, null],
|
||||
[0, "채모", null, 0, null, 70, 45, 63, 0, 160, 300, null, null],
|
||||
[0, "착융", null, 0, null, 83, 51, 86, 0, 160, 300, null, null],
|
||||
[0, "사마의", null, 0, null, 41, 47, 42, 0, 160, 300, null, null, "조조 걔 별 거 아님"],
|
||||
[0, "사마염", null, 0, null, 71, 81, 43, 0, 160, 300, null, null],
|
||||
[0, "사마사", null, 0, null, 56, 76, 41, 0, 160, 300, null, null, "위나라 조진 썰 푼다"],
|
||||
[0, "사마소", null, 0, null, 55, 83, 42, 0, 160, 300, null, null],
|
||||
[0, "사마부", null, 0, null, 70, 83, 43, 0, 160, 300, null, null],
|
||||
[0, "사마랑", null, 0, null, 80, 39, 68, 0, 160, 300, null, null],
|
||||
[0, "사마가", null, 0, null, 74, 26, 85, 0, 160, 300, null, null],
|
||||
[0, "주흔", null, 0, null, 75, 89, 47, 0, 160, 300, null, null],
|
||||
[0, "주앙", null, 0, null, 66, 55, 82, 0, 160, 300, null, null],
|
||||
[0, "주지", null, 0, null, 67, 45, 89, 0, 160, 300, null, null],
|
||||
[0, "주창", null, 0, null, 72, 43, 68, 0, 160, 300, null, null],
|
||||
[0, "주태", null, 0, null, 56, 30, 52, 0, 160, 300, null, null],
|
||||
[0, "주방", null, 0, null, 88, 66, 40, 0, 160, 300, null, null],
|
||||
[0, "주유", null, 0, null, 43, 22, 43, 0, 160, 300, null, null, "동남풍이 부는구나. 황개 몸에 불을 질러라."],
|
||||
[0, "주환", null, 0, null, 53, 36, 55, 0, 160, 300, null, null],
|
||||
[0, "주거", null, 0, null, 63, 83, 58, 0, 160, 300, null, null],
|
||||
[0, "축융", null, 0, null, 98, 65, 95, 0, 160, 300, null, null],
|
||||
[0, "주준", null, 0, null, 51, 83, 54, 0, 160, 300, null, null],
|
||||
[0, "주연", null, 0, null, 54, 55, 83, 0, 160, 300, null, null],
|
||||
[0, "주치", null, 0, null, 69, 56, 68, 0, 160, 300, null, null],
|
||||
[0, "주포", null, 0, null, 72, 57, 86, 0, 160, 300, null, null],
|
||||
[0, "주령", null, 0, null, 62, 47, 87, 0, 160, 300, null, null],
|
||||
[0, "순욱", null, 0, null, 62, 72, 33, 0, 160, 300, null, null],
|
||||
[0, "순우경", null, 0, null, 62, 74, 41, 0, 160, 300, null, null],
|
||||
[0, "순심", null, 0, null, 85, 86, 22, 0, 160, 300, null, null],
|
||||
[0, "순유", null, 0, null, 60, 75, 35, 0, 160, 300, null, null],
|
||||
[0, "장완", null, 0, null, 62, 76, 31, 0, 160, 300, null, null],
|
||||
[0, "종회", null, 0, null, 52, 78, 47, 0, 160, 300, null, null],
|
||||
[0, "장간", null, 0, null, 81, 84, 64, 0, 160, 300, null, null],
|
||||
[0, "장의거", null, 0, null, 69, 91, 71, 0, 160, 300, null, null],
|
||||
[0, "장흠", null, 0, null, 62, 45, 86, 0, 160, 300, null, null],
|
||||
[0, "장제3", null, 0, null, 78, 90, 45, 0, 160, 300, null, null],
|
||||
[0, "초주", null, 0, null, 84, 87, 23, 0, 160, 300, null, null],
|
||||
[0, "초촉", null, 0, null, 75, 64, 31, 0, 160, 300, null, null],
|
||||
[0, "향총", null, 0, null, 64, 84, 53, 0, 160, 300, null, null],
|
||||
[0, "종요", null, 0, null, 61, 86, 40, 0, 160, 300, null, null],
|
||||
[0, "향랑", null, 0, null, 82, 82, 46, 0, 160, 300, null, null],
|
||||
[0, "서영", null, 0, null, 48, 50, 78, 0, 160, 300, null, null],
|
||||
[0, "제갈각", null, 0, null, 68, 83, 40, 0, 160, 300, null, null],
|
||||
[0, "제갈근", null, 0, null, 65, 26, 35, 0, 160, 300, null, null],
|
||||
[0, "제갈균", null, 0, null, 81, 55, 88, 0, 160, 300, null, null],
|
||||
[0, "제갈탄", null, 0, null, 68, 86, 44, 0, 160, 300, null, null],
|
||||
[0, "제갈량", null, 0, null, 42, 14, 22, 0, 160, 300, null, null, "헤헤헤…제갈량 바보 아니다. 엄마가 바보 아니라 그랬다."],
|
||||
[0, "서황", null, 0, null, 45, 26, 46, 0, 160, 300, null, null],
|
||||
[0, "서서", null, 0, null, 46, 26, 21, 0, 160, 300, null, null, "제갈량 어디 가서 나랑 동문이라고 하지마라"],
|
||||
[0, "서성", null, 0, null, 54, 59, 59, 0, 160, 300, null, null],
|
||||
[0, "서막", null, 0, null, 85, 80, 32, 0, 160, 300, null, null],
|
||||
[0, "신의", null, 0, null, 85, 50, 81, 0, 160, 300, null, null],
|
||||
[0, "신탐", null, 0, null, 84, 58, 86, 0, 160, 300, null, null],
|
||||
[0, "심배", null, 0, null, 60, 60, 56, 0, 160, 300, null, null],
|
||||
[0, "신비", null, 0, null, 88, 76, 51, 0, 160, 300, null, null, "뭘 봐? 인체 신비해지고 싶냐"],
|
||||
[0, "신평", null, 0, null, 71, 45, 63, 0, 160, 300, null, null],
|
||||
[0, "진복", null, 0, null, 89, 83, 47, 0, 160, 300, null, null],
|
||||
[0, "진랑", null, 0, null, 82, 60, 85, 0, 160, 300, null, null],
|
||||
[0, "휴고", null, 0, null, 77, 59, 82, 0, 160, 300, null, null],
|
||||
[0, "추단", null, 0, null, 79, 46, 76, 0, 160, 300, null, null],
|
||||
[0, "성의", null, 0, null, 66, 58, 87, 0, 160, 300, null, null],
|
||||
[0, "성공영", null, 0, null, 67, 38, 60, 0, 160, 300, null, null],
|
||||
[0, "설종", null, 0, null, 76, 74, 57, 0, 160, 300, null, null],
|
||||
[0, "단경", null, 0, null, 69, 52, 87, 0, 160, 300, null, null],
|
||||
[0, "전종", null, 0, null, 72, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "조예", null, 0, null, 88, 88, 48, 0, 160, 300, null, null],
|
||||
[0, "조휴", null, 0, null, 56, 52, 72, 0, 160, 300, null, null],
|
||||
[0, "송헌", null, 0, null, 72, 53, 84, 0, 160, 300, null, null],
|
||||
[0, "조앙", null, 0, null, 62, 40, 71, 0, 160, 300, null, null],
|
||||
[0, "조홍", null, 0, null, 60, 55, 85, 0, 160, 300, null, null],
|
||||
[0, "조순", null, 0, null, 55, 37, 77, 0, 160, 300, null, null],
|
||||
[0, "조창", null, 0, null, 54, 39, 81, 0, 160, 300, null, null],
|
||||
[0, "조식", null, 0, null, 85, 93, 14, 0, 160, 300, null, null],
|
||||
[0, "조진", null, 0, null, 52, 56, 44, 0, 160, 300, null, null],
|
||||
[0, "조인", null, 0, null, 46, 40, 60, 0, 160, 300, null, null],
|
||||
[0, "조성", null, 0, null, 86, 66, 37, 0, 160, 300, null, null],
|
||||
[0, "조조", null, 0, null, 40, 17, 13, 0, 160, 300, null, null, "미망인이 뭐예요?"],
|
||||
[0, "조충", null, 0, null, 87, 82, 36, 0, 160, 300, null, null],
|
||||
[0, "장패", null, 0, null, 62, 44, 87, 0, 160, 300, null, null],
|
||||
[0, "조비", null, 0, null, 65, 36, 53, 0, 160, 300, null, null],
|
||||
[0, "조표", null, 0, null, 86, 51, 83, 0, 160, 300, null, null],
|
||||
[0, "저수", null, 0, null, 54, 31, 45, 0, 160, 300, null, null],
|
||||
[0, "소비", null, 0, null, 71, 85, 44, 0, 160, 300, null, null],
|
||||
[0, "조무", null, 0, null, 70, 49, 71, 0, 160, 300, null, null],
|
||||
[0, "손환", null, 0, null, 58, 64, 34, 0, 160, 300, null, null],
|
||||
[0, "손견", null, 0, null, 46, 45, 22, 0, 160, 300, null, null, "강동의 고양이 손견이 간다"],
|
||||
[0, "손건", null, 0, null, 96, 93, 51, 0, 160, 300, null, null, "삼대장 간손미에서 손을 맡고 있습니다"],
|
||||
[0, "손권", null, 0, null, 54, 49, 29, 0, 160, 300, null, null],
|
||||
[0, "손교", null, 0, null, 63, 58, 88, 0, 160, 300, null, null],
|
||||
[0, "손책", null, 0, null, 47, 26, 36, 0, 160, 300, null, null],
|
||||
[0, "손소", null, 0, null, 58, 61, 32, 0, 160, 300, null, null],
|
||||
[0, "손정", null, 0, null, 74, 77, 37, 0, 160, 300, null, null],
|
||||
[0, "손중", null, 0, null, 78, 49, 80, 0, 160, 300, null, null],
|
||||
[0, "손등", null, 0, null, 78, 33, 61, 0, 160, 300, null, null],
|
||||
[0, "손유", null, 0, null, 63, 50, 39, 0, 160, 300, null, null],
|
||||
[0, "손익", null, 0, null, 73, 57, 37, 0, 160, 300, null, null],
|
||||
[0, "손례", null, 0, null, 62, 39, 81, 0, 160, 300, null, null],
|
||||
[0, "태사자", null, 0, null, 46, 22, 47, 0, 160, 300, null, null],
|
||||
[0, "대래동주", null, 0, null, 89, 57, 87, 0, 160, 300, null, null],
|
||||
[0, "대릉", null, 0, null, 70, 55, 81, 0, 160, 300, null, null],
|
||||
[0, "타사대왕", null, 0, null, 78, 27, 70, 0, 160, 300, null, null],
|
||||
[0, "담웅", null, 0, null, 82, 57, 96, 0, 160, 300, null, null],
|
||||
[0, "장윤", null, 0, null, 68, 56, 94, 0, 160, 300, null, null],
|
||||
[0, "조운", null, 0, null, 42, 22, 13, 0, 160, 300, null, null, "아두야 나 좀 살려줘"],
|
||||
[0, "장위", null, 0, null, 66, 54, 95, 0, 160, 300, null, null],
|
||||
[0, "장영", null, 0, null, 65, 56, 69, 0, 160, 300, null, null],
|
||||
[0, "장연", null, 0, null, 64, 49, 83, 0, 160, 300, null, null],
|
||||
[0, "장횡", null, 0, null, 81, 30, 70, 0, 160, 300, null, null],
|
||||
[0, "장온", null, 0, null, 88, 79, 48, 0, 160, 300, null, null],
|
||||
[0, "장개", null, 0, null, 96, 54, 82, 0, 160, 300, null, null],
|
||||
[0, "장각", null, 0, null, 53, 30, 50, 0, 160, 300, null, null],
|
||||
[0, "장기", null, 0, null, 66, 72, 54, 0, 160, 300, null, null],
|
||||
[0, "장의", null, 0, null, 61, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "장훈", null, 0, null, 68, 62, 93, 0, 160, 300, null, null],
|
||||
[0, "장굉", null, 0, null, 86, 88, 24, 0, 160, 300, null, null],
|
||||
[0, "장합", null, 0, null, 48, 22, 41, 0, 160, 300, null, null],
|
||||
[0, "조홍2", null, 0, null, 74, 68, 22, 0, 160, 300, null, null],
|
||||
[0, "장제2", null, 0, null, 70, 74, 34, 0, 160, 300, null, null],
|
||||
[0, "장수", null, 0, null, 60, 57, 89, 0, 160, 300, null, null],
|
||||
[0, "장소", null, 0, null, 59, 87, 43, 0, 160, 300, null, null],
|
||||
[0, "장송", null, 0, null, 80, 64, 45, 0, 160, 300, null, null],
|
||||
[0, "장임", null, 0, null, 55, 46, 76, 0, 160, 300, null, null],
|
||||
[0, "장제", null, 0, null, 73, 37, 60, 0, 160, 300, null, null],
|
||||
[0, "장막", null, 0, null, 88, 87, 59, 0, 160, 300, null, null],
|
||||
[0, "조범", null, 0, null, 92, 90, 58, 0, 160, 300, null, null],
|
||||
[0, "장비", null, 0, null, 43, 2, 36, 0, 160, 300, null, null, "덤비지 마….제발"],
|
||||
[0, "장포", null, 0, null, 62, 46, 82, 0, 160, 300, null, null],
|
||||
[0, "장보", null, 0, null, 57, 80, 49, 0, 160, 300, null, null],
|
||||
[0, "장만성", null, 0, null, 65, 49, 85, 0, 160, 300, null, null],
|
||||
[0, "장양", null, 0, null, 68, 50, 80, 0, 160, 300, null, null],
|
||||
[0, "장익", null, 0, null, 65, 85, 44, 0, 160, 300, null, null],
|
||||
[0, "장료", null, 0, null, 44, 26, 46, 0, 160, 300, null, null],
|
||||
[0, "장량", null, 0, null, 62, 50, 81, 0, 160, 300, null, null],
|
||||
[0, "조루", null, 0, null, 70, 91, 62, 0, 160, 300, null, null],
|
||||
[0, "장로", null, 0, null, 75, 98, 49, 0, 160, 300, null, null],
|
||||
[0, "진횡", null, 0, null, 76, 57, 84, 0, 160, 300, null, null],
|
||||
[0, "진응", null, 0, null, 78, 58, 91, 0, 160, 300, null, null],
|
||||
[0, "진기", null, 0, null, 82, 65, 92, 0, 160, 300, null, null],
|
||||
[0, "진궁", null, 0, null, 56, 85, 40, 0, 160, 300, null, null],
|
||||
[0, "진교", null, 0, null, 79, 83, 53, 0, 160, 300, null, null],
|
||||
[0, "진군", null, 0, null, 88, 13, 65, 0, 160, 300, null, null],
|
||||
[0, "진규", null, 0, null, 80, 76, 38, 0, 160, 300, null, null],
|
||||
[0, "진식", null, 0, null, 70, 59, 85, 0, 160, 300, null, null],
|
||||
[0, "진진", null, 0, null, 92, 90, 51, 0, 160, 300, null, null],
|
||||
[0, "진태", null, 0, null, 54, 72, 41, 0, 160, 300, null, null],
|
||||
[0, "진등", null, 0, null, 61, 81, 49, 0, 160, 300, null, null],
|
||||
[0, "진도", null, 0, null, 58, 52, 82, 0, 160, 300, null, null],
|
||||
[0, "진무", null, 0, null, 64, 43, 97, 0, 160, 300, null, null],
|
||||
[0, "진란", null, 0, null, 74, 51, 80, 0, 160, 300, null, null],
|
||||
[0, "진림", null, 0, null, 95, 11, 65, 0, 160, 300, null, null],
|
||||
[0, "정욱", null, 0, null, 64, 91, 36, 0, 160, 300, null, null],
|
||||
[0, "정원지", null, 0, null, 71, 56, 83, 0, 160, 300, null, null],
|
||||
[0, "정은", null, 0, null, 71, 57, 80, 0, 160, 300, null, null],
|
||||
[0, "정원", null, 0, null, 70, 54, 85, 0, 160, 300, null, null],
|
||||
[0, "정보", null, 0, null, 56, 11, 46, 0, 160, 300, null, null],
|
||||
[0, "정봉", null, 0, null, 59, 38, 71, 0, 160, 300, null, null],
|
||||
[0, "전위", null, 0, null, 41, 22, 48, 0, 160, 300, null, null, "적이 열 보 안으로 들어오거든 나부터 튄다"],
|
||||
[0, "전해", null, 0, null, 72, 55, 85, 0, 160, 300, null, null],
|
||||
[0, "전주", null, 0, null, 74, 89, 57, 0, 160, 300, null, null],
|
||||
[0, "전풍", null, 0, null, 58, 67, 24, 0, 160, 300, null, null, "아 원소 저거 진짜 사람 아니네"],
|
||||
[0, "전예", null, 0, null, 47, 55, 24, 0, 160, 300, null, null],
|
||||
[0, "동윤", null, 0, null, 90, 82, 51, 0, 160, 300, null, null],
|
||||
[0, "동화", null, 0, null, 83, 86, 45, 0, 160, 300, null, null],
|
||||
[0, "등애", null, 0, null, 48, 47, 26, 0, 160, 300, null, null, "이 산이 아닌개벼…"],
|
||||
[0, "도겸", null, 0, null, 89, 83, 56, 0, 160, 300, null, null],
|
||||
[0, "등현", null, 0, null, 79, 67, 35, 0, 160, 300, null, null],
|
||||
[0, "등지", null, 0, null, 67, 68, 49, 0, 160, 300, null, null],
|
||||
[0, "동습", null, 0, null, 68, 45, 80, 0, 160, 300, null, null],
|
||||
[0, "동승", null, 0, null, 84, 87, 55, 0, 160, 300, null, null],
|
||||
[0, "동소", null, 0, null, 86, 85, 40, 0, 160, 300, null, null],
|
||||
[0, "동탁", null, 0, null, 49, 43, 73, 0, 160, 300, null, null],
|
||||
[0, "동도나", null, 0, null, 72, 57, 89, 0, 160, 300, null, null],
|
||||
[0, "동민", null, 0, null, 89, 51, 87, 0, 160, 300, null, null],
|
||||
[0, "등무", null, 0, null, 79, 55, 91, 0, 160, 300, null, null],
|
||||
[0, "두기", null, 0, null, 66, 17, 62, 0, 160, 300, null, null],
|
||||
[0, "두예", null, 0, null, 44, 71, 35, 0, 160, 300, null, null],
|
||||
[0, "배원소", null, 0, null, 90, 45, 85, 0, 160, 300, null, null],
|
||||
[0, "마완", null, 0, null, 69, 56, 84, 0, 160, 300, null, null],
|
||||
[0, "마휴", null, 0, null, 72, 57, 90, 0, 160, 300, null, null],
|
||||
[0, "파재", null, 0, null, 66, 56, 85, 0, 160, 300, null, null],
|
||||
[0, "마준", null, 0, null, 82, 88, 39, 0, 160, 300, null, null],
|
||||
[0, "마속", null, 0, null, 69, 51, 26, 0, 160, 300, null, null],
|
||||
[0, "마대", null, 0, null, 61, 45, 78, 0, 160, 300, null, null],
|
||||
[0, "마충", null, 0, null, 62, 48, 88, 0, 160, 300, null, null],
|
||||
[0, "마초", null, 0, null, 54, 33, 46, 0, 160, 300, null, null, "서량의 븅마초 나가신다"],
|
||||
[0, "마철", null, 0, null, 70, 48, 77, 0, 160, 300, null, null],
|
||||
[0, "마등", null, 0, null, 55, 30, 58, 0, 160, 300, null, null],
|
||||
[0, "마량", null, 0, null, 87, 17, 55, 0, 160, 300, null, null],
|
||||
[0, "반준", null, 0, null, 79, 91, 48, 0, 160, 300, null, null],
|
||||
[0, "반장", null, 0, null, 64, 50, 81, 0, 160, 300, null, null],
|
||||
[0, "번조", null, 0, null, 74, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "번능", null, 0, null, 71, 19, 84, 0, 160, 300, null, null],
|
||||
[0, "반봉", null, 0, null, 84, 53, 86, 0, 160, 300, null, null],
|
||||
[0, "비의", null, 0, null, 58, 84, 42, 0, 160, 300, null, null],
|
||||
[0, "비연", null, 0, null, 80, 62, 89, 0, 160, 300, null, null],
|
||||
[0, "비시", null, 0, null, 82, 42, 75, 0, 160, 300, null, null],
|
||||
[0, "미축", null, 0, null, 90, 91, 52, 0, 160, 300, null, null, "돈도 많고 싸움도 잘하는 간손미 에이스 미축입니다"],
|
||||
[0, "미방", null, 0, null, 86, 50, 88, 0, 160, 300, null, null],
|
||||
[0, "비요", null, 0, null, 70, 88, 57, 0, 160, 300, null, null],
|
||||
[0, "무안국", null, 0, null, 70, 51, 86, 0, 160, 300, null, null],
|
||||
[0, "풍습", null, 0, null, 68, 59, 90, 0, 160, 300, null, null],
|
||||
[0, "부사인", null, 0, null, 94, 47, 83, 0, 160, 300, null, null],
|
||||
[0, "부첨", null, 0, null, 67, 45, 78, 0, 160, 300, null, null],
|
||||
[0, "부손", null, 0, null, 87, 90, 40, 0, 160, 300, null, null],
|
||||
[0, "문앙", null, 0, null, 64, 34, 75, 0, 160, 300, null, null],
|
||||
[0, "문흠", null, 0, null, 66, 61, 26, 0, 160, 300, null, null],
|
||||
[0, "문추", null, 0, null, 53, 26, 51, 0, 160, 300, null, null],
|
||||
[0, "문빙", null, 0, null, 52, 35, 55, 0, 160, 300, null, null],
|
||||
[0, "변희", null, 0, null, 84, 50, 78, 0, 160, 300, null, null],
|
||||
[0, "망아장", null, 0, null, 90, 51, 87, 0, 160, 300, null, null],
|
||||
[0, "봉기", null, 0, null, 84, 90, 46, 0, 160, 300, null, null],
|
||||
[0, "방희", null, 0, null, 80, 82, 41, 0, 160, 300, null, null],
|
||||
[0, "법정", null, 0, null, 58, 46, 11, 0, 160, 300, null, null],
|
||||
[0, "방통", null, 0, null, 51, 43, 22, 0, 160, 300, null, null],
|
||||
[0, "방덕", null, 0, null, 51, 26, 40, 0, 160, 300, null, null],
|
||||
[0, "포륭", null, 0, null, 82, 54, 91, 0, 160, 300, null, null],
|
||||
[0, "목순", null, 0, null, 88, 33, 88, 0, 160, 300, null, null],
|
||||
[0, "목록대왕", null, 0, null, 93, 59, 99, 0, 160, 300, null, null, "코끼리만 있으면 너도 한 방 나도 한 방"],
|
||||
[0, "보즐", null, 0, null, 57, 19, 59, 0, 160, 300, null, null],
|
||||
[0, "만총", null, 0, null, 52, 16, 53, 0, 160, 300, null, null],
|
||||
[0, "모개", null, 0, null, 77, 81, 20, 0, 160, 300, null, null],
|
||||
[0, "맹획", null, 0, null, 59, 12, 88, 0, 160, 300, null, null],
|
||||
[0, "맹체", null, 0, null, 65, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "맹우", null, 0, null, 90, 9, 90, 0, 160, 300, null, null],
|
||||
[0, "유섭", null, 0, null, 78, 51, 96, 0, 160, 300, null, null],
|
||||
[0, "양부", null, 0, null, 78, 86, 52, 0, 160, 300, null, null],
|
||||
[0, "옹개", null, 0, null, 67, 55, 83, 0, 160, 300, null, null],
|
||||
[0, "양의", null, 0, null, 72, 20, 58, 0, 160, 300, null, null],
|
||||
[0, "양호", null, 0, null, 46, 51, 28, 0, 160, 300, null, null],
|
||||
[0, "양홍", null, 0, null, 92, 87, 13, 0, 160, 300, null, null],
|
||||
[0, "양앙", null, 0, null, 72, 58, 92, 0, 160, 300, null, null],
|
||||
[0, "양추", null, 0, null, 88, 55, 90, 0, 160, 300, null, null],
|
||||
[0, "양수", null, 0, null, 92, 91, 1, 0, 160, 300, null, null],
|
||||
[0, "양추2", null, 0, null, 73, 56, 96, 0, 160, 300, null, null],
|
||||
[0, "양송", null, 0, null, 100, 65, 98, 0, 160, 300, null, null, "군신 악의만이 나와 비견될만 하다"],
|
||||
[0, "양임", null, 0, null, 70, 42, 84, 0, 160, 300, null, null],
|
||||
[0, "양조", null, 0, null, 87, 79, 34, 0, 160, 300, null, null],
|
||||
[0, "양백", null, 0, null, 90, 81, 31, 0, 160, 300, null, null],
|
||||
[0, "양부2", null, 0, null, 73, 90, 47, 0, 160, 300, null, null],
|
||||
[0, "양봉", null, 0, null, 74, 75, 39, 0, 160, 300, null, null],
|
||||
[0, "양봉2", null, 0, null, 86, 28, 87, 0, 160, 300, null, null],
|
||||
[0, "뇌동", null, 0, null, 71, 52, 89, 0, 160, 300, null, null],
|
||||
[0, "뇌박", null, 0, null, 78, 60, 84, 0, 160, 300, null, null],
|
||||
[0, "이이", null, 0, null, 77, 22, 81, 0, 160, 300, null, null],
|
||||
[0, "이회", null, 0, null, 61, 82, 51, 0, 160, 300, null, null],
|
||||
[0, "이각", null, 0, null, 71, 58, 86, 0, 160, 300, null, null],
|
||||
[0, "육항", null, 0, null, 46, 61, 27, 0, 160, 300, null, null],
|
||||
[0, "육적", null, 0, null, 60, 61, 28, 0, 160, 300, null, null],
|
||||
[0, "육손", null, 0, null, 45, 69, 34, 0, 160, 300, null, null],
|
||||
[0, "이엄", null, 0, null, 57, 46, 77, 0, 160, 300, null, null],
|
||||
[0, "이유", null, 0, null, 69, 84, 37, 0, 160, 300, null, null],
|
||||
[0, "이숙", null, 0, null, 87, 41, 89, 0, 160, 300, null, null],
|
||||
[0, "이통", null, 0, null, 67, 49, 78, 0, 160, 300, null, null],
|
||||
[0, "이전", null, 0, null, 62, 40, 61, 0, 160, 300, null, null],
|
||||
[0, "이풍", null, 0, null, 71, 56, 90, 0, 160, 300, null, null],
|
||||
[0, "유언", null, 0, null, 79, 82, 50, 0, 160, 300, null, null],
|
||||
[0, "유괴", null, 0, null, 69, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "유기", null, 0, null, 88, 88, 37, 0, 160, 300, null, null],
|
||||
[0, "유우", null, 0, null, 78, 87, 55, 0, 160, 300, null, null],
|
||||
[0, "유훈", null, 0, null, 90, 37, 82, 0, 160, 300, null, null],
|
||||
[0, "유현", null, 0, null, 86, 44, 89, 0, 160, 300, null, null],
|
||||
[0, "유순", null, 0, null, 77, 34, 92, 0, 160, 300, null, null],
|
||||
[0, "유장", null, 0, null, 99, 90, 47, 0, 160, 300, null, null],
|
||||
[0, "유심", null, 0, null, 80, 82, 56, 0, 160, 300, null, null],
|
||||
[0, "유선", null, 0, null, 97, 65, 96, 0, 160, 300, null, null, "촉은 제갈량이 다 말아먹었다"],
|
||||
[0, "유종", null, 0, null, 86, 88, 35, 0, 160, 300, null, null],
|
||||
[0, "유도", null, 0, null, 85, 87, 34, 0, 160, 300, null, null],
|
||||
[0, "유파", null, 0, null, 81, 38, 85, 0, 160, 300, null, null],
|
||||
[0, "유반", null, 0, null, 71, 54, 93, 0, 160, 300, null, null],
|
||||
[0, "유비", null, 0, null, 52, 18, 23, 0, 160, 300, null, null, "돗자리 좀 사주세요"],
|
||||
[0, "유표", null, 0, null, 82, 81, 28, 0, 160, 300, null, null],
|
||||
[0, "유복", null, 0, null, 76, 81, 56, 0, 160, 300, null, null],
|
||||
[0, "유벽", null, 0, null, 70, 58, 93, 0, 160, 300, null, null],
|
||||
[0, "유봉", null, 0, null, 65, 51, 32, 0, 160, 300, null, null],
|
||||
[0, "유엽", null, 0, null, 84, 65, 38, 0, 160, 300, null, null],
|
||||
[0, "유요", null, 0, null, 78, 63, 24, 0, 160, 300, null, null],
|
||||
[0, "여위황", null, 0, null, 82, 57, 86, 0, 160, 300, null, null],
|
||||
[0, "요화", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
|
||||
[0, "양흥", null, 0, null, 79, 45, 81, 0, 160, 300, null, null],
|
||||
[0, "양습", null, 0, null, 67, 80, 56, 0, 160, 300, null, null],
|
||||
[0, "양서", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
|
||||
[0, "능조", null, 0, null, 65, 29, 38, 0, 160, 300, null, null],
|
||||
[0, "능통", null, 0, null, 57, 11, 40, 0, 160, 300, null, null],
|
||||
[0, "여개", null, 0, null, 87, 80, 53, 0, 160, 300, null, null],
|
||||
[0, "여건", null, 0, null, 83, 40, 78, 0, 160, 300, null, null],
|
||||
[0, "여광", null, 0, null, 84, 41, 87, 0, 160, 300, null, null],
|
||||
[0, "여상", null, 0, null, 86, 39, 88, 0, 160, 300, null, null],
|
||||
[0, "여대", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
|
||||
[0, "여범", null, 0, null, 67, 86, 55, 0, 160, 300, null, null],
|
||||
[0, "여포", null, 0, null, 51, 10, 100, 0, 160, 300, null, null, "이기기 위한 전략만 내어드리겠습니다."],
|
||||
[0, "여몽", null, 0, null, 49, 31, 10, 0, 160, 300, null, null],
|
||||
[0, "윤직", null, 0, null, 88, 88, 47, 0, 160, 300, null, null],
|
||||
[0, "냉포", null, 0, null, 69, 48, 79, 0, 160, 300, null, null],
|
||||
[0, "누규", null, 0, null, 88, 87, 43, 0, 160, 300, null, null],
|
||||
[0, "노숙", null, 0, null, 51, 64, 17, 0, 160, 300, null, null],
|
||||
[0, "노식", null, 0, null, 54, 77, 48, 0, 160, 300, null, null],
|
||||
[0, "범강", null, 0, null, 89, 89, 34, 0, 160, 300, null, null],
|
||||
[0, "장달", null, 0, null, 87, 84, 46, 0, 160, 300, null, null],
|
||||
[0, "규람", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
|
||||
[0, "대원", null, 0, null, 82, 88, 42, 0, 160, 300, null, null],
|
||||
[0, "왕기", null, 0, null, 59, 76, 44, 0, 160, 300, null, null],
|
||||
[0, "왕상", null, 0, null, 87, 89, 52, 0, 160, 300, null, null],
|
||||
[0, "왕돈", null, 0, null, 80, 54, 94, 0, 160, 300, null, null],
|
||||
[0, "악침", null, 0, null, 67, 55, 97, 0, 160, 300, null, null],
|
||||
[0, "하제", null, 0, null, 57, 79, 48, 0, 160, 300, null, null],
|
||||
[0, "환범", null, 0, null, 81, 89, 42, 0, 160, 300, null, null],
|
||||
[0, "견초", null, 0, null, 68, 51, 83, 0, 160, 300, null, null],
|
||||
[0, "고당륭", null, 0, null, 90, 90, 44, 0, 160, 300, null, null],
|
||||
[0, "오찬", null, 0, null, 72, 91, 42, 0, 160, 300, null, null],
|
||||
[0, "호질", null, 0, null, 67, 88, 56, 0, 160, 300, null, null],
|
||||
[0, "오질", null, 0, null, 90, 89, 22, 0, 160, 300, null, null],
|
||||
[0, "호준", null, 0, null, 61, 54, 85, 0, 160, 300, null, null],
|
||||
[0, "고담", null, 0, null, 87, 87, 33, 0, 160, 300, null, null],
|
||||
[0, "최림", null, 0, null, 84, 85, 14, 0, 160, 300, null, null],
|
||||
[0, "사마망", null, 0, null, 62, 82, 47, 0, 160, 300, null, null],
|
||||
[0, "주이", null, 0, null, 70, 57, 88, 0, 160, 300, null, null],
|
||||
[0, "전단", null, 0, null, 73, 76, 71, 0, 160, 300, null, null],
|
||||
[0, "조우", null, 0, null, 89, 83, 23, 0, 160, 300, null, null],
|
||||
[0, "조상", null, 0, null, 81, 87, 40, 0, 160, 300, null, null],
|
||||
[0, "조방", null, 0, null, 90, 86, 43, 0, 160, 300, null, null],
|
||||
[0, "태사향", null, 0, null, 83, 52, 82, 0, 160, 300, null, null],
|
||||
[0, "장휴", null, 0, null, 77, 43, 66, 0, 160, 300, null, null],
|
||||
[0, "장호", null, 0, null, 65, 56, 89, 0, 160, 300, null, null],
|
||||
[0, "조광", null, 0, null, 73, 59, 87, 0, 160, 300, null, null],
|
||||
[0, "장집", null, 0, null, 64, 81, 50, 0, 160, 300, null, null],
|
||||
[0, "장승", null, 0, null, 63, 85, 55, 0, 160, 300, null, null],
|
||||
[0, "장소2", null, 0, null, 87, 84, 19, 0, 160, 300, null, null],
|
||||
[0, "조통", null, 0, null, 72, 53, 81, 0, 160, 300, null, null],
|
||||
[0, "진표", null, 0, null, 74, 88, 56, 0, 160, 300, null, null],
|
||||
[0, "정무", null, 0, null, 84, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "정봉2", null, 0, null, 74, 22, 74, 0, 160, 300, null, null],
|
||||
[0, "전만", null, 0, null, 89, 11, 67, 0, 160, 300, null, null],
|
||||
[0, "마균", null, 0, null, 88, 83, 29, 0, 160, 300, null, null],
|
||||
[0, "방회", null, 0, null, 71, 55, 86, 0, 160, 300, null, null],
|
||||
[0, "낙통", null, 0, null, 64, 82, 55, 0, 160, 300, null, null],
|
||||
[0, "육개", null, 0, null, 75, 79, 51, 0, 160, 300, null, null],
|
||||
[0, "유찬", null, 0, null, 62, 59, 81, 0, 160, 300, null, null],
|
||||
[0, "유소", null, 0, null, 72, 87, 56, 0, 160, 300, null, null],
|
||||
[0, "요립", null, 0, null, 88, 85, 24, 0, 160, 300, null, null],
|
||||
[0, "여거", null, 0, null, 62, 89, 49, 0, 160, 300, null, null],
|
||||
[0, "제갈첨", null, 0, null, 70, 83, 54, 0, 160, 300, null, null],
|
||||
[0, "손휴", null, 0, null, 83, 90, 52, 0, 160, 300, null, null],
|
||||
[0, "극정", null, 0, null, 90, 77, 32, 0, 160, 300, null, null],
|
||||
[0, "호분", null, 0, null, 69, 54, 80, 0, 160, 300, null, null],
|
||||
[0, "손량", null, 0, null, 88, 84, 30, 0, 160, 300, null, null],
|
||||
[0, "마막", null, 0, null, 96, 98, 71, 0, 160, 300, null, null],
|
||||
[0, "손호", null, 0, null, 89, 43, 41, 0, 160, 300, null, null],
|
||||
[0, "조모", null, 0, null, 86, 39, 81, 0, 160, 300, null, null],
|
||||
[0, "조환", null, 0, null, 90, 42, 80, 0, 160, 300, null, null],
|
||||
[0, "사마유", null, 0, null, 69, 86, 55, 0, 160, 300, null, null],
|
||||
[0, "제갈상", null, 0, null, 76, 51, 78, 0, 160, 300, null, null],
|
||||
[0, "손화", null, 0, null, 87, 71, 22, 0, 160, 300, null, null],
|
||||
[0, "염우", null, 0, null, 88, 49, 89, 0, 160, 300, null, null],
|
||||
[0, "왕경", null, 0, null, 73, 81, 59, 0, 160, 300, null, null],
|
||||
[0, "왕혼", null, 0, null, 66, 59, 80, 0, 160, 300, null, null],
|
||||
[0, "곽혁", null, 0, null, 87, 81, 30, 0, 160, 300, null, null],
|
||||
[0, "가범", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
|
||||
[0, "서질", null, 0, null, 72, 47, 86, 0, 160, 300, null, null],
|
||||
[0, "손준", null, 0, null, 76, 40, 82, 0, 160, 300, null, null],
|
||||
[0, "손침", null, 0, null, 82, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "우사", null, 0, null, 79, 86, 56, 0, 160, 300, null, null],
|
||||
[0, "진건", null, 0, null, 68, 49, 88, 0, 160, 300, null, null],
|
||||
[0, "동궐", null, 0, null, 75, 81, 44, 0, 160, 300, null, null],
|
||||
[0, "당자", null, 0, null, 79, 49, 89, 0, 160, 300, null, null],
|
||||
[0, "등충", null, 0, null, 64, 40, 81, 0, 160, 300, null, null],
|
||||
[0, "황숭", null, 0, null, 73, 70, 38, 0, 160, 300, null, null],
|
||||
[0, "화핵", null, 0, null, 80, 76, 29, 0, 160, 300, null, null],
|
||||
[0, "허의", null, 0, null, 89, 46, 85, 0, 160, 300, null, null],
|
||||
[0, "송겸", null, 0, null, 74, 42, 87, 0, 160, 300, null, null],
|
||||
[0, "호제", null, 0, null, 83, 81, 52, 0, 160, 300, null, null],
|
||||
[0, "나헌", null, 0, null, 54, 78, 38, 0, 160, 300, null, null],
|
||||
[0, "노숙2", null, 0, null, 67, 87, 46, 0, 160, 300, null, null],
|
||||
[0, "구성", null, 0, null, 77, 40, 82, 0, 160, 300, null, null],
|
||||
[0, "어부라", null, 0, null, 78, 42, 86, 0, 160, 300, null, null],
|
||||
[0, "아하소과", null, 0, null, 89, 54, 90, 0, 160, 300, null, null],
|
||||
[0, "가비능", null, 0, null, 63, 41, 88, 0, 160, 300, null, null],
|
||||
[0, "구력거", null, 0, null, 60, 42, 80, 0, 160, 300, null, null],
|
||||
[0, "강단", null, 0, null, 75, 47, 82, 0, 160, 300, null, null],
|
||||
[0, "황란", null, 0, null, 77, 45, 76, 0, 160, 300, null, null],
|
||||
[0, "호주천", null, 0, null, 70, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "종리목", null, 0, null, 56, 79, 38, 0, 160, 300, null, null],
|
||||
[0, "제갈교", null, 0, null, 78, 83, 45, 0, 160, 300, null, null],
|
||||
[0, "답돈", null, 0, null, 56, 48, 79, 0, 160, 300, null, null],
|
||||
[0, "반임", null, 0, null, 74, 41, 82, 0, 160, 300, null, null],
|
||||
[0, "보도근", null, 0, null, 76, 57, 80, 0, 160, 300, null, null],
|
||||
[0, "미당대왕", null, 0, null, 81, 51, 89, 0, 160, 300, null, null],
|
||||
[0, "유표2", null, 0, null, 67, 56, 82, 0, 160, 300, null, null],
|
||||
[0, "루반", null, 0, null, 75, 44, 81, 0, 160, 300, null, null],
|
||||
[0, "손관", null, 0, null, 68, 42, 89, 0, 160, 300, null, null],
|
||||
[0, "곽석", null, 0, null, 81, 49, 86, 0, 160, 300, null, null],
|
||||
[0, "주조", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
|
||||
[0, "장거", null, 0, null, 61, 45, 84, 0, 160, 300, null, null],
|
||||
[0, "장순", null, 0, null, 67, 49, 80, 0, 160, 300, null, null],
|
||||
[0, "철리길", null, 0, null, 63, 50, 88, 0, 160, 300, null, null],
|
||||
[0, "주삭", null, 0, null, 90, 52, 90, 0, 160, 300, null, null],
|
||||
[0, "황월영", null, 0, null, 94, 97, 58, 0, 160, 300, null, null, "어쩌다 저런 걸 남편이라고…."],
|
||||
[0, "채염", null, 0, null, 98, 99, 49, 0, 160, 300, null, null],
|
||||
[0, "소교", null, 0, null, 97, 95, 52, 0, 160, 300, null, null, "주유 너무 무능하다."],
|
||||
[0, "신헌영", null, 0, null, 85, 95, 60, 0, 160, 300, null, null],
|
||||
[0, "손상향", null, 0, null, 98, 58, 92, 0, 160, 300, null, null],
|
||||
[0, "대교", null, 0, null, 98, 90, 52, 0, 160, 300, null, null, "손책 너무 무능하다."],
|
||||
[0, "초선", null, 0, null, 99, 98, 59, 0, 160, 300, null, null, "동탁 이리와봐 한대만 맞자"],
|
||||
[0, "교모", null, 0, null, 86, 90, 31, 0, 160, 300, null, null],
|
||||
[0, "관구수", null, 0, null, 82, 28, 91, 0, 160, 300, null, null],
|
||||
[0, "관구전", null, 0, null, 77, 88, 51, 0, 160, 300, null, null],
|
||||
[0, "원유", null, 0, null, 84, 80, 47, 0, 160, 300, null, null],
|
||||
[0, "왕광", null, 0, null, 75, 86, 49, 0, 160, 300, null, null],
|
||||
[0, "신창", null, 0, null, 85, 84, 48, 0, 160, 300, null, null],
|
||||
[0, "사마주", null, 0, null, 79, 86, 49, 0, 160, 300, null, null],
|
||||
[0, "양제", null, 0, null, 73, 82, 29, 0, 160, 300, null, null],
|
||||
[0, "성만", null, 0, null, 79, 42, 90, 0, 160, 300, null, null],
|
||||
[0, "오연", null, 0, null, 74, 47, 88, 0, 160, 300, null, null],
|
||||
[0, "맹충", null, 0, null, 90, 72, 38, 0, 160, 300, null, null],
|
||||
[0, "잠혼", null, 0, null, 100, 99, 58, 0, 160, 300, null, null, "이 몸이 만부부당이라 불리는 맹장 잠혼이다."],
|
||||
[0, "사정", null, 0, null, 76, 44, 86, 0, 160, 300, null, null],
|
||||
[0, "심영", null, 0, null, 70, 43, 85, 0, 160, 300, null, null],
|
||||
[0, "도준", null, 0, null, 75, 44, 83, 0, 160, 300, null, null],
|
||||
[0, "만욱", null, 0, null, 89, 85, 45, 0, 160, 300, null, null],
|
||||
[0, "오언", null, 0, null, 64, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "위막", null, 0, null, 86, 58, 81, 0, 160, 300, null, null],
|
||||
[0, "시삭", null, 0, null, 88, 55, 83, 0, 160, 300, null, null],
|
||||
[0, "전속", null, 0, null, 90, 40, 85, 0, 160, 300, null, null],
|
||||
[0, "장화", null, 0, null, 84, 83, 32, 0, 160, 300, null, null],
|
||||
[0, "오거", null, 0, null, 90, 19, 91, 0, 160, 300, null, null],
|
||||
[0, "추정", null, 0, null, 70, 84, 24, 0, 160, 300, null, null],
|
||||
[0, "장특", null, 0, null, 67, 86, 45, 0, 160, 300, null, null],
|
||||
[0, "곽마", null, 0, null, 72, 49, 83, 0, 160, 300, null, null],
|
||||
[0, "석포", null, 0, null, 71, 49, 81, 0, 160, 300, null, null],
|
||||
[0, "견홍", null, 0, null, 70, 56, 87, 0, 160, 300, null, null],
|
||||
[0, "한거자", null, 0, null, 89, 81, 29, 0, 160, 300, null, null],
|
||||
[0, "휴원진", null, 0, null, 88, 22, 85, 0, 160, 300, null, null],
|
||||
[0, "곽원", null, 0, null, 74, 84, 47, 0, 160, 300, null, null],
|
||||
[0, "계옹", null, 0, null, 77, 87, 28, 0, 160, 300, null, null],
|
||||
[0, "이부", null, 0, null, 89, 84, 46, 0, 160, 300, null, null],
|
||||
[0, "왕업", null, 0, null, 87, 84, 45, 0, 160, 300, null, null],
|
||||
[0, "좌혁", null, 0, null, 78, 44, 89, 0, 160, 300, null, null],
|
||||
[0, "화타", null, 0, null, 83, 96, 37, 0, 160, 300, null, null, "가시는 길 한 방에 편안하게"],
|
||||
[0, "사마휘", null, 0, null, 85, 84, 28, 0, 160, 300, null, null, "공명과 방통은 아무 짝에도 쓸모가 없습니다"],
|
||||
[0, "우길", null, 0, null, 87, 85, 30, 0, 160, 300, null, null],
|
||||
[0, "헌제", null, 0, null, 88, 92, 52, 0, 160, 300, null, null, "한 황실의 미래는 내 알바 아니다"],
|
||||
[0, "백기", null, 0, null, 40, 42, 61, 0, 160, 300, null, null],
|
||||
[0, "한신", null, 0, null, 40, 56, 35, 0, 160, 300, null, null],
|
||||
[0, "악비", null, 0, null, 41, 48, 20, 0, 160, 300, null, null],
|
||||
[0, "항적", null, 0, null, 41, 18, 35, 0, 160, 300, null, null],
|
||||
[0, "악의", null, 0, null, 42, 27, 13, 0, 160, 300, null, null],
|
||||
[0, "영정", null, 0, null, 43, 25, 48, 0, 160, 300, null, null],
|
||||
[0, "강상", null, 0, null, 46, 40, 54, 0, 160, 300, null, null],
|
||||
[0, "전단2", null, 0, null, 44, 55, 25, 0, 160, 300, null, null],
|
||||
[0, "이목", null, 0, null, 44, 13, 42, 0, 160, 300, null, null],
|
||||
[0, "염파", null, 0, null, 43, 9, 44, 0, 160, 300, null, null],
|
||||
[0, "왕전", null, 0, null, 46, 37, 16, 0, 160, 300, null, null],
|
||||
[0, "오기", null, 0, null, 46, 74, 25, 0, 160, 300, null, null],
|
||||
[0, "곽거병", null, 0, null, 47, 16, 87, 0, 160, 300, null, null],
|
||||
[0, "영포", null, 0, null, 58, 22, 49, 0, 160, 300, null, null],
|
||||
[0, "이신", null, 0, null, 59, 37, 57, 0, 160, 300, null, null],
|
||||
[0, "몽념", null, 0, null, 53, 34, 25, 0, 160, 300, null, null],
|
||||
[0, "전기", null, 0, null, 60, 62, 36, 0, 160, 300, null, null],
|
||||
[0, "극신", null, 0, null, 64, 27, 88, 0, 160, 300, null, null],
|
||||
[0, "항연", null, 0, null, 51, 38, 22, 0, 160, 300, null, null],
|
||||
[0, "인상여", null, 0, null, 71, 14, 44, 0, 160, 300, null, null],
|
||||
[0, "장자방", null, 0, null, 68, 43, 27, 0, 160, 300, null, null],
|
||||
[0, "관이오", null, 0, null, 55, 76, 41, 0, 160, 300, null, null],
|
||||
[0, "손빈", null, 0, null, 57, 38, 12, 0, 160, 300, null, null],
|
||||
[0, "소진", null, 0, null, 50, 23, 14, 0, 160, 300, null, null],
|
||||
[0, "범증", null, 0, null, 72, 86, 46, 0, 160, 300, null, null],
|
||||
[0, "장의2", null, 0, null, 65, 87, 17, 0, 160, 300, null, null],
|
||||
[0, "공구", null, 0, null, 72, 70, 49, 0, 160, 300, null, null],
|
||||
[0, "소하", null, 0, null, 84, 23, 8, 0, 160, 300, null, null],
|
||||
[0, "한비", null, 0, null, 90, 81, 43, 0, 160, 300, null, null],
|
||||
[0, "이사", null, 0, null, 42, 16, 45, 0, 160, 300, null, null],
|
||||
[0, "전문", null, 0, null, 61, 73, 41, 0, 160, 300, null, null],
|
||||
[0, "황헐", null, 0, null, 59, 22, 42, 0, 160, 300, null, null, "헐…"],
|
||||
[0, "황호", null, 0, null, 98, 100, 67, 0, 160, 300, null, null],
|
||||
[0, "방난", null, 0, null, 52, 25, 44, 0, 160, 300, null, null],
|
||||
[0, "개섭", null, 0, null, 89, 33, 86, 0, 160, 300, null, null],
|
||||
[0, "형가", null, 0, null, 88, 41, 91, 0, 160, 300, null, null],
|
||||
[0, "유방", null, 0, null, 50, 24, 15, 0, 160, 300, null, null],
|
||||
[0, "하리", null, 0, null, 98, 96, 68, 0, 160, 300, null, null],
|
||||
[0, "헹이", null, 0, null, 93, 59, 98, 0, 160, 300, null, null],
|
||||
[0, "나나", null, 0, null, 94, 53, 93, 0, 160, 300, null, null],
|
||||
[0, "장임2", null, 0, null, 90, 89, 71, 0, 160, 300, null, null],
|
||||
[0, "하야미", null, 0, null, 96, 67, 85, 0, 160, 300, null, null],
|
||||
[0, "이시리스", null, 0, null, 94, 86, 54, 0, 160, 300, null, null],
|
||||
[0, "연채홍", null, 0, null, 97, 47, 96, 0, 160, 300, null, null],
|
||||
[0, "임사영", null, 0, null, 1, 4, 1, 0, 160, 300, null, null, "일반인 양민입니다"],
|
||||
[0, "장군보", null, 0, null, 92, 90, 62, 0, 160, 300, null, null],
|
||||
[0, "크렌스", null, 0, null, 98, 54, 93, 0, 160, 300, null, null],
|
||||
[0, "콘", null, 0, null, 90, 42, 93, 0, 160, 300, null, null],
|
||||
[0, "리즈나", null, 0, null, 97, 88, 64, 0, 160, 300, null, null, "야겜 하고 싶다"],
|
||||
[0, "오티누스", null, 0, null, 97, 47, 97, 0, 160, 300, null, null],
|
||||
[0, "네시", null, 0, null, 92, 67, 96, 0, 160, 300, null, null, "00"],
|
||||
[0, "시뉴카린", null, 0, null, 91, 90, 59, 0, 160, 300, null, null],
|
||||
[0, "Hide_D", null, 0, null, 91, 41, 95, 0, 160, 300, null, null, "버그 흥겜 힏체섭"],
|
||||
[0, "Pray", null, 0, null, 88, 94, 60, 0, 160, 300, null, null, "탈영 마렵다"],
|
||||
[0, "사스케", null, 0, null, 90, 96, 57, 0, 160, 300, null, null, "아무리 고민해도 찰진 대사가 없습니다."],
|
||||
[0, "SARS", null, 0, null, 91, 61, 92, 0, 160, 300, null, null, "아마존 주식 떡상 기원"],
|
||||
[0, "마요이", null, 0, null, 93, 59, 93, 0, 160, 300, null, null, "로열방 없습니다"],
|
||||
[0, "세정", null, 0, null, 88, 68, 92, 0, 160, 300, null, null],
|
||||
[0, "김나영", null, 0, null, 93, 90, 64, 0, 160, 300, null, null, "김나영 머리에서 김나영"],
|
||||
[0, "Cure", null, 0, null, 89, 63, 94, 0, 160, 300, null, null]
|
||||
],
|
||||
"general_ex":[
|
||||
|
||||
],
|
||||
"initialEvents":[
|
||||
[
|
||||
true,
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}]
|
||||
]
|
||||
],
|
||||
"events":[
|
||||
[
|
||||
"month", 1000,
|
||||
["Date", "==", 180, 1],
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}],
|
||||
["DeleteEvent"]
|
||||
],
|
||||
[
|
||||
"month", 1000,
|
||||
["Date", "==", 180, 7],
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}],
|
||||
["DeleteEvent"]
|
||||
],
|
||||
[
|
||||
"month", 1000,
|
||||
["Date", "==", 181, 1],
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}],
|
||||
["DeleteEvent"]
|
||||
],
|
||||
[
|
||||
"month", 1000,
|
||||
["Date", "==", 181, 7],
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}],
|
||||
["DeleteEvent"]
|
||||
],
|
||||
[
|
||||
"month", 1000,
|
||||
["Date", "==", 182, 1],
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}],
|
||||
["DeleteEvent"]
|
||||
],
|
||||
[
|
||||
"month", 1000,
|
||||
["Date", "==", 182, 7],
|
||||
["ChangeCity", "all", {
|
||||
"trade":100
|
||||
}],
|
||||
["DeleteEvent"]
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -11,9 +11,6 @@
|
||||
"history": [
|
||||
"<C>●</>180년 1월:<L><b>【이벤트】</b></>병기로 싸운다! 최고의 충차 지휘관을 가린다"
|
||||
],
|
||||
"const": {
|
||||
"npcBanMessageProb":1
|
||||
},
|
||||
"initialEvents":[
|
||||
[
|
||||
true,
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
],
|
||||
"const": {
|
||||
"expandCityDefaultCost": 30000,
|
||||
"expandCityCostCoef": 250,
|
||||
"npcBanMessageProb":1
|
||||
"expandCityCostCoef": 250
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,6 @@
|
||||
],
|
||||
"const": {
|
||||
"joinRuinedNPCProp":0,
|
||||
"npcBanMessageProb":1,
|
||||
"availableSpecialWar":[
|
||||
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
|
||||
"che_보병", "che_궁병", "che_기병", "che_공성",
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
"history": [
|
||||
"<C>●</>180년 1월:<L><b>【이벤트】</b></>29기까지 내로라 하는 모든 장수들이 모였다!"
|
||||
],
|
||||
"const": {
|
||||
"npcBanMessageProb":1
|
||||
},
|
||||
"events": [
|
||||
[
|
||||
"month", 1000,
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
],
|
||||
"const": {
|
||||
"joinRuinedNPCProp":0,
|
||||
"npcBanMessageProb":1,
|
||||
"availableGeneralCommand": {
|
||||
"": [
|
||||
"휴식",
|
||||
|
||||
+4
-4
@@ -318,7 +318,7 @@ CREATE TABLE IF NOT EXISTS `ng_old_nations` (
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX `server_id` (`server_id`, `nation`)
|
||||
)
|
||||
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
|
||||
ENGINE=Aria DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `ng_old_generals` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
@@ -334,7 +334,7 @@ CREATE TABLE IF NOT EXISTS `ng_old_generals` (
|
||||
INDEX `by_name` (`server_id`, `name`),
|
||||
INDEX `owner` (`owner`, `server_id`)
|
||||
)
|
||||
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
|
||||
ENGINE=Aria DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `emperior` (
|
||||
`no` INT(6) NOT NULL AUTO_INCREMENT,
|
||||
@@ -380,7 +380,7 @@ CREATE TABLE IF NOT EXISTS `emperior` (
|
||||
`history` MEDIUMTEXT NULL DEFAULT '{}' CHECK (json_valid(`aux`)),
|
||||
`aux` MEDIUMTEXT NULL DEFAULT '{}' CHECK (json_valid(`aux`)),
|
||||
PRIMARY KEY (`no`)
|
||||
) ENGINE=Aria DEFAULT CHARSET=utf8mb4;
|
||||
) ENGINE=Aria ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
###########################################################################
|
||||
## 외교 테이블
|
||||
@@ -482,7 +482,7 @@ CREATE TABLE `statistic` (
|
||||
`aux` TEXT NULL DEFAULT NULL CHECK (json_valid(`aux`)),
|
||||
PRIMARY KEY (`no`)
|
||||
)
|
||||
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
|
||||
ENGINE=Aria ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
###########################################################################
|
||||
## 연감 테이블
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
import { assert } from 'chai';
|
||||
|
||||
describe('hello', ()=>{
|
||||
it('hello1', ()=>{
|
||||
assert.equal(2, 1+1);
|
||||
});
|
||||
});
|
||||
@@ -1,370 +0,0 @@
|
||||
import chai, { assert } from 'chai';
|
||||
import chaiBytes from 'chai-bytes';
|
||||
import { bufferByteSize, LiteHashDRBG } from '../ts/util/LiteHashDRBG';
|
||||
import { RandUtil } from '../ts/util/RandUtil';
|
||||
import { convertBytesLikeToArrayBuffer } from '../ts/util/convertBytesLikeToArrayBuffer';
|
||||
import { convertBytesLikeToUint8Array as toBytes } from '../ts/util/convertBytesLikeToUint8Array';
|
||||
import _ from 'lodash';
|
||||
|
||||
chai.use(chaiBytes);
|
||||
|
||||
type Bytes = ArrayBuffer | DataView | Uint8Array;
|
||||
type MaybeBytes = Bytes | string;
|
||||
|
||||
function fillBlock(body: MaybeBytes, filler: MaybeBytes = '\0', length = bufferByteSize): Uint8Array {
|
||||
const u8Body = toBytes(body);
|
||||
const u8Filler = toBytes(filler, false);
|
||||
|
||||
if (u8Filler.byteLength < 1) {
|
||||
throw new Error('filler must have length');
|
||||
}
|
||||
|
||||
const buffer = new Uint8Array(length);
|
||||
buffer.set(u8Body, 0);
|
||||
let bufferIdx = u8Body.byteLength;
|
||||
|
||||
while (bufferIdx + u8Filler.byteLength < length) {
|
||||
buffer.set(u8Filler, bufferIdx);
|
||||
bufferIdx += u8Filler.byteLength;
|
||||
}
|
||||
|
||||
if (bufferIdx < length) {
|
||||
const slice = new Uint8Array(u8Filler.buffer, u8Filler.byteOffset, length - bufferIdx);
|
||||
buffer.set(slice, bufferIdx);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
class DummyBlockRNG extends LiteHashDRBG {
|
||||
private repeatBlockCnt: number;
|
||||
private repeatBlock: ArrayBuffer[];
|
||||
|
||||
public constructor(repeatBlock: MaybeBytes[], stateIdx = 0) {
|
||||
super('x');
|
||||
|
||||
this.repeatBlock = [];
|
||||
for (const rawBlock of repeatBlock) {
|
||||
const block = convertBytesLikeToArrayBuffer(rawBlock);
|
||||
if (block.byteLength !== bufferByteSize) {
|
||||
throw new Error;
|
||||
}
|
||||
this.repeatBlock.push(block);
|
||||
}
|
||||
this.repeatBlockCnt = this.repeatBlock.length;
|
||||
this.stateIdx = stateIdx;
|
||||
this.bufferIdx = 0;
|
||||
this.genNextBlock();
|
||||
}
|
||||
|
||||
protected genNextBlock() {
|
||||
if (!this.repeatBlock) {
|
||||
return;
|
||||
}
|
||||
this.buffer = this.repeatBlock[this.stateIdx];
|
||||
this.bufferIdx = 0;
|
||||
this.stateIdx = (this.stateIdx + 1) % this.repeatBlockCnt;
|
||||
}
|
||||
}
|
||||
|
||||
const fixedKey = 'HelloWorld';
|
||||
|
||||
|
||||
describe('RNGtestDummy', () => {
|
||||
const rng = new DummyBlockRNG([
|
||||
fillBlock('', "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff")
|
||||
]);
|
||||
|
||||
it('BasicConvert', () => {
|
||||
assert.equal(toBytes("\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff", false).length, 16);
|
||||
});
|
||||
it('SimpleByte', () => {
|
||||
assert.equalBytes(toBytes("\x00", false), rng.nextBytes(1), 'b1');
|
||||
assert.equalBytes(toBytes("\x11\x22", false), rng.nextBytes(2), 'b2');
|
||||
assert.equalBytes(toBytes("\x33\x44\x55", false), rng.nextBytes(3), 'b3');
|
||||
assert.equalBytes(toBytes("\x66\x77\x88\x99", false), rng.nextBytes(4), 'b4');
|
||||
});
|
||||
|
||||
it('OverflowBlock', () => {
|
||||
for (const idx in _.range(16)) {
|
||||
assert.equalBytes(
|
||||
toBytes("\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", false),
|
||||
rng.nextBytes(16)
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it('MultiBlock', () => {
|
||||
assert.equalBytes(
|
||||
fillBlock('', "\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", bufferByteSize * 2),
|
||||
rng.nextBytes(bufferByteSize * 2)
|
||||
);
|
||||
});
|
||||
|
||||
it('bitTest', () => {
|
||||
assert.equalBytes(toBytes("\x00", false), rng.nextBits(1)); //aa
|
||||
assert.equalBytes(toBytes("\x01", false), rng.nextBits(1)); //bb
|
||||
assert.equalBytes(toBytes("\xcc", false), rng.nextBits(8)); //cc
|
||||
assert.equalBytes(toBytes("\xdd\x02", false), rng.nextBits(10)); //ddee
|
||||
assert.equalBytes(toBytes("\x7f", false), rng.nextBits(7)); //ff
|
||||
assert.equalBytes(toBytes("\x00\x11\x22\x33\x44\x55\x06", false), rng.nextBits(53));
|
||||
});
|
||||
|
||||
it('int', () => {
|
||||
assert.equal(0x77, rng.nextInt(0xff));
|
||||
assert.equal(0x9988, rng.nextInt((1 << 16) - 1));
|
||||
assert.equal(0xddccbbaa, rng.nextInt(0xffffffff));
|
||||
assert.equal(0x0433221100ffee, rng.nextInt());
|
||||
assert.equal(0x05, rng.nextInt(0x0f)); //55
|
||||
assert.equal(0x06, rng.nextInt(0x12)); //66
|
||||
assert.equal(0x08, rng.nextInt(99)); //77(119 -> 7bit) -> 88(136 -> 8bit -> 8)
|
||||
assert.equal(0x99, rng.nextInt(0x99)); //99
|
||||
assert.equal(0xaa, rng.nextInt(0xaa)); //aa (fit Max)
|
||||
});
|
||||
|
||||
it('float', () => {
|
||||
const floatMax = 2 ** 53;
|
||||
const fa = rng.nextFloat1();
|
||||
assert.equal(0x1100ffeeddccbb / floatMax, fa);
|
||||
assert.isTrue(0.5313720384 > fa);
|
||||
assert.isTrue(0.5313720383 < fa);
|
||||
const fb = rng.nextFloat1();
|
||||
assert.equal(0x08776655443322 / floatMax, fb);
|
||||
});
|
||||
});
|
||||
|
||||
describe('RandUtilDummy', () => {
|
||||
it('shuffle', () => {
|
||||
const rng = new DummyBlockRNG([fillBlock('', '\x17\x16\x15\x14\x13\x12\x11\x10')]);
|
||||
const randUtil = new RandUtil(rng);
|
||||
/**
|
||||
* 7, [7,1,2,3,4,5,6,0]
|
||||
* 6, [7,0,2,3,4,5,6,1]
|
||||
* 5, [7,0,1,3,4,5,6,2]
|
||||
* 4, [7,0,1,2,4,5,6,3]
|
||||
* 3, [7,0,1,2,3,5,6,4]
|
||||
* 2, [7,0,1,2,3,4,6,5]
|
||||
* 1, [7,0,1,2,3,4,5,6]
|
||||
*/
|
||||
assert.deepEqual(
|
||||
randUtil.shuffle(Array.from(_.range(8))),
|
||||
[7, 0, 1, 2, 3, 4, 5, 6]
|
||||
);
|
||||
|
||||
/**
|
||||
* 0, [0,1,2,3,4,5,6,7,8,9]
|
||||
* 7, [0,8,2,3,4,5,6,7,1,9]
|
||||
* 6, [0,8,1,3,4,5,6,7,2,9]
|
||||
* 5, [0,8,1,2,4,5,6,7,3,9]
|
||||
* 4, [0,8,1,2,3,5,6,7,4,9]
|
||||
* 3, [0,8,1,2,3,4,6,7,5,9]
|
||||
* 2, [0,8,1,2,3,4,5,7,6,9]
|
||||
* 1, [0,8,1,2,3,4,5,6,7,9]
|
||||
* 0, [0,8,1,2,3,4,5,6,7,9]
|
||||
*/
|
||||
assert.deepEqual(
|
||||
randUtil.shuffle(Array.from(_.range(10))),
|
||||
[0, 8, 1, 2, 3, 4, 5, 6, 7, 9]
|
||||
);
|
||||
});
|
||||
|
||||
const rng = new DummyBlockRNG([fillBlock('', '\x17\x16\x15\x14\x13\x12\x11\x10')]);
|
||||
const randUtil = new RandUtil(rng);
|
||||
it('choice', () => {
|
||||
|
||||
|
||||
//0x17(7), 0x16(6)
|
||||
assert.equal(randUtil.choice([0, 1, 2, 3, 4, 5]), 5);
|
||||
|
||||
//0x15(5), Set 순서 유지
|
||||
assert.equal(randUtil.choice(new Set([5, 3, 1, 2, 8, 0])), 8);
|
||||
|
||||
//0x14(4), 정렬 순서상 숫자(소-대) > 문자열(삽입순) > 심볼 순서
|
||||
assert.equal(randUtil.choice({ c: 'c', a: 'a', b: 'b', 4: 'x', 2: 't', '3': 'q' }), 'c');
|
||||
|
||||
});
|
||||
|
||||
it('choiceUsingWeight', () => {
|
||||
//0.6275740099377194 * 38.1 = 23.91
|
||||
assert.equal(randUtil.choiceUsingWeight({
|
||||
a: 0.1,
|
||||
b: 10,
|
||||
tt: 2,
|
||||
x: -1,
|
||||
c: 20,
|
||||
d: 0,
|
||||
e: 6
|
||||
}), 'c');
|
||||
|
||||
//0.658946544056166
|
||||
assert.equal(randUtil.choiceUsingWeightPair([
|
||||
['xx', 10],
|
||||
]), 'xx');
|
||||
|
||||
//0.6903152783785083 * 27.3 = 18.84560709973328
|
||||
assert.equal(randUtil.choiceUsingWeightPair([
|
||||
['e', 10],
|
||||
['d', 4],
|
||||
['c', 0.1],
|
||||
['baba', 0.2],
|
||||
['q', 9],
|
||||
['xt', 4]
|
||||
]), 'q');
|
||||
});
|
||||
});
|
||||
|
||||
describe('RNGexpectedError', () => {
|
||||
const rng = new LiteHashDRBG(fixedKey);
|
||||
it('nextBits0', () => {
|
||||
assert.throw(() => rng.nextBits(0));
|
||||
});
|
||||
it('nextBits-1', () => {
|
||||
assert.throw(() => rng.nextBits(-1));
|
||||
});
|
||||
|
||||
it('nextBytes0', () => {
|
||||
assert.throw(() => rng.nextBytes(0));
|
||||
});
|
||||
it('nextBytes-1', () => {
|
||||
assert.throw(() => rng.nextBytes(-1));
|
||||
});
|
||||
|
||||
const randUtil = new RandUtil(rng);
|
||||
it('utilEmptyChoice', () => {
|
||||
assert.throw(() => randUtil.choice([]));
|
||||
});
|
||||
it('utilEmptyChoiceUsingWeight', () => {
|
||||
assert.throw(() => randUtil.choiceUsingWeight({}));
|
||||
});
|
||||
it('utilEmptyChoiceUsingWeightPair', () => {
|
||||
assert.throw(() => randUtil.choiceUsingWeightPair([]));
|
||||
});
|
||||
});
|
||||
|
||||
describe('RNGAcceptable', () => {
|
||||
const rng = new LiteHashDRBG(fixedKey);
|
||||
it('RNG', () => {
|
||||
rng.nextInt(0);
|
||||
rng.nextInt(2 ** 53 - 1);
|
||||
rng.nextBytes(65);
|
||||
rng.nextBits(512);
|
||||
});
|
||||
|
||||
const randUtil = new RandUtil(rng);
|
||||
it('RandUtil', () => {
|
||||
randUtil.choice([0, 0, 0]);
|
||||
randUtil.choiceUsingWeight({
|
||||
0: 0,
|
||||
1: -1
|
||||
});
|
||||
randUtil.choiceUsingWeightPair([
|
||||
[0, 0],
|
||||
[1, 0],
|
||||
[2, -2]
|
||||
]);
|
||||
randUtil.nextBool(1.1);
|
||||
randUtil.nextBool(-0.1);
|
||||
randUtil.shuffle([]);
|
||||
randUtil.shuffle([1]);
|
||||
randUtil.nextRange(0, 0);
|
||||
randUtil.nextRangeInt(0, 0);
|
||||
randUtil.nextRange(1, -1);
|
||||
randUtil.nextRangeInt(1, -1);
|
||||
})
|
||||
|
||||
it('RNGLong', () => {
|
||||
const longKey = fixedKey;
|
||||
for(const _a of _.range(8)){
|
||||
longKey.concat(longKey);
|
||||
}
|
||||
const rngLong = new LiteHashDRBG(longKey);
|
||||
for(const _a of _.range(10)){
|
||||
rngLong.nextBytes(16);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
/* Python TestVector
|
||||
import hashlib
|
||||
import struct
|
||||
|
||||
fixedKey = 'HelloWorld'.encode('utf-8')
|
||||
|
||||
def hash(key, idx):
|
||||
idxV = struct.pack("<I", idx)
|
||||
return hashlib.sha512(key + idxV).digest()
|
||||
|
||||
for idx in range(5):
|
||||
print(hash(fixedKey, idx).hex())
|
||||
*/
|
||||
describe('RNG', () => {
|
||||
|
||||
//JS - PHP 일치 확인 정도로.
|
||||
|
||||
const testVector = Buffer.from([
|
||||
'24d9ccd648556255fd0ee9f5b29918de90617341958b3b354d572167e4dee02b757816a2bbe0b502c52413ffd384381a9d7b4e193df6f4345d6a95e111d661c4',
|
||||
'2e9264512f6f4b080cf1376b74fab6878ecf4a6e185942d2e5b22cf923885b9952d40601a414225d6901417fd4ce9368ac77e4a63d3fc9b58ab952bb8c33f165',
|
||||
'8e2ebf5af6283a1b18f4c044c86c20d02be3890613c4cc8b7c6b7b35581263b972a82630df69a9289988422d7c3a9be5edf78d5de16fabd01e5dd4e458068d8a',
|
||||
'398596047ba547bfe371ec863a3e019ab0dbc4bb3b27e9077685aae4283ff6bbccfd981d92f9358f7efffbb72a940414802d98466d132e2ad0a16a12946d5f47',
|
||||
'b3606fe9b18c4aa7315e78bb9e47cb51cc4e203fcc2e631f0405c1b872c8e1cb5b6415ea74bbb77fffaaadb002b47cb4f4628dc0709634365b187667f5c708cb',
|
||||
].join(''), 'hex');
|
||||
|
||||
it('bytes', ()=>{
|
||||
const rng = new LiteHashDRBG(fixedKey);
|
||||
|
||||
let offset = 0;
|
||||
assert.equalBytes(rng.nextBytes(10), testVector.slice(offset, offset + 10), '1');
|
||||
offset += 10;
|
||||
assert.equalBytes(rng.nextBytes(32), testVector.slice(offset, offset + 32), '2');
|
||||
offset += 32;
|
||||
assert.equalBytes(rng.nextBytes(1), testVector.slice(offset, offset + 1), '3');
|
||||
offset += 1;
|
||||
assert.equalBytes(rng.nextBytes(64), testVector.slice(offset, offset + 64), '4');
|
||||
offset += 64;
|
||||
assert.equalBytes(rng.nextBytes(5), testVector.slice(offset, offset + 5), '5');
|
||||
offset += 5;
|
||||
|
||||
const lastA = rng.nextBytes(16, 18);
|
||||
const lastB = new Uint8Array(18);
|
||||
lastB.set(testVector.slice(offset, offset + 16));
|
||||
assert.equalBytes(lastA, lastB);
|
||||
});
|
||||
|
||||
it('bits', ()=>{
|
||||
const rng = new LiteHashDRBG(fixedKey);
|
||||
|
||||
let offset = 0;
|
||||
|
||||
const testBits = [10, 4, 15, 32, 7, 99, 512, 1, 2, 3];
|
||||
|
||||
for(const bits of testBits){
|
||||
const bytes = Math.ceil(bits / 8)
|
||||
const A = rng.nextBits(bits);
|
||||
const B = new Uint8Array(testVector.slice(offset, offset + bytes));
|
||||
offset += bytes;
|
||||
|
||||
if(bits % 8 != 0){
|
||||
const bitMask = 0xff >> (8 - (bits % 8));
|
||||
B[bytes - 1] &= bitMask;
|
||||
}
|
||||
assert.equalBytes(A, B);
|
||||
}
|
||||
});
|
||||
|
||||
it('float', ()=>{
|
||||
const rng = new LiteHashDRBG(fixedKey);
|
||||
const rng2 = new DummyBlockRNG([
|
||||
new Uint8Array(testVector.slice(bufferByteSize * 0, bufferByteSize * 1)),
|
||||
new Uint8Array(testVector.slice(bufferByteSize * 1, bufferByteSize * 2)),
|
||||
new Uint8Array(testVector.slice(bufferByteSize * 2, bufferByteSize * 3)),
|
||||
new Uint8Array(testVector.slice(bufferByteSize * 3, bufferByteSize * 4)),
|
||||
new Uint8Array(testVector.slice(bufferByteSize * 4, bufferByteSize * 5)),
|
||||
]);
|
||||
|
||||
for(const idx of _.range(18)){
|
||||
assert.equal(rng.nextFloat1(), rng2.nextFloat1(), `float${idx}`);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
@@ -260,7 +260,7 @@ function setupAdminForm() {
|
||||
}
|
||||
},
|
||||
}
|
||||
const validator = new JQValidateForm($('#admin_form'), descriptor);
|
||||
const validator = new JQValidateForm($('#db_form'), descriptor);
|
||||
validator.installChangeHandler();
|
||||
|
||||
$('#admin_form').on('submit', async function (e) {
|
||||
@@ -278,7 +278,7 @@ function setupAdminForm() {
|
||||
let result: InvalidResponse;
|
||||
try {
|
||||
const response = await axios({
|
||||
url: 'j_create_admin.php',
|
||||
url: 'j_setup_db.php',
|
||||
method: 'post',
|
||||
responseType: 'json',
|
||||
data: convertFormData({
|
||||
@@ -299,7 +299,7 @@ function setupAdminForm() {
|
||||
return;
|
||||
}
|
||||
|
||||
alert('관리자 계정이 생성되었습니다.');
|
||||
alert('RootDB.php가 생성되었습니다. 관리자 계정 생성을 진행합니다.');
|
||||
await changeInstallMode();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
export type Bytes = ArrayBuffer | DataView | Uint8Array;
|
||||
export type BytesLike = Bytes | string;
|
||||
@@ -1,232 +0,0 @@
|
||||
import { RNG } from "./RNG";
|
||||
|
||||
import { sha512 } from 'js-sha512';
|
||||
|
||||
import { convertBytesLikeToUint8Array } from "./convertBytesLikeToUint8Array";
|
||||
import { BytesLike } from "./BytesLike";
|
||||
|
||||
const maxRngSupportBit = 53;
|
||||
const maxInt = 0x1f_ffff_ffff_ffff; // NOTE: b 0, 10000110011, 11...11
|
||||
const maxIntMore1 = 0x20_0000_0000_0000n; //NOTE: b 0, 10000110100, 00...00
|
||||
const maxIntMore1f = Number(maxIntMore1);
|
||||
export const bufferByteSize = 512 / 8; //SHA512
|
||||
|
||||
const intBitMapMask = new Map([
|
||||
[0x1n, 1],
|
||||
[0x3n, 2],
|
||||
[0x7n, 3],
|
||||
[0xfn, 4],
|
||||
[0x1fn, 5],
|
||||
[0x3fn, 6],
|
||||
[0x7fn, 7],
|
||||
[0xffn, 8],
|
||||
[0x1ffn, 9],
|
||||
[0x3ffn, 10],
|
||||
[0x7ffn, 11],
|
||||
[0xfffn, 12],
|
||||
[0x1fffn, 13],
|
||||
[0x3fffn, 14],
|
||||
[0x7fffn, 15],
|
||||
[0xffffn, 16],
|
||||
[0x1ffffn, 17],
|
||||
[0x3ffffn, 18],
|
||||
[0x7ffffn, 19],
|
||||
[0xfffffn, 20],
|
||||
[0x1fffffn, 21],
|
||||
[0x3fffffn, 22],
|
||||
[0x7fffffn, 23],
|
||||
[0xffffffn, 24],
|
||||
[0x1ffffffn, 25],
|
||||
[0x3ffffffn, 26],
|
||||
[0x7ffffffn, 27],
|
||||
[0xfffffffn, 28],
|
||||
[0x1fffffffn, 29],
|
||||
[0x3fffffffn, 30],
|
||||
[0x7fffffffn, 31],
|
||||
[0xffffffffn, 32],
|
||||
[0x1ffffffffn, 33],
|
||||
[0x3ffffffffn, 34],
|
||||
[0x7ffffffffn, 35],
|
||||
[0xfffffffffn, 36],
|
||||
[0x1fffffffffn, 37],
|
||||
[0x3fffffffffn, 38],
|
||||
[0x7fffffffffn, 39],
|
||||
[0xffffffffffn, 40],
|
||||
[0x1ffffffffffn, 41],
|
||||
[0x3ffffffffffn, 42],
|
||||
[0x7ffffffffffn, 43],
|
||||
[0xfffffffffffn, 44],
|
||||
[0x1fffffffffffn, 45],
|
||||
[0x3fffffffffffn, 46],
|
||||
[0x7fffffffffffn, 47],
|
||||
[0xffffffffffffn, 48],
|
||||
[0x1ffffffffffffn, 49],
|
||||
[0x3ffffffffffffn, 50],
|
||||
[0x7ffffffffffffn, 51],
|
||||
[0xfffffffffffffn, 52],
|
||||
[0x1fffffffffffffn, 53],
|
||||
]);
|
||||
|
||||
function calcBitMask(n: bigint): bigint {
|
||||
n |= n >> 1n;
|
||||
n |= n >> 2n;
|
||||
n |= n >> 4n;
|
||||
n |= n >> 8n;
|
||||
n |= n >> 16n;
|
||||
n |= n >> 32n;
|
||||
|
||||
return n;
|
||||
}
|
||||
export class LiteHashDRBG implements RNG {
|
||||
|
||||
protected buffer!: ArrayBuffer;
|
||||
protected bufferIdx!: number;
|
||||
protected hq: DataView;
|
||||
protected hqIdxPos: number;
|
||||
|
||||
public constructor(protected seed: BytesLike, protected stateIdx = 0, bufferIdx = 0) {
|
||||
if(bufferIdx < 0){
|
||||
throw new Error(`bufferIdx ${bufferIdx} < 0`);
|
||||
}
|
||||
if(bufferIdx >= bufferByteSize){
|
||||
throw new Error(`bufferidx ${bufferIdx} >= ${bufferByteSize}`);
|
||||
}
|
||||
if(stateIdx < 0){
|
||||
throw new Error(`stateIdx ${stateIdx} < 0`);
|
||||
}
|
||||
|
||||
const seedU8 = convertBytesLikeToUint8Array(seed);
|
||||
const hqBuffer = new ArrayBuffer(seedU8.byteLength + 4);
|
||||
const hqU8 = new Uint8Array(hqBuffer);
|
||||
|
||||
hqU8.set(seedU8, 0);
|
||||
this.hq = new DataView(hqBuffer);
|
||||
this.hqIdxPos = seedU8.byteLength;
|
||||
|
||||
this.genNextBlock();
|
||||
this.bufferIdx = bufferIdx;
|
||||
}
|
||||
|
||||
protected genNextBlock(): void {
|
||||
this.hq.setUint32(this.hqIdxPos, this.stateIdx, true);
|
||||
const digest = sha512.arrayBuffer(this.hq.buffer);
|
||||
this.buffer = digest;
|
||||
this.bufferIdx = 0;
|
||||
this.stateIdx += 1;
|
||||
}
|
||||
|
||||
public getMaxInt(): number {
|
||||
return maxInt;
|
||||
}
|
||||
|
||||
public nextBytes(bytes: number, baseBytes?: number): Uint8Array {
|
||||
bytes |= 0;
|
||||
if (bytes <= 0) {
|
||||
throw new Error(`${bytes} <= 0`);
|
||||
}
|
||||
|
||||
if (this.bufferIdx + bytes <= bufferByteSize) {
|
||||
if(baseBytes === undefined || bytes >= baseBytes){
|
||||
const result = this.buffer.slice(this.bufferIdx, this.bufferIdx + bytes);
|
||||
this.bufferIdx += bytes;
|
||||
if (this.bufferIdx === bufferByteSize) {
|
||||
this.genNextBlock();
|
||||
}
|
||||
return new Uint8Array(result);
|
||||
}
|
||||
|
||||
const resultBuffer = new ArrayBuffer(Math.max(bytes, baseBytes));
|
||||
const result = new Uint8Array(resultBuffer);
|
||||
result.set(new Uint8Array(this.buffer, this.bufferIdx, bytes));
|
||||
this.bufferIdx += bytes;
|
||||
if( this.bufferIdx === bufferByteSize){
|
||||
this.genNextBlock();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
const resultBuffer = new ArrayBuffer(baseBytes ? Math.max(bytes, baseBytes) : bytes);
|
||||
const result = new Uint8Array(resultBuffer);
|
||||
|
||||
result.set(new Uint8Array(this.buffer, this.bufferIdx));
|
||||
let offset = bufferByteSize - this.bufferIdx;
|
||||
let remain = bytes - offset;
|
||||
|
||||
while (remain > bufferByteSize) {
|
||||
this.genNextBlock();
|
||||
result.set(new Uint8Array(this.buffer), offset);
|
||||
offset += bufferByteSize;
|
||||
remain -= bufferByteSize;
|
||||
}
|
||||
|
||||
this.genNextBlock();
|
||||
if (remain === 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result.set(new Uint8Array(this.buffer, 0, remain), offset);
|
||||
this.bufferIdx = remain;
|
||||
return result;
|
||||
}
|
||||
|
||||
public nextBits(bits: number, baseBytes?: number): Uint8Array {
|
||||
bits |= 0;
|
||||
const bytes = (bits + 7) >> 3;
|
||||
const headBits = bits & 0x7;
|
||||
|
||||
const result = this.nextBytes(bytes, baseBytes);
|
||||
if (headBits === 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result[bytes - 1] &= 0xff >> (8 - headBits);
|
||||
return result;
|
||||
}
|
||||
|
||||
protected _nextInt(bits: number): bigint{
|
||||
const buffer = this.nextBits(bits, 8);
|
||||
const dataView = new DataView(buffer.buffer);
|
||||
return dataView.getBigUint64(0, true);
|
||||
}
|
||||
|
||||
public nextInt(max?: number): number {
|
||||
if (max === undefined || max === maxInt) {
|
||||
return Number(this._nextInt(maxRngSupportBit));
|
||||
}
|
||||
if (max > maxInt) {
|
||||
throw new Error('Over max int');
|
||||
}
|
||||
if (max === 0) {
|
||||
return 0;
|
||||
}
|
||||
if (max < 0) {
|
||||
return -this.nextInt(-max);
|
||||
}
|
||||
|
||||
const mask = calcBitMask(BigInt(max));
|
||||
const bits = intBitMapMask.get(mask) as number;
|
||||
|
||||
let n = Number(this._nextInt(bits));
|
||||
while (n > max){
|
||||
n = Number(this._nextInt(bits));
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
public nextFloat1(): number {
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while(true){
|
||||
const nInt = this._nextInt(maxRngSupportBit + 1);
|
||||
if(nInt < maxIntMore1){
|
||||
return Number(nInt) / maxIntMore1f;
|
||||
}
|
||||
if(nInt === maxIntMore1){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static build(seed: BytesLike, stateIdx = 0): LiteHashDRBG{
|
||||
return new LiteHashDRBG(seed, stateIdx);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
export interface RNG {
|
||||
|
||||
/**
|
||||
* nextInt()가 반환 가능한 최대값
|
||||
*/
|
||||
getMaxInt(): number;
|
||||
|
||||
nextBytes(bytes: number): Uint8Array;
|
||||
nextBits(bits: number): Uint8Array;
|
||||
|
||||
nextInt(max?: number): number;
|
||||
nextFloat1(): number;
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
import { RNG } from './RNG';
|
||||
|
||||
export class RandUtil {
|
||||
constructor(protected rng: RNG) {
|
||||
|
||||
}
|
||||
|
||||
public nextFloat1(): number {
|
||||
return this.rng.nextFloat1();
|
||||
}
|
||||
|
||||
public nextRange(min: number, max: number): number {
|
||||
const range = max - min;
|
||||
return this.nextFloat1() * (range) + min;
|
||||
}
|
||||
|
||||
public nextRangeInt(min: number, max: number): number {
|
||||
const range = max - min;
|
||||
return this.rng.nextInt(range) + min;
|
||||
}
|
||||
|
||||
public nextInt(max?: number): number {
|
||||
return this.rng.nextInt(max);
|
||||
}
|
||||
|
||||
public nextBit(): boolean {
|
||||
const view = new DataView(this.rng.nextBits(1));
|
||||
return view.getUint8(0) != 0;
|
||||
}
|
||||
|
||||
public nextBool(prob = 0.5): boolean {
|
||||
if (prob >= 1) {
|
||||
return true;
|
||||
}
|
||||
return this.nextFloat1() < prob;
|
||||
}
|
||||
|
||||
public shuffle<T>(srcArray: T[]): T[] {
|
||||
const cnt = srcArray.length;
|
||||
if(cnt === 0){
|
||||
return [];
|
||||
}
|
||||
if (cnt > this.rng.getMaxInt()) {
|
||||
throw 'Invalid random int range';
|
||||
}
|
||||
|
||||
const result: T[] = Array.from(srcArray);
|
||||
for (let srcIdx = 0; srcIdx < cnt; srcIdx += 1) {
|
||||
const destIdx = this.rng.nextInt(cnt - srcIdx - 1) + srcIdx;
|
||||
if(srcIdx === destIdx){
|
||||
continue;
|
||||
}
|
||||
[result[srcIdx], result[destIdx]] = [result[destIdx], result[srcIdx]];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//Object는 integer key에 예외가 있어 shuffleAssoc은 없음
|
||||
|
||||
public choice<T>(items: T[] | Record<string | number, T> | Set<T>): T {
|
||||
if (items instanceof Array) {
|
||||
if(items.length === 0){
|
||||
throw new Error('Empty items');
|
||||
}
|
||||
const idx = this.rng.nextInt(items.length - 1);
|
||||
return items[idx];
|
||||
}
|
||||
|
||||
if (items instanceof Set) {
|
||||
return this.choice(Array.from(items.values()));
|
||||
}
|
||||
|
||||
return items[this.choice(Array.from(Object.keys(items)))];
|
||||
}
|
||||
|
||||
public choiceUsingWeight(items: Record<string | number, number>): string | number {
|
||||
if(Object.keys(items).length === 0){
|
||||
throw new Error('Empty items');
|
||||
}
|
||||
let sum = 0;
|
||||
for (const value of Object.values(items)) {
|
||||
if (value <= 0) {
|
||||
continue;
|
||||
}
|
||||
sum += value;
|
||||
}
|
||||
|
||||
let rd = this.nextFloat1() * sum;
|
||||
|
||||
for (const [item, value] of Object.entries(items)) {
|
||||
if (value <= 0) {
|
||||
if (rd <= 0) {
|
||||
return item;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rd <= value) {
|
||||
return item;
|
||||
}
|
||||
rd -= value;
|
||||
}
|
||||
|
||||
throw new Error('Unreacheable');
|
||||
}
|
||||
|
||||
public choiceUsingWeightPair<T>(items: [T, number][]): T {
|
||||
if(items.length === 0){
|
||||
throw new Error('Empty items');
|
||||
}
|
||||
let sum = 0;
|
||||
for (const [, value] of items) {
|
||||
if (value <= 0) {
|
||||
continue;
|
||||
}
|
||||
sum += value;
|
||||
}
|
||||
|
||||
let rd = this.nextFloat1() * sum;
|
||||
|
||||
for (const [item, value] of items) {
|
||||
if (value <= 0) {
|
||||
if (rd <= 0) {
|
||||
return item;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rd <= value) {
|
||||
return item;
|
||||
}
|
||||
rd -= value;
|
||||
}
|
||||
|
||||
throw new Error('Unreacheable');
|
||||
}
|
||||
}
|
||||
@@ -16,10 +16,13 @@ export async function callSammoAPI<ResultType extends ValidResponse, ErrorType e
|
||||
}
|
||||
|
||||
const response = await axios({
|
||||
url: `api.php?path=${path}`,
|
||||
url: "api.php",
|
||||
method: "post",
|
||||
responseType: "json",
|
||||
data: args
|
||||
data: {
|
||||
path,
|
||||
args,
|
||||
},
|
||||
});
|
||||
const result: ErrorType | ResultType = response.data;
|
||||
if (!result.result) {
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
import { BytesLike } from "./BytesLike";
|
||||
|
||||
export function convertBytesLikeToArrayBuffer(data: BytesLike, encodeUTF8 = true): ArrayBuffer{
|
||||
if (data instanceof ArrayBuffer) {
|
||||
return data;
|
||||
}
|
||||
if (data instanceof Uint8Array) {
|
||||
return data.buffer;
|
||||
}
|
||||
if (typeof(data) === 'string'){
|
||||
if(encodeUTF8){
|
||||
return (new TextEncoder()).encode(data);
|
||||
}
|
||||
return new Uint8Array(data.split('').map(s=>s.codePointAt(0) as number));
|
||||
}
|
||||
return data.buffer;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
import { BytesLike } from "./BytesLike";
|
||||
|
||||
export function convertBytesLikeToUint8Array(data: BytesLike, encodeUTF8 = true): Uint8Array {
|
||||
if (data instanceof Uint8Array) {
|
||||
return data;
|
||||
}
|
||||
if (data instanceof ArrayBuffer) {
|
||||
return new Uint8Array(data);
|
||||
}
|
||||
if (typeof (data) === 'string') {
|
||||
if(encodeUTF8){
|
||||
return (new TextEncoder()).encode(data);
|
||||
}
|
||||
return new Uint8Array(data.split('').map(s=>s.codePointAt(0) as number));
|
||||
}
|
||||
return new Uint8Array(data.buffer);
|
||||
}
|
||||
@@ -2,10 +2,6 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
if (!file_exists(__DIR__ . '/vendor/autoload.php')){
|
||||
header('Location:install.php');
|
||||
die();
|
||||
}
|
||||
require(__DIR__ . '/vendor/autoload.php');
|
||||
|
||||
if (!class_exists('\\sammo\\RootDB')) {
|
||||
|
||||
+21
-106
@@ -3,88 +3,27 @@ namespace sammo;
|
||||
|
||||
set_time_limit(600);
|
||||
|
||||
|
||||
class Json
|
||||
{
|
||||
/** @return never */
|
||||
public static function die($value)
|
||||
{
|
||||
if (!headers_sent()) {
|
||||
header('Expires: Wed, 01 Jan 2014 00:00:00 GMT');
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header('Cache-Control: no-store, no-cache, must-revalidate');
|
||||
header('Cache-Control: post-check=0, pre-check=0', false);
|
||||
header('Pragma: no-cache');
|
||||
}
|
||||
|
||||
header('Content-Type: application/json');
|
||||
die(json_encode($value));
|
||||
}
|
||||
}
|
||||
|
||||
function tryComposerInstall()
|
||||
{
|
||||
$resultPath = 'composer_result.json.log';
|
||||
$lockPath = 'composer.lock';
|
||||
$runCode = "php composer.phar install";
|
||||
|
||||
$timestamp = time();
|
||||
if (file_exists($resultPath) && file_exists($lockPath)) {
|
||||
do {
|
||||
$result = json_decode(file_get_contents($resultPath));
|
||||
$oldJsonHash = $result->lockHash;
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
|
||||
if ($lockHash != $oldJsonHash) {
|
||||
break;
|
||||
}
|
||||
|
||||
//그것도 아니라면 업데이트하지 않겠다.
|
||||
return false;
|
||||
} while (0);
|
||||
}
|
||||
|
||||
exec($runCode, $output, $result_code);
|
||||
if ($result_code != 0) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => $output,
|
||||
'state' => 'composer',
|
||||
]);
|
||||
}
|
||||
|
||||
if (!file_exists($lockPath)){
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => "no lockfile: {$lockPath}"
|
||||
]);
|
||||
}
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
|
||||
|
||||
file_put_contents($resultPath, json_encode([
|
||||
'lockHash'=>$lockHash,
|
||||
'updateTimestamp'=>$timestamp,
|
||||
]));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function tryNpmInstall()
|
||||
{
|
||||
$resultPath = 'npm_recent.json.log';
|
||||
$lockPath = 'package-lock.json';
|
||||
$runCode = "npm ci";
|
||||
$runAltCode = "npm install";
|
||||
$npmResultPath = 'npm_recent.json.log';
|
||||
$packageJsonPath = 'package.json';
|
||||
$packageJsonLockPath = 'package-lock.json';
|
||||
|
||||
$packageJsonHash = hash_file('sha512', $packageJsonPath);
|
||||
$timestamp = time();
|
||||
if (file_exists($resultPath) && file_exists($lockPath)) {
|
||||
if (file_exists($npmResultPath) && file_exists($packageJsonLockPath)) {
|
||||
do {
|
||||
$result = json_decode(file_get_contents($resultPath));
|
||||
$oldJsonHash = $result->lockHash;
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
$result = json_decode(file_get_contents($npmResultPath));
|
||||
$oldJsonHash = $result->packageJsonHash;
|
||||
$oldTimestamp = $result->updateTimestamp;
|
||||
|
||||
if ($lockHash != $oldJsonHash) {
|
||||
//1. package.json 파일이 다르면 업데이트.
|
||||
if ($packageJsonHash != $oldJsonHash) {
|
||||
break;
|
||||
}
|
||||
|
||||
//2. package-lock.json 업데이트가 2주를 초과했다면 업데이트.
|
||||
if($oldTimestamp + 60*60*24*14 < $timestamp){
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -93,56 +32,32 @@ function tryNpmInstall()
|
||||
} while (0);
|
||||
}
|
||||
|
||||
if(file_exists($lockPath)){
|
||||
exec($runCode, $output, $result_code);
|
||||
}
|
||||
else{
|
||||
exec($runAltCode, $output, $result_code);
|
||||
}
|
||||
|
||||
exec("npm install", $output, $result_code);
|
||||
if ($result_code != 0) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => $output,
|
||||
'state' => 'npm ci',
|
||||
'reason' => $output
|
||||
]);
|
||||
}
|
||||
|
||||
if (!file_exists($lockPath)){
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => "no lockfile: {$lockPath}"
|
||||
]);
|
||||
}
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
|
||||
|
||||
file_put_contents($resultPath, json_encode([
|
||||
'lockHash'=>$lockHash,
|
||||
file_put_contents($npmResultPath, json_encode([
|
||||
'packageJsonHash'=>$packageJsonHash,
|
||||
'updateTimestamp'=>$timestamp,
|
||||
]));
|
||||
return true;
|
||||
}
|
||||
|
||||
function genJS()
|
||||
{
|
||||
$command = sprintf("./node_modules/.bin/webpack build --env target=gateway");
|
||||
$command = "./node_modules/.bin/webpack build";
|
||||
|
||||
exec(($command), $output, $result_code);
|
||||
if ($result_code != 0) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => $output,
|
||||
'state' => 'webpack build',
|
||||
'reason' => $output
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
if(tryComposerInstall()){
|
||||
header('location:install.php');
|
||||
die();
|
||||
}
|
||||
|
||||
if(tryNpmInstall()){
|
||||
genJS();
|
||||
}
|
||||
|
||||
+21
-79
@@ -66,68 +66,27 @@ function genJS($server)
|
||||
}
|
||||
}
|
||||
|
||||
function tryComposerInstall()
|
||||
{
|
||||
$resultPath = 'composer_result.json.log';
|
||||
$lockPath = 'composer.lock';
|
||||
$runCode = "php composer.phar install";
|
||||
|
||||
$timestamp = time();
|
||||
if (file_exists($resultPath) && file_exists($lockPath)) {
|
||||
do {
|
||||
$result = json_decode(file_get_contents($resultPath));
|
||||
$oldJsonHash = $result->lockHash;
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
|
||||
if ($lockHash != $oldJsonHash) {
|
||||
break;
|
||||
}
|
||||
|
||||
//그것도 아니라면 업데이트하지 않겠다.
|
||||
return false;
|
||||
} while (0);
|
||||
}
|
||||
|
||||
exec($runCode, $output, $result_code);
|
||||
if ($result_code != 0) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => $output
|
||||
]);
|
||||
}
|
||||
|
||||
if (!file_exists($lockPath)){
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => "no lockfile: {$lockPath}"
|
||||
]);
|
||||
}
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
|
||||
|
||||
file_put_contents($resultPath, json_encode([
|
||||
'lockHash'=>$lockHash,
|
||||
'updateTimestamp'=>$timestamp,
|
||||
]));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function tryNpmInstall()
|
||||
{
|
||||
$resultPath = 'npm_recent.json.log';
|
||||
$lockPath = 'package-lock.json';
|
||||
$runCode = "npm ci";
|
||||
$runAltCode = "npm install";
|
||||
$npmResultPath = './npm_recent.json.log';
|
||||
$packageJsonPath = './package.json';
|
||||
$packageJsonLockPath = './package-lock.json';
|
||||
|
||||
$packageJsonHash = hash_file('sha512', $packageJsonPath);
|
||||
$timestamp = time();
|
||||
if (file_exists($resultPath) && file_exists($lockPath)) {
|
||||
if (file_exists($npmResultPath) && file_exists($packageJsonLockPath)) {
|
||||
do {
|
||||
$result = json_decode(file_get_contents($resultPath));
|
||||
$oldJsonHash = $result->lockHash;
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
$result = json_decode(file_get_contents($npmResultPath));
|
||||
$oldJsonHash = $result->packageJsonHash;
|
||||
$oldTimestamp = $result->updateTimestamp;
|
||||
|
||||
if ($lockHash != $oldJsonHash) {
|
||||
//1. package.json 파일이 다르면 업데이트.
|
||||
if ($packageJsonHash != $oldJsonHash) {
|
||||
break;
|
||||
}
|
||||
|
||||
//2. package-lock.json 업데이트가 2주를 초과했다면 업데이트.
|
||||
if ($oldTimestamp + 60 * 60 * 24 * 14 < $timestamp) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -136,13 +95,7 @@ function tryNpmInstall()
|
||||
} while (0);
|
||||
}
|
||||
|
||||
if(file_exists($lockPath)){
|
||||
exec($runCode, $output, $result_code);
|
||||
}
|
||||
else{
|
||||
exec($runAltCode, $output, $result_code);
|
||||
}
|
||||
|
||||
exec("npm install", $output, $result_code);
|
||||
if ($result_code != 0) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
@@ -150,26 +103,16 @@ function tryNpmInstall()
|
||||
]);
|
||||
}
|
||||
|
||||
if (!file_exists($lockPath)){
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reason' => "no lockfile: {$lockPath}"
|
||||
]);
|
||||
}
|
||||
$lockHash = hash_file('sha512', $lockPath);
|
||||
|
||||
|
||||
file_put_contents($resultPath, json_encode([
|
||||
'lockHash'=>$lockHash,
|
||||
'updateTimestamp'=>$timestamp,
|
||||
file_put_contents($npmResultPath, json_encode([
|
||||
'packageJsonHash' => $packageJsonHash,
|
||||
'updateTimestamp' => $timestamp,
|
||||
]));
|
||||
return true;
|
||||
}
|
||||
|
||||
//묻고 따지지 않고 일단 composer install, npm install은 시도한다.
|
||||
//묻고 따지지 않고 일단 npm install은 시도한다.
|
||||
//hwe 업데이트인 경우에만 한번 더 부른다.
|
||||
|
||||
tryComposerInstall();
|
||||
if (tryNpmInstall()) {
|
||||
genJS(Util::array_last_key(ServConfig::getServerList()));
|
||||
}
|
||||
@@ -325,8 +268,7 @@ if ($server == $baseServerName) {
|
||||
]));
|
||||
}
|
||||
|
||||
//git 업데이트했는데, package가 바뀌면 곤란하니까
|
||||
tryComposerInstall();
|
||||
//git 업데이트했는데, package.json이 바뀌면 곤란하니까
|
||||
tryNpmInstall();
|
||||
genJS($server);
|
||||
|
||||
|
||||
@@ -138,13 +138,12 @@ if (!$userInfo) {
|
||||
'aux' => $session->tmpx,
|
||||
]);
|
||||
}
|
||||
$userID = $userInfo['no'];
|
||||
|
||||
if ($userInfo['delete_after']) {
|
||||
if ($userInfo['delete_after'] < $now) {
|
||||
$restAPI->unlink();
|
||||
$session->access_token = null;
|
||||
$RootDB->delete('member', 'no=%i', $userID);
|
||||
$RootDB->delete('member', 'no=%i', $userInfo['no']);
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reqOTP' => false,
|
||||
@@ -171,20 +170,20 @@ if ($refresh_token) {
|
||||
|
||||
RootDB::db()->update('member', [
|
||||
'oauth_info' => Json::encode($oauthInfo)
|
||||
], 'no=%i', $userID);
|
||||
], 'no=%i', $userInfo['no']);
|
||||
|
||||
|
||||
$tokenValidUntil = $userInfo['token_valid_until'];
|
||||
|
||||
if (!$tokenValidUntil || $tokenValidUntil < $now) {
|
||||
if (!createOTPbyUserNO($userID)) {
|
||||
if (!createOTPbyUserNO($userInfo['no'])) {
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reqOTP' => false,
|
||||
'reason' => '인증 코드를 보내는데 실패했습니다.'
|
||||
]);
|
||||
}
|
||||
$session->login($userID, $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
|
||||
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
|
||||
Json::die([
|
||||
'result' => false,
|
||||
'reqOTP' => true,
|
||||
@@ -193,9 +192,8 @@ if (!$tokenValidUntil || $tokenValidUntil < $now) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
$RootDB->insert('member_log', [
|
||||
'member_no' => $userID,
|
||||
'member_no' => $userInfo['no'],
|
||||
'action_type' => 'login',
|
||||
'action' => Json::encode([
|
||||
'ip' => Util::get_client_ip(true),
|
||||
@@ -227,7 +225,7 @@ $RootDB->query(
|
||||
);
|
||||
$token = Util::randomStr(20);
|
||||
$RootDB->insert('login_token', [
|
||||
'user_id' => $userID,
|
||||
'user_id' => $userInfo['no'],
|
||||
'base_token' => $token,
|
||||
'reg_ip' => Util::get_client_ip(true),
|
||||
'reg_date' => $nowDate,
|
||||
@@ -235,7 +233,7 @@ $RootDB->insert('login_token', [
|
||||
]);
|
||||
$tokenID = $RootDB->insertId();
|
||||
|
||||
$session->login($userID, $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}'));
|
||||
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}'));
|
||||
|
||||
|
||||
|
||||
|
||||
Generated
-16227
File diff suppressed because it is too large
Load Diff
+43
-50
@@ -4,9 +4,7 @@
|
||||
"description": "",
|
||||
"main": "js/index.js",
|
||||
"scripts": {
|
||||
"test": "npm-run-all test-php-gateway test-ts",
|
||||
"test-php-gateway": "vendor/bin/phpunit --bootstrap vendor/autoload.php tests",
|
||||
"test-ts": "mocha",
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"build": "webpack",
|
||||
"buildDev": "webpack --mode=development",
|
||||
"watch": "webpack watch --mode=development",
|
||||
@@ -22,11 +20,7 @@
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@babel/cli": "^7.17.6",
|
||||
"@babel/core": "^7.17.5",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/preset-typescript": "^7.16.7",
|
||||
"@popperjs/core": "^2.11.3",
|
||||
"@popperjs/core": "^2.11.2",
|
||||
"@tiptap/extension-color": "^2.0.0-beta.9",
|
||||
"@tiptap/extension-image": "^2.0.0-beta.27",
|
||||
"@tiptap/extension-link": "^2.0.0-beta.36",
|
||||
@@ -36,71 +30,70 @@
|
||||
"@tiptap/starter-kit": "^2.0.0-beta.183",
|
||||
"@tiptap/vue-3": "^2.0.0-beta.90",
|
||||
"@types/bootstrap": "^5.1.9",
|
||||
"@types/chai": "^4.3.0",
|
||||
"@types/downloadjs": "^1.4.3",
|
||||
"@types/jquery": "^3.5.14",
|
||||
"@types/linkifyjs": "^2.1.4",
|
||||
"@types/lodash": "^4.14.179",
|
||||
"@types/mocha": "^9.1.0",
|
||||
"@types/node": "^17.0.21",
|
||||
"@types/react": "file:hwe/ts/@types/types__react",
|
||||
"@types/select2": "^4.0.55",
|
||||
"@types/uuid": "^8.3.4",
|
||||
"@typescript-eslint/eslint-plugin": "^5.14.0",
|
||||
"@typescript-eslint/parser": "^5.14.0",
|
||||
"@vue/compiler-sfc": "^3.2.31",
|
||||
"@vue/eslint-config-typescript": "^10.0.0",
|
||||
"async-validator": "^4.0.7",
|
||||
"autoprefixer": "^10.4.2",
|
||||
"axios": "^0.26.1",
|
||||
"babel-plugin-lodash": "^3.3.4",
|
||||
"babel-preset-modern-browsers": "^15.0.2",
|
||||
"axios": "^0.26.0",
|
||||
"bootstrap": "^5.1.3",
|
||||
"bootstrap-vue-3": "=0.1.6",
|
||||
"bootswatch": "^5.1.3",
|
||||
"bootstrap-vue-3": "^0.1.6",
|
||||
"buffer": "^6.0.3",
|
||||
"chai": "^4.3.6",
|
||||
"chai-bytes": "^0.1.2",
|
||||
"clean-terminal-webpack-plugin": "^3.0.0",
|
||||
"core-js": "^3.21.1",
|
||||
"css-loader": "^6.7.1",
|
||||
"cssnano": "^5.1.3",
|
||||
"date-fns": "^2.28.0",
|
||||
"downloadjs": "^1.4.7",
|
||||
"esbuild-loader": "^2.18.0",
|
||||
"eslint": "^8.11.0",
|
||||
"eslint-import-resolver-alias": "^1.1.2",
|
||||
"eslint-plugin-vue": "^8.5.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"jquery": "^3.6.0",
|
||||
"js-sha512": "^0.8.0",
|
||||
"linkifyjs": "^3.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mini-css-extract-plugin": "^2.6.0",
|
||||
"mocha": "^9.2.2",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss-discard-duplicates": "^5.1.0",
|
||||
"query-string": "^7.1.1",
|
||||
"select2": "^4.0",
|
||||
"uuid": "^8.3.2",
|
||||
"vue": "^3.2.31",
|
||||
"vue-multiselect": "^3.0.0-alpha.2",
|
||||
"vue-types": "^4.1.1",
|
||||
"vuedraggable": "^4.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.17.3",
|
||||
"@babel/core": "^7.17.5",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/preset-typescript": "^7.16.7",
|
||||
"@types/jquery": "^3.5.13",
|
||||
"@types/lodash": "^4.14.178",
|
||||
"@types/node": "^17.0.18",
|
||||
"@types/react": "file:hwe/ts/@types/types__react",
|
||||
"@typescript-eslint/eslint-plugin": "^5.12.0",
|
||||
"@typescript-eslint/parser": "^5.12.0",
|
||||
"@vue/compiler-sfc": "^3.2.31",
|
||||
"@vue/eslint-config-typescript": "^10.0.0",
|
||||
"autoprefixer": "^10.4.2",
|
||||
"babel-plugin-lodash": "^3.3.4",
|
||||
"babel-preset-modern-browsers": "^15.0.2",
|
||||
"bootswatch": "^5.1.3",
|
||||
"clean-terminal-webpack-plugin": "^3.0.0",
|
||||
"css-loader": "^6.6.0",
|
||||
"cssnano": "^5.0.17",
|
||||
"esbuild-loader": "^2.18.0",
|
||||
"eslint": "^8.9.0",
|
||||
"eslint-plugin-vue": "^8.4.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"mini-css-extract-plugin": "^2.5.3",
|
||||
"postcss-discard-duplicates": "^5.0.3",
|
||||
"postcss-import": "^14.0.2",
|
||||
"postcss-loader": "^6.2.1",
|
||||
"pre-commit": "^1.2.2",
|
||||
"query-string": "^7.1.1",
|
||||
"sass": "^1.49.9",
|
||||
"sass": "^1.49.8",
|
||||
"sass-loader": "^12.6.0",
|
||||
"select2": "^4.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"ts-node": "^10.7.0",
|
||||
"tsconfig-paths": "^3.13.0",
|
||||
"typescript": "^4.6.2",
|
||||
"ts-node": "^10.5.0",
|
||||
"typescript": "^4.5.5",
|
||||
"url-loader": "^4.1.1",
|
||||
"uuid": "^8.3.2",
|
||||
"vue": "^3.2.31",
|
||||
"vue-eslint-parser": "^8.3.0",
|
||||
"vue-eslint-parser": "^8.2.0",
|
||||
"vue-loader": "^17.0.0",
|
||||
"vue-multiselect": "^3.0.0-alpha.2",
|
||||
"vue-style-loader": "^4.1.3",
|
||||
"vue-types": "^4.1.1",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"webpack": "^5.70.0",
|
||||
"webpack": "^5.69.1",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.2"
|
||||
},
|
||||
|
||||
+10
-25
@@ -9,7 +9,7 @@ class APIHelper
|
||||
//static only
|
||||
}
|
||||
|
||||
public static function launch(string $rootPath, ?string $actionPath = null)
|
||||
public static function launch(string $rootPath)
|
||||
{
|
||||
//TODO: path를 php://input에서 받는게 아니라 api.php?~~~~~ 로 받아오는것이 etag 캐시 측면에서 훨씬 나을 듯!
|
||||
try {
|
||||
@@ -19,35 +19,20 @@ class APIHelper
|
||||
Json::dieWithReason($e->getMessage());
|
||||
}
|
||||
|
||||
if($actionPath !== null){
|
||||
if ($input && !is_array($input)) {
|
||||
Json::dieWithReason('args가 array가 아닙니다.' . gettype($input));
|
||||
}
|
||||
if(!$input){
|
||||
$input = [];
|
||||
}
|
||||
$actionArgs = $input;
|
||||
}
|
||||
else{
|
||||
if(!$input){
|
||||
Json::dieWithReason("input이 비어있습니다. {$rawInput}");
|
||||
}
|
||||
|
||||
if (!key_exists('path', $input)) {
|
||||
Json::dieWithReason('path가 지정되지 않았습니다.');
|
||||
}
|
||||
$actionPath = $input['path'];
|
||||
|
||||
if (key_exists('args', $input) && !is_array($input['args'])) {
|
||||
Json::dieWithReason('args가 array가 아닙니다.' . gettype($input['args']));
|
||||
}
|
||||
$actionArgs = $input['args'] ?? null;
|
||||
if(!$input){
|
||||
Json::dieWithReason("input이 비어있습니다. {$rawInput}");
|
||||
}
|
||||
|
||||
if (!key_exists('path', $input)) {
|
||||
Json::dieWithReason('path가 지정되지 않았습니다.');
|
||||
}
|
||||
|
||||
if (key_exists('args', $input) && !is_array($input['args'])) {
|
||||
Json::dieWithReason('args가 array가 아닙니다.' . gettype($input['args']));
|
||||
}
|
||||
|
||||
try {
|
||||
$obj = buildAPIExecutorClass($actionPath, $rootPath, $actionArgs);
|
||||
$obj = buildAPIExecutorClass($input['path'], $rootPath, $input['args'] ?? []);
|
||||
$validateResult = $obj->validateArgs();
|
||||
if ($validateResult !== null) {
|
||||
Json::dieWithReason($validateResult);
|
||||
|
||||
@@ -1,225 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
//NOTE: JavaScript 버전과 일치
|
||||
const MAX_RNG_SUPPORT_BIT = 53;
|
||||
if (PHP_INT_SIZE * 8 < MAX_RNG_SUPPORT_BIT) {
|
||||
throw new \RangeException("PHP not support {$MAX_RNG_SUPPORT_BIT} bit integer");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reseed를 하지 않는 단순한 형태의 sha512 drbg
|
||||
* float: bit를 강제로 채움
|
||||
**/
|
||||
|
||||
|
||||
class LiteHashDRBG implements RNG
|
||||
{
|
||||
const MAX_INT = (1 << MAX_RNG_SUPPORT_BIT) - 1;
|
||||
const BUFFER_BYTE_SIZE = 512 / 8; //SHA512
|
||||
|
||||
protected string $buffer;
|
||||
protected int $bufferIdx;
|
||||
public function __construct(protected string $seed, protected int $stateIdx = 0, int $bufferIdx = 0)
|
||||
{
|
||||
if($bufferIdx < 0){
|
||||
throw new \InvalidArgumentException("bufferIdx {$bufferIdx} < 0");
|
||||
}
|
||||
if($bufferIdx >= self::BUFFER_BYTE_SIZE){
|
||||
throw new \InvalidArgumentException("bufferIdx {$bufferIdx} >= ".self::BUFFER_BYTE_SIZE);
|
||||
}
|
||||
if($stateIdx < 0){
|
||||
throw new \InvalidArgumentException("stateIdx {$stateIdx} < 0");
|
||||
}
|
||||
$this->genNextBlock();
|
||||
$this->bufferIdx = $bufferIdx;
|
||||
}
|
||||
|
||||
protected function genNextBlock(): void
|
||||
{
|
||||
$hq = $this->seed . pack('V', $this->stateIdx);
|
||||
$this->buffer = hash('sha512', $hq, true);
|
||||
$this->bufferIdx = 0;
|
||||
$this->stateIdx += 1;
|
||||
}
|
||||
|
||||
static function getMaxInt(): int
|
||||
{
|
||||
return self::MAX_INT;
|
||||
}
|
||||
|
||||
const INT_BIT_MASK_MAP = [
|
||||
0x1 => 1,
|
||||
0x3 => 2,
|
||||
0x7 => 3,
|
||||
0xf => 4,
|
||||
0x1f => 5,
|
||||
0x3f => 6,
|
||||
0x7f => 7,
|
||||
0xff => 8,
|
||||
0x1ff => 9,
|
||||
0x3ff => 10,
|
||||
0x7ff => 11,
|
||||
0xfff => 12,
|
||||
0x1fff => 13,
|
||||
0x3fff => 14,
|
||||
0x7fff => 15,
|
||||
0xffff => 16,
|
||||
0x1ffff => 17,
|
||||
0x3ffff => 18,
|
||||
0x7ffff => 19,
|
||||
0xfffff => 20,
|
||||
0x1fffff => 21,
|
||||
0x3fffff => 22,
|
||||
0x7fffff => 23,
|
||||
0xffffff => 24,
|
||||
0x1ffffff => 25,
|
||||
0x3ffffff => 26,
|
||||
0x7ffffff => 27,
|
||||
0xfffffff => 28,
|
||||
0x1fffffff => 29,
|
||||
0x3fffffff => 30,
|
||||
0x7fffffff => 31,
|
||||
0xffffffff => 32,
|
||||
0x1ffffffff => 33,
|
||||
0x3ffffffff => 34,
|
||||
0x7ffffffff => 35,
|
||||
0xfffffffff => 36,
|
||||
0x1fffffffff => 37,
|
||||
0x3fffffffff => 38,
|
||||
0x7fffffffff => 39,
|
||||
0xffffffffff => 40,
|
||||
0x1ffffffffff => 41,
|
||||
0x3ffffffffff => 42,
|
||||
0x7ffffffffff => 43,
|
||||
0xfffffffffff => 44,
|
||||
0x1fffffffffff => 45,
|
||||
0x3fffffffffff => 46,
|
||||
0x7fffffffffff => 47,
|
||||
0xffffffffffff => 48,
|
||||
0x1ffffffffffff => 49,
|
||||
0x3ffffffffffff => 50,
|
||||
0x7ffffffffffff => 51,
|
||||
0xfffffffffffff => 52,
|
||||
0x1fffffffffffff => 53,
|
||||
];
|
||||
|
||||
private static function calcBitMask($n)
|
||||
{
|
||||
$n |= $n >> 1;
|
||||
$n |= $n >> 2;
|
||||
$n |= $n >> 4;
|
||||
$n |= $n >> 8;
|
||||
$n |= $n >> 16;
|
||||
$n |= $n >> 32;
|
||||
|
||||
return $n;
|
||||
}
|
||||
|
||||
|
||||
public function nextBytes(int $bytes): string
|
||||
{
|
||||
if ($bytes <= 0) {
|
||||
throw new \InvalidArgumentException("{$bytes} <= 0");
|
||||
}
|
||||
|
||||
if ($this->bufferIdx + $bytes <= self::BUFFER_BYTE_SIZE) {
|
||||
$buffer = substr($this->buffer, $this->bufferIdx, $bytes);
|
||||
$this->bufferIdx += $bytes;
|
||||
if ($this->bufferIdx == self::BUFFER_BYTE_SIZE) {
|
||||
$this->genNextBlock();
|
||||
}
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
|
||||
$result = [substr($this->buffer, $this->bufferIdx)];
|
||||
$remain = $bytes - (self::BUFFER_BYTE_SIZE - $this->bufferIdx);
|
||||
|
||||
while ($remain > self::BUFFER_BYTE_SIZE) {
|
||||
$this->genNextBlock();
|
||||
$result[] = $this->buffer;
|
||||
$remain -= self::BUFFER_BYTE_SIZE;
|
||||
}
|
||||
|
||||
$this->genNextBlock();
|
||||
if ($remain == 0) {
|
||||
return join("", $result);
|
||||
}
|
||||
|
||||
$result[] = substr($this->buffer, 0, $remain);
|
||||
$this->bufferIdx = $remain;
|
||||
return join("", $result);
|
||||
}
|
||||
|
||||
public function nextBits(int $bits): string
|
||||
{
|
||||
$bytes = ($bits + 7) >> 3;
|
||||
$headBits = $bits & 0x7;
|
||||
|
||||
$buffer = $this->nextBytes($bytes);
|
||||
if ($headBits === 0) {
|
||||
return $buffer;
|
||||
}
|
||||
$buffer[$bytes - 1] = chr(ord($buffer[$bytes - 1]) & (0xff >> (8 - $headBits)));
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
|
||||
static private function parseU64(string $value): int
|
||||
{
|
||||
return unpack('P', $value)[1];
|
||||
}
|
||||
|
||||
private function _nextInt(int $bits): int
|
||||
{
|
||||
$buffer = $this->nextBits($bits) . "\x00\x00\x00\x00\x00\x00\x00";
|
||||
|
||||
return self::parseU64($buffer);
|
||||
}
|
||||
|
||||
public function nextInt(?int $max = null): int
|
||||
{
|
||||
if ($max === null || $max === self::MAX_INT) {
|
||||
$buffer = $this->nextBits(MAX_RNG_SUPPORT_BIT) . "\x00";
|
||||
return self::parseU64($buffer);
|
||||
}
|
||||
|
||||
if ($max > self::MAX_INT) {
|
||||
throw new \InvalidArgumentException('Over Max Int');
|
||||
} else if ($max === 0) {
|
||||
return 0;
|
||||
} else if ($max < 0) {
|
||||
return -$this->nextInt(-$max);
|
||||
}
|
||||
|
||||
$mask = self::calcBitMask($max);
|
||||
$bits = self::INT_BIT_MASK_MAP[$mask];
|
||||
|
||||
$n = $this->_nextInt($bits);
|
||||
while ($n > $max) {
|
||||
$n = $this->_nextInt($bits);
|
||||
}
|
||||
|
||||
return $n;
|
||||
}
|
||||
|
||||
public function nextFloat1(): float
|
||||
{
|
||||
$max = 1 << MAX_RNG_SUPPORT_BIT;
|
||||
while (true) {
|
||||
$buffer = $this->nextBits(MAX_RNG_SUPPORT_BIT + 1) . "\x00";
|
||||
$nInt = self::parseU64($buffer);
|
||||
if ($nInt <= $max) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $nInt / $max;
|
||||
}
|
||||
|
||||
static function build(string $seed, int $idx = 0): self
|
||||
{
|
||||
return new LiteHashDRBG($seed, $idx);
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
interface RNG
|
||||
{
|
||||
|
||||
/**
|
||||
* @return int nextInt()가 반환 가능한 최대값
|
||||
*/
|
||||
public static function getMaxInt(): int;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param int $bytes
|
||||
* @return string Little Endian 형태로 채워진 binary 값
|
||||
*/
|
||||
public function nextBytes(int $bytes): string;
|
||||
public function nextBits(int $bits): string;
|
||||
|
||||
/**
|
||||
* @param ?int $max 최대치(해당 값 포함)
|
||||
* @return int 0과 최대치 사이의 임의의 정수
|
||||
*/
|
||||
public function nextInt(?int $max = null): int;
|
||||
|
||||
public function nextFloat1(): float;
|
||||
|
||||
}
|
||||
@@ -1,146 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
class RandUtil
|
||||
{
|
||||
public function __construct(protected RNG $rng)
|
||||
{
|
||||
}
|
||||
|
||||
public function nextFloat1(): float
|
||||
{
|
||||
return $this->rng->nextFloat1();
|
||||
}
|
||||
|
||||
public function nextRange(int|float $min, int|float $max): float
|
||||
{
|
||||
$range = $max - $min;
|
||||
return $this->nextFloat1() * $range + $min;
|
||||
}
|
||||
|
||||
public function nextRangeInt(int $min, int $max): int
|
||||
{
|
||||
$range = $max - $min;
|
||||
if ($range > $this->rng->getMaxInt()) {
|
||||
throw new \InvalidArgumentException("Invalid random int range");
|
||||
}
|
||||
return $this->rng->nextInt($range) + $min;
|
||||
}
|
||||
|
||||
public function nextInt(?int $max = null): int{
|
||||
return $this->rng->nextInt($max);
|
||||
}
|
||||
|
||||
public function nextBit(): bool
|
||||
{
|
||||
return $this->rng->nextBits(1) !== "\0";
|
||||
}
|
||||
|
||||
public function nextBool(int|float $prob = 0.5): bool
|
||||
{
|
||||
if ($prob >= 1) {
|
||||
return true;
|
||||
}
|
||||
return $this->nextFloat1() < $prob;
|
||||
}
|
||||
|
||||
public function shuffle(array $srcArray): array
|
||||
{
|
||||
if(!$srcArray){
|
||||
return $srcArray;
|
||||
}
|
||||
$cnt = count($srcArray);
|
||||
if ($cnt > $this->rng->getMaxInt()) {
|
||||
throw new \InvalidArgumentException("Invalid random int range");
|
||||
}
|
||||
$result = [];
|
||||
foreach ($srcArray as $val) {
|
||||
$result[] = $val;
|
||||
}
|
||||
|
||||
//PHP의 range는 max 포함
|
||||
foreach (range(0, $cnt - 1) as $srcIdx) {
|
||||
$destIdx = $this->rng->nextInt($cnt - $srcIdx - 1) + $srcIdx;
|
||||
if($srcIdx === $destIdx){
|
||||
continue;
|
||||
}
|
||||
$tmpVal = $result[$srcIdx];
|
||||
$result[$srcIdx] = $result[$destIdx];
|
||||
$result[$destIdx] = $tmpVal;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function shuffleAssoc(array $srcArray): array
|
||||
{
|
||||
if(!$srcArray){
|
||||
return $srcArray;
|
||||
}
|
||||
$result = [];
|
||||
foreach ($this->shuffle(array_keys($srcArray)) as $key) {
|
||||
$result[$key] = $srcArray[$key];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function choice(array $items)
|
||||
{
|
||||
$keys = array_keys($items);
|
||||
$keyIdx = $this->rng->nextInt(count($keys) - 1);
|
||||
return $items[$keys[$keyIdx]];
|
||||
}
|
||||
|
||||
public function choiceUsingWeight(array $items)
|
||||
{
|
||||
$sum = 0;
|
||||
foreach ($items as $value) {
|
||||
if ($value <= 0) {
|
||||
continue;
|
||||
}
|
||||
$sum += $value;
|
||||
}
|
||||
|
||||
$rd = $this->nextFloat1() * $sum;
|
||||
foreach ($items as $item => $value) {
|
||||
if ($value <= 0) {
|
||||
$value = 0;
|
||||
}
|
||||
if ($rd <= $value) {
|
||||
return $item;
|
||||
}
|
||||
$rd -= $value;
|
||||
}
|
||||
|
||||
//fallback. 이곳으로 빠지지 않음
|
||||
end($items);
|
||||
return $items[key($items)][0];
|
||||
}
|
||||
|
||||
public function choiceUsingWeightPair(array $items)
|
||||
{
|
||||
$sum = 0;
|
||||
foreach ($items as [$item, $value]) {
|
||||
if ($value <= 0) {
|
||||
continue;
|
||||
}
|
||||
$sum += $value;
|
||||
}
|
||||
|
||||
$rd = $this->nextFloat1() * $sum;
|
||||
foreach ($items as [$item, $value]) {
|
||||
if ($value <= 0) {
|
||||
$value = 0;
|
||||
}
|
||||
if ($rd <= $value) {
|
||||
return $item;
|
||||
}
|
||||
$rd -= $value;
|
||||
}
|
||||
|
||||
//fallback. 이곳으로 빠지지 않음
|
||||
end($items);
|
||||
return $items[key($items)][0];
|
||||
}
|
||||
}
|
||||
@@ -809,4 +809,5 @@ class Util extends \utilphp\util
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
class BasicTest extends PHPUnit\Framework\TestCase{
|
||||
public function testHelloWorld(){
|
||||
$this->assertEquals(1+1, 2);
|
||||
}
|
||||
}
|
||||
@@ -1,415 +0,0 @@
|
||||
<?php
|
||||
|
||||
use sammo\LiteHashDRBG;
|
||||
use sammo\RandUtil;
|
||||
|
||||
const BLOCK_SIZE = LiteHashDRBG::BUFFER_BYTE_SIZE;
|
||||
|
||||
function fillBlock(string $src, string $filler = '\0', int $length = BLOCK_SIZE)
|
||||
{
|
||||
$tmp = [$src];
|
||||
$fillerLen = strlen($filler);
|
||||
if ($fillerLen < 1) {
|
||||
throw new \InvalidArgumentException('filler must have length');
|
||||
}
|
||||
|
||||
$remainFill = intdiv($length - strlen($src), $fillerLen);
|
||||
for (; $remainFill > 0; $remainFill--) {
|
||||
$tmp[] = $filler;
|
||||
}
|
||||
|
||||
$result = join("", $tmp);
|
||||
|
||||
$moreLen = $length - strlen($result);
|
||||
if ($moreLen === 0) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
return $result . substr($filler, 0, $moreLen);
|
||||
}
|
||||
|
||||
class DummyBlockRNG extends LiteHashDRBG
|
||||
{
|
||||
private int $repeatBlockCnt;
|
||||
/**
|
||||
*
|
||||
* @param string[] $repeatBlock
|
||||
* @param int $stateIdx
|
||||
* @return void
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
public function __construct(protected array $repeatBlock, protected int $stateIdx = 0)
|
||||
{
|
||||
foreach ($repeatBlock as $block) {
|
||||
if (strlen($block) != BLOCK_SIZE) {
|
||||
throw new RuntimeException('Invalid repeat block');
|
||||
}
|
||||
}
|
||||
$this->repeatBlockCnt = count($this->repeatBlock);
|
||||
$this->genNextBlock();
|
||||
}
|
||||
|
||||
protected function genNextBlock(): void
|
||||
{
|
||||
$this->buffer = $this->repeatBlock[$this->stateIdx];
|
||||
$this->bufferIdx = 0;
|
||||
$this->stateIdx = ($this->stateIdx + 1) % $this->repeatBlockCnt;
|
||||
}
|
||||
}
|
||||
|
||||
/* Python TestVector
|
||||
import hashlib
|
||||
import struct
|
||||
|
||||
fixedKey = 'HelloWorld'.encode('utf-8')
|
||||
|
||||
def hash(key, idx):
|
||||
idxV = struct.pack("<I", idx)
|
||||
return hashlib.sha512(key + idxV).digest()
|
||||
|
||||
for idx in range(5):
|
||||
print(hash(fixedKey, idx).hex())
|
||||
*/
|
||||
$rngTestVector = hex2bin(join('', [
|
||||
'24d9ccd648556255fd0ee9f5b29918de90617341958b3b354d572167e4dee02b757816a2bbe0b502c52413ffd384381a9d7b4e193df6f4345d6a95e111d661c4',
|
||||
'2e9264512f6f4b080cf1376b74fab6878ecf4a6e185942d2e5b22cf923885b9952d40601a414225d6901417fd4ce9368ac77e4a63d3fc9b58ab952bb8c33f165',
|
||||
'8e2ebf5af6283a1b18f4c044c86c20d02be3890613c4cc8b7c6b7b35581263b972a82630df69a9289988422d7c3a9be5edf78d5de16fabd01e5dd4e458068d8a',
|
||||
'398596047ba547bfe371ec863a3e019ab0dbc4bb3b27e9077685aae4283ff6bbccfd981d92f9358f7efffbb72a940414802d98466d132e2ad0a16a12946d5f47',
|
||||
'b3606fe9b18c4aa7315e78bb9e47cb51cc4e203fcc2e631f0405c1b872c8e1cb5b6415ea74bbb77fffaaadb002b47cb4f4628dc0709634365b187667f5c708cb',
|
||||
]));
|
||||
class RNGTest extends PHPUnit\Framework\TestCase
|
||||
{
|
||||
|
||||
const FIXED_KEY = 'HelloWorld';
|
||||
|
||||
public function testDummyRNG()
|
||||
{
|
||||
//Block의 값을 고정하고 입력값을 확인
|
||||
$rng = new DummyBlockRNG([
|
||||
fillBlock('', "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff")
|
||||
]);
|
||||
|
||||
$this->setName('DummyRNG-SimpleByte');
|
||||
$this->assertEquals("\x00", $rng->nextBytes(1));
|
||||
$this->assertEquals("\x11\x22", $rng->nextBytes(2));
|
||||
$this->assertEquals("\x33\x44\x55", $rng->nextBytes(3));
|
||||
$this->assertEquals("\x66\x77\x88\x99", $rng->nextBytes(4));
|
||||
|
||||
$this->setName('DummyRNG-OverflowBlock');
|
||||
foreach (range(1, 16) as $_i) {
|
||||
$this->assertEquals(
|
||||
"\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99",
|
||||
$rng->nextBytes(16)
|
||||
);
|
||||
}
|
||||
|
||||
$this->setName('DummyRNG-MultiBlock');
|
||||
$this->assertEquals(
|
||||
fillBlock('', "\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", BLOCK_SIZE * 2),
|
||||
$rng->nextBytes(BLOCK_SIZE * 2)
|
||||
);
|
||||
|
||||
$this->setName('DummyRNG-BitTest');
|
||||
$this->assertEquals("\x00", $rng->nextBits(1)); //aa
|
||||
$this->assertEquals("\x01", $rng->nextBits(1)); //bb
|
||||
$this->assertEquals("\xcc", $rng->nextBits(8)); //cc
|
||||
$this->assertEquals("\xdd\x02", $rng->nextBits(10)); //ddee
|
||||
$this->assertEquals("\x7f", $rng->nextBits(7)); //ff
|
||||
$this->assertEquals("\x00\x11\x22\x33\x44\x55\x06", $rng->nextBits(53));
|
||||
|
||||
$this->setName('DummyRNG-Int');
|
||||
$this->assertEquals(0x77, $rng->nextInt(0xff));
|
||||
$this->assertEquals(0x9988, $rng->nextInt((1 << 16) - 1));
|
||||
$this->assertEquals(0xddccbbaa, $rng->nextInt((1 << 32) - 1));
|
||||
$this->assertEquals(0x0433221100ffee, $rng->nextInt());
|
||||
$this->assertEquals(0x05, $rng->nextInt(0x0f)); //55
|
||||
$this->assertEquals(0x06, $rng->nextInt(0x12)); //66
|
||||
$this->assertEquals(0x08, $rng->nextInt(99)); //77(119 -> 7bit) -> 88(136 -> 8bit -> 8)
|
||||
$this->assertEquals(0x99, $rng->nextInt(0x99)); //99
|
||||
$this->assertEquals(0xaa, $rng->nextInt(0xaa)); //aa (fit Max)
|
||||
|
||||
$floatMax = 1 << 53;
|
||||
$this->setName('DummyRNG-Float'); //7개씩
|
||||
$fa = $rng->nextFloat1();
|
||||
$this->assertEquals(0x1100ffeeddccbb / $floatMax, $fa, 'float1-1');
|
||||
$this->assertIsFloat($fa);
|
||||
$this->assertLessThan(0.5313720384, $fa);
|
||||
$this->assertGreaterThan(0.5313720383, $fa);
|
||||
|
||||
$fb = $rng->nextFloat1();
|
||||
$this->assertEquals(0x08776655443322 / $floatMax, $fb, 'float1-2');
|
||||
}
|
||||
|
||||
public function testRandUtilDummy_shuffle(){
|
||||
$rng = new DummyBlockRNG([
|
||||
fillBlock('', "\x17\x16\x15\x14\x13\x12\x11\x10")
|
||||
]);
|
||||
$randUtil = new RandUtil($rng);
|
||||
|
||||
/**
|
||||
* 7, [7,1,2,3,4,5,6,0]
|
||||
* 6, [7,0,2,3,4,5,6,1]
|
||||
* 5, [7,0,1,3,4,5,6,2]
|
||||
* 4, [7,0,1,2,4,5,6,3]
|
||||
* 3, [7,0,1,2,3,5,6,4]
|
||||
* 2, [7,0,1,2,3,4,6,5]
|
||||
* 1, [7,0,1,2,3,4,5,6]
|
||||
*/
|
||||
$this->assertEquals(
|
||||
$randUtil->shuffle(range(0, 7)),
|
||||
[7, 0, 1, 2, 3, 4, 5, 6]
|
||||
);
|
||||
|
||||
/**
|
||||
* 0, [0,1,2,3,4,5,6,7,8,9]
|
||||
* 7, [0,8,2,3,4,5,6,7,1,9]
|
||||
* 6, [0,8,1,3,4,5,6,7,2,9]
|
||||
* 5, [0,8,1,2,4,5,6,7,3,9]
|
||||
* 4, [0,8,1,2,3,5,6,7,4,9]
|
||||
* 3, [0,8,1,2,3,4,6,7,5,9]
|
||||
* 2, [0,8,1,2,3,4,5,7,6,9]
|
||||
* 1, [0,8,1,2,3,4,5,6,7,9]
|
||||
* 0, [0,8,1,2,3,4,5,6,7,9]
|
||||
*/
|
||||
$this->assertEquals(
|
||||
$randUtil->shuffle(range(0, 9)),
|
||||
[0, 8, 1, 2, 3, 4, 5, 6, 7, 9]
|
||||
);
|
||||
|
||||
|
||||
$rng = new DummyBlockRNG([
|
||||
fillBlock('', "\x17\x16\x15\x14\x13\x12\x11\x10")
|
||||
]);
|
||||
$randUtil = new RandUtil($rng);
|
||||
//Same as first, but assoc.
|
||||
$this->assertEquals($randUtil->shuffleAssoc([
|
||||
'a' => 0,
|
||||
'b' => 1,
|
||||
'c' => 2,
|
||||
'd' => 3,
|
||||
'e' => 4,
|
||||
'f' => 5,
|
||||
'g' => 6,
|
||||
'h' => 7,
|
||||
]), [
|
||||
'h' => 7,
|
||||
'a' => 0,
|
||||
'b' => 1,
|
||||
'c' => 2,
|
||||
'd' => 3,
|
||||
'e' => 4,
|
||||
'f' => 5,
|
||||
'g' => 6,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testRandUtilDummy_choiceSeries(){
|
||||
$rng = new DummyBlockRNG([
|
||||
fillBlock('', "\x17\x16\x15\x14\x13\x12\x11\x10")
|
||||
]);
|
||||
$randUtil = new RandUtil($rng);
|
||||
|
||||
//0x17(7), 0x16(6)
|
||||
$this->assertEquals($randUtil->choice([0, 1, 2, 3, 4, 5]), 5);
|
||||
|
||||
//0x15(5), Set 순서 유지
|
||||
$this->assertEquals($randUtil->choice([5, 3, 1, 2, 8, 0]), 8);
|
||||
|
||||
//0x14(4), Js의 Object와 순서 다름!
|
||||
$this->assertEquals($randUtil->choice([
|
||||
2=>'t', 3=>'q', 4=>'x',
|
||||
'c'=> 'c', 'a'=> 'a', 'b'=> 'b'
|
||||
]), 'c');
|
||||
|
||||
//0.6275740099377194 * 38.1 = 23.91
|
||||
$this->assertEquals($randUtil->choiceUsingWeight([
|
||||
"a"=> 0.1,
|
||||
"b"=> 10,
|
||||
"tt"=> 2,
|
||||
"x"=> -1,
|
||||
"c"=> 20,
|
||||
"d"=> 0,
|
||||
"e"=> 6
|
||||
]), 'c');
|
||||
|
||||
//0.658946544056166
|
||||
$this->assertEquals($randUtil->choiceUsingWeightPair([
|
||||
['xx', 10],
|
||||
]), 'xx');
|
||||
|
||||
//0.6903152783785083 * 27.3 = 18.84560709973328
|
||||
$this->assertEquals($randUtil->choiceUsingWeightPair([
|
||||
['e', 10],
|
||||
['d', 4],
|
||||
['c', 0.1],
|
||||
['baba', 0.2],
|
||||
['q', 9],
|
||||
['xt', 4]
|
||||
]), 'q');
|
||||
}
|
||||
|
||||
public function testRNGInvalidNextBits0()
|
||||
{
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng->nextBits(0);
|
||||
}
|
||||
|
||||
public function testRNGInvalidNextBitsMinus1()
|
||||
{
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng->nextBits(-1);
|
||||
}
|
||||
|
||||
public function testRNGInvalidNextBytes0()
|
||||
{
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng->nextBytes(0);
|
||||
}
|
||||
|
||||
public function testRNGInvalidNextBytesMinus1()
|
||||
{
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng->nextBytes(-1);
|
||||
}
|
||||
|
||||
public function testRNGInvalidNextIntOverflow()
|
||||
{
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng->nextInt(1 << 53);
|
||||
}
|
||||
|
||||
public function testRandUtilEmptyChoice()
|
||||
{
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$randUtil = new RandUtil($rng);
|
||||
$randUtil->choice([]);
|
||||
}
|
||||
|
||||
public function testRandUtilEmptychoiceUsingWeight()
|
||||
{
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$randUtil = new RandUtil($rng);
|
||||
$randUtil->choiceUsingWeight([]);
|
||||
}
|
||||
|
||||
public function testRandUtilEmptychoiceUsingWeightPair()
|
||||
{
|
||||
$this->expectException('\InvalidArgumentException');
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$randUtil = new RandUtil($rng);
|
||||
$randUtil->choiceUsingWeightPair([]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @doesNotPerformAssertions
|
||||
*/
|
||||
public function testRNGAcceptable()
|
||||
{
|
||||
$rng = new LiteHashDRBG(self::FIXED_KEY);
|
||||
$rng->nextInt(0);
|
||||
$rng->nextInt(1 << 53 - 1);
|
||||
$rng->nextBytes(65);
|
||||
$rng->nextBits(512);
|
||||
|
||||
$randUtil = new RandUtil($rng);
|
||||
$randUtil->choice([0, 0, 0]);
|
||||
$randUtil->choiceUsingWeight([0 => 0, 1 => -1]);
|
||||
$randUtil->choiceUsingWeightPair([
|
||||
[0, 0],
|
||||
[1, 0],
|
||||
[2, -1],
|
||||
]);
|
||||
$randUtil->nextBool(1.1);
|
||||
$randUtil->nextBool(-0.1);
|
||||
$randUtil->shuffle([]);
|
||||
$randUtil->shuffle([1]);
|
||||
$randUtil->shuffleAssoc([]);
|
||||
$randUtil->shuffleAssoc([1]);
|
||||
$randUtil->nextRange(0, 0);
|
||||
$randUtil->nextRangeInt(0, 0);
|
||||
$randUtil->nextRange(1, -1);
|
||||
$randUtil->nextRangeInt(1, -1);
|
||||
|
||||
$longKey = self::FIXED_KEY;
|
||||
foreach(range(0, 7) as $_){
|
||||
$longKey.=$longKey;
|
||||
}
|
||||
$rngLong = new LiteHashDRBG($longKey);
|
||||
foreach(range(0, 9) as $_){
|
||||
$rngLong->nextBytes(16);
|
||||
}
|
||||
}
|
||||
|
||||
public function testRNGBytes()
|
||||
{
|
||||
global $rngTestVector;
|
||||
$testVector = $rngTestVector;
|
||||
|
||||
$rng = new LiteHashDRBG(static::FIXED_KEY);
|
||||
|
||||
$offset = 0;
|
||||
$this->assertEquals($rng->nextBytes(10), substr($testVector, $offset, 10));
|
||||
$offset += 10;
|
||||
$this->assertEquals($rng->nextBytes(32), substr($testVector, $offset, 32));
|
||||
$offset += 32;
|
||||
$this->assertEquals($rng->nextBytes(1), substr($testVector, $offset, 1));
|
||||
$offset += 1;
|
||||
$this->assertEquals($rng->nextBytes(64), substr($testVector, $offset, 64));
|
||||
$offset += 64;
|
||||
$this->assertEquals($rng->nextBytes(5), substr($testVector, $offset, 5));
|
||||
$offset += 5;
|
||||
$this->assertEquals($rng->nextBytes(16), substr($testVector, $offset, 16));
|
||||
$offset += 16;
|
||||
}
|
||||
|
||||
public function testRNGBits()
|
||||
{
|
||||
global $rngTestVector;
|
||||
$testVector = $rngTestVector;
|
||||
|
||||
$rng = new LiteHashDRBG(static::FIXED_KEY);
|
||||
|
||||
$offset = 0;
|
||||
$testBits = [10, 4, 15, 32, 7, 99, 512, 1, 2, 3];
|
||||
|
||||
foreach($testBits as $bits){
|
||||
$bytes = intdiv($bits + 7, 8);
|
||||
$A = $rng->nextBits($bits);
|
||||
$B = substr($testVector, $offset, $bytes);
|
||||
|
||||
$offset += $bytes;
|
||||
|
||||
if($bits % 8 != 0){
|
||||
$bitMask = 0xff >> (8 - ($bits % 8));
|
||||
$B[$bytes - 1] = chr(ord($B[$bytes - 1]) & $bitMask);
|
||||
}
|
||||
$this->assertEquals($A, $B);
|
||||
}
|
||||
}
|
||||
|
||||
public function testRNGFloat()
|
||||
{
|
||||
global $rngTestVector;
|
||||
$testVector = $rngTestVector;
|
||||
|
||||
$rng = new LiteHashDRBG(static::FIXED_KEY);
|
||||
$rng2 = new DummyBlockRNG([
|
||||
substr($testVector, BLOCK_SIZE * 0, BLOCK_SIZE),
|
||||
substr($testVector, BLOCK_SIZE * 1, BLOCK_SIZE),
|
||||
substr($testVector, BLOCK_SIZE * 2, BLOCK_SIZE),
|
||||
substr($testVector, BLOCK_SIZE * 3, BLOCK_SIZE),
|
||||
substr($testVector, BLOCK_SIZE * 4, BLOCK_SIZE),
|
||||
]);
|
||||
|
||||
foreach(range(0, 17) as $idx){
|
||||
$this->assertEquals($rng->nextFloat1(), $rng2->nextFloat1(), "float{$idx}");
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-4
@@ -72,8 +72,5 @@
|
||||
/* Advanced Options */
|
||||
"skipLibCheck": true, /* Skip type checking of declaration files. */
|
||||
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
|
||||
},
|
||||
"exclude": [
|
||||
"**/*.test.ts"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
Deny from all
|
||||
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a::getLoader();
|
||||
+1
@@ -0,0 +1 @@
|
||||
../nesbot/carbon/bin/carbon
|
||||
+1
@@ -0,0 +1 @@
|
||||
../phan/phan/phan
|
||||
+1
@@ -0,0 +1 @@
|
||||
../phan/phan/phan_client
|
||||
+1
@@ -0,0 +1 @@
|
||||
../phan/phan/tocheckstyle
|
||||
@@ -0,0 +1 @@
|
||||
service_name: travis-ci
|
||||
@@ -0,0 +1,4 @@
|
||||
test.php
|
||||
build/*
|
||||
report/*
|
||||
tests/test*
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
language: php
|
||||
|
||||
php:
|
||||
- 5.3
|
||||
- 5.4
|
||||
- 5.5
|
||||
- 5.6
|
||||
- hhvm
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
|
||||
before_script:
|
||||
- pyrus install pear/PHP_CodeSniffer
|
||||
- wget -nc http://getcomposer.org/composer.phar
|
||||
- php composer.phar install --dev --no-interaction
|
||||
- mkdir -p build/logs
|
||||
- phpenv rehash
|
||||
|
||||
after_script:
|
||||
- php vendor/bin/coveralls
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
Change Log
|
||||
==========
|
||||
|
||||
1.1.0
|
||||
-----
|
||||
|
||||
This release introduces a deprecation notice for `slugify()`, please update your code.
|
||||
|
||||
* Added a cryptographically secure random string function `secure_random_string`. Thanks to @abhimanyusharma003 via [Pull Request #53](https://github.com/brandonwamboldt/utilphp/pull/53)
|
||||
* Added `limit_characters` and `limit_words` functions. Thanks to @abhimanyusharma003 via [Pull Request #55](https://github.com/brandonwamboldt/utilphp/pull/55)
|
||||
* Added `rmdir` method to recursively delete a directory. Thanks to @ARACOOOL via [Pull Request #56](https://github.com/brandonwamboldt/utilphp/pull/56)
|
||||
* Added `set_executable`, `set_readable`, `set_writable`, `directory_size`, `directory_contents` and `get_user_dir` functions. Thanks to @sergserg via [Pull Request #70](https://github.com/brandonwamboldt/utilphp/pull/70)
|
||||
* Changed parameter ordering for `slugify`, `$css_mode` is now the third argument. For backwards compatibility, the old order will still work but it will generate an `E_USER_DEPRECATED` warning. Thanks to @abhimanyusharma003 via [Pull Request #71](https://github.com/brandonwamboldt/utilphp/pull/71)
|
||||
* Added `match_string` method. Thanks to @abhimanyusharma003 via [Pull Request #72](https://github.com/brandonwamboldt/utilphp/pull/72)
|
||||
* Renamed internal methods (protected ones) for PSR-2 compliance
|
||||
* General performance improvements, code quality improvements, and increased unit test coverage (special thanks to @hopeseekr for getting us near 100% coverage)
|
||||
|
||||
1.0.7
|
||||
-----
|
||||
|
||||
* Added `fix_broken_serialization` to fix broken serialized strings (Thanks to @hopeseekr via [Pull Request #48](https://github.com/brandonwamboldt/utilphp/pull/48))
|
||||
* Fixed `get_current_url` appending port 80 or 443 when not needed (Thanks to @scottchiefbaker via [Pull Request #49](https://github.com/brandonwamboldt/utilphp/pull/49))
|
||||
* `var_dump` can now handle recursive data structures without crashing
|
||||
* `var_dump` code was minified and cleaned up
|
||||
* `array_flatten` was optimized (thanks to @hopeseekr via [Pull Request #47](https://github.com/brandonwamboldt/utilphp/pull/47))
|
||||
* `remove_accents` was completely rewritten and is now ~4x faster
|
||||
|
||||
1.0.6
|
||||
-----
|
||||
|
||||
* Added `start_with` function
|
||||
* Added `ends_with` function
|
||||
* Added `str_contains` function
|
||||
* Added `str_icontains` function
|
||||
* Added `get_file_ext` function
|
||||
* Fixing permissions on the files & directories
|
||||
* Fixing a bug with the include path of util.php
|
||||
|
||||
1.0.5
|
||||
-----
|
||||
|
||||
* [Issue #29](https://github.com/brandonwamboldt/utilphp/issues/29) Fixed error in `var_dump` if mbstring extension wasn't present
|
||||
* Adding Composer support
|
||||
* Updating license from GPL to MIT
|
||||
* Adding Changelog to project
|
||||
* Bumping minimum version to PHP 5.3.3
|
||||
|
||||
1.0.4
|
||||
-----
|
||||
|
||||
* [Issue #22](https://github.com/brandonwamboldt/utilphp/issues/22) Removed all superglobal *_get functions, you can use the modified array_get now
|
||||
* [Issue #22](https://github.com/brandonwamboldt/utilphp/issues/22) Modifed the behaviour of `array_get`, see documentation
|
||||
* [Pull Request #21](https://github.com/brandonwamboldt/utilphp/pull/21) Added multibyte support to html* functions
|
||||
* [Issue #9](https://github.com/brandonwamboldt/utilphp/issues/9) Removed the `str_to_utf8` function
|
||||
* [Issue #3](https://github.com/brandonwamboldt/utilphp/issues/3) Removed the `absint` function
|
||||
* Removed declare() from util.php to avoid errors
|
||||
* Updated PHPUnit tests to use PHPUnit 3.6
|
||||
|
||||
1.0.3
|
||||
-----
|
||||
|
||||
* [Issue #16](https://github.com/brandonwamboldt/utilphp/issues/16) Improved performance of `slugify`
|
||||
* [Issue #14](https://github.com/brandonwamboldt/utilphp/issues/14) Modified the regex for `seems_utf8` to be more accurate
|
||||
* [Issue #13](https://github.com/brandonwamboldt/utilphp/issues/13) Changed `validate_email` to be wrapper for `filter_var`
|
||||
* Added 'ok' to the list of yes words for `str_to_bool`
|
||||
* `str_to_bool` matches no followed by any number of 'o's
|
||||
|
||||
1.0.2
|
||||
-----
|
||||
|
||||
* [Issue #12](https://github.com/brandonwamboldt/utilphp/issues/12) `get_current_url` now includes the port and user/password if required
|
||||
* [Issue #11](https://github.com/brandonwamboldt/utilphp/issues/11) `human_time_diff` now uses the DateTime functions
|
||||
* [Issue #10](https://github.com/brandonwamboldt/utilphp/issues/10) `is_https` no longer checks the port as well
|
||||
|
||||
1.0.1
|
||||
-----
|
||||
|
||||
* [Issue #7](https://github.com/brandonwamboldt/utilphp/issues/7) Added the `$trust_proxy_headers` parameter to `get_client_ip`
|
||||
* [Issue #6](https://github.com/brandonwamboldt/utilphp/issues/6) Removed `is_isset` as the function did not work as intended
|
||||
* [Issue #6](https://github.com/brandonwamboldt/utilphp/issues/6) Removed `is_empty` as it is redundant, use ! with function calls instead
|
||||
* Fixed a bug with `get_gravatar`
|
||||
|
||||
1.0.0
|
||||
-----
|
||||
|
||||
* Initial release of util.php.
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
# CONTRIBUTORS
|
||||
|
||||
Util.php is the combined effort of many people who contributed new functions and features, bug fixes, tests, and documentation.
|
||||
|
||||
# Maintainer / Lead
|
||||
|
||||
* Brandon Wamboldt (http://brandonwamboldt.ca)
|
||||
|
||||
## Third-Party Projects
|
||||
|
||||
The following projects were fully or partially incorporated into util.php (and properly attributed).
|
||||
|
||||
* IntToWords (https://github.com/hemant347/IntToWords)
|
||||
* LinkifyURL (https://github.com/jmrware/LinkifyURL)
|
||||
* URLify.php (https://github.com/jbroadway/urlify/)
|
||||
* Pure PHP http_build_url (https://github.com/jakeasmith/http_build_url)
|
||||
|
||||
## Methods
|
||||
|
||||
The following developers and/or companies helped contribute to building util.php.
|
||||
|
||||
* PHP Experts, Inc. (http://www.phpexperts.pro/)
|
||||
- `array_flatten()`
|
||||
- `fix_broken_serialization()`
|
||||
- Lots of unit tests.
|
||||
* Tony Ferrara (ircmaxwell, http://blog.ircmaxell.com/)
|
||||
- `seemsUtf8Regex()`: http://stackoverflow.com/a/11709412/430062
|
||||
* Askar ([@ARACOOOL](https://github.com/ARACOOOL))
|
||||
- `rmdir()`
|
||||
- `limit_characters()`
|
||||
- `limit_words()`
|
||||
* Anonymous (tmp1000@fastmail.fm)
|
||||
- `htmlspecialentities()`: http://php.timesoft.cc/manual/en/function.htmlentities.php
|
||||
- `htmlspecialchars()`
|
||||
* Laravel Project (https://github.com/laravel/laravel)
|
||||
- `secure_random_string()`: http://trac.allenjb.me.uk/php/browser/tagi/vendor/laravel/framework/src/Illuminate/Support/Str.php?rev=87#L127
|
||||
* Abhimanyu Sharma ([@abhimanyusharma003](https://github.com/abhimanyusharma003))
|
||||
- `limit_characters()`
|
||||
- `limit_words()`
|
||||
- `match_string()`
|
||||
* Scott Baker ([@scottchiefbaker](https://github.com/scottchiefbaker))
|
||||
* [@sergserg](https://github.com/sergserg)
|
||||
- `set_writable()`
|
||||
- `set_executable()`
|
||||
- `set_readable()`
|
||||
- `directory_size()`
|
||||
- `directory_contents()`
|
||||
- `get_user_dir()`
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
The MIT License (MIT)
|
||||
=====================
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Brandon Wamboldt
|
||||
|
||||
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.
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
# Util.php [](https://travis-ci.org/brandonwamboldt/utilphp) [](https://coveralls.io/r/brandonwamboldt/utilphp)
|
||||
|
||||
[UtilPHP](http://brandonwamboldt.github.com/utilphp/) (Aka util.php) is a
|
||||
collection of useful functions and snippets that you need or could use every
|
||||
day. It's implemented as a class with static methods, to avoid conflicts with
|
||||
your existing code-base. Just drop it in and start using it immediately.
|
||||
|
||||
Included are 55+ functions that provide you with the ability to do common
|
||||
tasks much easier and more efficiently, without having to find that one comment
|
||||
on php.net where you know it's been done already. Access superglobals without
|
||||
checking to see if certain indexes are set first and pass default values, use a
|
||||
nicely formatted var dump, validate emails, generate random strings, flatten an
|
||||
array, pull a single column out of a multidimensional array and much more.
|
||||
|
||||
Although it's implemented as one giant class, util.php has extensive
|
||||
documentation and a full suite of unit tests to avoid breaking
|
||||
backwards-compatibility unintentionally.
|
||||
|
||||
## Release Information
|
||||
|
||||
This repo contains in development code for future releases as well as the
|
||||
current stable branch. Development code is contained in the develop branch.
|
||||
|
||||
## Changelog and New Features
|
||||
|
||||
You can find a list of all changes for each release in the
|
||||
[official documentation](http://brandonwamboldt.github.com/utilphp/#changelog)
|
||||
|
||||
## Installation
|
||||
|
||||
### Server Requirements
|
||||
|
||||
* PHP version 5.3.3 or higher.
|
||||
|
||||
### Standalone File
|
||||
|
||||
Simply drop `util.php` in any project and call `include 'util.php';` in your
|
||||
project. You can then access the `Util` class.
|
||||
|
||||
### Composer
|
||||
|
||||
Add the following dependency to your composer.json:
|
||||
|
||||
```
|
||||
"brandonwamboldt/utilphp": "1.0.*"
|
||||
```
|
||||
|
||||
When used with composer, the class is namespaced (`\utilphp\util`) instead of
|
||||
just `util`.
|
||||
|
||||
## Contributing
|
||||
|
||||
UtilPHP is a community driven project and accepts contributions of code and
|
||||
documentation from the community. These contributions are made in the form of
|
||||
Issues or [Pull Requests](http://help.github.com/send-pull-requests/) on the
|
||||
[UtilityPHP repository](https://github.com/brandonwamboldt/utilphp) on GitHub.
|
||||
|
||||
Issues are a quick way to point out a bug. If you find a bug or documentation
|
||||
error in UtilityPHP then please check a few things first:
|
||||
|
||||
* There is not already an open Issue
|
||||
* The issue has already been fixed (check the develop branch, or look for closed Issues)
|
||||
* Is it something really obvious that you fix it yourself?
|
||||
|
||||
Reporting issues is helpful but an even better approach is to send a Pull
|
||||
Request, which is done by "Forking" the main repository and committing to your
|
||||
own copy. This will require you to use the version control system called Git.
|
||||
|
||||
## Guidelines
|
||||
|
||||
Before we look into how, here are the guidelines. If your Pull Requests fail to
|
||||
pass these guidelines it will be declined and you will need to re-submit when
|
||||
you’ve made the changes. This might sound a bit tough, but it is required for
|
||||
me to maintain quality of the code-base.
|
||||
|
||||
### PHP Style
|
||||
|
||||
Please ensure all new contributions match the [PSR-2](http://www.php-fig.org/psr/psr-2/)
|
||||
coding style guide.
|
||||
|
||||
### Documentation
|
||||
|
||||
If you change anything that requires a change to documentation then you will
|
||||
need to add it. New methods, parameters, changing default values, adding
|
||||
constants, etc are all things that will require a change to documentation. The
|
||||
change-log must also be updated for every change. Also PHPDoc blocks must be
|
||||
maintained.
|
||||
|
||||
### PHP Version Compatibility
|
||||
|
||||
UtilityPHP is compatible with PHP 5.3.3 so all code supplied must stick to this
|
||||
requirement.
|
||||
|
||||
Of particular note is avoiding short array notation like this:
|
||||
|
||||
```
|
||||
$var = [];
|
||||
```
|
||||
|
||||
Please use the old notation instead:
|
||||
|
||||
```
|
||||
$var = array();
|
||||
```
|
||||
|
||||
I know it's uglier, but PHP 5.3 while EOL'd, still isn't that old.
|
||||
|
||||
### Branching
|
||||
|
||||
One thing at a time: A pull request should only contain one change. That does
|
||||
not mean only one commit, but one change - however many commits it took. The
|
||||
reason for this is that if you change X and Y but send a pull request for both
|
||||
at the same time, we might really want X but disagree with Y, meaning we cannot
|
||||
merge the request. Using the Git-Flow branching model you can create new
|
||||
branches for both of these features and send two requests.
|
||||
|
||||
## License
|
||||
|
||||
UtilPHP is licensed under the MIT license.
|
||||
|
||||
## Resources
|
||||
|
||||
* [Documentation](http://brandonwamboldt.github.com/utilphp/)
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "brandonwamboldt/utilphp",
|
||||
"type": "library",
|
||||
"version": "1.1.0",
|
||||
"description": "util.php is a collection of useful functions and snippets that you need or could use every day, designed to avoid conflicts with existing projects",
|
||||
"keywords": ["php", "utility", "collection", "helpers"],
|
||||
"homepage": "https://github.com/brandonwamboldt/utilphp",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Brandon Wamboldt",
|
||||
"email": "brandon.wamboldt@gmail.com"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
"psr-0": { "utilphp\\": "src/" }
|
||||
},
|
||||
"require-dev": {
|
||||
"satooshi/php-coveralls": "dev-master"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
}
|
||||
}
|
||||
+168
@@ -0,0 +1,168 @@
|
||||
body {
|
||||
background: #f4f4f4 url('../images/background.png');
|
||||
color: #333;
|
||||
font: 18px/30px "Droid Serif", "Helvetica Neue", Helvetica, Arial;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #f00;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
background: #277585;
|
||||
color: #fff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
margin: 0 0 15px;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 20px 0;
|
||||
min-width: 550px;
|
||||
max-width: 900px;
|
||||
}
|
||||
|
||||
table, tr, td {
|
||||
margin: 0; padding: 0;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 2px 12px 2px 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: circle;
|
||||
padding: 0 0 0 20px;
|
||||
}
|
||||
|
||||
li {
|
||||
width: 500px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
code, pre, tt {
|
||||
font-family: Monaco, Consolas, "Lucida Console", monospace;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
tt {
|
||||
padding: 0px 3px;
|
||||
background: #fff;
|
||||
border: 1px solid #ddd;
|
||||
zoom: 1;
|
||||
}
|
||||
|
||||
code {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
pre {
|
||||
font-size: 12px;
|
||||
padding: 12px;
|
||||
background: #fff;
|
||||
margin: 0px 0 30px;
|
||||
border-radius: 0 0 2px 2px;
|
||||
box-shadow: inset 0 0 0 1px rgba(0,0,0,.15);
|
||||
}
|
||||
|
||||
span.header {
|
||||
font-size: 24px;
|
||||
line-height: 30px;
|
||||
border-left: 10px solid #ddd;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.desc-text code {
|
||||
margin-left: 0;
|
||||
font-size: 18px;
|
||||
color: #0E04C8;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
background: #fff;
|
||||
position: fixed;
|
||||
top: 0; left: 0; bottom: 0;
|
||||
width: 220px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding: 5px 0 30px 10px;
|
||||
border-right: 1px solid #bbb;
|
||||
|
||||
box-shadow: 0 0 20px #ccc;
|
||||
-webkit-box-shadow: 0 0 20px #ccc;
|
||||
-moz-box-shadow: 0 0 20px #ccc;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.toc_title, .toc_title:visited {
|
||||
display: block;
|
||||
color: #000;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.toc_title:hover {
|
||||
background: none;
|
||||
color: #f00;
|
||||
}
|
||||
|
||||
.toc_title .version {
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.toc_section {
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
margin: 5px 0 0 0;
|
||||
padding-left: 10px;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.toc_section li {
|
||||
cursor: pointer;
|
||||
margin: 0 0 3px 0;
|
||||
}
|
||||
|
||||
.toc_section li a {
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.toc_section li a:hover {
|
||||
background: none;
|
||||
color: #f00;
|
||||
}
|
||||
|
||||
.container {
|
||||
min-width: 550px;
|
||||
max-width: 1000px;
|
||||
margin: 40px 0 50px 260px;
|
||||
}
|
||||
|
||||
#documentation section > article > p > code {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
#documentation section > article > p > code > .util_class {
|
||||
color: #bbb;
|
||||
}
|
||||
|
||||
#documentation section > article > p > code > .func_name {
|
||||
color: #0E04C8;
|
||||
}
|
||||
|
||||
#documentation section > article > p > code > .param {
|
||||
color: #DA72F3;
|
||||
}
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 803 B |
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
+1234
@@ -0,0 +1,1234 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
|
||||
<link rel="canonical" href="http://includephp.brandonwamboldt.ca/" />
|
||||
<link rel="shortcut icon" href="favicon.png" type="image/png" />
|
||||
|
||||
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic" />
|
||||
<link rel="stylesheet" href="css/docs.css" />
|
||||
|
||||
<title>util.php - The PHP programmers best friend - UtilityPHP</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="sidebar" class="interface">
|
||||
<a class="toc_title" href="#">util.php <span class="version">(1.1.0)</span></a>
|
||||
|
||||
<a class="toc_title" href="#debug_functions">Debugging</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#var_dump">var_dump</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#arrays">Arrays & Objects</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#array_first">array_first</a></li>
|
||||
<li>- <a href="#array_first_key">array_first_key</a></li>
|
||||
<li>- <a href="#array_flatten">array_flatten</a></li>
|
||||
<li>- <a href="#array_get">array_get</a></li>
|
||||
<li>- <a href="#array_last">array_last</a></li>
|
||||
<li>- <a href="#array_last_key">array_last_key</a></li>
|
||||
<li>- <a href="#array_map_deep">array_map_deep</a></li>
|
||||
<li>- <a href="#array_pluck">array_pluck</a></li>
|
||||
<li>- <a href="#array_search_deep">array_search_deep</a></li>
|
||||
<li>- <a href="#array_clean">array_clean</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#urls">URLs</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#add_query_arg">add_query_arg</a></li>
|
||||
<li>- <a href="#get_current_url">get_current_url</a></li>
|
||||
<li>- <a href="#http_build_url">http_build_url</a></li>
|
||||
<li>- <a href="#is_https">is_https</a></li>
|
||||
<li>- <a href="#remove_query_arg">remove_query_arg</a></li>
|
||||
<li>- <a href="#slugify">slugify</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#strings">Strings</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#htmlentities">htmlentities</a></li>
|
||||
<li>- <a href="#htmlspecialchars">htmlspecialchars</a></li>
|
||||
<li>- <a href="#linkify">linkify</a></li>
|
||||
<li>- <a href="#match_string">match_string</a></li>
|
||||
<li>- <a href="#random_string">random_string</a></li>
|
||||
<li>- <a href="#number_to_word">number_to_word</a></li>
|
||||
<li>- <a href="#ordinal">ordinal</a></li>
|
||||
<li>- <a href="#remove_accents">remove_accents</a></li>
|
||||
<li>- <a href="#secure_random_string">secure_random_string</a></li>
|
||||
<li>- <a href="#seems_utf8">seems_utf8</a></li>
|
||||
<li>- <a href="#safe_truncate">safe_truncate</a></li>
|
||||
<li>- <a href="#size_format">size_format</a></li>
|
||||
<li>- <a href="#str_to_bool">str_to_bool</a></li>
|
||||
<li>- <a href="#zero_pad">zero_pad</a></li>
|
||||
<li>- <a href="#strip_space">strip_space</a></li>
|
||||
<li>- <a href="#sanitize_string">sanitize_string</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<a class="toc_title" href="#files">Files</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#full_permissions">full_permissions</a></li>
|
||||
<li>- <a href="#rmdir">rmdir</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#serialization">Serialization</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#is_serialized">is_serialized</a></li>
|
||||
<li>- <a href="#maybe_serialize">maybe_serialize</a></li>
|
||||
<li>- <a href="#maybe_unserialize">maybe_unserialize</a></li>
|
||||
<li>- <a href="#fix_broken_serialization">fix_broken_serialization</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#other">Other</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#force_download">force_download</a></li>
|
||||
<li>- <a href="#get_client_ip">get_client_ip</a></li>
|
||||
<li>- <a href="#get_gravatar">get_gravatar</a></li>
|
||||
<li>- <a href="#human_time_diff">human_time_diff</a></li>
|
||||
<li>- <a href="#nocache_headers">nocache_headers</a></li>
|
||||
<li>- <a href="#utf8_headers">utf8_headers</a></li>
|
||||
<li>- <a href="#validate_email">validate_email</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#constants">Constants</a>
|
||||
|
||||
<ul class="toc_section">
|
||||
<li>- <a href="#SECONDS_IN_A_MINUTE">SECONDS_IN_A_MINUTE</a></li>
|
||||
<li>- <a href="#SECONDS_IN_AN_HOUR">SECONDS_IN_AN_HOUR</a></li>
|
||||
<li>- <a href="#SECONDS_IN_A_DAY">SECONDS_IN_A_DAY</a></li>
|
||||
<li>- <a href="#SECONDS_IN_A_WEEK">SECONDS_IN_A_WEEK</a></li>
|
||||
<li>- <a href="#SECONDS_IN_A_MONTH">SECONDS_IN_A_MONTH</a></li>
|
||||
<li>- <a href="#SECONDS_IN_A_YEAR">SECONDS_IN_A_YEAR</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="toc_title" href="#changelog">Change Log</a>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<p id="introduction">
|
||||
<img id="logo" src="images/utility_logo.png" alt="Util.php" />
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="http://github.com/brandonwamboldt/utilphp/">util.php</a> is a collection of useful functions and snippets
|
||||
that you need or could use every day. It's implemented as a class with static methods, to avoid conflicts with your
|
||||
existing code-base. Just drop it in and start using it immediately.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Included are 60+ functions that provide you with the ability to do common tasks much easier and more efficiently,
|
||||
without having to find that one comment on php.net where you know its been done already. Access superglobals
|
||||
without checking to see if certain indexes are set first and pass default values, use a nicely formatted var dump,
|
||||
validate emails, generate random strings, flatten an array, pull a single column out of a multidimensional array
|
||||
and much more.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Although it's implemented as one giant class, util.php has extensive documentation and a full suite of unit tests
|
||||
to avoid breaking backwards-compatibility unintentionally.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The project is <a href="http://github.com/brandonwamboldt/utilphp/">hosted on GitHub</a>.
|
||||
You can report bugs and discuss features on the
|
||||
<a href="https://github.com/brandonwamboldt/utilphp/issues">issues page</a>,
|
||||
or send tweets to <a href="http://twitter.com/brandonwamboldt">@brandonwamboldt</a>.
|
||||
</p>
|
||||
|
||||
<h2>Downloads <i style="padding-left: 12px; font-size:12px;">(Right-click, and use "Save As")</i></h2>
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/brandonwamboldt/utilphp/archive/1.1.0.zip">Stable Version (1.1.0)</a><br>
|
||||
<a href="https://github.com/brandonwamboldt/utilphp/zipball/master">Unstable Version (master)</a>
|
||||
</p>
|
||||
|
||||
<h2>Installation</h2>
|
||||
|
||||
<span class="header">Server Requirements</span><br>
|
||||
|
||||
<ul>
|
||||
<li>PHP 5.3.3+</li>
|
||||
</ul>
|
||||
|
||||
<span class="header">Standalone File</span><br>
|
||||
|
||||
<p class="desc-text">
|
||||
Simply drop <code>util.php</code> in any project and call <code>include 'util.php';</code> in your project.
|
||||
You can then access the <code>Util</code> class.
|
||||
</p>
|
||||
|
||||
<span class="header">Composer</span><br>
|
||||
|
||||
<p class="desc-text">
|
||||
Add the following dependency to your composer.json:
|
||||
|
||||
<pre>"brandonwamboldt/utilphp": "1.1.*"</pre>
|
||||
|
||||
When used with composer, the class is namespaced (<code>\utilphp\util</code>) instead of
|
||||
just <code>util</code>.
|
||||
</p>
|
||||
|
||||
<div id="documentation">
|
||||
<h2 id="debug_functions">Debugging Functions</h2>
|
||||
|
||||
<section>
|
||||
<article id="var_dump">
|
||||
<p>
|
||||
<span class="header">var_dump</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">var_dump</span>(mixed <span class="param">$var</span>[, bool <span class="param">$return</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Nicely prints out the contents of a passed variable. Booleans are properly displayed as 'true' or 'false',
|
||||
null values are shown as 'NULL', variable types are displayed, and arrays and objects are displayed as a
|
||||
collapsible tree powered by JavaScript.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre class="usage-example">util::var_dump($var);</pre>
|
||||
|
||||
<img src="images/awesome_var_dump.jpg" style="border: 1px solid #ccc;" />
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="arrays">Array/Object Functions</h2>
|
||||
|
||||
<section>
|
||||
<article id="array_first">
|
||||
<p>
|
||||
<span class="header">array_first</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_first</span>(array <span class="param">$array</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Retrieve the first value from an array. Can be run on function callbacks, and it will not modify the pointer
|
||||
of the source array unlike most other methods of doing this.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_first( ['a', 'b', 'c'] );<br />=> Returns 'a'</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_first_key">
|
||||
<p>
|
||||
<span class="header">array_first_key</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_first_key</span>(array <span class="param">$array</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Retrieve the first key from an array. Can be run on function callbacks, and it will not modify the pointer of
|
||||
the source array unlike most other methods of doing this.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_first_key( $users );<br />=> Returns 'brandon'</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_flatten">
|
||||
<p>
|
||||
<span class="header">array_flatten</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_flatten</span>(array <span class="param">$array</span>[, bool <span class="param">$preserve_keys</span> = TRUE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Flattens a multi-dimensional array into a one dimensional array</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_flatten( [ 'a', 'b', [ 'c', 'd', 'e', [ 'f', 'g', [ [ [ [ 'h', 'i', 'j' ] ] ] ] ] ] ] );
|
||||
=> Returns [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ]</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_get">
|
||||
<p>
|
||||
<span class="header">array_get</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_get</span>(<span class="param">$var</span>[, mixed <span class="param">$default</span> = NULL])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Retrieve a value from an array, or return a given default if the index isn't set</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_get($_POST['action'], 'index');
|
||||
=> If $_POST['action'] is set, returns its value, otherwise returns 'index'
|
||||
util::array_get($_POST['action']['do'], 'index');
|
||||
=> Returns the value of $_POST['action']['do'] or 'index'</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_last">
|
||||
<p>
|
||||
<span class="header">array_last</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_last</span>(array <span class="param">$array</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Retrieve the last value from an array. Can be run on function callbacks, and it will not modify the pointer
|
||||
of the source array unlike most other methods of doing this.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_last( [ 'a', 'b', 'c'] );
|
||||
=> Returns 'c'</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_last_key">
|
||||
<p>
|
||||
<span class="header">array_last_key</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_last_key</span>(array <span class="param">$array</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Retrieve the last key from an array. Can be run on function callbacks, and it will not modify the pointer of
|
||||
the source array unlike most other methods of doing this.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_last_key( $users );
|
||||
=> Returns 'zane'</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_map_deep">
|
||||
<p>
|
||||
<span class="header">array_map_deep</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_map_deep</span>(array <span class="param">$array</span>, callable <span class="param">$callback</span>[, bool <span class="param">$on_nonscalar</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Returns an array containing all the elements of $array after applying the callback function to each one recursively.
|
||||
Particularly useful for avoiding errors when calling functions that only accept scalar values on an array that could
|
||||
contain nested arrays, such as $_GET or $_POST.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_map_deep($_POST, 'htmlentities');
|
||||
=> Recursively escapes each scalar value in $_POST
|
||||
util::array_map_deep($_POST, 'htmlentities', TRUE);
|
||||
=> Recursively escapes each value in $_POST regardless of its type</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_pluck">
|
||||
<p>
|
||||
<span class="header">array_pluck</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_pluck</span>(array <span class="param">$array</span>, string <span class="param">$field</span>[, bool <span class="param">$preserve_keys</span>, bool <span class="param">$remove_nomatches</span>])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Replaces each value in an array with the specified field of the array or object that used to be the value. Very
|
||||
useful when you have an array of objects or arrays from a database, and you only want one specific field. For
|
||||
example, you want an array of emails from an array of users.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_pluck([['val' => 1], ['val' => 2], ['val' => 3]], 'val');
|
||||
=> Returns [1, 2, 3]
|
||||
util::array_pluck($users, 'email');
|
||||
=> Returns an array of email addresses for each user</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_search_deep">
|
||||
<p>
|
||||
<span class="header">array_search_deep</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_search_deep</span>(array <span class="param">$array</span>, mixed <span class="param">$search</span>[, string <span class="param">$field</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Allows you to search for a value in an array of arrays or an array of objects, and return the key of the value
|
||||
that matches the search criteria. If $field is unspecified, the entire array/object is searched.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_search_deep($_POST, 'delete_post');
|
||||
=> Might return 'do' if $_POST['do']['action'] = 'delete_post'
|
||||
util::array_search_deep($users, 'rogue_coder', 'username');
|
||||
=> Might return 5 if $users[5]->username = 'rogue_coder'</pre>
|
||||
</article>
|
||||
|
||||
<article id="array_clean">
|
||||
<p>
|
||||
<span class="header">array_clean</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">array_clean</span>(array <span class="param">$array</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Remove all null/empty/false values from the given array.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::array_clean( array( 'a', 'b', '', null, false, 0) );<br />=> Returns array('a', 'b');</pre>
|
||||
</article>
|
||||
|
||||
</section>
|
||||
|
||||
<h2 id="urls">URL Functions</h2>
|
||||
|
||||
<section>
|
||||
<article id="add_query_arg">
|
||||
<p>
|
||||
<span class="header">add_query_arg</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">add_query_arg</span>()
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Adds one ore more query args to the query string of the current URL or a given URL</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::add_query_arg( 'user', '5', '/admin/users?action=edit' );
|
||||
=> Returns '/admin/users?action=edit&user=5'
|
||||
util::add_query_arg( [ 'user' => 5, 'action' => 'edit' ], '/admin/users' );
|
||||
=> Returns '/admin/users?user=5&action=edit'</pre>
|
||||
</article>
|
||||
|
||||
<article id="get_current_url">
|
||||
<p>
|
||||
<span class="header">get_current_url</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">get_current_url</span>()
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Returns the current URL with hostname</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::get_current_url();
|
||||
=> Returns 'http://brandonwamboldt.ca/utilphp/'</pre>
|
||||
</article>
|
||||
|
||||
<article id="is_https">
|
||||
<p>
|
||||
<span class="header">is_https</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">is_https</span>()
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Returns true if the current page is being loaded over https, false if it isn't</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::is_https();
|
||||
=> Returns false</pre>
|
||||
</article>
|
||||
|
||||
<article id="http_build_url">
|
||||
<p>
|
||||
<span class="header">http_build_url</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">http_build_url</span>([mixed $url[, mixed $parts[, int $flags = HTTP_URL_REPLACE[, array &amo;$new_url]]]])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Pure PHP implementation/polyfill for <a href="http://php.net/http_build_url">http_build_url</a>
|
||||
which requires pecl_http to be installed.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>echo util::http_build_url("http://user@www.example.com/pub/index.php?a=b#files",
|
||||
array(
|
||||
"scheme" => "ftp",
|
||||
"host" => "ftp.example.com",
|
||||
"path" => "files/current/",
|
||||
"query" => "a=c"
|
||||
),
|
||||
HTTP_URL_STRIP_AUTH | HTTP_URL_JOIN_PATH | HTTP_URL_JOIN_QUERY | HTTP_URL_STRIP_FRAGMENT
|
||||
);</pre>
|
||||
|
||||
<p>The above example will output:</p>
|
||||
|
||||
<pre>ftp://ftp.example.com/pub/files/current/?a=c</pre>
|
||||
</article>
|
||||
|
||||
<article id="is_https">
|
||||
<p>
|
||||
<span class="header">is_https</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">is_https</span>()
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Returns true if the current page is being loaded over https, false if it isn't</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::is_https();
|
||||
=> Returns false</pre>
|
||||
</article>
|
||||
|
||||
<article id="remove_query_arg">
|
||||
<p>
|
||||
<span class="header">remove_query_arg</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">remove_query_arg</span>( array|string <span class="param">$query_args</span>[, string <span class="param">$url</span>])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Removes one ore more query args from the query string of the current URL or a given URL</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::remove_query_arg( 'action', '/admin/users?action=edit&user=5' );
|
||||
=> Returns '/admin/users?user=5'
|
||||
util::remove_query_arg( [ 'user', 'action'], '/admin/users?action=edit&user=5' );
|
||||
=> Returns '/admin/users'</pre>
|
||||
</article>
|
||||
|
||||
<article id="slugify">
|
||||
<p>
|
||||
<span class="header">slugify</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">slugify</span>(string <span class="param">$string</span>[, string <span class="param">$separator</span> = "-", bool <span class="param">$css_mode</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Generate a string safe for use in URLs from any given string. Converts any accent characters
|
||||
to their equivalent normal characters and converts any other non-alphanumeric characters to
|
||||
dashes, then converts any sequence of two or more dashes to a single dash. This function
|
||||
generates slugs safe for use as URLs, and if you pass TRUE as the second parameter, it will
|
||||
create strings safe for use as CSS classes or IDs.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::slugify('This is a random --string with an Ãccent');
|
||||
=> Returns 'this-is-a-random-string-with-an-accent'
|
||||
util::slugify('Another String', '.');
|
||||
=> Returns 'another.string'</pre>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="strings">String Functions</h2>
|
||||
|
||||
<section>
|
||||
<article id="htmlentities">
|
||||
<p>
|
||||
<span class="header">htmlentities</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">htmlentities</span>(string <span class="param">$string</span>[, bool <span class="param">$preserve_encoded_entities</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Executes htmlentities with ENT_QUOTES set by default. However, if you pass TRUE as
|
||||
the second parameter, it will not re-encode entities that are already encoded.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::htmlentities('this string < this string', TRUE);
|
||||
=> Returns 'this string < this string'</pre>
|
||||
</article>
|
||||
|
||||
<article id="htmlspecialchars">
|
||||
<p>
|
||||
<span class="header">htmlspecialchars</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">htmlspecialchars</span>(string <span class="param">$string</span>[, bool <span class="param">$preserve_encoded_entities</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Executes htmlspecialchars with ENT_QUOTES set by default. However, if you pass TRUE as
|
||||
the second parameter, it will not re-encode entities that are already encoded.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::htmlspecialchars('this string < this string', TRUE);
|
||||
=> Returns 'this string < this string'</pre>
|
||||
</article>
|
||||
|
||||
<article id="linkify">
|
||||
<p>
|
||||
<span class="header">linkify</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">linkify</span>(string <span class="param">$text</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Find's any URLs in the specified text and wraps them with HTML anchor tags</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::linkify('this string has a link to www.google.com');
|
||||
=> Returns 'this string has a link to <a href="http://wwww.google.com/">www.google.com</a>'</pre>
|
||||
</article>
|
||||
|
||||
<article id="match_string">
|
||||
<p>
|
||||
<span class="header">match_string</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">match_string</span>(string <span class="param">$pattern</span>, string <span class="param">$string</span>[, bool <span class="param">$caseSensitive</span> = true])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Check if a string matches a given pattern. You can use '*' as a wildcard character.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::match_string("test/*", "test/my/test");
|
||||
=> Returns true
|
||||
util::match_string("test/", "test/my/test");
|
||||
=> Returns false</pre>
|
||||
</article>
|
||||
|
||||
<article id="random_string">
|
||||
<p>
|
||||
<span class="header">random_string</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">random_string</span>(int <span class="param">$length</span>[, bool <span class="param">$human_friendly</span> = TRUE, bool <span class="param">$include_symbols</span> = FALSE, bool <span class="param">$no_duplicate_chars</span> = FALSE])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Generates a random string of the specified length. Human friendly mode
|
||||
will exclude characters that can be confused with other characters, such
|
||||
as 0 (zero) and O (capital o), 1 (one) and l (lowercase L).
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::random_string(8);
|
||||
=> Returns 'a6BiF4UW'</pre>
|
||||
</article>
|
||||
|
||||
<article id="number_to_word">
|
||||
<p>
|
||||
<span class="header">number_to_word</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">number_to_word</span>(int|float <span class="param">$number</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Converts a number into its text equivalent. For example, 56 becomes fifty-six.</p>
|
||||
|
||||
<pre>util::number_to_word(512.5);
|
||||
=> Returns 'five hundred and twelve point five'</pre>
|
||||
</article>
|
||||
|
||||
<article id="ordinal">
|
||||
<p>
|
||||
<span class="header">ordinal</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">ordinal</span>(int <span class="param">$number</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Returns the ordinal version of a number (appends th, st, nd, rd)</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::ordinal(22);
|
||||
=> Returns '22nd'</pre>
|
||||
</article>
|
||||
|
||||
<article id="remove_accents">
|
||||
<p>
|
||||
<span class="header">remove_accents</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">remove_accents</span>(string <span class="param">$string</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Converts all accent characters to their ASCII equivalents</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::remove_accents('Àccent');
|
||||
=> Returns 'Accent'</pre>
|
||||
</article>
|
||||
|
||||
<article id="secure_random_string">
|
||||
<p>
|
||||
<span class="header">secure_random_string</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">secure_random_string</span>(int <span class="param">$length</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Generate a random string of characters. Will attempt to use a secure source (openssl).</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::secure_random_string(16);
|
||||
=> Returns '5bB1RJH0cQhNjviT'</pre>
|
||||
</article>
|
||||
|
||||
<article id="seems_utf8">
|
||||
<p>
|
||||
<span class="header">seems_utf8</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">seems_utf8</span>(string <span class="param">$string</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Checks to see if a given string is UTF-8 encoded/safe</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::seems_utf8('This is some random string user input');
|
||||
=> Returns true</pre>
|
||||
</article>
|
||||
|
||||
<article id="safe_truncate">
|
||||
<p>
|
||||
<span class="header">safe_truncate</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">safe_truncate</span>(string <span class="param">$string</span>, int <span class="param">$length</span>[, string <span class="param">$append</span> = '...'])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Truncate a string to a specified length without cutting a word off</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::safe_truncate('The quick brown fox jumps over the lazy dog', 24);
|
||||
=> Returns 'The quick brown fox...'</pre>
|
||||
</article>
|
||||
|
||||
<article id="size_format">
|
||||
<p>
|
||||
<span class="header">size_format</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">size_format</span>(int <span class="param">$bytes</span>[, int <span class="param">$decimals</span> = 0])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Formats an integer as a human friendly size string, such as 4 KiB.</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::size_format( 25151251, 2 );
|
||||
=> Returns '23.99 MiB'</pre>
|
||||
</article>
|
||||
|
||||
<article id="str_to_bool">
|
||||
<p>
|
||||
<span class="header">str_to_bool</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">str_to_bool</span>(string <span class="param">$string</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Converts a string to boolean, looking for yes/no words like 'yes', 'no', 'true', 'false', 'y', 'n', etc</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::str_to_bool('yes');
|
||||
=> Returns true</pre>
|
||||
</article>
|
||||
|
||||
<article id="zero_pad">
|
||||
<p>
|
||||
<span class="header">zero_pad</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">zero_pad</span>(int <span class="param">$number</span>, int <span class="param">$length</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Pads a given number with zeroes on the left</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::zero_pad(341, 8);
|
||||
=> Returns '00000341'</pre>
|
||||
</article>
|
||||
|
||||
<article id="strip_space">
|
||||
<p>
|
||||
<span class="header">strip_space</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">strip_space</span>(string <span class="param">$string</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Strip all withspace from the given string</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::strip_space(' The quick brown fox jumps over the lazy dog ');
|
||||
=> Returns 'Thequickbrownfoxjumpsoverthelazydog'</pre>
|
||||
</article>
|
||||
|
||||
<article id="sanitize_string">
|
||||
<p>
|
||||
<span class="header">sanitize_string</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">sanitize_string</span>(string <span class="param">$string</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Sanitize a string by performing the following operation :
|
||||
<ul>
|
||||
<li>Remove accents</li>
|
||||
<li>Lower the string</li>
|
||||
<li>Remove punctuation characters</li>
|
||||
<li>Strip whitespaces</li>
|
||||
</ul>
|
||||
|
||||
</p>
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::sanitize_string(' Benoit! à New-York? j’ai perçu 1 % : Qu’as-tu "gagné" chez M. V. Noël? Dix francs.');
|
||||
=> Returns 'benoitanewyorkjaipercu1quastugagnechezmvnoeldixfrancs'</pre>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="files">Files</h2>
|
||||
|
||||
<section>
|
||||
<article id="full_permissions">
|
||||
<p>
|
||||
<span class="header">full_permissions</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">full_permissions</span>(string <span class="param">$file</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Returns the file permissions as a nice string, like -rw-r--r--</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::full_permissions('/etc/passwd');
|
||||
=> Returns '-rw-r--r--'</pre>
|
||||
</article>
|
||||
|
||||
<article id="rmdir">
|
||||
<p>
|
||||
<span class="header">rmdir</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">rmdir</span>(string <span class="param">$dir</span>[, bool <span class="param">$traverseSymlinks</span> = false])
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Recursively deletes a directories (including all contents).</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::rmdir('/tmp/working/dir');
|
||||
=> Returns true</pre>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="serialization">Serialization</h2>
|
||||
|
||||
<section>
|
||||
<article id="is_serialized">
|
||||
<p>
|
||||
<span class="header">is_serialized</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">is_serialized</span>(mixed <span class="param">$data</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Checks to see if a given variable is a seralized data structure</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::is_serialized( 'a:0:{}' );
|
||||
=> Returns true</pre>
|
||||
</article>
|
||||
|
||||
<article id="maybe_serialize">
|
||||
<p>
|
||||
<span class="header">maybe_serialize</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">maybe_serialize</span>(mixed <span class="param">$data</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Serialize data, if needed to store in plaintext (Arrays or objects)</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::maybe_serialize( 5 );
|
||||
=> Returns 5
|
||||
util::maybe_serialize( array() );
|
||||
=> Returns 'a:0:{}'</pre>
|
||||
</article>
|
||||
|
||||
<article id="maybe_unserialize">
|
||||
<p>
|
||||
<span class="header">maybe_unserialize</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">maybe_unserialize</span>(mixed <span class="param">$data</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Unserialize data, if it's a serialized string</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::maybe_unserialize(5);
|
||||
=> Returns 5
|
||||
util::maybe_unserialize("a:0:{}");
|
||||
=> Returns array()</pre>
|
||||
</article>
|
||||
|
||||
<article id="fix_broken_serialization">
|
||||
<p>
|
||||
<span class="header">fix_broken_serialization</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">fix_broken_serialization</span>(mixed <span class="param">$data</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Attempt to fix a broken serialization string (e.g. where string offsets are incorrect). Can fix
|
||||
errors that frequently occur with mismatched character sets or higher-than-ASCII characters.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::fix_broken_serialization('a:1:{s:4:"test";s:4:"abc";}');
|
||||
=> Returns 'a:1:{s:4:"test";s:3:"abc";}'</pre>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="other">Other</h2>
|
||||
|
||||
<section>
|
||||
<article id="force_download">
|
||||
<p>
|
||||
<span class="header">force_download</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">force_download</span>(string <span class="param">$filename</span>, string <span class="param">$content</span> = FALSE)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Transmit headers that force a browser to display the download file dialog. Cross
|
||||
browser compatible. Only fires if headers have not already been sent.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::force_download( 'export.csv', file_get_contents( 'securefile.csv' ) );
|
||||
=> The user will be prompted to download the file</pre>
|
||||
</article>
|
||||
|
||||
<article id="get_client_ip">
|
||||
<p>
|
||||
<span class="header">get_client_ip</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">get_client_ip</span>(bool <span class="param">$trust_proxy_headers</span> = FALSE)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Returns the IP address of the client. Only enable $trust_proxy_headers if your server is behind a proxy
|
||||
that sets the HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR headers.
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::get_client_ip();
|
||||
=> Returns '12.123.12.100'</pre>
|
||||
</article>
|
||||
|
||||
<article id="get_gravatar">
|
||||
<p>
|
||||
<span class="header">get_gravatar</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">get_gravatar</span>(string <span class="param">$email</span>, int <span class="param">$size</span> = 32)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Return the URL to a user's gravatar</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::get_gravatar('brandon.wamboldt@gmail.com');
|
||||
=> Returns 'http://www.gravatar.com/avatar/46679faeb6780ecb1ea57527fdc66eb3?s=32'</pre>
|
||||
</article>
|
||||
|
||||
<article id="human_time_diff">
|
||||
<p>
|
||||
<span class="header">human_time_diff</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">human_time_diff</span>(int <span class="param">$from</span>, int <span class="param">$to</span> = '', int <span class="param">$as_text</span> = FALSE, string <span class="param">$suffix</span> = ' ago')
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Converts a unix timestamp to a relative time string, such as "3 days ago" or "2 weeks ago"</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::human_time_diff(time() - 7400);
|
||||
=> Returns '2 hours ago'
|
||||
util::human_time_diff(time() - 7400, '', TRUE);
|
||||
=> Returns 'two hours ago'</pre>
|
||||
</article>
|
||||
|
||||
<article id="nocache_headers">
|
||||
<p>
|
||||
<span class="header">nocache_headers</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">nocache_headers</span>(mixed <span class="param">$data</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Sets the headers to prevent caching for the different browsers</p>
|
||||
|
||||
<p>
|
||||
Different browsers support different nocache headers, so several headers must be sent
|
||||
so that all of them get the point that no caching should occur
|
||||
</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::nocache_headers();</pre>
|
||||
</article>
|
||||
|
||||
<article id="utf8_headers">
|
||||
<p>
|
||||
<span class="header">utf8_headers</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">utf8_headers</span>(mixed <span class="param">$content_type</span> = 'text/html')
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Transmit UTF-8 content headers if the headers haven't already been sent</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::utf8_headers();</pre>
|
||||
</article>
|
||||
|
||||
<article id="validate_email">
|
||||
<p>
|
||||
<span class="header">validate_email</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">validate_email</span>(string <span class="param">$possible_email</span>)
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>Validate an email address</p>
|
||||
|
||||
<p><strong>Usage:</strong></p>
|
||||
|
||||
<pre>util::validate_email( 'brandon.wamboldt@gmail.com' );
|
||||
=> Returns true
|
||||
util::validate_email( 'not an email' );
|
||||
=> Returns false</pre>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="constants">Constants</h2>
|
||||
|
||||
<section>
|
||||
<article id="SECONDS_IN_A_MINUTE">
|
||||
<p>
|
||||
<span class="header">SECONDS_IN_A_MINUTE</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_MINUTE</span>
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>The number of seconds in a minute, useful for making code more verbose</p>
|
||||
</article>
|
||||
|
||||
<article id="SECONDS_IN_AN_HOUR">
|
||||
<p>
|
||||
<span class="header">SECONDS_IN_AN_HOUR</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_AN_HOUR</span>
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>The number of seconds in an hour, useful for making code more verbose</p>
|
||||
</article>
|
||||
|
||||
<article id="SECONDS_IN_A_DAY">
|
||||
<p>
|
||||
<span class="header">SECONDS_IN_A_DAY</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_DAY</span>
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>The number of seconds in a day, useful for making code more verbose</p>
|
||||
</article>
|
||||
|
||||
<article id="SECONDS_IN_A_WEEK">
|
||||
<p>
|
||||
<span class="header">SECONDS_IN_A_WEEK</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_WEEK</span>
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>The number of seconds in a week (7 days), useful for making code more verbose</p>
|
||||
</article>
|
||||
|
||||
<article id="SECONDS_IN_A_MONTH">
|
||||
<p>
|
||||
<span class="header">SECONDS_IN_A_MONTH</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_MONTH</span>
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>The number of seconds in a month (30 days), useful for making code more verbose</p>
|
||||
</article>
|
||||
|
||||
<article id="SECONDS_IN_A_YEAR">
|
||||
<p>
|
||||
<span class="header">SECONDS_IN_A_YEAR</span>
|
||||
<code>
|
||||
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_YEAR</span>
|
||||
</code>
|
||||
</p>
|
||||
|
||||
<p>The number of seconds in a year (365 days), useful for making code more verbose</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<h2 id="changelog">Change Log</h2>
|
||||
|
||||
<!--
|
||||
Find: `(.*?)`
|
||||
Replace: <code>\1<\/code>
|
||||
|
||||
Find: \[(.*?)\]\((.*?)\)
|
||||
Replace: <a href="\2">\1</a>
|
||||
-->
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.1.0</span><br>
|
||||
|
||||
This release introduces a deprecation notice for <code>slugify()</code>, please update your code.<br><br>
|
||||
|
||||
- Added a cryptographically secure random string function <code>secure_random_string</code>. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/53">Pull Request #53</a><br>
|
||||
- Added <code>limit_characters</code> and <code>limit_words</code> functions. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/55">Pull Request #55</a><br>
|
||||
- Added <code>rmdir</code> method to recursively delete a directory. Thanks to @ARACOOOL via <a href="https://github.com/brandonwamboldt/utilphp/pull/56">Pull Request #56</a><br>
|
||||
- Added <code>set_executable</code>, <code>set_readable</code>, <code>set_writable</code>, <code>directory_size</code>, <code>directory_contents</code> and <code>get_user_dir</code> functions. Thanks to @sergserg via <a href="https://github.com/brandonwamboldt/utilphp/pull/70">Pull Request #70</a><br>
|
||||
- Changed parameter ordering for <code>slugify</code>, <code>$css_mode</code> is now the third argument. For backwards compatibility, the old order will still work but it will generate an <code>E_USER_DEPRECATED</code> warning. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/71">Pull Request #71</a><br>
|
||||
- Added <code>match_string</code> method. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/72">Pull Request #72</a><br>
|
||||
- Renamed internal methods (protected ones) for PSR-2 compliance<br>
|
||||
- General performance improvements, code quality improvements, and increased unit test coverage (special thanks to @hopeseekr for getting us near 100% coverage)<br>
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.7</span><br>
|
||||
- Added <code>fix_broken_serialization</code> to fix broken serialized strings (Thanks to @hopeseekr via <a href="https://github.com/brandonwamboldt/utilphp/pull/48">Pull Request #48</a>)<br>
|
||||
- Fixed <code>get_current_url</code> appending port 80 or 443 when not needed (Thanks to @scottchiefbaker via <a href="https://github.com/brandonwamboldt/utilphp/pull/49">Pull Request #49</a>)<br>
|
||||
- <code>var_dump</code> can now handle recursive data structures without crashing<br>
|
||||
- <code>var_dump</code> code was minified and cleaned up<br>
|
||||
- <code>array_flatten</code> was optimized (thanks to @hopeseekr via <a href="https://github.com/brandonwamboldt/utilphp/pull/47">Pull Request #47</a>)<br>
|
||||
- <code>remove_accents</code> was completely rewritten and is now ~4x faster<br>
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.6</span><br>
|
||||
- Added <code>start_with</code> function<br>
|
||||
- Added <code>ends_with</code> function<br>
|
||||
- Added <code>str_contains</code> function<br>
|
||||
- Added <code>str_icontains</code> function<br>
|
||||
- Added <code>get_file_ext</code> function<br>
|
||||
- Fixing permissions on the files & directories<br>
|
||||
- Fixing a bug with the include path of util.php<br>
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.5</span><br>
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/29">Issue #29</a> Fixed error in <code>var_dump</code> if mbstring extension wasn't present<br>
|
||||
- Adding Composer support<br>
|
||||
- Updating license from GPL to MIT<br>
|
||||
- Adding Changelog to project<br>
|
||||
- Bumping minimum version to PHP 5.3.3<br>
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.4</span><br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/22">Issue #22</a> Removed all superglobal *_get functions, you can use the modified <code>array_get</code> now<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/22">Issue #22</a> Modifed the behaviour of <code>array_get</code>, see documentation<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/pull/21">Pull Request #21</a> Added multibyte support to html* functions<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/9">Issue #9</a> Removed the <code>str_to_utf8</code> function<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/3">Issue #3</a> Removed the absint function<br />
|
||||
- Removed declare() from util.php to avoid errors<br />
|
||||
- Updated PHPUnit tests to use PHPUnit 3.6
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.3</span><br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/16">Issue #16</a> Improved performance of <code>slugify</code><br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/14">Issue #14</a> Modified the regex for <code>seems_utf8</code> to be more accurate<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/13">Issue #13</a> Changed <code>validate_email</code> to be wrapper for <code>filter_var</code><br />
|
||||
- Added 'ok' to the list of yes words for <code>str_to_bool</code><br />
|
||||
- <code>str_to_bool</code> matches no followed by any number of 'o's
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.2</span><br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/12">Issue #12</a> <code>get_current_url</code> now includes the port and user/password if required<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/11">Issue #11</a> <code>human_time_diff</code> now uses the DateTime functions<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/10">Issue #10</a> <code>is_https</code> no longer checks the port as well
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.1</span><br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/7">Issue #7</a> Added the <code style="color:#DA72F3">$trust_proxy_headers</code> parameter to <code>get_client_ip</code><br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/6">Issue #6</a> Removed <code>is_isset</code> as the function did not work as intended<br />
|
||||
- <a href="https://github.com/brandonwamboldt/utilphp/issues/6">Issue #6</a> Removed <code>is_empty</code> as it is redundant, use ! with function calls instead<br />
|
||||
- Fixed a bug with <code>get_gravatar</code>
|
||||
</p>
|
||||
|
||||
<p class="desc-text">
|
||||
<span class="header">1.0.0</span><br />
|
||||
Initial release of util.php.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Tests suite">
|
||||
<directory>./tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory>./src</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
<logging>
|
||||
<log type="coverage-clover" target="build/logs/clover.xml"/>
|
||||
</logging>
|
||||
</phpunit>
|
||||
+2535
File diff suppressed because one or more lines are too long
+39
@@ -0,0 +1,39 @@
|
||||
# UtilityPHP Unit Tests #
|
||||
|
||||
### Introduction
|
||||
|
||||
This is the testing documentation for util.php. The unit tests require PHPUnit,
|
||||
and can be run in your web browser.
|
||||
|
||||
### Requirements
|
||||
|
||||
PHP Unit >= 3.5.6
|
||||
|
||||
#### Installation of PHPUnit
|
||||
|
||||
# Download the PHPUnit phar.
|
||||
wget https://phar.phpunit.de/phpunit.phar
|
||||
|
||||
# You can just run it locally. (Preferred for Windows)
|
||||
php phpunit.phar --version
|
||||
|
||||
# Or install it system-wide.
|
||||
mv phpunit.phar phpunit
|
||||
chmod +x phpunit
|
||||
sudo mv phpunit /usr/local/bin
|
||||
phpunit --version
|
||||
|
||||
## Test Suites:
|
||||
|
||||
util.php includes a phpunit config file, so just run `phpunit` from the working
|
||||
directory to run the test suite.
|
||||
|
||||
```
|
||||
phpunit
|
||||
```
|
||||
|
||||
If you want code coverage reports, use the following:
|
||||
|
||||
```
|
||||
phpunit --coverage-html ./report
|
||||
```
|
||||
+1183
@@ -0,0 +1,1183 @@
|
||||
<?php
|
||||
|
||||
date_default_timezone_set('UTC');
|
||||
|
||||
require_once dirname(__FILE__) . '/../util.php';
|
||||
|
||||
class VarDumpExperiment
|
||||
{
|
||||
public $public = 1;
|
||||
protected $protected = 2;
|
||||
private $private = 3;
|
||||
public $data;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->data = (object)array('a', 'b', 'c');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* PHPUnit test case for the util.php library
|
||||
*
|
||||
* @author Brandon Wamboldt <brandon.wamboldt@gmail.com>
|
||||
* @since 1.0.000
|
||||
*/
|
||||
class UtilityPHPTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* Allows for the testing of private and protected methods.
|
||||
*
|
||||
* @param $name
|
||||
* @return \ReflectionMethod
|
||||
*/
|
||||
protected static function getMethod($name)
|
||||
{
|
||||
$class = new \ReflectionClass('util');
|
||||
$method = $class->getMethod($name);
|
||||
$method->setAccessible(true);
|
||||
return $method;
|
||||
}
|
||||
|
||||
public function test_array_get()
|
||||
{
|
||||
$_GET = array();
|
||||
$_GET['abc'] = 'def';
|
||||
$_GET['nested'] = array( 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3' );
|
||||
|
||||
// Looks for $array['abc']
|
||||
$this->assertEquals( 'def', util::array_get( $_GET['abc'] ) );
|
||||
|
||||
// Looks for $array['nested']['key2']
|
||||
$this->assertEquals( 'val2', util::array_get( $_GET['nested']['key2'] ) );
|
||||
|
||||
// Looks for $array['doesnotexist']
|
||||
$this->assertEquals( 'defaultval', util::array_get( $_GET['doesnotexist'], 'defaultval' ) );
|
||||
}
|
||||
|
||||
public function test_slugify()
|
||||
{
|
||||
$this->assertEquals( 'a-simple-title', util::slugify( 'A simple title' ) );
|
||||
$this->assertEquals( 'this-post-it-has-a-dash', util::slugify( 'This post -- it has a dash' ) );
|
||||
$this->assertEquals( '123-1251251', util::slugify( '123----1251251' ) );
|
||||
$this->assertEquals( 'one23-1251251', util::slugify( '123----1251251', '-', true ) );
|
||||
|
||||
$this->assertEquals( 'a-simple-title', util::slugify( 'A simple title', '-' ) );
|
||||
$this->assertEquals( 'this-post-it-has-a-dash', util::slugify( 'This post -- it has a dash', '-' ) );
|
||||
$this->assertEquals( '123-1251251', util::slugify( '123----1251251', '-' ) );
|
||||
$this->assertEquals( 'one23-1251251', util::slugify( '123----1251251', '-', true ) );
|
||||
|
||||
$this->assertEquals( 'a_simple_title', util::slugify( 'A simple title', '_' ) );
|
||||
$this->assertEquals( 'this_post_it_has_a_dash', util::slugify( 'This post -- it has a dash', '_' ) );
|
||||
$this->assertEquals( '123_1251251', util::slugify( '123----1251251', '_' ) );
|
||||
$this->assertEquals( 'one23_1251251', util::slugify( '123----1251251', '_', true ) );
|
||||
|
||||
// Blank seperator test
|
||||
$this->assertEquals( 'asimpletitle', util::slugify( 'A simple title', '' ) );
|
||||
$this->assertEquals( 'thispostithasadash', util::slugify( 'This post -- it has a dash', '' ) );
|
||||
$this->assertEquals( '1231251251', util::slugify( '123----1251251', '' ) );
|
||||
$this->assertEquals( 'one231251251', util::slugify( '123----1251251', '', true ) );
|
||||
|
||||
// Test old parameter ordering for backwards compatability
|
||||
error_reporting(E_ALL ^ E_USER_DEPRECATED);
|
||||
$this->assertEquals( 'one23-1251251', util::slugify( '123----1251251', true ) );
|
||||
$this->assertEquals( '123-1251251', util::slugify( '123----1251251', false ) );
|
||||
}
|
||||
|
||||
public function test_seems_utf8()
|
||||
{
|
||||
// Test a valid UTF-8 sequence: "ÜTF-8 Fµñ".
|
||||
$validUTF8 = "\xC3\x9CTF-8 F\xC2\xB5\xC3\xB1";
|
||||
$this->assertTrue( util::seems_utf8( $validUTF8 ) );
|
||||
|
||||
$this->assertTrue( util::seems_utf8( "\xEF\xBF\xBD this has \xEF\xBF\xBD\xEF\xBF\xBD some invalid utf8 \xEF\xBF\xBD" ) );
|
||||
|
||||
// Test invalid UTF-8 sequences
|
||||
$invalidUTF8 = "\xc3 this has \xe6\x9d some invalid utf8 \xe6";
|
||||
$this->assertFalse( util::seems_utf8( $invalidUTF8 ) );
|
||||
|
||||
// And test some plain ASCII
|
||||
$this->assertTrue( util::seems_utf8( 'The quick brown fox jumps over the lazy dog' ) );
|
||||
|
||||
// Test an invalid non-UTF-8 string.
|
||||
if (function_exists('mb_convert_encoding')) {
|
||||
mb_internal_encoding('UTF-8');
|
||||
// Converts the 'ç' UTF-8 character to UCS-2LE
|
||||
$utf8Char = pack('n', 50087);
|
||||
$ucsChar = mb_convert_encoding($utf8Char, 'UCS-2LE', 'UTF-8');
|
||||
|
||||
// Ensure that PHP's internal encoding system isn't malconfigured.
|
||||
$this->assertEquals( $utf8Char, 'ç', 'This PHP system\'s internal character set is not properly set as UTF-8.' );
|
||||
$this->assertEquals( $utf8Char, pack('n', 50087), 'Something is wrong with your ICU unicode library.' );
|
||||
|
||||
// Test for not UTF-8.
|
||||
$this->assertFalse( util::seems_utf8( $ucsChar) );
|
||||
|
||||
// Test the worker method.
|
||||
$method = self::getMethod('seemsUtf8Regex');
|
||||
$this->assertFalse($method->invoke(null, $invalidUTF8), 'util::seemsUtf8Regex did not properly detect invalid UTF-8.');
|
||||
$this->assertTrue($method->invoke(null, $validUTF8), 'util::seemsUtf8Regex did not properly detect valid UTF-8.');
|
||||
}
|
||||
}
|
||||
|
||||
public function test_size_format()
|
||||
{
|
||||
$size = util::size_format( 512, 0 );
|
||||
$this->assertEquals( '512 B', $size );
|
||||
|
||||
$size = util::size_format( 2048, 1 );
|
||||
$this->assertEquals( '2.0 KiB', $size );
|
||||
|
||||
$size = util::size_format( 25151251, 2 );
|
||||
$this->assertEquals( '23.99 MiB', $size );
|
||||
|
||||
$size = util::size_format( 19971597926, 2 );
|
||||
$this->assertEquals( '18.60 GiB', $size );
|
||||
|
||||
$size = util::size_format( 2748779069440, 1 );
|
||||
$this->assertEquals( '2.5 TiB', $size );
|
||||
|
||||
$size = util::size_format( 2.81475e15, 1 );
|
||||
$this->assertEquals( '2.5 PiB', $size );
|
||||
|
||||
$size = util::size_format( 2.81475e19, 1 );
|
||||
$this->assertEquals( '25000.0 PiB', $size );
|
||||
}
|
||||
|
||||
public function test_maybe_serialize()
|
||||
{
|
||||
$obj = new stdClass();
|
||||
$obj->prop1 = 'Hello';
|
||||
$obj->prop2 = 'World';
|
||||
|
||||
$this->assertEquals( 'This is a string', util::maybe_serialize( 'This is a string' ) );
|
||||
$this->assertEquals( 5.81, util::maybe_serialize( 5.81 ) );
|
||||
$this->assertEquals( 'a:0:{}', util::maybe_serialize( array() ) );
|
||||
$this->assertEquals( 'O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}', util::maybe_serialize( $obj ) );
|
||||
$this->assertEquals( 'a:4:{i:0;s:4:"test";i:1;s:4:"blah";s:5:"hello";s:5:"world";s:5:"array";O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}}', util::maybe_serialize( array( 'test', 'blah', 'hello' => 'world', 'array' => $obj ) ) );
|
||||
}
|
||||
|
||||
public function test_maybe_unserialize()
|
||||
{
|
||||
$obj = new stdClass();
|
||||
$obj->prop1 = 'Hello';
|
||||
$obj->prop2 = 'World';
|
||||
|
||||
$this->assertNull(util::maybe_unserialize(serialize(null)));
|
||||
$this->assertFalse(util::maybe_unserialize(serialize(false)));
|
||||
|
||||
$this->assertEquals( 'This is a string', util::maybe_unserialize( 'This is a string' ) );
|
||||
$this->assertEquals( 5.81, util::maybe_unserialize( 5.81 ) );
|
||||
$this->assertEquals( array(), util::maybe_unserialize( 'a:0:{}' ) );
|
||||
$this->assertEquals( $obj, util::maybe_unserialize( 'O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}' ) );
|
||||
$this->assertEquals( array( 'test', 'blah', 'hello' => 'world', 'array' => $obj ), util::maybe_unserialize( 'a:4:{i:0;s:4:"test";i:1;s:4:"blah";s:5:"hello";s:5:"world";s:5:"array";O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}}' ) );
|
||||
|
||||
// Test a broken serialization.
|
||||
$expectedData = array(
|
||||
'Normal',
|
||||
'High-value Char: '.chr(231).'a-va?', // High-value Char: ça-va? [in ISO-8859-1]
|
||||
);
|
||||
|
||||
$brokenSerialization = 'a:2:{i:0;s:6:"Normal";i:1;s:23:"High-value Char: ▒a-va?";}';
|
||||
|
||||
$unserializedData = util::maybe_unserialize($brokenSerialization);
|
||||
$this->assertEquals($expectedData[0], $unserializedData[0], 'Did not properly fix the broken serialized data.');
|
||||
$this->assertEquals(substr($expectedData[1], 0, 10), substr($unserializedData[1], 0, 10), 'Did not properly fix the broken serialized data.');
|
||||
|
||||
// Test unfixable serialization.
|
||||
$unfixableSerialization = 'a:2:{i:0;s:6:"Normal";}';
|
||||
$this->assertEquals($unfixableSerialization, util::maybe_unserialize($unfixableSerialization), 'Somehow the [previously?] impossible happened and utilphp thinks it has unserialized an unfixable serialization.');
|
||||
}
|
||||
|
||||
public function test_is_serialized()
|
||||
{
|
||||
$this->assertFalse( util::is_serialized(1) );
|
||||
$this->assertFalse( util::is_serialized(null) );
|
||||
$this->assertFalse( util::is_serialized( 's:4:"test;' ) );
|
||||
$this->assertFalse( util::is_serialized( 'a:0:{}!' ) );
|
||||
$this->assertFalse( util::is_serialized( 'a:0' ) );
|
||||
$this->assertFalse( util::is_serialized( 'This is a string' ) );
|
||||
$this->assertFalse( util::is_serialized( 'a string' ) );
|
||||
$this->assertFalse( util::is_serialized( 'z:0;' ) );
|
||||
$this->assertTrue( util::is_serialized( 'N;' ) );
|
||||
$this->assertTrue( util::is_serialized( 'b:1;' ) );
|
||||
$this->assertTrue( util::is_serialized( 'a:0:{}' ) );
|
||||
$this->assertTrue( util::is_serialized( 'O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}' ) );
|
||||
}
|
||||
|
||||
public function test_fix_broken_serialization()
|
||||
{
|
||||
$expectedData = array(
|
||||
'Normal',
|
||||
'High-value Char: '.chr(231).'a-va?', // High-value Char: ça-va? [in ISO-8859-1]
|
||||
);
|
||||
|
||||
$brokenSerialization = 'a:2:{i:0;s:6:"Normal";i:1;s:23:"High-value Char: ▒a-va?";}';
|
||||
|
||||
// Temporarily override error handling to ensure that this is, in fact, [still] a broken serialization.
|
||||
{
|
||||
$expectedError = array(
|
||||
'errno' => 8,
|
||||
'errstr' => 'unserialize(): Error at offset 55 of 60 bytes'
|
||||
);
|
||||
|
||||
$reportedError = array();
|
||||
set_error_handler(function ($errno, $errstr, $errfile, $errline, $errcontext) use (&$reportedError) {
|
||||
$reportedError = compact('errno', 'errstr');
|
||||
});
|
||||
|
||||
unserialize($brokenSerialization);
|
||||
|
||||
$this->assertEquals($expectedError['errno'], $reportedError['errno']);
|
||||
// Because HHVM's unserialize() error message does not contain enough info to properly test.
|
||||
if (!defined('HHVM_VERSION')) {
|
||||
$this->assertEquals($expectedError['errstr'], $reportedError['errstr']);
|
||||
}
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
$fixedSerialization = util::fix_broken_serialization($brokenSerialization);
|
||||
$unserializedData = unserialize($fixedSerialization);
|
||||
$this->assertEquals($expectedData[0], $unserializedData[0], 'Did not properly fix the broken serialized data.');
|
||||
|
||||
$this->assertEquals(substr($expectedData[1], 0, 10), substr($unserializedData[1], 0, 10), 'Did not properly fix the broken serialized data.');
|
||||
}
|
||||
|
||||
public function test_is_https()
|
||||
{
|
||||
$_SERVER['HTTPS'] = null;
|
||||
|
||||
$this->assertFalse( util::is_https() );
|
||||
|
||||
$_SERVER['HTTPS'] = 'on';
|
||||
|
||||
$this->assertTrue( util::is_https() );
|
||||
}
|
||||
|
||||
public function test_add_query_arg()
|
||||
{
|
||||
// Regular tests
|
||||
$this->assertEquals( '/app/admin/users?user=5', util::add_query_arg( 'user', 5, '/app/admin/users' ) );
|
||||
$this->assertEquals( '/app/admin/users?user=5', util::add_query_arg( array( 'user' => 5 ), '/app/admin/users' ) );
|
||||
$this->assertEquals( '/app/admin/users?user=5', util::add_query_arg( array( 'user' => 5 ), null, '/app/admin/users' ) );
|
||||
$this->assertEquals( '/app/admin/users?action=edit&user=5', util::add_query_arg( 'user', 5, '/app/admin/users?action=edit' ) );
|
||||
$this->assertEquals( '/app/admin/users?action=edit&user=5', util::add_query_arg( array( 'user' => 5 ), '/app/admin/users?action=edit' ) );
|
||||
$this->assertEquals( '/app/admin/users?action=edit&tab=personal&user=5', util::add_query_arg( 'user', 5, '/app/admin/users?action=edit&tab=personal' ) );
|
||||
$this->assertEquals( '/app/admin/users?action=edit&tab=personal&user=5', util::add_query_arg( array( 'user' => 5 ), '/app/admin/users?action=edit&tab=personal' ) );
|
||||
|
||||
// Ensure strips false.
|
||||
$this->assertEquals('/index.php', util::add_query_arg('debug', false, '/index.php'));
|
||||
|
||||
// With a URL fragment
|
||||
$this->assertEquals( '/app/admin/users?user=5#test', util::add_query_arg( 'user', 5, '/app/admin/users#test' ) );
|
||||
|
||||
// Full URL
|
||||
$this->assertEquals( 'http://example.com/?a=b', util::add_query_arg( 'a', 'b', 'http://example.com' ) );
|
||||
|
||||
// Only the query string
|
||||
$this->assertEquals( '?a=b&c=d', util::add_query_arg( 'c', 'd', '?a=b' ) );
|
||||
$this->assertEquals( 'a=b&c=d', util::add_query_arg( 'c', 'd', 'a=b' ) );
|
||||
|
||||
// Url encoding test
|
||||
$this->assertEquals( '/app/admin/users?param=containsa%26sym', util::add_query_arg( 'param', 'containsa&sym', '/app/admin/users' ) );
|
||||
|
||||
// If not provided, grab the URI from the server.
|
||||
$_SERVER['REQUEST_URI'] = '/app/admin/users';
|
||||
$this->assertEquals( '/app/admin/users?user=6', util::add_query_arg( array( 'user' => 6 ) ) );
|
||||
$this->assertEquals( '/app/admin/users?user=7', util::add_query_arg( 'user', 7 ) );
|
||||
}
|
||||
|
||||
public function test_remove_query_arg()
|
||||
{
|
||||
$this->assertEquals( '/app/admin/users', util::remove_query_arg( 'user', '/app/admin/users?user=5' ) );
|
||||
$this->assertEquals( '/app/admin/users?action=edit', util::remove_query_arg( 'user', '/app/admin/users?action=edit&user=5' ) );
|
||||
$this->assertEquals( '/app/admin/users?user=5', util::remove_query_arg( array( 'tab', 'action' ), '/app/admin/users?action=edit&tab=personal&user=5' ) );
|
||||
}
|
||||
|
||||
public function test_http_build_url()
|
||||
{
|
||||
$url = 'http://user:pass@example.com:8080/path/?query#fragment';
|
||||
|
||||
$expected = 'http://example.com/';
|
||||
$actual = util::http_build_url($url, array(), util::HTTP_URL_STRIP_ALL);
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
$expected = 'http://example.com:8080/path/?query#fragment';
|
||||
$actual = util::http_build_url($url, array(), util::HTTP_URL_STRIP_AUTH);
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
$this->assertEquals('https://dev.example.com/', util::http_build_url('http://example.com/', array('scheme' => 'https', 'host' => 'dev.example.com')));
|
||||
$this->assertEquals('http://example.com/#hi', util::http_build_url('http://example.com/', array('fragment' => 'hi'), util::HTTP_URL_REPLACE));
|
||||
$this->assertEquals('http://example.com/page', util::http_build_url('http://example.com/', array('path' => 'page'), util::HTTP_URL_JOIN_PATH));
|
||||
$this->assertEquals('http://example.com/page', util::http_build_url('http://example.com', array('path' => 'page'), util::HTTP_URL_JOIN_PATH));
|
||||
$this->assertEquals('http://example.com/?hi=Bro', util::http_build_url('http://example.com/', array('query' => 'hi=Bro'), util::HTTP_URL_JOIN_QUERY));
|
||||
$this->assertEquals('http://example.com/?show=1&hi=Bro', util::http_build_url('http://example.com/?show=1', array('query' => 'hi=Bro'), util::HTTP_URL_JOIN_QUERY));
|
||||
|
||||
$this->assertEquals('http://admin@example.com/', util::http_build_url('http://example.com/', array('user' => 'admin')));
|
||||
$this->assertEquals('http://admin:1@example.com/', util::http_build_url('http://example.com/', array('user' => 'admin', 'pass' => '1')));
|
||||
}
|
||||
|
||||
public function test_str_to_bool()
|
||||
{
|
||||
$this->assertTrue( util::str_to_bool( 'true' ) );
|
||||
$this->assertTrue( util::str_to_bool( 'yes' ) );
|
||||
$this->assertTrue( util::str_to_bool( 'y' ) );
|
||||
$this->assertTrue( util::str_to_bool( 'oui' ) );
|
||||
$this->assertTrue( util::str_to_bool( 'vrai' ) );
|
||||
|
||||
$this->assertFalse( util::str_to_bool( 'false' ) );
|
||||
$this->assertFalse( util::str_to_bool( 'no' ) );
|
||||
$this->assertFalse( util::str_to_bool( 'n' ) );
|
||||
$this->assertFalse( util::str_to_bool( 'non' ) );
|
||||
$this->assertFalse( util::str_to_bool( 'faux' ) );
|
||||
|
||||
$this->assertFalse( util::str_to_bool( 'test' , false) );
|
||||
|
||||
}
|
||||
|
||||
public function test_array_pluck()
|
||||
{
|
||||
$array = array(
|
||||
array(
|
||||
'name' => 'Bob',
|
||||
'age' => 37
|
||||
),
|
||||
array(
|
||||
'name' => 'Fred',
|
||||
'age' => 37
|
||||
),
|
||||
array(
|
||||
'name' => 'Jane',
|
||||
'age' => 29
|
||||
),
|
||||
array(
|
||||
'name' => 'Brandon',
|
||||
'age' => 20
|
||||
),
|
||||
array(
|
||||
'age' => 41
|
||||
)
|
||||
);
|
||||
|
||||
$obj_array = array(
|
||||
'bob' => (object) array(
|
||||
'name' => 'Bob',
|
||||
'age' => 37
|
||||
),
|
||||
'fred' => (object) array(
|
||||
'name' => 'Fred',
|
||||
'age' => 37
|
||||
),
|
||||
'jane' => (object) array(
|
||||
'name' => 'Jane',
|
||||
'age' => 29
|
||||
),
|
||||
'brandon' => (object) array(
|
||||
'name' => 'Brandon',
|
||||
'age' => 20
|
||||
),
|
||||
'invalid' => (object) array(
|
||||
'age' => 41
|
||||
)
|
||||
);
|
||||
|
||||
$obj_array_expect = array(
|
||||
'bob' => 'Bob',
|
||||
'fred' => 'Fred',
|
||||
'jane' => 'Jane',
|
||||
'brandon' => 'Brandon'
|
||||
);
|
||||
|
||||
$this->assertEquals( array( 'Bob', 'Fred', 'Jane', 'Brandon' ), util::array_pluck( $array, 'name' ) );
|
||||
$this->assertEquals( array( 'Bob', 'Fred', 'Jane', 'Brandon', array( 'age' => 41 ) ), util::array_pluck( $array, 'name', TRUE, FALSE ) );
|
||||
$this->assertEquals( $obj_array_expect, util::array_pluck( $obj_array, 'name' ) );
|
||||
$this->assertEquals( array( 'Bob', 'Fred', 'Jane', 'Brandon' ), util::array_pluck( $obj_array, 'name', FALSE ) );
|
||||
|
||||
$expected = array('Bob', 'Fred', 'Jane', 'Brandon', 'invalid' => (object)array('age' => 41));
|
||||
$this->assertEquals($expected, util::array_pluck($obj_array, 'name', FALSE, FALSE));
|
||||
$expected = array('Bob', 'Fred', 'Jane', 'Brandon', array('age' => 41));
|
||||
$this->assertEquals($expected, util::array_pluck($array, 'name', false, false));
|
||||
}
|
||||
|
||||
public function test_htmlentities()
|
||||
{
|
||||
$this->assertEquals( 'One & Two', util::htmlentities( 'One & Two' ) );
|
||||
$this->assertEquals( 'One & Two', util::htmlentities( 'One & Two', TRUE ) );
|
||||
}
|
||||
|
||||
public function test_htmlspecialchars()
|
||||
{
|
||||
$this->assertEquals( 'One & Two', util::htmlspecialchars( 'One & Two' ) );
|
||||
$this->assertEquals( 'One & Two', util::htmlspecialchars( 'One & Two', TRUE ) );
|
||||
}
|
||||
|
||||
public function test_remove_accents()
|
||||
{
|
||||
$this->assertEquals( 'A', util::remove_accents( "\xC3\x81" ) );
|
||||
$this->assertEquals( 'e', util::remove_accents( "\xC4\x97" ) );
|
||||
$this->assertEquals( 'U', util::remove_accents( "\xC3\x9C" ) );
|
||||
$this->assertEquals( 'Ae', util::remove_accents( "Ä", 'de' ) );
|
||||
$this->assertEquals( 'OEoeAEDHTHssaedhth', util::remove_accents(chr(140) . chr(156) . chr(198) . chr(208) . chr(222) . chr(223) . chr(230) . chr(240) . chr(254)));
|
||||
}
|
||||
|
||||
public function test_zero_pad()
|
||||
{
|
||||
$this->assertEquals( '00000341', util::zero_pad( 341, 8 ) );
|
||||
$this->assertEquals( '341', util::zero_pad( 341, 1 ) );
|
||||
}
|
||||
|
||||
public function test_human_time_diff()
|
||||
{
|
||||
$this->assertEquals( '1 second ago', util::human_time_diff( time() - 1 ) );
|
||||
$this->assertEquals( '30 seconds ago', util::human_time_diff( time() - 30 ) );
|
||||
$this->assertEquals( '1 minute ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MINUTE * 1.4 ) ) );
|
||||
$this->assertEquals( '5 minutes ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MINUTE * 5 ) ) );
|
||||
$this->assertEquals( '1 hour ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR ) ) );
|
||||
$this->assertEquals( '2 hours ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 2 ) ) );
|
||||
$this->assertEquals( '1 day ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 ) ) );
|
||||
$this->assertEquals( '5 days ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 * 5 ) ) );
|
||||
$this->assertEquals( '1 week ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 * 7 ) ) );
|
||||
$this->assertEquals( '2 weeks ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 * 14 ) ) );
|
||||
$this->assertEquals( '1 month ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_WEEK * 5 ) ) );
|
||||
$this->assertEquals( '2 months ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_WEEK * 10 ) ) );
|
||||
$this->assertEquals( '1 year ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MONTH * 15 ) ) );
|
||||
$this->assertEquals( '2 years ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MONTH * 36 ) ) );
|
||||
$this->assertEquals( '11 years ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MONTH * 140 ) ) );
|
||||
|
||||
$this->assertEquals( 'fifteen minutes ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MINUTE * 15 ), '', TRUE ) );
|
||||
}
|
||||
|
||||
public function test_number_to_word()
|
||||
{
|
||||
try {
|
||||
util::number_to_word('junk data');
|
||||
$this->fail('Accepted junk data');
|
||||
} catch(\LogicException $e) {
|
||||
$this->assertEquals('Not a number', $e->getMessage());
|
||||
}
|
||||
|
||||
// Partially numeric.
|
||||
$this->assertEquals('', util::number_to_word('1a'));
|
||||
|
||||
// Decimals
|
||||
$this->assertEquals( 'five point zero five', util::number_to_word('5.05') );
|
||||
$this->assertEquals( 'zero point eight', util::number_to_word( 0.8 ) );
|
||||
|
||||
// Integers
|
||||
$this->assertEquals( 'positive one', util::number_to_word( '+1' ) );
|
||||
$this->assertEquals( 'negative twelve', util::number_to_word( -12 ) );
|
||||
$this->assertEquals( 'one', util::number_to_word( 1 ) );
|
||||
$this->assertEquals( 'five', util::number_to_word( 5 ) );
|
||||
$this->assertEquals( 'fifteen', util::number_to_word( 15 ) );
|
||||
$this->assertEquals( 'twenty-one', util::number_to_word( 21 ) );
|
||||
$this->assertEquals( 'thirty-two', util::number_to_word( 32 ) );
|
||||
$this->assertEquals( 'forty-three', util::number_to_word( 43 ) );
|
||||
$this->assertEquals( 'fifty-four', util::number_to_word( 54 ) );
|
||||
$this->assertEquals( 'sixty-six', util::number_to_word( 66 ) );
|
||||
$this->assertEquals( 'seventy-seven', util::number_to_word( 77 ) );
|
||||
$this->assertEquals( 'eighty-eight', util::number_to_word( 88 ) );
|
||||
$this->assertEquals( 'ninety-nine', util::number_to_word( 99 ) );
|
||||
$this->assertEquals( 'one hundred and thirty-six', util::number_to_word( 136 ) );
|
||||
$this->assertEquals( 'ten', util::number_to_word( 10 ) );
|
||||
$this->assertEquals( 'twenty', util::number_to_word( 20 ) );
|
||||
$this->assertEquals( 'thirty', util::number_to_word( 30 ) );
|
||||
$this->assertEquals( 'forty', util::number_to_word( 40 ) );
|
||||
$this->assertEquals( 'fifty', util::number_to_word( 50 ) );
|
||||
$this->assertEquals( 'sixty', util::number_to_word( 60 ) );
|
||||
$this->assertEquals( 'seventy', util::number_to_word( 70 ) );
|
||||
$this->assertEquals( 'eighty', util::number_to_word( 80 ) );
|
||||
$this->assertEquals( 'ninety', util::number_to_word( 90 ) );
|
||||
$this->assertEquals( 'eleven', util::number_to_word( 11 ) );
|
||||
$this->assertEquals( 'thirteen', util::number_to_word( 13 ) );
|
||||
$this->assertEquals( 'fourteen', util::number_to_word( 14 ) );
|
||||
$this->assertEquals( 'fifteen', util::number_to_word( 15 ) );
|
||||
$this->assertEquals( 'sixteen', util::number_to_word( 16 ) );
|
||||
$this->assertEquals( 'seventeen', util::number_to_word( 17 ) );
|
||||
$this->assertEquals( 'eighteen', util::number_to_word( 18 ) );
|
||||
$this->assertEquals( 'nineteen', util::number_to_word( 19 ) );
|
||||
$this->assertEquals( 'one thousand', util::number_to_word( 1000 ) );
|
||||
$this->assertEquals( 'one million', util::number_to_word( 1000000 ) );
|
||||
$this->assertEquals( 'one billion', util::number_to_word( 1000000000 ) );
|
||||
$this->assertEquals( 'one trillion', util::number_to_word( 1000000000000 ) );
|
||||
$this->assertEquals( 'one quadrillion', util::number_to_word( '1000000000000000' ) );
|
||||
$this->assertEquals( 'one quintrillion', util::number_to_word( '1000000000000000000' ) );
|
||||
$this->assertEquals( 'one sextillion', util::number_to_word( '1000000000000000000000' ) );
|
||||
$this->assertEquals( 'one septillion', util::number_to_word( '1000000000000000000000000' ) );
|
||||
$this->assertEquals( 'one octillion', util::number_to_word( '1000000000000000000000000000' ) );
|
||||
$this->assertEquals( 'one nonillion', util::number_to_word( '1000000000000000000000000000000' ) );
|
||||
$this->assertEquals( 'one decillion', util::number_to_word( '1000000000000000000000000000000000' ) );
|
||||
$this->assertEquals( 'one', util::number_to_word( '1000000000000000000000000000000000000000000' ) );
|
||||
|
||||
}
|
||||
|
||||
public function test_array_search_deep()
|
||||
{
|
||||
$users = array(
|
||||
1 => (object) array( 'username' => 'brandon', 'age' => 20 ),
|
||||
2 => (object) array( 'username' => 'matt', 'age' => 27 ),
|
||||
3 => (object) array( 'username' => 'jane', 'age' => 53 ),
|
||||
4 => (object) array( 'username' => 'john', 'age' => 41 ),
|
||||
5 => (object) array( 'username' => 'steve', 'age' => 11 ),
|
||||
6 => (object) array( 'username' => 'fred', 'age' => 42 ),
|
||||
7 => (object) array( 'username' => 'rasmus', 'age' => 21 ),
|
||||
8 => (object) array( 'username' => 'don', 'age' => 15 ),
|
||||
9 => array( 'username' => 'darcy', 'age' => 33 ),
|
||||
);
|
||||
|
||||
$test = array(
|
||||
1 => 'brandon',
|
||||
2 => 'devon',
|
||||
3 => array( 'troy' ),
|
||||
4 => 'annie'
|
||||
);
|
||||
|
||||
$this->assertFalse( util::array_search_deep( $test, 'bob' ) );
|
||||
$this->assertEquals( 3, util::array_search_deep( $test, 'troy' ) );
|
||||
$this->assertEquals( 4, util::array_search_deep( $test, 'annie' ) );
|
||||
$this->assertEquals( 2, util::array_search_deep( $test, 'devon', 'devon' ) );
|
||||
$this->assertEquals( 7, util::array_search_deep( $users, 'rasmus', 'username' ) );
|
||||
$this->assertEquals( 9, util::array_search_deep( $users, 'darcy', 'username' ) );
|
||||
$this->assertEquals( 1, util::array_search_deep( $users, 'brandon' ) );
|
||||
}
|
||||
|
||||
public function test_array_map_deep()
|
||||
{
|
||||
$input = array(
|
||||
'<',
|
||||
'abc',
|
||||
'>',
|
||||
'def',
|
||||
array( '&', 'test', '123' ),
|
||||
(object) array( 'hey', '<>' )
|
||||
);
|
||||
|
||||
$expect = array(
|
||||
'<',
|
||||
'abc',
|
||||
'>',
|
||||
'def',
|
||||
array( '&', 'test', '123' ),
|
||||
(object) array( 'hey', '<>' )
|
||||
);
|
||||
|
||||
$this->assertEquals( $expect, util::array_map_deep( $input, 'htmlentities' ) );
|
||||
}
|
||||
|
||||
public function test_random_string()
|
||||
{
|
||||
// Make sure the generated string contains only human friendly characters and is 30 characters long
|
||||
$str = util::random_string( 30 );
|
||||
$this->assertTrue( (bool) preg_match( '/^([ABCDEFGHJKLMNPQRSTUVWXYZabcdefhjkmnprstuvwxyz23456789]{30})$/', $str ) );
|
||||
|
||||
// Make sure the generated string is 30 characters long
|
||||
$str = util::random_string( 30, false, true );
|
||||
$this->assertTrue( strlen( $str ) === 30, 'random_string produced an invalid length string' );
|
||||
|
||||
// Make sure the generated string is 120 characters long
|
||||
$str = util::random_string( 120 );
|
||||
$this->assertTrue(strlen( $str ) === 120, 'random_string produced an invalid length string');
|
||||
|
||||
// Make sure the string doesn't contain duplicate letters
|
||||
$str = util::random_string( 53, true, false, true );
|
||||
$this->assertTrue(strlen($str) === 53, 'random_string produced an invalid length string');
|
||||
$this->assertTrue(count(array_unique(str_split($str))) === strlen($str), 'random_string produced a string with duplicate characters');
|
||||
|
||||
// Longer length than characters available
|
||||
try {
|
||||
$str = util::random_string( 55, true, false, true );
|
||||
$this->assertTrue( false );
|
||||
} catch (Exception $e) {
|
||||
$this->assertTrue( true );
|
||||
}
|
||||
|
||||
// Test secure variant
|
||||
$str = util::secure_random_string(16);
|
||||
$this->assertTrue(strlen($str) === 16);
|
||||
|
||||
// Longer length than characters available
|
||||
try {
|
||||
$str = util::secure_random_string(0);
|
||||
$this->assertTrue(false);
|
||||
} catch (Exception $e) {
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
||||
public function test_match_string()
|
||||
{
|
||||
$this->assertTrue( util::match_string('a', 'a') );
|
||||
$this->assertFalse( util::match_string('a', ' a') );
|
||||
$this->assertFalse( util::match_string('/', '/something') );
|
||||
$this->assertTrue( util::match_string('test/*', 'test/first/second') );
|
||||
$this->assertTrue( util::match_string('*/test', 'first/second/test') );
|
||||
$this->assertFalse( util::match_string('first/', 'first/second/test') );
|
||||
$this->assertFalse( util::match_string('test', 'TEST') );
|
||||
$this->assertTrue( util::match_string('test', 'TEST', false) );
|
||||
}
|
||||
|
||||
public function test_validate_email()
|
||||
{
|
||||
$this->assertTrue( util::validate_email( 'john.smith@gmail.com' ) );
|
||||
$this->assertTrue( util::validate_email( 'john.smith+label@gmail.com' ) );
|
||||
$this->assertTrue( util::validate_email( 'john.smith@gmail.co.uk' ) );
|
||||
}
|
||||
|
||||
public function test_safe_truncate()
|
||||
{
|
||||
$this->assertEquals( 'The quick brown fox...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 24 ) );
|
||||
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 55 ) );
|
||||
$this->assertEquals( 'Th...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 2 ) );
|
||||
$this->assertEquals( 'The...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 3 ) );
|
||||
$this->assertEquals( 'The...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 7 ) );
|
||||
}
|
||||
|
||||
public function test_limit_characters()
|
||||
{
|
||||
$this->assertEquals( 'The quick brown fox jump...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 24 ) );
|
||||
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 55 ) );
|
||||
$this->assertEquals( 'Th...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 2 ) );
|
||||
$this->assertEquals( 'The...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 3 ) );
|
||||
$this->assertEquals( 'The qui...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 7 ) );
|
||||
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 150 ) );
|
||||
}
|
||||
|
||||
public function test_limit_words()
|
||||
{
|
||||
$this->assertEquals( 'The quick brown...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 3 ) );
|
||||
$this->assertEquals( 'The quick brown fox jumps...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 5 ) );
|
||||
$this->assertEquals( 'The...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 1 ) );
|
||||
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::limit_words( 'The quick brown fox jumps over the lazy dog', 90 ) );
|
||||
$this->assertEquals( 'The quick brown fox jumps over the...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 7 ) );
|
||||
}
|
||||
|
||||
public function test_ordinal()
|
||||
{
|
||||
$this->assertEquals( '1st', util::ordinal( 1 ) );
|
||||
$this->assertEquals( '2nd', util::ordinal( 2 ) );
|
||||
$this->assertEquals( '3rd', util::ordinal( 3 ) );
|
||||
$this->assertEquals( '4th', util::ordinal( 4 ) );
|
||||
$this->assertEquals( '5th', util::ordinal( 5 ) );
|
||||
$this->assertEquals( '6th', util::ordinal( 6 ) );
|
||||
$this->assertEquals( '7th', util::ordinal( 7 ) );
|
||||
$this->assertEquals( '8th', util::ordinal( 8 ) );
|
||||
$this->assertEquals( '9th', util::ordinal( 9 ) );
|
||||
$this->assertEquals( '22nd', util::ordinal( 22 ) );
|
||||
$this->assertEquals( '23rd', util::ordinal( 23 ) );
|
||||
$this->assertEquals( '143rd', util::ordinal( 143 ) );
|
||||
}
|
||||
|
||||
public function test_array_first()
|
||||
{
|
||||
$test = array( 'a' => array( 'a', 'b', 'c' ) );
|
||||
|
||||
$this->assertEquals( 'a', util::array_first( util::array_get( $test['a'] ) ) );
|
||||
}
|
||||
|
||||
public function test_array_first_key()
|
||||
{
|
||||
$test = array( 'a' => array( 'a' => 'b', 'c' => 'd' ) );
|
||||
|
||||
$this->assertEquals( 'a', util::array_first_key( util::array_get( $test['a'] ) ) );
|
||||
}
|
||||
|
||||
public function test_array_last()
|
||||
{
|
||||
$test = array( 'a' => array( 'a', 'b', 'c' ) );
|
||||
|
||||
$this->assertEquals( 'c', util::array_last( util::array_get( $test['a'] ) ) );
|
||||
}
|
||||
|
||||
public function test_array_last_key()
|
||||
{
|
||||
$test = array( 'a' => array( 'a' => 'b', 'c' => 'd' ) );
|
||||
|
||||
$this->assertEquals( 'c', util::array_last_key( util::array_get( $test['a'] ) ) );
|
||||
}
|
||||
|
||||
public function test_array_flatten()
|
||||
{
|
||||
$input = array( 'a', 'b', 'c', 'd', array( 'first' => 'e', 'f', 'second' => 'g', array( 'h', 'third' => 'i', array( array( array( array( 'j', 'k', 'l' ) ) ) ) ) ) );
|
||||
$expectNoKeys = range( 'a', 'l' );
|
||||
$expectWithKeys = array(
|
||||
'a', 'b', 'c', 'd',
|
||||
'first' => 'e',
|
||||
'f',
|
||||
'second' => 'g',
|
||||
'h',
|
||||
'third' => 'i',
|
||||
'j', 'k', 'l'
|
||||
);
|
||||
|
||||
$this->assertEquals( $expectWithKeys, util::array_flatten( $input ) );
|
||||
$this->assertEquals( $expectNoKeys, util::array_flatten( $input, false ) );
|
||||
$this->assertEquals( $expectWithKeys, util::array_flatten( $input, true ) );
|
||||
}
|
||||
|
||||
public function test_strip_space()
|
||||
{
|
||||
$input = ' The quick brown fox jumps over the lazy dog ';
|
||||
$expect = 'Thequickbrownfoxjumpsoverthelazydog';
|
||||
|
||||
$this->assertEquals($expect, Util::strip_space($input));
|
||||
}
|
||||
|
||||
public function test_sanitize_string()
|
||||
{
|
||||
$input = ' Benoit! à New-York? j’ai perçu 1 % : Qu’as-tu "gagné" chez M. V. Noël? Dix francs.';
|
||||
$expect = 'benoitanewyorkjaipercu1quastugagnechezmvnoeldixfrancs';
|
||||
|
||||
$this->assertEquals($expect, Util::sanitize_string($input));
|
||||
}
|
||||
|
||||
public function test_get_gravatar()
|
||||
{
|
||||
$_SERVER['HTTPS'] = 'on';
|
||||
$this->assertEquals('https://secure.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=32', util::get_gravatar('john.doe@example.org'));
|
||||
$this->assertEquals('https://secure.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=128', util::get_gravatar('john.doe@example.org', 128));
|
||||
|
||||
$_SERVER['HTTPS'] = 'off';
|
||||
$this->assertEquals('http://www.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=32', util::get_gravatar('john.doe@example.org'));
|
||||
$this->assertEquals('http://www.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=128', util::get_gravatar('john.doe@example.org', 128));
|
||||
}
|
||||
|
||||
public function test_get_client_ip()
|
||||
{
|
||||
$_SERVER['REMOTE_ADDR'] = '192.168.30.152';
|
||||
$_SERVER['HTTP_CLIENT_IP'] = '192.168.30.153';
|
||||
$_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.30.154';
|
||||
$this->assertEquals('192.168.30.152', util::get_client_ip());
|
||||
$this->assertEquals('192.168.30.153', util::get_client_ip(true));
|
||||
|
||||
unset($_SERVER['HTTP_CLIENT_IP']);
|
||||
$this->assertEquals('192.168.30.154', util::get_client_ip(true));
|
||||
unset($_SERVER['HTTP_X_FORWARDED_FOR']);
|
||||
$this->assertEquals('192.168.30.152', util::get_client_ip(true));
|
||||
}
|
||||
|
||||
public function test_full_permissions()
|
||||
{
|
||||
// Text a non-existant file.
|
||||
$this->assertFalse(util::full_permissions('faker-123.blah'), 'Gave a permission value for a non-existant file.');
|
||||
|
||||
// Test an existing file.
|
||||
$expected = '-rw-rw-rw-';
|
||||
$tempFile = tempnam(sys_get_temp_dir(), 'foo');
|
||||
$this->assertTrue(chmod($tempFile, 0666), 'Oops. Could not change temp file\'s permissions to 0666.');
|
||||
$this->assertEquals($expected, util::full_permissions($tempFile), 'Could not properly obtain permissions of an existing file.');
|
||||
unlink($tempFile);
|
||||
|
||||
$this->assertEquals('lr--r--r--', util::full_permissions('fake-file-222', octdec('120444')));
|
||||
$this->assertEquals('ur--r--r--', util::full_permissions('fake-file-222', octdec('000444')));
|
||||
$this->assertEquals('srwxr-xr-x', util::full_permissions('fake-file-222', octdec('140755')));
|
||||
$this->assertEquals('drwxr-xr-x', util::full_permissions('fake-file-222', octdec('40755')));
|
||||
$this->assertEquals('brw-rw----', util::full_permissions('fake-file-222', octdec('60660')));
|
||||
$this->assertEquals('crw-rw----', util::full_permissions('fake-file-222', octdec('20660')));
|
||||
$this->assertEquals('prw-rw----', util::full_permissions('fake-file-222', octdec('10660')));
|
||||
$this->assertEquals('---x------', util::full_permissions('fake-file-222', octdec('100100')));
|
||||
$this->assertEquals('--w-------', util::full_permissions('fake-file-222', octdec('100200')));
|
||||
$this->assertEquals('--wx------', util::full_permissions('fake-file-222', octdec('100300')));
|
||||
$this->assertEquals('-r--------', util::full_permissions('fake-file-222', octdec('100400')));
|
||||
$this->assertEquals('-r-x------', util::full_permissions('fake-file-222', octdec('100500')));
|
||||
$this->assertEquals('-rw-------', util::full_permissions('fake-file-222', octdec('100600')));
|
||||
$this->assertEquals('-rwx------', util::full_permissions('fake-file-222', octdec('100700')));
|
||||
|
||||
// Windows does not have the concept of /.
|
||||
if (!defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
||||
$this->assertEquals('drwxr-xr-x', util::full_permissions('/'));
|
||||
}
|
||||
}
|
||||
|
||||
public function test_array_clean()
|
||||
{
|
||||
$input = array( 'a', 'b', '', null, false, 0);
|
||||
$expect = array('a', 'b');
|
||||
$this->assertEquals($expect, Util::array_clean($input));
|
||||
}
|
||||
|
||||
public function test_var_dump_plain()
|
||||
{
|
||||
$input = 'var';
|
||||
$expect = '<span style="color:#588bff;">string</span><span style="color:#999;">(</span>3<span style="color:#999;">)</span> <strong>"var"</strong>';
|
||||
$this->assertEquals($expect, Util::var_dump_plain($input, true));
|
||||
|
||||
$input = true;
|
||||
$expect = '<span style="color:#588bff;">bool</span><span style="color:#999;">(</span><strong>true</strong><span style="color:#999;">)</span>';
|
||||
$this->assertEquals($expect, Util::var_dump_plain($input, true));
|
||||
|
||||
$input = 1;
|
||||
$expect = '<span style="color:#588bff;">int</span><span style="color:#999;">(</span><strong>1</strong><span style="color:#999;">)</span>';
|
||||
$this->assertEquals($expect, Util::var_dump_plain($input, true));
|
||||
|
||||
$input = 1.5;
|
||||
$expect = '<span style="color:#588bff;">float</span><span style="color:#999;">(</span><strong>1.5</strong><span style="color:#999;">)</span>';
|
||||
$this->assertEquals($expect, Util::var_dump_plain($input, true));
|
||||
|
||||
$input = null;
|
||||
$expect = '<strong>NULL</strong>';
|
||||
$this->assertEquals($expect, Util::var_dump_plain($input, true));
|
||||
|
||||
$input = fopen('php://memory', 'r');
|
||||
$expect = '<span style="color:#588bff;">resource</span>("stream") <strong>"' . $input . '"</strong>';
|
||||
$this->assertEquals($expect, Util::var_dump_plain($input, -1));
|
||||
fclose($input);
|
||||
|
||||
// Test complex arrays.
|
||||
$input = array(1, 2, 4, 6, 10 => 20, 100 => 200);
|
||||
$actual = util::var_dump_plain($input, true);
|
||||
$this->assertContains('<img id="include-php-', $actual);
|
||||
$this->assertContains('<br /> 100 => <span', $actual);
|
||||
$this->assertContains('(</span><strong>200</strong><span style="color:#999;">)', $actual);
|
||||
|
||||
// Test complex objects.
|
||||
$experiment = new VarDumpExperiment();
|
||||
$actual = util::var_dump_plain($experiment, true);
|
||||
$this->assertContains('1 => <span style="color:#588bff;">string</span><span style="color:#999;">(</span>1<span style="color:#999;">', $actual);
|
||||
}
|
||||
|
||||
public function test_var_dump()
|
||||
{
|
||||
$input = 'var';
|
||||
$expect = '<pre style="margin-bottom: 18px;background: #f7f7f9;border: 1px solid #e1e1e8;padding: 8px;border-radius: 4px;-moz-border-radius: 4px;-webkit-border radius: 4px;display: block;font-size: 12.05px;white-space: pre-wrap;word-wrap: break-word;color: #333;font-family: Menlo,Monaco,Consolas,\'Courier New\',monospace;"><span style="color:#588bff;">string</span><span style="color:#999;">(</span>3<span style="color:#999;">)</span> <strong>"var"</strong></pre>';
|
||||
|
||||
// Ensure the proper output is returned
|
||||
$this->assertEquals($expect, Util::var_dump($input, true));
|
||||
|
||||
// Ensure the proper output is actually outputted
|
||||
$this->expectOutputString($expect);
|
||||
util::var_dump($input);
|
||||
|
||||
// Ensure we avoid infinite recursion on recursive arrays
|
||||
$a = array('a' => 'value a', 'b' => 'value b');
|
||||
$b = array('test' => &$a);
|
||||
$c = array('a' => &$a, 'b' => &$b);
|
||||
$a['c'] = &$c;
|
||||
$b['c'] = &$c;
|
||||
$this->assertContains('*RECURSION DETECTED*', Util::var_dump($c, true));
|
||||
|
||||
// Ensure we avoid infinite recursion on recursive objects
|
||||
$a = (object) array('a' => 'value a', 'b' => 'value b');
|
||||
$b = (object) array('test' => &$a);
|
||||
$c = (object) array('a' => &$a, 'b' => &$b);
|
||||
$a->c = &$c;
|
||||
$b->c = &$c;
|
||||
$this->assertContains('*RECURSION DETECTED*', Util::var_dump($c, true));
|
||||
|
||||
// Test class scoping.
|
||||
$experiment = new VarDumpExperiment();
|
||||
$actual = util::var_dump($experiment, true);
|
||||
|
||||
$snippet = substr($actual, strrpos($actual, 'display:inline'));
|
||||
$this->assertContains('"public"', $snippet);
|
||||
$this->assertContains('"protected:protected"', $snippet);
|
||||
$this->assertContains('"private:VarDumpExperiment:private"', $actual);
|
||||
}
|
||||
|
||||
public function test_linkify()
|
||||
{
|
||||
$input = 'great websites: http://www.google.com?param=test and http://yahoo.com/a/nested/folder';
|
||||
$expect = 'great websites: <a href="http://www.google.com?param=test">http://www.google.com?param=test</a> and <a href="http://yahoo.com/a/nested/folder">http://yahoo.com/a/nested/folder</a>';
|
||||
$this->assertEquals($expect, Util::linkify($input));
|
||||
|
||||
$this->assertEquals($expect, util::linkify($expect), 'linkify() tried to double linkify an href.');
|
||||
}
|
||||
|
||||
public function test_start_with()
|
||||
{
|
||||
$this->assertTrue(Util::starts_with('start a string', 'start a'));
|
||||
$this->assertFalse(Util::starts_with('start a string', 'string'));
|
||||
}
|
||||
|
||||
public function test_end_with()
|
||||
{
|
||||
$this->assertTrue(Util::ends_with('start a string', 'a string'));
|
||||
$this->assertFalse(Util::ends_with('start a string', 'start'));
|
||||
}
|
||||
|
||||
public function test_contains()
|
||||
{
|
||||
$this->assertTrue(Util::str_contains('start a string', 'a string'));
|
||||
$this->assertFalse(Util::str_contains('start a string', 'Start'));
|
||||
}
|
||||
|
||||
public function test_iContains()
|
||||
{
|
||||
$this->assertTrue(Util::str_icontains('start a string', 'a string'));
|
||||
$this->assertTrue(Util::str_icontains('start a string', 'Start'));
|
||||
}
|
||||
|
||||
public function test_get_file_ext()
|
||||
{
|
||||
$input = 'a_pdf_fil.pdf';
|
||||
$expect = 'pdf';
|
||||
$this->assertEquals($expect, Util::get_file_ext($input));
|
||||
}
|
||||
|
||||
public function test_rmdir()
|
||||
{
|
||||
$dirname = dirname(__FILE__);
|
||||
|
||||
// Test deleting a non-existant directory
|
||||
$this->assertFalse(file_exists($dirname . '/test1'));
|
||||
$this->assertTrue(util::rmdir($dirname . '/test1'));
|
||||
|
||||
// Test deleting an empty directory
|
||||
$dir = $dirname . '/test2';
|
||||
mkdir($dir);
|
||||
|
||||
$this->assertTrue(is_dir($dir));
|
||||
|
||||
if (is_dir($dir)) {
|
||||
util::rmdir($dir);
|
||||
$this->assertFalse(is_dir($dir));
|
||||
}
|
||||
|
||||
// Test deleting a non-empty directory
|
||||
$dir = $dirname . '/test3';
|
||||
$file = $dirname . '/test3/test.txt';
|
||||
mkdir($dir);
|
||||
touch($file);
|
||||
|
||||
$this->assertTrue(is_dir($dir));
|
||||
$this->assertTrue(is_file($file));
|
||||
|
||||
if (is_dir($dir)) {
|
||||
util::rmdir($dir);
|
||||
$this->assertFalse(is_dir($dir));
|
||||
$this->assertFalse(is_file($file));
|
||||
}
|
||||
|
||||
// Test deleting a non-directory path
|
||||
$file = $dirname . '/test4.txt';
|
||||
touch($file);
|
||||
|
||||
try {
|
||||
$str = util::rmdir($file);
|
||||
$this->assertTrue(false);
|
||||
} catch (\Exception $e) {
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
|
||||
unlink($file);
|
||||
|
||||
// Test deleting a nested directory
|
||||
$dir1 = $dirname . '/test5';
|
||||
$dir2 = $dirname . '/test5/nested_dir';
|
||||
$file1 = $dir1 . '/file1.txt';
|
||||
$file2 = $dir2 . '/file2.txt';
|
||||
mkdir($dir1);
|
||||
mkdir($dir2);
|
||||
touch($file1);
|
||||
touch($file2);
|
||||
|
||||
$this->assertTrue(is_dir($dir1));
|
||||
$this->assertTrue(is_dir($dir2));
|
||||
$this->assertTrue(is_file($file1));
|
||||
$this->assertTrue(is_file($file2));
|
||||
|
||||
if (is_dir($dir1)) {
|
||||
util::rmdir($dir1);
|
||||
$this->assertFalse(is_dir($dir1));
|
||||
$this->assertFalse(is_dir($dir2));
|
||||
$this->assertFalse(is_file($file1));
|
||||
$this->assertFalse(is_file($file2));
|
||||
}
|
||||
|
||||
// Test symlink traversal.
|
||||
$dir = $dirname . '/test6';
|
||||
$nestedDir = "$dir/nested";
|
||||
$symlink = "$dir/nested-symlink";
|
||||
|
||||
mkdir($dir);
|
||||
mkdir($nestedDir);
|
||||
|
||||
$symlinkStatus = symlink($nestedDir, $symlink);
|
||||
$this->assertTrue($symlinkStatus, 'The test system does not support making symlinks.');
|
||||
|
||||
if (!$symlink) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->assertTrue(util::rmdir($symlink, true), 'Could not delete a symlinked directory.');
|
||||
$this->assertFalse(file_exists($symlink), 'Could not delete a symlinked directory.');
|
||||
util::rmdir($dir, true);
|
||||
$this->assertFalse(is_dir($dir), 'Could not delete a directory with a symlinked directory inside of it.');
|
||||
}
|
||||
|
||||
public function test_get_current_url()
|
||||
{
|
||||
$expected = 'http://test.dev/test.php?foo=bar';
|
||||
$expectedAuth = 'http://admin:123@test.dev/test.php?foo=bar';
|
||||
$expectedPort = 'http://test.dev:443/test.php?foo=bar';
|
||||
$expectedPort2 = 'https://test.dev:80/test.php?foo=bar';
|
||||
$expectedSSL = 'https://test.dev/test.php?foo=bar';
|
||||
|
||||
$_SERVER['HTTP_HOST'] = 'test.dev';
|
||||
$_SERVER['SERVER_PORT'] = 80;
|
||||
$_SERVER['REQUEST_URI'] = '/test.php?foo=bar';
|
||||
$_SERVER['QUERY_STRING'] = 'foo=bar';
|
||||
$_SERVER['PHP_SELF'] = '/test.php';
|
||||
|
||||
// Test regular.
|
||||
$this->assertEquals($expected, util::get_current_url());
|
||||
|
||||
// Test server auth.
|
||||
$_SERVER['PHP_AUTH_USER'] = 'admin';
|
||||
$_SERVER['PHP_AUTH_PW'] = '123';
|
||||
$this->assertEquals($expectedAuth, util::get_current_url());
|
||||
unset($_SERVER['PHP_AUTH_USER']);
|
||||
unset($_SERVER['PHP_AUTH_PW']);
|
||||
|
||||
// Test port.
|
||||
$_SERVER['SERVER_PORT'] = 443;
|
||||
$this->assertEquals($expectedPort, util::get_current_url());
|
||||
|
||||
// Test SSL.
|
||||
$_SERVER['HTTPS'] = 'on';
|
||||
$this->assertEquals($expectedSSL, util::get_current_url());
|
||||
$_SERVER['SERVER_PORT'] = 80;
|
||||
$this->assertEquals($expectedPort2, util::get_current_url());
|
||||
unset($_SERVER['HTTPS']);
|
||||
|
||||
// Test no $_SERVER['REQUEST_URI'] (e.g., MS IIS).
|
||||
unset($_SERVER['REQUEST_URI']);
|
||||
$this->assertEquals($expected, util::get_current_url());
|
||||
}
|
||||
|
||||
public function test_set_writable()
|
||||
{
|
||||
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
|
||||
$this->markTestSkipped('This functionality is not working on Windows.');
|
||||
}
|
||||
|
||||
if (posix_geteuid() === 0) {
|
||||
$this->markTestSkipped('These tests don\'t work when run as root');
|
||||
}
|
||||
|
||||
$this->assertFalse(util::set_writable('/no/such/file'));
|
||||
|
||||
// Create a file to test with
|
||||
$dirname = dirname(__FILE__);
|
||||
$file = $dirname . '/test7';
|
||||
touch($file);
|
||||
chmod($file, 0644);
|
||||
|
||||
// The file is owned by us so it should be writable
|
||||
$this->assertTrue(is_writable($file));
|
||||
$this->assertEquals('-rw-r--r--', util::full_permissions($file));
|
||||
|
||||
// Toggle writable bit off for us
|
||||
util::set_writable($file, false);
|
||||
clearstatcache();
|
||||
$this->assertFalse(is_writable($file));
|
||||
$this->assertEquals('-r--r--r--', util::full_permissions($file));
|
||||
|
||||
// Toggle writable bit back on for us
|
||||
util::set_writable($file, true);
|
||||
clearstatcache();
|
||||
$this->assertTrue(is_writable($file));
|
||||
$this->assertEquals('-rw-r--r--', util::full_permissions($file));
|
||||
|
||||
unlink($file);
|
||||
}
|
||||
|
||||
public function test_set_readable()
|
||||
{
|
||||
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
|
||||
$this->markTestSkipped('This functionality is not working on Windows.');
|
||||
}
|
||||
|
||||
if (posix_geteuid() === 0) {
|
||||
$this->markTestSkipped('These tests don\'t work when run as root');
|
||||
}
|
||||
|
||||
$this->assertFalse(util::set_readable('/no/such/file'));
|
||||
|
||||
$dirname = dirname(__FILE__);
|
||||
$file = $dirname . '/test8';
|
||||
touch($file);
|
||||
|
||||
$this->assertTrue(is_readable($file));
|
||||
|
||||
util::set_readable($file, false);
|
||||
clearstatcache();
|
||||
$this->assertFalse(is_readable($file));
|
||||
|
||||
util::set_readable($file, true);
|
||||
clearstatcache();
|
||||
$this->assertTrue(is_readable($file));
|
||||
|
||||
unlink($file);
|
||||
}
|
||||
|
||||
public function test_set_executable()
|
||||
{
|
||||
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
|
||||
$this->markTestSkipped('This functionality is not working on Windows.');
|
||||
}
|
||||
|
||||
if (posix_geteuid() === 0) {
|
||||
$this->markTestSkipped('These tests don\'t work when run as root');
|
||||
}
|
||||
|
||||
$this->assertFalse(util::set_executable('/no/such/file'));
|
||||
|
||||
$dirname = dirname(__FILE__);
|
||||
$file = $dirname . '/test9';
|
||||
touch($file);
|
||||
|
||||
$this->assertFalse(is_executable($file));
|
||||
|
||||
util::set_executable($file, true);
|
||||
clearstatcache();
|
||||
$this->assertTrue(is_executable($file));
|
||||
|
||||
util::set_executable($file, false);
|
||||
clearstatcache();
|
||||
$this->assertFalse(is_executable($file));
|
||||
|
||||
unlink($file);
|
||||
}
|
||||
|
||||
public function test_directory_size() {
|
||||
$dirname = dirname(__FILE__);
|
||||
$dir = $dirname .'/dir1';
|
||||
mkdir($dir);
|
||||
$file1 = $dir .'/file1';
|
||||
file_put_contents($file1, '1234567890');
|
||||
$file2 = $dir .'/file2';
|
||||
file_put_contents($file2, range('a', 'z'));
|
||||
$this->assertEquals(10 + 26, util::directory_size($dir));
|
||||
util::rmdir($dir);
|
||||
}
|
||||
|
||||
public function test_get_user_directory() {
|
||||
// Test for OS Default.
|
||||
$this->assertTrue(is_writable(util::get_user_directory()));
|
||||
|
||||
$oldServer = $_SERVER;
|
||||
unset($_SERVER);
|
||||
// Test for UNIX.
|
||||
$_SERVER['HOME'] = '/home/unknown';
|
||||
$this->assertEquals($_SERVER['HOME'], util::get_user_directory(), 'Could not get the user\'s home directory in UNIX.');
|
||||
unset($_SERVER);
|
||||
|
||||
// Test for Windows.
|
||||
$expected = 'X:\Users\ThisUser';
|
||||
$_SERVER['HOMEDRIVE'] = 'X:';
|
||||
$_SERVER['HOMEPATH'] = '\Users\ThisUser';
|
||||
$this->assertEquals($expected, util::get_user_directory(), 'Could not get the user\'s home directory in Windows.');
|
||||
|
||||
// In case the tests are not being run in isolation.
|
||||
$_SERVER = $oldServer;
|
||||
}
|
||||
|
||||
public function test_directory_contents() {
|
||||
$dirname = dirname(__FILE__);
|
||||
$dir = $dirname . DIRECTORY_SEPARATOR .'dir1';
|
||||
mkdir($dir);
|
||||
$file1 = $dir . DIRECTORY_SEPARATOR .'file1';
|
||||
touch($file1);
|
||||
$this->assertEquals(array($file1), util::directory_contents($dir));
|
||||
util::rmdir($dir);
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
require __DIR__ . '/src/utilphp/util.php';
|
||||
|
||||
/**
|
||||
* Globally namespaced version of the class.
|
||||
*
|
||||
* @author Brandon Wamboldt <brandon.wamboldt@gmail.com>
|
||||
*/
|
||||
class util extends \utilphp\util { }
|
||||
@@ -0,0 +1,22 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
*.sln merge=union
|
||||
*.csproj merge=union
|
||||
*.vbproj merge=union
|
||||
*.fsproj merge=union
|
||||
*.dbproj merge=union
|
||||
|
||||
# Standard to msysgit
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
open_collective: medoo
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Information**
|
||||
- Version of Medoo:
|
||||
- Type of Database (MySQL, MSSQL, SQLite...):
|
||||
- System (Liunx\Windows\Mac):
|
||||
|
||||
**Detail Code**
|
||||
The detail code causes the problem.
|
||||
|
||||
**Expected output**
|
||||
A clear and concise description of what output you expected.
|
||||
@@ -0,0 +1,216 @@
|
||||
#################
|
||||
## Eclipse
|
||||
#################
|
||||
|
||||
*.pydevproject
|
||||
.project
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# CDT-specific
|
||||
.cproject
|
||||
|
||||
# PDT-specific
|
||||
.buildpath
|
||||
|
||||
|
||||
#################
|
||||
## Visual Studio
|
||||
#################
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
build/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.log
|
||||
*.scc
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.Publish.xml
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# NuGet Packages Directory
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||
#packages/
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.[Pp]ublish.xml
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
App_Data/*.mdf
|
||||
App_Data/*.ldf
|
||||
|
||||
#############
|
||||
## Windows detritus
|
||||
#############
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac crap
|
||||
.DS_Store
|
||||
|
||||
|
||||
#############
|
||||
## Python
|
||||
#############
|
||||
|
||||
*.py[cod]
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist/
|
||||
build/
|
||||
eggs/
|
||||
parts/
|
||||
var/
|
||||
sdist/
|
||||
develop-eggs/
|
||||
.installed.cfg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
|
||||
#Translations
|
||||
*.mo
|
||||
|
||||
#Mr Developer
|
||||
.mr.developer.cfg
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Angel Lai
|
||||
|
||||
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.
|
||||
Vendored
+102
@@ -0,0 +1,102 @@
|
||||
<p align="center">
|
||||
<a href="https://medoo.in" target="_blank"><img src="https://cloud.githubusercontent.com/assets/1467904/19835326/ca62bc36-9ebd-11e6-8b37-7240d76319cd.png"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://packagist.org/packages/catfan/medoo"><img alt="Total Downloads" src="https://poser.pugx.org/catfan/medoo/downloads"></a>
|
||||
<a href="https://packagist.org/packages/catfan/medoo"><img alt="Latest Stable Version" src="https://poser.pugx.org/catfan/medoo/v/stable"></a>
|
||||
<a href="https://packagist.org/packages/catfan/medoo"><img alt="License" src="https://poser.pugx.org/catfan/medoo/license"></a>
|
||||
<a href="https://opencollective.com/medoo"><img alt="Backers on Open Collective" src="https://opencollective.com/Medoo/backers/badge.svg"></a>
|
||||
<a href="https://opencollective.com/medoo"><img alt="Sponsors on Open Collective" src="https://opencollective.com/Medoo/sponsors/badge.svg"> </a>
|
||||
</p>
|
||||
|
||||
> The lightweight PHP database framework to accelerate development
|
||||
|
||||
## Features
|
||||
|
||||
* **Lightweight** - Less than 100 KB, portable with only one file
|
||||
|
||||
* **Easy** - Extremely easy to learn and use, friendly construction
|
||||
|
||||
* **Powerful** - Supports various common and complex SQL queries, data mapping, and prevent SQL injection
|
||||
|
||||
* **Compatible** - Supports all SQL databases, including MySQL, MSSQL, SQLite, MariaDB, PostgreSQL, Sybase, Oracle and more
|
||||
|
||||
* **Friendly** - Works well with every PHP frameworks, like Laravel, Codeigniter, Yii, Slim, and framework which supports singleton extension or composer
|
||||
|
||||
* **Free** - Under MIT license, you can use it anywhere whatever you want
|
||||
|
||||
## Requirement
|
||||
|
||||
PHP 5.4+ and PDO extension installed, recommend PHP 7.0+
|
||||
|
||||
## Get Started
|
||||
|
||||
### Install via composer
|
||||
|
||||
Add Medoo to composer.json configuration file.
|
||||
```
|
||||
$ composer require catfan/medoo
|
||||
```
|
||||
|
||||
And update the composer
|
||||
```
|
||||
$ composer update
|
||||
```
|
||||
|
||||
```php
|
||||
// If you installed via composer, just use this code to require autoloader on the top of your projects.
|
||||
require 'vendor/autoload.php';
|
||||
|
||||
// Using Medoo namespace
|
||||
use Medoo\Medoo;
|
||||
|
||||
// Initialize
|
||||
$database = new Medoo([
|
||||
'database_type' => 'mysql',
|
||||
'database_name' => 'name',
|
||||
'server' => 'localhost',
|
||||
'username' => 'your_username',
|
||||
'password' => 'your_password'
|
||||
]);
|
||||
|
||||
// Enjoy
|
||||
$database->insert('account', [
|
||||
'user_name' => 'foo',
|
||||
'email' => 'foo@bar.com'
|
||||
]);
|
||||
|
||||
$data = $database->select('account', [
|
||||
'user_name',
|
||||
'email'
|
||||
], [
|
||||
'user_id' => 50
|
||||
]);
|
||||
|
||||
echo json_encode($data);
|
||||
|
||||
// [
|
||||
// {
|
||||
// "user_name" : "foo",
|
||||
// "email" : "foo@bar.com",
|
||||
// }
|
||||
// ]
|
||||
```
|
||||
|
||||
## Contribution Guides
|
||||
|
||||
For most of time, Medoo is using develop branch for adding feature and fixing bug, and the branch will be merged into master branch while releasing a public version. For contribution, submit your code to the develop branch, and start a pull request into it.
|
||||
|
||||
On develop branch, each commits are started with `[fix]`, `[feature]` or `[update]` tag to indicate the change.
|
||||
|
||||
Keep it simple and keep it clear.
|
||||
|
||||
## License
|
||||
|
||||
Medoo is under the MIT license.
|
||||
|
||||
## Links
|
||||
|
||||
* Official website: [https://medoo.in](https://medoo.in)
|
||||
|
||||
* Documentation: [https://medoo.in/doc](https://medoo.in/doc)
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "catfan/medoo",
|
||||
"type": "framework",
|
||||
"description": "The lightweight PHP database framework to accelerate development",
|
||||
"keywords": ["database", "database library", "lightweight", "PHP framework", "SQL", "MySQL", "MSSQL", "SQLite", "PostgreSQL", "MariaDB", "Oracle"],
|
||||
"homepage": "https://medoo.in",
|
||||
"license": "MIT",
|
||||
"support": {
|
||||
"issues": "https://github.com/catfan/Medoo/issues",
|
||||
"source": "https://github.com/catfan/Medoo"
|
||||
},
|
||||
"authors": [
|
||||
{"name": "Angel Lai", "email": "angel@catfan.me"}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.4",
|
||||
"ext-pdo": "*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-pdo_mysql": "For MySQL or MariaDB database",
|
||||
"ext-pdo_sqlsrv": "For MSSQL database on both Window/Liunx platform",
|
||||
"ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
|
||||
"ext-pdo_oci": "For Oracle database",
|
||||
"ext-pdo_oci8": "For Oracle version 8 database",
|
||||
"ext-pdo_pqsql": "For PostgreSQL database",
|
||||
"ext-pdo_sqlite": "For SQLite database"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Medoo\\": "/src"
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+1852
@@ -0,0 +1,1852 @@
|
||||
<?php
|
||||
/*!
|
||||
* Medoo database framework
|
||||
* https://medoo.in
|
||||
* Version 1.7.10
|
||||
*
|
||||
* Copyright 2020, Angel Lai
|
||||
* Released under the MIT license
|
||||
*/
|
||||
|
||||
namespace Medoo;
|
||||
|
||||
use PDO;
|
||||
use Exception;
|
||||
use PDOException;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class Raw {
|
||||
public $map;
|
||||
public $value;
|
||||
}
|
||||
|
||||
class Medoo
|
||||
{
|
||||
public $pdo;
|
||||
|
||||
protected $type;
|
||||
|
||||
protected $prefix;
|
||||
|
||||
protected $statement;
|
||||
|
||||
protected $dsn;
|
||||
|
||||
protected $logs = [];
|
||||
|
||||
protected $logging = false;
|
||||
|
||||
protected $debug_mode = false;
|
||||
|
||||
protected $guid = 0;
|
||||
|
||||
protected $errorInfo = null;
|
||||
|
||||
public function __construct(array $options)
|
||||
{
|
||||
if (isset($options[ 'database_type' ]))
|
||||
{
|
||||
$this->type = strtolower($options[ 'database_type' ]);
|
||||
|
||||
if ($this->type === 'mariadb')
|
||||
{
|
||||
$this->type = 'mysql';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($options[ 'prefix' ]))
|
||||
{
|
||||
$this->prefix = $options[ 'prefix' ];
|
||||
}
|
||||
|
||||
if (isset($options[ 'logging' ]) && is_bool($options[ 'logging' ]))
|
||||
{
|
||||
$this->logging = $options[ 'logging' ];
|
||||
}
|
||||
|
||||
$option = isset($options[ 'option' ]) ? $options[ 'option' ] : [];
|
||||
$commands = (isset($options[ 'command' ]) && is_array($options[ 'command' ])) ? $options[ 'command' ] : [];
|
||||
|
||||
switch ($this->type)
|
||||
{
|
||||
case 'mysql':
|
||||
// Make MySQL using standard quoted identifier
|
||||
$commands[] = 'SET SQL_MODE=ANSI_QUOTES';
|
||||
|
||||
break;
|
||||
|
||||
case 'mssql':
|
||||
// Keep MSSQL QUOTED_IDENTIFIER is ON for standard quoting
|
||||
$commands[] = 'SET QUOTED_IDENTIFIER ON';
|
||||
|
||||
// Make ANSI_NULLS is ON for NULL value
|
||||
$commands[] = 'SET ANSI_NULLS ON';
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (isset($options[ 'pdo' ]))
|
||||
{
|
||||
if (!$options[ 'pdo' ] instanceof PDO)
|
||||
{
|
||||
throw new InvalidArgumentException('Invalid PDO object supplied');
|
||||
}
|
||||
|
||||
$this->pdo = $options[ 'pdo' ];
|
||||
|
||||
foreach ($commands as $value)
|
||||
{
|
||||
$this->pdo->exec($value);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($options[ 'dsn' ]))
|
||||
{
|
||||
if (is_array($options[ 'dsn' ]) && isset($options[ 'dsn' ][ 'driver' ]))
|
||||
{
|
||||
$attr = $options[ 'dsn' ];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Invalid DSN option supplied');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (
|
||||
isset($options[ 'port' ]) &&
|
||||
is_int($options[ 'port' ] * 1)
|
||||
)
|
||||
{
|
||||
$port = $options[ 'port' ];
|
||||
}
|
||||
|
||||
$is_port = isset($port);
|
||||
|
||||
switch ($this->type)
|
||||
{
|
||||
case 'mysql':
|
||||
$attr = [
|
||||
'driver' => 'mysql',
|
||||
'dbname' => $options[ 'database_name' ]
|
||||
];
|
||||
|
||||
if (isset($options[ 'socket' ]))
|
||||
{
|
||||
$attr[ 'unix_socket' ] = $options[ 'socket' ];
|
||||
}
|
||||
else
|
||||
{
|
||||
$attr[ 'host' ] = $options[ 'server' ];
|
||||
|
||||
if ($is_port)
|
||||
{
|
||||
$attr[ 'port' ] = $port;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'pgsql':
|
||||
$attr = [
|
||||
'driver' => 'pgsql',
|
||||
'host' => $options[ 'server' ],
|
||||
'dbname' => $options[ 'database_name' ]
|
||||
];
|
||||
|
||||
if ($is_port)
|
||||
{
|
||||
$attr[ 'port' ] = $port;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'sybase':
|
||||
$attr = [
|
||||
'driver' => 'dblib',
|
||||
'host' => $options[ 'server' ],
|
||||
'dbname' => $options[ 'database_name' ]
|
||||
];
|
||||
|
||||
if ($is_port)
|
||||
{
|
||||
$attr[ 'port' ] = $port;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'oracle':
|
||||
$attr = [
|
||||
'driver' => 'oci',
|
||||
'dbname' => $options[ 'server' ] ?
|
||||
'//' . $options[ 'server' ] . ($is_port ? ':' . $port : ':1521') . '/' . $options[ 'database_name' ] :
|
||||
$options[ 'database_name' ]
|
||||
];
|
||||
|
||||
if (isset($options[ 'charset' ]))
|
||||
{
|
||||
$attr[ 'charset' ] = $options[ 'charset' ];
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'mssql':
|
||||
if (isset($options[ 'driver' ]) && $options[ 'driver' ] === 'dblib')
|
||||
{
|
||||
$attr = [
|
||||
'driver' => 'dblib',
|
||||
'host' => $options[ 'server' ] . ($is_port ? ':' . $port : ''),
|
||||
'dbname' => $options[ 'database_name' ]
|
||||
];
|
||||
|
||||
if (isset($options[ 'appname' ]))
|
||||
{
|
||||
$attr[ 'appname' ] = $options[ 'appname' ];
|
||||
}
|
||||
|
||||
if (isset($options[ 'charset' ]))
|
||||
{
|
||||
$attr[ 'charset' ] = $options[ 'charset' ];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$attr = [
|
||||
'driver' => 'sqlsrv',
|
||||
'Server' => $options[ 'server' ] . ($is_port ? ',' . $port : ''),
|
||||
'Database' => $options[ 'database_name' ]
|
||||
];
|
||||
|
||||
if (isset($options[ 'appname' ]))
|
||||
{
|
||||
$attr[ 'APP' ] = $options[ 'appname' ];
|
||||
}
|
||||
|
||||
$config = [
|
||||
'ApplicationIntent',
|
||||
'AttachDBFileName',
|
||||
'Authentication',
|
||||
'ColumnEncryption',
|
||||
'ConnectionPooling',
|
||||
'Encrypt',
|
||||
'Failover_Partner',
|
||||
'KeyStoreAuthentication',
|
||||
'KeyStorePrincipalId',
|
||||
'KeyStoreSecret',
|
||||
'LoginTimeout',
|
||||
'MultipleActiveResultSets',
|
||||
'MultiSubnetFailover',
|
||||
'Scrollable',
|
||||
'TraceFile',
|
||||
'TraceOn',
|
||||
'TransactionIsolation',
|
||||
'TransparentNetworkIPResolution',
|
||||
'TrustServerCertificate',
|
||||
'WSID',
|
||||
];
|
||||
|
||||
foreach ($config as $value)
|
||||
{
|
||||
$keyname = strtolower(preg_replace(['/([a-z\d])([A-Z])/', '/([^_])([A-Z][a-z])/'], '$1_$2', $value));
|
||||
|
||||
if (isset($options[ $keyname ]))
|
||||
{
|
||||
$attr[ $value ] = $options[ $keyname ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'sqlite':
|
||||
$attr = [
|
||||
'driver' => 'sqlite',
|
||||
$options[ 'database_file' ]
|
||||
];
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($attr))
|
||||
{
|
||||
throw new InvalidArgumentException('Incorrect connection options');
|
||||
}
|
||||
|
||||
$driver = $attr[ 'driver' ];
|
||||
|
||||
if (!in_array($driver, PDO::getAvailableDrivers()))
|
||||
{
|
||||
throw new InvalidArgumentException("Unsupported PDO driver: {$driver}");
|
||||
}
|
||||
|
||||
unset($attr[ 'driver' ]);
|
||||
|
||||
$stack = [];
|
||||
|
||||
foreach ($attr as $key => $value)
|
||||
{
|
||||
$stack[] = is_int($key) ? $value : $key . '=' . $value;
|
||||
}
|
||||
|
||||
$dsn = $driver . ':' . implode(';', $stack);
|
||||
|
||||
if (
|
||||
in_array($this->type, ['mysql', 'pgsql', 'sybase', 'mssql']) &&
|
||||
isset($options[ 'charset' ])
|
||||
)
|
||||
{
|
||||
$commands[] = "SET NAMES '{$options[ 'charset' ]}'" . (
|
||||
$this->type === 'mysql' && isset($options[ 'collation' ]) ?
|
||||
" COLLATE '{$options[ 'collation' ]}'" : ''
|
||||
);
|
||||
}
|
||||
|
||||
$this->dsn = $dsn;
|
||||
|
||||
try {
|
||||
$this->pdo = new PDO(
|
||||
$dsn,
|
||||
isset($options[ 'username' ]) ? $options[ 'username' ] : null,
|
||||
isset($options[ 'password' ]) ? $options[ 'password' ] : null,
|
||||
$option
|
||||
);
|
||||
|
||||
foreach ($commands as $value)
|
||||
{
|
||||
$this->pdo->exec($value);
|
||||
}
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
throw new PDOException($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function query($query, $map = [])
|
||||
{
|
||||
$raw = $this->raw($query, $map);
|
||||
|
||||
$query = $this->buildRaw($raw, $map);
|
||||
|
||||
return $this->exec($query, $map);
|
||||
}
|
||||
|
||||
public function exec($query, $map = [])
|
||||
{
|
||||
$this->statement = null;
|
||||
|
||||
if ($this->debug_mode)
|
||||
{
|
||||
echo $this->generate($query, $map);
|
||||
|
||||
$this->debug_mode = false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->logging)
|
||||
{
|
||||
$this->logs[] = [$query, $map];
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->logs = [[$query, $map]];
|
||||
}
|
||||
|
||||
$statement = $this->pdo->prepare($query);
|
||||
|
||||
if (!$statement)
|
||||
{
|
||||
$this->errorInfo = $this->pdo->errorInfo();
|
||||
$this->statement = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->statement = $statement;
|
||||
|
||||
foreach ($map as $key => $value)
|
||||
{
|
||||
$statement->bindValue($key, $value[ 0 ], $value[ 1 ]);
|
||||
}
|
||||
|
||||
$execute = $statement->execute();
|
||||
|
||||
$this->errorInfo = $statement->errorInfo();
|
||||
|
||||
if (!$execute)
|
||||
{
|
||||
$this->statement = null;
|
||||
}
|
||||
|
||||
return $statement;
|
||||
}
|
||||
|
||||
protected function generate($query, $map)
|
||||
{
|
||||
$identifier = [
|
||||
'mysql' => '`$1`',
|
||||
'mssql' => '[$1]'
|
||||
];
|
||||
|
||||
$query = preg_replace(
|
||||
'/"([a-zA-Z0-9_]+)"/i',
|
||||
isset($identifier[ $this->type ]) ? $identifier[ $this->type ] : '"$1"',
|
||||
$query
|
||||
);
|
||||
|
||||
foreach ($map as $key => $value)
|
||||
{
|
||||
if ($value[ 1 ] === PDO::PARAM_STR)
|
||||
{
|
||||
$replace = $this->quote($value[ 0 ]);
|
||||
}
|
||||
elseif ($value[ 1 ] === PDO::PARAM_NULL)
|
||||
{
|
||||
$replace = 'NULL';
|
||||
}
|
||||
elseif ($value[ 1 ] === PDO::PARAM_LOB)
|
||||
{
|
||||
$replace = '{LOB_DATA}';
|
||||
}
|
||||
else
|
||||
{
|
||||
$replace = $value[ 0 ];
|
||||
}
|
||||
|
||||
$query = str_replace($key, $replace, $query);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
public static function raw($string, $map = [])
|
||||
{
|
||||
$raw = new Raw();
|
||||
|
||||
$raw->map = $map;
|
||||
$raw->value = $string;
|
||||
|
||||
return $raw;
|
||||
}
|
||||
|
||||
protected function isRaw($object)
|
||||
{
|
||||
return $object instanceof Raw;
|
||||
}
|
||||
|
||||
protected function buildRaw($raw, &$map)
|
||||
{
|
||||
if (!$this->isRaw($raw))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$query = preg_replace_callback(
|
||||
'/(([`\']).*?)?((FROM|TABLE|INTO|UPDATE|JOIN)\s*)?\<(([a-zA-Z0-9_]+)(\.[a-zA-Z0-9_]+)?)\>(.*?\2)?/i',
|
||||
function ($matches)
|
||||
{
|
||||
if (!empty($matches[ 2 ]) && isset($matches[ 8 ]))
|
||||
{
|
||||
return $matches[ 0 ];
|
||||
}
|
||||
|
||||
if (!empty($matches[ 4 ]))
|
||||
{
|
||||
return $matches[ 1 ] . $matches[ 4 ] . ' ' . $this->tableQuote($matches[ 5 ]);
|
||||
}
|
||||
|
||||
return $matches[ 1 ] . $this->columnQuote($matches[ 5 ]);
|
||||
},
|
||||
$raw->value);
|
||||
|
||||
$raw_map = $raw->map;
|
||||
|
||||
if (!empty($raw_map))
|
||||
{
|
||||
foreach ($raw_map as $key => $value)
|
||||
{
|
||||
$map[ $key ] = $this->typeMap($value, gettype($value));
|
||||
}
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
public function quote($string)
|
||||
{
|
||||
return $this->pdo->quote($string);
|
||||
}
|
||||
|
||||
protected function tableQuote($table)
|
||||
{
|
||||
if (!preg_match('/^[a-zA-Z0-9_]+$/i', $table))
|
||||
{
|
||||
throw new InvalidArgumentException("Incorrect table name \"$table\"");
|
||||
}
|
||||
|
||||
return '"' . $this->prefix . $table . '"';
|
||||
}
|
||||
|
||||
protected function mapKey()
|
||||
{
|
||||
return ':MeDoO_' . $this->guid++ . '_mEdOo';
|
||||
}
|
||||
|
||||
protected function typeMap($value, $type)
|
||||
{
|
||||
$map = [
|
||||
'NULL' => PDO::PARAM_NULL,
|
||||
'integer' => PDO::PARAM_INT,
|
||||
'double' => PDO::PARAM_STR,
|
||||
'boolean' => PDO::PARAM_BOOL,
|
||||
'string' => PDO::PARAM_STR,
|
||||
'object' => PDO::PARAM_STR,
|
||||
'resource' => PDO::PARAM_LOB
|
||||
];
|
||||
|
||||
if ($type === 'boolean')
|
||||
{
|
||||
$value = ($value ? '1' : '0');
|
||||
}
|
||||
elseif ($type === 'NULL')
|
||||
{
|
||||
$value = null;
|
||||
}
|
||||
|
||||
return [$value, $map[ $type ]];
|
||||
}
|
||||
|
||||
protected function columnQuote($string)
|
||||
{
|
||||
if (!preg_match('/^[a-zA-Z0-9_]+(\.?[a-zA-Z0-9_]+)?$/i', $string))
|
||||
{
|
||||
throw new InvalidArgumentException("Incorrect column name \"$string\"");
|
||||
}
|
||||
|
||||
if (strpos($string, '.') !== false)
|
||||
{
|
||||
return '"' . $this->prefix . str_replace('.', '"."', $string) . '"';
|
||||
}
|
||||
|
||||
return '"' . $string . '"';
|
||||
}
|
||||
|
||||
protected function columnPush(&$columns, &$map, $root, $is_join = false)
|
||||
{
|
||||
if ($columns === '*')
|
||||
{
|
||||
return $columns;
|
||||
}
|
||||
|
||||
$stack = [];
|
||||
|
||||
if (is_string($columns))
|
||||
{
|
||||
$columns = [$columns];
|
||||
}
|
||||
|
||||
foreach ($columns as $key => $value)
|
||||
{
|
||||
if (!is_int($key) && is_array($value) && $root && count(array_keys($columns)) === 1)
|
||||
{
|
||||
$stack[] = $this->columnQuote($key);
|
||||
|
||||
$stack[] = $this->columnPush($value, $map, false, $is_join);
|
||||
}
|
||||
elseif (is_array($value))
|
||||
{
|
||||
$stack[] = $this->columnPush($value, $map, false, $is_join);
|
||||
}
|
||||
elseif (!is_int($key) && $raw = $this->buildRaw($value, $map))
|
||||
{
|
||||
preg_match('/(?<column>[a-zA-Z0-9_\.]+)(\s*\[(?<type>(String|Bool|Int|Number))\])?/i', $key, $match);
|
||||
|
||||
$stack[] = $raw . ' AS ' . $this->columnQuote($match[ 'column' ]);
|
||||
}
|
||||
elseif (is_int($key) && is_string($value))
|
||||
{
|
||||
if ($is_join && strpos($value, '*') !== false)
|
||||
{
|
||||
throw new InvalidArgumentException('Cannot use table.* to select all columns while joining table');
|
||||
}
|
||||
|
||||
preg_match('/(?<column>[a-zA-Z0-9_\.]+)(?:\s*\((?<alias>[a-zA-Z0-9_]+)\))?(?:\s*\[(?<type>(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $match);
|
||||
|
||||
if (!empty($match[ 'alias' ]))
|
||||
{
|
||||
$stack[] = $this->columnQuote($match[ 'column' ]) . ' AS ' . $this->columnQuote($match[ 'alias' ]);
|
||||
|
||||
$columns[ $key ] = $match[ 'alias' ];
|
||||
|
||||
if (!empty($match[ 'type' ]))
|
||||
{
|
||||
$columns[ $key ] .= ' [' . $match[ 'type' ] . ']';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$stack[] = $this->columnQuote($match[ 'column' ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return implode(',', $stack);
|
||||
}
|
||||
|
||||
protected function arrayQuote($array)
|
||||
{
|
||||
$stack = [];
|
||||
|
||||
foreach ($array as $value)
|
||||
{
|
||||
$stack[] = is_int($value) ? $value : $this->pdo->quote($value);
|
||||
}
|
||||
|
||||
return implode(',', $stack);
|
||||
}
|
||||
|
||||
protected function innerConjunct($data, $map, $conjunctor, $outer_conjunctor)
|
||||
{
|
||||
$stack = [];
|
||||
|
||||
foreach ($data as $value)
|
||||
{
|
||||
$stack[] = '(' . $this->dataImplode($value, $map, $conjunctor) . ')';
|
||||
}
|
||||
|
||||
return implode($outer_conjunctor . ' ', $stack);
|
||||
}
|
||||
|
||||
protected function dataImplode($data, &$map, $conjunctor)
|
||||
{
|
||||
$stack = [];
|
||||
|
||||
foreach ($data as $key => $value)
|
||||
{
|
||||
$type = gettype($value);
|
||||
|
||||
if (
|
||||
$type === 'array' &&
|
||||
preg_match("/^(AND|OR)(\s+#.*)?$/", $key, $relation_match)
|
||||
)
|
||||
{
|
||||
$relationship = $relation_match[ 1 ];
|
||||
|
||||
$stack[] = $value !== array_keys(array_keys($value)) ?
|
||||
'(' . $this->dataImplode($value, $map, ' ' . $relationship) . ')' :
|
||||
'(' . $this->innerConjunct($value, $map, ' ' . $relationship, $conjunctor) . ')';
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$map_key = $this->mapKey();
|
||||
|
||||
if (
|
||||
is_int($key) &&
|
||||
preg_match('/([a-zA-Z0-9_\.]+)\[(?<operator>\>\=?|\<\=?|\!?\=)\]([a-zA-Z0-9_\.]+)/i', $value, $match)
|
||||
)
|
||||
{
|
||||
$stack[] = $this->columnQuote($match[ 1 ]) . ' ' . $match[ 'operator' ] . ' ' . $this->columnQuote($match[ 3 ]);
|
||||
}
|
||||
else
|
||||
{
|
||||
preg_match('/([a-zA-Z0-9_\.]+)(\[(?<operator>\>\=?|\<\=?|\!|\<\>|\>\<|\!?~|REGEXP)\])?/i', $key, $match);
|
||||
$column = $this->columnQuote($match[ 1 ]);
|
||||
|
||||
if (isset($match[ 'operator' ]))
|
||||
{
|
||||
$operator = $match[ 'operator' ];
|
||||
|
||||
if (in_array($operator, ['>', '>=', '<', '<=']))
|
||||
{
|
||||
$condition = $column . ' ' . $operator . ' ';
|
||||
|
||||
if (is_numeric($value))
|
||||
{
|
||||
$condition .= $map_key;
|
||||
$map[ $map_key ] = [$value, is_float($value) ? PDO::PARAM_STR : PDO::PARAM_INT];
|
||||
}
|
||||
elseif ($raw = $this->buildRaw($value, $map))
|
||||
{
|
||||
$condition .= $raw;
|
||||
}
|
||||
else
|
||||
{
|
||||
$condition .= $map_key;
|
||||
$map[ $map_key ] = [$value, PDO::PARAM_STR];
|
||||
}
|
||||
|
||||
$stack[] = $condition;
|
||||
}
|
||||
elseif ($operator === '!')
|
||||
{
|
||||
switch ($type)
|
||||
{
|
||||
case 'NULL':
|
||||
$stack[] = $column . ' IS NOT NULL';
|
||||
break;
|
||||
|
||||
case 'array':
|
||||
$placeholders = [];
|
||||
|
||||
foreach ($value as $index => $item)
|
||||
{
|
||||
$stack_key = $map_key . $index . '_i';
|
||||
|
||||
$placeholders[] = $stack_key;
|
||||
$map[ $stack_key ] = $this->typeMap($item, gettype($item));
|
||||
}
|
||||
|
||||
$stack[] = $column . ' NOT IN (' . implode(', ', $placeholders) . ')';
|
||||
break;
|
||||
|
||||
case 'object':
|
||||
if ($raw = $this->buildRaw($value, $map))
|
||||
{
|
||||
$stack[] = $column . ' != ' . $raw;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'integer':
|
||||
case 'double':
|
||||
case 'boolean':
|
||||
case 'string':
|
||||
$stack[] = $column . ' != ' . $map_key;
|
||||
$map[ $map_key ] = $this->typeMap($value, $type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
elseif ($operator === '~' || $operator === '!~')
|
||||
{
|
||||
if ($type !== 'array')
|
||||
{
|
||||
$value = [ $value ];
|
||||
}
|
||||
|
||||
$connector = ' OR ';
|
||||
$data = array_values($value);
|
||||
|
||||
if (is_array($data[ 0 ]))
|
||||
{
|
||||
if (isset($value[ 'AND' ]) || isset($value[ 'OR' ]))
|
||||
{
|
||||
$connector = ' ' . array_keys($value)[ 0 ] . ' ';
|
||||
$value = $data[ 0 ];
|
||||
}
|
||||
}
|
||||
|
||||
$like_clauses = [];
|
||||
|
||||
foreach ($value as $index => $item)
|
||||
{
|
||||
$item = strval($item);
|
||||
|
||||
if (!preg_match('/(\[.+\]|[\*\?\!\%#^-_]|%.+|.+%)/', $item))
|
||||
{
|
||||
$item = '%' . $item . '%';
|
||||
}
|
||||
|
||||
$like_clauses[] = $column . ($operator === '!~' ? ' NOT' : '') . ' LIKE ' . $map_key . 'L' . $index;
|
||||
$map[ $map_key . 'L' . $index ] = [$item, PDO::PARAM_STR];
|
||||
}
|
||||
|
||||
$stack[] = '(' . implode($connector, $like_clauses) . ')';
|
||||
}
|
||||
elseif ($operator === '<>' || $operator === '><')
|
||||
{
|
||||
if ($type === 'array')
|
||||
{
|
||||
if ($operator === '><')
|
||||
{
|
||||
$column .= ' NOT';
|
||||
}
|
||||
|
||||
$stack[] = '(' . $column . ' BETWEEN ' . $map_key . 'a AND ' . $map_key . 'b)';
|
||||
|
||||
$data_type = (is_numeric($value[ 0 ]) && is_numeric($value[ 1 ])) ? PDO::PARAM_INT : PDO::PARAM_STR;
|
||||
|
||||
$map[ $map_key . 'a' ] = [$value[ 0 ], $data_type];
|
||||
$map[ $map_key . 'b' ] = [$value[ 1 ], $data_type];
|
||||
}
|
||||
}
|
||||
elseif ($operator === 'REGEXP')
|
||||
{
|
||||
$stack[] = $column . ' REGEXP ' . $map_key;
|
||||
$map[ $map_key ] = [$value, PDO::PARAM_STR];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ($type)
|
||||
{
|
||||
case 'NULL':
|
||||
$stack[] = $column . ' IS NULL';
|
||||
break;
|
||||
|
||||
case 'array':
|
||||
$placeholders = [];
|
||||
|
||||
foreach ($value as $index => $item)
|
||||
{
|
||||
$stack_key = $map_key . $index . '_i';
|
||||
|
||||
$placeholders[] = $stack_key;
|
||||
$map[ $stack_key ] = $this->typeMap($item, gettype($item));
|
||||
}
|
||||
|
||||
$stack[] = $column . ' IN (' . implode(', ', $placeholders) . ')';
|
||||
break;
|
||||
|
||||
case 'object':
|
||||
if ($raw = $this->buildRaw($value, $map))
|
||||
{
|
||||
$stack[] = $column . ' = ' . $raw;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'integer':
|
||||
case 'double':
|
||||
case 'boolean':
|
||||
case 'string':
|
||||
$stack[] = $column . ' = ' . $map_key;
|
||||
$map[ $map_key ] = $this->typeMap($value, $type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return implode($conjunctor . ' ', $stack);
|
||||
}
|
||||
|
||||
protected function whereClause($where, &$map)
|
||||
{
|
||||
$where_clause = '';
|
||||
|
||||
if (is_array($where))
|
||||
{
|
||||
$where_keys = array_keys($where);
|
||||
|
||||
$conditions = array_diff_key($where, array_flip(
|
||||
['GROUP', 'ORDER', 'HAVING', 'LIMIT', 'LIKE', 'MATCH']
|
||||
));
|
||||
|
||||
if (!empty($conditions))
|
||||
{
|
||||
$where_clause = ' WHERE ' . $this->dataImplode($conditions, $map, ' AND');
|
||||
}
|
||||
|
||||
if (isset($where[ 'MATCH' ]) && $this->type === 'mysql')
|
||||
{
|
||||
$MATCH = $where[ 'MATCH' ];
|
||||
|
||||
if (is_array($MATCH) && isset($MATCH[ 'columns' ], $MATCH[ 'keyword' ]))
|
||||
{
|
||||
$mode = '';
|
||||
|
||||
$mode_array = [
|
||||
'natural' => 'IN NATURAL LANGUAGE MODE',
|
||||
'natural+query' => 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION',
|
||||
'boolean' => 'IN BOOLEAN MODE',
|
||||
'query' => 'WITH QUERY EXPANSION'
|
||||
];
|
||||
|
||||
if (isset($MATCH[ 'mode' ], $mode_array[ $MATCH[ 'mode' ] ]))
|
||||
{
|
||||
$mode = ' ' . $mode_array[ $MATCH[ 'mode' ] ];
|
||||
}
|
||||
|
||||
$columns = implode(', ', array_map([$this, 'columnQuote'], $MATCH[ 'columns' ]));
|
||||
$map_key = $this->mapKey();
|
||||
$map[ $map_key ] = [$MATCH[ 'keyword' ], PDO::PARAM_STR];
|
||||
|
||||
$where_clause .= ($where_clause !== '' ? ' AND ' : ' WHERE') . ' MATCH (' . $columns . ') AGAINST (' . $map_key . $mode . ')';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($where[ 'GROUP' ]))
|
||||
{
|
||||
$GROUP = $where[ 'GROUP' ];
|
||||
|
||||
if (is_array($GROUP))
|
||||
{
|
||||
$stack = [];
|
||||
|
||||
foreach ($GROUP as $column => $value)
|
||||
{
|
||||
$stack[] = $this->columnQuote($value);
|
||||
}
|
||||
|
||||
$where_clause .= ' GROUP BY ' . implode(',', $stack);
|
||||
}
|
||||
elseif ($raw = $this->buildRaw($GROUP, $map))
|
||||
{
|
||||
$where_clause .= ' GROUP BY ' . $raw;
|
||||
}
|
||||
else
|
||||
{
|
||||
$where_clause .= ' GROUP BY ' . $this->columnQuote($GROUP);
|
||||
}
|
||||
|
||||
if (isset($where[ 'HAVING' ]))
|
||||
{
|
||||
if ($raw = $this->buildRaw($where[ 'HAVING' ], $map))
|
||||
{
|
||||
$where_clause .= ' HAVING ' . $raw;
|
||||
}
|
||||
else
|
||||
{
|
||||
$where_clause .= ' HAVING ' . $this->dataImplode($where[ 'HAVING' ], $map, ' AND');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($where[ 'ORDER' ]))
|
||||
{
|
||||
$ORDER = $where[ 'ORDER' ];
|
||||
|
||||
if (is_array($ORDER))
|
||||
{
|
||||
$stack = [];
|
||||
|
||||
foreach ($ORDER as $column => $value)
|
||||
{
|
||||
if (is_array($value))
|
||||
{
|
||||
$stack[] = 'FIELD(' . $this->columnQuote($column) . ', ' . $this->arrayQuote($value) . ')';
|
||||
}
|
||||
elseif ($value === 'ASC' || $value === 'DESC')
|
||||
{
|
||||
$stack[] = $this->columnQuote($column) . ' ' . $value;
|
||||
}
|
||||
elseif (is_int($column))
|
||||
{
|
||||
$stack[] = $this->columnQuote($value);
|
||||
}
|
||||
}
|
||||
|
||||
$where_clause .= ' ORDER BY ' . implode(',', $stack);
|
||||
}
|
||||
elseif ($raw = $this->buildRaw($ORDER, $map))
|
||||
{
|
||||
$where_clause .= ' ORDER BY ' . $raw;
|
||||
}
|
||||
else
|
||||
{
|
||||
$where_clause .= ' ORDER BY ' . $this->columnQuote($ORDER);
|
||||
}
|
||||
|
||||
if (
|
||||
isset($where[ 'LIMIT' ]) &&
|
||||
in_array($this->type, ['oracle', 'mssql'])
|
||||
)
|
||||
{
|
||||
$LIMIT = $where[ 'LIMIT' ];
|
||||
|
||||
if (is_numeric($LIMIT))
|
||||
{
|
||||
$LIMIT = [0, $LIMIT];
|
||||
}
|
||||
|
||||
if (
|
||||
is_array($LIMIT) &&
|
||||
is_numeric($LIMIT[ 0 ]) &&
|
||||
is_numeric($LIMIT[ 1 ])
|
||||
)
|
||||
{
|
||||
$where_clause .= ' OFFSET ' . $LIMIT[ 0 ] . ' ROWS FETCH NEXT ' . $LIMIT[ 1 ] . ' ROWS ONLY';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($where[ 'LIMIT' ]) && !in_array($this->type, ['oracle', 'mssql']))
|
||||
{
|
||||
$LIMIT = $where[ 'LIMIT' ];
|
||||
|
||||
if (is_numeric($LIMIT))
|
||||
{
|
||||
$where_clause .= ' LIMIT ' . $LIMIT;
|
||||
}
|
||||
elseif (
|
||||
is_array($LIMIT) &&
|
||||
is_numeric($LIMIT[ 0 ]) &&
|
||||
is_numeric($LIMIT[ 1 ])
|
||||
)
|
||||
{
|
||||
$where_clause .= ' LIMIT ' . $LIMIT[ 1 ] . ' OFFSET ' . $LIMIT[ 0 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif ($raw = $this->buildRaw($where, $map))
|
||||
{
|
||||
$where_clause .= ' ' . $raw;
|
||||
}
|
||||
|
||||
return $where_clause;
|
||||
}
|
||||
|
||||
protected function selectContext($table, &$map, $join, &$columns = null, $where = null, $column_fn = null)
|
||||
{
|
||||
preg_match('/(?<table>[a-zA-Z0-9_]+)\s*\((?<alias>[a-zA-Z0-9_]+)\)/i', $table, $table_match);
|
||||
|
||||
if (isset($table_match[ 'table' ], $table_match[ 'alias' ]))
|
||||
{
|
||||
$table = $this->tableQuote($table_match[ 'table' ]);
|
||||
|
||||
$table_query = $table . ' AS ' . $this->tableQuote($table_match[ 'alias' ]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$table = $this->tableQuote($table);
|
||||
|
||||
$table_query = $table;
|
||||
}
|
||||
|
||||
$is_join = false;
|
||||
$join_key = is_array($join) ? array_keys($join) : null;
|
||||
|
||||
if (
|
||||
isset($join_key[ 0 ]) &&
|
||||
strpos($join_key[ 0 ], '[') === 0
|
||||
)
|
||||
{
|
||||
$is_join = true;
|
||||
$table_query .= ' ' . $this->buildJoin($table, $join);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_null($columns))
|
||||
{
|
||||
if (
|
||||
!is_null($where) ||
|
||||
(is_array($join) && isset($column_fn))
|
||||
)
|
||||
{
|
||||
$where = $join;
|
||||
$columns = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
$where = null;
|
||||
$columns = $join;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$where = $columns;
|
||||
$columns = $join;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($column_fn))
|
||||
{
|
||||
if ($column_fn === 1)
|
||||
{
|
||||
$column = '1';
|
||||
|
||||
if (is_null($where))
|
||||
{
|
||||
$where = $columns;
|
||||
}
|
||||
}
|
||||
elseif ($raw = $this->buildRaw($column_fn, $map))
|
||||
{
|
||||
$column = $raw;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (empty($columns) || $this->isRaw($columns))
|
||||
{
|
||||
$columns = '*';
|
||||
$where = $join;
|
||||
}
|
||||
|
||||
$column = $column_fn . '(' . $this->columnPush($columns, $map, true) . ')';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$column = $this->columnPush($columns, $map, true, $is_join);
|
||||
}
|
||||
|
||||
return 'SELECT ' . $column . ' FROM ' . $table_query . $this->whereClause($where, $map);
|
||||
}
|
||||
|
||||
protected function buildJoin($table, $join)
|
||||
{
|
||||
$table_join = [];
|
||||
|
||||
$join_array = [
|
||||
'>' => 'LEFT',
|
||||
'<' => 'RIGHT',
|
||||
'<>' => 'FULL',
|
||||
'><' => 'INNER'
|
||||
];
|
||||
|
||||
foreach($join as $sub_table => $relation)
|
||||
{
|
||||
preg_match('/(\[(?<join>\<\>?|\>\<?)\])?(?<table>[a-zA-Z0-9_]+)\s?(\((?<alias>[a-zA-Z0-9_]+)\))?/', $sub_table, $match);
|
||||
|
||||
if ($match[ 'join' ] !== '' && $match[ 'table' ] !== '')
|
||||
{
|
||||
if (is_string($relation))
|
||||
{
|
||||
$relation = 'USING ("' . $relation . '")';
|
||||
}
|
||||
|
||||
if (is_array($relation))
|
||||
{
|
||||
// For ['column1', 'column2']
|
||||
if (isset($relation[ 0 ]))
|
||||
{
|
||||
$relation = 'USING ("' . implode('", "', $relation) . '")';
|
||||
}
|
||||
else
|
||||
{
|
||||
$joins = [];
|
||||
|
||||
foreach ($relation as $key => $value)
|
||||
{
|
||||
$joins[] = (
|
||||
strpos($key, '.') > 0 ?
|
||||
// For ['tableB.column' => 'column']
|
||||
$this->columnQuote($key) :
|
||||
|
||||
// For ['column1' => 'column2']
|
||||
$table . '."' . $key . '"'
|
||||
) .
|
||||
' = ' .
|
||||
$this->tableQuote(isset($match[ 'alias' ]) ? $match[ 'alias' ] : $match[ 'table' ]) . '."' . $value . '"';
|
||||
}
|
||||
|
||||
$relation = 'ON ' . implode(' AND ', $joins);
|
||||
}
|
||||
}
|
||||
|
||||
$table_name = $this->tableQuote($match[ 'table' ]) . ' ';
|
||||
|
||||
if (isset($match[ 'alias' ]))
|
||||
{
|
||||
$table_name .= 'AS ' . $this->tableQuote($match[ 'alias' ]) . ' ';
|
||||
}
|
||||
|
||||
$table_join[] = $join_array[ $match[ 'join' ] ] . ' JOIN ' . $table_name . $relation;
|
||||
}
|
||||
}
|
||||
|
||||
return implode(' ', $table_join);
|
||||
}
|
||||
|
||||
protected function columnMap($columns, &$stack, $root)
|
||||
{
|
||||
if ($columns === '*')
|
||||
{
|
||||
return $stack;
|
||||
}
|
||||
|
||||
foreach ($columns as $key => $value)
|
||||
{
|
||||
if (is_int($key))
|
||||
{
|
||||
preg_match('/([a-zA-Z0-9_]+\.)?(?<column>[a-zA-Z0-9_]+)(?:\s*\((?<alias>[a-zA-Z0-9_]+)\))?(?:\s*\[(?<type>(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $key_match);
|
||||
|
||||
$column_key = !empty($key_match[ 'alias' ]) ?
|
||||
$key_match[ 'alias' ] :
|
||||
$key_match[ 'column' ];
|
||||
|
||||
if (isset($key_match[ 'type' ]))
|
||||
{
|
||||
$stack[ $value ] = [$column_key, $key_match[ 'type' ]];
|
||||
}
|
||||
else
|
||||
{
|
||||
$stack[ $value ] = [$column_key, 'String'];
|
||||
}
|
||||
}
|
||||
elseif ($this->isRaw($value))
|
||||
{
|
||||
preg_match('/([a-zA-Z0-9_]+\.)?(?<column>[a-zA-Z0-9_]+)(\s*\[(?<type>(String|Bool|Int|Number))\])?/i', $key, $key_match);
|
||||
|
||||
$column_key = $key_match[ 'column' ];
|
||||
|
||||
if (isset($key_match[ 'type' ]))
|
||||
{
|
||||
$stack[ $key ] = [$column_key, $key_match[ 'type' ]];
|
||||
}
|
||||
else
|
||||
{
|
||||
$stack[ $key ] = [$column_key, 'String'];
|
||||
}
|
||||
}
|
||||
elseif (!is_int($key) && is_array($value))
|
||||
{
|
||||
if ($root && count(array_keys($columns)) === 1)
|
||||
{
|
||||
$stack[ $key ] = [$key, 'String'];
|
||||
}
|
||||
|
||||
$this->columnMap($value, $stack, false);
|
||||
}
|
||||
}
|
||||
|
||||
return $stack;
|
||||
}
|
||||
|
||||
protected function dataMap($data, $columns, $column_map, &$stack, $root, &$result)
|
||||
{
|
||||
if ($root)
|
||||
{
|
||||
$columns_key = array_keys($columns);
|
||||
|
||||
if (count($columns_key) === 1 && is_array($columns[$columns_key[0]]))
|
||||
{
|
||||
$index_key = array_keys($columns)[0];
|
||||
$data_key = preg_replace("/^[a-zA-Z0-9_]+\./i", "", $index_key);
|
||||
|
||||
$current_stack = [];
|
||||
|
||||
foreach ($data as $item)
|
||||
{
|
||||
$this->dataMap($data, $columns[ $index_key ], $column_map, $current_stack, false, $result);
|
||||
|
||||
$index = $data[ $data_key ];
|
||||
|
||||
$result[ $index ] = $current_stack;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$current_stack = [];
|
||||
|
||||
$this->dataMap($data, $columns, $column_map, $current_stack, false, $result);
|
||||
|
||||
$result[] = $current_stack;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($columns as $key => $value)
|
||||
{
|
||||
$isRaw = $this->isRaw($value);
|
||||
|
||||
if (is_int($key) || $isRaw)
|
||||
{
|
||||
$map = $column_map[ $isRaw ? $key : $value ];
|
||||
|
||||
$column_key = $map[ 0 ];
|
||||
|
||||
$item = $data[ $column_key ];
|
||||
|
||||
if (isset($map[ 1 ]))
|
||||
{
|
||||
if ($isRaw && in_array($map[ 1 ], ['Object', 'JSON']))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_null($item))
|
||||
{
|
||||
$stack[ $column_key ] = null;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch ($map[ 1 ])
|
||||
{
|
||||
case 'Number':
|
||||
$stack[ $column_key ] = (double) $item;
|
||||
break;
|
||||
|
||||
case 'Int':
|
||||
$stack[ $column_key ] = (int) $item;
|
||||
break;
|
||||
|
||||
case 'Bool':
|
||||
$stack[ $column_key ] = (bool) $item;
|
||||
break;
|
||||
|
||||
case 'Object':
|
||||
$stack[ $column_key ] = unserialize($item);
|
||||
break;
|
||||
|
||||
case 'JSON':
|
||||
$stack[ $column_key ] = json_decode($item, true);
|
||||
break;
|
||||
|
||||
case 'String':
|
||||
$stack[ $column_key ] = $item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$stack[ $column_key ] = $item;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$current_stack = [];
|
||||
|
||||
$this->dataMap($data, $value, $column_map, $current_stack, false, $result);
|
||||
|
||||
$stack[ $key ] = $current_stack;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function create($table, $columns, $options = null)
|
||||
{
|
||||
$stack = [];
|
||||
|
||||
$tableName = $this->prefix . $table;
|
||||
|
||||
foreach ($columns as $name => $definition)
|
||||
{
|
||||
if (is_int($name))
|
||||
{
|
||||
$stack[] = preg_replace('/\<([a-zA-Z0-9_]+)\>/i', '"$1"', $definition);
|
||||
}
|
||||
elseif (is_array($definition))
|
||||
{
|
||||
$stack[] = $name . ' ' . implode(' ', $definition);
|
||||
}
|
||||
elseif (is_string($definition))
|
||||
{
|
||||
$stack[] = $name . ' ' . $this->query($definition);
|
||||
}
|
||||
}
|
||||
|
||||
$table_option = '';
|
||||
|
||||
if (is_array($options))
|
||||
{
|
||||
$option_stack = [];
|
||||
|
||||
foreach ($options as $key => $value)
|
||||
{
|
||||
if (is_string($value) || is_int($value))
|
||||
{
|
||||
$option_stack[] = "$key = $value";
|
||||
}
|
||||
}
|
||||
|
||||
$table_option = ' ' . implode(', ', $option_stack);
|
||||
}
|
||||
elseif (is_string($options))
|
||||
{
|
||||
$table_option = ' ' . $options;
|
||||
}
|
||||
|
||||
return $this->exec("CREATE TABLE IF NOT EXISTS $tableName (" . implode(', ', $stack) . ")$table_option");
|
||||
}
|
||||
|
||||
public function drop($table)
|
||||
{
|
||||
$tableName = $this->prefix . $table;
|
||||
|
||||
return $this->exec("DROP TABLE IF EXISTS $tableName");
|
||||
}
|
||||
|
||||
public function select($table, $join, $columns = null, $where = null)
|
||||
{
|
||||
$map = [];
|
||||
$result = [];
|
||||
$column_map = [];
|
||||
|
||||
$index = 0;
|
||||
|
||||
$column = $where === null ? $join : $columns;
|
||||
|
||||
$is_single = (is_string($column) && $column !== '*');
|
||||
|
||||
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where), $map);
|
||||
|
||||
$this->columnMap($columns, $column_map, true);
|
||||
|
||||
if (!$this->statement)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($columns === '*')
|
||||
{
|
||||
return $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
while ($data = $query->fetch(PDO::FETCH_ASSOC))
|
||||
{
|
||||
$current_stack = [];
|
||||
|
||||
$this->dataMap($data, $columns, $column_map, $current_stack, true, $result);
|
||||
}
|
||||
|
||||
if ($is_single)
|
||||
{
|
||||
$single_result = [];
|
||||
$result_key = $column_map[ $column ][ 0 ];
|
||||
|
||||
foreach ($result as $item)
|
||||
{
|
||||
$single_result[] = $item[ $result_key ];
|
||||
}
|
||||
|
||||
return $single_result;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function insert($table, $datas)
|
||||
{
|
||||
$stack = [];
|
||||
$columns = [];
|
||||
$fields = [];
|
||||
$map = [];
|
||||
|
||||
if (!isset($datas[ 0 ]))
|
||||
{
|
||||
$datas = [$datas];
|
||||
}
|
||||
|
||||
foreach ($datas as $data)
|
||||
{
|
||||
foreach ($data as $key => $value)
|
||||
{
|
||||
$columns[] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
$columns = array_unique($columns);
|
||||
|
||||
foreach ($datas as $data)
|
||||
{
|
||||
$values = [];
|
||||
|
||||
foreach ($columns as $key)
|
||||
{
|
||||
if ($raw = $this->buildRaw($data[ $key ], $map))
|
||||
{
|
||||
$values[] = $raw;
|
||||
continue;
|
||||
}
|
||||
|
||||
$map_key = $this->mapKey();
|
||||
|
||||
$values[] = $map_key;
|
||||
|
||||
if (!isset($data[ $key ]))
|
||||
{
|
||||
$map[ $map_key ] = [null, PDO::PARAM_NULL];
|
||||
}
|
||||
else
|
||||
{
|
||||
$value = $data[ $key ];
|
||||
|
||||
$type = gettype($value);
|
||||
|
||||
switch ($type)
|
||||
{
|
||||
case 'array':
|
||||
$map[ $map_key ] = [
|
||||
strpos($key, '[JSON]') === strlen($key) - 6 ?
|
||||
json_encode($value) :
|
||||
serialize($value),
|
||||
PDO::PARAM_STR
|
||||
];
|
||||
break;
|
||||
|
||||
case 'object':
|
||||
$value = serialize($value);
|
||||
|
||||
case 'NULL':
|
||||
case 'resource':
|
||||
case 'boolean':
|
||||
case 'integer':
|
||||
case 'double':
|
||||
case 'string':
|
||||
$map[ $map_key ] = $this->typeMap($value, $type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$stack[] = '(' . implode(', ', $values) . ')';
|
||||
}
|
||||
|
||||
foreach ($columns as $key)
|
||||
{
|
||||
$fields[] = $this->columnQuote(preg_replace("/(\s*\[JSON\]$)/i", '', $key));
|
||||
}
|
||||
|
||||
return $this->exec('INSERT INTO ' . $this->tableQuote($table) . ' (' . implode(', ', $fields) . ') VALUES ' . implode(', ', $stack), $map);
|
||||
}
|
||||
|
||||
public function update($table, $data, $where = null)
|
||||
{
|
||||
$fields = [];
|
||||
$map = [];
|
||||
|
||||
foreach ($data as $key => $value)
|
||||
{
|
||||
$column = $this->columnQuote(preg_replace("/(\s*\[(JSON|\+|\-|\*|\/)\]$)/i", '', $key));
|
||||
|
||||
if ($raw = $this->buildRaw($value, $map))
|
||||
{
|
||||
$fields[] = $column . ' = ' . $raw;
|
||||
continue;
|
||||
}
|
||||
|
||||
$map_key = $this->mapKey();
|
||||
|
||||
preg_match('/(?<column>[a-zA-Z0-9_]+)(\[(?<operator>\+|\-|\*|\/)\])?/i', $key, $match);
|
||||
|
||||
if (isset($match[ 'operator' ]))
|
||||
{
|
||||
if (is_numeric($value))
|
||||
{
|
||||
$fields[] = $column . ' = ' . $column . ' ' . $match[ 'operator' ] . ' ' . $value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$fields[] = $column . ' = ' . $map_key;
|
||||
|
||||
$type = gettype($value);
|
||||
|
||||
switch ($type)
|
||||
{
|
||||
case 'array':
|
||||
$map[ $map_key ] = [
|
||||
strpos($key, '[JSON]') === strlen($key) - 6 ?
|
||||
json_encode($value) :
|
||||
serialize($value),
|
||||
PDO::PARAM_STR
|
||||
];
|
||||
break;
|
||||
|
||||
case 'object':
|
||||
$value = serialize($value);
|
||||
|
||||
case 'NULL':
|
||||
case 'resource':
|
||||
case 'boolean':
|
||||
case 'integer':
|
||||
case 'double':
|
||||
case 'string':
|
||||
$map[ $map_key ] = $this->typeMap($value, $type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this->exec('UPDATE ' . $this->tableQuote($table) . ' SET ' . implode(', ', $fields) . $this->whereClause($where, $map), $map);
|
||||
}
|
||||
|
||||
public function delete($table, $where)
|
||||
{
|
||||
$map = [];
|
||||
|
||||
return $this->exec('DELETE FROM ' . $this->tableQuote($table) . $this->whereClause($where, $map), $map);
|
||||
}
|
||||
|
||||
public function replace($table, $columns, $where = null)
|
||||
{
|
||||
if (!is_array($columns) || empty($columns))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$map = [];
|
||||
$stack = [];
|
||||
|
||||
foreach ($columns as $column => $replacements)
|
||||
{
|
||||
if (is_array($replacements))
|
||||
{
|
||||
foreach ($replacements as $old => $new)
|
||||
{
|
||||
$map_key = $this->mapKey();
|
||||
|
||||
$stack[] = $this->columnQuote($column) . ' = REPLACE(' . $this->columnQuote($column) . ', ' . $map_key . 'a, ' . $map_key . 'b)';
|
||||
|
||||
$map[ $map_key . 'a' ] = [$old, PDO::PARAM_STR];
|
||||
$map[ $map_key . 'b' ] = [$new, PDO::PARAM_STR];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($stack))
|
||||
{
|
||||
return $this->exec('UPDATE ' . $this->tableQuote($table) . ' SET ' . implode(', ', $stack) . $this->whereClause($where, $map), $map);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function get($table, $join = null, $columns = null, $where = null)
|
||||
{
|
||||
$map = [];
|
||||
$result = [];
|
||||
$column_map = [];
|
||||
$current_stack = [];
|
||||
|
||||
if ($where === null)
|
||||
{
|
||||
$column = $join;
|
||||
unset($columns[ 'LIMIT' ]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$column = $columns;
|
||||
unset($where[ 'LIMIT' ]);
|
||||
}
|
||||
|
||||
$is_single = (is_string($column) && $column !== '*');
|
||||
|
||||
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where) . ' LIMIT 1', $map);
|
||||
|
||||
if (!$this->statement)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
if (isset($data[ 0 ]))
|
||||
{
|
||||
if ($column === '*')
|
||||
{
|
||||
return $data[ 0 ];
|
||||
}
|
||||
|
||||
$this->columnMap($columns, $column_map, true);
|
||||
|
||||
$this->dataMap($data[ 0 ], $columns, $column_map, $current_stack, true, $result);
|
||||
|
||||
if ($is_single)
|
||||
{
|
||||
return $result[ 0 ][ $column_map[ $column ][ 0 ] ];
|
||||
}
|
||||
|
||||
return $result[ 0 ];
|
||||
}
|
||||
}
|
||||
|
||||
public function has($table, $join, $where = null)
|
||||
{
|
||||
$map = [];
|
||||
$column = null;
|
||||
|
||||
if ($this->type === 'mssql')
|
||||
{
|
||||
$query = $this->exec($this->selectContext($table, $map, $join, $column, $where, Medoo::raw('TOP 1 1')), $map);
|
||||
}
|
||||
else
|
||||
{
|
||||
$query = $this->exec('SELECT EXISTS(' . $this->selectContext($table, $map, $join, $column, $where, 1) . ')', $map);
|
||||
}
|
||||
|
||||
if (!$this->statement)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$result = $query->fetchColumn();
|
||||
|
||||
return $result === '1' || $result === 1 || $result === true;
|
||||
}
|
||||
|
||||
public function rand($table, $join = null, $columns = null, $where = null)
|
||||
{
|
||||
$type = $this->type;
|
||||
|
||||
$order = 'RANDOM()';
|
||||
|
||||
if ($type === 'mysql')
|
||||
{
|
||||
$order = 'RAND()';
|
||||
}
|
||||
elseif ($type === 'mssql')
|
||||
{
|
||||
$order = 'NEWID()';
|
||||
}
|
||||
|
||||
$order_raw = $this->raw($order);
|
||||
|
||||
if ($where === null)
|
||||
{
|
||||
if ($columns === null)
|
||||
{
|
||||
$columns = [
|
||||
'ORDER' => $order_raw
|
||||
];
|
||||
}
|
||||
else
|
||||
{
|
||||
$column = $join;
|
||||
unset($columns[ 'ORDER' ]);
|
||||
|
||||
$columns[ 'ORDER' ] = $order_raw;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($where[ 'ORDER' ]);
|
||||
|
||||
$where[ 'ORDER' ] = $order_raw;
|
||||
}
|
||||
|
||||
return $this->select($table, $join, $columns, $where);
|
||||
}
|
||||
|
||||
private function aggregate($type, $table, $join = null, $column = null, $where = null)
|
||||
{
|
||||
$map = [];
|
||||
|
||||
$query = $this->exec($this->selectContext($table, $map, $join, $column, $where, strtoupper($type)), $map);
|
||||
|
||||
if (!$this->statement)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$number = $query->fetchColumn();
|
||||
|
||||
return is_numeric($number) ? $number + 0 : $number;
|
||||
}
|
||||
|
||||
public function count($table, $join = null, $column = null, $where = null)
|
||||
{
|
||||
return $this->aggregate('count', $table, $join, $column, $where);
|
||||
}
|
||||
|
||||
public function avg($table, $join, $column = null, $where = null)
|
||||
{
|
||||
return $this->aggregate('avg', $table, $join, $column, $where);
|
||||
}
|
||||
|
||||
public function max($table, $join, $column = null, $where = null)
|
||||
{
|
||||
return $this->aggregate('max', $table, $join, $column, $where);
|
||||
}
|
||||
|
||||
public function min($table, $join, $column = null, $where = null)
|
||||
{
|
||||
return $this->aggregate('min', $table, $join, $column, $where);
|
||||
}
|
||||
|
||||
public function sum($table, $join, $column = null, $where = null)
|
||||
{
|
||||
return $this->aggregate('sum', $table, $join, $column, $where);
|
||||
}
|
||||
|
||||
public function action($actions)
|
||||
{
|
||||
if (is_callable($actions))
|
||||
{
|
||||
$this->pdo->beginTransaction();
|
||||
|
||||
try {
|
||||
$result = $actions($this);
|
||||
|
||||
if ($result === false)
|
||||
{
|
||||
$this->pdo->rollBack();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->pdo->commit();
|
||||
}
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$this->pdo->rollBack();
|
||||
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function id()
|
||||
{
|
||||
if ($this->statement == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = $this->type;
|
||||
|
||||
if ($type === 'oracle')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
elseif ($type === 'pgsql')
|
||||
{
|
||||
return $this->pdo->query('SELECT LASTVAL()')->fetchColumn();
|
||||
}
|
||||
|
||||
$lastId = $this->pdo->lastInsertId();
|
||||
|
||||
if ($lastId != "0" && $lastId != "")
|
||||
{
|
||||
return $lastId;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function debug()
|
||||
{
|
||||
$this->debug_mode = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function error()
|
||||
{
|
||||
return $this->errorInfo;
|
||||
}
|
||||
|
||||
public function last()
|
||||
{
|
||||
$log = end($this->logs);
|
||||
|
||||
return $this->generate($log[ 0 ], $log[ 1 ]);
|
||||
}
|
||||
|
||||
public function log()
|
||||
{
|
||||
return array_map(function ($log)
|
||||
{
|
||||
return $this->generate($log[ 0 ], $log[ 1 ]);
|
||||
},
|
||||
$this->logs
|
||||
);
|
||||
}
|
||||
|
||||
public function info()
|
||||
{
|
||||
$output = [
|
||||
'server' => 'SERVER_INFO',
|
||||
'driver' => 'DRIVER_NAME',
|
||||
'client' => 'CLIENT_VERSION',
|
||||
'version' => 'SERVER_VERSION',
|
||||
'connection' => 'CONNECTION_STATUS'
|
||||
];
|
||||
|
||||
foreach ($output as $key => $value)
|
||||
{
|
||||
$output[ $key ] = @$this->pdo->getAttribute(constant('PDO::ATTR_' . $value));
|
||||
}
|
||||
|
||||
$output[ 'dsn' ] = $this->dsn;
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
Vendored
+445
@@ -0,0 +1,445 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
/**
|
||||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||
*
|
||||
* $loader = new \Composer\Autoload\ClassLoader();
|
||||
*
|
||||
* // register classes with namespaces
|
||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||
* $loader->add('Symfony', __DIR__.'/framework');
|
||||
*
|
||||
* // activate the autoloader
|
||||
* $loader->register();
|
||||
*
|
||||
* // to enable searching the include path (eg. for PEAR packages)
|
||||
* $loader->setUseIncludePath(true);
|
||||
*
|
||||
* In this example, if you try to use a class in the Symfony\Component
|
||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||
* the autoloader will first look for the class under the component/
|
||||
* directory, and it will then fallback to the framework/ directory if not
|
||||
* found before giving up.
|
||||
*
|
||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
* @see https://www.php-fig.org/psr/psr-0/
|
||||
* @see https://www.php-fig.org/psr/psr-4/
|
||||
*/
|
||||
class ClassLoader
|
||||
{
|
||||
// PSR-4
|
||||
private $prefixLengthsPsr4 = array();
|
||||
private $prefixDirsPsr4 = array();
|
||||
private $fallbackDirsPsr4 = array();
|
||||
|
||||
// PSR-0
|
||||
private $prefixesPsr0 = array();
|
||||
private $fallbackDirsPsr0 = array();
|
||||
|
||||
private $useIncludePath = false;
|
||||
private $classMap = array();
|
||||
private $classMapAuthoritative = false;
|
||||
private $missingClasses = array();
|
||||
private $apcuPrefix;
|
||||
|
||||
public function getPrefixes()
|
||||
{
|
||||
if (!empty($this->prefixesPsr0)) {
|
||||
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
public function getPrefixesPsr4()
|
||||
{
|
||||
return $this->prefixDirsPsr4;
|
||||
}
|
||||
|
||||
public function getFallbackDirs()
|
||||
{
|
||||
return $this->fallbackDirsPsr0;
|
||||
}
|
||||
|
||||
public function getFallbackDirsPsr4()
|
||||
{
|
||||
return $this->fallbackDirsPsr4;
|
||||
}
|
||||
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $classMap Class to filename map
|
||||
*/
|
||||
public function addClassMap(array $classMap)
|
||||
{
|
||||
if ($this->classMap) {
|
||||
$this->classMap = array_merge($this->classMap, $classMap);
|
||||
} else {
|
||||
$this->classMap = $classMap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix, either
|
||||
* appending or prepending to the ones previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param array|string $paths The PSR-0 root directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*/
|
||||
public function add($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr0
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$this->fallbackDirsPsr0,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$first = $prefix[0];
|
||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
||||
|
||||
return;
|
||||
}
|
||||
if ($prepend) {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixesPsr0[$first][$prefix]
|
||||
);
|
||||
} else {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$this->prefixesPsr0[$first][$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace, either
|
||||
* appending or prepending to the ones previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param array|string $paths The PSR-4 base directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function addPsr4($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
// Register directories for the root namespace.
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr4
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$this->fallbackDirsPsr4,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||
// Register directories for a new namespace.
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
} elseif ($prepend) {
|
||||
// Prepend directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixDirsPsr4[$prefix]
|
||||
);
|
||||
} else {
|
||||
// Append directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$this->prefixDirsPsr4[$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix,
|
||||
* replacing any others previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param array|string $paths The PSR-0 base directories
|
||||
*/
|
||||
public function set($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr0 = (array) $paths;
|
||||
} else {
|
||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace,
|
||||
* replacing any others previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param array|string $paths The PSR-4 base directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function setPsr4($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr4 = (array) $paths;
|
||||
} else {
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns on searching the include path for class files.
|
||||
*
|
||||
* @param bool $useIncludePath
|
||||
*/
|
||||
public function setUseIncludePath($useIncludePath)
|
||||
{
|
||||
$this->useIncludePath = $useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to check if the autoloader uses the include path to check
|
||||
* for classes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getUseIncludePath()
|
||||
{
|
||||
return $this->useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns off searching the prefix and fallback directories for classes
|
||||
* that have not been registered with the class map.
|
||||
*
|
||||
* @param bool $classMapAuthoritative
|
||||
*/
|
||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||
{
|
||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should class lookup fail if not found in the current class map?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isClassMapAuthoritative()
|
||||
{
|
||||
return $this->classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||
*
|
||||
* @param string|null $apcuPrefix
|
||||
*/
|
||||
public function setApcuPrefix($apcuPrefix)
|
||||
{
|
||||
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getApcuPrefix()
|
||||
{
|
||||
return $this->apcuPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this instance as an autoloader.
|
||||
*
|
||||
* @param bool $prepend Whether to prepend the autoloader or not
|
||||
*/
|
||||
public function register($prepend = false)
|
||||
{
|
||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters this instance as an autoloader.
|
||||
*/
|
||||
public function unregister()
|
||||
{
|
||||
spl_autoload_unregister(array($this, 'loadClass'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given class or interface.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
* @return bool|null True if loaded, null otherwise
|
||||
*/
|
||||
public function loadClass($class)
|
||||
{
|
||||
if ($file = $this->findFile($class)) {
|
||||
includeFile($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the path to the file where the class is defined.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
*
|
||||
* @return string|false The path if found, false otherwise
|
||||
*/
|
||||
public function findFile($class)
|
||||
{
|
||||
// class map lookup
|
||||
if (isset($this->classMap[$class])) {
|
||||
return $this->classMap[$class];
|
||||
}
|
||||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||
return false;
|
||||
}
|
||||
if (null !== $this->apcuPrefix) {
|
||||
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||
if ($hit) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
$file = $this->findFileWithExtension($class, '.php');
|
||||
|
||||
// Search for Hack files if we are running on HHVM
|
||||
if (false === $file && defined('HHVM_VERSION')) {
|
||||
$file = $this->findFileWithExtension($class, '.hh');
|
||||
}
|
||||
|
||||
if (null !== $this->apcuPrefix) {
|
||||
apcu_add($this->apcuPrefix.$class, $file);
|
||||
}
|
||||
|
||||
if (false === $file) {
|
||||
// Remember that this class does not exist.
|
||||
$this->missingClasses[$class] = true;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
private function findFileWithExtension($class, $ext)
|
||||
{
|
||||
// PSR-4 lookup
|
||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||
|
||||
$first = $class[0];
|
||||
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||
$subPath = $class;
|
||||
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||
$subPath = substr($subPath, 0, $lastPos);
|
||||
$search = $subPath . '\\';
|
||||
if (isset($this->prefixDirsPsr4[$search])) {
|
||||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||
if (file_exists($file = $dir . $pathEnd)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-4 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 lookup
|
||||
if (false !== $pos = strrpos($class, '\\')) {
|
||||
// namespaced class name
|
||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// PEAR-like class name
|
||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||
}
|
||||
|
||||
if (isset($this->prefixesPsr0[$first])) {
|
||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||
if (0 === strpos($class, $prefix)) {
|
||||
foreach ($dirs as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 include paths.
|
||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope isolated include.
|
||||
*
|
||||
* Prevents access to $this/self from included files.
|
||||
*/
|
||||
function includeFile($file)
|
||||
{
|
||||
include $file;
|
||||
}
|
||||
+833
@@ -0,0 +1,833 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
namespace Composer;
|
||||
|
||||
use Composer\Semver\VersionParser;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class InstalledVersions
|
||||
{
|
||||
private static $installed = array (
|
||||
'root' =>
|
||||
array (
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
|
||||
'name' => 'sammo-hid/sammo',
|
||||
),
|
||||
'versions' =>
|
||||
array (
|
||||
'brandonwamboldt/utilphp' =>
|
||||
array (
|
||||
'pretty_version' => '1.1.0',
|
||||
'version' => '1.1.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '36c32efc4f0679c05163464a550f45c8d83fe683',
|
||||
),
|
||||
'catfan/medoo' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.7.10',
|
||||
'version' => '1.7.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f',
|
||||
),
|
||||
'composer/semver' =>
|
||||
array (
|
||||
'pretty_version' => '3.2.6',
|
||||
'version' => '3.2.6.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '83e511e247de329283478496f7a1e114c9517506',
|
||||
),
|
||||
'composer/xdebug-handler' =>
|
||||
array (
|
||||
'pretty_version' => '2.0.2',
|
||||
'version' => '2.0.2.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '84674dd3a7575ba617f5a76d7e9e29a7d3891339',
|
||||
),
|
||||
'doctrine/inflector' =>
|
||||
array (
|
||||
'pretty_version' => '2.0.4',
|
||||
'version' => '2.0.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89',
|
||||
),
|
||||
'erusev/parsedown' =>
|
||||
array (
|
||||
'pretty_version' => '1.7.4',
|
||||
'version' => '1.7.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'cb17b6477dfff935958ba01325f2e8a2bfa6dab3',
|
||||
),
|
||||
'erusev/parsedown-extra' =>
|
||||
array (
|
||||
'pretty_version' => '0.8.1',
|
||||
'version' => '0.8.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '91ac3ff98f0cea243bdccc688df43810f044dcef',
|
||||
),
|
||||
'ezyang/htmlpurifier' =>
|
||||
array (
|
||||
'pretty_version' => 'v4.13.0',
|
||||
'version' => '4.13.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75',
|
||||
),
|
||||
'felixfbecker/advanced-json-rpc' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.2.1',
|
||||
'version' => '3.2.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447',
|
||||
),
|
||||
'firephp/firephp-core' =>
|
||||
array (
|
||||
'pretty_version' => 'v0.4.0',
|
||||
'version' => '0.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf',
|
||||
),
|
||||
'guzzlehttp/guzzle' =>
|
||||
array (
|
||||
'pretty_version' => '6.5.5',
|
||||
'version' => '6.5.5.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e',
|
||||
),
|
||||
'guzzlehttp/promises' =>
|
||||
array (
|
||||
'pretty_version' => '1.5.1',
|
||||
'version' => '1.5.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
|
||||
),
|
||||
'guzzlehttp/psr7' =>
|
||||
array (
|
||||
'pretty_version' => '1.8.3',
|
||||
'version' => '1.8.3.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '1afdd860a2566ed3c2b0b4a3de6e23434a79ec85',
|
||||
),
|
||||
'illuminate/bus' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'be400399687b97d5558a224e970060fd5d5f2735',
|
||||
),
|
||||
'illuminate/collections' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '05f286ec5fd2dd286e8384577047efc375c8954c',
|
||||
),
|
||||
'illuminate/container' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d',
|
||||
),
|
||||
'illuminate/contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'e76f4bce73a2a1656add24bd5210ebc4b8af49c0',
|
||||
),
|
||||
'illuminate/database' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '43c7ffb6299ae55b000b286cf1278afd268ef29f',
|
||||
),
|
||||
'illuminate/events' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'b7f06cafb6c09581617f2ca05d69e9b159e5a35d',
|
||||
),
|
||||
'illuminate/macroable' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '300aa13c086f25116b5f3cde3ca54ff5c822fb05',
|
||||
),
|
||||
'illuminate/pipeline' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '23aeff5b26ae4aee3f370835c76bd0f4e93f71d2',
|
||||
),
|
||||
'illuminate/support' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'a8851b7001530d3c11626a81449ed9b63dd10db7',
|
||||
),
|
||||
'league/plates' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.4.0',
|
||||
'version' => '3.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6d3ee31199b536a4e003b34a356ca20f6f75496a',
|
||||
),
|
||||
'microsoft/tolerant-php-parser' =>
|
||||
array (
|
||||
'pretty_version' => 'v0.1.1',
|
||||
'version' => '0.1.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6a965617cf484355048ac6d2d3de7b6ec93abb16',
|
||||
),
|
||||
'monolog/monolog' =>
|
||||
array (
|
||||
'pretty_version' => '1.26.1',
|
||||
'version' => '1.26.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'c6b00f05152ae2c9b04a448f99c7590beb6042f5',
|
||||
),
|
||||
'nesbot/carbon' =>
|
||||
array (
|
||||
'pretty_version' => '2.54.0',
|
||||
'version' => '2.54.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'eed83939f1aed3eee517d03a33f5ec587ac529b5',
|
||||
),
|
||||
'netresearch/jsonmapper' =>
|
||||
array (
|
||||
'pretty_version' => 'v4.0.0',
|
||||
'version' => '4.0.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d',
|
||||
),
|
||||
'nette/caching' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.1.1',
|
||||
'version' => '3.1.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '3e771c589dee414724be473c24ad16dae50c1960',
|
||||
),
|
||||
'nette/finder' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.5.2',
|
||||
'version' => '2.5.2.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '4ad2c298eb8c687dd0e74ae84206a4186eeaed50',
|
||||
),
|
||||
'nette/utils' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.2.5',
|
||||
'version' => '3.2.5.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9cd80396ca58d7969ab44fc7afcf03624dfa526e',
|
||||
),
|
||||
'pguardiario/phpuri' =>
|
||||
array (
|
||||
'pretty_version' => '1.0',
|
||||
'version' => '1.0.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'ad0a5ec033fe616cfef55578b9c7f2458be8fbfc',
|
||||
),
|
||||
'phan/phan' =>
|
||||
array (
|
||||
'pretty_version' => '5.2.1',
|
||||
'version' => '5.2.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd724bbb8fc3ba89179868bb5220ecdf6a9c1636b',
|
||||
),
|
||||
'php-extended/php-system' =>
|
||||
array (
|
||||
'pretty_version' => '1.4.0',
|
||||
'version' => '1.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9e6b3c2009ef56dc123efc43900e40cdf217ace0',
|
||||
),
|
||||
'php-extended/php-tail' =>
|
||||
array (
|
||||
'pretty_version' => '2.2.0',
|
||||
'version' => '2.2.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '19fbd3a79ccc071954f28296b2c44754335304a0',
|
||||
),
|
||||
'phpdocumentor/reflection-common' =>
|
||||
array (
|
||||
'pretty_version' => '2.2.0',
|
||||
'version' => '2.2.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
|
||||
),
|
||||
'phpdocumentor/reflection-docblock' =>
|
||||
array (
|
||||
'pretty_version' => '5.3.0',
|
||||
'version' => '5.3.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
|
||||
),
|
||||
'phpdocumentor/type-resolver' =>
|
||||
array (
|
||||
'pretty_version' => '1.5.1',
|
||||
'version' => '1.5.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'a12f7e301eb7258bb68acd89d4aefa05c2906cae',
|
||||
),
|
||||
'psr/container' =>
|
||||
array (
|
||||
'pretty_version' => '1.1.2',
|
||||
'version' => '1.1.2.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
|
||||
),
|
||||
'psr/container-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/http-message' =>
|
||||
array (
|
||||
'pretty_version' => '1.0.1',
|
||||
'version' => '1.0.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
|
||||
),
|
||||
'psr/http-message-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/log' =>
|
||||
array (
|
||||
'pretty_version' => '1.1.4',
|
||||
'version' => '1.1.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
|
||||
),
|
||||
'psr/log-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '1.0.0',
|
||||
1 => '1.0|2.0',
|
||||
),
|
||||
),
|
||||
'psr/simple-cache' =>
|
||||
array (
|
||||
'pretty_version' => '1.0.1',
|
||||
'version' => '1.0.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
|
||||
),
|
||||
'ralouphie/getallheaders' =>
|
||||
array (
|
||||
'pretty_version' => '3.0.3',
|
||||
'version' => '3.0.3.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
|
||||
),
|
||||
'sabre/event' =>
|
||||
array (
|
||||
'pretty_version' => '5.1.4',
|
||||
'version' => '5.1.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd7da22897125d34d7eddf7977758191c06a74497',
|
||||
),
|
||||
'sammo-hid/sammo' =>
|
||||
array (
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
|
||||
),
|
||||
'sergeytsalkov/meekrodb' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'e30c240d54bc81f58c58507a9ed768032eb494a5',
|
||||
),
|
||||
'spatie/data-transfer-object' =>
|
||||
array (
|
||||
'pretty_version' => '3.7.3',
|
||||
'version' => '3.7.3.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '341f72c77e0fce40ea2e0dcb212cb54dc27bbe72',
|
||||
),
|
||||
'symfony/console' =>
|
||||
array (
|
||||
'pretty_version' => 'v5.3.10',
|
||||
'version' => '5.3.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3',
|
||||
),
|
||||
'symfony/deprecation-contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4.0',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627',
|
||||
),
|
||||
'symfony/lock' =>
|
||||
array (
|
||||
'pretty_version' => 'v4.4.33',
|
||||
'version' => '4.4.33.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '567d29b1bc6e3937652054dafc069151d17824a9',
|
||||
),
|
||||
'symfony/polyfill-ctype' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '46cd95797e9df938fdd2b03693b5fca5e64b01ce',
|
||||
),
|
||||
'symfony/polyfill-intl-grapheme' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.1',
|
||||
'version' => '1.23.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535',
|
||||
),
|
||||
'symfony/polyfill-intl-idn' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '65bd267525e82759e7d8c4e8ceea44f398838e65',
|
||||
),
|
||||
'symfony/polyfill-intl-normalizer' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
|
||||
),
|
||||
'symfony/polyfill-mbstring' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.1',
|
||||
'version' => '1.23.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6',
|
||||
),
|
||||
'symfony/polyfill-php72' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976',
|
||||
),
|
||||
'symfony/polyfill-php73' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'fba8933c384d6476ab14fb7b8526e5287ca7e010',
|
||||
),
|
||||
'symfony/polyfill-php80' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.1',
|
||||
'version' => '1.23.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be',
|
||||
),
|
||||
'symfony/service-contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4.0',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb',
|
||||
),
|
||||
'symfony/string' =>
|
||||
array (
|
||||
'pretty_version' => 'v5.3.10',
|
||||
'version' => '5.3.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd70c35bb20bbca71fc4ab7921e3c6bda1a82a60c',
|
||||
),
|
||||
'symfony/translation' =>
|
||||
array (
|
||||
'pretty_version' => 'v5.3.10',
|
||||
'version' => '5.3.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6ef197aea2ac8b9cd63e0da7522b3771714035aa',
|
||||
),
|
||||
'symfony/translation-contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4.0',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '95c812666f3e91db75385749fe219c5e494c7f95',
|
||||
),
|
||||
'symfony/translation-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '2.3',
|
||||
),
|
||||
),
|
||||
'tysonandre/var_representation_polyfill' =>
|
||||
array (
|
||||
'pretty_version' => '0.1.1',
|
||||
'version' => '0.1.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '0a942e74e18af5514749895507bc6ca7ab96399a',
|
||||
),
|
||||
'vlucas/valitron' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.4.10',
|
||||
'version' => '1.4.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '5ebd5d7af82cc0a9d798e816a2ecad63f1b59ceb',
|
||||
),
|
||||
'voku/portable-ascii' =>
|
||||
array (
|
||||
'pretty_version' => '1.5.6',
|
||||
'version' => '1.5.6.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '80953678b19901e5165c56752d087fc11526017c',
|
||||
),
|
||||
'webmozart/assert' =>
|
||||
array (
|
||||
'pretty_version' => '1.10.0',
|
||||
'version' => '1.10.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
|
||||
),
|
||||
'xemlock/htmlpurifier-html5' =>
|
||||
array (
|
||||
'pretty_version' => 'v0.1.11',
|
||||
'version' => '0.1.11.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'f0d563f9fd4a82a3d759043483f9a94c0d8c2255',
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getInstalledPackages()
|
||||
{
|
||||
return array_keys(self::$installed['versions']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function isInstalled($packageName)
|
||||
{
|
||||
return isset(self::$installed['versions'][$packageName]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||
{
|
||||
$constraint = $parser->parseConstraints($constraint);
|
||||
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||
|
||||
return $provided->matches($constraint);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getVersionRanges($packageName)
|
||||
{
|
||||
if (!isset(self::$installed['versions'][$packageName])) {
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
$ranges = array();
|
||||
if (isset(self::$installed['versions'][$packageName]['pretty_version'])) {
|
||||
$ranges[] = self::$installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
if (array_key_exists('aliases', self::$installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']);
|
||||
}
|
||||
if (array_key_exists('replaced', self::$installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']);
|
||||
}
|
||||
if (array_key_exists('provided', self::$installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']);
|
||||
}
|
||||
|
||||
return implode(' || ', $ranges);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getVersion($packageName)
|
||||
{
|
||||
if (!isset(self::$installed['versions'][$packageName])) {
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
if (!isset(self::$installed['versions'][$packageName]['version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return self::$installed['versions'][$packageName]['version'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getPrettyVersion($packageName)
|
||||
{
|
||||
if (!isset(self::$installed['versions'][$packageName])) {
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return self::$installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getReference($packageName)
|
||||
{
|
||||
if (!isset(self::$installed['versions'][$packageName])) {
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
if (!isset(self::$installed['versions'][$packageName]['reference'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return self::$installed['versions'][$packageName]['reference'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getRootPackage()
|
||||
{
|
||||
return self::$installed['root'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function getRawData()
|
||||
{
|
||||
return self::$installed;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function reload($data)
|
||||
{
|
||||
self::$installed = $data;
|
||||
}
|
||||
}
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
|
||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||
|
||||
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.
|
||||
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||
'DB' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DBTransaction' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'FB' => $vendorDir . '/firephp/firephp-core/lib/FirePHPCore/fb.php',
|
||||
'FirePHP' => $vendorDir . '/firephp/firephp-core/lib/FirePHPCore/FirePHP.class.php',
|
||||
'HTMLPurifier_AttrDef_Float' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/Float.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_ARel' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/ARel.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_Datetime' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Datetime.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_Duration' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Duration.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_Week' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Week.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_YearlessDate' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/YearlessDate.php',
|
||||
'HTMLPurifier_AttrDef_HTML_Bool2' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML/Bool2.php',
|
||||
'HTMLPurifier_AttrTransform_HTML5_Dialog' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Dialog.php',
|
||||
'HTMLPurifier_AttrTransform_HTML5_Progress' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Progress.php',
|
||||
'HTMLPurifier_AttrTransform_HTML5_Script' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Script.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Abstract' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Abstract.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Details' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Details.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Fieldset' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Fieldset.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Figure' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Figure.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Media' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Media.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Picture' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Picture.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Script' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Script.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Time' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Time.php',
|
||||
'HTMLPurifier_HTML5Config' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Config.php',
|
||||
'HTMLPurifier_HTML5Definition' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Definition.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Bdo' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Bdo.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Edit' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Edit.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Forms' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Forms.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Hypertext' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Hypertext.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Iframe' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Iframe.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Interactive' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Interactive.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_List' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/List.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Media' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Media.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Ruby' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Ruby.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_SafeScripting' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/SafeScripting.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Scripting' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Scripting.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Text' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Text.php',
|
||||
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
|
||||
'MeekroDB' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBEval' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBException' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBWalk' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\Bridges\\CacheDI\\CacheExtension' => $vendorDir . '/nette/caching/src/Bridges/CacheDI/CacheExtension.php',
|
||||
'Nette\\Bridges\\CacheLatte\\CacheMacro' => $vendorDir . '/nette/caching/src/Bridges/CacheLatte/CacheMacro.php',
|
||||
'Nette\\Caching\\BulkReader' => $vendorDir . '/nette/caching/src/Caching/BulkReader.php',
|
||||
'Nette\\Caching\\Cache' => $vendorDir . '/nette/caching/src/Caching/Cache.php',
|
||||
'Nette\\Caching\\IBulkReader' => $vendorDir . '/nette/caching/src/compatibility.php',
|
||||
'Nette\\Caching\\IStorage' => $vendorDir . '/nette/caching/src/compatibility.php',
|
||||
'Nette\\Caching\\OutputHelper' => $vendorDir . '/nette/caching/src/Caching/OutputHelper.php',
|
||||
'Nette\\Caching\\Storage' => $vendorDir . '/nette/caching/src/Caching/Storage.php',
|
||||
'Nette\\Caching\\Storages\\DevNullStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/DevNullStorage.php',
|
||||
'Nette\\Caching\\Storages\\FileStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/FileStorage.php',
|
||||
'Nette\\Caching\\Storages\\IJournal' => $vendorDir . '/nette/caching/src/compatibility.php',
|
||||
'Nette\\Caching\\Storages\\Journal' => $vendorDir . '/nette/caching/src/Caching/Storages/Journal.php',
|
||||
'Nette\\Caching\\Storages\\MemcachedStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/MemcachedStorage.php',
|
||||
'Nette\\Caching\\Storages\\MemoryStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/MemoryStorage.php',
|
||||
'Nette\\Caching\\Storages\\NewMemcachedStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/NewMemcachedStorage.php',
|
||||
'Nette\\Caching\\Storages\\SQLiteJournal' => $vendorDir . '/nette/caching/src/Caching/Storages/SQLiteJournal.php',
|
||||
'Nette\\Caching\\Storages\\SQLiteStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/SQLiteStorage.php',
|
||||
'Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php',
|
||||
'Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php',
|
||||
'Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php',
|
||||
'Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php',
|
||||
'Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php',
|
||||
'Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php',
|
||||
'Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php',
|
||||
'Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php',
|
||||
'Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php',
|
||||
'Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php',
|
||||
'Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php',
|
||||
'Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php',
|
||||
'Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php',
|
||||
'Nette\\Utils\\Finder' => $vendorDir . '/nette/finder/src/Utils/Finder.php',
|
||||
'Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php',
|
||||
'Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php',
|
||||
'Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php',
|
||||
'Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php',
|
||||
'Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php',
|
||||
'Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php',
|
||||
'Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php',
|
||||
'Nette\\Utils\\ObjectMixin' => $vendorDir . '/nette/utils/src/Utils/ObjectMixin.php',
|
||||
'Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php',
|
||||
'Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php',
|
||||
'Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php',
|
||||
'Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php',
|
||||
'Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php',
|
||||
'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php',
|
||||
'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
|
||||
'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
|
||||
'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
|
||||
'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
|
||||
'WhereClause' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'kakao\\KakaoKey' => $baseDir . '/d_setting/KakaoKey.php',
|
||||
'sammo\\RootDB' => $baseDir . '/d_setting/RootDB.php',
|
||||
'sammo\\ServConfig' => $baseDir . '/d_setting/ServConfig.php',
|
||||
);
|
||||
Vendored
+34
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
// autoload_files.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
||||
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
|
||||
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
|
||||
'8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
|
||||
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
|
||||
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
|
||||
'60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php',
|
||||
'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php',
|
||||
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',
|
||||
'2b9d0f43f9552984cfa82fee95491826' => $vendorDir . '/sabre/event/lib/coroutine.php',
|
||||
'd81bab31d3feb45bfe2f283ea3c8fdf7' => $vendorDir . '/sabre/event/lib/Loop/functions.php',
|
||||
'a1cce3d26cc15c00fcd0b3354bd72c88' => $vendorDir . '/sabre/event/lib/Promise/functions.php',
|
||||
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
|
||||
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
||||
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
|
||||
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
|
||||
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
|
||||
'6714be961f4a45ae8b9a99d5d55c5d07' => $vendorDir . '/tysonandre/var_representation_polyfill/src/var_representation.php',
|
||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||
'ef65a1626449d89d0811cf9befce46f0' => $vendorDir . '/illuminate/events/functions.php',
|
||||
'5b154887902198b16314243c6e0e3e19' => $vendorDir . '/pguardiario/phpuri/phpuri.php',
|
||||
'870dc64919afa8b0f700701bb2c6a783' => $baseDir . '/f_config/config.php',
|
||||
);
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'utilphp\\' => array($vendorDir . '/brandonwamboldt/utilphp/src'),
|
||||
'ParsedownExtra' => array($vendorDir . '/erusev/parsedown-extra'),
|
||||
'Parsedown' => array($vendorDir . '/erusev/parsedown'),
|
||||
'JsonMapper' => array($vendorDir . '/netresearch/jsonmapper/src'),
|
||||
'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
|
||||
);
|
||||
Vendored
+58
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
// autoload_psr4.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'),
|
||||
'sammo\\' => array($baseDir . '/src/sammo'),
|
||||
'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
|
||||
'kakao\\' => array($baseDir . '/src/kakao'),
|
||||
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
|
||||
'VarRepresentation\\' => array($vendorDir . '/tysonandre/var_representation_polyfill/src/VarRepresentation'),
|
||||
'Valitron\\' => array($vendorDir . '/vlucas/valitron/src/Valitron'),
|
||||
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
|
||||
'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
|
||||
'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
|
||||
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
|
||||
'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
|
||||
'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
|
||||
'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),
|
||||
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
|
||||
'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'),
|
||||
'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
|
||||
'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
|
||||
'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
|
||||
'Symfony\\Component\\Lock\\' => array($vendorDir . '/symfony/lock'),
|
||||
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
|
||||
'Spatie\\DataTransferObject\\' => array($vendorDir . '/spatie/data-transfer-object/src'),
|
||||
'Sabre\\Event\\' => array($vendorDir . '/sabre/event/lib'),
|
||||
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
|
||||
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
|
||||
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
|
||||
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
||||
'PhpExtended\\Tail\\' => array($vendorDir . '/php-extended/php-tail/src'),
|
||||
'PhpExtended\\System\\' => array($vendorDir . '/php-extended/php-system/src'),
|
||||
'Phan\\' => array($vendorDir . '/phan/phan/src/Phan'),
|
||||
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
|
||||
'Microsoft\\PhpParser\\' => array($vendorDir . '/microsoft/tolerant-php-parser/src'),
|
||||
'Medoo\\' => array($vendorDir . '/catfan/medoo/src'),
|
||||
'League\\Plates\\' => array($vendorDir . '/league/plates/src'),
|
||||
'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/support'),
|
||||
'Illuminate\\Pipeline\\' => array($vendorDir . '/illuminate/pipeline'),
|
||||
'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'),
|
||||
'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'),
|
||||
'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'),
|
||||
'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'),
|
||||
'Illuminate\\Bus\\' => array($vendorDir . '/illuminate/bus'),
|
||||
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
|
||||
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
|
||||
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
|
||||
'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'),
|
||||
'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'),
|
||||
'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'),
|
||||
'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
|
||||
'AdvancedJsonRpc\\' => array($vendorDir . '/felixfbecker/advanced-json-rpc/lib'),
|
||||
);
|
||||
Vendored
+75
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
public static function loadClassLoader($class)
|
||||
{
|
||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||
require __DIR__ . '/ClassLoader.php';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Composer\Autoload\ClassLoader
|
||||
*/
|
||||
public static function getLoader()
|
||||
{
|
||||
if (null !== self::$loader) {
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
require __DIR__ . '/platform_check.php';
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a', 'loadClassLoader'));
|
||||
|
||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
||||
if ($useStaticLoader) {
|
||||
require __DIR__ . '/autoload_static.php';
|
||||
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::getInitializer($loader));
|
||||
} else {
|
||||
$map = require __DIR__ . '/autoload_namespaces.php';
|
||||
foreach ($map as $namespace => $path) {
|
||||
$loader->set($namespace, $path);
|
||||
}
|
||||
|
||||
$map = require __DIR__ . '/autoload_psr4.php';
|
||||
foreach ($map as $namespace => $path) {
|
||||
$loader->setPsr4($namespace, $path);
|
||||
}
|
||||
|
||||
$classMap = require __DIR__ . '/autoload_classmap.php';
|
||||
if ($classMap) {
|
||||
$loader->addClassMap($classMap);
|
||||
}
|
||||
}
|
||||
|
||||
$loader->register(true);
|
||||
|
||||
if ($useStaticLoader) {
|
||||
$includeFiles = Composer\Autoload\ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$files;
|
||||
} else {
|
||||
$includeFiles = require __DIR__ . '/autoload_files.php';
|
||||
}
|
||||
foreach ($includeFiles as $fileIdentifier => $file) {
|
||||
composerRequire67b09c83b85c3bc0027caefe5bba171a($fileIdentifier, $file);
|
||||
}
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
|
||||
function composerRequire67b09c83b85c3bc0027caefe5bba171a($fileIdentifier, $file)
|
||||
{
|
||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||
require $file;
|
||||
|
||||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||
}
|
||||
}
|
||||
Vendored
+498
@@ -0,0 +1,498 @@
|
||||
<?php
|
||||
|
||||
// autoload_static.php @generated by Composer
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
|
||||
{
|
||||
public static $files = array (
|
||||
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
|
||||
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
|
||||
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
|
||||
'8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
|
||||
'0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
|
||||
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
|
||||
'60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php',
|
||||
'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php',
|
||||
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
|
||||
'2b9d0f43f9552984cfa82fee95491826' => __DIR__ . '/..' . '/sabre/event/lib/coroutine.php',
|
||||
'd81bab31d3feb45bfe2f283ea3c8fdf7' => __DIR__ . '/..' . '/sabre/event/lib/Loop/functions.php',
|
||||
'a1cce3d26cc15c00fcd0b3354bd72c88' => __DIR__ . '/..' . '/sabre/event/lib/Promise/functions.php',
|
||||
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
||||
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
|
||||
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
|
||||
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
|
||||
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
|
||||
'6714be961f4a45ae8b9a99d5d55c5d07' => __DIR__ . '/..' . '/tysonandre/var_representation_polyfill/src/var_representation.php',
|
||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||
'ef65a1626449d89d0811cf9befce46f0' => __DIR__ . '/..' . '/illuminate/events/functions.php',
|
||||
'5b154887902198b16314243c6e0e3e19' => __DIR__ . '/..' . '/pguardiario/phpuri/phpuri.php',
|
||||
'870dc64919afa8b0f700701bb2c6a783' => __DIR__ . '/../..' . '/f_config/config.php',
|
||||
);
|
||||
|
||||
public static $prefixLengthsPsr4 = array (
|
||||
'v' =>
|
||||
array (
|
||||
'voku\\' => 5,
|
||||
),
|
||||
's' =>
|
||||
array (
|
||||
'sammo\\' => 6,
|
||||
),
|
||||
'p' =>
|
||||
array (
|
||||
'phpDocumentor\\Reflection\\' => 25,
|
||||
),
|
||||
'k' =>
|
||||
array (
|
||||
'kakao\\' => 6,
|
||||
),
|
||||
'W' =>
|
||||
array (
|
||||
'Webmozart\\Assert\\' => 17,
|
||||
),
|
||||
'V' =>
|
||||
array (
|
||||
'VarRepresentation\\' => 18,
|
||||
'Valitron\\' => 9,
|
||||
),
|
||||
'S' =>
|
||||
array (
|
||||
'Symfony\\Polyfill\\Php80\\' => 23,
|
||||
'Symfony\\Polyfill\\Php73\\' => 23,
|
||||
'Symfony\\Polyfill\\Php72\\' => 23,
|
||||
'Symfony\\Polyfill\\Mbstring\\' => 26,
|
||||
'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
|
||||
'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
|
||||
'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31,
|
||||
'Symfony\\Polyfill\\Ctype\\' => 23,
|
||||
'Symfony\\Contracts\\Translation\\' => 30,
|
||||
'Symfony\\Contracts\\Service\\' => 26,
|
||||
'Symfony\\Component\\Translation\\' => 30,
|
||||
'Symfony\\Component\\String\\' => 25,
|
||||
'Symfony\\Component\\Lock\\' => 23,
|
||||
'Symfony\\Component\\Console\\' => 26,
|
||||
'Spatie\\DataTransferObject\\' => 26,
|
||||
'Sabre\\Event\\' => 12,
|
||||
),
|
||||
'P' =>
|
||||
array (
|
||||
'Psr\\SimpleCache\\' => 16,
|
||||
'Psr\\Log\\' => 8,
|
||||
'Psr\\Http\\Message\\' => 17,
|
||||
'Psr\\Container\\' => 14,
|
||||
'PhpExtended\\Tail\\' => 17,
|
||||
'PhpExtended\\System\\' => 19,
|
||||
'Phan\\' => 5,
|
||||
),
|
||||
'M' =>
|
||||
array (
|
||||
'Monolog\\' => 8,
|
||||
'Microsoft\\PhpParser\\' => 20,
|
||||
'Medoo\\' => 6,
|
||||
),
|
||||
'L' =>
|
||||
array (
|
||||
'League\\Plates\\' => 14,
|
||||
),
|
||||
'I' =>
|
||||
array (
|
||||
'Illuminate\\Support\\' => 19,
|
||||
'Illuminate\\Pipeline\\' => 20,
|
||||
'Illuminate\\Events\\' => 18,
|
||||
'Illuminate\\Database\\' => 20,
|
||||
'Illuminate\\Contracts\\' => 21,
|
||||
'Illuminate\\Container\\' => 21,
|
||||
'Illuminate\\Bus\\' => 15,
|
||||
),
|
||||
'G' =>
|
||||
array (
|
||||
'GuzzleHttp\\Psr7\\' => 16,
|
||||
'GuzzleHttp\\Promise\\' => 19,
|
||||
'GuzzleHttp\\' => 11,
|
||||
),
|
||||
'D' =>
|
||||
array (
|
||||
'Doctrine\\Inflector\\' => 19,
|
||||
),
|
||||
'C' =>
|
||||
array (
|
||||
'Composer\\XdebugHandler\\' => 23,
|
||||
'Composer\\Semver\\' => 16,
|
||||
'Carbon\\' => 7,
|
||||
),
|
||||
'A' =>
|
||||
array (
|
||||
'AdvancedJsonRpc\\' => 16,
|
||||
),
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'voku\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku',
|
||||
),
|
||||
'sammo\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/../..' . '/src/sammo',
|
||||
),
|
||||
'phpDocumentor\\Reflection\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
|
||||
1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
|
||||
2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
|
||||
),
|
||||
'kakao\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/../..' . '/src/kakao',
|
||||
),
|
||||
'Webmozart\\Assert\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/webmozart/assert/src',
|
||||
),
|
||||
'VarRepresentation\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/tysonandre/var_representation_polyfill/src/VarRepresentation',
|
||||
),
|
||||
'Valitron\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/vlucas/valitron/src/Valitron',
|
||||
),
|
||||
'Symfony\\Polyfill\\Php80\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
|
||||
),
|
||||
'Symfony\\Polyfill\\Php73\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-php73',
|
||||
),
|
||||
'Symfony\\Polyfill\\Php72\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
|
||||
),
|
||||
'Symfony\\Polyfill\\Mbstring\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
|
||||
),
|
||||
'Symfony\\Polyfill\\Intl\\Normalizer\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer',
|
||||
),
|
||||
'Symfony\\Polyfill\\Intl\\Idn\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn',
|
||||
),
|
||||
'Symfony\\Polyfill\\Intl\\Grapheme\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',
|
||||
),
|
||||
'Symfony\\Polyfill\\Ctype\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
|
||||
),
|
||||
'Symfony\\Contracts\\Translation\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/translation-contracts',
|
||||
),
|
||||
'Symfony\\Contracts\\Service\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/service-contracts',
|
||||
),
|
||||
'Symfony\\Component\\Translation\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/translation',
|
||||
),
|
||||
'Symfony\\Component\\String\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/string',
|
||||
),
|
||||
'Symfony\\Component\\Lock\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/lock',
|
||||
),
|
||||
'Symfony\\Component\\Console\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/console',
|
||||
),
|
||||
'Spatie\\DataTransferObject\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/spatie/data-transfer-object/src',
|
||||
),
|
||||
'Sabre\\Event\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/sabre/event/lib',
|
||||
),
|
||||
'Psr\\SimpleCache\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/psr/simple-cache/src',
|
||||
),
|
||||
'Psr\\Log\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
|
||||
),
|
||||
'Psr\\Http\\Message\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/psr/http-message/src',
|
||||
),
|
||||
'Psr\\Container\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/psr/container/src',
|
||||
),
|
||||
'PhpExtended\\Tail\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/php-extended/php-tail/src',
|
||||
),
|
||||
'PhpExtended\\System\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/php-extended/php-system/src',
|
||||
),
|
||||
'Phan\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/phan/phan/src/Phan',
|
||||
),
|
||||
'Monolog\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
|
||||
),
|
||||
'Microsoft\\PhpParser\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/microsoft/tolerant-php-parser/src',
|
||||
),
|
||||
'Medoo\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/catfan/medoo/src',
|
||||
),
|
||||
'League\\Plates\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/league/plates/src',
|
||||
),
|
||||
'Illuminate\\Support\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/collections',
|
||||
1 => __DIR__ . '/..' . '/illuminate/macroable',
|
||||
2 => __DIR__ . '/..' . '/illuminate/support',
|
||||
),
|
||||
'Illuminate\\Pipeline\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/pipeline',
|
||||
),
|
||||
'Illuminate\\Events\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/events',
|
||||
),
|
||||
'Illuminate\\Database\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/database',
|
||||
),
|
||||
'Illuminate\\Contracts\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/contracts',
|
||||
),
|
||||
'Illuminate\\Container\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/container',
|
||||
),
|
||||
'Illuminate\\Bus\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/illuminate/bus',
|
||||
),
|
||||
'GuzzleHttp\\Psr7\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
|
||||
),
|
||||
'GuzzleHttp\\Promise\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
|
||||
),
|
||||
'GuzzleHttp\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
|
||||
),
|
||||
'Doctrine\\Inflector\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector',
|
||||
),
|
||||
'Composer\\XdebugHandler\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/composer/xdebug-handler/src',
|
||||
),
|
||||
'Composer\\Semver\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/composer/semver/src',
|
||||
),
|
||||
'Carbon\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon',
|
||||
),
|
||||
'AdvancedJsonRpc\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib',
|
||||
),
|
||||
);
|
||||
|
||||
public static $prefixesPsr0 = array (
|
||||
'u' =>
|
||||
array (
|
||||
'utilphp\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/brandonwamboldt/utilphp/src',
|
||||
),
|
||||
),
|
||||
'P' =>
|
||||
array (
|
||||
'ParsedownExtra' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/erusev/parsedown-extra',
|
||||
),
|
||||
'Parsedown' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/erusev/parsedown',
|
||||
),
|
||||
),
|
||||
'J' =>
|
||||
array (
|
||||
'JsonMapper' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/netresearch/jsonmapper/src',
|
||||
),
|
||||
),
|
||||
'H' =>
|
||||
array (
|
||||
'HTMLPurifier' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library',
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||
'DB' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DBTransaction' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'FB' => __DIR__ . '/..' . '/firephp/firephp-core/lib/FirePHPCore/fb.php',
|
||||
'FirePHP' => __DIR__ . '/..' . '/firephp/firephp-core/lib/FirePHPCore/FirePHP.class.php',
|
||||
'HTMLPurifier_AttrDef_Float' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/Float.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_ARel' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/ARel.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_Datetime' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Datetime.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_Duration' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Duration.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_Week' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Week.php',
|
||||
'HTMLPurifier_AttrDef_HTML5_YearlessDate' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/YearlessDate.php',
|
||||
'HTMLPurifier_AttrDef_HTML_Bool2' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML/Bool2.php',
|
||||
'HTMLPurifier_AttrTransform_HTML5_Dialog' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Dialog.php',
|
||||
'HTMLPurifier_AttrTransform_HTML5_Progress' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Progress.php',
|
||||
'HTMLPurifier_AttrTransform_HTML5_Script' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Script.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Abstract' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Abstract.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Details' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Details.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Fieldset' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Fieldset.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Figure' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Figure.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Media' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Media.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Picture' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Picture.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Script' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Script.php',
|
||||
'HTMLPurifier_ChildDef_HTML5_Time' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Time.php',
|
||||
'HTMLPurifier_HTML5Config' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Config.php',
|
||||
'HTMLPurifier_HTML5Definition' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Definition.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Bdo' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Bdo.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Edit' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Edit.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Forms' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Forms.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Hypertext' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Hypertext.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Iframe' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Iframe.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Interactive' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Interactive.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_List' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/List.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Media' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Media.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Ruby' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Ruby.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_SafeScripting' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/SafeScripting.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Scripting' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Scripting.php',
|
||||
'HTMLPurifier_HTMLModule_HTML5_Text' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Text.php',
|
||||
'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
|
||||
'MeekroDB' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBEval' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBException' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBWalk' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\Bridges\\CacheDI\\CacheExtension' => __DIR__ . '/..' . '/nette/caching/src/Bridges/CacheDI/CacheExtension.php',
|
||||
'Nette\\Bridges\\CacheLatte\\CacheMacro' => __DIR__ . '/..' . '/nette/caching/src/Bridges/CacheLatte/CacheMacro.php',
|
||||
'Nette\\Caching\\BulkReader' => __DIR__ . '/..' . '/nette/caching/src/Caching/BulkReader.php',
|
||||
'Nette\\Caching\\Cache' => __DIR__ . '/..' . '/nette/caching/src/Caching/Cache.php',
|
||||
'Nette\\Caching\\IBulkReader' => __DIR__ . '/..' . '/nette/caching/src/compatibility.php',
|
||||
'Nette\\Caching\\IStorage' => __DIR__ . '/..' . '/nette/caching/src/compatibility.php',
|
||||
'Nette\\Caching\\OutputHelper' => __DIR__ . '/..' . '/nette/caching/src/Caching/OutputHelper.php',
|
||||
'Nette\\Caching\\Storage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storage.php',
|
||||
'Nette\\Caching\\Storages\\DevNullStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/DevNullStorage.php',
|
||||
'Nette\\Caching\\Storages\\FileStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/FileStorage.php',
|
||||
'Nette\\Caching\\Storages\\IJournal' => __DIR__ . '/..' . '/nette/caching/src/compatibility.php',
|
||||
'Nette\\Caching\\Storages\\Journal' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/Journal.php',
|
||||
'Nette\\Caching\\Storages\\MemcachedStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/MemcachedStorage.php',
|
||||
'Nette\\Caching\\Storages\\MemoryStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/MemoryStorage.php',
|
||||
'Nette\\Caching\\Storages\\NewMemcachedStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/NewMemcachedStorage.php',
|
||||
'Nette\\Caching\\Storages\\SQLiteJournal' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/SQLiteJournal.php',
|
||||
'Nette\\Caching\\Storages\\SQLiteStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/SQLiteStorage.php',
|
||||
'Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php',
|
||||
'Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php',
|
||||
'Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php',
|
||||
'Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php',
|
||||
'Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php',
|
||||
'Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php',
|
||||
'Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php',
|
||||
'Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
|
||||
'Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php',
|
||||
'Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php',
|
||||
'Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php',
|
||||
'Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php',
|
||||
'Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php',
|
||||
'Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php',
|
||||
'Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/finder/src/Utils/Finder.php',
|
||||
'Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php',
|
||||
'Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php',
|
||||
'Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php',
|
||||
'Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php',
|
||||
'Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php',
|
||||
'Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php',
|
||||
'Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php',
|
||||
'Nette\\Utils\\ObjectMixin' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectMixin.php',
|
||||
'Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php',
|
||||
'Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php',
|
||||
'Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php',
|
||||
'Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php',
|
||||
'Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php',
|
||||
'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
|
||||
'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php',
|
||||
'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
|
||||
'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
|
||||
'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
|
||||
'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
|
||||
'WhereClause' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'kakao\\KakaoKey' => __DIR__ . '/../..' . '/d_setting/KakaoKey.php',
|
||||
'sammo\\RootDB' => __DIR__ . '/../..' . '/d_setting/RootDB.php',
|
||||
'sammo\\ServConfig' => __DIR__ . '/../..' . '/d_setting/ServConfig.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$prefixDirsPsr4;
|
||||
$loader->prefixesPsr0 = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$prefixesPsr0;
|
||||
$loader->classMap = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
}
|
||||
Vendored
+4378
File diff suppressed because it is too large
Load Diff
Vendored
+638
@@ -0,0 +1,638 @@
|
||||
<?php return array (
|
||||
'root' =>
|
||||
array (
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
|
||||
'name' => 'sammo-hid/sammo',
|
||||
),
|
||||
'versions' =>
|
||||
array (
|
||||
'brandonwamboldt/utilphp' =>
|
||||
array (
|
||||
'pretty_version' => '1.1.0',
|
||||
'version' => '1.1.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '36c32efc4f0679c05163464a550f45c8d83fe683',
|
||||
),
|
||||
'catfan/medoo' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.7.10',
|
||||
'version' => '1.7.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f',
|
||||
),
|
||||
'composer/semver' =>
|
||||
array (
|
||||
'pretty_version' => '3.2.6',
|
||||
'version' => '3.2.6.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '83e511e247de329283478496f7a1e114c9517506',
|
||||
),
|
||||
'composer/xdebug-handler' =>
|
||||
array (
|
||||
'pretty_version' => '2.0.2',
|
||||
'version' => '2.0.2.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '84674dd3a7575ba617f5a76d7e9e29a7d3891339',
|
||||
),
|
||||
'doctrine/inflector' =>
|
||||
array (
|
||||
'pretty_version' => '2.0.4',
|
||||
'version' => '2.0.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89',
|
||||
),
|
||||
'erusev/parsedown' =>
|
||||
array (
|
||||
'pretty_version' => '1.7.4',
|
||||
'version' => '1.7.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'cb17b6477dfff935958ba01325f2e8a2bfa6dab3',
|
||||
),
|
||||
'erusev/parsedown-extra' =>
|
||||
array (
|
||||
'pretty_version' => '0.8.1',
|
||||
'version' => '0.8.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '91ac3ff98f0cea243bdccc688df43810f044dcef',
|
||||
),
|
||||
'ezyang/htmlpurifier' =>
|
||||
array (
|
||||
'pretty_version' => 'v4.13.0',
|
||||
'version' => '4.13.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75',
|
||||
),
|
||||
'felixfbecker/advanced-json-rpc' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.2.1',
|
||||
'version' => '3.2.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447',
|
||||
),
|
||||
'firephp/firephp-core' =>
|
||||
array (
|
||||
'pretty_version' => 'v0.4.0',
|
||||
'version' => '0.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf',
|
||||
),
|
||||
'guzzlehttp/guzzle' =>
|
||||
array (
|
||||
'pretty_version' => '6.5.5',
|
||||
'version' => '6.5.5.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e',
|
||||
),
|
||||
'guzzlehttp/promises' =>
|
||||
array (
|
||||
'pretty_version' => '1.5.1',
|
||||
'version' => '1.5.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
|
||||
),
|
||||
'guzzlehttp/psr7' =>
|
||||
array (
|
||||
'pretty_version' => '1.8.3',
|
||||
'version' => '1.8.3.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '1afdd860a2566ed3c2b0b4a3de6e23434a79ec85',
|
||||
),
|
||||
'illuminate/bus' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'be400399687b97d5558a224e970060fd5d5f2735',
|
||||
),
|
||||
'illuminate/collections' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '05f286ec5fd2dd286e8384577047efc375c8954c',
|
||||
),
|
||||
'illuminate/container' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d',
|
||||
),
|
||||
'illuminate/contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'e76f4bce73a2a1656add24bd5210ebc4b8af49c0',
|
||||
),
|
||||
'illuminate/database' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '43c7ffb6299ae55b000b286cf1278afd268ef29f',
|
||||
),
|
||||
'illuminate/events' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'b7f06cafb6c09581617f2ca05d69e9b159e5a35d',
|
||||
),
|
||||
'illuminate/macroable' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '300aa13c086f25116b5f3cde3ca54ff5c822fb05',
|
||||
),
|
||||
'illuminate/pipeline' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '23aeff5b26ae4aee3f370835c76bd0f4e93f71d2',
|
||||
),
|
||||
'illuminate/support' =>
|
||||
array (
|
||||
'pretty_version' => 'v8.69.0',
|
||||
'version' => '8.69.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'a8851b7001530d3c11626a81449ed9b63dd10db7',
|
||||
),
|
||||
'league/plates' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.4.0',
|
||||
'version' => '3.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6d3ee31199b536a4e003b34a356ca20f6f75496a',
|
||||
),
|
||||
'microsoft/tolerant-php-parser' =>
|
||||
array (
|
||||
'pretty_version' => 'v0.1.1',
|
||||
'version' => '0.1.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6a965617cf484355048ac6d2d3de7b6ec93abb16',
|
||||
),
|
||||
'monolog/monolog' =>
|
||||
array (
|
||||
'pretty_version' => '1.26.1',
|
||||
'version' => '1.26.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'c6b00f05152ae2c9b04a448f99c7590beb6042f5',
|
||||
),
|
||||
'nesbot/carbon' =>
|
||||
array (
|
||||
'pretty_version' => '2.54.0',
|
||||
'version' => '2.54.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'eed83939f1aed3eee517d03a33f5ec587ac529b5',
|
||||
),
|
||||
'netresearch/jsonmapper' =>
|
||||
array (
|
||||
'pretty_version' => 'v4.0.0',
|
||||
'version' => '4.0.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d',
|
||||
),
|
||||
'nette/caching' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.1.1',
|
||||
'version' => '3.1.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '3e771c589dee414724be473c24ad16dae50c1960',
|
||||
),
|
||||
'nette/finder' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.5.2',
|
||||
'version' => '2.5.2.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '4ad2c298eb8c687dd0e74ae84206a4186eeaed50',
|
||||
),
|
||||
'nette/utils' =>
|
||||
array (
|
||||
'pretty_version' => 'v3.2.5',
|
||||
'version' => '3.2.5.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9cd80396ca58d7969ab44fc7afcf03624dfa526e',
|
||||
),
|
||||
'pguardiario/phpuri' =>
|
||||
array (
|
||||
'pretty_version' => '1.0',
|
||||
'version' => '1.0.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'ad0a5ec033fe616cfef55578b9c7f2458be8fbfc',
|
||||
),
|
||||
'phan/phan' =>
|
||||
array (
|
||||
'pretty_version' => '5.2.1',
|
||||
'version' => '5.2.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd724bbb8fc3ba89179868bb5220ecdf6a9c1636b',
|
||||
),
|
||||
'php-extended/php-system' =>
|
||||
array (
|
||||
'pretty_version' => '1.4.0',
|
||||
'version' => '1.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9e6b3c2009ef56dc123efc43900e40cdf217ace0',
|
||||
),
|
||||
'php-extended/php-tail' =>
|
||||
array (
|
||||
'pretty_version' => '2.2.0',
|
||||
'version' => '2.2.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '19fbd3a79ccc071954f28296b2c44754335304a0',
|
||||
),
|
||||
'phpdocumentor/reflection-common' =>
|
||||
array (
|
||||
'pretty_version' => '2.2.0',
|
||||
'version' => '2.2.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
|
||||
),
|
||||
'phpdocumentor/reflection-docblock' =>
|
||||
array (
|
||||
'pretty_version' => '5.3.0',
|
||||
'version' => '5.3.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
|
||||
),
|
||||
'phpdocumentor/type-resolver' =>
|
||||
array (
|
||||
'pretty_version' => '1.5.1',
|
||||
'version' => '1.5.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'a12f7e301eb7258bb68acd89d4aefa05c2906cae',
|
||||
),
|
||||
'psr/container' =>
|
||||
array (
|
||||
'pretty_version' => '1.1.2',
|
||||
'version' => '1.1.2.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
|
||||
),
|
||||
'psr/container-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/http-message' =>
|
||||
array (
|
||||
'pretty_version' => '1.0.1',
|
||||
'version' => '1.0.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
|
||||
),
|
||||
'psr/http-message-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/log' =>
|
||||
array (
|
||||
'pretty_version' => '1.1.4',
|
||||
'version' => '1.1.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
|
||||
),
|
||||
'psr/log-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '1.0.0',
|
||||
1 => '1.0|2.0',
|
||||
),
|
||||
),
|
||||
'psr/simple-cache' =>
|
||||
array (
|
||||
'pretty_version' => '1.0.1',
|
||||
'version' => '1.0.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
|
||||
),
|
||||
'ralouphie/getallheaders' =>
|
||||
array (
|
||||
'pretty_version' => '3.0.3',
|
||||
'version' => '3.0.3.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
|
||||
),
|
||||
'sabre/event' =>
|
||||
array (
|
||||
'pretty_version' => '5.1.4',
|
||||
'version' => '5.1.4.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd7da22897125d34d7eddf7977758191c06a74497',
|
||||
),
|
||||
'sammo-hid/sammo' =>
|
||||
array (
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
|
||||
),
|
||||
'sergeytsalkov/meekrodb' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'e30c240d54bc81f58c58507a9ed768032eb494a5',
|
||||
),
|
||||
'spatie/data-transfer-object' =>
|
||||
array (
|
||||
'pretty_version' => '3.7.3',
|
||||
'version' => '3.7.3.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '341f72c77e0fce40ea2e0dcb212cb54dc27bbe72',
|
||||
),
|
||||
'symfony/console' =>
|
||||
array (
|
||||
'pretty_version' => 'v5.3.10',
|
||||
'version' => '5.3.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3',
|
||||
),
|
||||
'symfony/deprecation-contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4.0',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627',
|
||||
),
|
||||
'symfony/lock' =>
|
||||
array (
|
||||
'pretty_version' => 'v4.4.33',
|
||||
'version' => '4.4.33.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '567d29b1bc6e3937652054dafc069151d17824a9',
|
||||
),
|
||||
'symfony/polyfill-ctype' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '46cd95797e9df938fdd2b03693b5fca5e64b01ce',
|
||||
),
|
||||
'symfony/polyfill-intl-grapheme' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.1',
|
||||
'version' => '1.23.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535',
|
||||
),
|
||||
'symfony/polyfill-intl-idn' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '65bd267525e82759e7d8c4e8ceea44f398838e65',
|
||||
),
|
||||
'symfony/polyfill-intl-normalizer' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
|
||||
),
|
||||
'symfony/polyfill-mbstring' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.1',
|
||||
'version' => '1.23.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6',
|
||||
),
|
||||
'symfony/polyfill-php72' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976',
|
||||
),
|
||||
'symfony/polyfill-php73' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.0',
|
||||
'version' => '1.23.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'fba8933c384d6476ab14fb7b8526e5287ca7e010',
|
||||
),
|
||||
'symfony/polyfill-php80' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.23.1',
|
||||
'version' => '1.23.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be',
|
||||
),
|
||||
'symfony/service-contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4.0',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb',
|
||||
),
|
||||
'symfony/string' =>
|
||||
array (
|
||||
'pretty_version' => 'v5.3.10',
|
||||
'version' => '5.3.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'd70c35bb20bbca71fc4ab7921e3c6bda1a82a60c',
|
||||
),
|
||||
'symfony/translation' =>
|
||||
array (
|
||||
'pretty_version' => 'v5.3.10',
|
||||
'version' => '5.3.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6ef197aea2ac8b9cd63e0da7522b3771714035aa',
|
||||
),
|
||||
'symfony/translation-contracts' =>
|
||||
array (
|
||||
'pretty_version' => 'v2.4.0',
|
||||
'version' => '2.4.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '95c812666f3e91db75385749fe219c5e494c7f95',
|
||||
),
|
||||
'symfony/translation-implementation' =>
|
||||
array (
|
||||
'provided' =>
|
||||
array (
|
||||
0 => '2.3',
|
||||
),
|
||||
),
|
||||
'tysonandre/var_representation_polyfill' =>
|
||||
array (
|
||||
'pretty_version' => '0.1.1',
|
||||
'version' => '0.1.1.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '0a942e74e18af5514749895507bc6ca7ab96399a',
|
||||
),
|
||||
'vlucas/valitron' =>
|
||||
array (
|
||||
'pretty_version' => 'v1.4.10',
|
||||
'version' => '1.4.10.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '5ebd5d7af82cc0a9d798e816a2ecad63f1b59ceb',
|
||||
),
|
||||
'voku/portable-ascii' =>
|
||||
array (
|
||||
'pretty_version' => '1.5.6',
|
||||
'version' => '1.5.6.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '80953678b19901e5165c56752d087fc11526017c',
|
||||
),
|
||||
'webmozart/assert' =>
|
||||
array (
|
||||
'pretty_version' => '1.10.0',
|
||||
'version' => '1.10.0.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
|
||||
),
|
||||
'xemlock/htmlpurifier-html5' =>
|
||||
array (
|
||||
'pretty_version' => 'v0.1.11',
|
||||
'version' => '0.1.11.0',
|
||||
'aliases' =>
|
||||
array (
|
||||
),
|
||||
'reference' => 'f0d563f9fd4a82a3d759043483f9a94c0d8c2255',
|
||||
),
|
||||
),
|
||||
);
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
// platform_check.php @generated by Composer
|
||||
|
||||
$issues = array();
|
||||
|
||||
if (!(PHP_VERSION_ID >= 80000)) {
|
||||
$issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.';
|
||||
}
|
||||
|
||||
if ($issues) {
|
||||
if (!headers_sent()) {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
}
|
||||
if (!ini_get('display_errors')) {
|
||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
|
||||
} elseif (!headers_sent()) {
|
||||
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
|
||||
}
|
||||
}
|
||||
trigger_error(
|
||||
'Composer detected issues in your platform: ' . implode(' ', $issues),
|
||||
E_USER_ERROR
|
||||
);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user