Compare commits
1921 Commits
Author | SHA1 | Date | |
---|---|---|---|
a0231f3d87 | |||
e8db4997de | |||
8545ca2cc5 | |||
bbbe44b175 | |||
207b80035e | |||
7dd6ceeb49 | |||
cac5d9005c | |||
33aa2dbb1a | |||
123e444faa | |||
d0de05acaa | |||
f895c3f66d | |||
3cef0f0c03 | |||
1f1c287c6c | |||
b340f3a67f | |||
ae71f2a1a9 | |||
3f91c63110 | |||
5a0f892de4 | |||
92ae07aa93 | |||
3922615cbe | |||
3b5c86dd7c | |||
5f62ad77bd | |||
0f918d0b54 | |||
3616b683f6 | |||
0e3dc27c8d | |||
d0d8ac7eba | |||
b414d151b8 | |||
5766359cde | |||
b8ec5de36d | |||
28ba9e2fa8 | |||
80d780d666 | |||
e599a90333 | |||
efb8b6bf2f | |||
ea3eddfec4 | |||
3a6857c749 | |||
0efb12bb6b | |||
f87bbb9b09 | |||
7e17ea8705 | |||
fbaed07884 | |||
b2cc259197 | |||
17205c3e19 | |||
6b6d5ba4bb | |||
60efe30911 | |||
802695934e | |||
92c893fe2c | |||
96b303e5d9 | |||
854b6fc1ce | |||
a6646f3124 | |||
60ce18250d | |||
1f4222092a | |||
787096f503 | |||
8f6ead2c0f | |||
3fd09435af | |||
f4652561d4 | |||
d7a3610d45 | |||
b2ccf016d6 | |||
c0f62de2dd | |||
d9a9d6547f | |||
c86bf60a40 | |||
03ed4b868d | |||
de83bce0ce | |||
8b494272bf | |||
ee5c890c5d | |||
a4f5397ea4 | |||
66f3b4a3d6 | |||
3a4cd94391 | |||
f4658f3be2 | |||
41c70b9f41 | |||
d1c92db7ab | |||
a8721a5e19 | |||
dec9d00a64 | |||
09252ef084 | |||
c9d568c910 | |||
b054f5f12d | |||
23b4df0fef | |||
ca35841cb1 | |||
33d77357bf | |||
22e84abe5a | |||
9b532b16a9 | |||
c5a98a5b57 | |||
22d60d496b | |||
8243792430 | |||
1d1d85e0c5 | |||
9b0e40d1dc | |||
a231fbe978 | |||
cd2c09c473 | |||
774cd48cb1 | |||
d580603cd4 | |||
f0c931ea84 | |||
74b2eb4328 | |||
f1e9a944ef | |||
4cb38ddf01 | |||
593fde628c | |||
34fa025b17 | |||
33843f824a | |||
542bda0a6f | |||
d8bdbbf291 | |||
168b0f71f5 | |||
be79d97dde | |||
ea2b26e5f5 | |||
d68e2c4d06 | |||
0cfa3d3de7 | |||
0d1f463f7f | |||
ff34bfebde | |||
e103789994 | |||
8a37b1e742 | |||
0cf4eb2ee4 | |||
5496f85dbc | |||
71ff269780 | |||
3879109e4c | |||
f901d71202 | |||
1738632822 | |||
bbd5dde66d | |||
43c0103e4c | |||
6eeca9c6f1 | |||
28d3af6f35 | |||
7f3072d53a | |||
90461245f9 | |||
1c91c1e880 | |||
53c7be32b6 | |||
397ea05aa7 | |||
dadcb632d8 | |||
2de2fbd5e3 | |||
14eca5aea6 | |||
27f38a3770 | |||
7a7abe692e | |||
f46a2cec3c | |||
8e5e48dd92 | |||
a2543e5a8d | |||
e9bdee3dc7 | |||
88033bccbb | |||
b4119c454a | |||
d398898c38 | |||
39fc677781 | |||
dc52b17c4d | |||
ddefc96433 | |||
955d0ab76f | |||
f1172617cc | |||
6ce115ec95 | |||
03d29a8311 | |||
35cc74ef25 | |||
35d6196384 | |||
01fe7c90a5 | |||
26b8747014 | |||
bedb05bdeb | |||
6829b8a6fb | |||
e462a7d1d5 | |||
4c515d0ef1 | |||
7d650eff8d | |||
0b2d4f32fa | |||
4f25013954 | |||
5c7735c40f | |||
e6438098e1 | |||
45b2c138e5 | |||
75d68edfe7 | |||
f80a5b8c34 | |||
1b1980ad49 | |||
3b9b9b1500 | |||
18feba2431 | |||
929a81e636 | |||
00809a67c0 | |||
d1b18a5060 | |||
3fb70b8d47 | |||
b38bf90de7 | |||
8319fa05d0 | |||
564c14a2c6 | |||
6996f45d54 | |||
b1c2c6009e | |||
934f69b660 | |||
84e911361a | |||
364583ea5c | |||
951e1f8b48 | |||
9232057e95 | |||
6c79f56c2c | |||
48eafcc74f | |||
dec9272813 | |||
eb3093d43e | |||
09abbd93b1 | |||
91920cc390 | |||
cc1cc7be94 | |||
2636418659 | |||
31e9074ae5 | |||
e2c316d2d0 | |||
74ee88d9bc | |||
f52c813fc2 | |||
badeb4d31a | |||
e59af8269e | |||
785c2574cd | |||
1a77f7ce3b | |||
6e7dccbbfb | |||
32bfced6a4 | |||
985f5c7351 | |||
621c67a8cb | |||
f2fd53e773 | |||
0fc3c7eee2 | |||
e81ba8e79f | |||
35461df92d | |||
a19ffb353d | |||
35ed432d1a | |||
8c29700402 | |||
171c0d5421 | |||
c01bc4afbd | |||
c404008743 | |||
193c9a08e0 | |||
5468be2ef9 | |||
6f58bdfcb1 | |||
9cf9de6044 | |||
a48dcb1421 | |||
51dad397ed | |||
27c0d30a07 | |||
6c33c3a5ba | |||
e6198debd6 | |||
298ba34c3c | |||
52b5edcb8f | |||
c73e8d9a82 | |||
842eaf90df | |||
24846b7b61 | |||
326a4282bb | |||
854c62e208 | |||
1759968c1e | |||
9e52d11ad0 | |||
d865f1f0c5 | |||
2747c9db23 | |||
bfc67e8680 | |||
d3068c3918 | |||
a931ad40c8 | |||
b4ed88e0f7 | |||
b7b71b31d3 | |||
83c1831a01 | |||
b85996494b | |||
26d31b68d7 | |||
8740bb42c0 | |||
ccb4e32ee0 | |||
2d351d3952 | |||
7ae5ff838b | |||
605b477e06 | |||
7e6e7e8406 | |||
e267dfacdd | |||
f4c5da3c72 | |||
a258e1e0b3 | |||
1fd84cb52b | |||
8dd24bc7d9 | |||
b7af5f08d6 | |||
781dfd9dc4 | |||
f6b48b0a67 | |||
ee099b0880 | |||
51ac05b3cf | |||
9267931ef6 | |||
60141e0c2c | |||
609d6cdf61 | |||
a3ccbe02d0 | |||
996c8cf2eb | |||
528d0b6af8 | |||
33052c1dd2 | |||
c1b401a04a | |||
78d5c1de9a | |||
2ee05f1234 | |||
20e800230f | |||
37a29b979f | |||
1afc527919 | |||
d89174ee82 | |||
f6255c2f9e | |||
ae41c88eb2 | |||
41067de5e4 | |||
dfca2b510b | |||
8bc9d8988f | |||
f7279804b4 | |||
47e1ea107b | |||
799d6aeb19 | |||
f8ccd90eeb | |||
169b772398 | |||
d2e28b0f7e | |||
88bb55ffd2 | |||
5508ac6272 | |||
2be03ca631 | |||
9803f167bd | |||
6a161c740d | |||
5d99853502 | |||
c2ebf466fd | |||
3313b2ff58 | |||
e210e76bd5 | |||
b75438ff32 | |||
82fea9ce73 | |||
79e32c92c1 | |||
322fcea6e5 | |||
5650231df3 | |||
78b2e4df9f | |||
bf9c815b9e | |||
798065fc71 | |||
578aa439be | |||
364781366a | |||
fa64a0b367 | |||
ba46bc4624 | |||
c6e4641781 | |||
9cde67086f | |||
f8b36f4658 | |||
753bd77b41 | |||
a9276700ea | |||
1960ea8ed7 | |||
1b775044f7 | |||
570b98c7bc | |||
81fb9e6a59 | |||
c2761a1259 | |||
0f7bf28617 | |||
60e8cf5a47 | |||
10cf728e11 | |||
eca56eb87d | |||
54d0168746 | |||
e58e48e919 | |||
1f345ce2d9 | |||
ed85aa43a4 | |||
33e34cbba9 | |||
4b0250192a | |||
dd66d16fdb | |||
de82e60c64 | |||
72d227ae91 | |||
4713cb8675 | |||
fdaee4ab17 | |||
32312f3c16 | |||
95d15dc720 | |||
2db83e1a21 | |||
cfbfcb5734 | |||
c28633a949 | |||
7cf90766a3 | |||
f2ee01ace3 | |||
9fbbb17c3b | |||
5e31565574 | |||
723f9a9b81 | |||
baf4e767e1 | |||
c5e5342325 | |||
6123d2f9e8 | |||
788296047a | |||
9dceb8ac74 | |||
ac2374e9a1 | |||
667f9e0d79 | |||
57916f8be6 | |||
e12c577b16 | |||
ba7efbb136 | |||
79987e788e | |||
4a071b06bd | |||
17f169f446 | |||
6662986169 | |||
1c86160e16 | |||
c34cc4918f | |||
4870a2cbac | |||
da7d94d0f0 | |||
cdef065cca | |||
e6676b4d4d | |||
896351e0e8 | |||
fb39bd45d7 | |||
5ef012b2c1 | |||
9c9754fa0f | |||
2e921437cd | |||
5617162cb6 | |||
0c3ff6b75c | |||
7f53737000 | |||
23ea8ae56b | |||
b5f7a4bff9 | |||
18653b825b | |||
aa3694cca8 | |||
844d231d74 | |||
d759a447be | |||
ffae4662bc | |||
a05d772aa9 | |||
cf3bbc09b6 | |||
d25576f8ef | |||
4b42fa2d75 | |||
c1c7e0ff08 | |||
1d503faa2c | |||
18c0f76f89 | |||
4d458a5e00 | |||
92ea11fca1 | |||
cf2bcee607 | |||
db7a3ac826 | |||
f792171ae9 | |||
81550e609b | |||
c28d0d7c34 | |||
6cb0790796 | |||
c2961617bd | |||
08e59b4a3c | |||
7ac4ce637f | |||
586e0a67ef | |||
5aab2866e1 | |||
a20f12865a | |||
0bf1a24bf5 | |||
f9f5bc2eb5 | |||
9fe8c98047 | |||
13fc518268 | |||
c06876eb3d | |||
f331f1d1e9 | |||
054deb809b | |||
865ddfc63f | |||
315940b6a9 | |||
211cae5811 | |||
2c6599c73b | |||
58139ce5ae | |||
8e888059d8 | |||
8d0236e3f1 | |||
774e9df2e5 | |||
faae122375 | |||
a6363e56b6 | |||
214c041bf7 | |||
ae7700296d | |||
f09183765c | |||
2f92b92a8a | |||
fee97236bf | |||
520f7c3e18 | |||
97752b4937 | |||
2c8c2029d8 | |||
4fbe36d9c6 | |||
4f4618441c | |||
e5a7d08966 | |||
11fc684f3c | |||
d50aef8404 | |||
5637f88aff | |||
f14bc0bb59 | |||
c50d2a6311 | |||
284273a73f | |||
4c5d0fc51f | |||
75a92d58cb | |||
db18611c86 | |||
bf199a2ebc | |||
db05864a69 | |||
f97d33e3a7 | |||
16e3ba86d5 | |||
cc05019bbb | |||
f57e48a209 | |||
7c964cf79f | |||
c9e58743e7 | |||
a09cf1470a | |||
57dc46fcfe | |||
06b445ac07 | |||
b4da83a3ab | |||
a964570b1a | |||
50bbe34b66 | |||
c10b2e6cc0 | |||
c4ed80d544 | |||
67d07254c2 | |||
74a648accb | |||
35365974bf | |||
355a40800d | |||
701d90a41d | |||
56f6ee84f1 | |||
e2a5ec9cd2 | |||
aea0326b82 | |||
93ad637c5c | |||
6be5e21aaf | |||
43795193c4 | |||
62429585ba | |||
e987d0094f | |||
093b5b5267 | |||
678a5aff83 | |||
03dc4a20a1 | |||
de3765ab70 | |||
5f079137e5 | |||
94f0c081a6 | |||
229836511d | |||
f2f041bb7c | |||
3562774f8b | |||
374b776a3e | |||
5763d63737 | |||
9d805dfc59 | |||
e6390b754f | |||
7babfd00c1 | |||
571dc4e387 | |||
3ed34b571c | |||
d7e4c8e3cf | |||
57e90948a8 | |||
26a20a7e62 | |||
b6a8268da3 | |||
61d7467ba8 | |||
7fa809c16d | |||
84f74807d4 | |||
4f59077318 | |||
3a9c03cc89 | |||
f055d2f0cc | |||
72fb52ec60 | |||
62c22c6cb1 | |||
dbd337c616 | |||
eeda7338cc | |||
261ea00efb | |||
02647c25a9 | |||
433b0808e4 | |||
529b163bd0 | |||
9c9991db1d | |||
aacead62c0 | |||
ae5a6a06bb | |||
60320e6b6e | |||
169ece8226 | |||
5020a4aa6b | |||
4c49566a89 | |||
ab60c578b9 | |||
050021cf77 | |||
8240d1fe0a | |||
fd6e7020eb | |||
261b869e27 | |||
d6d5b4429c | |||
67d7375ab9 | |||
020d34187c | |||
5486e4c364 | |||
33e2af341a | |||
cca08c3923 | |||
bb9f07183b | |||
22e807c212 | |||
a60a3efc1a | |||
558a362c46 | |||
19ae556857 | |||
5dd3a07a23 | |||
58a6c9a5f0 | |||
7053978861 | |||
3d44cffcda | |||
4b1de02bbb | |||
078a3aeccd | |||
abaccd6882 | |||
3fe54206aa | |||
debee350f8 | |||
890be36fd3 | |||
c9be9acd14 | |||
8eab673b1c | |||
e5806d07a6 | |||
11e6197a83 | |||
accd49f2e4 | |||
54cf9aaa1e | |||
8bbc8343ff | |||
a4e72ac037 | |||
1d0be265d9 | |||
d379786c90 | |||
ca9d4e34df | |||
6657312f44 | |||
2636a9c9f1 | |||
05ada97d00 | |||
4c54245969 | |||
5157bdd8ce | |||
8fa28f965c | |||
51b3451e20 | |||
fee5c6c057 | |||
9917ece826 | |||
8d94972d88 | |||
5cbd1190b2 | |||
1a71804ef2 | |||
1650519962 | |||
355564e486 | |||
1e3543e953 | |||
e83f6332bf | |||
0dbf7995b5 | |||
0d16db2d1b | |||
10565277d6 | |||
e0858cfe06 | |||
48d754220b | |||
958cbe688b | |||
783e8672e7 | |||
d93b552e8c | |||
365fe70f77 | |||
6c4e656795 | |||
86213d38fe | |||
b757294864 | |||
8b99e6dfbe | |||
0d4a2c5eb0 | |||
64f23ab26a | |||
31a276b628 | |||
742562fc2e | |||
ce65604154 | |||
75c0a268e0 | |||
badcb8b0e3 | |||
c48c9be913 | |||
92295dea4f | |||
76223f5ae7 | |||
ea015ccbe8 | |||
2f50d0e145 | |||
268beb3489 | |||
20d13f51a9 | |||
ffdf36c65b | |||
ff608992ee | |||
7e31a67d81 | |||
c0ec2ca27a | |||
a2595b44c6 | |||
180f415736 | |||
6541d9fbb0 | |||
de4f564780 | |||
14cb6353c0 | |||
9e680112e7 | |||
c90595cba1 | |||
de1636c792 | |||
e26f68fe62 | |||
39ba9cb489 | |||
08d4570ce5 | |||
084706c5ea | |||
d63518a835 | |||
b31d334ef4 | |||
5c4c562a2d | |||
f10438d530 | |||
7459eb15c3 | |||
c44e7ce184 | |||
bd19fe5909 | |||
82615c703b | |||
bc2141fbe0 | |||
f5964b4f3c | |||
d5ba90d375 | |||
167adff22c | |||
5f54573613 | |||
2b43b117dc | |||
1aec9e38fa | |||
c1880e3f3e | |||
c490a50c91 | |||
ee791e2e3e | |||
140d4ccf77 | |||
ceacc42126 | |||
a6479eb6e9 | |||
84c8a5bbec | |||
e1f4e8a84a | |||
8135279335 | |||
5dceeec1ca | |||
8f5a1535af | |||
92a5979558 | |||
8b64de0a3c | |||
9c30e98df6 | |||
c1d788880d | |||
385086359c | |||
176c7d8b13 | |||
a85604b2ba | |||
bf1ecc2441 | |||
92d2452f33 | |||
1853771930 | |||
772ee4b29d | |||
c62a4a1c13 | |||
008dcd71b9 | |||
ee4266bc59 | |||
294d531e0b | |||
e05f8faa74 | |||
fc4aa71193 | |||
0d7efe5176 | |||
b426dfb2c0 | |||
fd33b27af1 | |||
39f89e5a56 | |||
b881029de3 | |||
7682db4826 | |||
61fe1aa9cf | |||
468095ede2 | |||
9dc5da7dbd | |||
a18cd29411 | |||
b13c690f0c | |||
a7fd726872 | |||
6a082d2310 | |||
a317e9513f | |||
ee0c570d54 | |||
7607800d47 | |||
b35c022629 | |||
11cec8f24e | |||
df205f8752 | |||
affcb5ec43 | |||
bdda79343e | |||
1833db51a5 | |||
81c36699c4 | |||
d3052d094c | |||
4c4b7d39b8 | |||
e8d88f3237 | |||
cc8575dd96 | |||
f28782cb84 | |||
c58e7dd631 | |||
d9817c153a | |||
6057768fdc | |||
4a20c2aa1b | |||
e5f902369c | |||
1f9fde5f7b | |||
c3782082bc | |||
a452249bf3 | |||
3d3b03a123 | |||
719c03d33f | |||
609b18c2cd | |||
5279b83d34 | |||
05d2eec45c | |||
0cbc0dc79c | |||
9210f40c38 | |||
3237e897d7 | |||
f1110f2e85 | |||
5ffb6b874b | |||
c4a5442146 | |||
bd74e63702 | |||
f78b865cba | |||
7062fe4b47 | |||
b6da5a3f47 | |||
5fb2d7a98f | |||
ceaf4781b0 | |||
933e835838 | |||
94eb78d399 | |||
02ee2a601c | |||
b19d9a50d3 | |||
355640b5db | |||
dfa6238342 | |||
3b0d48e3b8 | |||
2b696ac8dc | |||
8362b408d9 | |||
62f6a78ccd | |||
f7e039e7ac | |||
61bd14c40a | |||
5dd85f1533 | |||
0d20bc5e14 | |||
a82754913f | |||
5840e3bbdf | |||
e8ab599bae | |||
85e5fbeb35 | |||
475f6fe666 | |||
9f354522a7 | |||
0c2a49391a | |||
e3a6c9234a | |||
6089c8030b | |||
643d0b0868 | |||
3cc5d8df7f | |||
34155fc36f | |||
f840eefcbf | |||
e1f3e33bfb | |||
36fcb4fbca | |||
22667d64d1 | |||
4786143524 | |||
f78baf80e4 | |||
33e7e23484 | |||
50214f059f | |||
57f778bcdb | |||
c3f07eb85a | |||
8adac30c05 | |||
5a5a6b3840 | |||
2803eb0d72 | |||
f41fb7d772 | |||
156399e8aa | |||
5745a54d4c | |||
3548d42a6c | |||
7dfb735db9 | |||
1609765740 | |||
2510f3d352 | |||
50ab34ad92 | |||
47535b9ff1 | |||
ffc748becb | |||
34ab25a88b | |||
8b9c3a2561 | |||
362a39a941 | |||
9f2119920c | |||
afb24d28ca | |||
0c62cf8980 | |||
f1d58f980b | |||
b1dfbf0ac4 | |||
12ad95eb5e | |||
7aaf5bc02c | |||
85f03b590d | |||
a29f0484dc | |||
8e6e72babd | |||
def71164f4 | |||
eda46d30bb | |||
d87910eb15 | |||
7257d2845d | |||
9744eb0ccd | |||
a273ddcd97 | |||
99a97b7008 | |||
3d098d2ed9 | |||
db768b4c3a | |||
4ac1213c9c | |||
a0f3208828 | |||
97db802be3 | |||
28f2c75137 | |||
81bb208a62 | |||
6979a17674 | |||
bd20c5e791 | |||
b4935ff4ed | |||
e1dd74f1bf | |||
e2ecacc141 | |||
6512aced21 | |||
615da845cd | |||
2c7f49c3e6 | |||
ba59741b60 | |||
52da207f83 | |||
ef8eff69e4 | |||
1abdeca4c1 | |||
6e82978931 | |||
4e827af392 | |||
f6b63a7dbc | |||
6bb22902cc | |||
881a6dc0f7 | |||
877e7a3893 | |||
bb80116605 | |||
0ffe7a9c8f | |||
9b8d59d2e9 | |||
f7bd7a41d2 | |||
3fc5009ef2 | |||
bde4ba04af | |||
f1ad69c84e | |||
97ea75a890 | |||
52f6da5cee | |||
aeaa0feb61 | |||
1207664bbb | |||
19d16e75c6 | |||
51cf559ce1 | |||
63d62c33c6 | |||
919c066e5a | |||
4125d01668 | |||
087c43b9ef | |||
c18ea3ccc9 | |||
564b590c89 | |||
d36ecb5c91 | |||
e2d6f01ad3 | |||
5034331131 | |||
faafee6b42 | |||
80f618f011 | |||
84f763d079 | |||
0dc0594aaa | |||
d651cb7a25 | |||
f18aa4e423 | |||
ab4f370e15 | |||
d6f824abc0 | |||
3450b9a44d | |||
afaf95cf53 | |||
8c371dd2fb | |||
bb558acdf0 | |||
159e518671 | |||
4798e7fa73 | |||
f4534ef12d | |||
8e0f41a790 | |||
b1203da82c | |||
e366fb6328 | |||
32de5e6e7a | |||
93ae98812b | |||
2c2de12e88 | |||
bd193535c9 | |||
d4d1e5e15b | |||
f7a670596f | |||
a8b82a0b68 | |||
bb25a06baa | |||
8b7cca986a | |||
626e16a177 | |||
814af378a7 | |||
a252acf539 | |||
01eb7600d9 | |||
52c2191545 | |||
25403e61ed | |||
f402b477b2 | |||
8df8f84701 | |||
ccee6241a6 | |||
4d13d3871d | |||
bb0c9d6145 | |||
8d105042ea | |||
84304cb0fc | |||
89fe297416 | |||
d853b20d7f | |||
b28407d98a | |||
4fa795b026 | |||
c298474e6f | |||
d925902b3f | |||
99eeb63f71 | |||
ff95f6dcfa | |||
8258532791 | |||
e73cbdda61 | |||
94f1132fb6 | |||
4ee212ae4c | |||
d5fb493aa4 | |||
88ea950652 | |||
e4519d6447 | |||
471bc73a23 | |||
75a2b74751 | |||
4e69408f54 | |||
38602d60b3 | |||
1fe1550a30 | |||
827f2b3a5c | |||
a948c9b7f9 | |||
1363841f32 | |||
4688f9821f | |||
0c90c889cd | |||
9f6c9c428b | |||
fd443d85c4 | |||
b4f0f4abcc | |||
d22848f9b1 | |||
79416381dc | |||
d791c70d90 | |||
802537564b | |||
1d0608200c | |||
cd14a940d8 | |||
58d4e32c97 | |||
1b6a200d6f | |||
08f6a2ea3e | |||
97d57d168b | |||
2b219228ce | |||
07d11be6ab | |||
7981431f09 | |||
a43922ccbf | |||
687818aad6 | |||
b7a5136136 | |||
0fde19239b | |||
771d1a78fd | |||
a8eb0409b7 | |||
b6151b5200 | |||
c68ebbb0a6 | |||
1b84092b94 | |||
b1d43ace14 | |||
6085109171 | |||
cd89f280b7 | |||
54f4d13350 | |||
799d3b1575 | |||
b3b782988c | |||
5e128f8cc2 | |||
c8c0815144 | |||
d59aae4849 | |||
342733be54 | |||
2da7601084 | |||
958c345f0c | |||
fe83c66686 | |||
5884469d11 | |||
9ee5f36068 | |||
c02373493b | |||
4090600717 | |||
8a4179da67 | |||
ed093f86f9 | |||
07a049aa59 | |||
7b77fbd525 | |||
e1e295e1b6 | |||
5b4ee36cfd | |||
784943ecab | |||
4f86c0b74a | |||
5b4f24eabd | |||
a2986d3b6b | |||
032d523737 | |||
238aa2133d | |||
eaf1b91148 | |||
4ae48b56f3 | |||
8c15214923 | |||
7a603d72bf | |||
5b51bb27b6 | |||
8231d2b672 | |||
6597c71e23 | |||
e30ca01999 | |||
12bb05c320 | |||
8aa7a851ca | |||
2a17e90b7b | |||
f154a53e5e | |||
7911895b67 | |||
d6aaab0b2c | |||
be9fa22db7 | |||
b72c5689c9 | |||
9dcf3347f5 | |||
72e9492ca6 | |||
572e942413 | |||
3ae9357a36 | |||
1dbb5c8647 | |||
06d8c06119 | |||
cc0e455a51 | |||
a01520e694 | |||
c524d62ce0 | |||
dd4640e1ed | |||
42c7d57fc0 | |||
efd09ecd37 | |||
14f6d5c82b | |||
c7710fdd24 | |||
b5aa03dd7c | |||
a81dd80d60 | |||
09ca92d416 | |||
56ed033233 | |||
e56efe237c | |||
3f0ff45de0 | |||
3709dc6558 | |||
6ec0318bae | |||
92e419f1c7 | |||
ccc0f2d956 | |||
80bb0158b7 | |||
f12592826f | |||
8d38777c1f | |||
832dfd4ab0 | |||
04d2db4dbb | |||
6f269e5a0e | |||
eb3991b9ba | |||
aee63f15c2 | |||
aced847735 | |||
e360e63b74 | |||
a6c4525998 | |||
77b196a226 | |||
b6b9c2cf56 | |||
59d900977d | |||
0f5acb86d3 | |||
911dee24c5 | |||
f03e066ec5 | |||
f7d3f55566 | |||
4298b1f595 | |||
870503ee36 | |||
4d14abbd04 | |||
5212b2716c | |||
97c0573c7d | |||
43cc9fcb1d | |||
47b5ba44e9 | |||
e95397e0a8 | |||
c7cdf8ba93 | |||
6ee734e1b4 | |||
3ab1b46ef7 | |||
22891b39d6 | |||
b6ce7ec782 | |||
a41c7451f1 | |||
6cb2040a1b | |||
937f9ad049 | |||
c2fc0f2418 | |||
9278201198 | |||
149a63100d | |||
d09afdbefe | |||
1d6bafbc77 | |||
01d2b4e952 | |||
05f3437601 | |||
f859243191 | |||
9ddc25283c | |||
388d4a8592 | |||
0b0b679120 | |||
3b752876ac | |||
9b8b7dbfd7 | |||
c209e14e40 | |||
6df1f6450f | |||
6d7cb23c61 | |||
bd7e269280 | |||
b05b42d74d | |||
af733a678a | |||
8a5045f05c | |||
4a336eb5ff | |||
b7e08052ae | |||
f6a4acfac3 | |||
68eff230f0 | |||
c78db6a94b | |||
294d9288d2 | |||
7dc5cc26a6 | |||
d7a2b790dc | |||
a7a10e12c7 | |||
8d243221f0 | |||
84368697af | |||
4a57cd3300 | |||
2214d2dbb5 | |||
50a991fdf9 | |||
4e093525c7 | |||
506b305959 | |||
e83efcfc80 | |||
4f1c881227 | |||
a642168369 | |||
8d296d0969 | |||
68b11c1c29 | |||
c209718a6f | |||
b8835312bb | |||
7796e87814 | |||
64c770275b | |||
855f7ff352 | |||
b59a99111c | |||
252257fe66 | |||
e2c9d87d91 | |||
9d34b80ed6 | |||
c63a38ae57 | |||
20da2604f8 | |||
33de2cad6d | |||
aef7bae60d | |||
54ac7ed1ea | |||
0180246680 | |||
dab7de7496 | |||
feaf29792f | |||
5f09aa36b3 | |||
d6c74f438a | |||
349ebec629 | |||
f4554be72c | |||
8537da19bb | |||
d1eff5d607 | |||
19e4f70244 | |||
a233a1c822 | |||
27bc0a22dd | |||
7ee8383e02 | |||
bab0f6be1e | |||
535df0026d | |||
3bd35dd7cc | |||
39d29fab82 | |||
fbfe1a59a6 | |||
77c79effc1 | |||
83540087c3 | |||
937816e67b | |||
c3a941086d | |||
1046c5e32c | |||
baac8d2590 | |||
610a02c518 | |||
444bd7a702 | |||
7afc61e0b9 | |||
d4d9bec2a9 | |||
d647a4ec57 | |||
536b4c1a25 | |||
547a7a345f | |||
26e380e53c | |||
8a12ed029c | |||
b41e8333b1 | |||
8f646e21d7 | |||
5608af0246 | |||
17b9ea3e3b | |||
88d4d1db7a | |||
cab4c88c71 | |||
4ec5a899f5 | |||
c2f74330ef | |||
2c8e0bcf87 | |||
4966ab528e | |||
5f81a67298 | |||
a0ccdccff1 | |||
735c7c9841 | |||
3a69459645 | |||
21cef2fe21 | |||
038c6ea0a7 | |||
81f4fd56c7 | |||
264a3d7dde | |||
43bf176fab | |||
baec17fdf4 | |||
186b514ebb | |||
2d42c1e33e | |||
9cef522eee | |||
a6302acfd5 | |||
ac72265c6b | |||
09da6b4b48 | |||
0d8f5379a0 | |||
02c7b89a8f | |||
90ae33c200 | |||
55c879ce2d | |||
1b5a332239 | |||
595017499e | |||
9b1471acae | |||
b766ac0899 | |||
e6b525a614 | |||
a07b17b9b5 | |||
9d2940d487 | |||
6969ece2dd | |||
48fc35884c | |||
0958905df8 | |||
c95cda51c9 | |||
3f54c0f1a6 | |||
4684faa5e8 | |||
111d0eb89b | |||
8b69998379 | |||
a21251dfea | |||
06cd7c1020 | |||
782846f295 | |||
19e131d710 | |||
9fd34cd985 | |||
adfb8ff2a1 | |||
83aa609540 | |||
1e1cb7c57c | |||
cdbd1b908a | |||
a12e7a2e33 | |||
25080f1a33 | |||
afa05acb32 | |||
d47caf2af8 | |||
a3a91ba222 | |||
751b54b60b | |||
488dd0e563 | |||
b58558ea4e | |||
6ad9dc18d8 | |||
027ebb6670 | |||
0ffd91df27 | |||
10d85f8366 | |||
7aad427511 | |||
bbd0455418 | |||
5174b3bc3f | |||
f88c72c41e | |||
9f678cc32a | |||
57036fbcc1 | |||
349e5001d6 | |||
94db9cd412 | |||
b505a0df22 | |||
acf096c5f7 | |||
e8583f5cfe | |||
5825b967d2 | |||
bf5bce50a4 | |||
77ea8b9b3e | |||
176cec6215 | |||
5ab4975c44 | |||
7e60ee39d9 | |||
3ea2933e2d | |||
fe87c05423 | |||
6b86f85916 | |||
04649de6a6 | |||
92d78451b1 | |||
0c87928132 | |||
db7e78bf99 | |||
adecd4cfdc | |||
40faaef9da | |||
9b54528c8e | |||
440d006ec1 | |||
6c49b10784 | |||
c858d1dbb3 | |||
741a0a8a4e | |||
16b6576839 | |||
6accf21229 | |||
d2b21ce8d0 | |||
b01990d480 | |||
d7fdfb7e21 | |||
19fe468dbc | |||
259a5130a8 | |||
0d27515d09 | |||
1c966aac25 | |||
d2b6c2e0ce | |||
7aecb87bce | |||
4a02914b30 | |||
7c12ecbe81 | |||
f093377805 | |||
5ac173d208 | |||
9f58318fc5 | |||
ebcdc06dc3 | |||
22315d88e7 | |||
0a36a78133 | |||
a25446f045 | |||
2860d2fe27 | |||
e4861f52e0 | |||
5698d48dc8 | |||
5b95685e12 | |||
4c90898f0b | |||
a191f3fd90 | |||
b2c776eabc | |||
2c8d6f87e6 | |||
08f6de0acd | |||
bd92f37553 | |||
2abbc89dcd | |||
8cad992170 | |||
41d0db078e | |||
8781aebe06 | |||
727c15ef8a | |||
e4926e4110 | |||
b50a3bae72 | |||
35ec7a5156 | |||
a383ea532f | |||
b1a678b2db | |||
e563a4dda3 | |||
dbe533385e | |||
f537482c86 | |||
aebd70ddce | |||
7d80cfb17a | |||
b8e7736af2 | |||
32b55e6703 | |||
0a949677f0 | |||
f777a1a74c | |||
d111223085 | |||
1ca7e9f67b | |||
bc8f435d45 | |||
5e221bf219 | |||
fc58b3e8c3 | |||
1033f52877 | |||
4771177f9d | |||
50c6b5d62d | |||
f9a2254688 | |||
49250f62aa | |||
22ef3c7c54 | |||
417e8d5064 | |||
1feb9bea21 | |||
563c42b829 | |||
841e5e326c | |||
281deae102 | |||
c5ba2e0883 | |||
eb4edd75e6 | |||
bb6bcd79c0 | |||
ef7022d638 | |||
2aac094f63 | |||
fc180f4cbf | |||
e26a0bf840 | |||
3557975c1f | |||
b4aebbd991 | |||
db13b52e6a | |||
f1f6537837 | |||
2ec5d2c7f5 | |||
42e5623e26 | |||
ab9f2adc69 | |||
f551b34725 | |||
55b8ff72d0 | |||
bf319ab06d | |||
12ef0c25b5 | |||
8620d0a3b2 | |||
933ae51fcc | |||
c1201e54fa | |||
3615445a12 | |||
091999a17e | |||
417066ad30 | |||
2abe051a1f | |||
65adce65fa | |||
0c8f187993 | |||
cbd2938035 | |||
0999225794 | |||
38b44f2496 | |||
c1953dca8f | |||
19ea5fe0c0 | |||
d7ed3b8024 | |||
a89589a1d5 | |||
41bda18046 | |||
0c832f4668 | |||
75b494d4a3 | |||
f0191a98ab | |||
76413cbfac | |||
0fa1af5d47 | |||
af1c70f032 | |||
278614fc7c | |||
baca35ef4d | |||
66552d7047 | |||
979df17328 | |||
6cec61dcfc | |||
a9b044f0ab | |||
fbea9d8621 | |||
44a572416d | |||
97c97db97e | |||
b8ae025f90 | |||
27221e28f6 | |||
9a52b01171 | |||
8cea650535 | |||
531679eeaf | |||
850f77ab3b | |||
4a10fd3272 | |||
9e2eb9e4f9 | |||
8120b57f17 | |||
f651c0922a | |||
8d2ec20201 | |||
dce1f80aac | |||
df1c473341 | |||
8a64e1ddc3 | |||
eb47538a82 | |||
861d6468ca | |||
d6737b8cc9 | |||
30592f2b12 | |||
1f950781c2 | |||
f20ba423ca | |||
c5e6ebb496 | |||
9e7f618cff | |||
74a06e4230 | |||
70f93cc126 | |||
3f8ff23125 | |||
29611fb61d | |||
407b1d3e6f | |||
206e62271b | |||
4e78354ab6 | |||
1561d9c8d4 | |||
0e1480b84e | |||
fd6047d1c5 | |||
b0467be393 | |||
1b0b095813 | |||
bd43724dfc | |||
11992946a4 | |||
0cc8a841ab | |||
23b6b85bf0 | |||
96b56fa6f7 | |||
405ca1bcb2 | |||
c6316bb24b | |||
b7f169e06e | |||
e4b466874c | |||
9911942dbd | |||
8acbb4ab2f | |||
a49f5378e2 | |||
f39e74f0d7 | |||
22b767308a | |||
36aa876833 | |||
06ba0b7279 | |||
a38e1a81ef | |||
da925142d1 | |||
5feeb257bb | |||
06c547094a | |||
a40c5cf185 | |||
deb83cdef6 | |||
20db335aed | |||
407db65336 | |||
9c5a3cd277 | |||
138a49e820 | |||
36c9e22e3d | |||
aa0f8538ed | |||
4177c56c51 | |||
425ac8d520 | |||
ada4d16c4c | |||
4069ef2e02 | |||
ace98bba08 | |||
e59b53dfa8 | |||
aacb38864c | |||
33d13a3aea | |||
1f0f947ed2 | |||
6854c64a09 | |||
4a32bc48d2 | |||
b430762a23 | |||
f8523db51d | |||
48b11d1841 | |||
3600a926df | |||
c228792967 | |||
7ea522e851 | |||
63503ad589 | |||
9800e09431 | |||
2e2b1881f5 | |||
61483c18ca | |||
a5279bb835 | |||
357554b209 | |||
41fbdc6e08 | |||
8bd1c57448 | |||
2562e48b9d | |||
46bb79df29 | |||
6bc0d2a0cb | |||
465cd45833 | |||
b4484b89c3 | |||
c029f069f0 | |||
fdb57bc5db | |||
e43a634944 | |||
2da7c7fbd3 | |||
5683282c94 | |||
44967abd1c | |||
8b41a5d725 | |||
07c183bb84 | |||
7fd879b417 | |||
dc5c6e7cf8 | |||
bd633d2b81 | |||
feeaad619a | |||
b44d8c394e | |||
0ff9c4cd8e | |||
9cafd1f85e | |||
7fe10ba060 | |||
cc48773b03 | |||
8fbf0e2d9f | |||
d86358eedc | |||
fe04fb4cd3 | |||
de3f7e9634 | |||
5e8fcdbe1d | |||
3ee7256c0c | |||
2a7a9fdf03 | |||
5bf87de136 | |||
97a136ea20 | |||
735dfab02e | |||
b5f65ce49c | |||
a283863694 | |||
25908feef9 | |||
b91ad6fd96 | |||
02abf422df | |||
3fe5f886d7 | |||
4c6a6d63bf | |||
589a9d3a72 | |||
bd884a56bf | |||
119467df59 | |||
ee68b9800e | |||
c6b4a3a706 | |||
b1ac8f933b | |||
9e3758983d | |||
34c0537e9b | |||
8628f33d0b | |||
ed05aeaef8 | |||
e1444a9b00 | |||
9514169bf6 | |||
fa8394f526 | |||
1cd8c1865e | |||
e3f895d7d4 | |||
8abf22f34b | |||
a016bc2736 | |||
470debef16 | |||
c147dc3028 | |||
bdd95b2286 | |||
efe676bc94 | |||
fc34687687 | |||
6042ccf496 | |||
f1197e1b1f | |||
8c1b9a0b67 | |||
0da9ac1a47 | |||
c1f316721a | |||
8e86014311 | |||
d807217be7 | |||
bc44516eb4 | |||
b78a13d42c | |||
0dcdc37fec | |||
dd1c3514a8 | |||
767efab941 | |||
288a3bdcd9 | |||
8019bff391 | |||
575a897ffc | |||
697228a484 | |||
ca907f37c3 | |||
439e7cc26a | |||
3217a1d70c | |||
6dbba86cc6 | |||
8cc863ea6c | |||
1d957b6b80 | |||
e56430c9fb | |||
e4d8ea11ac | |||
a4035a3c65 | |||
807c69d97c | |||
9259d342ac | |||
b4d4edb645 | |||
966b6999d1 | |||
73491e3ca1 | |||
d1d53c3fb6 | |||
a77e576cd9 | |||
9e14cde461 | |||
a2a7c86c0d | |||
38aeed02fc | |||
64d63966c7 | |||
38ae54b720 | |||
a18c0e34f4 | |||
be3a0b6b10 | |||
9f6496d38a | |||
1fa31c9410 | |||
2b5e757d57 | |||
0dbe5ee559 | |||
6926e89e86 | |||
ec0007217d | |||
91b23f8316 | |||
2fd8d57504 | |||
0595109f98 | |||
9f46b2a6ce | |||
a357d08524 | |||
177c9cc026 | |||
0c4cb76acf | |||
8676b5d40c | |||
efab896c9e | |||
97b9d57b62 | |||
487826a539 | |||
4acb764589 | |||
9de4c1dcd9 | |||
e8c4302d6d | |||
a9f73ea321 | |||
66c41b3e8c | |||
8435fbfa0b | |||
9a4c449135 | |||
ac6dbf8f04 | |||
b55927370b | |||
002fbc4d53 | |||
53deb7919c | |||
8e46c44f3e | |||
37c2fa1d8d | |||
fdaa939892 | |||
c9d63204eb | |||
cfab54511b | |||
492cc93850 | |||
fd9fd43e83 | |||
191483f4ee | |||
688f8a669a | |||
46eea85022 | |||
1c765124e7 | |||
194491ae96 | |||
2ae595294c | |||
ead947e710 | |||
82df267ec9 | |||
53275cc678 | |||
44835a91db | |||
ee42040e6b | |||
2b98a16ec6 | |||
aa4a7b0c73 | |||
8f50c3dd2e | |||
9c47ce30a7 | |||
3433b08b8c | |||
d26fd27bf9 | |||
5c98c1d306 | |||
51aacfe3ca | |||
82bd2df986 | |||
aa88c40a9e | |||
8ec5a47027 | |||
5bd3eb4557 | |||
e9cb4a12dc | |||
de5cad9211 | |||
e3365529de | |||
ce2ce76958 | |||
16f2fb5c09 | |||
d77c98530f | |||
fe40b75ac6 | |||
e7129757c9 | |||
3635a68129 | |||
70a16e91a5 | |||
41daf1ef0c | |||
ff77789718 | |||
a77775cb58 | |||
167e15a5ae | |||
dea663d509 | |||
9754e551cb | |||
40a4ac15f1 | |||
c56052ff16 | |||
482ef51502 | |||
e4ca3900ae | |||
3574469052 | |||
e15246746d | |||
ec5cca41bc | |||
bc1368ba3e | |||
c0a161afe8 | |||
d343c409e6 | |||
64e8a21d73 | |||
ce04d2bfc2 | |||
1c1d83bd56 | |||
028e111fbc | |||
9670788bf5 | |||
d2f9625878 | |||
182096dc1a | |||
2d284ba6db | |||
1de805e7cd | |||
d642125f68 | |||
b8aff218e2 | |||
045d4d5294 | |||
d67dd8ce1f | |||
4d6679906b | |||
4537f54532 | |||
39b40dfff8 | |||
c82f4a1b6d | |||
7a021dff05 | |||
348c2263ba | |||
b5324063f1 | |||
6ed071c4dd | |||
4404634b14 | |||
6a1de33138 | |||
c05c3e69ca | |||
534244b322 | |||
335dfdc4d5 | |||
a7ef409c2b | |||
14594217db | |||
c8a03c7b3d | |||
9fcd162412 | |||
441fed7a5b | |||
ff31ffbd54 | |||
0e26ee854b | |||
5340800cea | |||
13c2e50b38 | |||
dd39b2b056 | |||
65f89d6729 | |||
1eceb4831d | |||
50303c9ede | |||
ed6a438c51 | |||
2adb98a4a0 | |||
471465a5f4 | |||
942785b626 | |||
aa3c00231a | |||
d772a27936 | |||
0302f13b97 | |||
16b25d0874 | |||
c2dcbee6af | |||
1f71d05299 | |||
bfa1c025fd | |||
8611b40074 | |||
916844d399 | |||
4c9b7c9d2b | |||
9843c3a5cb | |||
f56955a17c | |||
9784bbf154 | |||
45642c4da1 | |||
8eac199e8b | |||
2e251ccc5c | |||
cf4bb70d80 | |||
57f8a15b96 | |||
cfe5afd34c | |||
94beb4b8c2 | |||
50207a30ef | |||
35e8f966e3 | |||
943cd0a24a | |||
0b892b2579 | |||
fb2eac20bb | |||
b37d2fde3d | |||
6b35e16676 | |||
6a9e0bc593 | |||
591fd72e0b | |||
2ed77b040a | |||
7ada8510c4 | |||
b8f6c17dee | |||
2f976ae460 | |||
36019cb1e3 | |||
99d2428041 | |||
c121498b5b | |||
eef2bdf690 | |||
190656967d | |||
90e73515ed | |||
1d7a758c97 | |||
e5b7aead12 | |||
578c2ad3ea | |||
de6838da78 | |||
604071c5d8 | |||
41a377013f | |||
52d453d06f | |||
58295b825d | |||
f6c7812fcc | |||
2f7561e4ee | |||
1cbd2372fc | |||
28f948aa7f | |||
c9ba9e4eb7 | |||
f877fb8c8f | |||
772ba41ede | |||
6374e69a69 | |||
ef0580bd3d | |||
1a77486f8e | |||
ead15d294e | |||
1acfcf3acf | |||
d15e248cdb | |||
f1e5edee14 | |||
7153abd483 | |||
90fb5d074d | |||
af82b0dce9 | |||
d4da2fbacd | |||
77efe95730 | |||
86e03a6d1b | |||
114e2989fa | |||
7024c73e9b | |||
6d418aa3f1 | |||
f079a78c5e | |||
6365c4c061 | |||
55cee5742f | |||
034eda4546 | |||
44ff25d044 | |||
a7e160e5c4 | |||
6283cc916d | |||
4b6aca6120 | |||
20b2be6e0b | |||
cbebc7a80c | |||
06eb2364f2 | |||
167890ca63 | |||
392a39dd54 | |||
7e1a7862db | |||
458ae3fdac | |||
431cc82032 | |||
18c6729d6c | |||
9476fe5ce3 | |||
788290ad82 | |||
6b5bcfaa58 | |||
4ed0cded9c | |||
035a364122 | |||
b114bc3674 | |||
bc74ee7117 | |||
b2ce5dc9f5 | |||
e920191de0 | |||
39e85a3e53 | |||
41156da4ca | |||
9271ba0039 | |||
b3e45fd6b7 | |||
7bfb60f82e | |||
359c50f1b3 | |||
fff1631a8b | |||
7d42ae30d9 | |||
87414de3e2 | |||
a0ffbf50a5 | |||
d40b66ff7b | |||
abd7f6b090 | |||
d8735df1de | |||
481853e1b1 | |||
778bcbce50 | |||
fd3f2cb910 | |||
915956b94b | |||
4576250342 | |||
2bef1b0433 | |||
628128b376 | |||
916017ca2c | |||
3204a00e73 | |||
1d327a5167 | |||
6e4f9cedf2 | |||
a79fbbafc9 | |||
1d54d29076 | |||
10b9a4806b | |||
0c1191c3ee | |||
18b386cd10 | |||
714b8c7fc8 | |||
216e9a61a0 | |||
0f498e6265 | |||
e8ad822111 | |||
65a82ebf50 | |||
727802684c | |||
e20a8329d3 | |||
88c2d0fad4 | |||
3bd921264a | |||
7501ed65e5 | |||
2eaa64c4e8 | |||
c9b86018c6 | |||
a4fb01b42b | |||
0d2574f8f0 | |||
796000e96f | |||
e2f00dc205 | |||
5e91f8f59d | |||
e2830f5b0e | |||
a2e3a92b01 | |||
23c696706b | |||
1393d26f63 | |||
1b68da7572 | |||
8542006259 | |||
426d06b89b | |||
06378d6db6 | |||
dccfe31e8c | |||
1dce5976cf | |||
340d01665c | |||
50f79e495e | |||
dd12db2f06 | |||
1afccb7351 | |||
bfc65e829e | |||
eb4515525d | |||
55f5f6a033 | |||
7ae421eaf6 | |||
e7da2c0931 | |||
133be2df51 | |||
06a93dcb43 | |||
ad7f04a245 | |||
0da6e1af14 | |||
576524f13b | |||
f567877d1d | |||
9881820444 | |||
ba8f49366d | |||
81fa69d347 | |||
abf2b300da | |||
a8254fd258 | |||
b15848de3b | |||
ab3c988146 | |||
575a0e318b | |||
a031b09190 | |||
df43e721e3 | |||
5f72650c7f | |||
5d0d467287 | |||
994515d0f2 | |||
1e949caa7f | |||
f2b727b534 | |||
f7680752e7 | |||
da4c37beec | |||
d486d2b8ce | |||
bba94c43b9 | |||
9cdffc7d64 | |||
5a86f2506d | |||
518227eac0 | |||
b8fd51e97d | |||
965c1e0000 | |||
a80176496d | |||
5719b8f251 | |||
1a2b131ceb | |||
349306ddf7 | |||
791ee411a5 | |||
f690c64375 | |||
427963f554 | |||
b0f2220ef6 | |||
908b48bf0e | |||
b49f8c0984 | |||
7609a007c6 | |||
674a49f8d7 | |||
d10bde656a | |||
401764ddb1 | |||
69eeb7cf08 | |||
55e3b7d380 | |||
d9e18a71ec | |||
2107e15bd3 | |||
4f3b22d04e | |||
2c78a93001 | |||
2621aeee82 | |||
8e400fc4bd | |||
29c2a63c8b | |||
736ada4e21 | |||
3df9b44d4c | |||
7225b89142 | |||
0cc0d3ab7a | |||
88d9618788 | |||
57038529e0 | |||
5c25eae631 | |||
b8b4d33f72 | |||
673a9417ef | |||
3fd9aada8b | |||
453fdb9e28 | |||
3f6a79b078 | |||
e9f80e5542 | |||
694d28acf8 | |||
88fdba5aca | |||
a19df7a36c | |||
9b50583641 | |||
71f9b44687 | |||
0139e5db21 | |||
586fb15c2c | |||
297328ff9a | |||
6b3384c205 | |||
3ef961fe37 | |||
a7b695c27a | |||
5bb75a5894 | |||
f3f416b7ba | |||
31b74bdf0b | |||
ed48d8323c | |||
f91627a230 | |||
f9c093022c | |||
7fe3c75c6b | |||
c8ed41167a | |||
5b2a82a951 | |||
441e76ebeb | |||
c2dfb9900e | |||
916458e132 | |||
ffb15578ce | |||
abcbbb925f | |||
059755fe59 | |||
ae12dc2c75 | |||
37b5c6afaa | |||
92ed7b36a2 | |||
379d2e6d95 | |||
7f75cc8906 | |||
1ab5098576 | |||
598f765960 | |||
aac626c2c2 | |||
3eec3cfac2 | |||
5eee9e62e5 | |||
a7d18125d3 | |||
8202310073 | |||
1e2ba110eb | |||
62c9b7d850 | |||
4f18fc836f | |||
950d8494ba | |||
cb528af4e2 | |||
ad27c30623 | |||
9add8d0afc | |||
af2e7ea285 | |||
675a78aaa1 | |||
408bdbce7a | |||
1a259d4a3f | |||
c5f8b4960c | |||
21f845ed39 | |||
7a369df9a7 | |||
f02ec31c68 | |||
d21fa4a177 | |||
bd0871cbe7 | |||
2604f8ac0a | |||
a7574f8657 | |||
73f250f03a | |||
bae0aadafa | |||
5524146ddf | |||
3b2adbc9df | |||
4e41c81bc7 | |||
c545e812d0 | |||
c2193a37ce | |||
fabba82173 | |||
c3ec5ad846 | |||
c4945cc04a | |||
e2e55f81d0 | |||
d862565b16 | |||
0cc3956693 | |||
4e5677f116 | |||
acba1d6f9e | |||
3e14af5033 | |||
6f56501034 | |||
0b7269b64e | |||
457a2d948b | |||
528bdf34fd | |||
697cd17b59 | |||
13fcfcb964 | |||
9c1fd55768 | |||
7f9a476660 | |||
b07290df81 | |||
4b599a95b3 | |||
64222cfff7 | |||
e81d434903 | |||
bf0dd158de | |||
18e398131d | |||
4a5837a286 | |||
656e2649a7 |
42
.appveyor.yml
Normal file
@ -0,0 +1,42 @@
|
||||
version: '{build}'
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^v[0-9.]+\.[0-9.]+/
|
||||
|
||||
cache:
|
||||
- '%USERPROFILE%\.cargo'
|
||||
- '%APPVEYOR_BUILD_FOLDER%\target'
|
||||
|
||||
clone_folder: d:\projects\solana
|
||||
|
||||
build_script:
|
||||
- bash ci/publish-tarball.sh
|
||||
|
||||
notifications:
|
||||
- provider: Slack
|
||||
incoming_webhook:
|
||||
secure: GJsBey+F5apAtUm86MHVJ68Uqa6WN1SImcuIc4TsTZrDhA8K1QWUNw9FFQPybUWDyOcS5dly3kubnUqlGt9ux6Ad2efsfRIQYWv0tOVXKeY=
|
||||
channel: ci-status
|
||||
on_build_success: false
|
||||
on_build_failure: true
|
||||
on_build_status_changed: true
|
||||
|
||||
deploy:
|
||||
- provider: S3
|
||||
access_key_id:
|
||||
secure: fTbJl6JpFebR40J7cOWZ2mXBa3kIvEiXgzxAj6L3N7A=
|
||||
secret_access_key:
|
||||
secure: vItsBXb2rEFLvkWtVn/Rcxu5a5+2EwC+b7GsA0waJy9hXh6XuBAD0lnHd9re3g/4
|
||||
bucket: release.solana.com
|
||||
region: us-west-1
|
||||
set_public: true
|
||||
|
||||
- provider: GitHub
|
||||
auth_token:
|
||||
secure: 81fEmPZ0cV1wLtNuUrcmtgxKF6ROQF1+/ft5m+fHX21z6PoeCbaNo8cTyLioWBj7
|
||||
draft: false
|
||||
prerelease: false
|
||||
on:
|
||||
appveyor_repo_tag: true
|
1
.buildkite/env/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/secrets_unencrypted.ejson
|
17
.buildkite/env/secrets.ejson
vendored
@ -1,12 +1,15 @@
|
||||
{
|
||||
"_public_key": "ae29f4f7ad2fc92de70d470e411c8426d5d48db8817c9e3dae574b122192335f",
|
||||
"environment": {
|
||||
"CODECOV_TOKEN": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:jA0WqO70coUtF0iokRdgtCR/lF/lETAI:d/Wl8Tdl6xVh/B39cTf1DaQkomR7I/2vMhvxd1msJ++BjI2l3p2dFoGsXqWT+/os8VgiPg==]",
|
||||
"CRATES_IO_TOKEN": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:2FaZ6k4RGH8luyNRaN6yeZUQDNAu2KwC:XeYe0tCAivYE0F9HEWM79mAI6kNbfYaqP7k7yY+SBDvs0341U9BdGZp7SErbHleS]",
|
||||
"GITHUB_TOKEN": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:9kh4DGPiGDcUU7ejSFWg3gTW8nrOM09Q:b+GE07Wu6/bEnkDZcUtf48vTKAFphrCSt3tNNER9h6A+wZ80k499edw4pbDdl9kEvxB30fFwrLQ=]",
|
||||
"INFLUX_DATABASE": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:rCHsYi0rc7dmvr1V3wEgNoaNIyr+9ClM:omjVcOqM7vwt44kJ+As4BjJL]",
|
||||
"INFLUX_PASSWORD": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:bP5Gw1Vy66viKFKO41o2Gho998XajH/5:khkCYz2LFvkJkk7R4xY1Hfz1yU3/NENjauiUkPhXA+dmg1qOIToxEagCgIkRwyeCiYaoCR6CZyw=]",
|
||||
"INFLUX_USERNAME": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:ZamCvza2W9/bZRGSkqDu55xNN04XKKhp:5jlmCOdFbpL7EFez41zCbLfk3ZZlfmhI]",
|
||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:Oi2nsRxnvWnnBYsB6KwEDzLPcYgpYojU:ELbvjXkXKlgFCMES45R+fxG7Ex43WHWErjMbxZoqasxyr7GSH66hQzUWqiQSJyT4ukYrRhRC9YrsKKGkjACLU57X4EGIy9TuLgTnyBYhPnxLYStC3y/7o/MB5FCTt5wHJw3/A9p+me5+T4UmyZ7OeP21NhDUCGQcb0040VwYWS78klW2aQESJJ6wTI1xboE8/zC0vtnB/u50+LydbKEyb21r6y3OH9FYNEpSwIspWKcgpruJdQSCnDoKxP9YR1yzvk2rabss13LJNdV1Y6mQNIdP4OIFQhCs6dXT253RTl5qdZ0MruHwlp8wX4btOuYDcCoM5exr]"
|
||||
"CODECOV_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:JnxhrIxh09AvqdJgrVSYmb7PxSrh19aE:07WzVExCHEd1lJ1m8QizRRthGri+WBNeZRKjjEvsy5eo4gv3HD7zVEm42tVTGkqITKkBNQ==]",
|
||||
"CRATES_IO_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:d0jJqC32/axwzq/N7kMRmpxKhnRrhtpt:zvcPHwkOzGnjhNkAQSejwdy1Jkr9wR1qXFFCnfIjyt/XQYubzB1tLkoly/qdmeb5]",
|
||||
"GEOLOCATION_API_KEY": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R4gfB6Ey4i50HyfLt4UZDLBqg3qHEUye:UfZCOgt8XI6Y2g+ivCRVoS1fjFycFs7/GSevvCqh1B50mG0+hzpEyzXQLuKG5OeI]",
|
||||
"GITHUB_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Vq2dkGTOzfEpRht0BAGHFp/hDogMvXJe:tFXHg1epVt2mq9hkuc5sRHe+KAnVREi/p8S+IZu67XRyzdiA/nGak1k860FXYuuzuaE0QWekaEc=]",
|
||||
"INFLUX_DATABASE": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:5KI9WBkXx3R/W4m256mU5MJOE7N8aAT9:Cb8QFELZ9I60t5zhJ9h55Kcs]",
|
||||
"INFLUX_PASSWORD": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:hQRMpLCrav+OYkNphkeM4hagdVoZv5Iw:AUO76rr6+gF1OLJA8ZLSG8wHKXgYCPNk6gRCV8rBhZBJ4KwDaxpvOhMl7bxxXG6jol7v4aRa/Lk=]",
|
||||
"INFLUX_USERNAME": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R7BNmQjfeqoGDAFTJu9bYTGHol2NgnYN:Q2tOT/EBcFvhFk+DKLKmVU7tLCpVC3Ui]",
|
||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Egc2dMrHDU0NcZ71LwGv/V66shUhwYUE:04VoIb8CKy7KYhQ5W4cEW9SDKZltxWBL5Hob106lMBbUOD/yUvKYcG3Ep8JfTMwO3K8zowW5HpU/IdGoilX0XWLiJJ6t+p05WWK0TA16nOEtwrEG+UK8wm3sN+xCO20i4jDhpNpgg3FYFHT5rKTHW8+zaBTNUX/SFxkN67Lm+92IM28CXYE43SU1WV6H99hGFFVpTK5JVM3JuYU1ex/dHRE+xCzTr4MYUB/F+nGoNFW8HUDV/y0e1jxT9to3x0SmnytEEuk+5RUzFuEt9cKNFeNml3fOCi4qL+sfj/Y5pjH9xDiUxsvH/8NL35jbLP244aFHgWcp]",
|
||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_apple_darwin": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:NeOxSoWCvXB9AL4H6OK26l/7bmsKd/oz:Ijfoxtvk2CHlN1ZXHup3Gg/914kbbAkEGWJfvozA8UIe+aUzUObMyTrKkVOeNAH8Q8YH9tNzk7RRnrTcpnzeCCBLlWcVEeruMxHox3mPRzmSeDLxtbzCl9VePlRO3T7jg90K5hW+ZAkd5J/WJNzpAcmr93ts/of3MbvGHSujId/efCTzJEcP6JInnBb8Vrj7TlgKbzUlnqpq1+NjYPSXN3maKa9pKeo2JWxZlGBMoy6QWUUY5GbYEylw9smwh1LJcHZjlaZNMuOl4gNKtaSr38IXQkAXaRUJDPAmPras00YObKzXU8RkTrP4EoP/jx5LPR7f]",
|
||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_pc_windows_msvc": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:7t+56twjW+jR7fpFNNeRFLPd7E4lbmyN:JuviDpkQrfVcNUGRGsa2e/UhvH6tTYyk1s4cHHE5xZH1NByL7Kpqx36VG/+o1AUGEeSQdsBnKgzYdMoFYbO8o50DoRPc86QIEVXCupD6J9avxLFtQgOWgJp+/mCdUVXlqXiFs/vQgS/L4psrcKdF6WHd77BeUr6ll8DjH+9m5FC9Rcai2pXno6VbPpunHQ0oUdYzhFR64+LiRacBaefQ9igZ+nSEWDLqbaZSyfm9viWkijoVFTq8gAgdXXEh7g0QdxVE5T6bPristJhT6jWBhWunPUCDNFFErWIsbRGctepl4pbCWqh2hNTw9btSgVfeY6uGCOsdy9E=]"
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
CI_BUILD_START=$(date +%s)
|
||||
export CI_BUILD_START
|
||||
|
||||
source ci/env.sh
|
||||
|
||||
#
|
||||
# Kill any running docker containers, which are potentially left over from the
|
||||
# previous CI job
|
||||
@ -31,3 +33,10 @@ export CI_BUILD_START
|
||||
kill -9 "$victim" || true
|
||||
done
|
||||
)
|
||||
|
||||
# HACK: These are in our docker images, need to be removed from CARGO_HOME
|
||||
# because we try to cache downloads across builds with CARGO_HOME
|
||||
# cargo lacks a facility for "system" tooling, always tries CARGO_HOME first
|
||||
cargo uninstall cargo-audit || true
|
||||
cargo uninstall svgbob_cli || true
|
||||
cargo uninstall mdbook || true
|
||||
|
@ -10,6 +10,8 @@
|
||||
set -x
|
||||
rsync -a --delete --link-dest="$PWD" target "$d"
|
||||
du -hs "$d"
|
||||
read -r cacheSizeInGB _ < <(du -s --block-size=1800000000 "$d")
|
||||
echo "--- ${cacheSizeInGB}GB: $d"
|
||||
)
|
||||
|
||||
#
|
||||
|
@ -14,14 +14,18 @@ export PS4="++"
|
||||
(
|
||||
set -x
|
||||
d=$HOME/cargo-target-cache/"$BUILDKITE_LABEL"
|
||||
MAX_CACHE_SIZE=18 # gigabytes
|
||||
|
||||
if [[ -d $d ]]; then
|
||||
du -hs "$d"
|
||||
read -r cacheSizeInGB _ < <(du -s --block-size=1000000000 "$d")
|
||||
if [[ $cacheSizeInGB -gt 10 ]]; then
|
||||
echo "$d has gotten too large, removing it"
|
||||
read -r cacheSizeInGB _ < <(du -s --block-size=1800000000 "$d")
|
||||
echo "--- ${cacheSizeInGB}GB: $d"
|
||||
if [[ $cacheSizeInGB -gt $MAX_CACHE_SIZE ]]; then
|
||||
echo "--- $d is too large, removing it"
|
||||
rm -rf "$d"
|
||||
fi
|
||||
else
|
||||
echo "--- $d not present"
|
||||
fi
|
||||
|
||||
mkdir -p "$d"/target
|
||||
|
@ -10,11 +10,22 @@
|
||||
set -e
|
||||
cd "$(dirname "$0")"/..
|
||||
|
||||
buildkite-agent pipeline upload ci/buildkite.yml
|
||||
if [[ -n $BUILDKITE_TAG ]]; then
|
||||
buildkite-agent annotate --style info --context release-tag \
|
||||
"https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG"
|
||||
buildkite-agent pipeline upload ci/buildkite-release.yml
|
||||
else
|
||||
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
||||
# Add helpful link back to the corresponding Github Pull Request
|
||||
buildkite-agent annotate --style info --context pr-backlink \
|
||||
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
||||
fi
|
||||
|
||||
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
||||
# Add helpful link back to the corresponding Github Pull Request
|
||||
buildkite-agent annotate --style info --context pr-backlink \
|
||||
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
||||
if [[ $BUILDKITE_MESSAGE =~ GitBook: ]]; then
|
||||
buildkite-agent annotate --style info --context gitbook-ci-skip \
|
||||
"GitBook commit detected, CI skipped"
|
||||
exit
|
||||
fi
|
||||
|
||||
buildkite-agent pipeline upload ci/buildkite.yml
|
||||
fi
|
||||
|
||||
|
5
.gitbook.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
root: ./book/src
|
||||
|
||||
structure:
|
||||
readme: introduction.md
|
||||
summary: SUMMARY.md
|
24
.github/stale.yml
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
only: pulls
|
||||
|
||||
# Number of days of inactivity before a pull request becomes stale
|
||||
daysUntilStale: 30
|
||||
|
||||
# Number of days of inactivity before a stale pull request is closed
|
||||
daysUntilClose: 7
|
||||
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- security
|
||||
|
||||
# Label to use when marking a pull request as stale
|
||||
staleLabel: stale
|
||||
|
||||
# Comment to post when marking a pull request as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This pull request has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs.
|
||||
|
||||
# Comment to post when closing a stale pull request. Set to `false` to disable
|
||||
closeComment: >
|
||||
This stale pull request has been automatically closed.
|
||||
Thank you for your contributions.
|
12
.gitignore
vendored
@ -1,21 +1,16 @@
|
||||
/book/html/
|
||||
/book/src/img/
|
||||
/book/src/tests.ok
|
||||
/core/target/
|
||||
/farf/
|
||||
/ledger-tool/target/
|
||||
/solana-release/
|
||||
solana-release.tar.bz2
|
||||
/solana-release.tar.bz2
|
||||
/solana-metrics/
|
||||
/solana-metrics.tar.bz2
|
||||
/target/
|
||||
/wallet/target/
|
||||
|
||||
**/*.rs.bk
|
||||
.cargo
|
||||
|
||||
# node config that is rsynced
|
||||
/config/
|
||||
# node config that remains local
|
||||
/config-local/
|
||||
|
||||
# log files
|
||||
*.log
|
||||
@ -24,3 +19,4 @@ log-*.txt
|
||||
# intellij files
|
||||
/.idea/
|
||||
/solana.iml
|
||||
/.vscode/
|
||||
|
77
.mergify.yml
Normal file
@ -0,0 +1,77 @@
|
||||
# Validate your changes with:
|
||||
#
|
||||
# $ curl -F 'data=@.mergify.yml' https://gh.mergify.io/validate
|
||||
#
|
||||
# https://doc.mergify.io/
|
||||
pull_request_rules:
|
||||
- name: remove outdated reviews
|
||||
conditions:
|
||||
- base=master
|
||||
actions:
|
||||
dismiss_reviews:
|
||||
changes_requested: true
|
||||
- name: set automerge label on mergify backport PRs
|
||||
conditions:
|
||||
- author=mergify[bot]
|
||||
- head~=^mergify/bp/
|
||||
- "#status-failure=0"
|
||||
actions:
|
||||
label:
|
||||
add:
|
||||
- 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
|
||||
conditions:
|
||||
- base=master
|
||||
- label=v0.22
|
||||
actions:
|
||||
backport:
|
||||
branches:
|
||||
- v0.22
|
42
.travis.yml
Normal file
@ -0,0 +1,42 @@
|
||||
os:
|
||||
- osx
|
||||
|
||||
language: rust
|
||||
rust:
|
||||
- stable
|
||||
|
||||
install:
|
||||
- source ci/rust-version.sh
|
||||
|
||||
script:
|
||||
- source ci/env.sh
|
||||
- ci/publish-tarball.sh
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^v\d+\.\d+/
|
||||
|
||||
notifications:
|
||||
slack:
|
||||
on_success: change
|
||||
secure: F4IjOE05MyaMOdPRL+r8qhs7jBvv4yDM3RmFKE1zNXnfUOqV4X38oQM1EI+YVsgpMQLj/pxnEB7wcTE4Bf86N6moLssEULCpvAuMVoXj4QbWdomLX+01WbFa6fLVeNQIg45NHrz2XzVBhoKOrMNnl+QI5mbR2AlS5oqsudHsXDnyLzZtd4Y5SDMdYG1zVWM01+oNNjgNfjcCGmOE/K0CnOMl6GPi3X9C34tJ19P2XT7MTDsz1/IfEF7fro2Q8DHEYL9dchJMoisXSkem5z7IDQkGzXsWdWT4NnndUvmd1MlTCE9qgoXDqRf95Qh8sB1Dz08HtvgfaosP2XjtNTfDI9BBYS15Ibw9y7PchAJE1luteNjF35EOy6OgmCLw/YpnweqfuNViBZz+yOPWXVC0kxnPIXKZ1wyH9ibeH6E4hr7a8o9SV/6SiWIlbYF+IR9jPXyTCLP/cc3sYljPWxDnhWFwFdRVIi3PbVAhVu7uWtVUO17Oc9gtGPgs/GrhOMkJfwQPXaudRJDpVZowxTX4x9kefNotlMAMRgq+Drbmgt4eEBiCNp0ITWgh17BiE1U09WS3myuduhoct85+FoVeaUkp1sxzHVtGsNQH0hcz7WcpZyOM+AwistJA/qzeEDQao5zi1eKWPbO2xAhi2rV1bDH6bPf/4lDBwLRqSiwvlWU=
|
||||
|
||||
deploy:
|
||||
- provider: s3
|
||||
access_key_id: $AWS_ACCESS_KEY_ID
|
||||
secret_access_key: $AWS_SECRET_ACCESS_KEY
|
||||
bucket: release.solana.com
|
||||
region: us-west-1
|
||||
skip_cleanup: true
|
||||
acl: public_read
|
||||
local_dir: travis-s3-upload
|
||||
on:
|
||||
all_branches: true
|
||||
- provider: releases
|
||||
api_key: $GITHUB_TOKEN
|
||||
skip_cleanup: true
|
||||
file_glob: true
|
||||
file: travis-release-upload/*
|
||||
on:
|
||||
tags: true
|
@ -103,7 +103,7 @@ Solana's architecture is described by a book generated from markdown files in
|
||||
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
|
||||
under the [Accepted Design
|
||||
Proposals](https://solana-labs.github.io/book-edge/proposals.html) chapter.
|
||||
Proposals](https://docs.solana.com/book/v/master/proposals) chapter.
|
||||
Here's the full process:
|
||||
|
||||
1. Propose a design by creating a PR that adds a markdown document to the
|
||||
|
4996
Cargo.lock
generated
43
Cargo.toml
@ -1,41 +1,64 @@
|
||||
[workspace]
|
||||
members = [
|
||||
".",
|
||||
"bench-exchange",
|
||||
"bench-streamer",
|
||||
"bench-tps",
|
||||
"banking_bench",
|
||||
"chacha-sys",
|
||||
"client",
|
||||
"core",
|
||||
"drone",
|
||||
"fullnode",
|
||||
"validator",
|
||||
"genesis",
|
||||
"genesis_programs",
|
||||
"gossip",
|
||||
"install",
|
||||
"keygen",
|
||||
"kvstore",
|
||||
"ledger",
|
||||
"ledger-tool",
|
||||
"local_cluster",
|
||||
"logger",
|
||||
"merkle-tree",
|
||||
"measure",
|
||||
"metrics",
|
||||
"programs/bpf",
|
||||
"programs/bpf_loader",
|
||||
"programs/bpf_loader_api",
|
||||
"programs/bpf_loader_program",
|
||||
"programs/budget_api",
|
||||
"programs/budget_program",
|
||||
"programs/btc_spv_program",
|
||||
"programs/btc_spv_api",
|
||||
"programs/btc_spv_bin",
|
||||
"programs/config_api",
|
||||
"programs/config_program",
|
||||
"programs/config_tests",
|
||||
"programs/exchange_api",
|
||||
"programs/exchange_program",
|
||||
"programs/token_api",
|
||||
"programs/token_program",
|
||||
"programs/failure_program",
|
||||
"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",
|
||||
"replicator",
|
||||
"archiver",
|
||||
"runtime",
|
||||
"sdk",
|
||||
"sdk-c",
|
||||
"upload-perf",
|
||||
"netutil",
|
||||
"fixed-buf",
|
||||
"vote-signer",
|
||||
"wallet",
|
||||
"cli",
|
||||
"rayon-threadlimit",
|
||||
]
|
||||
|
||||
exclude = [
|
||||
"programs/bpf",
|
||||
"programs/move_loader_api",
|
||||
"programs/move_loader_program",
|
||||
"programs/librapay_api",
|
||||
]
|
||||
exclude = ["programs/bpf/rust/noop"]
|
||||
|
59
README.md
@ -1,5 +1,5 @@
|
||||
[](https://crates.io/crates/solana)
|
||||
[](https://docs.rs/solana)
|
||||
[](https://crates.io/crates/solana-core)
|
||||
[](https://docs.rs/solana-core)
|
||||
[](https://buildkite.com/solana-labs/solana/builds?branch=master)
|
||||
[](https://codecov.io/gh/solana-labs/solana)
|
||||
|
||||
@ -26,9 +26,43 @@ Furthermore, and much to our surprise, it can be implemented using a mechanism t
|
||||
Architecture
|
||||
===
|
||||
|
||||
Before you jump into the code, review the online book [Solana: Blockchain Rebuilt for Scale](https://solana-labs.github.io/book/).
|
||||
Before you jump into the code, review the online book [Solana: Blockchain Rebuilt for Scale](https://docs.solana.com/book/).
|
||||
|
||||
(The _latest_ development version of the online book is also [available here](https://solana-labs.github.io/book-edge/).)
|
||||
(The _latest_ development version of the online book is also [available here](https://docs.solana.com/book/v/master/).)
|
||||
|
||||
Release Binaries
|
||||
===
|
||||
Official release binaries are available at [Github Releases](https://github.com/solana-labs/solana/releases).
|
||||
|
||||
Additionally we provide pre-release binaries for the latest code on the edge and
|
||||
beta channels. Note that these pre-release binaries may be less stable than an
|
||||
official release.
|
||||
|
||||
### Edge channel
|
||||
#### Linux (x86_64-unknown-linux-gnu)
|
||||
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-unknown-linux-gnu.tar.bz2)
|
||||
* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable
|
||||
#### mac OS (x86_64-apple-darwin)
|
||||
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-apple-darwin.tar.bz2)
|
||||
* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-apple-darwin) as a stand-alone executable
|
||||
#### Windows (x86_64-pc-windows-msvc)
|
||||
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-pc-windows-msvc.tar.bz2)
|
||||
* [solana-install-init.exe](http://release.solana.com/edge/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable
|
||||
#### All platforms
|
||||
* [solana-metrics.tar.bz2](http://release.solana.com.s3.amazonaws.com/edge/solana-metrics.tar.bz2)
|
||||
|
||||
### Beta channel
|
||||
#### Linux (x86_64-unknown-linux-gnu)
|
||||
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-unknown-linux-gnu.tar.bz2)
|
||||
* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable
|
||||
#### mac OS (x86_64-apple-darwin)
|
||||
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-apple-darwin.tar.bz2)
|
||||
* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-apple-darwin) as a stand-alone executable
|
||||
#### Windows (x86_64-pc-windows-msvc)
|
||||
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-pc-windows-msvc.tar.bz2)
|
||||
* [solana-install-init.exe](http://release.solana.com/beta/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable
|
||||
#### All platforms
|
||||
* [solana-metrics.tar.bz2](http://release.solana.com.s3.amazonaws.com/beta/solana-metrics.tar.bz2)
|
||||
|
||||
Developing
|
||||
===
|
||||
@ -41,10 +75,10 @@ Install rustc, cargo and rustfmt:
|
||||
```bash
|
||||
$ curl https://sh.rustup.rs -sSf | sh
|
||||
$ source $HOME/.cargo/env
|
||||
$ rustup component add rustfmt-preview
|
||||
$ rustup component add rustfmt
|
||||
```
|
||||
|
||||
If your rustc version is lower than 1.34.0, please update it:
|
||||
If your rustc version is lower than 1.39.0, please update it:
|
||||
|
||||
```bash
|
||||
$ rustup update
|
||||
@ -66,7 +100,7 @@ $ cd solana
|
||||
Build
|
||||
|
||||
```bash
|
||||
$ cargo build --all
|
||||
$ cargo build
|
||||
```
|
||||
|
||||
Then to run a minimal local cluster
|
||||
@ -80,25 +114,22 @@ Testing
|
||||
Run the test suite:
|
||||
|
||||
```bash
|
||||
$ cargo test --all
|
||||
$ cargo test
|
||||
```
|
||||
|
||||
Local Testnet
|
||||
---
|
||||
|
||||
Start your own testnet locally, instructions are in the book [Solana: Blockchain Rebuild for Scale: Getting Started](https://solana-labs.github.io/book/getting-started.html).
|
||||
Start your own testnet locally, instructions are in the book [Solana: Blockchain Rebuild for Scale: Getting Started](https://docs.solana.com/book/getting-started).
|
||||
|
||||
Remote Testnets
|
||||
---
|
||||
|
||||
We maintain several testnets:
|
||||
|
||||
* `testnet` - public stable testnet accessible via testnet.solana.com, with an https proxy for web apps at api.testnet.solana.com. Runs 24/7
|
||||
* `testnet` - public stable testnet accessible via testnet.solana.com. Runs 24/7
|
||||
* `testnet-beta` - public beta channel testnet accessible via beta.testnet.solana.com. Runs 24/7
|
||||
* `testnet-edge` - public edge channel testnet accessible via edge.testnet.solana.com. Runs 24/7
|
||||
* `testnet-perf` - permissioned stable testnet running a 24/7 soak test
|
||||
* `testnet-beta-perf` - permissioned beta channel testnet running a multi-hour soak test weekday mornings
|
||||
* `testnet-edge-perf` - permissioned edge channel testnet running a multi-hour soak test weekday mornings
|
||||
|
||||
## Deploy process
|
||||
|
||||
@ -209,5 +240,3 @@ problem is solved by this code?" On the other hand, if a test does fail and you
|
||||
better way to solve the same problem, a Pull Request with your solution would most certainly be
|
||||
welcome! Likewise, if rewriting a test can better communicate what code it's protecting, please
|
||||
send us that patch!
|
||||
|
||||
|
||||
|
171
RELEASE.md
@ -59,53 +59,146 @@ There are three release channels that map to branches as follows:
|
||||
* beta - tracks the largest (and latest) `vX.Y` stabilization branch, more stable.
|
||||
* stable - tracks the second largest `vX.Y` stabilization branch, most stable.
|
||||
|
||||
## Release Steps
|
||||
## Steps to Create a Branch
|
||||
|
||||
### Changing channels
|
||||
|
||||
#### Create the new branch
|
||||
1. Pick your branch point for release on master.
|
||||
1. Create the branch. The name should be "v" + the first 2 "version" fields
|
||||
### Create the new branch
|
||||
1. Check out the latest commit on `master` branch:
|
||||
```
|
||||
git fetch --all
|
||||
git checkout upstream/master
|
||||
```
|
||||
1. Determine the new branch name. The name should be "v" + the first 2 version fields
|
||||
from Cargo.toml. For example, a Cargo.toml with version = "0.9.0" implies
|
||||
the next branch name is "v0.9".
|
||||
1. Note the Cargo.toml in the repo root directory does not contain a version. Look at any other Cargo.toml file.
|
||||
1. Create a new branch and push this branch to the solana repository.
|
||||
1. `git checkout -b <branchname>`
|
||||
1. `git push -u origin <branchname>`
|
||||
1. Create the new branch and push this branch to the `solana` repository:
|
||||
```
|
||||
git checkout -b <branchname>
|
||||
git push -u origin <branchname>
|
||||
```
|
||||
|
||||
#### Update master with the next version
|
||||
### Update master branch with the next version
|
||||
|
||||
1. After the new branch has been created and pushed, update Cargo.toml on **master** to the next semantic version (e.g. 0.9.0 -> 0.10.0)
|
||||
by running `./scripts/increment-cargo-version.sh`, then rebuild with
|
||||
`cargo build` to cause a refresh of `Cargo.lock`.
|
||||
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
||||
master branch
|
||||
1. After the new branch has been created and pushed, update the Cargo.toml files on **master** to the next semantic version (e.g. 0.9.0 -> 0.10.0) with:
|
||||
```
|
||||
scripts/increment-cargo-version.sh minor
|
||||
```
|
||||
1. Rebuild to get an updated version of `Cargo.lock`:
|
||||
```
|
||||
cargo build
|
||||
```
|
||||
1. Push all the changed Cargo.toml and Cargo.lock files to the `master` branch with something like:
|
||||
```
|
||||
git co -b version_update
|
||||
git ls-files -m | xargs git add
|
||||
git commit -m 'Update Cargo.toml versions from X.Y to X.Y+1'
|
||||
git push -u origin version_update
|
||||
```
|
||||
1. Confirm that your freshly cut release branch is shown as `BETA_CHANNEL` and the previous release branch as `STABLE_CHANNEL`:
|
||||
```
|
||||
ci/channel_info.sh
|
||||
```
|
||||
|
||||
At this point, `ci/channel-info.sh` should show your freshly cut release branch as
|
||||
"BETA_CHANNEL" and the previous release branch as "STABLE_CHANNEL".
|
||||
## Steps to Create a Release
|
||||
|
||||
### Updating channels (i.e. "making a release")
|
||||
### Create the Release Tag on GitHub
|
||||
|
||||
We use [github's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
||||
|
||||
1. Go [there ;)](https://github.com/solana-labs/solana/releases).
|
||||
1. Go to [GitHub's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
||||
1. Click "Draft new release". The release tag must exactly match the `version`
|
||||
field in `/Cargo.toml` prefixed by `v` (ie, `<branchname>.X`).
|
||||
field in `/Cargo.toml` prefixed by `v`.
|
||||
1. If the Cargo.toml verion field is **0.12.3**, then the release tag must be **v0.12.3**
|
||||
1. Make sure the Target Branch field matches the branch you want to make a release on.
|
||||
1. If you want to release v0.12.0, the target branch must be v0.12
|
||||
1. If this is the first release on the branch (e.g. v0.13.**0**), paste in [this
|
||||
template](https://raw.githubusercontent.com/solana-labs/solana/master/.github/RELEASE_TEMPLATE.md)
|
||||
and fill it in.
|
||||
1. Test the release by generating a tag using semver's rules. First try at a
|
||||
release should be `<branchname>.X-rc.0`.
|
||||
1. Verify release automation:
|
||||
1. [Crates.io](https://crates.io/crates/solana) should have an updated Solana version.
|
||||
1. ...
|
||||
1. After testnet deployment, verify that testnets are running correct software.
|
||||
http://metrics.solana.com should show testnet running on a hash from your
|
||||
newly created branch.
|
||||
1. Once the release has been made, update Cargo.toml on the release branch to the next
|
||||
semantic version (e.g. 0.9.0 -> 0.9.1) by running
|
||||
`./scripts/increment-cargo-version.sh patch`, then rebuild with `cargo
|
||||
build` to cause a refresh of `Cargo.lock`.
|
||||
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
||||
release branch.
|
||||
template](https://raw.githubusercontent.com/solana-labs/solana/master/.github/RELEASE_TEMPLATE.md). Engineering Lead can provide summary contents for release notes if needed.
|
||||
1. Click "Save Draft", then confirm the release notes look good and the tag name and branch are correct. Go back into edit the release and click "Publish release" when ready.
|
||||
|
||||
### Update release branch with the next patch version
|
||||
|
||||
1. After the new release has been tagged, update the Cargo.toml files on **release branch** to the next semantic version (e.g. 0.9.0 -> 0.9.1) with:
|
||||
```
|
||||
scripts/increment-cargo-version.sh patch
|
||||
```
|
||||
1. Rebuild to get an updated version of `Cargo.lock`:
|
||||
```
|
||||
cargo build
|
||||
```
|
||||
1. Push all the changed Cargo.toml and Cargo.lock files to the **release branch** with something like:
|
||||
```
|
||||
git co -b version_update
|
||||
git ls-files -m | xargs git add
|
||||
git commit -m 'Update Cargo.toml versions from X.Y.Z to X.Y.Z+1'
|
||||
git push -u origin version_update
|
||||
```
|
||||
|
||||
### Verify release automation success
|
||||
1. Go to [Solana Releases](https://github.com/solana-labs/solana/releases) and click on the latest release that you just published. Verify that all of the build artifacts are present. This can take up to 90 minutes after creating the tag.
|
||||
1. The `solana-secondary` Buildkite pipeline handles creating the binary tarballs and updated crates. Look for a job under the tag name of the release: https://buildkite.com/solana-labs/solana-secondary
|
||||
1. [Crates.io](https://crates.io/crates/solana) should have an updated Solana version.
|
||||
|
||||
### Update documentation
|
||||
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.
|
||||
|
||||
#### 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
|
||||
|
||||
The testnet running on testnet.solana.com is set to use a fixed release tag
|
||||
which is set in the Buildkite testnet-management pipeline.
|
||||
This tag needs to be updated and the testnet restarted after a new release
|
||||
tag is created.
|
||||
|
||||
#### Update testnet schedules
|
||||
|
||||
Go to https://buildkite.com/solana-labs and click through: Pipelines ->
|
||||
testnet-management -> Pipeline Settings -> Schedules
|
||||
Or just click here:
|
||||
https://buildkite.com/solana-labs/testnet-management/settings/schedules
|
||||
|
||||
There are two scheduled jobs for testnet: a daily restart and an hourly sanity-or-restart. \
|
||||
https://buildkite.com/solana-labs/testnet-management/settings/schedules/0efd7856-7143-4713-8817-47e6bdb05387
|
||||
https://buildkite.com/solana-labs/testnet-management/settings/schedules/2a926646-d972-42b5-aeb9-bb6759592a53
|
||||
|
||||
On each schedule:
|
||||
1. Set TESTNET_TAG environment variable to the desired release tag.
|
||||
1. Example, TESTNET_TAG=v0.13.2
|
||||
1. Set the Build Branch to the branch that TESTNET_TAG is from.
|
||||
1. Example: v0.13
|
||||
|
||||
#### Restart the testnet
|
||||
|
||||
Trigger a TESTNET_OP=create-and-start to refresh the cluster with the new version
|
||||
|
||||
1. Go to https://buildkite.com/solana-labs/testnet-management
|
||||
2. Click "New Build" and use the following settings, then click "Create Build"
|
||||
1. Commit: HEAD
|
||||
1. Branch: [channel branch as set in the schedules]
|
||||
1. Environment Variables:
|
||||
```
|
||||
TESTNET=testnet
|
||||
TESTNET_TAG=[same value as used in TESTNET_TAG in the schedules]
|
||||
TESTNET_OP=create-and-start
|
||||
```
|
||||
|
||||
### Alert the community
|
||||
|
||||
Notify Discord users on #validator-support that a new release for
|
||||
testnet.solana.com is available
|
||||
|
2
archiver/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/target/
|
||||
/farf/
|
18
archiver/Cargo.toml
Normal file
@ -0,0 +1,18 @@
|
||||
[package]
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-archiver"
|
||||
version = "0.20.5"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
console = "0.9.0"
|
||||
solana-core = { path = "../core", version = "0.20.5" }
|
||||
solana-logger = { path = "../logger", version = "0.20.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.5" }
|
||||
|
125
archiver/src/main.rs
Normal file
@ -0,0 +1,125 @@
|
||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
||||
use console::style;
|
||||
use solana_core::archiver::Archiver;
|
||||
use solana_core::cluster_info::{Node, VALIDATOR_PORT_RANGE};
|
||||
use solana_core::contact_info::ContactInfo;
|
||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||
use std::net::SocketAddr;
|
||||
use std::path::PathBuf;
|
||||
use std::process::exit;
|
||||
use std::sync::Arc;
|
||||
|
||||
// Return an error if a keypair file cannot be parsed.
|
||||
fn is_keypair(string: String) -> Result<(), String> {
|
||||
read_keypair_file(&string)
|
||||
.map(|_| ())
|
||||
.map_err(|err| format!("{:?}", err))
|
||||
}
|
||||
|
||||
fn main() {
|
||||
solana_logger::setup();
|
||||
|
||||
let matches = App::new(crate_name!())
|
||||
.about(crate_description!())
|
||||
.version(crate_version!())
|
||||
.arg(
|
||||
Arg::with_name("identity")
|
||||
.short("i")
|
||||
.long("identity")
|
||||
.value_name("PATH")
|
||||
.takes_value(true)
|
||||
.validator(is_keypair)
|
||||
.help("File containing an identity (keypair)"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("entrypoint")
|
||||
.short("n")
|
||||
.long("entrypoint")
|
||||
.value_name("HOST:PORT")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.validator(solana_netutil::is_host_port)
|
||||
.help("Rendezvous with the cluster at this entry point"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("ledger")
|
||||
.short("l")
|
||||
.long("ledger")
|
||||
.value_name("DIR")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.help("use DIR as persistent ledger location"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("storage_keypair")
|
||||
.short("s")
|
||||
.long("storage-keypair")
|
||||
.value_name("PATH")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.validator(is_keypair)
|
||||
.help("File containing the storage account keypair"),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
||||
|
||||
let keypair = if let Some(identity) = matches.value_of("identity") {
|
||||
read_keypair_file(identity).unwrap_or_else(|err| {
|
||||
eprintln!("{}: Unable to open keypair file: {}", err, identity);
|
||||
exit(1);
|
||||
})
|
||||
} else {
|
||||
Keypair::new()
|
||||
};
|
||||
let storage_keypair = if let Some(storage_keypair) = matches.value_of("storage_keypair") {
|
||||
read_keypair_file(storage_keypair).unwrap_or_else(|err| {
|
||||
eprintln!("{}: Unable to open keypair file: {}", err, storage_keypair);
|
||||
exit(1);
|
||||
})
|
||||
} else {
|
||||
Keypair::new()
|
||||
};
|
||||
|
||||
let entrypoint_addr = matches
|
||||
.value_of("entrypoint")
|
||||
.map(|entrypoint| {
|
||||
solana_netutil::parse_host_port(entrypoint).expect("failed to parse entrypoint address")
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
let gossip_addr = {
|
||||
let ip = solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap();
|
||||
let mut addr = SocketAddr::new(ip, 0);
|
||||
addr.set_ip(solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap());
|
||||
addr
|
||||
};
|
||||
let node =
|
||||
Node::new_archiver_with_external_ip(&keypair.pubkey(), &gossip_addr, VALIDATOR_PORT_RANGE);
|
||||
|
||||
println!(
|
||||
"{} version {} (branch={}, commit={})",
|
||||
style(crate_name!()).bold(),
|
||||
crate_version!(),
|
||||
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
||||
option_env!("CI_COMMIT").unwrap_or("unknown")
|
||||
);
|
||||
solana_metrics::set_host_id(keypair.pubkey().to_string());
|
||||
println!(
|
||||
"replicating the data with keypair={:?} gossip_addr={:?}",
|
||||
keypair.pubkey(),
|
||||
gossip_addr
|
||||
);
|
||||
|
||||
let entrypoint_info = ContactInfo::new_gossip_entry_point(&entrypoint_addr);
|
||||
let archiver = Archiver::new(
|
||||
&ledger_path,
|
||||
node,
|
||||
entrypoint_info,
|
||||
Arc::new(keypair),
|
||||
Arc::new(storage_keypair),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
archiver.join();
|
||||
}
|
2
banking_bench/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/target/
|
||||
/farf/
|
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.20.5"
|
||||
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.5" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.5" }
|
||||
solana-logger = { path = "../logger", version = "0.20.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.5" }
|
||||
solana-measure = { path = "../measure", version = "0.20.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.5" }
|
||||
rand = "0.6.5"
|
||||
crossbeam-channel = "0.3"
|
322
banking_bench/src/main.rs
Normal file
@ -0,0 +1,322 @@
|
||||
#[macro_use]
|
||||
extern crate solana_ledger;
|
||||
extern crate crossbeam_channel;
|
||||
|
||||
use crossbeam_channel::unbounded;
|
||||
use log::*;
|
||||
use rand::{thread_rng, Rng};
|
||||
use rayon::prelude::*;
|
||||
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
||||
use solana_core::cluster_info::ClusterInfo;
|
||||
use solana_core::cluster_info::Node;
|
||||
use solana_core::genesis_utils::{create_genesis_block, GenesisBlockInfo};
|
||||
use solana_core::packet::to_packets_chunked;
|
||||
use solana_core::poh_recorder::PohRecorder;
|
||||
use solana_core::poh_recorder::WorkingBankEntry;
|
||||
use solana_core::service::Service;
|
||||
use solana_ledger::bank_forks::BankForks;
|
||||
use solana_ledger::blocktree::{get_tmp_ledger_path, Blocktree};
|
||||
use solana_measure::measure::Measure;
|
||||
use solana_runtime::bank::Bank;
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::Keypair;
|
||||
use solana_sdk::signature::Signature;
|
||||
use solana_sdk::system_transaction;
|
||||
use solana_sdk::timing::{duration_as_us, timestamp};
|
||||
use solana_sdk::transaction::Transaction;
|
||||
use std::iter;
|
||||
use std::sync::atomic::Ordering;
|
||||
use std::sync::mpsc::Receiver;
|
||||
use std::sync::{Arc, Mutex, RwLock};
|
||||
use std::thread::sleep;
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
fn check_txs(
|
||||
receiver: &Arc<Receiver<WorkingBankEntry>>,
|
||||
ref_tx_count: usize,
|
||||
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
||||
) -> bool {
|
||||
let mut total = 0;
|
||||
let now = Instant::now();
|
||||
let mut no_bank = false;
|
||||
loop {
|
||||
if let Ok((_bank, (entry, _tick_height))) = receiver.recv_timeout(Duration::from_millis(10))
|
||||
{
|
||||
total += entry.transactions.len();
|
||||
}
|
||||
if total >= ref_tx_count {
|
||||
break;
|
||||
}
|
||||
if now.elapsed().as_secs() > 60 {
|
||||
break;
|
||||
}
|
||||
if poh_recorder.lock().unwrap().bank().is_none() {
|
||||
trace!("no bank");
|
||||
no_bank = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if !no_bank {
|
||||
assert!(total >= ref_tx_count);
|
||||
}
|
||||
no_bank
|
||||
}
|
||||
|
||||
fn make_accounts_txs(txes: usize, mint_keypair: &Keypair, hash: Hash) -> Vec<Transaction> {
|
||||
let to_pubkey = Pubkey::new_rand();
|
||||
let dummy = system_transaction::transfer(mint_keypair, &to_pubkey, 1, hash);
|
||||
(0..txes)
|
||||
.into_par_iter()
|
||||
.map(|_| {
|
||||
let mut new = dummy.clone();
|
||||
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
||||
new.message.account_keys[0] = Pubkey::new_rand();
|
||||
new.message.account_keys[1] = Pubkey::new_rand();
|
||||
new.signatures = vec![Signature::new(&sig[0..64])];
|
||||
new
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
struct Config {
|
||||
packets_per_batch: usize,
|
||||
chunk_len: usize,
|
||||
num_threads: usize,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
fn get_transactions_index(&self, chunk_index: usize) -> usize {
|
||||
chunk_index * (self.chunk_len / self.num_threads) * self.packets_per_batch
|
||||
}
|
||||
}
|
||||
|
||||
fn bytes_as_usize(bytes: &[u8]) -> usize {
|
||||
bytes[0] as usize | (bytes[1] as usize) << 8
|
||||
}
|
||||
|
||||
fn main() {
|
||||
solana_logger::setup();
|
||||
let num_threads = BankingStage::num_threads() as usize;
|
||||
// a multiple of packet chunk duplicates to avoid races
|
||||
const CHUNKS: usize = 8 * 2;
|
||||
const PACKETS_PER_BATCH: usize = 192;
|
||||
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
||||
let mint_total = 1_000_000_000_000;
|
||||
let GenesisBlockInfo {
|
||||
genesis_block,
|
||||
mint_keypair,
|
||||
..
|
||||
} = create_genesis_block(mint_total);
|
||||
|
||||
let (verified_sender, verified_receiver) = unbounded();
|
||||
let (vote_sender, vote_receiver) = unbounded();
|
||||
let bank0 = Bank::new(&genesis_block);
|
||||
let mut bank_forks = BankForks::new(0, bank0);
|
||||
let mut bank = bank_forks.working_bank();
|
||||
|
||||
info!("threads: {} txs: {}", num_threads, txes);
|
||||
|
||||
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_block.hash());
|
||||
|
||||
// fund all the accounts
|
||||
transactions.iter().for_each(|tx| {
|
||||
let fund = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&tx.message.account_keys[0],
|
||||
mint_total / txes as u64,
|
||||
genesis_block.hash(),
|
||||
);
|
||||
let x = bank.process_transaction(&fund);
|
||||
x.unwrap();
|
||||
});
|
||||
//sanity check, make sure all the transactions can execute sequentially
|
||||
transactions.iter().for_each(|tx| {
|
||||
let res = bank.process_transaction(&tx);
|
||||
assert!(res.is_ok(), "sanity test transactions");
|
||||
});
|
||||
bank.clear_signatures();
|
||||
//sanity check, make sure all the transactions can execute in parallel
|
||||
let res = bank.process_transactions(&transactions);
|
||||
for r in res {
|
||||
assert!(r.is_ok(), "sanity parallel execution");
|
||||
}
|
||||
bank.clear_signatures();
|
||||
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 blocktree = Arc::new(
|
||||
Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
||||
);
|
||||
let (exit, poh_recorder, poh_service, signal_receiver) =
|
||||
create_test_recorder(&bank, &blocktree, None);
|
||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
||||
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
||||
let banking_stage = BankingStage::new(
|
||||
&cluster_info,
|
||||
&poh_recorder,
|
||||
verified_receiver,
|
||||
vote_receiver,
|
||||
);
|
||||
poh_recorder.lock().unwrap().set_bank(&bank);
|
||||
|
||||
let chunk_len = verified.len() / CHUNKS;
|
||||
let mut start = 0;
|
||||
|
||||
// This is so that the signal_receiver does not go out of scope after the closure.
|
||||
// If it is dropped before poh_service, then poh_service will error when
|
||||
// calling send() on the channel.
|
||||
let signal_receiver = Arc::new(signal_receiver);
|
||||
let signal_receiver2 = signal_receiver.clone();
|
||||
let mut total = 0;
|
||||
let mut tx_total = 0;
|
||||
let mut txs_processed = 0;
|
||||
let mut root = 1;
|
||||
let collector = Pubkey::new_rand();
|
||||
const ITERS: usize = 1_000;
|
||||
let config = Config {
|
||||
packets_per_batch: PACKETS_PER_BATCH,
|
||||
chunk_len,
|
||||
num_threads,
|
||||
};
|
||||
for _ in 0..ITERS {
|
||||
let now = Instant::now();
|
||||
let mut sent = 0;
|
||||
|
||||
for (i, v) in verified[start..start + chunk_len]
|
||||
.chunks(chunk_len / num_threads)
|
||||
.enumerate()
|
||||
{
|
||||
let mut byte = 0;
|
||||
let index = config.get_transactions_index(start + i);
|
||||
if index < transactions.len() {
|
||||
byte = bytes_as_usize(transactions[index].signatures[0].as_ref());
|
||||
}
|
||||
trace!(
|
||||
"sending... {}..{} {} v.len: {} sig: {} transactions.len: {} index: {}",
|
||||
start + i,
|
||||
start + chunk_len,
|
||||
timestamp(),
|
||||
v.len(),
|
||||
byte,
|
||||
transactions.len(),
|
||||
index,
|
||||
);
|
||||
for xv in v {
|
||||
sent += xv.0.packets.len();
|
||||
}
|
||||
verified_sender.send(v.to_vec()).unwrap();
|
||||
}
|
||||
let start_tx_index = config.get_transactions_index(start);
|
||||
let end_tx_index = config.get_transactions_index(start + chunk_len);
|
||||
for tx in &transactions[start_tx_index..end_tx_index] {
|
||||
loop {
|
||||
if bank.get_signature_status(&tx.signatures[0]).is_some() {
|
||||
break;
|
||||
}
|
||||
if poh_recorder.lock().unwrap().bank().is_none() {
|
||||
break;
|
||||
}
|
||||
sleep(Duration::from_millis(5));
|
||||
}
|
||||
}
|
||||
if check_txs(&signal_receiver2, txes / CHUNKS, &poh_recorder) {
|
||||
debug!(
|
||||
"resetting bank {} tx count: {} txs_proc: {}",
|
||||
bank.slot(),
|
||||
bank.transaction_count(),
|
||||
txs_processed
|
||||
);
|
||||
assert!(txs_processed < bank.transaction_count());
|
||||
txs_processed = bank.transaction_count();
|
||||
tx_total += duration_as_us(&now.elapsed());
|
||||
|
||||
let mut poh_time = Measure::start("poh_time");
|
||||
poh_recorder.lock().unwrap().reset(
|
||||
bank.last_blockhash(),
|
||||
bank.slot(),
|
||||
Some((bank.slot(), bank.slot() + 1)),
|
||||
);
|
||||
poh_time.stop();
|
||||
|
||||
let mut new_bank_time = Measure::start("new_bank");
|
||||
let new_bank = Bank::new_from_parent(&bank, &collector, bank.slot() + 1);
|
||||
new_bank_time.stop();
|
||||
|
||||
let mut insert_time = Measure::start("insert_time");
|
||||
bank_forks.insert(new_bank);
|
||||
bank = bank_forks.working_bank();
|
||||
insert_time.stop();
|
||||
|
||||
poh_recorder.lock().unwrap().set_bank(&bank);
|
||||
assert!(poh_recorder.lock().unwrap().bank().is_some());
|
||||
if bank.slot() > 32 {
|
||||
bank_forks.set_root(root, &None);
|
||||
root += 1;
|
||||
}
|
||||
debug!(
|
||||
"new_bank_time: {}us insert_time: {}us poh_time: {}us",
|
||||
new_bank_time.as_us(),
|
||||
insert_time.as_us(),
|
||||
poh_time.as_us(),
|
||||
);
|
||||
} else {
|
||||
tx_total += duration_as_us(&now.elapsed());
|
||||
}
|
||||
|
||||
// This signature clear may not actually clear the signatures
|
||||
// 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.
|
||||
bank.clear_signatures();
|
||||
total += duration_as_us(&now.elapsed());
|
||||
debug!(
|
||||
"time: {} us checked: {} sent: {}",
|
||||
duration_as_us(&now.elapsed()),
|
||||
txes / CHUNKS,
|
||||
sent,
|
||||
);
|
||||
|
||||
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
||||
for tx in transactions.iter_mut() {
|
||||
tx.message.recent_blockhash = bank.last_blockhash();
|
||||
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
||||
tx.signatures[0] = Signature::new(&sig[0..64]);
|
||||
}
|
||||
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 %= verified.len();
|
||||
}
|
||||
eprintln!(
|
||||
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
||||
total / ITERS as u64,
|
||||
);
|
||||
eprintln!(
|
||||
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
||||
tx_total / ITERS as u64,
|
||||
);
|
||||
|
||||
drop(verified_sender);
|
||||
drop(vote_sender);
|
||||
exit.store(true, Ordering::Relaxed);
|
||||
banking_stage.join().unwrap();
|
||||
debug!("waited for banking_stage");
|
||||
poh_service.join().unwrap();
|
||||
sleep(Duration::from_secs(1));
|
||||
debug!("waited for poh_service");
|
||||
}
|
||||
let _unused = Blocktree::destroy(&ledger_path);
|
||||
}
|
1
bench-exchange/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
/target/
|
||||
/config/
|
||||
/config-local/
|
||||
/farf/
|
||||
|
@ -2,38 +2,38 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-exchange"
|
||||
version = "0.14.0"
|
||||
version = "0.20.5"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
bs58 = "0.2.0"
|
||||
bincode = "1.2.0"
|
||||
bs58 = "0.3.0"
|
||||
clap = "2.32.0"
|
||||
bincode = "1.1.2"
|
||||
env_logger = "0.6.0"
|
||||
env_logger = "0.7.1"
|
||||
itertools = "0.8.0"
|
||||
log = "0.4.6"
|
||||
log = "0.4.8"
|
||||
num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
num-derive = "0.2"
|
||||
rayon = "1.0.3"
|
||||
serde = "1.0.87"
|
||||
serde_derive = "1.0.87"
|
||||
serde_json = "1.0.38"
|
||||
rand = "0.6.5"
|
||||
rayon = "1.2.0"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
# solana-runtime = { path = "../solana/runtime"}
|
||||
solana = { path = "../core", version = "0.14.0" }
|
||||
solana-client = { path = "../client", version = "0.14.0" }
|
||||
solana-drone = { path = "../drone", version = "0.14.0" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.14.0" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.14.0" }
|
||||
solana-logger = { path = "../logger", version = "0.14.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.14.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.14.0" }
|
||||
solana-runtime = { path = "../runtime", version = "0.14.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.14.0" }
|
||||
ws = "0.8.0"
|
||||
untrusted = "0.6.2"
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
erasure = []
|
||||
solana-core = { path = "../core", version = "0.20.5" }
|
||||
solana-genesis = { path = "../genesis", version = "0.20.5" }
|
||||
solana-client = { path = "../client", version = "0.20.5" }
|
||||
solana-drone = { path = "../drone", version = "0.20.5" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.5" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.5" }
|
||||
solana-logger = { path = "../logger", version = "0.20.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.5" }
|
||||
untrusted = "0.7.0"
|
||||
ws = "0.9.1"
|
||||
|
@ -6,10 +6,10 @@ learn how to start and interact with the exchange.
|
||||
|
||||
### Table of Contents
|
||||
[Overview](#Overview)<br>
|
||||
[Premiss](#Premiss)<br>
|
||||
[Premise](#Premise)<br>
|
||||
[Exchange startup](#Exchange-startup)<br>
|
||||
[Trade requests](#Trade-requests)<br>
|
||||
[Trade cancellations](#Trade-cancellations)<br>
|
||||
[Order Requests](#Trade-requests)<br>
|
||||
[Order Cancellations](#Trade-cancellations)<br>
|
||||
[Trade swap](#Trade-swap)<br>
|
||||
[Exchange program operations](#Exchange-program-operations)<br>
|
||||
[Quotes and OHLCV](#Quotes-and-OHLCV)<br>
|
||||
@ -22,9 +22,9 @@ An exchange is a marketplace where one asset can be traded for another. This
|
||||
demo demonstrates one way to host an exchange on the Solana blockchain by
|
||||
emulating a currency exchange.
|
||||
|
||||
The assets are virtual tokens held by investors who may post trade requests to
|
||||
the exchange. A broker monitors the exchange and posts swap requests for
|
||||
matching trade orders. All the transactions can execute concurrently.
|
||||
The assets are virtual tokens held by investors who may post order requests to
|
||||
the exchange. A Matcher monitors the exchange and posts swap requests for
|
||||
matching orders. All the transactions can execute concurrently.
|
||||
|
||||
## Premise
|
||||
|
||||
@ -42,92 +42,91 @@ matching trade orders. All the transactions can execute concurrently.
|
||||
- A request to create a token account
|
||||
- Token request
|
||||
- A request to deposit tokens of a particular type into a token account.
|
||||
- Token pair
|
||||
- A unique ordered list of two tokens. For the four types of tokens used in
|
||||
this demo, the valid pairs are AB, AC, AD, BC, BD, CD.
|
||||
- Direction of trade
|
||||
- Describes which token in the pair the investor wants to sell and buy and can
|
||||
be either "To" or "From". For example, if an investor issues a "To" trade
|
||||
for "AB" then they which to exchange A tokens to B tokens. A "From" order
|
||||
would read the other way, A tokens from B tokens.
|
||||
- Asset pair
|
||||
- A struct with fields Base and Quote, representing the two assets which make up a
|
||||
trading pair, which themselves are Tokens. The Base or 'primary' asset is the
|
||||
numerator and the Quote is the denominator for pricing purposes.
|
||||
- Order side
|
||||
- Describes which side of the market an investor wants to place a trade on. Options
|
||||
are "Bid" or "Ask", where a bid represents an offer to purchase the Base asset of
|
||||
the AssetPair for a sum of the Quote Asset and an Ask is an offer to sell Base asset
|
||||
for the Quote asset.
|
||||
- Price ratio
|
||||
- An expression of the relative prices of two tokens. They consist of the
|
||||
price of the primary token and the price of the secondary token. For
|
||||
simplicity sake, the primary token's price is always 1, which forces the
|
||||
secondary to be the common denominator. For example, if token A was worth
|
||||
2 and token B was worth 6, the price ratio would be 1:3 or just 3. Price
|
||||
ratios are represented as fixed point numbers. The fixed point scaler is
|
||||
defined in
|
||||
- An expression of the relative prices of two tokens. Calculated with the Base
|
||||
Asset as the numerator and the Quote Asset as the denominator. Ratios are
|
||||
represented as fixed point numbers. The fixed point scaler is defined in
|
||||
[exchange_state.rs](https://github.com/solana-labs/solana/blob/c2fdd1362a029dcf89c8907c562d2079d977df11/programs/exchange_api/src/exchange_state.rs#L7)
|
||||
- Trade request
|
||||
- A Solana transaction executed by the exchange requesting the trade of one
|
||||
type of token for another. Trade requests are made up of the token pair,
|
||||
the direction of the trade, quantity of the primary token, the price ratio,
|
||||
and the two token accounts to be credited/deducted. An example trade
|
||||
request looks like "T AB 5 2" which reads "Exchange 5 A tokens to B tokens
|
||||
at a price ratio of 1:2" A fulfilled trade would result in 5 A tokens
|
||||
- Order request
|
||||
- A Solana transaction sent by a trader to the exchange to submit an order.
|
||||
Order requests are made up of the token pair, the order side (bid or ask),
|
||||
quantity of the primary token, the price ratio, and the two token accounts
|
||||
to be credited/deducted. An example trade request looks like "T AB 5 2"
|
||||
which reads "Exchange 5 A tokens to B tokens at a price ratio of 1:2" A fulfilled trade would result in 5 A tokens
|
||||
deducted and 10 B tokens credited to the trade initiator's token accounts.
|
||||
Successful trade requests result in a trade order.
|
||||
- Trade order
|
||||
- The result of a successful trade request. Trade orders are stored in
|
||||
accounts owned by the submitter of the trade request. They can only be
|
||||
Successful order requests result in an order.
|
||||
- Order
|
||||
- The result of a successful order request. orders are stored in
|
||||
accounts owned by the submitter of the order request. They can only be
|
||||
canceled by their owner but can be used by anyone in a trade swap. They
|
||||
contain the same information as the trade request.
|
||||
contain the same information as the order request.
|
||||
- Price spread
|
||||
- The difference between the two matching trade orders. The spread is the
|
||||
profit of the broker initiating the swap request.
|
||||
- Swap requirements
|
||||
- The difference between the two matching orders. The spread is the
|
||||
profit of the Matcher initiating the swap request.
|
||||
- Match requirements
|
||||
- Policies that result in a successful trade swap.
|
||||
- Swap request
|
||||
- A request to exchange tokens between to trade orders
|
||||
- Trade swap
|
||||
- A successful trade. A swap consists of two matching trade orders that meet
|
||||
swap requirements. A trade swap may not wholly satisfy one or both of the
|
||||
trade orders in which case the trade orders are adjusted appropriately. As
|
||||
long as the swap requirements are met there will be an exchange of tokens
|
||||
between accounts. Any price spread is deposited into the broker's profit
|
||||
account. All trade swaps are recorded in a new account for posterity.
|
||||
- Match request
|
||||
- A request to fill two complementary orders (bid/ask), resulting if successful,
|
||||
in a trade being created.
|
||||
- Trade
|
||||
- A successful trade is created from two matching orders that meet
|
||||
swap requirements which are submitted in a Match Request by a Matcher and
|
||||
executed by the exchange. A trade may not wholly satisfy one or both of the
|
||||
orders in which case the orders are adjusted appropriately. Upon execution,
|
||||
tokens are distributed to the traders' accounts and any overlap or
|
||||
"negative spread" between orders is deposited into the Matcher's profit
|
||||
account. All successful trades are recorded in the data of a new solana
|
||||
account for posterity.
|
||||
- Investor
|
||||
- Individual investors who hold a number of tokens and wish to trade them on
|
||||
the exchange. Investors operate as Solana thin clients who own a set of
|
||||
accounts containing tokens and/or trade requests. Investors post
|
||||
accounts containing tokens and/or order requests. Investors post
|
||||
transactions to the exchange in order to request tokens and post or cancel
|
||||
trade requests.
|
||||
- Broker
|
||||
- An agent who facilitates trading between investors. Brokers operate as
|
||||
Solana thin clients who monitor all the trade orders looking for a trade
|
||||
match. Once found, the broker issues a swap request to the exchange.
|
||||
Brokers are the engine of the exchange and are rewarded for their efforts by
|
||||
accumulating the price spreads of the swaps they initiate. Brokers also
|
||||
order requests.
|
||||
- Matcher
|
||||
- An agent who facilitates trading between investors. Matchers operate as
|
||||
Solana thin clients who monitor all the orders looking for a trade
|
||||
match. Once found, the Matcher issues a swap request to the exchange.
|
||||
Matchers are the engine of the exchange and are rewarded for their efforts by
|
||||
accumulating the price spreads of the swaps they initiate. Matchers also
|
||||
provide current bid/ask price and OHLCV (Open, High, Low, Close, Volume)
|
||||
information on demand via a public network port.
|
||||
- Transaction fees
|
||||
- Solana transaction fees are paid for by the transaction submitters who are
|
||||
the Investors and Brokers.
|
||||
the Investors and Matchers.
|
||||
|
||||
## Exchange startup
|
||||
|
||||
The exchange is up and running when it reaches a state where it can take
|
||||
investor's trades and broker's swap requests. To achieve this state the
|
||||
investors' trades and Matchers' match requests. To achieve this state the
|
||||
following must occur in order:
|
||||
|
||||
- Start the Solana blockchain
|
||||
- Start the broker thin-client
|
||||
- The broker subscribes to change notifications for all the accounts owned by
|
||||
- Start the thin-client
|
||||
- The Matcher subscribes to change notifications for all the accounts owned by
|
||||
the exchange program id. The subscription is managed via Solana's JSON RPC
|
||||
interface.
|
||||
- The broker starts responding to queries for bid/ask price and OHLCV
|
||||
- The Matcher starts responding to queries for bid/ask price and OHLCV
|
||||
|
||||
The broker responding successfully to price and OHLCV requests is the signal to
|
||||
The Matcher responding successfully to price and OHLCV requests is the signal to
|
||||
the investors that trades submitted after that point will be analyzed. <!--This
|
||||
is not ideal, and instead investors should be able to submit trades at any time,
|
||||
and the broker could come and go without missing a trade. One way to achieve
|
||||
this is for the broker to read the current state of all accounts looking for all
|
||||
open trade orders.-->
|
||||
and the Matcher could come and go without missing a trade. One way to achieve
|
||||
this is for the Matcher to read the current state of all accounts looking for all
|
||||
open orders.-->
|
||||
|
||||
Investors will initially query the exchange to discover their current balance
|
||||
for each type of token. If the investor does not already have an account for
|
||||
each type of token, they will submit account requests. Brokers as well will
|
||||
each type of token, they will submit account requests. Matcher as well will
|
||||
request accounts to hold the tokens they earn by initiating trade swaps.
|
||||
|
||||
```rust
|
||||
@ -165,7 +164,7 @@ pub struct TokenAccountInfo {
|
||||
}
|
||||
```
|
||||
|
||||
For this demo investors or brokers can request more tokens from the exchange at
|
||||
For this demo investors or Matcher can request more tokens from the exchange at
|
||||
any time by submitting token requests. In non-demos, an exchange of this type
|
||||
would provide another way to exchange a 3rd party asset into tokens.
|
||||
|
||||
@ -181,19 +180,19 @@ pub enum ExchangeInstruction {
|
||||
}
|
||||
```
|
||||
|
||||
## Trade requests
|
||||
## Order Requests
|
||||
|
||||
When an investor decides to exchange a token of one type for another, they
|
||||
submit a transaction to the Solana Blockchain containing a trade request, which,
|
||||
if successful, is turned into a trade order. Trade orders do not expire but are
|
||||
cancellable. <!-- Trade orders should have a timestamp to enable trade
|
||||
expiration --> When a trade order is created, tokens are deducted from a token
|
||||
account and the trade order acts as an escrow. The tokens are held until the
|
||||
trade order is fulfilled or canceled. If the direction is `To`, then the number
|
||||
submit a transaction to the Solana Blockchain containing an order request, which,
|
||||
if successful, is turned into an order. orders do not expire but are
|
||||
cancellable. <!-- orders should have a timestamp to enable trade
|
||||
expiration --> When an order is created, tokens are deducted from a token
|
||||
account and the order acts as an escrow. The tokens are held until the
|
||||
order is fulfilled or canceled. If the direction is `To`, then the number
|
||||
of `tokens` are deducted from the primary account, if `From` then `tokens`
|
||||
multiplied by `price` are deducted from the secondary account. Trade orders are
|
||||
multiplied by `price` are deducted from the secondary account. orders are
|
||||
no longer valid when the number of `tokens` goes to zero, at which point they
|
||||
can no longer be used. <!-- Could support refilling trade orders, so trade order
|
||||
can no longer be used. <!-- Could support refilling orders, so order
|
||||
accounts are refilled rather than accumulating -->
|
||||
|
||||
```rust
|
||||
@ -205,7 +204,7 @@ pub enum Direction {
|
||||
From,
|
||||
}
|
||||
|
||||
pub struct TradeRequestInfo {
|
||||
pub struct OrderRequestInfo {
|
||||
/// Direction of trade
|
||||
pub direction: Direction,
|
||||
|
||||
@ -224,7 +223,7 @@ pub struct TradeRequestInfo {
|
||||
}
|
||||
|
||||
pub enum ExchangeInstruction {
|
||||
/// Trade request
|
||||
/// order request
|
||||
/// key 0 - Signer
|
||||
/// key 1 - Account in which to record the swap
|
||||
/// key 2 - Token account associated with this trade
|
||||
@ -233,7 +232,7 @@ pub enum ExchangeInstruction {
|
||||
|
||||
/// Trade accounts are populated with this structure
|
||||
pub struct TradeOrderInfo {
|
||||
/// Owner of the trade order
|
||||
/// Owner of the order
|
||||
pub owner: Pubkey,
|
||||
/// Direction of the exchange
|
||||
pub direction: Direction,
|
||||
@ -252,7 +251,7 @@ pub struct TradeOrderInfo {
|
||||
}
|
||||
```
|
||||
|
||||
## Trade cancellations
|
||||
## Order cancellations
|
||||
|
||||
An investor may cancel a trade at anytime, but only trades they own. If the
|
||||
cancellation is successful, any tokens held in escrow are returned to the
|
||||
@ -260,24 +259,24 @@ account from which they came.
|
||||
|
||||
```rust
|
||||
pub enum ExchangeInstruction {
|
||||
/// Trade cancellation
|
||||
/// order cancellation
|
||||
/// key 0 - Signer
|
||||
/// key 1 -Trade order to cancel
|
||||
/// key 1 -order to cancel
|
||||
TradeCancellation,
|
||||
}
|
||||
```
|
||||
|
||||
## Trade swaps
|
||||
|
||||
The broker is monitoring the accounts assigned to the exchange program and
|
||||
building a trade-order table. The trade order table is used to identify
|
||||
matching trade orders which could be fulfilled. When a match is found the
|
||||
broker should issue a swap request. Swap requests may not satisfy the entirety
|
||||
The Matcher is monitoring the accounts assigned to the exchange program and
|
||||
building a trade-order table. The order table is used to identify
|
||||
matching orders which could be fulfilled. When a match is found the
|
||||
Matcher should issue a swap request. Swap requests may not satisfy the entirety
|
||||
of either order, but the exchange will greedily fulfill it. Any leftover tokens
|
||||
in either account will keep the trade order valid for further swap requests in
|
||||
in either account will keep the order valid for further swap requests in
|
||||
the future.
|
||||
|
||||
Matching trade orders are defined by the following swap requirements:
|
||||
Matching orders are defined by the following swap requirements:
|
||||
|
||||
- Opposite polarity (one `To` and one `From`)
|
||||
- Operate on the same token pair
|
||||
@ -310,14 +309,14 @@ whole for clarity.
|
||||
| 5 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||
|
||||
As part of a successful swap request, the exchange will credit tokens to the
|
||||
broker's account equal to the difference in the price ratios or the two orders.
|
||||
These tokens are considered the broker's profit for initiating the trade.
|
||||
Matcher's account equal to the difference in the price ratios or the two orders.
|
||||
These tokens are considered the Matcher's profit for initiating the trade.
|
||||
|
||||
The broker would initiate the following swap on the order table above:
|
||||
The Matcher would initiate the following swap on the order table above:
|
||||
|
||||
- Row 1, To: Investor 1 trades 2 A tokens to 8 B tokens
|
||||
- Row 1, From: Investor 2 trades 2 A tokens from 8 B tokens
|
||||
- Broker takes 8 B tokens as profit
|
||||
- Matcher takes 8 B tokens as profit
|
||||
|
||||
Both row 1 trades are fully realized, table becomes:
|
||||
|
||||
@ -328,11 +327,11 @@ Both row 1 trades are fully realized, table becomes:
|
||||
| 3 | 1 T AB 2 8 | 2 F AB 3 6 |
|
||||
| 4 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||
|
||||
The broker would initiate the following swap:
|
||||
The Matcher would initiate the following swap:
|
||||
|
||||
- Row 1, To: Investor 1 trades 1 A token to 4 B tokens
|
||||
- Row 1, From: Investor 2 trades 1 A token from 4 B tokens
|
||||
- Broker takes 4 B tokens as profit
|
||||
- Matcher takes 4 B tokens as profit
|
||||
|
||||
Row 1 From is not fully realized, table becomes:
|
||||
|
||||
@ -343,11 +342,11 @@ Row 1 From is not fully realized, table becomes:
|
||||
| 3 | 1 T AB 2 10 | 2 F AB 3 6 |
|
||||
| 4 | | 2 F AB 1 5 |
|
||||
|
||||
The broker would initiate the following swap:
|
||||
The Matcher would initiate the following swap:
|
||||
|
||||
- Row 1, To: Investor 1 trades 1 A token to 6 B tokens
|
||||
- Row 1, From: Investor 2 trades 1 A token from 6 B tokens
|
||||
- Broker takes 2 B tokens as profit
|
||||
- Matcher takes 2 B tokens as profit
|
||||
|
||||
Row 1 To is now fully realized, table becomes:
|
||||
|
||||
@ -357,11 +356,11 @@ Row 1 To is now fully realized, table becomes:
|
||||
| 2 | 1 T AB 2 8 | 2 F AB 3 5 |
|
||||
| 3 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||
|
||||
The broker would initiate the following last swap:
|
||||
The Matcher would initiate the following last swap:
|
||||
|
||||
- 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
|
||||
- Broker takes 4 B tokens as profit
|
||||
- Matcher takes 4 B tokens as profit
|
||||
|
||||
Table becomes:
|
||||
|
||||
@ -379,11 +378,11 @@ pub enum ExchangeInstruction {
|
||||
/// Trade swap request
|
||||
/// key 0 - Signer
|
||||
/// key 1 - Account in which to record the swap
|
||||
/// key 2 - 'To' trade order
|
||||
/// key 3 - `From` trade order
|
||||
/// key 2 - 'To' order
|
||||
/// key 3 - `From` order
|
||||
/// key 4 - Token account associated with the To Trade
|
||||
/// key 5 - Token account associated with From trade
|
||||
/// key 6 - Token account in which to deposit the brokers profit from the swap.
|
||||
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
||||
SwapRequest,
|
||||
}
|
||||
|
||||
@ -391,9 +390,9 @@ pub enum ExchangeInstruction {
|
||||
pub struct TradeSwapInfo {
|
||||
/// Pair swapped
|
||||
pub pair: TokenPair,
|
||||
/// `To` trade order
|
||||
/// `To` order
|
||||
pub to_trade_order: Pubkey,
|
||||
/// `From` trade order
|
||||
/// `From` order
|
||||
pub from_trade_order: Pubkey,
|
||||
/// Number of primary tokens exchanged
|
||||
pub primary_tokens: u64,
|
||||
@ -424,32 +423,32 @@ pub enum ExchangeInstruction {
|
||||
/// the exchange has a limitless number of tokens it can transfer.
|
||||
TransferRequest(Token, u64),
|
||||
|
||||
/// Trade request
|
||||
/// order request
|
||||
/// key 0 - Signer
|
||||
/// key 1 - Account in which to record the swap
|
||||
/// key 2 - Token account associated with this trade
|
||||
TradeRequest(TradeRequestInfo),
|
||||
|
||||
/// Trade cancellation
|
||||
/// order cancellation
|
||||
/// key 0 - Signer
|
||||
/// key 1 -Trade order to cancel
|
||||
/// key 1 -order to cancel
|
||||
TradeCancellation,
|
||||
|
||||
/// Trade swap request
|
||||
/// key 0 - Signer
|
||||
/// key 1 - Account in which to record the swap
|
||||
/// key 2 - 'To' trade order
|
||||
/// key 3 - `From` trade order
|
||||
/// key 2 - 'To' order
|
||||
/// key 3 - `From` order
|
||||
/// key 4 - Token account associated with the To Trade
|
||||
/// key 5 - Token account associated with From trade
|
||||
/// key 6 - Token account in which to deposit the brokers profit from the swap.
|
||||
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
||||
SwapRequest,
|
||||
}
|
||||
```
|
||||
|
||||
## Quotes and OHLCV
|
||||
|
||||
The broker will provide current bid/ask price quotes based on trade actively and
|
||||
The Matcher will provide current bid/ask price quotes based on trade actively and
|
||||
also provide OHLCV based on some time window. The details of how the bid/ask
|
||||
price quotes are calculated are yet to be decided.
|
||||
|
||||
@ -478,6 +477,3 @@ To also see the cluster messages:
|
||||
```bash
|
||||
$ RUST_LOG=solana_bench_exchange=info,solana=info cargo test --release -- --nocapture test_exchange_local_cluster
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
@ -3,28 +3,30 @@
|
||||
use crate::order_book::*;
|
||||
use itertools::izip;
|
||||
use log::*;
|
||||
use rand::{thread_rng, Rng};
|
||||
use rayon::prelude::*;
|
||||
use solana::cluster_info::FULLNODE_PORT_RANGE;
|
||||
use solana::contact_info::ContactInfo;
|
||||
use solana::gen_keys::GenKeys;
|
||||
use solana_client::thin_client::create_client;
|
||||
use solana_client::thin_client::ThinClient;
|
||||
use solana_client::perf_utils::{sample_txs, SampleStats};
|
||||
use solana_core::gen_keys::GenKeys;
|
||||
use solana_drone::drone::request_airdrop_transaction;
|
||||
use solana_exchange_api::exchange_instruction;
|
||||
use solana_exchange_api::exchange_state::*;
|
||||
use solana_exchange_api::id;
|
||||
use solana_metrics::influxdb;
|
||||
use solana_genesis::Base64Account;
|
||||
use solana_metrics::datapoint_info;
|
||||
use solana_sdk::client::Client;
|
||||
use solana_sdk::client::SyncClient;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use solana_sdk::system_instruction;
|
||||
use solana_sdk::timing::{duration_as_ms, duration_as_ns, duration_as_s};
|
||||
use solana_sdk::timing::{duration_as_ms, duration_as_s};
|
||||
use solana_sdk::transaction::Transaction;
|
||||
use solana_sdk::{system_instruction, system_program};
|
||||
use std::cmp;
|
||||
use std::collections::VecDeque;
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
use std::mem;
|
||||
use std::net::SocketAddr;
|
||||
use std::path::Path;
|
||||
use std::process::exit;
|
||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||
@ -50,6 +52,8 @@ pub struct Config {
|
||||
pub batch_size: usize,
|
||||
pub chunk_size: usize,
|
||||
pub account_groups: usize,
|
||||
pub client_ids_and_stake_file: String,
|
||||
pub read_from_client_file: bool,
|
||||
}
|
||||
|
||||
impl Default for Config {
|
||||
@ -63,18 +67,41 @@ impl Default for Config {
|
||||
batch_size: 10,
|
||||
chunk_size: 10,
|
||||
account_groups: 100,
|
||||
client_ids_and_stake_file: String::new(),
|
||||
read_from_client_file: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct SampleStats {
|
||||
/// Maximum TPS reported by this node
|
||||
pub tps: f32,
|
||||
/// Total time taken for those txs
|
||||
pub elapsed: Duration,
|
||||
/// Total transactions reported by this node
|
||||
pub txs: u64,
|
||||
pub fn create_client_accounts_file(
|
||||
client_ids_and_stake_file: &str,
|
||||
batch_size: usize,
|
||||
account_groups: usize,
|
||||
fund_amount: u64,
|
||||
) {
|
||||
let accounts_in_groups = batch_size * account_groups;
|
||||
const NUM_KEYPAIR_GROUPS: u64 = 2;
|
||||
let total_keys = accounts_in_groups as u64 * NUM_KEYPAIR_GROUPS;
|
||||
|
||||
let keypairs = generate_keypairs(total_keys);
|
||||
|
||||
let mut accounts = HashMap::new();
|
||||
keypairs.iter().for_each(|keypair| {
|
||||
accounts.insert(
|
||||
serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
|
||||
Base64Account {
|
||||
balance: fund_amount,
|
||||
executable: false,
|
||||
owner: system_program::id().to_string(),
|
||||
data: String::new(),
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
let serialized = serde_yaml::to_string(&accounts).unwrap();
|
||||
let path = Path::new(&client_ids_and_stake_file);
|
||||
let mut file = File::create(path).unwrap();
|
||||
file.write_all(&serialized.into_bytes()).unwrap();
|
||||
}
|
||||
|
||||
pub fn do_bench_exchange<T>(clients: Vec<T>, config: Config)
|
||||
@ -90,37 +117,71 @@ where
|
||||
batch_size,
|
||||
chunk_size,
|
||||
account_groups,
|
||||
client_ids_and_stake_file,
|
||||
read_from_client_file,
|
||||
} = config;
|
||||
|
||||
info!(
|
||||
"Exchange client: threads {} duration {} fund_amount {}",
|
||||
threads,
|
||||
duration_as_s(&duration),
|
||||
fund_amount
|
||||
);
|
||||
info!(
|
||||
"Exchange client: transfer delay {} batch size {} chunk size {}",
|
||||
transfer_delay, batch_size, chunk_size
|
||||
);
|
||||
|
||||
let accounts_in_groups = batch_size * account_groups;
|
||||
let exit_signal = Arc::new(AtomicBool::new(false));
|
||||
const NUM_KEYPAIR_GROUPS: u64 = 2;
|
||||
let total_keys = accounts_in_groups as u64 * NUM_KEYPAIR_GROUPS;
|
||||
|
||||
let mut signer_keypairs = if read_from_client_file {
|
||||
let path = Path::new(&client_ids_and_stake_file);
|
||||
let file = File::open(path).unwrap();
|
||||
|
||||
let accounts: HashMap<String, Base64Account> = serde_yaml::from_reader(file).unwrap();
|
||||
accounts
|
||||
.into_iter()
|
||||
.map(|(keypair, _)| {
|
||||
let bytes: Vec<u8> = serde_json::from_str(keypair.as_str()).unwrap();
|
||||
Keypair::from_bytes(&bytes).unwrap()
|
||||
})
|
||||
.collect()
|
||||
} else {
|
||||
info!("Generating {:?} signer keys", total_keys);
|
||||
generate_keypairs(total_keys)
|
||||
};
|
||||
|
||||
let trader_signers: Vec<_> = signer_keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(Arc::new)
|
||||
.collect();
|
||||
let swapper_signers: Vec<_> = signer_keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(Arc::new)
|
||||
.collect();
|
||||
|
||||
let clients: Vec<_> = clients.into_iter().map(Arc::new).collect();
|
||||
let client = clients[0].as_ref();
|
||||
|
||||
const NUM_KEYPAIR_GROUPS: u64 = 4;
|
||||
let total_keys = accounts_in_groups as u64 * NUM_KEYPAIR_GROUPS;
|
||||
info!("Generating {:?} keys", total_keys);
|
||||
let mut keypairs = generate_keypairs(total_keys);
|
||||
let trader_signers: Vec<_> = keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(Arc::new)
|
||||
.collect();
|
||||
let swapper_signers: Vec<_> = keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(Arc::new)
|
||||
.collect();
|
||||
let src_pubkeys: Vec<_> = keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(|keypair| keypair.pubkey())
|
||||
.collect();
|
||||
let profit_pubkeys: Vec<_> = keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(|keypair| keypair.pubkey())
|
||||
.collect();
|
||||
if !read_from_client_file {
|
||||
info!("Fund trader accounts");
|
||||
fund_keys(client, &identity, &trader_signers, fund_amount);
|
||||
info!("Fund swapper accounts");
|
||||
fund_keys(client, &identity, &swapper_signers, fund_amount);
|
||||
}
|
||||
|
||||
info!("Fund trader accounts");
|
||||
fund_keys(client, &identity, &trader_signers, fund_amount);
|
||||
info!("Fund swapper accounts");
|
||||
fund_keys(client, &identity, &swapper_signers, fund_amount);
|
||||
info!("Generating {:?} account keys", total_keys);
|
||||
let mut account_keypairs = generate_keypairs(total_keys);
|
||||
let src_pubkeys: Vec<_> = account_keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(|keypair| keypair.pubkey())
|
||||
.collect();
|
||||
let profit_pubkeys: Vec<_> = account_keypairs
|
||||
.drain(0..accounts_in_groups)
|
||||
.map(|keypair| keypair.pubkey())
|
||||
.collect();
|
||||
|
||||
info!("Create {:?} source token accounts", src_pubkeys.len());
|
||||
create_token_accounts(client, &trader_signers, &src_pubkeys);
|
||||
@ -136,6 +197,7 @@ where
|
||||
transfer_delay
|
||||
);
|
||||
|
||||
let exit_signal = Arc::new(AtomicBool::new(false));
|
||||
let shared_txs: SharedTransactions = Arc::new(RwLock::new(VecDeque::new()));
|
||||
let total_txs_sent_count = Arc::new(AtomicUsize::new(0));
|
||||
let s_threads: Vec<_> = (0..threads)
|
||||
@ -168,6 +230,7 @@ where
|
||||
&shared_txs,
|
||||
&swapper_signers,
|
||||
&profit_pubkeys,
|
||||
transfer_delay,
|
||||
batch_size,
|
||||
chunk_size,
|
||||
account_groups,
|
||||
@ -237,62 +300,6 @@ where
|
||||
);
|
||||
}
|
||||
|
||||
fn sample_txs<T>(
|
||||
exit_signal: &Arc<AtomicBool>,
|
||||
sample_stats: &Arc<RwLock<Vec<SampleStats>>>,
|
||||
sample_period: u64,
|
||||
client: &Arc<T>,
|
||||
) where
|
||||
T: Client,
|
||||
{
|
||||
let mut max_tps = 0.0;
|
||||
let mut total_elapsed;
|
||||
let mut total_txs;
|
||||
let mut now = Instant::now();
|
||||
let start_time = now;
|
||||
let initial_txs = client.get_transaction_count().expect("transaction count");
|
||||
let mut last_txs = initial_txs;
|
||||
|
||||
loop {
|
||||
total_elapsed = start_time.elapsed();
|
||||
let elapsed = now.elapsed();
|
||||
now = Instant::now();
|
||||
let mut txs = client.get_transaction_count().expect("transaction count");
|
||||
|
||||
if txs < last_txs {
|
||||
error!("expected txs({}) >= last_txs({})", txs, last_txs);
|
||||
txs = last_txs;
|
||||
}
|
||||
total_txs = txs - initial_txs;
|
||||
let sample_txs = txs - last_txs;
|
||||
last_txs = txs;
|
||||
|
||||
let tps = sample_txs as f32 / duration_as_s(&elapsed);
|
||||
if tps > max_tps {
|
||||
max_tps = tps;
|
||||
}
|
||||
|
||||
info!(
|
||||
"Sampler {:9.2} TPS, Transactions: {:6}, Total transactions: {} over {} s",
|
||||
tps,
|
||||
sample_txs,
|
||||
total_txs,
|
||||
total_elapsed.as_secs(),
|
||||
);
|
||||
|
||||
if exit_signal.load(Ordering::Relaxed) {
|
||||
let stats = SampleStats {
|
||||
tps: max_tps,
|
||||
elapsed: total_elapsed,
|
||||
txs: total_txs,
|
||||
};
|
||||
sample_stats.write().unwrap().push(stats);
|
||||
return;
|
||||
}
|
||||
sleep(Duration::from_secs(sample_period));
|
||||
}
|
||||
}
|
||||
|
||||
fn do_tx_transfers<T>(
|
||||
exit_signal: &Arc<AtomicBool>,
|
||||
shared_txs: &SharedTransactions,
|
||||
@ -301,7 +308,6 @@ fn do_tx_transfers<T>(
|
||||
) where
|
||||
T: Client,
|
||||
{
|
||||
let mut stats = Stats::default();
|
||||
loop {
|
||||
let txs;
|
||||
{
|
||||
@ -318,51 +324,21 @@ fn do_tx_transfers<T>(
|
||||
let duration = now.elapsed();
|
||||
|
||||
total_txs_sent_count.fetch_add(n, Ordering::Relaxed);
|
||||
stats.total += n as u64;
|
||||
stats.sent_ns += duration_as_ns(&duration);
|
||||
let rate = n as f32 / duration_as_s(&duration);
|
||||
if rate > stats.sent_peak_rate {
|
||||
stats.sent_peak_rate = rate;
|
||||
}
|
||||
trace!(" tx {:?} sent {:.2}/s", n, rate);
|
||||
|
||||
solana_metrics::submit(
|
||||
influxdb::Point::new("bench-exchange")
|
||||
.add_tag("op", influxdb::Value::String("do_tx_transfers".to_string()))
|
||||
.add_field(
|
||||
"duration",
|
||||
influxdb::Value::Integer(duration_as_ms(&duration) as i64),
|
||||
)
|
||||
.add_field("count", influxdb::Value::Integer(n as i64))
|
||||
.to_owned(),
|
||||
datapoint_info!(
|
||||
"bench-exchange-do_tx_transfers",
|
||||
("duration", duration_as_ms(&duration), i64),
|
||||
("count", n, i64)
|
||||
);
|
||||
}
|
||||
if exit_signal.load(Ordering::Relaxed) {
|
||||
info!(
|
||||
" Thread Transferred {} Txs, avg {:.2}/s peak {:.2}/s",
|
||||
stats.total,
|
||||
(stats.total as f64 / stats.sent_ns as f64) * 1_000_000_000_f64,
|
||||
stats.sent_peak_rate,
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct Stats {
|
||||
total: u64,
|
||||
keygen_ns: u64,
|
||||
keygen_peak_rate: f32,
|
||||
sign_ns: u64,
|
||||
sign_peak_rate: f32,
|
||||
sent_ns: u64,
|
||||
sent_peak_rate: f32,
|
||||
}
|
||||
|
||||
struct TradeInfo {
|
||||
trade_account: Pubkey,
|
||||
order_info: TradeOrderInfo,
|
||||
order_info: OrderInfo,
|
||||
}
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn swapper<T>(
|
||||
@ -371,6 +347,7 @@ fn swapper<T>(
|
||||
shared_txs: &SharedTransactions,
|
||||
signers: &[Arc<Keypair>],
|
||||
profit_pubkeys: &[Pubkey],
|
||||
transfer_delay: u64,
|
||||
batch_size: usize,
|
||||
chunk_size: usize,
|
||||
account_groups: usize,
|
||||
@ -378,28 +355,57 @@ fn swapper<T>(
|
||||
) where
|
||||
T: Client,
|
||||
{
|
||||
let mut stats = Stats::default();
|
||||
let mut order_book = OrderBook::default();
|
||||
let mut account_group: usize = 0;
|
||||
|
||||
let mut txs = 0;
|
||||
let mut total_txs = 0;
|
||||
let mut now = Instant::now();
|
||||
let start_time = now;
|
||||
let mut total_elapsed = start_time.elapsed();
|
||||
|
||||
// Chunks may have been dropped and we don't want to wait a long time
|
||||
// for each time, Back-off each time we fail to confirm a chunk
|
||||
const CHECK_TX_TIMEOUT_MAX_MS: u64 = 15000;
|
||||
const CHECK_TX_DELAY_MS: u64 = 100;
|
||||
let mut max_tries = CHECK_TX_TIMEOUT_MAX_MS / CHECK_TX_DELAY_MS;
|
||||
|
||||
// If we dump too many chunks maybe we are just waiting on a back-log
|
||||
// rather than a series of dropped packets, reset to max waits
|
||||
const MAX_DUMPS: u64 = 50;
|
||||
let mut dumps = 0;
|
||||
|
||||
'outer: loop {
|
||||
if let Ok(trade_infos) = receiver.try_recv() {
|
||||
let mut tries = 0;
|
||||
let mut trade_index = 0;
|
||||
while client
|
||||
.get_balance(&trade_infos[0].trade_account)
|
||||
.get_balance(&trade_infos[trade_index].trade_account)
|
||||
.unwrap_or(0)
|
||||
== 0
|
||||
{
|
||||
tries += 1;
|
||||
if tries > 300 {
|
||||
if tries >= max_tries {
|
||||
if exit_signal.load(Ordering::Relaxed) {
|
||||
break 'outer;
|
||||
}
|
||||
error!("Give up waiting, dump batch");
|
||||
error!("Give up and dump batch");
|
||||
if dumps >= MAX_DUMPS {
|
||||
error!("Max batches dumped, reset wait back-off");
|
||||
max_tries = CHECK_TX_TIMEOUT_MAX_MS / CHECK_TX_DELAY_MS;
|
||||
dumps = 0;
|
||||
} else {
|
||||
dumps += 1;
|
||||
max_tries /= 2;
|
||||
}
|
||||
continue 'outer;
|
||||
}
|
||||
debug!("{} waiting for trades batch to clear", tries);
|
||||
sleep(Duration::from_millis(100));
|
||||
sleep(Duration::from_millis(CHECK_TX_DELAY_MS));
|
||||
trade_index = thread_rng().gen_range(0, trade_infos.len());
|
||||
}
|
||||
max_tries = CHECK_TX_TIMEOUT_MAX_MS / CHECK_TX_DELAY_MS;
|
||||
dumps = 0;
|
||||
|
||||
trade_infos.iter().for_each(|info| {
|
||||
order_book
|
||||
@ -414,9 +420,6 @@ fn swapper<T>(
|
||||
}
|
||||
}
|
||||
let swaps_size = swaps.len();
|
||||
stats.total += swaps_size as u64;
|
||||
|
||||
let now = Instant::now();
|
||||
|
||||
let mut to_swap = vec![];
|
||||
let start = account_group * swaps_size as usize;
|
||||
@ -429,17 +432,8 @@ fn swapper<T>(
|
||||
to_swap.push((signer, swap, profit));
|
||||
}
|
||||
account_group = (account_group + 1) % account_groups as usize;
|
||||
let duration = now.elapsed();
|
||||
let rate = swaps_size as f32 / duration_as_s(&duration);
|
||||
stats.keygen_ns += duration_as_ns(&duration);
|
||||
if rate > stats.keygen_peak_rate {
|
||||
stats.keygen_peak_rate = rate;
|
||||
}
|
||||
trace!("sw {:?} keypairs {:.2} /s", swaps_size, rate);
|
||||
|
||||
let now = Instant::now();
|
||||
|
||||
let blockhash = client
|
||||
let (blockhash, _fee_calculator) = client
|
||||
.get_recent_blockhash()
|
||||
.expect("Failed to get blockhash");
|
||||
let to_swap_txs: Vec<_> = to_swap
|
||||
@ -459,21 +453,25 @@ fn swapper<T>(
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
let duration = now.elapsed();
|
||||
let n = to_swap_txs.len();
|
||||
let rate = n as f32 / duration_as_s(&duration);
|
||||
stats.sign_ns += duration_as_ns(&duration);
|
||||
if rate > stats.sign_peak_rate {
|
||||
stats.sign_peak_rate = rate;
|
||||
}
|
||||
trace!(" sw {:?} signed {:.2} /s ", n, rate);
|
||||
|
||||
solana_metrics::submit(
|
||||
influxdb::Point::new("bench-exchange")
|
||||
.add_tag("op", influxdb::Value::String("swaps".to_string()))
|
||||
.add_field("count", influxdb::Value::Integer(to_swap_txs.len() as i64))
|
||||
.to_owned(),
|
||||
);
|
||||
txs += to_swap_txs.len() as u64;
|
||||
total_txs += to_swap_txs.len() as u64;
|
||||
total_elapsed = start_time.elapsed();
|
||||
let duration = now.elapsed();
|
||||
if duration_as_s(&duration) >= 1_f32 {
|
||||
now = Instant::now();
|
||||
let tps = txs as f32 / duration_as_s(&duration);
|
||||
info!(
|
||||
"Swapper {:9.2} TPS, Transactions: {:6}, Total transactions: {} over {} s",
|
||||
tps,
|
||||
txs,
|
||||
total_txs,
|
||||
total_elapsed.as_secs(),
|
||||
);
|
||||
txs = 0;
|
||||
}
|
||||
|
||||
datapoint_info!("bench-exchange-swaps", ("count", to_swap_txs.len(), i64));
|
||||
|
||||
let chunks: Vec<_> = to_swap_txs.chunks(chunk_size).collect();
|
||||
{
|
||||
@ -482,6 +480,8 @@ fn swapper<T>(
|
||||
shared_txs_wl.push_back(chunk.to_vec());
|
||||
}
|
||||
}
|
||||
// Throttle the swapper so it doesn't try to catchup unbridled
|
||||
sleep(Duration::from_millis(transfer_delay / 2));
|
||||
}
|
||||
|
||||
if exit_signal.load(Ordering::Relaxed) {
|
||||
@ -489,18 +489,9 @@ fn swapper<T>(
|
||||
}
|
||||
}
|
||||
info!(
|
||||
"{} Swaps, batch size {}, chunk size {}",
|
||||
stats.total, batch_size, chunk_size
|
||||
);
|
||||
info!(
|
||||
" Keygen avg {:.2}/s peak {:.2}/s",
|
||||
(stats.total as f64 / stats.keygen_ns as f64) * 1_000_000_000_f64,
|
||||
stats.keygen_peak_rate
|
||||
);
|
||||
info!(
|
||||
" Signed avg {:.2}/s peak {:.2}/s",
|
||||
(stats.total as f64 / stats.sign_ns as f64) * 1_000_000_000_f64,
|
||||
stats.sign_peak_rate
|
||||
"Swapper sent {} at {:9.2} TPS",
|
||||
total_txs,
|
||||
total_txs as f32 / duration_as_s(&total_elapsed)
|
||||
);
|
||||
assert_eq!(
|
||||
order_book.get_num_outstanding().0 + order_book.get_num_outstanding().1,
|
||||
@ -515,7 +506,7 @@ fn trader<T>(
|
||||
shared_txs: &SharedTransactions,
|
||||
signers: &[Arc<Keypair>],
|
||||
srcs: &[Pubkey],
|
||||
delay: u64,
|
||||
transfer_delay: u64,
|
||||
batch_size: usize,
|
||||
chunk_size: usize,
|
||||
account_groups: usize,
|
||||
@ -523,37 +514,40 @@ fn trader<T>(
|
||||
) where
|
||||
T: Client,
|
||||
{
|
||||
let mut stats = Stats::default();
|
||||
|
||||
// TODO Hard coded for now
|
||||
let pair = TokenPair::AB;
|
||||
let pair = AssetPair::default();
|
||||
let tokens = 1;
|
||||
let price = 1000;
|
||||
let mut account_group: usize = 0;
|
||||
|
||||
let mut txs = 0;
|
||||
let mut total_txs = 0;
|
||||
let mut now = Instant::now();
|
||||
let start_time = now;
|
||||
let mut total_elapsed = start_time.elapsed();
|
||||
|
||||
loop {
|
||||
let now = Instant::now();
|
||||
let trade_keys = generate_keypairs(batch_size as u64);
|
||||
|
||||
let mut trades = vec![];
|
||||
let mut trade_infos = vec![];
|
||||
let start = account_group * batch_size as usize;
|
||||
let end = account_group * batch_size as usize + batch_size as usize;
|
||||
let mut direction = Direction::To;
|
||||
let mut side = OrderSide::Ask;
|
||||
for (signer, trade, src) in izip!(
|
||||
signers[start..end].iter(),
|
||||
trade_keys,
|
||||
srcs[start..end].iter(),
|
||||
) {
|
||||
direction = if direction == Direction::To {
|
||||
Direction::From
|
||||
side = if side == OrderSide::Ask {
|
||||
OrderSide::Bid
|
||||
} else {
|
||||
Direction::To
|
||||
OrderSide::Ask
|
||||
};
|
||||
let order_info = TradeOrderInfo {
|
||||
let order_info = OrderInfo {
|
||||
/// Owner of the trade order
|
||||
owner: Pubkey::default(), // don't care
|
||||
direction,
|
||||
side,
|
||||
pair,
|
||||
tokens,
|
||||
price,
|
||||
@ -563,26 +557,18 @@ fn trader<T>(
|
||||
trade_account: trade.pubkey(),
|
||||
order_info,
|
||||
});
|
||||
trades.push((signer, trade.pubkey(), direction, src));
|
||||
trades.push((signer, trade.pubkey(), side, src));
|
||||
}
|
||||
account_group = (account_group + 1) % account_groups as usize;
|
||||
let duration = now.elapsed();
|
||||
let rate = batch_size as f32 / duration_as_s(&duration);
|
||||
stats.keygen_ns += duration_as_ns(&duration);
|
||||
if rate > stats.keygen_peak_rate {
|
||||
stats.keygen_peak_rate = rate;
|
||||
}
|
||||
trace!("sw {:?} keypairs {:.2} /s", batch_size, rate);
|
||||
|
||||
let blockhash = client
|
||||
let (blockhash, _fee_calculator) = client
|
||||
.get_recent_blockhash()
|
||||
.expect("Failed to get blockhash");
|
||||
|
||||
trades.chunks(chunk_size).for_each(|chunk| {
|
||||
let now = Instant::now();
|
||||
let trades_txs: Vec<_> = chunk
|
||||
.par_iter()
|
||||
.map(|(signer, trade, direction, src)| {
|
||||
.map(|(signer, trade, side, src)| {
|
||||
let s: &Keypair = &signer;
|
||||
let owner = &signer.pubkey();
|
||||
let space = mem::size_of::<ExchangeState>() as u64;
|
||||
@ -591,66 +577,63 @@ fn trader<T>(
|
||||
vec![
|
||||
system_instruction::create_account(owner, trade, 1, space, &id()),
|
||||
exchange_instruction::trade_request(
|
||||
owner, trade, *direction, pair, tokens, price, src,
|
||||
owner, trade, *side, pair, tokens, price, src,
|
||||
),
|
||||
],
|
||||
blockhash,
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
let duration = now.elapsed();
|
||||
let n = trades_txs.len();
|
||||
let rate = n as f32 / duration_as_s(&duration);
|
||||
stats.sign_ns += duration_as_ns(&duration);
|
||||
if rate > stats.sign_peak_rate {
|
||||
stats.sign_peak_rate = rate;
|
||||
}
|
||||
trace!(" sw {:?} signed {:.2} /s ", n, rate);
|
||||
|
||||
solana_metrics::submit(
|
||||
influxdb::Point::new("bench-exchange")
|
||||
.add_tag("op", influxdb::Value::String("trades".to_string()))
|
||||
.add_field("count", influxdb::Value::Integer(trades_txs.len() as i64))
|
||||
.to_owned(),
|
||||
);
|
||||
|
||||
{
|
||||
let mut shared_txs_wl = shared_txs
|
||||
.write()
|
||||
.expect("Failed to send tx to transfer threads");
|
||||
stats.total += chunk_size as u64;
|
||||
shared_txs_wl.push_back(trades_txs);
|
||||
txs += chunk_size as u64;
|
||||
total_txs += chunk_size as u64;
|
||||
total_elapsed = start_time.elapsed();
|
||||
let duration = now.elapsed();
|
||||
if duration_as_s(&duration) >= 1_f32 {
|
||||
now = Instant::now();
|
||||
let tps = txs as f32 / duration_as_s(&duration);
|
||||
info!(
|
||||
"Trader {:9.2} TPS, Transactions: {:6}, Total transactions: {} over {} s",
|
||||
tps,
|
||||
txs,
|
||||
total_txs,
|
||||
total_elapsed.as_secs(),
|
||||
);
|
||||
txs = 0;
|
||||
}
|
||||
|
||||
datapoint_info!("bench-exchange-trades", ("count", trades_txs.len(), i64));
|
||||
|
||||
{
|
||||
let mut shared_txs_wl = shared_txs
|
||||
.write()
|
||||
.expect("Failed to send tx to transfer threads");
|
||||
shared_txs_wl.push_back(trades_txs);
|
||||
}
|
||||
}
|
||||
if delay > 0 {
|
||||
sleep(Duration::from_millis(delay));
|
||||
if transfer_delay > 0 {
|
||||
sleep(Duration::from_millis(transfer_delay));
|
||||
}
|
||||
});
|
||||
|
||||
if exit_signal.load(Ordering::Relaxed) {
|
||||
info!(
|
||||
"Trader sent {} at {:9.2} TPS",
|
||||
total_txs,
|
||||
total_txs as f32 / duration_as_s(&total_elapsed)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO chunk the trade infos and send them when the batch is sent
|
||||
sender
|
||||
.send(trade_infos)
|
||||
.expect("Failed to send trades to swapper");
|
||||
|
||||
if exit_signal.load(Ordering::Relaxed) {
|
||||
info!(
|
||||
"{} Trades with batch size {} chunk size {}",
|
||||
stats.total, batch_size, chunk_size
|
||||
);
|
||||
info!(
|
||||
" Keygen avg {:.2}/s peak {:.2}/s",
|
||||
(stats.total as f64 / stats.keygen_ns as f64) * 1_000_000_000_f64,
|
||||
stats.keygen_peak_rate
|
||||
);
|
||||
info!(
|
||||
" Signed avg {:.2}/s peak {:.2}/s",
|
||||
(stats.total as f64 / stats.sign_ns as f64) * 1_000_000_000_f64,
|
||||
stats.sign_peak_rate
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn verify_transfer<T>(sync_client: &T, tx: &Transaction) -> bool
|
||||
fn verify_transaction<T>(sync_client: &T, tx: &Transaction) -> bool
|
||||
where
|
||||
T: SyncClient + ?Sized,
|
||||
{
|
||||
@ -669,7 +652,23 @@ where
|
||||
false
|
||||
}
|
||||
|
||||
pub fn fund_keys(client: &Client, source: &Keypair, dests: &[Arc<Keypair>], lamports: u64) {
|
||||
fn verify_funding_transfer<T: SyncClient + ?Sized>(
|
||||
client: &T,
|
||||
tx: &Transaction,
|
||||
amount: u64,
|
||||
) -> bool {
|
||||
if verify_transaction(client, tx) {
|
||||
for a in &tx.message().account_keys[1..] {
|
||||
if client.get_balance(a).unwrap_or(0) >= amount {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
false
|
||||
}
|
||||
|
||||
pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>], lamports: u64) {
|
||||
let total = lamports * (dests.len() as u64 + 1);
|
||||
let mut funded: Vec<(&Keypair, u64)> = vec![(source, total)];
|
||||
let mut notfunded: Vec<&Arc<Keypair>> = dests.iter().collect();
|
||||
@ -726,6 +725,7 @@ pub fn fund_keys(client: &Client, source: &Keypair, dests: &[Arc<Keypair>], lamp
|
||||
.collect();
|
||||
|
||||
let mut retries = 0;
|
||||
let amount = chunk[0].1[0].1;
|
||||
while !to_fund_txs.is_empty() {
|
||||
let receivers = to_fund_txs
|
||||
.iter()
|
||||
@ -742,7 +742,8 @@ pub fn fund_keys(client: &Client, source: &Keypair, dests: &[Arc<Keypair>], lamp
|
||||
to_fund_txs.len(),
|
||||
);
|
||||
|
||||
let blockhash = client.get_recent_blockhash().expect("blockhash");
|
||||
let (blockhash, _fee_calculator) =
|
||||
client.get_recent_blockhash().expect("blockhash");
|
||||
to_fund_txs.par_iter_mut().for_each(|(k, tx)| {
|
||||
tx.sign(&[*k], blockhash);
|
||||
});
|
||||
@ -753,7 +754,7 @@ pub fn fund_keys(client: &Client, source: &Keypair, dests: &[Arc<Keypair>], lamp
|
||||
let mut waits = 0;
|
||||
loop {
|
||||
sleep(Duration::from_millis(200));
|
||||
to_fund_txs.retain(|(_, tx)| !verify_transfer(client, &tx));
|
||||
to_fund_txs.retain(|(_, tx)| !verify_funding_transfer(client, &tx, amount));
|
||||
if to_fund_txs.is_empty() {
|
||||
break;
|
||||
}
|
||||
@ -771,7 +772,7 @@ pub fn fund_keys(client: &Client, source: &Keypair, dests: &[Arc<Keypair>], lamp
|
||||
retries += 1;
|
||||
debug!(" Retry {:?}", retries);
|
||||
if retries >= 10 {
|
||||
error!(" Too many retries, give up");
|
||||
error!("fund_keys: Too many retries ({}), give up", retries);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
@ -785,7 +786,7 @@ pub fn fund_keys(client: &Client, source: &Keypair, dests: &[Arc<Keypair>], lamp
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_token_accounts(client: &Client, signers: &[Arc<Keypair>], accounts: &[Pubkey]) {
|
||||
pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], accounts: &[Pubkey]) {
|
||||
let mut notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = signers.iter().zip(accounts).collect();
|
||||
|
||||
while !notfunded.is_empty() {
|
||||
@ -793,11 +794,11 @@ pub fn create_token_accounts(client: &Client, signers: &[Arc<Keypair>], accounts
|
||||
let mut to_create_txs: Vec<_> = chunk
|
||||
.par_iter()
|
||||
.map(|(signer, new)| {
|
||||
let owner_id = &signer.pubkey();
|
||||
let owner_pubkey = &signer.pubkey();
|
||||
let space = mem::size_of::<ExchangeState>() as u64;
|
||||
let create_ix =
|
||||
system_instruction::create_account(owner_id, new, 1, space, &id());
|
||||
let request_ix = exchange_instruction::account_request(owner_id, new);
|
||||
system_instruction::create_account(owner_pubkey, new, 1, space, &id());
|
||||
let request_ix = exchange_instruction::account_request(owner_pubkey, new);
|
||||
(
|
||||
signer,
|
||||
Transaction::new_unsigned_instructions(vec![create_ix, request_ix]),
|
||||
@ -817,7 +818,7 @@ pub fn create_token_accounts(client: &Client, signers: &[Arc<Keypair>], accounts
|
||||
|
||||
let mut retries = 0;
|
||||
while !to_create_txs.is_empty() {
|
||||
let blockhash = client
|
||||
let (blockhash, _fee_calculator) = client
|
||||
.get_recent_blockhash()
|
||||
.expect("Failed to get blockhash");
|
||||
to_create_txs.par_iter_mut().for_each(|(k, tx)| {
|
||||
@ -831,11 +832,11 @@ pub fn create_token_accounts(client: &Client, signers: &[Arc<Keypair>], accounts
|
||||
let mut waits = 0;
|
||||
while !to_create_txs.is_empty() {
|
||||
sleep(Duration::from_millis(200));
|
||||
to_create_txs.retain(|(_, tx)| !verify_transfer(client, &tx));
|
||||
to_create_txs.retain(|(_, tx)| !verify_transaction(client, &tx));
|
||||
if to_create_txs.is_empty() {
|
||||
break;
|
||||
}
|
||||
debug!(
|
||||
info!(
|
||||
" {} transactions outstanding, waits {:?}",
|
||||
to_create_txs.len(),
|
||||
waits
|
||||
@ -848,9 +849,12 @@ pub fn create_token_accounts(client: &Client, signers: &[Arc<Keypair>], accounts
|
||||
|
||||
if !to_create_txs.is_empty() {
|
||||
retries += 1;
|
||||
debug!(" Retry {:?}", retries);
|
||||
info!(" Retry {:?} {} txes left", retries, to_create_txs.len());
|
||||
if retries >= 20 {
|
||||
error!(" Too many retries, give up");
|
||||
error!(
|
||||
"create_token_accounts: Too many retries ({}), give up",
|
||||
retries
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
@ -868,13 +872,13 @@ pub fn create_token_accounts(client: &Client, signers: &[Arc<Keypair>], accounts
|
||||
}
|
||||
}
|
||||
|
||||
fn compute_and_report_stats(maxes: &Arc<RwLock<Vec<(SampleStats)>>>, total_txs_sent: u64) {
|
||||
fn compute_and_report_stats(maxes: &Arc<RwLock<Vec<(String, SampleStats)>>>, total_txs_sent: u64) {
|
||||
let mut max_txs = 0;
|
||||
let mut max_elapsed = Duration::new(0, 0);
|
||||
info!("| Max TPS | Total Transactions");
|
||||
info!("+---------------+--------------------");
|
||||
|
||||
for stats in maxes.read().unwrap().iter() {
|
||||
for (_sock, stats) in maxes.read().unwrap().iter() {
|
||||
let maybe_flag = match stats.txs {
|
||||
0 => "!!!!!",
|
||||
_ => "",
|
||||
@ -915,7 +919,7 @@ fn generate_keypairs(num: u64) -> Vec<Keypair> {
|
||||
rnd.gen_n_keypairs(num)
|
||||
}
|
||||
|
||||
pub fn airdrop_lamports(client: &Client, drone_addr: &SocketAddr, id: &Keypair, amount: u64) {
|
||||
pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypair, amount: u64) {
|
||||
let balance = client.get_balance(&id.pubkey());
|
||||
let balance = balance.unwrap_or(0);
|
||||
if balance >= amount {
|
||||
@ -933,7 +937,7 @@ pub fn airdrop_lamports(client: &Client, drone_addr: &SocketAddr, id: &Keypair,
|
||||
|
||||
let mut tries = 0;
|
||||
loop {
|
||||
let blockhash = client
|
||||
let (blockhash, _fee_calculator) = client
|
||||
.get_recent_blockhash()
|
||||
.expect("Failed to get blockhash");
|
||||
match request_airdrop_transaction(&drone_addr, &id.pubkey(), amount_to_drop, blockhash) {
|
||||
@ -960,133 +964,9 @@ pub fn airdrop_lamports(client: &Client, drone_addr: &SocketAddr, id: &Keypair,
|
||||
debug!(" Retry...");
|
||||
tries += 1;
|
||||
if tries > 50 {
|
||||
error!("Too many retries, give up");
|
||||
error!("airdrop_lamports: Too many retries ({}), give up", tries);
|
||||
exit(1);
|
||||
}
|
||||
sleep(Duration::from_secs(2));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_clients(nodes: &[ContactInfo]) -> Vec<ThinClient> {
|
||||
nodes
|
||||
.iter()
|
||||
.filter_map(|node| {
|
||||
let cluster_entrypoint = node;
|
||||
let cluster_addrs = cluster_entrypoint.client_facing_addr();
|
||||
if ContactInfo::is_valid_address(&cluster_addrs.0)
|
||||
&& ContactInfo::is_valid_address(&cluster_addrs.1)
|
||||
{
|
||||
let client = create_client(cluster_addrs, FULLNODE_PORT_RANGE);
|
||||
Some(client)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use solana::fullnode::FullnodeConfig;
|
||||
use solana::gossip_service::discover_nodes;
|
||||
use solana::local_cluster::{ClusterConfig, LocalCluster};
|
||||
use solana_drone::drone::run_local_drone;
|
||||
use solana_exchange_api::exchange_processor::process_instruction;
|
||||
use solana_runtime::bank::Bank;
|
||||
use solana_runtime::bank_client::BankClient;
|
||||
use solana_sdk::genesis_block::GenesisBlock;
|
||||
use std::sync::mpsc::channel;
|
||||
|
||||
#[test]
|
||||
fn test_exchange_local_cluster() {
|
||||
solana_logger::setup();
|
||||
|
||||
const NUM_NODES: usize = 1;
|
||||
let fullnode_config = FullnodeConfig::default();
|
||||
|
||||
let mut config = Config::default();
|
||||
config.identity = Keypair::new();
|
||||
config.threads = 1;
|
||||
config.duration = Duration::from_secs(1);
|
||||
config.fund_amount = 100_000;
|
||||
config.transfer_delay = 20;
|
||||
config.batch_size = 100; // 1000;
|
||||
config.chunk_size = 10; // 250;
|
||||
config.account_groups = 1; // 10;
|
||||
let Config {
|
||||
fund_amount,
|
||||
batch_size,
|
||||
account_groups,
|
||||
..
|
||||
} = config;
|
||||
let accounts_in_groups = batch_size * account_groups;
|
||||
|
||||
let cluster = LocalCluster::new(&ClusterConfig {
|
||||
node_stakes: vec![100_000; NUM_NODES],
|
||||
cluster_lamports: 100_000_000_000_000,
|
||||
fullnode_config,
|
||||
native_instruction_processors: [("solana_exchange_program".to_string(), id())].to_vec(),
|
||||
..ClusterConfig::default()
|
||||
});
|
||||
|
||||
let drone_keypair = Keypair::new();
|
||||
cluster.transfer(
|
||||
&cluster.funding_keypair,
|
||||
&drone_keypair.pubkey(),
|
||||
2_000_000_000_000,
|
||||
);
|
||||
|
||||
let (addr_sender, addr_receiver) = channel();
|
||||
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||
|
||||
info!("Connecting to the cluster");
|
||||
let nodes =
|
||||
discover_nodes(&cluster.entry_point_info.gossip, NUM_NODES).unwrap_or_else(|err| {
|
||||
error!("Failed to discover {} nodes: {:?}", NUM_NODES, err);
|
||||
exit(1);
|
||||
});
|
||||
|
||||
let clients = get_clients(&nodes);
|
||||
|
||||
if clients.len() < NUM_NODES {
|
||||
error!(
|
||||
"Error: Insufficient nodes discovered. Expecting {} or more",
|
||||
NUM_NODES
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
const NUM_SIGNERS: u64 = 2;
|
||||
airdrop_lamports(
|
||||
&clients[0],
|
||||
&drone_addr,
|
||||
&config.identity,
|
||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||
);
|
||||
|
||||
do_bench_exchange(clients, config);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_exchange_bank_client() {
|
||||
solana_logger::setup();
|
||||
let (genesis_block, identity) = GenesisBlock::new(100_000_000_000_000);
|
||||
let mut bank = Bank::new(&genesis_block);
|
||||
bank.add_instruction_processor(id(), process_instruction);
|
||||
let clients = vec![BankClient::new(bank)];
|
||||
|
||||
let mut config = Config::default();
|
||||
config.identity = identity;
|
||||
config.threads = 1;
|
||||
config.duration = Duration::from_secs(1);
|
||||
config.fund_amount = 100_000;
|
||||
config.transfer_delay = 20; // 0;
|
||||
config.batch_size = 100; // 1500;
|
||||
config.chunk_size = 10; // 1500;
|
||||
config.account_groups = 1; // 50;
|
||||
|
||||
do_bench_exchange(clients, config);
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
use clap::{crate_description, crate_name, crate_version, value_t, App, Arg, ArgMatches};
|
||||
use solana_core::gen_keys::GenKeys;
|
||||
use solana_drone::drone::DRONE_PORT;
|
||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||
use std::net::SocketAddr;
|
||||
use std::process::exit;
|
||||
use std::time::Duration;
|
||||
|
||||
use clap::{crate_description, crate_name, crate_version, value_t, App, Arg, ArgMatches};
|
||||
use solana::gen_keys::GenKeys;
|
||||
use solana_drone::drone::DRONE_PORT;
|
||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
||||
|
||||
pub struct Config {
|
||||
pub network_addr: SocketAddr,
|
||||
pub entrypoint_addr: SocketAddr,
|
||||
pub drone_addr: SocketAddr,
|
||||
pub identity: Keypair,
|
||||
pub threads: usize,
|
||||
@ -18,12 +18,15 @@ pub struct Config {
|
||||
pub batch_size: usize,
|
||||
pub chunk_size: usize,
|
||||
pub account_groups: usize,
|
||||
pub client_ids_and_stake_file: String,
|
||||
pub write_to_client_file: bool,
|
||||
pub read_from_client_file: bool,
|
||||
}
|
||||
|
||||
impl Default for Config {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
network_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)),
|
||||
identity: Keypair::new(),
|
||||
num_nodes: 1,
|
||||
@ -34,6 +37,9 @@ impl Default for Config {
|
||||
batch_size: 100,
|
||||
chunk_size: 100,
|
||||
account_groups: 100,
|
||||
client_ids_and_stake_file: String::new(),
|
||||
write_to_client_file: false,
|
||||
read_from_client_file: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -43,14 +49,14 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
.about(crate_description!())
|
||||
.version(crate_version!())
|
||||
.arg(
|
||||
Arg::with_name("network")
|
||||
Arg::with_name("entrypoint")
|
||||
.short("n")
|
||||
.long("network")
|
||||
.long("entrypoint")
|
||||
.value_name("HOST:PORT")
|
||||
.takes_value(true)
|
||||
.required(false)
|
||||
.default_value("127.0.0.1:8001")
|
||||
.help("Network's gossip entry point; defaults to 127.0.0.1:8001"),
|
||||
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("drone")
|
||||
@ -141,24 +147,39 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
.default_value("10")
|
||||
.help("Number of account groups to cycle for each batch"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("write-client-keys")
|
||||
.long("write-client-keys")
|
||||
.value_name("FILENAME")
|
||||
.takes_value(true)
|
||||
.help("Generate client keys and stakes and write the list to YAML file"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("read-client-keys")
|
||||
.long("read-client-keys")
|
||||
.value_name("FILENAME")
|
||||
.takes_value(true)
|
||||
.help("Read client keys and stakes from the YAML file"),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||
let mut args = Config::default();
|
||||
|
||||
args.network_addr = matches
|
||||
.value_of("network")
|
||||
.unwrap()
|
||||
.parse()
|
||||
.expect("Failed to parse network");
|
||||
args.drone_addr = matches
|
||||
.value_of("drone")
|
||||
.unwrap()
|
||||
.parse()
|
||||
.expect("Failed to parse drone address");
|
||||
args.entrypoint_addr = solana_netutil::parse_host_port(matches.value_of("entrypoint").unwrap())
|
||||
.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())
|
||||
.unwrap_or_else(|e| {
|
||||
eprintln!("failed to parse drone address: {}", e);
|
||||
exit(1)
|
||||
});
|
||||
|
||||
if matches.is_present("identity") {
|
||||
args.identity = read_keypair(matches.value_of("identity").unwrap())
|
||||
args.identity = read_keypair_file(matches.value_of("identity").unwrap())
|
||||
.expect("can't read client identity");
|
||||
} else {
|
||||
args.identity = {
|
||||
@ -183,5 +204,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||
args.account_groups = value_t!(matches.value_of("account-groups"), usize)
|
||||
.expect("Failed to parse account-groups");
|
||||
|
||||
if let Some(s) = matches.value_of("write-client-keys") {
|
||||
args.write_to_client_file = true;
|
||||
args.client_ids_and_stake_file = s.to_string();
|
||||
}
|
||||
|
||||
if let Some(s) = matches.value_of("read-client-keys") {
|
||||
assert!(!args.write_to_client_file);
|
||||
args.read_from_client_file = true;
|
||||
args.client_ids_and_stake_file = s.to_string();
|
||||
}
|
||||
args
|
||||
}
|
||||
|
3
bench-exchange/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
||||
pub mod bench;
|
||||
pub mod cli;
|
||||
mod order_book;
|
@ -2,9 +2,9 @@ pub mod bench;
|
||||
mod cli;
|
||||
pub mod order_book;
|
||||
|
||||
use crate::bench::{airdrop_lamports, do_bench_exchange, get_clients, Config};
|
||||
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
||||
use log::*;
|
||||
use solana::gossip_service::discover_nodes;
|
||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||
use solana_sdk::signature::KeypairUtil;
|
||||
|
||||
fn main() {
|
||||
@ -15,7 +15,7 @@ fn main() {
|
||||
let cli_config = cli::extract_args(&matches);
|
||||
|
||||
let cli::Config {
|
||||
network_addr,
|
||||
entrypoint_addr,
|
||||
drone_addr,
|
||||
identity,
|
||||
threads,
|
||||
@ -26,32 +26,12 @@ fn main() {
|
||||
batch_size,
|
||||
chunk_size,
|
||||
account_groups,
|
||||
client_ids_and_stake_file,
|
||||
write_to_client_file,
|
||||
read_from_client_file,
|
||||
..
|
||||
} = cli_config;
|
||||
|
||||
info!("Connecting to the cluster");
|
||||
let nodes = discover_nodes(&network_addr, num_nodes).unwrap_or_else(|_| {
|
||||
panic!("Failed to discover nodes");
|
||||
});
|
||||
|
||||
let clients = get_clients(&nodes);
|
||||
|
||||
info!("{} nodes found", clients.len());
|
||||
if clients.len() < num_nodes {
|
||||
panic!("Error: Insufficient nodes discovered");
|
||||
}
|
||||
|
||||
info!("Funding keypair: {}", identity.pubkey());
|
||||
|
||||
let accounts_in_groups = batch_size * account_groups;
|
||||
const NUM_SIGNERS: u64 = 2;
|
||||
airdrop_lamports(
|
||||
&clients[0],
|
||||
&drone_addr,
|
||||
&identity,
|
||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||
);
|
||||
|
||||
let config = Config {
|
||||
identity,
|
||||
threads,
|
||||
@ -61,7 +41,43 @@ fn main() {
|
||||
batch_size,
|
||||
chunk_size,
|
||||
account_groups,
|
||||
client_ids_and_stake_file,
|
||||
read_from_client_file,
|
||||
};
|
||||
|
||||
do_bench_exchange(clients, config);
|
||||
if write_to_client_file {
|
||||
create_client_accounts_file(
|
||||
&config.client_ids_and_stake_file,
|
||||
config.batch_size,
|
||||
config.account_groups,
|
||||
config.fund_amount,
|
||||
);
|
||||
} else {
|
||||
info!("Connecting to the cluster");
|
||||
let (nodes, _archivers) =
|
||||
discover_cluster(&entrypoint_addr, num_nodes).unwrap_or_else(|_| {
|
||||
panic!("Failed to discover nodes");
|
||||
});
|
||||
|
||||
let (client, num_clients) = get_multi_client(&nodes);
|
||||
|
||||
info!("{} nodes found", num_clients);
|
||||
if num_clients < num_nodes {
|
||||
panic!("Error: Insufficient nodes discovered");
|
||||
}
|
||||
|
||||
if !read_from_client_file {
|
||||
info!("Funding keypair: {}", config.identity.pubkey());
|
||||
|
||||
let accounts_in_groups = batch_size * account_groups;
|
||||
const NUM_SIGNERS: u64 = 2;
|
||||
airdrop_lamports(
|
||||
&client,
|
||||
&drone_addr,
|
||||
&config.identity,
|
||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||
);
|
||||
}
|
||||
do_bench_exchange(vec![client], config);
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ use std::{error, fmt};
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub struct ToOrder {
|
||||
pub pubkey: Pubkey,
|
||||
pub info: TradeOrderInfo,
|
||||
pub info: OrderInfo,
|
||||
}
|
||||
|
||||
impl Ord for ToOrder {
|
||||
@ -26,7 +26,7 @@ impl PartialOrd for ToOrder {
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub struct FromOrder {
|
||||
pub pubkey: Pubkey,
|
||||
pub info: TradeOrderInfo,
|
||||
pub info: OrderInfo,
|
||||
}
|
||||
|
||||
impl Ord for FromOrder {
|
||||
@ -95,17 +95,13 @@ impl OrderBook {
|
||||
// pub fn cancel(&mut self, pubkey: Pubkey) -> Result<(), Box<dyn error::Error>> {
|
||||
// Ok(())
|
||||
// }
|
||||
pub fn push(
|
||||
&mut self,
|
||||
pubkey: Pubkey,
|
||||
info: TradeOrderInfo,
|
||||
) -> Result<(), Box<dyn error::Error>> {
|
||||
check_trade(info.direction, info.tokens, info.price)?;
|
||||
match info.direction {
|
||||
Direction::To => {
|
||||
pub fn push(&mut self, pubkey: Pubkey, info: OrderInfo) -> Result<(), Box<dyn error::Error>> {
|
||||
check_trade(info.side, info.tokens, info.price)?;
|
||||
match info.side {
|
||||
OrderSide::Ask => {
|
||||
self.to_ab.push(ToOrder { pubkey, info });
|
||||
}
|
||||
Direction::From => {
|
||||
OrderSide::Bid => {
|
||||
self.from_ab.push(FromOrder { pubkey, info });
|
||||
}
|
||||
}
|
||||
|
2
bench-streamer/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/target/
|
||||
/farf/
|
@ -2,17 +2,13 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-streamer"
|
||||
version = "0.14.0"
|
||||
version = "0.20.5"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana = { path = "../core", version = "0.14.0" }
|
||||
solana-logger = { path = "../logger", version = "0.14.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.14.0" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
erasure = []
|
||||
solana-core = { path = "../core", version = "0.20.5" }
|
||||
solana-logger = { path = "../logger", version = "0.20.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.5" }
|
||||
|
@ -1,7 +1,8 @@
|
||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
||||
use solana::packet::{Packet, Packets, BLOB_SIZE, PACKET_DATA_SIZE};
|
||||
use solana::result::Result;
|
||||
use solana::streamer::{receiver, PacketReceiver};
|
||||
use solana_core::packet::PacketsRecycler;
|
||||
use solana_core::packet::{Packet, Packets, BLOB_SIZE, PACKET_DATA_SIZE};
|
||||
use solana_core::result::Result;
|
||||
use solana_core::streamer::{receiver, PacketReceiver};
|
||||
use std::cmp::max;
|
||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||
@ -16,17 +17,17 @@ fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
||||
let send = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||
let mut msgs = Packets::default();
|
||||
msgs.packets.resize(10, Packet::default());
|
||||
for w in &mut msgs.packets {
|
||||
for w in msgs.packets.iter_mut() {
|
||||
w.meta.size = PACKET_DATA_SIZE;
|
||||
w.meta.set_addr(&addr);
|
||||
}
|
||||
let msgs_ = msgs.clone();
|
||||
let msgs = Arc::new(msgs);
|
||||
spawn(move || loop {
|
||||
if exit.load(Ordering::Relaxed) {
|
||||
return;
|
||||
}
|
||||
let mut num = 0;
|
||||
for p in &msgs_.packets {
|
||||
for p in &msgs.packets {
|
||||
let a = p.meta.addr();
|
||||
assert!(p.meta.size < BLOB_SIZE);
|
||||
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
||||
@ -74,6 +75,7 @@ fn main() -> Result<()> {
|
||||
|
||||
let mut read_channels = Vec::new();
|
||||
let mut read_threads = Vec::new();
|
||||
let recycler = PacketsRecycler::default();
|
||||
for _ in 0..num_sockets {
|
||||
let read = solana_netutil::bind_to(port, false).unwrap();
|
||||
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
||||
@ -83,7 +85,13 @@ fn main() -> Result<()> {
|
||||
|
||||
let (s_reader, r_reader) = channel();
|
||||
read_channels.push(r_reader);
|
||||
read_threads.push(receiver(Arc::new(read), &exit, s_reader));
|
||||
read_threads.push(receiver(
|
||||
Arc::new(read),
|
||||
&exit,
|
||||
s_reader,
|
||||
recycler.clone(),
|
||||
"bench-streamer-test",
|
||||
));
|
||||
}
|
||||
|
||||
let t_producer1 = producer(&addr, exit.clone());
|
||||
|
1
bench-tps/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
/target/
|
||||
/config/
|
||||
/config-local/
|
||||
/farf/
|
||||
|
@ -2,24 +2,37 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-tps"
|
||||
version = "0.14.0"
|
||||
version = "0.20.5"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
bincode = "1.2.0"
|
||||
clap = "2.33.0"
|
||||
rayon = "1.0.3"
|
||||
serde_json = "1.0.39"
|
||||
solana = { path = "../core", version = "0.14.0" }
|
||||
solana-client = { path = "../client", version = "0.14.0" }
|
||||
solana-drone = { path = "../drone", version = "0.14.0" }
|
||||
solana-logger = { path = "../logger", version = "0.14.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.14.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.14.0" }
|
||||
solana-runtime = { path = "../runtime", version = "0.14.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.14.0" }
|
||||
log = "0.4.8"
|
||||
rayon = "1.2.0"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-core = { path = "../core", version = "0.20.5" }
|
||||
solana-genesis = { path = "../genesis", version = "0.20.5" }
|
||||
solana-client = { path = "../client", version = "0.20.5" }
|
||||
solana-drone = { path = "../drone", version = "0.20.5" }
|
||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.5", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.20.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.5" }
|
||||
solana-measure = { path = "../measure", version = "0.20.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.5" }
|
||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.5", optional = true }
|
||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.5", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
serial_test = "0.2.0"
|
||||
serial_test_derive = "0.2.0"
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
erasure = []
|
||||
move = ["solana-librapay-api", "solana-move-loader-program", "solana-move-loader-api"]
|
||||
|
@ -1,14 +1,14 @@
|
||||
use std::net::SocketAddr;
|
||||
use std::process::exit;
|
||||
use std::time::Duration;
|
||||
|
||||
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
|
||||
use solana_drone::drone::DRONE_PORT;
|
||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
||||
use solana_sdk::fee_calculator::FeeCalculator;
|
||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||
use std::{net::SocketAddr, process::exit, time::Duration};
|
||||
|
||||
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::SOL_LAMPORTS;
|
||||
|
||||
/// Holds the configuration for a single run of the benchmark
|
||||
pub struct Config {
|
||||
pub network_addr: SocketAddr,
|
||||
pub entrypoint_addr: SocketAddr,
|
||||
pub drone_addr: SocketAddr,
|
||||
pub id: Keypair,
|
||||
pub threads: usize,
|
||||
@ -17,20 +17,34 @@ pub struct Config {
|
||||
pub tx_count: usize,
|
||||
pub thread_batch_sleep_ms: usize,
|
||||
pub sustained: bool,
|
||||
pub client_ids_and_stake_file: String,
|
||||
pub write_to_client_file: bool,
|
||||
pub read_from_client_file: bool,
|
||||
pub target_lamports_per_signature: u64,
|
||||
pub multi_client: bool,
|
||||
pub use_move: bool,
|
||||
pub num_lamports_per_account: u64,
|
||||
}
|
||||
|
||||
impl Default for Config {
|
||||
fn default() -> Config {
|
||||
Config {
|
||||
network_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)),
|
||||
id: Keypair::new(),
|
||||
threads: 4,
|
||||
num_nodes: 1,
|
||||
duration: Duration::new(std::u64::MAX, 0),
|
||||
tx_count: 500_000,
|
||||
thread_batch_sleep_ms: 0,
|
||||
tx_count: 50_000,
|
||||
thread_batch_sleep_ms: 1000,
|
||||
sustained: false,
|
||||
client_ids_and_stake_file: String::new(),
|
||||
write_to_client_file: false,
|
||||
read_from_client_file: false,
|
||||
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
||||
multi_client: true,
|
||||
use_move: false,
|
||||
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -40,12 +54,12 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
App::new(crate_name!()).about(crate_description!())
|
||||
.version(crate_version!())
|
||||
.arg(
|
||||
Arg::with_name("network")
|
||||
Arg::with_name("entrypoint")
|
||||
.short("n")
|
||||
.long("network")
|
||||
.long("entrypoint")
|
||||
.value_name("HOST:PORT")
|
||||
.takes_value(true)
|
||||
.help("Rendezvous with the network at this gossip 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::with_name("drone")
|
||||
@ -53,7 +67,7 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
.long("drone")
|
||||
.value_name("HOST:PORT")
|
||||
.takes_value(true)
|
||||
.help("Location of the drone; defaults to network:DRONE_PORT"),
|
||||
.help("Location of the drone; defaults to entrypoint:DRONE_PORT"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("identity")
|
||||
@ -91,6 +105,16 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
.long("sustained")
|
||||
.help("Use sustained performance mode vs. peak mode. This overlaps the tx generation with transfers."),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("use-move")
|
||||
.long("use-move")
|
||||
.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::with_name("tx_count")
|
||||
.long("tx_count")
|
||||
@ -106,6 +130,39 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
.takes_value(true)
|
||||
.help("Per-thread-per-iteration sleep in ms"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("write-client-keys")
|
||||
.long("write-client-keys")
|
||||
.value_name("FILENAME")
|
||||
.takes_value(true)
|
||||
.help("Generate client keys and stakes and write the list to YAML file"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("read-client-keys")
|
||||
.long("read-client-keys")
|
||||
.value_name("FILENAME")
|
||||
.takes_value(true)
|
||||
.help("Read client keys and stakes from the YAML file"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("target_lamports_per_signature")
|
||||
.long("target-lamports-per-signature")
|
||||
.value_name("LAMPORTS")
|
||||
.takes_value(true)
|
||||
.help(
|
||||
"The cost in lamports that the cluster will charge for signature \
|
||||
verification when the cluster is operating at target-signatures-per-slot",
|
||||
),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("num_lamports_per_account")
|
||||
.long("num-lamports-per-account")
|
||||
.value_name("LAMPORTS")
|
||||
.takes_value(true)
|
||||
.help(
|
||||
"Number of lamports per account.",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
/// Parses a clap `ArgMatches` structure into a `Config`
|
||||
@ -116,9 +173,9 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||
let mut args = Config::default();
|
||||
|
||||
if let Some(addr) = matches.value_of("network") {
|
||||
args.network_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
||||
eprintln!("failed to parse network address: {}", e);
|
||||
if let Some(addr) = matches.value_of("entrypoint") {
|
||||
args.entrypoint_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
||||
eprintln!("failed to parse entrypoint address: {}", e);
|
||||
exit(1)
|
||||
});
|
||||
}
|
||||
@ -131,7 +188,7 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||
}
|
||||
|
||||
if matches.is_present("identity") {
|
||||
args.id = read_keypair(matches.value_of("identity").unwrap())
|
||||
args.id = read_keypair_file(matches.value_of("identity").unwrap())
|
||||
.expect("can't read client identity");
|
||||
}
|
||||
|
||||
@ -163,5 +220,27 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||
|
||||
args.sustained = matches.is_present("sustained");
|
||||
|
||||
if let Some(s) = matches.value_of("write-client-keys") {
|
||||
args.write_to_client_file = true;
|
||||
args.client_ids_and_stake_file = s.to_string();
|
||||
}
|
||||
|
||||
if let Some(s) = matches.value_of("read-client-keys") {
|
||||
assert!(!args.write_to_client_file);
|
||||
args.read_from_client_file = true;
|
||||
args.client_ids_and_stake_file = s.to_string();
|
||||
}
|
||||
|
||||
if let Some(v) = matches.value_of("target_lamports_per_signature") {
|
||||
args.target_lamports_per_signature = v.to_string().parse().expect("can't parse lamports");
|
||||
}
|
||||
|
||||
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") {
|
||||
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
||||
}
|
||||
|
||||
args
|
||||
}
|
||||
|
2
bench-tps/src/lib.rs
Normal file
@ -0,0 +1,2 @@
|
||||
pub mod bench;
|
||||
pub mod cli;
|
@ -1,91 +1,141 @@
|
||||
mod bench;
|
||||
mod cli;
|
||||
use log::*;
|
||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
||||
use solana_bench_tps::cli;
|
||||
use solana_core::gossip_service::{discover_cluster, get_client, get_multi_client};
|
||||
use solana_genesis::Base64Account;
|
||||
use solana_sdk::fee_calculator::FeeCalculator;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use solana_sdk::system_program;
|
||||
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit};
|
||||
|
||||
use crate::bench::{
|
||||
airdrop_lamports, do_bench_tps, fund_keys, generate_keypairs, Config, NUM_LAMPORTS_PER_ACCOUNT,
|
||||
};
|
||||
use solana::cluster_info::FULLNODE_PORT_RANGE;
|
||||
use solana::contact_info::ContactInfo;
|
||||
use solana::gossip_service::discover_nodes;
|
||||
use solana_client::thin_client::create_client;
|
||||
use solana_sdk::client::SyncClient;
|
||||
use solana_sdk::signature::KeypairUtil;
|
||||
use std::process::exit;
|
||||
/// 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;
|
||||
|
||||
fn main() {
|
||||
solana_logger::setup();
|
||||
solana_logger::setup_with_filter("solana=info");
|
||||
solana_metrics::set_panic_hook("bench-tps");
|
||||
|
||||
let matches = cli::build_args().get_matches();
|
||||
let cli_config = cli::extract_args(&matches);
|
||||
|
||||
let cli::Config {
|
||||
network_addr,
|
||||
entrypoint_addr,
|
||||
drone_addr,
|
||||
id,
|
||||
threads,
|
||||
num_nodes,
|
||||
duration,
|
||||
tx_count,
|
||||
thread_batch_sleep_ms,
|
||||
sustained,
|
||||
} = cli_config;
|
||||
client_ids_and_stake_file,
|
||||
write_to_client_file,
|
||||
read_from_client_file,
|
||||
target_lamports_per_signature,
|
||||
use_move,
|
||||
multi_client,
|
||||
num_lamports_per_account,
|
||||
..
|
||||
} = &cli_config;
|
||||
|
||||
println!("Connecting to the cluster");
|
||||
let nodes = discover_nodes(&network_addr, num_nodes).unwrap_or_else(|err| {
|
||||
eprintln!("Failed to discover {} nodes: {:?}", num_nodes, err);
|
||||
exit(1);
|
||||
});
|
||||
if nodes.len() < num_nodes {
|
||||
eprintln!(
|
||||
"Error: Insufficient nodes discovered. Expecting {} or more",
|
||||
num_nodes
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
let clients: Vec<_> = nodes
|
||||
.iter()
|
||||
.filter_map(|node| {
|
||||
let cluster_entrypoint = node.clone();
|
||||
let cluster_addrs = cluster_entrypoint.client_facing_addr();
|
||||
if ContactInfo::is_valid_address(&cluster_addrs.0)
|
||||
&& ContactInfo::is_valid_address(&cluster_addrs.1)
|
||||
{
|
||||
let client = create_client(cluster_addrs, FULLNODE_PORT_RANGE);
|
||||
Some(client)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
if *write_to_client_file {
|
||||
info!("Generating {} keypairs", *tx_count * 2);
|
||||
let (keypairs, _) = generate_keypairs(&id, *tx_count as u64 * 2);
|
||||
let num_accounts = keypairs.len() as u64;
|
||||
let max_fee =
|
||||
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
||||
let num_lamports_per_account = (num_accounts - 1 + NUM_SIGNATURES_FOR_TXS * max_fee)
|
||||
/ num_accounts
|
||||
+ num_lamports_per_account;
|
||||
let mut accounts = HashMap::new();
|
||||
keypairs.iter().for_each(|keypair| {
|
||||
accounts.insert(
|
||||
serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
|
||||
Base64Account {
|
||||
balance: num_lamports_per_account,
|
||||
executable: false,
|
||||
owner: system_program::id().to_string(),
|
||||
data: String::new(),
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
println!("Creating {} keypairs...", tx_count * 2);
|
||||
let keypairs = generate_keypairs(&id, tx_count);
|
||||
|
||||
println!("Get lamports...");
|
||||
|
||||
// Sample the first keypair, see if it has lamports, if so then resume.
|
||||
// This logic is to prevent lamport loss on repeated solana-bench-tps executions
|
||||
let keypair0_balance = clients[0]
|
||||
.get_balance(&keypairs.last().unwrap().pubkey())
|
||||
.unwrap_or(0);
|
||||
|
||||
if NUM_LAMPORTS_PER_ACCOUNT > keypair0_balance {
|
||||
let extra = NUM_LAMPORTS_PER_ACCOUNT - keypair0_balance;
|
||||
let total = extra * (keypairs.len() as u64);
|
||||
airdrop_lamports(&clients[0], &drone_addr, &id, total);
|
||||
println!("adding more lamports {}", extra);
|
||||
fund_keys(&clients[0], &id, &keypairs, extra);
|
||||
info!("Writing {}", client_ids_and_stake_file);
|
||||
let serialized = serde_yaml::to_string(&accounts).unwrap();
|
||||
let path = Path::new(&client_ids_and_stake_file);
|
||||
let mut file = File::create(path).unwrap();
|
||||
file.write_all(&serialized.into_bytes()).unwrap();
|
||||
return;
|
||||
}
|
||||
|
||||
let config = Config {
|
||||
id,
|
||||
threads,
|
||||
thread_batch_sleep_ms,
|
||||
duration,
|
||||
tx_count,
|
||||
sustained,
|
||||
info!("Connecting to the cluster");
|
||||
let (nodes, _archivers) =
|
||||
discover_cluster(&entrypoint_addr, *num_nodes).unwrap_or_else(|err| {
|
||||
eprintln!("Failed to discover {} nodes: {:?}", num_nodes, err);
|
||||
exit(1);
|
||||
});
|
||||
|
||||
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);
|
||||
}
|
||||
client
|
||||
} else {
|
||||
get_client(&nodes)
|
||||
};
|
||||
|
||||
do_bench_tps(clients, config, keypairs, keypair0_balance);
|
||||
let (keypairs, move_keypairs, keypair_balance) = if *read_from_client_file && !use_move {
|
||||
let path = Path::new(&client_ids_and_stake_file);
|
||||
let file = File::open(path).unwrap();
|
||||
|
||||
info!("Reading {}", client_ids_and_stake_file);
|
||||
let accounts: HashMap<String, Base64Account> = serde_yaml::from_reader(file).unwrap();
|
||||
let mut keypairs = vec![];
|
||||
let mut last_balance = 0;
|
||||
|
||||
accounts
|
||||
.into_iter()
|
||||
.for_each(|(keypair, primordial_account)| {
|
||||
let bytes: Vec<u8> = serde_json::from_str(keypair.as_str()).unwrap();
|
||||
keypairs.push(Keypair::from_bytes(&bytes).unwrap());
|
||||
last_balance = primordial_account.balance;
|
||||
});
|
||||
|
||||
if keypairs.len() < tx_count * 2 {
|
||||
eprintln!(
|
||||
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
||||
tx_count * 2,
|
||||
client_ids_and_stake_file,
|
||||
keypairs.len(),
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
// Sort keypairs so that do_bench_tps() uses the same subset of accounts for each run.
|
||||
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
||||
// across multiple runs.
|
||||
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
||||
(keypairs, None, last_balance)
|
||||
} else {
|
||||
generate_and_fund_keypairs(
|
||||
&client,
|
||||
Some(*drone_addr),
|
||||
&id,
|
||||
*tx_count,
|
||||
*num_lamports_per_account,
|
||||
*use_move,
|
||||
)
|
||||
.unwrap_or_else(|e| {
|
||||
eprintln!("Error could not fund keys: {:?}", e);
|
||||
exit(1);
|
||||
})
|
||||
};
|
||||
|
||||
do_bench_tps(
|
||||
vec![client],
|
||||
cli_config,
|
||||
keypairs,
|
||||
keypair_balance,
|
||||
move_keypairs,
|
||||
);
|
||||
}
|
||||
|
@ -1,15 +0,0 @@
|
||||
msc {
|
||||
client,leader,verifier_a,verifier_b,verifier_c;
|
||||
|
||||
client=>leader [ label = "SUBMIT" ] ;
|
||||
leader=>client [ label = "CONFIRMED" ] ;
|
||||
leader=>verifier_a [ label = "CONFIRMED" ] ;
|
||||
leader=>verifier_b [ label = "CONFIRMED" ] ;
|
||||
leader=>verifier_c [ label = "CONFIRMED" ] ;
|
||||
verifier_a=>leader [ label = "VERIFIED" ] ;
|
||||
verifier_b=>leader [ label = "VERIFIED" ] ;
|
||||
leader=>client [ label = "FINALIZED" ] ;
|
||||
leader=>verifier_a [ label = "FINALIZED" ] ;
|
||||
leader=>verifier_b [ label = "FINALIZED" ] ;
|
||||
leader=>verifier_c [ label = "FINALIZED" ] ;
|
||||
}
|
19
book/art/data-plane-fanout.bob
Normal file
@ -0,0 +1,19 @@
|
||||
+------------------------------------------------------------------+
|
||||
| |
|
||||
| +-----------------+ Neighborhood 0 +-----------------+ |
|
||||
| | +--------------------->+ | |
|
||||
| | Validator 1 | | Validator 2 | |
|
||||
| | +<---------------------+ | |
|
||||
| +--------+-+------+ +------+-+--------+ |
|
||||
| | | | | |
|
||||
| | +-----------------------------+ | | |
|
||||
| | +------------------------+------+ | |
|
||||
| | | | | |
|
||||
+------------------------------------------------------------------+
|
||||
| | | |
|
||||
v v v v
|
||||
+---------+------+---+ +-+--------+---------+
|
||||
| | | |
|
||||
| Neighborhood 1 | | Neighborhood 2 |
|
||||
| | | |
|
||||
+--------------------+ +--------------------+
|
15
book/art/data-plane-seeding.bob
Normal file
@ -0,0 +1,15 @@
|
||||
+--------------+
|
||||
| |
|
||||
+------------+ Leader +------------+
|
||||
| | | |
|
||||
| +--------------+ |
|
||||
v v
|
||||
+------------+----------------------------------------+------------+
|
||||
| |
|
||||
| +-----------------+ Neighborhood 0 +-----------------+ |
|
||||
| | +--------------------->+ | |
|
||||
| | Validator 1 | | Validator 2 | |
|
||||
| | +<---------------------+ | |
|
||||
| +-----------------+ +-----------------+ |
|
||||
| |
|
||||
+------------------------------------------------------------------+
|
@ -1,28 +1,18 @@
|
||||
|
||||
+--------------+
|
||||
| |
|
||||
+------------+ Leader +------------+
|
||||
| | | |
|
||||
| +--------------+ |
|
||||
v v
|
||||
+--------+--------+ +--------+--------+
|
||||
| +--------------------->+ |
|
||||
+-----------------+ Validator 1 | | Validator 2 +-------------+
|
||||
| | +<---------------------+ | |
|
||||
| +------+-+-+------+ +---+-+-+---------+ |
|
||||
| | | | | | | |
|
||||
| | | | | | | |
|
||||
| +---------------------------------------------+ | | |
|
||||
| | | | | | | |
|
||||
| | | | | +----------------------+ | |
|
||||
| | | | | | | |
|
||||
| | | | +--------------------------------------------+ |
|
||||
| | | | | | | |
|
||||
| | | +----------------------+ | | |
|
||||
| | | | | | | |
|
||||
v v v v v v v v
|
||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||
| | | | | | | |
|
||||
| Neighborhood 1 | | Neighborhood 2 | | Neighborhood 3 | | Neighborhood 4 |
|
||||
| | | | | | | |
|
||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||
+--------------------+
|
||||
| |
|
||||
+--------+ Neighborhood 0 +----------+
|
||||
| | | |
|
||||
| +--------------------+ |
|
||||
v v
|
||||
+---------+----------+ +----------+---------+
|
||||
| | | |
|
||||
| Neighborhood 1 | | Neighborhood 2 |
|
||||
| | | |
|
||||
+---+-----+----------+ +----------+-----+---+
|
||||
| | | |
|
||||
v v v v
|
||||
+------------------+-+ +-+------------------+ +------------------+-+ +-+------------------+
|
||||
| | | | | | | |
|
||||
| Neighborhood 3 | | Neighborhood 4 | | Neighborhood 5 | | Neighborhood 6 |
|
||||
| | | | | | | |
|
||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||
|
18
book/art/spv-bank-merkle.bob
Normal file
@ -0,0 +1,18 @@
|
||||
+------------+
|
||||
| Bank-Merkle|
|
||||
+------------+
|
||||
^ ^
|
||||
/ \
|
||||
+-----------------+ +-------------+
|
||||
| Bank-Diff-Merkle| | Block-Merkle|
|
||||
+-----------------+ +-------------+
|
||||
^ ^
|
||||
/ \
|
||||
+------+ +--------------------------+
|
||||
| Hash | | Previous Bank-Diff-Merkle|
|
||||
+------+ +--------------------------+
|
||||
^ ^
|
||||
/ \
|
||||
+---------------+ +---------------+
|
||||
| Hash(Account1)| | Hash(Account2)|
|
||||
+---------------+ +---------------+
|
19
book/art/spv-block-merkle.bob
Normal file
@ -0,0 +1,19 @@
|
||||
+---------------+
|
||||
| Block-Merkle |
|
||||
+---------------+
|
||||
^ ^
|
||||
/ \
|
||||
+-------------+ +-------------+
|
||||
| Entry-Merkle| | Entry-Merkle|
|
||||
+-------------+ +-------------+
|
||||
^ ^
|
||||
/ \
|
||||
+-------+ +-------+
|
||||
| Hash | | Hash |
|
||||
+-------+ +-------+
|
||||
^ ^ ^ ^
|
||||
/ | | \
|
||||
+-----------------+ +-----------------+ +-----------------+ +---+
|
||||
| Hash(T1, status)| | Hash(T2, status)| | Hash(T3, status)| | 0 |
|
||||
+-----------------+ +-----------------+ +-----------------+ +---+
|
||||
|
60
book/art/validator-proposal.bob
Normal file
@ -0,0 +1,60 @@
|
||||
|
||||
.------------.
|
||||
| Upstream |
|
||||
| Validators |
|
||||
`----+-------`
|
||||
|
|
||||
|
|
||||
.-----------------------------------.
|
||||
| Validator | |
|
||||
| v |
|
||||
| .-----------. .------------. |
|
||||
.--------. | | Fetch | | Repair | |
|
||||
| Client +---->| Stage | | Stage | |
|
||||
`--------` | `---+-------` `----+-------` |
|
||||
| | | |
|
||||
| v v |
|
||||
| .-----------. .------------. |
|
||||
| | TPU |<-->| Blockstore | |
|
||||
| | | | | |
|
||||
| `-----------` `----+-------` |
|
||||
| | |
|
||||
| v |
|
||||
| .------------. |
|
||||
| | Multicast | |
|
||||
| | Stage | |
|
||||
| `----+-------` |
|
||||
| | |
|
||||
`-----------------------------------`
|
||||
|
|
||||
v
|
||||
.------------.
|
||||
| Downstream |
|
||||
| Validators |
|
||||
`------------`
|
||||
|
||||
|
||||
|
||||
.------------.
|
||||
| PoH |
|
||||
| Service |
|
||||
`-------+----`
|
||||
^ |
|
||||
| |
|
||||
.-----------------------------------.
|
||||
| TPU | | |
|
||||
| | v |
|
||||
.-------. | .-----------. .---+--------. | .------------.
|
||||
| Fetch +---->| SigVerify +--->| Banking |<--->| Blockstore |
|
||||
| Stage | | | Stage | | Stage | | | |
|
||||
`-------` | `-----------` `-----+------` | `------------`
|
||||
| | |
|
||||
| | |
|
||||
`-----------------------------------`
|
||||
|
|
||||
v
|
||||
.------------.
|
||||
| Banktree |
|
||||
| |
|
||||
`------------`
|
||||
|
@ -1,5 +1,5 @@
|
||||
.--------------------------------------.
|
||||
| Fullnode |
|
||||
| Validator |
|
||||
| |
|
||||
.--------. | .-------------------. |
|
||||
| |---->| | |
|
34
book/build-cli-usage.sh
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
usage=$(cargo -q run -p solana-cli -- -C ~/.foo --help | sed 's|'"$HOME"'|~|g')
|
||||
|
||||
out=${1:-src/api-reference/cli.md}
|
||||
|
||||
cat src/api-reference/.cli.md > "$out"
|
||||
|
||||
section() {
|
||||
declare mark=${2:-"###"}
|
||||
declare section=$1
|
||||
read -r name rest <<<"$section"
|
||||
|
||||
printf '%s %s
|
||||
' "$mark" "$name"
|
||||
printf '```text
|
||||
%s
|
||||
```
|
||||
|
||||
' "$section"
|
||||
}
|
||||
|
||||
section "$usage" >> "$out"
|
||||
|
||||
in_subcommands=0
|
||||
while read -r subcommand rest; do
|
||||
[[ $subcommand == "SUBCOMMANDS:" ]] && in_subcommands=1 && continue
|
||||
if ((in_subcommands)); then
|
||||
section "$(cargo -q run -p solana-cli -- help "$subcommand" | sed 's|'"$HOME"'|~|g')" "####" >> "$out"
|
||||
fi
|
||||
done <<<"$usage">>"$out"
|
13
book/build-svg.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/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,16 +3,4 @@ set -e
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
cargo_install_unless() {
|
||||
declare crate=$1
|
||||
shift
|
||||
|
||||
"$@" > /dev/null 2>&1 || \
|
||||
cargo install "$crate"
|
||||
}
|
||||
|
||||
export PATH=$CARGO_HOME/bin:$PATH
|
||||
cargo_install_unless mdbook mdbook --help
|
||||
cargo_install_unless svgbob_cli svgbob --help
|
||||
|
||||
make -j"$(nproc)"
|
||||
make -j"$(nproc)" test
|
||||
|
@ -1,31 +1,41 @@
|
||||
BOB_SRCS=$(wildcard art/*.bob)
|
||||
MSC_SRCS=$(wildcard art/*.msc)
|
||||
MD_SRCS=$(wildcard src/*.md)
|
||||
|
||||
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/img/%.svg)
|
||||
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/.gitbook/assets/%.svg) $(MSC_SRCS:art/%.msc=src/.gitbook/assets/%.svg)
|
||||
|
||||
all: html/index.html
|
||||
TARGET=html/index.html
|
||||
TEST_STAMP=src/tests.ok
|
||||
|
||||
test: src/tests.ok
|
||||
all: $(TARGET)
|
||||
|
||||
open: all
|
||||
svg: $(SVG_IMGS)
|
||||
|
||||
test: $(TEST_STAMP)
|
||||
|
||||
open: $(TEST_STAMP)
|
||||
mdbook build --open
|
||||
|
||||
watch: $(SVG_IMGS)
|
||||
mdbook watch
|
||||
|
||||
src/img/%.svg: art/%.bob
|
||||
src/.gitbook/assets/%.svg: art/%.bob
|
||||
@mkdir -p $(@D)
|
||||
svgbob < $< > $@
|
||||
|
||||
src/.gitbook/assets/%.svg: art/%.msc
|
||||
@mkdir -p $(@D)
|
||||
mscgen -T svg -i $< -o $@
|
||||
|
||||
src/%.md: %.md
|
||||
@mkdir -p $(@D)
|
||||
@cp $< $@
|
||||
|
||||
src/tests.ok: $(SVG_IMGS) $(MD_SRCS)
|
||||
$(TEST_STAMP): $(TARGET)
|
||||
mdbook test
|
||||
touch $@
|
||||
|
||||
html/index.html: src/tests.ok
|
||||
$(TARGET): $(SVG_IMGS) $(MD_SRCS)
|
||||
mdbook build
|
||||
|
||||
clean:
|
||||
|
192
book/src/.gitbook/assets/data-plane (1).svg
Normal file
@ -0,0 +1,192 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.9 KiB |
192
book/src/.gitbook/assets/data-plane (2).svg
Normal file
@ -0,0 +1,192 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.9 KiB |
192
book/src/.gitbook/assets/data-plane (3).svg
Normal file
@ -0,0 +1,192 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.9 KiB |
192
book/src/.gitbook/assets/data-plane (4).svg
Normal file
@ -0,0 +1,192 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.9 KiB |
210
book/src/.gitbook/assets/data-plane (5).svg
Normal file
@ -0,0 +1,210 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
192
book/src/.gitbook/assets/data-plane-3.svg
Normal file
@ -0,0 +1,192 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.9 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (1).svg
Normal file
@ -0,0 +1,183 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
201
book/src/.gitbook/assets/data-plane-fanout (2).svg
Normal file
@ -0,0 +1,201 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.7 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (3).svg
Normal file
@ -0,0 +1,183 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (4).svg
Normal file
@ -0,0 +1,183 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (5).svg
Normal file
@ -0,0 +1,183 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout-3.svg
Normal file
@ -0,0 +1,183 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout.svg
Normal file
@ -0,0 +1,183 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.8 KiB |
340
book/src/.gitbook/assets/data-plane-neighborhood (1).svg
Normal file
@ -0,0 +1,340 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.2 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (2).svg
Normal file
@ -0,0 +1,322 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (3).svg
Normal file
@ -0,0 +1,322 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (4).svg
Normal file
@ -0,0 +1,322 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (5).svg
Normal file
@ -0,0 +1,322 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood-3.svg
Normal file
@ -0,0 +1,322 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood.svg
Normal file
@ -0,0 +1,322 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.3 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (1).svg
Normal file
@ -0,0 +1,138 @@
|
||||
<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>
|
After Width: | Height: | Size: 3.8 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (2).svg
Normal file
@ -0,0 +1,138 @@
|
||||
<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>
|
After Width: | Height: | Size: 3.8 KiB |
156
book/src/.gitbook/assets/data-plane-seeding (3).svg
Normal file
@ -0,0 +1,156 @@
|
||||
<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>
|
After Width: | Height: | Size: 3.7 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (4).svg
Normal file
@ -0,0 +1,138 @@
|
||||
<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>
|
After Width: | Height: | Size: 3.8 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (5).svg
Normal file
@ -0,0 +1,138 @@
|
||||
<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>
|
After Width: | Height: | Size: 3.8 KiB |
138
book/src/.gitbook/assets/data-plane-seeding.svg
Normal file
@ -0,0 +1,138 @@
|
||||
<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>
|
After Width: | Height: | Size: 3.8 KiB |
192
book/src/.gitbook/assets/data-plane.svg
Normal file
@ -0,0 +1,192 @@
|
||||
<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>
|
After Width: | Height: | Size: 4.9 KiB |
330
book/src/.gitbook/assets/fork-generation (1).svg
Normal file
@ -0,0 +1,330 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation (2).svg
Normal file
@ -0,0 +1,330 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation (3).svg
Normal file
@ -0,0 +1,330 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.5 KiB |
348
book/src/.gitbook/assets/fork-generation (4).svg
Normal file
@ -0,0 +1,348 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.4 KiB |
330
book/src/.gitbook/assets/fork-generation (5).svg
Normal file
@ -0,0 +1,330 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation-3.svg
Normal file
@ -0,0 +1,330 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation.svg
Normal file
@ -0,0 +1,330 @@
|
||||
<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>
|
After Width: | Height: | Size: 5.5 KiB |
122
book/src/.gitbook/assets/forks (1).svg
Normal file
@ -0,0 +1,122 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.9 KiB |
140
book/src/.gitbook/assets/forks (2).svg
Normal file
@ -0,0 +1,140 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.8 KiB |
122
book/src/.gitbook/assets/forks (3).svg
Normal file
@ -0,0 +1,122 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.9 KiB |
122
book/src/.gitbook/assets/forks (4).svg
Normal file
@ -0,0 +1,122 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.9 KiB |
122
book/src/.gitbook/assets/forks (5).svg
Normal file
@ -0,0 +1,122 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.9 KiB |
92
book/src/.gitbook/assets/forks-pruned (1).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (2).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (3).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (4).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (5).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned-3.svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned.svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned2 (1).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned2 (2).svg
Normal file
@ -0,0 +1,92 @@
|
||||
<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>
|
After Width: | Height: | Size: 2.4 KiB |