Compare commits
6478 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab197b6d43 | ||
|
|
16b0e53a36 | ||
|
|
bc14a6038e | ||
|
|
626329a1cc | ||
|
|
8bf250c228 | ||
|
|
62127bbb12 | ||
|
|
786ac87b76 | ||
|
|
c76f4ac89b | ||
|
|
d495ec71a8 | ||
|
|
b763852f57 | ||
|
|
6522d2f722 | ||
|
|
ac61fd1d78 | ||
|
|
c44d1566fa | ||
|
|
80dc7c2f74 | ||
|
|
7b94f0e36b | ||
|
|
504e8d564a | ||
|
|
ac395429c3 | ||
|
|
388768b3a6 | ||
|
|
5c4169e64e | ||
|
|
d40e9de2d2 | ||
|
|
1e54297be8 | ||
|
|
44b200240f | ||
|
|
a2340c313f | ||
|
|
37b07a5e7c | ||
|
|
73013a3c04 | ||
|
|
e8099f01b5 | ||
|
|
672bdd3a56 | ||
|
|
c2c2c29658 | ||
|
|
c745e14f47 | ||
|
|
e8f08cda53 | ||
|
|
8266ab5588 | ||
|
|
ea552208fc | ||
|
|
e86015a72a | ||
|
|
cf7ec2c9d3 | ||
|
|
dadd3ca671 | ||
|
|
79535212c8 | ||
|
|
ef5f96a193 | ||
|
|
418f71ec0f | ||
|
|
0ebeaa9ac2 | ||
|
|
25cd47b8dc | ||
|
|
cd48d981b5 | ||
|
|
774d26b982 | ||
|
|
f3e683bd6f | ||
|
|
50ce0c0d9d | ||
|
|
5b80711d75 | ||
|
|
666e456551 | ||
|
|
31794ac376 | ||
|
|
2141fdf06e | ||
|
|
3f3e0739c4 | ||
|
|
ebed7e2147 | ||
|
|
53f5d4c710 | ||
|
|
139a4054c5 | ||
|
|
a4de96508d | ||
|
|
a7582aaf15 | ||
|
|
c5c1c64a81 | ||
|
|
992c52ce7f | ||
|
|
026aef7465 | ||
|
|
b53a23b51b | ||
|
|
2aad015392 | ||
|
|
986ec877b0 | ||
|
|
c43ea74b30 | ||
|
|
79981f3cda | ||
|
|
c2940a8385 | ||
|
|
bede564618 | ||
|
|
e0ca4b865a | ||
|
|
31c206bf80 | ||
|
|
9187a08106 | ||
|
|
3859a50466 | ||
|
|
927071e085 | ||
|
|
6ba918b203 | ||
|
|
e8b70dbca4 | ||
|
|
0f8d223c7f | ||
|
|
19a2885fd5 | ||
|
|
b8a094470b | ||
|
|
2988bb77e8 | ||
|
|
738317bf34 | ||
|
|
e46fbd0780 | ||
|
|
56b74ad990 | ||
|
|
6de92bb42b | ||
|
|
c801936e53 | ||
|
|
817656504d | ||
|
|
6f00f97b66 | ||
|
|
5acb978f8f | ||
|
|
975a4ae871 | ||
|
|
56aaf3c73e | ||
|
|
12fd1cad0c | ||
|
|
e573cbf032 | ||
|
|
dead461542 | ||
|
|
3d5da1ac73 | ||
|
|
ec408ca6a6 | ||
|
|
ea66cdd6a5 | ||
|
|
f762e8034f | ||
|
|
bb1e369f30 | ||
|
|
8376578921 | ||
|
|
ed2354cd9d | ||
|
|
386688b87a | ||
|
|
38d56dddf1 | ||
|
|
e8975942ec | ||
|
|
3ca80a7336 | ||
|
|
d029dae7ad | ||
|
|
9e058732ee | ||
|
|
cad5d11261 | ||
|
|
fcaedec2ab | ||
|
|
ead9d59e88 | ||
|
|
34b8a17ccd | ||
|
|
a53d081c39 | ||
|
|
823134e4ba | ||
|
|
272167b4fc | ||
|
|
92f09bba94 | ||
|
|
1f50bdb230 | ||
|
|
2eef4e6716 | ||
|
|
d989dbfec4 | ||
|
|
ca9fcec364 | ||
|
|
354104f9a9 | ||
|
|
8649ea3d6f | ||
|
|
752ff12c37 | ||
|
|
4bb89b1755 | ||
|
|
0ef553d30e | ||
|
|
43a62aef07 | ||
|
|
ed4d0aa909 | ||
|
|
023ce4e720 | ||
|
|
368d9359dd | ||
|
|
d98c19d561 | ||
|
|
cab77e35e0 | ||
|
|
e3e90b4b93 | ||
|
|
f8c69893e1 | ||
|
|
49678a0893 | ||
|
|
d667b5b48c | ||
|
|
9cba55b39c | ||
|
|
c2cbb7b8ce | ||
|
|
8217d75ca1 | ||
|
|
1ca70d9759 | ||
|
|
4303aaa9b8 | ||
|
|
7b56bae289 | ||
|
|
4183416b3e | ||
|
|
a60dee57ce | ||
|
|
5724656acb | ||
|
|
329f9cd9fe | ||
|
|
fbdb8b406e | ||
|
|
85d0bbd957 | ||
|
|
414f00d6ae | ||
|
|
17b0add058 | ||
|
|
c68ed40661 | ||
|
|
ff624075a8 | ||
|
|
08db28469d | ||
|
|
a20b326807 | ||
|
|
4db1b1b250 | ||
|
|
ff6b263b48 | ||
|
|
c0bf052fa9 | ||
|
|
5419cff925 | ||
|
|
eee10ad2ed | ||
|
|
98472a8104 | ||
|
|
d094c168aa | ||
|
|
4b18460bc6 | ||
|
|
412c0a965c | ||
|
|
2becf79223 | ||
|
|
43ec96d4a0 | ||
|
|
3d1d779da7 | ||
|
|
c88056ba83 | ||
|
|
e769751221 | ||
|
|
49b9a90c3f | ||
|
|
64d141f71e | ||
|
|
c488d3123f | ||
|
|
967af60327 | ||
|
|
f1ef9f9d31 | ||
|
|
dfaf08743c | ||
|
|
d9552d8a6d | ||
|
|
7586a8ab2c | ||
|
|
e1a942250b | ||
|
|
72be0185de | ||
|
|
7e4cbce06b | ||
|
|
177d62f431 | ||
|
|
5a11e03725 | ||
|
|
75d068b7cd | ||
|
|
1208503888 | ||
|
|
de90d401d2 | ||
|
|
396defaea9 | ||
|
|
18f350cd04 | ||
|
|
478180ebe4 | ||
|
|
4a3059f509 | ||
|
|
78728138a0 | ||
|
|
63fc98591d | ||
|
|
53def9a682 | ||
|
|
323231d1dd | ||
|
|
714011c81e | ||
|
|
952ff4207b | ||
|
|
150b16ec2c | ||
|
|
c98bc4a243 | ||
|
|
014f8cd693 | ||
|
|
aea37e46e3 | ||
|
|
31ab78ae8e | ||
|
|
f82e1453e4 | ||
|
|
a2b77c8813 | ||
|
|
18add29472 | ||
|
|
b111a8fe8d | ||
|
|
3b23cf0258 | ||
|
|
28e864e096 | ||
|
|
1de19b921a | ||
|
|
ff162b5a03 | ||
|
|
d8e4705dd4 | ||
|
|
338e1f5926 | ||
|
|
a7fdfa08e1 | ||
|
|
9703a401c5 | ||
|
|
753a2aa462 | ||
|
|
10990a0684 | ||
|
|
91254e9211 | ||
|
|
0f79287b04 | ||
|
|
f2fac77d8c | ||
|
|
81b7373637 | ||
|
|
fa67c2548a | ||
|
|
ea80587ddb | ||
|
|
828f5f8384 | ||
|
|
1295a1272a | ||
|
|
66646d9276 | ||
|
|
d0497dba92 | ||
|
|
42914e8227 | ||
|
|
59b49b7881 | ||
|
|
5620f16330 | ||
|
|
be024d4ad7 | ||
|
|
75c740fe2b | ||
|
|
6c8d86bb90 | ||
|
|
b253a6b71e | ||
|
|
ca7b4df812 | ||
|
|
bc8dd57236 | ||
|
|
f4f461b8bb | ||
|
|
cbb9b6957f | ||
|
|
f6b56c9317 | ||
|
|
3717fb6c8d | ||
|
|
f6abbc01bd | ||
|
|
57a71c157d | ||
|
|
cc76aeb7bb | ||
|
|
811cabf8a9 | ||
|
|
bf8d2f93d2 | ||
|
|
07d8259ad6 | ||
|
|
a00d412008 | ||
|
|
5fb39658f1 | ||
|
|
b0703b92c3 | ||
|
|
dd9fd3d8a7 | ||
|
|
cf0c59864f | ||
|
|
4c0404c70d | ||
|
|
573a413ee1 | ||
|
|
f633e6ca49 | ||
|
|
07b06d76be | ||
|
|
856fe2da15 | ||
|
|
f82aae65cd | ||
|
|
3fbd11a104 | ||
|
|
58a99f1907 | ||
|
|
cf86dfd317 | ||
|
|
a057b4f6d8 | ||
|
|
62b03cfddf | ||
|
|
18b827b979 | ||
|
|
0a379fc514 | ||
|
|
445c11b8d9 | ||
|
|
8d290ad509 | ||
|
|
b90c48b50f | ||
|
|
d19e7db09e | ||
|
|
9939904b02 | ||
|
|
ca23b15f5c | ||
|
|
ffa676f577 | ||
|
|
6d023c4df3 | ||
|
|
b31bd37a30 | ||
|
|
78faee8c7c | ||
|
|
40e2a703d0 | ||
|
|
b01edcb9bc | ||
|
|
f7fffc9be8 | ||
|
|
50e8634097 | ||
|
|
e3994e517e | ||
|
|
2bb7785189 | ||
|
|
90c8408111 | ||
|
|
64786ec12a | ||
|
|
b3c82f8886 | ||
|
|
063259dc52 | ||
|
|
b4c9d9c2a7 | ||
|
|
fa2b59df4b | ||
|
|
f41a169460 | ||
|
|
f567083006 | ||
|
|
a2a677e539 | ||
|
|
9123c0b733 | ||
|
|
788e3b31e1 | ||
|
|
71f0ed8b74 | ||
|
|
ac2e4e593d | ||
|
|
edaa7d7748 | ||
|
|
3cdf965fba | ||
|
|
6b60d1e71f | ||
|
|
7b7fb5acd5 | ||
|
|
0a7d612f41 | ||
|
|
38da76bbe0 | ||
|
|
a13e045742 | ||
|
|
811620c0a0 | ||
|
|
504f5f7bdd | ||
|
|
32bcad51b8 | ||
|
|
a40510c241 | ||
|
|
ac8dce6599 | ||
|
|
190d525099 | ||
|
|
1b6666fa39 | ||
|
|
1dd01c99e8 | ||
|
|
d50b30a498 | ||
|
|
42a3a87f13 | ||
|
|
9dfedbe619 | ||
|
|
88957b4c9d | ||
|
|
b2f2c9322b | ||
|
|
3be2051808 | ||
|
|
ff32b0dc9b | ||
|
|
c1869a11af | ||
|
|
e22a4fdba4 | ||
|
|
29a7b2c5b5 | ||
|
|
3b6c285c2a | ||
|
|
575d1786af | ||
|
|
bc1c927952 | ||
|
|
f95bc85f91 | ||
|
|
4015195314 | ||
|
|
c3d883c6cb | ||
|
|
097e30321b | ||
|
|
b6ddeaacf2 | ||
|
|
b0c60ec124 | ||
|
|
f3b788703e | ||
|
|
4bb83781e8 | ||
|
|
a73195b7cc | ||
|
|
1bd00b8a9a | ||
|
|
d84eaeafc5 | ||
|
|
20ae84bff9 | ||
|
|
7372c931b3 | ||
|
|
29e1b6e465 | ||
|
|
eda06993f8 | ||
|
|
4b30ef1cf2 | ||
|
|
e92e5e8eb8 | ||
|
|
4e5271fcdf | ||
|
|
3c55487a16 | ||
|
|
76a1cae5d8 | ||
|
|
81a97315e3 | ||
|
|
53c14d97a6 | ||
|
|
69a82eec17 | ||
|
|
45cadef22f | ||
|
|
0a033fb10a | ||
|
|
591afa0647 | ||
|
|
05eac20ffe | ||
|
|
38d263ac19 | ||
|
|
f71c204eef | ||
|
|
51147203be | ||
|
|
a931686317 | ||
|
|
5bd322bdcf | ||
|
|
bb097109f0 | ||
|
|
2ab6c40ff1 | ||
|
|
68bb738af2 | ||
|
|
6b968beede | ||
|
|
f68dd1bffb | ||
|
|
f92b71ca99 | ||
|
|
2b79fe2d6a | ||
|
|
44dd9af276 | ||
|
|
d3013d4f8c | ||
|
|
678524ad21 | ||
|
|
32a64481f2 | ||
|
|
1776015c6c | ||
|
|
f1c71a26e3 | ||
|
|
e78ab767d3 | ||
|
|
f01eb2f95d | ||
|
|
1450e45d97 | ||
|
|
ec8cba369c | ||
|
|
f4c248f406 | ||
|
|
f3b2a58646 | ||
|
|
c6f89c42b2 | ||
|
|
5e93cfdd9e | ||
|
|
d91d5a3ab5 | ||
|
|
907c045f33 | ||
|
|
90f189eb54 | ||
|
|
4abd5b2112 | ||
|
|
df9a665994 | ||
|
|
7a098ca0ed | ||
|
|
33716732a1 | ||
|
|
97ae594375 | ||
|
|
3f321ae9a0 | ||
|
|
161d32a7e7 | ||
|
|
d7137586a9 | ||
|
|
cd0c06ba6e | ||
|
|
899ab63d91 | ||
|
|
1097820a5a | ||
|
|
39114f91a7 | ||
|
|
4f01387edf | ||
|
|
de3e0585f1 | ||
|
|
f85f25ba82 | ||
|
|
10a2c179f9 | ||
|
|
6eea56861b | ||
|
|
21fd2064ae | ||
|
|
dcbab8e37a | ||
|
|
5677278251 | ||
|
|
a83bee993d | ||
|
|
96a31f554a | ||
|
|
d14ec6aea5 | ||
|
|
917cedf893 | ||
|
|
193dd71600 | ||
|
|
6c293a3d7f | ||
|
|
e847ddf011 | ||
|
|
7e8b448985 | ||
|
|
d1f3a87c08 | ||
|
|
9f8145e590 | ||
|
|
791efc171a | ||
|
|
144312a525 | ||
|
|
92684112ed | ||
|
|
ef114ee6cb | ||
|
|
667f209742 | ||
|
|
4ad0747c78 | ||
|
|
c5cf66402c | ||
|
|
05417049eb | ||
|
|
c7b0c46d9f | ||
|
|
df578c91ad | ||
|
|
70008c47c9 | ||
|
|
938affef32 | ||
|
|
a3c33000ee | ||
|
|
1e54b7b294 | ||
|
|
cc0dbcf3f4 | ||
|
|
c5a2cadccc | ||
|
|
9aa43416b6 | ||
|
|
8364029db8 | ||
|
|
d842d21be0 | ||
|
|
3514fd2433 | ||
|
|
6778ff27ea | ||
|
|
f32315d699 | ||
|
|
8b754b24b6 | ||
|
|
b1bee9ff38 | ||
|
|
569be2d402 | ||
|
|
78a73eac53 | ||
|
|
533cb99c33 | ||
|
|
79726940dc | ||
|
|
27c7891169 | ||
|
|
7a3a793a12 | ||
|
|
8088469eca | ||
|
|
3dcb082015 | ||
|
|
bece023028 | ||
|
|
9c4df66925 | ||
|
|
2b43ceb6c6 | ||
|
|
c143adba91 | ||
|
|
142fdc8d86 | ||
|
|
67778dcd3d | ||
|
|
ed80863eac | ||
|
|
c3fc84de12 | ||
|
|
904f83cd85 | ||
|
|
28bf100a50 | ||
|
|
accbd4e82a | ||
|
|
d7f478c154 | ||
|
|
8f7f13fea4 | ||
|
|
c82b03a74c | ||
|
|
58fb36bdb9 | ||
|
|
4297a7b0a4 | ||
|
|
1bab6d0dd7 | ||
|
|
13b85edbe2 | ||
|
|
dc53098e43 | ||
|
|
3c66feff5a | ||
|
|
218c3bc0d5 | ||
|
|
9f5eddcd13 | ||
|
|
3cba76552b | ||
|
|
e98a8b624b | ||
|
|
6c6947b01f | ||
|
|
78c91e9e5b | ||
|
|
44493ca0c4 | ||
|
|
42acf78b09 | ||
|
|
3aa9f8af18 | ||
|
|
8a32ee30a5 | ||
|
|
981dc0626b | ||
|
|
8986d14e98 | ||
|
|
5163b1a624 | ||
|
|
860aa9d6d0 | ||
|
|
64dc5212f9 | ||
|
|
6cff3214f3 | ||
|
|
fd910bd5e9 | ||
|
|
c6086bed41 | ||
|
|
1a9dfdfab8 | ||
|
|
5284cd11a9 | ||
|
|
d1a47cffad | ||
|
|
f469595eee | ||
|
|
9cfc52f114 | ||
|
|
30bfb756c2 | ||
|
|
711f85445e | ||
|
|
8aae9766e5 | ||
|
|
288b98ccbf | ||
|
|
bde50b1be8 | ||
|
|
a34dfd55be | ||
|
|
609c1d4d4c | ||
|
|
c12fe09969 | ||
|
|
bd14afe347 | ||
|
|
f445a13051 | ||
|
|
8ddf607d9f | ||
|
|
5900253b85 | ||
|
|
ccec94925f | ||
|
|
4504a9d0b5 | ||
|
|
057f98ad45 | ||
|
|
3b1c9aa026 | ||
|
|
658397dc38 | ||
|
|
0cd1c8e23e | ||
|
|
0345c1e6f8 | ||
|
|
f6c4cda0d4 | ||
|
|
39fd713b91 | ||
|
|
31d77ec580 | ||
|
|
06116382ee | ||
|
|
d2046de193 | ||
|
|
4397fe3a13 | ||
|
|
534e1fa6eb | ||
|
|
3e8cc2c670 | ||
|
|
3c565baf9d | ||
|
|
2e182e84c3 | ||
|
|
a42021655c | ||
|
|
2498a2b0bd | ||
|
|
4484411a77 | ||
|
|
61a151c803 | ||
|
|
5149c950aa | ||
|
|
18f4d846c9 | ||
|
|
db95aa250d | ||
|
|
982d1bf662 | ||
|
|
a0393e9ddf | ||
|
|
a8d6328bd4 | ||
|
|
13dab13319 | ||
|
|
c623aa0f06 | ||
|
|
79403afbe6 | ||
|
|
4c650e87fa | ||
|
|
3dde62befe | ||
|
|
8bfabbe265 | ||
|
|
e334b16aaa | ||
|
|
5626ace245 | ||
|
|
52652cb609 | ||
|
|
256f40d4f5 | ||
|
|
ef9acc54ec | ||
|
|
a9f2d25957 | ||
|
|
6fc47fbb69 | ||
|
|
9c11184238 | ||
|
|
a421c1dbfb | ||
|
|
7ec707927d | ||
|
|
837134daef | ||
|
|
4011899846 | ||
|
|
28e743ba70 | ||
|
|
a161d404ad | ||
|
|
cd607cb280 | ||
|
|
4e60ab7f53 | ||
|
|
71e7d32b08 | ||
|
|
d5e422970c | ||
|
|
871ba5a488 | ||
|
|
249e8d59cb | ||
|
|
8f4769d2ac | ||
|
|
a3ca9963a5 | ||
|
|
2d3c23876c | ||
|
|
bd8d8eef3e | ||
|
|
e786207cc2 | ||
|
|
b042095ac2 | ||
|
|
3413d1bf23 | ||
|
|
018c5ef731 | ||
|
|
fdb136f1fa | ||
|
|
9e33074735 | ||
|
|
d6d465cdf4 | ||
|
|
e76573cc1a | ||
|
|
3fa6dc71e2 | ||
|
|
6fec269844 | ||
|
|
b6004b6837 | ||
|
|
86d3b25aec | ||
|
|
8a407bfbb0 | ||
|
|
d30a590d9e | ||
|
|
f95e404be1 | ||
|
|
ffb8b4fc68 | ||
|
|
f86d6b0162 | ||
|
|
71c72ed072 | ||
|
|
a8d343e07b | ||
|
|
d020172181 | ||
|
|
e5c9f6c1fe | ||
|
|
176dc11748 | ||
|
|
c2abd02b9b | ||
|
|
12ecfdd423 | ||
|
|
67cfbfc2f3 | ||
|
|
fc83d38e67 | ||
|
|
7063c423eb | ||
|
|
36b93993cf | ||
|
|
ceffc5aa72 | ||
|
|
ccb45b6f6e | ||
|
|
d2e47e014a | ||
|
|
a5b8d7917f | ||
|
|
d0e735ee4b | ||
|
|
ece5971027 | ||
|
|
7c6b0d5c31 | ||
|
|
03151310cf | ||
|
|
baa2bc0c38 | ||
|
|
7e1b53480e | ||
|
|
6425b4f9f5 | ||
|
|
fb907f5f76 | ||
|
|
b107a1583f | ||
|
|
ced3f320eb | ||
|
|
a9d7293818 | ||
|
|
add42e9edf | ||
|
|
265ad4b96a | ||
|
|
92eeb4969f | ||
|
|
6fcddaf8fa | ||
|
|
41fd583fbc | ||
|
|
ceba6816de | ||
|
|
093cb475bb | ||
|
|
d44790b35f | ||
|
|
f8164a3dd1 | ||
|
|
c20126598f | ||
|
|
6c818bb37a | ||
|
|
8cb160b1f8 | ||
|
|
df91f3738a | ||
|
|
b5b268f606 | ||
|
|
ce6b8c94a2 | ||
|
|
6e643fe58b | ||
|
|
2bf91a0487 | ||
|
|
2775d747ac | ||
|
|
99659e4cf9 | ||
|
|
3bbcda917c | ||
|
|
7e43fb79af | ||
|
|
eb2b567da6 | ||
|
|
ab332d7b2e | ||
|
|
53e22b81ef | ||
|
|
3fc9d50adb | ||
|
|
c2da6dd45b | ||
|
|
7146f825b2 | ||
|
|
f61a5f5200 | ||
|
|
dc05dd7ca1 | ||
|
|
57dd344f3b | ||
|
|
f7f59df8aa | ||
|
|
0525a6f90f | ||
|
|
7b4305d81b | ||
|
|
94e9e93fa4 | ||
|
|
d2a1294e9a | ||
|
|
3d897f18cd | ||
|
|
68c14d1e53 | ||
|
|
48089394a5 | ||
|
|
30bd190b41 | ||
|
|
cf93cd9307 | ||
|
|
f40816e063 | ||
|
|
3759f29852 | ||
|
|
bc5555933f | ||
|
|
ead7ae8504 | ||
|
|
ad5abba8c6 | ||
|
|
61296cedd2 | ||
|
|
d9c29a2c4f | ||
|
|
f5172e6b84 | ||
|
|
544bcbe903 | ||
|
|
f35dab1b56 | ||
|
|
caee420087 | ||
|
|
e8c374113e | ||
|
|
98a241a730 | ||
|
|
be8297d6f6 | ||
|
|
09da80e9f4 | ||
|
|
df4ecf63a8 | ||
|
|
b4d1937857 | ||
|
|
0be5fbdc35 | ||
|
|
ae7e25ea65 | ||
|
|
fef45d469c | ||
|
|
e7353ec7e7 | ||
|
|
e3237f057d | ||
|
|
54d5d9d1cc | ||
|
|
31d9aebf0b | ||
|
|
5013de6770 | ||
|
|
301abac0c1 | ||
|
|
9614c48e4c | ||
|
|
c6e1ca1c22 | ||
|
|
30dc473697 | ||
|
|
65974ceabc | ||
|
|
6caf53d1c2 | ||
|
|
dee6e498d9 | ||
|
|
b3723274f7 | ||
|
|
9fb7cc796b | ||
|
|
3472208c05 | ||
|
|
fc30e1d559 | ||
|
|
cd4bb444ff | ||
|
|
e443513996 | ||
|
|
3d16f22135 | ||
|
|
6cc1ff5eeb | ||
|
|
3000b9dcde | ||
|
|
3b867462a3 | ||
|
|
b8aa9348b9 | ||
|
|
513e3a3d21 | ||
|
|
bfb0897b54 | ||
|
|
86e8b8c10d | ||
|
|
ee57c3490a | ||
|
|
77c1f54876 | ||
|
|
dc5984d0e0 | ||
|
|
7afbd4800f | ||
|
|
0720702c91 | ||
|
|
5f396e824f | ||
|
|
4f229c254c | ||
|
|
25e58df5e0 | ||
|
|
1261327fa6 | ||
|
|
09c3cc58e4 | ||
|
|
7ef31f84a7 | ||
|
|
85c2b396ce | ||
|
|
0759d72108 | ||
|
|
9b9144f25d | ||
|
|
b677e891b4 | ||
|
|
509f62f68d | ||
|
|
868bf752f3 | ||
|
|
051cdc9670 | ||
|
|
4de5c216ff | ||
|
|
ad2c7304ea | ||
|
|
4dd1309c3f | ||
|
|
541da2740d | ||
|
|
95e2bec215 | ||
|
|
72c96052b4 | ||
|
|
2ab168735f | ||
|
|
85cdf05890 | ||
|
|
bf78b7f815 | ||
|
|
ffb9874d84 | ||
|
|
228cdbe6af | ||
|
|
a303639c9e | ||
|
|
c5133f6088 | ||
|
|
27d368d48d | ||
|
|
085b599f84 | ||
|
|
3b84eb3b70 | ||
|
|
aa877a29d7 | ||
|
|
0abee77e62 | ||
|
|
114fcee2ae | ||
|
|
b488204093 | ||
|
|
322bfbaf57 | ||
|
|
2718f4c333 | ||
|
|
8c342a764b | ||
|
|
697c3f8cb9 | ||
|
|
bb292f501d | ||
|
|
723e54f74e | ||
|
|
1a8c96a3f0 | ||
|
|
a88040e4d5 | ||
|
|
47a0f46ce8 | ||
|
|
66fb352cca | ||
|
|
fd77acc217 | ||
|
|
595d1942cb | ||
|
|
b905933999 | ||
|
|
219a756abc | ||
|
|
2f76f9da89 | ||
|
|
b0b8f573bc | ||
|
|
746aa6cc0f | ||
|
|
fac610d47b | ||
|
|
93209da176 | ||
|
|
35a2a48c47 | ||
|
|
7019f6bea4 | ||
|
|
8bde47280a | ||
|
|
521c6da830 | ||
|
|
5c3e55b5b1 | ||
|
|
22dcca9832 | ||
|
|
db6c0d54cf | ||
|
|
a17abc5557 | ||
|
|
741c6f1179 | ||
|
|
43b285ef7a | ||
|
|
f4bb18b05e | ||
|
|
14885f25b4 | ||
|
|
4e16ea0f0a | ||
|
|
42a696873b | ||
|
|
cfd51db229 | ||
|
|
12f11c97ae | ||
|
|
6a78d11127 | ||
|
|
256ee7a8c7 | ||
|
|
07a51957ee | ||
|
|
37c4470f10 | ||
|
|
4dc7d1c0cd | ||
|
|
f6a85f0b0b | ||
|
|
5b8b660bd0 | ||
|
|
d9cb85df83 | ||
|
|
445e82be75 | ||
|
|
98a12c49dd | ||
|
|
b78cc7e48a | ||
|
|
ac9ce0b3ad | ||
|
|
cf2b814629 | ||
|
|
bbe7a37359 | ||
|
|
d0aa154ea6 | ||
|
|
df4616ae4a | ||
|
|
10f62db9fd | ||
|
|
5c075210d6 | ||
|
|
0cf85b0771 | ||
|
|
fa90047e52 | ||
|
|
b9f64fe19b | ||
|
|
dd072912e8 | ||
|
|
9dbdc75689 | ||
|
|
dce211dbba | ||
|
|
b4e5fa5c1b | ||
|
|
f12fa7e20a | ||
|
|
96f8f1da0c | ||
|
|
db7eec042e | ||
|
|
52aed3f8a1 | ||
|
|
cadd186f1b | ||
|
|
dd9ab16d67 | ||
|
|
d8b6aff23a | ||
|
|
b8aac3f8fc | ||
|
|
4aab97ccb1 | ||
|
|
4cd21f1e07 | ||
|
|
403f0f8c64 | ||
|
|
8c4246f2ad | ||
|
|
1859ba5ec8 | ||
|
|
54d5184255 | ||
|
|
0c5b986fc4 | ||
|
|
7b2cdd618e | ||
|
|
30bb3f1fcb | ||
|
|
b45ea66175 | ||
|
|
543c5034af | ||
|
|
c8aa7afdc6 | ||
|
|
b35bb1b50c | ||
|
|
6341be9cdf | ||
|
|
93a14a93f9 | ||
|
|
d6559e2ac9 | ||
|
|
65e6755b8b | ||
|
|
6ead9750f4 | ||
|
|
6532c7e089 | ||
|
|
8b3d934230 | ||
|
|
e2b7c30811 | ||
|
|
c8bb3c0b71 | ||
|
|
9990e8473c | ||
|
|
d765182bbb | ||
|
|
5a63d1d5a4 | ||
|
|
6d409d27ca | ||
|
|
e9c2885f34 | ||
|
|
ecb8f7362b | ||
|
|
17ccfec358 | ||
|
|
a55bb28069 | ||
|
|
a2e3dc0592 | ||
|
|
df142d4f61 | ||
|
|
fac8edd47a | ||
|
|
9a9da7b077 | ||
|
|
131441846b | ||
|
|
3ff728ab02 | ||
|
|
78bf4ef5fa | ||
|
|
318d0b3976 | ||
|
|
90a14e14f4 | ||
|
|
dea46e8d5a | ||
|
|
7e5ce623fe | ||
|
|
e17805f208 | ||
|
|
d8bcdca55a | ||
|
|
f6f2a3b366 | ||
|
|
d52c7e7a1b | ||
|
|
c4acccac14 | ||
|
|
13001c018c | ||
|
|
1b39efb694 | ||
|
|
0c343cb1c3 | ||
|
|
aead221184 | ||
|
|
16d1c9f5d6 | ||
|
|
0c464b24ad | ||
|
|
a249a630c0 | ||
|
|
f39823eac0 | ||
|
|
69de99636f | ||
|
|
afcff1fa77 | ||
|
|
9b5bae049c | ||
|
|
7a3415166e | ||
|
|
5b2b4bf13c | ||
|
|
4bd67bc298 | ||
|
|
1560749579 | ||
|
|
ed68fd4ab3 | ||
|
|
e9a9dabb49 | ||
|
|
31faafea9d | ||
|
|
6961bd61ca | ||
|
|
726fc53e62 | ||
|
|
c598686bd9 | ||
|
|
cab87e9398 | ||
|
|
680037927d | ||
|
|
ee026386e5 | ||
|
|
60f72f0ff9 | ||
|
|
debc855806 | ||
|
|
49c04ccfc7 | ||
|
|
11ba44870b | ||
|
|
f9a64d24bf | ||
|
|
e1a8dcfcc8 | ||
|
|
1ee0e29974 | ||
|
|
10e32454ef | ||
|
|
8d41e9658f | ||
|
|
086652dd50 | ||
|
|
77a9940461 | ||
|
|
9c1c180ae0 | ||
|
|
06682bd2a9 | ||
|
|
6135f0763b | ||
|
|
307964d874 | ||
|
|
f3dd50de87 | ||
|
|
c776bcc5f6 | ||
|
|
4bbc43d91a | ||
|
|
db8b5dc698 | ||
|
|
2f56c61b47 | ||
|
|
1d340e7664 | ||
|
|
ea62bc0bb2 | ||
|
|
8380c3be02 | ||
|
|
6470bcda19 | ||
|
|
2d51349d1d | ||
|
|
2f2b394d72 | ||
|
|
ba181ae9df | ||
|
|
f62546ec79 | ||
|
|
7c251fe190 | ||
|
|
1c155a0d03 | ||
|
|
8f196db778 | ||
|
|
a85455fb3f | ||
|
|
d0302d1bbe | ||
|
|
d73267df5e | ||
|
|
8bbfb5cda1 | ||
|
|
1e17d5b1cc | ||
|
|
f881917d2f | ||
|
|
99244f51b0 | ||
|
|
606d029ed9 | ||
|
|
e4b9d679fb | ||
|
|
2bf2bd8932 | ||
|
|
4a8a33ea85 | ||
|
|
ac4b83046a | ||
|
|
2a2ac35b98 | ||
|
|
8c744efd56 | ||
|
|
597e59f10d | ||
|
|
3cd07d0b54 | ||
|
|
13259225c2 | ||
|
|
7acd91331c | ||
|
|
0fdaca17a2 | ||
|
|
539c0ed171 | ||
|
|
553365b942 | ||
|
|
100308db02 | ||
|
|
ab967462e6 | ||
|
|
1bc553ea62 | ||
|
|
687ea53616 | ||
|
|
220d9528a3 | ||
|
|
fc7d3f64c0 | ||
|
|
63ab7767a3 | ||
|
|
20894d1c5e | ||
|
|
2f03d2234a | ||
|
|
dadf3d846b | ||
|
|
941a9284b9 | ||
|
|
4ee3820bd6 | ||
|
|
c155df5d79 | ||
|
|
33b70567c8 | ||
|
|
720bf51ba6 | ||
|
|
26bdb72428 | ||
|
|
90c8a1b1cf | ||
|
|
3143dbf3dc | ||
|
|
38d587aaeb | ||
|
|
fe9bafa741 | ||
|
|
8092e18158 | ||
|
|
6ed77f2a27 | ||
|
|
a73688a2be | ||
|
|
e7d327226a | ||
|
|
ae1eb9ccde | ||
|
|
860064c812 | ||
|
|
845901ab01 | ||
|
|
25f7360264 | ||
|
|
78ec7d0fe1 | ||
|
|
a1e9678b69 | ||
|
|
be5d629c13 | ||
|
|
957b399e90 | ||
|
|
5e6c164b9f | ||
|
|
5d9a889190 | ||
|
|
a9acc9c971 | ||
|
|
308010794a | ||
|
|
0ce72cbf9d | ||
|
|
6e52ab285a | ||
|
|
3da4648112 | ||
|
|
1897409476 | ||
|
|
c60d65dd8f | ||
|
|
f29949e14d | ||
|
|
75aa98ddaa | ||
|
|
06909f4f00 | ||
|
|
aca081557a | ||
|
|
a71efacd1e | ||
|
|
871063dab7 | ||
|
|
135662d6b0 | ||
|
|
a69c3c1848 | ||
|
|
50e5244e25 | ||
|
|
1c07f197de | ||
|
|
13c32111a0 | ||
|
|
28c6975732 | ||
|
|
12091fcfb1 | ||
|
|
5598826eaf | ||
|
|
3fea624cca | ||
|
|
9007dd9ab7 | ||
|
|
08166cf330 | ||
|
|
e51b6a6233 | ||
|
|
3887465d80 | ||
|
|
d84f96a571 | ||
|
|
f600e226da | ||
|
|
d775f13a03 | ||
|
|
b630afdeda | ||
|
|
c39c259078 | ||
|
|
a571c4ba33 | ||
|
|
889be6e29d | ||
|
|
d15f64ae5d | ||
|
|
a07117ea55 | ||
|
|
d0dae177cf | ||
|
|
d4db873716 | ||
|
|
de0752fd56 | ||
|
|
4204d4928b | ||
|
|
e2f6cc9c9f | ||
|
|
05de0ecec3 | ||
|
|
b05beb000f | ||
|
|
093abaad29 | ||
|
|
e84e4169f9 | ||
|
|
cd6c5cfd4c | ||
|
|
b855f2fcc2 | ||
|
|
ba69ade024 | ||
|
|
8748b2dc3f | ||
|
|
5f66af3712 | ||
|
|
31ae50b137 | ||
|
|
87e0459fcc | ||
|
|
07e58ae64f | ||
|
|
a88d18148c | ||
|
|
1cf43a9dc9 | ||
|
|
196ce8426b | ||
|
|
6a95c34a81 | ||
|
|
ea0e6d9824 | ||
|
|
14d3da0e18 | ||
|
|
b6b8fb7d73 | ||
|
|
2bca3cd247 | ||
|
|
22a353b8e3 | ||
|
|
743fa73a01 | ||
|
|
a546bfe7d9 | ||
|
|
25deae6cc7 | ||
|
|
62000670e3 | ||
|
|
ac49043fbb | ||
|
|
37a7ca7f14 | ||
|
|
4d6192adcd | ||
|
|
9f1ada898e | ||
|
|
5617521380 | ||
|
|
9835a2545d | ||
|
|
c28cefeeb0 | ||
|
|
afd5b750dc | ||
|
|
2b97b124bd | ||
|
|
d042ab87da | ||
|
|
588303b78d | ||
|
|
36704c5e18 | ||
|
|
21d747cd36 | ||
|
|
ef3494f160 | ||
|
|
2dc6c4a496 | ||
|
|
5834843b8a | ||
|
|
2777a23672 | ||
|
|
32afd92d30 | ||
|
|
762f3afb9d | ||
|
|
7fb2f15a1a | ||
|
|
7456dccd3a | ||
|
|
245f41bb7e | ||
|
|
9bfb844cfa | ||
|
|
d790d3ba3c | ||
|
|
c3dbc92766 | ||
|
|
0bd25f1e17 | ||
|
|
a4cd7411e8 | ||
|
|
bf276f6235 | ||
|
|
d916890a8f | ||
|
|
071cacc9a4 | ||
|
|
33f33323af | ||
|
|
388fae2c47 | ||
|
|
9f878b77e9 | ||
|
|
a547d2aaba | ||
|
|
c013026821 | ||
|
|
96b48a2404 | ||
|
|
9612975c2c | ||
|
|
41bfd45a2e | ||
|
|
bbdcbd1f08 | ||
|
|
6b3c525a9d | ||
|
|
83aed7051c | ||
|
|
77c6e45e65 | ||
|
|
8825393660 | ||
|
|
2b9246c6ad | ||
|
|
a9edb4de28 | ||
|
|
a076ddf38c | ||
|
|
0c809fbb40 | ||
|
|
cafc266e0b | ||
|
|
a3d020eff9 | ||
|
|
8412d94d05 | ||
|
|
d1c5bb956a | ||
|
|
70986bc120 | ||
|
|
f31fe8b865 | ||
|
|
142a9fe530 | ||
|
|
4dd2ad9b27 | ||
|
|
62f7375804 | ||
|
|
543296b5ba | ||
|
|
5fee130d00 | ||
|
|
073facea70 | ||
|
|
dbe3b6eee4 | ||
|
|
df97049647 | ||
|
|
42c5f68362 | ||
|
|
cc19e760cf | ||
|
|
0ff22a16fa | ||
|
|
47360ec906 | ||
|
|
087a9938d2 | ||
|
|
26d8e41a6b | ||
|
|
750ae1d3f3 | ||
|
|
f8a9a7a108 | ||
|
|
eb192137d6 | ||
|
|
c25b464f37 | ||
|
|
710b48d410 | ||
|
|
5e77a8199d | ||
|
|
6637db086b | ||
|
|
a271a55da7 | ||
|
|
6eeec6cbfa | ||
|
|
5e3f3b0400 | ||
|
|
923c402f69 | ||
|
|
4fed0b991c | ||
|
|
ad80acb22a | ||
|
|
bd8414f8ea | ||
|
|
2eb467c788 | ||
|
|
c436e29b89 | ||
|
|
44219d5e91 | ||
|
|
b9de3270f6 | ||
|
|
590d6faeb0 | ||
|
|
62e96e9a58 | ||
|
|
1c818ef0a0 | ||
|
|
d6ce2e3671 | ||
|
|
85b6a52662 | ||
|
|
0246082b9b | ||
|
|
3b031c6ba5 | ||
|
|
74740ca50b | ||
|
|
631baa7120 | ||
|
|
657d6edff7 | ||
|
|
737c5a9549 | ||
|
|
c5fb56f90f | ||
|
|
4cd9abe632 | ||
|
|
b67e7df38e | ||
|
|
f28c746b6b | ||
|
|
ab95027fc6 | ||
|
|
ed3bc4ab63 | ||
|
|
68064f1aa6 | ||
|
|
475ac76a5f | ||
|
|
79d4f8674c | ||
|
|
e42eed4d4c | ||
|
|
4a7042e847 | ||
|
|
7f36923eb4 | ||
|
|
2ca8d69126 | ||
|
|
70367d70c8 | ||
|
|
e068d62ac6 | ||
|
|
e6389ff5a1 | ||
|
|
b46cf57d98 | ||
|
|
6f59d71e07 | ||
|
|
f9130f42a2 | ||
|
|
faf2eeaa99 | ||
|
|
1c7de0b4ac | ||
|
|
58487e484f | ||
|
|
104075f3e0 | ||
|
|
b8097eaf2e | ||
|
|
5eb0cbc887 | ||
|
|
1a4a6f3807 | ||
|
|
a012b25335 | ||
|
|
46e8b137e9 | ||
|
|
4b25c5e8d6 | ||
|
|
2fdbae3e1f | ||
|
|
87e06793c2 | ||
|
|
8cc451a2e2 | ||
|
|
723c2c7fa9 | ||
|
|
4dd2c5cdd5 | ||
|
|
bdc257b40e | ||
|
|
4728f7c697 | ||
|
|
1c4c0fe8a1 | ||
|
|
360274a6e9 | ||
|
|
07228ff56a | ||
|
|
a61f153df7 | ||
|
|
34e91850d9 | ||
|
|
ba8e579e9b | ||
|
|
072e39c9cf | ||
|
|
8dc3f3b21a | ||
|
|
3a21241248 | ||
|
|
5c75096bcd | ||
|
|
a43b0f5253 | ||
|
|
d93271e86d | ||
|
|
4a6df9f961 | ||
|
|
a43ae2369b | ||
|
|
9a049de859 | ||
|
|
58b8398aa0 | ||
|
|
645751f680 | ||
|
|
2d3b6879f5 | ||
|
|
26c0924461 | ||
|
|
d4f801a8e9 | ||
|
|
cb1082c58c | ||
|
|
8406864963 | ||
|
|
85ef034fd0 | ||
|
|
59141f62bb | ||
|
|
d68cadba7b | ||
|
|
1207fd1f16 | ||
|
|
8aa61e230c | ||
|
|
2c7bda8a3b | ||
|
|
d58c5dd398 | ||
|
|
171da7a347 | ||
|
|
3fd70a769a | ||
|
|
4280f84535 | ||
|
|
c3d9c32615 | ||
|
|
a938b609b9 | ||
|
|
d3c7fac606 | ||
|
|
fea3f6cc72 | ||
|
|
aee5966e1c | ||
|
|
95e53ac0a0 | ||
|
|
5d11759f7d | ||
|
|
829616534e | ||
|
|
863f4d8366 | ||
|
|
bdd0c3686d | ||
|
|
91769d536d | ||
|
|
9500343d85 | ||
|
|
ef053035d0 | ||
|
|
35faafb32c | ||
|
|
f9fd868b99 | ||
|
|
8b903626c2 | ||
|
|
faf0c950fe | ||
|
|
4ecd325371 | ||
|
|
021519f295 | ||
|
|
e83685d667 | ||
|
|
81a198a76a | ||
|
|
5771d67202 | ||
|
|
b2b7974ba0 | ||
|
|
f59ca94416 | ||
|
|
22ff0d80ce | ||
|
|
5a22a0c27d | ||
|
|
287ef181ba | ||
|
|
bc63810ebd | ||
|
|
92cdea123e | ||
|
|
e4c7e343c8 | ||
|
|
6b75be183d | ||
|
|
718f6d9cef | ||
|
|
2ee43c403c | ||
|
|
24fa3f5e7b | ||
|
|
bbbda7f812 | ||
|
|
e958900380 | ||
|
|
74926c1dd3 | ||
|
|
2654888782 | ||
|
|
49597b0e9c | ||
|
|
b5ecfb4c9a | ||
|
|
07fa3764ef | ||
|
|
5acc77a163 | ||
|
|
0709878b4c | ||
|
|
662e477028 | ||
|
|
b7b7c381ee | ||
|
|
995cd95474 | ||
|
|
fe8a13f76f | ||
|
|
9252432bc0 | ||
|
|
f057f6768f | ||
|
|
806bf0be8d | ||
|
|
958506a108 | ||
|
|
e8fd771b91 | ||
|
|
fa4178fefa | ||
|
|
1af59d31b9 | ||
|
|
20758cef30 | ||
|
|
272938529d | ||
|
|
a67b7266ed | ||
|
|
75c8aecffa | ||
|
|
f26159a0e3 | ||
|
|
675e8667c2 | ||
|
|
a1a26b70bc | ||
|
|
34a7f86a07 | ||
|
|
e7311ac2f3 | ||
|
|
8d9ecc0c62 | ||
|
|
f01b991108 | ||
|
|
f80736c3d7 | ||
|
|
2c7f69cf85 | ||
|
|
348ecc1118 | ||
|
|
a9678f0ae0 | ||
|
|
461f298d2c | ||
|
|
068de7cf40 | ||
|
|
d04eb87c4f | ||
|
|
8af68db965 | ||
|
|
1cf632e98b | ||
|
|
58c11c3128 | ||
|
|
efcda95dda | ||
|
|
80d2028bac | ||
|
|
215213fc2c | ||
|
|
99d32dc0b4 | ||
|
|
0998097253 | ||
|
|
c17be5af6b | ||
|
|
b376536a3b | ||
|
|
e7edc02647 | ||
|
|
69bf835059 | ||
|
|
b97ffddfe8 | ||
|
|
6407b7c591 | ||
|
|
e14cd92d59 | ||
|
|
73cadd1798 | ||
|
|
fb9840f1f8 | ||
|
|
492aaa3375 | ||
|
|
33c5da700d | ||
|
|
48d3af7d9a | ||
|
|
9b3470eabd | ||
|
|
86a505b4f3 | ||
|
|
ed6c6296eb | ||
|
|
b27a41812f | ||
|
|
6c933d2b77 | ||
|
|
fb5610f9bd | ||
|
|
7adbd00811 | ||
|
|
1c91d19163 | ||
|
|
f491135318 | ||
|
|
a7ced00520 | ||
|
|
be3359fc67 | ||
|
|
69ed35ed71 | ||
|
|
280d35a053 | ||
|
|
eca6b9f0af | ||
|
|
aa5d05eaa4 | ||
|
|
15735552f4 | ||
|
|
d6d9dc9d95 | ||
|
|
dc57966dc3 | ||
|
|
cc9345e703 | ||
|
|
3fb8f3ec95 | ||
|
|
04ed50fb0f | ||
|
|
c9553411bb | ||
|
|
62221adf55 | ||
|
|
a6bf4746c6 | ||
|
|
72637d00e8 | ||
|
|
27d4b15925 | ||
|
|
7a77767e66 | ||
|
|
1b26621860 | ||
|
|
3db5f4d0aa | ||
|
|
b2a6e327bf | ||
|
|
9aec5fe907 | ||
|
|
fc3e0dfcd1 | ||
|
|
6513ff92a7 | ||
|
|
a0eb6d0976 | ||
|
|
7530770842 | ||
|
|
11ea72e240 | ||
|
|
c98330909a | ||
|
|
bec6fa4ad7 | ||
|
|
ac7ce73526 | ||
|
|
4c6619e6c5 | ||
|
|
e8121fdc11 | ||
|
|
21f17270a1 | ||
|
|
423cd5900e | ||
|
|
b9f535cd49 | ||
|
|
c731a82b71 | ||
|
|
e6fad97edc | ||
|
|
e228144159 | ||
|
|
9431a7b022 | ||
|
|
cd041f8574 | ||
|
|
8ba3378096 | ||
|
|
225984822d | ||
|
|
01b68db30e | ||
|
|
33fdaa5b6d | ||
|
|
70495aada1 | ||
|
|
f243f615ef | ||
|
|
6a1f5667f9 | ||
|
|
fab5f58ee0 | ||
|
|
55be8e6f52 | ||
|
|
c75b9b0d12 | ||
|
|
9b85446808 | ||
|
|
fd5d42836f | ||
|
|
4eaa82fd22 | ||
|
|
a497cc46f9 | ||
|
|
178f737971 | ||
|
|
74963bce9d | ||
|
|
33a4dbe1e5 | ||
|
|
60f32d0bce | ||
|
|
dce36d3e55 | ||
|
|
807c72b2f1 | ||
|
|
4f393553f4 | ||
|
|
91afc7b23c | ||
|
|
36d158e13e | ||
|
|
02a97b5985 | ||
|
|
b980545012 | ||
|
|
8aad152b23 | ||
|
|
74dbaade6f | ||
|
|
2deb5b7fec | ||
|
|
53677172f2 | ||
|
|
bef0ccf42a | ||
|
|
2fd5182608 | ||
|
|
7ad7caa2ae | ||
|
|
6d1710c74f | ||
|
|
233b8d0129 | ||
|
|
f55bdf07d3 | ||
|
|
6c2b532ae3 | ||
|
|
2539f294e4 | ||
|
|
b6a3ce9305 | ||
|
|
b07495aae9 | ||
|
|
686a53215d | ||
|
|
6190da1300 | ||
|
|
6fd7d8191e | ||
|
|
2ccd1cc9f0 | ||
|
|
8167bdd978 | ||
|
|
dfb3e34f7b | ||
|
|
45ee75055e | ||
|
|
5da4e321c0 | ||
|
|
e8519fecb4 | ||
|
|
ff35aa07dc | ||
|
|
06c172838c | ||
|
|
1543dd85b5 | ||
|
|
f37a1026f9 | ||
|
|
91fb7fa3d8 | ||
|
|
7b70153068 | ||
|
|
7e096ee2c5 | ||
|
|
86a90daf1b | ||
|
|
42f7df9681 | ||
|
|
2edad38c7c | ||
|
|
296ee4961e | ||
|
|
b1becddf11 | ||
|
|
667edcd9d0 | ||
|
|
b4e75bedf0 | ||
|
|
5482ef5451 | ||
|
|
a3afd5178c | ||
|
|
f1285a6dfd | ||
|
|
cf7c1afb93 | ||
|
|
f254831aa6 | ||
|
|
bd40c8649c | ||
|
|
7c53df2ed1 | ||
|
|
5ca6026787 | ||
|
|
483daa5882 | ||
|
|
e2bc92d128 | ||
|
|
5ffe3773d4 | ||
|
|
a7c68018a2 | ||
|
|
5ffb82993e | ||
|
|
07add0bd91 | ||
|
|
9a9b6fa326 | ||
|
|
ba43ec5759 | ||
|
|
008a9560fe | ||
|
|
6ff01cc72c | ||
|
|
e140a28073 | ||
|
|
de61c3b962 | ||
|
|
c46fc4531b | ||
|
|
065a9ed10f | ||
|
|
e44c0254f7 | ||
|
|
13f9f0315f | ||
|
|
1532ffe215 | ||
|
|
b24cbc68ba | ||
|
|
976fdd76c1 | ||
|
|
bbda335e02 | ||
|
|
031410c72b | ||
|
|
710def8e38 | ||
|
|
c0bda1b103 | ||
|
|
0e87ce4680 | ||
|
|
b4d594eeff | ||
|
|
ce09379bae | ||
|
|
b27fb64317 | ||
|
|
099455db25 | ||
|
|
3146bf51e6 | ||
|
|
b24a5e0662 | ||
|
|
e52ac0b187 | ||
|
|
eaa1590866 | ||
|
|
071af004bd | ||
|
|
23ab4e5e5f | ||
|
|
8e563cbccd | ||
|
|
1aee89f5ea | ||
|
|
d2dd6f7c70 | ||
|
|
e9a544fa98 | ||
|
|
fb547260d1 | ||
|
|
2065e32904 | ||
|
|
ac15581c56 | ||
|
|
9e2e882157 | ||
|
|
99ded56047 | ||
|
|
65386f52f0 | ||
|
|
5b8dce7456 | ||
|
|
de938eb621 | ||
|
|
83cc6c0835 | ||
|
|
304d78a4c8 | ||
|
|
347590751c | ||
|
|
fe4b1f96f1 | ||
|
|
9de984f7f8 | ||
|
|
b6cb9b853a | ||
|
|
50b930f283 | ||
|
|
cbeb809798 | ||
|
|
ea626368a0 | ||
|
|
c81747dd15 | ||
|
|
f8810d7caf | ||
|
|
92f54f0b59 | ||
|
|
ddce544b53 | ||
|
|
21fb7eea82 | ||
|
|
fd7eb43366 | ||
|
|
7d0ca894a4 | ||
|
|
a1add27c4c | ||
|
|
fc8194ee1e | ||
|
|
8ffcdb73e8 | ||
|
|
111528e51c | ||
|
|
5628dcf47e | ||
|
|
fb4f02cd38 | ||
|
|
d1be643c0d | ||
|
|
c9761bf6af | ||
|
|
4a47265224 | ||
|
|
f0f3017a76 | ||
|
|
d3f0b62348 | ||
|
|
6a53fb33da | ||
|
|
dcaf299864 | ||
|
|
ab2e00bc38 | ||
|
|
48d02bef15 | ||
|
|
1d67aa7bf2 | ||
|
|
e56066f721 | ||
|
|
5e3844ac13 | ||
|
|
cb4f5d454b | ||
|
|
e5c6fe1bb2 | ||
|
|
bf65a9732c | ||
|
|
1388b3219a | ||
|
|
d9e8ce22cb | ||
|
|
c85ba73371 | ||
|
|
224944528f | ||
|
|
cdcd3e77b3 | ||
|
|
ed5058a363 | ||
|
|
a670ff6d3e | ||
|
|
32f6d34904 | ||
|
|
d3ae05506d | ||
|
|
96f4394dce | ||
|
|
35567e6507 | ||
|
|
ae37e25452 | ||
|
|
c4537fe6f6 | ||
|
|
677334f5a9 | ||
|
|
3d9652ae35 | ||
|
|
a9130cb99c | ||
|
|
b1d60b5c85 | ||
|
|
99a05c56ad | ||
|
|
cfc65397b3 | ||
|
|
cd8fd1ef42 | ||
|
|
6350089e51 | ||
|
|
79f2f8cddc | ||
|
|
39fa949345 | ||
|
|
e1d7a5cbf5 | ||
|
|
f3cefaf043 | ||
|
|
b3460f3f54 | ||
|
|
8e5a67ed9f | ||
|
|
cccbcf510a | ||
|
|
a1e680fec7 | ||
|
|
1b58bd64ff | ||
|
|
196de8c758 | ||
|
|
222b777552 | ||
|
|
b5c206d3ae | ||
|
|
17ace95268 | ||
|
|
779d73f94b | ||
|
|
73307bf2e7 | ||
|
|
7623c1c5cb | ||
|
|
de568c84c2 | ||
|
|
1f5b9c6185 | ||
|
|
a5f8fd774d | ||
|
|
cc5443c38e | ||
|
|
8a86460b8f | ||
|
|
7ae9e49f51 | ||
|
|
c682d087d9 | ||
|
|
57da5c0841 | ||
|
|
a224722ae2 | ||
|
|
283ef5b163 | ||
|
|
09a188bfd9 | ||
|
|
10f086854b | ||
|
|
d67c6c37e3 | ||
|
|
136725dfb1 | ||
|
|
438895842c | ||
|
|
82b8f4f1ce | ||
|
|
0705f42cf8 | ||
|
|
cadc67ea40 | ||
|
|
054e9ecaae | ||
|
|
84fe3bfa87 | ||
|
|
2ef8403bfa | ||
|
|
1d3b2baee7 | ||
|
|
86de876b24 | ||
|
|
8a9f04f7fe | ||
|
|
98bd4dfe04 | ||
|
|
8e0e4d7c04 | ||
|
|
a5e8269c72 | ||
|
|
0acc88cde5 | ||
|
|
1e0ad1f6bf | ||
|
|
4abcb08cc9 | ||
|
|
81e7833711 | ||
|
|
3392cbbd91 | ||
|
|
e7b211f2c0 | ||
|
|
6c5bc9b4a3 | ||
|
|
cd2f65aafc | ||
|
|
3ee5093b03 | ||
|
|
6e2ad6860f | ||
|
|
8610eb84c6 | ||
|
|
a2e008347c | ||
|
|
a1ef0159e3 | ||
|
|
1c5f76635a | ||
|
|
e2a0fd7a28 | ||
|
|
5869a4ba2d | ||
|
|
ac9a93261b | ||
|
|
4b79f0047d | ||
|
|
6a789b660a | ||
|
|
0d8e44a079 | ||
|
|
f097952b42 | ||
|
|
224d511616 | ||
|
|
050c6cc4b0 | ||
|
|
bc2d23ff0d | ||
|
|
2939fadd6a | ||
|
|
ef260377c3 | ||
|
|
b9213df64b | ||
|
|
aa7694047b | ||
|
|
e2bc63217a | ||
|
|
6c5b8bcf9d | ||
|
|
e425fe3f97 | ||
|
|
6507993972 | ||
|
|
f081696f62 | ||
|
|
09157c3130 | ||
|
|
00626b1633 | ||
|
|
7e0cdbe502 | ||
|
|
ca08902d71 | ||
|
|
fad0e834d5 | ||
|
|
dc76eb6139 | ||
|
|
55e113c7a7 | ||
|
|
b62f5e079e | ||
|
|
ac1eaff6ec | ||
|
|
45f6129ae7 | ||
|
|
f3503e0026 | ||
|
|
826a654c95 | ||
|
|
08754e6ce7 | ||
|
|
3843972b05 | ||
|
|
37862f0f20 | ||
|
|
1f184f4aec | ||
|
|
db5a691693 | ||
|
|
48693250a4 | ||
|
|
570dcb6309 | ||
|
|
19e43087a8 | ||
|
|
fe0b6a1117 | ||
|
|
72851647ca | ||
|
|
1c90400081 | ||
|
|
672e18cac9 | ||
|
|
e939d667d9 | ||
|
|
8bb5a565cd | ||
|
|
7562c5751c | ||
|
|
e6e7d6dbd6 | ||
|
|
fe60c52c70 | ||
|
|
93f4590453 | ||
|
|
1098d271b8 | ||
|
|
51168169e7 | ||
|
|
d256a0e98f | ||
|
|
6717325c3f | ||
|
|
c4a0571e7a | ||
|
|
e4a06da14e | ||
|
|
36d6ead65c | ||
|
|
7eae3bc8c5 | ||
|
|
24b2198668 | ||
|
|
d29be0f460 | ||
|
|
8f93c36466 | ||
|
|
3092e5a8a5 | ||
|
|
55f95b3ac9 | ||
|
|
16218c8680 | ||
|
|
c11345c4d9 | ||
|
|
e31f0b8b0c | ||
|
|
7dd3b72a8c | ||
|
|
aeccccb33d | ||
|
|
b46a27c554 | ||
|
|
13bc15c05d | ||
|
|
cb1e644230 | ||
|
|
9bc0fada5c | ||
|
|
82e261ad33 | ||
|
|
cae2811762 | ||
|
|
09112c6869 | ||
|
|
77aaf1baee | ||
|
|
6626c2d00d | ||
|
|
019aea3d63 | ||
|
|
21439108ed | ||
|
|
754b30a7a6 | ||
|
|
89d5d480d7 | ||
|
|
fbcacb590b | ||
|
|
f97ad2b2ee | ||
|
|
e70f7141be | ||
|
|
7a08ce7ece | ||
|
|
86486336ec | ||
|
|
ec2a2522aa | ||
|
|
556f9ee39c | ||
|
|
7dad662d69 | ||
|
|
2daa3eb61f | ||
|
|
3079aa1f9d | ||
|
|
28f9a0a900 | ||
|
|
a6bb3cf60a | ||
|
|
004da5d385 | ||
|
|
0368282486 | ||
|
|
4404f20cf4 | ||
|
|
faca8bc02a | ||
|
|
5e93c05095 | ||
|
|
0f4f04eaa4 | ||
|
|
2e55d561d3 | ||
|
|
76a9049739 | ||
|
|
27bfcda20d | ||
|
|
c6d1d360a3 | ||
|
|
afc1236b06 | ||
|
|
bedd5f00f8 | ||
|
|
36239895bd | ||
|
|
738583e3d4 | ||
|
|
c513478c31 | ||
|
|
a944927b56 | ||
|
|
315f9d98f6 | ||
|
|
f087518e7a | ||
|
|
b9a8b0d146 | ||
|
|
4d15db0134 | ||
|
|
0d1a54262c | ||
|
|
e7ef7f5159 | ||
|
|
3dc989bccb | ||
|
|
75d46efd23 | ||
|
|
b83392cb04 | ||
|
|
7640d333f4 | ||
|
|
c880099deb | ||
|
|
42f5ecd4a1 | ||
|
|
733989a284 | ||
|
|
493f74d94d | ||
|
|
3b71e2abef | ||
|
|
30cad0c5f1 | ||
|
|
3a387643b3 | ||
|
|
e6b37703da | ||
|
|
990f473bb3 | ||
|
|
cf1de78205 | ||
|
|
ccea6dd74b | ||
|
|
166b490eed | ||
|
|
efd871ad2f | ||
|
|
b78896d64e | ||
|
|
e753c924ef | ||
|
|
9dc7b5a6d9 | ||
|
|
f5d21c9cdb | ||
|
|
6ce13646da | ||
|
|
151653dd98 | ||
|
|
619cfe6a1c | ||
|
|
8acf996d90 | ||
|
|
15e432204e | ||
|
|
4b1630e1ec | ||
|
|
41e63031b0 | ||
|
|
bb86f27fdf | ||
|
|
5cf4f62610 | ||
|
|
8e10a14866 | ||
|
|
94f850a588 | ||
|
|
db9997a106 | ||
|
|
0cbfb610f2 | ||
|
|
f901cd042b | ||
|
|
5719207dfa | ||
|
|
a84fbbe327 | ||
|
|
3882c11450 | ||
|
|
08f77c2b60 | ||
|
|
6269abbcc8 | ||
|
|
93c97972b9 | ||
|
|
ac61d43720 | ||
|
|
22ebe0e58f | ||
|
|
1958f78cc1 | ||
|
|
f072cbbba7 | ||
|
|
1a5b66b78d | ||
|
|
bea5973e0c | ||
|
|
0366dcf604 | ||
|
|
8211d4a1c2 | ||
|
|
fc2154ee92 | ||
|
|
76f85e6f7b | ||
|
|
81ce684b35 | ||
|
|
42bd888946 | ||
|
|
6bea346c41 | ||
|
|
8d23706354 | ||
|
|
62bfb1a273 | ||
|
|
38e86af75c | ||
|
|
607c2c5ba2 | ||
|
|
85f58eb082 | ||
|
|
a7ee64a25b | ||
|
|
2a58f22649 | ||
|
|
f066bb7716 | ||
|
|
4e3d182189 | ||
|
|
205fba74cf | ||
|
|
a9bcf8d50d | ||
|
|
54383b017e | ||
|
|
438b7b7bd0 | ||
|
|
27a40a9843 | ||
|
|
c7b0e9b05b | ||
|
|
356c829b76 | ||
|
|
ffbb5c48ed | ||
|
|
6b6c7b0920 | ||
|
|
de332a16d1 | ||
|
|
84ab3ee3af | ||
|
|
ce0d896492 | ||
|
|
eae9cb4afe | ||
|
|
459a812a54 | ||
|
|
7743647460 | ||
|
|
352ec364f0 | ||
|
|
54f684b7b3 | ||
|
|
1943b158fe | ||
|
|
a36eeb5261 | ||
|
|
a8b00faba1 | ||
|
|
bf73d0f905 | ||
|
|
193ffa06d9 | ||
|
|
9d176e35d4 | ||
|
|
cd2e8c6ef1 | ||
|
|
8461d71b52 | ||
|
|
e31cdf0df9 | ||
|
|
6f41791ea6 | ||
|
|
0bacbcd04e | ||
|
|
ffe689363f | ||
|
|
48d7fedbc0 | ||
|
|
75dff64450 | ||
|
|
f0b58c6f24 | ||
|
|
f3661b19c0 | ||
|
|
2f5106c97f | ||
|
|
0c19418e84 | ||
|
|
60c077c790 | ||
|
|
7aaa4dda22 | ||
|
|
109b3700b5 | ||
|
|
71fecf4d1f | ||
|
|
0f75c79665 | ||
|
|
9bcb01a75e | ||
|
|
4f29034f11 | ||
|
|
567bf445bf | ||
|
|
28a0c46ca7 | ||
|
|
7cc33d0f27 | ||
|
|
5fba8d773c | ||
|
|
36cd73df51 | ||
|
|
6f20889f00 | ||
|
|
8e408725e9 | ||
|
|
d053797340 | ||
|
|
c8d0f947d2 | ||
|
|
86e036c393 | ||
|
|
7652a2986b | ||
|
|
b1480167be | ||
|
|
e118e958f7 | ||
|
|
ee61dfe087 | ||
|
|
9231f420c1 | ||
|
|
0f92d021a1 | ||
|
|
cbdc3194cc | ||
|
|
993df0fd28 | ||
|
|
4294fdb0b2 | ||
|
|
082523bcea | ||
|
|
5d13c13821 | ||
|
|
21ef656e24 | ||
|
|
3c4fe8cc04 | ||
|
|
95ebd57b25 | ||
|
|
84e09aa8dd | ||
|
|
6cce3d2996 | ||
|
|
77b34fa961 | ||
|
|
024d978ae5 | ||
|
|
e0f55b9295 | ||
|
|
ccd83748f7 | ||
|
|
291ee9f86a | ||
|
|
59e4d7f0f5 | ||
|
|
4647448399 | ||
|
|
7dfe841876 | ||
|
|
34db35c36d | ||
|
|
3e9738dc66 | ||
|
|
2ecf57cdd9 | ||
|
|
c8b602038e | ||
|
|
e384fa226e | ||
|
|
cbb595ba83 | ||
|
|
fdeec0307e | ||
|
|
f084bbbf35 | ||
|
|
20d69b957f | ||
|
|
7de0a621e3 | ||
|
|
3441ea9844 | ||
|
|
83752e9349 | ||
|
|
8fdfe85b5f | ||
|
|
d4d9a85ad8 | ||
|
|
6f22452b54 | ||
|
|
a4a37d7a19 | ||
|
|
d1b1a8e490 | ||
|
|
104fe124df | ||
|
|
5bdbd74d59 | ||
|
|
e621c24270 | ||
|
|
554888318a | ||
|
|
49aaf98a7f | ||
|
|
ccdb94b06c | ||
|
|
6f7bfa71a9 | ||
|
|
fb3564fbe7 | ||
|
|
e1e365e16e | ||
|
|
5b5a18db2a | ||
|
|
3fa4dad418 | ||
|
|
0756607e32 | ||
|
|
a03be5a8a6 | ||
|
|
39c5bb95d2 | ||
|
|
4d33b089da | ||
|
|
58996b841a | ||
|
|
df03a7b3f8 | ||
|
|
ac03871174 | ||
|
|
2a086d20c6 | ||
|
|
d5cfa6d4dc | ||
|
|
f415167e59 | ||
|
|
9477db2363 | ||
|
|
8d11577ff2 | ||
|
|
037d1d9ad1 | ||
|
|
619ef2b341 | ||
|
|
f06fe76d35 | ||
|
|
eb86fdfbea | ||
|
|
c7712e2ef0 | ||
|
|
61fa770644 | ||
|
|
334bd73792 | ||
|
|
090ce262c4 | ||
|
|
d551d40886 | ||
|
|
aecfcaa8a2 | ||
|
|
61a3028788 | ||
|
|
11d048b8e3 | ||
|
|
d814a01f2a | ||
|
|
4c0916df79 | ||
|
|
e4844b9936 | ||
|
|
60aa8c527b | ||
|
|
9f7c3b8ea6 | ||
|
|
9f4f1bab39 | ||
|
|
73bd6af0f9 | ||
|
|
2aa54c5365 | ||
|
|
bc8542503d | ||
|
|
a6aea4ba58 | ||
|
|
0b41faec89 | ||
|
|
e12bd00b47 | ||
|
|
50eac9b49e | ||
|
|
e0405f1781 | ||
|
|
680d03e4d6 | ||
|
|
b4fc2e38ab | ||
|
|
16639f9d71 | ||
|
|
22f2605e25 | ||
|
|
69476b4f21 | ||
|
|
fdf92c5f3b | ||
|
|
5e22c83baa | ||
|
|
eed1a3c239 | ||
|
|
94c037821b | ||
|
|
e38e8eb636 | ||
|
|
bef8c83388 | ||
|
|
2e98324486 | ||
|
|
6e2d7445c5 | ||
|
|
90e7ace980 | ||
|
|
b0ff3bc7a3 | ||
|
|
06301e279c | ||
|
|
6d6f274648 | ||
|
|
9acefcb256 | ||
|
|
e4d0293a31 | ||
|
|
ae77542a11 | ||
|
|
980187f856 | ||
|
|
2b0a127fa5 | ||
|
|
327a8e6c59 | ||
|
|
d11e2724c4 | ||
|
|
f768ca3a2d | ||
|
|
947e902288 | ||
|
|
07c5d3277f | ||
|
|
d1d44a4fde | ||
|
|
6837a67234 | ||
|
|
3436a646b5 | ||
|
|
aed0af1e00 | ||
|
|
d6eb74262a | ||
|
|
403aa8c5a1 | ||
|
|
0d7ee2b014 | ||
|
|
2f5fd91bd8 | ||
|
|
cd1148c6aa | ||
|
|
cfd26f53f0 | ||
|
|
69ad5671ed | ||
|
|
f9e0f0d257 | ||
|
|
98f3135ad3 | ||
|
|
8c9c3a91e6 | ||
|
|
7f3518333d | ||
|
|
f1f871f103 | ||
|
|
6387b52896 | ||
|
|
077e95da85 | ||
|
|
7f6e1fbc8d | ||
|
|
06827cfcf1 | ||
|
|
6dc3097998 | ||
|
|
cd35271698 | ||
|
|
7b575f61d0 | ||
|
|
400e3ea649 | ||
|
|
622d871587 | ||
|
|
63d04645c7 | ||
|
|
3f4908c363 | ||
|
|
dd0f1d9d2d | ||
|
|
b31d171ae8 | ||
|
|
085f06594c | ||
|
|
ce3d41052c | ||
|
|
44f3df697f | ||
|
|
28c75b2283 | ||
|
|
b6e56119c4 | ||
|
|
a0e29b5435 | ||
|
|
65ff72cdf8 | ||
|
|
1da0956331 | ||
|
|
983078992d | ||
|
|
81059f80d8 | ||
|
|
a261442279 | ||
|
|
2f41eba100 | ||
|
|
91a6fb81c1 | ||
|
|
c95f0820bc | ||
|
|
830a1bd130 | ||
|
|
5c5ea8a254 | ||
|
|
5222c684d3 | ||
|
|
5798faa13b | ||
|
|
a062693875 | ||
|
|
6887d5d347 | ||
|
|
39c9669445 | ||
|
|
44565e22a0 | ||
|
|
ddec10d494 | ||
|
|
758e969cb6 | ||
|
|
a9a6a5041b | ||
|
|
59dd8ffbc6 | ||
|
|
8f9fe1b11a | ||
|
|
9ed0152cf2 | ||
|
|
250332a8d5 | ||
|
|
39825c6622 | ||
|
|
cee3070ca4 | ||
|
|
cd08e5c7da | ||
|
|
dd4beea44c | ||
|
|
5b48d59769 | ||
|
|
4dec12fcfc | ||
|
|
57ad3aca8e | ||
|
|
f677f42be7 | ||
|
|
a5760670ef | ||
|
|
f04a3ec201 | ||
|
|
f402c5fe3c | ||
|
|
9352e25392 | ||
|
|
1c90b0c19d | ||
|
|
cd776ff1a8 | ||
|
|
40a587bbaf | ||
|
|
818d729d8b | ||
|
|
dd5daa0767 | ||
|
|
ef5090c397 | ||
|
|
cf073de36c | ||
|
|
f16054639b | ||
|
|
b0983e8708 | ||
|
|
0febb218ed | ||
|
|
dfcfeeb550 | ||
|
|
820debf45a | ||
|
|
c19292c036 | ||
|
|
4ee81e6a3d | ||
|
|
87a8a3e22f | ||
|
|
e9125ef8e4 | ||
|
|
6ff394bcc9 | ||
|
|
7ce96585f5 | ||
|
|
41cc31c124 | ||
|
|
605af61a0f | ||
|
|
77e163e5b8 | ||
|
|
0e00b9009d | ||
|
|
a6dd998d31 | ||
|
|
cdd0ccc67a | ||
|
|
a918821868 | ||
|
|
c637b96f10 | ||
|
|
44b9197354 | ||
|
|
7a8f96b1dd | ||
|
|
f4f21f462d | ||
|
|
d09b8b5bd7 | ||
|
|
ee327db517 | ||
|
|
90a61b6bab | ||
|
|
00583bc4a8 | ||
|
|
2d06a8e880 | ||
|
|
e1a434edbc | ||
|
|
6b3b1cbd99 | ||
|
|
4dd861ee23 | ||
|
|
4f0f81a047 | ||
|
|
e3908c8de6 | ||
|
|
81c49fba03 | ||
|
|
eb174d5ba3 | ||
|
|
4c899e9c5a | ||
|
|
00b0f6ad51 | ||
|
|
fe1e467a49 | ||
|
|
73cb538d72 | ||
|
|
64b9e7fd48 | ||
|
|
12de22d3bb | ||
|
|
821bc6d777 | ||
|
|
6e66a5b77b | ||
|
|
cf5c10bbe6 | ||
|
|
4e30e74739 | ||
|
|
42890b9acf | ||
|
|
33a27379f9 | ||
|
|
0cf57cc7ca | ||
|
|
68fcbaf4c8 | ||
|
|
9c83d3c78c | ||
|
|
676dfabc91 | ||
|
|
60e6d1d61b | ||
|
|
975e275030 | ||
|
|
afcd5670e3 | ||
|
|
b17b53955c | ||
|
|
ff2b427cc1 | ||
|
|
5761800197 | ||
|
|
0eebacc521 | ||
|
|
4a5528697d | ||
|
|
d38034bb5c | ||
|
|
a62fe30546 | ||
|
|
b3fe3e8b3d | ||
|
|
25ebb427da | ||
|
|
c5bde10b4f | ||
|
|
e582e893cc | ||
|
|
833ec3d3cd | ||
|
|
3d446d3266 | ||
|
|
e660229c40 | ||
|
|
5489dec28d | ||
|
|
ee6e0e16cb | ||
|
|
eb1733609a | ||
|
|
8a6b4db19f | ||
|
|
df43b6a05c | ||
|
|
e2e66404d5 | ||
|
|
3ecb19d0f1 | ||
|
|
fd02c87fa2 | ||
|
|
63ac81c8f5 | ||
|
|
557bee61d5 | ||
|
|
3adca3c2fa | ||
|
|
39abd3ecb4 | ||
|
|
a4f4fc50b9 | ||
|
|
7bf638b0de | ||
|
|
56662a703c | ||
|
|
8b5f47d3a3 | ||
|
|
8bfb88840b | ||
|
|
593bb5a8a7 | ||
|
|
822ac7b100 | ||
|
|
cc70c5c67d | ||
|
|
ae7e1a22cb | ||
|
|
a289dcb9ee | ||
|
|
023b9c1e7e | ||
|
|
4c61662644 | ||
|
|
ad1b6ef0ac | ||
|
|
16944b5397 | ||
|
|
ed5c6be2f1 | ||
|
|
30cb082932 | ||
|
|
645554d12f | ||
|
|
72e44d596f | ||
|
|
8f2ca8f085 | ||
|
|
6725c2afa1 | ||
|
|
e9d4b73cc3 | ||
|
|
212b0faf0c | ||
|
|
929ec70512 | ||
|
|
6cd5d73607 | ||
|
|
80a7e1ea7d | ||
|
|
0d3b26b3aa | ||
|
|
52acea7b1f | ||
|
|
e9b49a43e2 | ||
|
|
4fa5538e2b | ||
|
|
84e74173de | ||
|
|
6cdb2a4896 | ||
|
|
d8bef3270d | ||
|
|
a33db8fe6f | ||
|
|
1c3f5517fa | ||
|
|
10972da060 | ||
|
|
a38f02541d | ||
|
|
fdba76ba47 | ||
|
|
f900ab0121 | ||
|
|
f80ab6a7a2 | ||
|
|
6ed209bbf3 | ||
|
|
fe85fa3bea | ||
|
|
76b7882f33 | ||
|
|
bf0ab2d44c | ||
|
|
276a0d9500 | ||
|
|
bcbfa560e9 | ||
|
|
8b366f0795 | ||
|
|
aa08f9692c | ||
|
|
288ba84939 | ||
|
|
4c74016b1a | ||
|
|
384b6c8288 | ||
|
|
a2af158fd3 | ||
|
|
1d8544ef3b | ||
|
|
91a12f76cd | ||
|
|
f4627acc48 | ||
|
|
2b1194d574 | ||
|
|
f33d2fb2e7 | ||
|
|
a9eec35aff | ||
|
|
8534f2d1e2 | ||
|
|
e8debd2e45 | ||
|
|
1caa41a623 | ||
|
|
bf59635280 | ||
|
|
5d6f75aaef | ||
|
|
eaf0662b75 | ||
|
|
6e8ea2a2cb | ||
|
|
b043b2a761 | ||
|
|
ac7e0dfb77 | ||
|
|
05d47bb09a | ||
|
|
575a5bd0b8 | ||
|
|
00740fb23b | ||
|
|
ae4c189e19 | ||
|
|
362a6e6d46 | ||
|
|
c76c7c68ff | ||
|
|
59ac9d39d5 | ||
|
|
ec41caade4 | ||
|
|
06ec06cdd7 | ||
|
|
b7acf86408 | ||
|
|
58c4db925b | ||
|
|
fe0c4ff3c2 | ||
|
|
7a2af0fbf4 | ||
|
|
d83127722f | ||
|
|
dc03ad05be | ||
|
|
a62df3cb8f | ||
|
|
18e32abda9 | ||
|
|
15d29da43b | ||
|
|
8b217d5313 | ||
|
|
ac62586bad | ||
|
|
c150fd9a1c | ||
|
|
674d14879f | ||
|
|
37e9010887 | ||
|
|
4bd2c75056 | ||
|
|
b9ed850b98 | ||
|
|
11cea17496 | ||
|
|
81df45a893 | ||
|
|
c1f0708a5d | ||
|
|
153f5854e2 | ||
|
|
f532964fde | ||
|
|
efea609dc3 | ||
|
|
f3a160038d | ||
|
|
f016eef48a | ||
|
|
f649514183 | ||
|
|
afd31677dd | ||
|
|
b28710b08c | ||
|
|
712ed555e6 | ||
|
|
11fb5bc3d0 | ||
|
|
2a5feb225b | ||
|
|
970e338847 | ||
|
|
0b9f650fe2 | ||
|
|
977834179a | ||
|
|
b42732743d | ||
|
|
99e6409a67 | ||
|
|
6a0a5f9693 | ||
|
|
fe9db8b369 | ||
|
|
ca035d0e8d | ||
|
|
84c9260dc4 | ||
|
|
987c02e946 | ||
|
|
5c0bc612fe | ||
|
|
0e28b53242 | ||
|
|
5fc0ce80fc | ||
|
|
af9092df39 | ||
|
|
58a5da33c2 | ||
|
|
7077eac589 | ||
|
|
b3435ae432 | ||
|
|
a31129333c | ||
|
|
2983c2a24f | ||
|
|
412bedb697 | ||
|
|
163597ef69 | ||
|
|
95f84afd33 | ||
|
|
9f7fd1fbfb | ||
|
|
940cab8620 | ||
|
|
d37811f177 | ||
|
|
5b84c99d79 | ||
|
|
b295024574 | ||
|
|
34180f1745 | ||
|
|
665031467a | ||
|
|
df33171107 | ||
|
|
53f4044890 | ||
|
|
a5049136ff | ||
|
|
705b3c6b63 | ||
|
|
6b4ac66962 | ||
|
|
0964b06240 | ||
|
|
92eeca3ba7 | ||
|
|
2a86554ac4 | ||
|
|
805caa30ce | ||
|
|
d4ca853fd3 | ||
|
|
5a8d2e8057 | ||
|
|
687fc358fd | ||
|
|
c4c2da06b7 | ||
|
|
8928cd53bf | ||
|
|
ca88fc4ed3 | ||
|
|
b83a1d79b7 | ||
|
|
cec2a837cf | ||
|
|
cff47262da | ||
|
|
da83eae754 | ||
|
|
c5409d52f5 | ||
|
|
54fc8f0e8c | ||
|
|
2ea633a2f7 | ||
|
|
9a52043fad | ||
|
|
39a5be2df9 | ||
|
|
96560e317a | ||
|
|
adb27903eb | ||
|
|
51150faa39 | ||
|
|
a56949e9fa | ||
|
|
ea96919b80 | ||
|
|
43da4c0eca | ||
|
|
5835afb849 | ||
|
|
b9c7771830 | ||
|
|
35db88affe | ||
|
|
e38faca455 | ||
|
|
0255e8710c | ||
|
|
7f3fecbdf5 | ||
|
|
a2c6d5e148 | ||
|
|
373706c92b | ||
|
|
7afe63aa06 | ||
|
|
8fab855099 | ||
|
|
062fef36f9 | ||
|
|
fefe2df3ee | ||
|
|
90b91ead72 | ||
|
|
1e98e41381 | ||
|
|
7030e8f050 | ||
|
|
74bb514a8c | ||
|
|
46914e486c | ||
|
|
f9abc561fb | ||
|
|
2e22ff2e36 | ||
|
|
8c3be4a5f0 | ||
|
|
3fe2f7337c | ||
|
|
ec24eb1d8e | ||
|
|
ffcaf85609 | ||
|
|
d0c481e44e | ||
|
|
67e2d9f9e1 | ||
|
|
dd5aa2b483 | ||
|
|
806494a254 | ||
|
|
5c3afd020a | ||
|
|
190cdfc326 | ||
|
|
13b954c765 | ||
|
|
49f6b50ed3 | ||
|
|
0f2a304d34 | ||
|
|
a142f93dca | ||
|
|
2dfe2fb22c | ||
|
|
e8564b4c90 | ||
|
|
2fd81b4932 | ||
|
|
0cf4c6ffea | ||
|
|
25f89afbfb | ||
|
|
43f3cdcd24 | ||
|
|
3454fed324 | ||
|
|
a64ffda688 | ||
|
|
8400da9934 | ||
|
|
6d89020f80 | ||
|
|
9c56c49e73 | ||
|
|
acb798e544 | ||
|
|
c5720a15c7 | ||
|
|
90709b332a | ||
|
|
81f17d10c8 | ||
|
|
773de38bd9 | ||
|
|
ae8bdd473c | ||
|
|
adfc5db3d2 | ||
|
|
a48704925d | ||
|
|
fa4beeee75 | ||
|
|
d8351772d3 | ||
|
|
68d1abdb85 | ||
|
|
7e8474a85a | ||
|
|
82da364b8b | ||
|
|
7fa91ec175 | ||
|
|
1d3a09d377 | ||
|
|
02563a35f0 | ||
|
|
d653f35bb7 | ||
|
|
a543627abd | ||
|
|
80f2ba7fca | ||
|
|
32bca64920 | ||
|
|
7fa1a84ec3 | ||
|
|
ab4bb26a0a | ||
|
|
4b8d258cff | ||
|
|
3c29aa6271 | ||
|
|
51464b4317 | ||
|
|
3f32a6b607 | ||
|
|
21aa1631a4 | ||
|
|
49968541fd | ||
|
|
cc143105b8 | ||
|
|
fed44e95b3 | ||
|
|
71ece56470 | ||
|
|
204a1de3fd | ||
|
|
80ddf4aecf | ||
|
|
12b4a666bc | ||
|
|
cfdbaf331e | ||
|
|
052d350b19 | ||
|
|
2ca18a7ee5 | ||
|
|
7dbe5f4640 | ||
|
|
432ecd1b6a | ||
|
|
7d9aa5b716 | ||
|
|
43267dc892 | ||
|
|
3ec6c26e6c | ||
|
|
7de684668b | ||
|
|
2fec463542 | ||
|
|
1affc641c4 | ||
|
|
4741d7bfe2 | ||
|
|
aea99a1222 | ||
|
|
7c8038e2da | ||
|
|
673336297d | ||
|
|
ee4b7042ce | ||
|
|
310ab7d41b | ||
|
|
fc1796f3e8 | ||
|
|
d8926ea5eb | ||
|
|
0c1e428c7d | ||
|
|
bcd97f5887 | ||
|
|
0faf86c2b9 | ||
|
|
b30957c89c | ||
|
|
dbbcbc3616 | ||
|
|
1889150013 | ||
|
|
14f9cdde6b | ||
|
|
3ab0691eec | ||
|
|
1e073a196f | ||
|
|
7b60e3916c | ||
|
|
c486c5bf5b | ||
|
|
fc0b6d143a | ||
|
|
5f4252bcd2 | ||
|
|
a588aef921 | ||
|
|
b70df57f7b | ||
|
|
e813c93e08 | ||
|
|
900c4977cc | ||
|
|
bb39fffab9 | ||
|
|
f52aefb341 | ||
|
|
aecb5630cb | ||
|
|
0f0245625a | ||
|
|
8583689fa4 | ||
|
|
7a1e026bb5 | ||
|
|
64f04ee6db | ||
|
|
5c6f538b85 | ||
|
|
00aa83a498 | ||
|
|
e44848f8c4 | ||
|
|
5ea8950a13 | ||
|
|
184557bfed | ||
|
|
b4253210d2 | ||
|
|
8e1585aa8a | ||
|
|
dee49d7488 | ||
|
|
1ecde309e4 | ||
|
|
d62a738460 | ||
|
|
0cfd4fff62 | ||
|
|
8904127c10 | ||
|
|
0f1b1bb44d | ||
|
|
16f870aa41 | ||
|
|
16f729eb22 | ||
|
|
36f0bd432c | ||
|
|
457ab8b2ce | ||
|
|
1ebf5f3bcb | ||
|
|
a928a9640f | ||
|
|
cb302476b4 | ||
|
|
31726737df | ||
|
|
082be33cbd | ||
|
|
9aada2ef19 | ||
|
|
4066b2767b | ||
|
|
de43bddc1a | ||
|
|
c46f48abec | ||
|
|
4acbf7b90d | ||
|
|
cbc1a58e93 | ||
|
|
1b5f33a435 | ||
|
|
41b4a63f2b | ||
|
|
d8fc2db910 | ||
|
|
dc11dea7cc | ||
|
|
6edfc56c9d | ||
|
|
5837a63942 | ||
|
|
3a28f456b1 | ||
|
|
4f6fc2675c | ||
|
|
c7da1821c3 | ||
|
|
1a8c3271da | ||
|
|
bd49e8e76f | ||
|
|
533699abe7 | ||
|
|
267ccc98d3 | ||
|
|
cd3c2fdb49 | ||
|
|
5cbc319e96 | ||
|
|
d435dcdca4 | ||
|
|
e5ab456df3 | ||
|
|
08bf4f74a9 | ||
|
|
a838a03412 | ||
|
|
ad4e597f74 | ||
|
|
ee3610a2d2 | ||
|
|
88b75b57d0 | ||
|
|
aa4c7055f8 | ||
|
|
4b70f9d213 | ||
|
|
79d2d1c201 | ||
|
|
406bda9b95 | ||
|
|
405f1dd027 | ||
|
|
51f349d504 | ||
|
|
4f201d1e85 | ||
|
|
03cfef100f | ||
|
|
ff89b491dd | ||
|
|
7552dff0e5 | ||
|
|
110589c0f3 | ||
|
|
3400398230 | ||
|
|
5c244e9a8c | ||
|
|
4e2f4e2091 | ||
|
|
e69bef3ce3 | ||
|
|
c1c0fc79bc | ||
|
|
02a77f6797 | ||
|
|
77b316cdfb | ||
|
|
2abfc7b87b | ||
|
|
050f0c3d8f | ||
|
|
90e6c727da | ||
|
|
d3d9a04e62 | ||
|
|
a66051216f | ||
|
|
0debba0f6e | ||
|
|
f2bd2c318c | ||
|
|
21c42819c7 | ||
|
|
5899a272ef | ||
|
|
27b4c62bc1 | ||
|
|
b227fddec7 | ||
|
|
2c1f1de33c | ||
|
|
c26622cf8f | ||
|
|
9e91873428 | ||
|
|
7363d50a1e | ||
|
|
15213a041d | ||
|
|
fb70a34c80 | ||
|
|
fbf76c6d21 | ||
|
|
811af02f56 | ||
|
|
bc00c38f9d | ||
|
|
4658bd8208 | ||
|
|
6eb1caa417 | ||
|
|
41efc1376e | ||
|
|
0f35016773 | ||
|
|
c641ca90a9 | ||
|
|
87c88fcb27 | ||
|
|
4f80a129f1 | ||
|
|
6987f2ba82 | ||
|
|
563db580ae | ||
|
|
125daea16a | ||
|
|
fd2c6b8a4b | ||
|
|
5b1db917bc | ||
|
|
8780e23ed3 | ||
|
|
be492ed108 | ||
|
|
24da14f4f7 | ||
|
|
03d2fb450f | ||
|
|
849b0563ce | ||
|
|
16a99ad515 | ||
|
|
d93172bee8 | ||
|
|
25429af122 | ||
|
|
4bfd104a23 | ||
|
|
7745067d99 | ||
|
|
b19d3629b9 | ||
|
|
84c519df09 | ||
|
|
737a56a030 | ||
|
|
67cba251c8 | ||
|
|
0bc511715b | ||
|
|
27ce80544f | ||
|
|
04f627c2af | ||
|
|
12b6959ea2 | ||
|
|
7519768cb1 | ||
|
|
9af470c92d | ||
|
|
ac8c1d0a01 | ||
|
|
921d01b59d | ||
|
|
8aa4a66ba0 | ||
|
|
2e7153d8d6 | ||
|
|
70b5a81a29 | ||
|
|
83fd822e8b | ||
|
|
e72eef421b | ||
|
|
016063c810 | ||
|
|
38f19981b2 | ||
|
|
40dd968f13 | ||
|
|
3cef348f30 | ||
|
|
b293b16007 | ||
|
|
f5f43db2da | ||
|
|
029555d192 | ||
|
|
fa4d202e71 | ||
|
|
a8ebfd7a92 | ||
|
|
b19e5720cc | ||
|
|
a254f5a3a8 | ||
|
|
143c735f96 | ||
|
|
dd3752956a | ||
|
|
bf15cac980 | ||
|
|
951bad46e0 | ||
|
|
716225cd2f | ||
|
|
bbc618b8f9 | ||
|
|
11ead56d6d | ||
|
|
e972ae4afa | ||
|
|
0709065f50 | ||
|
|
1a61b01315 | ||
|
|
c643b6ff16 | ||
|
|
b3f5b4932c | ||
|
|
b3f5f2f75f | ||
|
|
62288907dd | ||
|
|
cdbdcec715 | ||
|
|
ccf78448aa | ||
|
|
ed001e0cfb | ||
|
|
26382713c2 | ||
|
|
d6bc5c35a7 | ||
|
|
dc03f003ac | ||
|
|
7aa2104596 | ||
|
|
460cfba6ff | ||
|
|
c8b93d6573 | ||
|
|
3f5f96ac91 | ||
|
|
f37481f843 | ||
|
|
7c6b991de7 | ||
|
|
82460aa49f | ||
|
|
7e7b403043 | ||
|
|
c3f6502be2 | ||
|
|
e5217e6ce9 | ||
|
|
c98cb1d6f9 | ||
|
|
ba6f2b0467 | ||
|
|
23465ad985 | ||
|
|
7886a14b74 | ||
|
|
466b6a23cd | ||
|
|
4a04f73434 | ||
|
|
134cb6a017 | ||
|
|
8d036c4b7c | ||
|
|
c64ad78c7b | ||
|
|
4a043a915f | ||
|
|
8ff0d99092 | ||
|
|
2e47cb12c4 | ||
|
|
ff6f1655f0 | ||
|
|
0120f396ac | ||
|
|
231fffe594 | ||
|
|
b5ba94f1de | ||
|
|
cbf79769d3 | ||
|
|
e67afc35b8 | ||
|
|
5e73007b1d | ||
|
|
2d9876a261 | ||
|
|
125eb01e03 | ||
|
|
ccb13205f4 | ||
|
|
6f23e91e33 | ||
|
|
1bd8a322f5 | ||
|
|
362e73bea8 | ||
|
|
9f8c2b3b56 | ||
|
|
303d67aed2 | ||
|
|
6a7f6cdacd | ||
|
|
5715342fe0 | ||
|
|
38a0d15190 | ||
|
|
56f763a4a8 | ||
|
|
a2eb14f3b3 | ||
|
|
05c63af7c4 | ||
|
|
1f59701c46 | ||
|
|
ec3191f502 | ||
|
|
32b5654a6e | ||
|
|
674091424e | ||
|
|
6ad336743d | ||
|
|
c882568ccd | ||
|
|
f6b2899dd2 | ||
|
|
bccd4ef2f7 | ||
|
|
94c240a026 | ||
|
|
c50a0cf7bf | ||
|
|
c37f7abb79 | ||
|
|
432ce9b1de | ||
|
|
054323c2bc | ||
|
|
a8770aa606 | ||
|
|
7d5442e103 | ||
|
|
eab32f2e5d | ||
|
|
d42c0f1dc5 | ||
|
|
6ad1e4d99a | ||
|
|
7350144ab3 | ||
|
|
54c591bd9d | ||
|
|
217d88f21f | ||
|
|
394e3be482 | ||
|
|
575fbad254 | ||
|
|
fa0aa91bf9 | ||
|
|
d7f024c510 | ||
|
|
bc5a53574c | ||
|
|
3e641e2147 | ||
|
|
de7e4f0db7 | ||
|
|
a1cb1d78bd | ||
|
|
1178f2c1ab | ||
|
|
76f277eeb4 | ||
|
|
4000390dcd | ||
|
|
30df709736 | ||
|
|
8cd17ce045 | ||
|
|
1bfbced258 | ||
|
|
6ac5980a17 | ||
|
|
2e24adae89 | ||
|
|
188b94cb3e | ||
|
|
c48733e34f | ||
|
|
f36db9bb04 | ||
|
|
30dd29e251 | ||
|
|
6cf1acfb48 | ||
|
|
a7b09d3d1c | ||
|
|
8fc3768166 | ||
|
|
b07bddf742 | ||
|
|
220f957cd8 | ||
|
|
8ce48d83eb | ||
|
|
200cdb6b0a | ||
|
|
d9fb40203a | ||
|
|
2d9e972195 | ||
|
|
97a1a04116 | ||
|
|
493cd866f1 | ||
|
|
063d369672 | ||
|
|
a0fae8dacc | ||
|
|
bc840b69d5 | ||
|
|
85301853d6 | ||
|
|
7cd53fb452 | ||
|
|
538ddf7af2 | ||
|
|
d5afa181f7 | ||
|
|
8ed4124184 | ||
|
|
160242a74f | ||
|
|
81b83bc904 | ||
|
|
2a716b7a7a | ||
|
|
63272541eb | ||
|
|
464767c5fd | ||
|
|
a9c3ca8606 | ||
|
|
86dd677e0c | ||
|
|
666f700a93 | ||
|
|
b70bf938c2 | ||
|
|
d5cf41e043 | ||
|
|
b7a1954c33 | ||
|
|
6520589a37 | ||
|
|
f445b0178a | ||
|
|
f618065f7c | ||
|
|
f0be48ff90 | ||
|
|
bb922d577d | ||
|
|
990809cc21 | ||
|
|
bfcc466647 | ||
|
|
3d2558bde6 | ||
|
|
1aac0b10c9 | ||
|
|
e5ff85b63c | ||
|
|
f0bb5b84f9 | ||
|
|
07b50f6c69 | ||
|
|
61b3aaaa07 | ||
|
|
b5119d7958 | ||
|
|
d3e72e4344 | ||
|
|
60512ffa09 | ||
|
|
b1a252a64d | ||
|
|
fb90b64bac | ||
|
|
6e7a398263 | ||
|
|
44d2d9b1e8 | ||
|
|
8302ed44aa | ||
|
|
7e12aea1d8 | ||
|
|
20346b0da4 | ||
|
|
e0e65cbdf9 | ||
|
|
9d2d58c4b6 | ||
|
|
0c461c3859 | ||
|
|
0d38bd9b3b | ||
|
|
2f02e49b9f | ||
|
|
064e8a7c68 | ||
|
|
e4dd269609 | ||
|
|
19dd59f38c | ||
|
|
37501d9bc7 | ||
|
|
89f9561d10 | ||
|
|
8af3f91e78 | ||
|
|
0661fd6f7c | ||
|
|
edd003b62a | ||
|
|
10cc87e422 | ||
|
|
0470f648c6 | ||
|
|
777360149d | ||
|
|
aa7774b82b | ||
|
|
d44da875e7 | ||
|
|
f9ad73598b | ||
|
|
952fe98796 | ||
|
|
579912e52f | ||
|
|
1b5ec3e3ca | ||
|
|
fb4e6ac923 | ||
|
|
3560dc4be6 | ||
|
|
b002ea9a20 | ||
|
|
540317ea2b | ||
|
|
142d1951d2 | ||
|
|
cf06ba6d13 | ||
|
|
a8d800572e | ||
|
|
5525ea45a4 | ||
|
|
3120958a17 | ||
|
|
052726ed50 | ||
|
|
8397196fbb | ||
|
|
8547611479 | ||
|
|
fe45f28204 | ||
|
|
861067412f | ||
|
|
7eca886608 | ||
|
|
79b6f9e89e | ||
|
|
3d17c06777 | ||
|
|
d6c08fb79f | ||
|
|
ef02b20811 | ||
|
|
8bf46a665e | ||
|
|
c4fca2aa61 | ||
|
|
45310d0cf6 | ||
|
|
87268c2297 | ||
|
|
032e435490 | ||
|
|
78c43edcac | ||
|
|
f32d34b965 | ||
|
|
8a7ff6a6fd | ||
|
|
6c48aa5fae | ||
|
|
d82547acd3 | ||
|
|
441f9cc2ee | ||
|
|
9f4fc8ad33 | ||
|
|
d1e31261fe | ||
|
|
05dd9acba8 | ||
|
|
9270485723 | ||
|
|
e93975cb46 | ||
|
|
cbdaf4827f | ||
|
|
f2c28d287a | ||
|
|
90c228abca | ||
|
|
505e6bec9e | ||
|
|
ee027f237b | ||
|
|
3ae0d6f421 | ||
|
|
13b66a77c7 | ||
|
|
ed70836057 | ||
|
|
a68e52c2e3 | ||
|
|
ea37b89753 | ||
|
|
5d89aa06f7 | ||
|
|
ead034e638 | ||
|
|
a294838bcd | ||
|
|
1c03d1e87d | ||
|
|
f8804c8a56 | ||
|
|
7c444dea6e | ||
|
|
6d91d270d6 | ||
|
|
dd1cec4196 | ||
|
|
d1a8a4481e | ||
|
|
5921ffaa36 | ||
|
|
cf47b68c1e | ||
|
|
eeb8d0dbcd | ||
|
|
b6fa22bd84 | ||
|
|
a0ef27a0cd | ||
|
|
22eb831a71 | ||
|
|
01ab9acd14 | ||
|
|
74fcbb382f | ||
|
|
9836b1dddd | ||
|
|
e304d0f8ee | ||
|
|
ab7b38d4b9 | ||
|
|
a464dc681a | ||
|
|
eaf675dc92 | ||
|
|
57068e526c | ||
|
|
c14a00eec9 | ||
|
|
219c42522f | ||
|
|
e3a0f15837 | ||
|
|
a6bb27483b | ||
|
|
7ada7def9e | ||
|
|
af384d9aa6 | ||
|
|
223c129b6b | ||
|
|
421c4ae907 | ||
|
|
4907f610d6 | ||
|
|
f9d1bbbffb | ||
|
|
60589fc1cb | ||
|
|
5121316036 | ||
|
|
68bdfa9d0e | ||
|
|
97b816200d | ||
|
|
059a643188 | ||
|
|
7facad41b7 | ||
|
|
3ee59e454c | ||
|
|
43da1686da | ||
|
|
6d643f92b7 | ||
|
|
559a01f585 | ||
|
|
ba8e3f11e2 | ||
|
|
fd8a53ca3d | ||
|
|
8707aafaf7 | ||
|
|
e5a28bfd8d | ||
|
|
6e04d66a35 | ||
|
|
86e8b3b4bd | ||
|
|
a26ead035a | ||
|
|
704be54c3a | ||
|
|
2406152576 | ||
|
|
af260b5a64 | ||
|
|
4efa96df21 | ||
|
|
26bef5d209 | ||
|
|
cd6e0ff88a | ||
|
|
2ca979425f | ||
|
|
8d822ebdb4 | ||
|
|
bc5b5afcbf | ||
|
|
b373c53ce4 | ||
|
|
bc4b89c21a | ||
|
|
e10c287c93 | ||
|
|
ce42d53a09 | ||
|
|
a4f9d6d98b | ||
|
|
eebd03701a | ||
|
|
d5287682d1 | ||
|
|
7c567e3cbd | ||
|
|
58352ea69d | ||
|
|
de64b35359 | ||
|
|
7df8e1eab2 | ||
|
|
8b62127770 | ||
|
|
3158955198 | ||
|
|
d9d97bd17b | ||
|
|
94f6380d69 | ||
|
|
2ee821656f | ||
|
|
7556abb92d | ||
|
|
9d3a85d434 | ||
|
|
147d301f10 | ||
|
|
75a89c5983 | ||
|
|
2289968634 | ||
|
|
ca252804c6 | ||
|
|
7c25d83f1c | ||
|
|
8ce30c6a69 | ||
|
|
9fcaff749f | ||
|
|
3ac1475262 | ||
|
|
ad64bab5b2 | ||
|
|
f02998b106 | ||
|
|
127fe6ecf0 | ||
|
|
888ab0c89c | ||
|
|
2efd8ef52d | ||
|
|
6ad933982f | ||
|
|
854258f376 | ||
|
|
26f2d7fbae | ||
|
|
3952920492 | ||
|
|
c2001a7259 | ||
|
|
78f911ac19 | ||
|
|
0f2a7226fb | ||
|
|
f8d0ebe92f | ||
|
|
ba6ba7d4be | ||
|
|
58e6f660f3 | ||
|
|
cd482ca655 | ||
|
|
e43b56eb38 | ||
|
|
0c2d767f6f | ||
|
|
02e697032f | ||
|
|
07dc262690 | ||
|
|
6bf8d5b936 | ||
|
|
93858bf262 | ||
|
|
f64da46a98 | ||
|
|
2052a029ee | ||
|
|
c6aafff701 | ||
|
|
26f0f92210 | ||
|
|
bdc4ae2b86 | ||
|
|
9ca9341384 | ||
|
|
7f4f8b7c7d | ||
|
|
8870526457 | ||
|
|
f057e1e17a | ||
|
|
8561c9c5a6 | ||
|
|
23199719d9 | ||
|
|
a606ef0700 | ||
|
|
a234de1ee3 | ||
|
|
d266898617 | ||
|
|
69b5929c5a | ||
|
|
316c72a4ae | ||
|
|
9da88eec3e | ||
|
|
f10d9996d2 | ||
|
|
58ec9d3a73 | ||
|
|
4a503ba1ad | ||
|
|
2d096a569a | ||
|
|
e44ea5038e | ||
|
|
b111aa0111 | ||
|
|
773d24ebf7 | ||
|
|
bd371af0b3 | ||
|
|
9d79c72c17 | ||
|
|
a86aaef4d0 | ||
|
|
e463244db3 | ||
|
|
9e10b75f55 | ||
|
|
294091ce60 | ||
|
|
da6dd2dc92 | ||
|
|
40b9de66c7 | ||
|
|
aac985951a | ||
|
|
662cc5fe20 | ||
|
|
e1e62d97a8 | ||
|
|
a29cc48fec | ||
|
|
42af040fbd | ||
|
|
d383d617c2 | ||
|
|
9d04c21cc2 | ||
|
|
ed8039e223 | ||
|
|
f05743bf57 | ||
|
|
c6be661bb5 | ||
|
|
c84508ae9f | ||
|
|
f06fe1ea98 | ||
|
|
77f2cd6513 | ||
|
|
d16fb79708 | ||
|
|
baad86bcd7 | ||
|
|
8808aad529 | ||
|
|
6d7eaba845 | ||
|
|
4259b17b91 | ||
|
|
828ea700e8 | ||
|
|
7f22685fa3 | ||
|
|
40db9dff3b | ||
|
|
fa82264604 | ||
|
|
ae467aa42e | ||
|
|
c38f29ce56 | ||
|
|
67cc09416f | ||
|
|
f2a75fbfc7 | ||
|
|
b1fb09e183 | ||
|
|
cd0082c630 | ||
|
|
f78527d1e3 | ||
|
|
1f642238a7 | ||
|
|
6fe06cad98 | ||
|
|
2335fdbb5a | ||
|
|
1b6f7c3eb7 | ||
|
|
67f0d26d17 | ||
|
|
8574bcd494 | ||
|
|
02cc77cd82 | ||
|
|
d8782ce5fd | ||
|
|
dedc2986c6 | ||
|
|
74cdc0005a | ||
|
|
a756cd9565 | ||
|
|
ae27c3f4c5 | ||
|
|
6d41f36266 | ||
|
|
57cbcdf2ec | ||
|
|
455fd180b1 | ||
|
|
78abcd7df7 | ||
|
|
23dce21647 | ||
|
|
e6177c3349 | ||
|
|
e2adb82e29 | ||
|
|
bb472206de | ||
|
|
d87cf5146e | ||
|
|
87eb5cbced | ||
|
|
181edf4b53 | ||
|
|
dfa53cb88e | ||
|
|
d079cda174 | ||
|
|
4265e71d6f | ||
|
|
f66a72c66b | ||
|
|
9be90bd1c9 | ||
|
|
106e535577 | ||
|
|
194be51f05 | ||
|
|
a862e363ea | ||
|
|
2e64afca27 | ||
|
|
51cda0be2a | ||
|
|
4da3291157 | ||
|
|
52edabf2cb | ||
|
|
43a1a0f3ab | ||
|
|
e88524f274 | ||
|
|
7a929fcd27 | ||
|
|
7087fdf6c0 | ||
|
|
67093a5143 | ||
|
|
3f34016888 | ||
|
|
1307633a84 | ||
|
|
1a53f07d80 | ||
|
|
672f678ed6 | ||
|
|
b924568f79 | ||
|
|
e6e9c21275 | ||
|
|
636f5d4a1d | ||
|
|
41a4b280ee | ||
|
|
27139bf41f | ||
|
|
12ba1957d0 | ||
|
|
9b9d189a33 | ||
|
|
7c3af4f56f | ||
|
|
880ce080b7 | ||
|
|
6e84a03a35 | ||
|
|
a9f6556454 | ||
|
|
2722211ba3 | ||
|
|
e2e5cddcaa | ||
|
|
40280fa6cf | ||
|
|
8b7718fbdc | ||
|
|
fe9299ceff | ||
|
|
b44957ad91 | ||
|
|
a049f972ec | ||
|
|
069895d26b | ||
|
|
0e756e4377 | ||
|
|
ee7282ce0d | ||
|
|
d026367334 | ||
|
|
7244dc4511 | ||
|
|
56f61a6d59 | ||
|
|
4d5f610029 | ||
|
|
c94b4466d5 | ||
|
|
61f9e79ec9 | ||
|
|
cf797657ed | ||
|
|
c597538b40 | ||
|
|
43f964e28d | ||
|
|
8283f23651 | ||
|
|
7cc25f91ff | ||
|
|
5d2506e697 | ||
|
|
14908b7f28 | ||
|
|
2e122e1509 | ||
|
|
486b5b6bfc | ||
|
|
88a2f128ec | ||
|
|
45c139cfb3 | ||
|
|
3a111e5d74 | ||
|
|
fc0c5e7359 | ||
|
|
2ccfb71d12 | ||
|
|
e8a5a9b1e8 | ||
|
|
ec3568bd97 | ||
|
|
a67a881715 | ||
|
|
7a048f004d | ||
|
|
330b6a0482 | ||
|
|
aa2e4d92e0 | ||
|
|
0ea66a1275 | ||
|
|
aafff8fd5c | ||
|
|
5ac2a69940 | ||
|
|
8278a12af9 | ||
|
|
e88dd9b08b | ||
|
|
bbea6564fc | ||
|
|
1ca8d7ad45 | ||
|
|
67958f7fa7 | ||
|
|
ab9c527274 | ||
|
|
36ff991960 | ||
|
|
59d38f876a | ||
|
|
5c5c6a965c | ||
|
|
74aafe6a10 | ||
|
|
f860a2fbd6 | ||
|
|
87bcf739ee | ||
|
|
db6db51742 | ||
|
|
981be7956b | ||
|
|
8c10aa575c | ||
|
|
17b316b94b | ||
|
|
8921b4f9d1 | ||
|
|
c3f111a56c | ||
|
|
cf16d81fa4 | ||
|
|
2beb763b4f | ||
|
|
69ae879c58 | ||
|
|
08fee9a284 | ||
|
|
f89da17827 | ||
|
|
ea26da0be7 | ||
|
|
1f3d3970f6 | ||
|
|
c9a71a7176 | ||
|
|
7ed8833fd5 | ||
|
|
250318329f | ||
|
|
14c538c9c7 | ||
|
|
abe4c57663 | ||
|
|
9fb351a139 | ||
|
|
0d0ccacdf3 | ||
|
|
c8858f85d8 | ||
|
|
d1bc46ffad | ||
|
|
32e5848f34 | ||
|
|
be36c0769a | ||
|
|
f9e63dfd65 | ||
|
|
fa05dac5ae | ||
|
|
430dd3ae05 | ||
|
|
664fc76ac7 | ||
|
|
37d6cc07a7 | ||
|
|
d79b6cd8dc | ||
|
|
d6510f9578 | ||
|
|
59e8302c9d | ||
|
|
3422bd9b94 | ||
|
|
a3f3c7ba24 | ||
|
|
82ecebb393 | ||
|
|
6ba0b029e6 | ||
|
|
604c9dacdb | ||
|
|
1a619522ee | ||
|
|
88615fbff1 | ||
|
|
d4f8f67173 | ||
|
|
174a0a2efc | ||
|
|
12b5494906 | ||
|
|
aa0f06d6b7 | ||
|
|
0c47685e02 | ||
|
|
e0ca4347be | ||
|
|
e65d9408ee | ||
|
|
d8558a3af3 | ||
|
|
72eedb1c98 | ||
|
|
3c5cf9500d | ||
|
|
7a1f3177c9 | ||
|
|
f8da8b0261 | ||
|
|
393cb7fd7d | ||
|
|
e74e1256d4 | ||
|
|
96abd70c13 | ||
|
|
1f9d9c3176 | ||
|
|
94efeb2845 | ||
|
|
a73834436f | ||
|
|
85f4aeca05 | ||
|
|
7db84a961a | ||
|
|
74e95e88d8 | ||
|
|
80d9baa9e8 | ||
|
|
751995ab95 | ||
|
|
5ca6e2910a | ||
|
|
071d05465a | ||
|
|
11a9536271 | ||
|
|
41a7203c28 | ||
|
|
543a58bb87 | ||
|
|
b2b95cad20 | ||
|
|
eabec967ec | ||
|
|
e42b152037 | ||
|
|
da599e3f1a | ||
|
|
4c7b0b935b | ||
|
|
c400876df1 | ||
|
|
a960e2ef48 | ||
|
|
4fe272a7fb | ||
|
|
a7d9f248ea | ||
|
|
06aa689383 | ||
|
|
835b0c44cd | ||
|
|
54b6f8a4ae | ||
|
|
18787ebe8f | ||
|
|
47e8fcf37e | ||
|
|
5958b78459 | ||
|
|
9d9697b366 | ||
|
|
6585e18571 | ||
|
|
6f1b4292f0 | ||
|
|
ef9ef03b1f | ||
|
|
c4bea3dfe4 | ||
|
|
eaa9a1e33b | ||
|
|
3e19298c9e | ||
|
|
2a96ce97ee | ||
|
|
8cfe901391 | ||
|
|
30f1ee7a1f | ||
|
|
46ff830daa | ||
|
|
828cd6fd0b | ||
|
|
ecb67a1ed1 | ||
|
|
0ef843f138 | ||
|
|
eb79d83051 | ||
|
|
ca1a11493d | ||
|
|
69bb086ba5 | ||
|
|
11a5ee821b | ||
|
|
a8a85143f6 | ||
|
|
e2cc328eef | ||
|
|
344d10a8e3 | ||
|
|
681643ea9e | ||
|
|
fa947e02ca | ||
|
|
cd289843f7 | ||
|
|
b123392592 | ||
|
|
ccbb5c3e01 | ||
|
|
49b63e084f | ||
|
|
107321e385 | ||
|
|
1d214b4aed | ||
|
|
2e1347aba4 | ||
|
|
9ddb5931fb | ||
|
|
913064d6cc | ||
|
|
fb45b8a5c9 | ||
|
|
f5c9056430 | ||
|
|
0e39b59700 | ||
|
|
552af5455e | ||
|
|
8759bc1b41 | ||
|
|
09384df32c | ||
|
|
20538516b9 | ||
|
|
0759421d11 | ||
|
|
bf7417981f | ||
|
|
dba41e2e4a | ||
|
|
bc6472bb9e | ||
|
|
d4bd947bf5 | ||
|
|
d8e8eabf60 | ||
|
|
a70443af31 | ||
|
|
3f221e2edb | ||
|
|
56504534d8 | ||
|
|
80a45c91f9 | ||
|
|
3f695fdfaf | ||
|
|
88433bca22 | ||
|
|
34689eb2d2 | ||
|
|
211aea1441 | ||
|
|
74a46788cd | ||
|
|
7213c26798 | ||
|
|
fa1fb47d75 | ||
|
|
848ed14788 | ||
|
|
4c8a5dfb05 | ||
|
|
4f61ba766d | ||
|
|
b9eeb6e6eb | ||
|
|
d5fa2af353 | ||
|
|
a877926f08 | ||
|
|
3e4e6f7ced | ||
|
|
936eb43c0e | ||
|
|
bb66cfa780 | ||
|
|
1d626cb6ac | ||
|
|
580346f4a7 | ||
|
|
0fbcf64108 | ||
|
|
267faa3851 | ||
|
|
fe50481f7b | ||
|
|
759616abd4 | ||
|
|
eb8fd07900 | ||
|
|
c99559dbe9 | ||
|
|
966c4244cb | ||
|
|
81283f8bcb | ||
|
|
8b84e5b3f9 | ||
|
|
e1d5ddb478 | ||
|
|
2da0322329 | ||
|
|
fefb35c782 | ||
|
|
b2433a664c | ||
|
|
adad4279f3 | ||
|
|
3ca0a39a35 | ||
|
|
52594e64d0 | ||
|
|
3364c1b893 | ||
|
|
0801b3f495 | ||
|
|
657f00fe36 | ||
|
|
044c81b644 | ||
|
|
507d8fdc6f | ||
|
|
31e29e62f4 | ||
|
|
dfcb572985 | ||
|
|
1d324176d1 | ||
|
|
37b3190752 | ||
|
|
d51265d48f | ||
|
|
dc14ac7a8f | ||
|
|
fb52a24da3 | ||
|
|
fbafb19657 | ||
|
|
6c4438d8a9 | ||
|
|
be00737ced | ||
|
|
07b93dcf80 | ||
|
|
374c6a27db | ||
|
|
36c9e95969 | ||
|
|
a3142ee4e6 | ||
|
|
437caeb90f | ||
|
|
af49cace8d | ||
|
|
13b78d0d89 | ||
|
|
65c135b451 | ||
|
|
ec162f265f | ||
|
|
ba99696771 | ||
|
|
4eeea640f4 | ||
|
|
cc6f1020d0 | ||
|
|
316ddc2382 | ||
|
|
3452625fac | ||
|
|
426e0105a6 | ||
|
|
18f39aa012 | ||
|
|
631b635652 | ||
|
|
49695d47d3 | ||
|
|
5cec477131 | ||
|
|
a5d0300787 | ||
|
|
09b84c51ee | ||
|
|
afe53997bf | ||
|
|
c42e412c0a | ||
|
|
542e7feba8 | ||
|
|
dc085e0bd2 | ||
|
|
7c9517343c | ||
|
|
0b4fa41aff | ||
|
|
e138e2c880 | ||
|
|
0d6345e98b | ||
|
|
a84bcf597d | ||
|
|
4bbd4ba855 | ||
|
|
9e5b56b475 | ||
|
|
dd383037fd | ||
|
|
3cd24c0a51 | ||
|
|
8bfdb4ed0c | ||
|
|
41507d8129 | ||
|
|
317a98a5a9 | ||
|
|
1395794923 | ||
|
|
073e9d06ec | ||
|
|
fd1b04932a | ||
|
|
d4b625b48e | ||
|
|
82337dec44 | ||
|
|
f1d0700252 | ||
|
|
e1383a2d8e | ||
|
|
6773adc771 | ||
|
|
ee2afb35dd | ||
|
|
0adcda387a | ||
|
|
fc1664d9fc | ||
|
|
70bd35abe2 | ||
|
|
12768babdf | ||
|
|
bc2a1160b8 | ||
|
|
75542e8f5d | ||
|
|
fcb55f841a | ||
|
|
0efb67b51e | ||
|
|
54ebf2a699 | ||
|
|
154e601f4e | ||
|
|
4cca75b2e1 | ||
|
|
6d616e55ae | ||
|
|
95b1a640b6 | ||
|
|
ecc12c9ba1 | ||
|
|
9e50993c13 | ||
|
|
b32ec857b1 | ||
|
|
0de42d56fc | ||
|
|
6378ad69bb | ||
|
|
9616e9bf3b | ||
|
|
7c8b73bffb | ||
|
|
ae178c77bd | ||
|
|
2220651253 | ||
|
|
7fdd801479 | ||
|
|
27002ad1ea | ||
|
|
986dd2fac1 | ||
|
|
3965b490a9 | ||
|
|
b999e16406 | ||
|
|
7fb9bebd46 | ||
|
|
3b8a9dd6ec | ||
|
|
cfbee59152 | ||
|
|
b4db28fed2 | ||
|
|
c9aec3e866 | ||
|
|
1d1f8be260 | ||
|
|
38e6c0ad3f | ||
|
|
7ecf4ad54d | ||
|
|
1c02b4b9f4 | ||
|
|
d0119548c1 | ||
|
|
95ac6071b9 | ||
|
|
3a4e667078 | ||
|
|
afdefefbe4 | ||
|
|
5360c0c588 | ||
|
|
74a05a7f53 | ||
|
|
a68acf5c66 | ||
|
|
ce18c36ed9 | ||
|
|
8e39cf62e7 | ||
|
|
707d379b97 | ||
|
|
88a0a48b03 | ||
|
|
d51b90a880 | ||
|
|
e9912bcf8a | ||
|
|
4a5cc9f610 | ||
|
|
e29fc62b68 | ||
|
|
b55e1dcb5e | ||
|
|
6f4775a8ee | ||
|
|
c7e2f558a0 | ||
|
|
328860c8ba | ||
|
|
89ac111853 | ||
|
|
3d4f588a7f | ||
|
|
8f74bf314d | ||
|
|
0dd5ebbdbe | ||
|
|
2ae60767a3 | ||
|
|
64f31f70f9 | ||
|
|
23eacbd132 | ||
|
|
e9f16fca96 | ||
|
|
3d30de91f3 | ||
|
|
f68d2f7c7f | ||
|
|
f660d30138 | ||
|
|
b10276ff98 | ||
|
|
7d353bbe2a | ||
|
|
5696f91a1e | ||
|
|
3932e62fc7 | ||
|
|
729304aef5 | ||
|
|
40cce050e7 | ||
|
|
bb6ee71f08 | ||
|
|
0d0642fd67 | ||
|
|
08e6cf3dd2 | ||
|
|
044134eba0 | ||
|
|
9fa6fa522e | ||
|
|
d0cd98a63a | ||
|
|
88eae9dabb | ||
|
|
f2f1801c25 | ||
|
|
a9e351e00d | ||
|
|
d65841a2db | ||
|
|
9da57e7458 | ||
|
|
3a3fb98f79 | ||
|
|
503ed9c331 | ||
|
|
2784d65618 | ||
|
|
47ea69233b | ||
|
|
a884e37de1 | ||
|
|
0102a8665a | ||
|
|
cb63189f6b | ||
|
|
d77c83f4ba | ||
|
|
8cf3ac200b | ||
|
|
477877406a | ||
|
|
2bf2f34b12 | ||
|
|
7453c26ec4 | ||
|
|
b059ba69d6 | ||
|
|
36ca57a54e | ||
|
|
efa6678bcc | ||
|
|
b8f1850bba | ||
|
|
5268f55344 | ||
|
|
e44c9a000d | ||
|
|
ffc926bda5 | ||
|
|
07c1ba1f5e | ||
|
|
14168eadb2 | ||
|
|
58771fc41c | ||
|
|
1e06c66c77 | ||
|
|
c73771e3ce | ||
|
|
350d2bcd6e | ||
|
|
b2c523e56d | ||
|
|
5bc5abf0e7 | ||
|
|
44352e9ee4 | ||
|
|
7ccc609da2 | ||
|
|
ebc0168072 | ||
|
|
4ba7427fa0 | ||
|
|
9dc5335e3e | ||
|
|
d333de1980 | ||
|
|
96afa8bd2b | ||
|
|
797bbeabeb | ||
|
|
20cdab5546 | ||
|
|
6765234b60 | ||
|
|
4c27898ce7 | ||
|
|
d34ae0850c | ||
|
|
e9a85aa4e4 | ||
|
|
2a16fc74fd | ||
|
|
f65254680a | ||
|
|
d64edb6896 | ||
|
|
3f9ad8e104 | ||
|
|
1c772ef699 | ||
|
|
809b89b5af | ||
|
|
681e012fb5 | ||
|
|
3be36643a1 | ||
|
|
21e19ef69f | ||
|
|
69a42fc901 | ||
|
|
525789cd36 | ||
|
|
367d660c08 | ||
|
|
4d73e4d605 | ||
|
|
d86cc5bf42 | ||
|
|
5f262da09d | ||
|
|
82985a9488 | ||
|
|
afcdb65f80 | ||
|
|
6b66e86f40 | ||
|
|
cb145d290e | ||
|
|
167803d2a1 | ||
|
|
58a981d2f6 | ||
|
|
8963cd1fab | ||
|
|
6526de024a | ||
|
|
55cd5a9a78 | ||
|
|
3f4c283203 | ||
|
|
1e63e7c08b | ||
|
|
33fc3af775 | ||
|
|
6d9739165e | ||
|
|
7c5396ffb9 | ||
|
|
8319398957 | ||
|
|
a1509876de | ||
|
|
0f2cf51f43 | ||
|
|
e99ff4fdbc | ||
|
|
25431f32a2 | ||
|
|
6ba1fe7568 | ||
|
|
bfae92e307 | ||
|
|
9c5bf542d1 | ||
|
|
61161269d8 | ||
|
|
8fe004e98e | ||
|
|
09e5f17b5d | ||
|
|
db20e29af6 | ||
|
|
5f5c95cc68 | ||
|
|
68f3015712 | ||
|
|
240a697f6c | ||
|
|
5a0dc808fd | ||
|
|
befbf6bf13 | ||
|
|
2d5c21c457 | ||
|
|
25977d56c8 | ||
|
|
4dcf0b8ae0 | ||
|
|
9574d11dc8 | ||
|
|
3d4689756c | ||
|
|
90114514a9 | ||
|
|
7757e59e78 | ||
|
|
adb89e0121 | ||
|
|
b7a7953757 | ||
|
|
d25ef7eea4 | ||
|
|
30a82076ba | ||
|
|
860339c132 | ||
|
|
008723c62f | ||
|
|
9e0ce23a03 | ||
|
|
04ba433ca6 | ||
|
|
d884272ba8 | ||
|
|
e609c88334 | ||
|
|
e92a41fa3a | ||
|
|
df5f9f4a15 | ||
|
|
d9466cad0e | ||
|
|
150443b014 | ||
|
|
9e36af7916 | ||
|
|
85b8675e7a | ||
|
|
ae594ad92c | ||
|
|
8d6fedf817 | ||
|
|
f4f8fa7c94 | ||
|
|
fb5fbb8088 | ||
|
|
e06a807d30 | ||
|
|
6b09842cb6 | ||
|
|
ca813389dc | ||
|
|
e624171ba1 | ||
|
|
0bbfb28992 | ||
|
|
ee7bd695fd | ||
|
|
1cc17bfe7a | ||
|
|
8ae492dfeb | ||
|
|
e8789d7cb9 | ||
|
|
0053cd0d0d | ||
|
|
c32477a223 | ||
|
|
5e1e92626c | ||
|
|
7fee85c80a | ||
|
|
a0c25941a8 | ||
|
|
5eb468bce0 | ||
|
|
7f8dd0e939 | ||
|
|
28701cb9dd | ||
|
|
9b7f492c65 | ||
|
|
6eda79d02d | ||
|
|
fb5cf8e3ac | ||
|
|
55e128cced | ||
|
|
13056af8b2 | ||
|
|
972c52891d | ||
|
|
e10a8d95f6 | ||
|
|
97f2be348c | ||
|
|
2b21312b36 | ||
|
|
3a818b6d45 | ||
|
|
1709ab6810 | ||
|
|
ce925ba56f | ||
|
|
4ad14f6a2c | ||
|
|
579e48edbb | ||
|
|
6a08f2281a | ||
|
|
91729437a0 | ||
|
|
3af7af0b8f | ||
|
|
1ddd00433e | ||
|
|
de160bb2d1 | ||
|
|
ff62b6742b | ||
|
|
6da0af94df | ||
|
|
5d87a274a5 | ||
|
|
df9667a497 | ||
|
|
e3e2ad4ae5 | ||
|
|
ace4ba3171 | ||
|
|
0935ae330a | ||
|
|
9e02b13ab3 | ||
|
|
5a486a940c | ||
|
|
d05ae4b444 | ||
|
|
73b0610d89 | ||
|
|
57e862712a | ||
|
|
73aec9ce63 | ||
|
|
a9fefcf600 | ||
|
|
59ce67e2e5 | ||
|
|
2182209a8a | ||
|
|
e29a8b3a9c | ||
|
|
ace3f37af4 | ||
|
|
37b6899660 | ||
|
|
570b12ec13 | ||
|
|
ac286ef734 | ||
|
|
b3663b5da2 | ||
|
|
d761d8b168 | ||
|
|
fe7c6fee34 | ||
|
|
9906daeca7 | ||
|
|
5fb54095d2 | ||
|
|
3fdc678aae | ||
|
|
a0088ccce1 | ||
|
|
be081929f4 | ||
|
|
b0b086d473 | ||
|
|
6798af52b6 | ||
|
|
4d5ebafa6d | ||
|
|
ec8873b178 | ||
|
|
c45f205593 | ||
|
|
027b2063ba | ||
|
|
b531c4c2fe | ||
|
|
4b010df99e | ||
|
|
5e4dd4be9c | ||
|
|
04d5896c1c | ||
|
|
f947274626 | ||
|
|
f6939f71a7 | ||
|
|
25aa17ad89 | ||
|
|
05ee057db5 | ||
|
|
297e2747f3 | ||
|
|
77de233117 | ||
|
|
02b67edaf5 | ||
|
|
8549ccfd8c | ||
|
|
ffd16b55a6 | ||
|
|
d744c997d8 | ||
|
|
6b421cc354 | ||
|
|
37ec29b225 | ||
|
|
ca7f6a26b5 | ||
|
|
9b69d22d7e | ||
|
|
4ab4cf8532 | ||
|
|
3341b282b7 | ||
|
|
bb3b836dbb | ||
|
|
1873c67540 | ||
|
|
8fd8f23a6b | ||
|
|
f225051348 | ||
|
|
b2e3fdef0f | ||
|
|
c13810ebaa | ||
|
|
19a982cf69 | ||
|
|
746a47982b | ||
|
|
ddb5390d88 | ||
|
|
fce20e514e | ||
|
|
327cbf48f5 | ||
|
|
0f1f509be7 | ||
|
|
c8f0c7e9ed | ||
|
|
a7989077ab | ||
|
|
7e34737b2b | ||
|
|
af66ed2505 | ||
|
|
ea4068757d | ||
|
|
0a0659d737 | ||
|
|
b6df4680df | ||
|
|
e04090b477 | ||
|
|
c9fb6f7bdb | ||
|
|
ad6b05ae17 | ||
|
|
29b18d9ab7 | ||
|
|
ad309cdeae | ||
|
|
e4322a716c | ||
|
|
90886c0760 | ||
|
|
957beeb0e9 | ||
|
|
522ad4cca6 | ||
|
|
dc76b24e5f | ||
|
|
e3e3053f32 | ||
|
|
c8c3f20840 | ||
|
|
f6682aae77 | ||
|
|
0ba1b73395 | ||
|
|
4c995eb498 | ||
|
|
144cfe70bf | ||
|
|
855f26c43d | ||
|
|
f86e159536 | ||
|
|
243c4e1e83 | ||
|
|
9ae7f186bc | ||
|
|
f8d114be42 | ||
|
|
2c70251df1 | ||
|
|
d380db25be | ||
|
|
e8938b1069 | ||
|
|
4a28333039 | ||
|
|
ad7f2b2aec | ||
|
|
ff665b37cb | ||
|
|
ce73843014 | ||
|
|
bae6f653d1 | ||
|
|
eec6d09959 | ||
|
|
c5fa8ed321 | ||
|
|
abc16b919d | ||
|
|
2de7cd32ea | ||
|
|
098aa18538 | ||
|
|
cf6281a5a7 | ||
|
|
f00710a57e | ||
|
|
c953904343 | ||
|
|
ddd36338da | ||
|
|
d76b6f878e | ||
|
|
f25ef8d682 | ||
|
|
33a2c01ea2 | ||
|
|
9c637df77e | ||
|
|
29072797ca | ||
|
|
db69ceade6 | ||
|
|
b9c248e7e7 | ||
|
|
d533b59ee3 | ||
|
|
5ad2980d69 | ||
|
|
ca36ac2ba1 | ||
|
|
ba675d6a55 | ||
|
|
e4c5a4f61b | ||
|
|
a8e52ad89f | ||
|
|
8cf4fb53aa | ||
|
|
1769ae54e4 | ||
|
|
e545679265 | ||
|
|
981080500b | ||
|
|
636d28b784 | ||
|
|
188783ac1a | ||
|
|
ff650d50a2 | ||
|
|
78689645dc | ||
|
|
26970579b8 | ||
|
|
04b4f53488 | ||
|
|
c310941f69 | ||
|
|
c02f146791 | ||
|
|
a631200cca | ||
|
|
6207a3f999 | ||
|
|
0bd01824f6 | ||
|
|
4465e2c46b | ||
|
|
34b309b99a | ||
|
|
c6725884bc | ||
|
|
a31738f6f1 | ||
|
|
39a2867ea8 | ||
|
|
468c3df82d | ||
|
|
d5b017407d | ||
|
|
4b044bd8e1 | ||
|
|
aeaf64b467 | ||
|
|
a137f817f5 | ||
|
|
ff87145537 | ||
|
|
667481c371 | ||
|
|
af71605769 | ||
|
|
4657a3bd0f | ||
|
|
cb7366f472 | ||
|
|
bf803e241f | ||
|
|
8a8d023f90 | ||
|
|
5b3aa45e58 | ||
|
|
c4403c523f | ||
|
|
07b89b2bad | ||
|
|
68b79f97f3 | ||
|
|
815d72065c | ||
|
|
e0dc721324 | ||
|
|
2f873edc9c | ||
|
|
d5f46a846a | ||
|
|
f5a923b9d1 | ||
|
|
36bab6ef06 | ||
|
|
5273900b0e | ||
|
|
1451344221 | ||
|
|
8ed9f779cd | ||
|
|
f548a966f5 | ||
|
|
67ad31b8b2 | ||
|
|
35f46eaa3f | ||
|
|
ccfb125f02 | ||
|
|
f29e3ce8d5 | ||
|
|
bcb4646d6b | ||
|
|
5b8af30da1 | ||
|
|
30fadaed7f | ||
|
|
2b10ecfa37 | ||
|
|
f7eb2b697e | ||
|
|
c01282a322 | ||
|
|
0e3f18ed70 | ||
|
|
e5b1d30f1b | ||
|
|
6746b751c4 | ||
|
|
544c69c61c | ||
|
|
0ab66db7b9 | ||
|
|
f7669c201f | ||
|
|
0b3fbdba87 | ||
|
|
3dad837ca6 | ||
|
|
d7e78059b0 | ||
|
|
01f7abfc63 | ||
|
|
e57e89b9d5 | ||
|
|
bcc1f93370 | ||
|
|
b161d72326 | ||
|
|
66c013682f | ||
|
|
9f3ba737d6 | ||
|
|
f86f5ad224 | ||
|
|
8b6b3ff28a | ||
|
|
4a3dc2cea2 | ||
|
|
bd0cfffe23 | ||
|
|
8c5ea7ec55 | ||
|
|
412d1b0a01 | ||
|
|
642be502c0 | ||
|
|
5c4a42caa0 | ||
|
|
e847788569 | ||
|
|
86ca5b3f16 | ||
|
|
9b1fbdbca6 | ||
|
|
97391fd4b9 | ||
|
|
68eda78704 | ||
|
|
7c52a1c04b | ||
|
|
9d34fc394c | ||
|
|
973c9872f9 | ||
|
|
eef7ba48dd | ||
|
|
299ff2b23f | ||
|
|
f8bfea8bae | ||
|
|
e199c33c6e | ||
|
|
08296cd66d | ||
|
|
197b503f3e | ||
|
|
129eb178eb | ||
|
|
6b70f5e490 | ||
|
|
4aa6d39fd8 | ||
|
|
51adaf2c47 | ||
|
|
ea5b901bcc | ||
|
|
f1f19841bd | ||
|
|
655ad34414 | ||
|
|
017eecb8e8 | ||
|
|
b8e382b011 | ||
|
|
c9af358e4b | ||
|
|
3afcfe3330 | ||
|
|
b521d8564a | ||
|
|
53a13e8bc6 | ||
|
|
f3f5e2e162 | ||
|
|
ec41d849bb | ||
|
|
1d547fe273 | ||
|
|
b52d8fbebe | ||
|
|
b61a2c722c | ||
|
|
c455d2c1de | ||
|
|
77070f5ab9 | ||
|
|
8d5f7160ac | ||
|
|
b167ce2913 | ||
|
|
3ac15ca8d1 | ||
|
|
f703d4fc3e | ||
|
|
77c461fed7 | ||
|
|
a89c21b06a | ||
|
|
b74aa6b14c | ||
|
|
0c4a791111 | ||
|
|
1feedd4d9c | ||
|
|
0ec1808956 | ||
|
|
546e7cafa4 | ||
|
|
d9926a1c21 | ||
|
|
e50969e31c | ||
|
|
a6d9998e1d | ||
|
|
a42f9e4ee3 | ||
|
|
f16db6cd80 | ||
|
|
4943606f4a | ||
|
|
87629dda81 | ||
|
|
71928b473e | ||
|
|
a0bee9fa0a | ||
|
|
0defd927f3 | ||
|
|
6c41e8f63f | ||
|
|
fa67a4e956 | ||
|
|
bf9352fb26 | ||
|
|
7573d4e1ba | ||
|
|
bfb483898f | ||
|
|
f363788d76 | ||
|
|
714056f157 | ||
|
|
1abc96fa27 | ||
|
|
0fa98479ad | ||
|
|
02f2171010 | ||
|
|
a5e7d0a90f | ||
|
|
9fb5134f64 | ||
|
|
9aeb23dfe9 | ||
|
|
e59d8c9378 | ||
|
|
0616667688 | ||
|
|
9747cc9e58 | ||
|
|
7b44dea4b1 | ||
|
|
18aea922e9 | ||
|
|
7d194aceb6 | ||
|
|
2722b8a3df | ||
|
|
fd754ff8f8 | ||
|
|
b7738e7af3 | ||
|
|
99bebabac9 | ||
|
|
0ed48b364a | ||
|
|
b38b8b9c18 | ||
|
|
5434856136 | ||
|
|
aa1eb2f40d | ||
|
|
7260d7883c | ||
|
|
154250f551 | ||
|
|
3e4fb92cfb | ||
|
|
0da713e278 | ||
|
|
94cb1545b3 | ||
|
|
411527a240 | ||
|
|
7777057d35 | ||
|
|
dc5ef9ad01 | ||
|
|
7471f65d95 | ||
|
|
5d4b450c52 | ||
|
|
483b1f51c9 | ||
|
|
ecac7a629e | ||
|
|
21209ff46b | ||
|
|
716bdc36fd | ||
|
|
4f120f3714 | ||
|
|
dd20a3ce7e | ||
|
|
c727c86245 | ||
|
|
82b4ec22be | ||
|
|
501f1e6de0 | ||
|
|
414d5b648c | ||
|
|
a237e7f860 | ||
|
|
07a3bef25c | ||
|
|
da67260c95 | ||
|
|
2f51285349 | ||
|
|
ab9c9068d4 | ||
|
|
6b4d7d7315 | ||
|
|
64465c1318 | ||
|
|
a506adea41 | ||
|
|
f5ae1ce00b | ||
|
|
738d6f1040 | ||
|
|
ba372197fb | ||
|
|
bde27ccec3 | ||
|
|
d2cf74027c | ||
|
|
bc966577ff | ||
|
|
fdf4dff561 | ||
|
|
fab6cbed75 | ||
|
|
051eede1ed | ||
|
|
0696cac50b | ||
|
|
0c2485e86c | ||
|
|
7d696a7063 | ||
|
|
53573e950f | ||
|
|
1e99983263 | ||
|
|
5409e43fb5 | ||
|
|
f33f891c54 | ||
|
|
6e55552292 | ||
|
|
e569f82dd3 | ||
|
|
1a4940bbda | ||
|
|
22dd3c8048 | ||
|
|
04b7648e00 | ||
|
|
be0759d465 | ||
|
|
339d939873 | ||
|
|
c1950e40e6 | ||
|
|
ad76bad8fd | ||
|
|
55737e4ff6 | ||
|
|
f3b4ddee6c | ||
|
|
758b504cf3 | ||
|
|
416f7c2600 | ||
|
|
b9f02f22c4 | ||
|
|
b635610409 | ||
|
|
d4d4d6217f | ||
|
|
be47320a05 | ||
|
|
9f3ce7551a | ||
|
|
5f3b79e21d | ||
|
|
56c12bd1ea | ||
|
|
3a6da7c594 | ||
|
|
9909a80d6a | ||
|
|
a52cae1dba | ||
|
|
61b01f82ef | ||
|
|
75b847132a | ||
|
|
32ec672311 | ||
|
|
e2812f722d | ||
|
|
aa64a5328e | ||
|
|
59510f509a | ||
|
|
a35c7bc81a | ||
|
|
02769929b3 | ||
|
|
1a09003a6e | ||
|
|
a827714823 | ||
|
|
8f9e76ca42 | ||
|
|
478ace984a | ||
|
|
028fd268b8 | ||
|
|
876a095166 | ||
|
|
14c3ff58a4 | ||
|
|
2819b302c3 | ||
|
|
9fb82f9687 | ||
|
|
df80deb070 | ||
|
|
5fb72d7c8f | ||
|
|
313d1d5d83 | ||
|
|
b7d6133593 | ||
|
|
5b6bb114ad | ||
|
|
56f082c9d4 | ||
|
|
a1b798e555 | ||
|
|
c91e08fbfd | ||
|
|
f882434547 | ||
|
|
f1ca17f6a1 | ||
|
|
fe7cda57e4 | ||
|
|
a3f9abcbd1 | ||
|
|
77041e2cd2 | ||
|
|
14235f171b | ||
|
|
1f90e3ce7f | ||
|
|
676d8bb624 | ||
|
|
4bcaf5d306 | ||
|
|
70d3ad3ca1 | ||
|
|
46debfb8b5 | ||
|
|
9a4b572d34 | ||
|
|
ddc75cc46b | ||
|
|
dafd0bc49a | ||
|
|
2cb912e4f4 | ||
|
|
91a513e87d | ||
|
|
efdb41f2a6 | ||
|
|
26b850c15c | ||
|
|
9941735ae7 | ||
|
|
29e5dc4413 | ||
|
|
3a660c5527 | ||
|
|
738991494a | ||
|
|
ee4c3ff1b8 | ||
|
|
60486bcc46 | ||
|
|
79eed5182e | ||
|
|
5de0f3f36a | ||
|
|
9f316e11bd | ||
|
|
c6d8f6da70 | ||
|
|
73fd98b82e | ||
|
|
6cb725391d | ||
|
|
c13facdaca | ||
|
|
e259474362 | ||
|
|
7740855a78 | ||
|
|
d605170f9f | ||
|
|
4734af747b | ||
|
|
5d17731b73 | ||
|
|
07a7fde825 | ||
|
|
049abef2d4 | ||
|
|
7c60b50a39 | ||
|
|
4f83c60296 | ||
|
|
cd5817b67e | ||
|
|
a4d580a6f8 | ||
|
|
ca43e634b5 | ||
|
|
85324f80fe | ||
|
|
56a7fcf189 | ||
|
|
8cd15a02cd | ||
|
|
05ad335ae9 | ||
|
|
ea771c17c5 | ||
|
|
7faeb2ff2b | ||
|
|
65ebfb16c9 | ||
|
|
44a65fc5de | ||
|
|
f031eb1ef2 | ||
|
|
b50d79542c | ||
|
|
8351543c0f | ||
|
|
8add78ed5e | ||
|
|
4b3a3d6faa | ||
|
|
71d012fa61 | ||
|
|
114df1f137 | ||
|
|
00adf7ff17 | ||
|
|
3f0415fa24 | ||
|
|
348d0c944e | ||
|
|
e9ba5fcaf3 | ||
|
|
48097745f6 | ||
|
|
1091ca969f | ||
|
|
09d62cc630 | ||
|
|
a2ead993e6 | ||
|
|
b330aa8dd5 | ||
|
|
1b8053a618 | ||
|
|
70e5ab3fde | ||
|
|
f4490f6918 | ||
|
|
dadd987bf4 | ||
|
|
a1ced29279 | ||
|
|
791d6c1336 | ||
|
|
10abb07960 | ||
|
|
040a5ddad5 | ||
|
|
e7eb04954d | ||
|
|
09b00fa4e3 | ||
|
|
74842fd6d4 | ||
|
|
f23b47ba17 | ||
|
|
15eedfbb12 | ||
|
|
cfc25e08dc | ||
|
|
1583eb36e4 | ||
|
|
406452f019 | ||
|
|
12b139beaf | ||
|
|
2ed1c22227 | ||
|
|
eb23ef1747 | ||
|
|
970b10d01b | ||
|
|
61b938d6fa | ||
|
|
0c34555b02 | ||
|
|
83a988e2e4 | ||
|
|
91efe1cb5a | ||
|
|
735241f049 | ||
|
|
dd82370a80 | ||
|
|
dab052e53d | ||
|
|
322b061632 | ||
|
|
43847f2244 | ||
|
|
8f9ba96c59 | ||
|
|
10406c73b3 | ||
|
|
67a6a12916 | ||
|
|
139122c57f | ||
|
|
fdd76b3461 | ||
|
|
959d7ca9d0 | ||
|
|
e490e5d0ab | ||
|
|
3b568b0943 | ||
|
|
b2e1b38864 | ||
|
|
5c6fe97b35 | ||
|
|
2071070f39 | ||
|
|
89a78a5f3c | ||
|
|
bc23a6bb05 | ||
|
|
ac1983eae3 | ||
|
|
33c5fc95b4 | ||
|
|
6a953394f4 | ||
|
|
c152a88ff6 | ||
|
|
cbf57e7421 | ||
|
|
3f3ae48ff4 | ||
|
|
27ca0db7a6 | ||
|
|
49f34fbf68 | ||
|
|
fe6094a822 | ||
|
|
8a30c7992d | ||
|
|
70eb9335bd | ||
|
|
da80f91e1c | ||
|
|
cc60d193ce | ||
|
|
3a05c421e0 | ||
|
|
0f99410ba1 | ||
|
|
442dadd6fe | ||
|
|
da9dd58f34 | ||
|
|
bd01d80ffc | ||
|
|
7eda72d440 | ||
|
|
c75339edcc | ||
|
|
b0b7244b3a | ||
|
|
a9e849ff4f | ||
|
|
4c95a4d7c6 | ||
|
|
eac9fabd48 | ||
|
|
e2a08fa824 | ||
|
|
d403749d09 | ||
|
|
582c2105a9 | ||
|
|
f39a34ccfa | ||
|
|
08f5b9f1f9 | ||
|
|
793962c5b8 | ||
|
|
0d20130d07 | ||
|
|
617090cfda | ||
|
|
a9e604d51d | ||
|
|
e599b86424 | ||
|
|
da9e584921 | ||
|
|
e9d764d7ad | ||
|
|
6268955778 | ||
|
|
4ddfc6e9a2 | ||
|
|
dcbc05a9cd | ||
|
|
4c705334fa | ||
|
|
c12da599b9 | ||
|
|
f685a48008 | ||
|
|
7c15e41da5 | ||
|
|
7b540f0226 | ||
|
|
e29c22e662 | ||
|
|
f0d3b47ad8 | ||
|
|
bfe7533546 | ||
|
|
880bf17dae | ||
|
|
c9da3363a0 | ||
|
|
9bd4ed3e60 | ||
|
|
68fcc19565 | ||
|
|
8e4efd071e | ||
|
|
f2ad9f6fad | ||
|
|
968c5eb767 | ||
|
|
19424e95db | ||
|
|
0f9ef2506f | ||
|
|
1f1195975f | ||
|
|
87fce8ef27 | ||
|
|
d2a4f64fd6 | ||
|
|
a357d84dce | ||
|
|
48c96bbaea | ||
|
|
c666794ce3 | ||
|
|
1ee3df6976 | ||
|
|
d4dea53ae9 | ||
|
|
d477a9222e | ||
|
|
69a9d29190 | ||
|
|
e2425592b6 | ||
|
|
964b2661d8 | ||
|
|
8b65b524d5 | ||
|
|
f1ac2cd336 | ||
|
|
e73d0df2b6 | ||
|
|
af3f483924 | ||
|
|
809b0eb1f5 | ||
|
|
b5f3bfce92 | ||
|
|
aeb2baa495 | ||
|
|
afc70c120e | ||
|
|
ea9aff1d3f | ||
|
|
cecae419fb | ||
|
|
df4db50904 | ||
|
|
decc4002a0 | ||
|
|
5bb563e3bc | ||
|
|
9be82891b0 | ||
|
|
c97685fe6c | ||
|
|
358b671033 | ||
|
|
92a4bf4441 | ||
|
|
d7f80eab68 | ||
|
|
e30b356eb0 | ||
|
|
09a0803116 | ||
|
|
20ffedc745 | ||
|
|
0b1ad27ba8 | ||
|
|
6a1b2f0387 | ||
|
|
5465647c2e | ||
|
|
a2baeed329 | ||
|
|
92aa464edb | ||
|
|
da29298d4d | ||
|
|
afcf0795c4 | ||
|
|
394e2815db | ||
|
|
f3bbe4bb1f | ||
|
|
2a3a18a283 | ||
|
|
431c80f4f0 | ||
|
|
9ac18c39a1 | ||
|
|
d1b7473418 | ||
|
|
1ad52f131c | ||
|
|
8064bbbc3f | ||
|
|
64e898f6db | ||
|
|
fb34519b96 | ||
|
|
91fed47648 | ||
|
|
c05691b546 | ||
|
|
1732166328 | ||
|
|
8edde7a4b3 | ||
|
|
d11a0c9f14 | ||
|
|
7be2abe6b5 | ||
|
|
4a62cd4ad8 | ||
|
|
6d21b9448a | ||
|
|
2d1a3073f6 | ||
|
|
d7b9886387 | ||
|
|
1543e529f1 | ||
|
|
4043f320fe | ||
|
|
32b834aa04 | ||
|
|
b43ec3d6f0 | ||
|
|
316a25dead | ||
|
|
bfe020e06c | ||
|
|
5aae560683 | ||
|
|
86e72ffefb | ||
|
|
6416198e9f | ||
|
|
3c4cd9d08b | ||
|
|
6b3b8c6f2e | ||
|
|
fdb02ee5ca | ||
|
|
35f85ddd86 | ||
|
|
e30fa7d15e | ||
|
|
c476305149 | ||
|
|
45ad7696fe | ||
|
|
d86cd4e4b4 | ||
|
|
0e84d71559 | ||
|
|
5f14704eee | ||
|
|
a191db84f2 | ||
|
|
52dca859c7 | ||
|
|
e4d69f38b0 | ||
|
|
97fc001180 | ||
|
|
f544316314 | ||
|
|
ecdebb315f | ||
|
|
1f523be72d | ||
|
|
f2a20a0a80 | ||
|
|
e5a2efaa65 | ||
|
|
c44cb3246d | ||
|
|
9cfd9d7ce0 | ||
|
|
42a09ff17a | ||
|
|
66d90dd412 | ||
|
|
d5dfe7d457 | ||
|
|
0db0b4e302 | ||
|
|
635d6a19ef | ||
|
|
777844ae0c | ||
|
|
a10a4ad900 | ||
|
|
c330d694c7 | ||
|
|
73555f9088 | ||
|
|
e1ec65bd53 | ||
|
|
65b8e52d80 | ||
|
|
4b7a418e28 | ||
|
|
73d917b76e | ||
|
|
527a6003e2 | ||
|
|
26c731a382 | ||
|
|
8297563978 | ||
|
|
1da0526072 | ||
|
|
635a67afac | ||
|
|
c7e7c819a2 | ||
|
|
fbf677d9b2 | ||
|
|
d37b788ea8 | ||
|
|
cb336ff666 | ||
|
|
e2e5433beb | ||
|
|
c7b1038a9d | ||
|
|
c170fed6f9 | ||
|
|
d43aa12987 | ||
|
|
8e38b4f83c | ||
|
|
db4ae19246 | ||
|
|
82a89c6bfe | ||
|
|
166c70cab3 | ||
|
|
de78fe38c8 | ||
|
|
96fa69ff6b | ||
|
|
39d94bd3ea | ||
|
|
695ca29274 | ||
|
|
02e8da6c98 | ||
|
|
ca69ad8beb | ||
|
|
e42637226f | ||
|
|
ae25582178 | ||
|
|
5d85792178 | ||
|
|
acba9c0f61 | ||
|
|
ad7302a032 | ||
|
|
9f3bead99f | ||
|
|
38afc89407 | ||
|
|
c161bb287c | ||
|
|
06d7169674 | ||
|
|
8bf1640932 | ||
|
|
da50c888fe | ||
|
|
62dc8e4131 | ||
|
|
dc554ca61f | ||
|
|
cbb9149a82 | ||
|
|
dab7348da8 | ||
|
|
378e8a6224 | ||
|
|
289fdcc52b | ||
|
|
83e6e3e31f | ||
|
|
c387031252 | ||
|
|
403bd77eff | ||
|
|
b397c46184 | ||
|
|
0a6c4c31b2 | ||
|
|
02fcf184b5 | ||
|
|
b978126bb0 | ||
|
|
9f51d19087 | ||
|
|
859184000f | ||
|
|
1ad2f18c9e | ||
|
|
06a49a5f9e | ||
|
|
b811927e0e | ||
|
|
83cdd0a0c8 | ||
|
|
53c69cd2ce | ||
|
|
c6cf8e992d | ||
|
|
0c53e8c2d0 | ||
|
|
e1901e97c2 | ||
|
|
d694150372 | ||
|
|
4ab586aaf1 | ||
|
|
8a5209ad93 | ||
|
|
308fdf6e9a | ||
|
|
9f4e96fdfa | ||
|
|
c36af35730 | ||
|
|
424f478c3f | ||
|
|
5e0c272061 | ||
|
|
d99bdca094 | ||
|
|
187069bec9 | ||
|
|
01de768f09 | ||
|
|
73a861abf1 | ||
|
|
b4f60ee95c | ||
|
|
85e587a882 | ||
|
|
d91f6dc1b5 | ||
|
|
78c0d8cc88 | ||
|
|
b23d2ad43b | ||
|
|
ef68946e74 | ||
|
|
a5574f9189 | ||
|
|
ba61a92897 | ||
|
|
68fc3704e9 | ||
|
|
69867015e9 | ||
|
|
923f18ef76 | ||
|
|
7e8d254b95 | ||
|
|
6325c3f14a | ||
|
|
074a23e6b4 | ||
|
|
2fb61534a1 | ||
|
|
12b6c6ccf7 | ||
|
|
55ed7bd34d | ||
|
|
eeeef3eab5 | ||
|
|
96413b1604 | ||
|
|
2278fe42e5 | ||
|
|
3a183f869f | ||
|
|
6c5828822c | ||
|
|
9dd824ba50 | ||
|
|
d744ea3fca | ||
|
|
07352e82f1 | ||
|
|
1003cc9bf9 | ||
|
|
0ea5f4ac3a | ||
|
|
2b717997e2 | ||
|
|
20ebacf489 | ||
|
|
c6ef0e8887 | ||
|
|
f761d583b5 | ||
|
|
cee1ac150e | ||
|
|
71b47ae3ef | ||
|
|
36e3fda554 | ||
|
|
2b44a2c9bd | ||
|
|
af3b454805 | ||
|
|
3a0f3eaa50 | ||
|
|
80eb8d9e26 | ||
|
|
30c4136c4d | ||
|
|
83e4475021 | ||
|
|
c071d6d9f6 | ||
|
|
1df426aa5c | ||
|
|
023482406f | ||
|
|
04ba40981f | ||
|
|
fc10bdf24d | ||
|
|
28ad79c97a | ||
|
|
7661ad6653 | ||
|
|
e1436063ff | ||
|
|
3e11a28cd9 | ||
|
|
3ed80f3139 | ||
|
|
a698cc8112 | ||
|
|
916aaacb68 | ||
|
|
aaeb8150b7 | ||
|
|
5ba90cd8ea | ||
|
|
e9127523db | ||
|
|
92004f2e7e | ||
|
|
0eefc7a43c | ||
|
|
3a666702af | ||
|
|
3c0c939689 | ||
|
|
413f7c64e5 | ||
|
|
6f47c1ca20 | ||
|
|
abeebfe070 | ||
|
|
1a002eb23d | ||
|
|
71bc15aca1 | ||
|
|
65b24ce557 | ||
|
|
cfdd5edc49 | ||
|
|
b9035d3e0a | ||
|
|
e504913b0f | ||
|
|
af4133e3c9 | ||
|
|
a788b7e747 | ||
|
|
bb288f0284 | ||
|
|
f90abe9530 | ||
|
|
47c50c079d | ||
|
|
46bab7e4b9 | ||
|
|
3b0fea5fae | ||
|
|
443516cdda | ||
|
|
22fb49fa90 | ||
|
|
957d187ae4 | ||
|
|
b88ea6735b | ||
|
|
51de8fd10a | ||
|
|
2ef6052536 | ||
|
|
394b1e6351 | ||
|
|
c95d068ef5 | ||
|
|
dbda35ffe1 | ||
|
|
6396e23a2a | ||
|
|
529b4bd185 | ||
|
|
85b51e4e77 | ||
|
|
e53a25cbae | ||
|
|
41e7145973 | ||
|
|
db238cc23f | ||
|
|
75e9c798e0 | ||
|
|
99527051b5 | ||
|
|
57e0cc5442 | ||
|
|
73f45d87d5 | ||
|
|
ae88ba986e | ||
|
|
d6247902ec | ||
|
|
a566c28a49 | ||
|
|
2eddb63a83 | ||
|
|
fc7d5b055d | ||
|
|
87c8953e8e | ||
|
|
45d27a52f1 | ||
|
|
bed98303a3 | ||
|
|
d22acc59c9 | ||
|
|
c064e8d62f | ||
|
|
099a2cb586 | ||
|
|
042fe2a9d0 | ||
|
|
ff1c1107f3 | ||
|
|
41a3fd0fd0 | ||
|
|
b9169a5670 | ||
|
|
2ecd5fa28d | ||
|
|
e719b6cc41 | ||
|
|
67b8124a1d | ||
|
|
51ec499c89 | ||
|
|
3a4df25db2 | ||
|
|
37cf78ef45 | ||
|
|
727c622659 | ||
|
|
74a778e65f | ||
|
|
1fc0c9fe8a | ||
|
|
740d8ec5ab | ||
|
|
0bcc477d46 | ||
|
|
d2679f59c5 | ||
|
|
4ee147ea34 | ||
|
|
f1ca61d7d7 | ||
|
|
a80b5cf19b | ||
|
|
44ac84767e | ||
|
|
a40d7ae4dd | ||
|
|
35297f8d4f | ||
|
|
6f4202408c | ||
|
|
0b6548a282 | ||
|
|
faf5821816 | ||
|
|
188673b746 | ||
|
|
287c70e361 | ||
|
|
f6b44af998 | ||
|
|
84c3d9674f | ||
|
|
47d3758820 | ||
|
|
573ff3a24f | ||
|
|
32fcc22cb3 | ||
|
|
daba1238b5 | ||
|
|
d125567f4a | ||
|
|
993eca9327 | ||
|
|
e314844a4d | ||
|
|
017bc564af | ||
|
|
e076ff9085 | ||
|
|
2789493a5f | ||
|
|
4ed0635447 | ||
|
|
1904e504be | ||
|
|
834715ea2f | ||
|
|
380a3bbff4 | ||
|
|
6219326e02 | ||
|
|
6c4de5106b | ||
|
|
e936705840 | ||
|
|
9b2603b6f6 | ||
|
|
88856b847c | ||
|
|
f679878f7b | ||
|
|
f33acf8758 | ||
|
|
a846a4c643 | ||
|
|
899c2bb9cc | ||
|
|
f8f95e2dbd | ||
|
|
77c63511d8 | ||
|
|
0be5a6ab2b | ||
|
|
9802e74859 | ||
|
|
8e7d6eb151 | ||
|
|
5c18e4f114 | ||
|
|
fd2eafa7c6 | ||
|
|
422b8472fe | ||
|
|
5b213b0504 | ||
|
|
ad27d06979 | ||
|
|
c4b1251d0a | ||
|
|
01891f8815 | ||
|
|
adb68450ce | ||
|
|
2520f6fe49 | ||
|
|
c9278bfcdf | ||
|
|
8b838ff9ea | ||
|
|
154bdf0bca | ||
|
|
ed436c6f0c | ||
|
|
ae5dd2da4f | ||
|
|
f4b61e8c8d | ||
|
|
e49a3d377f | ||
|
|
b631b552bb | ||
|
|
3f21581a81 | ||
|
|
bb62ecf157 | ||
|
|
a268ab35ea | ||
|
|
62baec1841 | ||
|
|
7bca61f5bb | ||
|
|
ecf12a60e8 | ||
|
|
6de85cb047 | ||
|
|
39257717d8 | ||
|
|
b54762a8f6 | ||
|
|
bcae86196c | ||
|
|
7adfea8ca2 | ||
|
|
eab1a77683 | ||
|
|
84f5e0c0de | ||
|
|
2ce3900071 | ||
|
|
bf2c1f3e9e | ||
|
|
8ccd8a008d | ||
|
|
9513c1a8d6 | ||
|
|
0a1be2bfc3 | ||
|
|
8c6727949c | ||
|
|
ff9b717bf6 | ||
|
|
8c834a4ff6 | ||
|
|
8c01004219 | ||
|
|
8555b65c50 | ||
|
|
304fa5ecac | ||
|
|
88e630170e | ||
|
|
da8bdd62c8 | ||
|
|
54abeab80b | ||
|
|
1dc8a9f0e7 | ||
|
|
a62d54425c | ||
|
|
c8b2591ac2 | ||
|
|
ee1d8e1091 | ||
|
|
672fc8d79b | ||
|
|
84ff1a680a | ||
|
|
90c899407a | ||
|
|
55868eecd0 | ||
|
|
50dc98367c | ||
|
|
c4d3030d24 | ||
|
|
c6f101884b | ||
|
|
c0c0526fc8 | ||
|
|
375c88b110 | ||
|
|
a65f63747b | ||
|
|
a21edddf27 | ||
|
|
a88c23b6e8 | ||
|
|
216e37bf33 | ||
|
|
7bb3987acc | ||
|
|
6a147a17af | ||
|
|
2b7529e905 | ||
|
|
1ed321f964 | ||
|
|
2aee1b86f3 | ||
|
|
b5fc21b9f4 | ||
|
|
44581dbef5 | ||
|
|
205448c1e8 | ||
|
|
2d11c6ab29 | ||
|
|
6859c22b69 | ||
|
|
2d5413fc3b | ||
|
|
a6aa0e4cbf | ||
|
|
163848ab3b | ||
|
|
03747ba93e | ||
|
|
095c390df7 | ||
|
|
20597b3632 | ||
|
|
4728735acf | ||
|
|
9dcbd005f0 | ||
|
|
0ad2eb34c7 | ||
|
|
0e8a15e813 | ||
|
|
5b0d6a59cf | ||
|
|
fd3dc7e5fb | ||
|
|
c37edfd3e9 | ||
|
|
4a99b1df4b | ||
|
|
12e9b7eafa | ||
|
|
de1261ba28 | ||
|
|
5ee5a89a7f | ||
|
|
1ad2475f9e | ||
|
|
5b5675cc12 | ||
|
|
e699f6781e | ||
|
|
5f13c1cd9c | ||
|
|
a577944ab5 | ||
|
|
17ec3b0c2d | ||
|
|
fb75137540 | ||
|
|
6f87164ad6 | ||
|
|
a4d82cfe1e | ||
|
|
9f21eee2ec | ||
|
|
a40246d312 | ||
|
|
4a5aad0948 | ||
|
|
85ae7e9c9a | ||
|
|
2098b94b47 | ||
|
|
59ad6265a1 | ||
|
|
067572c6dd | ||
|
|
7f03f68fcc | ||
|
|
de862f9f1b | ||
|
|
b5e31c89c0 | ||
|
|
e898400fbd | ||
|
|
3ac7de7a22 | ||
|
|
ade66e7ece | ||
|
|
6673f9e39d | ||
|
|
2db2c0f0b7 | ||
|
|
17dc638c18 | ||
|
|
d6e28c42e5 | ||
|
|
6d475c40de | ||
|
|
ed7891bf01 | ||
|
|
e17da71a70 | ||
|
|
610bef9ff5 | ||
|
|
961c7d0f78 | ||
|
|
c1ba47beee | ||
|
|
ac8e5be9f4 | ||
|
|
c76952534e | ||
|
|
f0060718de | ||
|
|
982ab9e496 | ||
|
|
b74bcf2274 | ||
|
|
645cb5833d | ||
|
|
dc328e0c4a | ||
|
|
92c85bd20d | ||
|
|
f629eb8cb2 | ||
|
|
e4f41ff61d | ||
|
|
dae6ecb680 | ||
|
|
a57a7b1a76 | ||
|
|
03073b366b | ||
|
|
1bd8a9e744 | ||
|
|
0a5c991ab5 | ||
|
|
93deb84499 | ||
|
|
c4d4011c63 | ||
|
|
3d12f8d246 | ||
|
|
c3e720279c | ||
|
|
f1027ed198 | ||
|
|
fe3c5e4e8e | ||
|
|
d110131ad6 | ||
|
|
10bc1a9acc | ||
|
|
3f899f83ff | ||
|
|
fc05768374 | ||
|
|
03b57df630 | ||
|
|
4de3b6dc80 | ||
|
|
c7bbfef19a | ||
|
|
7f1130b52b | ||
|
|
2d696f46c3 | ||
|
|
2f43e4bc66 | ||
|
|
f8c23488c9 | ||
|
|
1e2cda9239 | ||
|
|
20cba9e89f | ||
|
|
f6d67ac260 | ||
|
|
74904b9cf2 | ||
|
|
82059645f1 | ||
|
|
13e9f18403 | ||
|
|
875821f2ba | ||
|
|
cc3be3aeed | ||
|
|
72af3c0489 | ||
|
|
65e54f6ed1 | ||
|
|
10196496f3 | ||
|
|
86f08862e4 | ||
|
|
83c726a34f | ||
|
|
a0415f73d4 | ||
|
|
93068f10ec | ||
|
|
7142c81c05 | ||
|
|
c0421a57da | ||
|
|
8f1ec1dfdf | ||
|
|
222dc8a239 | ||
|
|
0e4d2e7277 | ||
|
|
2bbff77e48 | ||
|
|
3315c67f0f | ||
|
|
b879bcb1eb | ||
|
|
ae99135c8d | ||
|
|
1defb38a6f | ||
|
|
56bc9e12ee | ||
|
|
116ebe0494 | ||
|
|
5ec843dcc8 | ||
|
|
a78b2d84ed | ||
|
|
cf4d80fc65 | ||
|
|
8118bc93a8 | ||
|
|
c772bc45c6 | ||
|
|
c1e7be3b8e | ||
|
|
17ecc56e83 | ||
|
|
6a42e6f6d4 | ||
|
|
75ba961e97 | ||
|
|
c2d5ce0ca2 | ||
|
|
32645b80c4 | ||
|
|
ff626ac763 | ||
|
|
59f8144c50 | ||
|
|
5a7c931293 | ||
|
|
1373d40fea | ||
|
|
3274bb54ad | ||
|
|
7db124068f | ||
|
|
39e2ffe212 | ||
|
|
0a213ddf03 | ||
|
|
5dc4cbdf82 | ||
|
|
1434e5a22e | ||
|
|
9acc1e1e97 | ||
|
|
daa47546c7 | ||
|
|
c5194d0a8f | ||
|
|
7ece8ff85c | ||
|
|
a4effeb3f9 | ||
|
|
d3f28a1d7f | ||
|
|
03cddd0acf | ||
|
|
04a737e04c | ||
|
|
966c54bef5 | ||
|
|
efcd9dfc35 | ||
|
|
db44a6e948 | ||
|
|
d6553fc6a7 | ||
|
|
fc9014f7ec | ||
|
|
b39ab76118 | ||
|
|
90777f78c9 | ||
|
|
7cb803ad5c | ||
|
|
8e063829c4 | ||
|
|
139c6be370 | ||
|
|
b6ac249c3c | ||
|
|
5e103b5fb7 | ||
|
|
de5be62da5 | ||
|
|
b5f608d026 | ||
|
|
58fe352fda | ||
|
|
b105093dcd | ||
|
|
d1c401fe7a | ||
|
|
964aa42b04 | ||
|
|
bf8660b21c | ||
|
|
43863a70c8 | ||
|
|
bd5a70c712 | ||
|
|
909ff4b8a9 | ||
|
|
bcfc62a3f2 | ||
|
|
d1924867db | ||
|
|
abfbd55305 | ||
|
|
b3611524f4 | ||
|
|
a63613dba0 | ||
|
|
7fec2b02d4 | ||
|
|
608a98c873 | ||
|
|
f951e5356b | ||
|
|
080ee87e07 | ||
|
|
fa60b9ae94 | ||
|
|
0d33ae52c6 | ||
|
|
77e4b28092 | ||
|
|
4817437d31 | ||
|
|
354b5a9365 | ||
|
|
58502b38d3 | ||
|
|
d44880dfa9 | ||
|
|
0c63632cc2 | ||
|
|
b93523c0b1 | ||
|
|
7ef40de98b | ||
|
|
196ec25682 | ||
|
|
c85af12d45 | ||
|
|
e452d1f5b4 | ||
|
|
ffea268d2e | ||
|
|
8e676db633 | ||
|
|
f6d74012b7 | ||
|
|
32dfc11c23 | ||
|
|
aad0ea6e23 | ||
|
|
05de2e998c | ||
|
|
24780d99e6 | ||
|
|
7c1cf61728 | ||
|
|
eb10d08671 | ||
|
|
abb0549e4b | ||
|
|
5327ea13ac | ||
|
|
be8ceae6e6 | ||
|
|
67ae033de7 | ||
|
|
161f7ced96 | ||
|
|
72bc11b180 | ||
|
|
15c2538532 | ||
|
|
fd9dd9343b | ||
|
|
1b8a1d4140 | ||
|
|
e132d10aec | ||
|
|
3dbda2dda2 | ||
|
|
a0105b45ae | ||
|
|
551b7768fc | ||
|
|
d6967db761 | ||
|
|
b0967cae69 | ||
|
|
401a799a1b | ||
|
|
ba98518c69 | ||
|
|
5e26e2ab1d | ||
|
|
08eca827b6 | ||
|
|
6b2b5af344 | ||
|
|
f32fbd9ed1 | ||
|
|
e3511d0ee0 | ||
|
|
fa13a6616f | ||
|
|
d4c2f91182 | ||
|
|
084fd8df63 | ||
|
|
328131b7aa | ||
|
|
85003429af | ||
|
|
6db77dcf75 | ||
|
|
1cde86823d | ||
|
|
dbd88e6aef | ||
|
|
45418583e9 | ||
|
|
77a1133723 | ||
|
|
25c208d81d | ||
|
|
67f87db511 | ||
|
|
7de96275dd | ||
|
|
e13d0bf656 | ||
|
|
8ed9f7effa | ||
|
|
12ab556477 | ||
|
|
509f8dab89 | ||
|
|
77429b6dd3 | ||
|
|
84d20d9e43 | ||
|
|
0c13703da3 | ||
|
|
b97b7a7493 | ||
|
|
be2951b45f | ||
|
|
1dd1a705b5 | ||
|
|
e4e80ff0cb | ||
|
|
9508ea982b | ||
|
|
47d655ea7f | ||
|
|
62271bf6ce | ||
|
|
0b27ac2f5c | ||
|
|
6fd481df97 | ||
|
|
b915e43391 | ||
|
|
c96b295700 | ||
|
|
9067da2df8 | ||
|
|
8cf2f52f7a | ||
|
|
681352ac3b | ||
|
|
d9c662d51f | ||
|
|
ad631d563b | ||
|
|
7cbaf11dda | ||
|
|
3be63549c0 | ||
|
|
17c6db6c33 | ||
|
|
86316b1828 | ||
|
|
efc3a69dbf | ||
|
|
ec883e1901 | ||
|
|
060814daa8 | ||
|
|
c53492a76a | ||
|
|
43675717b8 | ||
|
|
b21ed2fa36 | ||
|
|
0214baad5a | ||
|
|
c2d3ed2acc | ||
|
|
0339c8d025 | ||
|
|
0e0be0243b | ||
|
|
a2ce2447a6 | ||
|
|
9a1076256d | ||
|
|
72ef38d4a7 | ||
|
|
d397ce68dc | ||
|
|
5e20b7976f | ||
|
|
36f712b949 | ||
|
|
a446775d80 | ||
|
|
ccd7f0825a | ||
|
|
d0896ea7c4 | ||
|
|
a73d1e4b1c | ||
|
|
d05bb2a0af | ||
|
|
6765901687 | ||
|
|
c5d05ac0cf | ||
|
|
939003c1f1 | ||
|
|
a10f3a8aec | ||
|
|
ef663810a2 | ||
|
|
ada67a6a4f | ||
|
|
b6a5d1ad5a | ||
|
|
d8c5a63bc2 | ||
|
|
bcb2db62c9 | ||
|
|
079ef93121 | ||
|
|
b2789c598e | ||
|
|
92a93c1217 | ||
|
|
96b70835f9 | ||
|
|
7fa3b7a267 | ||
|
|
f3fc76e3c8 | ||
|
|
3216f4b257 | ||
|
|
ce1d897575 | ||
|
|
17e108a10a | ||
|
|
5bc4ab899f | ||
|
|
44faf1080c | ||
|
|
e354c5c2a8 | ||
|
|
04bc9005ae | ||
|
|
3c92c69bc7 | ||
|
|
52ee132d92 | ||
|
|
7ca0aedcfc | ||
|
|
a2c4037a24 | ||
|
|
d7b0073ce1 | ||
|
|
585b68d2ae | ||
|
|
89d2d648cc | ||
|
|
7532f24d58 | ||
|
|
69a5df2f98 | ||
|
|
1c65908cdb | ||
|
|
3aaf013dd1 | ||
|
|
5f2705ab07 | ||
|
|
9af620982c | ||
|
|
1ee6a78cb7 | ||
|
|
bf4ee48efa | ||
|
|
08e6d222a2 | ||
|
|
cf98b0e261 | ||
|
|
a24589d46e | ||
|
|
84533b6cad | ||
|
|
8dca38e979 | ||
|
|
662bed6a00 | ||
|
|
ae5e0cb02b | ||
|
|
0b3e1c4706 | ||
|
|
ce08a7a932 | ||
|
|
5d5f21bfc5 | ||
|
|
fcccedc588 | ||
|
|
0d73a49327 | ||
|
|
6239dd96f2 | ||
|
|
57a4700fb9 | ||
|
|
2b676dc5fc | ||
|
|
3f267b1795 | ||
|
|
7a4c9f5f4c | ||
|
|
3330aa6f6a | ||
|
|
8929f88e6d | ||
|
|
5348808bf5 | ||
|
|
fccba1af2a | ||
|
|
26d92c80ed | ||
|
|
9605e24655 | ||
|
|
7d0269d2ce | ||
|
|
52ffdb0a55 | ||
|
|
681d6bbdc5 | ||
|
|
867b82b6de | ||
|
|
5101ef4b02 | ||
|
|
ee9e238179 | ||
|
|
29030b54c9 | ||
|
|
c9fcc7f148 | ||
|
|
d1f4a31b5e | ||
|
|
b691d3123b | ||
|
|
f68e36f8c2 | ||
|
|
4db119c01b | ||
|
|
bbd7115564 | ||
|
|
8d36367fe2 | ||
|
|
3deca8fccd | ||
|
|
7af24c4d3a | ||
|
|
7f0ce4e94e | ||
|
|
5c48d3fbba | ||
|
|
00420ef9ca | ||
|
|
b9d30595d6 | ||
|
|
c1f4f1fdb6 | ||
|
|
342333f72a | ||
|
|
94cdc47786 | ||
|
|
cc511e7b60 | ||
|
|
bb2af791e9 | ||
|
|
f3f4b332ae | ||
|
|
84ac79bb08 | ||
|
|
be0c8495cd | ||
|
|
cbd0709d1c | ||
|
|
371d635da8 | ||
|
|
85216966fa | ||
|
|
1c823e9d1f | ||
|
|
25e338a098 | ||
|
|
81175b0717 | ||
|
|
d23c907a94 | ||
|
|
018f4155eb | ||
|
|
9ab0a1f5f1 | ||
|
|
c043b337b1 | ||
|
|
090bc6fa79 | ||
|
|
b63db1c1aa | ||
|
|
0287ac794e | ||
|
|
0005221533 | ||
|
|
23d2c0f1c6 | ||
|
|
377b6f05ea | ||
|
|
3ac2e9d31f | ||
|
|
b76a29a69a | ||
|
|
abe090ec1f | ||
|
|
dff05c71e6 | ||
|
|
f6f4742410 | ||
|
|
977004c350 | ||
|
|
fdc7d13ad1 | ||
|
|
355dd5cb24 | ||
|
|
123dd5fe2d | ||
|
|
953e3190ca | ||
|
|
44a0e21795 | ||
|
|
fafaf567f9 | ||
|
|
870cc1d928 | ||
|
|
d86ee93801 | ||
|
|
87b7328463 | ||
|
|
3f846cf6b8 | ||
|
|
f2ce8c3b62 | ||
|
|
4223657ab8 | ||
|
|
930128a7ea | ||
|
|
db447440ff | ||
|
|
b70d38dc10 | ||
|
|
a27d105dcd | ||
|
|
67e44b0f2c | ||
|
|
bf840700e4 | ||
|
|
47e16dbee3 | ||
|
|
66f678023f | ||
|
|
132971f8eb | ||
|
|
3f04a4d635 | ||
|
|
17c8e839b6 | ||
|
|
348bdcd7b7 | ||
|
|
a32443c63b | ||
|
|
7e53934ce3 | ||
|
|
7c2b553364 | ||
|
|
409fc837ab | ||
|
|
6d0ada7f45 | ||
|
|
af63372d2b | ||
|
|
3e91f757a9 | ||
|
|
498491ec05 | ||
|
|
85b77b81ca | ||
|
|
5bf2ec5a74 | ||
|
|
9e715089a4 | ||
|
|
1a852bc365 | ||
|
|
9326ce53ec | ||
|
|
d8217c364a | ||
|
|
3a34fd181d | ||
|
|
fcb7233b25 | ||
|
|
fe53a376a3 | ||
|
|
65842cd99e | ||
|
|
bf6ed643e0 | ||
|
|
a0beb5fa26 | ||
|
|
f54bcc1f16 | ||
|
|
ca0d09c50f | ||
|
|
81c3224076 | ||
|
|
7a1d466fb2 | ||
|
|
83f4c48c8a | ||
|
|
acd742d225 | ||
|
|
d1e7b4e381 | ||
|
|
67f591a9ce | ||
|
|
7ff988275f | ||
|
|
363050f44c | ||
|
|
dbe04c4207 | ||
|
|
d59a332ef9 | ||
|
|
105b431e4c | ||
|
|
ba79f4c1f9 | ||
|
|
8b2dcf7018 | ||
|
|
44621f7326 | ||
|
|
8ead8f7ea6 | ||
|
|
7f9402bd22 | ||
|
|
cbd38327e7 | ||
|
|
06f898cc12 | ||
|
|
6a9ab8bc0e | ||
|
|
9a0061c511 | ||
|
|
7a3aac1843 | ||
|
|
da1f4b3ede | ||
|
|
dac740ee17 | ||
|
|
28030d7edb | ||
|
|
648196319f | ||
|
|
c75cb67c44 | ||
|
|
cd1bb2bafa | ||
|
|
a9d2dc6144 | ||
|
|
46b9388bb0 | ||
|
|
a1a97d663e | ||
|
|
cac3c159bc | ||
|
|
43166130b5 | ||
|
|
14f21378e3 | ||
|
|
bd42aeab46 | ||
|
|
cde6a3a00c | ||
|
|
96b763067e | ||
|
|
dd5ba062cc | ||
|
|
ba161ec572 | ||
|
|
43f613d9be | ||
|
|
2277d143fa | ||
|
|
6b6d9e64bd | ||
|
|
f016a99f24 | ||
|
|
2eed9d64ce | ||
|
|
1688b6dda9 | ||
|
|
33aedc887a | ||
|
|
258d0ea97e | ||
|
|
d3641766a5 | ||
|
|
b25d5c5d33 | ||
|
|
352d7f477e | ||
|
|
1fcf35ad3b | ||
|
|
c8054e569a | ||
|
|
ef48eca9ca | ||
|
|
906d2fbadf | ||
|
|
2b579aeb4f | ||
|
|
e9e55b0812 | ||
|
|
49a3845135 | ||
|
|
21dac6c05d | ||
|
|
1d9b84a5af | ||
|
|
a688745bdc | ||
|
|
459d824c50 | ||
|
|
96019f4a02 | ||
|
|
896015bf53 | ||
|
|
df3e7a9248 | ||
|
|
b2d3d15e97 | ||
|
|
08dfd263ba | ||
|
|
abaabe92d6 | ||
|
|
257b42b87f | ||
|
|
31bc94160a | ||
|
|
9e5d2c5bb7 | ||
|
|
2df2a989af | ||
|
|
4a800b311f | ||
|
|
a4a13a3825 | ||
|
|
a28df6123f | ||
|
|
c5c43c4541 | ||
|
|
0954f580fa | ||
|
|
3a2254c91f | ||
|
|
4aeec4bb60 | ||
|
|
750b2ad6a8 | ||
|
|
86c276f538 | ||
|
|
166569200a | ||
|
|
e903d00968 | ||
|
|
7d5d95ad53 | ||
|
|
cc6c452854 | ||
|
|
f492c78e2e | ||
|
|
6b83d08228 | ||
|
|
dc415b761e | ||
|
|
f1034eb657 | ||
|
|
ac9ebe1439 | ||
|
|
7b5f7c041b | ||
|
|
8ce9b53093 | ||
|
|
0b9e52bd5f | ||
|
|
5dd728d802 | ||
|
|
ce7c97b6ba | ||
|
|
9a4c049675 | ||
|
|
cb8449a66d | ||
|
|
621467717d | ||
|
|
506c716cf2 | ||
|
|
9f625b0a0d | ||
|
|
bc1b4131cb | ||
|
|
80ba3c5932 | ||
|
|
e63420a8c2 | ||
|
|
e02d8ad8d2 | ||
|
|
d300e6bf21 | ||
|
|
1729388634 | ||
|
|
c654c7630a | ||
|
|
3f3b26fb0e | ||
|
|
0921180b90 | ||
|
|
14df240f5b | ||
|
|
2090911363 | ||
|
|
3cc7be0fa6 | ||
|
|
6728b8c1a3 | ||
|
|
450c26c471 | ||
|
|
7ec1121cc8 | ||
|
|
f84e288ad7 | ||
|
|
8e31366431 | ||
|
|
1bfa04f80e | ||
|
|
98cbc0ea79 | ||
|
|
dca1115196 | ||
|
|
96882175f1 | ||
|
|
484841fc9e | ||
|
|
8052c76489 | ||
|
|
3477acee48 | ||
|
|
2c4b998170 | ||
|
|
0a9c7ff6cf | ||
|
|
cd71038655 | ||
|
|
1894aed261 | ||
|
|
f3832bcaa8 | ||
|
|
436335e9a3 | ||
|
|
a30eb194d5 | ||
|
|
8becbb8b08 | ||
|
|
e0c2c77c2a | ||
|
|
6f2e1c2415 | ||
|
|
fc0ad8674b | ||
|
|
19c67ab724 | ||
|
|
a046b6e105 | ||
|
|
8017301de5 | ||
|
|
46528783ef | ||
|
|
6f4bb6cd2c | ||
|
|
2cf31e905b | ||
|
|
28a60db5aa | ||
|
|
496f70fc0d | ||
|
|
9ede4c5f3c | ||
|
|
214a526945 | ||
|
|
d5b756413a | ||
|
|
af99176581 | ||
|
|
57e825dfe7 | ||
|
|
e06dd129dd | ||
|
|
00baddcd9e | ||
|
|
7e92820c50 | ||
|
|
5692e20fd5 | ||
|
|
3b3c9334c8 | ||
|
|
96dc0a318a | ||
|
|
a4223aac38 | ||
|
|
2bb751d9fa | ||
|
|
3b620112ca | ||
|
|
99526219b7 | ||
|
|
d818b618af | ||
|
|
c64700e7ae | ||
|
|
5bd1917705 | ||
|
|
178c6c20cd | ||
|
|
92d71cc7fa | ||
|
|
227eca7d28 | ||
|
|
9399b0ea52 | ||
|
|
17dca254a3 | ||
|
|
f6b50d2387 | ||
|
|
a9ce0218c1 | ||
|
|
7bb5a960fd | ||
|
|
e6b04d1b50 | ||
|
|
12613356fc | ||
|
|
3894450b10 | ||
|
|
ec07f6ec83 | ||
|
|
a7a10d03c9 | ||
|
|
ef99d6ce3d | ||
|
|
0ac06d77f1 | ||
|
|
469e233428 | ||
|
|
86a0f9cf9b | ||
|
|
e6a91d291d | ||
|
|
bf35972714 | ||
|
|
e0c645a270 | ||
|
|
e42734c3f3 | ||
|
|
eab78ab99c | ||
|
|
f2491c88c8 | ||
|
|
1b175025fe | ||
|
|
ccdf7184be | ||
|
|
7764136211 | ||
|
|
0307801d51 | ||
|
|
72cf8dd8a0 | ||
|
|
3c2b464dfa | ||
|
|
361404fd59 | ||
|
|
762c91b7f1 | ||
|
|
f2a8d4d289 | ||
|
|
9ee52d85d7 | ||
|
|
5ed9f02c4d | ||
|
|
378ebad1c8 | ||
|
|
e44e0fab9f | ||
|
|
c434077728 | ||
|
|
6e47e79790 | ||
|
|
d9ea3082fb | ||
|
|
2d63c26936 | ||
|
|
3cdd01aa1b | ||
|
|
d25195447a | ||
|
|
aa8ab2fc89 | ||
|
|
d664baff26 | ||
|
|
3275d4c6fa | ||
|
|
cd0d003197 | ||
|
|
cfeeb7af2e | ||
|
|
ac887d3afb | ||
|
|
e294ccae24 | ||
|
|
72070f292b | ||
|
|
823c618d24 | ||
|
|
51cb6a0a44 | ||
|
|
a1b1ec3d11 | ||
|
|
595b6a4f6c | ||
|
|
daa4647712 | ||
|
|
c67668d6dd | ||
|
|
9cfaa9c7b0 | ||
|
|
c5ea586882 | ||
|
|
f2a3a37dff | ||
|
|
01dd540d7e | ||
|
|
8142080633 | ||
|
|
9920a3e8fc | ||
|
|
f7d8e6c40c | ||
|
|
4ecf09f9e6 | ||
|
|
47a8369d79 | ||
|
|
6805fa2fa0 | ||
|
|
4d6b9611ae | ||
|
|
16afdfd874 | ||
|
|
701fff03d2 | ||
|
|
8e0575ca9b | ||
|
|
5e8f51a963 | ||
|
|
be3d2188d6 | ||
|
|
18e429a87e | ||
|
|
3576a8fd9f | ||
|
|
f260cd031c | ||
|
|
18c4b536f2 | ||
|
|
fa51db449f | ||
|
|
cb9a05ac77 | ||
|
|
f1f22019f5 | ||
|
|
6d79a1cdfc | ||
|
|
ad5eb2f8d6 | ||
|
|
39d56d6b65 | ||
|
|
a291415326 | ||
|
|
4ad7456428 | ||
|
|
73f36858bb | ||
|
|
fe3f0332f7 | ||
|
|
718fd97612 | ||
|
|
f8ff45b212 | ||
|
|
f5c0b0d316 | ||
|
|
ba51045d9e | ||
|
|
fa34dd7bd3 | ||
|
|
9f0fb8f6a8 | ||
|
|
a42f9fd4e2 | ||
|
|
e66005563e | ||
|
|
8cad20585d | ||
|
|
a8b75dc4df | ||
|
|
e4455962c6 | ||
|
|
20f85745e7 | ||
|
|
feb8d5b82f | ||
|
|
eb8922f346 | ||
|
|
84eb95466b | ||
|
|
3dd8beb380 | ||
|
|
ae77406b8e | ||
|
|
2d16069211 | ||
|
|
d18314fa05 | ||
|
|
26a9ce7b29 | ||
|
|
76417d4446 | ||
|
|
cffc78ad6a | ||
|
|
dcf55c7e32 | ||
|
|
e565cd4404 | ||
|
|
5934ccbb74 | ||
|
|
e39969a0d0 | ||
|
|
d68185aa28 | ||
|
|
4cab151ed2 | ||
|
|
8ac9b77e5c | ||
|
|
1b9da5d978 | ||
|
|
ab2b7358cb | ||
|
|
8ceea85813 | ||
|
|
d0a812d2df | ||
|
|
3dad2e1c0f | ||
|
|
70e4399334 | ||
|
|
00f8c2d46f | ||
|
|
0dd4b52b63 | ||
|
|
88c17926e4 | ||
|
|
541192c941 | ||
|
|
2e9f054ec0 | ||
|
|
2aa34882b7 | ||
|
|
27f8ef2f33 | ||
|
|
2cbe21c791 | ||
|
|
0988056471 | ||
|
|
95c3f57b30 | ||
|
|
068f191c0d | ||
|
|
6bf6c9215b | ||
|
|
a65afa8090 | ||
|
|
8155784990 | ||
|
|
44725e485d | ||
|
|
e98e2a0b07 | ||
|
|
943064bb51 | ||
|
|
7149a8ae4f | ||
|
|
3c7cf94643 | ||
|
|
3bd35d1883 | ||
|
|
6f3d70b5e2 | ||
|
|
257a0dee75 | ||
|
|
e995cd928c | ||
|
|
292d7c3fdf | ||
|
|
0273cd44b0 | ||
|
|
3203a7dd8c | ||
|
|
86b0adc82c | ||
|
|
ba49f20f68 | ||
|
|
a3ee26da64 | ||
|
|
a9b62a2ece | ||
|
|
49567f1f3e | ||
|
|
94fffb332b | ||
|
|
dc2e64c92b | ||
|
|
06fb7c671b | ||
|
|
ef93cdf4a8 | ||
|
|
4ad90e2d52 | ||
|
|
7c0e4dfb56 | ||
|
|
9ec069104f | ||
|
|
7d21d60dba | ||
|
|
ed8562c300 | ||
|
|
22ec1c3498 | ||
|
|
9cc90b1fbe | ||
|
|
0c9f22507f | ||
|
|
9c870e4276 | ||
|
|
5cffe693b0 | ||
|
|
e01615fd1e | ||
|
|
c1daa857a5 | ||
|
|
3928c4e9ae | ||
|
|
32799fef5c | ||
|
|
e1b03b4a71 | ||
|
|
e6ed592b8a | ||
|
|
6f4560184c | ||
|
|
e5039c478a | ||
|
|
8901514506 | ||
|
|
21fe376d1d | ||
|
|
e22ef6c481 | ||
|
|
2bb01093c0 | ||
|
|
36c814d26e | ||
|
|
d769b74d61 | ||
|
|
601495fa0f | ||
|
|
1998633739 | ||
|
|
0194217f9d | ||
|
|
b0bbb8b693 | ||
|
|
cab84af72e | ||
|
|
74500eacca | ||
|
|
1105e61f29 | ||
|
|
b7cf279d6d | ||
|
|
c614e550d9 | ||
|
|
452a30d7af | ||
|
|
49e79620fd | ||
|
|
ae5a721df9 | ||
|
|
0dd5f2915a | ||
|
|
a0ebd444ad | ||
|
|
0c6072c4e4 | ||
|
|
8917264110 | ||
|
|
e90d606f0a | ||
|
|
5bb2d64ddb | ||
|
|
bc66dc45e6 | ||
|
|
7087935656 | ||
|
|
5822daa63d | ||
|
|
4808c7ef39 | ||
|
|
7071126770 | ||
|
|
2101daef5a | ||
|
|
083065f433 | ||
|
|
4cfc4a5a94 | ||
|
|
1c7ee737e6 | ||
|
|
39439b80f5 | ||
|
|
396480cf94 | ||
|
|
3e03527930 | ||
|
|
4fa724461e | ||
|
|
1e2018ce83 | ||
|
|
3fcf17cb79 | ||
|
|
f9fc3a42cc | ||
|
|
76bc28ab1e | ||
|
|
f47f86ef02 | ||
|
|
31268ffa24 | ||
|
|
0634be9724 | ||
|
|
f56c6a18c1 | ||
|
|
aa4c506fcd | ||
|
|
d3a479b7fa | ||
|
|
92fb0e829a | ||
|
|
43a9928537 | ||
|
|
c8b408beae | ||
|
|
8e3982dd42 | ||
|
|
e83f805b8f | ||
|
|
be98afe34d | ||
|
|
f53dadcc6d | ||
|
|
90ab65f8c7 | ||
|
|
abb0fcb203 | ||
|
|
eef4f33a29 | ||
|
|
0226440a2d | ||
|
|
9d770d6084 | ||
|
|
7f0297dc44 | ||
|
|
49f3855407 | ||
|
|
905d493fd7 | ||
|
|
5def2a09bd | ||
|
|
a98aa66620 | ||
|
|
631a268996 | ||
|
|
85074f5ac6 | ||
|
|
12a8ed39d4 | ||
|
|
b9ac5e9e76 | ||
|
|
2758a734a2 | ||
|
|
01f3131c81 | ||
|
|
2ca9236864 | ||
|
|
3bb711837e | ||
|
|
ed8798e82f | ||
|
|
38474961fd | ||
|
|
3dd38e7b7f | ||
|
|
3711a97657 | ||
|
|
911411e630 | ||
|
|
c02cc199bc | ||
|
|
dd6c21e092 | ||
|
|
7801ca86b9 | ||
|
|
10fc288c91 | ||
|
|
b8cda53bd3 | ||
|
|
43806d524d | ||
|
|
e0a97a030f | ||
|
|
33ba288622 | ||
|
|
d5516dee00 | ||
|
|
06e0741a52 | ||
|
|
0b93445380 | ||
|
|
483ba5ea1c | ||
|
|
18076ac9b7 | ||
|
|
ad15ca7104 | ||
|
|
53117ac204 | ||
|
|
51a8c109ab | ||
|
|
ea25e0ee55 | ||
|
|
e6fdae431f | ||
|
|
34afc272fd | ||
|
|
a5673fcb28 | ||
|
|
5c3c506638 | ||
|
|
ecd5eb02c5 | ||
|
|
3be57dc4a3 | ||
|
|
a93caf3cfe | ||
|
|
26ebfc04b0 | ||
|
|
8782f6d232 | ||
|
|
5faf443038 | ||
|
|
8eacd13ce7 | ||
|
|
d3e1b72d38 | ||
|
|
b5e1bd5705 | ||
|
|
4bef0a1e62 | ||
|
|
3e5f09be0b | ||
|
|
e86e77ad67 | ||
|
|
3c4bb9ff4e | ||
|
|
a890dadfd2 | ||
|
|
6b4374583a | ||
|
|
78f4171a7a | ||
|
|
f8a99a391e | ||
|
|
2564f763d7 | ||
|
|
377a2b9e07 | ||
|
|
045993001c | ||
|
|
affc446690 | ||
|
|
255ee646c2 | ||
|
|
0308ec564e | ||
|
|
6cafec8ae6 | ||
|
|
8ef87be482 | ||
|
|
6c57047362 | ||
|
|
e29bc6912b | ||
|
|
ce57b8b6df | ||
|
|
d81a9029db | ||
|
|
620ae7790b | ||
|
|
23b2b7144b | ||
|
|
bf4311cd9b | ||
|
|
8f7adf79a3 | ||
|
|
97b164d03b | ||
|
|
61e7e531c2 | ||
|
|
ceb652915f | ||
|
|
cdaf504ab8 | ||
|
|
9fb5aad157 | ||
|
|
a6301d45f4 | ||
|
|
b83d069266 | ||
|
|
960b9a9664 | ||
|
|
acb45caa42 | ||
|
|
39060b528a | ||
|
|
4a36323f1b | ||
|
|
c6281b2680 | ||
|
|
5b8b7d1412 | ||
|
|
53e5139b99 | ||
|
|
2b8ce83c9b | ||
|
|
52638c68f5 | ||
|
|
400ff1c812 | ||
|
|
d360f17a59 | ||
|
|
a6ee6be960 | ||
|
|
47911f9544 | ||
|
|
48025c2279 | ||
|
|
a68302e50b | ||
|
|
333a08ebf9 | ||
|
|
989c9a7317 | ||
|
|
975370c084 | ||
|
|
c3c776bc6a | ||
|
|
9f4b906e6c | ||
|
|
804900df36 | ||
|
|
3781f6cf39 | ||
|
|
227da2377a | ||
|
|
ffb3a9f526 | ||
|
|
6936c0e2ab | ||
|
|
108242042e | ||
|
|
70652abf97 | ||
|
|
e202b407ec | ||
|
|
2cc89e60cc | ||
|
|
d536944beb | ||
|
|
1a8ef3cdab | ||
|
|
7be33eba48 | ||
|
|
46ed91b53d | ||
|
|
73f6fc428a | ||
|
|
44d260f911 | ||
|
|
07249fc395 | ||
|
|
bc1e8e01f3 | ||
|
|
fe8e77e556 | ||
|
|
b0833084a6 | ||
|
|
3cacaa5dad | ||
|
|
e89bd30db5 | ||
|
|
2a9d933a81 | ||
|
|
81f3d893d9 | ||
|
|
05c91082e3 | ||
|
|
7267558ba1 | ||
|
|
ac6803e7b7 | ||
|
|
ffabf8b013 | ||
|
|
e9b71a0d28 | ||
|
|
efbfe66f21 | ||
|
|
6886063703 | ||
|
|
c04e1ad401 | ||
|
|
223b90d0d4 | ||
|
|
692b2cfb79 | ||
|
|
447a86c922 | ||
|
|
e3a2bd3a1e | ||
|
|
f0be6a4b9e | ||
|
|
bdab5d5f6e | ||
|
|
15a4246ead | ||
|
|
9a71845700 | ||
|
|
22f0a1547c | ||
|
|
de0ab43bc1 | ||
|
|
e12cc01aa4 | ||
|
|
71c697288b | ||
|
|
a7d1daee93 | ||
|
|
77a99cc61d | ||
|
|
fb337418a5 | ||
|
|
9d312ab208 | ||
|
|
06be0a1997 | ||
|
|
9e4509b846 | ||
|
|
fc1f0eeda7 | ||
|
|
3d5c094804 | ||
|
|
6abc94ec07 | ||
|
|
6837e5a6a0 | ||
|
|
9761abf3b5 | ||
|
|
599a562170 | ||
|
|
d29a251547 | ||
|
|
31da4bc566 | ||
|
|
0f1a180e15 | ||
|
|
01a45a53aa | ||
|
|
59400d38a9 | ||
|
|
5155b0f608 | ||
|
|
d919f8d50a | ||
|
|
d67aa7c19d | ||
|
|
7a982169c9 | ||
|
|
f2510d60fa | ||
|
|
1e0ea57dc4 | ||
|
|
70b87f2eb6 | ||
|
|
94b2ee627c | ||
|
|
e30a2dd2d7 | ||
|
|
7e07daf8cb | ||
|
|
981906ecd1 | ||
|
|
90fe4c5124 | ||
|
|
2452447c81 | ||
|
|
93f0bb8307 | ||
|
|
47fc08bffe | ||
|
|
c0f2024a2e | ||
|
|
28f3e190c8 | ||
|
|
c4090b670d | ||
|
|
ddf112378b | ||
|
|
b25cce464a | ||
|
|
a2297558ff | ||
|
|
84cdf0cacc | ||
|
|
9e99e5bef9 | ||
|
|
9023ba4a81 | ||
|
|
83488848e1 | ||
|
|
f5a92d6cc3 | ||
|
|
3e8047e583 | ||
|
|
440ac51cf0 | ||
|
|
d3293b889d | ||
|
|
b4b0b34e5a | ||
|
|
fa3d1156a6 | ||
|
|
0eb05b827f | ||
|
|
0c245bc271 | ||
|
|
d65ad1bf15 | ||
|
|
43cbbe111b | ||
|
|
9ceb8a717a | ||
|
|
8331de424a | ||
|
|
98dbdf72b3 | ||
|
|
51a2d09eb7 | ||
|
|
22f0ef6d6b | ||
|
|
975deca85b | ||
|
|
3bbb502387 | ||
|
|
0023dffd0b | ||
|
|
b715e522cf | ||
|
|
4b0b8315a9 | ||
|
|
a654f146d1 | ||
|
|
67b46a151d | ||
|
|
83c7e1e129 | ||
|
|
a6371e2e66 | ||
|
|
7768baa4d1 | ||
|
|
a9a5907a0f | ||
|
|
dc32d1f3f3 | ||
|
|
cbdaa1369f | ||
|
|
8fb20fcdf8 | ||
|
|
72bf226608 | ||
|
|
d4b5699403 | ||
|
|
1dc27be015 | ||
|
|
230a3eb400 | ||
|
|
e39382dedd | ||
|
|
fd016f4507 | ||
|
|
9d728b365d | ||
|
|
ddc0283339 | ||
|
|
b8fdb452be | ||
|
|
6b416ce6be | ||
|
|
ef0392e854 | ||
|
|
efbf184fe8 | ||
|
|
dd577fb857 | ||
|
|
ebd90dbb1a | ||
|
|
c9e700f079 | ||
|
|
3c2d73d161 | ||
|
|
343de8b8ab | ||
|
|
c645b906f3 | ||
|
|
9c1d1ef268 | ||
|
|
ade0483641 | ||
|
|
03a401e477 | ||
|
|
9994521b8c | ||
|
|
e5fd1924db | ||
|
|
cbdd042adc | ||
|
|
a9419da09c | ||
|
|
ccd7104cdc | ||
|
|
1cf4b5ce47 | ||
|
|
1badb3b5d5 | ||
|
|
038d216f18 | ||
|
|
9e3f843291 | ||
|
|
e166ddf46f | ||
|
|
31e1be7570 | ||
|
|
d793b7c03f | ||
|
|
9a715267ad | ||
|
|
eafa432cc6 | ||
|
|
d95e538020 | ||
|
|
adbe8c409a | ||
|
|
58e600f408 | ||
|
|
d34e55c370 | ||
|
|
fbcbcdc001 | ||
|
|
4227a325a5 | ||
|
|
d115507502 | ||
|
|
43d8252050 | ||
|
|
674b4ab647 | ||
|
|
fe8fc1081a | ||
|
|
c7748fedab | ||
|
|
c392efb481 | ||
|
|
1ddd9dd52a | ||
|
|
aa171dcc18 | ||
|
|
b4d8cb7bc1 | ||
|
|
f672e4016f | ||
|
|
76e3dec723 | ||
|
|
d0c3fa0150 | ||
|
|
609f6ce66d | ||
|
|
7298b6c846 | ||
|
|
acec9c4fd7 | ||
|
|
9cdbde4f5e | ||
|
|
f9147a0706 | ||
|
|
33364edfb3 | ||
|
|
5e9ccdec63 | ||
|
|
071aca60be | ||
|
|
133e4d5c51 | ||
|
|
fd56461d5f | ||
|
|
d5f59f8c86 | ||
|
|
a5d8b27671 | ||
|
|
f3f25d5d40 | ||
|
|
f118812c34 | ||
|
|
98dbc95913 | ||
|
|
145c1d214c | ||
|
|
b62a8e3e3e | ||
|
|
e47240931a | ||
|
|
a84874426d | ||
|
|
f38dfd9231 | ||
|
|
510c4a3ef1 | ||
|
|
e7e52c24f5 | ||
|
|
e2a574e2a0 | ||
|
|
ba6ef53ef9 | ||
|
|
c93a28c641 | ||
|
|
7088a679a2 | ||
|
|
04c02a1eb8 | ||
|
|
1536b5a9d6 | ||
|
|
bab756a5d0 | ||
|
|
8c763fe458 | ||
|
|
886255e38a | ||
|
|
0240e75426 | ||
|
|
7102ed8026 | ||
|
|
ebf481e1a1 | ||
|
|
5a52e91350 | ||
|
|
18e458154a | ||
|
|
015e1ab183 | ||
|
|
2a4c799471 | ||
|
|
41487426f5 | ||
|
|
0d24250aa7 | ||
|
|
2050e2f886 | ||
|
|
013e8479af | ||
|
|
27535a7f78 | ||
|
|
333d226ed0 | ||
|
|
04a9dec952 | ||
|
|
6ee76b7154 | ||
|
|
36b1c08ad7 | ||
|
|
7b35d5e9d4 | ||
|
|
6d4ca071a5 | ||
|
|
684a3d30a6 | ||
|
|
25740d27bf | ||
|
|
fb0a52a34a | ||
|
|
c852970cf6 | ||
|
|
def21cc87e | ||
|
|
488c1eb87b | ||
|
|
acaa725478 | ||
|
|
f351550534 | ||
|
|
e8df7e8da5 | ||
|
|
af4252bc80 | ||
|
|
695ffedef9 | ||
|
|
66ecf39efe | ||
|
|
5ad21d7e98 | ||
|
|
1c3e03837c | ||
|
|
7968fa3779 | ||
|
|
31009bb1f6 | ||
|
|
3b8532f3fb | ||
|
|
f45616e5f6 | ||
|
|
ef5125f8f4 | ||
|
|
bf2e07074b | ||
|
|
20695ef369 | ||
|
|
e391f4b17b | ||
|
|
2bd344549b | ||
|
|
e96779de48 | ||
|
|
eb54337c40 | ||
|
|
916a020173 | ||
|
|
c2e4fe983d | ||
|
|
81e898375b | ||
|
|
3c0dea811d | ||
|
|
a6ac0f8965 | ||
|
|
4e1eb03287 | ||
|
|
fcf0f8291d | ||
|
|
0ed71fa027 | ||
|
|
affe21f7c1 | ||
|
|
9facf7897d | ||
|
|
8422402c39 | ||
|
|
9374e0f445 | ||
|
|
19ed233118 | ||
|
|
faa4fff4dd | ||
|
|
2276e7677b | ||
|
|
b5fde6dfa5 | ||
|
|
784d666a8e | ||
|
|
c035910df9 | ||
|
|
efccb6ac82 | ||
|
|
93f9c2ab6b | ||
|
|
4a993cd79e | ||
|
|
02325d2ede | ||
|
|
9c83464b95 | ||
|
|
b1bbd70f0f | ||
|
|
c31d11bfe0 | ||
|
|
c8ec85d649 | ||
|
|
e291f3d257 | ||
|
|
7d27d2ea5e | ||
|
|
dc22846d58 | ||
|
|
c9aaabb5d4 | ||
|
|
335d5d5d72 | ||
|
|
51d793bec1 | ||
|
|
249dcd967e | ||
|
|
302972e9fc | ||
|
|
31b380b266 | ||
|
|
a869dfea85 | ||
|
|
12838c6294 | ||
|
|
49c7102547 | ||
|
|
5cc3338267 | ||
|
|
1ae8972859 | ||
|
|
adcd2c8eac | ||
|
|
45ff355835 | ||
|
|
f8bf3afeae | ||
|
|
f703da1516 | ||
|
|
a582deee2c | ||
|
|
3047bdf653 | ||
|
|
12be9e818f | ||
|
|
a0478f98af | ||
|
|
5e2c62db2f | ||
|
|
d488d796f4 | ||
|
|
f794b1e1aa | ||
|
|
8c425c758c | ||
|
|
0b9e912297 | ||
|
|
d35d2b269f | ||
|
|
fa84ed412d | ||
|
|
16951099d1 | ||
|
|
050ba302cb | ||
|
|
c1f90a99f4 | ||
|
|
510097cc37 | ||
|
|
6a83721c55 | ||
|
|
ca9795c30a | ||
|
|
dc2fa246a9 | ||
|
|
b46bb611b3 | ||
|
|
aa55d759f5 | ||
|
|
2043579f71 | ||
|
|
346e31efa0 | ||
|
|
b504d63117 | ||
|
|
b4b1728b6f | ||
|
|
21792386d8 | ||
|
|
63a2ac21e1 | ||
|
|
c42b206292 | ||
|
|
733d6a6b16 | ||
|
|
8d2725234e | ||
|
|
0823711106 | ||
|
|
860e9eb8c9 | ||
|
|
3d2092ee23 | ||
|
|
8855efebc0 | ||
|
|
7725577a53 | ||
|
|
668e3f664f | ||
|
|
9e51733c71 | ||
|
|
6b39a5621d | ||
|
|
0d46e11826 | ||
|
|
ff58207034 | ||
|
|
b3d76b7e5c | ||
|
|
4d6c816abb | ||
|
|
f35ceaee0a | ||
|
|
a64a2a65a9 | ||
|
|
1a75abffa5 | ||
|
|
c6a0f5d3f9 | ||
|
|
bb75e3ea55 | ||
|
|
814eebf976 | ||
|
|
e08d4f28aa | ||
|
|
6f3c65dc64 | ||
|
|
0a3ada4fea | ||
|
|
8bdf7917c4 | ||
|
|
67d16a086e | ||
|
|
b8018f12ba | ||
|
|
607780b7f9 | ||
|
|
af1c497759 | ||
|
|
8e331cfc65 | ||
|
|
edf811fa02 | ||
|
|
b25b7693ba | ||
|
|
9dc9459f3a | ||
|
|
37b92967c5 | ||
|
|
768504e956 | ||
|
|
2571accfc3 | ||
|
|
0d2abdb5d9 | ||
|
|
79200a8611 | ||
|
|
123ae985d5 | ||
|
|
659d1c7cf7 | ||
|
|
281cd7c057 | ||
|
|
63e8766091 | ||
|
|
18da582c87 | ||
|
|
0562cf99ba | ||
|
|
60ac702038 | ||
|
|
1dedb96478 | ||
|
|
7537722a44 | ||
|
|
4ebd69193e | ||
|
|
d4d92ac1a7 | ||
|
|
5385d1fa80 | ||
|
|
dbee2f1996 | ||
|
|
6dd70926fa | ||
|
|
5dfc0918c3 | ||
|
|
2eb14658d3 | ||
|
|
c1f196dbec | ||
|
|
ce108acebb | ||
|
|
0555e2c781 | ||
|
|
6bfd1f1727 | ||
|
|
baa77c8ae3 | ||
|
|
7235dbadfd | ||
|
|
ecec41025f | ||
|
|
799843cc97 | ||
|
|
16e91baa79 | ||
|
|
f2536445f7 | ||
|
|
ede70ee3a4 | ||
|
|
66ed427a57 | ||
|
|
c9e63e9fdb | ||
|
|
ddf7f5c131 | ||
|
|
660e40d07e | ||
|
|
9f3db5a70b | ||
|
|
1a59730782 | ||
|
|
20029e7ce8 | ||
|
|
fcb7950811 | ||
|
|
4eb57e1e9a | ||
|
|
1d52e2cc77 | ||
|
|
209aceeb14 | ||
|
|
ae70875f45 | ||
|
|
eda7410f4c | ||
|
|
e60141b4dd | ||
|
|
5b21742095 | ||
|
|
5665de5ee7 | ||
|
|
d5b9be0393 | ||
|
|
d2d9b45a81 | ||
|
|
9ebbdb9b0b | ||
|
|
48da345e79 | ||
|
|
edbfa46cbc | ||
|
|
90709a6de4 | ||
|
|
992c2fa2d4 | ||
|
|
ed915fed92 | ||
|
|
8aa29d5a66 | ||
|
|
9604e0aad2 | ||
|
|
25d053cbf2 | ||
|
|
055257a210 | ||
|
|
50cfb997cc | ||
|
|
d662c4c0cc | ||
|
|
457d98c860 | ||
|
|
6bb166aaaa | ||
|
|
cca9bc5176 | ||
|
|
8b6b25220d | ||
|
|
3c3f1b7ff2 | ||
|
|
57d89131e9 | ||
|
|
7c6d1896a4 | ||
|
|
ad83c7f704 | ||
|
|
6b52d040b1 | ||
|
|
404fa89937 | ||
|
|
89377556cd | ||
|
|
ec93114347 | ||
|
|
df1c5ce314 | ||
|
|
a0e4b6e266 | ||
|
|
0de39b64cb | ||
|
|
36a7b4e275 | ||
|
|
d3cc8e0ac0 | ||
|
|
db1ce4eeeb | ||
|
|
c22cbbf828 | ||
|
|
5acee73fc8 | ||
|
|
466c337bcb | ||
|
|
98a468a101 | ||
|
|
47c58c01d1 | ||
|
|
a9edf85a69 | ||
|
|
e7a1862517 | ||
|
|
f930f37d35 | ||
|
|
4feb57e895 | ||
|
|
712e3eb120 | ||
|
|
d8e423df1a | ||
|
|
09aa0dc676 | ||
|
|
83174de420 | ||
|
|
8ff0197a43 | ||
|
|
a2b5db0003 | ||
|
|
2803ec2e96 | ||
|
|
ddd4f675a2 | ||
|
|
d271dd2cce | ||
|
|
ebfdd37451 | ||
|
|
f6d6110aaa | ||
|
|
a0730cf264 | ||
|
|
ec61b3a5fc | ||
|
|
521f2294cb | ||
|
|
2f0674807c | ||
|
|
de0f46b947 | ||
|
|
1a57fa095f | ||
|
|
167242fec0 | ||
|
|
81208d78ac | ||
|
|
da8b01771f | ||
|
|
725fbe946b | ||
|
|
b99ecb4dc9 | ||
|
|
208a96b211 | ||
|
|
43774455cc | ||
|
|
5b61e077e0 | ||
|
|
921cc3e5db | ||
|
|
51dce3d161 | ||
|
|
c10f013fc2 | ||
|
|
2874d68bdb | ||
|
|
11e83eb7e7 | ||
|
|
9ec9a8705e | ||
|
|
170635e3a6 | ||
|
|
a5d1444ef4 | ||
|
|
55708b39c3 | ||
|
|
8c5ebdff36 | ||
|
|
1c84f324a1 | ||
|
|
3dba09f339 | ||
|
|
7ebf8e66c9 | ||
|
|
62218fe59d | ||
|
|
95d9bb6dfc | ||
|
|
33986075ef | ||
|
|
766905ba9f | ||
|
|
a29c64b6c7 | ||
|
|
777e1cabc5 | ||
|
|
396e97fc94 | ||
|
|
9c6a4505c8 | ||
|
|
238c3adad1 | ||
|
|
c1d0a8b5ce | ||
|
|
08ce24ec3f | ||
|
|
79eb7623ef | ||
|
|
b9e64d0472 | ||
|
|
4f500149af | ||
|
|
281b8714ef | ||
|
|
d5be3cce9c | ||
|
|
8dcefaf2e3 | ||
|
|
48e3432a63 | ||
|
|
69d3c611aa | ||
|
|
36827e1134 | ||
|
|
351ac4a2c0 | ||
|
|
36fff59a38 | ||
|
|
1e60a4386a | ||
|
|
e9f1b53ae6 | ||
|
|
5016839b90 | ||
|
|
faf35e6082 | ||
|
|
d07a6edd2f | ||
|
|
553d4e9283 | ||
|
|
7cef52478d | ||
|
|
e7ce362d22 | ||
|
|
c551c8b31b | ||
|
|
9c36e71081 | ||
|
|
c9c57af5f7 | ||
|
|
2516496993 | ||
|
|
3b565b5f97 | ||
|
|
0742976138 | ||
|
|
1a63663c85 | ||
|
|
00a20fc8a5 | ||
|
|
6ab4fb368c | ||
|
|
fa39bb0a50 | ||
|
|
645663cdfe | ||
|
|
ee2bcbb41d | ||
|
|
12b4ebf8d4 | ||
|
|
8da4750ee2 | ||
|
|
d22df2915c | ||
|
|
e77d96cf89 | ||
|
|
ae28ba84d2 | ||
|
|
b3f3b01958 | ||
|
|
52e9cab1c1 | ||
|
|
1baaaa40cc | ||
|
|
b8ed420058 | ||
|
|
ed16ee3029 | ||
|
|
7338b16c18 | ||
|
|
f529441400 | ||
|
|
03664d0426 | ||
|
|
652cfb7caf | ||
|
|
5540fbaec2 | ||
|
|
0a0b473765 | ||
|
|
df2d041483 | ||
|
|
ffc6e19548 | ||
|
|
d874d7661f | ||
|
|
1d66e714e6 | ||
|
|
d98a863b82 | ||
|
|
3b6790c7dc | ||
|
|
5ee3a9a9ca | ||
|
|
dd26fa67f2 | ||
|
|
89f5e60422 | ||
|
|
c616165f81 | ||
|
|
103832742d | ||
|
|
3e7e0bcb18 | ||
|
|
7d3d8f20ab | ||
|
|
e1e3ce980a | ||
|
|
7855a32579 | ||
|
|
9c92afa5fe | ||
|
|
edac498d03 | ||
|
|
d7d9dbd2c2 | ||
|
|
f8eece22c8 | ||
|
|
df563db294 | ||
|
|
01b0d9eb97 | ||
|
|
a7f13d841f | ||
|
|
686d8bbe69 | ||
|
|
4b36af4a34 | ||
|
|
4a23a4bfee | ||
|
|
ac3ad452c0 | ||
|
|
027c01511c | ||
|
|
4fdcc0496f | ||
|
|
0c4a2bea69 | ||
|
|
2ba3401238 | ||
|
|
1735284a2a | ||
|
|
8a3192ffc1 | ||
|
|
ffea273a28 | ||
|
|
1783aac438 | ||
|
|
29bf3d2c04 | ||
|
|
ee16fc958c | ||
|
|
5d73215a8d | ||
|
|
b7356bc526 | ||
|
|
8ec8282f38 | ||
|
|
43b7b98949 | ||
|
|
f791065a98 | ||
|
|
d95db28695 | ||
|
|
851fb16e7c | ||
|
|
a4cbaafd10 | ||
|
|
c5f2cdb822 | ||
|
|
1892d29be0 | ||
|
|
9e5a49b8cb | ||
|
|
767ade02f4 | ||
|
|
6e05071a47 | ||
|
|
c8a990b9d3 | ||
|
|
6868ceae9b | ||
|
|
cace646346 | ||
|
|
abcc225763 | ||
|
|
b9673fc521 | ||
|
|
b0ea3f4261 | ||
|
|
0103219f00 | ||
|
|
e15b4f40d6 | ||
|
|
66235fddff | ||
|
|
f9c5d026f4 | ||
|
|
c46239af22 | ||
|
|
48eb3ff8d9 | ||
|
|
5646dcc791 | ||
|
|
5d9876e338 | ||
|
|
083340a937 | ||
|
|
378fa5ee6a | ||
|
|
4764daf3c2 | ||
|
|
6357496d17 | ||
|
|
001e2a604b | ||
|
|
f370911c15 | ||
|
|
ef5cf40fa6 | ||
|
|
837bd79b20 | ||
|
|
3edd4a24af | ||
|
|
535a61b5a9 | ||
|
|
e87b7daab5 | ||
|
|
f20689519d | ||
|
|
ee9c460f74 | ||
|
|
84ba14fa29 | ||
|
|
3c75963352 | ||
|
|
5f9dd8287c | ||
|
|
d99f074eb7 | ||
|
|
a989140a07 | ||
|
|
420a4c163d | ||
|
|
1bab735580 | ||
|
|
a0fcd0cf22 | ||
|
|
5d5c753c74 | ||
|
|
7e7e3eb8d5 | ||
|
|
2e5f8aeba1 | ||
|
|
c2fe961db1 | ||
|
|
2a6acc04a1 | ||
|
|
a467128093 | ||
|
|
abf41eb85c | ||
|
|
d83dea4463 | ||
|
|
ec43721c3c | ||
|
|
39d52762d1 | ||
|
|
8d45d0d104 | ||
|
|
26ec62714c | ||
|
|
7873b5e78b | ||
|
|
1b889c527f | ||
|
|
9937ff8ac0 | ||
|
|
abd1949825 | ||
|
|
4e6bc77a70 | ||
|
|
531948358b | ||
|
|
0d3ec9c324 | ||
|
|
21caca4aea | ||
|
|
fbf3edf07d | ||
|
|
76fcf25898 | ||
|
|
56257f072b | ||
|
|
44401158e8 | ||
|
|
95b2df8261 | ||
|
|
1ebadf8620 | ||
|
|
9179d9592d | ||
|
|
f208217412 | ||
|
|
43c5058682 | ||
|
|
97b4a6b51f | ||
|
|
f405d27c56 | ||
|
|
99949c8f6f | ||
|
|
3a9697adf2 | ||
|
|
78c4351e04 | ||
|
|
0a427890fe | ||
|
|
e735abe334 | ||
|
|
c0070b2f13 | ||
|
|
cfedc6e9b4 | ||
|
|
b66d7f7e0b | ||
|
|
e01df06cd7 | ||
|
|
6584897b69 | ||
|
|
aa4f45b9a5 | ||
|
|
96ad5b8444 | ||
|
|
097e5dfbdc | ||
|
|
2ef7ee6ca7 | ||
|
|
2685b53b30 | ||
|
|
533e4fcdad | ||
|
|
006b8fa3f0 | ||
|
|
6a01153ce4 | ||
|
|
34aab116ae | ||
|
|
33232face9 | ||
|
|
b88b2b3d79 | ||
|
|
744d729dab | ||
|
|
71b5e43153 | ||
|
|
8459f27312 | ||
|
|
7dfbdef505 | ||
|
|
94386374ff | ||
|
|
f5d3859238 | ||
|
|
ef39da5973 | ||
|
|
81e8c4bbff | ||
|
|
8ca3642429 | ||
|
|
1dc000c06a | ||
|
|
4f093d5b97 | ||
|
|
e1b032cbad | ||
|
|
6f365c30eb | ||
|
|
718e180423 | ||
|
|
cead5e5bd7 | ||
|
|
cf15629aea | ||
|
|
a727d0bb0b | ||
|
|
0a218ee56a | ||
|
|
74beefcaf6 | ||
|
|
399a3abefc | ||
|
|
cee5036aca | ||
|
|
790823abb4 | ||
|
|
f546849352 | ||
|
|
a85af593f1 | ||
|
|
07067f8b95 | ||
|
|
a1e824ada0 | ||
|
|
f5f1bfbef1 | ||
|
|
cd108ba3aa | ||
|
|
2bb5bfa74e | ||
|
|
624e7a447d | ||
|
|
37420c342b | ||
|
|
ef40e362c9 | ||
|
|
ef369c2e2b | ||
|
|
6452461c39 | ||
|
|
1e89ca0994 | ||
|
|
92bb10eed8 | ||
|
|
8465c5fe0e | ||
|
|
42e248a8da | ||
|
|
e71a652985 | ||
|
|
bfef0fbff3 | ||
|
|
545685bc32 | ||
|
|
13ad2b4dc2 | ||
|
|
d019343017 | ||
|
|
e977ec924c | ||
|
|
b7d5652bf6 | ||
|
|
725e48fce4 | ||
|
|
43816c268b | ||
|
|
72e80db823 | ||
|
|
7b33c343f8 | ||
|
|
6d0601b99f | ||
|
|
b6e713711d | ||
|
|
c53edeeb6c | ||
|
|
dfb98417b3 | ||
|
|
9716c3a30e | ||
|
|
c4c44c4445 | ||
|
|
0debe9bd6f | ||
|
|
f1da118a6c | ||
|
|
c30c46cd5f | ||
|
|
d394017926 | ||
|
|
04525c0259 | ||
|
|
08a0bb756d | ||
|
|
20c6159c04 | ||
|
|
a47e9d1a4b | ||
|
|
e93dd374a4 | ||
|
|
0847ca4ec2 | ||
|
|
572d8d0cc4 | ||
|
|
c9a57d354d | ||
|
|
52b77f6e31 | ||
|
|
4c9782ee28 | ||
|
|
26225307d3 | ||
|
|
0129d1e158 | ||
|
|
ece6037a1e | ||
|
|
bea678a7cd | ||
|
|
1fb3fbb4de | ||
|
|
2c38d19af2 | ||
|
|
311e627463 | ||
|
|
8e1e36a0d5 | ||
|
|
db0bb425e7 | ||
|
|
e001dd2d45 | ||
|
|
c38772c97f | ||
|
|
3a31589fdd | ||
|
|
460522bb67 | ||
|
|
176debaf37 | ||
|
|
072f83b240 | ||
|
|
cbd6770f2f | ||
|
|
0c3a7bcf12 | ||
|
|
389fbaaca2 | ||
|
|
9652efd107 | ||
|
|
f3ea834322 | ||
|
|
02a6a46e86 | ||
|
|
75ad90abc7 | ||
|
|
4104593180 | ||
|
|
78e1704122 | ||
|
|
b9e99575ce | ||
|
|
fa5e06f95d | ||
|
|
3041409334 | ||
|
|
71536eb412 | ||
|
|
fe77230d84 | ||
|
|
accd262561 | ||
|
|
3057d19cdf | ||
|
|
8dd83a2cf3 | ||
|
|
49b84f9229 | ||
|
|
b43bf4dd74 | ||
|
|
5ed0eb51d1 | ||
|
|
72a1ca3b99 | ||
|
|
14424281a0 | ||
|
|
2b3fd0d4d3 | ||
|
|
894b9cfdb9 | ||
|
|
72ff9bd3e6 | ||
|
|
7ecbb0454f | ||
|
|
fa7fa2a55f | ||
|
|
5c0576ca55 | ||
|
|
039b354490 | ||
|
|
b2f03e76ff | ||
|
|
63b33b6ec5 | ||
|
|
23670795db | ||
|
|
8ea6c113b5 | ||
|
|
37f026a0a6 | ||
|
|
f67136df19 | ||
|
|
e07073ff28 | ||
|
|
64b0ba6da7 | ||
|
|
99d4ae0c1a | ||
|
|
f185b35088 | ||
|
|
4e909f9411 | ||
|
|
99f49e266c | ||
|
|
0458211ebc | ||
|
|
8a7b9d9f45 | ||
|
|
3fcf463f9e | ||
|
|
f77cd63286 | ||
|
|
2378c2d754 | ||
|
|
bbdb4a67e1 | ||
|
|
21851c0673 | ||
|
|
83f6498aac | ||
|
|
7e219c362c | ||
|
|
525a791987 | ||
|
|
fb19210cfd | ||
|
|
203f48d1fd | ||
|
|
371c82b2bf | ||
|
|
8176880173 | ||
|
|
b0b2c5b3e0 | ||
|
|
29742d23d3 | ||
|
|
533a6b0240 | ||
|
|
0c0400b6fc | ||
|
|
2e83af7c21 | ||
|
|
a3f7947ad2 | ||
|
|
7d9d459ac2 | ||
|
|
3ea1073809 | ||
|
|
76a959a578 | ||
|
|
f43873dc5f | ||
|
|
921553d7bb | ||
|
|
c476819cb1 | ||
|
|
77a56c7c5a | ||
|
|
46deb7ca82 | ||
|
|
b03f9ece05 | ||
|
|
27946a981f | ||
|
|
74617389c8 | ||
|
|
1d8840412f | ||
|
|
df1152ee0f | ||
|
|
b4a8b8c0d4 | ||
|
|
ffa9f4b47f | ||
|
|
667e22bbc7 | ||
|
|
d4d838c8bb | ||
|
|
c61a889c86 | ||
|
|
567fe89a77 | ||
|
|
950772ab8a | ||
|
|
0bd0e2a3ec | ||
|
|
47774ce882 | ||
|
|
3c9bcdd347 | ||
|
|
3934d2d30c | ||
|
|
423ce9557a | ||
|
|
947848ebf6 | ||
|
|
5e22fe488e | ||
|
|
c666cf1c44 | ||
|
|
79435dbdec | ||
|
|
27206368da | ||
|
|
2be245b75e | ||
|
|
17927f5c26 | ||
|
|
754f26a97c | ||
|
|
29241c4f83 | ||
|
|
6f655eb9b9 | ||
|
|
65dfd90141 | ||
|
|
59abdbd2dd | ||
|
|
a6d6873856 | ||
|
|
e99df3a3be | ||
|
|
8b657255cc | ||
|
|
0e1dc79321 | ||
|
|
0ef15e5fac | ||
|
|
9ea8a840a9 | ||
|
|
7b88089593 | ||
|
|
b513943893 | ||
|
|
edffc56600 | ||
|
|
856b0e6886 | ||
|
|
bf1eb46b87 | ||
|
|
7e27d660e2 | ||
|
|
53174ea45f | ||
|
|
87b624f5d5 | ||
|
|
443e96381a | ||
|
|
1cbba4fc59 | ||
|
|
344b6dd179 | ||
|
|
d8c829fa0c | ||
|
|
e1efc71ad3 | ||
|
|
f804a739b1 | ||
|
|
2ed870c854 | ||
|
|
ce35ba9ac9 | ||
|
|
724a59aaf7 | ||
|
|
42d8c2981f | ||
|
|
9aa91e0f17 | ||
|
|
5aabee8996 | ||
|
|
48a84ca23e | ||
|
|
8751783a1b | ||
|
|
3a2ec50d5f | ||
|
|
ce9aeed4cb | ||
|
|
f2be6432a9 | ||
|
|
e96f8c0444 | ||
|
|
2bf3bc3e10 | ||
|
|
28143f86f9 | ||
|
|
76ec3d3248 | ||
|
|
d0c85a5a96 | ||
|
|
46ed717af4 | ||
|
|
ad37c88f80 | ||
|
|
8c6e8a6eb8 | ||
|
|
dd33317f45 | ||
|
|
c344d63fb3 | ||
|
|
62557f4d6b | ||
|
|
9c46cc4ea0 | ||
|
|
a236a439cc | ||
|
|
c779e2674a | ||
|
|
a94d4be466 | ||
|
|
b7d2d4cfe8 | ||
|
|
a6c797ee4b | ||
|
|
3e40b2249f | ||
|
|
2fe1b5034d | ||
|
|
b4430839a3 | ||
|
|
412cf974a4 | ||
|
|
3fc6beeff0 | ||
|
|
2ff35c8bfa | ||
|
|
169db88c20 | ||
|
|
ca419c84b8 | ||
|
|
aede71b1dc | ||
|
|
14d573cbf1 | ||
|
|
7819aa6b20 | ||
|
|
7cc6b63aac | ||
|
|
4af6362751 | ||
|
|
d54075197f | ||
|
|
5cce56199b | ||
|
|
3cc12817f6 | ||
|
|
68875ba600 | ||
|
|
c345c5ebae | ||
|
|
2119a16e24 | ||
|
|
9f5c938ff3 | ||
|
|
b42a8d2364 | ||
|
|
61fc01e79e | ||
|
|
cceaec1d74 | ||
|
|
8e5f9c8160 | ||
|
|
c620fd42f4 | ||
|
|
2a859f870a | ||
|
|
b680753db8 | ||
|
|
35af940166 | ||
|
|
bc0fec0afe | ||
|
|
e3eca82cc3 | ||
|
|
e7651d0d0f | ||
|
|
5cf4ce9318 | ||
|
|
6a6f28668f | ||
|
|
dadf1339b5 | ||
|
|
c2c4228722 | ||
|
|
5469941f2b | ||
|
|
e888c9e827 | ||
|
|
3d3bca5338 | ||
|
|
6a3008d7ff | ||
|
|
2556449b36 | ||
|
|
446f9973cc | ||
|
|
596f36bb78 | ||
|
|
e7abdab58d | ||
|
|
13cdc9a9f8 | ||
|
|
a1b8806422 | ||
|
|
e635d47912 | ||
|
|
53ac72a878 | ||
|
|
2be6184c8d | ||
|
|
8b0b4ff086 | ||
|
|
60f7ff3de5 | ||
|
|
e76c752987 | ||
|
|
042c1abc6e | ||
|
|
1401621913 | ||
|
|
3c034b0a0c | ||
|
|
395191bd75 | ||
|
|
ec7d8fb6bd | ||
|
|
062948b110 | ||
|
|
7f3dc5f040 | ||
|
|
dd0798a317 | ||
|
|
9209ccfa40 | ||
|
|
2525d32e17 | ||
|
|
f3ac8a7cd9 | ||
|
|
f3d95f70e2 | ||
|
|
57526067f5 | ||
|
|
0545bab35d | ||
|
|
293836494d | ||
|
|
ae8bda190e | ||
|
|
34d9d8abd4 | ||
|
|
bd67e986f4 | ||
|
|
e587518d85 | ||
|
|
210b6c38bd | ||
|
|
9592c0b466 | ||
|
|
a33537b2b9 | ||
|
|
81d5c9757c | ||
|
|
f34124a50b | ||
|
|
74a39c715b | ||
|
|
195496333b | ||
|
|
9ccaa90439 | ||
|
|
4733c5fef0 | ||
|
|
a97ddc8cb9 | ||
|
|
59a5b000e0 | ||
|
|
d49a2ccb08 | ||
|
|
4a75acb46c | ||
|
|
453368078b | ||
|
|
6e3b643bdf | ||
|
|
a769352a74 | ||
|
|
8a63c27925 | ||
|
|
310895f060 | ||
|
|
4428894aba | ||
|
|
3d12d7de62 | ||
|
|
87593f95d4 | ||
|
|
11626e48bf | ||
|
|
4f021cbced | ||
|
|
ba31d176c8 | ||
|
|
68edbc3e4a | ||
|
|
5068227a46 | ||
|
|
f8f3bc89e7 | ||
|
|
635f7026b0 | ||
|
|
0f1e4f0326 | ||
|
|
89355edb8a | ||
|
|
37c8f5c1da | ||
|
|
5bba2df526 | ||
|
|
1935694440 | ||
|
|
12dd6ea8bb | ||
|
|
a1f922b040 | ||
|
|
017cf088a1 | ||
|
|
df627cc417 | ||
|
|
1b20300b73 | ||
|
|
3b9ffea36f | ||
|
|
e242f3999c | ||
|
|
523f89cc8c | ||
|
|
0575a6d652 | ||
|
|
08b88714e0 | ||
|
|
bcaff4b844 | ||
|
|
82f336a78f | ||
|
|
350aa33022 | ||
|
|
d6290a2f1a | ||
|
|
71e9d08863 | ||
|
|
9729dc7594 | ||
|
|
92c1b8f31e | ||
|
|
9ffa2604f8 | ||
|
|
03b1fad4d4 | ||
|
|
72eb4c534f | ||
|
|
47d936e9cc | ||
|
|
8e08407090 | ||
|
|
c0a4558c62 | ||
|
|
5ecb6fecc4 | ||
|
|
b3df4dc2c9 | ||
|
|
3db9ab82ea | ||
|
|
2dc3acc5f0 | ||
|
|
25686e5bce | ||
|
|
8d70f808d9 | ||
|
|
7c887af1ea | ||
|
|
b7f435b50e | ||
|
|
d3b15f8fda | ||
|
|
eea726740b | ||
|
|
0ea4c970d7 | ||
|
|
57936a1374 | ||
|
|
9242fde6b8 | ||
|
|
d1f653be65 | ||
|
|
0035dceb0a | ||
|
|
838f7cd210 | ||
|
|
13539961b2 | ||
|
|
a26f2ef17d | ||
|
|
d97c46bcdc | ||
|
|
2b6542467c | ||
|
|
8fa51faa38 | ||
|
|
b2175629fd | ||
|
|
2e28ed8f81 | ||
|
|
4c4f8bf02a | ||
|
|
e464be5f39 | ||
|
|
d7d717f2ce | ||
|
|
d1eeed6a5b | ||
|
|
b159bc0c5f | ||
|
|
a222c4879c | ||
|
|
eb2f413cf0 | ||
|
|
736fd0e293 | ||
|
|
6592ca9f88 | ||
|
|
762712c756 | ||
|
|
73f9e17951 | ||
|
|
7d6a605a85 | ||
|
|
a6a8bdffc3 | ||
|
|
296085ff23 | ||
|
|
36aa8ce3c9 | ||
|
|
c49c69d6ea | ||
|
|
d5684f7444 | ||
|
|
affb4bd923 | ||
|
|
65772a74e0 | ||
|
|
cca2c2f4ca | ||
|
|
52e2fa91c4 | ||
|
|
dca405a746 | ||
|
|
e54748d355 | ||
|
|
3680a6bbbb | ||
|
|
6aa6a9c272 | ||
|
|
8d1c7ca206 | ||
|
|
52b8e0f9ec | ||
|
|
08e2e2e791 | ||
|
|
3c4f4793b5 | ||
|
|
e2950a7e4d | ||
|
|
531c0067ec | ||
|
|
e228caaca6 | ||
|
|
4b4aa64261 | ||
|
|
9ac8f89b1d | ||
|
|
c6a72a14ac | ||
|
|
c74edd0e33 | ||
|
|
98acf3f281 | ||
|
|
26735390ff | ||
|
|
9402b23dd5 | ||
|
|
246db3d565 | ||
|
|
eaf414cbc8 | ||
|
|
327d41c00f | ||
|
|
05d8ce3bcd | ||
|
|
fe30db935b | ||
|
|
6303d54cbb | ||
|
|
9d91aa23e6 | ||
|
|
c2ada39fd3 | ||
|
|
def2fe8805 | ||
|
|
77b6e27500 | ||
|
|
99640171e2 | ||
|
|
38b3ab791f | ||
|
|
a86fc52eea | ||
|
|
6d3ed3f16f | ||
|
|
be798998bf | ||
|
|
c3b425d570 | ||
|
|
a25743875f | ||
|
|
124d1a5942 | ||
|
|
eec77b3ae7 | ||
|
|
f680b0a431 | ||
|
|
d4b00ff11c | ||
|
|
532f94a187 | ||
|
|
87ad2f8542 | ||
|
|
640bac1aa4 | ||
|
|
0b12fae84d | ||
|
|
a8f891efcd | ||
|
|
d9353c4fd3 | ||
|
|
0c9fc2f809 | ||
|
|
b5fc2419e8 | ||
|
|
fe588a255b | ||
|
|
1fc571088b | ||
|
|
8d83914f05 | ||
|
|
0fdcd381bc | ||
|
|
4f293ecd6f | ||
|
|
b6303313f0 | ||
|
|
a28449a123 | ||
|
|
6dcec36621 | ||
|
|
1a954748a0 | ||
|
|
84d0fd39a3 | ||
|
|
4d4b7e3de0 | ||
|
|
e2aea6bce5 | ||
|
|
5779146a7f | ||
|
|
a1d1c2beaa | ||
|
|
ee9c60fad4 | ||
|
|
2abad0f479 | ||
|
|
1674a4ec82 | ||
|
|
ce370bee60 | ||
|
|
2fb40fe728 | ||
|
|
b57330cf75 | ||
|
|
8cd91fabf9 | ||
|
|
e0580ee385 | ||
|
|
e257484870 | ||
|
|
2a1f4539f6 | ||
|
|
906efdd320 | ||
|
|
144d092637 | ||
|
|
948b8f35e6 | ||
|
|
e776c605ad | ||
|
|
8b2f4fc823 | ||
|
|
03018611f8 | ||
|
|
2bde9afdb9 | ||
|
|
f8b09c194f | ||
|
|
0e69ad32c1 | ||
|
|
9b4e14df71 | ||
|
|
03f7803f26 | ||
|
|
c6cbcc2c25 | ||
|
|
27aa34d4ae | ||
|
|
79e0db4ca0 | ||
|
|
8f99c954ad | ||
|
|
5735c9efc1 | ||
|
|
9ae3acf2e7 | ||
|
|
731ea9b489 | ||
|
|
18b30b5019 | ||
|
|
e6c3acaa6f | ||
|
|
24d51b9d14 | ||
|
|
a1edc199df | ||
|
|
db4aa81528 | ||
|
|
319ba94a52 | ||
|
|
1025f0be91 | ||
|
|
77d3b5e8f1 | ||
|
|
a0ad96a787 | ||
|
|
39c5af5dbc | ||
|
|
acca6a799b | ||
|
|
b77e62260a | ||
|
|
b6995ca011 | ||
|
|
715844fd08 | ||
|
|
2b29ca796e | ||
|
|
44b4b50949 | ||
|
|
5184008812 | ||
|
|
cf696ce443 | ||
|
|
1a2ea4c06c | ||
|
|
a800afcbf8 | ||
|
|
ff4534613a | ||
|
|
b8fe2c74bc | ||
|
|
be3b5199b0 | ||
|
|
d849a40af6 | ||
|
|
4f48c10312 | ||
|
|
5274fee8a7 | ||
|
|
5462f34ed0 | ||
|
|
0958ed5844 | ||
|
|
e3cba18532 | ||
|
|
9bf7fde49f | ||
|
|
4783ebc918 | ||
|
|
8bda52783b | ||
|
|
07feec7ea6 | ||
|
|
e7471f589a | ||
|
|
24208be5cf | ||
|
|
8db5f66498 | ||
|
|
be670bfd1f | ||
|
|
19acf090ed | ||
|
|
2de7f6b457 | ||
|
|
a2e265e9a2 | ||
|
|
28d7b29d72 | ||
|
|
9cb4aaf3c2 | ||
|
|
80dc602193 | ||
|
|
c7f5a87258 |
129
.gitignore
vendored
129
.gitignore
vendored
@@ -1,61 +1,88 @@
|
||||
*.Plo
|
||||
*.Po
|
||||
*.a
|
||||
*.bz2
|
||||
*.d
|
||||
*.gz
|
||||
*.la
|
||||
*.lo
|
||||
*.o
|
||||
.deps
|
||||
.dirstamp
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
compile
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.log
|
||||
config.mk
|
||||
config.status
|
||||
config.sub
|
||||
config_detected.h
|
||||
config_detected.mk
|
||||
configure
|
||||
configure.lineno
|
||||
depcomp
|
||||
depmode
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
mkinstalldirs
|
||||
mpd
|
||||
mpd.exe
|
||||
stamp-h1
|
||||
tags
|
||||
*.exe
|
||||
|
||||
*~
|
||||
|
||||
.#*
|
||||
.stgit*
|
||||
doc/protocol.html
|
||||
doc/protocol
|
||||
doc/user
|
||||
doc/developer
|
||||
doc/sticker
|
||||
doc/api
|
||||
test/software_volume
|
||||
test/run_convert
|
||||
test/run_decoder
|
||||
test/read_tags
|
||||
test/run_filter
|
||||
test/run_encoder
|
||||
test/run_output
|
||||
test/read_conf
|
||||
test/run_input
|
||||
test/read_mixer
|
||||
test/dump_playlist
|
||||
test/run_normalize
|
||||
test/tmp
|
||||
test/run_inotify
|
||||
.deps
|
||||
.dirstamp
|
||||
|
||||
tags
|
||||
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/aclocal.m4
|
||||
/autom4te.cache
|
||||
/config.h
|
||||
/config.h.in
|
||||
/config.log
|
||||
/config.mk
|
||||
/config.status
|
||||
/config_detected.h
|
||||
/config_detected.mk
|
||||
/configure
|
||||
/configure.lineno
|
||||
/depmode
|
||||
/libtool
|
||||
/ltmain.sh
|
||||
/mkinstalldirs
|
||||
/build
|
||||
/src/mpd
|
||||
/systemd/system/mpd.service
|
||||
/systemd/user/mpd.service
|
||||
/stamp-h1
|
||||
|
||||
/src/dsd2pcm/dsd2pcm
|
||||
/src/win32/mpd_win32_rc.rc
|
||||
|
||||
/doc/doxygen.conf
|
||||
/doc/protocol.html
|
||||
/doc/protocol
|
||||
/doc/user
|
||||
/doc/developer
|
||||
/doc/sticker
|
||||
/doc/api
|
||||
|
||||
/test/software_volume
|
||||
/test/run_convert
|
||||
/test/run_decoder
|
||||
/test/read_tags
|
||||
/test/run_filter
|
||||
/test/run_encoder
|
||||
/test/run_output
|
||||
/test/read_conf
|
||||
/test/run_input
|
||||
/test/read_mixer
|
||||
/test/dump_playlist
|
||||
/test/run_normalize
|
||||
/test/tmp
|
||||
/test/run_inotify
|
||||
/test/test_queue_priority
|
||||
/test/test_protocol
|
||||
/test/run_ntp_server
|
||||
/test/run_resolver
|
||||
/test/run_tcp_connect
|
||||
/test/test_pcm
|
||||
/test/dump_rva2
|
||||
/test/dump_text_file
|
||||
/test/test_util
|
||||
/test/test_byte_reverse
|
||||
/test/test_mixramp
|
||||
/test/test_vorbis_encoder
|
||||
/test/DumpDatabase
|
||||
|
||||
/lib/
|
||||
|
||||
/*.tar.gz
|
||||
/*.tar.bz2
|
||||
/*.tar.xz
|
||||
/mpd-*/
|
||||
|
||||
__pycache__/
|
||||
|
||||
36
.travis.yml
Normal file
36
.travis.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
dist: trusty
|
||||
language: cpp
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libcppunit-dev
|
||||
- libboost-dev
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
env:
|
||||
global:
|
||||
- MAKEFLAGS="-j2"
|
||||
|
||||
before_install:
|
||||
# C++14
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || sudo apt-get update -qq
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew update
|
||||
|
||||
install:
|
||||
# C++14
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || sudo apt-get install -qq g++-5
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew install cppunit
|
||||
|
||||
script:
|
||||
- OPTIONS="--enable-test"
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || export CC=gcc-5 CXX=g++-5
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || OPTIONS="$OPTIONS --enable-osx"
|
||||
- ./autogen.sh
|
||||
- ./configure --disable-silent-rules --disable-dependency-tracking $OPTIONS
|
||||
- make
|
||||
- make check
|
||||
101
AUTHORS
101
AUTHORS
@@ -1,67 +1,38 @@
|
||||
Current Developers
|
||||
------------------
|
||||
Music Player Daemon - http://www.musicpd.org
|
||||
Copyright 2003-2017 The Music Player Daemon Project
|
||||
|
||||
Avuton Olrich <avuton@gmail.com>
|
||||
release manager
|
||||
The following people have contributed code to MPD:
|
||||
|
||||
Max Kellermann <max@duempel.org>
|
||||
lead developer
|
||||
|
||||
Laszlo Ashin <kodest@gmail.com>
|
||||
WavPack support
|
||||
|
||||
Viliam Mateicka <viliam.mateicka@gmail.com>
|
||||
FFmpeg support, mixer and archive API
|
||||
|
||||
Eric Wollesen <encoded@xmtp.net>
|
||||
encoder API, shout output
|
||||
|
||||
Thomas Jansen <mithi@mithi.net>
|
||||
multithreading tweaks, miscellaneous
|
||||
|
||||
Romain Bignon <romain@peerfuse.org>
|
||||
playlist manipulation
|
||||
|
||||
David Guibert <david.guibert@gmail.com>
|
||||
PulseAudio mixer
|
||||
|
||||
Jochen Keil <jochen.keil@gmail.com>
|
||||
CUE sheet support
|
||||
|
||||
Jeffrey Middleton <jefromi@gmail.com>
|
||||
playlist manipulation
|
||||
|
||||
Sean McNamara <smcnam@gmail.com>
|
||||
WIN32 compatibility
|
||||
|
||||
|
||||
Former Developers
|
||||
-----------------
|
||||
|
||||
Warren Dukes <warren.dukes@gmail.com>
|
||||
former lead developer and project founder
|
||||
|
||||
Niklas Hofer
|
||||
'next' and 'previous' patch
|
||||
|
||||
Jim Ramsay <i.am@jimramsay.com>
|
||||
Zerconf/avahi support
|
||||
|
||||
Guus Sliepen <guus@sliepen.eu.org>
|
||||
libsamplerate code
|
||||
|
||||
J. Alexander Treuman <jat@spatialrift.net>
|
||||
general, MP3, ID3, PulseAudio, format conversion, stored playlists
|
||||
AudioCompress, much much more...
|
||||
|
||||
Eric Wong
|
||||
former lead developer
|
||||
|
||||
José Anarch <anarchsss@gmail.com>
|
||||
JACK plugin
|
||||
|
||||
Patrik Weiskircher <pat@icore.at>
|
||||
Stored playlist commands
|
||||
|
||||
Nick Welch <mack@incise.org>
|
||||
Sighandlers
|
||||
Warren Dukes <warren.dukes@gmail.com>
|
||||
Avuton Olrich <avuton@gmail.com>
|
||||
Max Kellermann <max.kellermann@gmail.com>
|
||||
Laszlo Ashin <kodest@gmail.com>
|
||||
Viliam Mateicka <viliam.mateicka@gmail.com>
|
||||
Eric Wollesen <encoded@xmtp.net>
|
||||
Thomas Jansen <mithi@mithi.net>
|
||||
Romain Bignon <romain@peerfuse.org>
|
||||
David Guibert <david.guibert@gmail.com>
|
||||
Jochen Keil <jochen.keil@gmail.com>
|
||||
Jeffrey Middleton <jefromi@gmail.com>
|
||||
Sean McNamara <smcnam@gmail.com>
|
||||
Niklas Hofer
|
||||
Jim Ramsay <i.am@jimramsay.com>
|
||||
Guus Sliepen <guus@sliepen.eu.org>
|
||||
J. Alexander Treuman <jat@spatialrift.net>
|
||||
Eric Wong
|
||||
José Anarch <anarchsss@gmail.com>
|
||||
Patrik Weiskircher <pat@icore.at>
|
||||
Nick Welch <mack@incise.org>
|
||||
Jonathan Neuschäfer <j.neuschaefer@gmx.net>
|
||||
Anton Khirnov <anton@khirnov.net>
|
||||
Simon Kagstrom <simon.kagstrom@gmail.com>
|
||||
Denis Krjuchkov <denis@crazydev.net>
|
||||
Jurgen Kramer <gtmkramer@xs4all.nl>
|
||||
Jean-Francois Dockes <jf@dockes.org>
|
||||
Yue Wang <yuleopen@gmail.com>
|
||||
Matthew Leon Grinshpun <ml@matthewleon.com>
|
||||
Dimitris Papastamos <sin@2f30.org>
|
||||
Florian Schlichting <fsfs@debian.org>
|
||||
François Revol <revol@free.fr>
|
||||
Jacob Vosmaer <contact@jacobvosmaer.nl>
|
||||
Thomas Guillem <thomas@gllm.fr>
|
||||
|
||||
214
INSTALL
214
INSTALL
@@ -1,214 +0,0 @@
|
||||
Music Player Daemon (MPD) - INSTALL
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
This document is a very small amount of documentation about what is needed to
|
||||
install MPD. If more information is desired see the community wiki at
|
||||
http://mpd.wikia.com.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
gcc - http://gcc.gnu.org/
|
||||
Any other C99 compliant compiler should also work.
|
||||
|
||||
GLib 2.12 - http://www.gtk.org/
|
||||
General-purpose utility library.
|
||||
|
||||
|
||||
Optional Output Dependencies
|
||||
----------------------------
|
||||
|
||||
You will need at least one of these to compile MPD.
|
||||
|
||||
Most of these are available as packages on major distributions. Be sure to
|
||||
install both the library package as well as the development package.
|
||||
|
||||
AO - http://www.xiph.org/ao/
|
||||
A portable library that abstracts many audio output types as one API. Should
|
||||
be used only if there is no native plugin available or if the native plugin
|
||||
doesn't work. You will need libao.
|
||||
|
||||
ALSA - http://www.alsa-project.org/
|
||||
The Advanced Linux Sound Architecture. Recommended audio output if you use
|
||||
Linux. You will need libasound.
|
||||
|
||||
FIFO
|
||||
This is a mostly undocumented, developer plugin to transmit raw data.
|
||||
|
||||
MVP - http://en.wikipedia.org/wiki/Hauppauge_MediaMVP
|
||||
A network media player.
|
||||
|
||||
OSS - http://www.opensound.com
|
||||
Open Sound System.
|
||||
|
||||
OSX - http://www.apple.com
|
||||
Necessary if you are on Mac OSX.
|
||||
|
||||
PulseAudio - http://www.pulseaudio.org/
|
||||
An advanced sound daemon. You will need libpulse.
|
||||
|
||||
JACK - http://www.jackaudio.org/
|
||||
A low-latency sound daemon.
|
||||
|
||||
libshout - http://www.icecast.org/
|
||||
For streaming to an Icecast or Shoutcast server.
|
||||
You also need an encoder: either libvorbisenc (ogg), or liblame (mp3).
|
||||
|
||||
OpenAL - http://kcat.strangesoft.net/openal.html
|
||||
Open Audio Library
|
||||
|
||||
libffado - http://www.ffado.org/
|
||||
For FireWire audio devices.
|
||||
|
||||
|
||||
Optional Input Dependencies
|
||||
---------------------------
|
||||
|
||||
You will need at least one of these to compile MPD.
|
||||
|
||||
Most of these are available as packages on major distributions. Be sure to
|
||||
install both the library package as well as the development package.
|
||||
|
||||
MAD - http://www.underbit.com/products/mad/
|
||||
For MP3 support. You will need libmad, and optionally libid3tag if you want
|
||||
ID3 tag support.
|
||||
|
||||
libmpg123 - http://www.mpg123.de/
|
||||
Alternative for MP3 support.
|
||||
|
||||
Ogg Vorbis - http://www.xiph.org/ogg/vorbis/
|
||||
For Ogg Vorbis support. You will need libogg and libvorbis.
|
||||
|
||||
FLAC - http://flac.sourceforge.net/
|
||||
For FLAC support. You will need version 1.1.0 or higher of libflac.
|
||||
|
||||
OggFLAC - http://www.xiph.org/ogg/vorbis/ and http://flac.sourceforge.net/
|
||||
For OggFLAC support. You will need liboggflac, which can be built from the
|
||||
FLAC sources if libogg is already installed. Versions of flac 1.1.3 and
|
||||
greater will automatically detect and use OggFLAC if it's available.
|
||||
|
||||
Audio File - http://www.68k.org/~michael/audiofile/
|
||||
For WAVE, AIFF, and AU support. You will need libaudiofile.
|
||||
|
||||
FAAD2 - http://www.audiocoding.com/
|
||||
For MP4/AAC support. You will need libmp4ff.
|
||||
|
||||
libmpcdec - http://www.musepack.net/
|
||||
For Musepack support.
|
||||
|
||||
MikMod - http://mikmod.raphnet.net/
|
||||
For MOD support. You will need libmikmod.
|
||||
|
||||
libavcodec, libavformat (ffmpeg) - http://ffmpeg.mplayerhq.hu/
|
||||
Multi-codec library.
|
||||
|
||||
libsidplay2 - http://sidplay2.sourceforge.net/
|
||||
For C64 SID support.
|
||||
|
||||
libfluidsynth - http://fluidsynth.resonance.org/
|
||||
For MIDI support (DO NOT USE - use libwildmidi instead)
|
||||
|
||||
libwildmidi - http://wildmidi.sourceforge.net/
|
||||
For MIDI support.
|
||||
|
||||
libsndfile - http://www.mega-nerd.com/libsndfile/
|
||||
WAVE, AIFF, and many others.
|
||||
|
||||
libwavpack - http://www.wavpack.com/
|
||||
For WavPack playback.
|
||||
|
||||
|
||||
Optional Miscellaneous Dependencies
|
||||
-----------------------------------
|
||||
|
||||
Avahi - http://www.avahi.org/
|
||||
For Zeroconf support.
|
||||
|
||||
libsamplerate - http://www.mega-nerd.com/SRC/
|
||||
For advanced samplerate conversions.
|
||||
|
||||
libcurl - http://curl.haxx.se/
|
||||
For playing HTTP streams.
|
||||
|
||||
libmms - https://launchpad.net/libmms
|
||||
For playing MMS streams.
|
||||
|
||||
SQLite - http://www.sqlite.org/
|
||||
For the sticker database.
|
||||
|
||||
libcue - http://libcue.sourceforge.net/
|
||||
For CUE sheet support.
|
||||
|
||||
|
||||
pkg-config
|
||||
----------
|
||||
|
||||
MPD uses pkg-config to locate most external libraries. If you do not
|
||||
have pkg-config, or if your version of the library does not ship the
|
||||
".pc" file, you have to provide the library's build options in
|
||||
environment variables. These variables are documented in "./configure
|
||||
--help". Example:
|
||||
|
||||
FLAC_CFLAGS=-I/usr/include/FLAC FLAC_LIBS=-lFLAC ./configure
|
||||
|
||||
|
||||
Download
|
||||
--------
|
||||
|
||||
Get the latest release from of MPD from <http://www.musicpd.org/>.
|
||||
|
||||
Compile
|
||||
-------
|
||||
|
||||
1) unzip and untar the archive
|
||||
|
||||
$ tar zxvf mpd-x.x.x.tar.gz
|
||||
|
||||
or
|
||||
|
||||
$ tar jxvf mpd-x.x.x.tar.bz2
|
||||
|
||||
2) change to directory created
|
||||
|
||||
$ cd mpd-x.x.x
|
||||
|
||||
3) Run configure script (this will determine what dependencies you have)
|
||||
|
||||
$ ./configure
|
||||
|
||||
4) Compile
|
||||
|
||||
$ make
|
||||
|
||||
Install (Optional)
|
||||
-------
|
||||
|
||||
(as root)
|
||||
$ make install
|
||||
|
||||
Run
|
||||
---
|
||||
|
||||
1) run mpd:
|
||||
|
||||
$ mpd <config file>
|
||||
|
||||
First default is ~/.mpdconf then ~/.mpd/mpd.conf then /etc/mpd.conf. If
|
||||
neither of these exist a mpd configuration file must be specified at
|
||||
runtime.
|
||||
|
||||
A sample config file is included with the source of MPD, mpdconf.example.
|
||||
|
||||
The first time MPD is run it will attempt to discover all music in your
|
||||
music root, recursively. This can be affected by the symbolic link
|
||||
options specified in the example mpd.conf.
|
||||
|
||||
Using MPD
|
||||
---------
|
||||
|
||||
You can download many different interfaces for MPD at
|
||||
<http://mpd.wikia.com/wiki/Clients>
|
||||
|
||||
MPD can be interfaced directly using telnet (see COMMANDS, if you are brave).
|
||||
2835
Makefile.am
2835
Makefile.am
File diff suppressed because it is too large
Load Diff
17
README
17
README
@@ -1,17 +0,0 @@
|
||||
|
||||
Music Player Daemon (MPD)
|
||||
http://www.musicpd.org
|
||||
|
||||
A daemon for playing music of various formats. Music is played through the
|
||||
server's audio device. The daemon stores info about all available music,
|
||||
and this info can be easily searched and retrieved. Player control, info
|
||||
retrieval, and playlist management can all be managed remotely.
|
||||
|
||||
For basic installation information see the INSTALL file.
|
||||
|
||||
MPD is released under the GNU General Public License version 2, which is
|
||||
distributed in the COPYING file.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
29
README.md
Normal file
29
README.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# Music Player Daemon
|
||||
|
||||
http://www.musicpd.org
|
||||
|
||||
A daemon for playing music of various formats. Music is played through the
|
||||
server's audio device. The daemon stores info about all available music,
|
||||
and this info can be easily searched and retrieved. Player control, info
|
||||
retrieval, and playlist management can all be managed remotely.
|
||||
|
||||
For basic installation instructions
|
||||
[read the manual](https://www.musicpd.org/doc/user/install.html).
|
||||
|
||||
# Users
|
||||
|
||||
- [Manual](http://www.musicpd.org/doc/user/)
|
||||
- [Forum](http://forum.musicpd.org/)
|
||||
- [IRC](irc://chat.freenode.net/#mpd)
|
||||
- [Bug tracker](https://github.com/MusicPlayerDaemon/MPD/issues/)
|
||||
|
||||
# Developers
|
||||
|
||||
- [Protocol specification](http://www.musicpd.org/doc/protocol/)
|
||||
- [Developer manual](http://www.musicpd.org/doc/developer/)
|
||||
|
||||
# Legal
|
||||
|
||||
MPD is released under the
|
||||
[GNU General Public License version 2](https://www.gnu.org/licenses/gpl-2.0.txt),
|
||||
which is distributed in the COPYING file.
|
||||
92
UPGRADING
92
UPGRADING
@@ -1,92 +0,0 @@
|
||||
Music Player Daemon (MPD) - UPGRADING
|
||||
|
||||
Upgrading to 0.14
|
||||
-----------------
|
||||
|
||||
The filesystem character set is determined by GLib, if it is not
|
||||
configured. GLib has an affinity towards UTF-8, while older MPD
|
||||
versions used to choose ISO-Latin-1.
|
||||
|
||||
|
||||
Upgrading to 0.13.0
|
||||
-------------------
|
||||
|
||||
JACK, Avahi, and libsamplerate have been added as optional dependencies.
|
||||
FLAC/OggFLAC now supports the 1.1.3 API, and libmikmod 3.2.0 betas are
|
||||
supported as well.
|
||||
|
||||
New mpd.conf parameters include zeroconf_name, samplerate_converter, and
|
||||
gapless_mp3_playback. See the mpd.conf man page or updated mpconf.example for
|
||||
more information on these parameters.
|
||||
|
||||
Support for the ID3v2 "Original Artist/Performer" tag has been added. Your
|
||||
MP3s will need to be rescanned for these tags to be included in the database.
|
||||
This can be done by running mpd --create-db.
|
||||
|
||||
Upgrading to 0.12.0
|
||||
-------------------
|
||||
|
||||
The ao_driver and ao_driver_options config parameters have been removed and
|
||||
replaced with the audio_output config section. You will have to update your
|
||||
config file to use this instead. See the mpd.conf man page or the new
|
||||
mpdconf.example for details on specifying audio_output sections.
|
||||
|
||||
The db_file parameter is no longer optional. If you did not specify it in your
|
||||
old config file then you will have to add it in order to run 0.12.0.
|
||||
|
||||
Support for OggFLAC and Musepack audio files has been added. Additionally,
|
||||
scanning of MP3 files has been improved. To make use of these updates it is
|
||||
highly recommended that you run mpd --create-db to recreate your entire
|
||||
database.
|
||||
|
||||
Upgrading to 0.11.0
|
||||
-------------------
|
||||
|
||||
The database format has changed a little bit, but in a backward compatible way.
|
||||
This means that if you upgrade to 0.11.0 from 0.10.x, you do not need to make
|
||||
any changes. However, if you downgrade back to 0.10.x, then you will need
|
||||
to recreate your db.
|
||||
|
||||
The default port for MPD is now 6600, so update your mpd and client
|
||||
configurations appropriately.
|
||||
|
||||
Upgrading to 0.10.0
|
||||
-------------------
|
||||
|
||||
All information is now stored in the db in UTF-8 format, and the character
|
||||
set used for the filesystem is stored in the db. Thus, it is highly
|
||||
recommended that you recreate the db. To do so, run mpd with the
|
||||
"--create-db" command line option. Also, note that the filesystem
|
||||
character set will be determined from your current locale settings.
|
||||
If your locale settings are not the same as those used for the filesystem,
|
||||
then use the config file parameter "filesystem_charset" to specify the
|
||||
correct character set (this maybe necessary if you create the db with root).
|
||||
|
||||
Upgrading to 0.9.3
|
||||
------------------
|
||||
|
||||
Wave support was added, so to have your wave files added, update the db (mpc
|
||||
update).
|
||||
|
||||
Also, song lengths are now stored in the db. To get this stuff
|
||||
added to the db, you will need to recreate the db from scratch. To do this,
|
||||
run mpd with the "--create-db" commandline option.
|
||||
|
||||
Upgrading to 0.9.0
|
||||
------------------
|
||||
|
||||
The "stop_on_error" config parameter was removed, so be sure to remove this
|
||||
parameter from your config file.
|
||||
|
||||
Upgrading to 0.8.x
|
||||
------------------
|
||||
|
||||
If you have FLACs, then to have them added to your list of available music,
|
||||
just use "update".
|
||||
|
||||
Upgrading from 0.5.x to 0.6.x
|
||||
-----------------------------
|
||||
If you have not compiled MPD with "make ogg", then nothing is needed.
|
||||
|
||||
If you compiled with "make ogg", just use "update" (available via the phpMp
|
||||
interface) to add your OGGs to MPD's list of available music.
|
||||
1
android/.gitignore
vendored
Normal file
1
android/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/build
|
||||
24
android/AndroidManifest.xml
Normal file
24
android/AndroidManifest.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.musicpd"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="19"
|
||||
android:versionName="0.20.20">
|
||||
|
||||
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17"/>
|
||||
|
||||
<application android:icon="@drawable/icon" android:label="@string/app_name">
|
||||
<activity android:name=".Main"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleInstance">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
||||
192
android/build.py
Executable file
192
android/build.py
Executable file
@@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os, os.path
|
||||
import sys, subprocess
|
||||
|
||||
if len(sys.argv) < 4:
|
||||
print("Usage: build.py SDK_PATH NDK_PATH ABI [configure_args...]", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
sdk_path = sys.argv[1]
|
||||
ndk_path = sys.argv[2]
|
||||
android_abi = sys.argv[3]
|
||||
configure_args = sys.argv[4:]
|
||||
|
||||
if not os.path.isfile(os.path.join(sdk_path, 'tools', 'android')):
|
||||
print("SDK not found in", ndk_path, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(ndk_path):
|
||||
print("NDK not found in", ndk_path, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
android_abis = {
|
||||
'armeabi-v7a': {
|
||||
'arch': 'arm-linux-androideabi',
|
||||
'ndk_arch': 'arm',
|
||||
'toolchain_arch': 'arm-linux-androideabi',
|
||||
'llvm_triple': 'armv7-none-linux-androideabi',
|
||||
'cflags': '-march=armv7-a -mfpu=vfp -mfloat-abi=softfp',
|
||||
},
|
||||
|
||||
'x86': {
|
||||
'arch': 'i686-linux-android',
|
||||
'ndk_arch': 'x86',
|
||||
'toolchain_arch': 'x86',
|
||||
'llvm_triple': 'i686-none-linux-android',
|
||||
'cflags': '-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32',
|
||||
},
|
||||
}
|
||||
|
||||
# select the NDK target
|
||||
abi_info = android_abis[android_abi]
|
||||
arch = abi_info['arch']
|
||||
|
||||
# the path to the MPD sources
|
||||
mpd_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]) or '.', '..'))
|
||||
sys.path[0] = os.path.join(mpd_path, 'python')
|
||||
|
||||
# output directories
|
||||
from build.dirs import lib_path, tarball_path, src_path
|
||||
|
||||
arch_path = os.path.join(lib_path, arch)
|
||||
build_path = os.path.join(arch_path, 'build')
|
||||
|
||||
# build host configuration
|
||||
build_arch = 'linux-x86_64'
|
||||
|
||||
# set up the NDK toolchain
|
||||
|
||||
class AndroidNdkToolchain:
|
||||
def __init__(self, tarball_path, src_path, build_path,
|
||||
use_cxx):
|
||||
self.tarball_path = tarball_path
|
||||
self.src_path = src_path
|
||||
self.build_path = build_path
|
||||
|
||||
ndk_arch = abi_info['ndk_arch']
|
||||
ndk_platform = 'android-14'
|
||||
|
||||
# select the NDK compiler
|
||||
gcc_version = '4.9'
|
||||
|
||||
ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform)
|
||||
sysroot = os.path.join(ndk_path, 'sysroot')
|
||||
target_root = os.path.join(ndk_platform_path, 'arch-' + ndk_arch)
|
||||
|
||||
install_prefix = os.path.join(arch_path, 'root')
|
||||
|
||||
self.arch = arch
|
||||
self.install_prefix = install_prefix
|
||||
self.sysroot = sysroot
|
||||
|
||||
toolchain_path = os.path.join(ndk_path, 'toolchains', abi_info['toolchain_arch'] + '-' + gcc_version, 'prebuilt', build_arch)
|
||||
llvm_path = os.path.join(ndk_path, 'toolchains', 'llvm', 'prebuilt', build_arch)
|
||||
llvm_triple = abi_info['llvm_triple']
|
||||
|
||||
common_flags = '-Os -g'
|
||||
common_flags += ' -fPIC'
|
||||
common_flags += ' ' + abi_info['cflags']
|
||||
|
||||
toolchain_bin = os.path.join(toolchain_path, 'bin')
|
||||
llvm_bin = os.path.join(llvm_path, 'bin')
|
||||
self.cc = os.path.join(llvm_bin, 'clang')
|
||||
self.cxx = os.path.join(llvm_bin, 'clang++')
|
||||
common_flags += ' -target ' + llvm_triple + ' -integrated-as -gcc-toolchain ' + toolchain_path
|
||||
|
||||
common_flags += ' -fvisibility=hidden -fdata-sections -ffunction-sections'
|
||||
|
||||
self.ar = os.path.join(toolchain_bin, arch + '-ar')
|
||||
self.ranlib = os.path.join(toolchain_bin, arch + '-ranlib')
|
||||
self.nm = os.path.join(toolchain_bin, arch + '-nm')
|
||||
self.strip = os.path.join(toolchain_bin, arch + '-strip')
|
||||
|
||||
self.cflags = common_flags
|
||||
self.cxxflags = common_flags
|
||||
self.cppflags = '--sysroot=' + sysroot + \
|
||||
' -isystem ' + os.path.join(install_prefix, 'include') + \
|
||||
' -isystem ' + os.path.join(sysroot, 'usr', 'include', arch) + \
|
||||
' -D__ANDROID_API__=14'
|
||||
self.ldflags = '--sysroot=' + sysroot + \
|
||||
' -L' + os.path.join(install_prefix, 'lib') + \
|
||||
' -L' + os.path.join(target_root, 'usr', 'lib') + \
|
||||
' -B' + os.path.join(target_root, 'usr', 'lib') + \
|
||||
' ' + common_flags
|
||||
self.libs = ''
|
||||
|
||||
self.is_arm = ndk_arch == 'arm'
|
||||
self.is_armv7 = self.is_arm and 'armv7' in self.cflags
|
||||
self.is_windows = False
|
||||
|
||||
libcxx_path = os.path.join(ndk_path, 'sources/cxx-stl/llvm-libc++')
|
||||
libcxx_libs_path = os.path.join(libcxx_path, 'libs', android_abi)
|
||||
|
||||
libstdcxx_flags = '-stdlib=libc++'
|
||||
libstdcxx_cxxflags = libstdcxx_flags + ' -isystem ' + os.path.join(libcxx_path, 'include') + ' -isystem ' + os.path.join(ndk_path, 'sources/android/support/include')
|
||||
libstdcxx_ldflags = libstdcxx_flags + ' -static-libstdc++ -L' + libcxx_libs_path
|
||||
|
||||
if use_cxx:
|
||||
self.cxxflags += ' ' + libstdcxx_cxxflags
|
||||
self.ldflags += ' ' + libstdcxx_ldflags
|
||||
|
||||
self.env = dict(os.environ)
|
||||
|
||||
# redirect pkg-config to use our root directory instead of the
|
||||
# default one on the build host
|
||||
self.env['PKG_CONFIG_LIBDIR'] = os.path.join(install_prefix, 'lib/pkgconfig')
|
||||
|
||||
# a list of third-party libraries to be used by MPD on Android
|
||||
from build.libs import *
|
||||
thirdparty_libs = [
|
||||
libmpdclient,
|
||||
libogg,
|
||||
libvorbis,
|
||||
opus,
|
||||
flac,
|
||||
libid3tag,
|
||||
ffmpeg,
|
||||
curl,
|
||||
libnfs,
|
||||
boost,
|
||||
]
|
||||
|
||||
# build the third-party libraries
|
||||
for x in thirdparty_libs:
|
||||
toolchain = AndroidNdkToolchain(tarball_path, src_path, build_path,
|
||||
use_cxx=x.use_cxx)
|
||||
if not x.is_installed(toolchain):
|
||||
x.build(toolchain)
|
||||
|
||||
# configure and build MPD
|
||||
toolchain = AndroidNdkToolchain(tarball_path, src_path, build_path,
|
||||
use_cxx=True)
|
||||
|
||||
configure = [
|
||||
os.path.join(mpd_path, 'configure'),
|
||||
'CC=' + toolchain.cc,
|
||||
'CXX=' + toolchain.cxx,
|
||||
'CFLAGS=' + toolchain.cflags,
|
||||
'CXXFLAGS=' + toolchain.cxxflags,
|
||||
'CPPFLAGS=' + toolchain.cppflags,
|
||||
'LDFLAGS=' + toolchain.ldflags,
|
||||
'LIBS=' + toolchain.libs,
|
||||
'AR=' + toolchain.ar,
|
||||
'RANLIB=' + toolchain.ranlib,
|
||||
'STRIP=' + toolchain.strip,
|
||||
'--host=' + toolchain.arch,
|
||||
'--prefix=' + toolchain.install_prefix,
|
||||
'--with-sysroot=' + toolchain.sysroot,
|
||||
'--with-android-sdk=' + sdk_path,
|
||||
|
||||
'--enable-silent-rules',
|
||||
|
||||
'--disable-icu',
|
||||
|
||||
] + configure_args
|
||||
|
||||
from build.cmdline import concatenate_cmdline_variables
|
||||
configure = concatenate_cmdline_variables(configure,
|
||||
set(('CFLAGS', 'CXXFLAGS', 'CPPFLAGS', 'LDFLAGS', 'LIBS')))
|
||||
|
||||
subprocess.check_call(configure, env=toolchain.env)
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet', '-j12'], env=toolchain.env)
|
||||
11
android/custom_rules.xml
Normal file
11
android/custom_rules.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project name="mpd_rules">
|
||||
<!-- setting these two properties works around a bug in Android
|
||||
SDK's build.xml, which deletes all .class files every time -->
|
||||
<property name="build.last.is.packaging.debug" value="true" />
|
||||
<property name="build.is.packaging.debug" value="true" />
|
||||
|
||||
<target name="compile-jni-classes"
|
||||
depends="-set-debug-mode,-compile"/>
|
||||
</project>
|
||||
5
android/res/values/strings.xml
Normal file
5
android/res/values/strings.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<resources>
|
||||
<string name="app_name">MPD</string>
|
||||
</resources>
|
||||
30
android/src/Bridge.java
Normal file
30
android/src/Bridge.java
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
/**
|
||||
* Bridge to native code.
|
||||
*/
|
||||
public class Bridge {
|
||||
public static native void run(Context context);
|
||||
public static native void shutdown();
|
||||
}
|
||||
39
android/src/Loader.java
Normal file
39
android/src/Loader.java
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
public class Loader {
|
||||
private static final String TAG = "MPD";
|
||||
|
||||
public static boolean loaded = false;
|
||||
public static String error;
|
||||
|
||||
static {
|
||||
try {
|
||||
System.loadLibrary("mpd");
|
||||
loaded = true;
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
error = e.getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
android/src/Main.java
Normal file
75
android/src/Main.java
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.widget.TextView;
|
||||
import android.util.Log;
|
||||
|
||||
public class Main extends Activity implements Runnable {
|
||||
private static final String TAG = "MPD";
|
||||
|
||||
Thread thread;
|
||||
|
||||
TextView textView;
|
||||
|
||||
final Handler quitHandler = new Handler() {
|
||||
public void handleMessage(Message msg) {
|
||||
textView.setText("Music Player Daemon has quit");
|
||||
|
||||
// TODO: what now? restart?
|
||||
}
|
||||
};
|
||||
|
||||
@Override protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (!Loader.loaded) {
|
||||
TextView tv = new TextView(this);
|
||||
tv.setText("Failed to load the native MPD libary.\n" +
|
||||
"Report this problem to us, and include the following information:\n" +
|
||||
"ABI=" + Build.CPU_ABI + "\n" +
|
||||
"PRODUCT=" + Build.PRODUCT + "\n" +
|
||||
"FINGERPRINT=" + Build.FINGERPRINT + "\n" +
|
||||
"error=" + Loader.error);
|
||||
setContentView(tv);
|
||||
return;
|
||||
}
|
||||
|
||||
if (thread == null || !thread.isAlive()) {
|
||||
thread = new Thread(this, "NativeMain");
|
||||
thread.start();
|
||||
}
|
||||
|
||||
textView = new TextView(this);
|
||||
textView.setText("Music Player Daemon is running"
|
||||
+ "\nCAUTION: this version is EXPERIMENTAL!");
|
||||
setContentView(textView);
|
||||
}
|
||||
|
||||
@Override public void run() {
|
||||
Bridge.run(this);
|
||||
quitHandler.sendMessage(quitHandler.obtainMessage());
|
||||
}
|
||||
}
|
||||
140
autogen.sh
140
autogen.sh
@@ -1,137 +1,11 @@
|
||||
#!/bin/sh
|
||||
# Run this to set up the build system: configure, makefiles, etc.
|
||||
# (at one point this was based on the version in enlightenment's cvs)
|
||||
|
||||
package="mpd"
|
||||
set -e
|
||||
|
||||
olddir="`pwd`"
|
||||
srcdir="`dirname $0`"
|
||||
test -z "$srcdir" && srcdir=.
|
||||
cd "$srcdir"
|
||||
DIE=
|
||||
AM_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9][0-9]*\).*/\1/"
|
||||
AC_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9][0-9]\).*/\1/"
|
||||
VERSIONMKINT="sed -e s/[^0-9]//"
|
||||
if test -n "$AM_FORCE_VERSION"
|
||||
then
|
||||
AM_VERSIONS="$AM_FORCE_VERSION"
|
||||
else
|
||||
AM_VERSIONS='1.11 1.10'
|
||||
fi
|
||||
if test -n "$AC_FORCE_VERSION"
|
||||
then
|
||||
AC_VERSIONS="$AC_FORCE_VERSION"
|
||||
else
|
||||
AC_VERSIONS='2.60 2.61'
|
||||
fi
|
||||
rm -rf config.cache build
|
||||
mkdir build
|
||||
|
||||
versioned_bins ()
|
||||
{
|
||||
bin="$1"
|
||||
needed_int=`echo $VERNEEDED | $VERSIONMKINT`
|
||||
for i in $VERSIONS
|
||||
do
|
||||
i_int=`echo $i | $VERSIONMKINT`
|
||||
if test $i_int -ge $needed_int
|
||||
then
|
||||
echo $bin-$i $bin$i $bin-$i_int $bin$i_int
|
||||
fi
|
||||
done
|
||||
echo $bin
|
||||
}
|
||||
|
||||
for c in autoconf autoheader automake aclocal
|
||||
do
|
||||
uc=`echo $c | tr '[:lower:]' '[:upper:]'`
|
||||
eval "val=`echo '$'$uc`"
|
||||
if test -n "$val"
|
||||
then
|
||||
echo "$uc=$val in environment, will not attempt to auto-detect"
|
||||
continue
|
||||
fi
|
||||
|
||||
case "$c" in
|
||||
autoconf|autoheader)
|
||||
VERNEEDED=`fgrep AC_PREREQ configure.ac | $AC_VERSIONGREP`
|
||||
VERSIONS="$AC_VERSIONS"
|
||||
pkg=autoconf
|
||||
;;
|
||||
automake|aclocal)
|
||||
VERNEEDED=`fgrep AUTOMAKE_OPTIONS Makefile.am | $AM_VERSIONGREP`
|
||||
VERSIONS="$AM_VERSIONS"
|
||||
pkg=automake
|
||||
;;
|
||||
esac
|
||||
printf "checking for $c ... "
|
||||
for x in `versioned_bins $c`; do
|
||||
($x --version < /dev/null > /dev/null 2>&1) > /dev/null 2>&1
|
||||
if test $? -eq 0
|
||||
then
|
||||
echo $x
|
||||
eval $uc=$x
|
||||
break
|
||||
fi
|
||||
done
|
||||
eval "val=`echo '$'$uc`"
|
||||
if test -z "$val"
|
||||
then
|
||||
if test $c = $pkg
|
||||
then
|
||||
DIE="$DIE $c=$VERNEEDED"
|
||||
else
|
||||
DIE="$DIE $c($pkg)=$VERNEEDED"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if test -n "$DIE"
|
||||
then
|
||||
echo "You must have the following installed to compile $package:"
|
||||
for i in $DIE
|
||||
do
|
||||
printf ' '
|
||||
echo $i | sed -e 's/(/ (from /' -e 's/=\(.*\)/ (>= \1)/'
|
||||
done
|
||||
echo "Download the appropriate package(s) for your system,"
|
||||
echo "or get the source from one of the GNU ftp sites"
|
||||
echo "listed in http://www.gnu.org/order/ftp.html"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Generating configuration files for $package, please wait...."
|
||||
|
||||
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4"
|
||||
|
||||
# /usr/share/aclocal is most likely included by default, already...
|
||||
ac_local_paths='
|
||||
/usr/local/share/aclocal
|
||||
/sw/share/aclocal
|
||||
/usr/pkg/share/aclocal
|
||||
/opt/share/aclocal
|
||||
/usr/gnu/share/aclocal
|
||||
'
|
||||
|
||||
for i in $ac_local_paths; do
|
||||
if test -d "$i"; then
|
||||
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I $i"
|
||||
# we probably only want one of these...
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
echo " $ACLOCAL $ACLOCAL_FLAGS"
|
||||
$ACLOCAL $ACLOCAL_FLAGS || exit 1
|
||||
|
||||
echo " $AUTOHEADER"
|
||||
$AUTOHEADER || exit 1
|
||||
|
||||
echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS"
|
||||
$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1
|
||||
|
||||
echo " $AUTOCONF"
|
||||
$AUTOCONF || exit 1
|
||||
|
||||
cd "$olddir"
|
||||
if test x$NOCONFIGURE = x; then
|
||||
"$srcdir"/configure "$@" || exit 1
|
||||
fi
|
||||
aclocal -I m4 $ACLOCAL_FLAGS
|
||||
autoheader
|
||||
automake --add-missing $AUTOMAKE_FLAGS
|
||||
autoconf
|
||||
|
||||
1559
configure.ac
1559
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,17 @@
|
||||
<?xml version='1.0' encoding="utf-8"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"docbook/dtd/xml/4.2/docbookx.dtd">
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
|
||||
|
||||
<book>
|
||||
<title>The Music Player Daemon - Developer's Manual</title>
|
||||
|
||||
<chapter>
|
||||
<chapter id="introduction">
|
||||
<title>Introduction</title>
|
||||
|
||||
<para>
|
||||
This is a guide for those who wish to hack on the MPD source
|
||||
code. MPD is an open project, and we are always happy about
|
||||
contributions. So far, more than 50 people have contributed
|
||||
contributions. So far, more than 150 people have contributed
|
||||
patches.
|
||||
</para>
|
||||
|
||||
@@ -20,7 +21,7 @@
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<chapter id="code_style">
|
||||
<title>Code Style</title>
|
||||
|
||||
<itemizedlist>
|
||||
@@ -32,23 +33,42 @@
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
don't write CPP when you can write C: use inline functions
|
||||
and enums instead of macros
|
||||
don't write CPP when you can write C++: use inline
|
||||
functions and constexpr instead of macros
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
the code should be C99 compliant, and must compile with
|
||||
<application>GCC</application>;
|
||||
<application>clang</application> support is highly desirable
|
||||
comment your code, document your APIs
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
C++ is ok (for integrating C++ only libraries), but it
|
||||
should be avoided
|
||||
the code should be C++14 compliant, and must compile with
|
||||
<application>GCC</application> 4.9 and
|
||||
<application>clang</application> 3.4
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
report error conditions with C++ exceptions, preferable
|
||||
derived from <varname>std::runtime_error</varname>
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
all code must be exception-safe
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
classes and functions names use CamelCase; variables are
|
||||
lower-case with words separated by underscore
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
@@ -57,11 +77,11 @@
|
||||
Some example code:
|
||||
</para>
|
||||
|
||||
<programlisting lang="C">static inline bool
|
||||
foo(const char *abc, int xyz)
|
||||
<programlisting lang="C">static inline int
|
||||
Foo(const char *abc, int xyz)
|
||||
{
|
||||
if (abc == NULL) {
|
||||
g_warning("Foo happened!\n");
|
||||
if (abc == nullptr) {
|
||||
LogWarning("Foo happened!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -72,14 +92,30 @@ foo(const char *abc, int xyz)
|
||||
</itemizedlist>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<chapter id="hacking">
|
||||
<title>Hacking The Source</title>
|
||||
|
||||
<para>
|
||||
MPD sources are managed in a git repository on <ulink
|
||||
url="https://github.com/MusicPlayerDaemon/">GitHub</ulink>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Always write your code against the latest git:
|
||||
</para>
|
||||
|
||||
<programlisting>git clone git://git.musicpd.org/master/mpd.git</programlisting>
|
||||
<programlisting>git clone git://github.com/MusicPlayerDaemon/MPD</programlisting>
|
||||
|
||||
<para>
|
||||
If you already have a clone, update it:
|
||||
</para>
|
||||
|
||||
<programlisting>git pull --rebase git://github.com/MusicPlayerDaemon/MPD master</programlisting>
|
||||
|
||||
<para>
|
||||
You can do without "--rebase", but we recommend that you rebase
|
||||
your repository on the "master" repository all the time.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Configure with the options <option>--enable-debug
|
||||
@@ -90,16 +126,106 @@ foo(const char *abc, int xyz)
|
||||
<para>
|
||||
Don't mix several changes in one single patch. Create a
|
||||
separate patch for every change. Tools like
|
||||
<application>stgit</application> help you with that.
|
||||
<application>stgit</application> help you with that. This way,
|
||||
we can review your patches more easily, and we can pick the
|
||||
patches we like most first.
|
||||
</para>
|
||||
|
||||
|
||||
<section>
|
||||
<title> Basic stgit usage</title>
|
||||
|
||||
<para>
|
||||
stgit allows you to create a set of patches and refine all of
|
||||
them: you can go back to any patch at any time, and re-edit it
|
||||
(both the code and the commit message). You can reorder
|
||||
patches and insert new patches at any position. It encourages
|
||||
creating separate patches for tiny changes.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
stgit needs to be initialized on a git repository: stg init
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Before you edit the code, create a patch: stg new
|
||||
my-patch-name (stgit now asks you for the commit message).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Now edit the code. Once you're finished, you have to "refresh"
|
||||
the patch, i.e. your edits are incorporated into the patch you
|
||||
have created: stg refresh
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You may now continue editing the same patch, and refresh it as
|
||||
often as you like. Create more patches, edit and refresh them.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To view the list of patches, type stg series. To go back to a
|
||||
specific patch, type stg goto my-patch-name; now you can
|
||||
re-edit it (don't forget stg refresh when you're finished with
|
||||
that patch).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
When the whole patch series is finished, convert stgit patches
|
||||
to git commits: stg commit
|
||||
</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<chapter id="submitting_patches">
|
||||
<title>Submitting Patches</title>
|
||||
|
||||
<para>
|
||||
Send your patches to the mailing list:
|
||||
musicpd-dev-team@lists.sourceforge.net
|
||||
<email>mpd-devel@musicpd.org</email> (<ulink
|
||||
url="http://mailman.blarg.de/listinfo/mpd-devel">subscribe
|
||||
here</ulink>)
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<command>git pull</command> requests are preferred.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="tools">
|
||||
<title>Development Tools</title>
|
||||
|
||||
<section>
|
||||
<title>Clang Static Analyzer</title>
|
||||
|
||||
<para>
|
||||
The <ulink url="http://clang-analyzer.llvm.org/">clang static
|
||||
analyzer</ulink> is a tool that helps find bugs. To run it on
|
||||
the MPD code base, install LLVM and clang. Configure MPD to
|
||||
use clang:
|
||||
</para>
|
||||
|
||||
<programlisting>./configure --enable-debug CXX=clang++ CC=clang ...</programlisting>
|
||||
|
||||
<para>
|
||||
It is recommended to use <option>--enable-debug</option>,
|
||||
because the analyzer takes advantage of
|
||||
<function>assert()</function> calls, which are only enabled in
|
||||
the debug build.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Now run the analyzer:
|
||||
</para>
|
||||
|
||||
<programlisting>scan-build --use-c++=clang++ --use-cc=clang make</programlisting>
|
||||
|
||||
<para>
|
||||
The options <option>--use-c++</option> and
|
||||
<option>--use-cc</option> are necessary because it invokes
|
||||
<command>cc</command> for actually compiling the sources by
|
||||
default. That breaks, because MPD requires a C99 compiler.
|
||||
</para>
|
||||
</section>
|
||||
</chapter>
|
||||
</book>
|
||||
|
||||
1417
doc/doxygen.conf
1417
doc/doxygen.conf
File diff suppressed because it is too large
Load Diff
2430
doc/doxygen.conf.in
Normal file
2430
doc/doxygen.conf.in
Normal file
File diff suppressed because it is too large
Load Diff
156
doc/include/tags.xml
Normal file
156
doc/include/tags.xml
Normal file
@@ -0,0 +1,156 @@
|
||||
<?xml version='1.0' encoding="utf-8"?>
|
||||
<!DOCTYPE itemizedlist PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>artist</varname>: the artist name. Its meaning is not
|
||||
well-defined; see <varname>composer</varname> and
|
||||
<varname>performer</varname> for more specific tags.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>artistsort</varname>: same as
|
||||
<varname>artist</varname>, but for sorting. This usually omits
|
||||
prefixes such as "The".
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>album</varname>: the album name.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>albumsort</varname>: same as <varname>album</varname>,
|
||||
but for sorting.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>albumartist</varname>: on multi-artist albums, this is
|
||||
the artist name which shall be used for the whole album. The
|
||||
exact meaning of this tag is not well-defined.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>albumartistsort</varname>: same as
|
||||
<varname>albumartist</varname>, but for sorting.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>title</varname>: the song title.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>track</varname>: the decimal track number within the
|
||||
album.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>name</varname>: a name for this song. This is not the
|
||||
song title. The exact meaning of this tag is not well-defined.
|
||||
It is often used by badly configured internet radio stations
|
||||
with broken tags to squeeze both the artist name and the song
|
||||
title in one tag.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>genre</varname>: the music genre.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>date</varname>: the song's release date. This is
|
||||
usually a 4-digit year.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>composer</varname>: the artist who composed the song.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>performer</varname>: the artist who performed the song.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>comment</varname>: a human-readable comment about this
|
||||
song. The exact meaning of this tag is not well-defined.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>disc</varname>: the decimal disc number in a multi-disc
|
||||
album.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_artistid</varname>: the artist id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_albumid</varname>: the album id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_albumartistid</varname>: the album artist
|
||||
id in the <ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_trackid</varname>: the track id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_releasetrackid</varname>: the release track
|
||||
id in the <ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
20
doc/mpd.1
20
doc/mpd.1
@@ -12,29 +12,29 @@ stores info about all available music, and this info can be easily searched and
|
||||
retrieved. Player control, info retrieval, and playlist management can all be
|
||||
managed remotely.
|
||||
|
||||
MPD searches for a config file in \fB~/.mpdconf\fP then \fB/etc/mpd.conf\fP or
|
||||
uses CONF_FILE.
|
||||
MPD searches for a config file in \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP then
|
||||
\fB~/.mpdconf\fP then \fB/etc/mpd.conf\fP or uses CONF_FILE.
|
||||
|
||||
Read more about MPD at <\fBhttp://www.musicpd.org/\fP>.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BI --help
|
||||
.BI \-\-help
|
||||
Output a brief help message.
|
||||
.TP
|
||||
.BI --kill
|
||||
.BI \-\-kill
|
||||
Kill the currently running mpd session. The pid_file parameter must be
|
||||
specified in the config file for this to work.
|
||||
.TP
|
||||
.BI --no-daemon
|
||||
.BI \-\-no\-daemon
|
||||
Don't detach from console.
|
||||
.TP
|
||||
.BI --stderr
|
||||
.BI \-\-stderr
|
||||
Print messages stderr.
|
||||
.TP
|
||||
.BI --verbose
|
||||
.BI \-\-verbose
|
||||
Verbose logging.
|
||||
.TP
|
||||
.BI --version
|
||||
.BI \-\-version
|
||||
Print version information.
|
||||
.SH FILES
|
||||
.TP
|
||||
@@ -48,8 +48,8 @@ mpd.conf(5), mpc(1)
|
||||
.SH BUGS
|
||||
If you find a bug, please report it at
|
||||
.br
|
||||
<\fBhttp://www.musicpd.org/mantis/bug_report_page.php\fP>.
|
||||
<\fBhttps://github.com/MusicPlayerDaemon/MPD/issues/\fP>.
|
||||
.SH AUTHORS
|
||||
Warren Dukes <warren.dukes@gmail.com>
|
||||
Max Kellermann <max.kellermann@gmail.com>
|
||||
|
||||
Special thanks to all the people that provided feedback and patches.
|
||||
|
||||
289
doc/mpd.conf.5
289
doc/mpd.conf.5
@@ -3,8 +3,9 @@
|
||||
mpd.conf \- Music Player Daemon configuration file
|
||||
.SH DESCRIPTION
|
||||
\fBmpd.conf\fP is the configuration file for mpd(1). If not specified on the
|
||||
command line, MPD first searches for it at \fB~/.mpdconf\fP then at
|
||||
\fB~/.mpd/mpd.conf\fP and then in \fB/etc/mpd.conf\fP.
|
||||
command line, MPD first searches for it at \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP
|
||||
then at \fB~/.mpdconf\fP then at \fB~/.mpd/mpd.conf\fP and then in
|
||||
\fB/etc/mpd.conf\fP.
|
||||
|
||||
Lines beginning with a "#" character are comments. All other non-empty lines
|
||||
specify parameters and their values. These lines contain the parameter name
|
||||
@@ -27,31 +28,24 @@ paths.
|
||||
|
||||
See \fBdocs/mpdconf.example\fP in the source tarball for an example
|
||||
configuration file.
|
||||
|
||||
This manual is not complete, it lists only the most important options.
|
||||
Please read the MPD user manual for a complete configuration guide:
|
||||
<\fBhttp://www.musicpd.org/doc/user/\fP>
|
||||
.SH REQUIRED PARAMETERS
|
||||
.TP
|
||||
.B follow_outside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing outside the music dir.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B follow_inside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing inside the music dir,
|
||||
potentially adding duplicates to the database.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B db_file <file>
|
||||
This specifies where the db file will be stored.
|
||||
.TP
|
||||
.B sticker_file <file>
|
||||
The location of the sticker database. This is a database which
|
||||
manages dynamic information attached to songs.
|
||||
.TP
|
||||
.B log_file <file>
|
||||
This specifies where the log file should be located.
|
||||
The special value "syslog" makes MPD use the local syslog daemon.
|
||||
.SH OPTIONAL PARAMETERS
|
||||
.TP
|
||||
.B sticker_file <file>
|
||||
The location of the sticker database. This is a database which
|
||||
manages dynamic information attached to songs.
|
||||
.TP
|
||||
.B pid_file <file>
|
||||
This specifies the file to save mpd's process ID in.
|
||||
.TP
|
||||
@@ -69,6 +63,9 @@ mpd will be saved to this file when mpd is terminated by a TERM signal or by
|
||||
the "kill" command. When mpd is restarted, it will read the state file and
|
||||
restore the state of mpd (including the playlist).
|
||||
.TP
|
||||
.B restore_paused <yes or no>
|
||||
Put MPD into pause mode instead of starting playback after startup.
|
||||
.TP
|
||||
.B user <username>
|
||||
This specifies the user that MPD will run as, if set. MPD should
|
||||
never run as root, and you may use this option to make MPD change its
|
||||
@@ -80,8 +77,13 @@ This specifies which address mpd binds to and listens on. Multiple
|
||||
bind_to_address parameters may be specified. The default is "any", which binds
|
||||
to all available addresses.
|
||||
|
||||
To bind to a Unix domain socket, specify an absolute path. For a
|
||||
system-wide MPD, we suggest the path "\fB/var/run/mpd/socket\fP".
|
||||
You can set a port that is different from the global port setting,
|
||||
e.g. "localhost:6602". IPv6 addresses must be enclosed in square
|
||||
brackets if you want to configure a port, e.g. "[::1]:6602".
|
||||
|
||||
To bind to a Unix domain socket, specify an absolute path or a path starting
|
||||
with a tilde (~). For a system-wide MPD, we suggest the path
|
||||
"\fB/var/run/mpd/socket\fP".
|
||||
.TP
|
||||
.B port <port>
|
||||
This specifies the port that mpd listens on. The default is 6600.
|
||||
@@ -92,6 +94,17 @@ reports from what address a connection is opened, and when it is closed, and
|
||||
"verbose" records excessive amounts of information for debugging purposes. The
|
||||
default is "default".
|
||||
.TP
|
||||
.B follow_outside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing outside the music dir.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B follow_inside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing inside the music dir,
|
||||
potentially adding duplicates to the database.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B zeroconf_enabled <yes or no>
|
||||
If yes, and MPD has been compiled with support for Avahi or Bonjour, service
|
||||
information will be published with Zeroconf. The default is yes.
|
||||
@@ -123,53 +136,6 @@ for the format of this parameter. Multiple audio_output sections may be
|
||||
specified. If no audio_output section is specified, then MPD will scan for a
|
||||
usable audio output.
|
||||
.TP
|
||||
.B audio_output_format <sample_rate:bits:channels>
|
||||
This specifies the sample rate, bits per sample, and number of channels of
|
||||
audio that is sent to each audio output. Note that audio outputs may specify
|
||||
their own audio format which will be used for actual output to the audio
|
||||
device. An example is "44100:16:2" for 44100Hz, 16 bits, and 2 channels. The
|
||||
default is to use the audio format of the input file.
|
||||
Any of the three attributes may be an asterisk to specify that this
|
||||
attribute should not be enforced
|
||||
.TP
|
||||
.B samplerate_converter <integer or prefix>
|
||||
This specifies the libsamplerate converter to use. The supplied value should
|
||||
either be an integer or a prefix of the name of a converter. The default is
|
||||
"Fastest Sinc Interpolator".
|
||||
|
||||
At the time of this writing, the following converters are available:
|
||||
.RS
|
||||
.TP
|
||||
Best Sinc Interpolator (0)
|
||||
|
||||
Band limited sinc interpolation, best quality, 97dB SNR, 96% BW.
|
||||
.TP
|
||||
Medium Sinc Interpolator (1)
|
||||
|
||||
Band limited sinc interpolation, medium quality, 97dB SNR, 90% BW.
|
||||
.TP
|
||||
Fastest Sinc Interpolator (2)
|
||||
|
||||
Band limited sinc interpolation, fastest, 97dB SNR, 80% BW.
|
||||
.TP
|
||||
ZOH Interpolator (3)
|
||||
|
||||
Zero order hold interpolator, very fast, very poor quality with audible
|
||||
distortions.
|
||||
.TP
|
||||
Linear Interpolator (4)
|
||||
|
||||
Linear interpolator, very fast, poor quality.
|
||||
.TP
|
||||
internal
|
||||
|
||||
Poor quality, no floating point operations. This is the default (and
|
||||
only choice) if MPD was compiled without libsamplerate.
|
||||
.RE
|
||||
.IP
|
||||
For an up-to-date list of available converters, please see the libsamplerate
|
||||
documentation (available online at <\fBhttp://www.mega-nerd.com/SRC/\fP>).
|
||||
.TP
|
||||
.B replaygain <off or album or track or auto>
|
||||
If specified, mpd will adjust the volume of songs played using ReplayGain tags
|
||||
(see <\fBhttp://www.replaygain.org/\fP>). Setting this to "album" will adjust
|
||||
@@ -179,56 +145,17 @@ tags if random play is activated otherwise the album ReplayGain tags. Currently
|
||||
only FLAC, Ogg Vorbis, Musepack, and MP3 (through ID3v2 ReplayGain tags, not
|
||||
APEv2) are supported.
|
||||
.TP
|
||||
.B replaygain_preamp <-15 to 15>
|
||||
.B replaygain_preamp <\-15 to 15>
|
||||
This is the gain (in dB) applied to songs with ReplayGain tags.
|
||||
.TP
|
||||
.B volume_normalization <yes or no>
|
||||
If yes, mpd will normalize the volume of songs as they play. The default is no.
|
||||
.TP
|
||||
.B audio_buffer_size <size in KiB>
|
||||
This specifies the size of the audio buffer in kibibytes. The default is 2048,
|
||||
large enough for nearly 12 seconds of CD-quality audio.
|
||||
.TP
|
||||
.B buffer_before_play <0-100%>
|
||||
This specifies how much of the audio buffer should be filled before playing a
|
||||
song. Try increasing this if you hear skipping when manually changing songs.
|
||||
The default is 10%, a little over 1 second of CD-quality audio with the default
|
||||
buffer size.
|
||||
.TP
|
||||
.B http_proxy_host <hostname>
|
||||
This setting is deprecated. Use the "proxy" setting in the "curl"
|
||||
input block. See MPD user manual for details.
|
||||
.TP
|
||||
.B connection_timeout <seconds>
|
||||
If a client does not send any new data in this time period, the connection is
|
||||
closed. The default is 60.
|
||||
.TP
|
||||
.B max_connections <number>
|
||||
This specifies the maximum number of clients that can be connected to mpd. The
|
||||
default is 5.
|
||||
.TP
|
||||
.B max_playlist_length <number>
|
||||
This specifies the maximum number of songs that can be in the playlist. The
|
||||
default is 4096.
|
||||
.TP
|
||||
.B max_command_list_size <size in KiB>
|
||||
This specifies the maximum size a command list can be. The default is 2048.
|
||||
.TP
|
||||
.B max_output_buffer_size <size in KiB>
|
||||
This specifies the maximum size of the output buffer to a client. The default
|
||||
is 8192.
|
||||
.TP
|
||||
.B filesystem_charset <charset>
|
||||
This specifies the character set used for the filesystem. A list of supported
|
||||
character sets can be obtained by running "iconv -l". The default is
|
||||
character sets can be obtained by running "iconv \-l". The default is
|
||||
determined from the locale when the db was originally created.
|
||||
.TP
|
||||
.B id3v1_encoding <charset>
|
||||
This specifies the character set which ID3v1 tags are encoded in. A list of
|
||||
supported character sets can be obtained by running "iconv -l". The default is
|
||||
to let libid3tag convert them (from ISO-8859-1, as the standard specifies) and
|
||||
do no additional conversion.
|
||||
.TP
|
||||
.B gapless_mp3_playback <yes or no>
|
||||
This specifies whether to support gapless playback of MP3s which have the
|
||||
necessary headers. Useful if your MP3s have headers with incorrect
|
||||
@@ -241,29 +168,20 @@ MP3 playback.
|
||||
This specifies whether relative or absolute paths for song filenames are used
|
||||
when saving playlists. The default is "no".
|
||||
.TP
|
||||
.B metadata_to_use <tags>
|
||||
This specifies the tag types that will be scanned for and made available to
|
||||
clients. Note that you must recreate (not update) your database for changes to
|
||||
this parameter to take effect. Possible values are artist, album, title,
|
||||
track, name, genre, date, composer, performer, comment, and disc. Multiple
|
||||
tags may be specified as a comma separated list. An example value is
|
||||
"artist,album,title,track". The special value "none" may be used alone to
|
||||
disable all metadata. The default is to use all known tag types except for
|
||||
comments.
|
||||
.TP
|
||||
.B auto_update <yes or no>
|
||||
This specifies the wheter to support automatic update of music database when
|
||||
This specifies the whether to support automatic update of music database when
|
||||
files are changed in music_directory. The default is to disable autoupdate
|
||||
of database.
|
||||
.TP
|
||||
.B auto_update_depth <N>
|
||||
Limit the depth of the directories being watched, 0 means only watch
|
||||
the music directory itself. There is no limit by default.
|
||||
.TP
|
||||
.SH REQUIRED AUDIO OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B type <type>
|
||||
This specifies the audio output type. See the list of supported outputs in mpd
|
||||
--version for possible values.
|
||||
\-\-version for possible values.
|
||||
.TP
|
||||
.B name <name>
|
||||
This specifies a unique name for the audio output.
|
||||
@@ -308,11 +226,6 @@ probably only useful if your alsa device has more than one
|
||||
identically\-named mixer control. The default is "0". Use "amixer
|
||||
scontrols" to see the list of controls with their indexes.
|
||||
.TP
|
||||
.B use_mmap <yes or no>
|
||||
Setting this allows you to use memory-mapped I/O. Certain hardware setups may
|
||||
benefit from this, but most do not. Most users do not need to set this. The
|
||||
default is to not use memory-mapped I/O.
|
||||
.TP
|
||||
.B auto_resample <yes or no>
|
||||
Setting this to "no" disables ALSA's software resampling, if the
|
||||
hardware does not support a specific sample rate. This lets MPD do
|
||||
@@ -338,134 +251,6 @@ errors on bandwidth-limited devices. Some users have reported good results
|
||||
with this set to 50000, but not all devices support values this high. Most
|
||||
users do not need to change this. The default is 256000000 / sample_rate(kHz),
|
||||
or 5804 microseconds for CD-quality audio.
|
||||
.SH OPTIONAL OSS OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B device <dev>
|
||||
This specifies the device to use for audio output. The default is "/dev/dsp".
|
||||
.TP
|
||||
.B mixer_device <mixer dev>
|
||||
This specifies which mixer to use. The default is "/dev/mixer".
|
||||
.TP
|
||||
.B mixer_control <mixer ctrl>
|
||||
This specifies which mixer control to use (sometimes referred to as the
|
||||
"device"). The default is to use the main PCM mixer. An example is "Pcm".
|
||||
.SH OPTIONAL PULSE OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B server <server list>
|
||||
A space separated list of servers to try to connect to. See
|
||||
<\fBhttp://www.pulseaudio.org/wiki/ServerStrings\fP> for more details. The
|
||||
default is to let PulseAudio choose a server.
|
||||
If you specify more than one server name, MPD tries to connect to one
|
||||
after another until it successfully establishes a connection.
|
||||
.TP
|
||||
.B sink <sink>
|
||||
The sink to output to. The default is to let PulseAudio choose a sink.
|
||||
.SH OPTIONAL JACK OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B client_name <name>
|
||||
The client name to use when connecting to JACK. The output ports <name>:left
|
||||
and <name>:right will also be created for the left and right channels,
|
||||
respectively.
|
||||
.TP
|
||||
.B ports <left_port,right_port>
|
||||
This specifies the left and right ports to connect to for the left and right
|
||||
channels, respectively. The default is to let JACK choose a pair of ports.
|
||||
.TP
|
||||
.B ringbuffer_size <size in bytes>
|
||||
This specifies the size of the ringbuffer in bytes. The default is 32768.
|
||||
.SH OPTIONAL AO OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B driver <driver>
|
||||
This specifies the libao driver to use for audio output. Possible values
|
||||
depend on what libao drivers are available. See
|
||||
<\fBhttp://www.xiph.org/ao/doc/drivers.html\fP> for information on some
|
||||
commonly used drivers. Typical values for Linux include "oss" and "alsa09".
|
||||
The default is "default", which causes libao to select an appropriate plugin.
|
||||
.TP
|
||||
.B options <opts>
|
||||
This specifies the options to use for the selected libao driver. For oss, the
|
||||
only option available is "dsp". For alsa09, the available options are: "dev",
|
||||
"buf_size", and "periods". See <\fBhttp://www.xiph.org/ao/doc/drivers.html\fP>
|
||||
for available options for some commonly used drivers. Options are assigned
|
||||
using "=", and ";" is used to separate options. An example for oss:
|
||||
"dsp=/dev/dsp". An example for alsa09: "dev=hw:0,0;buf_size=4096". The
|
||||
default is "".
|
||||
.TP
|
||||
.B write_size <size in bytes>
|
||||
This specifies how many bytes to write to the audio device at once. This
|
||||
parameter is to work around a bug in older versions of libao on sound cards
|
||||
with very small buffers. The default is 1024.
|
||||
.SH REQUIRED FIFO OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B path <path>
|
||||
This specifies the path of the FIFO to output to. Must be an absolute path.
|
||||
If the path does not exist it will be created when mpd is started, and removed
|
||||
when mpd is stopped. The FIFO will be created with the same user and group as
|
||||
mpd is running as. Default permissions can be modified by using the builtin
|
||||
shell command "umask". If a FIFO already exists at the specified path it will
|
||||
be reused, and will \fBnot\fP be removed when mpd is stopped. You can use the
|
||||
"mkfifo" command to create this, and then you may modify the permissions to
|
||||
your liking.
|
||||
.SH REQUIRED SHOUT OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B name <name>
|
||||
This specifies not only the unique audio output name, but also the stream
|
||||
title.
|
||||
.TP
|
||||
.B host <hostname>
|
||||
This specifies the hostname of the icecast server to connect to.
|
||||
.TP
|
||||
.B port <port>
|
||||
This specifies the port of the icecast server to connect to.
|
||||
.TP
|
||||
.B mount <mountpoint>
|
||||
This specifies the icecast mountpoint to use.
|
||||
.TP
|
||||
.B password <password>
|
||||
This specifies the password to use when logging in to the icecast server.
|
||||
.TP
|
||||
.B quality <quality>
|
||||
This specifies the encoding quality to use. The value must be between 0
|
||||
and 10. Fractional values, such as 2.5, are permitted. Either the quality or
|
||||
the bitrate parameter must be specified, but not both. For Ogg, a
|
||||
higher quality number produces higher quality output. For MP3, it's
|
||||
just the opposite, with lower numbers producing higher quality output.
|
||||
.TP
|
||||
.B bitrate <kbps>
|
||||
This specifies the bitrate to use for encoding. Either the quality or the
|
||||
bitrate parameter must be specified, but not both.
|
||||
.TP
|
||||
.B format <sample_rate:bits:channels>
|
||||
This specifies the sample rate, bits per sample, and number of channels to use
|
||||
for encoding.
|
||||
.SH OPTIONAL SHOUT OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B encoding <encoding>
|
||||
This specifies which output encoding to use. Should be either "ogg"
|
||||
or "mp3", "mp3" is needed for shoutcast streaming. The default is "ogg".
|
||||
.TP
|
||||
.B protocol <protocol>
|
||||
This specifies the protocol that wil be used to connect to the
|
||||
icecast/shoutcast server. The options are "shoutcast", "icecast1" and
|
||||
"icecast2". The default is "icecast2".
|
||||
.TP
|
||||
.B user <username>
|
||||
This specifies the username to use when logging in to the icecast server. The
|
||||
default is "source".
|
||||
.TP
|
||||
.B public <yes or no>
|
||||
This specifies whether to request that the stream be listed in all public
|
||||
stream directories that the icecast server knows about. The default is no.
|
||||
.TP
|
||||
.B timeout <seconds>
|
||||
This specifies the number of seconds to wait before giving up on trying to
|
||||
connect to the icecast server. The default is 2 seconds.
|
||||
.TP
|
||||
.B description <description>
|
||||
This specifies a description of the stream.
|
||||
.TP
|
||||
.B genre <genre>
|
||||
This specifies the genre(s) of the stream.
|
||||
.SH FILES
|
||||
.TP
|
||||
.BI ~/.mpdconf
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# An example configuration file for MPD
|
||||
# See the mpd.conf man page for a more detailed description of each parameter.
|
||||
# An example configuration file for MPD.
|
||||
# Read the user manual for documentation: http://www.musicpd.org/doc/user/
|
||||
|
||||
|
||||
# Files and directories #######################################################
|
||||
@@ -75,7 +75,8 @@
|
||||
#
|
||||
# This setting sets the address for the daemon to listen on. Careful attention
|
||||
# should be paid if this is assigned to anything other then the default, any.
|
||||
# This setting can deny access to control of the daemon.
|
||||
# This setting can deny access to control of the daemon. Not effective if
|
||||
# systemd socket activiation is in use.
|
||||
#
|
||||
# For network
|
||||
#bind_to_address "any"
|
||||
@@ -103,15 +104,19 @@
|
||||
#
|
||||
#gapless_mp3_playback "yes"
|
||||
#
|
||||
# Setting "restore_paused" to "yes" puts MPD into pause mode instead
|
||||
# of starting playback after startup.
|
||||
#
|
||||
#restore_paused "no"
|
||||
#
|
||||
# This setting enables MPD to create playlists in a format usable by other
|
||||
# music players.
|
||||
#
|
||||
#save_absolute_paths_in_playlists "no"
|
||||
#
|
||||
# This setting defines a list of tag types that will be extracted during the
|
||||
# audio file discovery process. Optionally, 'comment' can be added to this
|
||||
# list.
|
||||
#
|
||||
# This setting defines a list of tag types that will be extracted during the
|
||||
# audio file discovery process. The complete list of possible values can be
|
||||
# found in the user manual.
|
||||
#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
|
||||
#
|
||||
# This setting enables automatic update of MPD's database when files in
|
||||
@@ -160,7 +165,7 @@
|
||||
# Permissions #################################################################
|
||||
#
|
||||
# If this setting is set, MPD will require password authorization. The password
|
||||
# can setting can be specified multiple times for different password profiles.
|
||||
# setting can be specified multiple times for different password profiles.
|
||||
#
|
||||
#password "password@read,add,control,admin"
|
||||
#
|
||||
@@ -171,6 +176,15 @@
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Database #######################################################################
|
||||
#
|
||||
|
||||
#database {
|
||||
# plugin "proxy"
|
||||
# host "other.mpd.host"
|
||||
# port "6600"
|
||||
#}
|
||||
|
||||
# Input #######################################################################
|
||||
#
|
||||
|
||||
@@ -191,16 +205,12 @@ input {
|
||||
# blocks. Setting this block is optional, though the server will only attempt
|
||||
# autodetection for one sound card.
|
||||
#
|
||||
# See <http://mpd.wikia.com/wiki/Configuration#Audio_Outputs> for examples of
|
||||
# other audio outputs.
|
||||
#
|
||||
# An example of an ALSA output:
|
||||
#
|
||||
#audio_output {
|
||||
# type "alsa"
|
||||
# name "My ALSA Device"
|
||||
## device "hw:0,0" # optional
|
||||
## format "44100:16:2" # optional
|
||||
## mixer_type "hardware" # optional
|
||||
## mixer_device "default" # optional
|
||||
## mixer_control "PCM" # optional
|
||||
@@ -213,7 +223,6 @@ input {
|
||||
# type "oss"
|
||||
# name "My OSS Device"
|
||||
## device "/dev/dsp" # optional
|
||||
## format "44100:16:2" # optional
|
||||
## mixer_type "hardware" # optional
|
||||
## mixer_device "/dev/mixer" # optional
|
||||
## mixer_control "PCM" # optional
|
||||
@@ -223,7 +232,7 @@ input {
|
||||
#
|
||||
#audio_output {
|
||||
# type "shout"
|
||||
# encoding "ogg" # optional
|
||||
# encoder "vorbis" # optional
|
||||
# name "My Shout Stream"
|
||||
# host "localhost"
|
||||
# port "8000"
|
||||
@@ -235,6 +244,7 @@ input {
|
||||
## protocol "icecast2" # optional
|
||||
## user "source" # optional
|
||||
## description "My Stream Description" # optional
|
||||
## url "http://example.com" # optional
|
||||
## genre "jazz" # optional
|
||||
## public "no" # optional
|
||||
## timeout "2" # optional
|
||||
@@ -276,6 +286,42 @@ input {
|
||||
## sink "remote_server_sink" # optional
|
||||
#}
|
||||
#
|
||||
# An example of a winmm output (Windows multimedia API).
|
||||
#
|
||||
#audio_output {
|
||||
# type "winmm"
|
||||
# name "My WinMM output"
|
||||
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
|
||||
# or
|
||||
## device "0" # optional
|
||||
## mixer_type "hardware" # optional
|
||||
#}
|
||||
#
|
||||
# An example of an openal output.
|
||||
#
|
||||
#audio_output {
|
||||
# type "openal"
|
||||
# name "My OpenAL output"
|
||||
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
|
||||
#}
|
||||
#
|
||||
# An example of an sndio output.
|
||||
#
|
||||
#audio_output {
|
||||
# type "sndio"
|
||||
# name "sndio output"
|
||||
# mixer_type "software"
|
||||
#}
|
||||
#
|
||||
# An example of an OS X output:
|
||||
#
|
||||
#audio_output {
|
||||
# type "osx"
|
||||
# name "My OS X Device"
|
||||
## device "Built-in Output" # optional
|
||||
## channel_map "-1,-1,0,1" # optional
|
||||
#}
|
||||
#
|
||||
## Example "pipe" output:
|
||||
#
|
||||
#audio_output {
|
||||
@@ -297,27 +343,17 @@ input {
|
||||
# mixer_type "none" # optional
|
||||
#}
|
||||
#
|
||||
# This setting will change all decoded audio to be converted to the specified
|
||||
# format before being passed to the audio outputs. By default, this setting is
|
||||
# disabled.
|
||||
#
|
||||
#audio_output_format "44100:16:2"
|
||||
#
|
||||
# If MPD has been compiled with libsamplerate support, this setting specifies
|
||||
# the sample rate converter to use. Possible values can be found in the
|
||||
# mpd.conf man page or the libsamplerate documentation. By default, this is
|
||||
# setting is disabled.
|
||||
#
|
||||
#samplerate_converter "Fastest Sinc Interpolator"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Normalization automatic volume adjustments ##################################
|
||||
#
|
||||
# This setting specifies the type of ReplayGain to use. This setting can have
|
||||
# the argument "off", "album" or "track". See <http://www.replaygain.org>
|
||||
# for more details. This setting is off by default.
|
||||
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
|
||||
# chooses between "track" and "album" depending on the current state of
|
||||
# random playback. If random playback is enabled then "track" mode is used.
|
||||
# See <http://www.replaygain.org> for more details about ReplayGain.
|
||||
# This setting is off by default.
|
||||
#
|
||||
#replaygain "album"
|
||||
#
|
||||
@@ -326,6 +362,20 @@ input {
|
||||
#
|
||||
#replaygain_preamp "0"
|
||||
#
|
||||
# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
|
||||
# By default this setting is disabled.
|
||||
#
|
||||
#replaygain_missing_preamp "0"
|
||||
#
|
||||
# This setting enables or disables ReplayGain limiting.
|
||||
# MPD calculates actual amplification based on the ReplayGain tags
|
||||
# and replaygain_preamp / replaygain_missing_preamp setting.
|
||||
# If replaygain_limit is enabled MPD will never amplify audio signal
|
||||
# above its original level. If replaygain_limit is disabled such amplification
|
||||
# might occur. By default this setting is enabled.
|
||||
#
|
||||
#replaygain_limit "yes"
|
||||
#
|
||||
# This setting enables on-the-fly normalization volume adjustment. This will
|
||||
# result in the volume of all playing audio to be adjusted so the output has
|
||||
# equal "loudness". This setting is disabled by default.
|
||||
@@ -334,39 +384,6 @@ input {
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# MPD Internal Buffering ######################################################
|
||||
#
|
||||
# This setting adjusts the size of internal decoded audio buffering. Changing
|
||||
# this may have undesired effects. Don't change this if you don't know what you
|
||||
# are doing.
|
||||
#
|
||||
#audio_buffer_size "2048"
|
||||
#
|
||||
# This setting controls the percentage of the buffer which is filled before
|
||||
# beginning to play. Increasing this reduces the chance of audio file skipping,
|
||||
# at the cost of increased time prior to audio playback.
|
||||
#
|
||||
#buffer_before_play "10%"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Resource Limitations ########################################################
|
||||
#
|
||||
# These settings are various limitations to prevent MPD from using too many
|
||||
# resources. Generally, these settings should be minimized to prevent security
|
||||
# risks, depending on the operating resources.
|
||||
#
|
||||
#connection_timeout "60"
|
||||
#max_connections "10"
|
||||
#max_playlist_length "16384"
|
||||
#max_command_list_size "2048"
|
||||
#max_output_buffer_size "8192"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Character Encoding ##########################################################
|
||||
#
|
||||
# If file or directory names do not display correctly for your locale then you
|
||||
@@ -374,34 +391,4 @@ input {
|
||||
#
|
||||
#filesystem_charset "UTF-8"
|
||||
#
|
||||
# This setting controls the encoding that ID3v1 tags should be converted from.
|
||||
#
|
||||
#id3v1_encoding "ISO-8859-1"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# SIDPlay decoder #############################################################
|
||||
#
|
||||
# songlength_database:
|
||||
# Location of your songlengths file, as distributed with the HVSC.
|
||||
# The sidplay plugin checks this for matching MD5 fingerprints.
|
||||
# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq
|
||||
#
|
||||
# default_songlength:
|
||||
# This is the default playing time in seconds for songs not in the
|
||||
# songlength database, or in case you're not using a database.
|
||||
# A value of 0 means play indefinitely.
|
||||
#
|
||||
# filter:
|
||||
# Turns the SID filter emulation on or off.
|
||||
#
|
||||
#decoder {
|
||||
# plugin "sidplay"
|
||||
# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt"
|
||||
# default_songlength "120"
|
||||
# filter "true"
|
||||
#}
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
1046
doc/protocol.xml
1046
doc/protocol.xml
File diff suppressed because it is too large
Load Diff
3715
doc/user.xml
3715
doc/user.xml
File diff suppressed because it is too large
Load Diff
67
m4/ax_append_compile_flags.m4
Normal file
67
m4/ax_append_compile_flags.m4
Normal file
@@ -0,0 +1,67 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# For every FLAG1, FLAG2 it is checked whether the compiler works with the
|
||||
# flag. If it does, the flag is added FLAGS-VARIABLE
|
||||
#
|
||||
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
|
||||
# CFLAGS) is used. During the check the flag is always added to the
|
||||
# current language's flags.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: This macro depends on the AX_APPEND_FLAG and
|
||||
# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
|
||||
# AX_APPEND_LINK_FLAGS.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 5
|
||||
|
||||
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
|
||||
[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
|
||||
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
|
||||
for flag in $1; do
|
||||
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])
|
||||
done
|
||||
])dnl AX_APPEND_COMPILE_FLAGS
|
||||
71
m4/ax_append_flag.m4
Normal file
71
m4/ax_append_flag.m4
Normal file
@@ -0,0 +1,71 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
|
||||
# added in between.
|
||||
#
|
||||
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
|
||||
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
|
||||
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
|
||||
# FLAG.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 6
|
||||
|
||||
AC_DEFUN([AX_APPEND_FLAG],
|
||||
[dnl
|
||||
AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
|
||||
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
|
||||
AS_VAR_SET_IF(FLAGS,[
|
||||
AS_CASE([" AS_VAR_GET(FLAGS) "],
|
||||
[*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
|
||||
[
|
||||
AS_VAR_APPEND(FLAGS,[" $1"])
|
||||
AC_RUN_LOG([: FLAGS="$FLAGS"])
|
||||
])
|
||||
],
|
||||
[
|
||||
AS_VAR_SET(FLAGS,[$1])
|
||||
AC_RUN_LOG([: FLAGS="$FLAGS"])
|
||||
])
|
||||
AS_VAR_POPDEF([FLAGS])dnl
|
||||
])dnl AX_APPEND_FLAG
|
||||
65
m4/ax_append_link_flags.m4
Normal file
65
m4/ax_append_link_flags.m4
Normal file
@@ -0,0 +1,65 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# For every FLAG1, FLAG2 it is checked whether the linker works with the
|
||||
# flag. If it does, the flag is added FLAGS-VARIABLE
|
||||
#
|
||||
# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is
|
||||
# used. During the check the flag is always added to the linker's flags.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
|
||||
# when the check is done. The check is thus made with the flags: "LDFLAGS
|
||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
||||
# issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG.
|
||||
# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 5
|
||||
|
||||
AC_DEFUN([AX_APPEND_LINK_FLAGS],
|
||||
[AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
|
||||
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
|
||||
for flag in $1; do
|
||||
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3], [$4])
|
||||
done
|
||||
])dnl AX_APPEND_LINK_FLAGS
|
||||
285
m4/ax_boost_base.m4
Normal file
285
m4/ax_boost_base.m4
Normal file
@@ -0,0 +1,285 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Test for the Boost C++ libraries of a particular version (or newer)
|
||||
#
|
||||
# If no path to the installed boost library is given the macro searchs
|
||||
# under /usr, /usr/local, /opt and /opt/local and evaluates the
|
||||
# $BOOST_ROOT environment variable. Further documentation is available at
|
||||
# <http://randspringer.de/boost/index.html>.
|
||||
#
|
||||
# This macro calls:
|
||||
#
|
||||
# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
|
||||
#
|
||||
# And sets:
|
||||
#
|
||||
# HAVE_BOOST
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
|
||||
# Copyright (c) 2009 Peter Adolphs
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 27
|
||||
|
||||
AC_DEFUN([AX_BOOST_BASE],
|
||||
[
|
||||
AC_ARG_WITH([boost],
|
||||
[AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
|
||||
[use Boost library from a standard location (ARG=yes),
|
||||
from the specified location (ARG=<path>),
|
||||
or disable it (ARG=no)
|
||||
@<:@ARG=yes@:>@ ])],
|
||||
[
|
||||
if test "$withval" = "no"; then
|
||||
want_boost="no"
|
||||
elif test "$withval" = "yes"; then
|
||||
want_boost="yes"
|
||||
ac_boost_path=""
|
||||
else
|
||||
want_boost="yes"
|
||||
ac_boost_path="$withval"
|
||||
fi
|
||||
],
|
||||
[want_boost="yes"])
|
||||
|
||||
|
||||
AC_ARG_WITH([boost-libdir],
|
||||
AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
|
||||
[Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
|
||||
[
|
||||
if test -d "$withval"
|
||||
then
|
||||
ac_boost_lib_path="$withval"
|
||||
else
|
||||
AC_MSG_ERROR(--with-boost-libdir expected directory name)
|
||||
fi
|
||||
],
|
||||
[ac_boost_lib_path=""]
|
||||
)
|
||||
|
||||
if test "x$want_boost" = "xyes"; then
|
||||
boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
|
||||
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
|
||||
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
|
||||
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
|
||||
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
|
||||
boost_lib_version_req_sub_minor="0"
|
||||
fi
|
||||
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
|
||||
AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
|
||||
succeeded=no
|
||||
|
||||
dnl On 64-bit systems check for system libraries in both lib64 and lib.
|
||||
dnl The former is specified by FHS, but e.g. Debian does not adhere to
|
||||
dnl this (as it rises problems for generic multi-arch support).
|
||||
dnl The last entry in the list is chosen by default when no libraries
|
||||
dnl are found, e.g. when only header-only libraries are installed!
|
||||
libsubdirs="lib"
|
||||
ax_arch=`uname -m`
|
||||
case $ax_arch in
|
||||
x86_64)
|
||||
libsubdirs="lib64 libx32 lib lib64"
|
||||
;;
|
||||
ppc64|s390x|sparc64|aarch64|ppc64le)
|
||||
libsubdirs="lib64 lib lib64"
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
|
||||
dnl them priority over the other paths since, if libs are found there, they
|
||||
dnl are almost assuredly the ones desired.
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
|
||||
|
||||
case ${host_cpu} in
|
||||
i?86)
|
||||
libsubdirs="lib/i386-${host_os} $libsubdirs"
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl first we check the system location for boost libraries
|
||||
dnl this location ist chosen if boost libraries are installed with the --layout=system option
|
||||
dnl or if you install boost with RPM
|
||||
if test "$ac_boost_path" != ""; then
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path/include"
|
||||
for ac_boost_path_tmp in $libsubdirs; do
|
||||
if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
|
||||
BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
|
||||
break
|
||||
fi
|
||||
done
|
||||
elif test "$cross_compiling" != yes; then
|
||||
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
||||
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
|
||||
for libsubdir in $libsubdirs ; do
|
||||
if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||
done
|
||||
BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
dnl overwrite ld flags if we have required special directory with
|
||||
dnl --with-boost-libdir parameter
|
||||
if test "$ac_boost_lib_path" != ""; then
|
||||
BOOST_LDFLAGS="-L$ac_boost_lib_path"
|
||||
fi
|
||||
|
||||
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
export CPPFLAGS
|
||||
|
||||
LDFLAGS_SAVED="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||
export LDFLAGS
|
||||
|
||||
AC_REQUIRE([AC_PROG_CXX])
|
||||
AC_LANG_PUSH(C++)
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <boost/version.hpp>
|
||||
]], [[
|
||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
||||
// Everything is okay
|
||||
#else
|
||||
# error Boost version is too old
|
||||
#endif
|
||||
]])],[
|
||||
AC_MSG_RESULT(yes)
|
||||
succeeded=yes
|
||||
found_system=yes
|
||||
],[
|
||||
])
|
||||
AC_LANG_POP([C++])
|
||||
|
||||
|
||||
|
||||
dnl if we found no boost with system layout we search for boost libraries
|
||||
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
||||
if test "x$succeeded" != "xyes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||
LDFLAGS="$LDFLAGS_SAVED"
|
||||
BOOST_CPPFLAGS=
|
||||
BOOST_LDFLAGS=
|
||||
_version=0
|
||||
if test "$ac_boost_path" != ""; then
|
||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||
V_CHECK=`expr $_version_tmp \> $_version`
|
||||
if test "$V_CHECK" = "1" ; then
|
||||
_version=$_version_tmp
|
||||
fi
|
||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
||||
done
|
||||
dnl if nothing found search for layout used in Windows distributions
|
||||
if test -z "$BOOST_CPPFLAGS"; then
|
||||
if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if test "$cross_compiling" != yes; then
|
||||
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
|
||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||
V_CHECK=`expr $_version_tmp \> $_version`
|
||||
if test "$V_CHECK" = "1" ; then
|
||||
_version=$_version_tmp
|
||||
best_path=$ac_boost_path
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
||||
if test "$ac_boost_lib_path" = ""; then
|
||||
for libsubdir in $libsubdirs ; do
|
||||
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||
done
|
||||
BOOST_LDFLAGS="-L$best_path/$libsubdir"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$BOOST_ROOT" != "x"; then
|
||||
for libsubdir in $libsubdirs ; do
|
||||
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
|
||||
done
|
||||
if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
|
||||
version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
|
||||
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
||||
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
||||
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
|
||||
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
|
||||
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
||||
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
export CPPFLAGS
|
||||
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||
export LDFLAGS
|
||||
|
||||
AC_LANG_PUSH(C++)
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <boost/version.hpp>
|
||||
]], [[
|
||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
||||
// Everything is okay
|
||||
#else
|
||||
# error Boost version is too old
|
||||
#endif
|
||||
]])],[
|
||||
AC_MSG_RESULT(yes)
|
||||
succeeded=yes
|
||||
found_system=yes
|
||||
],[
|
||||
])
|
||||
AC_LANG_POP([C++])
|
||||
fi
|
||||
|
||||
if test "$succeeded" != "yes" ; then
|
||||
if test "$_version" = "0" ; then
|
||||
AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
|
||||
else
|
||||
AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
|
||||
fi
|
||||
# execute ACTION-IF-NOT-FOUND (if present):
|
||||
ifelse([$3], , :, [$3])
|
||||
else
|
||||
AC_SUBST(BOOST_CPPFLAGS)
|
||||
AC_SUBST(BOOST_LDFLAGS)
|
||||
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
|
||||
# execute ACTION-IF-FOUND (if present):
|
||||
ifelse([$2], , :, [$2])
|
||||
fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||
LDFLAGS="$LDFLAGS_SAVED"
|
||||
fi
|
||||
|
||||
])
|
||||
74
m4/ax_check_compile_flag.m4
Normal file
74
m4/ax_check_compile_flag.m4
Normal file
@@ -0,0 +1,74 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the current language's compiler
|
||||
# or gives an error. (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_COMPILE_FLAGS
|
||||
74
m4/ax_check_link_flag.m4
Normal file
74
m4/ax_check_link_flag.m4
Normal file
@@ -0,0 +1,74 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the linker or gives an error.
|
||||
# (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
|
||||
# when the check is done. The check is thus made with the flags: "LDFLAGS
|
||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
||||
# issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_LINK_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_LINK_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS $4 $1"
|
||||
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
LDFLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_LINK_FLAGS
|
||||
564
m4/ax_cxx_compile_stdcxx.m4
Normal file
564
m4/ax_cxx_compile_stdcxx.m4
Normal file
@@ -0,0 +1,564 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check for baseline language coverage in the compiler for the specified
|
||||
# version of the C++ standard. If necessary, add switches to CXX and
|
||||
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
|
||||
# or '14' (for the C++14 standard).
|
||||
#
|
||||
# The second argument, if specified, indicates whether you insist on an
|
||||
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
|
||||
# -std=c++11). If neither is specified, you get whatever works, with
|
||||
# preference for an extended mode.
|
||||
#
|
||||
# The third argument, if specified 'mandatory' or if left unspecified,
|
||||
# indicates that baseline support for the specified C++ standard is
|
||||
# required and that the macro should error out if no mode with that
|
||||
# support is found. If specified 'optional', then configuration proceeds
|
||||
# regardless, after defining HAVE_CXX${VERSION} if and only if a
|
||||
# supporting mode is found.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
|
||||
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
|
||||
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
|
||||
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
|
||||
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
|
||||
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 4
|
||||
|
||||
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
|
||||
dnl (serial version number 13).
|
||||
|
||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
|
||||
m4_if([$1], [11], [],
|
||||
[$1], [14], [],
|
||||
[$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])],
|
||||
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
|
||||
m4_if([$2], [], [],
|
||||
[$2], [ext], [],
|
||||
[$2], [noext], [],
|
||||
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
|
||||
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
|
||||
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
|
||||
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
|
||||
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
|
||||
AC_LANG_PUSH([C++])dnl
|
||||
ac_success=no
|
||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
|
||||
ax_cv_cxx_compile_cxx$1,
|
||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
||||
[ax_cv_cxx_compile_cxx$1=yes],
|
||||
[ax_cv_cxx_compile_cxx$1=no])])
|
||||
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
|
||||
ac_success=yes
|
||||
fi
|
||||
|
||||
m4_if([$2], [noext], [], [dnl
|
||||
if test x$ac_success = xno; then
|
||||
for switch in -std=gnu++$1 -std=gnu++0x; do
|
||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
|
||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
|
||||
$cachevar,
|
||||
[ac_save_CXX="$CXX"
|
||||
CXX="$CXX $switch"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
||||
[eval $cachevar=yes],
|
||||
[eval $cachevar=no])
|
||||
CXX="$ac_save_CXX"])
|
||||
if eval test x\$$cachevar = xyes; then
|
||||
CXX="$CXX $switch"
|
||||
if test -n "$CXXCPP" ; then
|
||||
CXXCPP="$CXXCPP $switch"
|
||||
fi
|
||||
ac_success=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi])
|
||||
|
||||
m4_if([$2], [ext], [], [dnl
|
||||
if test x$ac_success = xno; then
|
||||
dnl HP's aCC needs +std=c++11 according to:
|
||||
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
|
||||
dnl Cray's crayCC needs "-h std=c++11"
|
||||
for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do
|
||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
|
||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
|
||||
$cachevar,
|
||||
[ac_save_CXX="$CXX"
|
||||
CXX="$CXX $switch"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
||||
[eval $cachevar=yes],
|
||||
[eval $cachevar=no])
|
||||
CXX="$ac_save_CXX"])
|
||||
if eval test x\$$cachevar = xyes; then
|
||||
CXX="$CXX $switch"
|
||||
if test -n "$CXXCPP" ; then
|
||||
CXXCPP="$CXXCPP $switch"
|
||||
fi
|
||||
ac_success=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi])
|
||||
AC_LANG_POP([C++])
|
||||
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
|
||||
if test x$ac_success = xno; then
|
||||
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
|
||||
fi
|
||||
fi
|
||||
if test x$ac_success = xno; then
|
||||
HAVE_CXX$1=0
|
||||
AC_MSG_NOTICE([No compiler with C++$1 support was found])
|
||||
else
|
||||
HAVE_CXX$1=1
|
||||
AC_DEFINE(HAVE_CXX$1,1,
|
||||
[define if the compiler supports basic C++$1 syntax])
|
||||
fi
|
||||
AC_SUBST(HAVE_CXX$1)
|
||||
])
|
||||
|
||||
|
||||
dnl Test body for checking C++11 support
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
|
||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
||||
)
|
||||
|
||||
|
||||
dnl Test body for checking C++14 support
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
|
||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
|
||||
)
|
||||
|
||||
|
||||
dnl Tests for new features in C++11
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
|
||||
|
||||
// If the compiler admits that it is not ready for C++11, why torture it?
|
||||
// Hopefully, this will speed up the test.
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
||||
#error "This is not a C++ compiler"
|
||||
|
||||
#elif __cplusplus < 201103L
|
||||
|
||||
#error "This is not a C++11 compiler"
|
||||
|
||||
#else
|
||||
|
||||
namespace cxx11
|
||||
{
|
||||
|
||||
namespace test_static_assert
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
struct check
|
||||
{
|
||||
static_assert(sizeof(int) <= sizeof(T), "not big enough");
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace test_final_override
|
||||
{
|
||||
|
||||
struct Base
|
||||
{
|
||||
virtual void f() {}
|
||||
};
|
||||
|
||||
struct Derived : public Base
|
||||
{
|
||||
virtual void f() override {}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace test_double_right_angle_brackets
|
||||
{
|
||||
|
||||
template < typename T >
|
||||
struct check {};
|
||||
|
||||
typedef check<void> single_type;
|
||||
typedef check<check<void>> double_type;
|
||||
typedef check<check<check<void>>> triple_type;
|
||||
typedef check<check<check<check<void>>>> quadruple_type;
|
||||
|
||||
}
|
||||
|
||||
namespace test_decltype
|
||||
{
|
||||
|
||||
int
|
||||
f()
|
||||
{
|
||||
int a = 1;
|
||||
decltype(a) b = 2;
|
||||
return a + b;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_type_deduction
|
||||
{
|
||||
|
||||
template < typename T1, typename T2 >
|
||||
struct is_same
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct is_same<T, T>
|
||||
{
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
template < typename T1, typename T2 >
|
||||
auto
|
||||
add(T1 a1, T2 a2) -> decltype(a1 + a2)
|
||||
{
|
||||
return a1 + a2;
|
||||
}
|
||||
|
||||
int
|
||||
test(const int c, volatile int v)
|
||||
{
|
||||
static_assert(is_same<int, decltype(0)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(c)>::value == false, "");
|
||||
static_assert(is_same<int, decltype(v)>::value == false, "");
|
||||
auto ac = c;
|
||||
auto av = v;
|
||||
auto sumi = ac + av + 'x';
|
||||
auto sumf = ac + av + 1.0;
|
||||
static_assert(is_same<int, decltype(ac)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(av)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(sumi)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(sumf)>::value == false, "");
|
||||
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
|
||||
return (sumf > 0.0) ? sumi : add(c, v);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_noexcept
|
||||
{
|
||||
|
||||
int f() { return 0; }
|
||||
int g() noexcept { return 0; }
|
||||
|
||||
static_assert(noexcept(f()) == false, "");
|
||||
static_assert(noexcept(g()) == true, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_constexpr
|
||||
{
|
||||
|
||||
template < typename CharT >
|
||||
unsigned long constexpr
|
||||
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
|
||||
{
|
||||
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
|
||||
}
|
||||
|
||||
template < typename CharT >
|
||||
unsigned long constexpr
|
||||
strlen_c(const CharT *const s) noexcept
|
||||
{
|
||||
return strlen_c_r(s, 0UL);
|
||||
}
|
||||
|
||||
static_assert(strlen_c("") == 0UL, "");
|
||||
static_assert(strlen_c("1") == 1UL, "");
|
||||
static_assert(strlen_c("example") == 7UL, "");
|
||||
static_assert(strlen_c("another\0example") == 7UL, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_rvalue_references
|
||||
{
|
||||
|
||||
template < int N >
|
||||
struct answer
|
||||
{
|
||||
static constexpr int value = N;
|
||||
};
|
||||
|
||||
answer<1> f(int&) { return answer<1>(); }
|
||||
answer<2> f(const int&) { return answer<2>(); }
|
||||
answer<3> f(int&&) { return answer<3>(); }
|
||||
|
||||
void
|
||||
test()
|
||||
{
|
||||
int i = 0;
|
||||
const int c = 0;
|
||||
static_assert(decltype(f(i))::value == 1, "");
|
||||
static_assert(decltype(f(c))::value == 2, "");
|
||||
static_assert(decltype(f(0))::value == 3, "");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_uniform_initialization
|
||||
{
|
||||
|
||||
struct test
|
||||
{
|
||||
static const int zero {};
|
||||
static const int one {1};
|
||||
};
|
||||
|
||||
static_assert(test::zero == 0, "");
|
||||
static_assert(test::one == 1, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_lambdas
|
||||
{
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
auto lambda1 = [](){};
|
||||
auto lambda2 = lambda1;
|
||||
lambda1();
|
||||
lambda2();
|
||||
}
|
||||
|
||||
int
|
||||
test2()
|
||||
{
|
||||
auto a = [](int i, int j){ return i + j; }(1, 2);
|
||||
auto b = []() -> int { return '0'; }();
|
||||
auto c = [=](){ return a + b; }();
|
||||
auto d = [&](){ return c; }();
|
||||
auto e = [a, &b](int x) mutable {
|
||||
const auto identity = [](int y){ return y; };
|
||||
for (auto i = 0; i < a; ++i)
|
||||
a += b--;
|
||||
return x + identity(a + b);
|
||||
}(0);
|
||||
return a + b + c + d + e;
|
||||
}
|
||||
|
||||
int
|
||||
test3()
|
||||
{
|
||||
const auto nullary = [](){ return 0; };
|
||||
const auto unary = [](int x){ return x; };
|
||||
using nullary_t = decltype(nullary);
|
||||
using unary_t = decltype(unary);
|
||||
const auto higher1st = [](nullary_t f){ return f(); };
|
||||
const auto higher2nd = [unary](nullary_t f1){
|
||||
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
|
||||
};
|
||||
return higher1st(nullary) + higher2nd(nullary)(unary);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_variadic_templates
|
||||
{
|
||||
|
||||
template <int...>
|
||||
struct sum;
|
||||
|
||||
template <int N0, int... N1toN>
|
||||
struct sum<N0, N1toN...>
|
||||
{
|
||||
static constexpr auto value = N0 + sum<N1toN...>::value;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct sum<>
|
||||
{
|
||||
static constexpr auto value = 0;
|
||||
};
|
||||
|
||||
static_assert(sum<>::value == 0, "");
|
||||
static_assert(sum<1>::value == 1, "");
|
||||
static_assert(sum<23>::value == 23, "");
|
||||
static_assert(sum<1, 2>::value == 3, "");
|
||||
static_assert(sum<5, 5, 11>::value == 21, "");
|
||||
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
|
||||
|
||||
}
|
||||
|
||||
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
|
||||
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
|
||||
// because of this.
|
||||
namespace test_template_alias_sfinae
|
||||
{
|
||||
|
||||
struct foo {};
|
||||
|
||||
template<typename T>
|
||||
using member = typename T::member_type;
|
||||
|
||||
template<typename T>
|
||||
void func(...) {}
|
||||
|
||||
template<typename T>
|
||||
void func(member<T>*) {}
|
||||
|
||||
void test();
|
||||
|
||||
void test() { func<foo>(0); }
|
||||
|
||||
}
|
||||
|
||||
} // namespace cxx11
|
||||
|
||||
#endif // __cplusplus >= 201103L
|
||||
|
||||
]])
|
||||
|
||||
|
||||
dnl Tests for new features in C++14
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
|
||||
|
||||
// If the compiler admits that it is not ready for C++14, why torture it?
|
||||
// Hopefully, this will speed up the test.
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
||||
#error "This is not a C++ compiler"
|
||||
|
||||
#elif __cplusplus < 201300L
|
||||
|
||||
#error "This is not a C++14 compiler"
|
||||
|
||||
#else
|
||||
|
||||
namespace cxx14
|
||||
{
|
||||
|
||||
namespace test_polymorphic_lambdas
|
||||
{
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
const auto lambda = [](auto&&... args){
|
||||
const auto istiny = [](auto x){
|
||||
return (sizeof(x) == 1UL) ? 1 : 0;
|
||||
};
|
||||
const int aretiny[] = { istiny(args)... };
|
||||
return aretiny[0];
|
||||
};
|
||||
return lambda(1, 1L, 1.0f, '1');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_binary_literals
|
||||
{
|
||||
|
||||
constexpr auto ivii = 0b0000000000101010;
|
||||
static_assert(ivii == 42, "wrong value");
|
||||
|
||||
}
|
||||
|
||||
#ifdef DISALLOW_GCC48
|
||||
namespace test_generalized_constexpr
|
||||
{
|
||||
|
||||
template < typename CharT >
|
||||
constexpr unsigned long
|
||||
strlen_c(const CharT *const s) noexcept
|
||||
{
|
||||
auto length = 0UL;
|
||||
for (auto p = s; *p; ++p)
|
||||
++length;
|
||||
return length;
|
||||
}
|
||||
|
||||
static_assert(strlen_c("") == 0UL, "");
|
||||
static_assert(strlen_c("x") == 1UL, "");
|
||||
static_assert(strlen_c("test") == 4UL, "");
|
||||
static_assert(strlen_c("another\0test") == 7UL, "");
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace test_lambda_init_capture
|
||||
{
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
auto x = 0;
|
||||
const auto lambda1 = [a = x](int b){ return a + b; };
|
||||
const auto lambda2 = [a = lambda1(x)](){ return a; };
|
||||
return lambda2();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_digit_seperators
|
||||
{
|
||||
|
||||
constexpr auto ten_million = 100'000'000;
|
||||
static_assert(ten_million == 100000000, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_return_type_deduction
|
||||
{
|
||||
|
||||
auto f(int& x) { return x; }
|
||||
decltype(auto) g(int& x) { return x; }
|
||||
|
||||
template < typename T1, typename T2 >
|
||||
struct is_same
|
||||
{
|
||||
static constexpr auto value = false;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct is_same<T, T>
|
||||
{
|
||||
static constexpr auto value = true;
|
||||
};
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
auto x = 0;
|
||||
static_assert(is_same<int, decltype(f(x))>::value, "");
|
||||
static_assert(is_same<int&, decltype(g(x))>::value, "");
|
||||
return x;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace cxx14
|
||||
|
||||
#endif // __cplusplus >= 201402L
|
||||
|
||||
]])
|
||||
34
m4/ax_cxx_compile_stdcxx_14.m4
Normal file
34
m4/ax_cxx_compile_stdcxx_14.m4
Normal file
@@ -0,0 +1,34 @@
|
||||
# ============================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_14.html
|
||||
# ============================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CXX_COMPILE_STDCXX_14([ext|noext], [mandatory|optional])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check for baseline language coverage in the compiler for the C++14
|
||||
# standard; if necessary, add switches to CXX and CXXCPP to enable
|
||||
# support.
|
||||
#
|
||||
# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
|
||||
# macro with the version set to C++14. The two optional arguments are
|
||||
# forwarded literally as the second and third argument respectively.
|
||||
# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
|
||||
# more information. If you want to use this macro, you also need to
|
||||
# download the ax_cxx_compile_stdcxx.m4 file.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 4
|
||||
|
||||
AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX])
|
||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [AX_CXX_COMPILE_STDCXX([14], [$1], [$2])])
|
||||
485
m4/ax_pthread.m4
Normal file
485
m4/ax_pthread.m4
Normal file
@@ -0,0 +1,485 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro figures out how to build C programs using POSIX threads. It
|
||||
# sets the PTHREAD_LIBS output variable to the threads library and linker
|
||||
# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
|
||||
# flags that are needed. (The user can also force certain compiler
|
||||
# flags/libs to be tested by setting these environment variables.)
|
||||
#
|
||||
# Also sets PTHREAD_CC to any special C compiler that is needed for
|
||||
# multi-threaded programs (defaults to the value of CC otherwise). (This
|
||||
# is necessary on AIX to use the special cc_r compiler alias.)
|
||||
#
|
||||
# NOTE: You are assumed to not only compile your program with these flags,
|
||||
# but also to link with them as well. For example, you might link with
|
||||
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
|
||||
#
|
||||
# If you are only building threaded programs, you may wish to use these
|
||||
# variables in your default LIBS, CFLAGS, and CC:
|
||||
#
|
||||
# LIBS="$PTHREAD_LIBS $LIBS"
|
||||
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
# CC="$PTHREAD_CC"
|
||||
#
|
||||
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
|
||||
# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
|
||||
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||
#
|
||||
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
|
||||
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
|
||||
# PTHREAD_CFLAGS.
|
||||
#
|
||||
# ACTION-IF-FOUND is a list of shell commands to run if a threads library
|
||||
# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
|
||||
# is not found. If ACTION-IF-FOUND is not specified, the default action
|
||||
# will define HAVE_PTHREAD.
|
||||
#
|
||||
# Please let the authors know if this macro fails on any platform, or if
|
||||
# you have any other suggestions or comments. This macro was based on work
|
||||
# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
|
||||
# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
|
||||
# Alejandro Forero Cuervo to the autoconf macro repository. We are also
|
||||
# grateful for the helpful feedback of numerous users.
|
||||
#
|
||||
# Updated for Autoconf 2.68 by Daniel Richard G.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
|
||||
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 23
|
||||
|
||||
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
||||
AC_DEFUN([AX_PTHREAD], [
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_REQUIRE([AC_PROG_CC])
|
||||
AC_REQUIRE([AC_PROG_SED])
|
||||
AC_LANG_PUSH([C])
|
||||
ax_pthread_ok=no
|
||||
|
||||
# We used to check for pthread.h first, but this fails if pthread.h
|
||||
# requires special compiler flags (e.g. on Tru64 or Sequent).
|
||||
# It gets checked for in the link test anyway.
|
||||
|
||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
||||
# etcetera environment variables, and if threads linking works using
|
||||
# them:
|
||||
if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
|
||||
ax_pthread_save_CC="$CC"
|
||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||
ax_pthread_save_LIBS="$LIBS"
|
||||
AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
|
||||
AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
|
||||
AC_MSG_RESULT([$ax_pthread_ok])
|
||||
if test "x$ax_pthread_ok" = "xno"; then
|
||||
PTHREAD_LIBS=""
|
||||
PTHREAD_CFLAGS=""
|
||||
fi
|
||||
CC="$ax_pthread_save_CC"
|
||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||
LIBS="$ax_pthread_save_LIBS"
|
||||
fi
|
||||
|
||||
# We must check for the threads library under a number of different
|
||||
# names; the ordering is very important because some systems
|
||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
||||
# libraries is broken (non-POSIX).
|
||||
|
||||
# Create a list of thread flags to try. Items starting with a "-" are
|
||||
# C compiler flags, and other items are library names, except for "none"
|
||||
# which indicates that we try without any flags at all, and "pthread-config"
|
||||
# which is a program returning the flags for the Pth emulation library.
|
||||
|
||||
ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
||||
|
||||
# The ordering *is* (sometimes) important. Some notes on the
|
||||
# individual items follow:
|
||||
|
||||
# pthreads: AIX (must check this before -lpthread)
|
||||
# none: in case threads are in libc; should be tried before -Kthread and
|
||||
# other compiler flags to prevent continual compiler warnings
|
||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
|
||||
# (Note: HP C rejects this with "bad form for `-t' option")
|
||||
# -pthreads: Solaris/gcc (Note: HP C also rejects)
|
||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||
# doesn't hurt to check since this sometimes defines pthreads and
|
||||
# -D_REENTRANT too), HP C (must be checked before -lpthread, which
|
||||
# is present but should not be used directly; and before -mthreads,
|
||||
# because the compiler interprets this as "-mt" + "-hreads")
|
||||
# -mthreads: Mingw32/gcc, Lynx/gcc
|
||||
# pthread: Linux, etcetera
|
||||
# --thread-safe: KAI C++
|
||||
# pthread-config: use pthread-config program (for GNU Pth library)
|
||||
|
||||
case $host_os in
|
||||
|
||||
freebsd*)
|
||||
|
||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||
|
||||
ax_pthread_flags="-kthread lthread $ax_pthread_flags"
|
||||
;;
|
||||
|
||||
hpux*)
|
||||
|
||||
# From the cc(1) man page: "[-mt] Sets various -D flags to enable
|
||||
# multi-threading and also sets -lpthread."
|
||||
|
||||
ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
|
||||
;;
|
||||
|
||||
openedition*)
|
||||
|
||||
# IBM z/OS requires a feature-test macro to be defined in order to
|
||||
# enable POSIX threads at all, so give the user a hint if this is
|
||||
# not set. (We don't define these ourselves, as they can affect
|
||||
# other portions of the system API in unpredictable ways.)
|
||||
|
||||
AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
|
||||
[
|
||||
# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
|
||||
AX_PTHREAD_ZOS_MISSING
|
||||
# endif
|
||||
],
|
||||
[AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
|
||||
;;
|
||||
|
||||
solaris*)
|
||||
|
||||
# On Solaris (at least, for some versions), libc contains stubbed
|
||||
# (non-functional) versions of the pthreads routines, so link-based
|
||||
# tests will erroneously succeed. (N.B.: The stubs are missing
|
||||
# pthread_cleanup_push, or rather a function called by this macro,
|
||||
# so we could check for that, but who knows whether they'll stub
|
||||
# that too in a future libc.) So we'll check first for the
|
||||
# standard Solaris way of linking pthreads (-mt -lpthread).
|
||||
|
||||
ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
|
||||
;;
|
||||
esac
|
||||
|
||||
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
|
||||
|
||||
AS_IF([test "x$GCC" = "xyes"],
|
||||
[ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
|
||||
|
||||
# The presence of a feature test macro requesting re-entrant function
|
||||
# definitions is, on some systems, a strong hint that pthreads support is
|
||||
# correctly enabled
|
||||
|
||||
case $host_os in
|
||||
darwin* | hpux* | linux* | osf* | solaris*)
|
||||
ax_pthread_check_macro="_REENTRANT"
|
||||
;;
|
||||
|
||||
aix*)
|
||||
ax_pthread_check_macro="_THREAD_SAFE"
|
||||
;;
|
||||
|
||||
*)
|
||||
ax_pthread_check_macro="--"
|
||||
;;
|
||||
esac
|
||||
AS_IF([test "x$ax_pthread_check_macro" = "x--"],
|
||||
[ax_pthread_check_cond=0],
|
||||
[ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
|
||||
|
||||
# Are we compiling with Clang?
|
||||
|
||||
AC_CACHE_CHECK([whether $CC is Clang],
|
||||
[ax_cv_PTHREAD_CLANG],
|
||||
[ax_cv_PTHREAD_CLANG=no
|
||||
# Note that Autoconf sets GCC=yes for Clang as well as GCC
|
||||
if test "x$GCC" = "xyes"; then
|
||||
AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
|
||||
[/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
|
||||
# if defined(__clang__) && defined(__llvm__)
|
||||
AX_PTHREAD_CC_IS_CLANG
|
||||
# endif
|
||||
],
|
||||
[ax_cv_PTHREAD_CLANG=yes])
|
||||
fi
|
||||
])
|
||||
ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
|
||||
|
||||
ax_pthread_clang_warning=no
|
||||
|
||||
# Clang needs special handling, because older versions handle the -pthread
|
||||
# option in a rather... idiosyncratic way
|
||||
|
||||
if test "x$ax_pthread_clang" = "xyes"; then
|
||||
|
||||
# Clang takes -pthread; it has never supported any other flag
|
||||
|
||||
# (Note 1: This will need to be revisited if a system that Clang
|
||||
# supports has POSIX threads in a separate library. This tends not
|
||||
# to be the way of modern systems, but it's conceivable.)
|
||||
|
||||
# (Note 2: On some systems, notably Darwin, -pthread is not needed
|
||||
# to get POSIX threads support; the API is always present and
|
||||
# active. We could reasonably leave PTHREAD_CFLAGS empty. But
|
||||
# -pthread does define _REENTRANT, and while the Darwin headers
|
||||
# ignore this macro, third-party headers might not.)
|
||||
|
||||
PTHREAD_CFLAGS="-pthread"
|
||||
PTHREAD_LIBS=
|
||||
|
||||
ax_pthread_ok=yes
|
||||
|
||||
# However, older versions of Clang make a point of warning the user
|
||||
# that, in an invocation where only linking and no compilation is
|
||||
# taking place, the -pthread option has no effect ("argument unused
|
||||
# during compilation"). They expect -pthread to be passed in only
|
||||
# when source code is being compiled.
|
||||
#
|
||||
# Problem is, this is at odds with the way Automake and most other
|
||||
# C build frameworks function, which is that the same flags used in
|
||||
# compilation (CFLAGS) are also used in linking. Many systems
|
||||
# supported by AX_PTHREAD require exactly this for POSIX threads
|
||||
# support, and in fact it is often not straightforward to specify a
|
||||
# flag that is used only in the compilation phase and not in
|
||||
# linking. Such a scenario is extremely rare in practice.
|
||||
#
|
||||
# Even though use of the -pthread flag in linking would only print
|
||||
# a warning, this can be a nuisance for well-run software projects
|
||||
# that build with -Werror. So if the active version of Clang has
|
||||
# this misfeature, we search for an option to squash it.
|
||||
|
||||
AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
|
||||
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
|
||||
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
|
||||
# Create an alternate version of $ac_link that compiles and
|
||||
# links in two steps (.c -> .o, .o -> exe) instead of one
|
||||
# (.c -> exe), because the warning occurs only in the second
|
||||
# step
|
||||
ax_pthread_save_ac_link="$ac_link"
|
||||
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
|
||||
ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
|
||||
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
|
||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
|
||||
AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
|
||||
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
|
||||
ac_link="$ax_pthread_save_ac_link"
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
|
||||
[ac_link="$ax_pthread_2step_ac_link"
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
|
||||
[break])
|
||||
])
|
||||
done
|
||||
ac_link="$ax_pthread_save_ac_link"
|
||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||
AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
|
||||
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
|
||||
])
|
||||
|
||||
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
|
||||
no | unknown) ;;
|
||||
*) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
|
||||
esac
|
||||
|
||||
fi # $ax_pthread_clang = yes
|
||||
|
||||
if test "x$ax_pthread_ok" = "xno"; then
|
||||
for ax_pthread_try_flag in $ax_pthread_flags; do
|
||||
|
||||
case $ax_pthread_try_flag in
|
||||
none)
|
||||
AC_MSG_CHECKING([whether pthreads work without any flags])
|
||||
;;
|
||||
|
||||
-mt,pthread)
|
||||
AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
|
||||
PTHREAD_CFLAGS="-mt"
|
||||
PTHREAD_LIBS="-lpthread"
|
||||
;;
|
||||
|
||||
-*)
|
||||
AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
|
||||
PTHREAD_CFLAGS="$ax_pthread_try_flag"
|
||||
;;
|
||||
|
||||
pthread-config)
|
||||
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
|
||||
AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
|
||||
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
||||
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
||||
;;
|
||||
|
||||
*)
|
||||
AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
|
||||
PTHREAD_LIBS="-l$ax_pthread_try_flag"
|
||||
;;
|
||||
esac
|
||||
|
||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||
ax_pthread_save_LIBS="$LIBS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
|
||||
# Check for various functions. We must include pthread.h,
|
||||
# since some functions may be macros. (On the Sequent, we
|
||||
# need a special flag -Kthread to make this header compile.)
|
||||
# We check for pthread_join because it is in -lpthread on IRIX
|
||||
# while pthread_create is in libc. We check for pthread_attr_init
|
||||
# due to DEC craziness with -lpthreads. We check for
|
||||
# pthread_cleanup_push because it is one of the few pthread
|
||||
# functions on Solaris that doesn't have a non-functional libc stub.
|
||||
# We try pthread_create on general principles.
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
|
||||
# if $ax_pthread_check_cond
|
||||
# error "$ax_pthread_check_macro must be defined"
|
||||
# endif
|
||||
static void routine(void *a) { a = 0; }
|
||||
static void *start_routine(void *a) { return a; }],
|
||||
[pthread_t th; pthread_attr_t attr;
|
||||
pthread_create(&th, 0, start_routine, 0);
|
||||
pthread_join(th, 0);
|
||||
pthread_attr_init(&attr);
|
||||
pthread_cleanup_push(routine, 0);
|
||||
pthread_cleanup_pop(0) /* ; */])],
|
||||
[ax_pthread_ok=yes],
|
||||
[])
|
||||
|
||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||
LIBS="$ax_pthread_save_LIBS"
|
||||
|
||||
AC_MSG_RESULT([$ax_pthread_ok])
|
||||
AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
|
||||
|
||||
PTHREAD_LIBS=""
|
||||
PTHREAD_CFLAGS=""
|
||||
done
|
||||
fi
|
||||
|
||||
# Various other checks:
|
||||
if test "x$ax_pthread_ok" = "xyes"; then
|
||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||
ax_pthread_save_LIBS="$LIBS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
|
||||
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
||||
AC_CACHE_CHECK([for joinable pthread attribute],
|
||||
[ax_cv_PTHREAD_JOINABLE_ATTR],
|
||||
[ax_cv_PTHREAD_JOINABLE_ATTR=unknown
|
||||
for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
|
||||
[int attr = $ax_pthread_attr; return attr /* ; */])],
|
||||
[ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
|
||||
[])
|
||||
done
|
||||
])
|
||||
AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
|
||||
test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
|
||||
test "x$ax_pthread_joinable_attr_defined" != "xyes"],
|
||||
[AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
|
||||
[$ax_cv_PTHREAD_JOINABLE_ATTR],
|
||||
[Define to necessary symbol if this constant
|
||||
uses a non-standard name on your system.])
|
||||
ax_pthread_joinable_attr_defined=yes
|
||||
])
|
||||
|
||||
AC_CACHE_CHECK([whether more special flags are required for pthreads],
|
||||
[ax_cv_PTHREAD_SPECIAL_FLAGS],
|
||||
[ax_cv_PTHREAD_SPECIAL_FLAGS=no
|
||||
case $host_os in
|
||||
solaris*)
|
||||
ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
|
||||
test "x$ax_pthread_special_flags_added" != "xyes"],
|
||||
[PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
|
||||
ax_pthread_special_flags_added=yes])
|
||||
|
||||
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
|
||||
[ax_cv_PTHREAD_PRIO_INHERIT],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
|
||||
[[int i = PTHREAD_PRIO_INHERIT;]])],
|
||||
[ax_cv_PTHREAD_PRIO_INHERIT=yes],
|
||||
[ax_cv_PTHREAD_PRIO_INHERIT=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
|
||||
test "x$ax_pthread_prio_inherit_defined" != "xyes"],
|
||||
[AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
|
||||
ax_pthread_prio_inherit_defined=yes
|
||||
])
|
||||
|
||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||
LIBS="$ax_pthread_save_LIBS"
|
||||
|
||||
# More AIX lossage: compile with *_r variant
|
||||
if test "x$GCC" != "xyes"; then
|
||||
case $host_os in
|
||||
aix*)
|
||||
AS_CASE(["x/$CC"],
|
||||
[x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
|
||||
[#handle absolute path differently from PATH based program lookup
|
||||
AS_CASE(["x$CC"],
|
||||
[x/*],
|
||||
[AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
|
||||
[AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
|
||||
|
||||
AC_SUBST([PTHREAD_LIBS])
|
||||
AC_SUBST([PTHREAD_CFLAGS])
|
||||
AC_SUBST([PTHREAD_CC])
|
||||
|
||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
||||
if test "x$ax_pthread_ok" = "xyes"; then
|
||||
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
|
||||
:
|
||||
else
|
||||
ax_pthread_ok=no
|
||||
$2
|
||||
fi
|
||||
AC_LANG_POP
|
||||
])dnl AX_PTHREAD
|
||||
37
m4/ax_require_defined.m4
Normal file
37
m4/ax_require_defined.m4
Normal file
@@ -0,0 +1,37 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_REQUIRE_DEFINED(MACRO)
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
|
||||
# been defined and thus are available for use. This avoids random issues
|
||||
# where a macro isn't expanded. Instead the configure script emits a
|
||||
# non-fatal:
|
||||
#
|
||||
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
|
||||
#
|
||||
# It's like AC_REQUIRE except it doesn't expand the required macro.
|
||||
#
|
||||
# Here's an example:
|
||||
#
|
||||
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 1
|
||||
|
||||
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
|
||||
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
|
||||
])dnl AX_REQUIRE_DEFINED
|
||||
192
m4/faad.m4
192
m4/faad.m4
@@ -1,192 +0,0 @@
|
||||
AC_DEFUN([AM_PATH_FAAD],
|
||||
[dnl ##
|
||||
dnl faad
|
||||
dnl ##
|
||||
|
||||
AC_ARG_ENABLE(aac,
|
||||
AS_HELP_STRING([--disable-aac],
|
||||
[disable AAC support (default: enable)]),,
|
||||
enable_aac=yes)
|
||||
|
||||
AC_ARG_WITH(faad,
|
||||
AS_HELP_STRING([--with-faad=PFX],
|
||||
[prefix where faad2 is installed (optional)]),,
|
||||
faad_prefix="")
|
||||
AC_ARG_WITH(faad-libraries,
|
||||
AS_HELP_STRING([--with-faad-libraries=DIR],
|
||||
[directory where faad2 library is installed (optional)]),,
|
||||
faad_libraries="")
|
||||
AC_ARG_WITH(faad-includes,
|
||||
AS_HELP_STRING([--with-faad-includes=DIR],
|
||||
[directory where faad2 header files are installed (optional)]),,
|
||||
faad_includes="")
|
||||
|
||||
if test x$enable_aac = xyes; then
|
||||
if test "x$faad_libraries" != "x" ; then
|
||||
FAAD_LIBS="-L$faad_libraries"
|
||||
elif test "x$faad_prefix" != "x" ; then
|
||||
FAAD_LIBS="-L$faad_prefix/lib"
|
||||
fi
|
||||
|
||||
FAAD_LIBS="$FAAD_LIBS -lfaad"
|
||||
|
||||
if test "x$faad_includes" != "x" ; then
|
||||
FAAD_CFLAGS="-I$faad_includes"
|
||||
elif test "x$faad_prefix" != "x" ; then
|
||||
FAAD_CFLAGS="-I$faad_prefix/include"
|
||||
fi
|
||||
|
||||
oldcflags=$CFLAGS
|
||||
oldlibs=$LIBS
|
||||
oldcppflags=$CPPFLAGS
|
||||
CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -I."
|
||||
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
|
||||
CPPFLAGS=$CFLAGS
|
||||
AC_CHECK_HEADER(faad.h,,enable_aac=no)
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include <faad.h>])
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include <faad.h>])
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_LIB(faad,faacDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS"],enable_aac=no)
|
||||
if test x$enable_aac = xno; then
|
||||
enable_aac=yes
|
||||
AC_CHECK_LIB(faad,NeAACDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS"],enable_aac=no)
|
||||
fi
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_MSG_CHECKING(that FAAD2 uses buffer and bufferlen)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
#include <faad.h>
|
||||
|
||||
int main() {
|
||||
char buffer;
|
||||
long bufferlen = 0;
|
||||
faacDecHandle decoder;
|
||||
faacDecFrameInfo frameInfo;
|
||||
faacDecConfigurationPtr config;
|
||||
unsigned char channels;
|
||||
long sampleRate;
|
||||
mp4AudioSpecificConfig mp4ASC;
|
||||
|
||||
decoder = faacDecOpen();
|
||||
config = faacDecGetCurrentConfiguration(decoder);
|
||||
config->outputFormat = FAAD_FMT_16BIT;
|
||||
faacDecSetConfiguration(decoder,config);
|
||||
AudioSpecificConfig(&buffer, bufferlen, &mp4ASC);
|
||||
faacDecInit(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||
faacDecDecode(decoder,&frameInfo,&buffer,bufferlen);
|
||||
|
||||
return 0;
|
||||
}
|
||||
])],[AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FAAD_BUFLEN_FUNCS,1,[Define if FAAD2 uses buflen in function calls])],[AC_MSG_RESULT(no);
|
||||
AC_MSG_CHECKING(that FAAD2 can even be used)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
#include <faad.h>
|
||||
|
||||
int main() {
|
||||
char buffer;
|
||||
faacDecHandle decoder;
|
||||
faacDecFrameInfo frameInfo;
|
||||
faacDecConfigurationPtr config;
|
||||
unsigned char channels;
|
||||
long sampleRate;
|
||||
long bufferlen = 0;
|
||||
unsigned long dummy1_32;
|
||||
unsigned char dummy2_8, dummy3_8, dummy4_8, dummy5_8, dummy6_8,
|
||||
dummy7_8, dummy8_8;
|
||||
|
||||
decoder = faacDecOpen();
|
||||
config = faacDecGetCurrentConfiguration(decoder);
|
||||
config->outputFormat = FAAD_FMT_16BIT;
|
||||
faacDecSetConfiguration(decoder,config);
|
||||
AudioSpecificConfig(&buffer,&dummy1_32,&dummy2_8,
|
||||
&dummy3_8,&dummy4_8,&dummy5_8,
|
||||
&dummy6_8,&dummy7_8,&dummy8_8);
|
||||
faacDecInit(decoder,&buffer,&sampleRate,&channels);
|
||||
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||
faacDecDecode(decoder,&frameInfo,&buffer);
|
||||
faacDecClose(decoder);
|
||||
|
||||
return 0;
|
||||
}
|
||||
])],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);enable_aac=no])
|
||||
])
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR,faacDecFrameInfo.samplerate],,,[#include <faad.h>])
|
||||
AC_DEFINE(HAVE_FAAD,1,[Define to use FAAD2 for AAC decoding])
|
||||
else
|
||||
AC_MSG_WARN([faad2 lib needed for MP4/AAC support -- disabling MP4/AAC support])
|
||||
fi
|
||||
CFLAGS=$oldcflags
|
||||
LIBS=$oldlibs
|
||||
CPPFLAGS=$oldcppflags
|
||||
fi
|
||||
|
||||
if test x$enable_aac = xyes; then
|
||||
oldcflags=$CFLAGS
|
||||
oldlibs=$LIBS
|
||||
oldcppflags=$CPPFLAGS
|
||||
CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -Werror"
|
||||
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
|
||||
CPPFLAGS=$CFLAGS
|
||||
|
||||
AC_MSG_CHECKING(for broken libfaad headers)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
#include <faad.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
int main() {
|
||||
unsigned char channels;
|
||||
uint32_t sample_rate;
|
||||
|
||||
faacDecInit2(NULL, NULL, 0, &sample_rate, &channels);
|
||||
return 0;
|
||||
}
|
||||
])],
|
||||
[AC_MSG_RESULT(correct)],
|
||||
[AC_MSG_RESULT(broken);
|
||||
AC_DEFINE(HAVE_FAAD_LONG, 1, [Define if faad.h uses the broken "unsigned long" pointers])])
|
||||
|
||||
CFLAGS=$oldcflags
|
||||
LIBS=$oldlibs
|
||||
CPPFLAGS=$oldcppflags
|
||||
fi
|
||||
|
||||
if test x$enable_aac = xyes; then
|
||||
enable_mp4=yes
|
||||
MP4FF_LIBS="-lmp4ff"
|
||||
|
||||
oldcflags=$CFLAGS
|
||||
oldlibs=$LIBS
|
||||
oldcppflags=$CPPFLAGS
|
||||
CFLAGS="$CFLAGS $FAAD_CFLAGS"
|
||||
LIBS="$LIBS $FAAD_LIBS $MP4FF_LIBS"
|
||||
CPPFLAGS=$CFLAGS
|
||||
|
||||
AC_CHECK_HEADER(mp4ff.h,,enable_mp4=no)
|
||||
|
||||
if test x$enable_mp4 = xyes; then
|
||||
AC_CHECK_LIB(mp4ff,mp4ff_open_read,,enable_mp4=no)
|
||||
fi
|
||||
|
||||
if test x$enable_mp4 = xyes; then
|
||||
AC_SUBST(MP4FF_LIBS)
|
||||
AC_DEFINE(HAVE_MP4, 1, [Define to use FAAD2+mp4ff for MP4 decoding])
|
||||
else
|
||||
AC_MSG_WARN([libmp4ff needed for MP4 support -- disabling MP4 support])
|
||||
unset MP4FF_LIBS
|
||||
fi
|
||||
|
||||
CFLAGS=$oldcflags
|
||||
LIBS=$oldlibs
|
||||
CPPFLAGS=$oldcppflags
|
||||
else
|
||||
enable_mp4=no
|
||||
fi
|
||||
])
|
||||
202
m4/mpd_auto.m4
202
m4/mpd_auto.m4
@@ -1,23 +1,18 @@
|
||||
dnl Parameters: varname1, description
|
||||
AC_DEFUN([MPD_AUTO_ENABLED], [
|
||||
var="enable_$1"
|
||||
feature="$2"
|
||||
|
||||
if eval "test x`echo '$'$var` = xauto"; then
|
||||
AC_MSG_NOTICE([auto-detected $feature])
|
||||
eval "$var=yes"
|
||||
if test x$[]enable_$1 = xauto; then
|
||||
AC_MSG_NOTICE([auto-detected $2])
|
||||
enable_$1=yes
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Parameters: varname1, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_DISABLED], [
|
||||
var="enable_$1"
|
||||
feature="$2"
|
||||
msg="$3"
|
||||
|
||||
if eval "test x`echo '$'$var` = xauto"; then
|
||||
AC_MSG_WARN([$msg -- disabling $feature])
|
||||
eval "$var=no"
|
||||
elif eval "test x`echo '$'$var` = xyes"; then
|
||||
AC_MSG_ERROR([$feature: $msg])
|
||||
if test x$[]enable_$1 = xauto; then
|
||||
AC_MSG_WARN([$3 -- disabling $2])
|
||||
enable_$1=no
|
||||
elif test x$[]enable_$1 = xyes; then
|
||||
AC_MSG_ERROR([$2: $3])
|
||||
fi
|
||||
])
|
||||
|
||||
@@ -25,41 +20,166 @@ dnl Check whether a prerequisite for a feature was found. This is
|
||||
dnl very similar to MPD_AUTO_RESULT, but does not finalize the
|
||||
dnl detection; it assumes that more checks will follow.
|
||||
AC_DEFUN([MPD_AUTO_PRE], [
|
||||
name="$1"
|
||||
var="enable_$1"
|
||||
found="found_$name"
|
||||
feature="$2"
|
||||
msg="$3"
|
||||
|
||||
if eval "test x`echo '$'$var` != xno" && eval "test x`echo '$'$found` = xno"; then
|
||||
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
|
||||
if test x$[]enable_$1 != xno && test x$[]found_$1 = xno; then
|
||||
MPD_AUTO_DISABLED([$1], [$2], [$3])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Evaluate a check's result. Abort if the feature was requested
|
||||
dnl explicitly but is unavailable.
|
||||
dnl
|
||||
dnl Parameters: varname1, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_RESULT], [
|
||||
name="$1"
|
||||
var="enable_$1"
|
||||
found="found_$name"
|
||||
feature="$2"
|
||||
msg="$3"
|
||||
|
||||
if eval "test x`echo '$'$var` = xno"; then
|
||||
eval "$found=no"
|
||||
if test x$[]enable_$1 = xno; then
|
||||
found_$1=no
|
||||
fi
|
||||
|
||||
if eval "test x`echo '$'$found` = xyes"; then
|
||||
MPD_AUTO_ENABLED([$name], [$feature])
|
||||
if test x$[]found_$1 = xyes; then
|
||||
MPD_AUTO_ENABLED([$1], [$2])
|
||||
else
|
||||
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
|
||||
MPD_AUTO_DISABLED([$1], [$2], [$3])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Invoke a check if its configuration is "yes" or "auto" and call
|
||||
dnl MPD_AUTO_RESULT.
|
||||
dnl
|
||||
dnl Parameters: varname1, description, errmsg, check
|
||||
AC_DEFUN([MPD_AUTO], [
|
||||
if test x$[]enable_$1 != xno; then
|
||||
$4
|
||||
fi
|
||||
MPD_AUTO_RESULT([$1], [$2], [$3])
|
||||
])
|
||||
|
||||
dnl Wrapper for MPD_AUTO and PKG_CHECK_MODULES.
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, pkgname, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_PKG], [
|
||||
if eval "test x`echo '$'enable_$1` != xno"; then
|
||||
PKG_CHECK_MODULES([$2], [$3],
|
||||
[eval "found_$1=yes"],
|
||||
[eval "found_$1=no"])
|
||||
fi
|
||||
|
||||
MPD_AUTO_RESULT([$1], [$4], [$5])
|
||||
MPD_AUTO([$1], [$4], [$5],
|
||||
[PKG_CHECK_MODULES([$2], [$3],
|
||||
[found_$1=yes],
|
||||
[found_$1=no])])
|
||||
])
|
||||
|
||||
dnl Check with pkg-config first, fall back to AC_CHECK_LIB.
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, pkgname, libname, symname, libs, cflags, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_PKG_LIB], [
|
||||
MPD_AUTO([$1], [$8], [$9],
|
||||
[PKG_CHECK_MODULES([$2], [$3],
|
||||
[found_$1=yes],
|
||||
AC_CHECK_LIB($4, $5,
|
||||
[found_$1=yes $2_LIBS='$6' $2_CFLAGS='$7'],
|
||||
[found_$1=no],
|
||||
[$6]))])
|
||||
])
|
||||
|
||||
dnl Wrapper for AC_CHECK_LIB.
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, libname, symname, libs, cflags, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_LIB], [
|
||||
AC_SUBST([$2_LIBS], [])
|
||||
AC_SUBST([$2_CFLAGS], [])
|
||||
|
||||
MPD_AUTO([$1], [$7], [$8],
|
||||
[AC_CHECK_LIB($3, $4,
|
||||
[found_$1=yes $2_LIBS='$5' $2_CFLAGS='$6'],
|
||||
[found_$1=no],
|
||||
[$5])])
|
||||
])
|
||||
|
||||
dnl Wrapper for AC_CHECK_HEADER.
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, header, libs, cflags, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_HEADER], [
|
||||
AC_SUBST([$2_LIBS], [])
|
||||
AC_SUBST([$2_CFLAGS], [])
|
||||
|
||||
MPD_AUTO([$1], [$6], [$7],
|
||||
[AC_CHECK_HEADER([$3],
|
||||
[found_$1=yes $2_LIBS='$4' $2_CFLAGS='$5'],
|
||||
[found_$1=no])])
|
||||
])
|
||||
|
||||
dnl Convert the given string into a string for the "default value" in
|
||||
dnl the help text. If the string is a literal, then it is returned
|
||||
dnl as-is; if it contains a variable reference, just "auto" is
|
||||
dnl emitted.
|
||||
dnl
|
||||
dnl Parameters: varname1
|
||||
AC_DEFUN([MPD_FORMAT_DEFAULT],
|
||||
[ifelse([$1], [], [auto],
|
||||
index([$1], [$]), [-1], [$1],
|
||||
[auto])])
|
||||
|
||||
dnl Wrapper for AC_ARG_ENABLE, AC_DEFINE and AM_CONDITIONAL
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, description, default, check
|
||||
AC_DEFUN([MPD_ARG_ENABLE], [
|
||||
AC_ARG_ENABLE(translit([$1], [_], [-]),
|
||||
AS_HELP_STRING([--enable-]translit([$1], [_], [-]),
|
||||
[enable $3 (default: ]MPD_FORMAT_DEFAULT([$4])[)]),,
|
||||
[enable_$1=]ifelse([$4], [], [auto], [$4]))
|
||||
|
||||
$5
|
||||
|
||||
MPD_DEFINE_CONDITIONAL(enable_$1, ENABLE_$2, [$3])
|
||||
])
|
||||
|
||||
dnl Wrapper for MPD_ARG_ENABLE and MPD_AUTO
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, description, errmsg, default, check
|
||||
AC_DEFUN([MPD_ENABLE_AUTO], [
|
||||
MPD_ARG_ENABLE([$1], [$2], [$3], [$5], [
|
||||
MPD_AUTO([$1], [$3], [$4], [$6])
|
||||
])
|
||||
])
|
||||
|
||||
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_PKG
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, pkg, description, errmsg, default, pre
|
||||
AC_DEFUN([MPD_ENABLE_AUTO_PKG], [
|
||||
MPD_ARG_ENABLE([$1], [$2], [$4], [$6], [
|
||||
$7
|
||||
MPD_AUTO_PKG($1, $2, $3, $4, $5)
|
||||
])
|
||||
])
|
||||
|
||||
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_PKG_LIB
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, pkg, libname, symname, libs, cflags, description, errmsg, default, pre
|
||||
AC_DEFUN([MPD_ENABLE_AUTO_PKG_LIB], [
|
||||
MPD_ARG_ENABLE([$1], [$2], [$8], [$10], [
|
||||
$11
|
||||
MPD_AUTO_PKG_LIB($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
||||
])
|
||||
])
|
||||
|
||||
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_LIB
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, libname, symname, libs, cflags, description, errmsg, default, pre
|
||||
AC_DEFUN([MPD_ENABLE_AUTO_LIB], [
|
||||
MPD_ARG_ENABLE([$1], [$2], [$7], [$9], [
|
||||
$10
|
||||
MPD_AUTO_LIB($1, $2, $3, $4, $5, $6, $7, $8)
|
||||
])
|
||||
])
|
||||
|
||||
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_HEADER
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, header, libs, cflags, description, errmsg, default, pre
|
||||
AC_DEFUN([MPD_ENABLE_AUTO_HEADER], [
|
||||
MPD_ARG_ENABLE([$1], [$2], [$6], [$8], [
|
||||
$9
|
||||
MPD_AUTO_HEADER($1, $2, $3, $4, $5, $6, $7)
|
||||
])
|
||||
])
|
||||
|
||||
dnl Wrapper for MPD_ENABLE_AUTO_PKG and MPD_DEPENDS
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, pkg, description, errmsg, default, dep_variable, dep_errmsg
|
||||
AC_DEFUN([MPD_ENABLE_AUTO_PKG_DEPENDS], [
|
||||
MPD_ENABLE_AUTO_PKG([$1], [$2], [$3], [$4], [$5], [$6],
|
||||
[MPD_DEPENDS([enable_$1], [$7], [$8])])
|
||||
])
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
AC_DEFUN([MPD_CHECK_FLAG],[
|
||||
var=`echo "$1" | tr "=-" "__"`
|
||||
AC_CACHE_CHECK([whether the C compiler accepts $1],
|
||||
[mpd_check_cflag_$var],[
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $1"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
int main(void) { return 0; }
|
||||
])], [ eval "mpd_check_cflag_$var=yes"
|
||||
], [ eval "mpd_check_cflag_$var=no" ])
|
||||
CFLAGS="$save_CFLAGS"
|
||||
])
|
||||
if eval "test x`echo '$mpd_check_cflag_'$var` = xyes"
|
||||
then
|
||||
AM_CFLAGS="$AM_CFLAGS $1"
|
||||
fi
|
||||
])
|
||||
])
|
||||
8
m4/mpd_define_conditional.m4
Normal file
8
m4/mpd_define_conditional.m4
Normal file
@@ -0,0 +1,8 @@
|
||||
dnl Wrapper for AC_DEFINE and AM_CONDITIONAL
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, description
|
||||
AC_DEFUN([MPD_DEFINE_CONDITIONAL], [dnl
|
||||
AM_CONDITIONAL($2, test x$[]$1 = xyes)
|
||||
if test x$[]$1 = xyes; then
|
||||
AC_DEFINE($2, 1, [Define to enable $3])
|
||||
fi])
|
||||
9
m4/mpd_depends.m4
Normal file
9
m4/mpd_depends.m4
Normal file
@@ -0,0 +1,9 @@
|
||||
AC_DEFUN([MPD_DEPENDS], [
|
||||
if test x$$2 = xno; then
|
||||
if test x$$1 = xauto; then
|
||||
$1=no
|
||||
elif test x$$1 = xyes; then
|
||||
AC_MSG_ERROR([$3])
|
||||
fi
|
||||
fi
|
||||
])
|
||||
25
m4/mpd_func.m4
Normal file
25
m4/mpd_func.m4
Normal file
@@ -0,0 +1,25 @@
|
||||
dnl MPD_OPTIONAL_FUNC(name, func, macro)
|
||||
dnl
|
||||
dnl Allow the user to enable or disable the use of a function. If the
|
||||
dnl option is not specified, the function is auto-detected.
|
||||
AC_DEFUN([MPD_OPTIONAL_FUNC], [
|
||||
AC_ARG_ENABLE([$1],
|
||||
AS_HELP_STRING([--enable-$1],
|
||||
[use the function "$1" (default: auto)]),
|
||||
[test x$[]enable_$1 = xyes && AC_DEFINE([$3], 1, [Define to use $1])],
|
||||
[AC_CHECK_FUNC([$2],
|
||||
[AC_DEFINE([$3], 1, [Define to use $1])],)])
|
||||
])
|
||||
|
||||
dnl MPD_OPTIONAL_FUNC_NODEF(name, func)
|
||||
dnl
|
||||
dnl Allow the user to enable or disable the use of a function.
|
||||
dnl Works similar to MPD_OPTIONAL_FUNC, however MPD_OPTIONAL_FUNC_NODEF
|
||||
dnl does not invoke AC_DEFINE when function is enabled. Shell variable
|
||||
dnl enable_$name is set to "yes" instead.
|
||||
AC_DEFUN([MPD_OPTIONAL_FUNC_NODEF], [
|
||||
AC_ARG_ENABLE([$1],
|
||||
AS_HELP_STRING([--enable-$1],
|
||||
[use the function "$1" (default: auto)]),,
|
||||
[AC_CHECK_FUNC([$2], [enable_$1=yes],)])
|
||||
])
|
||||
23
m4/mpd_with_flags.m4
Normal file
23
m4/mpd_with_flags.m4
Normal file
@@ -0,0 +1,23 @@
|
||||
dnl Run code with the specified CFLAGS/CXXFLAGS and LIBS appended.
|
||||
dnl Restores the old values afterwards.
|
||||
dnl
|
||||
dnl Parameters: cflags, libs, code
|
||||
AC_DEFUN([MPD_WITH_FLAGS], [
|
||||
ac_save_CFLAGS="$[]CFLAGS"
|
||||
ac_save_CXXFLAGS="$[]CXXFLAGS"
|
||||
ac_save_LIBS="$[]LIBS"
|
||||
CFLAGS="$[]CFLAGS $1"
|
||||
CXXFLAGS="$[]CXXFLAGS $1"
|
||||
LIBS="$[]LIBS $2"
|
||||
$3
|
||||
CFLAGS="$[]ac_save_CFLAGS"
|
||||
CXXFLAGS="$[]ac_save_CXXFLAGS"
|
||||
LIBS="$[]ac_save_LIBS"
|
||||
])
|
||||
|
||||
dnl Run code with the specified library's CFLAGS/CXXFLAGS and LIBS
|
||||
dnl appended. Restores the old values afterwards.
|
||||
dnl
|
||||
dnl Parameters: libname, code
|
||||
AC_DEFUN([MPD_WITH_LIBRARY],
|
||||
[MPD_WITH_FLAGS([$[]$1_CFLAGS], [$[]$1_LIBS], [$2])])
|
||||
274
m4/pkg.m4
274
m4/pkg.m4
@@ -1,32 +1,68 @@
|
||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||
#
|
||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||
dnl serial 11 (pkg-config-0.29)
|
||||
dnl
|
||||
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 2 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl This program is distributed in the hope that it will be useful, but
|
||||
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with this program; if not, write to the Free Software
|
||||
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
dnl 02111-1307, USA.
|
||||
dnl
|
||||
dnl As a special exception to the GNU General Public License, if you
|
||||
dnl distribute this file as part of a program that contains a
|
||||
dnl configuration script generated by Autoconf, you may include it under
|
||||
dnl the same distribution terms that you use for the rest of that
|
||||
dnl program.
|
||||
|
||||
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||
# ----------------------------------
|
||||
dnl PKG_PREREQ(MIN-VERSION)
|
||||
dnl -----------------------
|
||||
dnl Since: 0.29
|
||||
dnl
|
||||
dnl Verify that the version of the pkg-config macros are at least
|
||||
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
|
||||
dnl installed version of pkg-config, this checks the developer's version
|
||||
dnl of pkg.m4 when generating configure.
|
||||
dnl
|
||||
dnl To ensure that this macro is defined, also add:
|
||||
dnl m4_ifndef([PKG_PREREQ],
|
||||
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
|
||||
dnl
|
||||
dnl See the "Since" comment for each macro you use to see what version
|
||||
dnl of the macros you require.
|
||||
m4_defun([PKG_PREREQ],
|
||||
[m4_define([PKG_MACROS_VERSION], [0.29])
|
||||
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
|
||||
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
|
||||
])dnl PKG_PREREQ
|
||||
|
||||
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||
dnl ----------------------------------
|
||||
dnl Since: 0.16
|
||||
dnl
|
||||
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
|
||||
dnl first found in the path. Checks that the version of pkg-config found
|
||||
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
|
||||
dnl used since that's the first version where most current features of
|
||||
dnl pkg-config existed.
|
||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
|
||||
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
|
||||
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
|
||||
m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
|
||||
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
|
||||
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
|
||||
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
|
||||
|
||||
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
|
||||
fi
|
||||
@@ -39,48 +75,49 @@ if test -n "$PKG_CONFIG"; then
|
||||
AC_MSG_RESULT([no])
|
||||
PKG_CONFIG=""
|
||||
fi
|
||||
|
||||
fi[]dnl
|
||||
])# PKG_PROG_PKG_CONFIG
|
||||
])dnl PKG_PROG_PKG_CONFIG
|
||||
|
||||
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
# Check to see whether a particular set of modules exists. Similar
|
||||
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||
#
|
||||
#
|
||||
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
|
||||
# this or PKG_CHECK_MODULES is called, or make sure to call
|
||||
# PKG_CHECK_EXISTS manually
|
||||
# --------------------------------------------------------------
|
||||
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
dnl -------------------------------------------------------------------
|
||||
dnl Since: 0.18
|
||||
dnl
|
||||
dnl Check to see whether a particular set of modules exists. Similar to
|
||||
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||
dnl
|
||||
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||
dnl only at the first occurence in configure.ac, so if the first place
|
||||
dnl it's called might be skipped (such as if it is within an "if", you
|
||||
dnl have to call PKG_CHECK_EXISTS manually
|
||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
|
||||
m4_ifval([$2], [$2], [:])
|
||||
m4_default([$2], [:])
|
||||
m4_ifvaln([$3], [else
|
||||
$3])dnl
|
||||
fi])
|
||||
|
||||
|
||||
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||
# ---------------------------------------------
|
||||
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||
dnl ---------------------------------------------
|
||||
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
|
||||
dnl pkg_failed based on the result.
|
||||
m4_define([_PKG_CONFIG],
|
||||
[if test -n "$PKG_CONFIG"; then
|
||||
if test -n "$$1"; then
|
||||
pkg_cv_[]$1="$$1"
|
||||
else
|
||||
PKG_CHECK_EXISTS([$3],
|
||||
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
|
||||
[pkg_failed=yes])
|
||||
fi
|
||||
else
|
||||
pkg_failed=untried
|
||||
[if test -n "$$1"; then
|
||||
pkg_cv_[]$1="$$1"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
PKG_CHECK_EXISTS([$3],
|
||||
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes ],
|
||||
[pkg_failed=yes])
|
||||
else
|
||||
pkg_failed=untried
|
||||
fi[]dnl
|
||||
])# _PKG_CONFIG
|
||||
])dnl _PKG_CONFIG
|
||||
|
||||
# _PKG_SHORT_ERRORS_SUPPORTED
|
||||
# -----------------------------
|
||||
dnl _PKG_SHORT_ERRORS_SUPPORTED
|
||||
dnl ---------------------------
|
||||
dnl Internal check to see if pkg-config supports short errors.
|
||||
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
@@ -88,19 +125,17 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
else
|
||||
_pkg_short_errors_supported=no
|
||||
fi[]dnl
|
||||
])# _PKG_SHORT_ERRORS_SUPPORTED
|
||||
])dnl _PKG_SHORT_ERRORS_SUPPORTED
|
||||
|
||||
|
||||
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
#
|
||||
# Note that if there is a possibility the first call to
|
||||
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||
#
|
||||
#
|
||||
# --------------------------------------------------------------
|
||||
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
dnl [ACTION-IF-NOT-FOUND])
|
||||
dnl --------------------------------------------------------------
|
||||
dnl Since: 0.4.0
|
||||
dnl
|
||||
dnl Note that if there is a possibility the first call to
|
||||
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||
dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||
AC_DEFUN([PKG_CHECK_MODULES],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||
@@ -117,16 +152,17 @@ and $1[]_LIBS to avoid the need to call pkg-config.
|
||||
See the pkg-config man page for more details.])
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
AC_MSG_RESULT([no])
|
||||
_PKG_SHORT_ERRORS_SUPPORTED
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
||||
else
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
|
||||
|
||||
ifelse([$4], , [AC_MSG_ERROR(dnl
|
||||
m4_default([$4], [AC_MSG_ERROR(
|
||||
[Package requirements ($2) were not met:
|
||||
|
||||
$$1_PKG_ERRORS
|
||||
@@ -134,24 +170,106 @@ $$1_PKG_ERRORS
|
||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||
installed software in a non-standard prefix.
|
||||
|
||||
_PKG_TEXT
|
||||
])],
|
||||
[AC_MSG_RESULT([no])
|
||||
$4])
|
||||
_PKG_TEXT])[]dnl
|
||||
])
|
||||
elif test $pkg_failed = untried; then
|
||||
ifelse([$4], , [AC_MSG_FAILURE(dnl
|
||||
AC_MSG_RESULT([no])
|
||||
m4_default([$4], [AC_MSG_FAILURE(
|
||||
[The pkg-config script could not be found or is too old. Make sure it
|
||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||
path to pkg-config.
|
||||
|
||||
_PKG_TEXT
|
||||
|
||||
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
|
||||
[$4])
|
||||
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
|
||||
])
|
||||
else
|
||||
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
|
||||
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
|
||||
AC_MSG_RESULT([yes])
|
||||
ifelse([$3], , :, [$3])
|
||||
$3
|
||||
fi[]dnl
|
||||
])# PKG_CHECK_MODULES
|
||||
])dnl PKG_CHECK_MODULES
|
||||
|
||||
|
||||
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
dnl [ACTION-IF-NOT-FOUND])
|
||||
dnl ---------------------------------------------------------------------
|
||||
dnl Since: 0.29
|
||||
dnl
|
||||
dnl Checks for existence of MODULES and gathers its build flags with
|
||||
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
|
||||
dnl and VARIABLE-PREFIX_LIBS from --libs.
|
||||
dnl
|
||||
dnl Note that if there is a possibility the first call to
|
||||
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
|
||||
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
|
||||
dnl configure.ac.
|
||||
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
_save_PKG_CONFIG=$PKG_CONFIG
|
||||
PKG_CONFIG="$PKG_CONFIG --static"
|
||||
PKG_CHECK_MODULES($@)
|
||||
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
|
||||
])dnl PKG_CHECK_MODULES_STATIC
|
||||
|
||||
|
||||
dnl PKG_INSTALLDIR([DIRECTORY])
|
||||
dnl -------------------------
|
||||
dnl Since: 0.27
|
||||
dnl
|
||||
dnl Substitutes the variable pkgconfigdir as the location where a module
|
||||
dnl should install pkg-config .pc files. By default the directory is
|
||||
dnl $libdir/pkgconfig, but the default can be changed by passing
|
||||
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
|
||||
dnl parameter.
|
||||
AC_DEFUN([PKG_INSTALLDIR],
|
||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
|
||||
m4_pushdef([pkg_description],
|
||||
[pkg-config installation directory @<:@]pkg_default[@:>@])
|
||||
AC_ARG_WITH([pkgconfigdir],
|
||||
[AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
|
||||
[with_pkgconfigdir=]pkg_default)
|
||||
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
||||
m4_popdef([pkg_default])
|
||||
m4_popdef([pkg_description])
|
||||
])dnl PKG_INSTALLDIR
|
||||
|
||||
|
||||
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
|
||||
dnl --------------------------------
|
||||
dnl Since: 0.27
|
||||
dnl
|
||||
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
|
||||
dnl module should install arch-independent pkg-config .pc files. By
|
||||
dnl default the directory is $datadir/pkgconfig, but the default can be
|
||||
dnl changed by passing DIRECTORY. The user can override through the
|
||||
dnl --with-noarch-pkgconfigdir parameter.
|
||||
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
|
||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
|
||||
m4_pushdef([pkg_description],
|
||||
[pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
|
||||
AC_ARG_WITH([noarch-pkgconfigdir],
|
||||
[AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
|
||||
[with_noarch_pkgconfigdir=]pkg_default)
|
||||
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
|
||||
m4_popdef([pkg_default])
|
||||
m4_popdef([pkg_description])
|
||||
])dnl PKG_NOARCH_INSTALLDIR
|
||||
|
||||
|
||||
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
|
||||
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
dnl -------------------------------------------
|
||||
dnl Since: 0.28
|
||||
dnl
|
||||
dnl Retrieves the value of the pkg-config variable for the given module.
|
||||
AC_DEFUN([PKG_CHECK_VAR],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
|
||||
|
||||
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
|
||||
AS_VAR_COPY([$1], [pkg_cv_][$1])
|
||||
|
||||
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
||||
])dnl PKG_CHECK_VAR
|
||||
|
||||
@@ -1,16 +1,6 @@
|
||||
AC_DEFUN([results], [
|
||||
dnl This is a hack to allow "with" names, otherwise "enable".
|
||||
num=`expr $1 : 'with'`
|
||||
if test "$num" != "0"; then
|
||||
var="`echo '$'$1`"
|
||||
else
|
||||
var="`echo '$'enable_$1`"
|
||||
fi
|
||||
|
||||
printf '('
|
||||
if eval "test x$var = xyes"; then
|
||||
printf '+'
|
||||
elif test -n "$3" && eval "test x$var = x$3"; then
|
||||
if test x$[]enable_$1 = xyes; then
|
||||
printf '+'
|
||||
else
|
||||
printf '-'
|
||||
|
||||
18
m4/ucred.m4
18
m4/ucred.m4
@@ -1,7 +1,6 @@
|
||||
# Check if "struct ucred" is available. If not, try harder with
|
||||
# _GNU_SOURCE.
|
||||
# Check if "struct ucred" is available.
|
||||
#
|
||||
# Author: Max Kellermann <max@duempel.org>
|
||||
# Author: Max Kellermann <max.kellermann@gmail.com>
|
||||
|
||||
AC_DEFUN([STRUCT_UCRED],[
|
||||
AC_MSG_CHECKING([for struct ucred])
|
||||
@@ -10,19 +9,6 @@ AC_DEFUN([STRUCT_UCRED],[
|
||||
[struct ucred cred;],
|
||||
mpd_cv_have_struct_ucred=yes,
|
||||
mpd_cv_have_struct_ucred=no)
|
||||
if test x$mpd_cv_have_struct_ucred = xno; then
|
||||
# glibc 2.8 forces _GNU_SOURCE on us
|
||||
AC_TRY_COMPILE(
|
||||
[#define _GNU_SOURCE
|
||||
#include <sys/socket.h>],
|
||||
[struct ucred cred;],
|
||||
mpd_cv_have_struct_ucred=yes,
|
||||
mpd_cv_have_struct_ucred=no)
|
||||
if test x$mpd_cv_have_struct_ucred = xyes; then
|
||||
# :(
|
||||
MPD_CFLAGS="$MPD_CFLAGS -D_GNU_SOURCE"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT($mpd_cv_have_struct_ucred)
|
||||
|
||||
857
mpd.svg
Normal file
857
mpd.svg
Normal file
@@ -0,0 +1,857 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
x="0"
|
||||
y="0"
|
||||
width="128"
|
||||
height="128"
|
||||
id="svg1"
|
||||
sodipodi:version="0.32"
|
||||
sodipodi:docname="mpd.svg"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-test5.png"
|
||||
inkscape:export-xdpi="76.799988"
|
||||
inkscape:export-ydpi="76.799988">
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
inkscape:zoom="2.6884788"
|
||||
inkscape:cx="71.610485"
|
||||
inkscape:cy="61.484977"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="994"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<defs
|
||||
id="defs3">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 80 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="160 : 80 : 1"
|
||||
inkscape:persp3d-origin="80 : 53.333333 : 1"
|
||||
id="perspective118" />
|
||||
<linearGradient
|
||||
id="linearGradient919">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.86092716;"
|
||||
offset="0.0000000"
|
||||
id="stop920" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop921" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1068">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#d2d2d2;stop-opacity:1.0000000;"
|
||||
id="stop1070" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
id="stop1069" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1065">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
id="stop1067" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#c2bfbf;stop-opacity:0.99607843;"
|
||||
id="stop1066" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1060">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#878787;stop-opacity:1.0000000;"
|
||||
id="stop1063" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#000000;stop-opacity:0.99607843;"
|
||||
id="stop1061" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient645">
|
||||
<stop
|
||||
style="stop-color:#aca597;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop646" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop647" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient593">
|
||||
<stop
|
||||
style="stop-color:#478acf;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop594" />
|
||||
<stop
|
||||
style="stop-color:#65c6f7;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop595" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient574">
|
||||
<stop
|
||||
style="stop-color:#85ad92;stop-opacity:1.0000;"
|
||||
offset="0"
|
||||
id="stop575" />
|
||||
<stop
|
||||
style="stop-color:#559db2;stop-opacity:0.7725;"
|
||||
offset="1"
|
||||
id="stop576" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient570">
|
||||
<stop
|
||||
style="stop-color:#999999;stop-opacity:0.7176;"
|
||||
offset="0"
|
||||
id="stop571" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.3725;"
|
||||
offset="1"
|
||||
id="stop572" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient573"
|
||||
xlink:href="#linearGradient1068"
|
||||
x1="40.458553"
|
||||
y1="389.65582"
|
||||
x2="36.063946"
|
||||
y2="357.28375"
|
||||
gradientTransform="matrix(2.3025192,0,0,0.29683004,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient1213"
|
||||
xlink:href="#linearGradient1068"
|
||||
x1="123.71407"
|
||||
y1="141.41566"
|
||||
x2="98.353867"
|
||||
y2="113.41083"
|
||||
gradientTransform="matrix(0.91680324,0,0,0.74547827,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
id="radialGradient581"
|
||||
xlink:href="#linearGradient919"
|
||||
cx="0.095785439"
|
||||
cy="0.16814159"
|
||||
r="1.5409589"
|
||||
fx="0.095785439"
|
||||
fy="0.16814159" />
|
||||
<linearGradient
|
||||
id="linearGradient580"
|
||||
xlink:href="#linearGradient1068"
|
||||
x1="132.0352"
|
||||
y1="135.68469"
|
||||
x2="119.62381"
|
||||
y2="111.07157"
|
||||
gradientTransform="matrix(0.90170536,0,0,0.75796032,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1060"
|
||||
id="linearGradient901"
|
||||
x1="0.93491787"
|
||||
y1="0.92044502"
|
||||
x2="-0.052546836"
|
||||
y2="0.20347559" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient593"
|
||||
id="linearGradient902" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient916"
|
||||
x1="0.14831461"
|
||||
y1="-1.6875"
|
||||
x2="0.43370786"
|
||||
y2="1.8125" />
|
||||
<defs
|
||||
id="defs890">
|
||||
<linearGradient
|
||||
id="linearGradient922"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient1065" />
|
||||
<linearGradient
|
||||
id="linearGradient908"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient1060" />
|
||||
<linearGradient
|
||||
id="linearGradient894"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient1068" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient894"
|
||||
id="linearGradient897"
|
||||
x1="0.5955056"
|
||||
y1="-0.33587787"
|
||||
x2="0.61348313"
|
||||
y2="1.1908396" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient894"
|
||||
id="linearGradient898"
|
||||
x1="0.96449792"
|
||||
y1="1.0278323"
|
||||
x2="0.46738392"
|
||||
y2="0.21800731" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient908"
|
||||
id="linearGradient907"
|
||||
x1="0.57078654"
|
||||
y1="2.3770492"
|
||||
x2="0.33258426"
|
||||
y2="0.49180329" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient922"
|
||||
id="linearGradient921"
|
||||
x1="0.47058824"
|
||||
y1="0.15384616"
|
||||
x2="0.46547315"
|
||||
y2="0.98380566" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient922"
|
||||
id="linearGradient948" />
|
||||
<defs
|
||||
id="defs987">
|
||||
<linearGradient
|
||||
id="linearGradient855"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient908" />
|
||||
<linearGradient
|
||||
id="linearGradient1188"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient922" />
|
||||
<linearGradient
|
||||
id="linearGradient831">
|
||||
<stop
|
||||
style="stop-color:#94897f;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop832" />
|
||||
<stop
|
||||
style="stop-color:#fff5fe;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop833" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient834"
|
||||
x1="0.87550199"
|
||||
y1="0.34817815"
|
||||
x2="-0.29317269"
|
||||
y2="0.93522269"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="radialGradient835"
|
||||
r="0.55628061"
|
||||
fy="0.28125"
|
||||
fx="0.59090906"
|
||||
cy="0.28125"
|
||||
cx="0.59090906"
|
||||
spreadMethod="pad" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient893"
|
||||
x1="0.12793733"
|
||||
y1="0.76923078"
|
||||
x2="0.49608356"
|
||||
y2="0.70850199" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient855"
|
||||
id="linearGradient625"
|
||||
x1="0.035955057"
|
||||
y1="1.0276498"
|
||||
x2="0.053932585"
|
||||
y2="-0.359447" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient627"
|
||||
x1="1.2826855"
|
||||
y1="0.12550607"
|
||||
x2="-0.15547703"
|
||||
y2="0.96356273" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="radialGradient628"
|
||||
r="1.5982224"
|
||||
fy="0.4866707"
|
||||
fx="0.36789617"
|
||||
cy="0.4866707"
|
||||
cx="0.36789617"
|
||||
gradientTransform="scale(0.877379,1.139758)" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient628"
|
||||
x1="0.76923078"
|
||||
y1="0.14979757"
|
||||
x2="0.41909814"
|
||||
y2="0.73279351" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview898"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.4732669"
|
||||
inkscape:cx="50.051177"
|
||||
inkscape:cy="18.096983"
|
||||
inkscape:window-width="1022"
|
||||
inkscape:window-height="670"
|
||||
showguides="false"
|
||||
snaptoguides="false"
|
||||
showgrid="false"
|
||||
snaptogrid="false"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25">
|
||||
<sodipodi:guide
|
||||
orientation="vertical"
|
||||
position="28.705556"
|
||||
id="guide879" />
|
||||
<sodipodi:guide
|
||||
orientation="horizontal"
|
||||
position="30.130655"
|
||||
id="guide880" />
|
||||
</sodipodi:namedview>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview1003"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.3368738"
|
||||
inkscape:cx="24.541029"
|
||||
inkscape:cy="14.368596"
|
||||
inkscape:window-width="640"
|
||||
inkscape:window-height="499"
|
||||
showguides="true"
|
||||
snaptoguides="true"
|
||||
inkscape:window-x="138"
|
||||
inkscape:window-y="169" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1060"
|
||||
id="linearGradient1304"
|
||||
x1="-0.20218579"
|
||||
y1="0.21681416"
|
||||
x2="0.67759562"
|
||||
y2="0.57522124" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1065"
|
||||
id="linearGradient1322"
|
||||
x1="0.32404181"
|
||||
y1="0.77876109"
|
||||
x2="0.24041812"
|
||||
y2="0.26548672" />
|
||||
<defs
|
||||
id="defs989">
|
||||
<linearGradient
|
||||
id="linearGradient850">
|
||||
<stop
|
||||
style="stop-color:#eed680;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop852" />
|
||||
<stop
|
||||
style="stop-color:#dfb546;stop-opacity:1.0000000;"
|
||||
offset="0.68035328"
|
||||
id="stop858" />
|
||||
<stop
|
||||
style="stop-color:#d8a429;stop-opacity:1.0000000;"
|
||||
offset="0.77277374"
|
||||
id="stop859" />
|
||||
<stop
|
||||
style="stop-color:#d1940c;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop857" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient850"
|
||||
id="linearGradient569"
|
||||
x1="0.11875"
|
||||
y1="0.12612613"
|
||||
x2="0.59375"
|
||||
y2="0.66066068"
|
||||
spreadMethod="pad" />
|
||||
<linearGradient
|
||||
id="linearGradient839">
|
||||
<stop
|
||||
style="stop-color:#46a046;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop840" />
|
||||
<stop
|
||||
style="stop-color:#df421e;stop-opacity:1.0000000;"
|
||||
offset="0.39364964"
|
||||
id="stop841" />
|
||||
<stop
|
||||
style="stop-color:#ada7c8;stop-opacity:1.0000000;"
|
||||
offset="0.72036445"
|
||||
id="stop842" />
|
||||
<stop
|
||||
style="stop-color:#eed680;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop843" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient839"
|
||||
id="linearGradient836"
|
||||
x1="1.3267924e-17"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5" />
|
||||
<defs
|
||||
id="defs604">
|
||||
<linearGradient
|
||||
id="linearGradient622">
|
||||
<stop
|
||||
style="stop-color:#f8e29d;stop-opacity:0.4471;"
|
||||
offset="0"
|
||||
id="stop623" />
|
||||
<stop
|
||||
style="stop-color:#272d2d;stop-opacity:0.4784;"
|
||||
offset="1"
|
||||
id="stop624" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient617">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop618" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop619" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient613">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.6235;"
|
||||
offset="0"
|
||||
id="stop614" />
|
||||
<stop
|
||||
style="stop-color:#5d6567;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop615" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient607">
|
||||
<stop
|
||||
style="stop-color:#d7d5d5;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop608" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.4039;"
|
||||
offset="1"
|
||||
id="stop609" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient607"
|
||||
id="radialGradient610"
|
||||
cx="1.4287461"
|
||||
cy="0.75323397"
|
||||
r="0.85534656"
|
||||
fx="1.4287461"
|
||||
fy="0.75323397"
|
||||
gradientTransform="matrix(1,2.268336e-6,-1.975559e-5,1,5.713033e-8,3.856326e-8)" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient612"
|
||||
x1="7.7024956"
|
||||
y1="-2.0263922"
|
||||
x2="62.759903"
|
||||
y2="56.137772"
|
||||
gradientTransform="scale(0.9953779,1.0046436)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient613"
|
||||
id="radialGradient616"
|
||||
cx="58.70882"
|
||||
cy="53.831562"
|
||||
r="43.551846"
|
||||
fx="58.70882"
|
||||
fy="53.831562"
|
||||
gradientTransform="scale(0.99517298,1.0048504)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient621" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient626"
|
||||
x1="72.060211"
|
||||
y1="55.161442"
|
||||
x2="32.409"
|
||||
y2="12.126946"
|
||||
gradientTransform="matrix(0.995134,-1.068631e-5,-1.31398e-7,1.00489,0,0)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient607"
|
||||
id="linearGradient687"
|
||||
x1="67.707405"
|
||||
y1="49.314793"
|
||||
x2="-10.031048"
|
||||
y2="4.6068792"
|
||||
gradientTransform="scale(0.99522839,1.0047945)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient742"
|
||||
x1="-7.4378386"
|
||||
y1="25.923714"
|
||||
x2="18.009745"
|
||||
y2="10.089797"
|
||||
gradientTransform="scale(0.889853,1.123781)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview889"
|
||||
showguides="true"
|
||||
snaptoguides="true"
|
||||
inkscape:zoom="7.5625000"
|
||||
inkscape:cx="24.000000"
|
||||
inkscape:cy="24.000000"
|
||||
inkscape:window-width="640"
|
||||
inkscape:window-height="496"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview1023"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.5521067"
|
||||
inkscape:cx="66.459318"
|
||||
inkscape:cy="62.629296"
|
||||
inkscape:window-width="1150"
|
||||
inkscape:window-height="752"
|
||||
showgrid="true"
|
||||
snaptogrid="true"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29">
|
||||
<inkscape:grid
|
||||
id="GridFromPre046Settings"
|
||||
type="xygrid"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
spacingx="1.0000000mm"
|
||||
spacingy="1.0000000mm"
|
||||
color="#0000ff"
|
||||
empcolor="#0000ff"
|
||||
opacity="0.2"
|
||||
empopacity="0.4"
|
||||
empspacing="5" />
|
||||
</sodipodi:namedview>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient2924"
|
||||
x1="41.673889"
|
||||
y1="320.40921"
|
||||
x2="36.082947"
|
||||
y2="279.22458"
|
||||
gradientTransform="matrix(2.3376099,0,0,0.29237422,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient2926"
|
||||
x1="134.95444"
|
||||
y1="108.16693"
|
||||
x2="102.05431"
|
||||
y2="71.835884"
|
||||
gradientTransform="matrix(0.91680324,0,0,0.74547824,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient2928"
|
||||
x1="145.32188"
|
||||
y1="101.97199"
|
||||
x2="129.22044"
|
||||
y2="70.041069"
|
||||
gradientTransform="matrix(0.90170536,0,0,0.75796032,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<rect
|
||||
style="fill-opacity:0.47154475;fill-rule:evenodd;stroke-width:3pt"
|
||||
id="rect918"
|
||||
width="48.72493"
|
||||
height="42.16835"
|
||||
ry="0.74231374"
|
||||
x="67.536102"
|
||||
y="66.474693"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.7811048" />
|
||||
<rect
|
||||
style="fill-opacity:0.47154475;fill-rule:evenodd;stroke-width:3pt"
|
||||
id="rect1006"
|
||||
width="63.211483"
|
||||
height="54.705563"
|
||||
ry="0.74231374"
|
||||
x="64.47226"
|
||||
y="30.558294"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.7811048" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:0.47058824;fill-rule:evenodd"
|
||||
id="rect1005"
|
||||
width="57.843418"
|
||||
height="9.0050545"
|
||||
ry="0.62889248"
|
||||
x="65.398254"
|
||||
y="82.153206"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.66175652" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient2924);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.82671446"
|
||||
id="rect1007"
|
||||
width="54.910637"
|
||||
height="6.1445785"
|
||||
ry="0.42912331"
|
||||
x="64.622299"
|
||||
y="82.282539"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.44939452" />
|
||||
<rect
|
||||
width="57.905403"
|
||||
height="47.084496"
|
||||
ry="1.7822117"
|
||||
x="63.784973"
|
||||
y="32.456562"
|
||||
style="font-size:12px;fill:url(#linearGradient2926);fill-rule:evenodd;stroke:#000000;stroke-width:0"
|
||||
id="rect1009"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.6336281" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:0.47058824;fill-rule:evenodd"
|
||||
id="rect971"
|
||||
width="44.58709"
|
||||
height="6.9413123"
|
||||
ry="0.62889248"
|
||||
x="68.249886"
|
||||
y="106.24529"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.66175652" />
|
||||
<rect
|
||||
width="64.637024"
|
||||
height="54.068516"
|
||||
ry="1.4120796"
|
||||
x="59.853096"
|
||||
y="28.740753"
|
||||
style="font-size:12px;fill:url(#linearGradient2928);fill-rule:evenodd;stroke:#000000;stroke-width:1.65869105"
|
||||
id="rect1008"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.3970968" />
|
||||
<rect
|
||||
width="51.129478"
|
||||
height="39.964478"
|
||||
ry="0.5422883"
|
||||
x="66.358932"
|
||||
y="34.89621"
|
||||
style="font-size:12px;fill:#00b4ed;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.79054338;stroke-linejoin:round"
|
||||
id="rect976"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.5422883" />
|
||||
<metadata
|
||||
id="metadata982">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<rect
|
||||
width="44.634872"
|
||||
height="36.293858"
|
||||
ry="1.7822117"
|
||||
x="67.006332"
|
||||
y="67.937927"
|
||||
style="font-size:12px;fill:url(#linearGradient1213);fill-rule:evenodd;stroke:#000000;stroke-width:0"
|
||||
id="rect575"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.633628" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:#444040;fill-opacity:0.47058824;fill-rule:evenodd"
|
||||
id="path672"
|
||||
d="m 68.473,57.85183 a 23.629898,3.2222576 0 1 1 -47.259797,0 23.629898,3.2222576 0 1 1 47.259797,0 z"
|
||||
sodipodi:cx="44.843102"
|
||||
sodipodi:cy="57.85183"
|
||||
sodipodi:rx="23.629898"
|
||||
sodipodi:ry="3.2222576"
|
||||
transform="matrix(1.4221482,0,-0.30247168,1.9834766,9.6201687,-10.428817)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:#4e4d4b;fill-rule:evenodd;stroke:#000000;stroke-width:2.30019999;stroke-opacity:0.9565"
|
||||
id="path625"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-1.0172416,-0.47376693,-0.5523759,1.3286212,116.84611,57.272851)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:url(#linearGradient612);fill-rule:evenodd;stroke:#000000;stroke-width:2.06100011;stroke-opacity:0.9565"
|
||||
id="path605"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-1.4321234,-0.79696518,-1.1299666,2.2349846,128.07685,29.383033)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:url(#radialGradient616);fill-rule:evenodd;stroke:#000000;stroke-width:0.317;stroke-opacity:0.97829997"
|
||||
id="path606"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-1.1546358,-0.69851175,-0.95634664,1.9588777,108.06887,31.115628)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:1.63499999"
|
||||
id="path686"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-0.39495459,-0.4546194,-0.52881207,0.94219495,73.198184,52.427791)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:url(#linearGradient687);fill-rule:evenodd;stroke:#3f3b3b;stroke-width:0.77380002"
|
||||
id="path611"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-0.36949013,-0.40957751,-0.49471918,0.84885391,70.248021,52.066881)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient573);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.82671446"
|
||||
id="rect934"
|
||||
width="42.326431"
|
||||
height="4.7363882"
|
||||
ry="0.42912331"
|
||||
x="67.651756"
|
||||
y="106.34497"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.44939449" />
|
||||
<rect
|
||||
width="49.823761"
|
||||
height="41.677303"
|
||||
ry="1.4120796"
|
||||
x="63.975548"
|
||||
y="65.073692"
|
||||
style="font-size:12px;fill:url(#linearGradient580);fill-rule:evenodd;stroke:#000000;stroke-width:1.27855873;stroke-opacity:1"
|
||||
id="rect562"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.3970969" />
|
||||
<rect
|
||||
width="39.411831"
|
||||
height="30.805574"
|
||||
ry="0.5422883"
|
||||
x="68.990387"
|
||||
y="70.097008"
|
||||
style="font-size:12px;fill:#003d88;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.61407685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.93023257"
|
||||
id="rect975"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.5422883" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 27 KiB |
64
python/build/autotools.py
Normal file
64
python/build/autotools.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import os.path, subprocess, sys
|
||||
|
||||
from build.makeproject import MakeProject
|
||||
|
||||
class AutotoolsProject(MakeProject):
|
||||
def __init__(self, url, md5, installed, configure_args=[],
|
||||
autogen=False,
|
||||
autoreconf=False,
|
||||
cppflags='',
|
||||
ldflags='',
|
||||
libs='',
|
||||
subdirs=None,
|
||||
**kwargs):
|
||||
MakeProject.__init__(self, url, md5, installed, **kwargs)
|
||||
self.configure_args = configure_args
|
||||
self.autogen = autogen
|
||||
self.autoreconf = autoreconf
|
||||
self.cppflags = cppflags
|
||||
self.ldflags = ldflags
|
||||
self.libs = libs
|
||||
self.subdirs = subdirs
|
||||
|
||||
def configure(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
if self.autogen:
|
||||
if sys.platform == 'darwin':
|
||||
subprocess.check_call(['glibtoolize', '--force'], cwd=src)
|
||||
else:
|
||||
subprocess.check_call(['libtoolize', '--force'], cwd=src)
|
||||
subprocess.check_call(['aclocal'], cwd=src)
|
||||
subprocess.check_call(['automake', '--add-missing', '--force-missing', '--foreign'], cwd=src)
|
||||
subprocess.check_call(['autoconf'], cwd=src)
|
||||
if self.autoreconf:
|
||||
subprocess.check_call(['autoreconf', '-vif'], cwd=src)
|
||||
|
||||
build = self.make_build_path(toolchain)
|
||||
|
||||
configure = [
|
||||
os.path.join(src, 'configure'),
|
||||
'CC=' + toolchain.cc,
|
||||
'CXX=' + toolchain.cxx,
|
||||
'CFLAGS=' + toolchain.cflags,
|
||||
'CXXFLAGS=' + toolchain.cxxflags,
|
||||
'CPPFLAGS=' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'LDFLAGS=' + toolchain.ldflags + ' ' + self.ldflags,
|
||||
'LIBS=' + toolchain.libs + ' ' + self.libs,
|
||||
'AR=' + toolchain.ar,
|
||||
'RANLIB=' + toolchain.ranlib,
|
||||
'STRIP=' + toolchain.strip,
|
||||
'--host=' + toolchain.arch,
|
||||
'--prefix=' + toolchain.install_prefix,
|
||||
'--enable-silent-rules',
|
||||
] + self.configure_args
|
||||
|
||||
subprocess.check_call(configure, cwd=build, env=toolchain.env)
|
||||
return build
|
||||
|
||||
def build(self, toolchain):
|
||||
build = self.configure(toolchain)
|
||||
if self.subdirs is not None:
|
||||
for subdir in self.subdirs:
|
||||
MakeProject.build(self, toolchain, os.path.join(build, subdir))
|
||||
else:
|
||||
MakeProject.build(self, toolchain, build)
|
||||
23
python/build/boost.py
Normal file
23
python/build/boost.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import os, shutil
|
||||
import re
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class BoostProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
**kwargs):
|
||||
m = re.match(r'.*/boost_(\d+)_(\d+)_(\d+)\.tar\.bz2$', url)
|
||||
version = "%s.%s.%s" % (m.group(1), m.group(2), m.group(3))
|
||||
Project.__init__(self, url, md5, installed,
|
||||
name='boost', version=version,
|
||||
**kwargs)
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
|
||||
# install the headers manually; don't build any library
|
||||
# (because right now, we only use header-only libraries)
|
||||
includedir = os.path.join(toolchain.install_prefix, 'include')
|
||||
dest = os.path.join(includedir, 'boost')
|
||||
shutil.rmtree(dest, ignore_errors=True)
|
||||
shutil.copytree(os.path.join(src, 'boost'), dest)
|
||||
29
python/build/cmdline.py
Normal file
29
python/build/cmdline.py
Normal file
@@ -0,0 +1,29 @@
|
||||
def concatenate_cmdline_variables(src, names):
|
||||
"""Find duplicate variable declarations on the given source list, and
|
||||
concatenate the values of those in the 'names' list."""
|
||||
|
||||
# the result list being constructed
|
||||
dest = []
|
||||
|
||||
# a map of variable name to destination list index
|
||||
positions = {}
|
||||
|
||||
for item in src:
|
||||
i = item.find('=')
|
||||
if i > 0:
|
||||
# it's a variable
|
||||
name = item[:i]
|
||||
if name in names:
|
||||
# it's a known variable
|
||||
if name in positions:
|
||||
# already specified: concatenate instead of
|
||||
# appending it
|
||||
dest[positions[name]] += ' ' + item[i + 1:]
|
||||
continue
|
||||
else:
|
||||
# not yet seen: append it and remember the list
|
||||
# index
|
||||
positions[name] = len(dest)
|
||||
dest.append(item)
|
||||
|
||||
return dest
|
||||
9
python/build/dirs.py
Normal file
9
python/build/dirs.py
Normal file
@@ -0,0 +1,9 @@
|
||||
import os.path
|
||||
|
||||
lib_path = os.path.abspath('lib')
|
||||
|
||||
shared_path = lib_path
|
||||
if 'MPD_SHARED_LIB' in os.environ:
|
||||
shared_path = os.environ['MPD_SHARED_LIB']
|
||||
tarball_path = os.path.join(shared_path, 'download')
|
||||
src_path = os.path.join(shared_path, 'src')
|
||||
26
python/build/download.py
Normal file
26
python/build/download.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from build.verify import verify_file_digest
|
||||
import os
|
||||
import urllib.request
|
||||
|
||||
def download_and_verify(url, md5, parent_path):
|
||||
"""Download a file, verify its MD5 checksum and return the local path."""
|
||||
|
||||
os.makedirs(parent_path, exist_ok=True)
|
||||
path = os.path.join(parent_path, os.path.basename(url))
|
||||
|
||||
try:
|
||||
if verify_file_digest(path, md5): return path
|
||||
os.unlink(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
tmp_path = path + '.tmp'
|
||||
|
||||
print("download", url)
|
||||
urllib.request.urlretrieve(url, tmp_path)
|
||||
if not verify_file_digest(tmp_path, md5):
|
||||
os.unlink(tmp_path)
|
||||
raise RuntimeError("Digest mismatch")
|
||||
|
||||
os.rename(tmp_path, path)
|
||||
return path
|
||||
54
python/build/ffmpeg.py
Normal file
54
python/build/ffmpeg.py
Normal file
@@ -0,0 +1,54 @@
|
||||
import os.path, subprocess
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class FfmpegProject(Project):
|
||||
def __init__(self, url, md5, installed, configure_args=[],
|
||||
cppflags='',
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
self.configure_args = configure_args
|
||||
self.cppflags = cppflags
|
||||
|
||||
def _filter_cflags(self, flags):
|
||||
# FFmpeg expects the GNU as syntax
|
||||
flags = flags.replace(' -integrated-as ', ' -no-integrated-as ')
|
||||
return flags
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
build = self.make_build_path(toolchain)
|
||||
|
||||
if toolchain.is_arm:
|
||||
arch = 'arm'
|
||||
else:
|
||||
arch = 'x86'
|
||||
|
||||
if toolchain.is_windows:
|
||||
target_os = 'mingw32'
|
||||
else:
|
||||
target_os = 'linux'
|
||||
|
||||
configure = [
|
||||
os.path.join(src, 'configure'),
|
||||
'--cc=' + toolchain.cc,
|
||||
'--cxx=' + toolchain.cxx,
|
||||
'--nm=' + toolchain.nm,
|
||||
'--extra-cflags=' + self._filter_cflags(toolchain.cflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-cxxflags=' + self._filter_cflags(toolchain.cxxflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-ldflags=' + toolchain.ldflags,
|
||||
'--extra-libs=' + toolchain.libs,
|
||||
'--ar=' + toolchain.ar,
|
||||
'--ranlib=' + toolchain.ranlib,
|
||||
'--enable-cross-compile',
|
||||
'--arch=' + arch,
|
||||
'--target-os=' + target_os,
|
||||
'--prefix=' + toolchain.install_prefix,
|
||||
] + self.configure_args
|
||||
|
||||
if toolchain.is_armv7:
|
||||
configure.append('--cpu=cortex-a8')
|
||||
|
||||
subprocess.check_call(configure, cwd=build, env=toolchain.env)
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet', '-j12'], cwd=build, env=toolchain.env)
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet', 'install'], cwd=build, env=toolchain.env)
|
||||
386
python/build/libs.py
Normal file
386
python/build/libs.py
Normal file
@@ -0,0 +1,386 @@
|
||||
import re
|
||||
from os.path import abspath
|
||||
|
||||
from build.project import Project
|
||||
from build.zlib import ZlibProject
|
||||
from build.meson import MesonProject
|
||||
from build.autotools import AutotoolsProject
|
||||
from build.ffmpeg import FfmpegProject
|
||||
from build.boost import BoostProject
|
||||
|
||||
libmpdclient = MesonProject(
|
||||
'https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.14.tar.xz',
|
||||
'0a84e2791bfe3077cf22ee1784c805d5bb550803dffe56a39aa3690a38061372',
|
||||
'lib/libmpdclient.a',
|
||||
)
|
||||
|
||||
libogg = AutotoolsProject(
|
||||
'http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.xz',
|
||||
'4f3fc6178a533d392064f14776b23c397ed4b9f48f5de297aba73b643f955c08',
|
||||
'lib/libogg.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
],
|
||||
)
|
||||
|
||||
libvorbis = AutotoolsProject(
|
||||
'http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.6.tar.xz',
|
||||
'af00bb5a784e7c9e69f56823de4637c350643deedaf333d0fa86ecdba6fcb415',
|
||||
'lib/libvorbis.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
],
|
||||
|
||||
edits={
|
||||
# this option is not understood by clang
|
||||
'configure': lambda data: data.replace('-mno-ieee-fp', ' '),
|
||||
}
|
||||
)
|
||||
|
||||
opus = AutotoolsProject(
|
||||
'https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz',
|
||||
'cfafd339ccd9c5ef8d6ab15d7e1a412c054bf4cb4ecbbbcc78c12ef2def70732',
|
||||
'lib/libopus.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-doc',
|
||||
'--disable-extra-programs',
|
||||
],
|
||||
|
||||
# suppress "visibility default" from opus_defines.h
|
||||
cppflags='-DOPUS_EXPORT=',
|
||||
)
|
||||
|
||||
flac = AutotoolsProject(
|
||||
'http://downloads.xiph.org/releases/flac/flac-1.3.2.tar.xz',
|
||||
'91cfc3ed61dc40f47f050a109b08610667d73477af6ef36dcad31c31a4a8d53f',
|
||||
'lib/libFLAC.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-xmms-plugin', '--disable-cpplibs',
|
||||
'--disable-doxygen-docs',
|
||||
],
|
||||
subdirs=['include', 'src/libFLAC'],
|
||||
)
|
||||
|
||||
zlib = ZlibProject(
|
||||
'http://zlib.net/zlib-1.2.11.tar.xz',
|
||||
'4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066',
|
||||
'lib/libz.a',
|
||||
)
|
||||
|
||||
libid3tag = AutotoolsProject(
|
||||
'ftp://ftp.mars.org/pub/mpeg/libid3tag-0.15.1b.tar.gz',
|
||||
'e5808ad997ba32c498803822078748c3',
|
||||
'lib/libid3tag.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
|
||||
# without this, libid3tag's configure.ac ignores -O* and -f*
|
||||
'--disable-debugging',
|
||||
],
|
||||
autogen=True,
|
||||
|
||||
edits={
|
||||
# fix bug in libid3tag's configure.ac which discards all but the last optimization flag
|
||||
'configure.ac': lambda data: re.sub(r'optimize="\$1"', r'optimize="$optimize $1"', data, count=1),
|
||||
}
|
||||
)
|
||||
|
||||
libmad = AutotoolsProject(
|
||||
'ftp://ftp.mars.org/pub/mpeg/libmad-0.15.1b.tar.gz',
|
||||
'1be543bc30c56fb6bea1d7bf6a64e66c',
|
||||
'lib/libmad.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
|
||||
# without this, libmad's configure.ac ignores -O* and -f*
|
||||
'--disable-debugging',
|
||||
],
|
||||
autogen=True,
|
||||
)
|
||||
|
||||
liblame = AutotoolsProject(
|
||||
'http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz',
|
||||
'ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e',
|
||||
'lib/libmp3lame.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-gtktest', '--disable-analyzer-hooks',
|
||||
'--disable-decoder', '--disable-frontend',
|
||||
],
|
||||
)
|
||||
|
||||
ffmpeg = FfmpegProject(
|
||||
'http://ffmpeg.org/releases/ffmpeg-4.0.tar.xz',
|
||||
'ed945daf40b124e77a685893cc025d086f638bc703183460aff49508edb3a43f',
|
||||
'lib/libavcodec.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--enable-gpl',
|
||||
'--enable-small',
|
||||
'--disable-pthreads',
|
||||
'--disable-programs',
|
||||
'--disable-doc',
|
||||
'--disable-avdevice',
|
||||
'--disable-swresample',
|
||||
'--disable-swscale',
|
||||
'--disable-postproc',
|
||||
'--disable-avfilter',
|
||||
'--disable-lzo',
|
||||
'--disable-faan',
|
||||
'--disable-pixelutils',
|
||||
'--disable-network',
|
||||
'--disable-encoders',
|
||||
'--disable-muxers',
|
||||
'--disable-protocols',
|
||||
'--disable-devices',
|
||||
'--disable-filters',
|
||||
'--disable-v4l2_m2m',
|
||||
|
||||
'--disable-parser=bmp',
|
||||
'--disable-parser=cavsvideo',
|
||||
'--disable-parser=dvbsub',
|
||||
'--disable-parser=dvdsub',
|
||||
'--disable-parser=dvd_nav',
|
||||
'--disable-parser=flac',
|
||||
'--disable-parser=g729',
|
||||
'--disable-parser=gsm',
|
||||
'--disable-parser=h261',
|
||||
'--disable-parser=h263',
|
||||
'--disable-parser=h264',
|
||||
'--disable-parser=hevc',
|
||||
'--disable-parser=mjpeg',
|
||||
'--disable-parser=mlp',
|
||||
'--disable-parser=mpeg4video',
|
||||
'--disable-parser=mpegvideo',
|
||||
'--disable-parser=opus',
|
||||
'--disable-parser=vc1',
|
||||
'--disable-parser=vp3',
|
||||
'--disable-parser=vp8',
|
||||
'--disable-parser=vp9',
|
||||
'--disable-parser=png',
|
||||
'--disable-parser=pnm',
|
||||
'--disable-parser=xma',
|
||||
|
||||
'--disable-demuxer=aqtitle',
|
||||
'--disable-demuxer=ass',
|
||||
'--disable-demuxer=bethsoftvid',
|
||||
'--disable-demuxer=bink',
|
||||
'--disable-demuxer=cavsvideo',
|
||||
'--disable-demuxer=cdxl',
|
||||
'--disable-demuxer=dvbsub',
|
||||
'--disable-demuxer=dvbtxt',
|
||||
'--disable-demuxer=h261',
|
||||
'--disable-demuxer=h263',
|
||||
'--disable-demuxer=h264',
|
||||
'--disable-demuxer=ico',
|
||||
'--disable-demuxer=image2',
|
||||
'--disable-demuxer=jacosub',
|
||||
'--disable-demuxer=lrc',
|
||||
'--disable-demuxer=microdvd',
|
||||
'--disable-demuxer=mjpeg',
|
||||
'--disable-demuxer=mjpeg_2000',
|
||||
'--disable-demuxer=mpegps',
|
||||
'--disable-demuxer=mpegvideo',
|
||||
'--disable-demuxer=mpl2',
|
||||
'--disable-demuxer=mpsub',
|
||||
'--disable-demuxer=pjs',
|
||||
'--disable-demuxer=rawvideo',
|
||||
'--disable-demuxer=realtext',
|
||||
'--disable-demuxer=sami',
|
||||
'--disable-demuxer=scc',
|
||||
'--disable-demuxer=srt',
|
||||
'--disable-demuxer=stl',
|
||||
'--disable-demuxer=subviewer',
|
||||
'--disable-demuxer=subviewer1',
|
||||
'--disable-demuxer=swf',
|
||||
'--disable-demuxer=tedcaptions',
|
||||
'--disable-demuxer=vobsub',
|
||||
'--disable-demuxer=vplayer',
|
||||
'--disable-demuxer=webvtt',
|
||||
'--disable-demuxer=yuv4mpegpipe',
|
||||
|
||||
# we don't need these decoders, because we have the dedicated
|
||||
# libraries
|
||||
'--disable-decoder=flac',
|
||||
'--disable-decoder=opus',
|
||||
'--disable-decoder=vorbis',
|
||||
|
||||
# audio codecs nobody uses
|
||||
'--disable-decoder=atrac1',
|
||||
'--disable-decoder=atrac3',
|
||||
'--disable-decoder=atrac3al',
|
||||
'--disable-decoder=atrac3p',
|
||||
'--disable-decoder=atrac3pal',
|
||||
'--disable-decoder=binkaudio_dct',
|
||||
'--disable-decoder=binkaudio_rdft',
|
||||
'--disable-decoder=bmv_audio',
|
||||
'--disable-decoder=dsicinaudio',
|
||||
'--disable-decoder=dvaudio',
|
||||
'--disable-decoder=metasound',
|
||||
'--disable-decoder=paf_audio',
|
||||
'--disable-decoder=ra_144',
|
||||
'--disable-decoder=ra_288',
|
||||
'--disable-decoder=ralf',
|
||||
'--disable-decoder=qdm2',
|
||||
'--disable-decoder=qdmc',
|
||||
|
||||
# disable lots of image and video codecs
|
||||
'--disable-decoder=ass',
|
||||
'--disable-decoder=asv1',
|
||||
'--disable-decoder=asv2',
|
||||
'--disable-decoder=apng',
|
||||
'--disable-decoder=avrn',
|
||||
'--disable-decoder=avrp',
|
||||
'--disable-decoder=bethsoftvid',
|
||||
'--disable-decoder=bink',
|
||||
'--disable-decoder=bmp',
|
||||
'--disable-decoder=bmv_video',
|
||||
'--disable-decoder=cavs',
|
||||
'--disable-decoder=ccaption',
|
||||
'--disable-decoder=cdgraphics',
|
||||
'--disable-decoder=clearvideo',
|
||||
'--disable-decoder=dirac',
|
||||
'--disable-decoder=dsicinvideo',
|
||||
'--disable-decoder=dvbsub',
|
||||
'--disable-decoder=dvdsub',
|
||||
'--disable-decoder=dvvideo',
|
||||
'--disable-decoder=exr',
|
||||
'--disable-decoder=ffv1',
|
||||
'--disable-decoder=ffvhuff',
|
||||
'--disable-decoder=ffwavesynth',
|
||||
'--disable-decoder=flic',
|
||||
'--disable-decoder=flv',
|
||||
'--disable-decoder=fraps',
|
||||
'--disable-decoder=gif',
|
||||
'--disable-decoder=h261',
|
||||
'--disable-decoder=h263',
|
||||
'--disable-decoder=h263i',
|
||||
'--disable-decoder=h263p',
|
||||
'--disable-decoder=h264',
|
||||
'--disable-decoder=hevc',
|
||||
'--disable-decoder=hnm4_video',
|
||||
'--disable-decoder=hq_hqa',
|
||||
'--disable-decoder=hqx',
|
||||
'--disable-decoder=idcin',
|
||||
'--disable-decoder=iff_ilbm',
|
||||
'--disable-decoder=indeo2',
|
||||
'--disable-decoder=indeo3',
|
||||
'--disable-decoder=indeo4',
|
||||
'--disable-decoder=indeo5',
|
||||
'--disable-decoder=interplay_video',
|
||||
'--disable-decoder=jacosub',
|
||||
'--disable-decoder=jpeg2000',
|
||||
'--disable-decoder=jpegls',
|
||||
'--disable-decoder=microdvd',
|
||||
'--disable-decoder=mimic',
|
||||
'--disable-decoder=mjpeg',
|
||||
'--disable-decoder=mmvideo',
|
||||
'--disable-decoder=mpl2',
|
||||
'--disable-decoder=motionpixels',
|
||||
'--disable-decoder=mpeg1video',
|
||||
'--disable-decoder=mpeg2video',
|
||||
'--disable-decoder=mpeg4',
|
||||
'--disable-decoder=mpegvideo',
|
||||
'--disable-decoder=mscc',
|
||||
'--disable-decoder=msmpeg4_crystalhd',
|
||||
'--disable-decoder=msmpeg4v1',
|
||||
'--disable-decoder=msmpeg4v2',
|
||||
'--disable-decoder=msmpeg4v3',
|
||||
'--disable-decoder=msvideo1',
|
||||
'--disable-decoder=mszh',
|
||||
'--disable-decoder=mvc1',
|
||||
'--disable-decoder=mvc2',
|
||||
'--disable-decoder=on2avc',
|
||||
'--disable-decoder=paf_video',
|
||||
'--disable-decoder=png',
|
||||
'--disable-decoder=qdraw',
|
||||
'--disable-decoder=qpeg',
|
||||
'--disable-decoder=rawvideo',
|
||||
'--disable-decoder=realtext',
|
||||
'--disable-decoder=roq',
|
||||
'--disable-decoder=roq_dpcm',
|
||||
'--disable-decoder=rscc',
|
||||
'--disable-decoder=rv10',
|
||||
'--disable-decoder=rv20',
|
||||
'--disable-decoder=rv30',
|
||||
'--disable-decoder=rv40',
|
||||
'--disable-decoder=sami',
|
||||
'--disable-decoder=sheervideo',
|
||||
'--disable-decoder=snow',
|
||||
'--disable-decoder=srt',
|
||||
'--disable-decoder=stl',
|
||||
'--disable-decoder=subrip',
|
||||
'--disable-decoder=subviewer',
|
||||
'--disable-decoder=subviewer1',
|
||||
'--disable-decoder=svq1',
|
||||
'--disable-decoder=svq3',
|
||||
'--disable-decoder=tiff',
|
||||
'--disable-decoder=tiertexseqvideo',
|
||||
'--disable-decoder=truemotion1',
|
||||
'--disable-decoder=truemotion2',
|
||||
'--disable-decoder=truemotion2rt',
|
||||
'--disable-decoder=twinvq',
|
||||
'--disable-decoder=utvideo',
|
||||
'--disable-decoder=vc1',
|
||||
'--disable-decoder=vmdvideo',
|
||||
'--disable-decoder=vp3',
|
||||
'--disable-decoder=vp5',
|
||||
'--disable-decoder=vp6',
|
||||
'--disable-decoder=vp7',
|
||||
'--disable-decoder=vp8',
|
||||
'--disable-decoder=vp9',
|
||||
'--disable-decoder=vqa',
|
||||
'--disable-decoder=webvtt',
|
||||
'--disable-decoder=wmv1',
|
||||
'--disable-decoder=wmv2',
|
||||
'--disable-decoder=wmv3',
|
||||
'--disable-decoder=yuv4',
|
||||
],
|
||||
)
|
||||
|
||||
curl = AutotoolsProject(
|
||||
'http://curl.haxx.se/download/curl-7.60.0.tar.xz',
|
||||
'8736ff8ded89ddf7e926eec7b16f82597d029fc1469f3a551f1fafaac164e6a0',
|
||||
'lib/libcurl.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-debug',
|
||||
'--enable-http',
|
||||
'--enable-ipv6',
|
||||
'--disable-ftp', '--disable-file',
|
||||
'--disable-ldap', '--disable-ldaps',
|
||||
'--disable-rtsp', '--disable-proxy', '--disable-dict', '--disable-telnet',
|
||||
'--disable-tftp', '--disable-pop3', '--disable-imap', '--disable-smtp',
|
||||
'--disable-smb',
|
||||
'--disable-gopher',
|
||||
'--disable-manual',
|
||||
'--disable-threaded-resolver', '--disable-verbose', '--disable-sspi',
|
||||
'--disable-crypto-auth', '--disable-ntlm-wb', '--disable-tls-srp', '--disable-cookies',
|
||||
'--without-ssl', '--without-gnutls', '--without-nss', '--without-libssh2',
|
||||
],
|
||||
|
||||
patches='src/lib/curl/patches',
|
||||
)
|
||||
|
||||
libnfs = AutotoolsProject(
|
||||
'https://github.com/sahlberg/libnfs/archive/libnfs-2.0.0.tar.gz',
|
||||
'7ea6cd8fa6c461d01091e584d424d28e137d23ff4b65b95d01a3fd0ef95d120e',
|
||||
'lib/libnfs.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-debug',
|
||||
|
||||
# work around -Wtautological-compare
|
||||
'--disable-werror',
|
||||
],
|
||||
base='libnfs-libnfs-2.0.0',
|
||||
autoreconf=True,
|
||||
)
|
||||
|
||||
boost = BoostProject(
|
||||
'http://downloads.sourceforge.net/project/boost/boost/1.66.0/boost_1_66_0.tar.bz2',
|
||||
'5721818253e6a0989583192f96782c4a98eb6204965316df9f5ad75819225ca9',
|
||||
'include/boost/version.hpp',
|
||||
)
|
||||
28
python/build/makeproject.py
Normal file
28
python/build/makeproject.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import subprocess
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class MakeProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
install_target='install',
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
self.install_target = install_target
|
||||
|
||||
def get_simultaneous_jobs(self):
|
||||
return 12
|
||||
|
||||
def get_make_args(self, toolchain):
|
||||
return ['--quiet', '-j' + str(self.get_simultaneous_jobs())]
|
||||
|
||||
def get_make_install_args(self, toolchain):
|
||||
return ['--quiet', self.install_target]
|
||||
|
||||
def make(self, toolchain, wd, args):
|
||||
subprocess.check_call(['/usr/bin/make'] + args,
|
||||
cwd=wd, env=toolchain.env)
|
||||
|
||||
def build(self, toolchain, wd, install=True):
|
||||
self.make(toolchain, wd, self.get_make_args(toolchain))
|
||||
if install:
|
||||
self.make(toolchain, wd, self.get_make_install_args(toolchain))
|
||||
96
python/build/meson.py
Normal file
96
python/build/meson.py
Normal file
@@ -0,0 +1,96 @@
|
||||
import os.path, subprocess, sys
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class MesonProject(Project):
|
||||
def __init__(self, url, md5, installed, configure_args=[],
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
self.configure_args = configure_args
|
||||
|
||||
def _make_cross_file(self, toolchain):
|
||||
if toolchain.is_windows:
|
||||
system = 'windows'
|
||||
else:
|
||||
system = 'linux'
|
||||
|
||||
if toolchain.is_arm:
|
||||
cpu_family = 'arm'
|
||||
if toolchain.is_armv7:
|
||||
cpu = 'armv7'
|
||||
else:
|
||||
cpu = 'armv6'
|
||||
else:
|
||||
cpu_family = 'x86'
|
||||
if 'x86_64' in toolchain.arch:
|
||||
cpu = 'x86_64'
|
||||
else:
|
||||
cpu = 'i686'
|
||||
|
||||
# TODO: support more CPUs
|
||||
endian = 'little'
|
||||
|
||||
# TODO: write pkg-config wrapper
|
||||
|
||||
path = os.path.join(toolchain.build_path, 'meson.cross')
|
||||
os.makedirs(toolchain.build_path, exist_ok=True)
|
||||
with open(path, 'w') as f:
|
||||
f.write("""
|
||||
[binaries]
|
||||
c = '%s'
|
||||
cpp = '%s'
|
||||
ar = '%s'
|
||||
strip = '%s'
|
||||
|
||||
[properties]
|
||||
root = '%s'
|
||||
|
||||
c_args = %s
|
||||
c_link_args = %s
|
||||
|
||||
cpp_args = %s
|
||||
cpp_link_args = %s
|
||||
|
||||
[host_machine]
|
||||
system = '%s'
|
||||
cpu_family = '%s'
|
||||
cpu = '%s'
|
||||
endian = '%s'
|
||||
""" % (toolchain.cc, toolchain.cxx, toolchain.ar, toolchain.strip,
|
||||
toolchain.install_prefix,
|
||||
repr((toolchain.cppflags + ' ' + toolchain.cflags).split()),
|
||||
repr(toolchain.ldflags.split()),
|
||||
repr((toolchain.cppflags + ' ' + toolchain.cxxflags).split()),
|
||||
repr(toolchain.ldflags.split()),
|
||||
system, cpu_family, cpu, endian))
|
||||
return path
|
||||
|
||||
def configure(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
cross_file = self._make_cross_file(toolchain)
|
||||
build = self.make_build_path(toolchain)
|
||||
configure = [
|
||||
'meson',
|
||||
src, build,
|
||||
|
||||
'--prefix', toolchain.install_prefix,
|
||||
|
||||
# this is necessary because Meson uses Debian's build machine
|
||||
# MultiArch path (e.g. "lib/x86_64-linux-gnu") for cross
|
||||
# builds, which is obviously wrong
|
||||
'--libdir', 'lib',
|
||||
|
||||
'--buildtype', 'plain',
|
||||
|
||||
'--default-library=static',
|
||||
|
||||
'--cross-file', cross_file,
|
||||
] + self.configure_args
|
||||
|
||||
subprocess.check_call(configure, env=toolchain.env)
|
||||
return build
|
||||
|
||||
def build(self, toolchain):
|
||||
build = self.configure(toolchain)
|
||||
subprocess.check_call(['ninja', 'install'],
|
||||
cwd=build, env=toolchain.env)
|
||||
81
python/build/project.py
Normal file
81
python/build/project.py
Normal file
@@ -0,0 +1,81 @@
|
||||
import os, shutil
|
||||
import re
|
||||
|
||||
from build.download import download_and_verify
|
||||
from build.tar import untar
|
||||
from build.quilt import push_all
|
||||
|
||||
class Project:
|
||||
def __init__(self, url, md5, installed, name=None, version=None,
|
||||
base=None,
|
||||
patches=None,
|
||||
edits=None,
|
||||
use_cxx=False):
|
||||
if base is None:
|
||||
basename = os.path.basename(url)
|
||||
m = re.match(r'^(.+)\.(tar(\.(gz|bz2|xz|lzma))?|zip)$', basename)
|
||||
if not m: raise
|
||||
self.base = m.group(1)
|
||||
else:
|
||||
self.base = base
|
||||
|
||||
if name is None or version is None:
|
||||
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*)$', self.base)
|
||||
if name is None: name = m.group(1)
|
||||
if version is None: version = m.group(2)
|
||||
|
||||
self.name = name
|
||||
self.version = version
|
||||
|
||||
self.url = url
|
||||
self.md5 = md5
|
||||
self.installed = installed
|
||||
|
||||
if patches is not None:
|
||||
srcdir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||||
patches = os.path.join(srcdir, patches)
|
||||
self.patches = patches
|
||||
self.edits = edits
|
||||
self.use_cxx = use_cxx
|
||||
|
||||
def download(self, toolchain):
|
||||
return download_and_verify(self.url, self.md5, toolchain.tarball_path)
|
||||
|
||||
def is_installed(self, toolchain):
|
||||
tarball = self.download(toolchain)
|
||||
installed = os.path.join(toolchain.install_prefix, self.installed)
|
||||
tarball_mtime = os.path.getmtime(tarball)
|
||||
try:
|
||||
return os.path.getmtime(installed) >= tarball_mtime
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
|
||||
def unpack(self, toolchain, out_of_tree=True):
|
||||
if out_of_tree:
|
||||
parent_path = toolchain.src_path
|
||||
else:
|
||||
parent_path = toolchain.build_path
|
||||
path = untar(self.download(toolchain), parent_path, self.base)
|
||||
|
||||
if self.patches is not None:
|
||||
push_all(toolchain, path, self.patches)
|
||||
|
||||
if self.edits is not None:
|
||||
for filename, function in self.edits.items():
|
||||
with open(os.path.join(path, filename), 'r+t') as f:
|
||||
old_data = f.read()
|
||||
new_data = function(old_data)
|
||||
f.seek(0)
|
||||
f.truncate(0)
|
||||
f.write(new_data)
|
||||
|
||||
return path
|
||||
|
||||
def make_build_path(self, toolchain):
|
||||
path = os.path.join(toolchain.build_path, self.base)
|
||||
try:
|
||||
shutil.rmtree(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
os.makedirs(path, exist_ok=True)
|
||||
return path
|
||||
9
python/build/quilt.py
Normal file
9
python/build/quilt.py
Normal file
@@ -0,0 +1,9 @@
|
||||
import subprocess
|
||||
|
||||
def run_quilt(toolchain, cwd, patches_path, *args):
|
||||
env = dict(toolchain.env)
|
||||
env['QUILT_PATCHES'] = patches_path
|
||||
subprocess.check_call(['quilt'] + list(args), cwd=cwd, env=env)
|
||||
|
||||
def push_all(toolchain, src_path, patches_path):
|
||||
run_quilt(toolchain, src_path, patches_path, 'push', '-a')
|
||||
11
python/build/tar.py
Normal file
11
python/build/tar.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import os, shutil, subprocess
|
||||
|
||||
def untar(tarball_path, parent_path, base):
|
||||
path = os.path.join(parent_path, base)
|
||||
try:
|
||||
shutil.rmtree(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
os.makedirs(parent_path, exist_ok=True)
|
||||
subprocess.check_call(['/bin/tar', 'xfC', tarball_path, parent_path])
|
||||
return path
|
||||
42
python/build/verify.py
Normal file
42
python/build/verify.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import hashlib
|
||||
|
||||
def feed_file(h, f):
|
||||
"""Feed data read from an open file into the hashlib instance."""
|
||||
|
||||
while True:
|
||||
data = f.read(65536)
|
||||
if len(data) == 0:
|
||||
# end of file
|
||||
break
|
||||
h.update(data)
|
||||
|
||||
def feed_file_path(h, path):
|
||||
"""Feed data read from a file (to be opened by this function) into the hashlib instance."""
|
||||
|
||||
with open(path, 'rb') as f:
|
||||
feed_file(h, f)
|
||||
|
||||
def file_digest(algorithm, path):
|
||||
"""Calculate the digest of a file and return it in hexadecimal notation."""
|
||||
|
||||
h = algorithm()
|
||||
feed_file_path(h, path)
|
||||
return h.hexdigest()
|
||||
|
||||
def guess_digest_algorithm(digest):
|
||||
l = len(digest)
|
||||
if l == 32:
|
||||
return hashlib.md5
|
||||
elif l == 40:
|
||||
return hashlib.sha1
|
||||
elif l == 64:
|
||||
return hashlib.sha256
|
||||
else:
|
||||
return None
|
||||
|
||||
def verify_file_digest(path, expected_digest):
|
||||
"""Verify the digest of a file, and return True if the digest matches with the given expected digest."""
|
||||
|
||||
algorithm = guess_digest_algorithm(expected_digest)
|
||||
assert(algorithm is not None)
|
||||
return file_digest(algorithm, path) == expected_digest
|
||||
22
python/build/zlib.py
Normal file
22
python/build/zlib.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import os.path, subprocess
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class ZlibProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain, out_of_tree=False)
|
||||
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet',
|
||||
'-f', 'win32/Makefile.gcc',
|
||||
'PREFIX=' + toolchain.arch + '-',
|
||||
'-j12',
|
||||
'install',
|
||||
'INCLUDE_PATH='+ os.path.join(toolchain.install_prefix, 'include'),
|
||||
'LIBRARY_PATH=' + os.path.join(toolchain.install_prefix, 'lib'),
|
||||
'BINARY_PATH=' + os.path.join(toolchain.install_prefix, 'bin'),
|
||||
'SHARED_MODE=1'],
|
||||
cwd=src, env=toolchain.env)
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/bin/sh
|
||||
PWD=`pwd`
|
||||
|
||||
## If we're not in the scripts directory
|
||||
## assume the base directory.
|
||||
if test "`basename $PWD`" == "scripts"; then
|
||||
cd ../
|
||||
else
|
||||
MYOLDPWD=`pwd`
|
||||
cd `dirname $0`/../
|
||||
fi
|
||||
|
||||
if test -e Makefile
|
||||
then
|
||||
make distclean
|
||||
fi
|
||||
./autogen.sh
|
||||
make
|
||||
make dist
|
||||
|
||||
if test "`basename $PWD`" == "scripts"; then
|
||||
cd contrib/
|
||||
else
|
||||
cd $MYOLDPWD
|
||||
fi
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cdw -cd0 -c0 -cp0 "$@"
|
||||
|
||||
# there doesn't seem to be an indent switch for this, but this
|
||||
# forces goto labels to the left-most column, without indentation
|
||||
perl -i -p -e 's/^\s+(\w+):/$1:/g unless /^\s+default:/' "$@"
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
#
|
||||
# This shell script tests the build of MPD with various compile-time
|
||||
# options.
|
||||
#
|
||||
# Author: Max Kellermann <max@duempel.org>
|
||||
|
||||
PREFIX=/tmp/mpd
|
||||
rm -rf $PREFIX
|
||||
|
||||
test "x$MAKE" != x || MAKE=make
|
||||
|
||||
export CFLAGS="-Os"
|
||||
|
||||
test -x configure || NOCONFIGURE=1 ./autogen.sh
|
||||
|
||||
# all features on
|
||||
./configure --prefix=$PREFIX/full \
|
||||
--disable-dependency-tracking --enable-debug --enable-werror \
|
||||
--enable-un \
|
||||
--enable-modplug \
|
||||
--enable-ao --enable-mikmod --enable-mvp
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# no UN, no oggvorbis, no flac, enable oggflac
|
||||
./configure --prefix=$PREFIX/small \
|
||||
--disable-dependency-tracking --enable-debug --enable-werror \
|
||||
--disable-un \
|
||||
--disable-flac --disable-vorbis --enable-oggflac
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# strip down (disable TCP, disable nearly all plugins)
|
||||
CFLAGS="$CFLAGS -DNDEBUG" \
|
||||
./configure --prefix=$PREFIX/tiny \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--disable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --disable-vorbis --disable-oggflac --disable-audiofile \
|
||||
--disable-cue \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# shout: ogg without mp3
|
||||
# sndfile instead of modplug
|
||||
./configure --prefix=$PREFIX/shout_ogg \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--enable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --enable-vorbis --disable-oggflac --disable-audiofile \
|
||||
--disable-modplug --enable-sndfile \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# shout: mp3 without ogg
|
||||
./configure --prefix=$PREFIX/shout_mp3 \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--disable-shout-ogg --enable-shout-mp3 --enable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --disable-vorbis --disable-oggflac --disable-audiofile \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# oggvorbis + oggflac
|
||||
./configure --prefix=$PREFIX/oggvorbisflac \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-mp3 \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--disable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --enable-vorbis --enable-oggflac --disable-audiofile \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
@@ -16,16 +16,16 @@
|
||||
struct Compressor {
|
||||
//! The compressor's preferences
|
||||
struct CompressorConfig prefs;
|
||||
|
||||
|
||||
//! History of the peak values
|
||||
int *peaks;
|
||||
|
||||
|
||||
//! History of the gain values
|
||||
int *gain;
|
||||
|
||||
|
||||
//! History of clip amounts
|
||||
int *clipped;
|
||||
|
||||
|
||||
unsigned int pos;
|
||||
unsigned int bufsz;
|
||||
};
|
||||
@@ -33,6 +33,9 @@ struct Compressor {
|
||||
struct Compressor *Compressor_new(unsigned int history)
|
||||
{
|
||||
struct Compressor *obj = malloc(sizeof(struct Compressor));
|
||||
if (obj == NULL)
|
||||
/* out of memory, not much we can do */
|
||||
abort();
|
||||
|
||||
obj->prefs.target = TARGET;
|
||||
obj->prefs.maxgain = GAINMAX;
|
||||
@@ -41,9 +44,9 @@ struct Compressor *Compressor_new(unsigned int history)
|
||||
obj->peaks = obj->gain = obj->clipped = NULL;
|
||||
obj->bufsz = 0;
|
||||
obj->pos = 0;
|
||||
|
||||
|
||||
Compressor_setHistory(obj, history);
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -61,6 +64,10 @@ void Compressor_delete(struct Compressor *obj)
|
||||
static int *resizeArray(int *data, int newsz, int oldsz)
|
||||
{
|
||||
data = realloc(data, newsz*sizeof(int));
|
||||
if (data == NULL)
|
||||
/* out of memory, not much we can do */
|
||||
abort();
|
||||
|
||||
if (newsz > oldsz)
|
||||
memset(data + oldsz, 0, sizeof(int)*(newsz - oldsz));
|
||||
return data;
|
||||
@@ -70,7 +77,7 @@ void Compressor_setHistory(struct Compressor *obj, unsigned int history)
|
||||
{
|
||||
if (!history)
|
||||
history = BUCKETS;
|
||||
|
||||
|
||||
obj->peaks = resizeArray(obj->peaks, history, obj->bufsz);
|
||||
obj->gain = resizeArray(obj->gain, history, obj->bufsz);
|
||||
obj->clipped = resizeArray(obj->clipped, history, obj->bufsz);
|
||||
@@ -82,7 +89,7 @@ struct CompressorConfig *Compressor_getConfig(struct Compressor *obj)
|
||||
return &obj->prefs;
|
||||
}
|
||||
|
||||
void Compressor_Process_int16(struct Compressor *obj, int16_t *audio,
|
||||
void Compressor_Process_int16(struct Compressor *obj, int16_t *audio,
|
||||
unsigned int count)
|
||||
{
|
||||
struct CompressorConfig *prefs = Compressor_getConfig(obj);
|
||||
@@ -97,7 +104,7 @@ void Compressor_Process_int16(struct Compressor *obj, int16_t *audio,
|
||||
int *clipped = obj->clipped + slot;
|
||||
unsigned int ramp = count;
|
||||
int delta;
|
||||
|
||||
|
||||
ap = audio;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
@@ -124,15 +131,15 @@ void Compressor_Process_int16(struct Compressor *obj, int16_t *audio,
|
||||
|
||||
//! Determine target gain
|
||||
newGain = (1 << 10)*prefs->target/peakVal;
|
||||
|
||||
|
||||
//! Adjust the gain with inertia from the previous gain value
|
||||
newGain = (curGain*((1 << prefs->smooth) - 1) + newGain)
|
||||
newGain = (curGain*((1 << prefs->smooth) - 1) + newGain)
|
||||
>> prefs->smooth;
|
||||
|
||||
|
||||
//! Make sure it's no more than the maximum gain value
|
||||
if (newGain > (prefs->maxgain << 10))
|
||||
newGain = prefs->maxgain << 10;
|
||||
|
||||
|
||||
//! Make sure it's no less than 1:1
|
||||
if (newGain < (1 << 10))
|
||||
newGain = 1 << 10;
|
||||
@@ -144,7 +151,7 @@ void Compressor_Process_int16(struct Compressor *obj, int16_t *audio,
|
||||
//! Truncate the ramp time
|
||||
ramp = peakPos;
|
||||
}
|
||||
|
||||
|
||||
//! Record the new gain
|
||||
obj->gain[slot] = newGain;
|
||||
|
||||
|
||||
@@ -19,6 +19,10 @@ struct CompressorConfig {
|
||||
|
||||
struct Compressor;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//! Create a new compressor (use history value of 0 for default)
|
||||
struct Compressor *Compressor_new(unsigned int history);
|
||||
|
||||
@@ -34,7 +38,12 @@ struct CompressorConfig *Compressor_getConfig(struct Compressor *);
|
||||
//! Process 16-bit signed data
|
||||
void Compressor_Process_int16(struct Compressor *, int16_t *data, unsigned int count);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
//! TODO: Compressor_Process_int32, Compressor_Process_float, others as needed
|
||||
|
||||
//! TODO: functions for getting at the peak/gain/clip history buffers (for monitoring)
|
||||
|
||||
#endif
|
||||
|
||||
64
src/AudioFormat.cxx
Normal file
64
src/AudioFormat.cxx
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/StringBuffer.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void
|
||||
AudioFormat::ApplyMask(AudioFormat mask) noexcept
|
||||
{
|
||||
assert(IsValid());
|
||||
assert(mask.IsMaskValid());
|
||||
|
||||
if (mask.sample_rate != 0)
|
||||
sample_rate = mask.sample_rate;
|
||||
|
||||
if (mask.format != SampleFormat::UNDEFINED)
|
||||
format = mask.format;
|
||||
|
||||
if (mask.channels != 0)
|
||||
channels = mask.channels;
|
||||
|
||||
assert(IsValid());
|
||||
}
|
||||
|
||||
StringBuffer<24>
|
||||
ToString(const AudioFormat af) noexcept
|
||||
{
|
||||
StringBuffer<24> buffer;
|
||||
|
||||
if (af.format == SampleFormat::DSD && af.sample_rate > 0 &&
|
||||
af.sample_rate % 44100 == 0) {
|
||||
/* use shortcuts such as "dsd64" which implies the
|
||||
sample rate */
|
||||
snprintf(buffer.data(), buffer.capacity(), "dsd%u:%u",
|
||||
af.sample_rate * 8 / 44100,
|
||||
af.channels);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
snprintf(buffer.data(), buffer.capacity(), "%u:%s:%u",
|
||||
af.sample_rate, sample_format_to_string(af.format),
|
||||
af.channels);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
228
src/AudioFormat.hxx
Normal file
228
src/AudioFormat.hxx
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_AUDIO_FORMAT_HXX
|
||||
#define MPD_AUDIO_FORMAT_HXX
|
||||
|
||||
#include "pcm/SampleFormat.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
template<size_t CAPACITY> class StringBuffer;
|
||||
|
||||
static constexpr unsigned MAX_CHANNELS = 8;
|
||||
|
||||
/**
|
||||
* This structure describes the format of a raw PCM stream.
|
||||
*/
|
||||
struct AudioFormat {
|
||||
/**
|
||||
* The sample rate in Hz. A better name for this attribute is
|
||||
* "frame rate", because technically, you have two samples per
|
||||
* frame in stereo sound.
|
||||
*/
|
||||
uint32_t sample_rate;
|
||||
|
||||
/**
|
||||
* The format samples are stored in. See the #sample_format
|
||||
* enum for valid values.
|
||||
*/
|
||||
SampleFormat format;
|
||||
|
||||
/**
|
||||
* The number of channels.
|
||||
*
|
||||
* Channel order follows the FLAC convention
|
||||
* (https://xiph.org/flac/format.html):
|
||||
*
|
||||
* - 1 channel: mono
|
||||
* - 2 channels: left, right
|
||||
* - 3 channels: left, right, center
|
||||
* - 4 channels: front left, front right, back left, back right
|
||||
* - 5 channels: front left, front right, front center, back/surround left, back/surround right
|
||||
* - 6 channels: front left, front right, front center, LFE, back/surround left, back/surround right
|
||||
* - 7 channels: front left, front right, front center, LFE, back center, side left, side right
|
||||
* - 8 channels: front left, front right, front center, LFE, back left, back right, side left, side right
|
||||
*/
|
||||
uint8_t channels;
|
||||
|
||||
AudioFormat() = default;
|
||||
|
||||
constexpr AudioFormat(uint32_t _sample_rate,
|
||||
SampleFormat _format, uint8_t _channels)
|
||||
:sample_rate(_sample_rate),
|
||||
format(_format), channels(_channels) {}
|
||||
|
||||
static constexpr AudioFormat Undefined() {
|
||||
return AudioFormat(0, SampleFormat::UNDEFINED,0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the object, i.e. sets all attributes to an undefined
|
||||
* (invalid) value.
|
||||
*/
|
||||
void Clear() {
|
||||
sample_rate = 0;
|
||||
format = SampleFormat::UNDEFINED;
|
||||
channels = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the object has a defined value.
|
||||
*/
|
||||
constexpr bool IsDefined() const {
|
||||
return sample_rate != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the object is full, i.e. all attributes are
|
||||
* defined. This is more complete than IsDefined(), but
|
||||
* slower.
|
||||
*/
|
||||
constexpr bool IsFullyDefined() const {
|
||||
return sample_rate != 0 && format != SampleFormat::UNDEFINED &&
|
||||
channels != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the object has at least one defined value.
|
||||
*/
|
||||
constexpr bool IsMaskDefined() const {
|
||||
return sample_rate != 0 || format != SampleFormat::UNDEFINED ||
|
||||
channels != 0;
|
||||
}
|
||||
|
||||
bool IsValid() const;
|
||||
bool IsMaskValid() const;
|
||||
|
||||
constexpr bool operator==(const AudioFormat other) const {
|
||||
return sample_rate == other.sample_rate &&
|
||||
format == other.format &&
|
||||
channels == other.channels;
|
||||
}
|
||||
|
||||
constexpr bool operator!=(const AudioFormat other) const {
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
void ApplyMask(AudioFormat mask) noexcept;
|
||||
|
||||
gcc_pure
|
||||
AudioFormat WithMask(AudioFormat mask) const noexcept {
|
||||
AudioFormat result = *this;
|
||||
result.ApplyMask(mask);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of each (mono) sample in bytes.
|
||||
*/
|
||||
unsigned GetSampleSize() const;
|
||||
|
||||
/**
|
||||
* Returns the size of each full frame in bytes.
|
||||
*/
|
||||
unsigned GetFrameSize() const;
|
||||
|
||||
/**
|
||||
* Returns the floating point factor which converts a time
|
||||
* span to a storage size in bytes.
|
||||
*/
|
||||
double GetTimeToSize() const;
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks whether the sample rate is valid.
|
||||
*
|
||||
* @param sample_rate the sample rate in Hz
|
||||
*/
|
||||
static constexpr inline bool
|
||||
audio_valid_sample_rate(unsigned sample_rate)
|
||||
{
|
||||
return sample_rate > 0 && sample_rate < (1 << 30);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the number of channels is valid.
|
||||
*/
|
||||
static constexpr inline bool
|
||||
audio_valid_channel_count(unsigned channels)
|
||||
{
|
||||
return channels >= 1 && channels <= MAX_CHANNELS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false if the format is not valid for playback with MPD.
|
||||
* This function performs some basic validity checks.
|
||||
*/
|
||||
inline bool
|
||||
AudioFormat::IsValid() const
|
||||
{
|
||||
return audio_valid_sample_rate(sample_rate) &&
|
||||
audio_valid_sample_format(format) &&
|
||||
audio_valid_channel_count(channels);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false if the format mask is not valid for playback with
|
||||
* MPD. This function performs some basic validity checks.
|
||||
*/
|
||||
inline bool
|
||||
AudioFormat::IsMaskValid() const
|
||||
{
|
||||
return (sample_rate == 0 ||
|
||||
audio_valid_sample_rate(sample_rate)) &&
|
||||
(format == SampleFormat::UNDEFINED ||
|
||||
audio_valid_sample_format(format)) &&
|
||||
(channels == 0 || audio_valid_channel_count(channels));
|
||||
}
|
||||
|
||||
inline unsigned
|
||||
AudioFormat::GetSampleSize() const
|
||||
{
|
||||
return sample_format_size(format);
|
||||
}
|
||||
|
||||
inline unsigned
|
||||
AudioFormat::GetFrameSize() const
|
||||
{
|
||||
return GetSampleSize() * channels;
|
||||
}
|
||||
|
||||
inline double
|
||||
AudioFormat::GetTimeToSize() const
|
||||
{
|
||||
return sample_rate * GetFrameSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the #AudioFormat object into a string, e.g. for printing
|
||||
* it in a log file.
|
||||
*
|
||||
* @param af the #AudioFormat object
|
||||
* @return the string buffer
|
||||
*/
|
||||
gcc_const
|
||||
StringBuffer<24>
|
||||
ToString(AudioFormat af) noexcept;
|
||||
|
||||
#endif
|
||||
185
src/AudioParser.cxx
Normal file
185
src/AudioParser.cxx
Normal file
@@ -0,0 +1,185 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Parser functions for audio related objects.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "AudioParser.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static uint32_t
|
||||
ParseSampleRate(const char *src, bool mask, const char **endptr_r)
|
||||
{
|
||||
unsigned long value;
|
||||
char *endptr;
|
||||
|
||||
if (mask && *src == '*') {
|
||||
*endptr_r = src + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
value = strtoul(src, &endptr, 10);
|
||||
if (endptr == src) {
|
||||
throw std::runtime_error("Failed to parse the sample rate");
|
||||
} else if (!audio_valid_sample_rate(value))
|
||||
throw FormatRuntimeError("Invalid sample rate: %lu",
|
||||
value);
|
||||
|
||||
*endptr_r = endptr;
|
||||
return value;
|
||||
}
|
||||
|
||||
static SampleFormat
|
||||
ParseSampleFormat(const char *src, bool mask, const char **endptr_r)
|
||||
{
|
||||
unsigned long value;
|
||||
char *endptr;
|
||||
SampleFormat sample_format;
|
||||
|
||||
if (mask && *src == '*') {
|
||||
*endptr_r = src + 1;
|
||||
return SampleFormat::UNDEFINED;
|
||||
}
|
||||
|
||||
if (*src == 'f') {
|
||||
*endptr_r = src + 1;
|
||||
return SampleFormat::FLOAT;
|
||||
}
|
||||
|
||||
if (memcmp(src, "dsd", 3) == 0) {
|
||||
*endptr_r = src + 3;
|
||||
return SampleFormat::DSD;
|
||||
}
|
||||
|
||||
value = strtoul(src, &endptr, 10);
|
||||
if (endptr == src)
|
||||
throw std::runtime_error("Failed to parse the sample format");
|
||||
|
||||
switch (value) {
|
||||
case 8:
|
||||
sample_format = SampleFormat::S8;
|
||||
break;
|
||||
|
||||
case 16:
|
||||
sample_format = SampleFormat::S16;
|
||||
break;
|
||||
|
||||
case 24:
|
||||
if (memcmp(endptr, "_3", 2) == 0)
|
||||
/* for backwards compatibility */
|
||||
endptr += 2;
|
||||
|
||||
sample_format = SampleFormat::S24_P32;
|
||||
break;
|
||||
|
||||
case 32:
|
||||
sample_format = SampleFormat::S32;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw FormatRuntimeError("Invalid sample format: %lu", value);
|
||||
}
|
||||
|
||||
assert(audio_valid_sample_format(sample_format));
|
||||
|
||||
*endptr_r = endptr;
|
||||
return sample_format;
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
ParseChannelCount(const char *src, bool mask, const char **endptr_r)
|
||||
{
|
||||
unsigned long value;
|
||||
char *endptr;
|
||||
|
||||
if (mask && *src == '*') {
|
||||
*endptr_r = src + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
value = strtoul(src, &endptr, 10);
|
||||
if (endptr == src)
|
||||
throw std::runtime_error("Failed to parse the channel count");
|
||||
else if (!audio_valid_channel_count(value))
|
||||
throw FormatRuntimeError("Invalid channel count: %u", value);
|
||||
|
||||
*endptr_r = endptr;
|
||||
return value;
|
||||
}
|
||||
|
||||
AudioFormat
|
||||
ParseAudioFormat(const char *src, bool mask)
|
||||
{
|
||||
AudioFormat dest;
|
||||
dest.Clear();
|
||||
|
||||
if (strncmp(src, "dsd", 3) == 0) {
|
||||
/* allow format specifications such as "dsd64" which
|
||||
implies the sample rate */
|
||||
|
||||
char *endptr;
|
||||
auto dsd = strtoul(src + 3, &endptr, 10);
|
||||
if (endptr > src + 3 && *endptr == ':' &&
|
||||
dsd >= 32 && dsd <= 4096 && dsd % 2 == 0) {
|
||||
dest.sample_rate = dsd * 44100 / 8;
|
||||
dest.format = SampleFormat::DSD;
|
||||
|
||||
src = endptr + 1;
|
||||
dest.channels = ParseChannelCount(src, mask, &src);
|
||||
if (*src != 0)
|
||||
throw FormatRuntimeError("Extra data after channel count: %s", src);
|
||||
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
|
||||
/* parse sample rate */
|
||||
|
||||
dest.sample_rate = ParseSampleRate(src, mask, &src);
|
||||
|
||||
if (*src++ != ':')
|
||||
throw std::runtime_error("Sample format missing");
|
||||
|
||||
/* parse sample format */
|
||||
|
||||
dest.format = ParseSampleFormat(src, mask, &src);
|
||||
|
||||
if (*src++ != ':')
|
||||
throw std::runtime_error("Channel count missing");
|
||||
|
||||
/* parse channel count */
|
||||
|
||||
dest.channels = ParseChannelCount(src, mask, &src);
|
||||
|
||||
if (*src != 0)
|
||||
throw FormatRuntimeError("Extra data after channel count: %s", src);
|
||||
|
||||
assert(mask
|
||||
? dest.IsMaskValid()
|
||||
: dest.IsValid());
|
||||
return dest;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -22,28 +22,21 @@
|
||||
* Parser functions for audio related objects.
|
||||
*/
|
||||
|
||||
#ifndef AUDIO_PARSER_H
|
||||
#define AUDIO_PARSER_H
|
||||
#ifndef MPD_AUDIO_PARSER_HXX
|
||||
#define MPD_AUDIO_PARSER_HXX
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct audio_format;
|
||||
struct AudioFormat;
|
||||
|
||||
/**
|
||||
* Parses a string in the form "SAMPLE_RATE:BITS:CHANNELS" into an
|
||||
* #audio_format.
|
||||
* #AudioFormat.
|
||||
*
|
||||
* Throws #std::runtime_error on error.
|
||||
*
|
||||
* @param dest the destination #audio_format struct
|
||||
* @param src the input string
|
||||
* @param mask if true, then "*" is allowed for any number of items
|
||||
* @param error_r location to store the error occuring, or NULL to
|
||||
* ignore errors
|
||||
* @return true on success
|
||||
*/
|
||||
bool
|
||||
audio_format_parse(struct audio_format *dest, const char *src,
|
||||
bool mask, GError **error_r);
|
||||
AudioFormat
|
||||
ParseAudioFormat(const char *src, bool mask);
|
||||
|
||||
#endif
|
||||
41
src/BulkEdit.hxx
Normal file
41
src/BulkEdit.hxx
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_BULK_EDIT_HXX
|
||||
#define MPD_BULK_EDIT_HXX
|
||||
|
||||
#include "Partition.hxx"
|
||||
|
||||
/**
|
||||
* Begin a "bulk edit" and commit it automatically.
|
||||
*/
|
||||
class ScopeBulkEdit {
|
||||
Partition &partition;
|
||||
|
||||
public:
|
||||
ScopeBulkEdit(Partition &_partition):partition(_partition) {
|
||||
partition.playlist.BeginBulk();
|
||||
}
|
||||
|
||||
~ScopeBulkEdit() {
|
||||
partition.playlist.CommitBulk(partition.pc);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
62
src/CheckAudioFormat.cxx
Normal file
62
src/CheckAudioFormat.cxx
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "CheckAudioFormat.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
CheckSampleRate(unsigned long sample_rate)
|
||||
{
|
||||
if (!audio_valid_sample_rate(sample_rate))
|
||||
throw FormatRuntimeError("Invalid sample rate: %lu",
|
||||
sample_rate);
|
||||
}
|
||||
|
||||
void
|
||||
CheckSampleFormat(SampleFormat sample_format)
|
||||
{
|
||||
if (!audio_valid_sample_format(sample_format))
|
||||
throw FormatRuntimeError("Invalid sample format: %u",
|
||||
unsigned(sample_format));
|
||||
}
|
||||
|
||||
void
|
||||
CheckChannelCount(unsigned channels)
|
||||
{
|
||||
if (!audio_valid_channel_count(channels))
|
||||
throw FormatRuntimeError("Invalid channel count: %u",
|
||||
channels);
|
||||
}
|
||||
|
||||
AudioFormat
|
||||
CheckAudioFormat(unsigned long sample_rate,
|
||||
SampleFormat sample_format, unsigned channels)
|
||||
{
|
||||
CheckSampleRate(sample_rate);
|
||||
CheckSampleFormat(sample_format);
|
||||
CheckChannelCount(channels);
|
||||
|
||||
return AudioFormat(sample_rate, sample_format, channels);
|
||||
}
|
||||
44
src/CheckAudioFormat.hxx
Normal file
44
src/CheckAudioFormat.hxx
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_CHECK_AUDIO_FORMAT_HXX
|
||||
#define MPD_CHECK_AUDIO_FORMAT_HXX
|
||||
|
||||
#include "AudioFormat.hxx"
|
||||
|
||||
void
|
||||
CheckSampleRate(unsigned long sample_rate);
|
||||
|
||||
void
|
||||
CheckSampleFormat(SampleFormat sample_format);
|
||||
|
||||
void
|
||||
CheckChannelCount(unsigned sample_format);
|
||||
|
||||
/**
|
||||
* Check #AudioFormat attributes and construct an #AudioFormat
|
||||
* instance.
|
||||
*
|
||||
* Throws #std::runtime_error on error.
|
||||
*/
|
||||
AudioFormat
|
||||
CheckAudioFormat(unsigned long sample_rate,
|
||||
SampleFormat sample_format, unsigned channels);
|
||||
|
||||
#endif
|
||||
215
src/Chrono.hxx
Normal file
215
src/Chrono.hxx
Normal file
@@ -0,0 +1,215 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_CHRONO_HXX
|
||||
#define MPD_CHRONO_HXX
|
||||
|
||||
#include <chrono>
|
||||
#include <utility>
|
||||
#include <cstdint>
|
||||
|
||||
/**
|
||||
* A time stamp within a song. Granularity is 1 millisecond and the
|
||||
* maximum value is about 49 days.
|
||||
*/
|
||||
class SongTime : public std::chrono::duration<std::uint32_t, std::milli> {
|
||||
typedef std::chrono::duration<std::uint32_t, std::milli> Base;
|
||||
typedef Base::rep rep;
|
||||
|
||||
public:
|
||||
SongTime() = default;
|
||||
|
||||
template<typename T>
|
||||
explicit constexpr SongTime(T t):Base(t) {}
|
||||
|
||||
static constexpr SongTime zero() {
|
||||
return SongTime(Base::zero());
|
||||
}
|
||||
|
||||
static constexpr SongTime FromS(unsigned s) {
|
||||
return SongTime(rep(s) * 1000);
|
||||
}
|
||||
|
||||
static constexpr SongTime FromS(float s) {
|
||||
return SongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SongTime FromS(double s) {
|
||||
return SongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SongTime FromMS(rep ms) {
|
||||
return SongTime(ms);
|
||||
}
|
||||
|
||||
constexpr rep ToS() const {
|
||||
return count() / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep RoundS() const {
|
||||
return (count() + 500) / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep ToMS() const {
|
||||
return count();
|
||||
}
|
||||
|
||||
template<typename T=rep>
|
||||
constexpr T ToScale(unsigned scale) const {
|
||||
return count() * T(scale) / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a scalar value with the given scale to a #SongTime
|
||||
* instance.
|
||||
*
|
||||
* @param value the input value
|
||||
* @param scale the value's scale in Hz
|
||||
*/
|
||||
template<typename T=rep>
|
||||
static constexpr SongTime FromScale(T value, unsigned scale) {
|
||||
return SongTime(value * T(1000) / T(scale));
|
||||
}
|
||||
|
||||
constexpr double ToDoubleS() const {
|
||||
return double(count()) / 1000.;
|
||||
};
|
||||
|
||||
constexpr bool IsZero() const {
|
||||
return count() == 0;
|
||||
}
|
||||
|
||||
constexpr bool IsPositive() const {
|
||||
return count() > 0;
|
||||
}
|
||||
|
||||
constexpr SongTime operator+(const SongTime &other) const {
|
||||
return SongTime(*(const Base *)this + (const Base &)other);
|
||||
}
|
||||
|
||||
constexpr SongTime operator-(const SongTime &other) const {
|
||||
return SongTime(*(const Base *)this - (const Base &)other);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A variant of #SongTime that is based on a signed integer. It can
|
||||
* be used for relative values.
|
||||
*/
|
||||
class SignedSongTime : public std::chrono::duration<std::int32_t, std::milli> {
|
||||
typedef std::chrono::duration<std::int32_t, std::milli> Base;
|
||||
typedef Base::rep rep;
|
||||
|
||||
public:
|
||||
SignedSongTime() = default;
|
||||
|
||||
template<typename T>
|
||||
explicit constexpr SignedSongTime(T t):Base(t) {}
|
||||
|
||||
/**
|
||||
* Allow implicit conversion from SongTime to SignedSongTime.
|
||||
*/
|
||||
constexpr SignedSongTime(SongTime t):Base(t) {}
|
||||
|
||||
static constexpr SignedSongTime zero() {
|
||||
return SignedSongTime(Base::zero());
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a negative value.
|
||||
*/
|
||||
static constexpr SignedSongTime Negative() {
|
||||
return SignedSongTime(-1);
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(int s) {
|
||||
return SignedSongTime(rep(s) * 1000);
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(unsigned s) {
|
||||
return SignedSongTime(rep(s) * 1000);
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(float s) {
|
||||
return SignedSongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(double s) {
|
||||
return SignedSongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromMS(rep ms) {
|
||||
return SignedSongTime(ms);
|
||||
}
|
||||
|
||||
constexpr rep ToS() const {
|
||||
return count() / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep RoundS() const {
|
||||
return (count() + 500) / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep ToMS() const {
|
||||
return count();
|
||||
}
|
||||
|
||||
template<typename T=rep>
|
||||
constexpr T ToScale(unsigned scale) const {
|
||||
return count() * T(scale) / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a scalar value with the given scale to a
|
||||
* #SignedSongTime instance.
|
||||
*
|
||||
* @param value the input value
|
||||
* @param scale the value's scale in Hz
|
||||
*/
|
||||
template<typename T=rep>
|
||||
static constexpr SignedSongTime FromScale(T value, unsigned scale) {
|
||||
return SignedSongTime(value * T(1000) / T(scale));
|
||||
}
|
||||
|
||||
constexpr double ToDoubleS() const {
|
||||
return double(count()) / 1000.;
|
||||
};
|
||||
|
||||
constexpr bool IsZero() const {
|
||||
return count() == 0;
|
||||
}
|
||||
|
||||
constexpr bool IsPositive() const {
|
||||
return count() > 0;
|
||||
}
|
||||
|
||||
constexpr bool IsNegative() const {
|
||||
return count() < 0;
|
||||
}
|
||||
|
||||
constexpr SignedSongTime operator+(const SignedSongTime &other) const {
|
||||
return SignedSongTime(*(const Base *)this + (const Base &)other);
|
||||
}
|
||||
|
||||
constexpr SignedSongTime operator-(const SignedSongTime &other) const {
|
||||
return SignedSongTime(*(const Base *)this - (const Base &)other);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
405
src/CommandLine.cxx
Normal file
405
src/CommandLine.cxx
Normal file
@@ -0,0 +1,405 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "CommandLine.hxx"
|
||||
#include "ls.hxx"
|
||||
#include "LogInit.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "config/ConfigGlobal.hxx"
|
||||
#include "decoder/DecoderList.hxx"
|
||||
#include "decoder/DecoderPlugin.hxx"
|
||||
#include "output/Registry.hxx"
|
||||
#include "output/OutputPlugin.hxx"
|
||||
#include "input/Registry.hxx"
|
||||
#include "input/InputPlugin.hxx"
|
||||
#include "playlist/PlaylistRegistry.hxx"
|
||||
#include "playlist/PlaylistPlugin.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "fs/Traits.hxx"
|
||||
#include "fs/FileSystem.hxx"
|
||||
#include "fs/StandardDirectory.hxx"
|
||||
#include "system/Error.hxx"
|
||||
#include "util/Macros.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/OptionDef.hxx"
|
||||
#include "util/OptionParser.hxx"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/Registry.hxx"
|
||||
#include "db/DatabasePlugin.hxx"
|
||||
#include "storage/Registry.hxx"
|
||||
#include "storage/StoragePlugin.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
#include "neighbor/Registry.hxx"
|
||||
#include "neighbor/NeighborPlugin.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_ENCODER
|
||||
#include "encoder/EncoderList.hxx"
|
||||
#include "encoder/EncoderPlugin.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
#include "archive/ArchiveList.hxx"
|
||||
#include "archive/ArchivePlugin.hxx"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define CONFIG_FILE_LOCATION PATH_LITERAL("mpd\\mpd.conf")
|
||||
#define APP_CONFIG_FILE_LOCATION PATH_LITERAL("conf\\mpd.conf")
|
||||
#else
|
||||
#define USER_CONFIG_FILE_LOCATION1 PATH_LITERAL(".mpdconf")
|
||||
#define USER_CONFIG_FILE_LOCATION2 PATH_LITERAL(".mpd/mpd.conf")
|
||||
#define USER_CONFIG_FILE_LOCATION_XDG PATH_LITERAL("mpd/mpd.conf")
|
||||
#endif
|
||||
|
||||
static constexpr OptionDef opt_kill(
|
||||
"kill", "kill the currently running mpd session");
|
||||
static constexpr OptionDef opt_no_config(
|
||||
"no-config", "don't read from config");
|
||||
static constexpr OptionDef opt_no_daemon(
|
||||
"no-daemon", "don't detach from console");
|
||||
static constexpr OptionDef opt_stdout(
|
||||
"stdout", nullptr); // hidden, compatibility with old versions
|
||||
static constexpr OptionDef opt_stderr(
|
||||
"stderr", "print messages to stderr");
|
||||
static constexpr OptionDef opt_verbose(
|
||||
"verbose", 'v', "verbose logging");
|
||||
static constexpr OptionDef opt_version(
|
||||
"version", 'V', "print version number");
|
||||
static constexpr OptionDef opt_help(
|
||||
"help", 'h', "show help options");
|
||||
static constexpr OptionDef opt_help_alt(
|
||||
nullptr, '?', nullptr); // hidden, standard alias for --help
|
||||
|
||||
static constexpr Domain cmdline_domain("cmdline");
|
||||
|
||||
gcc_noreturn
|
||||
static void version(void)
|
||||
{
|
||||
printf("Music Player Daemon " VERSION
|
||||
#ifdef GIT_COMMIT
|
||||
" (" GIT_COMMIT ")"
|
||||
#endif
|
||||
"\n"
|
||||
"\n"
|
||||
"Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
|
||||
"Copyright 2008-2017 Max Kellermann <max.kellermann@gmail.com>\n"
|
||||
"This is free software; see the source for copying conditions. There is NO\n"
|
||||
"warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
"\n"
|
||||
"Database plugins:\n");
|
||||
|
||||
for (auto i = database_plugins; *i != nullptr; ++i)
|
||||
printf(" %s", (*i)->name);
|
||||
|
||||
printf("\n\n"
|
||||
"Storage plugins:\n");
|
||||
|
||||
for (auto i = storage_plugins; *i != nullptr; ++i)
|
||||
printf(" %s", (*i)->name);
|
||||
|
||||
printf("\n"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
"\n"
|
||||
"Neighbor plugins:\n");
|
||||
for (auto i = neighbor_plugins; *i != nullptr; ++i)
|
||||
printf(" %s", (*i)->name);
|
||||
|
||||
printf("\n"
|
||||
#endif
|
||||
|
||||
"\n"
|
||||
"Decoders plugins:\n");
|
||||
|
||||
decoder_plugins_for_each([](const DecoderPlugin &plugin){
|
||||
printf(" [%s]", plugin.name);
|
||||
|
||||
const char *const*suffixes = plugin.suffixes;
|
||||
if (suffixes != nullptr)
|
||||
for (; *suffixes != nullptr; ++suffixes)
|
||||
printf(" %s", *suffixes);
|
||||
|
||||
printf("\n");
|
||||
});
|
||||
|
||||
printf("\n"
|
||||
"Filters:\n"
|
||||
#ifdef ENABLE_LIBSAMPLERATE
|
||||
" libsamplerate"
|
||||
#endif
|
||||
#ifdef ENABLE_SOXR
|
||||
" soxr"
|
||||
#endif
|
||||
"\n\n"
|
||||
"Tag plugins:\n"
|
||||
#ifdef ENABLE_ID3TAG
|
||||
" id3tag"
|
||||
#endif
|
||||
"\n\n"
|
||||
"Output plugins:\n");
|
||||
audio_output_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
printf("\n"
|
||||
|
||||
#ifdef ENABLE_ENCODER
|
||||
"\n"
|
||||
"Encoder plugins:\n");
|
||||
encoder_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
printf("\n"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
"\n"
|
||||
"Archive plugins:\n");
|
||||
archive_plugins_for_each(plugin) {
|
||||
printf(" [%s]", plugin->name);
|
||||
|
||||
const char *const*suffixes = plugin->suffixes;
|
||||
if (suffixes != nullptr)
|
||||
for (; *suffixes != nullptr; ++suffixes)
|
||||
printf(" %s", *suffixes);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf(""
|
||||
#endif
|
||||
|
||||
"\n"
|
||||
"Input plugins:\n");
|
||||
input_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
|
||||
printf("\n\n"
|
||||
"Playlist plugins:\n");
|
||||
playlist_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
|
||||
printf("\n\n"
|
||||
"Protocols:\n");
|
||||
print_supported_uri_schemes_to_fp(stdout);
|
||||
|
||||
printf("\n"
|
||||
"Other features:\n"
|
||||
#ifdef HAVE_AVAHI
|
||||
" avahi"
|
||||
#endif
|
||||
#ifdef USE_EPOLL
|
||||
" epoll"
|
||||
#endif
|
||||
#ifdef HAVE_ICONV
|
||||
" iconv"
|
||||
#endif
|
||||
#ifdef HAVE_ICU
|
||||
" icu"
|
||||
#endif
|
||||
#ifdef ENABLE_INOTIFY
|
||||
" inotify"
|
||||
#endif
|
||||
#ifdef HAVE_IPV6
|
||||
" ipv6"
|
||||
#endif
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
" systemd"
|
||||
#endif
|
||||
#ifdef HAVE_TCP
|
||||
" tcp"
|
||||
#endif
|
||||
#ifdef HAVE_UN
|
||||
" un"
|
||||
#endif
|
||||
"\n");
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static void PrintOption(const OptionDef &opt)
|
||||
{
|
||||
if (opt.HasShortOption())
|
||||
printf(" -%c, --%-12s%s\n",
|
||||
opt.GetShortOption(),
|
||||
opt.GetLongOption(),
|
||||
opt.GetDescription());
|
||||
else
|
||||
printf(" --%-16s%s\n",
|
||||
opt.GetLongOption(),
|
||||
opt.GetDescription());
|
||||
}
|
||||
|
||||
gcc_noreturn
|
||||
static void help(void)
|
||||
{
|
||||
printf("Usage:\n"
|
||||
" mpd [OPTION...] [path/to/mpd.conf]\n"
|
||||
"\n"
|
||||
"Music Player Daemon - a daemon for playing music.\n"
|
||||
"\n"
|
||||
"Options:\n");
|
||||
|
||||
PrintOption(opt_help);
|
||||
PrintOption(opt_kill);
|
||||
PrintOption(opt_no_config);
|
||||
PrintOption(opt_no_daemon);
|
||||
PrintOption(opt_stderr);
|
||||
PrintOption(opt_verbose);
|
||||
PrintOption(opt_version);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
class ConfigLoader
|
||||
{
|
||||
public:
|
||||
bool TryFile(const Path path);
|
||||
bool TryFile(const AllocatedPath &base_path,
|
||||
PathTraitsFS::const_pointer_type path);
|
||||
};
|
||||
|
||||
bool ConfigLoader::TryFile(Path path)
|
||||
{
|
||||
if (FileExists(path)) {
|
||||
ReadConfigFile(path);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ConfigLoader::TryFile(const AllocatedPath &base_path,
|
||||
PathTraitsFS::const_pointer_type path)
|
||||
{
|
||||
if (base_path.IsNull())
|
||||
return false;
|
||||
auto full_path = AllocatedPath::Build(base_path, path);
|
||||
return TryFile(full_path);
|
||||
}
|
||||
|
||||
void
|
||||
ParseCommandLine(int argc, char **argv, struct options *options)
|
||||
{
|
||||
bool use_config_file = true;
|
||||
options->kill = false;
|
||||
options->daemon = true;
|
||||
options->log_stderr = false;
|
||||
options->verbose = false;
|
||||
|
||||
// First pass: handle command line options
|
||||
OptionParser parser(argc, argv);
|
||||
while (parser.HasEntries()) {
|
||||
if (!parser.ParseNext())
|
||||
continue;
|
||||
if (parser.CheckOption(opt_kill)) {
|
||||
options->kill = true;
|
||||
continue;
|
||||
}
|
||||
if (parser.CheckOption(opt_no_config)) {
|
||||
use_config_file = false;
|
||||
continue;
|
||||
}
|
||||
if (parser.CheckOption(opt_no_daemon)) {
|
||||
options->daemon = false;
|
||||
continue;
|
||||
}
|
||||
if (parser.CheckOption(opt_stderr, opt_stdout)) {
|
||||
options->log_stderr = true;
|
||||
continue;
|
||||
}
|
||||
if (parser.CheckOption(opt_verbose)) {
|
||||
options->verbose = true;
|
||||
continue;
|
||||
}
|
||||
if (parser.CheckOption(opt_version))
|
||||
version();
|
||||
if (parser.CheckOption(opt_help, opt_help_alt))
|
||||
help();
|
||||
|
||||
throw FormatRuntimeError("invalid option: %s",
|
||||
parser.GetOption());
|
||||
}
|
||||
|
||||
/* initialize the logging library, so the configuration file
|
||||
parser can use it already */
|
||||
log_early_init(options->verbose);
|
||||
|
||||
if (!use_config_file) {
|
||||
LogDebug(cmdline_domain,
|
||||
"Ignoring config, using daemon defaults");
|
||||
return;
|
||||
}
|
||||
|
||||
// Second pass: find non-option parameters (i.e. config file)
|
||||
const char *config_file = nullptr;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
if (OptionParser::IsOption(argv[i]))
|
||||
continue;
|
||||
if (config_file == nullptr) {
|
||||
config_file = argv[i];
|
||||
continue;
|
||||
}
|
||||
|
||||
throw std::runtime_error("too many arguments");
|
||||
}
|
||||
|
||||
if (config_file != nullptr) {
|
||||
/* use specified configuration file */
|
||||
#ifdef _UNICODE
|
||||
wchar_t buffer[MAX_PATH];
|
||||
auto result = MultiByteToWideChar(CP_ACP, 0, config_file, -1,
|
||||
buffer, ARRAY_SIZE(buffer));
|
||||
if (result <= 0)
|
||||
throw MakeLastError("MultiByteToWideChar() failed");
|
||||
|
||||
ReadConfigFile(Path::FromFS(buffer));
|
||||
#else
|
||||
ReadConfigFile(Path::FromFS(config_file));
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
/* use default configuration file path */
|
||||
|
||||
ConfigLoader loader;
|
||||
|
||||
bool found =
|
||||
#ifdef _WIN32
|
||||
loader.TryFile(GetUserConfigDir(), CONFIG_FILE_LOCATION) ||
|
||||
loader.TryFile(GetSystemConfigDir(), CONFIG_FILE_LOCATION) ||
|
||||
loader.TryFile(GetAppBaseDir(), APP_CONFIG_FILE_LOCATION);
|
||||
#else
|
||||
loader.TryFile(GetUserConfigDir(),
|
||||
USER_CONFIG_FILE_LOCATION_XDG) ||
|
||||
loader.TryFile(GetHomeDir(), USER_CONFIG_FILE_LOCATION1) ||
|
||||
loader.TryFile(GetHomeDir(), USER_CONFIG_FILE_LOCATION2) ||
|
||||
loader.TryFile(Path::FromFS(SYSTEM_CONFIG_FILE_LOCATION));
|
||||
#endif
|
||||
if (!found)
|
||||
throw std::runtime_error("No configuration file found");
|
||||
}
|
||||
33
src/CommandLine.hxx
Normal file
33
src/CommandLine.hxx
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_COMMAND_LINE_HXX
|
||||
#define MPD_COMMAND_LINE_HXX
|
||||
|
||||
struct options {
|
||||
bool kill;
|
||||
bool daemon;
|
||||
bool log_stderr;
|
||||
bool verbose;
|
||||
};
|
||||
|
||||
void
|
||||
ParseCommandLine(int argc, char **argv, struct options *options);
|
||||
|
||||
#endif
|
||||
180
src/Compiler.h
Normal file
180
src/Compiler.h
Normal file
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef COMPILER_H
|
||||
#define COMPILER_H
|
||||
|
||||
#define GCC_MAKE_VERSION(major, minor, patchlevel) ((major) * 10000 + (minor) * 100 + patchlevel)
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define GCC_VERSION GCC_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
|
||||
#else
|
||||
#define GCC_VERSION 0
|
||||
#endif
|
||||
|
||||
#ifdef __clang__
|
||||
# define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
||||
#elif defined(__GNUC__)
|
||||
# define CLANG_VERSION 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Are we building with the specified version of gcc (not clang or any
|
||||
* other compiler) or newer?
|
||||
*/
|
||||
#define GCC_CHECK_VERSION(major, minor) \
|
||||
(CLANG_VERSION == 0 && \
|
||||
GCC_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
||||
|
||||
/**
|
||||
* Are we building with clang (any version) or at least the specified
|
||||
* gcc version?
|
||||
*/
|
||||
#define CLANG_OR_GCC_VERSION(major, minor) \
|
||||
(CLANG_VERSION > 0 || GCC_CHECK_VERSION(major, minor))
|
||||
|
||||
/**
|
||||
* Are we building with gcc (not clang or any other compiler) and a
|
||||
* version older than the specified one?
|
||||
*/
|
||||
#define GCC_OLDER_THAN(major, minor) \
|
||||
(GCC_VERSION > 0 && CLANG_VERSION == 0 && \
|
||||
GCC_VERSION < GCC_MAKE_VERSION(major, minor, 0))
|
||||
|
||||
#ifdef __clang__
|
||||
# if __clang_major__ < 3
|
||||
# error Sorry, your clang version is too old. You need at least version 3.1.
|
||||
# endif
|
||||
#elif defined(__GNUC__)
|
||||
# if GCC_OLDER_THAN(4,9)
|
||||
# error Sorry, your gcc version is too old. You need at least version 4.9.
|
||||
# endif
|
||||
#else
|
||||
# warning Untested compiler. Use at your own risk!
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Are we building with the specified version of clang or newer?
|
||||
*/
|
||||
#define CLANG_CHECK_VERSION(major, minor) \
|
||||
(CLANG_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
||||
|
||||
#if CLANG_OR_GCC_VERSION(4,0)
|
||||
|
||||
/* GCC 4.x */
|
||||
|
||||
#define gcc_const __attribute__((const))
|
||||
#define gcc_deprecated __attribute__((deprecated))
|
||||
#define gcc_may_alias __attribute__((may_alias))
|
||||
#define gcc_malloc __attribute__((malloc))
|
||||
#define gcc_noreturn __attribute__((noreturn))
|
||||
#define gcc_packed __attribute__((packed))
|
||||
#define gcc_printf(a,b) __attribute__((format(printf, a, b)))
|
||||
#define gcc_pure __attribute__((pure))
|
||||
#define gcc_sentinel __attribute__((sentinel))
|
||||
#define gcc_unused __attribute__((unused))
|
||||
#define gcc_warn_unused_result __attribute__((warn_unused_result))
|
||||
|
||||
#define gcc_nonnull(...) __attribute__((nonnull(__VA_ARGS__)))
|
||||
#define gcc_nonnull_all __attribute__((nonnull))
|
||||
|
||||
#define gcc_likely(x) __builtin_expect (!!(x), 1)
|
||||
#define gcc_unlikely(x) __builtin_expect (!!(x), 0)
|
||||
|
||||
#define gcc_visibility_hidden __attribute__((visibility("hidden")))
|
||||
#define gcc_visibility_default __attribute__((visibility("default")))
|
||||
|
||||
#define gcc_always_inline __attribute__((always_inline))
|
||||
|
||||
#else
|
||||
|
||||
/* generic C compiler */
|
||||
|
||||
#define gcc_const
|
||||
#define gcc_deprecated
|
||||
#define gcc_may_alias
|
||||
#define gcc_malloc
|
||||
#define gcc_noreturn
|
||||
#define gcc_packed
|
||||
#define gcc_printf(a,b)
|
||||
#define gcc_pure
|
||||
#define gcc_sentinel
|
||||
#define gcc_unused
|
||||
#define gcc_warn_unused_result
|
||||
|
||||
#define gcc_nonnull(...)
|
||||
#define gcc_nonnull_all
|
||||
|
||||
#define gcc_likely(x) (x)
|
||||
#define gcc_unlikely(x) (x)
|
||||
|
||||
#define gcc_visibility_hidden
|
||||
#define gcc_visibility_default
|
||||
|
||||
#define gcc_always_inline inline
|
||||
|
||||
#endif
|
||||
|
||||
#if CLANG_OR_GCC_VERSION(4,3)
|
||||
|
||||
#define gcc_hot __attribute__((hot))
|
||||
#define gcc_cold __attribute__((cold))
|
||||
|
||||
#else /* ! GCC_UNUSED >= 40300 */
|
||||
|
||||
#define gcc_hot
|
||||
#define gcc_cold
|
||||
|
||||
#endif /* ! GCC_UNUSED >= 40300 */
|
||||
|
||||
#if GCC_CHECK_VERSION(4,6)
|
||||
#define gcc_flatten __attribute__((flatten))
|
||||
#else
|
||||
#define gcc_flatten
|
||||
#endif
|
||||
|
||||
#ifndef __cplusplus
|
||||
/* plain C99 has "restrict" */
|
||||
#define gcc_restrict restrict
|
||||
#elif CLANG_OR_GCC_VERSION(4,0)
|
||||
/* "__restrict__" is a GCC extension for C++ */
|
||||
#define gcc_restrict __restrict__
|
||||
#else
|
||||
/* disable it on other compilers */
|
||||
#define gcc_restrict
|
||||
#endif
|
||||
|
||||
#ifndef __has_feature
|
||||
// define dummy macro for non-clang compilers
|
||||
#define __has_feature(x) 0
|
||||
#endif
|
||||
|
||||
#if __has_feature(attribute_unused_on_fields)
|
||||
#define gcc_unused_field gcc_unused
|
||||
#else
|
||||
#define gcc_unused_field
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
#define gcc_unreachable() __builtin_unreachable()
|
||||
#else
|
||||
#define gcc_unreachable()
|
||||
#endif
|
||||
|
||||
#endif
|
||||
73
src/DetachedSong.cxx
Normal file
73
src/DetachedSong.cxx
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "DetachedSong.hxx"
|
||||
#include "db/LightSong.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
#include "fs/Traits.hxx"
|
||||
|
||||
DetachedSong::DetachedSong(const LightSong &other)
|
||||
:uri(other.GetURI().c_str()),
|
||||
real_uri(other.real_uri != nullptr ? other.real_uri : ""),
|
||||
tag(*other.tag),
|
||||
mtime(other.mtime),
|
||||
start_time(other.start_time),
|
||||
end_time(other.end_time) {}
|
||||
|
||||
DetachedSong::~DetachedSong()
|
||||
{
|
||||
/* this destructor exists here just so it won't inlined */
|
||||
}
|
||||
|
||||
bool
|
||||
DetachedSong::IsRemote() const noexcept
|
||||
{
|
||||
return uri_has_scheme(GetRealURI());
|
||||
}
|
||||
|
||||
bool
|
||||
DetachedSong::IsAbsoluteFile() const noexcept
|
||||
{
|
||||
return PathTraitsUTF8::IsAbsolute(GetRealURI());
|
||||
}
|
||||
|
||||
bool
|
||||
DetachedSong::IsInDatabase() const noexcept
|
||||
{
|
||||
/* here, we use GetURI() and not GetRealURI() because
|
||||
GetRealURI() is never relative */
|
||||
|
||||
const char *_uri = GetURI();
|
||||
return !uri_has_scheme(_uri) && !PathTraitsUTF8::IsAbsolute(_uri);
|
||||
}
|
||||
|
||||
SignedSongTime
|
||||
DetachedSong::GetDuration() const noexcept
|
||||
{
|
||||
SongTime a = start_time, b = end_time;
|
||||
if (!b.IsPositive()) {
|
||||
if (tag.duration.IsNegative())
|
||||
return tag.duration;
|
||||
|
||||
b = SongTime(tag.duration);
|
||||
}
|
||||
|
||||
return SignedSongTime(b - a);
|
||||
}
|
||||
233
src/DetachedSong.hxx
Normal file
233
src/DetachedSong.hxx
Normal file
@@ -0,0 +1,233 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_DETACHED_SONG_HXX
|
||||
#define MPD_DETACHED_SONG_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "Chrono.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
struct LightSong;
|
||||
class Storage;
|
||||
class Path;
|
||||
|
||||
class DetachedSong {
|
||||
friend DetachedSong DatabaseDetachSong(const Storage &db,
|
||||
const LightSong &song);
|
||||
|
||||
/**
|
||||
* An UTF-8-encoded URI referring to the song file. This can
|
||||
* be one of:
|
||||
*
|
||||
* - an absolute URL with a scheme
|
||||
* (e.g. "http://example.com/foo.mp3")
|
||||
*
|
||||
* - an absolute file name
|
||||
*
|
||||
* - a file name relative to the music directory
|
||||
*/
|
||||
std::string uri;
|
||||
|
||||
/**
|
||||
* The "real" URI, the one to be used for opening the
|
||||
* resource. If this attribute is empty, then #uri shall be
|
||||
* used.
|
||||
*
|
||||
* This attribute is used for songs from the database which
|
||||
* have a relative URI.
|
||||
*/
|
||||
std::string real_uri;
|
||||
|
||||
Tag tag;
|
||||
|
||||
time_t mtime = 0;
|
||||
|
||||
/**
|
||||
* Start of this sub-song within the file.
|
||||
*/
|
||||
SongTime start_time = SongTime::zero();
|
||||
|
||||
/**
|
||||
* End of this sub-song within the file.
|
||||
* Unused if zero.
|
||||
*/
|
||||
SongTime end_time = SongTime::zero();
|
||||
|
||||
explicit DetachedSong(const LightSong &other);
|
||||
|
||||
public:
|
||||
explicit DetachedSong(const DetachedSong &) = default;
|
||||
|
||||
explicit DetachedSong(const char *_uri)
|
||||
:uri(_uri) {}
|
||||
|
||||
explicit DetachedSong(const std::string &_uri)
|
||||
:uri(_uri) {}
|
||||
|
||||
explicit DetachedSong(std::string &&_uri)
|
||||
:uri(std::move(_uri)) {}
|
||||
|
||||
template<typename U>
|
||||
DetachedSong(U &&_uri, Tag &&_tag)
|
||||
:uri(std::forward<U>(_uri)),
|
||||
tag(std::move(_tag)) {}
|
||||
|
||||
DetachedSong(DetachedSong &&) = default;
|
||||
|
||||
~DetachedSong();
|
||||
|
||||
gcc_pure
|
||||
const char *GetURI() const noexcept {
|
||||
return uri.c_str();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void SetURI(T &&_uri) {
|
||||
uri = std::forward<T>(_uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this object have a "real" URI different from the
|
||||
* displayed URI?
|
||||
*/
|
||||
gcc_pure
|
||||
bool HasRealURI() const noexcept {
|
||||
return !real_uri.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns "real" URI (#real_uri) and falls back to just
|
||||
* GetURI().
|
||||
*/
|
||||
gcc_pure
|
||||
const char *GetRealURI() const noexcept {
|
||||
return (HasRealURI() ? real_uri : uri).c_str();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void SetRealURI(T &&_uri) {
|
||||
real_uri = std::forward<T>(_uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if both objects refer to the same physical
|
||||
* song.
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsSame(const DetachedSong &other) const noexcept {
|
||||
return uri == other.uri &&
|
||||
start_time == other.start_time &&
|
||||
end_time == other.end_time;
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
bool IsURI(const char *other_uri) const noexcept {
|
||||
return uri == other_uri;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsRemote() const noexcept;
|
||||
|
||||
gcc_pure
|
||||
bool IsFile() const noexcept {
|
||||
return !IsRemote();
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsAbsoluteFile() const noexcept;
|
||||
|
||||
gcc_pure
|
||||
bool IsInDatabase() const noexcept;
|
||||
|
||||
const Tag &GetTag() const noexcept {
|
||||
return tag;
|
||||
}
|
||||
|
||||
Tag &WritableTag() noexcept {
|
||||
return tag;
|
||||
}
|
||||
|
||||
void SetTag(const Tag &_tag) {
|
||||
tag = Tag(_tag);
|
||||
}
|
||||
|
||||
void SetTag(Tag &&_tag) {
|
||||
tag = std::move(_tag);
|
||||
}
|
||||
|
||||
void MoveTagFrom(DetachedSong &&other) {
|
||||
tag = std::move(other.tag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to the MoveTagFrom(), but move only the #TagItem
|
||||
* array.
|
||||
*/
|
||||
void MoveTagItemsFrom(DetachedSong &&other) {
|
||||
tag.MoveItemsFrom(std::move(other.tag));
|
||||
}
|
||||
|
||||
time_t GetLastModified() const {
|
||||
return mtime;
|
||||
}
|
||||
|
||||
void SetLastModified(time_t _value) {
|
||||
mtime = _value;
|
||||
}
|
||||
|
||||
SongTime GetStartTime() const {
|
||||
return start_time;
|
||||
}
|
||||
|
||||
void SetStartTime(SongTime _value) {
|
||||
start_time = _value;
|
||||
}
|
||||
|
||||
SongTime GetEndTime() const {
|
||||
return end_time;
|
||||
}
|
||||
|
||||
void SetEndTime(SongTime _value) {
|
||||
end_time = _value;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
SignedSongTime GetDuration() const noexcept;
|
||||
|
||||
/**
|
||||
* Update the #tag and #mtime.
|
||||
*
|
||||
* @return true on success
|
||||
*/
|
||||
bool Update();
|
||||
|
||||
/**
|
||||
* Load #tag and #mtime from a local file.
|
||||
*/
|
||||
bool LoadFile(Path path);
|
||||
};
|
||||
|
||||
#endif
|
||||
119
src/IOThread.cxx
Normal file
119
src/IOThread.cxx
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "IOThread.hxx"
|
||||
#include "thread/Mutex.hxx"
|
||||
#include "thread/Cond.hxx"
|
||||
#include "thread/Thread.hxx"
|
||||
#include "thread/Name.hxx"
|
||||
#include "event/Loop.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
static struct IOThread {
|
||||
Mutex mutex;
|
||||
Cond cond;
|
||||
|
||||
EventLoop *loop;
|
||||
Thread thread;
|
||||
|
||||
IOThread():thread(BIND_THIS_METHOD(Run)) {}
|
||||
|
||||
private:
|
||||
void Run() noexcept;
|
||||
} io;
|
||||
|
||||
void
|
||||
io_thread_run(void)
|
||||
{
|
||||
assert(io_thread_inside());
|
||||
assert(io.loop != nullptr);
|
||||
|
||||
io.loop->Run();
|
||||
}
|
||||
|
||||
inline void
|
||||
IOThread::Run() noexcept
|
||||
{
|
||||
SetThreadName("io");
|
||||
|
||||
/* lock+unlock to synchronize with io_thread_start(), to be
|
||||
sure that io.thread is set */
|
||||
mutex.lock();
|
||||
mutex.unlock();
|
||||
|
||||
io_thread_run();
|
||||
}
|
||||
|
||||
void
|
||||
io_thread_init(void)
|
||||
{
|
||||
assert(io.loop == nullptr);
|
||||
assert(!io.thread.IsDefined());
|
||||
|
||||
io.loop = new EventLoop();
|
||||
}
|
||||
|
||||
void
|
||||
io_thread_start()
|
||||
{
|
||||
assert(io.loop != nullptr);
|
||||
assert(!io.thread.IsDefined());
|
||||
|
||||
const std::lock_guard<Mutex> protect(io.mutex);
|
||||
io.thread.Start();
|
||||
}
|
||||
|
||||
void
|
||||
io_thread_quit(void)
|
||||
{
|
||||
assert(io.loop != nullptr);
|
||||
|
||||
io.loop->Break();
|
||||
}
|
||||
|
||||
void
|
||||
io_thread_deinit(void)
|
||||
{
|
||||
if (io.thread.IsDefined()) {
|
||||
io_thread_quit();
|
||||
io.thread.Join();
|
||||
}
|
||||
|
||||
delete io.loop;
|
||||
}
|
||||
|
||||
EventLoop &
|
||||
io_thread_get() noexcept
|
||||
{
|
||||
assert(io.loop != nullptr);
|
||||
|
||||
return *io.loop;
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
bool
|
||||
io_thread_inside() noexcept
|
||||
{
|
||||
return io.thread.IsInside();
|
||||
}
|
||||
|
||||
#endif
|
||||
68
src/IOThread.hxx
Normal file
68
src/IOThread.hxx
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_IO_THREAD_HXX
|
||||
#define MPD_IO_THREAD_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "Compiler.h"
|
||||
|
||||
class EventLoop;
|
||||
|
||||
void
|
||||
io_thread_init();
|
||||
|
||||
void
|
||||
io_thread_start();
|
||||
|
||||
/**
|
||||
* Run the I/O event loop synchronously in the current thread. This
|
||||
* can be called instead of io_thread_start(). For testing purposes
|
||||
* only.
|
||||
*/
|
||||
void
|
||||
io_thread_run();
|
||||
|
||||
/**
|
||||
* Ask the I/O thread to quit, but does not wait for it. Usually, you
|
||||
* don't need to call this function, because io_thread_deinit()
|
||||
* includes this.
|
||||
*/
|
||||
void
|
||||
io_thread_quit();
|
||||
|
||||
void
|
||||
io_thread_deinit();
|
||||
|
||||
gcc_const
|
||||
EventLoop &
|
||||
io_thread_get() noexcept;
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
/**
|
||||
* Is the current thread the I/O thread?
|
||||
*/
|
||||
gcc_pure
|
||||
bool
|
||||
io_thread_inside() noexcept;
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
252
src/IcyMetaDataParser.cxx
Normal file
252
src/IcyMetaDataParser.cxx
Normal file
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "IcyMetaDataParser.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "tag/TagBuilder.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/StringView.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
static constexpr Domain icy_metadata_domain("icy_metadata");
|
||||
|
||||
void
|
||||
IcyMetaDataParser::Reset()
|
||||
{
|
||||
if (!IsDefined())
|
||||
return;
|
||||
|
||||
if (data_rest == 0 && meta_size > 0)
|
||||
delete[] meta_data;
|
||||
|
||||
delete tag;
|
||||
|
||||
data_rest = data_size;
|
||||
meta_size = 0;
|
||||
}
|
||||
|
||||
size_t
|
||||
IcyMetaDataParser::Data(size_t length)
|
||||
{
|
||||
assert(length > 0);
|
||||
|
||||
if (!IsDefined())
|
||||
return length;
|
||||
|
||||
if (data_rest == 0)
|
||||
return 0;
|
||||
|
||||
if (length >= data_rest) {
|
||||
length = data_rest;
|
||||
data_rest = 0;
|
||||
} else
|
||||
data_rest -= length;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
static void
|
||||
icy_add_item(TagBuilder &tag, TagType type, const char *value)
|
||||
{
|
||||
size_t length = strlen(value);
|
||||
|
||||
if (length >= 2 && value[0] == '\'' && value[length - 1] == '\'') {
|
||||
/* strip the single quotes */
|
||||
++value;
|
||||
length -= 2;
|
||||
}
|
||||
|
||||
if (length > 0)
|
||||
tag.AddItem(type, {value, length});
|
||||
}
|
||||
|
||||
static void
|
||||
icy_parse_tag_item(TagBuilder &tag, const char *name, const char *value)
|
||||
{
|
||||
if (strcmp(name, "StreamTitle") == 0)
|
||||
icy_add_item(tag, TAG_TITLE, value);
|
||||
else
|
||||
FormatDebug(icy_metadata_domain,
|
||||
"unknown icy-tag: '%s'", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a single quote that is followed by a semicolon (or by the end
|
||||
* of the string). If that fails, return the first single quote. If
|
||||
* that also fails, return #end.
|
||||
*/
|
||||
static char *
|
||||
find_end_quote(char *p, char *const end)
|
||||
{
|
||||
char *fallback = std::find(p, end, '\'');
|
||||
if (fallback >= end - 1 || fallback[1] == ';')
|
||||
return fallback;
|
||||
|
||||
p = fallback + 1;
|
||||
while (true) {
|
||||
p = std::find(p, end, '\'');
|
||||
if (p == end)
|
||||
return fallback;
|
||||
|
||||
if (p == end - 1 || p[1] == ';')
|
||||
return p;
|
||||
|
||||
++p;
|
||||
}
|
||||
}
|
||||
|
||||
static Tag *
|
||||
icy_parse_tag(char *p, char *const end)
|
||||
{
|
||||
assert(p != nullptr);
|
||||
assert(end != nullptr);
|
||||
assert(p <= end);
|
||||
|
||||
TagBuilder tag;
|
||||
|
||||
while (p != end) {
|
||||
const char *const name = p;
|
||||
char *eq = std::find(p, end, '=');
|
||||
if (eq == end)
|
||||
break;
|
||||
|
||||
*eq = 0;
|
||||
p = eq + 1;
|
||||
|
||||
if (*p != '\'') {
|
||||
/* syntax error; skip to the next semicolon,
|
||||
try to recover */
|
||||
char *semicolon = std::find(p, end, ';');
|
||||
if (semicolon == end)
|
||||
break;
|
||||
p = semicolon + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
++p;
|
||||
|
||||
const char *const value = p;
|
||||
char *quote = find_end_quote(p, end);
|
||||
if (quote == end)
|
||||
break;
|
||||
|
||||
*quote = 0;
|
||||
p = quote + 1;
|
||||
|
||||
icy_parse_tag_item(tag, name, value);
|
||||
|
||||
char *semicolon = std::find(p, end, ';');
|
||||
if (semicolon == end)
|
||||
break;
|
||||
p = semicolon + 1;
|
||||
}
|
||||
|
||||
return tag.CommitNew();
|
||||
}
|
||||
|
||||
size_t
|
||||
IcyMetaDataParser::Meta(const void *data, size_t length)
|
||||
{
|
||||
const unsigned char *p = (const unsigned char *)data;
|
||||
|
||||
assert(IsDefined());
|
||||
assert(data_rest == 0);
|
||||
assert(length > 0);
|
||||
|
||||
if (meta_size == 0) {
|
||||
/* read meta_size from the first byte of a meta
|
||||
block */
|
||||
meta_size = *p++ * 16;
|
||||
if (meta_size == 0) {
|
||||
/* special case: no metadata */
|
||||
data_rest = data_size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 1 byte was consumed (must be re-added later for the
|
||||
return value */
|
||||
--length;
|
||||
|
||||
/* initialize metadata reader, allocate enough
|
||||
memory (+1 for the null terminator) */
|
||||
meta_position = 0;
|
||||
meta_data = new char[meta_size + 1];
|
||||
}
|
||||
|
||||
assert(meta_position < meta_size);
|
||||
|
||||
if (length > meta_size - meta_position)
|
||||
length = meta_size - meta_position;
|
||||
|
||||
memcpy(meta_data + meta_position, p, length);
|
||||
meta_position += length;
|
||||
|
||||
if (p != data)
|
||||
/* re-add the first byte (which contained meta_size) */
|
||||
++length;
|
||||
|
||||
if (meta_position == meta_size) {
|
||||
/* parse */
|
||||
|
||||
delete tag;
|
||||
|
||||
tag = icy_parse_tag(meta_data, meta_data + meta_size);
|
||||
delete[] meta_data;
|
||||
|
||||
/* change back to normal data mode */
|
||||
|
||||
meta_size = 0;
|
||||
data_rest = data_size;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
size_t
|
||||
IcyMetaDataParser::ParseInPlace(void *data, size_t length)
|
||||
{
|
||||
uint8_t *const dest0 = (uint8_t *)data;
|
||||
uint8_t *dest = dest0;
|
||||
const uint8_t *src = dest0;
|
||||
|
||||
while (length > 0) {
|
||||
size_t chunk = Data(length);
|
||||
if (chunk > 0) {
|
||||
memmove(dest, src, chunk);
|
||||
dest += chunk;
|
||||
src += chunk;
|
||||
length -= chunk;
|
||||
|
||||
if (length == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
chunk = Meta(src, length);
|
||||
if (chunk > 0) {
|
||||
src += chunk;
|
||||
length -= chunk;
|
||||
}
|
||||
}
|
||||
|
||||
return dest - dest0;
|
||||
}
|
||||
92
src/IcyMetaDataParser.hxx
Normal file
92
src/IcyMetaDataParser.hxx
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_ICY_META_DATA_PARSER_HXX
|
||||
#define MPD_ICY_META_DATA_PARSER_HXX
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
struct Tag;
|
||||
|
||||
class IcyMetaDataParser {
|
||||
size_t data_size, data_rest;
|
||||
|
||||
size_t meta_size, meta_position;
|
||||
char *meta_data;
|
||||
|
||||
Tag *tag;
|
||||
|
||||
public:
|
||||
IcyMetaDataParser():data_size(0) {}
|
||||
~IcyMetaDataParser() {
|
||||
Reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize an enabled icy_metadata object with the specified
|
||||
* data_size (from the icy-metaint HTTP response header).
|
||||
*/
|
||||
void Start(size_t _data_size) {
|
||||
data_size = data_rest = _data_size;
|
||||
meta_size = 0;
|
||||
tag = nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the icy_metadata. Call this after rewinding the stream.
|
||||
*/
|
||||
void Reset();
|
||||
|
||||
/**
|
||||
* Checks whether the icy_metadata object is enabled.
|
||||
*/
|
||||
bool IsDefined() const {
|
||||
return data_size > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates data. Returns the number of bytes of normal data which
|
||||
* can be read by the caller, but not more than "length". If the
|
||||
* return value is smaller than "length", the caller should invoke
|
||||
* icy_meta().
|
||||
*/
|
||||
size_t Data(size_t length);
|
||||
|
||||
/**
|
||||
* Reads metadata from the stream. Returns the number of bytes
|
||||
* consumed. If the return value is smaller than "length", the caller
|
||||
* should invoke icy_data().
|
||||
*/
|
||||
size_t Meta(const void *data, size_t length);
|
||||
|
||||
/**
|
||||
* Parse data and eliminate metadata.
|
||||
*
|
||||
* @return the number of data bytes remaining in the buffer
|
||||
*/
|
||||
size_t ParseInPlace(void *data, size_t length);
|
||||
|
||||
Tag *ReadTag() {
|
||||
Tag *result = tag;
|
||||
tag = nullptr;
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
38
src/Idle.cxx
Normal file
38
src/Idle.cxx
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support library for the "idle" command.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Idle.hxx"
|
||||
#include "Main.hxx"
|
||||
#include "Instance.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
idle_add(unsigned flags)
|
||||
{
|
||||
assert(flags != 0);
|
||||
|
||||
instance->EmitIdle(flags);
|
||||
}
|
||||
37
src/Idle.hxx
Normal file
37
src/Idle.hxx
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support library for the "idle" command.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MPD_IDLE_HXX
|
||||
#define MPD_IDLE_HXX
|
||||
|
||||
#include "IdleFlags.hxx"
|
||||
|
||||
/**
|
||||
* Adds idle flag (with bitwise "or") and queues notifications to all
|
||||
* clients.
|
||||
*/
|
||||
void
|
||||
idle_add(unsigned flags);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -23,14 +23,10 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "idle.h"
|
||||
#include "event_pipe.h"
|
||||
#include "IdleFlags.hxx"
|
||||
#include "util/ASCII.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <glib.h>
|
||||
|
||||
static unsigned idle_flags;
|
||||
static GMutex *idle_mutex = NULL;
|
||||
|
||||
static const char *const idle_names[] = {
|
||||
"database",
|
||||
@@ -42,51 +38,30 @@ static const char *const idle_names[] = {
|
||||
"options",
|
||||
"sticker",
|
||||
"update",
|
||||
NULL
|
||||
"subscription",
|
||||
"message",
|
||||
"neighbor",
|
||||
"mount",
|
||||
nullptr
|
||||
};
|
||||
|
||||
void
|
||||
idle_init(void)
|
||||
{
|
||||
g_assert(idle_mutex == NULL);
|
||||
idle_mutex = g_mutex_new();
|
||||
}
|
||||
|
||||
void
|
||||
idle_deinit(void)
|
||||
{
|
||||
g_assert(idle_mutex != NULL);
|
||||
g_mutex_free(idle_mutex);
|
||||
idle_mutex = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
idle_add(unsigned flags)
|
||||
{
|
||||
assert(flags != 0);
|
||||
|
||||
g_mutex_lock(idle_mutex);
|
||||
idle_flags |= flags;
|
||||
g_mutex_unlock(idle_mutex);
|
||||
|
||||
event_pipe_emit(PIPE_EVENT_IDLE);
|
||||
}
|
||||
|
||||
unsigned
|
||||
idle_get(void)
|
||||
{
|
||||
unsigned flags;
|
||||
|
||||
g_mutex_lock(idle_mutex);
|
||||
flags = idle_flags;
|
||||
idle_flags = 0;
|
||||
g_mutex_unlock(idle_mutex);
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
const char*const*
|
||||
idle_get_names(void)
|
||||
idle_get_names() noexcept
|
||||
{
|
||||
return idle_names;
|
||||
}
|
||||
|
||||
unsigned
|
||||
idle_parse_name(const char *name) noexcept
|
||||
{
|
||||
#if !CLANG_CHECK_VERSION(3,6)
|
||||
/* disabled on clang due to -Wtautological-pointer-compare */
|
||||
assert(name != nullptr);
|
||||
#endif
|
||||
|
||||
for (unsigned i = 0; idle_names[i] != nullptr; ++i)
|
||||
if (StringEqualsCaseASCII(name, idle_names[i]))
|
||||
return 1 << i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
85
src/IdleFlags.hxx
Normal file
85
src/IdleFlags.hxx
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support library for the "idle" command.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MPD_IDLE_FLAGS_HXX
|
||||
#define MPD_IDLE_FLAGS_HXX
|
||||
|
||||
#include "Compiler.h"
|
||||
|
||||
/** song database has been updated*/
|
||||
static constexpr unsigned IDLE_DATABASE = 0x1;
|
||||
|
||||
/** a stored playlist has been modified, created, deleted or
|
||||
renamed */
|
||||
static constexpr unsigned IDLE_STORED_PLAYLIST = 0x2;
|
||||
|
||||
/** the current playlist has been modified */
|
||||
static constexpr unsigned IDLE_PLAYLIST = 0x4;
|
||||
|
||||
/** the player state has changed: play, stop, pause, seek, ... */
|
||||
static constexpr unsigned IDLE_PLAYER = 0x8;
|
||||
|
||||
/** the volume has been modified */
|
||||
static constexpr unsigned IDLE_MIXER = 0x10;
|
||||
|
||||
/** an audio output device has been enabled or disabled */
|
||||
static constexpr unsigned IDLE_OUTPUT = 0x20;
|
||||
|
||||
/** options have changed: crossfade; random; repeat; ... */
|
||||
static constexpr unsigned IDLE_OPTIONS = 0x40;
|
||||
|
||||
/** a sticker has been modified. */
|
||||
static constexpr unsigned IDLE_STICKER = 0x80;
|
||||
|
||||
/** a database update has started or finished. */
|
||||
static constexpr unsigned IDLE_UPDATE = 0x100;
|
||||
|
||||
/** a client has subscribed or unsubscribed to/from a channel */
|
||||
static constexpr unsigned IDLE_SUBSCRIPTION = 0x200;
|
||||
|
||||
/** a message on the subscribed channel was received */
|
||||
static constexpr unsigned IDLE_MESSAGE = 0x400;
|
||||
|
||||
/** a neighbor was found or lost */
|
||||
static constexpr unsigned IDLE_NEIGHBOR = 0x800;
|
||||
|
||||
/** the mount list has changed */
|
||||
static constexpr unsigned IDLE_MOUNT = 0x1000;
|
||||
|
||||
/**
|
||||
* Get idle names
|
||||
*/
|
||||
gcc_const
|
||||
const char*const*
|
||||
idle_get_names() noexcept;
|
||||
|
||||
/**
|
||||
* Parse an idle name and return its mask. Returns 0 if the given
|
||||
* name is unknown.
|
||||
*/
|
||||
gcc_nonnull_all gcc_pure
|
||||
unsigned
|
||||
idle_parse_name(const char *name) noexcept;
|
||||
|
||||
#endif
|
||||
94
src/Instance.cxx
Normal file
94
src/Instance.cxx
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Instance.hxx"
|
||||
#include "Partition.hxx"
|
||||
#include "Idle.hxx"
|
||||
#include "Stats.hxx"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/DatabaseError.hxx"
|
||||
|
||||
#ifdef ENABLE_SQLITE
|
||||
#include "sticker/StickerDatabase.hxx"
|
||||
#include "sticker/SongSticker.hxx"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
|
||||
const Database &
|
||||
Instance::GetDatabaseOrThrow() const
|
||||
{
|
||||
if (database == nullptr)
|
||||
throw DatabaseError(DatabaseErrorCode::DISABLED,
|
||||
"No database");
|
||||
|
||||
return *database;
|
||||
}
|
||||
|
||||
void
|
||||
Instance::OnDatabaseModified()
|
||||
{
|
||||
assert(database != nullptr);
|
||||
|
||||
/* propagate the change to all subsystems */
|
||||
|
||||
stats_invalidate();
|
||||
partition->DatabaseModified(*database);
|
||||
}
|
||||
|
||||
void
|
||||
Instance::OnDatabaseSongRemoved(const char *uri)
|
||||
{
|
||||
assert(database != nullptr);
|
||||
|
||||
#ifdef ENABLE_SQLITE
|
||||
/* if the song has a sticker, remove it */
|
||||
if (sticker_enabled()) {
|
||||
try {
|
||||
sticker_song_delete(uri);
|
||||
} catch (const std::runtime_error &) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
partition->StaleSong(uri);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
|
||||
void
|
||||
Instance::FoundNeighbor(gcc_unused const NeighborInfo &info)
|
||||
{
|
||||
partition->EmitIdle(IDLE_NEIGHBOR);
|
||||
}
|
||||
|
||||
void
|
||||
Instance::LostNeighbor(gcc_unused const NeighborInfo &info)
|
||||
{
|
||||
partition->EmitIdle(IDLE_NEIGHBOR);
|
||||
}
|
||||
|
||||
#endif
|
||||
139
src/Instance.hxx
Normal file
139
src/Instance.hxx
Normal file
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_INSTANCE_HXX
|
||||
#define MPD_INSTANCE_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "event/Loop.hxx"
|
||||
#include "event/MaskMonitor.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
#include "neighbor/Listener.hxx"
|
||||
class NeighborGlue;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/DatabaseListener.hxx"
|
||||
class Database;
|
||||
class Storage;
|
||||
class UpdateService;
|
||||
#endif
|
||||
|
||||
class ClientList;
|
||||
struct Partition;
|
||||
class StateFile;
|
||||
|
||||
/**
|
||||
* A utility class which, when used as the first base class, ensures
|
||||
* that the #EventLoop gets initialized before the other base classes.
|
||||
*/
|
||||
struct EventLoopHolder {
|
||||
EventLoop event_loop;
|
||||
};
|
||||
|
||||
struct Instance final
|
||||
: EventLoopHolder
|
||||
#if defined(ENABLE_DATABASE) || defined(ENABLE_NEIGHBOR_PLUGINS)
|
||||
,
|
||||
#endif
|
||||
#ifdef ENABLE_DATABASE
|
||||
public DatabaseListener
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
public NeighborListener
|
||||
#endif
|
||||
{
|
||||
MaskMonitor idle_monitor;
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
NeighborGlue *neighbors;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
Database *database;
|
||||
|
||||
/**
|
||||
* This is really a #CompositeStorage. To avoid heavy include
|
||||
* dependencies, we declare it as just #Storage.
|
||||
*/
|
||||
Storage *storage = nullptr;
|
||||
|
||||
UpdateService *update = nullptr;
|
||||
#endif
|
||||
|
||||
ClientList *client_list;
|
||||
|
||||
Partition *partition;
|
||||
|
||||
StateFile *state_file;
|
||||
|
||||
Instance()
|
||||
:idle_monitor(event_loop, BIND_THIS_METHOD(OnIdle)), state_file(nullptr) {}
|
||||
|
||||
/**
|
||||
* Initiate shutdown. Wrapper for EventLoop::Break().
|
||||
*/
|
||||
void Shutdown() {
|
||||
event_loop.Break();
|
||||
}
|
||||
|
||||
void EmitIdle(unsigned mask) {
|
||||
idle_monitor.OrMask(mask);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
/**
|
||||
* Returns the global #Database instance. May return nullptr
|
||||
* if this MPD configuration has no database (no
|
||||
* music_directory was configured).
|
||||
*/
|
||||
Database *GetDatabase() {
|
||||
return database;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the global #Database instance. Throws
|
||||
* DatabaseError if this MPD configuration has no database (no
|
||||
* music_directory was configured).
|
||||
*/
|
||||
const Database &GetDatabaseOrThrow() const;
|
||||
#endif
|
||||
|
||||
private:
|
||||
#ifdef ENABLE_DATABASE
|
||||
void OnDatabaseModified() override;
|
||||
void OnDatabaseSongRemoved(const char *uri) override;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
/* virtual methods from class NeighborListener */
|
||||
void FoundNeighbor(const NeighborInfo &info) override;
|
||||
void LostNeighbor(const NeighborInfo &info) override;
|
||||
#endif
|
||||
|
||||
/* callback for #idle_monitor */
|
||||
void OnIdle(unsigned mask);
|
||||
};
|
||||
|
||||
#endif
|
||||
157
src/Listen.cxx
Normal file
157
src/Listen.cxx
Normal file
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Listen.hxx"
|
||||
#include "client/Client.hxx"
|
||||
#include "config/Param.hxx"
|
||||
#include "config/ConfigGlobal.hxx"
|
||||
#include "config/ConfigOption.hxx"
|
||||
#include "net/SocketAddress.hxx"
|
||||
#include "event/ServerSocket.hxx"
|
||||
#include "system/Error.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
#include <systemd/sd-daemon.h>
|
||||
#endif
|
||||
|
||||
static constexpr Domain listen_domain("listen");
|
||||
|
||||
#define DEFAULT_PORT 6600
|
||||
|
||||
class ClientListener final : public ServerSocket {
|
||||
Partition &partition;
|
||||
|
||||
public:
|
||||
ClientListener(EventLoop &_loop, Partition &_partition)
|
||||
:ServerSocket(_loop), partition(_partition) {}
|
||||
|
||||
private:
|
||||
void OnAccept(int fd, SocketAddress address, int uid) override {
|
||||
client_new(GetEventLoop(), partition,
|
||||
fd, address, uid);
|
||||
}
|
||||
};
|
||||
|
||||
static ClientListener *listen_socket;
|
||||
int listen_port;
|
||||
|
||||
/**
|
||||
* Throws #std::runtime_error on error.
|
||||
*/
|
||||
static void
|
||||
listen_add_config_param(unsigned int port,
|
||||
const ConfigParam *param)
|
||||
{
|
||||
assert(param != nullptr);
|
||||
|
||||
if (0 == strcmp(param->value.c_str(), "any")) {
|
||||
listen_socket->AddPort(port);
|
||||
} else if (param->value[0] == '/' || param->value[0] == '~') {
|
||||
listen_socket->AddPath(param->GetPath());
|
||||
} else {
|
||||
listen_socket->AddHost(param->value.c_str(), port);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
|
||||
static bool
|
||||
listen_systemd_activation()
|
||||
{
|
||||
int n = sd_listen_fds(true);
|
||||
if (n <= 0) {
|
||||
if (n < 0)
|
||||
throw MakeErrno(-n, "sd_listen_fds() failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = SD_LISTEN_FDS_START, end = SD_LISTEN_FDS_START + n;
|
||||
i != end; ++i)
|
||||
listen_socket->AddFD(i);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
listen_global_init(EventLoop &loop, Partition &partition)
|
||||
{
|
||||
int port = config_get_positive(ConfigOption::PORT, DEFAULT_PORT);
|
||||
const auto *param = config_get_param(ConfigOption::BIND_TO_ADDRESS);
|
||||
|
||||
listen_socket = new ClientListener(loop, partition);
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
if (listen_systemd_activation())
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (param != nullptr) {
|
||||
/* "bind_to_address" is configured, create listeners
|
||||
for all values */
|
||||
|
||||
do {
|
||||
try {
|
||||
listen_add_config_param(port, param);
|
||||
} catch (const std::runtime_error &e) {
|
||||
delete listen_socket;
|
||||
std::throw_with_nested(FormatRuntimeError("Failed to listen on %s (line %i)",
|
||||
param->value.c_str(),
|
||||
param->line));
|
||||
}
|
||||
} while ((param = param->next) != nullptr);
|
||||
} else {
|
||||
/* no "bind_to_address" configured, bind the
|
||||
configured port on all interfaces */
|
||||
|
||||
try {
|
||||
listen_socket->AddPort(port);
|
||||
} catch (const std::runtime_error &e) {
|
||||
delete listen_socket;
|
||||
std::throw_with_nested(FormatRuntimeError("Failed to listen on *:%d: ", port));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
listen_socket->Open();
|
||||
} catch (const std::runtime_error &e) {
|
||||
delete listen_socket;
|
||||
throw;
|
||||
}
|
||||
|
||||
listen_port = port;
|
||||
}
|
||||
|
||||
void listen_global_finish(void)
|
||||
{
|
||||
LogDebug(listen_domain, "listen_global_finish called");
|
||||
|
||||
assert(listen_socket != nullptr);
|
||||
|
||||
delete listen_socket;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -17,18 +17,18 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_LISTEN_H
|
||||
#define MPD_LISTEN_H
|
||||
#ifndef MPD_LISTEN_HXX
|
||||
#define MPD_LISTEN_HXX
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
class EventLoop;
|
||||
struct Partition;
|
||||
|
||||
extern int listen_port;
|
||||
|
||||
bool
|
||||
listen_global_init(GError **error_r);
|
||||
void
|
||||
listen_global_init(EventLoop &loop, Partition &partition);
|
||||
|
||||
void listen_global_finish(void);
|
||||
void
|
||||
listen_global_finish();
|
||||
|
||||
#endif
|
||||
110
src/LocateUri.cxx
Normal file
110
src/LocateUri.cxx
Normal file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LocateUri.hxx"
|
||||
#include "client/Client.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "ls.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
#include "util/StringCompare.hxx"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "storage/StorageInterface.hxx"
|
||||
#endif
|
||||
|
||||
static LocatedUri
|
||||
LocateFileUri(const char *uri, const Client *client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
)
|
||||
{
|
||||
auto path = AllocatedPath::FromUTF8Throw(uri);
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (storage != nullptr) {
|
||||
const char *suffix = storage->MapToRelativeUTF8(uri);
|
||||
if (suffix != nullptr)
|
||||
/* this path was relative to the music
|
||||
directory */
|
||||
return LocatedUri(LocatedUri::Type::RELATIVE, suffix);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (client != nullptr)
|
||||
client->AllowFile(path);
|
||||
|
||||
return LocatedUri(LocatedUri::Type::PATH, uri, std::move(path));
|
||||
}
|
||||
|
||||
static LocatedUri
|
||||
LocateAbsoluteUri(const char *uri
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (!uri_supported_scheme(uri))
|
||||
throw std::runtime_error("Unsupported URI scheme");
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (storage != nullptr) {
|
||||
const char *suffix = storage->MapToRelativeUTF8(uri);
|
||||
if (suffix != nullptr)
|
||||
return LocatedUri(LocatedUri::Type::RELATIVE, suffix);
|
||||
}
|
||||
#endif
|
||||
|
||||
return LocatedUri(LocatedUri::Type::ABSOLUTE, uri);
|
||||
}
|
||||
|
||||
LocatedUri
|
||||
LocateUri(const char *uri, const Client *client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
)
|
||||
{
|
||||
/* skip the obsolete "file://" prefix */
|
||||
const char *path_utf8 = StringAfterPrefix(uri, "file://");
|
||||
if (path_utf8 != nullptr) {
|
||||
if (!PathTraitsUTF8::IsAbsolute(path_utf8))
|
||||
throw std::runtime_error("Malformed file:// URI");
|
||||
|
||||
return LocateFileUri(path_utf8, client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, storage
|
||||
#endif
|
||||
);
|
||||
} else if (PathTraitsUTF8::IsAbsolute(uri))
|
||||
return LocateFileUri(uri, client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, storage
|
||||
#endif
|
||||
);
|
||||
else if (uri_has_scheme(uri))
|
||||
return LocateAbsoluteUri(uri
|
||||
#ifdef ENABLE_DATABASE
|
||||
, storage
|
||||
#endif
|
||||
);
|
||||
else
|
||||
return LocatedUri(LocatedUri::Type::RELATIVE, uri);
|
||||
}
|
||||
93
src/LocateUri.hxx
Normal file
93
src/LocateUri.hxx
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_LOCATE_URI_HXX
|
||||
#define MPD_LOCATE_URI_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "Compiler.h"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
/* damn you, windows.h! */
|
||||
#ifdef ABSOLUTE
|
||||
#undef ABSOLUTE
|
||||
#endif
|
||||
#ifdef RELATIVE
|
||||
#undef RELATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
class Client;
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
class Storage;
|
||||
#endif
|
||||
|
||||
struct LocatedUri {
|
||||
enum class Type {
|
||||
/**
|
||||
* An absolute URI with a supported scheme.
|
||||
*/
|
||||
ABSOLUTE,
|
||||
|
||||
/**
|
||||
* A relative URI path.
|
||||
*/
|
||||
RELATIVE,
|
||||
|
||||
/**
|
||||
* A local file. The #path attribute is valid.
|
||||
*/
|
||||
PATH,
|
||||
} type;
|
||||
|
||||
const char *canonical_uri;
|
||||
|
||||
/**
|
||||
* Contains the local file path if type==FILE.
|
||||
*/
|
||||
AllocatedPath path;
|
||||
|
||||
LocatedUri(Type _type, const char *_uri,
|
||||
AllocatedPath &&_path=AllocatedPath::Null())
|
||||
:type(_type), canonical_uri(_uri), path(std::move(_path)) {}
|
||||
};
|
||||
|
||||
/**
|
||||
* Classify a URI.
|
||||
*
|
||||
* Throws #std::runtime_error on error.
|
||||
*
|
||||
* @param client the #Client that is used to determine whether a local
|
||||
* file is allowed; nullptr disables the check and allows all local
|
||||
* files
|
||||
* @param storage a #Storage instance which may be used to convert
|
||||
* absolute URIs to relative ones, using Storage::MapToRelativeUTF8();
|
||||
* that feature is disabled if this parameter is nullptr
|
||||
*/
|
||||
LocatedUri
|
||||
LocateUri(const char *uri, const Client *client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
);
|
||||
|
||||
#endif
|
||||
213
src/Log.cxx
Normal file
213
src/Log.cxx
Normal file
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LogV.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
|
||||
#include <exception>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
static constexpr Domain exception_domain("exception");
|
||||
|
||||
void
|
||||
LogFormatV(const Domain &domain, LogLevel level, const char *fmt, va_list ap)
|
||||
{
|
||||
char msg[1024];
|
||||
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||
Log(domain, level, msg);
|
||||
}
|
||||
|
||||
void
|
||||
LogFormat(const Domain &domain, LogLevel level, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
LogFormatV(domain, level, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
FormatDebug(const Domain &domain, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
LogFormatV(domain, LogLevel::DEBUG, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
FormatInfo(const Domain &domain, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
LogFormatV(domain, LogLevel::INFO, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
FormatDefault(const Domain &domain, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
LogFormatV(domain, LogLevel::DEFAULT, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
FormatWarning(const Domain &domain, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
LogFormatV(domain, LogLevel::WARNING, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
FormatError(const Domain &domain, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
LogFormatV(domain, LogLevel::ERROR, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
LogError(const std::exception &e)
|
||||
{
|
||||
Log(exception_domain, LogLevel::ERROR, e.what());
|
||||
|
||||
try {
|
||||
std::rethrow_if_nested(e);
|
||||
} catch (const std::exception &nested) {
|
||||
LogError(nested, "nested");
|
||||
} catch (...) {
|
||||
Log(exception_domain, LogLevel::ERROR,
|
||||
"Unrecognized nested exception");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
LogError(const std::exception &e, const char *msg)
|
||||
{
|
||||
FormatError(exception_domain, "%s: %s", msg, e.what());
|
||||
|
||||
try {
|
||||
std::rethrow_if_nested(e);
|
||||
} catch (const std::exception &nested) {
|
||||
LogError(nested);
|
||||
} catch (...) {
|
||||
Log(exception_domain, LogLevel::ERROR,
|
||||
"Unrecognized nested exception");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FormatError(const std::exception &e, const char *fmt, ...)
|
||||
{
|
||||
char msg[1024];
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
LogError(e, msg);
|
||||
}
|
||||
|
||||
void
|
||||
LogError(const std::exception_ptr &ep)
|
||||
{
|
||||
try {
|
||||
std::rethrow_exception(ep);
|
||||
} catch (const std::exception &e) {
|
||||
LogError(e);
|
||||
} catch (...) {
|
||||
Log(exception_domain, LogLevel::ERROR,
|
||||
"Unrecognized exception");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
LogError(const std::exception_ptr &ep, const char *msg)
|
||||
{
|
||||
try {
|
||||
std::rethrow_exception(ep);
|
||||
} catch (const std::exception &e) {
|
||||
LogError(e, msg);
|
||||
} catch (...) {
|
||||
FormatError(exception_domain,
|
||||
"%s: Unrecognized exception", msg);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FormatError(const std::exception_ptr &ep, const char *fmt, ...)
|
||||
{
|
||||
char msg[1024];
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
LogError(ep, msg);
|
||||
}
|
||||
|
||||
void
|
||||
LogErrno(const Domain &domain, int e, const char *msg)
|
||||
{
|
||||
LogFormat(domain, LogLevel::ERROR, "%s: %s", msg, strerror(e));
|
||||
}
|
||||
|
||||
void
|
||||
LogErrno(const Domain &domain, const char *msg)
|
||||
{
|
||||
LogErrno(domain, errno, msg);
|
||||
}
|
||||
|
||||
static void
|
||||
FormatErrnoV(const Domain &domain, int e, const char *fmt, va_list ap)
|
||||
{
|
||||
char msg[1024];
|
||||
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||
|
||||
LogErrno(domain, e, msg);
|
||||
}
|
||||
|
||||
void
|
||||
FormatErrno(const Domain &domain, int e, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
FormatErrnoV(domain, e, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
FormatErrno(const Domain &domain, const char *fmt, ...)
|
||||
{
|
||||
const int e = errno;
|
||||
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
FormatErrnoV(domain, e, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
121
src/Log.hxx
Normal file
121
src/Log.hxx
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_LOG_HXX
|
||||
#define MPD_LOG_HXX
|
||||
|
||||
#include "LogLevel.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <exception>
|
||||
|
||||
class Domain;
|
||||
|
||||
void
|
||||
Log(const Domain &domain, LogLevel level, const char *msg);
|
||||
|
||||
gcc_printf(3,4)
|
||||
void
|
||||
LogFormat(const Domain &domain, LogLevel level, const char *fmt, ...);
|
||||
|
||||
static inline void
|
||||
LogDebug(const Domain &domain, const char *msg)
|
||||
{
|
||||
Log(domain, LogLevel::DEBUG, msg);
|
||||
}
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatDebug(const Domain &domain, const char *fmt, ...);
|
||||
|
||||
static inline void
|
||||
LogInfo(const Domain &domain, const char *msg)
|
||||
{
|
||||
Log(domain, LogLevel::INFO, msg);
|
||||
}
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatInfo(const Domain &domain, const char *fmt, ...);
|
||||
|
||||
static inline void
|
||||
LogDefault(const Domain &domain, const char *msg)
|
||||
{
|
||||
Log(domain, LogLevel::DEFAULT, msg);
|
||||
}
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatDefault(const Domain &domain, const char *fmt, ...);
|
||||
|
||||
static inline void
|
||||
LogWarning(const Domain &domain, const char *msg)
|
||||
{
|
||||
Log(domain, LogLevel::WARNING, msg);
|
||||
}
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatWarning(const Domain &domain, const char *fmt, ...);
|
||||
|
||||
static inline void
|
||||
LogError(const Domain &domain, const char *msg)
|
||||
{
|
||||
Log(domain, LogLevel::ERROR, msg);
|
||||
}
|
||||
|
||||
void
|
||||
LogError(const std::exception &e);
|
||||
|
||||
void
|
||||
LogError(const std::exception &e, const char *msg);
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatError(const std::exception &e, const char *fmt, ...);
|
||||
|
||||
void
|
||||
LogError(const std::exception_ptr &ep);
|
||||
|
||||
void
|
||||
LogError(const std::exception_ptr &ep, const char *msg);
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatError(const std::exception_ptr &ep, const char *fmt, ...);
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatError(const Domain &domain, const char *fmt, ...);
|
||||
|
||||
void
|
||||
LogErrno(const Domain &domain, int e, const char *msg);
|
||||
|
||||
void
|
||||
LogErrno(const Domain &domain, const char *msg);
|
||||
|
||||
gcc_printf(3,4)
|
||||
void
|
||||
FormatErrno(const Domain &domain, int e, const char *fmt, ...);
|
||||
|
||||
gcc_printf(2,3)
|
||||
void
|
||||
FormatErrno(const Domain &domain, const char *fmt, ...);
|
||||
|
||||
#endif /* LOG_H */
|
||||
194
src/LogBackend.cxx
Normal file
194
src/LogBackend.cxx
Normal file
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LogBackend.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/StringUtil.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <android/log.h>
|
||||
|
||||
static int
|
||||
ToAndroidLogLevel(LogLevel log_level)
|
||||
{
|
||||
switch (log_level) {
|
||||
case LogLevel::DEBUG:
|
||||
return ANDROID_LOG_DEBUG;
|
||||
|
||||
case LogLevel::INFO:
|
||||
case LogLevel::DEFAULT:
|
||||
return ANDROID_LOG_INFO;
|
||||
|
||||
case LogLevel::WARNING:
|
||||
return ANDROID_LOG_WARN;
|
||||
|
||||
case LogLevel::ERROR:
|
||||
return ANDROID_LOG_ERROR;
|
||||
}
|
||||
|
||||
assert(false);
|
||||
gcc_unreachable();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static LogLevel log_threshold = LogLevel::INFO;
|
||||
|
||||
static bool enable_timestamp;
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
static bool enable_syslog;
|
||||
#endif
|
||||
|
||||
void
|
||||
SetLogThreshold(LogLevel _threshold)
|
||||
{
|
||||
log_threshold = _threshold;
|
||||
}
|
||||
|
||||
void
|
||||
EnableLogTimestamp()
|
||||
{
|
||||
#ifdef HAVE_SYSLOG
|
||||
assert(!enable_syslog);
|
||||
#endif
|
||||
assert(!enable_timestamp);
|
||||
|
||||
enable_timestamp = true;
|
||||
}
|
||||
|
||||
static const char *log_date(void)
|
||||
{
|
||||
static constexpr size_t LOG_DATE_BUF_SIZE = 16;
|
||||
static char buf[LOG_DATE_BUF_SIZE];
|
||||
time_t t = time(nullptr);
|
||||
strftime(buf, LOG_DATE_BUF_SIZE, "%b %d %H:%M : ", localtime(&t));
|
||||
return buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the length of the string excluding trailing whitespace
|
||||
* characters.
|
||||
*/
|
||||
static int
|
||||
chomp_length(const char *p)
|
||||
{
|
||||
size_t length = strlen(p);
|
||||
return StripRight(p, length);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
|
||||
static int
|
||||
ToSysLogLevel(LogLevel log_level)
|
||||
{
|
||||
switch (log_level) {
|
||||
case LogLevel::DEBUG:
|
||||
return LOG_DEBUG;
|
||||
|
||||
case LogLevel::INFO:
|
||||
return LOG_INFO;
|
||||
|
||||
case LogLevel::DEFAULT:
|
||||
return LOG_NOTICE;
|
||||
|
||||
case LogLevel::WARNING:
|
||||
return LOG_WARNING;
|
||||
|
||||
case LogLevel::ERROR:
|
||||
return LOG_ERR;
|
||||
}
|
||||
|
||||
assert(false);
|
||||
gcc_unreachable();
|
||||
}
|
||||
|
||||
static void
|
||||
SysLog(const Domain &domain, LogLevel log_level, const char *message)
|
||||
{
|
||||
syslog(ToSysLogLevel(log_level), "%s: %.*s",
|
||||
domain.GetName(),
|
||||
chomp_length(message), message);
|
||||
}
|
||||
|
||||
void
|
||||
LogInitSysLog()
|
||||
{
|
||||
openlog(PACKAGE, 0, LOG_DAEMON);
|
||||
enable_syslog = true;
|
||||
}
|
||||
|
||||
void
|
||||
LogFinishSysLog()
|
||||
{
|
||||
if (enable_syslog)
|
||||
closelog();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void
|
||||
FileLog(const Domain &domain, const char *message)
|
||||
{
|
||||
fprintf(stderr, "%s%s: %.*s\n",
|
||||
enable_timestamp ? log_date() : "",
|
||||
domain.GetName(),
|
||||
chomp_length(message), message);
|
||||
|
||||
#ifdef _WIN32
|
||||
/* force-flush the log file, because setvbuf() does not seem
|
||||
to have an effect on WIN32 */
|
||||
fflush(stderr);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* !ANDROID */
|
||||
|
||||
void
|
||||
Log(const Domain &domain, LogLevel level, const char *msg)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
__android_log_print(ToAndroidLogLevel(level), "MPD",
|
||||
"%s: %s", domain.GetName(), msg);
|
||||
#else
|
||||
|
||||
if (level < log_threshold)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
if (enable_syslog) {
|
||||
SysLog(domain, level, msg);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
FileLog(domain, msg);
|
||||
#endif /* !ANDROID */
|
||||
}
|
||||
38
src/LogBackend.hxx
Normal file
38
src/LogBackend.hxx
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_LOG_BACKEND_HXX
|
||||
#define MPD_LOG_BACKEND_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "LogLevel.hxx"
|
||||
|
||||
void
|
||||
SetLogThreshold(LogLevel _threshold);
|
||||
|
||||
void
|
||||
EnableLogTimestamp();
|
||||
|
||||
void
|
||||
LogInitSysLog();
|
||||
|
||||
void
|
||||
LogFinishSysLog();
|
||||
|
||||
#endif /* LOG_H */
|
||||
228
src/LogInit.cxx
Normal file
228
src/LogInit.cxx
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Copyright 2003-2017 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LogInit.hxx"
|
||||
#include "LogBackend.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "config/Param.hxx"
|
||||
#include "config/ConfigGlobal.hxx"
|
||||
#include "config/ConfigOption.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "fs/FileSystem.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "system/Error.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define LOG_LEVEL_SECURE LogLevel::INFO
|
||||
|
||||
#define LOG_DATE_BUF_SIZE 16
|
||||
#define LOG_DATE_LEN (LOG_DATE_BUF_SIZE - 1)
|
||||
|
||||
static constexpr Domain log_domain("log");
|
||||
|
||||
#ifndef ANDROID
|
||||
|
||||
static int out_fd = -1;
|
||||
static AllocatedPath out_path = AllocatedPath::Null();
|
||||
|
||||
static void redirect_logs(int fd)
|
||||
{
|
||||
assert(fd >= 0);
|
||||
if (dup2(fd, STDOUT_FILENO) < 0)
|
||||
throw MakeErrno("Failed to dup2 stdout");
|
||||
if (dup2(fd, STDERR_FILENO) < 0)
|
||||
throw MakeErrno("Failed to dup2 stderr");
|
||||
}
|
||||
|
||||
static int
|
||||
open_log_file(void)
|
||||
{
|
||||
assert(!out_path.IsNull());
|
||||
|
||||
return OpenFile(out_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
|
||||
}
|
||||
|
||||
static void
|
||||
log_init_file(int line)
|
||||
{
|
||||
assert(!out_path.IsNull());
|
||||
|
||||
out_fd = open_log_file();
|
||||
if (out_fd < 0) {
|
||||
#ifdef _WIN32
|
||||
const std::string out_path_utf8 = out_path.ToUTF8();
|
||||
throw FormatRuntimeError("failed to open log file \"%s\" (config line %d)",
|
||||
out_path_utf8.c_str(), line);
|
||||
#else
|
||||
int e = errno;
|
||||
const std::string out_path_utf8 = out_path.ToUTF8();
|
||||
throw FormatErrno(e, "failed to open log file \"%s\" (config line %d)",
|
||||
out_path_utf8.c_str(), line);
|
||||
#endif
|
||||
}
|
||||
|
||||
EnableLogTimestamp();
|
||||
}
|
||||
|
||||
static inline LogLevel
|
||||
parse_log_level(const char *value, int line)
|
||||
{
|
||||
if (0 == strcmp(value, "default"))
|
||||
return LogLevel::DEFAULT;
|
||||
if (0 == strcmp(value, "secure"))
|
||||
return LOG_LEVEL_SECURE;
|
||||
else if (0 == strcmp(value, "verbose"))
|
||||
return LogLevel::DEBUG;
|
||||
else
|
||||
throw FormatRuntimeError("unknown log level \"%s\" at line %d",
|
||||
value, line);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
log_early_init(bool verbose)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
(void)verbose;
|
||||
#else
|
||||
/* force stderr to be line-buffered */
|
||||
setvbuf(stderr, nullptr, _IOLBF, 0);
|
||||
|
||||
if (verbose)
|
||||
SetLogThreshold(LogLevel::DEBUG);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
log_init(bool verbose, bool use_stdout)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
(void)verbose;
|
||||
(void)use_stdout;
|
||||
#else
|
||||
if (verbose)
|
||||
SetLogThreshold(LogLevel::DEBUG);
|
||||
else if (const auto ¶m = config_get_param(ConfigOption::LOG_LEVEL))
|
||||
SetLogThreshold(parse_log_level(param->value.c_str(),
|
||||
param->line));
|
||||
|
||||
if (use_stdout) {
|
||||
out_fd = STDOUT_FILENO;
|
||||
} else {
|
||||
const auto *param = config_get_param(ConfigOption::LOG_FILE);
|
||||
if (param == nullptr) {
|
||||
/* no configuration: default to syslog (if
|
||||
available) */
|
||||
#ifndef HAVE_SYSLOG
|
||||
throw std::runtime_error("config parameter 'log_file' not found");
|
||||
#endif
|
||||
#ifdef HAVE_SYSLOG
|
||||
} else if (strcmp(param->value.c_str(), "syslog") == 0) {
|
||||
LogInitSysLog();
|
||||
#endif
|
||||
} else {
|
||||
out_path = param->GetPath();
|
||||
log_init_file(param->line);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef ANDROID
|
||||
|
||||
static void
|
||||
close_log_files(void)
|
||||
{
|
||||
#ifdef HAVE_SYSLOG
|
||||
LogFinishSysLog();
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
log_deinit(void)
|
||||
{
|
||||
#ifndef ANDROID
|
||||
close_log_files();
|
||||
out_path = AllocatedPath::Null();
|
||||
#endif
|
||||
}
|
||||
|
||||
void setup_log_output()
|
||||
{
|
||||
#ifndef ANDROID
|
||||
if (out_fd == STDOUT_FILENO)
|
||||
return;
|
||||
|
||||
fflush(nullptr);
|
||||
|
||||
if (out_fd < 0) {
|
||||
#ifdef _WIN32
|
||||
return;
|
||||
#else
|
||||
out_fd = open("/dev/null", O_WRONLY);
|
||||
if (out_fd < 0)
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
redirect_logs(out_fd);
|
||||
close(out_fd);
|
||||
out_fd = -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int cycle_log_files(void)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
return 0;
|
||||
#else
|
||||
int fd;
|
||||
|
||||
if (out_path.IsNull())
|
||||
return 0;
|
||||
|
||||
FormatDebug(log_domain, "Cycling log files");
|
||||
close_log_files();
|
||||
|
||||
fd = open_log_file();
|
||||
if (fd < 0) {
|
||||
const std::string out_path_utf8 = out_path.ToUTF8();
|
||||
FormatError(log_domain,
|
||||
"error re-opening log file: %s",
|
||||
out_path_utf8.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
redirect_logs(fd);
|
||||
close(fd);
|
||||
|
||||
FormatDebug(log_domain, "Done cycling log files");
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user