Compare commits
962 Commits
Author | SHA1 | Date | |
---|---|---|---|
66f006108c | |||
47f887bda0 | |||
bb64c73aa2 | |||
1f30d1e77a | |||
04dab9b274 | |||
fb4e102670 | |||
67e0ba0356 | |||
22bb4e6462 | |||
79035bdbed | |||
70089a5258 | |||
34238d5f1e | |||
cab6917cbd | |||
2951ee5b1d | |||
fb16a15900 | |||
76b52f4c5d | |||
21a2e643c2 | |||
733d9cb026 | |||
2f54f57b7a | |||
7bd95019ef | |||
33557c3271 | |||
c65b9cd88d | |||
038db8167f | |||
030498ced5 | |||
28eb8b662a | |||
de752eaf80 | |||
9c5ef19d80 | |||
235bd0a46b | |||
465d71a3a3 | |||
14e6029fae | |||
75434158ee | |||
1cae9fd893 | |||
bea34a812c | |||
41a28d7322 | |||
235158d2bc | |||
521238f7d7 | |||
384f52a607 | |||
49f2d912ab | |||
8652fe30ce | |||
899a14ba51 | |||
466c7dafb3 | |||
293bb63ed8 | |||
8f8fb720af | |||
19f414d843 | |||
eaca1c3170 | |||
9fc75925f9 | |||
b5098ac87c | |||
e23aec9728 | |||
57d490c84f | |||
aa8c9f6a98 | |||
57772dc73d | |||
21706108e8 | |||
50d0caf00f | |||
2739332306 | |||
c85c4699aa | |||
81add4d6bf | |||
8e31eeb696 | |||
e1ce8b37ff | |||
3f831c05f5 | |||
f0d7ce6bb6 | |||
6ba95b2545 | |||
6818e68542 | |||
43659d7deb | |||
f24d8e7d2d | |||
e10fe5e125 | |||
0f8c9ab1c4 | |||
8a9a9cb991 | |||
44208ffa67 | |||
5df0478fa3 | |||
d52567933e | |||
a32cdb9f4d | |||
eacd8d986c | |||
1d32603b49 | |||
8c6f7ee5a4 | |||
be482eed3f | |||
6e1c53cb0f | |||
af92f205cf | |||
87047b08c8 | |||
e282161872 | |||
01b1e287ed | |||
d7fd1fa467 | |||
bfa34cd494 | |||
915835e224 | |||
659332e7ac | |||
272986c6ac | |||
4d8ab45c56 | |||
932ae86d47 | |||
756e6334b0 | |||
4e6eca9748 | |||
d9e37eb30c | |||
04d1b35926 | |||
d13d609050 | |||
20426cf251 | |||
4a220d7c8e | |||
436eab41ca | |||
c8472d0a96 | |||
1a7db9c17e | |||
b468d9f17c | |||
41cf1d7d23 | |||
e2570c98ee | |||
b5125479ec | |||
989355e885 | |||
a2f2c46f87 | |||
605623baf5 | |||
fdc452c536 | |||
1b391dd36b | |||
917067741a | |||
34ed93d57c | |||
d400a64b9a | |||
2c7447b73e | |||
c0f0fa24f8 | |||
bda5f949bb | |||
992e985972 | |||
afaa359b0d | |||
3c17db41dc | |||
d62ed4f6b3 | |||
79f3194d0c | |||
b045f9a50d | |||
ce231602dc | |||
6f5e0cd161 | |||
1269a79a4d | |||
1b3424ff61 | |||
8b8033c72b | |||
7ca0109732 | |||
6b5172d002 | |||
9e19a635bb | |||
15193d0e1f | |||
f1c5c72e62 | |||
25dfed207c | |||
006cbee88a | |||
c95e5346a4 | |||
e54bf563b5 | |||
8f79327190 | |||
a197ac092a | |||
1e2b55c0d7 | |||
964ff522be | |||
934c32cbc6 | |||
9bd6be779f | |||
ce70d6eedc | |||
3a0d13aa77 | |||
f9323c5273 | |||
7587656cf6 | |||
023074650f | |||
d854e90c23 | |||
3aabeb2b81 | |||
65f5885bce | |||
7a132eabb4 | |||
7e1b380f01 | |||
1a2d9b8eed | |||
6eefa0b72d | |||
44372db955 | |||
e24cce4aed | |||
a8595c0418 | |||
340424e03a | |||
93036bec01 | |||
663e98969d | |||
37d1daf58e | |||
1a18f0ca55 | |||
bb950ec93e | |||
39ab3557a3 | |||
dcdc46b97c | |||
da3ed0dfb3 | |||
e391b9fb90 | |||
e346cdad26 | |||
7e4c6ff218 | |||
356f246a74 | |||
80da552834 | |||
2dd8ab197d | |||
1fe11e9ae2 | |||
21d5fe6272 | |||
52bc4a3598 | |||
cccaacee36 | |||
ebf6e1c0e9 | |||
5cf090c896 | |||
cc299053cc | |||
82b75796f9 | |||
a560d94a9f | |||
0827d52c6f | |||
a8d33c9950 | |||
43c32ea280 | |||
30d40e9a32 | |||
e28508ad56 | |||
182e4cec86 | |||
a32de96ab1 | |||
0de35fdd1f | |||
470d9cd752 | |||
87598c7612 | |||
57bf618627 | |||
c576a707b0 | |||
b78b1bbfa9 | |||
e710964d05 | |||
2d00657756 | |||
0526d4ff21 | |||
76e20015a4 | |||
f5e797e3aa | |||
787e36a28f | |||
8572b57834 | |||
ed0129f881 | |||
78836a9e22 | |||
4c08184379 | |||
da165d6943 | |||
8ffccfbaff | |||
a6d083d69d | |||
91bae9d510 | |||
f0f185509f | |||
5947ef7706 | |||
4f663a2a86 | |||
1d01777a13 | |||
6d3b8b6d7d | |||
50c1c08235 | |||
b16c30b4c6 | |||
ff1ca1e0d3 | |||
721c4378c1 | |||
5f4e0c7e3e | |||
e6af4511a8 | |||
965ad778dd | |||
3b78be83cf | |||
564cd4e09d | |||
699ca5fec1 | |||
f91ffbbfdf | |||
156292e408 | |||
81ae44f858 | |||
c948814eae | |||
b5dba77056 | |||
ef06d165b4 | |||
5cb23c814d | |||
8f7ded33e0 | |||
a17d5795fb | |||
ad4d41e602 | |||
9754fc789e | |||
fd3c6eb320 | |||
b7b68ecdba | |||
08ba27627d | |||
27d2c0aaf3 | |||
b714a4be63 | |||
2356b25c58 | |||
05cad05505 | |||
1e3082fbc0 | |||
80d2573b10 | |||
6adcdc41f4 | |||
2d08dddfc8 | |||
6da8f49d8b | |||
bcd072c5e8 | |||
e90a31781c | |||
2e89ec9105 | |||
865c42465a | |||
73c93cc345 | |||
cf32fdf672 | |||
c33b54794c | |||
6775e83420 | |||
719785a8d3 | |||
287995ffdf | |||
0e506a53b5 | |||
70e1a15973 | |||
09cff5e4cc | |||
57858b8015 | |||
07855e3125 | |||
2f5f8e7afd | |||
43897de12e | |||
4b577aa77b | |||
85c3d64f29 | |||
47dd293904 | |||
c4220a4853 | |||
48ab88a2af | |||
d9cf9709d2 | |||
9720c894f1 | |||
8dad3af36d | |||
e5425d4a27 | |||
58e6d4aabb | |||
9ce142606c | |||
e75a64a8a2 | |||
bc71e1b612 | |||
580ca36a62 | |||
447fe48d2a | |||
e8a6c8cd6d | |||
a8fd42c1df | |||
e782c26908 | |||
cd65a1e172 | |||
6e51c5685e | |||
84a37a2c0c | |||
7e94cc2cc3 | |||
7002ccb866 | |||
4fe0b116ae | |||
a0fb9de515 | |||
5d42dcc9ec | |||
96e88c90e8 | |||
75d94240ed | |||
6c544708e1 | |||
078e7246ac | |||
06cff1fb9f | |||
2e8bbed75b | |||
a707c9410e | |||
a956bb08d8 | |||
db52cc6749 | |||
73c6224a95 | |||
a217920561 | |||
48a36f59a6 | |||
965b132664 | |||
63f185f9bf | |||
e97b0088f2 | |||
374c17a0d9 | |||
4b3bc587ab | |||
06c63f2026 | |||
6b7d9942a7 | |||
760a56964f | |||
6ca575b5a3 | |||
ce1d36cacb | |||
87b2525e03 | |||
faa77aca2e | |||
5d2158792c | |||
e1ebaa902b | |||
e0564f628e | |||
44e45aa090 | |||
89f5f336af | |||
727be309b2 | |||
ce2d7a2d5a | |||
fad6c7201e | |||
8f0e1f3349 | |||
6f7d0c6928 | |||
120c8f244c | |||
352a367570 | |||
9f65d22909 | |||
141131f3a6 | |||
488420fdf2 | |||
10e6b8f769 | |||
419da18405 | |||
7329d4bf3a | |||
c8fe4043b6 | |||
3d133d61ca | |||
d51e42c707 | |||
79e39d6f0b | |||
7dec934bb3 | |||
83f866df01 | |||
d88d8e2dbb | |||
3a40dff999 | |||
3f69d58498 | |||
ca10cf081f | |||
f120449aae | |||
636f51c93c | |||
9bb47c8c61 | |||
8886db2000 | |||
a7040896f0 | |||
2ebfab8e07 | |||
9bd5888f5e | |||
8b7bbbc6af | |||
0383ffa5ab | |||
3c361eb759 | |||
37eaa6e4f9 | |||
0ae7e86fcb | |||
3f405d8908 | |||
0245847ea8 | |||
54f16ca2bf | |||
a096ade345 | |||
848fe51f3d | |||
e82db6fc2f | |||
4b3176a9a1 | |||
5e6c58716e | |||
e98132fd76 | |||
ff171baa67 | |||
05664d150b | |||
fcda972cec | |||
01f44f531e | |||
c5b076ec7e | |||
05cf5a38af | |||
bd22b641b3 | |||
6a9005645a | |||
7392505bd8 | |||
6aaf742dfe | |||
dcaf69a5d5 | |||
323673c3c0 | |||
e16ccf8cf8 | |||
434cde179f | |||
629a4b5bf8 | |||
6a8f6fb3cc | |||
807e930786 | |||
554188e88e | |||
585fca06a1 | |||
282667c4b5 | |||
8176470b7f | |||
acb7ce16ca | |||
12bdef51f5 | |||
84b07c81fd | |||
107360a001 | |||
3f541df669 | |||
da17783242 | |||
0ea2843ec9 | |||
7c92bf15e2 | |||
97589f77f8 | |||
504adcc8c8 | |||
f03ed9f5bf | |||
b22dc38ba1 | |||
7a7992ab0b | |||
3513f4ee84 | |||
f33703aefc | |||
389089859d | |||
844dddfee0 | |||
862e7a410d | |||
7ad64c8d45 | |||
5b50990879 | |||
71b93468d5 | |||
6b88da2b82 | |||
d01ea20273 | |||
f05860672c | |||
2b5e919a47 | |||
27c8df6140 | |||
9ac112104c | |||
98b80288ed | |||
ecdea54203 | |||
9d5a07bac4 | |||
7adc721d96 | |||
f5137028fa | |||
48f9b2fdcc | |||
b7d6ff6770 | |||
f7a87d5e52 | |||
75d1aa5135 | |||
49396a69bf | |||
d94041e98d | |||
cc5408482e | |||
115bf2613d | |||
1d172b07a8 | |||
777ae3c215 | |||
1b2a9270e8 | |||
e082418e4a | |||
83218c479a | |||
dbb8267b09 | |||
ea0ba19089 | |||
2db28cae41 | |||
dd54fff978 | |||
c4f3bb9b67 | |||
45487a91f9 | |||
dad5c62df5 | |||
a1ab81a896 | |||
1d0ba0d1f2 | |||
46a4ea8f67 | |||
42f2b14a74 | |||
bec5835289 | |||
0aa4dc904e | |||
f526c424c5 | |||
601d7a52e9 | |||
7f6fc74c36 | |||
9e2ce1751b | |||
8920ac02f6 | |||
06415de8ee | |||
12d471e2da | |||
7d6777a96f | |||
96c08cd295 | |||
f3633a2e04 | |||
feeb1cb566 | |||
146bc95c16 | |||
5792f5bfb5 | |||
11521dca08 | |||
6f457292ff | |||
696cb298ab | |||
6d2861f358 | |||
7879fa5095 | |||
a03062af4f | |||
19ecce1e32 | |||
5e0a69f68b | |||
a33bcac52f | |||
39cd6dff7d | |||
ed9cf3566c | |||
d4d246bfd1 | |||
c02a14c798 | |||
781ce30e27 | |||
4b68c7c154 | |||
daddd90058 | |||
5d2b27d916 | |||
7a37363817 | |||
bee3829960 | |||
e0600e5a91 | |||
b55b646f12 | |||
43e608af47 | |||
32d6d811c5 | |||
0d6fca5abc | |||
48a085c28f | |||
059e631f41 | |||
deb7ac549c | |||
891767c6b7 | |||
62810d769a | |||
5253c27ca8 | |||
1ffd6b4b4d | |||
6469606baf | |||
77cd292828 | |||
22d6951de5 | |||
33f7103eae | |||
c00216e3be | |||
42247e0e1a | |||
8a908a6864 | |||
2d6ed7142f | |||
9ecb844de7 | |||
3ab8185777 | |||
b8008ae1e9 | |||
ab9ec45c9d | |||
6a0d683f79 | |||
711487267d | |||
503bf69ab3 | |||
a60521269d | |||
fe96f85410 | |||
275fab003f | |||
edfb386ef0 | |||
186709ed75 | |||
b7d4330dd4 | |||
7c3be2ec9a | |||
8fac9102eb | |||
178854ac97 | |||
f4a089cc26 | |||
422eab5846 | |||
95e1404a2b | |||
cfc21e1225 | |||
3799190fa0 | |||
d6c3396182 | |||
a95d37ea25 | |||
d8e1a196bc | |||
1e2970b7e1 | |||
0d1fed78af | |||
709bda5939 | |||
8a28734603 | |||
9485eba73d | |||
23c4a7dc49 | |||
39b578fde9 | |||
8e16079157 | |||
eabd23fc07 | |||
c7932b710c | |||
9d7a926a8b | |||
0a390cbc91 | |||
76829457df | |||
703a5348e8 | |||
1a135fa30e | |||
e4d75c77bf | |||
75d505c431 | |||
b72c99e46a | |||
fae9c08815 | |||
c3e7deb4b6 | |||
c9245751e9 | |||
9b172879a2 | |||
9077a94dfe | |||
e2f07a5220 | |||
ae93d574c2 | |||
369f37a0a4 | |||
e1b7f40c2b | |||
94dcd3fe12 | |||
2dc1ae9026 | |||
7cfff75c3e | |||
a66a49d384 | |||
5f58e0661b | |||
f0a40862d6 | |||
f75c51ff71 | |||
d357192025 | |||
c996c8ff49 | |||
1af4e256c9 | |||
bc09365c98 | |||
ba688cf629 | |||
d5c8b26a45 | |||
d38f3f664f | |||
5ac435325b | |||
b874441a47 | |||
a35087a5ed | |||
1aeaf052a6 | |||
a0eafa12e3 | |||
757425a360 | |||
64d1e776f7 | |||
c6695a3120 | |||
076e384bb5 | |||
41cff1b49d | |||
6796b08909 | |||
f9df17d8d0 | |||
7f71a0ba37 | |||
0e2e13f018 | |||
bd099e2f4d | |||
42f56b9f86 | |||
704c50ea17 | |||
887bff572a | |||
1eaf71b5b4 | |||
0f872af502 | |||
b13696ea1a | |||
5fbbf7c748 | |||
e7fe0db051 | |||
dcb7bd8c74 | |||
92d485dd4d | |||
f4229a5d3e | |||
f97626346b | |||
7f4feaee08 | |||
5a30ef180a | |||
0a0412e47e | |||
57d4b50467 | |||
8d75efdc58 | |||
c706f9b2cd | |||
c810913861 | |||
2b13158e29 | |||
4fe1716c7a | |||
d7a82783be | |||
0a0f15baca | |||
58c144ee55 | |||
280315a314 | |||
506ff5809e | |||
acd1505050 | |||
578b56fc10 | |||
88cb0c6ae3 | |||
294662a1ce | |||
eaa3e87eb0 | |||
9b3a1a99e5 | |||
76a68c26c9 | |||
ef64f00cbb | |||
acbe89a159 | |||
0f66e5e49b | |||
686aa3a150 | |||
d8bc828839 | |||
094c391cd7 | |||
c8491724b4 | |||
d5beb8a9e4 | |||
702f7cc51d | |||
b8cd0a1bc0 | |||
7f87ac4b65 | |||
306fbd8bd8 | |||
3e0b272a20 | |||
6c89226ccf | |||
f040987c9f | |||
2a42ddbcbf | |||
8bb68c4e6a | |||
4485b978c1 | |||
68bad56e7d | |||
ef55c15537 | |||
ce8d37984d | |||
c8166aed97 | |||
0bd41f98ed | |||
d8ead57fbb | |||
d9e7a5fcbe | |||
c965a110f2 | |||
8a879faac7 | |||
a2a9f1e331 | |||
15d7568038 | |||
8cbc450192 | |||
79199711b8 | |||
2c1b8fdd39 | |||
d9024db68d | |||
96dd044f8e | |||
e66b29943b | |||
100b9dd12a | |||
3415db9739 | |||
186bf7ae32 | |||
97ca6858b7 | |||
ee6b11d36d | |||
f58fef60fb | |||
a76eb64bbb | |||
8590326b50 | |||
b0271394cd | |||
c39633f968 | |||
1fef74b00c | |||
9f6a2e51b2 | |||
b150da837a | |||
ba9aaee7cd | |||
3aa67969f9 | |||
d4f336db40 | |||
d184d3a732 | |||
42da1ce4e2 | |||
d2ed921bc6 | |||
d32a072190 | |||
95c137158f | |||
7151b92239 | |||
716caeb17c | |||
f8e4bdd23d | |||
55dfd03007 | |||
854fc8d552 | |||
f2badf2c5d | |||
ea656b1a3f | |||
5b7bd24f0a | |||
2d7c7b0982 | |||
b958bf9086 | |||
43144cfe8b | |||
11d2d2eccd | |||
e22f89853f | |||
7ccc029f77 | |||
0eb78e461d | |||
3615209ce7 | |||
6bfe0fca1f | |||
bfa2535ea1 | |||
6ec918fabb | |||
cbf7c0080b | |||
a6196901de | |||
c09469fa3a | |||
3acd84d9c0 | |||
c902fd0303 | |||
955aaef2e6 | |||
e0a2bb9d86 | |||
3bc8d78801 | |||
b66c03667c | |||
6e04a646ba | |||
086e5da8d0 | |||
c1b06817a2 | |||
c3926e6af0 | |||
70322d1ff8 | |||
7c32640a9b | |||
5ad09afc15 | |||
5d8c1a303e | |||
24b254459b | |||
30089841f6 | |||
0bee05b849 | |||
afd9ae9999 | |||
5ab70c4e97 | |||
cab2232aba | |||
946e937549 | |||
0ca943f49b | |||
b2db0b97fc | |||
d565ec7968 | |||
36e3ccfc68 | |||
892ca196f1 | |||
59413b3124 | |||
e1643c91c4 | |||
3ce6248f8c | |||
006c39380a | |||
22f2247f46 | |||
852a2146ab | |||
99b42f210c | |||
ae3c9033c1 | |||
03f7f0d18c | |||
79d7090867 | |||
e7f63cd336 | |||
f108f483b7 | |||
d6cbb02c92 | |||
42af8b199f | |||
dbbd9663b2 | |||
f4846b6fe4 | |||
a28a34f61c | |||
96d47c51a1 | |||
f27c11ccd8 | |||
43e2301e2c | |||
7b05b3dbb3 | |||
c96b8c8d68 | |||
4fc767b3f6 | |||
cc96848b01 | |||
6009801c5f | |||
f116cdeed9 | |||
5f38fa379c | |||
e2fb9ac829 | |||
f83254d760 | |||
ee5cc733a1 | |||
18a17cfbbf | |||
a3a830e1ab | |||
4b1e9ada18 | |||
9026339d35 | |||
0be13a6295 | |||
fcc2874591 | |||
9246bee12b | |||
30a08f4282 | |||
e5c5f34f9a | |||
361eab1bf7 | |||
2fd2140f64 | |||
86faa3f995 | |||
81acd94153 | |||
48987bed67 | |||
4405e8a15b | |||
24cb4798bc | |||
986e9e268e | |||
71bf8c5f85 | |||
5a629ff387 | |||
148a58865e | |||
2523fa73cf | |||
6d76c34291 | |||
3faeb7fa79 | |||
bb00904fc8 | |||
73e3fc7c4f | |||
5903339c17 | |||
2688ae614c | |||
5670cafda4 | |||
4bc8fd3267 | |||
bb2fa9957a | |||
c6b108ef4f | |||
bb158a9b48 | |||
c2fdbde68f | |||
7e82450d7b | |||
188dbdb068 | |||
25866f3652 | |||
c7e2057d2d | |||
d84f367317 | |||
95d6586dd7 | |||
e8e13fdeeb | |||
816b2d7ff8 | |||
91cfa0aac9 | |||
4be646c695 | |||
a23c6177d5 | |||
cc6e1ea200 | |||
596d30661a | |||
b971eeca4b | |||
cfab36cb1d | |||
5835b3b8eb | |||
62eea636b0 | |||
b14e61ff79 | |||
59adc25c23 | |||
86ead6a65c | |||
fbfbafa3d4 | |||
1ddf90ed08 | |||
0fbd508c5f | |||
24a7b0ce74 | |||
68eafb3f30 | |||
2649f6bdd6 | |||
9807f47d4e | |||
63425bed10 | |||
02058ea699 | |||
91be35731c | |||
d1daeb44e6 | |||
efdfc5c327 | |||
9c00ad9ff2 | |||
151adab739 | |||
162b1bdef7 | |||
da425cc225 | |||
346213da4c | |||
8babecd890 | |||
2855c55ac1 | |||
bb9649e18d | |||
2f7d0e7884 | |||
dfc4d7cb50 | |||
b800642fa4 | |||
5b6c590057 | |||
66a0f54097 | |||
f8e64aad5b | |||
cd5ec8cd35 | |||
75fd13de5d | |||
807af8670e | |||
5bd05fba09 | |||
f7b6e777bf | |||
68353b7e57 | |||
8e81bc1b49 | |||
80a89b5e6d | |||
b64b54f48f | |||
20a52f153b | |||
d89271528e | |||
ccac35fc01 | |||
23e232b496 | |||
ddcf906a88 | |||
09e8124017 | |||
67d1e2903c | |||
a9c4cd6cbe | |||
180bc1784e | |||
f984feda42 | |||
56fc15f44d | |||
e0d9f7d1d4 | |||
87ba66b6d0 | |||
e420800aeb | |||
a684984f8b | |||
079682fbdc | |||
2491719f36 | |||
65de227520 | |||
29f3b198cf | |||
0ace79939b | |||
b3a75a60a4 | |||
5e8668799c | |||
8fa6935c9d | |||
a1fe6265fd | |||
67f636545a | |||
ec50c20400 | |||
18f146ace5 | |||
a91bf296d7 | |||
bb8985d76c | |||
7ff2a44a63 | |||
b5074d8577 | |||
5c1abaf43c | |||
dc3988eff8 | |||
24102a7435 | |||
9614d17024 | |||
8e3be6413e | |||
09e648f957 | |||
0c2bf022fa | |||
1c5d2a85cf | |||
8993b15248 | |||
8f91b5aab3 | |||
46391397b8 | |||
85c9a231c1 | |||
c312d4fba0 | |||
7203036e3e | |||
b9d8e3e55a | |||
08973f9f05 | |||
c6931dcb07 | |||
cea13e964c | |||
d207a34736 | |||
fba1af6ea9 | |||
b825d04597 | |||
3133ee2401 | |||
4d52f47f87 | |||
f54cfcdb8f | |||
57983980a7 | |||
33f4aaf3fd | |||
c138d692b1 | |||
fb12136975 | |||
efe260f12e | |||
b9b535c30f | |||
d085c8626f | |||
5e3697807c | |||
5416c114cf | |||
a0127e63c6 | |||
8b2327ed34 | |||
3938142535 | |||
66f76c8067 | |||
568475e2db | |||
9ea398416e | |||
50a17fc00b | |||
f9a9b7f610 | |||
a57f6b70da | |||
bae83ba2b6 | |||
385b4ce959 | |||
7b6e3a23be | |||
1cc8956f74 | |||
e6c8bfd008 | |||
2d67962c2f | |||
2e30926ac3 | |||
d2c66c40c6 | |||
a4d48df30a | |||
c52830980a | |||
e8e5ddc55d | |||
111942a47d | |||
bc88180058 | |||
3a616de47b | |||
9d65e6f183 | |||
328a6a866e | |||
5264fded00 | |||
83d5115a02 | |||
0559212df7 | |||
f131255066 | |||
59f3dc3b6b | |||
6454bfe754 | |||
7bb224f54a | |||
fa12a5f70b | |||
d2d78a073f | |||
6d403f2d85 | |||
8032141311 | |||
38491c8c4b | |||
627664b785 | |||
dfa1c7493c | |||
801337a422 | |||
4ec95043d7 | |||
b4dc1a7263 | |||
ef3aa2731c | |||
e738019c48 | |||
a5ef78f709 | |||
4156cea704 | |||
a587d05098 | |||
489dc657c6 | |||
029a2837e4 | |||
618ecfd1c6 | |||
83174b919c | |||
d952b38f93 | |||
1e2ab89b47 | |||
34a9619806 | |||
9ee65009cd | |||
85ccba366a | |||
579a02529d | |||
b04c8c1c1a | |||
243fa6cf63 | |||
30c0a7d069 | |||
71b4e765c8 | |||
73dd5aa2d1 | |||
96e209db49 | |||
0c14ca58c7 | |||
f3c0aa154a | |||
6efaaa9d7a | |||
08238e8307 | |||
e1b35f9847 | |||
e174af7838 | |||
be74801236 | |||
68acfd36d0 | |||
c9cea2152b | |||
e966c96644 | |||
73c31d873e | |||
a2a9d54985 |
2
.github/stale.yml
vendored
@ -1,7 +1,7 @@
|
|||||||
only: pulls
|
only: pulls
|
||||||
|
|
||||||
# Number of days of inactivity before a pull request becomes stale
|
# Number of days of inactivity before a pull request becomes stale
|
||||||
daysUntilStale: 30
|
daysUntilStale: 7
|
||||||
|
|
||||||
# Number of days of inactivity before a stale pull request is closed
|
# Number of days of inactivity before a stale pull request is closed
|
||||||
daysUntilClose: 7
|
daysUntilClose: 7
|
||||||
|
2
.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
/book/html/
|
/book/html/
|
||||||
/book/src/tests.ok
|
/book/src/tests.ok
|
||||||
|
/book/src/.gitbook/assets/*.svg
|
||||||
/farf/
|
/farf/
|
||||||
/solana-release/
|
/solana-release/
|
||||||
/solana-release.tar.bz2
|
/solana-release.tar.bz2
|
||||||
@ -15,6 +16,7 @@
|
|||||||
# log files
|
# log files
|
||||||
*.log
|
*.log
|
||||||
log-*.txt
|
log-*.txt
|
||||||
|
log-*/
|
||||||
|
|
||||||
# intellij files
|
# intellij files
|
||||||
/.idea/
|
/.idea/
|
||||||
|
64
.mergify.yml
@ -19,54 +19,6 @@ pull_request_rules:
|
|||||||
label:
|
label:
|
||||||
add:
|
add:
|
||||||
- automerge
|
- automerge
|
||||||
- name: v0.16 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.16
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.16
|
|
||||||
- name: v0.17 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.17
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.17
|
|
||||||
- name: v0.18 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.18
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.18
|
|
||||||
- name: v0.19 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.19
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.19
|
|
||||||
- name: v0.20 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.20
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.20
|
|
||||||
- name: v0.21 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.21
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.21
|
|
||||||
- name: v0.22 backport
|
- name: v0.22 backport
|
||||||
conditions:
|
conditions:
|
||||||
- base=master
|
- base=master
|
||||||
@ -75,3 +27,19 @@ pull_request_rules:
|
|||||||
backport:
|
backport:
|
||||||
branches:
|
branches:
|
||||||
- v0.22
|
- v0.22
|
||||||
|
- name: v0.23 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.23
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.23
|
||||||
|
- name: v0.24 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.24
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.24
|
||||||
|
259
CONTRIBUTING.md
@ -1,23 +1,41 @@
|
|||||||
Solana Coding Guidelines
|
# Solana Coding Guidelines
|
||||||
===
|
|
||||||
|
|
||||||
The goal of these guidelines is to improve developer productivity by allowing developers to
|
The goal of these guidelines is to improve developer productivity by allowing
|
||||||
jump any file in the codebase and not need to adapt to inconsistencies in how the code is
|
developers to jump into any file in the codebase and not need to adapt to
|
||||||
written. The codebase should appear as if it had been authored by a single developer. If you
|
inconsistencies in how the code is written. The codebase should appear as if it
|
||||||
don't agree with a convention, submit a PR patching this document and let's discuss! Once
|
had been authored by a single developer. If you don't agree with a convention,
|
||||||
the PR is accepted, *all* code should be updated as soon as possible to reflect the new
|
submit a PR patching this document and let's discuss! Once the PR is accepted,
|
||||||
|
*all* code should be updated as soon as possible to reflect the new
|
||||||
conventions.
|
conventions.
|
||||||
|
|
||||||
Pull Requests
|
## Pull Requests
|
||||||
---
|
|
||||||
|
|
||||||
Small, frequent PRs are much preferred to large, infrequent ones. A large PR is difficult
|
Small, frequent PRs are much preferred to large, infrequent ones. A large PR is
|
||||||
to review, can block others from making progress, and can quickly get its author into
|
difficult to review, can block others from making progress, and can quickly get
|
||||||
"rebase hell". A large PR oftentimes arises when one change requires another, which requires
|
its author into "rebase hell". A large PR oftentimes arises when one change
|
||||||
another, and then another. When you notice those dependencies, put the fix into a commit of
|
requires another, which requires another, and then another. When you notice
|
||||||
its own, then checkout a new branch, and cherrypick it. Open a PR to start the review
|
those dependencies, put the fix into a commit of its own, then checkout a new
|
||||||
process and then jump back to your original branch to keep making progress. Once the commit
|
branch, and cherry-pick it.
|
||||||
is merged, you can use git-rebase to purge it from your original branch.
|
|
||||||
|
```bash
|
||||||
|
$ git commit -am "Fix foo, needed by bar"
|
||||||
|
$ git checkout master
|
||||||
|
$ git checkout -b fix-foo
|
||||||
|
$ git cherry-pick fix-bar
|
||||||
|
$ git push --set-upstream origin fix-foo
|
||||||
|
```
|
||||||
|
|
||||||
|
Open a PR to start the review process and then jump back to your original
|
||||||
|
branch to keep making progress. Consider rebasing to make your fix the first
|
||||||
|
commit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ git checkout fix-bar
|
||||||
|
$ git rebase -i master <Move fix-foo to top>
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the commit is merged, rebase the original branch to purge the
|
||||||
|
cherry-picked commit:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ git pull --rebase upstream master
|
$ git pull --rebase upstream master
|
||||||
@ -25,26 +43,137 @@ $ git pull --rebase upstream master
|
|||||||
|
|
||||||
### How big is too big?
|
### How big is too big?
|
||||||
|
|
||||||
If there are no functional changes, PRs can be very large and that's no problem. If,
|
If there are no functional changes, PRs can be very large and that's no
|
||||||
however, your changes are making meaningful changes or additions, then about 1,000 lines of
|
problem. If, however, your changes are making meaningful changes or additions,
|
||||||
changes is about the most you should ask a Solana maintainer to review.
|
then about 1,000 lines of changes is about the most you should ask a Solana
|
||||||
|
maintainer to review.
|
||||||
|
|
||||||
### Should I send small PRs as I develop large, new components?
|
### Should I send small PRs as I develop large, new components?
|
||||||
|
|
||||||
Add only code to the codebase that is ready to be deployed. If you are building a large
|
Add only code to the codebase that is ready to be deployed. If you are building
|
||||||
library, consider developing it in a separate git repository. When it is ready to be
|
a large library, consider developing it in a separate git repository. When it
|
||||||
integrated, the Solana maintainers will work with you to decide on a path forward. Smaller
|
is ready to be integrated, the Solana maintainers will work with you to decide
|
||||||
libraries may be copied in whereas very large ones may be pulled in with a package manager.
|
on a path forward. Smaller libraries may be copied in whereas very large ones
|
||||||
|
may be pulled in with a package manager.
|
||||||
|
|
||||||
|
## Getting Pull Requests Merged
|
||||||
|
|
||||||
|
There is no single person assigned to watching GitHub PR queue and ushering you
|
||||||
|
through the process. Typically, you will ask the person that wrote a component
|
||||||
|
to review changes to it. You can find the author using `git blame` or asking on
|
||||||
|
Discord. When working to get your PR merged, it's most important to understand
|
||||||
|
that changing the code is your priority and not necessarily a priority of the
|
||||||
|
person you need an approval from. Also, while you may interact the most with
|
||||||
|
the component author, you should aim to be inclusive of others. Providing a
|
||||||
|
detailed problem description is the most effective means of engaging both the
|
||||||
|
component author and other potentially interested parties.
|
||||||
|
|
||||||
|
Consider opening all PRs as Draft Pull Requests first. Using a draft PR allows
|
||||||
|
you to kickstart the CI automation, which typically takes between 10 and 30
|
||||||
|
minutes to execute. Use that time to write a detailed problem description. Once
|
||||||
|
the description is written and CI succeeds, click the "Ready to Review" button
|
||||||
|
and add reviewers. Adding reviewers before CI succeeds is a fast path to losing
|
||||||
|
reviewer engagement. Not only will they be notified and see the PR is not yet
|
||||||
|
ready for them, they will also be bombarded them with additional notifications
|
||||||
|
each time you push a commit to get past CI or until they "mute" the PR. Once
|
||||||
|
muted, you'll need to reach out over some other medium, such as Discord, to
|
||||||
|
request they have another look. When you use draft PRs, no notifications are
|
||||||
|
sent when you push commits and edit the PR description. Use draft PRs
|
||||||
|
liberally. Don't bug the humans until you have gotten past the bots.
|
||||||
|
|
||||||
|
### What should be in my PR description?
|
||||||
|
|
||||||
|
Reviewing code is hard work and generally involves an attempt to guess the
|
||||||
|
author's intent at various levels. Please assume reviewer time is scarce and do
|
||||||
|
what you can to make your PR as consumable as possible. Inspired by techniques
|
||||||
|
for writing good whitepapers, the guidance here aims to maximize reviewer
|
||||||
|
engagement.
|
||||||
|
|
||||||
|
Assume the reviewer will spend no more than a few seconds reading the PR title.
|
||||||
|
If it doesn't describe a noteworthy change, don't expect the reviewer to click
|
||||||
|
to see more.
|
||||||
|
|
||||||
|
Next, like the abstract of a whitepaper, the reviewer will spend ~30 seconds
|
||||||
|
reading the PR problem description. If what is described there doesn't look
|
||||||
|
more important than competing issues, don't expect the reviewer to read on.
|
||||||
|
|
||||||
|
Next, the reviewer will read the proposed changes. At this point, the reviewer
|
||||||
|
needs to be convinced the proposed changes are a *good* solution to the problem
|
||||||
|
described above. If the proposed changes, not the code changes, generates
|
||||||
|
discussion, consider closing the PR and returning with a design proposal
|
||||||
|
instead.
|
||||||
|
|
||||||
|
Finally, once the reviewer understands the problem and agrees with the approach
|
||||||
|
to solving it, the reviewer will view the code changes. At this point, the
|
||||||
|
reviewer is simply looking to see if the implementation actually implements
|
||||||
|
what was proposed and if that implementation is maintainable. When a concise,
|
||||||
|
readable test for each new code path is present, the reviewer can safely ignore
|
||||||
|
the details of its implementation. When those tests are missing, expect to
|
||||||
|
either lose engagement or get a pile of review comments as the reviewer
|
||||||
|
attempts to consider every ambiguity in your implementation.
|
||||||
|
|
||||||
|
### The PR Title
|
||||||
|
|
||||||
|
The PR title should contain a brief summary of the change, from the perspective
|
||||||
|
of the user. Examples of good titles:
|
||||||
|
|
||||||
|
* Add rent to accounts
|
||||||
|
* Fix out-of-memory error in validator
|
||||||
|
* Clean up `process_message()` in runtime
|
||||||
|
|
||||||
|
The conventions here are all the same as a good git commit title:
|
||||||
|
|
||||||
|
* First word capitalized and in the imperative mood, not past tense ("add", not
|
||||||
|
"added")
|
||||||
|
* No trailing period
|
||||||
|
* What was done, whom it was done to, and in what context
|
||||||
|
|
||||||
|
### The PR Problem Statement
|
||||||
|
|
||||||
|
The git repo implements a product with various features. The problem statement
|
||||||
|
should describe how the product is missing a feature, how a feature is
|
||||||
|
incomplete, or how the implementation of a feature is somehow undesirable. If
|
||||||
|
an issue being fixed already describes the problem, go ahead and copy-paste it.
|
||||||
|
As mentioned above, reviewer time is scarce. Given a queue of PRs to review,
|
||||||
|
the reviewer may ignore PRs that expect them to click through links to see if
|
||||||
|
the PR warrants attention.
|
||||||
|
|
||||||
|
### The Proposed Changes
|
||||||
|
|
||||||
|
Typically the content under the "Proposed changes" section will be a bulleted
|
||||||
|
list of steps taken to solve the problem. Oftentimes, the list is identical to
|
||||||
|
the subject lines of the git commits contained in the PR. It's especially
|
||||||
|
generous (and not expected) to rebase or reword commits such that each change
|
||||||
|
matches the logical flow in your PR description.
|
||||||
|
|
||||||
### When will my PR be reviewed?
|
### When will my PR be reviewed?
|
||||||
|
|
||||||
PRs are typically reviewed and merged in under 7 days. If your PR has been open for longer,
|
PRs are typically reviewed and merged in under 7 days. If your PR has been open
|
||||||
it's a strong indicator that the reviewers aren't confident the change meets the quality
|
for longer, it's a strong indicator that the reviewers aren't confident the
|
||||||
standards of the codebase. You might consider closing it and coming back with smaller PRs
|
change meets the quality standards of the codebase. You might consider closing
|
||||||
and longer descriptions detailing what problem it solves and how it solves it.
|
it and coming back with smaller PRs and longer descriptions detailing what
|
||||||
|
problem it solves and how it solves it. Old PRs will be marked stale and then
|
||||||
|
closed automatically 7 days later.
|
||||||
|
|
||||||
Draft Pull Requests
|
### How to manage review feedback?
|
||||||
---
|
|
||||||
|
After a reviewer provides feedback, you can quickly say "acknowledged, will
|
||||||
|
fix" using a thumb's up emoji. If you're confident your fix is exactly as
|
||||||
|
prescribed, add a reply "Fixed in COMMIT\_HASH" and mark the comment as
|
||||||
|
resolved. If you're not sure, reply "Is this what you had in mind?
|
||||||
|
COMMIT\_HASH" and if so, the reviewer will reply and mark the conversation as
|
||||||
|
resolved. Marking conversations as resolved is an excellent way to engage more
|
||||||
|
reviewers. Leaving conversations open may imply the PR is not yet ready for
|
||||||
|
additional review.
|
||||||
|
|
||||||
|
### When will my PR be re-reviewed?
|
||||||
|
|
||||||
|
Recall that once your PR is opened, a notification is sent every time you push
|
||||||
|
a commit. After a reviewer adds feedback, they won't be checking on the status
|
||||||
|
of that feedback after every new commit. Instead, directly mention the reviewer
|
||||||
|
when you feel your PR is ready for another pass.
|
||||||
|
|
||||||
|
## Draft Pull Requests
|
||||||
|
|
||||||
If you want early feedback on your PR, use GitHub's "Draft Pull Request"
|
If you want early feedback on your PR, use GitHub's "Draft Pull Request"
|
||||||
mechanism. Draft PRs are a convenient way to collaborate with the Solana
|
mechanism. Draft PRs are a convenient way to collaborate with the Solana
|
||||||
@ -52,67 +181,69 @@ maintainers without triggering notifications as you make changes. When you feel
|
|||||||
your PR is ready for a broader audience, you can transition your draft PR to a
|
your PR is ready for a broader audience, you can transition your draft PR to a
|
||||||
standard PR with the click of a button.
|
standard PR with the click of a button.
|
||||||
|
|
||||||
Do not add reviewers to draft PRs. GitHub doesn't automatically clear approvals
|
Do not add reviewers to draft PRs. GitHub doesn't automatically clear
|
||||||
when you click "Ready for Review", so a review that meant "I approve of the
|
approvals when you click "Ready for Review", so a review that meant "I approve
|
||||||
direction" suddenly has the appearance of "I approve of these changes." Instead,
|
of the direction" suddenly has the appearance of "I approve of these changes."
|
||||||
add a comment that mentions the usernames that you would like a review from. Ask
|
Instead, add a comment that mentions the usernames that you would like a review
|
||||||
explicitly what you would like feedback on.
|
from. Ask explicitly what you would like feedback on.
|
||||||
|
|
||||||
Rust coding conventions
|
## Rust coding conventions
|
||||||
---
|
|
||||||
|
|
||||||
* All Rust code is formatted using the latest version of `rustfmt`. Once installed, it will be
|
* All Rust code is formatted using the latest version of `rustfmt`. Once
|
||||||
updated automatically when you update the compiler with `rustup`.
|
installed, it will be updated automatically when you update the compiler with
|
||||||
|
`rustup`.
|
||||||
|
|
||||||
* All Rust code is linted with Clippy. If you'd prefer to ignore its advice, do so explicitly:
|
* All Rust code is linted with Clippy. If you'd prefer to ignore its advice, do
|
||||||
|
so explicitly:
|
||||||
|
|
||||||
```rust
|
```rust #[allow(clippy::too_many_arguments)] ```
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: Clippy defaults can be overridden in the top-level file `.clippy.toml`.
|
Note: Clippy defaults can be overridden in the top-level file `.clippy.toml`.
|
||||||
|
|
||||||
* For variable names, when in doubt, spell it out. The mapping from type names to variable names
|
* For variable names, when in doubt, spell it out. The mapping from type names
|
||||||
is to lowercase the type name, putting an underscore before each capital letter. Variable names
|
to variable names is to lowercase the type name, putting an underscore before
|
||||||
should *not* be abbreviated unless being used as closure arguments and the brevity improves
|
each capital letter. Variable names should *not* be abbreviated unless being
|
||||||
readability. When a function has multiple instances of the same type, qualify each with a
|
used as closure arguments and the brevity improves readability. When a function
|
||||||
prefix and underscore (i.e. alice_keypair) or a numeric suffix (i.e. tx0).
|
has multiple instances of the same type, qualify each with a prefix and
|
||||||
|
underscore (i.e. alice\_keypair) or a numeric suffix (i.e. tx0).
|
||||||
|
|
||||||
* For function and method names, use `<verb>_<subject>`. For unit tests, that verb should
|
* For function and method names, use `<verb>_<subject>`. For unit tests, that
|
||||||
always be `test` and for benchmarks the verb should always be `bench`. Avoid namespacing
|
verb should always be `test` and for benchmarks the verb should always be
|
||||||
function names with some arbitrary word. Avoid abbreviating words in function names.
|
`bench`. Avoid namespacing function names with some arbitrary word. Avoid
|
||||||
|
abbreviating words in function names.
|
||||||
|
|
||||||
* As they say, "When in Rome, do as the Romans do." A good patch should acknowledge the coding
|
* As they say, "When in Rome, do as the Romans do." A good patch should
|
||||||
conventions of the code that surrounds it, even in the case where that code has not yet been
|
acknowledge the coding conventions of the code that surrounds it, even in the
|
||||||
updated to meet the conventions described here.
|
case where that code has not yet been updated to meet the conventions described
|
||||||
|
here.
|
||||||
|
|
||||||
|
|
||||||
Terminology
|
## Terminology
|
||||||
---
|
|
||||||
|
|
||||||
Inventing new terms is allowed, but should only be done when the term is widely used and
|
Inventing new terms is allowed, but should only be done when the term is widely
|
||||||
understood. Avoid introducing new 3-letter terms, which can be confused with 3-letter acronyms.
|
used and understood. Avoid introducing new 3-letter terms, which can be
|
||||||
|
confused with 3-letter acronyms.
|
||||||
|
|
||||||
[Terms currently in use](book/src/terminology.md)
|
[Terms currently in use](book/src/terminology.md)
|
||||||
|
|
||||||
|
|
||||||
Design Proposals
|
## Design Proposals
|
||||||
---
|
|
||||||
|
|
||||||
Solana's architecture is described by a book generated from markdown files in
|
Solana's architecture is described by a book generated from markdown files in
|
||||||
the `book/src/` directory, maintained by an *editor* (currently @garious). To
|
the `book/src/` directory, maintained by an *editor* (currently @garious). To
|
||||||
add a design proposal, you'll need to at least propose a change the content
|
add a design proposal, you'll need to at least propose a change the content
|
||||||
under the [Accepted Design
|
under the [Accepted Design
|
||||||
Proposals](https://docs.solana.com/book/v/master/proposals) chapter.
|
Proposals](https://docs.solana.com/book/v/master/proposals) chapter. Here's
|
||||||
Here's the full process:
|
the full process:
|
||||||
|
|
||||||
1. Propose a design by creating a PR that adds a markdown document to the
|
1. Propose a design by creating a PR that adds a markdown document to the
|
||||||
directory `book/src/` and references it from the [table of
|
directory `book/src/` and references it from the [table of
|
||||||
contents](book/src/SUMMARY.md). Add any relevant *maintainers* to the PR review.
|
contents](book/src/SUMMARY.md). Add any relevant *maintainers* to the PR
|
||||||
|
review.
|
||||||
2. The PR being merged indicates your proposed change was accepted and that the
|
2. The PR being merged indicates your proposed change was accepted and that the
|
||||||
maintainers support your plan of attack.
|
maintainers support your plan of attack.
|
||||||
3. Submit PRs that implement the proposal. When the implementation reveals the
|
3. Submit PRs that implement the proposal. When the implementation reveals the
|
||||||
need for tweaks to the proposal, be sure to update the proposal and have
|
need for tweaks to the proposal, be sure to update the proposal and have that
|
||||||
that change reviewed by the same people as in step 1.
|
change reviewed by the same people as in step 1.
|
||||||
4. Once the implementation is complete, submit a PR that moves the link from
|
4. Once the implementation is complete, submit a PR that moves the link from
|
||||||
the Accepted Proposals to the Implemented Proposals section.
|
the Accepted Proposals to the Implemented Proposals section.
|
||||||
|
3526
Cargo.lock
generated
62
Cargo.toml
@ -3,62 +3,62 @@ members = [
|
|||||||
"bench-exchange",
|
"bench-exchange",
|
||||||
"bench-streamer",
|
"bench-streamer",
|
||||||
"bench-tps",
|
"bench-tps",
|
||||||
"banking_bench",
|
"banking-bench",
|
||||||
|
"chacha",
|
||||||
|
"chacha-cuda",
|
||||||
"chacha-sys",
|
"chacha-sys",
|
||||||
|
"cli-config",
|
||||||
"client",
|
"client",
|
||||||
"core",
|
"core",
|
||||||
"drone",
|
"faucet",
|
||||||
|
"perf",
|
||||||
"validator",
|
"validator",
|
||||||
"genesis",
|
"genesis",
|
||||||
"genesis_programs",
|
"genesis-programs",
|
||||||
"gossip",
|
"gossip",
|
||||||
"install",
|
"install",
|
||||||
"keygen",
|
"keygen",
|
||||||
"ledger",
|
"ledger",
|
||||||
"ledger-tool",
|
"ledger-tool",
|
||||||
"local_cluster",
|
"local-cluster",
|
||||||
"logger",
|
"logger",
|
||||||
|
"log-analyzer",
|
||||||
"merkle-tree",
|
"merkle-tree",
|
||||||
"measure",
|
"measure",
|
||||||
"metrics",
|
"metrics",
|
||||||
"programs/bpf_loader_api",
|
"net-shaper",
|
||||||
"programs/bpf_loader_program",
|
"programs/bpf_loader",
|
||||||
"programs/budget_api",
|
"programs/budget",
|
||||||
"programs/budget_program",
|
"programs/btc_spv",
|
||||||
"programs/btc_spv_program",
|
|
||||||
"programs/btc_spv_api",
|
|
||||||
"programs/btc_spv_bin",
|
"programs/btc_spv_bin",
|
||||||
"programs/config_api",
|
"programs/config",
|
||||||
"programs/config_program",
|
"programs/exchange",
|
||||||
"programs/config_tests",
|
"programs/failure",
|
||||||
"programs/exchange_api",
|
"programs/noop",
|
||||||
"programs/exchange_program",
|
"programs/ownable",
|
||||||
"programs/failure_program",
|
"programs/stake",
|
||||||
"programs/move_loader_api",
|
"programs/storage",
|
||||||
"programs/move_loader_program",
|
"programs/vest",
|
||||||
"programs/librapay_api",
|
"programs/vote",
|
||||||
"programs/noop_program",
|
|
||||||
"programs/stake_api",
|
|
||||||
"programs/stake_program",
|
|
||||||
"programs/stake_tests",
|
|
||||||
"programs/storage_api",
|
|
||||||
"programs/storage_program",
|
|
||||||
"programs/vest_api",
|
|
||||||
"programs/vest_program",
|
|
||||||
"programs/vote_api",
|
|
||||||
"programs/vote_program",
|
|
||||||
"archiver",
|
"archiver",
|
||||||
|
"archiver-lib",
|
||||||
|
"archiver-utils",
|
||||||
|
"remote-wallet",
|
||||||
"runtime",
|
"runtime",
|
||||||
"sdk",
|
"sdk",
|
||||||
"sdk-c",
|
"sdk-c",
|
||||||
|
"scripts",
|
||||||
|
"sys-tuner",
|
||||||
"upload-perf",
|
"upload-perf",
|
||||||
"netutil",
|
"net-utils",
|
||||||
"fixed-buf",
|
|
||||||
"vote-signer",
|
"vote-signer",
|
||||||
"cli",
|
"cli",
|
||||||
"rayon-threadlimit",
|
"rayon-threadlimit",
|
||||||
|
"watchtower",
|
||||||
]
|
]
|
||||||
|
|
||||||
exclude = [
|
exclude = [
|
||||||
"programs/bpf",
|
"programs/bpf",
|
||||||
|
"programs/move_loader",
|
||||||
|
"programs/librapay",
|
||||||
]
|
]
|
||||||
|
@ -78,7 +78,7 @@ $ source $HOME/.cargo/env
|
|||||||
$ rustup component add rustfmt
|
$ rustup component add rustfmt
|
||||||
```
|
```
|
||||||
|
|
||||||
If your rustc version is lower than 1.38.0, please update it:
|
If your rustc version is lower than 1.39.0, please update it:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ rustup update
|
$ rustup update
|
||||||
|
19
RELEASE.md
@ -140,25 +140,6 @@ TODO: Documentation update procedure is WIP as we move to gitbook
|
|||||||
|
|
||||||
Document the new recommended version by updating `book/src/running-archiver.md` and `book/src/validator-testnet.md` on the release (beta) branch to point at the `solana-install` for the upcoming release version.
|
Document the new recommended version by updating `book/src/running-archiver.md` and `book/src/validator-testnet.md` on the release (beta) branch to point at the `solana-install` for the upcoming release version.
|
||||||
|
|
||||||
#### Publish updated Book
|
|
||||||
We maintain three copies of the "book" as official documentation:
|
|
||||||
|
|
||||||
1) "Book" is the documentation for the latest official release. This should get manually updated whenever a new release is made. It is published here:
|
|
||||||
https://solana-labs.github.io/book/
|
|
||||||
|
|
||||||
2) "Book-edge" tracks the tip of the master branch and updates automatically.
|
|
||||||
https://solana-labs.github.io/book-edge/
|
|
||||||
|
|
||||||
3) "Book-beta" tracks the tip of the beta branch and updates automatically.
|
|
||||||
https://solana-labs.github.io/book-beta/
|
|
||||||
|
|
||||||
To manually trigger an update of the "Book", create a new job of the manual-update-book pipeline.
|
|
||||||
Set the tag of the latest release as the PUBLISH_BOOK_TAG environment variable.
|
|
||||||
```bash
|
|
||||||
PUBLISH_BOOK_TAG=v0.16.6
|
|
||||||
```
|
|
||||||
https://buildkite.com/solana-labs/manual-update-book
|
|
||||||
|
|
||||||
### Update software on testnet.solana.com
|
### Update software on testnet.solana.com
|
||||||
|
|
||||||
The testnet running on testnet.solana.com is set to use a fixed release tag
|
The testnet running on testnet.solana.com is set to use a fixed release tag
|
||||||
|
39
archiver-lib/Cargo.toml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
[package]
|
||||||
|
name = "solana-archiver-lib"
|
||||||
|
version = "0.23.3"
|
||||||
|
description = "Solana Archiver Library"
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bincode = "1.2.1"
|
||||||
|
crossbeam-channel = "0.3"
|
||||||
|
ed25519-dalek = "=1.0.0-pre.1"
|
||||||
|
log = "0.4.8"
|
||||||
|
rand = "0.6.5"
|
||||||
|
rand_chacha = "0.1.1"
|
||||||
|
solana-client = { path = "../client", version = "0.23.3" }
|
||||||
|
solana-storage-program = { path = "../programs/storage", version = "0.23.3" }
|
||||||
|
thiserror = "1.0"
|
||||||
|
serde = "1.0.104"
|
||||||
|
serde_json = "1.0.44"
|
||||||
|
serde_derive = "1.0.103"
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "0.23.3" }
|
||||||
|
solana-chacha = { path = "../chacha", version = "0.23.3" }
|
||||||
|
solana-chacha-sys = { path = "../chacha-sys", version = "0.23.3" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "0.23.3" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
|
solana-perf = { path = "../perf", version = "0.23.3" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.23.3" }
|
||||||
|
solana-core = { path = "../core", version = "0.23.3" }
|
||||||
|
solana-archiver-utils = { path = "../archiver-utils", version = "0.23.3" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.23.3" }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
hex = "0.4.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "solana_archiver_lib"
|
@ -1,52 +1,64 @@
|
|||||||
use crate::chacha::{chacha_cbc_encrypt_ledger, CHACHA_BLOCK_SIZE};
|
use crate::result::ArchiverError;
|
||||||
use crate::cluster_info::{ClusterInfo, Node, VALIDATOR_PORT_RANGE};
|
use crossbeam_channel::unbounded;
|
||||||
use crate::contact_info::ContactInfo;
|
use ed25519_dalek;
|
||||||
use crate::gossip_service::GossipService;
|
use rand::{thread_rng, Rng, SeedableRng};
|
||||||
use crate::packet::to_shared_blob;
|
|
||||||
use crate::recycler::Recycler;
|
|
||||||
use crate::repair_service;
|
|
||||||
use crate::repair_service::{RepairService, RepairSlotRange, RepairStrategy};
|
|
||||||
use crate::result::{Error, Result};
|
|
||||||
use crate::service::Service;
|
|
||||||
use crate::shred_fetch_stage::ShredFetchStage;
|
|
||||||
use crate::storage_stage::NUM_STORAGE_SAMPLES;
|
|
||||||
use crate::streamer::{receiver, responder, PacketReceiver};
|
|
||||||
use crate::window_service::WindowService;
|
|
||||||
use bincode::deserialize;
|
|
||||||
use rand::thread_rng;
|
|
||||||
use rand::Rng;
|
|
||||||
use rand::SeedableRng;
|
|
||||||
use rand_chacha::ChaChaRng;
|
use rand_chacha::ChaChaRng;
|
||||||
use solana_client::rpc_client::RpcClient;
|
use solana_archiver_utils::sample_file;
|
||||||
use solana_client::rpc_request::RpcRequest;
|
use solana_chacha::chacha::{chacha_cbc_encrypt_ledger, CHACHA_BLOCK_SIZE};
|
||||||
use solana_client::thin_client::ThinClient;
|
use solana_client::{
|
||||||
use solana_ed25519_dalek as ed25519_dalek;
|
rpc_client::RpcClient, rpc_request::RpcRequest, rpc_response::RpcStorageTurn,
|
||||||
use solana_ledger::blocktree::Blocktree;
|
thin_client::ThinClient,
|
||||||
use solana_ledger::leader_schedule_cache::LeaderScheduleCache;
|
};
|
||||||
use solana_ledger::shred::Shred;
|
use solana_core::{
|
||||||
use solana_netutil::bind_in_range;
|
cluster_info::{ClusterInfo, Node, VALIDATOR_PORT_RANGE},
|
||||||
use solana_sdk::account_utils::State;
|
contact_info::ContactInfo,
|
||||||
use solana_sdk::client::{AsyncClient, SyncClient};
|
gossip_service::GossipService,
|
||||||
use solana_sdk::clock::{get_complete_segment_from_slot, get_segment_from_slot};
|
packet::{limited_deserialize, PACKET_DATA_SIZE},
|
||||||
use solana_sdk::hash::{Hash, Hasher};
|
repair_service,
|
||||||
use solana_sdk::message::Message;
|
repair_service::{RepairService, RepairSlotRange, RepairStrategy},
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil, Signature};
|
serve_repair::ServeRepair,
|
||||||
use solana_sdk::timing::timestamp;
|
shred_fetch_stage::ShredFetchStage,
|
||||||
use solana_sdk::transaction::Transaction;
|
sigverify_stage::{DisabledSigVerifier, SigVerifyStage},
|
||||||
use solana_sdk::transport::TransportError;
|
storage_stage::NUM_STORAGE_SAMPLES,
|
||||||
use solana_storage_api::storage_contract::StorageContract;
|
streamer::{receiver, responder, PacketReceiver},
|
||||||
use solana_storage_api::storage_instruction::{self, StorageAccountType};
|
window_service::WindowService,
|
||||||
use std::fs::File;
|
};
|
||||||
use std::io::{self, BufReader, ErrorKind, Read, Seek, SeekFrom};
|
use solana_ledger::{
|
||||||
use std::mem::size_of;
|
blockstore::Blockstore, leader_schedule_cache::LeaderScheduleCache, shred::Shred,
|
||||||
use std::net::{SocketAddr, UdpSocket};
|
};
|
||||||
use std::path::{Path, PathBuf};
|
use solana_net_utils::bind_in_range;
|
||||||
use std::result;
|
use solana_perf::packet::Packets;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use solana_perf::recycler::Recycler;
|
||||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
use solana_sdk::packet::Packet;
|
||||||
use std::sync::{Arc, RwLock};
|
use solana_sdk::{
|
||||||
use std::thread::{sleep, spawn, JoinHandle};
|
account_utils::StateMut,
|
||||||
use std::time::Duration;
|
client::{AsyncClient, SyncClient},
|
||||||
|
clock::{get_complete_segment_from_slot, get_segment_from_slot, Slot},
|
||||||
|
commitment_config::CommitmentConfig,
|
||||||
|
hash::Hash,
|
||||||
|
message::Message,
|
||||||
|
signature::{Keypair, KeypairUtil, Signature},
|
||||||
|
timing::timestamp,
|
||||||
|
transaction::Transaction,
|
||||||
|
transport::TransportError,
|
||||||
|
};
|
||||||
|
use solana_storage_program::{
|
||||||
|
storage_contract::StorageContract,
|
||||||
|
storage_instruction::{self, StorageAccountType},
|
||||||
|
};
|
||||||
|
use std::{
|
||||||
|
io::{self, ErrorKind},
|
||||||
|
net::{SocketAddr, UdpSocket},
|
||||||
|
path::{Path, PathBuf},
|
||||||
|
result,
|
||||||
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
|
sync::mpsc::{channel, Receiver, Sender},
|
||||||
|
sync::{Arc, RwLock},
|
||||||
|
thread::{sleep, spawn, JoinHandle},
|
||||||
|
time::Duration,
|
||||||
|
};
|
||||||
|
|
||||||
|
type Result<T> = std::result::Result<T, ArchiverError>;
|
||||||
|
|
||||||
static ENCRYPTED_FILENAME: &str = "ledger.enc";
|
static ENCRYPTED_FILENAME: &str = "ledger.enc";
|
||||||
|
|
||||||
@ -63,7 +75,7 @@ pub struct Archiver {
|
|||||||
// Shared Archiver Meta struct used internally
|
// Shared Archiver Meta struct used internally
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct ArchiverMeta {
|
struct ArchiverMeta {
|
||||||
slot: u64,
|
slot: Slot,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
ledger_path: PathBuf,
|
ledger_path: PathBuf,
|
||||||
signature: Signature,
|
signature: Signature,
|
||||||
@ -72,41 +84,7 @@ struct ArchiverMeta {
|
|||||||
blockhash: Hash,
|
blockhash: Hash,
|
||||||
sha_state: Hash,
|
sha_state: Hash,
|
||||||
num_chacha_blocks: usize,
|
num_chacha_blocks: usize,
|
||||||
}
|
client_commitment: CommitmentConfig,
|
||||||
|
|
||||||
pub(crate) fn sample_file(in_path: &Path, sample_offsets: &[u64]) -> io::Result<Hash> {
|
|
||||||
let in_file = File::open(in_path)?;
|
|
||||||
let metadata = in_file.metadata()?;
|
|
||||||
let mut buffer_file = BufReader::new(in_file);
|
|
||||||
|
|
||||||
let mut hasher = Hasher::default();
|
|
||||||
let sample_size = size_of::<Hash>();
|
|
||||||
let sample_size64 = sample_size as u64;
|
|
||||||
let mut buf = vec![0; sample_size];
|
|
||||||
|
|
||||||
let file_len = metadata.len();
|
|
||||||
if file_len < sample_size64 {
|
|
||||||
return Err(io::Error::new(ErrorKind::Other, "file too short!"));
|
|
||||||
}
|
|
||||||
for offset in sample_offsets {
|
|
||||||
if *offset > (file_len - sample_size64) / sample_size64 {
|
|
||||||
return Err(io::Error::new(ErrorKind::Other, "offset too large"));
|
|
||||||
}
|
|
||||||
buffer_file.seek(SeekFrom::Start(*offset * sample_size64))?;
|
|
||||||
trace!("sampling @ {} ", *offset);
|
|
||||||
match buffer_file.read(&mut buf) {
|
|
||||||
Ok(size) => {
|
|
||||||
assert_eq!(size, buf.len());
|
|
||||||
hasher.hash(&buf);
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
warn!("Error sampling file");
|
|
||||||
return Err(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(hasher.result())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_slot_from_signature(
|
fn get_slot_from_signature(
|
||||||
@ -138,7 +116,7 @@ fn create_request_processor(
|
|||||||
let t_receiver = receiver(storage_socket.clone(), exit, s_reader, recycler, "archiver");
|
let t_receiver = receiver(storage_socket.clone(), exit, s_reader, recycler, "archiver");
|
||||||
thread_handles.push(t_receiver);
|
thread_handles.push(t_receiver);
|
||||||
|
|
||||||
let t_responder = responder("archiver-responder", storage_socket.clone(), r_responder);
|
let t_responder = responder("archiver-responder", storage_socket, r_responder);
|
||||||
thread_handles.push(t_responder);
|
thread_handles.push(t_responder);
|
||||||
|
|
||||||
let exit = exit.clone();
|
let exit = exit.clone();
|
||||||
@ -155,12 +133,11 @@ fn create_request_processor(
|
|||||||
if let Ok(packets) = packets {
|
if let Ok(packets) = packets {
|
||||||
for packet in &packets.packets {
|
for packet in &packets.packets {
|
||||||
let req: result::Result<ArchiverRequest, Box<bincode::ErrorKind>> =
|
let req: result::Result<ArchiverRequest, Box<bincode::ErrorKind>> =
|
||||||
deserialize(&packet.data[..packet.meta.size]);
|
limited_deserialize(&packet.data[..packet.meta.size]);
|
||||||
match req {
|
match req {
|
||||||
Ok(ArchiverRequest::GetSlotHeight(from)) => {
|
Ok(ArchiverRequest::GetSlotHeight(from)) => {
|
||||||
if let Ok(blob) = to_shared_blob(slot, from) {
|
let packet = Packet::from_data(&from, slot);
|
||||||
let _ = s_responder.send(vec![blob]);
|
let _ = s_responder.send(Packets::new(vec![packet]));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
info!("invalid request: {:?}", e);
|
info!("invalid request: {:?}", e);
|
||||||
@ -202,6 +179,7 @@ impl Archiver {
|
|||||||
cluster_entrypoint: ContactInfo,
|
cluster_entrypoint: ContactInfo,
|
||||||
keypair: Arc<Keypair>,
|
keypair: Arc<Keypair>,
|
||||||
storage_keypair: Arc<Keypair>,
|
storage_keypair: Arc<Keypair>,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
|
|
||||||
@ -214,33 +192,32 @@ impl Archiver {
|
|||||||
// Note for now, this ledger will not contain any of the existing entries
|
// Note for now, this ledger will not contain any of the existing entries
|
||||||
// in the ledger located at ledger_path, and will only append on newly received
|
// in the ledger located at ledger_path, and will only append on newly received
|
||||||
// entries after being passed to window_service
|
// entries after being passed to window_service
|
||||||
let blocktree = Arc::new(
|
let blockstore = Arc::new(
|
||||||
Blocktree::open(ledger_path).expect("Expected to be able to open database ledger"),
|
Blockstore::open(ledger_path).expect("Expected to be able to open database ledger"),
|
||||||
);
|
);
|
||||||
|
|
||||||
let gossip_service = GossipService::new(
|
let gossip_service = GossipService::new(&cluster_info, None, node.sockets.gossip, &exit);
|
||||||
&cluster_info,
|
|
||||||
Some(blocktree.clone()),
|
|
||||||
None,
|
|
||||||
node.sockets.gossip,
|
|
||||||
&exit,
|
|
||||||
);
|
|
||||||
|
|
||||||
info!("Connecting to the cluster via {:?}", cluster_entrypoint);
|
info!("Connecting to the cluster via {:?}", cluster_entrypoint);
|
||||||
let (nodes, _) =
|
let (nodes, _) =
|
||||||
match crate::gossip_service::discover_cluster(&cluster_entrypoint.gossip, 1) {
|
match solana_core::gossip_service::discover_cluster(&cluster_entrypoint.gossip, 1) {
|
||||||
Ok(nodes_and_archivers) => nodes_and_archivers,
|
Ok(nodes_and_archivers) => nodes_and_archivers,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
//shutdown services before exiting
|
//shutdown services before exiting
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
gossip_service.join()?;
|
gossip_service.join()?;
|
||||||
return Err(Error::from(e));
|
return Err(e.into());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let client = crate::gossip_service::get_client(&nodes);
|
let client = solana_core::gossip_service::get_client(&nodes);
|
||||||
|
|
||||||
info!("Setting up mining account...");
|
info!("Setting up mining account...");
|
||||||
if let Err(e) = Self::setup_mining_account(&client, &keypair, &storage_keypair) {
|
if let Err(e) = Self::setup_mining_account(
|
||||||
|
&client,
|
||||||
|
&keypair,
|
||||||
|
&storage_keypair,
|
||||||
|
client_commitment.clone(),
|
||||||
|
) {
|
||||||
//shutdown services before exiting
|
//shutdown services before exiting
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
gossip_service.join()?;
|
gossip_service.join()?;
|
||||||
@ -248,20 +225,20 @@ impl Archiver {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let repair_socket = Arc::new(node.sockets.repair);
|
let repair_socket = Arc::new(node.sockets.repair);
|
||||||
let blob_sockets: Vec<Arc<UdpSocket>> =
|
let shred_sockets: Vec<Arc<UdpSocket>> =
|
||||||
node.sockets.tvu.into_iter().map(Arc::new).collect();
|
node.sockets.tvu.into_iter().map(Arc::new).collect();
|
||||||
let blob_forward_sockets: Vec<Arc<UdpSocket>> = node
|
let shred_forward_sockets: Vec<Arc<UdpSocket>> = node
|
||||||
.sockets
|
.sockets
|
||||||
.tvu_forwards
|
.tvu_forwards
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(Arc::new)
|
.map(Arc::new)
|
||||||
.collect();
|
.collect();
|
||||||
let (blob_fetch_sender, blob_fetch_receiver) = channel();
|
let (shred_fetch_sender, shred_fetch_receiver) = channel();
|
||||||
let fetch_stage = ShredFetchStage::new(
|
let fetch_stage = ShredFetchStage::new(
|
||||||
blob_sockets,
|
shred_sockets,
|
||||||
blob_forward_sockets,
|
shred_forward_sockets,
|
||||||
repair_socket.clone(),
|
repair_socket.clone(),
|
||||||
&blob_fetch_sender,
|
&shred_fetch_sender,
|
||||||
&exit,
|
&exit,
|
||||||
);
|
);
|
||||||
let (slot_sender, slot_receiver) = channel();
|
let (slot_sender, slot_receiver) = channel();
|
||||||
@ -273,6 +250,7 @@ impl Archiver {
|
|||||||
let node_info = node.info.clone();
|
let node_info = node.info.clone();
|
||||||
let mut meta = ArchiverMeta {
|
let mut meta = ArchiverMeta {
|
||||||
ledger_path: ledger_path.to_path_buf(),
|
ledger_path: ledger_path.to_path_buf(),
|
||||||
|
client_commitment,
|
||||||
..ArchiverMeta::default()
|
..ArchiverMeta::default()
|
||||||
};
|
};
|
||||||
spawn(move || {
|
spawn(move || {
|
||||||
@ -280,12 +258,12 @@ impl Archiver {
|
|||||||
let window_service = match Self::setup(
|
let window_service = match Self::setup(
|
||||||
&mut meta,
|
&mut meta,
|
||||||
cluster_info.clone(),
|
cluster_info.clone(),
|
||||||
&blocktree,
|
&blockstore,
|
||||||
&exit,
|
&exit,
|
||||||
&node_info,
|
&node_info,
|
||||||
&storage_keypair,
|
&storage_keypair,
|
||||||
repair_socket,
|
repair_socket,
|
||||||
blob_fetch_receiver,
|
shred_fetch_receiver,
|
||||||
slot_sender,
|
slot_sender,
|
||||||
) {
|
) {
|
||||||
Ok(window_service) => window_service,
|
Ok(window_service) => window_service,
|
||||||
@ -306,7 +284,7 @@ impl Archiver {
|
|||||||
// run archiver
|
// run archiver
|
||||||
Self::run(
|
Self::run(
|
||||||
&mut meta,
|
&mut meta,
|
||||||
&blocktree,
|
&blockstore,
|
||||||
cluster_info,
|
cluster_info,
|
||||||
&keypair,
|
&keypair,
|
||||||
&storage_keypair,
|
&storage_keypair,
|
||||||
@ -330,14 +308,14 @@ impl Archiver {
|
|||||||
|
|
||||||
fn run(
|
fn run(
|
||||||
meta: &mut ArchiverMeta,
|
meta: &mut ArchiverMeta,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||||
archiver_keypair: &Arc<Keypair>,
|
archiver_keypair: &Arc<Keypair>,
|
||||||
storage_keypair: &Arc<Keypair>,
|
storage_keypair: &Arc<Keypair>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) {
|
) {
|
||||||
// encrypt segment
|
// encrypt segment
|
||||||
Self::encrypt_ledger(meta, blocktree).expect("ledger encrypt not successful");
|
Self::encrypt_ledger(meta, blockstore).expect("ledger encrypt not successful");
|
||||||
let enc_file_path = meta.ledger_data_file_encrypted.clone();
|
let enc_file_path = meta.ledger_data_file_encrypted.clone();
|
||||||
// do replicate
|
// do replicate
|
||||||
loop {
|
loop {
|
||||||
@ -377,7 +355,12 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
meta.blockhash = storage_blockhash;
|
meta.blockhash = storage_blockhash;
|
||||||
Self::redeem_rewards(&cluster_info, archiver_keypair, storage_keypair);
|
Self::redeem_rewards(
|
||||||
|
&cluster_info,
|
||||||
|
archiver_keypair,
|
||||||
|
storage_keypair,
|
||||||
|
meta.client_commitment.clone(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
@ -386,11 +369,14 @@ impl Archiver {
|
|||||||
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
||||||
archiver_keypair: &Arc<Keypair>,
|
archiver_keypair: &Arc<Keypair>,
|
||||||
storage_keypair: &Arc<Keypair>,
|
storage_keypair: &Arc<Keypair>,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
) {
|
) {
|
||||||
let nodes = cluster_info.read().unwrap().tvu_peers();
|
let nodes = cluster_info.read().unwrap().tvu_peers();
|
||||||
let client = crate::gossip_service::get_client(&nodes);
|
let client = solana_core::gossip_service::get_client(&nodes);
|
||||||
|
|
||||||
if let Ok(Some(account)) = client.get_account(&storage_keypair.pubkey()) {
|
if let Ok(Some(account)) =
|
||||||
|
client.get_account_with_commitment(&storage_keypair.pubkey(), client_commitment.clone())
|
||||||
|
{
|
||||||
if let Ok(StorageContract::ArchiverStorage { validations, .. }) = account.state() {
|
if let Ok(StorageContract::ArchiverStorage { validations, .. }) = account.state() {
|
||||||
if !validations.is_empty() {
|
if !validations.is_empty() {
|
||||||
let ix = storage_instruction::claim_reward(
|
let ix = storage_instruction::claim_reward(
|
||||||
@ -404,7 +390,10 @@ impl Archiver {
|
|||||||
} else {
|
} else {
|
||||||
info!(
|
info!(
|
||||||
"collected mining rewards: Account balance {:?}",
|
"collected mining rewards: Account balance {:?}",
|
||||||
client.get_balance(&archiver_keypair.pubkey())
|
client.get_balance_with_commitment(
|
||||||
|
&archiver_keypair.pubkey(),
|
||||||
|
client_commitment
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -418,23 +407,24 @@ impl Archiver {
|
|||||||
fn setup(
|
fn setup(
|
||||||
meta: &mut ArchiverMeta,
|
meta: &mut ArchiverMeta,
|
||||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
node_info: &ContactInfo,
|
node_info: &ContactInfo,
|
||||||
storage_keypair: &Arc<Keypair>,
|
storage_keypair: &Arc<Keypair>,
|
||||||
repair_socket: Arc<UdpSocket>,
|
repair_socket: Arc<UdpSocket>,
|
||||||
blob_fetch_receiver: PacketReceiver,
|
shred_fetch_receiver: PacketReceiver,
|
||||||
slot_sender: Sender<u64>,
|
slot_sender: Sender<u64>,
|
||||||
) -> Result<(WindowService)> {
|
) -> Result<WindowService> {
|
||||||
let slots_per_segment = match Self::get_segment_config(&cluster_info) {
|
let slots_per_segment =
|
||||||
Ok(slots_per_segment) => slots_per_segment,
|
match Self::get_segment_config(&cluster_info, meta.client_commitment.clone()) {
|
||||||
Err(e) => {
|
Ok(slots_per_segment) => slots_per_segment,
|
||||||
error!("unable to get segment size configuration, exiting...");
|
Err(e) => {
|
||||||
//shutdown services before exiting
|
error!("unable to get segment size configuration, exiting...");
|
||||||
exit.store(true, Ordering::Relaxed);
|
//shutdown services before exiting
|
||||||
return Err(e);
|
exit.store(true, Ordering::Relaxed);
|
||||||
}
|
return Err(e);
|
||||||
};
|
}
|
||||||
|
};
|
||||||
let (segment_blockhash, segment_slot) = match Self::poll_for_segment(
|
let (segment_blockhash, segment_slot) = match Self::poll_for_segment(
|
||||||
&cluster_info,
|
&cluster_info,
|
||||||
slots_per_segment,
|
slots_per_segment,
|
||||||
@ -463,10 +453,18 @@ impl Archiver {
|
|||||||
|
|
||||||
let (retransmit_sender, _) = channel();
|
let (retransmit_sender, _) = channel();
|
||||||
|
|
||||||
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
|
|
||||||
|
let _sigverify_stage = SigVerifyStage::new(
|
||||||
|
shred_fetch_receiver,
|
||||||
|
verified_sender,
|
||||||
|
DisabledSigVerifier::default(),
|
||||||
|
);
|
||||||
|
|
||||||
let window_service = WindowService::new(
|
let window_service = WindowService::new(
|
||||||
blocktree.clone(),
|
blockstore.clone(),
|
||||||
cluster_info.clone(),
|
cluster_info.clone(),
|
||||||
blob_fetch_receiver,
|
verified_receiver,
|
||||||
retransmit_sender,
|
retransmit_sender,
|
||||||
repair_socket,
|
repair_socket,
|
||||||
&exit,
|
&exit,
|
||||||
@ -478,7 +476,7 @@ impl Archiver {
|
|||||||
Self::wait_for_segment_download(
|
Self::wait_for_segment_download(
|
||||||
slot,
|
slot,
|
||||||
slots_per_segment,
|
slots_per_segment,
|
||||||
&blocktree,
|
&blockstore,
|
||||||
&exit,
|
&exit,
|
||||||
&node_info,
|
&node_info,
|
||||||
cluster_info,
|
cluster_info,
|
||||||
@ -487,9 +485,9 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn wait_for_segment_download(
|
fn wait_for_segment_download(
|
||||||
start_slot: u64,
|
start_slot: Slot,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
node_info: &ContactInfo,
|
node_info: &ContactInfo,
|
||||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||||
@ -500,7 +498,7 @@ impl Archiver {
|
|||||||
);
|
);
|
||||||
let mut current_slot = start_slot;
|
let mut current_slot = start_slot;
|
||||||
'outer: loop {
|
'outer: loop {
|
||||||
while blocktree.is_full(current_slot) {
|
while blockstore.is_full(current_slot) {
|
||||||
current_slot += 1;
|
current_slot += 1;
|
||||||
info!("current slot: {}", current_slot);
|
info!("current slot: {}", current_slot);
|
||||||
if current_slot >= start_slot + slots_per_segment {
|
if current_slot >= start_slot + slots_per_segment {
|
||||||
@ -519,13 +517,15 @@ impl Archiver {
|
|||||||
let mut contact_info = node_info.clone();
|
let mut contact_info = node_info.clone();
|
||||||
contact_info.tvu = "0.0.0.0:0".parse().unwrap();
|
contact_info.tvu = "0.0.0.0:0".parse().unwrap();
|
||||||
contact_info.wallclock = timestamp();
|
contact_info.wallclock = timestamp();
|
||||||
|
// copy over the adopted shred_version from the entrypoint
|
||||||
|
contact_info.shred_version = cluster_info.read().unwrap().my_data().shred_version;
|
||||||
{
|
{
|
||||||
let mut cluster_info_w = cluster_info.write().unwrap();
|
let mut cluster_info_w = cluster_info.write().unwrap();
|
||||||
cluster_info_w.insert_self(contact_info);
|
cluster_info_w.insert_self(contact_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encrypt_ledger(meta: &mut ArchiverMeta, blocktree: &Arc<Blocktree>) -> Result<()> {
|
fn encrypt_ledger(meta: &mut ArchiverMeta, blockstore: &Arc<Blockstore>) -> Result<()> {
|
||||||
meta.ledger_data_file_encrypted = meta.ledger_path.join(ENCRYPTED_FILENAME);
|
meta.ledger_data_file_encrypted = meta.ledger_path.join(ENCRYPTED_FILENAME);
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -533,7 +533,7 @@ impl Archiver {
|
|||||||
ivec.copy_from_slice(&meta.signature.as_ref());
|
ivec.copy_from_slice(&meta.signature.as_ref());
|
||||||
|
|
||||||
let num_encrypted_bytes = chacha_cbc_encrypt_ledger(
|
let num_encrypted_bytes = chacha_cbc_encrypt_ledger(
|
||||||
blocktree,
|
blockstore,
|
||||||
meta.slot,
|
meta.slot,
|
||||||
meta.slots_per_segment,
|
meta.slots_per_segment,
|
||||||
&meta.ledger_data_file_encrypted,
|
&meta.ledger_data_file_encrypted,
|
||||||
@ -564,7 +564,7 @@ impl Archiver {
|
|||||||
fn sample_file_to_create_mining_hash(
|
fn sample_file_to_create_mining_hash(
|
||||||
enc_file_path: &Path,
|
enc_file_path: &Path,
|
||||||
sampling_offsets: &[u64],
|
sampling_offsets: &[u64],
|
||||||
) -> Result<(Hash)> {
|
) -> Result<Hash> {
|
||||||
let sha_state = sample_file(enc_file_path, sampling_offsets)?;
|
let sha_state = sample_file(enc_file_path, sampling_offsets)?;
|
||||||
info!("sampled sha_state: {}", sha_state);
|
info!("sampled sha_state: {}", sha_state);
|
||||||
Ok(sha_state)
|
Ok(sha_state)
|
||||||
@ -574,33 +574,32 @@ impl Archiver {
|
|||||||
client: &ThinClient,
|
client: &ThinClient,
|
||||||
keypair: &Keypair,
|
keypair: &Keypair,
|
||||||
storage_keypair: &Keypair,
|
storage_keypair: &Keypair,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
// make sure archiver has some balance
|
// make sure archiver has some balance
|
||||||
info!("checking archiver keypair...");
|
info!("checking archiver keypair...");
|
||||||
if client.poll_balance_with_timeout(
|
if client.poll_balance_with_timeout_and_commitment(
|
||||||
&keypair.pubkey(),
|
&keypair.pubkey(),
|
||||||
&Duration::from_millis(100),
|
&Duration::from_millis(100),
|
||||||
&Duration::from_secs(5),
|
&Duration::from_secs(5),
|
||||||
|
client_commitment.clone(),
|
||||||
)? == 0
|
)? == 0
|
||||||
{
|
{
|
||||||
return Err(
|
return Err(ArchiverError::EmptyStorageAccountBalance);
|
||||||
io::Error::new(io::ErrorKind::Other, "keypair account has no balance").into(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("checking storage account keypair...");
|
info!("checking storage account keypair...");
|
||||||
// check if the storage account exists
|
// check if the storage account exists
|
||||||
let balance = client.poll_get_balance(&storage_keypair.pubkey());
|
let balance = client
|
||||||
|
.poll_get_balance_with_commitment(&storage_keypair.pubkey(), client_commitment.clone());
|
||||||
if balance.is_err() || balance.unwrap() == 0 {
|
if balance.is_err() || balance.unwrap() == 0 {
|
||||||
let blockhash = match client.get_recent_blockhash() {
|
let blockhash =
|
||||||
Ok((blockhash, _)) => blockhash,
|
match client.get_recent_blockhash_with_commitment(client_commitment.clone()) {
|
||||||
Err(_) => {
|
Ok((blockhash, _)) => blockhash,
|
||||||
return Err(Error::IO(<io::Error>::new(
|
Err(e) => {
|
||||||
io::ErrorKind::Other,
|
return Err(ArchiverError::TransportError(e));
|
||||||
"unable to get recent blockhash, can't submit proof",
|
}
|
||||||
)));
|
};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let ix = storage_instruction::create_storage_account(
|
let ix = storage_instruction::create_storage_account(
|
||||||
&keypair.pubkey(),
|
&keypair.pubkey(),
|
||||||
@ -612,7 +611,7 @@ impl Archiver {
|
|||||||
let tx = Transaction::new_signed_instructions(&[keypair], ix, blockhash);
|
let tx = Transaction::new_signed_instructions(&[keypair], ix, blockhash);
|
||||||
let signature = client.async_send_transaction(tx)?;
|
let signature = client.async_send_transaction(tx)?;
|
||||||
client
|
client
|
||||||
.poll_for_signature(&signature)
|
.poll_for_signature_with_commitment(&signature, client_commitment)
|
||||||
.map_err(|err| match err {
|
.map_err(|err| match err {
|
||||||
TransportError::IoError(e) => e,
|
TransportError::IoError(e) => e,
|
||||||
TransportError::TransactionError(_) => io::Error::new(
|
TransportError::TransactionError(_) => io::Error::new(
|
||||||
@ -632,26 +631,33 @@ impl Archiver {
|
|||||||
) {
|
) {
|
||||||
// No point if we've got no storage account...
|
// No point if we've got no storage account...
|
||||||
let nodes = cluster_info.read().unwrap().tvu_peers();
|
let nodes = cluster_info.read().unwrap().tvu_peers();
|
||||||
let client = crate::gossip_service::get_client(&nodes);
|
let client = solana_core::gossip_service::get_client(&nodes);
|
||||||
let storage_balance = client.poll_get_balance(&storage_keypair.pubkey());
|
let storage_balance = client.poll_get_balance_with_commitment(
|
||||||
|
&storage_keypair.pubkey(),
|
||||||
|
meta.client_commitment.clone(),
|
||||||
|
);
|
||||||
if storage_balance.is_err() || storage_balance.unwrap() == 0 {
|
if storage_balance.is_err() || storage_balance.unwrap() == 0 {
|
||||||
error!("Unable to submit mining proof, no storage account");
|
error!("Unable to submit mining proof, no storage account");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// ...or no lamports for fees
|
// ...or no lamports for fees
|
||||||
let balance = client.poll_get_balance(&archiver_keypair.pubkey());
|
let balance = client.poll_get_balance_with_commitment(
|
||||||
|
&archiver_keypair.pubkey(),
|
||||||
|
meta.client_commitment.clone(),
|
||||||
|
);
|
||||||
if balance.is_err() || balance.unwrap() == 0 {
|
if balance.is_err() || balance.unwrap() == 0 {
|
||||||
error!("Unable to submit mining proof, insufficient Archiver Account balance");
|
error!("Unable to submit mining proof, insufficient Archiver Account balance");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let blockhash = match client.get_recent_blockhash() {
|
let blockhash =
|
||||||
Ok((blockhash, _)) => blockhash,
|
match client.get_recent_blockhash_with_commitment(meta.client_commitment.clone()) {
|
||||||
Err(_) => {
|
Ok((blockhash, _)) => blockhash,
|
||||||
error!("unable to get recent blockhash, can't submit proof");
|
Err(_) => {
|
||||||
return;
|
error!("unable to get recent blockhash, can't submit proof");
|
||||||
}
|
return;
|
||||||
};
|
}
|
||||||
|
};
|
||||||
let instruction = storage_instruction::mining_proof(
|
let instruction = storage_instruction::mining_proof(
|
||||||
&storage_keypair.pubkey(),
|
&storage_keypair.pubkey(),
|
||||||
meta.sha_state,
|
meta.sha_state,
|
||||||
@ -686,10 +692,13 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_segment_config(cluster_info: &Arc<RwLock<ClusterInfo>>) -> result::Result<u64, Error> {
|
fn get_segment_config(
|
||||||
|
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
|
) -> Result<u64> {
|
||||||
let rpc_peers = {
|
let rpc_peers = {
|
||||||
let cluster_info = cluster_info.read().unwrap();
|
let cluster_info = cluster_info.read().unwrap();
|
||||||
cluster_info.rpc_peers()
|
cluster_info.all_rpc_peers()
|
||||||
};
|
};
|
||||||
debug!("rpc peers: {:?}", rpc_peers);
|
debug!("rpc peers: {:?}", rpc_peers);
|
||||||
if !rpc_peers.is_empty() {
|
if !rpc_peers.is_empty() {
|
||||||
@ -698,15 +707,19 @@ impl Archiver {
|
|||||||
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
||||||
};
|
};
|
||||||
Ok(rpc_client
|
Ok(rpc_client
|
||||||
.retry_make_rpc_request(&RpcRequest::GetSlotsPerSegment, None, 0)
|
.send(
|
||||||
|
&RpcRequest::GetSlotsPerSegment,
|
||||||
|
serde_json::json!([client_commitment]),
|
||||||
|
0,
|
||||||
|
)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("Error while making rpc request {:?}", err);
|
warn!("Error while making rpc request {:?}", err);
|
||||||
Error::IO(io::Error::new(ErrorKind::Other, "rpc error"))
|
ArchiverError::ClientError(err)
|
||||||
})?
|
})?
|
||||||
.as_u64()
|
.as_u64()
|
||||||
.unwrap())
|
.unwrap())
|
||||||
} else {
|
} else {
|
||||||
Err(io::Error::new(io::ErrorKind::Other, "No RPC peers...".to_string()).into())
|
Err(ArchiverError::NoRpcPeers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,7 +729,7 @@ impl Archiver {
|
|||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
previous_blockhash: &Hash,
|
previous_blockhash: &Hash,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) -> result::Result<(Hash, u64), Error> {
|
) -> Result<(Hash, u64)> {
|
||||||
loop {
|
loop {
|
||||||
let (blockhash, turn_slot) = Self::poll_for_blockhash_and_slot(
|
let (blockhash, turn_slot) = Self::poll_for_blockhash_and_slot(
|
||||||
cluster_info,
|
cluster_info,
|
||||||
@ -736,12 +749,12 @@ impl Archiver {
|
|||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
previous_blockhash: &Hash,
|
previous_blockhash: &Hash,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) -> result::Result<(Hash, u64), Error> {
|
) -> Result<(Hash, u64)> {
|
||||||
info!("waiting for the next turn...");
|
info!("waiting for the next turn...");
|
||||||
loop {
|
loop {
|
||||||
let rpc_peers = {
|
let rpc_peers = {
|
||||||
let cluster_info = cluster_info.read().unwrap();
|
let cluster_info = cluster_info.read().unwrap();
|
||||||
cluster_info.rpc_peers()
|
cluster_info.all_rpc_peers()
|
||||||
};
|
};
|
||||||
debug!("rpc peers: {:?}", rpc_peers);
|
debug!("rpc peers: {:?}", rpc_peers);
|
||||||
if !rpc_peers.is_empty() {
|
if !rpc_peers.is_empty() {
|
||||||
@ -750,18 +763,20 @@ impl Archiver {
|
|||||||
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
||||||
};
|
};
|
||||||
let response = rpc_client
|
let response = rpc_client
|
||||||
.retry_make_rpc_request(&RpcRequest::GetStorageTurn, None, 0)
|
.send(
|
||||||
|
&RpcRequest::GetStorageTurn,
|
||||||
|
serde_json::value::Value::Null,
|
||||||
|
0,
|
||||||
|
)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("Error while making rpc request {:?}", err);
|
warn!("Error while making rpc request {:?}", err);
|
||||||
Error::IO(io::Error::new(ErrorKind::Other, "rpc error"))
|
ArchiverError::ClientError(err)
|
||||||
})?;
|
|
||||||
let (storage_blockhash, turn_slot) =
|
|
||||||
serde_json::from_value::<((String, u64))>(response).map_err(|err| {
|
|
||||||
io::Error::new(
|
|
||||||
io::ErrorKind::Other,
|
|
||||||
format!("Couldn't parse response: {:?}", err),
|
|
||||||
)
|
|
||||||
})?;
|
})?;
|
||||||
|
let RpcStorageTurn {
|
||||||
|
blockhash: storage_blockhash,
|
||||||
|
slot: turn_slot,
|
||||||
|
} = serde_json::from_value::<RpcStorageTurn>(response)
|
||||||
|
.map_err(ArchiverError::JsonError)?;
|
||||||
let turn_blockhash = storage_blockhash.parse().map_err(|err| {
|
let turn_blockhash = storage_blockhash.parse().map_err(|err| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
@ -779,7 +794,7 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if exit.load(Ordering::Relaxed) {
|
if exit.load(Ordering::Relaxed) {
|
||||||
return Err(Error::IO(io::Error::new(
|
return Err(ArchiverError::IO(io::Error::new(
|
||||||
ErrorKind::Other,
|
ErrorKind::Other,
|
||||||
"exit signalled...",
|
"exit signalled...",
|
||||||
)));
|
)));
|
||||||
@ -788,19 +803,19 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ask an archiver to populate a given blocktree with its segment.
|
/// Ask an archiver to populate a given blockstore with its segment.
|
||||||
/// Return the slot at the start of the archiver's segment
|
/// Return the slot at the start of the archiver's segment
|
||||||
///
|
///
|
||||||
/// It is recommended to use a temporary blocktree for this since the download will not verify
|
/// It is recommended to use a temporary blockstore for this since the download will not verify
|
||||||
/// blobs received and might impact the chaining of blobs across slots
|
/// shreds received and might impact the chaining of shreds across slots
|
||||||
pub fn download_from_archiver(
|
pub fn download_from_archiver(
|
||||||
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
serve_repair: &ServeRepair,
|
||||||
archiver_info: &ContactInfo,
|
archiver_info: &ContactInfo,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
) -> Result<(u64)> {
|
) -> Result<u64> {
|
||||||
// Create a client which downloads from the archiver and see that it
|
// Create a client which downloads from the archiver and see that it
|
||||||
// can respond with blobs.
|
// can respond with shreds.
|
||||||
let start_slot = Self::get_archiver_segment_slot(archiver_info.storage_addr);
|
let start_slot = Self::get_archiver_segment_slot(archiver_info.storage_addr);
|
||||||
info!("Archiver download: start at {}", start_slot);
|
info!("Archiver download: start at {}", start_slot);
|
||||||
|
|
||||||
@ -810,14 +825,14 @@ impl Archiver {
|
|||||||
let t_receiver = receiver(
|
let t_receiver = receiver(
|
||||||
repair_socket.clone(),
|
repair_socket.clone(),
|
||||||
&exit,
|
&exit,
|
||||||
s_reader.clone(),
|
s_reader,
|
||||||
Recycler::default(),
|
Recycler::default(),
|
||||||
"archiver_reeciver",
|
"archiver_reeciver",
|
||||||
);
|
);
|
||||||
let id = cluster_info.read().unwrap().id();
|
let id = serve_repair.keypair().pubkey();
|
||||||
info!(
|
info!(
|
||||||
"Sending repair requests from: {} to: {}",
|
"Sending repair requests from: {} to: {}",
|
||||||
cluster_info.read().unwrap().my_data().id,
|
serve_repair.my_info().id,
|
||||||
archiver_info.gossip
|
archiver_info.gossip
|
||||||
);
|
);
|
||||||
let repair_slot_range = RepairSlotRange {
|
let repair_slot_range = RepairSlotRange {
|
||||||
@ -828,7 +843,7 @@ impl Archiver {
|
|||||||
for _ in 0..120 {
|
for _ in 0..120 {
|
||||||
// Strategy used by archivers
|
// Strategy used by archivers
|
||||||
let repairs = RepairService::generate_repairs_in_range(
|
let repairs = RepairService::generate_repairs_in_range(
|
||||||
blocktree,
|
blockstore,
|
||||||
repair_service::MAX_REPAIR_LENGTH,
|
repair_service::MAX_REPAIR_LENGTH,
|
||||||
&repair_slot_range,
|
&repair_slot_range,
|
||||||
);
|
);
|
||||||
@ -837,9 +852,7 @@ impl Archiver {
|
|||||||
let reqs: Vec<_> = repairs
|
let reqs: Vec<_> = repairs
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|repair_request| {
|
.filter_map(|repair_request| {
|
||||||
cluster_info
|
serve_repair
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.map_repair_request(&repair_request)
|
.map_repair_request(&repair_request)
|
||||||
.map(|result| ((archiver_info.gossip, result), repair_request))
|
.map(|result| ((archiver_info.gossip, result), repair_request))
|
||||||
.ok()
|
.ok()
|
||||||
@ -867,17 +880,17 @@ impl Archiver {
|
|||||||
let res = r_reader.recv_timeout(Duration::new(1, 0));
|
let res = r_reader.recv_timeout(Duration::new(1, 0));
|
||||||
if let Ok(mut packets) = res {
|
if let Ok(mut packets) = res {
|
||||||
while let Ok(mut more) = r_reader.try_recv() {
|
while let Ok(mut more) = r_reader.try_recv() {
|
||||||
packets.packets.append(&mut more.packets);
|
packets.packets.append_pinned(&mut more.packets);
|
||||||
}
|
}
|
||||||
let shreds: Vec<Shred> = packets
|
let shreds: Vec<Shred> = packets
|
||||||
.packets
|
.packets
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|p| Shred::new_from_serialized_shred(p.data.to_vec()).ok())
|
.filter_map(|p| Shred::new_from_serialized_shred(p.data.to_vec()).ok())
|
||||||
.collect();
|
.collect();
|
||||||
blocktree.insert_shreds(shreds, None)?;
|
blockstore.insert_shreds(shreds, None, false)?;
|
||||||
}
|
}
|
||||||
// check if all the slots in the segment are complete
|
// check if all the slots in the segment are complete
|
||||||
if Self::segment_complete(start_slot, slots_per_segment, blocktree) {
|
if Self::segment_complete(start_slot, slots_per_segment, blockstore) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(500));
|
sleep(Duration::from_millis(500));
|
||||||
@ -886,21 +899,19 @@ impl Archiver {
|
|||||||
t_receiver.join().unwrap();
|
t_receiver.join().unwrap();
|
||||||
|
|
||||||
// check if all the slots in the segment are complete
|
// check if all the slots in the segment are complete
|
||||||
if !Self::segment_complete(start_slot, slots_per_segment, blocktree) {
|
if !Self::segment_complete(start_slot, slots_per_segment, blockstore) {
|
||||||
return Err(
|
return Err(ArchiverError::SegmentDownloadError);
|
||||||
io::Error::new(ErrorKind::Other, "Unable to download the full segment").into(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Ok(start_slot)
|
Ok(start_slot)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn segment_complete(
|
fn segment_complete(
|
||||||
start_slot: u64,
|
start_slot: Slot,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
for slot in start_slot..(start_slot + slots_per_segment) {
|
for slot in start_slot..(start_slot + slots_per_segment) {
|
||||||
if !blocktree.is_full(slot) {
|
if !blockstore.is_full(slot) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -919,81 +930,16 @@ impl Archiver {
|
|||||||
socket.send_to(&serialized_req, to).unwrap();
|
socket.send_to(&serialized_req, to).unwrap();
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 1024];
|
||||||
if let Ok((size, _addr)) = socket.recv_from(&mut buf) {
|
if let Ok((size, _addr)) = socket.recv_from(&mut buf) {
|
||||||
return deserialize(&buf[..size]).unwrap();
|
// Ignore bad packet and try again
|
||||||
|
if let Ok(slot) = bincode::config()
|
||||||
|
.limit(PACKET_DATA_SIZE as u64)
|
||||||
|
.deserialize(&buf[..size])
|
||||||
|
{
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(500));
|
sleep(Duration::from_millis(500));
|
||||||
}
|
}
|
||||||
panic!("Couldn't get segment slot from archiver!");
|
panic!("Couldn't get segment slot from archiver!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use std::fs::{create_dir_all, remove_file};
|
|
||||||
use std::io::Write;
|
|
||||||
|
|
||||||
fn tmp_file_path(name: &str) -> PathBuf {
|
|
||||||
use std::env;
|
|
||||||
let out_dir = env::var("FARF_DIR").unwrap_or_else(|_| "farf".to_string());
|
|
||||||
let keypair = Keypair::new();
|
|
||||||
|
|
||||||
let mut path = PathBuf::new();
|
|
||||||
path.push(out_dir);
|
|
||||||
path.push("tmp");
|
|
||||||
create_dir_all(&path).unwrap();
|
|
||||||
|
|
||||||
path.push(format!("{}-{}", name, keypair.pubkey()));
|
|
||||||
path
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sample_file() {
|
|
||||||
solana_logger::setup();
|
|
||||||
let in_path = tmp_file_path("test_sample_file_input.txt");
|
|
||||||
let num_strings = 4096;
|
|
||||||
let string = "12foobar";
|
|
||||||
{
|
|
||||||
let mut in_file = File::create(&in_path).unwrap();
|
|
||||||
for _ in 0..num_strings {
|
|
||||||
in_file.write(string.as_bytes()).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let num_samples = (string.len() * num_strings / size_of::<Hash>()) as u64;
|
|
||||||
let samples: Vec<_> = (0..num_samples).collect();
|
|
||||||
let res = sample_file(&in_path, samples.as_slice());
|
|
||||||
let ref_hash: Hash = Hash::new(&[
|
|
||||||
173, 251, 182, 165, 10, 54, 33, 150, 133, 226, 106, 150, 99, 192, 179, 1, 230, 144,
|
|
||||||
151, 126, 18, 191, 54, 67, 249, 140, 230, 160, 56, 30, 170, 52,
|
|
||||||
]);
|
|
||||||
let res = res.unwrap();
|
|
||||||
assert_eq!(res, ref_hash);
|
|
||||||
|
|
||||||
// Sample just past the end
|
|
||||||
assert!(sample_file(&in_path, &[num_samples]).is_err());
|
|
||||||
remove_file(&in_path).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sample_file_invalid_offset() {
|
|
||||||
let in_path = tmp_file_path("test_sample_file_invalid_offset_input.txt");
|
|
||||||
{
|
|
||||||
let mut in_file = File::create(&in_path).unwrap();
|
|
||||||
for _ in 0..4096 {
|
|
||||||
in_file.write("123456foobar".as_bytes()).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let samples = [0, 200000];
|
|
||||||
let res = sample_file(&in_path, &samples);
|
|
||||||
assert!(res.is_err());
|
|
||||||
remove_file(in_path).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sample_file_missing_file() {
|
|
||||||
let in_path = tmp_file_path("test_sample_file_that_doesnt_exist.txt");
|
|
||||||
let samples = [0, 5];
|
|
||||||
let res = sample_file(&in_path, &samples);
|
|
||||||
assert!(res.is_err());
|
|
||||||
}
|
|
||||||
}
|
|
11
archiver-lib/src/lib.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate solana_metrics;
|
||||||
|
|
||||||
|
pub mod archiver;
|
||||||
|
mod result;
|
48
archiver-lib/src/result.rs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
use serde_json;
|
||||||
|
use solana_client::client_error;
|
||||||
|
use solana_ledger::blockstore;
|
||||||
|
use solana_sdk::transport;
|
||||||
|
use std::any::Any;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum ArchiverError {
|
||||||
|
#[error("IO error")]
|
||||||
|
IO(#[from] std::io::Error),
|
||||||
|
|
||||||
|
#[error("blockstore error")]
|
||||||
|
BlockstoreError(#[from] blockstore::BlockstoreError),
|
||||||
|
|
||||||
|
#[error("crossbeam error")]
|
||||||
|
CrossbeamSendError(#[from] crossbeam_channel::SendError<u64>),
|
||||||
|
|
||||||
|
#[error("send error")]
|
||||||
|
SendError(#[from] std::sync::mpsc::SendError<u64>),
|
||||||
|
|
||||||
|
#[error("join error")]
|
||||||
|
JoinError(Box<dyn Any + Send + 'static>),
|
||||||
|
|
||||||
|
#[error("transport error")]
|
||||||
|
TransportError(#[from] transport::TransportError),
|
||||||
|
|
||||||
|
#[error("client error")]
|
||||||
|
ClientError(#[from] client_error::ClientError),
|
||||||
|
|
||||||
|
#[error("Json parsing error")]
|
||||||
|
JsonError(#[from] serde_json::error::Error),
|
||||||
|
|
||||||
|
#[error("Storage account has no balance")]
|
||||||
|
EmptyStorageAccountBalance,
|
||||||
|
|
||||||
|
#[error("No RPC peers..")]
|
||||||
|
NoRpcPeers,
|
||||||
|
|
||||||
|
#[error("Couldn't download full segment")]
|
||||||
|
SegmentDownloadError,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::convert::From<Box<dyn Any + Send + 'static>> for ArchiverError {
|
||||||
|
fn from(e: Box<dyn Any + Send + 'static>) -> ArchiverError {
|
||||||
|
ArchiverError::JoinError(e)
|
||||||
|
}
|
||||||
|
}
|
26
archiver-utils/Cargo.toml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
[package]
|
||||||
|
name = "solana-archiver-utils"
|
||||||
|
version = "0.23.3"
|
||||||
|
description = "Solana Archiver Utils"
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log = "0.4.8"
|
||||||
|
rand = "0.6.5"
|
||||||
|
rand_chacha = "0.1.1"
|
||||||
|
solana-chacha = { path = "../chacha", version = "0.23.3" }
|
||||||
|
solana-chacha-sys = { path = "../chacha-sys", version = "0.23.3" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "0.23.3" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
|
solana-perf = { path = "../perf", version = "0.23.3" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.23.3" }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
hex = "0.4.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "solana_archiver_utils"
|
120
archiver-utils/src/lib.rs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
|
use solana_sdk::hash::{Hash, Hasher};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{self, BufReader, ErrorKind, Read, Seek, SeekFrom};
|
||||||
|
use std::mem::size_of;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
pub fn sample_file(in_path: &Path, sample_offsets: &[u64]) -> io::Result<Hash> {
|
||||||
|
let in_file = File::open(in_path)?;
|
||||||
|
let metadata = in_file.metadata()?;
|
||||||
|
let mut buffer_file = BufReader::new(in_file);
|
||||||
|
|
||||||
|
let mut hasher = Hasher::default();
|
||||||
|
let sample_size = size_of::<Hash>();
|
||||||
|
let sample_size64 = sample_size as u64;
|
||||||
|
let mut buf = vec![0; sample_size];
|
||||||
|
|
||||||
|
let file_len = metadata.len();
|
||||||
|
if file_len < sample_size64 {
|
||||||
|
return Err(io::Error::new(ErrorKind::Other, "file too short!"));
|
||||||
|
}
|
||||||
|
for offset in sample_offsets {
|
||||||
|
if *offset > (file_len - sample_size64) / sample_size64 {
|
||||||
|
return Err(io::Error::new(ErrorKind::Other, "offset too large"));
|
||||||
|
}
|
||||||
|
buffer_file.seek(SeekFrom::Start(*offset * sample_size64))?;
|
||||||
|
trace!("sampling @ {} ", *offset);
|
||||||
|
match buffer_file.read(&mut buf) {
|
||||||
|
Ok(size) => {
|
||||||
|
assert_eq!(size, buf.len());
|
||||||
|
hasher.hash(&buf);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error sampling file");
|
||||||
|
return Err(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(hasher.result())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
|
use std::fs::{create_dir_all, remove_file};
|
||||||
|
use std::io::Write;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
extern crate hex;
|
||||||
|
|
||||||
|
fn tmp_file_path(name: &str) -> PathBuf {
|
||||||
|
use std::env;
|
||||||
|
let out_dir = env::var("FARF_DIR").unwrap_or_else(|_| "farf".to_string());
|
||||||
|
let mut rand_bits = [0u8; 32];
|
||||||
|
thread_rng().fill(&mut rand_bits[..]);
|
||||||
|
|
||||||
|
let mut path = PathBuf::new();
|
||||||
|
path.push(out_dir);
|
||||||
|
path.push("tmp");
|
||||||
|
create_dir_all(&path).unwrap();
|
||||||
|
|
||||||
|
path.push(format!("{}-{:?}", name, hex::encode(rand_bits)));
|
||||||
|
println!("path: {:?}", path);
|
||||||
|
path
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sample_file() {
|
||||||
|
solana_logger::setup();
|
||||||
|
let in_path = tmp_file_path("test_sample_file_input.txt");
|
||||||
|
let num_strings = 4096;
|
||||||
|
let string = "12foobar";
|
||||||
|
{
|
||||||
|
let mut in_file = File::create(&in_path).unwrap();
|
||||||
|
for _ in 0..num_strings {
|
||||||
|
in_file.write(string.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let num_samples = (string.len() * num_strings / size_of::<Hash>()) as u64;
|
||||||
|
let samples: Vec<_> = (0..num_samples).collect();
|
||||||
|
let res = sample_file(&in_path, samples.as_slice());
|
||||||
|
let ref_hash: Hash = Hash::new(&[
|
||||||
|
173, 251, 182, 165, 10, 54, 33, 150, 133, 226, 106, 150, 99, 192, 179, 1, 230, 144,
|
||||||
|
151, 126, 18, 191, 54, 67, 249, 140, 230, 160, 56, 30, 170, 52,
|
||||||
|
]);
|
||||||
|
let res = res.unwrap();
|
||||||
|
assert_eq!(res, ref_hash);
|
||||||
|
|
||||||
|
// Sample just past the end
|
||||||
|
assert!(sample_file(&in_path, &[num_samples]).is_err());
|
||||||
|
remove_file(&in_path).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sample_file_invalid_offset() {
|
||||||
|
let in_path = tmp_file_path("test_sample_file_invalid_offset_input.txt");
|
||||||
|
{
|
||||||
|
let mut in_file = File::create(&in_path).unwrap();
|
||||||
|
for _ in 0..4096 {
|
||||||
|
in_file.write("123456foobar".as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let samples = [0, 200000];
|
||||||
|
let res = sample_file(&in_path, &samples);
|
||||||
|
assert!(res.is_err());
|
||||||
|
remove_file(in_path).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sample_file_missing_file() {
|
||||||
|
let in_path = tmp_file_path("test_sample_file_that_doesnt_exist.txt");
|
||||||
|
let samples = [0, 5];
|
||||||
|
let res = sample_file(&in_path, &samples);
|
||||||
|
assert!(res.is_err());
|
||||||
|
}
|
||||||
|
}
|
@ -2,17 +2,19 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-archiver"
|
name = "solana-archiver"
|
||||||
version = "0.20.0"
|
version = "0.23.3"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
console = "0.9.0"
|
console = "0.9.1"
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "0.23.3" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-core = { path = "../core", version = "0.23.3" }
|
||||||
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-metrics = { path = "../metrics", version = "0.23.3" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
solana-archiver-lib = { path = "../archiver-lib", version = "0.23.3" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "0.23.3" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.23.3" }
|
||||||
|
|
||||||
|
@ -1,31 +1,30 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
use clap::{crate_description, crate_name, App, Arg};
|
||||||
use console::style;
|
use console::style;
|
||||||
use solana_core::archiver::Archiver;
|
use solana_archiver_lib::archiver::Archiver;
|
||||||
use solana_core::cluster_info::{Node, VALIDATOR_PORT_RANGE};
|
use solana_clap_utils::{
|
||||||
use solana_core::contact_info::ContactInfo;
|
input_validators::is_keypair,
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
keypair::{
|
||||||
use std::net::SocketAddr;
|
self, keypair_input, KeypairWithSource, ASK_SEED_PHRASE_ARG,
|
||||||
use std::path::PathBuf;
|
SKIP_SEED_PHRASE_VALIDATION_ARG,
|
||||||
use std::process::exit;
|
},
|
||||||
use std::sync::Arc;
|
};
|
||||||
|
use solana_core::{
|
||||||
// Return an error if a keypair file cannot be parsed.
|
cluster_info::{Node, VALIDATOR_PORT_RANGE},
|
||||||
fn is_keypair(string: String) -> Result<(), String> {
|
contact_info::ContactInfo,
|
||||||
read_keypair_file(&string)
|
};
|
||||||
.map(|_| ())
|
use solana_sdk::{commitment_config::CommitmentConfig, signature::KeypairUtil};
|
||||||
.map_err(|err| format!("{:?}", err))
|
use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc};
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(solana_clap_utils::version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity_keypair")
|
||||||
.short("i")
|
.short("i")
|
||||||
.long("identity")
|
.long("identity-keypair")
|
||||||
.value_name("PATH")
|
.value_name("PATH")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.validator(is_keypair)
|
.validator(is_keypair)
|
||||||
@ -38,7 +37,7 @@ fn main() {
|
|||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(true)
|
.required(true)
|
||||||
.validator(solana_netutil::is_host_port)
|
.validator(solana_net_utils::is_host_port)
|
||||||
.help("Rendezvous with the cluster at this entry point"),
|
.help("Rendezvous with the cluster at this entry point"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
@ -56,58 +55,80 @@ fn main() {
|
|||||||
.long("storage-keypair")
|
.long("storage-keypair")
|
||||||
.value_name("PATH")
|
.value_name("PATH")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(true)
|
|
||||||
.validator(is_keypair)
|
.validator(is_keypair)
|
||||||
.help("File containing the storage account keypair"),
|
.help("File containing the storage account keypair"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name(ASK_SEED_PHRASE_ARG.name)
|
||||||
|
.long(ASK_SEED_PHRASE_ARG.long)
|
||||||
|
.value_name("KEYPAIR NAME")
|
||||||
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
|
.possible_values(&["identity-keypair", "storage-keypair"])
|
||||||
|
.help(ASK_SEED_PHRASE_ARG.help),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name)
|
||||||
|
.long(SKIP_SEED_PHRASE_VALIDATION_ARG.long)
|
||||||
|
.requires(ASK_SEED_PHRASE_ARG.name)
|
||||||
|
.help(SKIP_SEED_PHRASE_VALIDATION_ARG.help),
|
||||||
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
||||||
|
|
||||||
let keypair = if let Some(identity) = matches.value_of("identity") {
|
let identity_keypair = keypair_input(&matches, "identity_keypair")
|
||||||
read_keypair_file(identity).unwrap_or_else(|err| {
|
.unwrap_or_else(|err| {
|
||||||
eprintln!("{}: Unable to open keypair file: {}", err, identity);
|
eprintln!("Identity keypair input failed: {}", err);
|
||||||
exit(1);
|
exit(1);
|
||||||
})
|
})
|
||||||
} else {
|
.keypair;
|
||||||
Keypair::new()
|
let KeypairWithSource {
|
||||||
};
|
keypair: storage_keypair,
|
||||||
let storage_keypair = if let Some(storage_keypair) = matches.value_of("storage_keypair") {
|
source: storage_keypair_source,
|
||||||
read_keypair_file(storage_keypair).unwrap_or_else(|err| {
|
} = keypair_input(&matches, "storage_keypair").unwrap_or_else(|err| {
|
||||||
eprintln!("{}: Unable to open keypair file: {}", err, storage_keypair);
|
eprintln!("Storage keypair input failed: {}", err);
|
||||||
exit(1);
|
exit(1);
|
||||||
})
|
});
|
||||||
} else {
|
if storage_keypair_source == keypair::Source::Generated {
|
||||||
Keypair::new()
|
clap::Error::with_description(
|
||||||
};
|
"The `storage-keypair` argument was not found",
|
||||||
|
clap::ErrorKind::ArgumentNotFound,
|
||||||
|
)
|
||||||
|
.exit();
|
||||||
|
}
|
||||||
|
|
||||||
let entrypoint_addr = matches
|
let entrypoint_addr = matches
|
||||||
.value_of("entrypoint")
|
.value_of("entrypoint")
|
||||||
.map(|entrypoint| {
|
.map(|entrypoint| {
|
||||||
solana_netutil::parse_host_port(entrypoint).expect("failed to parse entrypoint address")
|
solana_net_utils::parse_host_port(entrypoint)
|
||||||
|
.expect("failed to parse entrypoint address")
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let gossip_addr = {
|
let gossip_addr = {
|
||||||
let ip = solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap();
|
let ip = solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap();
|
||||||
let mut addr = SocketAddr::new(ip, 0);
|
let mut addr = SocketAddr::new(ip, 0);
|
||||||
addr.set_ip(solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap());
|
addr.set_ip(solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap());
|
||||||
addr
|
addr
|
||||||
};
|
};
|
||||||
let node =
|
let node = Node::new_archiver_with_external_ip(
|
||||||
Node::new_archiver_with_external_ip(&keypair.pubkey(), &gossip_addr, VALIDATOR_PORT_RANGE);
|
&identity_keypair.pubkey(),
|
||||||
|
&gossip_addr,
|
||||||
|
VALIDATOR_PORT_RANGE,
|
||||||
|
);
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"{} version {} (branch={}, commit={})",
|
"{} version {} (branch={}, commit={})",
|
||||||
style(crate_name!()).bold(),
|
style(crate_name!()).bold(),
|
||||||
crate_version!(),
|
solana_clap_utils::version!(),
|
||||||
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
||||||
option_env!("CI_COMMIT").unwrap_or("unknown")
|
option_env!("CI_COMMIT").unwrap_or("unknown")
|
||||||
);
|
);
|
||||||
solana_metrics::set_host_id(keypair.pubkey().to_string());
|
solana_metrics::set_host_id(identity_keypair.pubkey().to_string());
|
||||||
println!(
|
println!(
|
||||||
"replicating the data with keypair={:?} gossip_addr={:?}",
|
"replicating the data with identity_keypair={:?} gossip_addr={:?}",
|
||||||
keypair.pubkey(),
|
identity_keypair.pubkey(),
|
||||||
gossip_addr
|
gossip_addr
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -116,8 +137,9 @@ fn main() {
|
|||||||
&ledger_path,
|
&ledger_path,
|
||||||
node,
|
node,
|
||||||
entrypoint_info,
|
entrypoint_info,
|
||||||
Arc::new(keypair),
|
Arc::new(identity_keypair),
|
||||||
Arc::new(storage_keypair),
|
Arc::new(storage_keypair),
|
||||||
|
CommitmentConfig::recent(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
20
banking-bench/Cargo.toml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
name = "solana-banking-bench"
|
||||||
|
version = "0.23.3"
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log = "0.4.6"
|
||||||
|
rayon = "1.2.0"
|
||||||
|
solana-core = { path = "../core", version = "0.23.3" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "0.23.3" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.23.3" }
|
||||||
|
solana-measure = { path = "../measure", version = "0.23.3" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.23.3" }
|
||||||
|
rand = "0.6.5"
|
||||||
|
crossbeam-channel = "0.3"
|
@ -1,7 +1,3 @@
|
|||||||
#[macro_use]
|
|
||||||
extern crate solana_ledger;
|
|
||||||
extern crate crossbeam_channel;
|
|
||||||
|
|
||||||
use crossbeam_channel::unbounded;
|
use crossbeam_channel::unbounded;
|
||||||
use log::*;
|
use log::*;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
@ -9,13 +5,12 @@ use rayon::prelude::*;
|
|||||||
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
||||||
use solana_core::cluster_info::ClusterInfo;
|
use solana_core::cluster_info::ClusterInfo;
|
||||||
use solana_core::cluster_info::Node;
|
use solana_core::cluster_info::Node;
|
||||||
use solana_core::genesis_utils::{create_genesis_block, GenesisBlockInfo};
|
use solana_core::genesis_utils::{create_genesis_config, GenesisConfigInfo};
|
||||||
use solana_core::packet::to_packets_chunked;
|
use solana_core::packet::to_packets_chunked;
|
||||||
use solana_core::poh_recorder::PohRecorder;
|
use solana_core::poh_recorder::PohRecorder;
|
||||||
use solana_core::poh_recorder::WorkingBankEntry;
|
use solana_core::poh_recorder::WorkingBankEntry;
|
||||||
use solana_core::service::Service;
|
|
||||||
use solana_ledger::bank_forks::BankForks;
|
use solana_ledger::bank_forks::BankForks;
|
||||||
use solana_ledger::blocktree::{get_tmp_ledger_path, Blocktree};
|
use solana_ledger::{blockstore::Blockstore, get_tmp_ledger_path};
|
||||||
use solana_measure::measure::Measure;
|
use solana_measure::measure::Measure;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
@ -25,7 +20,6 @@ use solana_sdk::signature::Signature;
|
|||||||
use solana_sdk::system_transaction;
|
use solana_sdk::system_transaction;
|
||||||
use solana_sdk::timing::{duration_as_us, timestamp};
|
use solana_sdk::timing::{duration_as_us, timestamp};
|
||||||
use solana_sdk::transaction::Transaction;
|
use solana_sdk::transaction::Transaction;
|
||||||
use std::iter;
|
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
@ -103,21 +97,21 @@ fn main() {
|
|||||||
const PACKETS_PER_BATCH: usize = 192;
|
const PACKETS_PER_BATCH: usize = 192;
|
||||||
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
||||||
let mint_total = 1_000_000_000_000;
|
let mint_total = 1_000_000_000_000;
|
||||||
let GenesisBlockInfo {
|
let GenesisConfigInfo {
|
||||||
genesis_block,
|
genesis_config,
|
||||||
mint_keypair,
|
mint_keypair,
|
||||||
..
|
..
|
||||||
} = create_genesis_block(mint_total);
|
} = create_genesis_config(mint_total);
|
||||||
|
|
||||||
let (verified_sender, verified_receiver) = unbounded();
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
let (vote_sender, vote_receiver) = unbounded();
|
let (vote_sender, vote_receiver) = unbounded();
|
||||||
let bank0 = Bank::new(&genesis_block);
|
let bank0 = Bank::new(&genesis_config);
|
||||||
let mut bank_forks = BankForks::new(0, bank0);
|
let mut bank_forks = BankForks::new(0, bank0);
|
||||||
let mut bank = bank_forks.working_bank();
|
let mut bank = bank_forks.working_bank();
|
||||||
|
|
||||||
info!("threads: {} txs: {}", num_threads, txes);
|
info!("threads: {} txs: {}", num_threads, txes);
|
||||||
|
|
||||||
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_block.hash());
|
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_config.hash());
|
||||||
|
|
||||||
// fund all the accounts
|
// fund all the accounts
|
||||||
transactions.iter().for_each(|tx| {
|
transactions.iter().for_each(|tx| {
|
||||||
@ -125,7 +119,7 @@ fn main() {
|
|||||||
&mint_keypair,
|
&mint_keypair,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
mint_total / txes as u64,
|
mint_total / txes as u64,
|
||||||
genesis_block.hash(),
|
genesis_config.hash(),
|
||||||
);
|
);
|
||||||
let x = bank.process_transaction(&fund);
|
let x = bank.process_transaction(&fund);
|
||||||
x.unwrap();
|
x.unwrap();
|
||||||
@ -142,20 +136,14 @@ fn main() {
|
|||||||
assert!(r.is_ok(), "sanity parallel execution");
|
assert!(r.is_ok(), "sanity parallel execution");
|
||||||
}
|
}
|
||||||
bank.clear_signatures();
|
bank.clear_signatures();
|
||||||
let mut verified: Vec<_> = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH)
|
let mut verified: Vec<_> = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
||||||
.into_iter()
|
|
||||||
.map(|x| {
|
|
||||||
let len = x.packets.len();
|
|
||||||
(x, iter::repeat(1).take(len).collect())
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
let ledger_path = get_tmp_ledger_path!();
|
let ledger_path = get_tmp_ledger_path!();
|
||||||
{
|
{
|
||||||
let blocktree = Arc::new(
|
let blockstore = Arc::new(
|
||||||
Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
Blockstore::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
||||||
);
|
);
|
||||||
let (exit, poh_recorder, poh_service, signal_receiver) =
|
let (exit, poh_recorder, poh_service, signal_receiver) =
|
||||||
create_test_recorder(&bank, &blocktree, None);
|
create_test_recorder(&bank, &blockstore, None);
|
||||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
||||||
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
||||||
let banking_stage = BankingStage::new(
|
let banking_stage = BankingStage::new(
|
||||||
@ -163,6 +151,7 @@ fn main() {
|
|||||||
&poh_recorder,
|
&poh_recorder,
|
||||||
verified_receiver,
|
verified_receiver,
|
||||||
vote_receiver,
|
vote_receiver,
|
||||||
|
None,
|
||||||
);
|
);
|
||||||
poh_recorder.lock().unwrap().set_bank(&bank);
|
poh_recorder.lock().unwrap().set_bank(&bank);
|
||||||
|
|
||||||
@ -173,9 +162,8 @@ fn main() {
|
|||||||
// If it is dropped before poh_service, then poh_service will error when
|
// If it is dropped before poh_service, then poh_service will error when
|
||||||
// calling send() on the channel.
|
// calling send() on the channel.
|
||||||
let signal_receiver = Arc::new(signal_receiver);
|
let signal_receiver = Arc::new(signal_receiver);
|
||||||
let signal_receiver2 = signal_receiver.clone();
|
let mut total_us = 0;
|
||||||
let mut total = 0;
|
let mut tx_total_us = 0;
|
||||||
let mut tx_total = 0;
|
|
||||||
let mut txs_processed = 0;
|
let mut txs_processed = 0;
|
||||||
let mut root = 1;
|
let mut root = 1;
|
||||||
let collector = Pubkey::new_rand();
|
let collector = Pubkey::new_rand();
|
||||||
@ -185,6 +173,7 @@ fn main() {
|
|||||||
chunk_len,
|
chunk_len,
|
||||||
num_threads,
|
num_threads,
|
||||||
};
|
};
|
||||||
|
let mut total_sent = 0;
|
||||||
for _ in 0..ITERS {
|
for _ in 0..ITERS {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
let mut sent = 0;
|
let mut sent = 0;
|
||||||
@ -209,7 +198,7 @@ fn main() {
|
|||||||
index,
|
index,
|
||||||
);
|
);
|
||||||
for xv in v {
|
for xv in v {
|
||||||
sent += xv.0.packets.len();
|
sent += xv.packets.len();
|
||||||
}
|
}
|
||||||
verified_sender.send(v.to_vec()).unwrap();
|
verified_sender.send(v.to_vec()).unwrap();
|
||||||
}
|
}
|
||||||
@ -226,7 +215,7 @@ fn main() {
|
|||||||
sleep(Duration::from_millis(5));
|
sleep(Duration::from_millis(5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if check_txs(&signal_receiver2, txes / CHUNKS, &poh_recorder) {
|
if check_txs(&signal_receiver, txes / CHUNKS, &poh_recorder) {
|
||||||
debug!(
|
debug!(
|
||||||
"resetting bank {} tx count: {} txs_proc: {}",
|
"resetting bank {} tx count: {} txs_proc: {}",
|
||||||
bank.slot(),
|
bank.slot(),
|
||||||
@ -235,7 +224,7 @@ fn main() {
|
|||||||
);
|
);
|
||||||
assert!(txs_processed < bank.transaction_count());
|
assert!(txs_processed < bank.transaction_count());
|
||||||
txs_processed = bank.transaction_count();
|
txs_processed = bank.transaction_count();
|
||||||
tx_total += duration_as_us(&now.elapsed());
|
tx_total_us += duration_as_us(&now.elapsed());
|
||||||
|
|
||||||
let mut poh_time = Measure::start("poh_time");
|
let mut poh_time = Measure::start("poh_time");
|
||||||
poh_recorder.lock().unwrap().reset(
|
poh_recorder.lock().unwrap().reset(
|
||||||
@ -267,20 +256,21 @@ fn main() {
|
|||||||
poh_time.as_us(),
|
poh_time.as_us(),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
tx_total += duration_as_us(&now.elapsed());
|
tx_total_us += duration_as_us(&now.elapsed());
|
||||||
}
|
}
|
||||||
|
|
||||||
// This signature clear may not actually clear the signatures
|
// This signature clear may not actually clear the signatures
|
||||||
// in this chunk, but since we rotate between CHUNKS then
|
// in this chunk, but since we rotate between CHUNKS then
|
||||||
// we should clear them by the time we come around again to re-use that chunk.
|
// we should clear them by the time we come around again to re-use that chunk.
|
||||||
bank.clear_signatures();
|
bank.clear_signatures();
|
||||||
total += duration_as_us(&now.elapsed());
|
total_us += duration_as_us(&now.elapsed());
|
||||||
debug!(
|
debug!(
|
||||||
"time: {} us checked: {} sent: {}",
|
"time: {} us checked: {} sent: {}",
|
||||||
duration_as_us(&now.elapsed()),
|
duration_as_us(&now.elapsed()),
|
||||||
txes / CHUNKS,
|
txes / CHUNKS,
|
||||||
sent,
|
sent,
|
||||||
);
|
);
|
||||||
|
total_sent += sent;
|
||||||
|
|
||||||
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
||||||
for tx in transactions.iter_mut() {
|
for tx in transactions.iter_mut() {
|
||||||
@ -288,13 +278,7 @@ fn main() {
|
|||||||
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
||||||
tx.signatures[0] = Signature::new(&sig[0..64]);
|
tx.signatures[0] = Signature::new(&sig[0..64]);
|
||||||
}
|
}
|
||||||
verified = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH)
|
verified = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
||||||
.into_iter()
|
|
||||||
.map(|x| {
|
|
||||||
let len = x.packets.len();
|
|
||||||
(x, iter::repeat(1).take(len).collect())
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start += chunk_len;
|
start += chunk_len;
|
||||||
@ -302,11 +286,11 @@ fn main() {
|
|||||||
}
|
}
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
||||||
total / ITERS as u64,
|
(1000.0 * 1000.0 * total_sent as f64) / (total_us as f64),
|
||||||
);
|
);
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
||||||
tx_total / ITERS as u64,
|
(1000.0 * 1000.0 * total_sent as f64) / (tx_total_us as f64),
|
||||||
);
|
);
|
||||||
|
|
||||||
drop(verified_sender);
|
drop(verified_sender);
|
||||||
@ -318,5 +302,5 @@ fn main() {
|
|||||||
sleep(Duration::from_secs(1));
|
sleep(Duration::from_secs(1));
|
||||||
debug!("waited for poh_service");
|
debug!("waited for poh_service");
|
||||||
}
|
}
|
||||||
let _unused = Blocktree::destroy(&ledger_path);
|
let _unused = Blockstore::destroy(&ledger_path);
|
||||||
}
|
}
|
@ -1,20 +0,0 @@
|
|||||||
[package]
|
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
name = "solana-banking-bench"
|
|
||||||
version = "0.20.0"
|
|
||||||
repository = "https://github.com/solana-labs/solana"
|
|
||||||
license = "Apache-2.0"
|
|
||||||
homepage = "https://solana.com/"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
log = "0.4.6"
|
|
||||||
rayon = "1.2.0"
|
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
|
||||||
solana-ledger = { path = "../ledger", version = "0.20.0" }
|
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
|
||||||
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
|
||||||
solana-measure = { path = "../measure", version = "0.20.0" }
|
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
|
||||||
rand = "0.6.5"
|
|
||||||
crossbeam-channel = "0.3"
|
|
@ -2,38 +2,40 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-exchange"
|
name = "solana-bench-exchange"
|
||||||
version = "0.20.0"
|
version = "0.23.3"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
publish = false
|
publish = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.0"
|
bincode = "1.2.1"
|
||||||
bs58 = "0.3.0"
|
bs58 = "0.3.0"
|
||||||
clap = "2.32.0"
|
clap = "2.32.0"
|
||||||
env_logger = "0.7.1"
|
env_logger = "0.7.1"
|
||||||
itertools = "0.8.0"
|
itertools = "0.8.2"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
num-derive = "0.3"
|
num-derive = "0.3"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde = "1.0.101"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.101"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.41"
|
serde_json = "1.0.44"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
# solana-runtime = { path = "../solana/runtime"}
|
solana-clap-utils = { path = "../clap-utils", version = "0.23.3" }
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-core = { path = "../core", version = "0.23.3" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.20.0" }
|
solana-genesis = { path = "../genesis", version = "0.23.3" }
|
||||||
solana-client = { path = "../client", version = "0.20.0" }
|
solana-client = { path = "../client", version = "0.23.3" }
|
||||||
solana-drone = { path = "../drone", version = "0.20.0" }
|
solana-faucet = { path = "../faucet", version = "0.23.3" }
|
||||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.0" }
|
solana-exchange-program = { path = "../programs/exchange", version = "0.23.3" }
|
||||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-metrics = { path = "../metrics", version = "0.23.3" }
|
||||||
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
solana-net-utils = { path = "../net-utils", version = "0.23.3" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-runtime = { path = "../runtime", version = "0.23.3" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
solana-sdk = { path = "../sdk", version = "0.23.3" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
|
||||||
untrusted = "0.7.0"
|
untrusted = "0.7.0"
|
||||||
ws = "0.9.1"
|
ws = "0.9.1"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
solana-local-cluster = { path = "../local-cluster", version = "0.23.3" }
|
||||||
|
@ -360,7 +360,7 @@ The Matcher would initiate the following last swap:
|
|||||||
|
|
||||||
- Row 1, To: Investor 1 trades 2 A token to 12 B tokens
|
- Row 1, To: Investor 1 trades 2 A token to 12 B tokens
|
||||||
- Row 1, From: Investor 2 trades 2 A token from 12 B tokens
|
- Row 1, From: Investor 2 trades 2 A token from 12 B tokens
|
||||||
- Matcher takes 4 B tokens as profit
|
- Matcher takes 2 B tokens as profit
|
||||||
|
|
||||||
Table becomes:
|
Table becomes:
|
||||||
|
|
||||||
|
@ -7,32 +7,36 @@ use rand::{thread_rng, Rng};
|
|||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use solana_client::perf_utils::{sample_txs, SampleStats};
|
use solana_client::perf_utils::{sample_txs, SampleStats};
|
||||||
use solana_core::gen_keys::GenKeys;
|
use solana_core::gen_keys::GenKeys;
|
||||||
use solana_drone::drone::request_airdrop_transaction;
|
use solana_exchange_program::{exchange_instruction, exchange_state::*, id};
|
||||||
use solana_exchange_api::exchange_instruction;
|
use solana_faucet::faucet::request_airdrop_transaction;
|
||||||
use solana_exchange_api::exchange_state::*;
|
|
||||||
use solana_exchange_api::id;
|
|
||||||
use solana_genesis::Base64Account;
|
use solana_genesis::Base64Account;
|
||||||
use solana_metrics::datapoint_info;
|
use solana_metrics::datapoint_info;
|
||||||
use solana_sdk::client::Client;
|
use solana_sdk::{
|
||||||
use solana_sdk::client::SyncClient;
|
client::{Client, SyncClient},
|
||||||
use solana_sdk::pubkey::Pubkey;
|
commitment_config::CommitmentConfig,
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
pubkey::Pubkey,
|
||||||
use solana_sdk::timing::{duration_as_ms, duration_as_s};
|
signature::{Keypair, KeypairUtil},
|
||||||
use solana_sdk::transaction::Transaction;
|
timing::{duration_as_ms, duration_as_s},
|
||||||
use solana_sdk::{system_instruction, system_program};
|
transaction::Transaction,
|
||||||
use std::cmp;
|
{system_instruction, system_program},
|
||||||
use std::collections::{HashMap, VecDeque};
|
};
|
||||||
use std::fs::File;
|
use std::{
|
||||||
use std::io::prelude::*;
|
cmp,
|
||||||
use std::mem;
|
collections::{HashMap, VecDeque},
|
||||||
use std::net::SocketAddr;
|
fs::File,
|
||||||
use std::path::Path;
|
io::prelude::*,
|
||||||
use std::process::exit;
|
mem,
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
net::SocketAddr,
|
||||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
path::Path,
|
||||||
use std::sync::{Arc, RwLock};
|
process::exit,
|
||||||
use std::thread::{sleep, Builder};
|
sync::{
|
||||||
use std::time::{Duration, Instant};
|
atomic::{AtomicBool, AtomicUsize, Ordering},
|
||||||
|
mpsc::{channel, Receiver, Sender},
|
||||||
|
Arc, RwLock,
|
||||||
|
},
|
||||||
|
thread::{sleep, Builder},
|
||||||
|
time::{Duration, Instant},
|
||||||
|
};
|
||||||
|
|
||||||
// TODO Chunk length as specified results in a bunch of failures, divide by 10 helps...
|
// TODO Chunk length as specified results in a bunch of failures, divide by 10 helps...
|
||||||
// Assume 4MB network buffers, and 512 byte packets
|
// Assume 4MB network buffers, and 512 byte packets
|
||||||
@ -174,19 +178,28 @@ where
|
|||||||
|
|
||||||
info!("Generating {:?} account keys", total_keys);
|
info!("Generating {:?} account keys", total_keys);
|
||||||
let mut account_keypairs = generate_keypairs(total_keys);
|
let mut account_keypairs = generate_keypairs(total_keys);
|
||||||
let src_pubkeys: Vec<_> = account_keypairs
|
let src_keypairs: Vec<_> = account_keypairs
|
||||||
.drain(0..accounts_in_groups)
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(|keypair| keypair)
|
||||||
|
.collect();
|
||||||
|
let src_pubkeys: Vec<Pubkey> = src_keypairs
|
||||||
|
.iter()
|
||||||
.map(|keypair| keypair.pubkey())
|
.map(|keypair| keypair.pubkey())
|
||||||
.collect();
|
.collect();
|
||||||
let profit_pubkeys: Vec<_> = account_keypairs
|
|
||||||
|
let profit_keypairs: Vec<_> = account_keypairs
|
||||||
.drain(0..accounts_in_groups)
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(|keypair| keypair)
|
||||||
|
.collect();
|
||||||
|
let profit_pubkeys: Vec<Pubkey> = profit_keypairs
|
||||||
|
.iter()
|
||||||
.map(|keypair| keypair.pubkey())
|
.map(|keypair| keypair.pubkey())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
info!("Create {:?} source token accounts", src_pubkeys.len());
|
info!("Create {:?} source token accounts", src_pubkeys.len());
|
||||||
create_token_accounts(client, &trader_signers, &src_pubkeys);
|
create_token_accounts(client, &trader_signers, &src_keypairs);
|
||||||
info!("Create {:?} profit token accounts", profit_pubkeys.len());
|
info!("Create {:?} profit token accounts", profit_pubkeys.len());
|
||||||
create_token_accounts(client, &swapper_signers, &profit_pubkeys);
|
create_token_accounts(client, &swapper_signers, &profit_keypairs);
|
||||||
|
|
||||||
// Collect the max transaction rate and total tx count seen (single node only)
|
// Collect the max transaction rate and total tx count seen (single node only)
|
||||||
let sample_stats = Arc::new(RwLock::new(Vec::new()));
|
let sample_stats = Arc::new(RwLock::new(Vec::new()));
|
||||||
@ -243,7 +256,7 @@ where
|
|||||||
trace!("Start trader thread");
|
trace!("Start trader thread");
|
||||||
let trader_thread = {
|
let trader_thread = {
|
||||||
let exit_signal = exit_signal.clone();
|
let exit_signal = exit_signal.clone();
|
||||||
let shared_txs = shared_txs.clone();
|
|
||||||
let client = clients[0].clone();
|
let client = clients[0].clone();
|
||||||
Builder::new()
|
Builder::new()
|
||||||
.name("solana-exchange-trader".to_string())
|
.name("solana-exchange-trader".to_string())
|
||||||
@ -380,7 +393,10 @@ fn swapper<T>(
|
|||||||
let mut tries = 0;
|
let mut tries = 0;
|
||||||
let mut trade_index = 0;
|
let mut trade_index = 0;
|
||||||
while client
|
while client
|
||||||
.get_balance(&trade_infos[trade_index].trade_account)
|
.get_balance_with_commitment(
|
||||||
|
&trade_infos[trade_index].trade_account,
|
||||||
|
CommitmentConfig::recent(),
|
||||||
|
)
|
||||||
.unwrap_or(0)
|
.unwrap_or(0)
|
||||||
== 0
|
== 0
|
||||||
{
|
{
|
||||||
@ -434,7 +450,7 @@ fn swapper<T>(
|
|||||||
account_group = (account_group + 1) % account_groups as usize;
|
account_group = (account_group + 1) % account_groups as usize;
|
||||||
|
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
let to_swap_txs: Vec<_> = to_swap
|
let to_swap_txs: Vec<_> = to_swap
|
||||||
.par_iter()
|
.par_iter()
|
||||||
@ -557,27 +573,39 @@ fn trader<T>(
|
|||||||
trade_account: trade.pubkey(),
|
trade_account: trade.pubkey(),
|
||||||
order_info,
|
order_info,
|
||||||
});
|
});
|
||||||
trades.push((signer, trade.pubkey(), side, src));
|
trades.push((signer, trade, side, src));
|
||||||
}
|
}
|
||||||
account_group = (account_group + 1) % account_groups as usize;
|
account_group = (account_group + 1) % account_groups as usize;
|
||||||
|
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
|
|
||||||
trades.chunks(chunk_size).for_each(|chunk| {
|
trades.chunks(chunk_size).for_each(|chunk| {
|
||||||
let trades_txs: Vec<_> = chunk
|
let trades_txs: Vec<_> = chunk
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|(signer, trade, side, src)| {
|
.map(|(owner, trade, side, src)| {
|
||||||
let s: &Keypair = &signer;
|
let owner_pubkey = &owner.pubkey();
|
||||||
let owner = &signer.pubkey();
|
let trade_pubkey = &trade.pubkey();
|
||||||
let space = mem::size_of::<ExchangeState>() as u64;
|
let space = mem::size_of::<ExchangeState>() as u64;
|
||||||
Transaction::new_signed_instructions(
|
Transaction::new_signed_instructions(
|
||||||
&[s],
|
&[owner.as_ref(), trade],
|
||||||
vec![
|
vec![
|
||||||
system_instruction::create_account(owner, trade, 1, space, &id()),
|
system_instruction::create_account(
|
||||||
|
owner_pubkey,
|
||||||
|
trade_pubkey,
|
||||||
|
1,
|
||||||
|
space,
|
||||||
|
&id(),
|
||||||
|
),
|
||||||
exchange_instruction::trade_request(
|
exchange_instruction::trade_request(
|
||||||
owner, trade, *side, pair, tokens, price, src,
|
owner_pubkey,
|
||||||
|
trade_pubkey,
|
||||||
|
*side,
|
||||||
|
pair,
|
||||||
|
tokens,
|
||||||
|
price,
|
||||||
|
src,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
blockhash,
|
blockhash,
|
||||||
@ -638,7 +666,9 @@ where
|
|||||||
T: SyncClient + ?Sized,
|
T: SyncClient + ?Sized,
|
||||||
{
|
{
|
||||||
for s in &tx.signatures {
|
for s in &tx.signatures {
|
||||||
if let Ok(Some(r)) = sync_client.get_signature_status(s) {
|
if let Ok(Some(r)) =
|
||||||
|
sync_client.get_signature_status_with_commitment(s, CommitmentConfig::recent())
|
||||||
|
{
|
||||||
match r {
|
match r {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
return true;
|
return true;
|
||||||
@ -659,12 +689,15 @@ fn verify_funding_transfer<T: SyncClient + ?Sized>(
|
|||||||
) -> bool {
|
) -> bool {
|
||||||
if verify_transaction(client, tx) {
|
if verify_transaction(client, tx) {
|
||||||
for a in &tx.message().account_keys[1..] {
|
for a in &tx.message().account_keys[1..] {
|
||||||
if client.get_balance(a).unwrap_or(0) >= amount {
|
if client
|
||||||
|
.get_balance_with_commitment(a, CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
>= amount
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,8 +775,9 @@ pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>],
|
|||||||
to_fund_txs.len(),
|
to_fund_txs.len(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let (blockhash, _fee_calculator) =
|
let (blockhash, _fee_calculator) = client
|
||||||
client.get_recent_blockhash().expect("blockhash");
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
|
.expect("blockhash");
|
||||||
to_fund_txs.par_iter_mut().for_each(|(k, tx)| {
|
to_fund_txs.par_iter_mut().for_each(|(k, tx)| {
|
||||||
tx.sign(&[*k], blockhash);
|
tx.sign(&[*k], blockhash);
|
||||||
});
|
});
|
||||||
@ -780,27 +814,37 @@ pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>],
|
|||||||
});
|
});
|
||||||
funded.append(&mut new_funded);
|
funded.append(&mut new_funded);
|
||||||
funded.retain(|(k, b)| {
|
funded.retain(|(k, b)| {
|
||||||
client.get_balance(&k.pubkey()).unwrap_or(0) > lamports && *b > lamports
|
client
|
||||||
|
.get_balance_with_commitment(&k.pubkey(), CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
> lamports
|
||||||
|
&& *b > lamports
|
||||||
});
|
});
|
||||||
debug!(" Funded: {} left: {}", funded.len(), notfunded.len());
|
debug!(" Funded: {} left: {}", funded.len(), notfunded.len());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], accounts: &[Pubkey]) {
|
pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], accounts: &[Keypair]) {
|
||||||
let mut notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = signers.iter().zip(accounts).collect();
|
let mut notfunded: Vec<(&Arc<Keypair>, &Keypair)> = signers.iter().zip(accounts).collect();
|
||||||
|
|
||||||
while !notfunded.is_empty() {
|
while !notfunded.is_empty() {
|
||||||
notfunded.chunks(FUND_CHUNK_LEN).for_each(|chunk| {
|
notfunded.chunks(FUND_CHUNK_LEN).for_each(|chunk| {
|
||||||
let mut to_create_txs: Vec<_> = chunk
|
let mut to_create_txs: Vec<_> = chunk
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|(signer, new)| {
|
.map(|(from_keypair, new_keypair)| {
|
||||||
let owner_pubkey = &signer.pubkey();
|
let owner_pubkey = &from_keypair.pubkey();
|
||||||
let space = mem::size_of::<ExchangeState>() as u64;
|
let space = mem::size_of::<ExchangeState>() as u64;
|
||||||
let create_ix =
|
let create_ix = system_instruction::create_account(
|
||||||
system_instruction::create_account(owner_pubkey, new, 1, space, &id());
|
owner_pubkey,
|
||||||
let request_ix = exchange_instruction::account_request(owner_pubkey, new);
|
&new_keypair.pubkey(),
|
||||||
|
1,
|
||||||
|
space,
|
||||||
|
&id(),
|
||||||
|
);
|
||||||
|
let request_ix =
|
||||||
|
exchange_instruction::account_request(owner_pubkey, &new_keypair.pubkey());
|
||||||
(
|
(
|
||||||
signer,
|
(from_keypair, new_keypair),
|
||||||
Transaction::new_unsigned_instructions(vec![create_ix, request_ix]),
|
Transaction::new_unsigned_instructions(vec![create_ix, request_ix]),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -819,12 +863,13 @@ pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], acco
|
|||||||
let mut retries = 0;
|
let mut retries = 0;
|
||||||
while !to_create_txs.is_empty() {
|
while !to_create_txs.is_empty() {
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
to_create_txs.par_iter_mut().for_each(|(k, tx)| {
|
to_create_txs
|
||||||
let kp: &Keypair = k;
|
.par_iter_mut()
|
||||||
tx.sign(&[kp], blockhash);
|
.for_each(|((from_keypair, to_keypair), tx)| {
|
||||||
});
|
tx.sign(&[from_keypair.as_ref(), to_keypair], blockhash);
|
||||||
|
});
|
||||||
to_create_txs.iter().for_each(|(_, tx)| {
|
to_create_txs.iter().for_each(|(_, tx)| {
|
||||||
client.async_send_transaction(tx.clone()).expect("transfer");
|
client.async_send_transaction(tx.clone()).expect("transfer");
|
||||||
});
|
});
|
||||||
@ -861,9 +906,13 @@ pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], acco
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut new_notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = vec![];
|
let mut new_notfunded: Vec<(&Arc<Keypair>, &Keypair)> = vec![];
|
||||||
for f in ¬funded {
|
for f in ¬funded {
|
||||||
if client.get_balance(&f.1).unwrap_or(0) == 0 {
|
if client
|
||||||
|
.get_balance_with_commitment(&f.1.pubkey(), CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
== 0
|
||||||
|
{
|
||||||
new_notfunded.push(*f)
|
new_notfunded.push(*f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -919,8 +968,8 @@ fn generate_keypairs(num: u64) -> Vec<Keypair> {
|
|||||||
rnd.gen_n_keypairs(num)
|
rnd.gen_n_keypairs(num)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypair, amount: u64) {
|
pub fn airdrop_lamports(client: &dyn Client, faucet_addr: &SocketAddr, id: &Keypair, amount: u64) {
|
||||||
let balance = client.get_balance(&id.pubkey());
|
let balance = client.get_balance_with_commitment(&id.pubkey(), CommitmentConfig::recent());
|
||||||
let balance = balance.unwrap_or(0);
|
let balance = balance.unwrap_or(0);
|
||||||
if balance >= amount {
|
if balance >= amount {
|
||||||
return;
|
return;
|
||||||
@ -931,33 +980,40 @@ pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypa
|
|||||||
info!(
|
info!(
|
||||||
"Airdropping {:?} lamports from {} for {}",
|
"Airdropping {:?} lamports from {} for {}",
|
||||||
amount_to_drop,
|
amount_to_drop,
|
||||||
drone_addr,
|
faucet_addr,
|
||||||
id.pubkey(),
|
id.pubkey(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut tries = 0;
|
let mut tries = 0;
|
||||||
loop {
|
loop {
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
match request_airdrop_transaction(&drone_addr, &id.pubkey(), amount_to_drop, blockhash) {
|
match request_airdrop_transaction(&faucet_addr, &id.pubkey(), amount_to_drop, blockhash) {
|
||||||
Ok(transaction) => {
|
Ok(transaction) => {
|
||||||
let signature = client.async_send_transaction(transaction).unwrap();
|
let signature = client.async_send_transaction(transaction).unwrap();
|
||||||
|
|
||||||
for _ in 0..30 {
|
for _ in 0..30 {
|
||||||
if let Ok(Some(_)) = client.get_signature_status(&signature) {
|
if let Ok(Some(_)) = client.get_signature_status_with_commitment(
|
||||||
|
&signature,
|
||||||
|
CommitmentConfig::recent(),
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(100));
|
sleep(Duration::from_millis(100));
|
||||||
}
|
}
|
||||||
if client.get_balance(&id.pubkey()).unwrap_or(0) >= amount {
|
if client
|
||||||
|
.get_balance_with_commitment(&id.pubkey(), CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
>= amount
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
panic!(
|
panic!(
|
||||||
"Error requesting airdrop: {:?} to addr: {:?} amount: {}",
|
"Error requesting airdrop: {:?} to addr: {:?} amount: {}",
|
||||||
err, drone_addr, amount
|
err, faucet_addr, amount
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, value_t, App, Arg, ArgMatches};
|
use clap::{crate_description, crate_name, value_t, App, Arg, ArgMatches};
|
||||||
use solana_core::gen_keys::GenKeys;
|
use solana_core::gen_keys::GenKeys;
|
||||||
use solana_drone::drone::DRONE_PORT;
|
use solana_faucet::faucet::FAUCET_PORT;
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
@ -8,7 +8,7 @@ use std::time::Duration;
|
|||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub entrypoint_addr: SocketAddr,
|
pub entrypoint_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub faucet_addr: SocketAddr,
|
||||||
pub identity: Keypair,
|
pub identity: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
pub num_nodes: usize,
|
pub num_nodes: usize,
|
||||||
@ -27,7 +27,7 @@ impl Default for Config {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
faucet_addr: SocketAddr::from(([127, 0, 0, 1], FAUCET_PORT)),
|
||||||
identity: Keypair::new(),
|
identity: Keypair::new(),
|
||||||
num_nodes: 1,
|
num_nodes: 1,
|
||||||
threads: 4,
|
threads: 4,
|
||||||
@ -44,10 +44,10 @@ impl Default for Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
||||||
App::new(crate_name!())
|
App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(version)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("entrypoint")
|
Arg::with_name("entrypoint")
|
||||||
.short("n")
|
.short("n")
|
||||||
@ -59,14 +59,14 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("faucet")
|
||||||
.short("d")
|
.short("d")
|
||||||
.long("drone")
|
.long("faucet")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(false)
|
.required(false)
|
||||||
.default_value("127.0.0.1:9900")
|
.default_value("127.0.0.1:9900")
|
||||||
.help("Location of the drone; defaults to 127.0.0.1:9900"),
|
.help("Location of the faucet; defaults to 127.0.0.1:9900"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity")
|
||||||
@ -166,15 +166,17 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||||
let mut args = Config::default();
|
let mut args = Config::default();
|
||||||
|
|
||||||
args.entrypoint_addr = solana_netutil::parse_host_port(matches.value_of("entrypoint").unwrap())
|
args.entrypoint_addr = solana_net_utils::parse_host_port(
|
||||||
.unwrap_or_else(|e| {
|
matches.value_of("entrypoint").unwrap(),
|
||||||
eprintln!("failed to parse entrypoint address: {}", e);
|
)
|
||||||
exit(1)
|
.unwrap_or_else(|e| {
|
||||||
});
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
|
exit(1)
|
||||||
|
});
|
||||||
|
|
||||||
args.drone_addr = solana_netutil::parse_host_port(matches.value_of("drone").unwrap())
|
args.faucet_addr = solana_net_utils::parse_host_port(matches.value_of("faucet").unwrap())
|
||||||
.unwrap_or_else(|e| {
|
.unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
eprintln!("failed to parse faucet address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -11,12 +11,12 @@ fn main() {
|
|||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
solana_metrics::set_panic_hook("bench-exchange");
|
solana_metrics::set_panic_hook("bench-exchange");
|
||||||
|
|
||||||
let matches = cli::build_args().get_matches();
|
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cli::Config {
|
let cli::Config {
|
||||||
entrypoint_addr,
|
entrypoint_addr,
|
||||||
drone_addr,
|
faucet_addr,
|
||||||
identity,
|
identity,
|
||||||
threads,
|
threads,
|
||||||
num_nodes,
|
num_nodes,
|
||||||
@ -73,7 +73,7 @@ fn main() {
|
|||||||
const NUM_SIGNERS: u64 = 2;
|
const NUM_SIGNERS: u64 = 2;
|
||||||
airdrop_lamports(
|
airdrop_lamports(
|
||||||
&client,
|
&client,
|
||||||
&drone_addr,
|
&faucet_addr,
|
||||||
&config.identity,
|
&config.identity,
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
);
|
);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use itertools::EitherOrBoth::{Both, Left, Right};
|
use itertools::EitherOrBoth::{Both, Left, Right};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana_exchange_api::exchange_state::*;
|
use solana_exchange_program::exchange_state::*;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::BinaryHeap;
|
use std::collections::BinaryHeap;
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
use log::*;
|
||||||
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
use solana_core::validator::ValidatorConfig;
|
use solana_core::validator::ValidatorConfig;
|
||||||
use solana_drone::drone::run_local_drone;
|
use solana_exchange_program::exchange_processor::process_instruction;
|
||||||
use solana_exchange_api::exchange_processor::process_instruction;
|
use solana_exchange_program::id;
|
||||||
use solana_exchange_api::id;
|
use solana_exchange_program::solana_exchange_program;
|
||||||
|
use solana_faucet::faucet::run_local_faucet;
|
||||||
|
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_runtime::bank_client::BankClient;
|
use solana_runtime::bank_client::BankClient;
|
||||||
use solana_sdk::genesis_block::create_genesis_block;
|
use solana_sdk::genesis_config::create_genesis_config;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[ignore]
|
||||||
fn test_exchange_local_cluster() {
|
fn test_exchange_local_cluster() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
@ -44,16 +47,16 @@ fn test_exchange_local_cluster() {
|
|||||||
..ClusterConfig::default()
|
..ClusterConfig::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
let faucet_keypair = Keypair::new();
|
||||||
cluster.transfer(
|
cluster.transfer(
|
||||||
&cluster.funding_keypair,
|
&cluster.funding_keypair,
|
||||||
&drone_keypair.pubkey(),
|
&faucet_keypair.pubkey(),
|
||||||
2_000_000_000_000,
|
2_000_000_000_000,
|
||||||
);
|
);
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
let (addr_sender, addr_receiver) = channel();
|
||||||
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
run_local_faucet(faucet_keypair, addr_sender, Some(1_000_000_000_000));
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
let faucet_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
info!("Connecting to the cluster");
|
info!("Connecting to the cluster");
|
||||||
let (nodes, _) =
|
let (nodes, _) =
|
||||||
@ -70,7 +73,7 @@ fn test_exchange_local_cluster() {
|
|||||||
const NUM_SIGNERS: u64 = 2;
|
const NUM_SIGNERS: u64 = 2;
|
||||||
airdrop_lamports(
|
airdrop_lamports(
|
||||||
&client,
|
&client,
|
||||||
&drone_addr,
|
&faucet_addr,
|
||||||
&config.identity,
|
&config.identity,
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
);
|
);
|
||||||
@ -81,8 +84,8 @@ fn test_exchange_local_cluster() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_exchange_bank_client() {
|
fn test_exchange_bank_client() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let (genesis_block, identity) = create_genesis_block(100_000_000_000_000);
|
let (genesis_config, identity) = create_genesis_config(100_000_000_000_000);
|
||||||
let mut bank = Bank::new(&genesis_block);
|
let mut bank = Bank::new(&genesis_config);
|
||||||
bank.add_instruction_processor(id(), process_instruction);
|
bank.add_instruction_processor(id(), process_instruction);
|
||||||
let clients = vec![BankClient::new(bank)];
|
let clients = vec![BankClient::new(bank)];
|
||||||
|
|
@ -2,13 +2,14 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-streamer"
|
name = "solana-bench-streamer"
|
||||||
version = "0.20.0"
|
version = "0.23.3"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "0.23.3" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-core = { path = "../core", version = "0.23.3" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "0.23.3" }
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
use clap::{crate_description, crate_name, App, Arg};
|
||||||
use solana_core::packet::PacketsRecycler;
|
use solana_core::packet::{Packet, Packets, PacketsRecycler, PACKET_DATA_SIZE};
|
||||||
use solana_core::packet::{Packet, Packets, BLOB_SIZE, PACKET_DATA_SIZE};
|
|
||||||
use solana_core::result::Result;
|
|
||||||
use solana_core::streamer::{receiver, PacketReceiver};
|
use solana_core::streamer::{receiver, PacketReceiver};
|
||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
||||||
@ -9,7 +7,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
|||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::thread::{spawn, JoinHandle};
|
use std::thread::{spawn, JoinHandle, Result};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
@ -29,7 +27,7 @@ fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
|||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
for p in &msgs.packets {
|
for p in &msgs.packets {
|
||||||
let a = p.meta.addr();
|
let a = p.meta.addr();
|
||||||
assert!(p.meta.size < BLOB_SIZE);
|
assert!(p.meta.size < PACKET_DATA_SIZE);
|
||||||
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
||||||
num += 1;
|
num += 1;
|
||||||
}
|
}
|
||||||
@ -54,7 +52,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(solana_clap_utils::version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("num-recv-sockets")
|
Arg::with_name("num-recv-sockets")
|
||||||
.long("num-recv-sockets")
|
.long("num-recv-sockets")
|
||||||
@ -77,7 +75,7 @@ fn main() -> Result<()> {
|
|||||||
let mut read_threads = Vec::new();
|
let mut read_threads = Vec::new();
|
||||||
let recycler = PacketsRecycler::default();
|
let recycler = PacketsRecycler::default();
|
||||||
for _ in 0..num_sockets {
|
for _ in 0..num_sockets {
|
||||||
let read = solana_netutil::bind_to(port, false).unwrap();
|
let read = solana_net_utils::bind_to(port, false).unwrap();
|
||||||
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
||||||
|
|
||||||
addr = read.local_addr().unwrap();
|
addr = read.local_addr().unwrap();
|
||||||
|
@ -2,37 +2,38 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-tps"
|
name = "solana-bench-tps"
|
||||||
version = "0.20.0"
|
version = "0.23.3"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.0"
|
bincode = "1.2.1"
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde = "1.0.101"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.101"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.41"
|
serde_json = "1.0.44"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "0.23.3" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.20.0" }
|
solana-core = { path = "../core", version = "0.23.3" }
|
||||||
solana-client = { path = "../client", version = "0.20.0" }
|
solana-genesis = { path = "../genesis", version = "0.23.3" }
|
||||||
solana-drone = { path = "../drone", version = "0.20.0" }
|
solana-client = { path = "../client", version = "0.23.3" }
|
||||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.0", optional = true }
|
solana-faucet = { path = "../faucet", version = "0.23.3" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-librapay = { path = "../programs/librapay", version = "0.23.3", optional = true }
|
||||||
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "0.23.3" }
|
||||||
solana-measure = { path = "../measure", version = "0.20.0" }
|
solana-metrics = { path = "../metrics", version = "0.23.3" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-measure = { path = "../measure", version = "0.23.3" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
solana-net-utils = { path = "../net-utils", version = "0.23.3" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
solana-runtime = { path = "../runtime", version = "0.23.3" }
|
||||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.0", optional = true }
|
solana-sdk = { path = "../sdk", version = "0.23.3" }
|
||||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.0", optional = true }
|
solana-move-loader-program = { path = "../programs/move_loader", version = "0.23.3", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serial_test = "0.2.0"
|
serial_test = "0.3.2"
|
||||||
serial_test_derive = "0.2.0"
|
serial_test_derive = "0.3.1"
|
||||||
|
solana-local-cluster = { path = "../local-cluster", version = "0.23.3" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
move = ["solana-core/move", "solana-librapay-api", "solana-move-loader-program", "solana-move-loader-api"]
|
move = ["solana-librapay", "solana-move-loader-program"]
|
||||||
|
@ -1,26 +1,28 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
|
use clap::{crate_description, crate_name, App, Arg, ArgMatches};
|
||||||
use solana_drone::drone::DRONE_PORT;
|
use solana_faucet::faucet::FAUCET_PORT;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||||
use std::{net::SocketAddr, process::exit, time::Duration};
|
use std::{net::SocketAddr, process::exit, time::Duration};
|
||||||
|
|
||||||
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::SOL_LAMPORTS;
|
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::LAMPORTS_PER_SOL;
|
||||||
|
|
||||||
/// Holds the configuration for a single run of the benchmark
|
/// Holds the configuration for a single run of the benchmark
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub entrypoint_addr: SocketAddr,
|
pub entrypoint_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub faucet_addr: SocketAddr,
|
||||||
pub id: Keypair,
|
pub id: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
pub num_nodes: usize,
|
pub num_nodes: usize,
|
||||||
pub duration: Duration,
|
pub duration: Duration,
|
||||||
pub tx_count: usize,
|
pub tx_count: usize,
|
||||||
|
pub keypair_multiplier: usize,
|
||||||
pub thread_batch_sleep_ms: usize,
|
pub thread_batch_sleep_ms: usize,
|
||||||
pub sustained: bool,
|
pub sustained: bool,
|
||||||
pub client_ids_and_stake_file: String,
|
pub client_ids_and_stake_file: String,
|
||||||
pub write_to_client_file: bool,
|
pub write_to_client_file: bool,
|
||||||
pub read_from_client_file: bool,
|
pub read_from_client_file: bool,
|
||||||
pub target_lamports_per_signature: u64,
|
pub target_lamports_per_signature: u64,
|
||||||
|
pub multi_client: bool,
|
||||||
pub use_move: bool,
|
pub use_move: bool,
|
||||||
pub num_lamports_per_account: u64,
|
pub num_lamports_per_account: u64,
|
||||||
}
|
}
|
||||||
@ -29,18 +31,20 @@ impl Default for Config {
|
|||||||
fn default() -> Config {
|
fn default() -> Config {
|
||||||
Config {
|
Config {
|
||||||
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
faucet_addr: SocketAddr::from(([127, 0, 0, 1], FAUCET_PORT)),
|
||||||
id: Keypair::new(),
|
id: Keypair::new(),
|
||||||
threads: 4,
|
threads: 4,
|
||||||
num_nodes: 1,
|
num_nodes: 1,
|
||||||
duration: Duration::new(std::u64::MAX, 0),
|
duration: Duration::new(std::u64::MAX, 0),
|
||||||
tx_count: 50_000,
|
tx_count: 50_000,
|
||||||
|
keypair_multiplier: 8,
|
||||||
thread_batch_sleep_ms: 1000,
|
thread_batch_sleep_ms: 1000,
|
||||||
sustained: false,
|
sustained: false,
|
||||||
client_ids_and_stake_file: String::new(),
|
client_ids_and_stake_file: String::new(),
|
||||||
write_to_client_file: false,
|
write_to_client_file: false,
|
||||||
read_from_client_file: false,
|
read_from_client_file: false,
|
||||||
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
||||||
|
multi_client: true,
|
||||||
use_move: false,
|
use_move: false,
|
||||||
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
||||||
}
|
}
|
||||||
@ -48,9 +52,9 @@ impl Default for Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Defines and builds the CLI args for a run of the benchmark
|
/// Defines and builds the CLI args for a run of the benchmark
|
||||||
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
||||||
App::new(crate_name!()).about(crate_description!())
|
App::new(crate_name!()).about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(version)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("entrypoint")
|
Arg::with_name("entrypoint")
|
||||||
.short("n")
|
.short("n")
|
||||||
@ -60,12 +64,12 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.help("Rendezvous with the cluster at this entry point; defaults to 127.0.0.1:8001"),
|
.help("Rendezvous with the cluster at this entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("faucet")
|
||||||
.short("d")
|
.short("d")
|
||||||
.long("drone")
|
.long("faucet")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Location of the drone; defaults to entrypoint:DRONE_PORT"),
|
.help("Location of the faucet; defaults to entrypoint:FAUCET_PORT"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity")
|
||||||
@ -108,6 +112,11 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.long("use-move")
|
.long("use-move")
|
||||||
.help("Use Move language transactions to perform transfers."),
|
.help("Use Move language transactions to perform transfers."),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("no-multi-client")
|
||||||
|
.long("no-multi-client")
|
||||||
|
.help("Disable multi-client support, only transact with the entrypoint."),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("tx_count")
|
Arg::with_name("tx_count")
|
||||||
.long("tx_count")
|
.long("tx_count")
|
||||||
@ -115,6 +124,13 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Number of transactions to send per batch")
|
.help("Number of transactions to send per batch")
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("keypair_multiplier")
|
||||||
|
.long("keypair-multiplier")
|
||||||
|
.value_name("NUM")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Multiply by transaction count to determine number of keypairs to create")
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("thread-batch-sleep-ms")
|
Arg::with_name("thread-batch-sleep-ms")
|
||||||
.short("z")
|
.short("z")
|
||||||
@ -167,15 +183,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
let mut args = Config::default();
|
let mut args = Config::default();
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("entrypoint") {
|
if let Some(addr) = matches.value_of("entrypoint") {
|
||||||
args.entrypoint_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
args.entrypoint_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse entrypoint address: {}", e);
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("drone") {
|
if let Some(addr) = matches.value_of("faucet") {
|
||||||
args.drone_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
args.faucet_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
eprintln!("failed to parse faucet address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -201,7 +217,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("tx_count") {
|
if let Some(s) = matches.value_of("tx_count") {
|
||||||
args.tx_count = s.to_string().parse().expect("can't parse tx_account");
|
args.tx_count = s.to_string().parse().expect("can't parse tx_count");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("keypair_multiplier") {
|
||||||
|
args.keypair_multiplier = s
|
||||||
|
.to_string()
|
||||||
|
.parse()
|
||||||
|
.expect("can't parse keypair-multiplier");
|
||||||
|
assert!(args.keypair_multiplier >= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(t) = matches.value_of("thread-batch-sleep-ms") {
|
if let Some(t) = matches.value_of("thread-batch-sleep-ms") {
|
||||||
@ -229,6 +253,7 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
args.use_move = matches.is_present("use-move");
|
args.use_move = matches.is_present("use-move");
|
||||||
|
args.multi_client = !matches.is_present("no-multi-client");
|
||||||
|
|
||||||
if let Some(v) = matches.value_of("num_lamports_per_account") {
|
if let Some(v) = matches.value_of("num_lamports_per_account") {
|
||||||
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
||||||
|
@ -1,41 +1,44 @@
|
|||||||
use log::*;
|
use log::*;
|
||||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
||||||
use solana_bench_tps::cli;
|
use solana_bench_tps::cli;
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_client, get_multi_client};
|
||||||
use solana_genesis::Base64Account;
|
use solana_genesis::Base64Account;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_program;
|
use solana_sdk::system_program;
|
||||||
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit};
|
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit, sync::Arc};
|
||||||
|
|
||||||
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
||||||
pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
|
pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup_with_filter("solana=info");
|
solana_logger::setup_with_default("solana=info");
|
||||||
solana_metrics::set_panic_hook("bench-tps");
|
solana_metrics::set_panic_hook("bench-tps");
|
||||||
|
|
||||||
let matches = cli::build_args().get_matches();
|
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cli::Config {
|
let cli::Config {
|
||||||
entrypoint_addr,
|
entrypoint_addr,
|
||||||
drone_addr,
|
faucet_addr,
|
||||||
id,
|
id,
|
||||||
num_nodes,
|
num_nodes,
|
||||||
tx_count,
|
tx_count,
|
||||||
|
keypair_multiplier,
|
||||||
client_ids_and_stake_file,
|
client_ids_and_stake_file,
|
||||||
write_to_client_file,
|
write_to_client_file,
|
||||||
read_from_client_file,
|
read_from_client_file,
|
||||||
target_lamports_per_signature,
|
target_lamports_per_signature,
|
||||||
use_move,
|
use_move,
|
||||||
|
multi_client,
|
||||||
num_lamports_per_account,
|
num_lamports_per_account,
|
||||||
..
|
..
|
||||||
} = &cli_config;
|
} = &cli_config;
|
||||||
|
|
||||||
|
let keypair_count = *tx_count * keypair_multiplier;
|
||||||
if *write_to_client_file {
|
if *write_to_client_file {
|
||||||
info!("Generating {} keypairs", *tx_count * 2);
|
info!("Generating {} keypairs", keypair_count);
|
||||||
let (keypairs, _) = generate_keypairs(&id, *tx_count as u64 * 2);
|
let (keypairs, _) = generate_keypairs(&id, keypair_count as u64);
|
||||||
let num_accounts = keypairs.len() as u64;
|
let num_accounts = keypairs.len() as u64;
|
||||||
let max_fee =
|
let max_fee =
|
||||||
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
||||||
@ -70,17 +73,21 @@ fn main() {
|
|||||||
exit(1);
|
exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
let (client, num_clients) = get_multi_client(&nodes);
|
let client = if *multi_client {
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
if nodes.len() < num_clients {
|
||||||
|
eprintln!(
|
||||||
|
"Error: Insufficient nodes discovered. Expecting {} or more",
|
||||||
|
num_nodes
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
Arc::new(client)
|
||||||
|
} else {
|
||||||
|
Arc::new(get_client(&nodes))
|
||||||
|
};
|
||||||
|
|
||||||
if nodes.len() < num_clients {
|
let (keypairs, move_keypairs) = if *read_from_client_file && !use_move {
|
||||||
eprintln!(
|
|
||||||
"Error: Insufficient nodes discovered. Expecting {} or more",
|
|
||||||
num_nodes
|
|
||||||
);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
let (keypairs, move_keypairs, keypair_balance) = if *read_from_client_file && !use_move {
|
|
||||||
let path = Path::new(&client_ids_and_stake_file);
|
let path = Path::new(&client_ids_and_stake_file);
|
||||||
let file = File::open(path).unwrap();
|
let file = File::open(path).unwrap();
|
||||||
|
|
||||||
@ -97,10 +104,10 @@ fn main() {
|
|||||||
last_balance = primordial_account.balance;
|
last_balance = primordial_account.balance;
|
||||||
});
|
});
|
||||||
|
|
||||||
if keypairs.len() < tx_count * 2 {
|
if keypairs.len() < keypair_count {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
||||||
tx_count * 2,
|
keypair_count,
|
||||||
client_ids_and_stake_file,
|
client_ids_and_stake_file,
|
||||||
keypairs.len(),
|
keypairs.len(),
|
||||||
);
|
);
|
||||||
@ -110,13 +117,13 @@ fn main() {
|
|||||||
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
||||||
// across multiple runs.
|
// across multiple runs.
|
||||||
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
||||||
(keypairs, None, last_balance)
|
(keypairs, None)
|
||||||
} else {
|
} else {
|
||||||
generate_and_fund_keypairs(
|
generate_and_fund_keypairs(
|
||||||
&client,
|
client.clone(),
|
||||||
Some(*drone_addr),
|
Some(*faucet_addr),
|
||||||
&id,
|
&id,
|
||||||
*tx_count,
|
keypair_count,
|
||||||
*num_lamports_per_account,
|
*num_lamports_per_account,
|
||||||
*use_move,
|
*use_move,
|
||||||
)
|
)
|
||||||
@ -126,11 +133,5 @@ fn main() {
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
do_bench_tps(
|
do_bench_tps(client, cli_config, keypairs, move_keypairs);
|
||||||
vec![client],
|
|
||||||
cli_config,
|
|
||||||
keypairs,
|
|
||||||
keypair_balance,
|
|
||||||
move_keypairs,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
use serial_test_derive::serial;
|
use serial_test_derive::serial;
|
||||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
||||||
use solana_bench_tps::cli::Config;
|
use solana_bench_tps::cli::Config;
|
||||||
use solana_client::thin_client::create_client;
|
use solana_client::thin_client::create_client;
|
||||||
use solana_core::cluster_info::VALIDATOR_PORT_RANGE;
|
use solana_core::cluster_info::VALIDATOR_PORT_RANGE;
|
||||||
use solana_core::validator::ValidatorConfig;
|
use solana_core::validator::ValidatorConfig;
|
||||||
use solana_drone::drone::run_local_drone;
|
use solana_faucet::faucet::run_local_faucet;
|
||||||
|
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
#[cfg(feature = "move")]
|
#[cfg(feature = "move")]
|
||||||
use solana_move_loader_program;
|
use solana_sdk::move_loader::solana_move_loader_program;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::{mpsc::channel, Arc};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
fn test_bench_tps_local_cluster(config: Config) {
|
fn test_bench_tps_local_cluster(config: Config) {
|
||||||
#[cfg(feature = "move")]
|
#[cfg(feature = "move")]
|
||||||
let native_instruction_processors = vec![solana_move_loader_program!()];
|
let native_instruction_processors = vec![solana_move_loader_program()];
|
||||||
|
|
||||||
#[cfg(not(feature = "move"))]
|
#[cfg(not(feature = "move"))]
|
||||||
let native_instruction_processors = vec![];
|
let native_instruction_processors = vec![];
|
||||||
@ -29,36 +29,39 @@ fn test_bench_tps_local_cluster(config: Config) {
|
|||||||
..ClusterConfig::default()
|
..ClusterConfig::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
let faucet_keypair = Keypair::new();
|
||||||
cluster.transfer(
|
cluster.transfer(
|
||||||
&cluster.funding_keypair,
|
&cluster.funding_keypair,
|
||||||
&drone_keypair.pubkey(),
|
&faucet_keypair.pubkey(),
|
||||||
100_000_000,
|
100_000_000,
|
||||||
);
|
);
|
||||||
|
|
||||||
let client = create_client(
|
let client = Arc::new(create_client(
|
||||||
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
||||||
VALIDATOR_PORT_RANGE,
|
VALIDATOR_PORT_RANGE,
|
||||||
);
|
));
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
let (addr_sender, addr_receiver) = channel();
|
||||||
run_local_drone(drone_keypair, addr_sender, None);
|
run_local_faucet(faucet_keypair, addr_sender, None);
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
let faucet_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
let lamports_per_account = 100;
|
let lamports_per_account = 100;
|
||||||
|
|
||||||
let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs(
|
let keypair_count = config.tx_count * config.keypair_multiplier;
|
||||||
&client,
|
let (keypairs, move_keypairs) = generate_and_fund_keypairs(
|
||||||
Some(drone_addr),
|
client.clone(),
|
||||||
|
Some(faucet_addr),
|
||||||
&config.id,
|
&config.id,
|
||||||
config.tx_count,
|
keypair_count,
|
||||||
lamports_per_account,
|
lamports_per_account,
|
||||||
config.use_move,
|
config.use_move,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs);
|
let _total = do_bench_tps(client, config, keypairs, move_keypairs);
|
||||||
assert!(total > 100);
|
|
||||||
|
#[cfg(not(debug_assertions))]
|
||||||
|
assert!(_total > 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -76,7 +79,7 @@ fn test_bench_tps_local_cluster_solana() {
|
|||||||
fn test_bench_tps_local_cluster_move() {
|
fn test_bench_tps_local_cluster_move() {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.tx_count = 100;
|
config.tx_count = 100;
|
||||||
config.duration = Duration::from_secs(20);
|
config.duration = Duration::from_secs(10);
|
||||||
config.use_move = true;
|
config.use_move = true;
|
||||||
|
|
||||||
test_bench_tps_local_cluster(config);
|
test_bench_tps_local_cluster(config);
|
@ -24,7 +24,7 @@ msc {
|
|||||||
... ;
|
... ;
|
||||||
Validator abox Validator [label="\nmax\nlockout\n"];
|
Validator abox Validator [label="\nmax\nlockout\n"];
|
||||||
|||;
|
|||;
|
||||||
StakerX => Cluster [label="StakeState::RedeemCredits()"];
|
Cluster box Cluster [label="credits redeemed (at epoch)"];
|
||||||
StakerY => Cluster [label="StakeState::RedeemCredits()"] ;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
19
book/art/spv-bank-hash.bob
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
+----------+
|
||||||
|
| Bank-Hash|
|
||||||
|
+----------+
|
||||||
|
^
|
||||||
|
|
|
||||||
|
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
|
||||||
|
: :
|
||||||
|
: +--------------+ +-------------+ :
|
||||||
|
: Hash( | Accounts-Hash| + | Block-Merkle| ) :
|
||||||
|
: +--------------+ +-------------+ :
|
||||||
|
: ^ :
|
||||||
|
+~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
|
||||||
|
|
|
||||||
|
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
|
||||||
|
: +---------------+ +---------------+ +---------------+ :
|
||||||
|
: Hash( | Hash(Account1)| + | Hash(Account2)| + ... + | Hash(AccountN)| ) :
|
||||||
|
: +---------------+ +---------------+ +---------------+ :
|
||||||
|
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
+------------+
|
|
||||||
| Bank-Merkle|
|
|
||||||
+------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+-----------------+ +-------------+
|
|
||||||
| Bank-Diff-Merkle| | Block-Merkle|
|
|
||||||
+-----------------+ +-------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+------+ +--------------------------+
|
|
||||||
| Hash | | Previous Bank-Diff-Merkle|
|
|
||||||
+------+ +--------------------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+---------------+ +---------------+
|
|
||||||
| Hash(Account1)| | Hash(Account2)|
|
|
||||||
+---------------+ +---------------+
|
|
@ -7,7 +7,7 @@
|
|||||||
| TVU | |
|
| TVU | |
|
||||||
| | |
|
| | |
|
||||||
| .-------. .------------. .----+---. .---------. |
|
| .-------. .------------. .----+---. .---------. |
|
||||||
.------------. | | Blob | | Retransmit | | Replay | | Storage | |
|
.------------. | | Shred | | Retransmit | | Replay | | Storage | |
|
||||||
| Upstream +----->| Fetch +-->| Stage +-->| Stage +-->| Stage | |
|
| Upstream +----->| Fetch +-->| Stage +-->| Stage +-->| Stage | |
|
||||||
| Validators | | | Stage | | | | | | | |
|
| Validators | | | Stage | | | | | | | |
|
||||||
`------------` | `-------` `----+-------` `----+---` `---------` |
|
`------------` | `-------` `----+-------` `----+---` `---------` |
|
||||||
|
@ -1,30 +1,30 @@
|
|||||||
.--------------------------------------.
|
.---------------------------------------.
|
||||||
| Validator |
|
| Validator |
|
||||||
| |
|
| |
|
||||||
.--------. | .-------------------. |
|
.--------. | .-------------------. |
|
||||||
| |---->| | |
|
| |---->| | |
|
||||||
| Client | | | JSON RPC Service | |
|
| Client | | | JSON RPC Service | |
|
||||||
| |<----| | |
|
| |<----| | |
|
||||||
`----+---` | `-------------------` |
|
`----+---` | `-------------------` |
|
||||||
| | ^ |
|
| | ^ |
|
||||||
| | | .----------------. | .------------------.
|
| | | .----------------. | .------------------.
|
||||||
| | | | Gossip Service |<----------| Validators |
|
| | | | Gossip Service |<-----------| Validators |
|
||||||
| | | `----------------` | | |
|
| | | `----------------` | | |
|
||||||
| | | ^ | | |
|
| | | ^ | | |
|
||||||
| | | | | | .------------. |
|
| | | | | | .------------. |
|
||||||
| | .---+---. .----+---. .-----------. | | | | |
|
| | .---+---. .----+---. .------------. | | | | |
|
||||||
| | | Bank |<-+ Replay | | BlobFetch |<------+ Upstream | |
|
| | | Bank |<-+ Replay | | ShredFetch |<------+ Upstream | |
|
||||||
| | | Forks | | Stage | | Stage | | | | Validators | |
|
| | | Forks | | Stage | | Stage | | | | Validators | |
|
||||||
| | `-------` `--------` `--+--------` | | | | |
|
| | `-------` `--------` `--+---------` | | | | |
|
||||||
| | ^ ^ | | | `------------` |
|
| | ^ ^ | | | `------------` |
|
||||||
| | | | v | | |
|
| | | | v | | |
|
||||||
| | | .--+--------. | | |
|
| | | .--+---------. | | |
|
||||||
| | | | Blocktree | | | |
|
| | | | Blockstore | | | |
|
||||||
| | | `-----------` | | .------------. |
|
| | | `------------` | | .------------. |
|
||||||
| | | ^ | | | | |
|
| | | ^ | | | | |
|
||||||
| | | | | | | Downstream | |
|
| | | | | | | Downstream | |
|
||||||
| | .--+--. .-------+---. | | | Validators | |
|
| | .--+--. .-------+---. | | | Validators | |
|
||||||
`-------->| TPU +---->| Broadcast +--------------->| | |
|
`-------->| TPU +---->| Broadcast +---------------->| | |
|
||||||
| `-----` | Stage | | | `------------` |
|
| `-----` | Stage | | | `------------` |
|
||||||
| `-----------` | `------------------`
|
| `-----------` | `------------------`
|
||||||
`--------------------------------------`
|
`---------------------------------------`
|
||||||
|
@ -5,9 +5,9 @@ cd "$(dirname "$0")"
|
|||||||
|
|
||||||
usage=$(cargo -q run -p solana-cli -- -C ~/.foo --help | sed 's|'"$HOME"'|~|g')
|
usage=$(cargo -q run -p solana-cli -- -C ~/.foo --help | sed 's|'"$HOME"'|~|g')
|
||||||
|
|
||||||
out=${1:-src/api-reference/cli.md}
|
out=${1:-src/cli/usage.md}
|
||||||
|
|
||||||
cat src/api-reference/.cli.md > "$out"
|
cat src/cli/.usage.md.header > "$out"
|
||||||
|
|
||||||
section() {
|
section() {
|
||||||
declare mark=${2:-"###"}
|
declare mark=${2:-"###"}
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd "$(dirname "$0")"
|
|
||||||
|
|
||||||
make -j"$(nproc)" -B svg
|
|
||||||
|
|
||||||
#TODO figure out why book wants to change, but local and CI differ
|
|
||||||
exit 0
|
|
||||||
if [[ -n $CI ]]; then
|
|
||||||
# In CI confirm that no svgs need to be built
|
|
||||||
git diff --exit-code
|
|
||||||
fi
|
|
@ -3,4 +3,14 @@ set -e
|
|||||||
|
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
# md check
|
||||||
|
find src -name '*.md' -a \! -name SUMMARY.md |
|
||||||
|
while read -r file; do
|
||||||
|
if ! grep -q '('"${file#src/}"')' src/SUMMARY.md; then
|
||||||
|
echo "Error: $file missing from SUMMARY.md"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
make -j"$(nproc)" test
|
make -j"$(nproc)" test
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
BOB_SRCS=$(wildcard art/*.bob)
|
BOB_SRCS=$(wildcard art/*.bob)
|
||||||
MSC_SRCS=$(wildcard art/*.msc)
|
MSC_SRCS=$(wildcard art/*.msc)
|
||||||
MD_SRCS=$(wildcard src/*.md)
|
MD_SRCS=$(wildcard src/*.md src/*/*.md)
|
||||||
|
|
||||||
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/.gitbook/assets/%.svg) $(MSC_SRCS:art/%.msc=src/.gitbook/assets/%.svg)
|
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/.gitbook/assets/%.svg) $(MSC_SRCS:art/%.msc=src/.gitbook/assets/%.svg)
|
||||||
|
|
||||||
|
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,210 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,201 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.7 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,340 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.2 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,156 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.7 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,348 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.4 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,140 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.8 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,110 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.3 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
BIN
book/src/.gitbook/assets/p_ex_interest.png
Executable file
After Width: | Height: | Size: 542 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |