mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-10-24 08:24:14 +02:00
Compare commits
6160 Commits
0.5.1
...
3881_subgr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b68fee7e65 | ||
|
|
abc6ee049d | ||
|
|
bcbf68b7e1 | ||
|
|
1e30e33ad3 | ||
|
|
4b5021c0cc | ||
|
|
41033008ec | ||
|
|
cd0eae2807 | ||
|
|
8cb6fbfab0 | ||
|
|
6f2b0c43cb | ||
|
|
650ee31cd1 | ||
|
|
931d56947a | ||
|
|
36cf7e0601 | ||
|
|
ff1d56e9b5 | ||
|
|
5e98e99f86 | ||
|
|
316f612bde | ||
|
|
2a5c2b58de | ||
|
|
e8703a59ec | ||
|
|
3a6dd61f65 | ||
|
|
bfbb7996e9 | ||
|
|
1f147b6b63 | ||
|
|
e302ee383a | ||
|
|
527a3df083 | ||
|
|
b949da9ae4 | ||
|
|
2984e4fc57 | ||
|
|
3b91846d0c | ||
|
|
05b25db5eb | ||
|
|
51119f22df | ||
|
|
f425a02cf9 | ||
|
|
3e4dc306d4 | ||
|
|
4a4eff55c1 | ||
|
|
5e330a6d78 | ||
|
|
ecf1273c82 | ||
|
|
a4fec411bd | ||
|
|
50aab56177 | ||
|
|
79c63e9ff4 | ||
|
|
7201c014e3 | ||
|
|
cc1c98325c | ||
|
|
f8b05f7d75 | ||
|
|
6faf54cf6f | ||
|
|
01a24296b6 | ||
|
|
ab81b508ce | ||
|
|
ed6fb15c38 | ||
|
|
2cefb0fb8f | ||
|
|
1dae3a000d | ||
|
|
7f4368415d | ||
|
|
8116c8b40d | ||
|
|
32cf349d12 | ||
|
|
9da29da63b | ||
|
|
f2ed255137 | ||
|
|
49348a82e0 | ||
|
|
d81a922a4f | ||
|
|
1ca49c696a | ||
|
|
8e8259934e | ||
|
|
66bb19f91a | ||
|
|
183dee89c2 | ||
|
|
009a32d20b | ||
|
|
338d83d4a5 | ||
|
|
c3e054c155 | ||
|
|
a09ec69a96 | ||
|
|
7f5b48920c | ||
|
|
4703523d6b | ||
|
|
8066aaeeb0 | ||
|
|
828e99d4b9 | ||
|
|
5967289172 | ||
|
|
4143032b66 | ||
|
|
9eb506f6c5 | ||
|
|
231965d36c | ||
|
|
31380368e1 | ||
|
|
e2e604a76a | ||
|
|
98e4b6f338 | ||
|
|
e1c2b1ddb5 | ||
|
|
22993e8b6c | ||
|
|
fdbc4ce0ed | ||
|
|
96d7666d8e | ||
|
|
0e3a558b02 | ||
|
|
f9222a3bf4 | ||
|
|
78b7941f2d | ||
|
|
0d27b1aa65 | ||
|
|
9b01a07b9d | ||
|
|
32db43069d | ||
|
|
89488b60a4 | ||
|
|
a686255d9e | ||
|
|
ffb95b4fa9 | ||
|
|
29a02d1ab5 | ||
|
|
564414ecac | ||
|
|
050574f60f | ||
|
|
b9f0c7c807 | ||
|
|
ed6ad77fd9 | ||
|
|
1f64302ae2 | ||
|
|
a8c5f6d517 | ||
|
|
de99cdfb4c | ||
|
|
b75ce7af45 | ||
|
|
de8ce77f37 | ||
|
|
bdace6a4d6 | ||
|
|
0e34caa1b0 | ||
|
|
13ef403921 | ||
|
|
f687abb165 | ||
|
|
931661ed67 | ||
|
|
7d3a0577d2 | ||
|
|
4411aa9905 | ||
|
|
4890999206 | ||
|
|
8a2d3a400c | ||
|
|
29342ea726 | ||
|
|
4ad99a25d0 | ||
|
|
fc859528e4 | ||
|
|
49a931f712 | ||
|
|
bdf8b01185 | ||
|
|
1b201bf462 | ||
|
|
3316aa5f4f | ||
|
|
a11ab3d5ea | ||
|
|
2a0f6d4cc9 | ||
|
|
e3b9dbdf13 | ||
|
|
70f024735b | ||
|
|
fd76e0e270 | ||
|
|
537a627b75 | ||
|
|
57edcfe87d | ||
|
|
b9dcdb00a5 | ||
|
|
09ed41b7d2 | ||
|
|
6e234f135d | ||
|
|
e2a0c434cc | ||
|
|
804a23595d | ||
|
|
8655db371e | ||
|
|
9b8d5c1b3b | ||
|
|
e9f8ba6915 | ||
|
|
c30aa6f9cf | ||
|
|
6da6edfc01 | ||
|
|
461236030c | ||
|
|
8cc291162f | ||
|
|
b83ba4d293 | ||
|
|
c2bd6a490f | ||
|
|
476917bda9 | ||
|
|
432d4f41f6 | ||
|
|
2092330eec | ||
|
|
e05e0f8ae3 | ||
|
|
52ee234c0f | ||
|
|
1d828fe8be | ||
|
|
503114c0eb | ||
|
|
653682a4b8 | ||
|
|
1ad63d5b0b | ||
|
|
717aca6824 | ||
|
|
2cbf6110a6 | ||
|
|
3358406e68 | ||
|
|
d05fd25339 | ||
|
|
fcec9adbcd | ||
|
|
13f3008f82 | ||
|
|
6090a1f65a | ||
|
|
1ecd4a551d | ||
|
|
c6db0524bd | ||
|
|
d3f5474f38 | ||
|
|
9996e53e24 | ||
|
|
3b79ee35e0 | ||
|
|
b202b539bf | ||
|
|
e27966c15f | ||
|
|
18c27c6f1d | ||
|
|
345eaade22 | ||
|
|
82f63b056f | ||
|
|
ccd55a0bde | ||
|
|
846a03663c | ||
|
|
a88a467d45 | ||
|
|
beab2278d8 | ||
|
|
51a84eeb90 | ||
|
|
ad6eba452c | ||
|
|
eae88c51d2 | ||
|
|
752cc3a527 | ||
|
|
051b4271d3 | ||
|
|
4decaf0308 | ||
|
|
9144fa390f | ||
|
|
c354d9e1e3 | ||
|
|
77a326dedf | ||
|
|
2d9bdedaf5 | ||
|
|
04a99a7cd3 | ||
|
|
0763590c24 | ||
|
|
dfb1440ae0 | ||
|
|
a1e2df8466 | ||
|
|
20613beb8a | ||
|
|
292cbd75a8 | ||
|
|
88d3fdfb8f | ||
|
|
1f68ea4058 | ||
|
|
ab92b5c100 | ||
|
|
195f3a5feb | ||
|
|
dcab2c552f | ||
|
|
a83f88bdf1 | ||
|
|
c781545a40 | ||
|
|
791dbe01a2 | ||
|
|
fcd93794ce | ||
|
|
0af36f12b7 | ||
|
|
dd5d99eacc | ||
|
|
750029f557 | ||
|
|
ccfaea8e3f | ||
|
|
0b9b2cfadc | ||
|
|
526113517b | ||
|
|
fb8149b2ca | ||
|
|
9bb0ed2040 | ||
|
|
2f9d6e0aff | ||
|
|
ecc51d7cb8 | ||
|
|
c309e3e3d6 | ||
|
|
f52df3037f | ||
|
|
649ab17806 | ||
|
|
89da6ea31a | ||
|
|
c7f7ff39ce | ||
|
|
8e63a072e4 | ||
|
|
b03ac389fa | ||
|
|
d2511f6a8c | ||
|
|
5b53cee673 | ||
|
|
1b2dce99c9 | ||
|
|
ba7f83019f | ||
|
|
745abb81dc | ||
|
|
e64e98fbfc | ||
|
|
605f288554 | ||
|
|
6d2552ea6e | ||
|
|
20b4358c0e | ||
|
|
7ca525622b | ||
|
|
7350b63e40 | ||
|
|
6543ece92c | ||
|
|
aab8f9273f | ||
|
|
166dca4924 | ||
|
|
62f3c4baa6 | ||
|
|
66c543cb8f | ||
|
|
a19622c807 | ||
|
|
013ff182c9 | ||
|
|
b5d335711f | ||
|
|
5e41b68a3a | ||
|
|
3b901c4459 | ||
|
|
f8234369c7 | ||
|
|
0d8f09cec5 | ||
|
|
23fe5ebddb | ||
|
|
4a45112344 | ||
|
|
75d276e19e | ||
|
|
2243af1871 | ||
|
|
91bbab9e2d | ||
|
|
c6287b640d | ||
|
|
c5fe23c26f | ||
|
|
1304e8b00b | ||
|
|
41dbf0fa96 | ||
|
|
603b537ee1 | ||
|
|
2a45d71efd | ||
|
|
1a5e7315c0 | ||
|
|
da6bb9498a | ||
|
|
5d935c44e7 | ||
|
|
e653d656b3 | ||
|
|
46fc13a5bc | ||
|
|
f3d8ada0ca | ||
|
|
705d88360e | ||
|
|
9e3601ae48 | ||
|
|
3aa2885692 | ||
|
|
c56854941e | ||
|
|
357a928cce | ||
|
|
1d9fefe7ac | ||
|
|
d4cc366e86 | ||
|
|
3d7883f021 | ||
|
|
41f228c3ff | ||
|
|
da447ae5d0 | ||
|
|
1e417833f4 | ||
|
|
f295424087 | ||
|
|
daa85b4279 | ||
|
|
e7369acaea | ||
|
|
3ad17b79a6 | ||
|
|
6879a15834 | ||
|
|
607fe88d43 | ||
|
|
b63828f88d | ||
|
|
794b642ff8 | ||
|
|
4870d37027 | ||
|
|
fb855bfcfa | ||
|
|
97a7f1fd71 | ||
|
|
c86d46eb8a | ||
|
|
361dd6a96e | ||
|
|
17adec38af | ||
|
|
638b9d9aae | ||
|
|
c8f6994895 | ||
|
|
1117a80500 | ||
|
|
5d83ec6fa2 | ||
|
|
bab5937426 | ||
|
|
099a26977a | ||
|
|
0b834485a8 | ||
|
|
41f21d4f72 | ||
|
|
312e5f3d96 | ||
|
|
6ef3e7f536 | ||
|
|
4f5228aec4 | ||
|
|
b9daa35558 | ||
|
|
21304a9677 | ||
|
|
c46a3b09b1 | ||
|
|
549c2b8d04 | ||
|
|
05fd856d62 | ||
|
|
6d2441dff6 | ||
|
|
46ee4e426f | ||
|
|
469d0f87be | ||
|
|
b20602672e | ||
|
|
6563c0292a | ||
|
|
86f835cfc8 | ||
|
|
4699ba3e71 | ||
|
|
3f6613ea9f | ||
|
|
c8635c0b9b | ||
|
|
e78ac9b92a | ||
|
|
7c07bc02af | ||
|
|
1a0d333e2c | ||
|
|
cd9fac78b8 | ||
|
|
4c779beda9 | ||
|
|
114262d353 | ||
|
|
015e22acf8 | ||
|
|
70ec91d0db | ||
|
|
61b7033c65 | ||
|
|
a9234785ab | ||
|
|
b735c21a33 | ||
|
|
83fb0f446f | ||
|
|
78565d16c1 | ||
|
|
2c5a2072b8 | ||
|
|
56c2fe3eb1 | ||
|
|
f36e0ef941 | ||
|
|
c72bdc83c8 | ||
|
|
3b7463e5ed | ||
|
|
1e410de4cd | ||
|
|
d08701e5c4 | ||
|
|
359a570d77 | ||
|
|
24198ed63e | ||
|
|
77782fdbc7 | ||
|
|
a15b228d3f | ||
|
|
450c308e4f | ||
|
|
d1e235a08b | ||
|
|
85444dbee9 | ||
|
|
01ac770037 | ||
|
|
3675682674 | ||
|
|
a7c9fe77c5 | ||
|
|
f87d1630d1 | ||
|
|
ec10316346 | ||
|
|
449dfe8b8e | ||
|
|
4adf79451e | ||
|
|
7a47fcfcbc | ||
|
|
fed32607de | ||
|
|
8f5fe38212 | ||
|
|
f3cf6d638d | ||
|
|
e1d9d0b990 | ||
|
|
6e5adbf0ba | ||
|
|
38fb926ea8 | ||
|
|
61e20ce48a | ||
|
|
b0b4cccc96 | ||
|
|
13e5c5ba72 | ||
|
|
81d1dd7465 | ||
|
|
b7d24c8325 | ||
|
|
d7bf92b39f | ||
|
|
d4c19ffa59 | ||
|
|
120940f9f4 | ||
|
|
6b3892baf1 | ||
|
|
c1529bb7fc | ||
|
|
033f88e8bb | ||
|
|
6293a583a4 | ||
|
|
ec5568b943 | ||
|
|
f1bfdd4506 | ||
|
|
48b1f489fc | ||
|
|
e62dd255bc | ||
|
|
13110c4ed9 | ||
|
|
327fcbf902 | ||
|
|
81924f72c8 | ||
|
|
3166f689f9 | ||
|
|
5d048ce21e | ||
|
|
264edddc71 | ||
|
|
caf95dec86 | ||
|
|
289ac52900 | ||
|
|
455839c0b9 | ||
|
|
47e1f611d8 | ||
|
|
fb9127ecc6 | ||
|
|
a59f49c04f | ||
|
|
58d692e6f5 | ||
|
|
b62873a195 | ||
|
|
6eb2ce2706 | ||
|
|
c413119064 | ||
|
|
599d035daf | ||
|
|
10ba3b612e | ||
|
|
3dca7d10d5 | ||
|
|
84628134ed | ||
|
|
f4bb978a87 | ||
|
|
27a68819bc | ||
|
|
427eaebd79 | ||
|
|
3603cc883c | ||
|
|
fc24373667 | ||
|
|
2e571a18bd | ||
|
|
1a0309fb87 | ||
|
|
728d022f52 | ||
|
|
fc829a4bde | ||
|
|
e793aae0ec | ||
|
|
663edabb14 | ||
|
|
f41e34e61a | ||
|
|
89d3d297b7 | ||
|
|
41249fd064 | ||
|
|
22587b9959 | ||
|
|
3a2669e634 | ||
|
|
895a5eb78a | ||
|
|
4601c90904 | ||
|
|
b9f0fb9cd2 | ||
|
|
f788ab54f3 | ||
|
|
a1c6d76a15 | ||
|
|
7e5689d0b9 | ||
|
|
563aff2d72 | ||
|
|
e6f19ff461 | ||
|
|
f2279d48d8 | ||
|
|
8ad8d39fe4 | ||
|
|
52c5ae6d8e | ||
|
|
870cfdc44c | ||
|
|
4b64775fde | ||
|
|
4cd1e9a462 | ||
|
|
55d2c928ee | ||
|
|
0c4edd332c | ||
|
|
3d140a7411 | ||
|
|
2d11192c3a | ||
|
|
3e76edcbac | ||
|
|
f4fa68031e | ||
|
|
377b22e82b | ||
|
|
56a8068a7f | ||
|
|
d17aa6ecdd | ||
|
|
6f27363862 | ||
|
|
5192608f7c | ||
|
|
77f5e0d5f3 | ||
|
|
4c311ea4b1 | ||
|
|
bbb3712284 | ||
|
|
4838d63455 | ||
|
|
904c011baf | ||
|
|
352dd5dcf7 | ||
|
|
1388e201e5 | ||
|
|
125312c114 | ||
|
|
ea314cd24a | ||
|
|
8230c8f8b4 | ||
|
|
d115fbc6da | ||
|
|
c1f51175a1 | ||
|
|
06b5c192b4 | ||
|
|
6f19af2371 | ||
|
|
c230ff04cb | ||
|
|
c71b6e31f7 | ||
|
|
2ae8bf2987 | ||
|
|
017fc483e7 | ||
|
|
f2571e9930 | ||
|
|
111354dd10 | ||
|
|
66ea491aff | ||
|
|
e95eaddf8a | ||
|
|
d296049d19 | ||
|
|
c45bf055b6 | ||
|
|
c8b377bf74 | ||
|
|
20751a6496 | ||
|
|
f6c167db84 | ||
|
|
75e11b1fde | ||
|
|
cead1f36f4 | ||
|
|
3108e896b6 | ||
|
|
d41efa413c | ||
|
|
5803d0abaf | ||
|
|
53bc747e9d | ||
|
|
e86d7894f5 | ||
|
|
752a6b2cb0 | ||
|
|
2fd94db686 | ||
|
|
97a842e651 | ||
|
|
8b64ad971a | ||
|
|
338e7e83cd | ||
|
|
fde3964b50 | ||
|
|
aad53f9e61 | ||
|
|
17b72d565d | ||
|
|
319f925bdd | ||
|
|
541de12690 | ||
|
|
ea86ef3995 | ||
|
|
fcba29f774 | ||
|
|
166dca55f2 | ||
|
|
aa43cfb5ac | ||
|
|
989d716c36 | ||
|
|
720849a55e | ||
|
|
c83e29c6e3 | ||
|
|
a4af3704ba | ||
|
|
a3b8c301e2 | ||
|
|
d106d3d1b1 | ||
|
|
a26673c59a | ||
|
|
5aff154740 | ||
|
|
2e86031f00 | ||
|
|
978bf4e0ff | ||
|
|
8aaa7b1ba3 | ||
|
|
d248952d9e | ||
|
|
775fb80c43 | ||
|
|
aec1d80966 | ||
|
|
1f642ca9b6 | ||
|
|
478c387491 | ||
|
|
f532843665 | ||
|
|
9ba1f7c1f6 | ||
|
|
b78dc246ec | ||
|
|
9251176f5e | ||
|
|
0da56a1249 | ||
|
|
cbcf7f8a11 | ||
|
|
58a53c0fa8 | ||
|
|
b486177ca7 | ||
|
|
957e64fe8a | ||
|
|
7881d1e457 | ||
|
|
16be835c9b | ||
|
|
59cf085af5 | ||
|
|
fc8db95597 | ||
|
|
9ac3992fd2 | ||
|
|
cc10e62ebd | ||
|
|
bed95c77a9 | ||
|
|
069951a748 | ||
|
|
c913fc8407 | ||
|
|
4be66554b3 | ||
|
|
d62c2d1e22 | ||
|
|
30a3a9ee53 | ||
|
|
0d5664cc9b | ||
|
|
d03fdfdbca | ||
|
|
57b883c7dd | ||
|
|
af0f0ca526 | ||
|
|
bc9ed8e1bd | ||
|
|
673a2e8228 | ||
|
|
75c67ed948 | ||
|
|
353895dceb | ||
|
|
d348f2847c | ||
|
|
4d46ea9801 | ||
|
|
eec97d10af | ||
|
|
ebef4a1416 | ||
|
|
24605784f2 | ||
|
|
3240f8ae56 | ||
|
|
627ddc0774 | ||
|
|
4fc3cc7aff | ||
|
|
3e1b235055 | ||
|
|
44706bc32e | ||
|
|
e5c85cbc64 | ||
|
|
589dd70356 | ||
|
|
85ba4549fb | ||
|
|
adf7702211 | ||
|
|
ba71afcce5 | ||
|
|
3c0727c744 | ||
|
|
7391baae34 | ||
|
|
4b31112bcb | ||
|
|
17ff584d15 | ||
|
|
79f4eb2e32 | ||
|
|
e8cd3c0baf | ||
|
|
15f31f9d95 | ||
|
|
370806365f | ||
|
|
15dd60ab85 | ||
|
|
d1f3b889d6 | ||
|
|
7b7db4f60e | ||
|
|
965eae5f45 | ||
|
|
278a19f87a | ||
|
|
56f3fa6495 | ||
|
|
50f44c5cb0 | ||
|
|
cc2f4f779a | ||
|
|
00ce0fc034 | ||
|
|
551b37f969 | ||
|
|
bc5ef5fb7d | ||
|
|
c20b8a0664 | ||
|
|
9660b0e9fb | ||
|
|
f05f07e44f | ||
|
|
7e8631dd19 | ||
|
|
23e590e09b | ||
|
|
60e4585e20 | ||
|
|
ba436cc37a | ||
|
|
960ea450e9 | ||
|
|
8ffa7e6334 | ||
|
|
2fb1876023 | ||
|
|
f5692e742b | ||
|
|
d7e7498fea | ||
|
|
8ea1a1a077 | ||
|
|
7cd281eea8 | ||
|
|
1570eb7b73 | ||
|
|
5060c9f390 | ||
|
|
1fea43e125 | ||
|
|
ef47cc5b6f | ||
|
|
e876c35ef9 | ||
|
|
800cb65706 | ||
|
|
25ff005dd7 | ||
|
|
98f4c2d3ae | ||
|
|
72c266b242 | ||
|
|
2bb0cf17d1 | ||
|
|
828f69f011 | ||
|
|
ad4b079d63 | ||
|
|
d3de78ffce | ||
|
|
5d4d7c5fbf | ||
|
|
238b15df9d | ||
|
|
6e2deb1fa7 | ||
|
|
1255c0064b | ||
|
|
8e93ffffc6 | ||
|
|
c55add73f6 | ||
|
|
d2300d375b | ||
|
|
053c966d5f | ||
|
|
235797a97c | ||
|
|
1fa84a30c9 | ||
|
|
622b441eb0 | ||
|
|
508fbccdb4 | ||
|
|
ad0cb7ff3c | ||
|
|
bc258793ac | ||
|
|
10d2e0a62f | ||
|
|
4d0da7fba0 | ||
|
|
738abc8946 | ||
|
|
de5ad8644e | ||
|
|
97b39bca95 | ||
|
|
3698b30809 | ||
|
|
069437842b | ||
|
|
ee13c7666d | ||
|
|
a23a7edd26 | ||
|
|
6f05d4b05a | ||
|
|
ab5111e84f | ||
|
|
e21da2ec7f | ||
|
|
2b40bc0a48 | ||
|
|
7e1006db26 | ||
|
|
44f463c4f4 | ||
|
|
6029bdeee9 | ||
|
|
0261e7464a | ||
|
|
a22158b2e2 | ||
|
|
8a3bd5bcb8 | ||
|
|
514d12d48c | ||
|
|
01fac85cde | ||
|
|
18283bc48f | ||
|
|
f31db315b8 | ||
|
|
8a2aea219e | ||
|
|
034fe80411 | ||
|
|
6d9b695ada | ||
|
|
9c1da3bca1 | ||
|
|
0e61395aa9 | ||
|
|
8215c7d98e | ||
|
|
ee45ab2e6c | ||
|
|
b1f3e21d28 | ||
|
|
a4b0e6b87b | ||
|
|
9fe7152d98 | ||
|
|
0859f28a14 | ||
|
|
56b9aab5ce | ||
|
|
aacc40e525 | ||
|
|
b0ed5e9be2 | ||
|
|
3777ccb305 | ||
|
|
6b736f0bb0 | ||
|
|
2e72c0bf6e | ||
|
|
a1757ba217 | ||
|
|
5390c409d0 | ||
|
|
4f91c9a8de | ||
|
|
8cf4efc190 | ||
|
|
405df09e43 | ||
|
|
86adf96021 | ||
|
|
a0c3de568b | ||
|
|
c10eb5af79 | ||
|
|
3c4acd2184 | ||
|
|
ab1573053e | ||
|
|
c404f6fe34 | ||
|
|
d24256e1c2 | ||
|
|
e494e2dc56 | ||
|
|
ab2e727db9 | ||
|
|
b9fcb66d28 | ||
|
|
12e4819c49 | ||
|
|
0b54366705 | ||
|
|
c99fd2baa9 | ||
|
|
646f76d343 | ||
|
|
868cb529aa | ||
|
|
2d01548d02 | ||
|
|
047e15951a | ||
|
|
6fb92f6f3c | ||
|
|
f4a5b80eff | ||
|
|
802407c8ae | ||
|
|
74c7a8585d | ||
|
|
439274c5ae | ||
|
|
8c1046169f | ||
|
|
2389f4a285 | ||
|
|
24fb2337d7 | ||
|
|
cc55a82b64 | ||
|
|
931120f73c | ||
|
|
1f8fb56409 | ||
|
|
5865c890b5 | ||
|
|
1fb671c561 | ||
|
|
acd9a8aefb | ||
|
|
66bc844cc9 | ||
|
|
3e3de72093 | ||
|
|
00053b8e97 | ||
|
|
883d0d5039 | ||
|
|
e49825b7a3 | ||
|
|
9f286b46ff | ||
|
|
803ea863fd | ||
|
|
1615c6d9f9 | ||
|
|
d59f878020 | ||
|
|
646a96e5f0 | ||
|
|
77a1aea7b9 | ||
|
|
f3f4672816 | ||
|
|
b68a38443c | ||
|
|
c919bef70e | ||
|
|
b1540d1491 | ||
|
|
8ff40c152b | ||
|
|
51803f00fb | ||
|
|
fb4aefeae7 | ||
|
|
7d987e5877 | ||
|
|
816b6276a6 | ||
|
|
836a026f63 | ||
|
|
dc9ddc77ea | ||
|
|
fdbd38ed5f | ||
|
|
1f39fde230 | ||
|
|
c420224080 | ||
|
|
b1f13cbb9a | ||
|
|
0f2e0c2ab4 | ||
|
|
d8af97c152 | ||
|
|
43f3784c83 | ||
|
|
528ebd8f12 | ||
|
|
c05c98c082 | ||
|
|
d8c7557ae5 | ||
|
|
f9753fc621 | ||
|
|
42b59a9e35 | ||
|
|
74bd576ebc | ||
|
|
a017ffc3c9 | ||
|
|
d3a81f025a | ||
|
|
750f647b0d | ||
|
|
2a9e56439e | ||
|
|
e4bca33d00 | ||
|
|
1528c03f85 | ||
|
|
c73c68532a | ||
|
|
989c8969cb | ||
|
|
ff2ff22d27 | ||
|
|
5ef7bad1ce | ||
|
|
5e0c321510 | ||
|
|
f19fac97d1 | ||
|
|
d04f73af7e | ||
|
|
6ef3915fcc | ||
|
|
87257153b9 | ||
|
|
02207087e4 | ||
|
|
b4417d47f1 | ||
|
|
04e3674355 | ||
|
|
dbf8af06a4 | ||
|
|
0bcdaa395f | ||
|
|
7788d26ed4 | ||
|
|
b3002be08a | ||
|
|
813ceb0d96 | ||
|
|
c39c3be39f | ||
|
|
9eb17c6e13 | ||
|
|
a6e26ce5bb | ||
|
|
b735a7911a | ||
|
|
2e342dace2 | ||
|
|
14369d3143 | ||
|
|
b6b5202923 | ||
|
|
808152211c | ||
|
|
408e852018 | ||
|
|
ef91b4fa0e | ||
|
|
46d924ffc9 | ||
|
|
f965f5643a | ||
|
|
85f0f7d241 | ||
|
|
9468bffcbb | ||
|
|
bd44957302 | ||
|
|
7e3d57fc28 | ||
|
|
4f5c707b56 | ||
|
|
2a37023a8d | ||
|
|
9901a73a2a | ||
|
|
40a319fc5b | ||
|
|
8ee321fd7b | ||
|
|
05a594a492 | ||
|
|
0a2804c641 | ||
|
|
5079fa93b4 | ||
|
|
eaf75fa149 | ||
|
|
a6093e847e | ||
|
|
0a6c7781c4 | ||
|
|
0871f5c012 | ||
|
|
6f27c36186 | ||
|
|
383cbcf3a0 | ||
|
|
56add0756f | ||
|
|
02a0f87562 | ||
|
|
feb1d34c1a | ||
|
|
fdb81be0a0 | ||
|
|
a4d1d86d7b | ||
|
|
ffe956e27b | ||
|
|
03190c1dec | ||
|
|
92f1f2ffb6 | ||
|
|
4d8d74a50d | ||
|
|
0dc0de8f1d | ||
|
|
f5dc4d991f | ||
|
|
1f3a02559c | ||
|
|
70f94c3e44 | ||
|
|
b8eab08119 | ||
|
|
794b714fac | ||
|
|
2f4b4ba13b | ||
|
|
1cdb0ff72c | ||
|
|
9513e0e2d5 | ||
|
|
6ebfbb2f9e | ||
|
|
320e105ffe | ||
|
|
96cde8a15a | ||
|
|
972d025578 | ||
|
|
09bc7e0acd | ||
|
|
6191bb5f1b | ||
|
|
d858cd677e | ||
|
|
2376d38e0e | ||
|
|
693616b00d | ||
|
|
30f6550e61 | ||
|
|
5cfbc9102e | ||
|
|
766bdde46b | ||
|
|
f46f8752ca | ||
|
|
bed9b1bb99 | ||
|
|
053a20bd33 | ||
|
|
be34e6145f | ||
|
|
f60c7fff65 | ||
|
|
6292bebcd3 | ||
|
|
80c68d847c | ||
|
|
fed00be430 | ||
|
|
ef527cb0fa | ||
|
|
e1c63139b2 | ||
|
|
edb30c9feb | ||
|
|
66809ed972 | ||
|
|
c66d5cb890 | ||
|
|
fe8df78322 | ||
|
|
7da6c0e867 | ||
|
|
0a0b6d51ba | ||
|
|
7ed3c21a6d | ||
|
|
3d0214d453 | ||
|
|
d0e9de2744 | ||
|
|
99264fab8a | ||
|
|
d4519bb730 | ||
|
|
6468c8e857 | ||
|
|
982c1b4979 | ||
|
|
503cbedc96 | ||
|
|
a448409750 | ||
|
|
a928120bec | ||
|
|
b3ca701b8d | ||
|
|
62e127f1b8 | ||
|
|
ebdec77c88 | ||
|
|
98ddc95648 | ||
|
|
9566f51ca8 | ||
|
|
696164c9a6 | ||
|
|
493aac6885 | ||
|
|
56e1411d37 | ||
|
|
e0805b8272 | ||
|
|
e72059ba87 | ||
|
|
24d46fb936 | ||
|
|
29c52ec4d4 | ||
|
|
77831c424c | ||
|
|
d633ec62df | ||
|
|
69c13a6ecf | ||
|
|
69d05c454d | ||
|
|
97637da9e0 | ||
|
|
535f555b13 | ||
|
|
d8ee2bb850 | ||
|
|
609d28c6ee | ||
|
|
eeafa8f5aa | ||
|
|
ddc35fa9ce | ||
|
|
908f5afe0f | ||
|
|
5daa130857 | ||
|
|
c202b94a9a | ||
|
|
ed0f22b037 | ||
|
|
eb1c6894f5 | ||
|
|
91091c614f | ||
|
|
481b5cde0f | ||
|
|
d328879329 | ||
|
|
3c1bad1792 | ||
|
|
5e4bcbdfa0 | ||
|
|
87911f4a56 | ||
|
|
9ec935f109 | ||
|
|
4bedc49b4d | ||
|
|
af2b1945a3 | ||
|
|
c32e76a870 | ||
|
|
8dcbe83b0b | ||
|
|
9fac7866f5 | ||
|
|
53bbf444e5 | ||
|
|
1a46582e1e | ||
|
|
913468a7b5 | ||
|
|
1e71798467 | ||
|
|
8c63d002e7 | ||
|
|
67b1e8dbe9 | ||
|
|
bc0be28f08 | ||
|
|
eaa1602b1a | ||
|
|
2a86ced835 | ||
|
|
ad49564ab5 | ||
|
|
e8cef4aa81 | ||
|
|
56954067ab | ||
|
|
338ba704ba | ||
|
|
bf25be7cf0 | ||
|
|
404b718677 | ||
|
|
8a489176c3 | ||
|
|
f40f2a0b44 | ||
|
|
d9406585c8 | ||
|
|
9e35bf6e6f | ||
|
|
0d0de49231 | ||
|
|
dc53b2fde3 | ||
|
|
98d214fd60 | ||
|
|
adadc9ee26 | ||
|
|
777f888892 | ||
|
|
84dfc8ee4b | ||
|
|
6f86047a8e | ||
|
|
2d7a289105 | ||
|
|
353b62aa0a | ||
|
|
826cd67cc8 | ||
|
|
9cb7054ff9 | ||
|
|
6309300eb6 | ||
|
|
0dce8f4104 | ||
|
|
1c4eeb2d53 | ||
|
|
d6245fdbda | ||
|
|
aeb31fe1ae | ||
|
|
0e0a6c0f69 | ||
|
|
cccbb6939c | ||
|
|
db31f61368 | ||
|
|
a96c5ed83a | ||
|
|
ffbae081ff | ||
|
|
395cc29701 | ||
|
|
c93c7c75c9 | ||
|
|
9b0d4a28ea | ||
|
|
8dd82839cb | ||
|
|
24ef5f9fe4 | ||
|
|
d08882d043 | ||
|
|
eea31a1046 | ||
|
|
5d085fd3f6 | ||
|
|
30e2b08028 | ||
|
|
533da47516 | ||
|
|
146c2e2dd9 | ||
|
|
065756a90d | ||
|
|
6819fc05da | ||
|
|
bc14d56568 | ||
|
|
01ca1cc8c7 | ||
|
|
f69ead5e08 | ||
|
|
f29974628b | ||
|
|
ad2d098b52 | ||
|
|
247061919b | ||
|
|
0c308134a9 | ||
|
|
3982d19e57 | ||
|
|
55d706323d | ||
|
|
51df0a68cc | ||
|
|
ca053e0a11 | ||
|
|
c260f7c20b | ||
|
|
9f0137a34d | ||
|
|
7bd7bcf4b8 | ||
|
|
36ad4a847e | ||
|
|
5791fc9a4d | ||
|
|
d7093c4891 | ||
|
|
506e427d56 | ||
|
|
59f8f5f65e | ||
|
|
3b30232e88 | ||
|
|
e0aae3e31f | ||
|
|
c21c026749 | ||
|
|
b9cb7e9898 | ||
|
|
1ea546a0a5 | ||
|
|
ffdf268ba2 | ||
|
|
f34008b71a | ||
|
|
8f009ed815 | ||
|
|
71d252f706 | ||
|
|
135f2cc2fd | ||
|
|
b83f18327a | ||
|
|
d5fc319d4e | ||
|
|
c343e4a1e3 | ||
|
|
b72dad9c5b | ||
|
|
2ada935842 | ||
|
|
dab43da202 | ||
|
|
0a944a5de1 | ||
|
|
bb824f1147 | ||
|
|
817a89df70 | ||
|
|
827b3d47b7 | ||
|
|
00c1732b9b | ||
|
|
a266a9c539 | ||
|
|
48d94568ce | ||
|
|
95d92999bb | ||
|
|
51a94e6904 | ||
|
|
43954b9500 | ||
|
|
636ff1c868 | ||
|
|
7bf877d820 | ||
|
|
8e3f9868eb | ||
|
|
e83c79a169 | ||
|
|
a6b83c9742 | ||
|
|
7635db4c1e | ||
|
|
183fc35fea | ||
|
|
9cbacb0159 | ||
|
|
f37ac53118 | ||
|
|
4e4b5ccf8d | ||
|
|
4f96116c43 | ||
|
|
aba458b832 | ||
|
|
c39a6f27d4 | ||
|
|
ae920eaa93 | ||
|
|
5c8fda3891 | ||
|
|
e1f399a06a | ||
|
|
a481968ec1 | ||
|
|
c7ec44da09 | ||
|
|
22dbe49945 | ||
|
|
25ed9063f2 | ||
|
|
e8eb2ab03f | ||
|
|
48fb5b3f28 | ||
|
|
27e40248ff | ||
|
|
98506d888c | ||
|
|
be7ab54a09 | ||
|
|
5a2ca03fff | ||
|
|
37eb0454fd | ||
|
|
bb413d555e | ||
|
|
2579bf1ad9 | ||
|
|
0605bce887 | ||
|
|
6452ccc220 | ||
|
|
2693c9b024 | ||
|
|
38d9795191 | ||
|
|
9c88c785cb | ||
|
|
2f41013740 | ||
|
|
2d9f25b163 | ||
|
|
4c5d813e58 | ||
|
|
10d9b88965 | ||
|
|
207235ea83 | ||
|
|
97ab62514c | ||
|
|
790922b938 | ||
|
|
08af10d439 | ||
|
|
73d02b2582 | ||
|
|
5c2a45cd4d | ||
|
|
064c3134e5 | ||
|
|
6340c157e8 | ||
|
|
e9239f83e9 | ||
|
|
59c69600e8 | ||
|
|
fe9a1c59cb | ||
|
|
612a57bdf7 | ||
|
|
979a376855 | ||
|
|
0ec7e006ec | ||
|
|
811f838a2d | ||
|
|
9acdc0bc2e | ||
|
|
ac788a7e7d | ||
|
|
b4af820ed1 | ||
|
|
ac629c91d6 | ||
|
|
bb413e0022 | ||
|
|
a7fa40ecda | ||
|
|
d83c9f5a70 | ||
|
|
539ee49594 | ||
|
|
3dff5a90f1 | ||
|
|
20d22a6468 | ||
|
|
c5033b92b4 | ||
|
|
625ec813b9 | ||
|
|
595f7680e9 | ||
|
|
6e7037bafd | ||
|
|
a25c9a30d0 | ||
|
|
05b8a6e77f | ||
|
|
f05c790248 | ||
|
|
5c51ce1393 | ||
|
|
13809b5025 | ||
|
|
3cc898ca4c | ||
|
|
9394abce22 | ||
|
|
6312eb9dcf | ||
|
|
c636b873e9 | ||
|
|
ff971c8300 | ||
|
|
0c0d37efb2 | ||
|
|
39081b6bfb | ||
|
|
c5d859e52e | ||
|
|
0c0468123f | ||
|
|
50da58afe0 | ||
|
|
8c4808a681 | ||
|
|
d60ce53e05 | ||
|
|
4fc4d71350 | ||
|
|
b5dcb4f345 | ||
|
|
a7f0b2ba21 | ||
|
|
c5bba0b153 | ||
|
|
94868e48cb | ||
|
|
e7ac2368c3 | ||
|
|
bbaf2c2f20 | ||
|
|
ecd175dd38 | ||
|
|
5434cfc89d | ||
|
|
a87abc00c6 | ||
|
|
3d32280c49 | ||
|
|
07638f5505 | ||
|
|
73620ebee9 | ||
|
|
8b534440a0 | ||
|
|
7f56112f8e | ||
|
|
0edc2751f3 | ||
|
|
06365faef3 | ||
|
|
885e69c809 | ||
|
|
9ef50d7a93 | ||
|
|
ca5fbb7fa8 | ||
|
|
7a8a9ca5b0 | ||
|
|
9e5e7b31e9 | ||
|
|
d8735060dc | ||
|
|
681f4bb803 | ||
|
|
e740325d84 | ||
|
|
213309f5e2 | ||
|
|
a3bda3c559 | ||
|
|
bfa69aa084 | ||
|
|
3f76eb0ac2 | ||
|
|
0e504f30b9 | ||
|
|
1527956669 | ||
|
|
9cc7da09fc | ||
|
|
5554725f63 | ||
|
|
37aaca0090 | ||
|
|
48a899f7a9 | ||
|
|
6ad9208119 | ||
|
|
fc9d22562b | ||
|
|
ad56a22277 | ||
|
|
8ca91d6303 | ||
|
|
9d0901801b | ||
|
|
f63acea34a | ||
|
|
5a1e3ed5c6 | ||
|
|
5148acb20f | ||
|
|
c8d3c3ac4f | ||
|
|
1029ce4527 | ||
|
|
0f56c9a85d | ||
|
|
ffcb73ad5f | ||
|
|
d2e7b1e56f | ||
|
|
b1770d3d06 | ||
|
|
8e2287a86d | ||
|
|
5aae45dc97 | ||
|
|
1c6328cc1b | ||
|
|
8a476f882d | ||
|
|
d78adc6fb9 | ||
|
|
2611a430b9 | ||
|
|
f8eaccb4c1 | ||
|
|
b0559df903 | ||
|
|
2826bf6823 | ||
|
|
9acf63f7d6 | ||
|
|
5d72585705 | ||
|
|
b760e717d0 | ||
|
|
fe8f52fb1b | ||
|
|
fd567f833e | ||
|
|
6376c9ae43 | ||
|
|
48b0076ea5 | ||
|
|
a800cb6fe6 | ||
|
|
5f81e3d5ed | ||
|
|
e690da638d | ||
|
|
be28160a4a | ||
|
|
d18624bbe9 | ||
|
|
7fe8f260fc | ||
|
|
73abcd869c | ||
|
|
d0074356e9 | ||
|
|
6e81ee9d97 | ||
|
|
3986f48199 | ||
|
|
c6ce5a80fa | ||
|
|
056d5200c6 | ||
|
|
411d641aa2 | ||
|
|
86cbf85358 | ||
|
|
a878edfb9b | ||
|
|
1a0fe0abf6 | ||
|
|
e310af7673 | ||
|
|
bb2002fce2 | ||
|
|
24bd55c360 | ||
|
|
b534a5c2ff | ||
|
|
04a25092f4 | ||
|
|
b7cf7beb22 | ||
|
|
407927c8ec | ||
|
|
c50a7533f6 | ||
|
|
5905787bea | ||
|
|
a61d95a005 | ||
|
|
18201d326c | ||
|
|
c7ba253e7c | ||
|
|
f27dff2186 | ||
|
|
0ee0862fae | ||
|
|
d2df7173e3 | ||
|
|
a61c17c1a9 | ||
|
|
853b676d48 | ||
|
|
51dbdb933c | ||
|
|
766e111ac1 | ||
|
|
004ea9872b | ||
|
|
bf4607cf08 | ||
|
|
3a179170bb | ||
|
|
c0dd6f9e35 | ||
|
|
0832b24d66 | ||
|
|
97ed63de5a | ||
|
|
22d20cc76e | ||
|
|
91363f7aed | ||
|
|
6554a41f6d | ||
|
|
d38f0e9e03 | ||
|
|
703b7eb91d | ||
|
|
0c85e8ee53 | ||
|
|
aa42aabb30 | ||
|
|
0780668239 | ||
|
|
7e68e06a3a | ||
|
|
030cbb1acb | ||
|
|
1ccd3183c4 | ||
|
|
5a44b7341c | ||
|
|
bd5933a65b | ||
|
|
7b60ac1735 | ||
|
|
0aacc67b7a | ||
|
|
4d523112d4 | ||
|
|
a0fa8df0f1 | ||
|
|
818195f2e4 | ||
|
|
8020ab9f78 | ||
|
|
3e2ca5fe54 | ||
|
|
f9bf53551f | ||
|
|
d898b8a7e7 | ||
|
|
579dbc8f63 | ||
|
|
5ae1bd92cd | ||
|
|
41e1001050 | ||
|
|
560bd83fb1 | ||
|
|
0b4987431e | ||
|
|
5e9db250bc | ||
|
|
47490e9820 | ||
|
|
df7b5965c2 | ||
|
|
e5212c25f5 | ||
|
|
8ad5f728c0 | ||
|
|
8b4a08eef4 | ||
|
|
01106caa59 | ||
|
|
047b7023a2 | ||
|
|
d52c1f09d5 | ||
|
|
afd1b6ed27 | ||
|
|
1f6e4a0887 | ||
|
|
a95f46f513 | ||
|
|
98e9f5751a | ||
|
|
41dec4d159 | ||
|
|
91478caf5b | ||
|
|
537ce4f630 | ||
|
|
f0c41a8280 | ||
|
|
22999e27f0 | ||
|
|
a64a76db9b | ||
|
|
7721ee0f28 | ||
|
|
106672bc75 | ||
|
|
cb4935258c | ||
|
|
1d84cfe2e2 | ||
|
|
27baa24c82 | ||
|
|
1a6305c079 | ||
|
|
b86476331f | ||
|
|
092c15a37c | ||
|
|
65c73f2eec | ||
|
|
2414435641 | ||
|
|
2afcd54184 | ||
|
|
700e25382b | ||
|
|
db0d6075ca | ||
|
|
a196aeb29b | ||
|
|
92f0c8f8b1 | ||
|
|
3bc5cfa554 | ||
|
|
6f7ae17fc6 | ||
|
|
be5b8012bd | ||
|
|
90d472042b | ||
|
|
5378316cc3 | ||
|
|
8ee534f7fb | ||
|
|
aee1a87347 | ||
|
|
e9fb2c8a54 | ||
|
|
b79eaae002 | ||
|
|
3b571fc9b3 | ||
|
|
e718c5bf6c | ||
|
|
636017fdd7 | ||
|
|
85dc16df0a | ||
|
|
0caf372685 | ||
|
|
5674f8e675 | ||
|
|
c49c15ab7c | ||
|
|
b84511b314 | ||
|
|
f6d69b33b3 | ||
|
|
661f283dab | ||
|
|
787cf9395e | ||
|
|
fe1be11c21 | ||
|
|
1f7d8c0f49 | ||
|
|
6167eda6b6 | ||
|
|
ec7dd9ef01 | ||
|
|
c702e12a42 | ||
|
|
42a2cabc7b | ||
|
|
0a3042322f | ||
|
|
bdeefb212e | ||
|
|
074f30ed1f | ||
|
|
c2f72402f2 | ||
|
|
13e7da10ca | ||
|
|
4225f5e2f5 | ||
|
|
3833dcd0d8 | ||
|
|
829e1c2390 | ||
|
|
c3da6c10fb | ||
|
|
017fdfa552 | ||
|
|
cc38667df3 | ||
|
|
b6d0d7fe15 | ||
|
|
f45c0e3617 | ||
|
|
0aabae40ad | ||
|
|
9d5c50a36f | ||
|
|
e34e208786 | ||
|
|
d01de850eb | ||
|
|
bd14dc508f | ||
|
|
3b88150e11 | ||
|
|
87f6d34b4f | ||
|
|
cfae2b6a40 | ||
|
|
5584fef1b0 | ||
|
|
98f37d64ea | ||
|
|
ccb16e5f5a | ||
|
|
d73cafa7c8 | ||
|
|
f28c86326d | ||
|
|
269722fb65 | ||
|
|
99923fcd0f | ||
|
|
e06a7587ac | ||
|
|
b3c0c57c6d | ||
|
|
04f18630f3 | ||
|
|
f1fa91a51c | ||
|
|
53fe35e37e | ||
|
|
6be05e9948 | ||
|
|
84bf79f72b | ||
|
|
904eccc4fa | ||
|
|
01562528b7 | ||
|
|
0dca4d3393 | ||
|
|
fe3bb0b6c0 | ||
|
|
7aeb60f42a | ||
|
|
5597cf45bf | ||
|
|
1ced01c7f6 | ||
|
|
e46d9c1173 | ||
|
|
2272eb6644 | ||
|
|
ac76fb73a8 | ||
|
|
694692fb5d | ||
|
|
f4a99fc612 | ||
|
|
b00d569215 | ||
|
|
1921623bdf | ||
|
|
3502fb46f8 | ||
|
|
bacdd49176 | ||
|
|
065a3176b8 | ||
|
|
4fa0d366db | ||
|
|
36be8114d0 | ||
|
|
4619ff2ad0 | ||
|
|
8c85c10212 | ||
|
|
2fbdfdbf6a | ||
|
|
558ef8a2db | ||
|
|
68f8010ab9 | ||
|
|
654dfa6b3d | ||
|
|
0092ca1da0 | ||
|
|
fa85e2a650 | ||
|
|
3dc7e0e694 | ||
|
|
98b2febe30 | ||
|
|
d67e2723c6 | ||
|
|
1206ec43ac | ||
|
|
965df4fdf4 | ||
|
|
4f0e18b088 | ||
|
|
9d5e855e8e | ||
|
|
e7b199adaf | ||
|
|
9b319a55f6 | ||
|
|
809fbf685b | ||
|
|
3400c19277 | ||
|
|
33aa7d8333 | ||
|
|
f14971e908 | ||
|
|
63c385a5d7 | ||
|
|
18d95e479c | ||
|
|
6966ca47d1 | ||
|
|
8f107026a9 | ||
|
|
c846b48882 | ||
|
|
a93f37a3fc | ||
|
|
dd40b19c89 | ||
|
|
7068f6c08a | ||
|
|
5b63260240 | ||
|
|
d2aaf6aad9 | ||
|
|
d7e0888801 | ||
|
|
e542339ed1 | ||
|
|
2229a307a1 | ||
|
|
49d1a8e248 | ||
|
|
0135ab2ab1 | ||
|
|
a5d4fdb142 | ||
|
|
d4a28cc0ec | ||
|
|
97c998c64b | ||
|
|
e7df5d52ba | ||
|
|
32b697f674 | ||
|
|
7e28fc087d | ||
|
|
4cdc6e4a0d | ||
|
|
f350ff9852 | ||
|
|
6ab0eef6f3 | ||
|
|
17ccd1fd0b | ||
|
|
4e3d3a7288 | ||
|
|
018844e8ea | ||
|
|
850135a936 | ||
|
|
080bde0bc2 | ||
|
|
e6e7bdcb55 | ||
|
|
9e4ae66346 | ||
|
|
b7f9495a14 | ||
|
|
3b93c39249 | ||
|
|
2968b400c4 | ||
|
|
d0d5739ab0 | ||
|
|
0779c39654 | ||
|
|
b2f5ba3ee8 | ||
|
|
ba4f7d2ceb | ||
|
|
3315ae8382 | ||
|
|
f7b8d1ac07 | ||
|
|
86b3a4f09e | ||
|
|
a3dfc4c0e8 | ||
|
|
15b160c553 | ||
|
|
39980322bd | ||
|
|
2f7930efb7 | ||
|
|
5996e1e69d | ||
|
|
cde3a7cf70 | ||
|
|
49eebc1c20 | ||
|
|
0583c4fa25 | ||
|
|
a3ace00ed4 | ||
|
|
c37ff47ee3 | ||
|
|
84148d4891 | ||
|
|
60651fdfe0 | ||
|
|
1efd5c7d58 | ||
|
|
fd70b862ed | ||
|
|
1c8035e029 | ||
|
|
11809e799b | ||
|
|
c50745323a | ||
|
|
2af91f5bbb | ||
|
|
08793e0b50 | ||
|
|
db961ecefe | ||
|
|
d3ae5e3e10 | ||
|
|
576445847c | ||
|
|
248a7aff7a | ||
|
|
a8042f622f | ||
|
|
32ba2d5ffe | ||
|
|
9ef3164991 | ||
|
|
b0b54f48f9 | ||
|
|
35ba62bae2 | ||
|
|
ea0e9aa7f4 | ||
|
|
8c56f68a06 | ||
|
|
2cf9348f53 | ||
|
|
d97ce7eab8 | ||
|
|
0c8f7163db | ||
|
|
0e0802a588 | ||
|
|
9a0d5e31b7 | ||
|
|
6291e4dcdd | ||
|
|
9f49259bca | ||
|
|
4885e7b7f1 | ||
|
|
a2469b6984 | ||
|
|
1549eb20df | ||
|
|
c245a2da07 | ||
|
|
6e16369d85 | ||
|
|
8caeeccea3 | ||
|
|
102542b4e7 | ||
|
|
05d664d8d1 | ||
|
|
8fa57b0b14 | ||
|
|
d365dacbf7 | ||
|
|
39aaf2f813 | ||
|
|
d97b3807b9 | ||
|
|
a51d8e844b | ||
|
|
c68ec54fdd | ||
|
|
858f2eadd4 | ||
|
|
bc2b4c57c9 | ||
|
|
280c7e8da1 | ||
|
|
cd4b1ea245 | ||
|
|
4710f67baf | ||
|
|
f14f0d9857 | ||
|
|
6de66eaba3 | ||
|
|
238cbd14ca | ||
|
|
d9bace053b | ||
|
|
fab9688135 | ||
|
|
896154d89f | ||
|
|
c9cd56914f | ||
|
|
95dbbb350b | ||
|
|
88e17bf1b4 | ||
|
|
19a9f90186 | ||
|
|
e19581b540 | ||
|
|
ecf62e3b7a | ||
|
|
ea3573c989 | ||
|
|
8d3617f0c7 | ||
|
|
34ea67c8c4 | ||
|
|
2e392232eb | ||
|
|
2f4af87bf7 | ||
|
|
33f06273a9 | ||
|
|
e1977dd889 | ||
|
|
6635d4bc97 | ||
|
|
619136d389 | ||
|
|
a89b6fd054 | ||
|
|
02fc68a3f6 | ||
|
|
a9e798c399 | ||
|
|
b65c67ec2c | ||
|
|
1befbe08ff | ||
|
|
b21cb43639 | ||
|
|
db4ff451bf | ||
|
|
f30d19c539 | ||
|
|
52fcb92f51 | ||
|
|
18d44c643f | ||
|
|
d01929255c | ||
|
|
20e4e81765 | ||
|
|
2df0c52bc7 | ||
|
|
4acda0d98c | ||
|
|
efadeca7dd | ||
|
|
e5c2de1134 | ||
|
|
e745290ba9 | ||
|
|
808bcb8022 | ||
|
|
af8a5cbbfa | ||
|
|
cb4b60e8e4 | ||
|
|
2cc88df08a | ||
|
|
dce89571ef | ||
|
|
1512d8120d | ||
|
|
ac41a98610 | ||
|
|
bf4272102d | ||
|
|
7257bba3f3 | ||
|
|
6e5eeb7215 | ||
|
|
a5aef9e330 | ||
|
|
d32c8534cb | ||
|
|
48fe013c83 | ||
|
|
02bf5befc4 | ||
|
|
0cac8abe75 | ||
|
|
822b741612 | ||
|
|
b0a459c8a1 | ||
|
|
60f6bbd42a | ||
|
|
9b54feab84 | ||
|
|
afe343e94f | ||
|
|
93fa3f018f | ||
|
|
680a06a60e | ||
|
|
b7925936f8 | ||
|
|
4dcf7feec0 | ||
|
|
f5bcd54b89 | ||
|
|
66585ccd3b | ||
|
|
0ab152d644 | ||
|
|
e6b410af04 | ||
|
|
585795fb0a | ||
|
|
09eddb59f5 | ||
|
|
56c4637d1e | ||
|
|
ee1ec3d6d0 | ||
|
|
a8aef0ca64 | ||
|
|
3f683f0dfd | ||
|
|
ca12b9f253 | ||
|
|
c3aad38628 | ||
|
|
6f7670e5ff | ||
|
|
c2a34b5d71 | ||
|
|
3caa5e0f39 | ||
|
|
fd4a136e2b | ||
|
|
4babbc133a | ||
|
|
3c5fa95c7a | ||
|
|
ad3f2d0023 | ||
|
|
8f5823fac1 | ||
|
|
617592a959 | ||
|
|
12f682b7bc | ||
|
|
6a86e846c3 | ||
|
|
ce86354a57 | ||
|
|
72cfa3b8fc | ||
|
|
1166df3471 | ||
|
|
09b8f5b540 | ||
|
|
dcbb134525 | ||
|
|
fa22c2ae3b | ||
|
|
ed6f5cbcf2 | ||
|
|
44cb1acbb2 | ||
|
|
f5f26e3840 | ||
|
|
485692b3f2 | ||
|
|
c20aa124d6 | ||
|
|
775bba8f7f | ||
|
|
b0074bf723 | ||
|
|
1e1f272e4c | ||
|
|
aa9149912d | ||
|
|
3054a809ce | ||
|
|
38d243c63f | ||
|
|
fb6bf87161 | ||
|
|
9ee43c0b7a | ||
|
|
846531363e | ||
|
|
91e369a840 | ||
|
|
81ff4416dc | ||
|
|
dfc2866457 | ||
|
|
f7c5e1b8b2 | ||
|
|
f5c2901b3f | ||
|
|
dd4459f813 | ||
|
|
01d84fdacf | ||
|
|
9f8024d836 | ||
|
|
d4c1f14bd6 | ||
|
|
ffe520db06 | ||
|
|
e31acfb3cd | ||
|
|
00fe5d477d | ||
|
|
ca3f4559ef | ||
|
|
1a205aeccc | ||
|
|
82a480d924 | ||
|
|
2d361964ce | ||
|
|
03d71829c6 | ||
|
|
c40368b0fa | ||
|
|
0b2ca29ae8 | ||
|
|
f815bd08b7 | ||
|
|
1ed926b491 | ||
|
|
88b255c178 | ||
|
|
5dbeddf448 | ||
|
|
15f1cdf3aa | ||
|
|
8e5e212c49 | ||
|
|
7de68f0bf2 | ||
|
|
5d5affca33 | ||
|
|
6029c5371e | ||
|
|
8681e78e50 | ||
|
|
5a6d8aee65 | ||
|
|
27cf50044d | ||
|
|
dee9cfea85 | ||
|
|
8e02438bfb | ||
|
|
b823777e6d | ||
|
|
e1de0873cd | ||
|
|
4c30e03f1e | ||
|
|
df4069ba37 | ||
|
|
ce1507c296 | ||
|
|
7097e6ba83 | ||
|
|
a28f0e76b9 | ||
|
|
0cc8537d7d | ||
|
|
c20c362557 | ||
|
|
0d4b09a0a0 | ||
|
|
408c08d2a3 | ||
|
|
10f56129c1 | ||
|
|
bc6830cbdb | ||
|
|
c5f78077ff | ||
|
|
682a1404ca | ||
|
|
5318ec6dbf | ||
|
|
490ddd9a15 | ||
|
|
1675174b2a | ||
|
|
023781716f | ||
|
|
48ad6e6042 | ||
|
|
bedc9399c5 | ||
|
|
86d172d209 | ||
|
|
708ba160d5 | ||
|
|
b0979a8cf9 | ||
|
|
b397eea044 | ||
|
|
5d6d7d9c55 | ||
|
|
e5c3dcb179 | ||
|
|
c0f17b39a7 | ||
|
|
0824f342e4 | ||
|
|
3e5c74c4f2 | ||
|
|
8ee617ce1c | ||
|
|
1891b35eda | ||
|
|
ed29fe1aa9 | ||
|
|
5b15865d30 | ||
|
|
1dfddfde54 | ||
|
|
1ae2624197 | ||
|
|
1509ee68be | ||
|
|
1f4c1c3a6c | ||
|
|
cc45f3ca01 | ||
|
|
ccabcca55b | ||
|
|
259abb081a | ||
|
|
0ae1bdb61a | ||
|
|
5110e42786 | ||
|
|
1410badb05 | ||
|
|
3ba6e70c96 | ||
|
|
2c437628d5 | ||
|
|
ea47bcd682 | ||
|
|
4ff0a32ea5 | ||
|
|
0d6109c7a8 | ||
|
|
4d4b77f39f | ||
|
|
5619b54cdb | ||
|
|
8484d55a6a | ||
|
|
0a55cda0a9 | ||
|
|
2480a5eaa2 | ||
|
|
6b5c051c02 | ||
|
|
ef5c753e32 | ||
|
|
4b78a2106d | ||
|
|
0e47c0ee6c | ||
|
|
8251bf204d | ||
|
|
184b094218 | ||
|
|
673b375cd9 | ||
|
|
2792bb41de | ||
|
|
ca909edbed | ||
|
|
610f154c74 | ||
|
|
ec2da8e85d | ||
|
|
0c5b4948cf | ||
|
|
566ec14648 | ||
|
|
d674b65ca4 | ||
|
|
7268965adc | ||
|
|
a0c460fa12 | ||
|
|
f24cd56e0a | ||
|
|
1517d6ed04 | ||
|
|
ff93945aaf | ||
|
|
f58ee895ae | ||
|
|
79a42772b9 | ||
|
|
4c671af723 | ||
|
|
5ea93fb3d2 | ||
|
|
648b15b00b | ||
|
|
b0d65169ab | ||
|
|
546eb285c4 | ||
|
|
f79d4f9a40 | ||
|
|
ddcc9a9d77 | ||
|
|
e29c3d6125 | ||
|
|
69b7b0e029 | ||
|
|
ef3c1c878c | ||
|
|
3b8d74f1f9 | ||
|
|
3fd9cabd43 | ||
|
|
113efd1150 | ||
|
|
2d5e49fa15 | ||
|
|
f159808df6 | ||
|
|
e9148b4caf | ||
|
|
611880414b | ||
|
|
36321c7cb8 | ||
|
|
8f8c685a39 | ||
|
|
6c0f8e2800 | ||
|
|
71e75c0900 | ||
|
|
0400a597ef | ||
|
|
0e923ec771 | ||
|
|
79ce18c9bc | ||
|
|
91f863ad9f | ||
|
|
1415c8eda0 | ||
|
|
9eae97ddab | ||
|
|
df28de62c1 | ||
|
|
72ada38417 | ||
|
|
5d30d46535 | ||
|
|
4dd3d3bc76 | ||
|
|
348fa3318b | ||
|
|
84ae430806 | ||
|
|
61c1b0aebb | ||
|
|
e3df38e078 | ||
|
|
44b2fae0db | ||
|
|
c147404d1c | ||
|
|
7a4acb5c36 | ||
|
|
90d187c48a | ||
|
|
1851e81794 | ||
|
|
aeb6e860bb | ||
|
|
3300ad09f3 | ||
|
|
c6e689255e | ||
|
|
8aff0d6321 | ||
|
|
a4ead2f259 | ||
|
|
a569d5cbf6 | ||
|
|
fb50a3a249 | ||
|
|
c8cd61f0f8 | ||
|
|
d1e51abe2d | ||
|
|
b8c0cd9564 | ||
|
|
56f2073ad5 | ||
|
|
794d46beec | ||
|
|
8e157423e0 | ||
|
|
ef9740bb38 | ||
|
|
bd459fadd3 | ||
|
|
bb5baa65cb | ||
|
|
ee61a26faf | ||
|
|
ef943d4b0b | ||
|
|
4c25b95124 | ||
|
|
3451a87d64 | ||
|
|
560b44daef | ||
|
|
c7c211e031 | ||
|
|
de3cbeeff3 | ||
|
|
689b204327 | ||
|
|
ea265bc28e | ||
|
|
63f145f5c0 | ||
|
|
66f2f42294 | ||
|
|
1148039c6b | ||
|
|
b82b2d2b78 | ||
|
|
6eef26f107 | ||
|
|
2ab1e162ea | ||
|
|
56f79692a3 | ||
|
|
ef66cf77e1 | ||
|
|
4b72539e33 | ||
|
|
da31880319 | ||
|
|
96dfa1dbed | ||
|
|
dcedfdb674 | ||
|
|
bcb0cdfb3f | ||
|
|
6beab4f286 | ||
|
|
2f150b0c82 | ||
|
|
8c29007c69 | ||
|
|
02aafcabba | ||
|
|
81a7e6bc05 | ||
|
|
bf977311e1 | ||
|
|
79636af9f9 | ||
|
|
c956fb6570 | ||
|
|
48b2a15fd0 | ||
|
|
ce5bb4fef7 | ||
|
|
06081c73e9 | ||
|
|
6c3c6a1e65 | ||
|
|
e8f551964b | ||
|
|
95407eea80 | ||
|
|
61e35edf27 | ||
|
|
fe32845197 | ||
|
|
077e6621b9 | ||
|
|
7372ca5e8e | ||
|
|
949f6dd4f9 | ||
|
|
938b47bead | ||
|
|
ef2fea157b | ||
|
|
eb20782aa4 | ||
|
|
ce3ba4f772 | ||
|
|
5b26934802 | ||
|
|
0fd11562bc | ||
|
|
08eba8ccc1 | ||
|
|
a3878528c6 | ||
|
|
3cb37ab802 | ||
|
|
7d52e99aba | ||
|
|
91d5c7ed71 | ||
|
|
85062ac570 | ||
|
|
6f6755ec02 | ||
|
|
6d2c6c13a7 | ||
|
|
bda13c41fd | ||
|
|
ea58bb3359 | ||
|
|
390ec89045 | ||
|
|
4906460bf4 | ||
|
|
28ca1420f9 | ||
|
|
9ba8e6e491 | ||
|
|
24eb2123e4 | ||
|
|
a67b86b73b | ||
|
|
95a2ce244c | ||
|
|
35e2dd4047 | ||
|
|
6ee632f245 | ||
|
|
f9eb552382 | ||
|
|
deff411f85 | ||
|
|
e531997868 | ||
|
|
7d658403c2 | ||
|
|
015c112103 | ||
|
|
a1ef3f0f4a | ||
|
|
0c65ea25cb | ||
|
|
53c63b31c8 | ||
|
|
5a9ec30803 | ||
|
|
ee0b31b3d5 | ||
|
|
18114ab9ce | ||
|
|
32a2e5fc47 | ||
|
|
af4c0591f9 | ||
|
|
d7b1cd912c | ||
|
|
3a56bbed2e | ||
|
|
b7b02fcc2c | ||
|
|
9365138206 | ||
|
|
61771b97ad | ||
|
|
bc4ecdc791 | ||
|
|
bc58c8e03c | ||
|
|
8394bcd4a9 | ||
|
|
c6cde959b3 | ||
|
|
e74e51fb25 | ||
|
|
4a0321fe3e | ||
|
|
48eb871ab5 | ||
|
|
e306fcc795 | ||
|
|
3a2650dc6d | ||
|
|
eadbf595ba | ||
|
|
20c4a68aa8 | ||
|
|
8889b05d29 | ||
|
|
5ec5ebf94b | ||
|
|
6cea0fd835 | ||
|
|
4fabf91e16 | ||
|
|
8ed7ea6b36 | ||
|
|
99f0eecb86 | ||
|
|
996e8ef9b8 | ||
|
|
734cef9017 | ||
|
|
0856d2e82c | ||
|
|
a8000bf51b | ||
|
|
24f181afc8 | ||
|
|
97cc8a4afe | ||
|
|
4c1cf345fc | ||
|
|
01cdd28938 | ||
|
|
7198b6884c | ||
|
|
3cb926727c | ||
|
|
6528a0cfb6 | ||
|
|
65143a0182 | ||
|
|
3ef7d6fbc6 | ||
|
|
da548f1970 | ||
|
|
c8e5525899 | ||
|
|
3b94850084 | ||
|
|
d8682cfb5f | ||
|
|
1602755330 | ||
|
|
572b29b35f | ||
|
|
c883631e50 | ||
|
|
4269125838 | ||
|
|
0a0c5cae94 | ||
|
|
f7c28ff31e | ||
|
|
ca8080a371 | ||
|
|
0df80d2b52 | ||
|
|
67b6414693 | ||
|
|
8210e3c80a | ||
|
|
52fbc604b8 | ||
|
|
8060fd8890 | ||
|
|
d740fa5acf | ||
|
|
ae0570e4cd | ||
|
|
f0563c861a | ||
|
|
d75455aca3 | ||
|
|
721e737918 | ||
|
|
97e64f0125 | ||
|
|
40992e857e | ||
|
|
97cf52976f | ||
|
|
a2ffad8f97 | ||
|
|
52a8a56448 | ||
|
|
21beeb11e4 | ||
|
|
2794553335 | ||
|
|
12b33a138d | ||
|
|
16c818bb42 | ||
|
|
aee66041e2 | ||
|
|
0eebfdc178 | ||
|
|
74a574f7e8 | ||
|
|
cfc41fb5b9 | ||
|
|
f299966a0a | ||
|
|
be36e83b5a | ||
|
|
8583c7b9a5 | ||
|
|
bae5b9ddea | ||
|
|
86bf447782 | ||
|
|
1128f53fdc | ||
|
|
2b6646e38c | ||
|
|
ed56e4858a | ||
|
|
fdd7af9089 | ||
|
|
e917347b81 | ||
|
|
3baf31695e | ||
|
|
ae91f794d6 | ||
|
|
34ffe2790b | ||
|
|
a642ae356c | ||
|
|
a401e44180 | ||
|
|
8372d4952e | ||
|
|
5f4b7ae369 | ||
|
|
5e6b4d73e1 | ||
|
|
85e157f0d3 | ||
|
|
4a87fa15c6 | ||
|
|
0127238645 | ||
|
|
1450b8676c | ||
|
|
7cba061d18 | ||
|
|
dc53699a96 | ||
|
|
a62d53e9a7 | ||
|
|
f3f06aaefb | ||
|
|
e2c78f1ebc | ||
|
|
b30790cac4 | ||
|
|
bada661bd0 | ||
|
|
d914e23626 | ||
|
|
c58a04bc94 | ||
|
|
5aac0734d5 | ||
|
|
90a631cdad | ||
|
|
386f3c7ce9 | ||
|
|
7c25fb572e | ||
|
|
fa514bc7bc | ||
|
|
a251b79b3f | ||
|
|
bcf05aecd6 | ||
|
|
78798d8fd7 | ||
|
|
fbc694ccf5 | ||
|
|
72087feaca | ||
|
|
bfee7120f4 | ||
|
|
66adb691fb | ||
|
|
1b8c48e315 | ||
|
|
3fcc43efdd | ||
|
|
a3f07b6390 | ||
|
|
873003c607 | ||
|
|
449ba284ce | ||
|
|
684ec81fda | ||
|
|
123e35394a | ||
|
|
3e43a981e4 | ||
|
|
e247c37275 | ||
|
|
1a43be752b | ||
|
|
f4f7e11c07 | ||
|
|
170ed89e9e | ||
|
|
611370c644 | ||
|
|
179584b4bb | ||
|
|
b472fb4f73 | ||
|
|
a6299d8334 | ||
|
|
c0bdf9d99b | ||
|
|
df87ab8818 | ||
|
|
a3e6d3cd76 | ||
|
|
1947af0693 | ||
|
|
8966639e65 | ||
|
|
473aced449 | ||
|
|
3f812326a6 | ||
|
|
99a8c0d152 | ||
|
|
fb82a5be46 | ||
|
|
3d6aab98f7 | ||
|
|
619258164a | ||
|
|
5ad858d1fb | ||
|
|
7e7b707125 | ||
|
|
4757bebebf | ||
|
|
2698bcdb28 | ||
|
|
a3b68ba294 | ||
|
|
e7b84d008e | ||
|
|
4c93870580 | ||
|
|
88cf2023c9 | ||
|
|
0ee72cd2fb | ||
|
|
2fd0b7f83b | ||
|
|
85485d850c | ||
|
|
1014127246 | ||
|
|
37f6a42de8 | ||
|
|
0935fb0790 | ||
|
|
3c725b97b1 | ||
|
|
cda21c50ac | ||
|
|
7aa037ee60 | ||
|
|
491933f114 | ||
|
|
c13f6f789f | ||
|
|
6052636a62 | ||
|
|
7d2e77a1b3 | ||
|
|
e48d60f4cf | ||
|
|
4f833db2d0 | ||
|
|
266bce45f2 | ||
|
|
ab81f22b84 | ||
|
|
698cc5f914 | ||
|
|
6aa3e38edb | ||
|
|
787d499b9b | ||
|
|
2210af4e0f | ||
|
|
e8987177a1 | ||
|
|
c12dbce516 | ||
|
|
a7231a5c25 | ||
|
|
a7527e6f88 | ||
|
|
6a57c99335 | ||
|
|
6b4eaa185e | ||
|
|
81b982ac20 | ||
|
|
897c4259ed | ||
|
|
9eb18e78c3 | ||
|
|
adc0bd7f36 | ||
|
|
c1a17d9fce | ||
|
|
081bdda55d | ||
|
|
df993f977c | ||
|
|
5452cedc51 | ||
|
|
49409241bc | ||
|
|
e5345f209c | ||
|
|
0c5252594e | ||
|
|
e2ec7fd653 | ||
|
|
ca256308f2 | ||
|
|
f72d3c4372 | ||
|
|
7a5149e39e | ||
|
|
d36f45ec58 | ||
|
|
380688c16a | ||
|
|
1d269f07e3 | ||
|
|
7761561ac2 | ||
|
|
8b29fbe98e | ||
|
|
3d7cb212c0 | ||
|
|
f2e77917d7 | ||
|
|
0f8df335a7 | ||
|
|
f1a0eb1e2a | ||
|
|
938295cdcc | ||
|
|
6562df4dd9 | ||
|
|
f15b318a77 | ||
|
|
53cc650aa8 | ||
|
|
c540bf6a8b | ||
|
|
dffedb7428 | ||
|
|
8325be8d00 | ||
|
|
81e8aec1ca | ||
|
|
1ad2fad542 | ||
|
|
529384c4ba | ||
|
|
ada3f8e5e6 | ||
|
|
bed475b229 | ||
|
|
87b56bdd9a | ||
|
|
65b0b83625 | ||
|
|
bfca242958 | ||
|
|
861b866a4c | ||
|
|
d498106e90 | ||
|
|
d3ba48a1b7 | ||
|
|
904826b3e1 | ||
|
|
4855d0382e | ||
|
|
564d951d4f | ||
|
|
2bfc09b84c | ||
|
|
cdb814bba5 | ||
|
|
a2c00f1efc | ||
|
|
701e313b82 | ||
|
|
e4b9360512 | ||
|
|
328909f34d | ||
|
|
44877545e5 | ||
|
|
9123757549 | ||
|
|
1d2f92454a | ||
|
|
57ac111d05 | ||
|
|
51e9a6b3aa | ||
|
|
3ccf027f42 | ||
|
|
bbac11a4b8 | ||
|
|
12c63ff007 | ||
|
|
f6421734a2 | ||
|
|
754a776fe3 | ||
|
|
be92c70b1b | ||
|
|
fca58aafb1 | ||
|
|
bbabf25a9e | ||
|
|
3c0a2f0fd0 | ||
|
|
b380d46c66 | ||
|
|
f24e66ecd9 | ||
|
|
50f522ae5c | ||
|
|
76a6f622f7 | ||
|
|
6bf60ef097 | ||
|
|
62fe24b477 | ||
|
|
b3fb86e374 | ||
|
|
733a2f9b3f | ||
|
|
13b388b7be | ||
|
|
ac57eb09f3 | ||
|
|
cf4cae315a | ||
|
|
b0310d1f7a | ||
|
|
db117cc738 | ||
|
|
4bd45b7432 | ||
|
|
22aca7b3ee | ||
|
|
3ee141ff9b | ||
|
|
c0335cf5fb | ||
|
|
2ab275b5b5 | ||
|
|
b9bde5e64c | ||
|
|
c3e9382053 | ||
|
|
32de3684a3 | ||
|
|
4eb7d0d299 | ||
|
|
a29e2e6baa | ||
|
|
2f9a7e8590 | ||
|
|
512e157c8a | ||
|
|
594df753b8 | ||
|
|
17857d3ea9 | ||
|
|
f9b1e05c08 | ||
|
|
8949b77a4a | ||
|
|
e54fcae363 | ||
|
|
fa2148f4bf | ||
|
|
b03f017372 | ||
|
|
36677152e9 | ||
|
|
84bf1cb5d5 | ||
|
|
65052854c2 | ||
|
|
bdcd0d7dab | ||
|
|
30a10bfa99 | ||
|
|
cc6050332e | ||
|
|
2038562f79 | ||
|
|
f5cc145e35 | ||
|
|
695218c2f0 | ||
|
|
a9194d4eaa | ||
|
|
4023be1e84 | ||
|
|
b78b371025 | ||
|
|
a7c33b7d5a | ||
|
|
501e62894b | ||
|
|
1ef58e286c | ||
|
|
c1dead1187 | ||
|
|
01970d2bbd | ||
|
|
243f2b28cd | ||
|
|
9f7130a3e6 | ||
|
|
b84cd155dd | ||
|
|
423ebfd5d5 | ||
|
|
bfc431f0f8 | ||
|
|
1f3293bb43 | ||
|
|
2a449ab773 | ||
|
|
01f571e053 | ||
|
|
c4c219b7c2 | ||
|
|
1e1c3ef1a6 | ||
|
|
0a8a0790cf | ||
|
|
0181cbf743 | ||
|
|
c6c9b88292 | ||
|
|
2753b88cac | ||
|
|
c72384f5d2 | ||
|
|
fe6a042060 | ||
|
|
1e19e39cc5 | ||
|
|
4d9821fb46 | ||
|
|
50f60da076 | ||
|
|
4f5cab7f4c | ||
|
|
3342f884ce | ||
|
|
21c97f9521 | ||
|
|
7bd9286a9b | ||
|
|
781b239d0d | ||
|
|
2b3f99d0e9 | ||
|
|
4ff3b23da5 | ||
|
|
9ddf138683 | ||
|
|
4620a88164 | ||
|
|
3f61993e2e | ||
|
|
548c18a0c0 | ||
|
|
213920a7c3 | ||
|
|
5f3bb4aeeb | ||
|
|
efbc369b86 | ||
|
|
17bededad8 | ||
|
|
1de7f3e14c | ||
|
|
2822fd033a | ||
|
|
ee63856483 | ||
|
|
d886c2b6b7 | ||
|
|
12d9e81bee | ||
|
|
dd51acb6c0 | ||
|
|
8cb548d30d | ||
|
|
b1fab6ffcd | ||
|
|
5a8c372666 | ||
|
|
56a1c27907 | ||
|
|
7e041dd921 | ||
|
|
1f175d2d84 | ||
|
|
b110567517 | ||
|
|
f8401511e2 | ||
|
|
3b282e26c2 | ||
|
|
8cc2ef8e36 | ||
|
|
7b0c3c3cd5 | ||
|
|
6223d3c470 | ||
|
|
005fc7a765 | ||
|
|
b50052c073 | ||
|
|
0c6f8b58a3 | ||
|
|
4593d8742d | ||
|
|
fd1cd908fe | ||
|
|
d302380b08 | ||
|
|
bc2c3cba08 | ||
|
|
695ca5d3f3 | ||
|
|
bc9ff496f2 | ||
|
|
c0cb05b406 | ||
|
|
2524dfdf39 | ||
|
|
4ec1c608a3 | ||
|
|
14464f9fba | ||
|
|
b3573e27be | ||
|
|
286f6e52f0 | ||
|
|
26f9924839 | ||
|
|
908b704a42 | ||
|
|
f95de5c6d9 | ||
|
|
933efd0dda | ||
|
|
4753ae8ac0 | ||
|
|
0b815c7782 | ||
|
|
321c2a73dd | ||
|
|
050a4df149 | ||
|
|
0ed20278f8 | ||
|
|
97acbfee0b | ||
|
|
25b5f544e8 | ||
|
|
4a1d7c42f4 | ||
|
|
05b1451050 | ||
|
|
c58340916c | ||
|
|
99e10766b3 | ||
|
|
ad08016509 | ||
|
|
cc826289c6 | ||
|
|
7098bf9185 | ||
|
|
43854a2921 | ||
|
|
ed39de8426 | ||
|
|
ffc6cae7f5 | ||
|
|
40f95a5dc1 | ||
|
|
f5ba67ab78 | ||
|
|
04454cece0 | ||
|
|
3b9900c1e0 | ||
|
|
f8f59fc00f | ||
|
|
d8c7a2894e | ||
|
|
f71ab2f879 | ||
|
|
1e4be4eb6a | ||
|
|
1fc10a7857 | ||
|
|
e1f0e69263 | ||
|
|
13286f66fd | ||
|
|
9e0c5d1d14 | ||
|
|
0f092acec3 | ||
|
|
56c2f23393 | ||
|
|
33903bbf6d | ||
|
|
96395c44e0 | ||
|
|
036dc802dc | ||
|
|
15ac2f87a3 | ||
|
|
8a5d9bbad3 | ||
|
|
2bcae96d0a | ||
|
|
8d77721dee | ||
|
|
9110bdfb5d | ||
|
|
74b1219d62 | ||
|
|
d818551f50 | ||
|
|
2d8a6b7d7f | ||
|
|
606f0e50b2 | ||
|
|
8b111bb4f0 | ||
|
|
869bb0f37f | ||
|
|
03ae4d03cf | ||
|
|
07add1fe01 | ||
|
|
7c950619cf | ||
|
|
cdeca2d507 | ||
|
|
f145f44d5b | ||
|
|
3e43bc0299 | ||
|
|
f36e29ea90 | ||
|
|
7fb70fdd20 | ||
|
|
73d3049255 | ||
|
|
8be1e4756d | ||
|
|
bb2dd2f5f3 | ||
|
|
cbe3a9159d | ||
|
|
b141f24068 | ||
|
|
e13f97c8ee | ||
|
|
3877b88e6e | ||
|
|
bb6c36c6af | ||
|
|
a4892069d2 | ||
|
|
5d71afc56a | ||
|
|
6413cc5ad3 | ||
|
|
69cc6ddaeb | ||
|
|
4465a661d0 | ||
|
|
246e5f5b8b | ||
|
|
4c11e8ec68 | ||
|
|
df7ba0a897 | ||
|
|
b7dd2bb2ce | ||
|
|
dfca6ae893 | ||
|
|
09fdd2cd0c | ||
|
|
15ed52f64a | ||
|
|
ac6759078b | ||
|
|
6a9a09c08f | ||
|
|
882ba03fcb | ||
|
|
77908e8059 | ||
|
|
2ea68c607c | ||
|
|
41a6697dc3 | ||
|
|
953c31cd11 | ||
|
|
a483a53e26 | ||
|
|
a3745ca492 | ||
|
|
571423e909 | ||
|
|
3873ec941b | ||
|
|
46cdacfdc7 | ||
|
|
384afc1a6d | ||
|
|
fa55b7c824 | ||
|
|
8188bf1d57 | ||
|
|
c19319f115 | ||
|
|
ff3bdfd282 | ||
|
|
4130386447 | ||
|
|
9c04595ae8 | ||
|
|
d1c7f1c2e3 | ||
|
|
f67b972fdf | ||
|
|
0185a74e95 | ||
|
|
222fafe686 | ||
|
|
45c461cd8a | ||
|
|
afcf1d5f53 | ||
|
|
4a7a672d96 | ||
|
|
9cbbfe3a06 | ||
|
|
c2db4640aa | ||
|
|
bec7f2eaf0 | ||
|
|
556f37284c | ||
|
|
929b421c71 | ||
|
|
cd67f7a63a | ||
|
|
59810783d6 | ||
|
|
0eae5120eb | ||
|
|
eeccf1c56b | ||
|
|
e3e9c67f5b | ||
|
|
a73b291c4f | ||
|
|
1b5056ca38 | ||
|
|
2de2cb64f8 | ||
|
|
f458e9c003 | ||
|
|
aa36aee4ee | ||
|
|
e10bb774e6 | ||
|
|
cbe2ce41c1 | ||
|
|
06834eb383 | ||
|
|
413816783d | ||
|
|
4081d7f5f6 | ||
|
|
3a2f6659a6 | ||
|
|
2210c73ae8 | ||
|
|
44d7dfe993 | ||
|
|
87dc13365f | ||
|
|
adc15c2989 | ||
|
|
c69ef282b5 | ||
|
|
8938d3656e | ||
|
|
6b7699444a | ||
|
|
926783fe4c | ||
|
|
8c293df7af | ||
|
|
8ce9d2f02f | ||
|
|
09687e407e | ||
|
|
ad7630f091 | ||
|
|
a14b384f65 | ||
|
|
0e8952984b | ||
|
|
3d4cfe60af | ||
|
|
b3235c762e | ||
|
|
30d8eee631 | ||
|
|
5c77aa6e8e | ||
|
|
77f2a57155 | ||
|
|
91ec41762a | ||
|
|
7abe279b4a | ||
|
|
ce04c82356 | ||
|
|
7746091c98 | ||
|
|
748ee19b4a | ||
|
|
7a6d73762e | ||
|
|
20bbe6cfb0 | ||
|
|
583d905b88 | ||
|
|
40479aef77 | ||
|
|
ab276ccdfe | ||
|
|
5178de7fef | ||
|
|
d3d5f12d3c | ||
|
|
db51adcc26 | ||
|
|
f38c6a661a | ||
|
|
3d016ba800 | ||
|
|
bfeb3a8b3c | ||
|
|
e73894bfbd | ||
|
|
c2c753ce7d | ||
|
|
a352cf3ae5 | ||
|
|
35f3d57cf3 | ||
|
|
9bd5652b88 | ||
|
|
0924a1cef0 | ||
|
|
0b56686f4d | ||
|
|
9a398c0a76 | ||
|
|
db3edb61b4 | ||
|
|
f4a3f33f36 | ||
|
|
2305bbed93 | ||
|
|
a900a8cc17 | ||
|
|
d48a4bd13d | ||
|
|
d5c4ea30db | ||
|
|
979960e8e4 | ||
|
|
24ee6746f4 | ||
|
|
4c76b4189c | ||
|
|
c6dfc9306f | ||
|
|
d3577eb59b | ||
|
|
066b7a0d0b | ||
|
|
be46ace02e | ||
|
|
65592e0541 | ||
|
|
f4c335ad2f | ||
|
|
e6fc278861 | ||
|
|
73045b5c6d | ||
|
|
f6d1f6c825 | ||
|
|
eae664937d | ||
|
|
fabaddb10e | ||
|
|
b18cb6933a | ||
|
|
6d3ebab529 | ||
|
|
4369b6cda2 | ||
|
|
952d360010 | ||
|
|
f84b6237cf | ||
|
|
6f800be33b | ||
|
|
52af0476c1 | ||
|
|
b4fbe1b0f0 | ||
|
|
835ae1734c | ||
|
|
1127ce7b50 | ||
|
|
9d8273771a | ||
|
|
0f9722393e | ||
|
|
e2bb8478d0 | ||
|
|
a353300707 | ||
|
|
77b2e4211d | ||
|
|
868c2ece91 | ||
|
|
354daee3a1 | ||
|
|
fcc51f4d94 | ||
|
|
94f7af1190 | ||
|
|
1059873b10 | ||
|
|
4cf2d71eb4 | ||
|
|
f7b73be561 | ||
|
|
a349fd3aba | ||
|
|
295b428d62 | ||
|
|
a44714c715 | ||
|
|
53ea005ebc | ||
|
|
1baca16a51 | ||
|
|
036f9dc359 | ||
|
|
8f22daf9a3 | ||
|
|
9c12502a36 | ||
|
|
38496c004b | ||
|
|
966139eae3 | ||
|
|
c1326f1e14 | ||
|
|
42d107f434 | ||
|
|
92a275eb9b | ||
|
|
6329e90f62 | ||
|
|
4cd2621eeb | ||
|
|
67143b7bfd | ||
|
|
b7eb71e7d3 | ||
|
|
c75827c71c | ||
|
|
0c472d97bd | ||
|
|
4459eb5c87 | ||
|
|
1e7a56b6fa | ||
|
|
800f1e8305 | ||
|
|
bf716de886 | ||
|
|
db537f2cb4 | ||
|
|
bad0584317 | ||
|
|
36b4860ab5 | ||
|
|
6a45701042 | ||
|
|
a8325c6a5c | ||
|
|
7a42c3123e | ||
|
|
305b78dbba | ||
|
|
411ff4f302 | ||
|
|
be32447773 | ||
|
|
4c105e36a5 | ||
|
|
48d7082fe4 | ||
|
|
44ba9c8953 | ||
|
|
f01bf59114 | ||
|
|
d0cf3fc96a | ||
|
|
7479fd3dd2 | ||
|
|
e0a05f83d1 | ||
|
|
0b35f9c24a | ||
|
|
308ab0e465 | ||
|
|
be0dd22fa5 | ||
|
|
1385acc3f6 | ||
|
|
7da80812e0 | ||
|
|
2ce18ec2a8 | ||
|
|
831110029c | ||
|
|
89ce930de2 | ||
|
|
f69f770043 | ||
|
|
a97b2cc4da | ||
|
|
25b70d8058 | ||
|
|
bd106e4aec | ||
|
|
b7abaf1e47 | ||
|
|
4fea702347 | ||
|
|
3ea974709f | ||
|
|
6681216889 | ||
|
|
189d3434b2 | ||
|
|
c11f9b7e5f | ||
|
|
80b14d1d7f | ||
|
|
ae5e15c046 | ||
|
|
8574dadc34 | ||
|
|
e6cf1f2602 | ||
|
|
9a729257f2 | ||
|
|
492ecb1099 | ||
|
|
ab17af274d | ||
|
|
59e0a8e1b5 | ||
|
|
c232bee95f | ||
|
|
837eeb6d01 | ||
|
|
3426aa8b2a | ||
|
|
3526e35012 | ||
|
|
a018789026 | ||
|
|
d9e598aa7f | ||
|
|
27027d003b | ||
|
|
89eea0536d | ||
|
|
4679daafcf | ||
|
|
a0c6160e55 | ||
|
|
f887420818 | ||
|
|
31851b2e30 | ||
|
|
08702565f7 | ||
|
|
5d99ac7d8d | ||
|
|
d19be0b940 | ||
|
|
b7115b804c | ||
|
|
28bb07d415 | ||
|
|
c2db1d4d44 | ||
|
|
b6d3ac8e32 | ||
|
|
9e8c03cb49 | ||
|
|
5fff8403a8 | ||
|
|
86810e04bd | ||
|
|
ee3680eb6d | ||
|
|
984a5084b0 | ||
|
|
853d62c8d1 | ||
|
|
0550e4a899 | ||
|
|
dec6b6d8b5 | ||
|
|
0b1b3538bc | ||
|
|
31c29b4c02 | ||
|
|
a3b2ba736d | ||
|
|
17a23a1103 | ||
|
|
6b4107b231 | ||
|
|
0a50b835b1 | ||
|
|
89ed7d9b72 | ||
|
|
6e5180bd1c | ||
|
|
efcc3b7d37 | ||
|
|
8a08efdfbb | ||
|
|
a4f26f27bc | ||
|
|
226f90dbcb | ||
|
|
7ce383078d | ||
|
|
d84be0d792 | ||
|
|
4089ee8786 | ||
|
|
5487ac9542 | ||
|
|
f303909ad6 | ||
|
|
be412ba78c | ||
|
|
a1ae00070c | ||
|
|
bb299685cd | ||
|
|
9d1f32cc0a | ||
|
|
6318eee07e | ||
|
|
bc64fc7efb | ||
|
|
650bcef3d1 | ||
|
|
95df8fa128 | ||
|
|
bb62704433 | ||
|
|
09cc0d02f4 | ||
|
|
98f575e098 | ||
|
|
72d2045104 | ||
|
|
3feff08d42 | ||
|
|
fcbd8a5081 | ||
|
|
5b8a4a0b7a | ||
|
|
00f228b959 | ||
|
|
e68ec31a8f | ||
|
|
d6782bced8 | ||
|
|
2368ba4914 | ||
|
|
857f6c892c | ||
|
|
0db5f9fea7 | ||
|
|
1fe31dac7d | ||
|
|
ce675b011d | ||
|
|
775461407e | ||
|
|
6305455554 | ||
|
|
c964461cb5 | ||
|
|
42b2e582c5 | ||
|
|
12f58c967e | ||
|
|
d140a9df8f | ||
|
|
53a539e84b | ||
|
|
57671b2b78 | ||
|
|
4d103c14f7 | ||
|
|
6f4fb48fad | ||
|
|
92f036222e | ||
|
|
c29c8bd33c | ||
|
|
ec834363b4 | ||
|
|
d69c3b8856 | ||
|
|
0fb25ee749 | ||
|
|
d2d8c9bc8e | ||
|
|
829642a2cb | ||
|
|
a2e6180143 | ||
|
|
69ecb02375 | ||
|
|
2ae442accc | ||
|
|
caeeca7722 | ||
|
|
dac542682d | ||
|
|
ab3e076c91 | ||
|
|
d2b7a3ec28 | ||
|
|
c015d97957 | ||
|
|
4ec12ba9d5 | ||
|
|
2d4f31dff5 | ||
|
|
95a4f96da7 | ||
|
|
4f3130908f | ||
|
|
b874322f2f | ||
|
|
fdfb5d8270 | ||
|
|
1b7e690ec1 | ||
|
|
5cc7ba52bb | ||
|
|
66d4d9d5b8 | ||
|
|
8579442d77 | ||
|
|
d23ff27e1a | ||
|
|
932fabbd42 | ||
|
|
4d6792141d | ||
|
|
8930a80fdd | ||
|
|
b46db461a2 | ||
|
|
0be2084b18 | ||
|
|
5f43f44db0 | ||
|
|
3c996ee4a0 | ||
|
|
fa184320e9 | ||
|
|
780b3eb95a | ||
|
|
8b35745928 | ||
|
|
f8c01acd18 | ||
|
|
250c9beff9 | ||
|
|
24d18eb42a | ||
|
|
d144128bf0 | ||
|
|
2a87ec2dc2 | ||
|
|
d6a4047a52 | ||
|
|
d63b26efc2 | ||
|
|
1ba990be6e | ||
|
|
7b5e6e95c8 | ||
|
|
3a77f91ba4 | ||
|
|
84338524c5 | ||
|
|
e5966f97b3 | ||
|
|
4a0b074967 | ||
|
|
4d2d99f227 | ||
|
|
23d23251c7 | ||
|
|
4d477d7e96 | ||
|
|
bf378b76f4 | ||
|
|
0d7d5ddc5f | ||
|
|
ebe8b8d89f | ||
|
|
4a50995906 | ||
|
|
bb3597614a | ||
|
|
4620a7eeba | ||
|
|
96236187b5 | ||
|
|
d325f4b496 | ||
|
|
236fd6b231 | ||
|
|
9b32e0b222 | ||
|
|
2c1e8a2a73 | ||
|
|
aa0e84c3c3 | ||
|
|
7d876ea9f2 | ||
|
|
ea4a49d50e | ||
|
|
eb5b6966e5 | ||
|
|
00e716e064 | ||
|
|
cd885e952c | ||
|
|
e2cd2a72aa | ||
|
|
cd427ab8ba | ||
|
|
cefafba062 | ||
|
|
ddcaf1850f | ||
|
|
18ecf479b1 | ||
|
|
a06f6f9604 | ||
|
|
35de6d4cbc | ||
|
|
2bcd66e714 | ||
|
|
4c7ac3fdb6 | ||
|
|
cf3ded482f | ||
|
|
dcca4896f0 | ||
|
|
d267f84030 | ||
|
|
b2f93b49ba | ||
|
|
1c00608b27 | ||
|
|
e3c1354ce0 | ||
|
|
93a1961762 | ||
|
|
c04fdd250c | ||
|
|
626fbe6de8 | ||
|
|
b22422f4b8 | ||
|
|
b0b85e12a6 | ||
|
|
b500a312b6 | ||
|
|
cac354caa9 | ||
|
|
1c8c635e48 | ||
|
|
9c48703fb1 | ||
|
|
d040883286 | ||
|
|
b2c059d56b | ||
|
|
15b9a25aa4 | ||
|
|
e01855ca9c | ||
|
|
618ee6d95f | ||
|
|
8f82d86e7c | ||
|
|
b3525deeab | ||
|
|
7d81fd3c3c | ||
|
|
d48af035d8 | ||
|
|
ebba764c85 | ||
|
|
a5c4d0783d | ||
|
|
3772afb40c | ||
|
|
19343e890e | ||
|
|
5661b43168 | ||
|
|
aa666d1829 | ||
|
|
2758d64778 | ||
|
|
5d5808880f | ||
|
|
8ee3155f2a | ||
|
|
62cc720607 | ||
|
|
900d7e0974 | ||
|
|
7102c1205e | ||
|
|
ec05e2333a | ||
|
|
8540a2757e | ||
|
|
ce1a8d8f6a | ||
|
|
637ae09192 | ||
|
|
4f59e2d28b | ||
|
|
cb2294d6f2 | ||
|
|
95e6efc218 | ||
|
|
029042393c | ||
|
|
7ad509cc7a | ||
|
|
f6cd4547ab | ||
|
|
dd088bc603 | ||
|
|
c5d091d445 | ||
|
|
38ef061175 | ||
|
|
715d0aced3 | ||
|
|
55eebd9309 | ||
|
|
cce8821a83 | ||
|
|
d45765dab5 | ||
|
|
54a4aafd06 | ||
|
|
e4e8a00acc | ||
|
|
db8517a7f9 | ||
|
|
35d8f33542 | ||
|
|
75b79e1b23 | ||
|
|
66df007ea8 | ||
|
|
9da885b2f8 | ||
|
|
efa063d8d0 | ||
|
|
fcd4cc17d3 | ||
|
|
550cf9b102 | ||
|
|
69639bb61c | ||
|
|
4839e6a8b3 | ||
|
|
477c4f1c88 | ||
|
|
b62d0d974f | ||
|
|
5a433d9bf8 | ||
|
|
f91920ab90 | ||
|
|
83d3b31a1a | ||
|
|
97268b9876 | ||
|
|
b2fb9f421a | ||
|
|
6b0105cc3b | ||
|
|
0b2d0ce34f | ||
|
|
5c4ee44787 | ||
|
|
165a10ac37 | ||
|
|
b8f68325ef | ||
|
|
2f2eb67b5f | ||
|
|
5b1f574167 | ||
|
|
a990718b71 | ||
|
|
8670fe9a4f | ||
|
|
2a22c3396a | ||
|
|
20b139bf7f | ||
|
|
a838e52fea | ||
|
|
918cea5291 | ||
|
|
b7ecf3b9dd | ||
|
|
b90a5e2b0b | ||
|
|
1deef137a9 | ||
|
|
8baf553a49 | ||
|
|
d3afc8a245 | ||
|
|
cc4476031a | ||
|
|
3a2c8456d7 | ||
|
|
9cb1a566c1 | ||
|
|
d2707bbb6a | ||
|
|
88f30a26b2 | ||
|
|
61d16b682b | ||
|
|
1c3f94c9ec | ||
|
|
004e7e376d | ||
|
|
549011edf4 | ||
|
|
432267c811 | ||
|
|
0fcabfae05 | ||
|
|
9faa5acb21 | ||
|
|
9c511559ff | ||
|
|
f9a4c8eb0e | ||
|
|
5f27987ca2 | ||
|
|
866ee997d9 | ||
|
|
c82b1cee8e | ||
|
|
6ce1c80a47 | ||
|
|
0839fadbc2 | ||
|
|
96977e70b3 | ||
|
|
a448af2897 | ||
|
|
20aaf644fa | ||
|
|
0d91eee5e0 | ||
|
|
e01ad572a5 | ||
|
|
8bd830c991 | ||
|
|
85d33ecccd | ||
|
|
b6ba4b2fd8 | ||
|
|
37c6837dc1 | ||
|
|
08f2f9aef0 | ||
|
|
09461fd3df | ||
|
|
b8996ce50b | ||
|
|
857f6ecc81 | ||
|
|
f5963b8ea5 | ||
|
|
904849e156 | ||
|
|
b9513c80eb | ||
|
|
b3210ed2ef | ||
|
|
6dbed7964b | ||
|
|
ce6d8576ae | ||
|
|
291bec7e90 | ||
|
|
5997227997 | ||
|
|
c73b04111e | ||
|
|
05637b1eff | ||
|
|
48b6a32fe1 | ||
|
|
579e79575b | ||
|
|
296a64f465 | ||
|
|
3ad190855b | ||
|
|
206a35ebd9 | ||
|
|
8acab4bba6 | ||
|
|
abd3b18727 | ||
|
|
f07a777194 | ||
|
|
cd60a30aeb | ||
|
|
2e02f843ad | ||
|
|
fddc408cd9 | ||
|
|
d4f0c0808a | ||
|
|
dbdee1f7f8 | ||
|
|
bae74bcc95 | ||
|
|
bc31125bc6 | ||
|
|
d32fb0e4c0 | ||
|
|
0658a363cb | ||
|
|
186fb03048 | ||
|
|
8db827e429 | ||
|
|
46a7039ae9 | ||
|
|
8a8f792d4b | ||
|
|
c0c978bbdf | ||
|
|
ff75349d95 | ||
|
|
e88c710fd3 | ||
|
|
0fba1c06b4 | ||
|
|
69a9829041 | ||
|
|
d68c1958b5 | ||
|
|
2434a94aae | ||
|
|
b80ebb4fcb | ||
|
|
fd6e59174e | ||
|
|
54ef5b0bee | ||
|
|
b0c09a5b0f | ||
|
|
719de71de4 | ||
|
|
571816fc28 | ||
|
|
adcc25db8e | ||
|
|
7c97f68ee2 | ||
|
|
2dfc9a7973 | ||
|
|
c04aac4ae0 | ||
|
|
798a0ad783 | ||
|
|
935cc3b098 | ||
|
|
5ef2ad5536 | ||
|
|
0276a67417 | ||
|
|
46a3d10e8a | ||
|
|
d09dea7e5e | ||
|
|
55faa3cb1a | ||
|
|
d9a9eb56a7 | ||
|
|
5237729a6d | ||
|
|
a251848ba1 | ||
|
|
3383da514a | ||
|
|
3d7091a9e2 | ||
|
|
d1759228cc | ||
|
|
768536b9e2 | ||
|
|
8f0b19f427 | ||
|
|
972f6a0ea9 | ||
|
|
9c55dec6ba | ||
|
|
06715be05f | ||
|
|
8f8169b8e4 | ||
|
|
313aa11528 | ||
|
|
2ccd9feae7 | ||
|
|
fa3735b033 | ||
|
|
adfceaf20b | ||
|
|
8af36b742e | ||
|
|
a670b67844 | ||
|
|
e8fc810b8d | ||
|
|
b6648283c2 | ||
|
|
b29979bfd9 | ||
|
|
7e346a56ff | ||
|
|
719480cf76 | ||
|
|
92f1b9c079 | ||
|
|
c0831ecef6 | ||
|
|
d3ae43c4ba | ||
|
|
a4e01dd8e9 | ||
|
|
88e195408c | ||
|
|
f77ae2b045 | ||
|
|
655ff2675e | ||
|
|
37fae09ce4 | ||
|
|
711fb7d748 | ||
|
|
f8891beb0a | ||
|
|
61a401b119 | ||
|
|
5dd78c18da | ||
|
|
eb4ac5c103 | ||
|
|
af7f5d0aaf | ||
|
|
7275b215b8 | ||
|
|
6fa6503515 | ||
|
|
73ff972789 | ||
|
|
a51bfd6a04 | ||
|
|
b8cda6616f | ||
|
|
1aa5388aaf | ||
|
|
0dd79d4f80 | ||
|
|
68cd425950 | ||
|
|
ffa83547ca | ||
|
|
d48cd57198 | ||
|
|
ab26c172d7 | ||
|
|
1d32307a71 | ||
|
|
42d8bbfce2 | ||
|
|
9245b0bb8b | ||
|
|
fa6f453e88 | ||
|
|
f7295a7a79 | ||
|
|
4c00e90436 | ||
|
|
7d802a71c1 | ||
|
|
69a1bb99ac | ||
|
|
b055015250 | ||
|
|
e325bdb16b | ||
|
|
209ac97d15 | ||
|
|
e64cea499f | ||
|
|
c621c145e9 | ||
|
|
6ea84a36dc | ||
|
|
9914e9b1ab | ||
|
|
5dfaed91f1 | ||
|
|
d523818339 | ||
|
|
33e8ee6c0e | ||
|
|
a87d557354 | ||
|
|
024f7c3275 | ||
|
|
f2910da513 | ||
|
|
b5ed5db880 | ||
|
|
fa65e73bd0 | ||
|
|
f1ff7d02d1 | ||
|
|
21afb56089 | ||
|
|
034cdc9d02 | ||
|
|
2008d497bb | ||
|
|
b71a28106c | ||
|
|
eb5147b497 | ||
|
|
341c40b610 | ||
|
|
169800b209 | ||
|
|
bdacc5e3eb | ||
|
|
afaf213f11 | ||
|
|
e4116bf5b1 | ||
|
|
58c1d7dd62 | ||
|
|
56a4ca0406 | ||
|
|
3f991a4f1f | ||
|
|
056abc314c | ||
|
|
9870121f01 | ||
|
|
525e342f9b | ||
|
|
8b267ba947 | ||
|
|
843ccbc88b | ||
|
|
78fbe18aed | ||
|
|
dd83cd9f78 | ||
|
|
0f178b9f07 | ||
|
|
381ff20820 | ||
|
|
559d5ee5e6 | ||
|
|
ec0e476521 | ||
|
|
3f8ff1a66c | ||
|
|
7229b6aaf1 | ||
|
|
3ab447a766 | ||
|
|
0ed11dc98c | ||
|
|
52b1b23d47 | ||
|
|
030d383d30 | ||
|
|
b34f7bcdd5 | ||
|
|
6a3991bbaa | ||
|
|
5d2a9fe267 | ||
|
|
cd8620cc9d | ||
|
|
5399214ad8 | ||
|
|
896c7eca57 | ||
|
|
c29486f515 | ||
|
|
3fe1f5af60 | ||
|
|
1034e1a301 | ||
|
|
6379320b83 | ||
|
|
30de90e4f0 | ||
|
|
52a40112a2 | ||
|
|
7a679dea2d | ||
|
|
0eb86cb97f | ||
|
|
7fcb1ae9b3 | ||
|
|
6715498598 | ||
|
|
eaec4c9744 | ||
|
|
fa07abd014 | ||
|
|
30a02adfe3 | ||
|
|
ea6102e123 | ||
|
|
b5aaf0f990 | ||
|
|
ed6abb6d92 | ||
|
|
862330a576 | ||
|
|
fadda49b0e | ||
|
|
db5709a033 | ||
|
|
c447262764 | ||
|
|
79e6013342 | ||
|
|
2c00d4c116 | ||
|
|
b468065c6b | ||
|
|
67050e4d6d | ||
|
|
5437ab7057 | ||
|
|
2f73fd3a9d | ||
|
|
27b6845b78 | ||
|
|
1310619848 | ||
|
|
1d78267871 | ||
|
|
ed0947d761 | ||
|
|
6564bad85e | ||
|
|
6b9462f606 | ||
|
|
eef4ef54a1 | ||
|
|
9cc4f73cab | ||
|
|
d0d87497c5 | ||
|
|
09a97d339e | ||
|
|
db049f9c8e | ||
|
|
c1335955f4 | ||
|
|
3a65551746 | ||
|
|
62c6b9d886 | ||
|
|
a78ccb460d | ||
|
|
2f5c7ea2f1 | ||
|
|
ecede3126b | ||
|
|
8b55b83256 | ||
|
|
ee57e60ca6 | ||
|
|
890512ccbb | ||
|
|
3d22fa5d24 | ||
|
|
e0652539fb | ||
|
|
26ede9b015 | ||
|
|
2d01c5489b | ||
|
|
7cdf4c7476 | ||
|
|
5251dfaa97 | ||
|
|
d6ce739b8a | ||
|
|
b2be90e1a0 | ||
|
|
e6e94ad57e | ||
|
|
fc70fb7c1a | ||
|
|
e0c3b8e269 | ||
|
|
9861c081db | ||
|
|
916df3ff4f | ||
|
|
c0b65e9304 | ||
|
|
aa2596b457 | ||
|
|
359ea05680 | ||
|
|
c77e7af126 | ||
|
|
1a444071f1 | ||
|
|
5070d992dd | ||
|
|
bf21aa8cd6 | ||
|
|
529824e2b3 | ||
|
|
6e6ced2cee | ||
|
|
4fa4849fcd | ||
|
|
affab5f6d3 | ||
|
|
5fb8d34a07 | ||
|
|
ff75122095 | ||
|
|
4c92592aa1 | ||
|
|
0bbefdc48f | ||
|
|
09569301f1 | ||
|
|
84ad8aabec | ||
|
|
98c092637e | ||
|
|
1f86ec3d19 | ||
|
|
85217fffc3 | ||
|
|
9f9fb7d043 | ||
|
|
cea1441eeb | ||
|
|
85faec73f4 | ||
|
|
d1180a5c69 | ||
|
|
84941607df | ||
|
|
3dc7b68d08 | ||
|
|
af4930e3f3 | ||
|
|
0a4f16737a | ||
|
|
a4795975a7 | ||
|
|
0e10160d85 | ||
|
|
f7944e83eb | ||
|
|
a55777c62b | ||
|
|
ebd2cb6f25 | ||
|
|
d5a349fccc | ||
|
|
417428acea | ||
|
|
ac837a77e7 | ||
|
|
d208f58084 | ||
|
|
3eb44ccb80 | ||
|
|
6dcc538777 | ||
|
|
560951d597 | ||
|
|
75769c46de | ||
|
|
d3d0df59cb | ||
|
|
43f6ae7ba0 | ||
|
|
f86f027fb2 | ||
|
|
e3164d8d44 | ||
|
|
4720ede442 | ||
|
|
413bdce17c | ||
|
|
37136c9bef | ||
|
|
fb5970d4db | ||
|
|
2de9d491c3 | ||
|
|
f6b4794183 | ||
|
|
30909bd6fe | ||
|
|
2104c983e9 | ||
|
|
30faf7bfad | ||
|
|
785e5552ae | ||
|
|
a1cd398e4d | ||
|
|
edb06b12e9 | ||
|
|
1337ffe9e5 | ||
|
|
1238dc20da | ||
|
|
5157b2eff4 | ||
|
|
257ed8dc92 | ||
|
|
ea12f5b2ec | ||
|
|
34bd9b58e8 | ||
|
|
83754410f3 | ||
|
|
ae36704b66 | ||
|
|
70899ffb87 | ||
|
|
001865f1db | ||
|
|
2a3c68f2c6 | ||
|
|
769a7b1384 | ||
|
|
149abf98cf | ||
|
|
e104078b3f | ||
|
|
b7fa328d95 | ||
|
|
598dbeb185 | ||
|
|
7c249e9f7a | ||
|
|
1c7710d0ab | ||
|
|
a67e714abc | ||
|
|
932d08c276 | ||
|
|
2c90b6157c | ||
|
|
4b5b7381c2 | ||
|
|
f67639e0a2 | ||
|
|
66082029a9 | ||
|
|
f9e8b31633 | ||
|
|
257c57ccca | ||
|
|
7b488c8ec8 | ||
|
|
a46719eaba | ||
|
|
1bdf906617 | ||
|
|
97abb0e97f | ||
|
|
86f3153973 | ||
|
|
390726ac03 | ||
|
|
82b24d95d0 | ||
|
|
c7a2afa287 | ||
|
|
92d70dfcf4 | ||
|
|
cfcf72b8e0 | ||
|
|
36226a23ab | ||
|
|
fdba19043a | ||
|
|
c56ccb3aa4 | ||
|
|
f7a5cda7f4 | ||
|
|
7c346df471 | ||
|
|
99f5e9fc9f | ||
|
|
a942cb2711 | ||
|
|
aa39dcc34f | ||
|
|
0b3881751f | ||
|
|
31e656630d | ||
|
|
9cce3faba5 | ||
|
|
6dc71122b8 | ||
|
|
073c9445ea | ||
|
|
5dc7c62cd4 | ||
|
|
d3f8f03a7d | ||
|
|
7a90970177 | ||
|
|
b20f8668be | ||
|
|
d8d624870d | ||
|
|
1e6ed7be02 | ||
|
|
973369e7f1 | ||
|
|
0185d75b05 | ||
|
|
3e40bec98d | ||
|
|
f96ca5dd73 | ||
|
|
2240333df1 | ||
|
|
fdac4bf2c9 | ||
|
|
fab98633a4 | ||
|
|
11f3cbdb36 | ||
|
|
a3e7df0068 | ||
|
|
4e6b9ec947 | ||
|
|
de8bdb96bd | ||
|
|
ebafb9c316 | ||
|
|
f4ae9b41d6 | ||
|
|
27bf4b272b | ||
|
|
bb92715f02 | ||
|
|
0ffa15eb21 | ||
|
|
ae4a18c745 | ||
|
|
a9f14d9ffe | ||
|
|
ce84278f10 | ||
|
|
8955e0a6b1 | ||
|
|
9594c8d004 | ||
|
|
8a893e12f5 | ||
|
|
8f09514dd7 | ||
|
|
2bb4f1f875 | ||
|
|
050569b03b | ||
|
|
8b3ac57ce7 | ||
|
|
88447f87d6 | ||
|
|
d6296e9cf0 | ||
|
|
ab1a31cfb6 | ||
|
|
45918da48e | ||
|
|
cef6273dcf | ||
|
|
8c57df1945 | ||
|
|
6c927e8ec4 | ||
|
|
0e881faa87 | ||
|
|
6dbec06571 | ||
|
|
3306b01df9 | ||
|
|
598993e592 | ||
|
|
d03ef49a3c | ||
|
|
ea108b7733 | ||
|
|
60bbee9eaf | ||
|
|
1e316c75ea | ||
|
|
30c07c429c | ||
|
|
b69ad0a3d2 | ||
|
|
bad2c82669 | ||
|
|
12efdbef01 | ||
|
|
cf6476c1fc | ||
|
|
f48cb65284 | ||
|
|
62b8f78937 | ||
|
|
1b66b3c3fb | ||
|
|
2075e42c6d | ||
|
|
cda845f9a6 | ||
|
|
3edd06548c | ||
|
|
723976be58 | ||
|
|
91e1866d1a | ||
|
|
42178d5f7b | ||
|
|
cd94bb3f5b | ||
|
|
94cc7c8256 | ||
|
|
6ce2de6fb0 | ||
|
|
f7750e5f04 | ||
|
|
adab9819bd | ||
|
|
1304890441 | ||
|
|
a6dfaa0076 | ||
|
|
97563c1f2a | ||
|
|
68d0002d6b | ||
|
|
9734bfc4a0 | ||
|
|
646a76570f | ||
|
|
b8ef76f130 | ||
|
|
2fd7992b0e | ||
|
|
2beedb1676 | ||
|
|
cd7657d4d5 | ||
|
|
25e2c96ecd | ||
|
|
8085179499 | ||
|
|
0a922752de | ||
|
|
d58a286e3b | ||
|
|
8666f4efbf | ||
|
|
0c60ee5f1d | ||
|
|
d75f950ac4 | ||
|
|
f78d8b3e5e | ||
|
|
84f664de14 | ||
|
|
9eedd6c57a | ||
|
|
7866e761cc | ||
|
|
8af62c37bb | ||
|
|
74c109d6f1 | ||
|
|
c7e05df9c0 | ||
|
|
b558d67fcd | ||
|
|
f78d4b13eb | ||
|
|
120b89041b | ||
|
|
2d0aab223c | ||
|
|
6629061abd | ||
|
|
79b30153ba | ||
|
|
1b3971d6da | ||
|
|
0ad932acf6 | ||
|
|
d719f44e6f | ||
|
|
96e89f5ce5 | ||
|
|
f86bdd648a | ||
|
|
bce5cf9400 | ||
|
|
fe182a7407 | ||
|
|
94471c1a1a | ||
|
|
c714f3109a | ||
|
|
6cc95f2a4a | ||
|
|
3d31c9753a | ||
|
|
346a6721df | ||
|
|
d2a3f7de23 | ||
|
|
f47b83235a | ||
|
|
2d22c3519f | ||
|
|
a18543862f | ||
|
|
30dfbbbd68 | ||
|
|
4339fadd50 | ||
|
|
1ae074d05f | ||
|
|
84c9dd0dad | ||
|
|
3209986df1 | ||
|
|
87458657f8 | ||
|
|
67a6ed3fb4 | ||
|
|
f10e267b4c | ||
|
|
22987a5747 | ||
|
|
497fe6399f | ||
|
|
a5cc75c1f7 | ||
|
|
c8d4c798ee | ||
|
|
90c225e8b2 | ||
|
|
b789d44fd6 | ||
|
|
f26f4c30c8 | ||
|
|
00848fef21 | ||
|
|
0dfaa13f20 | ||
|
|
94decf01dc | ||
|
|
c269dc822c | ||
|
|
0f50e4d895 | ||
|
|
9a2cb1b6d1 | ||
|
|
31be8e7585 | ||
|
|
6d1e16a0a6 | ||
|
|
540dc17303 | ||
|
|
a8028768bc | ||
|
|
3872c16ed9 | ||
|
|
4e7ecb3f30 | ||
|
|
b9d90339ac | ||
|
|
5f841d98bc | ||
|
|
9bf5d7e6ba | ||
|
|
05bd2329c7 | ||
|
|
1a1de95ff5 | ||
|
|
7aaf09e92d | ||
|
|
2eb9ee1507 | ||
|
|
f2196b25f8 | ||
|
|
0f31471b2e | ||
|
|
4395a5f404 | ||
|
|
407996b00b | ||
|
|
2bf866052d | ||
|
|
10b002889c | ||
|
|
b50eea26ed | ||
|
|
8dae33e9ba | ||
|
|
ac742bf662 | ||
|
|
f368908660 | ||
|
|
76da6598c6 | ||
|
|
395bf25e1a | ||
|
|
3a3111ab91 | ||
|
|
ba8b49c703 | ||
|
|
fa1e69c1ec | ||
|
|
dbc1015d18 | ||
|
|
bb3df31c86 | ||
|
|
df9129364a | ||
|
|
38049c4bab | ||
|
|
9fafe50693 | ||
|
|
190dfe6706 | ||
|
|
835508a6b2 | ||
|
|
b20569a3fb | ||
|
|
feb1bb4fa3 | ||
|
|
fecb80665b | ||
|
|
23a6137624 | ||
|
|
a7e838e001 | ||
|
|
8f2b51c574 | ||
|
|
0b4d42eb27 | ||
|
|
2e108b7875 | ||
|
|
1d5228b4e3 | ||
|
|
f9251271fb | ||
|
|
7472a8ebc7 | ||
|
|
f2a6b6c6b6 | ||
|
|
438884b866 | ||
|
|
c583386175 | ||
|
|
749f16d875 | ||
|
|
82618f0184 | ||
|
|
cc1eb5dd98 | ||
|
|
d66727cb35 | ||
|
|
865aeaad12 | ||
|
|
0c05f998e9 | ||
|
|
4524f8413f | ||
|
|
903054e97a | ||
|
|
623056fe20 | ||
|
|
f2e75e730b | ||
|
|
5e8b8ab3e3 | ||
|
|
b1d21b0e3f | ||
|
|
184351c932 | ||
|
|
c0d0e80fe0 | ||
|
|
0646b43144 | ||
|
|
b477ffd08f | ||
|
|
ef63a0661b | ||
|
|
1293850a09 | ||
|
|
300d405621 | ||
|
|
f5d1a1753d | ||
|
|
bbdeec5a50 | ||
|
|
30b265a425 | ||
|
|
62e196e802 | ||
|
|
7cc7a8f47c | ||
|
|
b9859a1e57 | ||
|
|
9c6f50af41 | ||
|
|
45518580a4 | ||
|
|
f6d4686898 | ||
|
|
021bc5f011 | ||
|
|
55251e1024 | ||
|
|
693de2996a | ||
|
|
dabe7a3b55 | ||
|
|
be95b93a2d | ||
|
|
73ce47675c | ||
|
|
67d1368730 | ||
|
|
d923b4df53 | ||
|
|
ba3e0c4c35 | ||
|
|
9677aaa715 | ||
|
|
2e3b93b7f5 | ||
|
|
229f5b0c51 | ||
|
|
adac0bb388 | ||
|
|
745f3854d4 | ||
|
|
4a594ed115 | ||
|
|
dc14b2f9fe | ||
|
|
1f523ee843 | ||
|
|
0728533676 | ||
|
|
7019a1149d | ||
|
|
b4b2a5b5a6 | ||
|
|
1ec21662a9 | ||
|
|
560c487d15 | ||
|
|
edd7bc7197 | ||
|
|
98fbef7c24 | ||
|
|
8b191f038e | ||
|
|
eb206cb687 | ||
|
|
b974b3df3e | ||
|
|
15e412bd4e | ||
|
|
f1fc0df52a | ||
|
|
c05e3f8fe1 | ||
|
|
a0c2ffaac4 | ||
|
|
68a5f36f25 | ||
|
|
bb42f78bef | ||
|
|
562390dbb6 | ||
|
|
1b9d9fe12c | ||
|
|
fc5693067c | ||
|
|
177cd30854 | ||
|
|
2e5771b9e8 | ||
|
|
757bc94a23 | ||
|
|
7d48890f76 | ||
|
|
1514ef18ec | ||
|
|
a6cfb315f2 | ||
|
|
9ec76f7ecb | ||
|
|
03edd00014 | ||
|
|
0c724d1a88 | ||
|
|
bf8e7a3590 | ||
|
|
7cb46ffa18 | ||
|
|
d9293afd35 | ||
|
|
ea9a893c24 | ||
|
|
0619059047 | ||
|
|
f8c6fd9fac | ||
|
|
1136834d63 | ||
|
|
277915407e | ||
|
|
a2b2e4599d | ||
|
|
a9b1a6daaf | ||
|
|
ebf6fca040 | ||
|
|
f9273d3692 | ||
|
|
981bfc9b39 | ||
|
|
e70b32e14d | ||
|
|
9a928295fa | ||
|
|
22da3bdba7 | ||
|
|
89c8b3e3dd | ||
|
|
c60734cc5f | ||
|
|
1daa259c98 | ||
|
|
3c5da00230 | ||
|
|
98c30799a8 | ||
|
|
5b605bb6db | ||
|
|
a53518fd0e | ||
|
|
8014116bda | ||
|
|
466e725afd | ||
|
|
520a9b8b0d | ||
|
|
071fd8b569 | ||
|
|
64deea0d99 | ||
|
|
a8fd8053f4 | ||
|
|
000b880023 | ||
|
|
d42cb40ae3 | ||
|
|
5d24a2b7d9 | ||
|
|
b2f52baa99 | ||
|
|
081de6bed8 | ||
|
|
f47450846c | ||
|
|
2026be325f | ||
|
|
f6bc3cf998 | ||
|
|
5ec30ac35c | ||
|
|
e08ae8ed4a | ||
|
|
fc67edb44d | ||
|
|
3e042f63e6 | ||
|
|
aac78cef0a | ||
|
|
1c0b167c95 | ||
|
|
f435152c88 | ||
|
|
4da5df9c9b | ||
|
|
36589ad832 | ||
|
|
032d8781dc | ||
|
|
2ec7ef8acd | ||
|
|
d4b1eefe70 | ||
|
|
ddea5b57a5 | ||
|
|
49fed04bd2 | ||
|
|
9c36b2bef7 | ||
|
|
7d394896e4 | ||
|
|
5a0122cec5 | ||
|
|
bdb2afb1dc | ||
|
|
0fe1fb76d1 | ||
|
|
2a5b029ecc | ||
|
|
8aa030539b | ||
|
|
8ed7d12a08 | ||
|
|
469a726285 | ||
|
|
0103da13f0 | ||
|
|
c3ce525c6c | ||
|
|
939a96b314 | ||
|
|
b0c5c24d06 | ||
|
|
2b61d131dc | ||
|
|
e7db2a63b9 | ||
|
|
d5d78a1018 | ||
|
|
fc3c05692f | ||
|
|
1fdd037132 | ||
|
|
63b404be9f | ||
|
|
aaf031f501 | ||
|
|
a855f4bc67 | ||
|
|
85c8b2fdc3 | ||
|
|
b97e71e83e | ||
|
|
44a744752f | ||
|
|
02fec31c92 | ||
|
|
93f15a507b | ||
|
|
7cc2daa696 | ||
|
|
46aff7aabf | ||
|
|
65a4e664e5 | ||
|
|
62768cd617 | ||
|
|
f03efefac5 | ||
|
|
7f22d155f2 | ||
|
|
619b9f230f | ||
|
|
3e8b6dd1c1 | ||
|
|
0b8561711b | ||
|
|
5cb04828d2 | ||
|
|
2d100197c8 | ||
|
|
4debc2dffb | ||
|
|
b1bb2dce16 | ||
|
|
1940b63237 | ||
|
|
5ca629ec90 | ||
|
|
e7852ea54e | ||
|
|
40cf4dfee4 | ||
|
|
1a2c1252f0 | ||
|
|
95ee87f771 | ||
|
|
84697eb9b0 | ||
|
|
884f6b3571 | ||
|
|
aa9ecde7c8 | ||
|
|
1ead98b999 | ||
|
|
2a14039733 | ||
|
|
568962dadf | ||
|
|
7126d215b0 | ||
|
|
027342bba0 | ||
|
|
7b953ffefb | ||
|
|
d8e57d1c01 | ||
|
|
56f3f49f15 | ||
|
|
f8a45e4963 | ||
|
|
740a86609f | ||
|
|
d6b2bcf0d2 | ||
|
|
c3209e7738 | ||
|
|
3b55a19119 | ||
|
|
8ed7d22010 | ||
|
|
6542134e04 | ||
|
|
96ac13cdac | ||
|
|
d409006a44 | ||
|
|
ec418f98c0 | ||
|
|
2e7452f067 | ||
|
|
ddc31870bf | ||
|
|
77d6048005 | ||
|
|
8748e661e8 | ||
|
|
a50086ddec | ||
|
|
465fa571d2 | ||
|
|
d72ba16664 | ||
|
|
efd14f4c24 | ||
|
|
c472024921 | ||
|
|
35cd3918df | ||
|
|
a2a0851978 | ||
|
|
b329679d2d | ||
|
|
39657e6537 | ||
|
|
ee99d15df4 | ||
|
|
813b993819 | ||
|
|
f62189b381 | ||
|
|
dfa306c8c2 | ||
|
|
df7e90f4b5 | ||
|
|
55532c00b4 | ||
|
|
7ea18f5462 | ||
|
|
a16bbb8046 | ||
|
|
1d30241871 | ||
|
|
a0e5ec1d13 | ||
|
|
830620740a | ||
|
|
d34e8c4336 | ||
|
|
2370531e75 | ||
|
|
06f74a8c15 | ||
|
|
e0ad5eaf5e | ||
|
|
067f356010 | ||
|
|
555a38b819 | ||
|
|
88f2ede8fe | ||
|
|
9b2f61d778 | ||
|
|
0801047fe6 | ||
|
|
f8b8d03e15 | ||
|
|
f4270a0d75 | ||
|
|
0ab629e32d | ||
|
|
4259611726 | ||
|
|
24e2429fc0 | ||
|
|
ebf046ebc0 | ||
|
|
0155171c0d | ||
|
|
5a92b77560 | ||
|
|
0604b1a822 | ||
|
|
d54f3afe25 | ||
|
|
acc2392c3d | ||
|
|
3044c63773 | ||
|
|
f963238a75 | ||
|
|
46d41ba67a | ||
|
|
00921ce713 | ||
|
|
55073bd891 | ||
|
|
2b4ceda937 | ||
|
|
93ddc0b4f5 | ||
|
|
a74fc5aac7 | ||
|
|
e1032498e2 | ||
|
|
f43e07bc68 | ||
|
|
e61207ab41 | ||
|
|
0f87b1b5da | ||
|
|
6032e33290 | ||
|
|
037cba9a13 | ||
|
|
cb41569a5a | ||
|
|
6167f5d7b4 | ||
|
|
b50a453fe0 | ||
|
|
52d7f02dcb | ||
|
|
cce90a2bed | ||
|
|
973b6fc355 | ||
|
|
331c7d1a1a | ||
|
|
e35ee592ad | ||
|
|
2e646d722c | ||
|
|
fff29fcd69 | ||
|
|
4fd8bcd7c7 | ||
|
|
9fd97d89c0 | ||
|
|
0544f96980 | ||
|
|
4671a49fd8 | ||
|
|
e3cf8b7843 | ||
|
|
997257ff79 | ||
|
|
153da33311 | ||
|
|
93f613d6af | ||
|
|
608c0df0f7 | ||
|
|
4f568d5d19 | ||
|
|
331c952212 | ||
|
|
879da091d3 | ||
|
|
68410b9c58 | ||
|
|
7a3ecb339b | ||
|
|
144cba7f10 | ||
|
|
ee4571071d | ||
|
|
47a3ca44ba | ||
|
|
0e7ad3feeb | ||
|
|
bb6ba758db | ||
|
|
1ce4805bdc | ||
|
|
ecdb66f65a | ||
|
|
ae1880311e | ||
|
|
6652319283 | ||
|
|
855dec7fcd | ||
|
|
e57120fa61 | ||
|
|
f955eef31e | ||
|
|
6aaec3dc96 | ||
|
|
f59e5128d7 | ||
|
|
29fa2dfcfb | ||
|
|
6363cb0d80 | ||
|
|
17d9f4fb46 | ||
|
|
2c6329310a | ||
|
|
48089e869e | ||
|
|
5cb735eb8f | ||
|
|
d034e32703 | ||
|
|
a3b8c84e39 | ||
|
|
bf2376d504 | ||
|
|
aba8c0356a | ||
|
|
8870ba3b65 | ||
|
|
26e0283fc7 | ||
|
|
0c38e014d7 | ||
|
|
b89f79d901 | ||
|
|
56fbbef133 | ||
|
|
6ece2537ee | ||
|
|
f7b722f10f | ||
|
|
64544a6e7c | ||
|
|
1ef7a097a6 | ||
|
|
b70297dc7a | ||
|
|
732b3289f0 | ||
|
|
bc0caa5dd6 | ||
|
|
f835b34f57 | ||
|
|
3aa33bd720 | ||
|
|
87601fba1b | ||
|
|
adc900a03a | ||
|
|
de52808e9f | ||
|
|
31aebca134 | ||
|
|
9d09bdc1f3 | ||
|
|
a9c3019433 | ||
|
|
3f56830170 | ||
|
|
73b1953c09 | ||
|
|
4e0fc58f60 | ||
|
|
108f102360 | ||
|
|
be73811c53 | ||
|
|
f3fbc004f3 | ||
|
|
be71cf5689 | ||
|
|
bd53fce4a7 | ||
|
|
80c72c8f83 | ||
|
|
445daaeba2 | ||
|
|
851cff4bb8 | ||
|
|
245e25f4b7 | ||
|
|
69113a988f | ||
|
|
521bfc66f0 | ||
|
|
d473f3904a | ||
|
|
3f6296b619 | ||
|
|
f67a374444 | ||
|
|
74d09b5468 | ||
|
|
8435e3c856 | ||
|
|
6eaea38df7 | ||
|
|
5fb572abaf | ||
|
|
b495772118 | ||
|
|
7c939860d6 | ||
|
|
310420fda1 | ||
|
|
a679d2a0ed | ||
|
|
3f60107885 | ||
|
|
3c2e8cb71c | ||
|
|
cff55e91b0 | ||
|
|
005390f54b | ||
|
|
82ce848d24 | ||
|
|
dfdae7f046 | ||
|
|
7a7bad2aa3 | ||
|
|
8f438744cf | ||
|
|
460ccd9b34 | ||
|
|
0638d0b2d7 | ||
|
|
4c239b7eef | ||
|
|
ac8ddd58f0 | ||
|
|
b49308f0f1 | ||
|
|
b435171aa2 | ||
|
|
8e342e1db7 | ||
|
|
1ade6cdfa5 | ||
|
|
561ee5c72e | ||
|
|
143566fbf6 | ||
|
|
5e0f2e8572 | ||
|
|
350732d8dd | ||
|
|
d8da24804f | ||
|
|
15f8856f92 | ||
|
|
4ae61ad35a | ||
|
|
c2c5cc45fa | ||
|
|
7404e436d2 | ||
|
|
cc1560d3e3 | ||
|
|
4812437519 | ||
|
|
6df9bf36e5 | ||
|
|
53933d934d | ||
|
|
f108099623 | ||
|
|
7dd82a4a87 | ||
|
|
1a91b1bd42 | ||
|
|
439399b9f1 | ||
|
|
5e95d75f44 | ||
|
|
35deb4a512 | ||
|
|
19ac8e6e61 | ||
|
|
68a0506a40 | ||
|
|
0f9da18cbe | ||
|
|
acc4f31c3a | ||
|
|
2e4d1a7b44 | ||
|
|
ec7628924e | ||
|
|
4c849554da | ||
|
|
582a045457 | ||
|
|
4b2d98129e | ||
|
|
8ec99cb244 | ||
|
|
088dd8698e | ||
|
|
e9f4d2040b | ||
|
|
6d58836301 | ||
|
|
c81eaccfef | ||
|
|
b21100cc5d | ||
|
|
f6954c898d | ||
|
|
f1cea37814 | ||
|
|
911d97c0a3 | ||
|
|
4dc805d25a | ||
|
|
c691ef1899 | ||
|
|
04338335d0 | ||
|
|
4d9d315f10 | ||
|
|
eb3ddbcca7 | ||
|
|
13d11633ab | ||
|
|
c4572036b3 | ||
|
|
f0a8eaa5be | ||
|
|
93bf8d7414 | ||
|
|
2cbb2d7b6a | ||
|
|
ce23316008 | ||
|
|
c04dac65ac | ||
|
|
abba5a5d75 | ||
|
|
98b556cb1a | ||
|
|
488afd64d7 | ||
|
|
e2a7e60dad | ||
|
|
c17778ba47 | ||
|
|
753ba194fd | ||
|
|
f856782528 | ||
|
|
c9ff70b3cc | ||
|
|
6311abec2d | ||
|
|
1461d535d4 | ||
|
|
77d57b865d | ||
|
|
57a208d271 | ||
|
|
a26c9fca1e | ||
|
|
c679d18888 | ||
|
|
2a6372cabe | ||
|
|
22c710ed99 | ||
|
|
a14ff7820e | ||
|
|
a446b3c600 | ||
|
|
c8c4554299 | ||
|
|
6360ed52b2 | ||
|
|
9d8c867de8 | ||
|
|
571b8bbd88 | ||
|
|
b795950892 | ||
|
|
28c01f6476 | ||
|
|
117988d26d | ||
|
|
137770dc61 | ||
|
|
5d57237c3b | ||
|
|
9635ef5f16 | ||
|
|
bbec2c54ed | ||
|
|
c95b9ffc43 | ||
|
|
5336e98e18 | ||
|
|
1f4be42b3f | ||
|
|
6a1c88204a | ||
|
|
4f8e242dac | ||
|
|
89f616df88 | ||
|
|
0918b97e81 | ||
|
|
a8b7144d62 | ||
|
|
9bf97d9dcd | ||
|
|
343703c54f | ||
|
|
2ca8bcad5c | ||
|
|
9106c6ad52 | ||
|
|
2a4344ace3 | ||
|
|
a82c53dd2e | ||
|
|
1ac3611e6e | ||
|
|
c62f3c2898 | ||
|
|
b244118fd9 | ||
|
|
7164eaa8b1 | ||
|
|
a20aa472d6 | ||
|
|
1811153467 | ||
|
|
d003f9c6fd | ||
|
|
99844b4ca3 | ||
|
|
184fcab0b7 | ||
|
|
459e07834c | ||
|
|
c7e7f3b4c1 | ||
|
|
78a8ae3ba2 | ||
|
|
31527e8e87 | ||
|
|
c0008bf850 | ||
|
|
3b026ff0cc | ||
|
|
73b5ffa3ef | ||
|
|
55f0d0ab9f | ||
|
|
0cbd002667 | ||
|
|
5246f81dce | ||
|
|
56a9b8fa94 | ||
|
|
ab130900a1 | ||
|
|
d4b72ececc | ||
|
|
41b8ac32b3 | ||
|
|
7e0e4455b0 | ||
|
|
2127c00671 | ||
|
|
874fc741b5 | ||
|
|
605241f6e1 | ||
|
|
dac7b1c5b1 | ||
|
|
76cb1dc237 | ||
|
|
9440b09c66 | ||
|
|
6da0ceec9d | ||
|
|
bcb388ea9e | ||
|
|
288f1320a1 | ||
|
|
4aa461e317 | ||
|
|
54674158ca | ||
|
|
b02a884c16 | ||
|
|
91f0f21f45 | ||
|
|
44a0115b07 | ||
|
|
95bcd14c1d | ||
|
|
9e8c6aed4d | ||
|
|
f63b58edd9 | ||
|
|
ea47873db3 | ||
|
|
a608f98ca5 | ||
|
|
e84d0b9334 | ||
|
|
43b0a83b82 | ||
|
|
4f7e0941dc | ||
|
|
70a2e934f9 | ||
|
|
14801805ac | ||
|
|
54f2bb1daf | ||
|
|
75e380fe14 | ||
|
|
ec97d40242 | ||
|
|
7bb4f5591c | ||
|
|
4447366118 | ||
|
|
7140aa1015 | ||
|
|
16f9b2631e | ||
|
|
a6dee9ee0c | ||
|
|
89b4f84b0a | ||
|
|
09f4c21421 | ||
|
|
9fe10d087f | ||
|
|
12a95dfbc6 | ||
|
|
d9f82806ec | ||
|
|
455cd9c696 | ||
|
|
f695fa736d | ||
|
|
51f0a3f42a | ||
|
|
b7e953bc1a | ||
|
|
8b508bda9a | ||
|
|
b69e7fbe2c | ||
|
|
d5062ec5ae | ||
|
|
7143a8c806 | ||
|
|
b3d1c548e7 | ||
|
|
b28af56523 | ||
|
|
4a08d1d954 | ||
|
|
71d977908d | ||
|
|
cc0da7d8c6 | ||
|
|
b55d5c0e39 | ||
|
|
aafb65f888 | ||
|
|
12272dfb80 | ||
|
|
7e3848cc76 | ||
|
|
2ca50de41b | ||
|
|
9561fcea76 | ||
|
|
b9f45577a7 | ||
|
|
25dd806a18 | ||
|
|
6b23c71bb5 | ||
|
|
236332d8c7 | ||
|
|
de72d7ba13 | ||
|
|
ba6d73fc17 | ||
|
|
450d4b5a0a | ||
|
|
888b1fb021 | ||
|
|
958b032cea | ||
|
|
e9060a3ad9 | ||
|
|
78f43b6e13 | ||
|
|
bbaf7583e4 | ||
|
|
34cc115cdb | ||
|
|
93c6272fe2 | ||
|
|
25402c708e | ||
|
|
33cc635fcf | ||
|
|
129b3f9004 | ||
|
|
01344a991d | ||
|
|
060ac3bb4a | ||
|
|
95677e601a | ||
|
|
a97cc62d0a | ||
|
|
62260aa30b | ||
|
|
32457e83f0 | ||
|
|
2519486a02 | ||
|
|
bec3cc437d | ||
|
|
525a32f9f0 | ||
|
|
36f8f1902c | ||
|
|
bde7b1a828 | ||
|
|
9891b383e7 | ||
|
|
28bc87b873 | ||
|
|
9223173ef2 | ||
|
|
5e72416478 | ||
|
|
595e03c584 | ||
|
|
50a0c93cce | ||
|
|
e06cf70615 | ||
|
|
4c38b1a776 | ||
|
|
677c6d9f89 | ||
|
|
2743681392 | ||
|
|
aacf84f78a | ||
|
|
b95a9bb9b4 | ||
|
|
77541102af | ||
|
|
b337cf9f95 | ||
|
|
f914cb0248 | ||
|
|
c93828569b | ||
|
|
61993a032a | ||
|
|
b99c14b910 | ||
|
|
8aa0185cb8 | ||
|
|
2a1161bff4 | ||
|
|
067b495212 | ||
|
|
894369cc73 | ||
|
|
9a86accc62 | ||
|
|
77be268a70 | ||
|
|
1f051d7a9f | ||
|
|
652b6ae7d2 | ||
|
|
57a5b09328 | ||
|
|
9b806f2690 | ||
|
|
1b56a8b696 | ||
|
|
5a5d2c770c | ||
|
|
a5d06bde03 | ||
|
|
15103ac7fb | ||
|
|
439e735d4b | ||
|
|
7f5df308ad | ||
|
|
2f97baadc6 | ||
|
|
c2863156cd | ||
|
|
75762d64c6 | ||
|
|
8209cffcd0 | ||
|
|
70976460ff | ||
|
|
954155b090 | ||
|
|
5265bc20f1 | ||
|
|
af60a4d407 | ||
|
|
c9a6dc4fab | ||
|
|
9c647dc57a | ||
|
|
52e688df9b | ||
|
|
87f12c7d5a | ||
|
|
e9e9b13df0 | ||
|
|
7ee9c4fb30 | ||
|
|
e43fd0c48a | ||
|
|
27bed22fee | ||
|
|
aae69fa599 | ||
|
|
8abe138150 | ||
|
|
dccb23bb80 | ||
|
|
5e4bf0f019 | ||
|
|
f87c56af5c | ||
|
|
5565aab488 | ||
|
|
dbe6b9dacb | ||
|
|
dd866718b9 | ||
|
|
116c616561 | ||
|
|
084e3df8f7 | ||
|
|
36e421eb5f | ||
|
|
a5b01c3f6f | ||
|
|
f1836c281c | ||
|
|
292289d16d | ||
|
|
4e3bdf0925 | ||
|
|
b17475f013 | ||
|
|
ecea0f90d4 | ||
|
|
a4bf85b1b6 | ||
|
|
d215d31349 | ||
|
|
e4e24399d9 | ||
|
|
8f9d132ed6 | ||
|
|
e651511c35 | ||
|
|
2ecda17618 | ||
|
|
db03b5b102 | ||
|
|
9fd9a7bc10 | ||
|
|
eda9faf956 | ||
|
|
cf70678188 | ||
|
|
b23988c947 | ||
|
|
06f6e75d5a | ||
|
|
c9854b35e2 | ||
|
|
71e4ada39a | ||
|
|
d04d8c3a1d | ||
|
|
283faf7a2f | ||
|
|
0299ff0a79 | ||
|
|
4ee65822aa | ||
|
|
e7ca6c16ff | ||
|
|
771bf78576 | ||
|
|
b9fa2f4125 | ||
|
|
e5b22684cd | ||
|
|
43d37ab1cf | ||
|
|
1fc142a59f | ||
|
|
c4ad95760a | ||
|
|
f0ed170b04 | ||
|
|
38d4b5be1a | ||
|
|
5a7d770a58 | ||
|
|
c8f652aaa8 | ||
|
|
336793b2a1 | ||
|
|
c29ea2e679 | ||
|
|
3b6f05800d | ||
|
|
dda824856a | ||
|
|
474ab586f8 | ||
|
|
6bef35d8ef | ||
|
|
ad12660019 | ||
|
|
016da1d37d | ||
|
|
4e12f959fc | ||
|
|
1c06e9d683 | ||
|
|
01d7a33230 | ||
|
|
d92f5621aa | ||
|
|
8fdc61e227 | ||
|
|
9825b161ff | ||
|
|
108a50f3bb | ||
|
|
95b7e4f9ad | ||
|
|
a526386fbb | ||
|
|
3fb3453166 | ||
|
|
8dd0fe3c40 | ||
|
|
b1f0797a1f | ||
|
|
416e355495 | ||
|
|
62acc18e7d | ||
|
|
06d80032fe | ||
|
|
4e795c81f4 | ||
|
|
718ba719ca | ||
|
|
a5ed3ca446 | ||
|
|
3a93c50e38 | ||
|
|
654f673def | ||
|
|
1111382b53 | ||
|
|
1e605cdf0f | ||
|
|
2c27f422d9 | ||
|
|
f53a2f1b94 | ||
|
|
4fb40a6af7 | ||
|
|
6f6f5738fa | ||
|
|
40aacbf279 | ||
|
|
9ea3bfb7c7 | ||
|
|
dc2d52fc09 | ||
|
|
7dcebd51ab | ||
|
|
9ef5769f93 | ||
|
|
d12b197ec9 | ||
|
|
c5b55fa476 | ||
|
|
355fcced55 | ||
|
|
701fb1378e | ||
|
|
b120c34177 | ||
|
|
c23caf899f | ||
|
|
52c30e588c | ||
|
|
9da8f4d35b | ||
|
|
1b89189efa | ||
|
|
e53c5097f9 | ||
|
|
cb675300b1 | ||
|
|
c6a1f42c44 | ||
|
|
dbda90b15b | ||
|
|
29a04d9d83 | ||
|
|
0a6dc68d13 | ||
|
|
a1a85d08af | ||
|
|
601eec7da5 | ||
|
|
a54f3c8c7f | ||
|
|
17478491e9 | ||
|
|
245cf6d2e0 | ||
|
|
71af9741cc | ||
|
|
0503b64205 | ||
|
|
c9d4cac3ff | ||
|
|
a2932a0393 | ||
|
|
6917303e1b | ||
|
|
f685363574 | ||
|
|
03c19ccae9 | ||
|
|
7313b4b649 | ||
|
|
ff439369da | ||
|
|
24e470a099 | ||
|
|
8e72ddde32 | ||
|
|
07a7ea1f23 | ||
|
|
3c854d4af9 | ||
|
|
7f3f011104 | ||
|
|
a5cfae4b33 | ||
|
|
516649a508 | ||
|
|
abe23250c4 | ||
|
|
0f575907c7 | ||
|
|
835a3f6149 | ||
|
|
b93ef22687 | ||
|
|
bfd927d395 | ||
|
|
cb79302867 | ||
|
|
211d6f4005 | ||
|
|
ddee6d2b6a | ||
|
|
575c34467f | ||
|
|
dc8c27b1f9 | ||
|
|
4639ec87d2 | ||
|
|
50079670f9 | ||
|
|
ae12e65712 | ||
|
|
2f9be335cb | ||
|
|
9e59d927f2 | ||
|
|
ced3e5fec8 | ||
|
|
50eb523d8e | ||
|
|
d6baf1b32a | ||
|
|
60b8dfaa2d | ||
|
|
815f398ada | ||
|
|
56ed31ed6f | ||
|
|
3213fbff8b | ||
|
|
4bca9c63da | ||
|
|
01fe70a29a | ||
|
|
e43804d950 | ||
|
|
17206fc538 | ||
|
|
8cda6ede84 | ||
|
|
a6ec038189 | ||
|
|
ffaf6c14e4 | ||
|
|
3a6915c0b6 | ||
|
|
93a8c83a68 | ||
|
|
1302addcdd | ||
|
|
490cbd3f0d | ||
|
|
631355d788 | ||
|
|
ec1ab05ae6 | ||
|
|
f5f26f334f | ||
|
|
dba579b546 | ||
|
|
fa68b8bb35 | ||
|
|
ceb84ce020 | ||
|
|
68aa7fa3a4 | ||
|
|
70cd0655ed | ||
|
|
956ee06ea6 | ||
|
|
e15e34db93 | ||
|
|
3c23de9735 | ||
|
|
91da46dd63 | ||
|
|
4d280ff010 | ||
|
|
0297dd2664 | ||
|
|
56e328f31f | ||
|
|
ac2c1e019f | ||
|
|
56073fd522 | ||
|
|
07f6572816 | ||
|
|
8a018aa0f2 | ||
|
|
936d5821f9 | ||
|
|
04493035cd | ||
|
|
08064c4243 | ||
|
|
ed1c2cb596 | ||
|
|
212e0e624f | ||
|
|
e8af778962 | ||
|
|
26dba53d99 | ||
|
|
1c6a64caf2 | ||
|
|
f7a6241ac0 | ||
|
|
b6453383cf | ||
|
|
615c6cb388 | ||
|
|
31f890d55c | ||
|
|
567c09850c | ||
|
|
8d076efd71 | ||
|
|
062126c43d | ||
|
|
f9667cd80f | ||
|
|
65c2f58a66 | ||
|
|
030b945828 | ||
|
|
fd4240b774 | ||
|
|
8c0e022b44 | ||
|
|
da8e75f98a | ||
|
|
a1d2208bf3 | ||
|
|
b6b76eb137 | ||
|
|
19b16fe796 | ||
|
|
fec1553041 | ||
|
|
bc2f693c55 | ||
|
|
594ae20a6e | ||
|
|
14388f4bb1 | ||
|
|
369e6d1e61 | ||
|
|
789200d454 | ||
|
|
dcfab0f4dd | ||
|
|
9677ed9e2d | ||
|
|
a4ece6c1c5 | ||
|
|
e34396015f | ||
|
|
64e3310376 | ||
|
|
a955d8f890 | ||
|
|
bbc9532444 | ||
|
|
389afde138 | ||
|
|
fe5d9e486b | ||
|
|
6959e140af | ||
|
|
3a9306a9c2 | ||
|
|
cd23899e02 | ||
|
|
5a9fa66b04 | ||
|
|
1866244a2a | ||
|
|
5d4583c77f | ||
|
|
66ee81c55f | ||
|
|
9a2321a669 | ||
|
|
1878e39dfc | ||
|
|
2b9960e05f | ||
|
|
c2e34cd0f5 | ||
|
|
78bb5e09e5 | ||
|
|
e8c7ffa872 | ||
|
|
557a3f0896 | ||
|
|
b2af5390fb | ||
|
|
eb6c901527 | ||
|
|
d5a9cbe5a3 | ||
|
|
0658581bcd | ||
|
|
26c3f5a2cc | ||
|
|
34a60d7661 | ||
|
|
ea0cd80ea7 | ||
|
|
11d35c8410 | ||
|
|
38359e176f | ||
|
|
e54d9cf629 | ||
|
|
deccf8891d | ||
|
|
e5ac551795 | ||
|
|
7684f79e64 | ||
|
|
9fdab327c8 | ||
|
|
1908af6f54 | ||
|
|
a677608f1d | ||
|
|
93d462e028 | ||
|
|
661553da68 | ||
|
|
b4203992bf | ||
|
|
686ee1e349 | ||
|
|
9e8c9e897f | ||
|
|
06ceb5e68d | ||
|
|
dc2f9c304d | ||
|
|
462d5c3b12 | ||
|
|
39e90a20da | ||
|
|
b40014d709 | ||
|
|
2bdc229a9a | ||
|
|
61684830bf | ||
|
|
e93a0556e7 | ||
|
|
12668b78b9 | ||
|
|
8255088508 | ||
|
|
e66f7f012e | ||
|
|
3e38da2120 | ||
|
|
f2e7c82231 | ||
|
|
20e56d7dfa | ||
|
|
13225faa9e | ||
|
|
99cb752c71 | ||
|
|
5da4ced8c1 | ||
|
|
e363a21619 | ||
|
|
09efbaf621 | ||
|
|
31027047e3 | ||
|
|
629eb4ca90 | ||
|
|
c4e6e5eca4 | ||
|
|
ea72d41e6d | ||
|
|
c0f5b04472 | ||
|
|
532b32dab5 | ||
|
|
fb5c96731a | ||
|
|
3f8eb8cb6b | ||
|
|
89dc64ab66 | ||
|
|
6968cff2b6 | ||
|
|
c390e9e877 | ||
|
|
dee47ec978 | ||
|
|
fce2a16e42 | ||
|
|
5242672efb | ||
|
|
5c043dd908 | ||
|
|
19ed03c44c | ||
|
|
32b2ee8cab | ||
|
|
7e9ab546eb | ||
|
|
2af1f9a9d3 | ||
|
|
b6d6d3c980 | ||
|
|
c655cfaca8 | ||
|
|
b3a465dbca | ||
|
|
33d3bc53b4 | ||
|
|
be9da3928b | ||
|
|
a9fd557c4e | ||
|
|
faac22f6ed | ||
|
|
35a47093ab | ||
|
|
01a2d90e38 | ||
|
|
1cc2e74a03 | ||
|
|
ca86ab71f2 | ||
|
|
ee425d278c | ||
|
|
1c3c2b6a74 | ||
|
|
9952f7734a | ||
|
|
2ffb2988bf | ||
|
|
fda1d7c4c5 | ||
|
|
19519ac74e | ||
|
|
eb3f62fd90 | ||
|
|
891b362e7d | ||
|
|
cbb69bd3cb | ||
|
|
200a3e5e8c | ||
|
|
0fab2dc24f | ||
|
|
a48654f195 | ||
|
|
174b098724 | ||
|
|
ecb4671e0d | ||
|
|
6c6f6838ee | ||
|
|
b4414758a7 | ||
|
|
5b37536ce5 | ||
|
|
3365fa174d | ||
|
|
d42b95bab9 | ||
|
|
6a3aaf360e | ||
|
|
083d0c90e2 | ||
|
|
fed142dad2 | ||
|
|
fcd2126330 | ||
|
|
e5cd0ced53 | ||
|
|
06dad7865c | ||
|
|
6915634729 | ||
|
|
d3647e2e8a | ||
|
|
217bd1f4bf | ||
|
|
75fe500305 | ||
|
|
1e400624e0 | ||
|
|
b190a0eaba | ||
|
|
afc779440a | ||
|
|
7f71717a9f | ||
|
|
b9931da241 | ||
|
|
eaf0d5e0a0 | ||
|
|
832206ef80 | ||
|
|
85d4f2843e | ||
|
|
0849aa3f03 | ||
|
|
4cdeb214a7 | ||
|
|
3c727bc46f | ||
|
|
955ccfae88 | ||
|
|
e13662dd2c | ||
|
|
2840c98bb0 | ||
|
|
7d9bf83f66 | ||
|
|
d2c47bb153 | ||
|
|
9da3402997 | ||
|
|
e7784e3c34 | ||
|
|
224d6dc93f | ||
|
|
f95b5d05d7 | ||
|
|
ee109c2279 | ||
|
|
e515c7beb1 | ||
|
|
5f56db6f6e | ||
|
|
c00b204259 | ||
|
|
280c89a78d | ||
|
|
809ba2b392 | ||
|
|
18254392ab | ||
|
|
5646518352 | ||
|
|
710b88efae | ||
|
|
1118c3399c | ||
|
|
98a7800fae | ||
|
|
b3f9bbe50f | ||
|
|
e37c7e58cf | ||
|
|
feb9ffadec | ||
|
|
a4d96b032e | ||
|
|
038d70a40b | ||
|
|
44d5009538 | ||
|
|
8e1e7fb314 | ||
|
|
dbbfbb2855 | ||
|
|
24ed979faf | ||
|
|
e64a65c41e | ||
|
|
67c2fe8005 | ||
|
|
d3d15b79fb | ||
|
|
60586d8ce0 | ||
|
|
c95257f32c | ||
|
|
f0162557c5 | ||
|
|
5f257119d6 | ||
|
|
e6df4f24f4 | ||
|
|
d4b733ff16 | ||
|
|
3c72d28511 | ||
|
|
e4b63a68fd | ||
|
|
a251029546 | ||
|
|
b5d457daa9 | ||
|
|
603f2a2154 | ||
|
|
4f40c96d19 | ||
|
|
d7fc658bae | ||
|
|
08dd2bd93d | ||
|
|
10b8a33b55 | ||
|
|
bd0210cdce | ||
|
|
5677523800 | ||
|
|
2150933368 | ||
|
|
fd7dbaf0a7 | ||
|
|
d145310447 | ||
|
|
9d413680d9 | ||
|
|
0e85c814e1 | ||
|
|
3589bb9597 | ||
|
|
10b06eda91 | ||
|
|
145d337db9 | ||
|
|
1d59ae24c6 | ||
|
|
6309dd1350 | ||
|
|
0ae001ed6d | ||
|
|
bb8efadb98 | ||
|
|
620c894929 | ||
|
|
18d2a7fe4d | ||
|
|
78e74cda28 | ||
|
|
cc9c69c931 | ||
|
|
6559cfd0e1 | ||
|
|
28dcc781b4 | ||
|
|
09f10d2d7e | ||
|
|
8492503d4f | ||
|
|
c48b9b34e9 | ||
|
|
04b4da0c75 | ||
|
|
276b171d93 | ||
|
|
44675739a1 | ||
|
|
6e13718cbd | ||
|
|
2bb6922e7f | ||
|
|
67e167427c | ||
|
|
969a4e7ba5 | ||
|
|
a5aa38ce3c | ||
|
|
0495103635 | ||
|
|
ae6b75b62a | ||
|
|
9091d686ed | ||
|
|
47b5d7a2df | ||
|
|
6298a7a357 | ||
|
|
45c63e2b82 | ||
|
|
dba617a7fe | ||
|
|
4a253a7760 | ||
|
|
bd11663e0a | ||
|
|
7c4bff567b | ||
|
|
df2a5e97f8 | ||
|
|
e9e5c75dec | ||
|
|
21e4387a39 | ||
|
|
67ef829e04 | ||
|
|
8b2b9713ce | ||
|
|
b7f998094f | ||
|
|
c324200f70 | ||
|
|
db3377e170 | ||
|
|
85a8feec9d | ||
|
|
22b0ddfb42 | ||
|
|
1cc94f8353 | ||
|
|
7d2a7d24a6 | ||
|
|
73056f5620 | ||
|
|
2c271acfe9 | ||
|
|
b76e833ea5 | ||
|
|
3bdb9f289f | ||
|
|
97b8684e1a | ||
|
|
8958b2aa1b | ||
|
|
cf0fb69153 | ||
|
|
8603cf89b0 | ||
|
|
39ef0107ad | ||
|
|
63d7b63f42 | ||
|
|
4ea6c98f43 | ||
|
|
39bdf261c6 | ||
|
|
cb3e13e9e5 | ||
|
|
7a7e8fe741 | ||
|
|
4a9e691747 | ||
|
|
4026c57834 | ||
|
|
f1c05bc909 | ||
|
|
18d3b3545d | ||
|
|
a03d9fba10 | ||
|
|
ef24020b14 | ||
|
|
d16d969799 | ||
|
|
232f1fda6d | ||
|
|
c1fd7fdad0 | ||
|
|
9470a4f1ed | ||
|
|
9da027cf74 | ||
|
|
45e9988700 | ||
|
|
1f9b4703e8 | ||
|
|
c21b61bbd2 | ||
|
|
61249b0887 | ||
|
|
0ac48a431a | ||
|
|
7b15fefcaa | ||
|
|
6d076284e8 | ||
|
|
d7d248fd04 | ||
|
|
a636aa592b | ||
|
|
1fc6603f41 | ||
|
|
d36a233cbf | ||
|
|
2a11f42318 | ||
|
|
e23383be41 | ||
|
|
36a47febc2 | ||
|
|
053a86c0d4 | ||
|
|
3ded1b6c6e | ||
|
|
28ea68fe7f | ||
|
|
6203c27244 | ||
|
|
57fb800c77 | ||
|
|
9a3ec31191 | ||
|
|
8ef3aee7e7 | ||
|
|
a20e6086cc | ||
|
|
66fa8a7595 | ||
|
|
a8f9e3f0b0 | ||
|
|
215905213b | ||
|
|
f8865c1413 | ||
|
|
67aed51742 | ||
|
|
2be2b10e59 | ||
|
|
ed5e194b8e | ||
|
|
a6b4cb24b8 | ||
|
|
4276fc0b0b | ||
|
|
0d10957441 | ||
|
|
368720538c | ||
|
|
d068a460bd | ||
|
|
346ff199c6 | ||
|
|
480a4a9d38 | ||
|
|
77cfd0e1a6 | ||
|
|
950af2e753 | ||
|
|
aa2845a730 | ||
|
|
aedf066337 | ||
|
|
b975cf3ed4 | ||
|
|
f2af5ce7eb | ||
|
|
fa612b731c | ||
|
|
0933268e61 | ||
|
|
3aa5fc0cc2 | ||
|
|
397f57accb | ||
|
|
e3b1944e31 | ||
|
|
507582f40b | ||
|
|
08e015a951 | ||
|
|
ef17f4eacb | ||
|
|
3d185dc622 | ||
|
|
76b4b88e4b | ||
|
|
fd37edc53f | ||
|
|
5662c06a33 | ||
|
|
0aede618ec | ||
|
|
e52d4ce033 | ||
|
|
b646672d3e | ||
|
|
a1a7d44fd7 | ||
|
|
25ea221a6a | ||
|
|
38ee4f556e | ||
|
|
862f20ef20 | ||
|
|
5c902001b9 | ||
|
|
5f6887b316 | ||
|
|
45b96bd568 | ||
|
|
197d006860 | ||
|
|
49f8aac6a9 | ||
|
|
22dd50a047 | ||
|
|
81d9b5afd6 | ||
|
|
59f3d2a11e | ||
|
|
134a170a61 | ||
|
|
681f006ae1 | ||
|
|
36abfcc79b | ||
|
|
249a14f84a | ||
|
|
10fdc45dea | ||
|
|
e8e7b419b5 | ||
|
|
955fc58773 | ||
|
|
2da3d83420 | ||
|
|
c3f2e8dde1 | ||
|
|
4e4c80b7fa | ||
|
|
3e776c8c41 | ||
|
|
7c82e4b6c1 | ||
|
|
12d26d5a3d | ||
|
|
d228769b1b | ||
|
|
433f88b459 | ||
|
|
704d56d193 | ||
|
|
5f4da6e0bc | ||
|
|
0ce89d53d7 | ||
|
|
5bdffd7d20 | ||
|
|
5996920249 | ||
|
|
f0119085e4 | ||
|
|
22e17172dd | ||
|
|
6ec731e263 | ||
|
|
7cd8b6f938 | ||
|
|
a4a19845d4 | ||
|
|
fffb0eafde | ||
|
|
10f60e2807 | ||
|
|
3db27e6017 | ||
|
|
91b64798bb | ||
|
|
8455db6fae | ||
|
|
530648e937 | ||
|
|
7f67435cb9 | ||
|
|
d8eba411ec | ||
|
|
dcfa903176 | ||
|
|
fc70a8e145 | ||
|
|
e4a2d7dfb7 | ||
|
|
f081527731 | ||
|
|
9f8a0234aa | ||
|
|
857c860952 | ||
|
|
cff68fc062 | ||
|
|
365c741864 | ||
|
|
366f9db8a8 | ||
|
|
9d5303c59d | ||
|
|
c527392e21 | ||
|
|
933cc333cc | ||
|
|
e72c3b2c86 | ||
|
|
231c849451 | ||
|
|
a5af248715 | ||
|
|
8fede48e7b | ||
|
|
d0492ec7bd | ||
|
|
b5399202b6 | ||
|
|
240077ffe8 | ||
|
|
eee9a1661f | ||
|
|
9199546dca | ||
|
|
e0d97d44aa | ||
|
|
5fbb69e7c5 | ||
|
|
3a6aa8f820 | ||
|
|
44ae5c86a7 | ||
|
|
85f47e1693 | ||
|
|
9a96f8b155 | ||
|
|
391dc06013 | ||
|
|
598b392878 | ||
|
|
9e75993658 | ||
|
|
159a3a3706 | ||
|
|
cbdb2e6e6f | ||
|
|
d409da2201 | ||
|
|
c7aa67b07a | ||
|
|
5b302ae2e6 | ||
|
|
df2925e51c | ||
|
|
02b19fed27 | ||
|
|
17f06564a2 | ||
|
|
6ddd394e33 | ||
|
|
d3f78299e7 | ||
|
|
3e76b2374c | ||
|
|
a3b97f7c24 | ||
|
|
4f50e36e5b | ||
|
|
a0bbbe1404 | ||
|
|
50f983871b | ||
|
|
2d3b02df6a | ||
|
|
4010c89899 | ||
|
|
215e930da4 | ||
|
|
5b74d75011 | ||
|
|
9266eaef16 | ||
|
|
963a0ce6ef | ||
|
|
5f5e453fb3 | ||
|
|
0cacd111df | ||
|
|
d86a7ccf3e | ||
|
|
35ea4d1a00 | ||
|
|
10583610bd | ||
|
|
55816a09fe | ||
|
|
ad288be2ee | ||
|
|
c9071ff724 | ||
|
|
96b8dce982 | ||
|
|
1e498eccb6 | ||
|
|
da048cbc7b | ||
|
|
7bd5529bb7 | ||
|
|
1b64af143e | ||
|
|
d2685f2544 | ||
|
|
83c6aef078 | ||
|
|
a9570f7298 | ||
|
|
71e0a788d1 | ||
|
|
e6910d3c52 | ||
|
|
9a6e4ba77f | ||
|
|
bab4649a1e | ||
|
|
5a763230e5 | ||
|
|
09e6804761 | ||
|
|
a414aa27b6 | ||
|
|
c598fd9ec4 | ||
|
|
a8eeb7f76a | ||
|
|
d28e3374c7 | ||
|
|
c3e9ae0ca0 | ||
|
|
71cfec91af | ||
|
|
b085222253 | ||
|
|
29b6e00071 | ||
|
|
9aacc85a16 | ||
|
|
aa32d454c9 | ||
|
|
d3b69abd87 | ||
|
|
df88300e6e | ||
|
|
e90ed7a853 | ||
|
|
fdaf13bdc4 | ||
|
|
d96d40e0b0 | ||
|
|
5dae0c14d9 | ||
|
|
5cd54c4831 | ||
|
|
4caa02474c | ||
|
|
005defbb5c | ||
|
|
061045016f | ||
|
|
997353ab71 | ||
|
|
1570ed4610 | ||
|
|
25e2d78311 | ||
|
|
1e2d014ac9 | ||
|
|
a0b1d16e79 | ||
|
|
6985391437 | ||
|
|
e90f58a0a7 | ||
|
|
0555fca5d8 | ||
|
|
2a55e74e11 | ||
|
|
94ace2348f | ||
|
|
2b58a2a176 | ||
|
|
7bc82365c6 | ||
|
|
de11dc43ab | ||
|
|
756927b6f8 | ||
|
|
5693c69457 | ||
|
|
cda41a1506 | ||
|
|
890298457a | ||
|
|
ccfc7351e7 | ||
|
|
df6c5dd22e | ||
|
|
60f23c838b | ||
|
|
dcd807c49b | ||
|
|
575b921a15 | ||
|
|
67473f07b1 | ||
|
|
3aa368b630 | ||
|
|
4e044d66b4 | ||
|
|
065a5d2a47 | ||
|
|
5103da09c5 | ||
|
|
33ea1d44fb | ||
|
|
e62027b73c | ||
|
|
26c43667aa | ||
|
|
92fbc26852 | ||
|
|
a4e488a1eb | ||
|
|
0ee9c69ddf | ||
|
|
dd5e6c18d5 | ||
|
|
737e95c3f9 | ||
|
|
4b064dc19f | ||
|
|
f2e5c913d6 | ||
|
|
8758bd57ca | ||
|
|
73e31373a8 | ||
|
|
990e620dc7 | ||
|
|
9103e58314 | ||
|
|
a26fe71171 | ||
|
|
7a44e46d6d | ||
|
|
b376e4da1f | ||
|
|
f8481f8d4c | ||
|
|
54f55cc021 | ||
|
|
a7a4f38d58 | ||
|
|
d67e49400f | ||
|
|
6789f2c1e3 | ||
|
|
e8a3ffcb41 | ||
|
|
9607c743a0 | ||
|
|
553b964ab8 | ||
|
|
72ac408429 | ||
|
|
8456905960 | ||
|
|
13261c974a | ||
|
|
eafabdce36 | ||
|
|
d02a57744c | ||
|
|
58374add90 | ||
|
|
a52d501ba2 | ||
|
|
702abbad6d | ||
|
|
2d0edb5270 | ||
|
|
7aab34b540 | ||
|
|
d637a13f59 | ||
|
|
17f99aeed8 | ||
|
|
8729414da9 | ||
|
|
cd8b7e5528 | ||
|
|
6d74c5663f | ||
|
|
5ccca5e329 | ||
|
|
6c7b7b796e | ||
|
|
4ee3cea6ce | ||
|
|
1c07e550bb | ||
|
|
50c71ebb01 | ||
|
|
348d086c11 | ||
|
|
89c1853977 | ||
|
|
3acff54837 | ||
|
|
c7466f7a1a | ||
|
|
6420ad9f69 | ||
|
|
b30823d5ac | ||
|
|
864472d648 | ||
|
|
36b02ec008 | ||
|
|
aad080aa1b | ||
|
|
7b7a6e10f8 | ||
|
|
aeccf92375 | ||
|
|
f90d271739 | ||
|
|
9c2fde940d | ||
|
|
2b57cc6be8 | ||
|
|
b62819e3fb | ||
|
|
3eb5f2c65b | ||
|
|
41be7f951c | ||
|
|
7812fdb6ed | ||
|
|
4eeb2a0583 | ||
|
|
3dd0c537ee | ||
|
|
e0aa42f695 | ||
|
|
5dddf2f757 | ||
|
|
f8137ea7c1 | ||
|
|
cf6f1a083e | ||
|
|
f9cfeacc67 | ||
|
|
98229a47b2 | ||
|
|
530ace1507 | ||
|
|
792c657ff2 | ||
|
|
5aa07439a8 | ||
|
|
bf2862f164 | ||
|
|
d9ef227435 | ||
|
|
324c845dc4 | ||
|
|
5d0c44e84b | ||
|
|
01a71c3dbb | ||
|
|
b018f026e3 | ||
|
|
0a38e3557d | ||
|
|
6f450272b8 | ||
|
|
7e01f9be6e | ||
|
|
00d2a1fe9f | ||
|
|
18d0d435c6 | ||
|
|
f298c154e2 | ||
|
|
822df37f8c | ||
|
|
73cac95255 | ||
|
|
a0e7789d50 | ||
|
|
c825b37cc6 | ||
|
|
2dd4aa31e5 | ||
|
|
c95adfaf74 | ||
|
|
9da8ea5967 | ||
|
|
4d5ecc5518 | ||
|
|
963a0fcd77 | ||
|
|
fbd8dfa5be | ||
|
|
c43f791b29 | ||
|
|
39b873cd5f | ||
|
|
ec90537181 | ||
|
|
4709195a1d | ||
|
|
0082c23a90 | ||
|
|
c7b559f449 | ||
|
|
d571c7e08e | ||
|
|
b6f0b25f24 | ||
|
|
5ea6bd5980 | ||
|
|
ea29b67c5c | ||
|
|
1f851bc04c | ||
|
|
0921007d92 | ||
|
|
4a2e0bfa00 | ||
|
|
8ebc587fb5 | ||
|
|
c7b46f4fba | ||
|
|
4ad354a561 | ||
|
|
587592449a | ||
|
|
425b071a50 | ||
|
|
4dd72e6793 | ||
|
|
d2d4a24229 | ||
|
|
4805394e61 | ||
|
|
5cbd723f8d | ||
|
|
28153656d7 | ||
|
|
d2eaf16751 | ||
|
|
e0d98b2e14 | ||
|
|
c38f053294 | ||
|
|
921d274579 | ||
|
|
c9f95a1866 | ||
|
|
99469f8404 | ||
|
|
417d2c0336 | ||
|
|
2a3de1a090 | ||
|
|
d9318c5af3 | ||
|
|
0e02cf5c86 | ||
|
|
45277affe8 | ||
|
|
c564a843fa | ||
|
|
efa810da91 | ||
|
|
c0e1c90497 | ||
|
|
b1bfdec473 | ||
|
|
244f423baf | ||
|
|
8897b32cd3 | ||
|
|
5493fadc9e | ||
|
|
eade3d0a2d | ||
|
|
36f9eca33e | ||
|
|
4dd90e56b1 | ||
|
|
5e7484a12d | ||
|
|
fdbc44e41b | ||
|
|
e0d16dcb22 | ||
|
|
0a5ee0634f | ||
|
|
fa1331ffd5 | ||
|
|
57b5b9a7a6 | ||
|
|
58fbfc3c38 | ||
|
|
0af5e0b795 | ||
|
|
d7771eb4b6 | ||
|
|
fc0902c290 | ||
|
|
75890f88fa | ||
|
|
9a6b07e1e1 | ||
|
|
ce02d1dc98 | ||
|
|
7760e63b47 | ||
|
|
a483f2466f | ||
|
|
48c345a403 | ||
|
|
82b79aa332 | ||
|
|
ffbf9f265f | ||
|
|
144f65c459 | ||
|
|
18204586e1 | ||
|
|
1f3c970e7a | ||
|
|
1cfd93640c | ||
|
|
553ea4971f | ||
|
|
ac8b01a94c | ||
|
|
b3934c9788 | ||
|
|
37ae863443 | ||
|
|
f57356006d | ||
|
|
591a104c80 | ||
|
|
38097c9095 | ||
|
|
7f31e624ca | ||
|
|
e6fbfcb1e8 | ||
|
|
00687f21cd | ||
|
|
96fc0d043e | ||
|
|
190353785e | ||
|
|
f54adb4a3e | ||
|
|
f2a5d92398 | ||
|
|
b14c768fa2 | ||
|
|
851d2f2d91 | ||
|
|
4e6aad5115 | ||
|
|
7bd1408de0 | ||
|
|
d63eb396e1 | ||
|
|
465e99ab5d | ||
|
|
33916cfbd3 | ||
|
|
a1626927cc | ||
|
|
75e2abe242 | ||
|
|
2db8075e3f | ||
|
|
413876644c | ||
|
|
d5e9f2e23e | ||
|
|
bc59d015e6 | ||
|
|
2decf94ad0 | ||
|
|
b52744ae18 | ||
|
|
6cbbf0af2f | ||
|
|
5d7ef149aa | ||
|
|
7ce0974767 | ||
|
|
7b12c7a07d | ||
|
|
728e3fd2f0 | ||
|
|
4eedeebd46 | ||
|
|
85fb12155b | ||
|
|
f99daa696e | ||
|
|
b4f9dd46a9 | ||
|
|
ffe16f89bb | ||
|
|
7604d92d5c | ||
|
|
3abd77a1e6 | ||
|
|
d96b79a9ba | ||
|
|
14bb888c21 | ||
|
|
c8f59ea1a7 | ||
|
|
233520b797 | ||
|
|
061d31af33 | ||
|
|
ec742d3180 | ||
|
|
1bc62cfba4 | ||
|
|
028d9a2667 | ||
|
|
d53e00ffe0 | ||
|
|
b90fcc1b71 | ||
|
|
a4e7305d52 | ||
|
|
a3378f8d03 | ||
|
|
5716d163ec | ||
|
|
42ef035241 | ||
|
|
b6157195b3 | ||
|
|
b8ee68034d | ||
|
|
6598b1b10d | ||
|
|
4ff4058244 | ||
|
|
dddd5af830 | ||
|
|
26fac9507e | ||
|
|
1f1c9698ce | ||
|
|
56f7459617 | ||
|
|
86604b5de1 | ||
|
|
0544dbe891 | ||
|
|
6365cea0b2 | ||
|
|
7fef13346e | ||
|
|
81216e6ece | ||
|
|
1d0b305332 | ||
|
|
c10ccc011f | ||
|
|
3fe7995060 | ||
|
|
c441d04e8a | ||
|
|
52d84a99ac | ||
|
|
fcf20215a6 | ||
|
|
aa2f9622f8 | ||
|
|
1811318dea | ||
|
|
5eb50cb2b6 | ||
|
|
f6ef6ff7db | ||
|
|
2f33a80e1e | ||
|
|
363d49b655 | ||
|
|
de8c6d5572 | ||
|
|
9406bda93d | ||
|
|
d17a447a5f | ||
|
|
5b4e95484e | ||
|
|
bebea41e19 | ||
|
|
442474fc44 | ||
|
|
0d9112a4c1 | ||
|
|
d504e00e18 | ||
|
|
74c8e7fad9 | ||
|
|
4b781d3827 | ||
|
|
9fbcc5c32d | ||
|
|
c7ec8190fb | ||
|
|
b73a6d84ee | ||
|
|
2eaa7f1ab6 | ||
|
|
608445e64f | ||
|
|
1f4be77662 | ||
|
|
0deae4abf9 | ||
|
|
5b2f9351c7 | ||
|
|
6fdf30357c | ||
|
|
cf5d7478fc | ||
|
|
9a0df5afb0 | ||
|
|
813b2fcb38 | ||
|
|
08cbc0f187 | ||
|
|
d8251c8f79 | ||
|
|
5ea70baa6f | ||
|
|
d23ce9fb63 | ||
|
|
ddf8016a0c | ||
|
|
ab191abd5a | ||
|
|
c2e5e94b37 | ||
|
|
6a9b251be1 | ||
|
|
6b5185abfb | ||
|
|
2a41280076 | ||
|
|
91d986970b | ||
|
|
b4192bba7a | ||
|
|
9fe0aa0604 | ||
|
|
fc528749f8 | ||
|
|
5c71a3c85b | ||
|
|
94e768dd01 | ||
|
|
0fb91d6bcc | ||
|
|
02854881b4 | ||
|
|
4254781391 | ||
|
|
31f4f4096e | ||
|
|
e95e016378 | ||
|
|
c337c9128c | ||
|
|
5a38562bfc | ||
|
|
a3dd0e5f7d | ||
|
|
fcd1e106a5 | ||
|
|
346328156a | ||
|
|
3239f99ea8 | ||
|
|
93c32d3f29 | ||
|
|
98449dac3f | ||
|
|
32b60edda7 | ||
|
|
823c95bd9c | ||
|
|
e99d872f2b | ||
|
|
de8f8b02dc | ||
|
|
eec45dfff9 | ||
|
|
cce86c8e96 | ||
|
|
aabdc47c38 | ||
|
|
cb07a729e5 | ||
|
|
df10f7fbe7 | ||
|
|
71c531240f | ||
|
|
1e83207dac | ||
|
|
3311fcdc8e | ||
|
|
f368be925f | ||
|
|
075c57ca06 | ||
|
|
49fc80d506 | ||
|
|
74fc2fcfa9 | ||
|
|
7cc427e28d | ||
|
|
87c571412c | ||
|
|
ab093b2cde | ||
|
|
bbc4ede768 | ||
|
|
64c20dc528 | ||
|
|
50ea9bda89 | ||
|
|
2cf8c4e37a | ||
|
|
fe4719f656 | ||
|
|
1d43b7b316 | ||
|
|
78e4fead49 | ||
|
|
02d5143ff2 | ||
|
|
d9c92b2c6d | ||
|
|
27ac9bbaf3 | ||
|
|
11cdd393f2 | ||
|
|
1ca8578035 | ||
|
|
2516718882 | ||
|
|
5283314c4f | ||
|
|
dcae8da0d1 | ||
|
|
34f2a1a02f | ||
|
|
ee5a68a23c | ||
|
|
6c706ccd9f | ||
|
|
94106f5825 | ||
|
|
72ab2b8011 | ||
|
|
8978ab5917 | ||
|
|
94577316f9 | ||
|
|
91650fb052 | ||
|
|
e9aa037230 | ||
|
|
871e6f691c | ||
|
|
fe60836a89 | ||
|
|
bea2e73b82 | ||
|
|
481e55e8da | ||
|
|
d26a67297a | ||
|
|
753bd7e1d9 | ||
|
|
b57492c1c6 | ||
|
|
4ff5c3b455 | ||
|
|
f62c47a757 | ||
|
|
a85bb0d86f | ||
|
|
5736d523dd | ||
|
|
5004b5723d | ||
|
|
ad2802d8e8 | ||
|
|
3fedd452a5 | ||
|
|
292bc3c4e5 | ||
|
|
512ba8e733 | ||
|
|
9a87ff684d | ||
|
|
f79fc21bfc | ||
|
|
ffddd58b6b | ||
|
|
087e5eaa32 | ||
|
|
cbd27831df | ||
|
|
f6028b63b6 | ||
|
|
a60e01db97 | ||
|
|
68c2ea38c9 | ||
|
|
3469cfca2f | ||
|
|
afd189d24c | ||
|
|
06cb09c267 | ||
|
|
e461b57a48 | ||
|
|
eca9d49575 | ||
|
|
15a37a5062 | ||
|
|
3f8f9eb92c | ||
|
|
33de2bda9e | ||
|
|
94d913fbab | ||
|
|
beb1fcc176 | ||
|
|
1e1a6e3a2d | ||
|
|
6e7c21e439 | ||
|
|
cfe9aaf639 | ||
|
|
69e701befb | ||
|
|
5174a085b7 | ||
|
|
15fab69eca | ||
|
|
20b103a0fb | ||
|
|
8ebe7ee81a | ||
|
|
1d747f664b | ||
|
|
dbf5988c28 | ||
|
|
31ab0e4b7d | ||
|
|
35ea7083bb | ||
|
|
bf90e8bf44 | ||
|
|
b1305644f4 | ||
|
|
34707a057b | ||
|
|
f5e90252f1 | ||
|
|
e75acf69aa | ||
|
|
3ad3fc2622 | ||
|
|
a59468d6c1 | ||
|
|
86e63b1614 | ||
|
|
3f8f9f6711 | ||
|
|
d01f494277 | ||
|
|
4db525c6a9 | ||
|
|
8b5f8b0cb4 | ||
|
|
d0c9b5e98f | ||
|
|
e313625ccb | ||
|
|
7dead548f3 | ||
|
|
8db46ff762 | ||
|
|
93f54a997a | ||
|
|
1353491952 | ||
|
|
00802ffe7a | ||
|
|
78e556aaf7 | ||
|
|
e34988d65a | ||
|
|
07f5c7c89c | ||
|
|
7319d8941a | ||
|
|
3d7933135b | ||
|
|
a778472461 | ||
|
|
cbe2a7446d | ||
|
|
8251dc5cd1 | ||
|
|
5a4103a248 | ||
|
|
d7996f5c1a | ||
|
|
db4229f033 | ||
|
|
e103664963 | ||
|
|
fbf3936ddc | ||
|
|
62d03f1976 | ||
|
|
f3ea159c6b | ||
|
|
3c99294a3a | ||
|
|
7a2a8cffbb | ||
|
|
6d90f87b2f | ||
|
|
f506d24a82 | ||
|
|
ddb0d23ca7 | ||
|
|
763be9bb95 | ||
|
|
77109144e7 | ||
|
|
840e7bd985 | ||
|
|
a6c12f4b25 | ||
|
|
e8e9a4d07b | ||
|
|
ba00182ce4 | ||
|
|
2ad78ee3b8 | ||
|
|
4995d59499 | ||
|
|
d58ef7aa36 | ||
|
|
dc59632fb3 | ||
|
|
1542e15a1b | ||
|
|
5b5be40dd5 | ||
|
|
1ecf0f4c23 | ||
|
|
fa7d1ac554 | ||
|
|
48ce7a9b78 | ||
|
|
09bf54f9af | ||
|
|
43b9bcdb0b | ||
|
|
a3017b8456 | ||
|
|
aac915b285 | ||
|
|
7208f045c1 | ||
|
|
f7a3c42da1 | ||
|
|
4d1c53eb1e | ||
|
|
7bcc9b19ac | ||
|
|
7cfc729679 | ||
|
|
1f8480f0af | ||
|
|
ec3b68ad28 | ||
|
|
3674e27e0f | ||
|
|
e4486420ce | ||
|
|
fe64cc697b | ||
|
|
97177dffd6 | ||
|
|
061a02dddc | ||
|
|
1f72c3e720 | ||
|
|
8270469652 | ||
|
|
5e6590a0f7 | ||
|
|
06dfd13927 | ||
|
|
486cc92f2e | ||
|
|
e8d649b152 | ||
|
|
e96bd14d21 | ||
|
|
e4a2d2a290 | ||
|
|
d8d5d0fa61 | ||
|
|
e010a03dd5 | ||
|
|
427aea73e7 | ||
|
|
c4436b7a1e | ||
|
|
d098051047 | ||
|
|
034a7c424d | ||
|
|
b113436055 | ||
|
|
e550d974da | ||
|
|
bc34ef4b66 | ||
|
|
a5cc1e804b | ||
|
|
aac51979cc | ||
|
|
8f8638fb7c | ||
|
|
d1c74070ab | ||
|
|
ee01d09af5 | ||
|
|
caaf4e3e40 | ||
|
|
34037e58e5 | ||
|
|
66152b42ae | ||
|
|
76c8737485 | ||
|
|
4a1eb55127 | ||
|
|
c87637c6f4 | ||
|
|
364b81a1b9 | ||
|
|
d4c8cf66ef | ||
|
|
08762bc066 | ||
|
|
0add11a257 | ||
|
|
ca5e60b38b | ||
|
|
0e7876536d | ||
|
|
be61a03a98 | ||
|
|
50c707ba51 | ||
|
|
2a2fd7a8b1 | ||
|
|
ad126c838e | ||
|
|
cafc18a78f | ||
|
|
ffca12a8b0 | ||
|
|
137f57ad9c | ||
|
|
153b3322a6 | ||
|
|
575535bdbd | ||
|
|
61a3802494 | ||
|
|
0157f665a3 | ||
|
|
d366605d91 | ||
|
|
fd5bcad5d6 | ||
|
|
7adb80b35b | ||
|
|
dc88e7a2c2 | ||
|
|
dd68a7151f | ||
|
|
bf2497ea3e | ||
|
|
202c889246 | ||
|
|
ec0e93bd6f | ||
|
|
def9bef988 | ||
|
|
c3db9032f3 | ||
|
|
016dc17d94 | ||
|
|
8e1672568a | ||
|
|
42b8ac1235 | ||
|
|
2348f9d785 | ||
|
|
04f86ef130 | ||
|
|
f436086aae | ||
|
|
1b813d371d | ||
|
|
8f49d96c3a | ||
|
|
49f5b8d150 | ||
|
|
f0bbb063dd | ||
|
|
d95a9469ac | ||
|
|
6e088d17fd | ||
|
|
42aeafc907 | ||
|
|
3073b6559c | ||
|
|
af57da8e6b | ||
|
|
56e9abfc92 | ||
|
|
61b4c6d3ac | ||
|
|
7e6b43236a | ||
|
|
6a33ac05a3 | ||
|
|
5f1246280c | ||
|
|
ecef0c78d2 | ||
|
|
0ce42e6185 | ||
|
|
3709d9d5c8 | ||
|
|
e65f916ba5 | ||
|
|
f9c8ce1ac7 | ||
|
|
b881e5c69c | ||
|
|
51a89c80aa | ||
|
|
97a5f408d2 | ||
|
|
2f00d7d145 | ||
|
|
d743838716 | ||
|
|
069b4854f8 | ||
|
|
f089c45115 | ||
|
|
90fe015d68 | ||
|
|
96c86fd4b2 | ||
|
|
d921c36cd4 | ||
|
|
4a552069cf | ||
|
|
74c171b6d1 | ||
|
|
1ae1313edd | ||
|
|
5949d01821 | ||
|
|
3cdb0ae4c8 | ||
|
|
89b6ccf47d | ||
|
|
047ce2949a | ||
|
|
53bdfee057 | ||
|
|
2da55993e0 | ||
|
|
a258eda035 | ||
|
|
7c125cf9d6 | ||
|
|
2af76230f7 | ||
|
|
bdb530f831 | ||
|
|
7a7c09493c | ||
|
|
f3d588eca5 | ||
|
|
031c0b7b21 | ||
|
|
ce017ecd40 | ||
|
|
85e58faa78 | ||
|
|
808ed11e91 | ||
|
|
f8f52c4587 | ||
|
|
54e6e2f66e | ||
|
|
fe1e09f06b | ||
|
|
cd646c0e42 | ||
|
|
f180510fbb | ||
|
|
687e74de9b | ||
|
|
65f91dd051 | ||
|
|
a8a4616cab | ||
|
|
aaac86fd9d | ||
|
|
35ddf9235f | ||
|
|
554189908d | ||
|
|
54dbbd154c | ||
|
|
a9224015e0 | ||
|
|
1cba50266e | ||
|
|
341456cc25 | ||
|
|
ae7852d9b9 | ||
|
|
4ce523f33b | ||
|
|
6b4a8325ae | ||
|
|
6d3044bddd | ||
|
|
0678f61ce9 | ||
|
|
ebede9b910 | ||
|
|
b12791d3e0 | ||
|
|
ce0b0fa0c8 | ||
|
|
dce09586cd | ||
|
|
4f1186a610 | ||
|
|
1cb52a602a | ||
|
|
c482083d82 | ||
|
|
d9dda88164 | ||
|
|
c9fe948b90 | ||
|
|
cc731fe3c4 | ||
|
|
40b7262c19 | ||
|
|
9da61ad562 | ||
|
|
3b731282e3 | ||
|
|
cfc14ade2a | ||
|
|
d4306e61c2 | ||
|
|
3afa6e2350 | ||
|
|
8bbb0448dc | ||
|
|
dcbcbf40a0 | ||
|
|
9a0a5ca804 | ||
|
|
20b2866631 | ||
|
|
92eec664b1 | ||
|
|
723fe84383 | ||
|
|
3ca9347361 | ||
|
|
704d36a7eb | ||
|
|
612df99c34 | ||
|
|
912e850db4 | ||
|
|
96735dd543 | ||
|
|
65cbfbdb40 | ||
|
|
7865fd4f02 | ||
|
|
801f001098 | ||
|
|
7e92257c3c | ||
|
|
7d4777a8bf | ||
|
|
e7428afb3e | ||
|
|
51b7c90dae | ||
|
|
c9f84ccae5 | ||
|
|
01fd54dd6f | ||
|
|
e1446ce38a | ||
|
|
1920e9f758 | ||
|
|
550f91aa68 | ||
|
|
57921e3f52 | ||
|
|
b300a4decb | ||
|
|
51e902cd36 | ||
|
|
ea359c0037 | ||
|
|
f9f8785aef | ||
|
|
0abeaa4dc2 | ||
|
|
18f35ac213 | ||
|
|
9ca077b3dc | ||
|
|
351dd3728e | ||
|
|
054901cb79 | ||
|
|
4f29f7c3a7 | ||
|
|
f149f090a6 | ||
|
|
d113364f82 | ||
|
|
d499cce371 | ||
|
|
5d7dbd701f | ||
|
|
8345134d2a | ||
|
|
55f9cba0f9 | ||
|
|
94afcfb6f9 | ||
|
|
682faa4f9d | ||
|
|
3cffd1e3ed | ||
|
|
0730f73f73 | ||
|
|
dffe20b76c | ||
|
|
e7161fcca6 | ||
|
|
3bf873b99f | ||
|
|
f49bae6622 | ||
|
|
095233e6cf | ||
|
|
490d42fce1 | ||
|
|
11d2db08fa | ||
|
|
13baa43081 | ||
|
|
fad76ad534 | ||
|
|
1c3ddcd120 | ||
|
|
2ccdeec550 | ||
|
|
3164f99b3b | ||
|
|
1bceae12dd | ||
|
|
b2c60135f5 | ||
|
|
0dddf3c50c | ||
|
|
b4badf6e7f | ||
|
|
9c69afeddd | ||
|
|
e8835429fd | ||
|
|
029a84159e | ||
|
|
ba01e3778a | ||
|
|
6cfd4e6422 | ||
|
|
bb372751f7 | ||
|
|
3fdf2c7e32 | ||
|
|
9f4ca63603 | ||
|
|
4bdf772130 | ||
|
|
6110640fc2 | ||
|
|
6c243488fa | ||
|
|
4f218435e3 | ||
|
|
7ca13fd163 | ||
|
|
2306534248 | ||
|
|
2f0248e6d5 | ||
|
|
3a8564de92 | ||
|
|
1aa8b9b804 | ||
|
|
921d5464a1 | ||
|
|
9993b90a20 | ||
|
|
6f054519e7 | ||
|
|
51bf4a4c5c | ||
|
|
046b83582d | ||
|
|
be2e467583 | ||
|
|
b1d137770c | ||
|
|
40c7cab1da | ||
|
|
f39e120952 | ||
|
|
f30f607b0c | ||
|
|
e40e1da292 | ||
|
|
1783ef501d | ||
|
|
b4ec22ecea | ||
|
|
0200fef389 | ||
|
|
d8397f146b | ||
|
|
244be86207 | ||
|
|
c26135780d | ||
|
|
4411a26002 | ||
|
|
21622f575b | ||
|
|
23e6df04d4 | ||
|
|
bf403dfc62 | ||
|
|
c3f48b5a13 | ||
|
|
e192454f54 | ||
|
|
a55573be94 | ||
|
|
0e548f63f9 | ||
|
|
4d1a34661e | ||
|
|
7e5802e799 | ||
|
|
0e8164d805 | ||
|
|
f9b30bdb43 | ||
|
|
34de31195f | ||
|
|
cf05a8d8fa | ||
|
|
a2e3f3d900 | ||
|
|
0890ba0fdd | ||
|
|
d2f082b2e2 | ||
|
|
e67b8c86d6 | ||
|
|
e14922f15c | ||
|
|
ad5669b523 | ||
|
|
f2a6ba80b5 | ||
|
|
b3dac15d57 | ||
|
|
def4ca699a | ||
|
|
f98fa82134 | ||
|
|
ff44671ae5 | ||
|
|
398d66bda9 | ||
|
|
eb9ac1bbe5 | ||
|
|
42fc23cff2 | ||
|
|
78cae3dce7 | ||
|
|
beed86ff37 | ||
|
|
ec7324e12e | ||
|
|
d097b673bb | ||
|
|
7eea957a3b | ||
|
|
4dda6b8a81 | ||
|
|
5fd5a65283 | ||
|
|
ca0513396d | ||
|
|
9f87ab4941 | ||
|
|
e37f5a6eb2 | ||
|
|
ece40cdc54 | ||
|
|
65561b22c5 | ||
|
|
21aa8c5f15 | ||
|
|
f4bafacc62 | ||
|
|
2cb54293f8 | ||
|
|
5610185050 | ||
|
|
699bd61045 | ||
|
|
27d0b934a1 | ||
|
|
0f1b704385 | ||
|
|
7d0c1d2594 | ||
|
|
43cff9e1a3 | ||
|
|
f5ddf869e4 | ||
|
|
185db4c112 | ||
|
|
07e3815b74 | ||
|
|
187ddfd80c | ||
|
|
d3f7923bc6 | ||
|
|
e52db94c1a | ||
|
|
e50959c1fe | ||
|
|
bab75625cb | ||
|
|
f0b039ad10 | ||
|
|
5c8dc7ab07 | ||
|
|
de2b5390cb | ||
|
|
d89ceb2125 | ||
|
|
c43d58d3c9 | ||
|
|
c6efddee87 | ||
|
|
f6377e6125 | ||
|
|
357c47910a | ||
|
|
4ae48f4284 | ||
|
|
a48a306fe8 | ||
|
|
a3c1928fc0 | ||
|
|
34d3b85227 | ||
|
|
06a91d8564 | ||
|
|
e1f0367631 | ||
|
|
dbcd4f635e | ||
|
|
a3142aad69 | ||
|
|
980749536b | ||
|
|
5dbddfb6a1 | ||
|
|
c4d2be7a0d | ||
|
|
ef51f543a3 | ||
|
|
4eda2aa36d | ||
|
|
a35892da4f | ||
|
|
23b567e11b | ||
|
|
abdbf2cb8a | ||
|
|
ca97ac11e1 | ||
|
|
8f0a7f56e2 | ||
|
|
0a61971d29 | ||
|
|
7b335fb62e | ||
|
|
a6f21c2b91 | ||
|
|
e74378a8ac | ||
|
|
ec67ee946a | ||
|
|
c5e8a52205 | ||
|
|
78dd0e6ddc | ||
|
|
cfea52f570 | ||
|
|
2d88982729 | ||
|
|
148a3c4cf7 | ||
|
|
533b55bb68 | ||
|
|
5b85fe9293 | ||
|
|
1ac126fb7a | ||
|
|
b5e3323a93 | ||
|
|
8f6d148481 | ||
|
|
671a892b52 | ||
|
|
5c25c5563a | ||
|
|
8b05eeaa59 | ||
|
|
1b001cf1e8 | ||
|
|
855bad2f40 | ||
|
|
b6d9407246 | ||
|
|
957687ed39 | ||
|
|
db86cfa7d9 | ||
|
|
afa95172b6 | ||
|
|
2e0843c226 | ||
|
|
b312901705 | ||
|
|
16028b51c7 | ||
|
|
c8091c61c0 | ||
|
|
5d9018aeec | ||
|
|
cf686c445c | ||
|
|
0478e4217b | ||
|
|
f11d1a6fa1 | ||
|
|
9dc6668e8a | ||
|
|
527aea9264 | ||
|
|
056f321ee6 | ||
|
|
e679556975 | ||
|
|
e9f4ac7425 | ||
|
|
c6502fb03b | ||
|
|
83b7163844 | ||
|
|
c33533082c | ||
|
|
5dd392127f | ||
|
|
9c150eec4e | ||
|
|
c25a3cf1c1 | ||
|
|
b9ad9ba674 | ||
|
|
92ac7d7c24 | ||
|
|
8e27318eda | ||
|
|
976d16b0db | ||
|
|
1cee9828b0 | ||
|
|
2c7f00bac1 | ||
|
|
484b24d097 | ||
|
|
e93cc85e9b | ||
|
|
615381f8e7 | ||
|
|
b01f7e1d54 | ||
|
|
f29e1e2ee0 | ||
|
|
ec4be237b5 | ||
|
|
6249c90bc9 | ||
|
|
69efac3634 | ||
|
|
77b68ec12e | ||
|
|
c818dbb5a0 | ||
|
|
9753578903 | ||
|
|
5abedab095 | ||
|
|
31576f8f55 | ||
|
|
31a2b2ca3c | ||
|
|
27cc737fe1 | ||
|
|
064700be36 | ||
|
|
343277e387 | ||
|
|
363b878a24 | ||
|
|
69c7d31e69 | ||
|
|
e5bd0e6dc7 | ||
|
|
3b41ba9dd9 | ||
|
|
17b4c98db1 | ||
|
|
04d55f60ea | ||
|
|
86f430f61b | ||
|
|
c6511ed829 | ||
|
|
047760ad4b | ||
|
|
b7c4b66b61 | ||
|
|
67bb5ffa73 | ||
|
|
a671576578 | ||
|
|
1ee4b964e2 | ||
|
|
cb7d05bd53 | ||
|
|
16f3338b3d | ||
|
|
0a567a3ef9 | ||
|
|
660e0f3d8b | ||
|
|
ee766ec88e | ||
|
|
63096a5c26 | ||
|
|
b5b714861d | ||
|
|
5c2d416a34 | ||
|
|
0515375cfa | ||
|
|
6d20ccccd0 | ||
|
|
6dce255393 | ||
|
|
402d4bdee1 | ||
|
|
123fba5b07 | ||
|
|
f506c795d6 | ||
|
|
5fd803d479 | ||
|
|
1241664d8d | ||
|
|
3e6efb663b | ||
|
|
cd907ff430 | ||
|
|
724189e4ef | ||
|
|
4bb0da0ce6 | ||
|
|
666e587114 | ||
|
|
3e9e5acdab | ||
|
|
40d10ea741 | ||
|
|
231aaedec8 | ||
|
|
d86a4b15c1 | ||
|
|
03abeacea4 | ||
|
|
99169398b7 | ||
|
|
24600355c8 | ||
|
|
db2a21cea1 | ||
|
|
95967151ae | ||
|
|
f2137e4cdd | ||
|
|
bba6bb6255 | ||
|
|
7d7bc9782b | ||
|
|
5667694652 | ||
|
|
4cb0b9174b | ||
|
|
7493031d11 | ||
|
|
e64d2dcada | ||
|
|
f057bd1e89 | ||
|
|
1e7e719dbf | ||
|
|
5b6e9747b7 | ||
|
|
803c12877c | ||
|
|
db5be3c28a | ||
|
|
434a033411 | ||
|
|
fd2ee3e109 | ||
|
|
0816591cf9 | ||
|
|
836d02d0b9 | ||
|
|
b951d506d9 | ||
|
|
ec5627a44c | ||
|
|
333a13269c | ||
|
|
e0a70bd352 | ||
|
|
fe913ec10f | ||
|
|
50899b845d | ||
|
|
3e6396cc4b | ||
|
|
a8d9b269ff | ||
|
|
df7dc21893 | ||
|
|
750c74eea7 | ||
|
|
2f7da8b577 | ||
|
|
5e52138861 | ||
|
|
e2dba9e9b8 | ||
|
|
c79fcf7ad5 | ||
|
|
c6abc43ca5 | ||
|
|
2c1913af23 | ||
|
|
ed3d15501a | ||
|
|
fef85cf259 | ||
|
|
00be016979 | ||
|
|
9290aa2b61 | ||
|
|
977491ef8d | ||
|
|
86fcbf9c5e | ||
|
|
e081e4c9c6 | ||
|
|
357e738983 | ||
|
|
7242a98adb | ||
|
|
6974892a11 | ||
|
|
ee0cb8793f | ||
|
|
0cfd3c7e02 | ||
|
|
23693bd57e | ||
|
|
d742211797 | ||
|
|
9191663a1a | ||
|
|
b3dd2a4282 | ||
|
|
f51596eb61 | ||
|
|
c1d252afe0 | ||
|
|
c3f03e4497 | ||
|
|
9e67de8a9f | ||
|
|
6f09b14f44 | ||
|
|
d78b33ca75 | ||
|
|
fa9cf2b345 | ||
|
|
b2c833b879 | ||
|
|
96516d6dd5 | ||
|
|
7071cd7381 | ||
|
|
0a7b8840a4 | ||
|
|
f272cff7f6 | ||
|
|
6ede0f6166 | ||
|
|
c44ff8a70f | ||
|
|
d2eb507e7d | ||
|
|
fa04e3de75 | ||
|
|
63184d53c1 | ||
|
|
1dfff7ac0e | ||
|
|
6c84544521 | ||
|
|
91651ca6ce | ||
|
|
6fd790570a | ||
|
|
b322a964ca | ||
|
|
20b35cbe13 | ||
|
|
d169641c99 | ||
|
|
856591d253 | ||
|
|
4587f5a73d | ||
|
|
10057217cb | ||
|
|
0c66e1b5b9 | ||
|
|
4800460e07 | ||
|
|
67ee649d99 | ||
|
|
57b780a0d7 | ||
|
|
19d9dd6954 | ||
|
|
e298351caa | ||
|
|
752a12bda4 | ||
|
|
afeb3b53c9 | ||
|
|
8ce658416b | ||
|
|
6e846ac3e5 | ||
|
|
ec298185a3 | ||
|
|
58df72984f | ||
|
|
5bfddcc444 | ||
|
|
a99b31a61d | ||
|
|
8a8b7bd48c | ||
|
|
1d04c7e1fe | ||
|
|
9f1c37ecb3 | ||
|
|
8e8651a0e1 | ||
|
|
a8e9f21035 | ||
|
|
997cdfffb4 | ||
|
|
5a9c57ec0f | ||
|
|
418ac501aa | ||
|
|
12b58a17e1 | ||
|
|
7ca9df9357 | ||
|
|
f912f8582d | ||
|
|
a211b6d55d | ||
|
|
c84c154603 | ||
|
|
f903090e0f | ||
|
|
901df242b7 | ||
|
|
9dbb3767e2 | ||
|
|
5565d36ef2 | ||
|
|
48f8c3f85a | ||
|
|
a3eef7298e | ||
|
|
7d3578b31a | ||
|
|
2914d4975b | ||
|
|
2a0fcd99e4 | ||
|
|
d7e0e4afc5 | ||
|
|
de78bb5ffe | ||
|
|
9ecee6b163 | ||
|
|
e25e8af135 | ||
|
|
4ab2fed8d2 | ||
|
|
3e8fea6533 | ||
|
|
a57b90809b | ||
|
|
b097b8bb34 | ||
|
|
349aeb5a26 | ||
|
|
e8aebb00ee | ||
|
|
6ece2838bd | ||
|
|
bcd3aa7d61 | ||
|
|
aca80726d7 | ||
|
|
2fc5745c58 | ||
|
|
ba2f2cb284 | ||
|
|
ac2a4b54e7 | ||
|
|
9326e91832 | ||
|
|
06aa4a5c07 | ||
|
|
80c7c9a86e | ||
|
|
0fdddfe548 | ||
|
|
42d66fd3d9 | ||
|
|
ae8dde981b | ||
|
|
228b832bed | ||
|
|
8035572fac | ||
|
|
7fcccb4ab2 | ||
|
|
b80bad0a93 | ||
|
|
f87c503d5e | ||
|
|
568c0318be | ||
|
|
5903b33016 | ||
|
|
47bad33949 | ||
|
|
fb79b133e9 | ||
|
|
ad1763a8f2 | ||
|
|
97e26686f4 | ||
|
|
f476002691 | ||
|
|
a4992963b3 | ||
|
|
44ff608868 | ||
|
|
f2ea725edb | ||
|
|
40a87fa736 | ||
|
|
a5627f97ff | ||
|
|
8b1698b17d | ||
|
|
f8da3c2e48 | ||
|
|
03f9264394 | ||
|
|
33da5bcee1 | ||
|
|
01541a3dc1 | ||
|
|
13ec3f6c0d | ||
|
|
a949c2aaec | ||
|
|
f4324d1de6 | ||
|
|
f1d2808594 | ||
|
|
52d0605066 | ||
|
|
015b976c28 | ||
|
|
b777c8de15 | ||
|
|
93201b2ded | ||
|
|
234d39cf96 | ||
|
|
9913bf654b | ||
|
|
2d560861df | ||
|
|
24786c643b | ||
|
|
3b4e48e32f | ||
|
|
45b81a9db9 | ||
|
|
500dea182f | ||
|
|
274e9f3e42 | ||
|
|
cf589f713d | ||
|
|
07d881cd5e | ||
|
|
0d0f793f81 | ||
|
|
23dfe1e8a9 | ||
|
|
a8e49a0d2d | ||
|
|
594847ba04 | ||
|
|
f3fcfb635b | ||
|
|
011220180c | ||
|
|
3e9215b27d | ||
|
|
6ce2dfeaec | ||
|
|
9176237361 | ||
|
|
9b65abe76a | ||
|
|
d6085fcdb9 | ||
|
|
259d2a9b5c | ||
|
|
f62736c749 | ||
|
|
7ef1b28c83 | ||
|
|
7df9dea72a | ||
|
|
2a061fba07 | ||
|
|
93aa575697 | ||
|
|
8a20a71906 | ||
|
|
37076d3d1f | ||
|
|
acf11bdc6c | ||
|
|
d222196fd1 | ||
|
|
6f43082e38 | ||
|
|
964bc4dc12 | ||
|
|
ecf7870b3e | ||
|
|
30fcab1c63 | ||
|
|
edde501d54 | ||
|
|
35c0e2cea2 | ||
|
|
5cf061cb32 | ||
|
|
5b6dfb01a6 | ||
|
|
a0b589979d | ||
|
|
0d0cdd0542 | ||
|
|
297fa7a069 | ||
|
|
2ed515091f | ||
|
|
b093f9fd41 | ||
|
|
fde6396f48 | ||
|
|
11250290a2 | ||
|
|
be33c41a40 | ||
|
|
e20528ab0d | ||
|
|
a40d89ba0d | ||
|
|
c0c7c96f28 | ||
|
|
003e5575b9 | ||
|
|
d904574ea8 | ||
|
|
cbb884edae | ||
|
|
0a7829fcfe | ||
|
|
7c970d6ff0 | ||
|
|
048b39ae16 | ||
|
|
bb9d5e38fa | ||
|
|
bb365ca1b5 | ||
|
|
53b97b3ffa | ||
|
|
9c101eb8af | ||
|
|
c251270633 | ||
|
|
dfb1095908 | ||
|
|
cf2b415cd3 | ||
|
|
e9f3ad63c6 | ||
|
|
6a9bd22904 | ||
|
|
ebbf3bfa77 | ||
|
|
661aaead35 | ||
|
|
197671960d | ||
|
|
e434ac9a1f | ||
|
|
388ec2cd97 | ||
|
|
1d7589abb9 | ||
|
|
da47ba11f8 | ||
|
|
eaa572aafe | ||
|
|
d4ac9f8114 | ||
|
|
4bc2f4d26d | ||
|
|
7dd174642c | ||
|
|
89f3de169c | ||
|
|
bc04bb28fe | ||
|
|
9df8d319c3 | ||
|
|
3f55200737 | ||
|
|
204b029973 | ||
|
|
3fbe3a3078 | ||
|
|
8848203d90 | ||
|
|
8edd89c665 | ||
|
|
c78d623e93 | ||
|
|
b093fc8a55 | ||
|
|
7e01b2b3fb | ||
|
|
26eaaa8c79 | ||
|
|
8cd0e3bb05 | ||
|
|
e0f74690b0 | ||
|
|
8db7d73dc0 | ||
|
|
48ef5d74e8 | ||
|
|
18117af067 | ||
|
|
b418642359 | ||
|
|
6a2f62a084 | ||
|
|
1ec262becf | ||
|
|
6cd5ffe637 | ||
|
|
20b43d8ad1 | ||
|
|
f16143de7c | ||
|
|
daba43dcba | ||
|
|
7c74107f36 | ||
|
|
2e0bfaeb74 | ||
|
|
d31e03d04e | ||
|
|
8da5f26452 | ||
|
|
d6e22d5f5e | ||
|
|
c52f4d6307 | ||
|
|
77f1a8ecac | ||
|
|
a4348f1963 | ||
|
|
fe0434cb16 | ||
|
|
a6f992ce5b | ||
|
|
04fc5e51fc | ||
|
|
d430019b44 | ||
|
|
72493b7a8b | ||
|
|
0a828ee67f | ||
|
|
385454f3f1 | ||
|
|
f0ff4d087f | ||
|
|
89081ea169 | ||
|
|
e3d753da76 | ||
|
|
1e89aa7d92 | ||
|
|
f979d941b6 | ||
|
|
b1dffc9eec | ||
|
|
5424092189 | ||
|
|
bfa8f75d3b | ||
|
|
75d9e7bc59 | ||
|
|
c5a7eeaa0f | ||
|
|
4947c75ff7 | ||
|
|
d07a7f505b | ||
|
|
7ab5dac5c7 | ||
|
|
4fc082b526 | ||
|
|
2a0bc3b2e8 | ||
|
|
a7d79baf00 | ||
|
|
c9442653e9 | ||
|
|
969faf91fe | ||
|
|
8fe218676a | ||
|
|
f6b518ed49 | ||
|
|
c53c679c6b | ||
|
|
2d91daf858 | ||
|
|
a5b7145527 | ||
|
|
ee912c2b29 | ||
|
|
bdf9b33b10 | ||
|
|
167368d508 | ||
|
|
bb534225b3 | ||
|
|
ab69dacc6d | ||
|
|
8c2690e01f | ||
|
|
57db10a4c0 | ||
|
|
fc5c07027c | ||
|
|
5da8c26cb6 | ||
|
|
626fdfe345 | ||
|
|
c071503f19 | ||
|
|
873f7a591b | ||
|
|
e0f5f10215 | ||
|
|
11a949b78e | ||
|
|
81007f841a | ||
|
|
84f592c417 | ||
|
|
1e3b61a188 | ||
|
|
baeeedcc16 | ||
|
|
70763fd13b | ||
|
|
21c91a8408 | ||
|
|
07af7123c9 | ||
|
|
3fbb5f08b8 | ||
|
|
973f5b2591 | ||
|
|
64b5880444 | ||
|
|
81132bf0ed | ||
|
|
a9c23f205b | ||
|
|
801d1e9eda | ||
|
|
15977695cd | ||
|
|
e0d578920a | ||
|
|
b6c75c8d62 | ||
|
|
e4cb1dcbfd | ||
|
|
ceb8430f9b | ||
|
|
2565b47637 | ||
|
|
73eb98c4c3 | ||
|
|
8c7e8b7a6c | ||
|
|
894616bef9 | ||
|
|
1cfd6b67b3 | ||
|
|
5e4d8a1034 | ||
|
|
00785daac9 | ||
|
|
12bfc9570a | ||
|
|
f6b5c704e8 | ||
|
|
6fe62060c6 | ||
|
|
51fe2e8a9b | ||
|
|
a18179e6db | ||
|
|
89e1da4780 | ||
|
|
cb9a7f4cd1 | ||
|
|
dcad2e9a17 | ||
|
|
75eb6b1b6a | ||
|
|
47be3df96a | ||
|
|
b077918832 | ||
|
|
73a66b8206 | ||
|
|
89179ff5d1 | ||
|
|
12a4882efe | ||
|
|
4017628630 | ||
|
|
d596b58895 | ||
|
|
398f4bf56d | ||
|
|
e2b4fd4b20 | ||
|
|
e0c732ad47 | ||
|
|
3a0e665c13 | ||
|
|
1076d67137 | ||
|
|
b023892c57 | ||
|
|
5f5c8a2df0 | ||
|
|
0c4bab2966 | ||
|
|
054950ef16 | ||
|
|
e08496d84c | ||
|
|
ef07012359 | ||
|
|
952fe4923c | ||
|
|
fb94892ca6 | ||
|
|
b81b3bb118 | ||
|
|
5496f790bf | ||
|
|
a6ab0a5742 | ||
|
|
ef053a813d | ||
|
|
550e7beb61 | ||
|
|
e8930e7ded | ||
|
|
22ad977349 | ||
|
|
c223c2be5c | ||
|
|
e3585a7d66 | ||
|
|
905e0c20d9 | ||
|
|
981c3e0ce4 | ||
|
|
de2db39161 | ||
|
|
ef25bfee14 | ||
|
|
4cfd18e25f | ||
|
|
e0f3656629 | ||
|
|
2ddad07fc7 | ||
|
|
1dcb6cd390 | ||
|
|
1a3d37d8a5 | ||
|
|
5cd8ac1fac | ||
|
|
7889e35340 | ||
|
|
dcffde3e98 | ||
|
|
d38b9be891 | ||
|
|
42846cce50 | ||
|
|
2134dbb2fd | ||
|
|
ccec3810df | ||
|
|
12af9b0b66 | ||
|
|
97b9edf7c3 | ||
|
|
c63d556cf8 | ||
|
|
b4e8cffd0a | ||
|
|
4ba3ff6769 | ||
|
|
c56ac30d39 | ||
|
|
7072979cfc | ||
|
|
727f6c0e28 | ||
|
|
1c7c109960 | ||
|
|
391149dbd8 | ||
|
|
7bb988c48b | ||
|
|
1927ed47ff | ||
|
|
73027d5cec | ||
|
|
c52a8fc442 | ||
|
|
acab3a5ee1 | ||
|
|
0bd8aabd7c | ||
|
|
99de658093 | ||
|
|
a4d06742c3 | ||
|
|
3ebae8f331 | ||
|
|
7fed3b408e | ||
|
|
95712ea357 | ||
|
|
d5178f61f1 | ||
|
|
941a7f9ff5 | ||
|
|
0ccc216a2c | ||
|
|
f0dc7f89e4 | ||
|
|
332ceb0da6 | ||
|
|
189758cca4 | ||
|
|
2fa4df2830 | ||
|
|
a8ff7a65f4 | ||
|
|
5d68359eb6 | ||
|
|
4032824c79 | ||
|
|
0ebf162673 | ||
|
|
166acad749 | ||
|
|
15bfc12cbe | ||
|
|
3ac23c21d9 | ||
|
|
8b44401b1b | ||
|
|
5624453c87 | ||
|
|
87c7f73245 | ||
|
|
110e4ee586 | ||
|
|
6a7a5b9249 | ||
|
|
8832aa61fe | ||
|
|
e16e501b93 | ||
|
|
8536c975bf | ||
|
|
3d500800f1 | ||
|
|
b9b991c5fe | ||
|
|
701e638907 | ||
|
|
52d03f3ce3 | ||
|
|
ebf00eecaa | ||
|
|
262a917952 | ||
|
|
a730225700 | ||
|
|
538d2c2b83 | ||
|
|
736d57f3f2 | ||
|
|
053388a2d3 | ||
|
|
e17ec3e299 | ||
|
|
869a64e457 | ||
|
|
9d56595d48 | ||
|
|
ea11f8bff1 | ||
|
|
fd5b3083dd | ||
|
|
58a787b660 | ||
|
|
dffc53b7b1 | ||
|
|
173899fc76 | ||
|
|
7166ade310 | ||
|
|
7b935823da | ||
|
|
e945bf884e | ||
|
|
d87da684a9 | ||
|
|
15bdaca2f9 | ||
|
|
df8085bee0 | ||
|
|
f04d415b0a | ||
|
|
ab398c64a8 | ||
|
|
a2ce9e6a54 | ||
|
|
dc4edf775d | ||
|
|
e91229f69f | ||
|
|
f136a7fd8d | ||
|
|
413162dfad | ||
|
|
7d1c1e3845 | ||
|
|
620f3e8734 | ||
|
|
d46fda537d | ||
|
|
fc96360e17 | ||
|
|
bc94fc3d6d | ||
|
|
c1e5fe3281 | ||
|
|
69ceab9f44 | ||
|
|
546e766fd9 | ||
|
|
82220638a0 | ||
|
|
432f3446b0 | ||
|
|
19212eb4aa | ||
|
|
176ffa8e7c | ||
|
|
3caa755b28 | ||
|
|
e48ff4c7e9 | ||
|
|
e1e7be07f7 | ||
|
|
23dd96be97 | ||
|
|
2525929e8d | ||
|
|
2deacb8e97 | ||
|
|
3b2b0da3a1 | ||
|
|
ca5a96f53a | ||
|
|
c2227e1a48 | ||
|
|
dff8027be6 | ||
|
|
8f7f1ee0b5 | ||
|
|
c7c077c21c | ||
|
|
d7b1eb74e5 | ||
|
|
8772a5bba0 | ||
|
|
c6ccfa8b6a | ||
|
|
63057c2f60 | ||
|
|
3b9baeb866 | ||
|
|
38c5e65c35 | ||
|
|
fa7570efd8 | ||
|
|
b50c15e278 | ||
|
|
96be32225e | ||
|
|
dab3bc6ce4 | ||
|
|
b0e81bf188 | ||
|
|
acbbfbe419 | ||
|
|
c1478418ae | ||
|
|
37f9655714 | ||
|
|
4f12596e29 | ||
|
|
c714a7a28c | ||
|
|
b935108ed8 | ||
|
|
fb70b9742a | ||
|
|
8d91a42fe7 | ||
|
|
0be8d62f7d | ||
|
|
cac960c6b8 | ||
|
|
8596eb6091 | ||
|
|
7ff87fdac9 | ||
|
|
4c04001637 | ||
|
|
8c6cfebc1c | ||
|
|
ff0ab048df | ||
|
|
9b66b114cc | ||
|
|
957244583c | ||
|
|
a124be71b1 | ||
|
|
345d460643 | ||
|
|
7f0d4fff1b | ||
|
|
1903154d01 | ||
|
|
9558ebcb0b | ||
|
|
d63934637f | ||
|
|
256c529de8 | ||
|
|
a56fe7a8fe | ||
|
|
be4bbed687 | ||
|
|
2d2f0b9281 | ||
|
|
dfd9622ce7 | ||
|
|
71125e7b86 | ||
|
|
4a5bbe1791 | ||
|
|
0ecbbf8ddf | ||
|
|
b73698849d | ||
|
|
e13c939583 | ||
|
|
96a25935ac | ||
|
|
7d5c3144dc | ||
|
|
2cf9a07bb2 | ||
|
|
72718c14d1 | ||
|
|
fbe64b21bc | ||
|
|
d65741177a | ||
|
|
046b4fdae4 | ||
|
|
a179212c60 | ||
|
|
5d99e9c0b8 | ||
|
|
b426e600ce | ||
|
|
66d7c00e84 | ||
|
|
293c23ec52 | ||
|
|
9e701b0fb3 | ||
|
|
95a0cb53d3 | ||
|
|
3c03c84782 | ||
|
|
a3fa318edc | ||
|
|
0187407cff | ||
|
|
1424ff7d22 | ||
|
|
db62447c98 | ||
|
|
b96ae68aee | ||
|
|
7d3f0da75c | ||
|
|
4984f9e041 | ||
|
|
1e27238083 | ||
|
|
1e41cea107 | ||
|
|
da99d3b15e | ||
|
|
a0dafb4093 | ||
|
|
f5485c1265 | ||
|
|
24da004bd6 | ||
|
|
e8f28b71f7 | ||
|
|
fa91653beb | ||
|
|
aa93860466 | ||
|
|
ea26bd0ff2 | ||
|
|
214fc1d8c4 | ||
|
|
09558e6e9a | ||
|
|
cc069d3987 | ||
|
|
db3dc0ffab | ||
|
|
6a6d6b6f85 | ||
|
|
605d74dd0d | ||
|
|
0c62c08abd | ||
|
|
aa6e15e3ac | ||
|
|
537cba4bda | ||
|
|
7e9419f299 | ||
|
|
d59ac53f64 | ||
|
|
92c7fe9bf6 | ||
|
|
3f2cd65159 | ||
|
|
da717b5a91 | ||
|
|
e277f286c0 | ||
|
|
d45e21a786 | ||
|
|
22fc99d521 | ||
|
|
1026ad7011 | ||
|
|
f9491ef193 | ||
|
|
5302ca38da | ||
|
|
2830c70140 | ||
|
|
5e2d8d1c90 | ||
|
|
65797742ef | ||
|
|
1a5a52358e | ||
|
|
5852fc2d68 | ||
|
|
b8d3b01f64 | ||
|
|
165d43b0cd | ||
|
|
d8929db208 | ||
|
|
0ab0be01c2 | ||
|
|
f2e4b922a9 | ||
|
|
a7e5db6e19 | ||
|
|
e8be61e062 | ||
|
|
0cd04af6a4 | ||
|
|
23105211f8 | ||
|
|
618bc4fbc2 | ||
|
|
cbefb716e3 | ||
|
|
d2cecca297 | ||
|
|
8f8856b767 | ||
|
|
00682160b6 | ||
|
|
6ffef61afc | ||
|
|
75c9debb5e | ||
|
|
6521cc81fe | ||
|
|
b634439765 | ||
|
|
1d8d42ad08 | ||
|
|
4e26b8e645 | ||
|
|
6a674a0a40 | ||
|
|
a5a3bc8b7c | ||
|
|
6ff536fca7 | ||
|
|
719ee2e001 | ||
|
|
6c28c55ea7 | ||
|
|
6032e05581 | ||
|
|
0538048f24 | ||
|
|
89307d3f13 | ||
|
|
5dcd3e6f35 | ||
|
|
59ef2b0d4f | ||
|
|
a92e116a21 | ||
|
|
d8805ae4d7 | ||
|
|
942bd02add | ||
|
|
0d6d848325 | ||
|
|
c6494f92fa | ||
|
|
9cb9407e1c | ||
|
|
43ab44d8ba | ||
|
|
c2bc3317c3 | ||
|
|
413c6e12f5 | ||
|
|
65140f6b3f | ||
|
|
2fee6e62aa | ||
|
|
4b91dbfed6 | ||
|
|
e17b35a96a | ||
|
|
44dc30c02c | ||
|
|
038062b3c3 | ||
|
|
5cb44d55ff | ||
|
|
8befe916fb | ||
|
|
d3caa9b97d | ||
|
|
2d99ccfcda | ||
|
|
92be61dc48 | ||
|
|
2fecb4d945 | ||
|
|
462c3d3a6c | ||
|
|
422d78cbcd | ||
|
|
7b0e2513bd | ||
|
|
f8f0454f33 | ||
|
|
d937a3c552 | ||
|
|
dbd2855bfc | ||
|
|
8084d80d64 | ||
|
|
d585121bdb | ||
|
|
9e496175d9 | ||
|
|
e6fcc2b3e3 | ||
|
|
f748969186 | ||
|
|
4750769c63 | ||
|
|
8c5c2b0fe1 | ||
|
|
1b04dbf7f9 | ||
|
|
97e208f081 | ||
|
|
2de974f71d | ||
|
|
bda1aaa5db | ||
|
|
b69010d83b | ||
|
|
2e3bc443ff | ||
|
|
d2e3517c78 | ||
|
|
e930c5a30c | ||
|
|
fb500ace8a | ||
|
|
4f9a2a8083 | ||
|
|
2acaef67b1 | ||
|
|
1ad9e75a86 | ||
|
|
e9c6db4d8c | ||
|
|
d070029856 | ||
|
|
68b65ba5d4 | ||
|
|
c3f840126c | ||
|
|
7404de6776 | ||
|
|
d763fffd7a | ||
|
|
0435509952 | ||
|
|
bba1050e5e | ||
|
|
28f9e6f17b | ||
|
|
b3d147b97a | ||
|
|
3f85391bde | ||
|
|
513c35d0ef | ||
|
|
499a2582e6 | ||
|
|
d6363e908d | ||
|
|
325d0dd075 | ||
|
|
2c90034d39 | ||
|
|
614e9f4b87 | ||
|
|
2452532557 | ||
|
|
6c621f243d | ||
|
|
9cedbea2cf | ||
|
|
2168cce020 | ||
|
|
7858186ecd | ||
|
|
d2e9918e5f | ||
|
|
9a7b498818 | ||
|
|
3ff23b3c45 | ||
|
|
0f7dda9dfc | ||
|
|
eef6eb93f8 | ||
|
|
31f78d1aa9 | ||
|
|
193ee657e6 | ||
|
|
b5a030c78d | ||
|
|
5e447e8938 | ||
|
|
b495a7d834 | ||
|
|
9aa4a79d6e | ||
|
|
cabd0769a8 | ||
|
|
803916c99b | ||
|
|
54433ee555 | ||
|
|
6ee298dc7d | ||
|
|
9bd140ce42 | ||
|
|
f005c72669 | ||
|
|
d56af022c1 | ||
|
|
cc8c5aecaf | ||
|
|
8c8f5928f5 | ||
|
|
ab38e17936 | ||
|
|
52fcd18e6a | ||
|
|
9fb980ab2c | ||
|
|
b42939796c | ||
|
|
69ce29841d | ||
|
|
425a83c0da | ||
|
|
a9f4f8e06c | ||
|
|
989ff03e43 | ||
|
|
64b0517bac | ||
|
|
f52fa46326 | ||
|
|
51858c02eb | ||
|
|
4eb38e4cfd | ||
|
|
4a5828c732 | ||
|
|
774ebfe671 | ||
|
|
6e2534aa77 | ||
|
|
ad4e0a2ad5 | ||
|
|
24d1afd40f | ||
|
|
2278325822 | ||
|
|
49c13f19ff | ||
|
|
dbd63ff797 | ||
|
|
a59a5a2402 | ||
|
|
26ebbf82ee | ||
|
|
76130bc485 | ||
|
|
f79577c816 | ||
|
|
ecca3588bc | ||
|
|
34209db57b | ||
|
|
ec37fc897b | ||
|
|
5666d5f298 | ||
|
|
6ac0c00e30 | ||
|
|
990cab53a9 | ||
|
|
18766466c6 | ||
|
|
73e1957c62 | ||
|
|
e0a31feaec | ||
|
|
c62061090a | ||
|
|
0f689c2ea1 | ||
|
|
ef290796e0 | ||
|
|
c8fef693fa | ||
|
|
a9ac654040 | ||
|
|
17be68f5d9 | ||
|
|
5d7815c98a | ||
|
|
7fe5b5af7a | ||
|
|
068b7ce6a9 | ||
|
|
eec89e0442 | ||
|
|
7a58e8261f | ||
|
|
eec0aced7f | ||
|
|
74eb2e4493 | ||
|
|
01ddfea478 | ||
|
|
a694f61003 | ||
|
|
d3a025acd6 | ||
|
|
51d5c90c9f | ||
|
|
e4d25ed9cd | ||
|
|
1a60b6e412 | ||
|
|
dd6495abf6 | ||
|
|
35865ba70e | ||
|
|
cee267193f | ||
|
|
30149df88e | ||
|
|
841aea9d97 | ||
|
|
d68323d7bb | ||
|
|
a583daf712 | ||
|
|
cf1912523b | ||
|
|
eecd56d6e0 | ||
|
|
1cd1423780 | ||
|
|
68812b0f04 | ||
|
|
c9d29c16e2 | ||
|
|
185233c971 | ||
|
|
ca42976c62 | ||
|
|
9ff2b35ae0 | ||
|
|
ecb12ae2a8 | ||
|
|
b43e695da2 | ||
|
|
57b731842b | ||
|
|
a8ef091cd6 | ||
|
|
315923d1d3 | ||
|
|
632a564158 | ||
|
|
8365fcc2f9 | ||
|
|
2417741283 | ||
|
|
e0033965bc | ||
|
|
ae73583d53 | ||
|
|
b87764ed94 | ||
|
|
7e9e9cc98c | ||
|
|
658ed3d790 | ||
|
|
ed65e6df3b | ||
|
|
16906ee242 | ||
|
|
a611ff3abd | ||
|
|
8258fb059c | ||
|
|
122274bf52 | ||
|
|
c5d41c5a21 | ||
|
|
a2b6bc5213 | ||
|
|
cb5e88c2f1 | ||
|
|
8bc3bdd300 | ||
|
|
b3fa6378bd | ||
|
|
e406fda9cd | ||
|
|
30a755221b | ||
|
|
40efbc5b84 | ||
|
|
dc1a6ba8b5 | ||
|
|
709ebe524d | ||
|
|
fb94aaaa6f | ||
|
|
bae1e80ac0 | ||
|
|
4536930e17 | ||
|
|
189325508e | ||
|
|
c81e933dc3 | ||
|
|
85481b2310 | ||
|
|
b04f198f3e | ||
|
|
a989b5ccde | ||
|
|
4ee0f9b6be | ||
|
|
1d371e0a1e | ||
|
|
3ec7c6d18b | ||
|
|
80912ffaee | ||
|
|
4777fe0d91 | ||
|
|
feddb6d048 | ||
|
|
b148ec0850 | ||
|
|
1a36ed9786 | ||
|
|
1b7ad1fc38 | ||
|
|
71d4113ecf | ||
|
|
ed712fa673 | ||
|
|
fcb2af780d | ||
|
|
a8c8f9a472 | ||
|
|
ab1dd1e549 | ||
|
|
145983fc5d | ||
|
|
9fb45a3ab7 | ||
|
|
b97e5ff5b0 | ||
|
|
0ca04671ed | ||
|
|
6e062b241e | ||
|
|
df77276805 | ||
|
|
a85a694cc1 | ||
|
|
590fa0894b | ||
|
|
4d7f7d0756 | ||
|
|
af0d40e907 | ||
|
|
6f96b5dd14 |
4
.ackrc
Normal file
4
.ackrc
Normal file
@@ -0,0 +1,4 @@
|
||||
--ignore-dir=dist
|
||||
--ignore-file=match:/^yarn\.lock$/
|
||||
--ignore-file=match:/^yarn-error\.log$/
|
||||
--ignore-dir=coverage
|
||||
3
.commitlintrc.json
Normal file
3
.commitlintrc.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"]
|
||||
}
|
||||
11
.editorconfig
Normal file
11
.editorconfig
Normal file
@@ -0,0 +1,11 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
indent_size = 4
|
||||
6
.eslintignore
Normal file
6
.eslintignore
Normal file
@@ -0,0 +1,6 @@
|
||||
dist/**
|
||||
.github/**
|
||||
docs/Setup.md
|
||||
cypress.config.js
|
||||
cypress/plugins/index.js
|
||||
coverage
|
||||
137
.eslintrc.json
Normal file
137
.eslintrc.json
Normal file
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true,
|
||||
"jest/globals": true,
|
||||
"node": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaFeatures": {
|
||||
"experimentalObjectRestSpread": true,
|
||||
"jsx": true
|
||||
},
|
||||
"sourceType": "module"
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:json/recommended",
|
||||
"plugin:markdown/recommended",
|
||||
"plugin:@cspell/recommended",
|
||||
"prettier"
|
||||
],
|
||||
"plugins": [
|
||||
"@typescript-eslint",
|
||||
"no-only-tests",
|
||||
"html",
|
||||
"jest",
|
||||
"jsdoc",
|
||||
"json",
|
||||
"@cspell",
|
||||
"lodash",
|
||||
"unicorn"
|
||||
],
|
||||
"rules": {
|
||||
"curly": "error",
|
||||
"no-console": "error",
|
||||
"no-prototype-builtins": "off",
|
||||
"no-unused-vars": "off",
|
||||
"cypress/no-async-tests": "off",
|
||||
"@typescript-eslint/ban-ts-comment": [
|
||||
"error",
|
||||
{
|
||||
"ts-expect-error": "allow-with-description",
|
||||
"ts-ignore": "allow-with-description",
|
||||
"ts-nocheck": "allow-with-description",
|
||||
"ts-check": "allow-with-description",
|
||||
"minimumDescriptionLength": 10
|
||||
}
|
||||
],
|
||||
"json/*": ["error", "allowComments"],
|
||||
"@cspell/spellchecker": [
|
||||
"error",
|
||||
{
|
||||
"checkIdentifiers": false,
|
||||
"checkStrings": false,
|
||||
"checkStringTemplates": false
|
||||
}
|
||||
],
|
||||
"no-empty": [
|
||||
"error",
|
||||
{
|
||||
"allowEmptyCatch": true
|
||||
}
|
||||
],
|
||||
"no-only-tests/no-only-tests": "error",
|
||||
"lodash/import-scope": ["error", "method"],
|
||||
"unicorn/better-regex": "error",
|
||||
"unicorn/no-abusive-eslint-disable": "error",
|
||||
"unicorn/no-array-push-push": "error",
|
||||
"unicorn/no-for-loop": "error",
|
||||
"unicorn/no-instanceof-array": "error",
|
||||
"unicorn/no-typeof-undefined": "error",
|
||||
"unicorn/no-unnecessary-await": "error",
|
||||
"unicorn/no-unsafe-regex": "warn",
|
||||
"unicorn/no-useless-promise-resolve-reject": "error",
|
||||
"unicorn/prefer-array-find": "error",
|
||||
"unicorn/prefer-array-flat-map": "error",
|
||||
"unicorn/prefer-array-index-of": "error",
|
||||
"unicorn/prefer-array-some": "error",
|
||||
"unicorn/prefer-default-parameters": "error",
|
||||
"unicorn/prefer-includes": "error",
|
||||
"unicorn/prefer-negative-index": "error",
|
||||
"unicorn/prefer-object-from-entries": "error",
|
||||
"unicorn/prefer-string-starts-ends-with": "error",
|
||||
"unicorn/prefer-string-trim-start-end": "error",
|
||||
"unicorn/string-content": "error",
|
||||
"unicorn/prefer-spread": "error",
|
||||
"unicorn/no-lonely-if": "error"
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["cypress/**", "demos/**"],
|
||||
"rules": {
|
||||
"no-console": "off"
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.{js,jsx,mjs,cjs}"],
|
||||
"extends": ["plugin:jsdoc/recommended"],
|
||||
"rules": {
|
||||
"jsdoc/check-indentation": "off",
|
||||
"jsdoc/check-alignment": "off",
|
||||
"jsdoc/check-line-alignment": "off",
|
||||
"jsdoc/multiline-blocks": "off",
|
||||
"jsdoc/newline-after-description": "off",
|
||||
"jsdoc/tag-lines": "off",
|
||||
"jsdoc/require-param-description": "off",
|
||||
"jsdoc/require-param-type": "off",
|
||||
"jsdoc/require-returns": "off",
|
||||
"jsdoc/require-returns-description": "off"
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.{ts,tsx}"],
|
||||
"plugins": ["tsdoc"],
|
||||
"rules": {
|
||||
"tsdoc/syntax": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.spec.{ts,js}", "cypress/**", "demos/**", "**/docs/**"],
|
||||
"rules": {
|
||||
"jsdoc/require-jsdoc": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off"
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.html", "*.md", "**/*.md/*"],
|
||||
"rules": {
|
||||
"no-var": "error",
|
||||
"no-undef": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
* text=auto
|
||||
12
.github/FUNDING.yml
vendored
Normal file
12
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [knsv]
|
||||
#patreon: # Replace with a single Patreon username
|
||||
#open_collective: # Replace with a single Open Collective username
|
||||
#ko_fi: # Replace with a single Ko-fi username
|
||||
#tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
#community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
#liberapay: # Replace with a single Liberapay username
|
||||
#issuehunt: # Replace with a single IssueHunt username
|
||||
#otechie: # Replace with a single Otechie username
|
||||
#custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
69
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
69
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
name: Bug Report
|
||||
description: Create a report to help us improve
|
||||
labels:
|
||||
- 'Status: Triage'
|
||||
- 'Type: Bug / Error'
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |-
|
||||
## Security vulnerabilities
|
||||
Please refer our [Security Policy](https://github.com/mermaid-js/.github/blob/main/SECURITY.md) and report to keep vulnerabilities confidential so we can release fixes first.
|
||||
|
||||
## Before you submit...
|
||||
We like to help you, but in order to do that should you make a few things first:
|
||||
|
||||
- Use a clear and concise title
|
||||
- Fill out the text fields with as much detail as possible.
|
||||
- Never be shy to give us screenshots and/or code samples. It will help!
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
description: Give a clear and concise description of what the bug is.
|
||||
placeholder: When I do ... does ... happen.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: Give a step-by-step example on how to reproduce the bug.
|
||||
placeholder: |-
|
||||
1. Do this
|
||||
2. Do that
|
||||
3. ...
|
||||
4. Bug!
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Screenshots
|
||||
description: If applicable, add screenshots to help explain your issue.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Code Sample
|
||||
description: |-
|
||||
If applicable, add the code sample or a link to the [Live Editor](https://mermaid.live).
|
||||
Any text pasted here will be rendered as a Code block.
|
||||
render: text
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Setup
|
||||
description: |-
|
||||
Please fill out the below info.
|
||||
Note that you only need to fill out one and not both sections.
|
||||
value: |-
|
||||
**Desktop**
|
||||
|
||||
- OS and Version: [Windows, Linux, Mac, ...]
|
||||
- Browser and Version: [Chrome, Edge, Firefox]
|
||||
|
||||
**Smartphone**
|
||||
|
||||
- Device: [Samsung, iPhone, ...]
|
||||
- OS and Version: [Android, iOS, ...]
|
||||
- Browser and Version: [Chrome, Safari, ...]
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: Anything else to add?
|
||||
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: GitHub Discussions
|
||||
url: https://github.com/mermaid-js/mermaid/discussions
|
||||
about: Ask the Community questions or share your own graphs in our discussions.
|
||||
- name: Slack
|
||||
url: https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE
|
||||
about: Join our Community on Slack for Help and a casual chat.
|
||||
- name: Documentation
|
||||
url: https://mermaid-js.github.io
|
||||
about: Read our documentation for all that Mermaid.js can offer.
|
||||
- name: Live Editor
|
||||
url: https://mermaid.live
|
||||
about: Try the live editor to preview graphs in no time.
|
||||
42
.github/ISSUE_TEMPLATE/diagram_proposal.yml
vendored
Normal file
42
.github/ISSUE_TEMPLATE/diagram_proposal.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Diagram Proposal
|
||||
description: Suggest a new Diagram Type to add to Mermaid.
|
||||
labels:
|
||||
- 'Status: Triage'
|
||||
- 'Type: Enhancement'
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |-
|
||||
## Before you submit...
|
||||
First of all, thank you for proposing a new Diagram to us.
|
||||
We are always happy about new ideas to improve Mermaid.js wherever possible.
|
||||
|
||||
To get the fastest and best response possible, make sure you do the following:
|
||||
|
||||
- Use a clear and concise title
|
||||
- Fill out the text fields with as much detail as possible.
|
||||
- Never be shy to give us screenshots and/or code samples. It will help!
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Proposal
|
||||
description: A clear and concise description of what should be added to Mermaid.js.
|
||||
placeholder: Mermaid.js should add ... because ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Use Cases
|
||||
description: If applicable, give some use cases for where this diagram would be useful.
|
||||
placeholder: The Diagram could be used for ...
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Screenshots
|
||||
description: If applicable, add screenshots to show possible examples of how the diagram may look like.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Code Sample
|
||||
description: |-
|
||||
If applicable, add a code sample for how to implement this new diagram.
|
||||
The text will automatically be rendered as JavaScript code.
|
||||
render: javascript
|
||||
34
.github/ISSUE_TEMPLATE/syntax_proposal.yml
vendored
Normal file
34
.github/ISSUE_TEMPLATE/syntax_proposal.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Syntax Proposal
|
||||
description: Suggest a new Syntax to add to Mermaid.js.
|
||||
labels:
|
||||
- 'Status: Triage'
|
||||
- 'Type: Enhancement'
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |-
|
||||
## Before you submit...
|
||||
First of all, thank you for proposing a new Syntax to us.
|
||||
We are always happy about new ideas to improve Mermaid.js wherever possible.
|
||||
|
||||
To get the fastest and best response possible, make sure you do the following:
|
||||
|
||||
- Use a clear and concise title
|
||||
- Fill out the text fields with as much detail as possible. Examples are always welcome.
|
||||
- Never be shy to give us screenshots and/or code samples. It will help!
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Proposal
|
||||
description: A clear and concise description of what Syntax should be added to Mermaid.js.
|
||||
placeholder: Mermaid.js should add ... because ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Example
|
||||
description: If applicable, provide an example of the new Syntax.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Screenshots
|
||||
description: If applicable, add screenshots to show possible examples of how the theme may look like.
|
||||
42
.github/ISSUE_TEMPLATE/theme_proposal.yml
vendored
Normal file
42
.github/ISSUE_TEMPLATE/theme_proposal.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Theme Proposal
|
||||
description: Suggest a new theme to add to Mermaid.js.
|
||||
labels:
|
||||
- 'Status: Triage'
|
||||
- 'Type: Enhancement'
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |-
|
||||
## Before you submit...
|
||||
First of all, thank you for proposing a new Theme to us.
|
||||
We are always happy about new ideas to improve Mermaid.js wherever possible.
|
||||
|
||||
To get the fastest and best response possible, make sure you do the following:
|
||||
|
||||
- Use a clear and concise title
|
||||
- Fill out the text fields with as much detail as possible. Examples are always welcome!
|
||||
- Never be shy to give us screenshots and/or code samples. It will help!
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Proposal
|
||||
description: A clear and concise description of what theme should be added to Mermaid.js.
|
||||
placeholder: Mermaid.js should add ... because ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Colors
|
||||
description: |-
|
||||
A detailed list of the different colour values to use.
|
||||
A list of currently used variable names can be found [here](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table)
|
||||
placeholder: |-
|
||||
- background: #f4f4f4
|
||||
- primaryColor: #fff4dd
|
||||
- ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Screenshots
|
||||
description: If applicable, add screenshots to show possible examples of how the theme may look like.
|
||||
4
.github/codeql/codeql-config.yml
vendored
Normal file
4
.github/codeql/codeql-config.yml
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
name: 'CodeQL config'
|
||||
paths-ignore:
|
||||
- dist
|
||||
- cypress
|
||||
3
.github/pr-labeler.yml
vendored
Normal file
3
.github/pr-labeler.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
'Type: Bug / Error': 'bug/*'
|
||||
'Type: Enhancement': 'feature/*'
|
||||
'Type: Other': 'other/*'
|
||||
17
.github/pull_request_template.md
vendored
Normal file
17
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
## :bookmark_tabs: Summary
|
||||
|
||||
Brief description about the content of your PR.
|
||||
|
||||
Resolves #<your issue id here>
|
||||
|
||||
## :straight_ruler: Design Decisions
|
||||
|
||||
Describe the way your implementation works or what design decisions you made if applicable.
|
||||
|
||||
### :clipboard: Tasks
|
||||
|
||||
Make sure you
|
||||
|
||||
- [ ] :book: have read the [contribution guidelines](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md)
|
||||
- [ ] :computer: have added unit/e2e tests (if appropriate)
|
||||
- [ ] :bookmark: targeted `develop` branch
|
||||
25
.github/release-drafter.yml
vendored
Normal file
25
.github/release-drafter.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name-template: '$NEXT_PATCH_VERSION'
|
||||
tag-template: '$NEXT_PATCH_VERSION'
|
||||
categories:
|
||||
- title: '🚀 Features'
|
||||
labels:
|
||||
- 'Type: Enhancement'
|
||||
- title: '🐛 Bug Fixes'
|
||||
labels:
|
||||
- 'Type: Bug / Error'
|
||||
- title: '🧰 Maintenance'
|
||||
label: 'Type: Other'
|
||||
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
|
||||
sort-by: title
|
||||
sort-direction: ascending
|
||||
branches:
|
||||
- develop
|
||||
exclude-labels:
|
||||
- 'Skip changelog'
|
||||
no-changes-template: 'This release contains minor changes and bugfixes.'
|
||||
template: |
|
||||
# Release Notes
|
||||
|
||||
$CHANGES
|
||||
|
||||
🎉 **Thanks to all contributors helping with this release!** 🎉
|
||||
19
.github/stale.yml
vendored
Normal file
19
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 60
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 14
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- Retained
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: Inactive
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
If you are still interested in this issue and it is still relevant you can comment to revive it.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: >
|
||||
This issue has been been automatically closed due to a lack of activity.
|
||||
This is done to maintain a clean list of issues that the community is interested in developing.
|
||||
51
.github/workflows/build.yml
vendored
Normal file
51
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push: {}
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- ready_for_review
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
# uses version from "packageManager" field in package.json
|
||||
|
||||
- name: Setup Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Install Packages
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
env:
|
||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||
|
||||
- name: Run Build
|
||||
run: pnpm run build
|
||||
|
||||
- name: Upload Mermaid Build as Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mermaid-build
|
||||
path: packages/mermaid/dist
|
||||
|
||||
- name: Upload Mermaid Mindmap Build as Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mermaid-mindmap-build
|
||||
path: packages/mermaid-mindmap/dist
|
||||
35
.github/workflows/check-readme-in-sync.yml
vendored
Normal file
35
.github/workflows/check-readme-in-sync.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# Reference: https://github.com/Yash-Singh1/eslint-plugin-userscripts/blob/main/.github/workflows/readme-in-sync.yml
|
||||
|
||||
name: Check if README and docs/README are in sync
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- gh-pages
|
||||
pull_request:
|
||||
branches:
|
||||
- gh-pages
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Check for difference in README.md and docs/README.md
|
||||
run: |
|
||||
if [ -z "$(diff README.md docs/README.md --brief)" ]
|
||||
then
|
||||
echo "README.md and docs/README.md are in sync"
|
||||
else
|
||||
echo "Make sure that README.md and docs/README.md are in sync"
|
||||
echo
|
||||
echo "Difference:"
|
||||
echo
|
||||
diff README.md docs/README.md -u
|
||||
exit 1
|
||||
fi
|
||||
25
.github/workflows/checks.yml
vendored
Normal file
25
.github/workflows/checks.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
on:
|
||||
push: {}
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- ready_for_review
|
||||
|
||||
name: Static analysis
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
name: check tests
|
||||
if: github.repository_owner == 'mermaid-js'
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: testomatio/check-tests@stable
|
||||
with:
|
||||
framework: cypress
|
||||
tests: './cypress/e2e/**/**.spec.js'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
has-tests-label: true
|
||||
62
.github/workflows/codeql.yml
vendored
Normal file
62
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
name: 'CodeQL'
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [develop]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [develop]
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- ready_for_review
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: ['javascript']
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
config-file: ./.github/codeql/codeql-config.yml
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
20
.github/workflows/dependency-review.yml
vendored
Normal file
20
.github/workflows/dependency-review.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# Dependency Review Action
|
||||
#
|
||||
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
||||
#
|
||||
# Source repository: https://github.com/actions/dependency-review-action
|
||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
||||
name: 'Dependency Review'
|
||||
on: [pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v2
|
||||
72
.github/workflows/e2e-applitools.yml
vendored
Normal file
72
.github/workflows/e2e-applitools.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
name: E2E (Applitools)
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
# Because we want to limit Applitools usage, so we only want to start this
|
||||
# workflow on rare occasions/manually.
|
||||
inputs:
|
||||
parent_branch:
|
||||
required: true
|
||||
type: string
|
||||
default: master
|
||||
description: 'Parent branch to use for PRs'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
# on PRs from forks, this secret will always be empty, for security reasons
|
||||
USE_APPLI: ${{ secrets.APPLITOOLS_API_KEY && 'true' || '' }}
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
steps:
|
||||
- if: ${{ ! env.USE_APPLI }}
|
||||
name: Warn if not using Applitools
|
||||
run: |
|
||||
echo "::error,title=Not using Applitols::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
# uses version from "packageManager" field in package.json
|
||||
|
||||
- name: Setup Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Install Packages
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
env:
|
||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||
|
||||
- if: ${{ env.USE_APPLI }}
|
||||
name: Notify applitools of new batch
|
||||
# Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html
|
||||
run: curl -L -d '' -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH"
|
||||
env:
|
||||
# e.g. mermaid-js/mermaid/my-branch
|
||||
APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }}
|
||||
APPLITOOLS_PARENT_BRANCH: ${{ github.inputs.parent_branch }}
|
||||
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
|
||||
APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com'
|
||||
|
||||
- name: Run E2E Tests
|
||||
run: pnpm run e2e
|
||||
env:
|
||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||
# Mermaid applitools.config.js uses this to pick batch name.
|
||||
APPLI_BRANCH: ${{ github.ref_name }}
|
||||
APPLITOOLS_BATCH_ID: ${{ github.sha }}
|
||||
# e.g. mermaid-js/mermaid/my-branch
|
||||
APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }}
|
||||
APPLITOOLS_PARENT_BRANCH: ${{ github.inputs.parent_branch }}
|
||||
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
|
||||
APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com'
|
||||
46
.github/workflows/e2e.yml
vendored
Normal file
46
.github/workflows/e2e.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
name: E2E
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
containers: [1, 2, 3, 4]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
# uses version from "packageManager" field in package.json
|
||||
|
||||
- name: Setup Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
# Need to skip setup if Cypress run is skipped, otherwise an error
|
||||
# is thrown since the pnpm cache step fails
|
||||
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
# Install NPM dependencies, cache them correctly
|
||||
# and run all Cypress tests
|
||||
- name: Cypress run
|
||||
uses: cypress-io/github-action@v4
|
||||
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
||||
# Otherwise (e.g. if running from fork), we run on a single container only
|
||||
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
||||
with:
|
||||
start: pnpm run dev
|
||||
wait-on: 'http://localhost:9000'
|
||||
# Disable recording if we don't have an API key
|
||||
# e.g. if this action was run from a fork
|
||||
record: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||
env:
|
||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||
14
.github/workflows/issue-triage.yml
vendored
Normal file
14
.github/workflows/issue-triage.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
name: Apply triage label to new issue
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: andymckay/labeler@1.0.4
|
||||
with:
|
||||
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||
add-labels: 'Status: Triage'
|
||||
45
.github/workflows/link-checker.yml
vendored
Normal file
45
.github/workflows/link-checker.yml
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
# This Link Checker is run on all documentation files once per week.
|
||||
|
||||
# references:
|
||||
# - https://github.com/lycheeverse/lychee-action
|
||||
# - https://github.com/lycheeverse/lychee
|
||||
|
||||
name: Link Checker
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- develop
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- develop
|
||||
- master
|
||||
schedule:
|
||||
# * is a special character in YAML so you have to quote this string
|
||||
- cron: '30 8 * * 5'
|
||||
|
||||
jobs:
|
||||
linkChecker:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
# lychee only uses the GITHUB_TOKEN to avoid rate-limiting
|
||||
contents: read
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Restore lychee cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: .lycheecache
|
||||
key: cache-lychee-${{ github.sha }}
|
||||
restore-keys: cache-lychee-
|
||||
|
||||
- name: Link Checker
|
||||
uses: lycheeverse/lychee-action@v1.5.4
|
||||
with:
|
||||
args: --verbose --no-progress --cache --max-cache-age 1d packages/mermaid/src/docs/**/*.md README.md README.zh-CN.md
|
||||
fail: true
|
||||
jobSummary: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
43
.github/workflows/lint.yml
vendored
Normal file
43
.github/workflows/lint.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Lint
|
||||
|
||||
on:
|
||||
push: {}
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- ready_for_review
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
# uses version from "packageManager" field in package.json
|
||||
|
||||
- name: Setup Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Install Packages
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
env:
|
||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||
|
||||
- name: Run Linting
|
||||
run: pnpm run lint
|
||||
|
||||
- name: Verify Docs
|
||||
working-directory: ./packages/mermaid
|
||||
run: pnpm run docs:verify
|
||||
19
.github/workflows/pr-labeler-config-validator.yml
vendored
Normal file
19
.github/workflows/pr-labeler-config-validator.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
name: Validate PR Labeler Configuration
|
||||
on:
|
||||
push: {}
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- ready_for_review
|
||||
|
||||
jobs:
|
||||
pr-labeler:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Validate Configuration
|
||||
uses: Yash-Singh1/pr-labeler-config-validator@releases/v0.0.3
|
||||
with:
|
||||
configuration-path: .github/pr-labeler.yml
|
||||
13
.github/workflows/pr-labeler.yml
vendored
Normal file
13
.github/workflows/pr-labeler.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
name: Apply labels to PR
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
pr-labeler:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Label PR
|
||||
uses: TimonVS/pr-labeler-action@v3
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
62
.github/workflows/publish-docs.yml
vendored
Normal file
62
.github/workflows/publish-docs.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
name: Deploy Vitepress docs to Pages
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow one concurrent deployment
|
||||
concurrency:
|
||||
group: 'pages'
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# Build job
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: 18
|
||||
|
||||
- name: Install Packages
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v2
|
||||
|
||||
- name: Run Build
|
||||
run: pnpm --filter mermaid run docs:build:vitepress
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
with:
|
||||
path: packages/mermaid/src/vitepress/.vitepress/dist
|
||||
|
||||
# Deployment job
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v1
|
||||
15
.github/workflows/release-draft.yml
vendored
Normal file
15
.github/workflows/release-draft.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
name: Draft Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
draft-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Draft Release
|
||||
uses: toolmantim/release-drafter@v5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
44
.github/workflows/release-preview-publish.yml
vendored
Normal file
44
.github/workflows/release-preview-publish.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
name: Publish release preview package
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'release/**'
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: 18.x
|
||||
|
||||
- name: Install Packages
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
env:
|
||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||
|
||||
- name: Install Json
|
||||
run: npm i json --global
|
||||
|
||||
- name: Publish
|
||||
working-directory: ./packages/mermaid
|
||||
run: |
|
||||
PREVIEW_VERSION=$(git log --oneline "origin/$GITHUB_REF_NAME" ^"origin/master" | wc -l)
|
||||
VERSION=$(echo ${{github.ref}} | tail -c +20)-preview.$PREVIEW_VERSION
|
||||
echo $VERSION
|
||||
npm version --no-git-tag-version --allow-same-version $VERSION
|
||||
npm set //npm.pkg.github.com/:_authToken ${{ secrets.GITHUB_TOKEN }}
|
||||
npm set registry https://npm.pkg.github.com/mermaid-js
|
||||
json -I -f package.json -e 'this.name="@mermaid-js/mermaid"' # Package name needs to be set to a scoped one because GitHub registry requires this
|
||||
json -I -f package.json -e 'this.repository="git://github.com/mermaid-js/mermaid"' # Repo url needs to have a specific format too
|
||||
npm publish
|
||||
44
.github/workflows/release-publish.yml
vendored
Normal file
44
.github/workflows/release-publish.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
name: Publish release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: fregante/setup-git-user@v1
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18.x
|
||||
- name: Install Yarn
|
||||
run: npm i yarn --global
|
||||
|
||||
- name: Install Json
|
||||
run: npm i json --global
|
||||
|
||||
- name: Install Packages
|
||||
run: yarn install --frozen-lockfile
|
||||
|
||||
- name: Prepare release
|
||||
run: |
|
||||
VERSION=${GITHUB_REF:10}
|
||||
echo "Preparing release $VERSION"
|
||||
git checkout -t origin/release/$VERSION
|
||||
npm version --no-git-tag-version --allow-same-version $VERSION
|
||||
git add package.json
|
||||
git commit -m "Bump version $VERSION"
|
||||
git checkout -t origin/master
|
||||
git merge -m "Release $VERSION" --no-ff release/$VERSION
|
||||
git push --no-verify
|
||||
|
||||
- name: Publish
|
||||
run: |
|
||||
npm set //registry.npmjs.org/:_authToken $NPM_TOKEN
|
||||
npm publish
|
||||
env:
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
43
.github/workflows/test.yml
vendored
Normal file
43
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Unit Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
# uses version from "packageManager" field in package.json
|
||||
|
||||
- name: Setup Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
cache: pnpm
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Install Packages
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
env:
|
||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||
|
||||
- name: Run Unit Tests
|
||||
run: |
|
||||
pnpm run ci --coverage
|
||||
|
||||
- name: Upload Coverage to Coveralls
|
||||
# it feels a bit weird to use @master, but that's what the docs use
|
||||
# (coveralls also doesn't publish a @v1 we can use)
|
||||
# https://github.com/marketplace/actions/coveralls-github-action
|
||||
uses: coverallsapp/github-action@master
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
flag-name: unit
|
||||
13
.github/workflows/unlock-reopened-issues.yml
vendored
Normal file
13
.github/workflows/unlock-reopened-issues.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
name: Unlock reopened issue
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [reopened]
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: Dunning-Kruger/unlock-issues@v1
|
||||
with:
|
||||
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||
18
.github/workflows/update-browserlist.yml
vendored
Normal file
18
.github/workflows/update-browserlist.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
name: Update Browserslist
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 7 * * 1'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- run: npx browserslist@latest --update-db
|
||||
- name: Commit changes
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
author_name: ${{ github.actor }}
|
||||
author_email: ${{ github.actor }}@users.noreply.github.com
|
||||
message: 'chore: update browsers list'
|
||||
43
.gitignore
vendored
43
.gitignore
vendored
@@ -1,7 +1,38 @@
|
||||
node_modules/*
|
||||
bower_components/
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
.DS_Store
|
||||
.idea
|
||||
coverage
|
||||
|
||||
node_modules/
|
||||
coverage/
|
||||
.idea/
|
||||
|
||||
dist
|
||||
|
||||
yarn-error.log
|
||||
.npmrc
|
||||
token
|
||||
|
||||
package-lock.json
|
||||
|
||||
# ignore files in /.vscode/ except for launch.json and extensions.json
|
||||
/.vscode/**
|
||||
!/.vscode/launch.json
|
||||
!/.vscode/extensions.json
|
||||
|
||||
cypress/platform/current.html
|
||||
cypress/platform/experimental.html
|
||||
local/
|
||||
|
||||
_site
|
||||
Gemfile.lock
|
||||
/.vs
|
||||
|
||||
cypress/screenshots/
|
||||
cypress/snapshots/
|
||||
|
||||
# eslint --cache file
|
||||
.eslintcache
|
||||
.tsbuildinfo
|
||||
tsconfig.tsbuildinfo
|
||||
|
||||
knsv*.html
|
||||
local*.html
|
||||
stats/
|
||||
|
||||
4
.husky/commit-msg
Executable file
4
.husky/commit-msg
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
# . "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
# npx --no-install commitlint --edit $1
|
||||
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
pnpm run pre-commit
|
||||
5
.lintstagedrc.mjs
Normal file
5
.lintstagedrc.mjs
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'!(docs/**/*)*.{ts,js,json,html,md,mts}': ['eslint --fix', 'prettier --write'],
|
||||
'cSpell.json': ['ts-node-esm scripts/fixCSpell.ts'],
|
||||
'**/*.jison': ['pnpm -w run lint:jison'],
|
||||
};
|
||||
13
.lycheeignore
Normal file
13
.lycheeignore
Normal file
@@ -0,0 +1,13 @@
|
||||
# These links are ignored by our link checker https://github.com/lycheeverse/lychee
|
||||
# The file allows you to list multiple regular expressions for exclusion (one pattern per line).
|
||||
|
||||
# Network error: Forbidden
|
||||
https://codepen.io
|
||||
|
||||
# Network error: The certificate was not trusted
|
||||
https://mkdocs.org/
|
||||
https://osawards.com/javascript/#nominees
|
||||
https://osawards.com/javascript/2019
|
||||
|
||||
# Don't check files that are generated during the build via `pnpm docs:code`
|
||||
packages/mermaid/src/docs/config/setup/*
|
||||
3
.npmrc
Normal file
3
.npmrc
Normal file
@@ -0,0 +1,3 @@
|
||||
auto-install-peers=true
|
||||
strict-peer-dependencies=false
|
||||
use-inline-specifiers-lockfile-format=true
|
||||
6
.percy.yml
Normal file
6
.percy.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
version: 2
|
||||
snapshot:
|
||||
widths:
|
||||
- 1280
|
||||
discovery:
|
||||
disable-cache: true
|
||||
7
.prettierignore
Normal file
7
.prettierignore
Normal file
@@ -0,0 +1,7 @@
|
||||
dist
|
||||
cypress/platform/xss3.html
|
||||
.cache
|
||||
coverage
|
||||
# Autogenerated by PNPM
|
||||
pnpm-lock.yaml
|
||||
stats
|
||||
7
.prettierrc.json
Normal file
7
.prettierrc.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"endOfLine": "auto",
|
||||
"printWidth": 100,
|
||||
"singleQuote": true,
|
||||
"useTabs": false,
|
||||
"tabWidth": 2
|
||||
}
|
||||
15
.tern-project
Normal file
15
.tern-project
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"ecmaVersion": 6,
|
||||
"libs": ["browser"],
|
||||
"loadEagerly": [],
|
||||
"dontLoad": ["node_modules/**"],
|
||||
"plugins": {
|
||||
"modules": {},
|
||||
"es_modules": {},
|
||||
"node": {},
|
||||
"doc_comment": {
|
||||
"fullDocs": true,
|
||||
"strong": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
addons:
|
||||
code_climate:
|
||||
repo_token: e87e6bf1c253e0555437ebd23235fdfe2749b889358e7c6d100e4ea5b4f2e091
|
||||
after_script:
|
||||
- cat coverage/lcov.info | codeclimate
|
||||
159
.vite/build.ts
Normal file
159
.vite/build.ts
Normal file
@@ -0,0 +1,159 @@
|
||||
import { build, InlineConfig, type PluginOption } from 'vite';
|
||||
import { resolve } from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import jisonPlugin from './jisonPlugin.js';
|
||||
import { readFileSync } from 'fs';
|
||||
import { visualizer } from 'rollup-plugin-visualizer';
|
||||
import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
|
||||
|
||||
const visualize = process.argv.includes('--visualize');
|
||||
const watch = process.argv.includes('--watch');
|
||||
const mermaidOnly = process.argv.includes('--mermaid');
|
||||
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
||||
|
||||
type OutputOptions = Exclude<
|
||||
Exclude<InlineConfig['build'], undefined>['rollupOptions'],
|
||||
undefined
|
||||
>['output'];
|
||||
|
||||
const visualizerOptions = (packageName: string, core = false): PluginOption[] => {
|
||||
if (packageName !== 'mermaid' || !visualize) {
|
||||
return [];
|
||||
}
|
||||
return ['network', 'treemap', 'sunburst'].map((chartType) =>
|
||||
visualizer({
|
||||
filename: `./stats/${chartType}${core ? '.core' : ''}.html`,
|
||||
template: chartType as TemplateType,
|
||||
gzipSize: true,
|
||||
brotliSize: true,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
const packageOptions = {
|
||||
mermaid: {
|
||||
name: 'mermaid',
|
||||
packageName: 'mermaid',
|
||||
file: 'mermaid.ts',
|
||||
},
|
||||
'mermaid-mindmap': {
|
||||
name: 'mermaid-mindmap',
|
||||
packageName: 'mermaid-mindmap',
|
||||
file: 'detector.ts',
|
||||
},
|
||||
// 'mermaid-example-diagram-detector': {
|
||||
// name: 'mermaid-example-diagram-detector',
|
||||
// packageName: 'mermaid-example-diagram',
|
||||
// file: 'detector.ts',
|
||||
// },
|
||||
};
|
||||
|
||||
interface BuildOptions {
|
||||
minify: boolean | 'esbuild';
|
||||
core?: boolean;
|
||||
watch?: boolean;
|
||||
entryName: keyof typeof packageOptions;
|
||||
}
|
||||
|
||||
export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => {
|
||||
const external: (string | RegExp)[] = ['require', 'fs', 'path'];
|
||||
console.log(entryName, packageOptions[entryName]);
|
||||
const { name, file, packageName } = packageOptions[entryName];
|
||||
let output: OutputOptions = [
|
||||
{
|
||||
name,
|
||||
format: 'esm',
|
||||
sourcemap: true,
|
||||
entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
|
||||
},
|
||||
{
|
||||
name,
|
||||
format: 'umd',
|
||||
sourcemap: true,
|
||||
entryFileNames: `${name}${minify ? '.min' : ''}.js`,
|
||||
},
|
||||
];
|
||||
|
||||
if (core) {
|
||||
const { dependencies } = JSON.parse(
|
||||
readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8')
|
||||
);
|
||||
// Core build is used to generate file without bundled dependencies.
|
||||
// This is used by downstream projects to bundle dependencies themselves.
|
||||
// Ignore dependencies and any dependencies of dependencies
|
||||
// Adapted from the RegEx used by `rollup-plugin-node`
|
||||
external.push(new RegExp('^(?:' + Object.keys(dependencies).join('|') + ')(?:/.+)?$'));
|
||||
// This needs to be an array. Otherwise vite will build esm & umd with same name and overwrite esm with umd.
|
||||
output = [
|
||||
{
|
||||
name,
|
||||
format: 'esm',
|
||||
sourcemap: true,
|
||||
entryFileNames: `${name}.core.mjs`,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
const config: InlineConfig = {
|
||||
configFile: false,
|
||||
build: {
|
||||
emptyOutDir: false,
|
||||
outDir: resolve(__dirname, `../packages/${packageName}/dist`),
|
||||
lib: {
|
||||
entry: resolve(__dirname, `../packages/${packageName}/src/${file}`),
|
||||
name,
|
||||
// the proper extensions will be added
|
||||
fileName: name,
|
||||
},
|
||||
minify,
|
||||
rollupOptions: {
|
||||
external,
|
||||
output,
|
||||
},
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.jison', '.js', '.ts', '.json'],
|
||||
},
|
||||
plugins: [jisonPlugin(), ...visualizerOptions(packageName, core)],
|
||||
};
|
||||
|
||||
if (watch && config.build) {
|
||||
config.build.watch = {
|
||||
include: [
|
||||
'packages/mermaid-mindmap/src/**',
|
||||
'packages/mermaid/src/**',
|
||||
// 'packages/mermaid-example-diagram/src/**',
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
return config;
|
||||
};
|
||||
|
||||
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
||||
return Promise.allSettled([
|
||||
build(getBuildConfig({ minify: false, entryName })),
|
||||
build(getBuildConfig({ minify: 'esbuild', entryName })),
|
||||
build(getBuildConfig({ minify: false, core: true, entryName })),
|
||||
]);
|
||||
};
|
||||
|
||||
const main = async () => {
|
||||
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
||||
for (const pkg of packageNames.filter((pkg) => !mermaidOnly || pkg === 'mermaid')) {
|
||||
await buildPackage(pkg);
|
||||
}
|
||||
};
|
||||
|
||||
if (watch) {
|
||||
build(getBuildConfig({ minify: false, watch, core: true, entryName: 'mermaid' }));
|
||||
if (!mermaidOnly) {
|
||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' }));
|
||||
// build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
||||
}
|
||||
} else if (visualize) {
|
||||
await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' }));
|
||||
await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
|
||||
} else {
|
||||
void main();
|
||||
}
|
||||
17
.vite/jisonPlugin.ts
Normal file
17
.vite/jisonPlugin.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { transformJison } from './jisonTransformer.js';
|
||||
const fileRegex = /\.(jison)$/;
|
||||
|
||||
export default function jison() {
|
||||
return {
|
||||
name: 'jison',
|
||||
|
||||
transform(src: string, id: string) {
|
||||
if (fileRegex.test(id)) {
|
||||
return {
|
||||
code: transformJison(src),
|
||||
map: null, // provide source map if available
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
17
.vite/jisonTransformer.ts
Normal file
17
.vite/jisonTransformer.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
// @ts-ignore No typings for jison
|
||||
import jison from 'jison';
|
||||
|
||||
export const transformJison = (src: string): string => {
|
||||
// @ts-ignore No typings for jison
|
||||
const parser = new jison.Generator(src, {
|
||||
moduleType: 'js',
|
||||
'token-stack': true,
|
||||
});
|
||||
const source = parser.generate({ moduleMain: '() => {}' });
|
||||
const exporter = `
|
||||
parser.parser = parser;
|
||||
export { parser };
|
||||
export default parser;
|
||||
`;
|
||||
return `${source} ${exporter}`;
|
||||
};
|
||||
37
.vite/server.ts
Normal file
37
.vite/server.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import express, { NextFunction, Request, Response } from 'express';
|
||||
import { createServer as createViteServer } from 'vite';
|
||||
// import { getBuildConfig } from './build';
|
||||
|
||||
const cors = (req: Request, res: Response, next: NextFunction) => {
|
||||
res.header('Access-Control-Allow-Origin', '*');
|
||||
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
|
||||
res.header('Access-Control-Allow-Headers', 'Content-Type');
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
async function createServer() {
|
||||
const app = express();
|
||||
|
||||
// Create Vite server in middleware mode
|
||||
const vite = await createViteServer({
|
||||
configFile: './vite.config.ts',
|
||||
server: { middlewareMode: true },
|
||||
appType: 'custom', // don't include Vite's default HTML handling middlewares
|
||||
});
|
||||
|
||||
app.use(cors);
|
||||
app.use(express.static('./packages/mermaid/dist'));
|
||||
app.use(express.static('./packages/mermaid-example-diagram/dist'));
|
||||
app.use(express.static('./packages/mermaid-mindmap/dist'));
|
||||
app.use(vite.middlewares);
|
||||
app.use(express.static('demos'));
|
||||
app.use(express.static('cypress/platform'));
|
||||
|
||||
app.listen(9000, () => {
|
||||
console.log(`Listening on http://localhost:9000`);
|
||||
});
|
||||
}
|
||||
|
||||
// build(getBuildConfig({ minify: false, watch: true }));
|
||||
createServer();
|
||||
8
.vscode/extensions.json
vendored
Normal file
8
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"zixuanchen.vitest-explorer",
|
||||
"luniclynx.bison"
|
||||
]
|
||||
}
|
||||
28
.vscode/launch.json
vendored
Normal file
28
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Debug Current Test File",
|
||||
"autoAttachChildProcesses": true,
|
||||
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
|
||||
"program": "${workspaceRoot}/node_modules/vitest/vitest.mjs",
|
||||
"args": ["run", "${relativeFile}"],
|
||||
"smartStep": true,
|
||||
"console": "integratedTerminal"
|
||||
},
|
||||
{
|
||||
"name": "Docs generation",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"args": ["src/docs.mts"],
|
||||
"runtimeArgs": ["--loader", "ts-node/esm"],
|
||||
"cwd": "${workspaceRoot}/packages/mermaid",
|
||||
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
|
||||
"smartStep": true,
|
||||
"internalConsoleOptions": "openOnSessionStart"
|
||||
}
|
||||
]
|
||||
}
|
||||
1292
CHANGELOG.md
1292
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
128
CODE_OF_CONDUCT.md
Normal file
128
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
- Demonstrating empathy and kindness toward other people
|
||||
- Being respectful of differing opinions, viewpoints, and experiences
|
||||
- Giving and gracefully accepting constructive feedback
|
||||
- Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
- Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
- The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
- Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
- Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at security@mermaid.live
|
||||
.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
192
CONTRIBUTING.md
192
CONTRIBUTING.md
@@ -1,68 +1,156 @@
|
||||
# How to contribute
|
||||
# Contributing
|
||||
|
||||
Great that you want to be involved in this project! Contributing is fun and contributions are GREAT! :)
|
||||
So you want to help? That's great!
|
||||
|
||||
This page is currently a starting point and is not so rigorous to start with.
|
||||

|
||||
|
||||
Some important guidlines:
|
||||
Here are a few things to know to get you started on the right path.
|
||||
|
||||
* The work will be organized using the issues list
|
||||
* In the list there will be the bugs/enhancements etc we are working with in the project
|
||||
* There will be milestones outlineing the roadmap ahead
|
||||
* There will issues marked with help wanted
|
||||
Below link will help you making a copy of the repository in your local system.
|
||||
|
||||
The issue list and the items marked with **help wanted** is a good starting point if you want to do some work.
|
||||
https://docs.github.com/en/get-started/quickstart/fork-a-repo
|
||||
|
||||
## Guidelines for avoiding duplicate work
|
||||
## Requirements
|
||||
|
||||
Contributing is great. It is not so fun when you are done with your issue and just before you're about to push your
|
||||
change you can't because someone else just pushed the same fix so you have wasted your time. The guidelines below are in
|
||||
place to prevent this:
|
||||
- [volta](https://volta.sh/) to manage node versions.
|
||||
- [Node.js](https://nodejs.org/en/). `volta install node`
|
||||
- [pnpm](https://pnpm.io/) package manager. `volta install pnpm`
|
||||
|
||||
* Comment in the issue that you are working on it. You will then be added as an assignee (eventually).
|
||||
* When you pick an issue to work on.
|
||||
* Check that the issue not assigned
|
||||
* Also check the comments so that no one has started working on it before beeing officially assigned.
|
||||
## Development Installation
|
||||
|
||||
|
||||
## Submitting changes
|
||||
Please send a GitHub Pull Request with a clear list of what you've done (read more about pull requests). When you send
|
||||
a pull request, we will love you forever if you include jasmine tests. We can always use more test coverage.
|
||||
|
||||
Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this:
|
||||
|
||||
$ git commit -m "A brief summary of the commit
|
||||
>
|
||||
> A paragraph describing what changed and its impact."
|
||||
Coding conventions
|
||||
Start reading our code and you'll get the hang of it. We optimize for readability:
|
||||
|
||||
This is open source software. Consider the people who will read your code, and make it look nice for them. It's sort of
|
||||
like driving a car: Perhaps you love doing donuts when you're alone, but with passengers the goal is to make the ride as
|
||||
smooth as possible.
|
||||
|
||||
So that we can consistently serve images from the CDN, always use image_path or image_tag when referring to images.
|
||||
Never prepend "/images/" when using image_path or image_tag.
|
||||
Also for the CDN, always use cwd-relative paths rather than root-relative paths in image URLs in any CSS. So instead of
|
||||
url('/images/blah.gif'), use url('../images/blah.gif').
|
||||
|
||||
# Build instructions
|
||||
Fork, then:
|
||||
|
||||
```
|
||||
npm install
|
||||
```bash
|
||||
git clone git@github.com:mermaid-js/mermaid.git
|
||||
cd mermaid
|
||||
# npx is required for first install as volta support for pnpm is not added yet.
|
||||
npx pnpm install
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Then the dependencies will have been installed. You use gulp as build tool.
|
||||
## Committing code
|
||||
|
||||
The following targets are probably interesting:
|
||||
We make all changes via pull requests. As we have many pull requests from developers new to mermaid, the current approach is to have _knsv, Knut Sveidqvist_ as a main reviewer of changes and merging pull requests. More precisely like this:
|
||||
|
||||
* jison - compiles the jison grammars to parser files
|
||||
* jasmine - runs the jasmine tests (will trigger the jison target)
|
||||
* dist - complies files to the dist catalog
|
||||
- Large changes reviewed by knsv or other developer asked to review by knsv
|
||||
- Smaller low-risk changes like dependencies, documentation, etc. can be merged by active collaborators
|
||||
- Documentation (updates to the `package/mermaid/src/docs` folder is also allowed via direct commits)
|
||||
|
||||
To commit code, create a branch, let it start with the type like feature or bug followed by the issue number for reference and some describing text.
|
||||
|
||||
One example:
|
||||
|
||||
`feature/945_state_diagrams`
|
||||
|
||||
Another:
|
||||
|
||||
`bug/123_nasty_bug_branch`
|
||||
|
||||
## Committing documentation
|
||||
|
||||
Less strict here, it is OK to commit directly in the `develop` branch if you are a collaborator.
|
||||
|
||||
The documentation is written in **Markdown**. For more information about Markdown [see the GitHub Markdown help page](https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax).
|
||||
|
||||
### Documentation source files are in [`/packages/mermaid/src/docs`](packages/mermaid/src/docs)
|
||||
|
||||
The source files for the project documentation are located in the [`/packages/mermaid/src/docs`](packages/mermaid/src/docs) directory. This is where you should make changes.
|
||||
The files under `/packages/mermaid/src/docs` are processed to generate the published documentation, and the resulting files are put into the `/docs` directory.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
classDef default fill:#fff,color:black,stroke:black
|
||||
|
||||
source["files in /packages/mermaid/src/docs\n(changes should be done here)"] -- automatic processing\nto generate the final documentation--> published["files in /docs\ndisplayed on the official documentation site"]
|
||||
|
||||
for instance:
|
||||
```
|
||||
gulp jasmine
|
||||
|
||||
**_DO NOT CHANGE FILES IN `/docs`_**
|
||||
|
||||
### The official documentation site
|
||||
|
||||
**[The mermaid documentation site](https://mermaid-js.github.io/mermaid/) is powered by [Vitepress](https://vitepress.vuejs.org/), a simple documentation site generator.**
|
||||
|
||||
If you want to preview the whole documentation site on your machine:
|
||||
|
||||
```sh
|
||||
cd packages/mermaid
|
||||
pnpm i
|
||||
pnpm docs:dev
|
||||
```
|
||||
Thanks, Knut Sveidqvist
|
||||
|
||||
You can now build and serve the documentation site:
|
||||
|
||||
```sh
|
||||
pnpm docs:serve
|
||||
```
|
||||
|
||||
## Branching
|
||||
|
||||
Going forward we will use a git flow inspired approach to branching. So development is done in develop, to do the development in the develop.
|
||||
|
||||
Once development is done we branch a release branch from develop for testing.
|
||||
|
||||
Once the release happens we merge the release branch to master and kill the release branch.
|
||||
|
||||
This means... **branch off your pull request from develop**
|
||||
|
||||
## Content of a pull request
|
||||
|
||||
A new feature has been born. Great! But without the steps below it might just ... fade away ...
|
||||
|
||||
### **Add unit tests for the parsing part**
|
||||
|
||||
This is important so that, if someone else does a change to the grammar that does not know about this great feature, gets notified early on when that change breaks the parser. Another important aspect is that without proper parsing tests refactoring is pretty much impossible.
|
||||
|
||||
### **Add e2e tests**
|
||||
|
||||
This tests the rendering and visual appearance of the diagram. This ensures that the rendering of that feature in the e2e will be reviewed in the release process going forward. Less chance that it breaks!
|
||||
|
||||
To start working with the e2e tests, run `pnpm run dev` to start the dev server, after that start cypress by running `pnpm exec cypress open` in the mermaid folder.
|
||||
|
||||
The rendering tests are very straightforward to create. There is a function imgSnapshotTest. This function takes a diagram in text form, the mermaid options and renders that diagram in cypress.
|
||||
|
||||
When running in ci it will take a snapshot of the rendered diagram and compare it with the snapshot from last build and flag for review it if it differs.
|
||||
|
||||
This is what a rendering test looks like:
|
||||
|
||||
```javascript
|
||||
it('should render forks and joins', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state fork_state <<fork>>
|
||||
[*] --> fork_state
|
||||
fork_state --> State2
|
||||
fork_state --> State3
|
||||
|
||||
state join_state <<join>>
|
||||
State2 --> join_state
|
||||
State3 --> join_state
|
||||
join_state --> State4
|
||||
State4 --> [*]
|
||||
`,
|
||||
{ logLevel: 0 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
```
|
||||
|
||||
### **Add documentation for it**
|
||||
|
||||
Finally, if it is not in the documentation, no one will know about it and then **no one will use it**. Wouldn't that be sad? With all the effort that was put into the feature?
|
||||
|
||||
The source files for documentation are in `/packages/mermaid/src/docs` and are written in markdown. Just pick the right section and start typing. See the [Committing Documentation](#committing-documentation) section for more about how the documentation is generated.
|
||||
|
||||
#### Adding to or changing the documentation organization
|
||||
|
||||
If you want to add a new section or change the organization (structure), then you need to make sure to **change the side navigation** in `mermaid/src/docs/.vitepress/config.js`.
|
||||
|
||||
When changes are committed and then released, they become part of the `master` branch and become part of the published documentation on https://mermaid-js.github.io/mermaid/
|
||||
|
||||
## Last words
|
||||
|
||||
Don't get daunted if it is hard in the beginning. We have a great community with only encouraging words. So if you get stuck, ask for help and hints in the slack forum. If you want to show off something good, show it off there.
|
||||
|
||||
[Join our slack community if you want closer contact!](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
||||
|
||||

|
||||
|
||||
3
LICENSE
3
LICENSE
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Knut Sveidqvist
|
||||
Copyright (c) 2014 - 2022 Knut Sveidqvist
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
397
README.md
397
README.md
@@ -1,69 +1,350 @@
|
||||
# mermaid
|
||||
|
||||
mermaid [](https://travis-ci.org/knsv/mermaid) [](https://codeclimate.com/github/knsv/mermaid)
|
||||
=======
|
||||
[](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [](https://www.npmjs.com/package/mermaid) [](https://bundlephobia.com/package/mermaid) [](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [](https://www.jsdelivr.com/package/npm/mermaid) [](https://www.npmjs.com/package/mermaid) [](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [](https://twitter.com/mermaidjs_)
|
||||
|
||||
Generation of diagrams and flowcharts from text in a similar manner as markdown.
|
||||
English | [简体中文](./README.zh-CN.md)
|
||||
|
||||
Ever wanted to simplify documentation and avoid heavy tools like Visio when explaining your code?
|
||||
<img src="./img/header.png" alt="" />
|
||||
|
||||
This is why mermaid was born, a simple markdown-like script language for generating charts from text via javascript.
|
||||
:trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) in the category "The most exciting use of technology"!!!**
|
||||
|
||||
The code below would render the following image
|
||||
<table>
|
||||
<tr><th>Code</th><th>Rendered diagram</th></tr>
|
||||
<tr><td>
|
||||
<pre>
|
||||
<code>
|
||||
graph TD;
|
||||
A-->B;
|
||||
A-->C;
|
||||
B-->D;
|
||||
C-->D;
|
||||
<code>
|
||||
</pre>
|
||||
</td>
|
||||
<td>
|
||||
<img src='http://www.sveido.com/mermaid/img/ex1.png' alt='Example 1'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<pre>
|
||||
<code>
|
||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
||||
|
||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||
|
||||
## About
|
||||
|
||||
<!-- <Main description> -->
|
||||
|
||||
Mermaid is a JavaScript-based diagramming and charting tool that uses Markdown-inspired text definitions and a renderer to create and modify complex diagrams. The main purpose of Mermaid is to help documentation catch up with development.
|
||||
|
||||
> Doc-Rot is a Catch-22 that Mermaid helps to solve.
|
||||
|
||||
Diagramming and documentation costs precious developer time and gets outdated quickly.
|
||||
But not having diagrams or docs ruins productivity and hurts organizational learning.<br/>
|
||||
Mermaid addresses this problem by enabling users to create easily modifiable diagrams. It can also be made part of production scripts (and other pieces of code).<br/>
|
||||
<br/>
|
||||
|
||||
Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).<br/>
|
||||
[Tutorials](./docs/config/Tutorials.md) has video tutorials.
|
||||
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md).
|
||||
|
||||
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md).
|
||||
|
||||
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md).
|
||||
|
||||
🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [Changelog](./docs/CHANGELOG.md)
|
||||
|
||||
In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests.
|
||||
|
||||
<a href="https://applitools.com/">
|
||||
<svg width="170" height="32" viewBox="0 0 170 32" fill="none" xmlns="http://www.w3.org/2000/svg"><mask id="a" maskUnits="userSpaceOnUse" x="27" y="0" width="143" height="32"><path fill-rule="evenodd" clip-rule="evenodd" d="M27.732.227h141.391v31.19H27.733V.227z" fill="#fff"></path></mask><g mask="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M153.851 22.562l1.971-3.298c1.291 1.219 3.837 2.402 5.988 2.402 1.971 0 2.903-.753 2.903-1.829 0-2.832-10.253-.502-10.253-7.313 0-2.904 2.51-5.45 7.099-5.45 2.904 0 5.234 1.004 6.955 2.367l-1.829 3.226c-1.039-1.075-3.011-2.008-5.126-2.008-1.65 0-2.725.717-2.725 1.685 0 2.546 10.289.395 10.289 7.386 0 3.19-2.724 5.52-7.528 5.52-3.012 0-5.916-1.003-7.744-2.688zm-5.7 2.259h4.553V.908h-4.553v23.913zm-6.273-8.676c0-2.689-1.578-5.02-4.446-5.02-2.832 0-4.409 2.331-4.409 5.02 0 2.724 1.577 5.055 4.409 5.055 2.868 0 4.446-2.33 4.446-5.055zm-13.588 0c0-4.912 3.442-9.07 9.142-9.07 5.736 0 9.178 4.158 9.178 9.07 0 4.911-3.442 9.106-9.178 9.106-5.7 0-9.142-4.195-9.142-9.106zm-5.628 0c0-2.689-1.577-5.02-4.445-5.02-2.832 0-4.41 2.331-4.41 5.02 0 2.724 1.578 5.055 4.41 5.055 2.868 0 4.445-2.33 4.445-5.055zm-13.587 0c0-4.912 3.441-9.07 9.142-9.07 5.736 0 9.178 4.158 9.178 9.07 0 4.911-3.442 9.106-9.178 9.106-5.701 0-9.142-4.195-9.142-9.106zm-8.425 4.338v-8.999h-2.868v-3.98h2.868V2.773h4.553v4.733h3.514v3.979h-3.514v7.78c0 1.111.574 1.936 1.578 1.936.681 0 1.326-.251 1.577-.538l.968 3.478c-.681.609-1.9 1.11-3.8 1.11-3.191 0-4.876-1.648-4.876-4.767zm-8.962 4.338h4.553V7.505h-4.553V24.82zm-.43-21.905a2.685 2.685 0 012.688-2.69c1.506 0 2.725 1.184 2.725 2.69a2.724 2.724 0 01-2.725 2.724c-1.47 0-2.688-1.219-2.688-2.724zM84.482 24.82h4.553V.908h-4.553v23.913zm-6.165-8.676c0-2.976-1.793-5.02-4.41-5.02-1.47 0-3.119.825-3.908 1.973v6.094c.753 1.111 2.438 2.008 3.908 2.008 2.617 0 4.41-2.044 4.41-5.055zm-8.318 6.453v8.82h-4.553V7.504H70v2.187c1.327-1.685 3.227-2.618 5.342-2.618 4.446 0 7.672 3.299 7.672 9.07 0 5.773-3.226 9.107-7.672 9.107-2.043 0-3.907-.86-5.342-2.653zm-10.718-6.453c0-2.976-1.793-5.02-4.41-5.02-1.47 0-3.119.825-3.908 1.973v6.094c.753 1.111 2.438 2.008 3.908 2.008 2.617 0 4.41-2.044 4.41-5.055zm-8.318 6.453v8.82H46.41V7.504h4.553v2.187c1.327-1.685 3.227-2.618 5.342-2.618 4.446 0 7.672 3.299 7.672 9.07 0 5.773-3.226 9.107-7.672 9.107-2.043 0-3.908-.86-5.342-2.653zm-11.758-1.936V18.51c-.753-1.004-2.187-1.542-3.657-1.542-1.793 0-3.263.968-3.263 2.617 0 1.65 1.47 2.582 3.263 2.582 1.47 0 2.904-.502 3.657-1.506zm0 4.159v-1.829c-1.183 1.434-3.227 2.259-5.485 2.259-2.761 0-5.988-1.864-5.988-5.736 0-4.087 3.227-5.593 5.988-5.593 2.33 0 4.337.753 5.485 2.115V13.85c0-1.756-1.506-2.904-3.8-2.904-1.829 0-3.55.717-4.984 2.044L28.63 9.8c2.115-1.901 4.84-2.726 7.564-2.726 3.98 0 7.6 1.578 7.6 6.561v11.186h-4.588z" fill="#00A298"></path></g><path fill-rule="evenodd" clip-rule="evenodd" d="M14.934 16.177c0 1.287-.136 2.541-.391 3.752-1.666-1.039-3.87-2.288-6.777-3.752 2.907-1.465 5.11-2.714 6.777-3.753.255 1.211.39 2.466.39 3.753m4.6-7.666V4.486a78.064 78.064 0 01-4.336 3.567c-1.551-2.367-3.533-4.038-6.14-5.207C11.1 4.658 12.504 6.7 13.564 9.262 5.35 15.155 0 16.177 0 16.177s5.35 1.021 13.564 6.915c-1.06 2.563-2.463 4.603-4.507 6.415 2.607-1.169 4.589-2.84 6.14-5.207a77.978 77.978 0 014.336 3.568v-4.025s-.492-.82-2.846-2.492c.6-1.611.93-3.354.93-5.174a14.8 14.8 0 00-.93-5.174c2.354-1.673 2.846-2.492 2.846-2.492" fill="#00A298"></path></svg>
|
||||
</a>
|
||||
|
||||
<!-- </Main description> -->
|
||||
|
||||
## Examples
|
||||
|
||||
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference).**
|
||||
|
||||
<!-- <Flowchart> -->
|
||||
|
||||
### Flowchart [<a href="https://mermaid-js.github.io/mermaid/#/flowchart">docs</a> - <a href="https://mermaid.live/edit#pako:eNpNkMtqwzAQRX9FzKqFJK7t1km8KDQP6KJQSLOLvZhIY1tgS0GWmgbb_165IaFaiXvOFTPqgGtBkEJR6zOv0Fj2scsU8-ft8I5G5Gw6fe339GN7tnrYaafE45WvRsLW3Ya4bKVWwzVe_xU-FfVsc9hR62rLwvw_2591z7Y3FuUwgYZMg1L4ObrRzMBW1FAGqb8KKtCLGWRq8Ko7CbS0FdJqA2mBdUsTQGf110VxSK1xdJM2EkuDzd2qNQrypQ7s5TQuXcrW-ie5VoUsx9yZ2seVtac2DYIRz0ppK3eccd0ErRTjD1XfyyRIomSBUUzJPMaXOBb8GC4XRfQcFmL-FEYIwzD8AggvcHE">live editor</a>]
|
||||
|
||||
```
|
||||
flowchart LR
|
||||
|
||||
A[Hard] -->|Text| B(Round)
|
||||
B --> C{Decision}
|
||||
C -->|One| D[Result 1]
|
||||
C -->|Two| E[Result 2]
|
||||
```
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
|
||||
A[Hard] -->|Text| B(Round)
|
||||
B --> C{Decision}
|
||||
C -->|One| D[Result 1]
|
||||
C -->|Two| E[Result 2]
|
||||
```
|
||||
|
||||
### Sequence diagram [<a href="https://mermaid-js.github.io/mermaid/#/sequenceDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9kMluwjAQhl_F-AykQMuSA1WrbuLQQ3v1ZbAnsVXHkzrjVhHi3etQwKfRv4w-z0FqMihL2eF3wqDxyUEdoVHhwTuNk-12RzaU4g29JzHMY2HpV0BE0VO6V8ETtdkGz1Zb1F8qiPyG5LX84mrLAmpwoWNh-5a0pWCiAxUwGBXeiVHEU4oq8V_6AHYUwAu2lLLTjVQ4bc1rT2yleI0IfJG320faZ9ABbk-Jz3hZnFxBduR9L2oiM5Jj2WBswJn8-cMArSRbbFDJMo8GK0ielVThmKOpNcD4bBxTlGUFvsOxhMT02QctS44JL6HzAS-iJzCYOwfJfTscunYd542aQuXqQU_RZ9kyt11ZFIM9rR3btJ9qaorOGQuR7c9mWSznyzXMF7hcLeBusTB6P9usq_ntrDKrm9kc5PF4_AMJE56Z">live editor</a>]
|
||||
|
||||
```
|
||||
sequenceDiagram
|
||||
participant Alice
|
||||
participant Bob
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts <br/>prevail...
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
</code>
|
||||
</pre>
|
||||
</td>
|
||||
<td>
|
||||
<img src='http://www.sveido.com/mermaid/img/seq1.png' alt='Example 2'>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
```
|
||||
|
||||
## Further reading
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
```
|
||||
|
||||
* [Usage](http://knsv.github.io/mermaid/usage.html)
|
||||
* [Flowchart syntax](http://knsv.github.io/mermaid/flowchart.html)
|
||||
* [Sequence diagram syntax](http://knsv.github.io/mermaid/sequenceDiagram.html)
|
||||
* [Mermaid client](http://knsv.github.io/mermaid/mermaidCLI.html)
|
||||
* [Demos](http://knsv.github.io/mermaid/demos.html)
|
||||
### Gantt chart [<a href="https://mermaid-js.github.io/mermaid/#/gantt">docs</a> - <a href="https://mermaid.live/edit#pako:eNp90cGOgyAQBuBXIZxtFbG29bbZ3fsmvXKZylhJEAyOTZrGd1_sto3xsHMBhu-HBO689hp5xS_giJQbsCbjHTv9jcp9-q63SKhZpb3DhMXSOIiE5ZkoNpnYZGXynh6U-4jBK7JnVfBYJo9QvgjtEya1cj8QwFq0TMz4lZqxTBg0hOF5m1jifI2Lf7Bc490CyxUu1rhc4GLGPOEdhg6Mjq92V44xxanFDhWv4lRjA6MlxZWbIh17DYTf2pAPvGrADphwGMmfbq7mFYURX-jLwCVA91bWg8YYunO69Y8vMgPFI2vvGnOZ-2Owsd0S9UOVpvP29mKoHc_b2nfpYHQLgdrrsUzLvDxALrHcS9hJqeuzOB6avBCN3mciBz5N0y_wxZ0J">live editor</a>]
|
||||
|
||||
# Credits
|
||||
Many thanks to the [d3](http://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing
|
||||
the graphical layout and drawing libraries! Thanks also to the
|
||||
[js-sequence-diagram](http://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the
|
||||
sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering.
|
||||
```
|
||||
gantt
|
||||
section Section
|
||||
Completed :done, des1, 2014-01-06,2014-01-08
|
||||
Active :active, des2, 2014-01-07, 3d
|
||||
Parallel 1 : des3, after des1, 1d
|
||||
Parallel 2 : des4, after des1, 1d
|
||||
Parallel 3 : des5, after des3, 1d
|
||||
Parallel 4 : des6, after des4, 1d
|
||||
```
|
||||
|
||||
*Mermaid was created by Knut Sveidqvist for easier documentation.*
|
||||
```mermaid
|
||||
gantt
|
||||
section Section
|
||||
Completed :done, des1, 2014-01-06,2014-01-08
|
||||
Active :active, des2, 2014-01-07, 3d
|
||||
Parallel 1 : des3, after des1, 1d
|
||||
Parallel 2 : des4, after des1, 1d
|
||||
Parallel 3 : des5, after des3, 1d
|
||||
Parallel 4 : des6, after des4, 1d
|
||||
```
|
||||
|
||||
Knut has not done all work by him self, here is the full list of the projects [contributors](https://github.com/knsv/mermaid/graphs/contributors).
|
||||
### Class diagram [<a href="https://mermaid-js.github.io/mermaid/#/classDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkTFPwzAQhf-K5QlQ2zQJJG1UBaGWDYmBgYEwXO1LYuTEwXYqlZL_jt02asXm--690zvfgTLFkWaUSTBmI6DS0BTt2lfzkKx-p1PytEO9f1FtdaQkI2ulZNGuVqK1qEtgmOfk7BitSzKdOhg59XuNGgk0RDxed-_IOr6uf8cZ6UhTZ8bvHqS5ub1mr9svZPbjk6DEBlu7AQuXyBkx4gcvDk9cUMJq0XT_YaW0kNK5j-ufAoRzcihaQvLcoN4Jv50vvVxw_xrnD3RCG9QNCO4-8OgpqK1dpoJm7smxhF7agp6kfcfB4jMXVmmalW4tnFDorXrbt4xmVvc4is53GKFUwNF5DtTuO3-sShjrJjLVlqLyvNfS4drazmRB4NuzSti6386YagIjeA3a1rtlEiRRsoAoxiSN4SGOOduGy0UZ3YclT-dhBHQYhj8dc6_I">live editor</a>]
|
||||
|
||||
```
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<Interface>> Class01
|
||||
Class09 --> C2 : Where am I?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
size()
|
||||
}
|
||||
```
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<Interface>> Class01
|
||||
Class09 --> C2 : Where am I?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
size()
|
||||
}
|
||||
```
|
||||
|
||||
### State diagram [<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
|
||||
|
||||
```
|
||||
stateDiagram-v2
|
||||
[*] --> Still
|
||||
Still --> [*]
|
||||
Still --> Moving
|
||||
Moving --> Still
|
||||
Moving --> Crash
|
||||
Crash --> [*]
|
||||
```
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Still
|
||||
Still --> [*]
|
||||
Still --> Moving
|
||||
Moving --> Still
|
||||
Moving --> Crash
|
||||
Crash --> [*]
|
||||
```
|
||||
|
||||
### Pie chart [<a href="https://mermaid-js.github.io/mermaid/#/pie">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9jsFugzAMhl8F-VzBgEEh13Uv0F1zcYkTIpEEBadShXj3BU3dzf_n77e8wxQUgYDVkvQSbsFsEgpRtEN_5i_kvzx05XiC-xvUHVzAUXRoVe7v0heFBJ7JkQSRR0Ua08ISpD-ymlaFTN_KcoggNC4bXQATh5-Xn0BwTPSWbhZNRPdvLQEV5dIO_FrPZ43dOJ-cgtfWnDzFJeOZed1EVZ3r0lie06Ocgqs2q2aMPD_HvuqbfsCmpf7aYte2anrU46Cbz1qr60fdIBzH8QvW9lkl">live editor</a>]
|
||||
|
||||
```
|
||||
pie
|
||||
"Dogs" : 386
|
||||
"Cats" : 85.9
|
||||
"Rats" : 15
|
||||
```
|
||||
|
||||
```mermaid
|
||||
pie
|
||||
"Dogs" : 386
|
||||
"Cats" : 85.9
|
||||
"Rats" : 15
|
||||
```
|
||||
|
||||
### Git graph [experimental - <a href="https://mermaid.live/edit#pako:eNqNkMFugzAMhl8F-VyVAR1tOW_aA-zKxSSGRCMJCk6lCvHuNZPKZdM0n-zf3_8r8QIqaIIGMqnB8kfEybQ--y4VnLP8-9RF9Mpkmm40hmlnDKmvkPiH_kfS7nFo_VN0FAf6XwocQGgxa_nGsm1bYEOOWmik1dRjGrmF1q-Cpkkj07u2HCI0PY4zHQATh8-7V9BwTPSE3iwOEd1OjQE1iWkBvk_bzQY7s0Sq4Hs7bHqKo8iGeZqbPN_WR7mpSd1RHpvPVhuMbG7XOq_L-oJlRfW5wteq0qorrpe-PBW9Pr8UJcK6rg-BLYPQ">live editor</a>]
|
||||
|
||||
### User Journey diagram [<a href="https://mermaid-js.github.io/mermaid/#/user-journey">docs</a> - <a href="https://mermaid.live/edit#pako:eNplkMFuwjAQRH9l5TMiTVIC-FqqnjhxzWWJN4khsSN7XRSh_HsdKBVt97R6Mzsj-yoqq0hIAXCywRkaSwNxWHNHsB_hYt1ZmwYUfiueKtbWwIcFtjf5zgH2eCZgQgkrCXt64GgMg2fUzkvIn5Xd_V5COtMFvCH_62ht_5yk7MU8sn61HDTfxD8VYiF6cj1qFd94nWkpuKWYKWRcFdUYOi5FaaZoDYNCpnel2Toha-w8LQQGtofRVEKyC_Qw7TQ2DvsfV2dRUTy6Ch6H-UMb7TlGVtbUupl5cF3ELfPgZZLM8rLR3IbjsrJ94rVq0XH7uS2SIis2mOVUrHNc5bmqjul2U2evaa3WL2mGYpqmL2BGiho">live editor</a>]
|
||||
|
||||
```
|
||||
journey
|
||||
title My working day
|
||||
section Go to work
|
||||
Make tea: 5: Me
|
||||
Go upstairs: 3: Me
|
||||
Do work: 1: Me, Cat
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 3: Me
|
||||
```
|
||||
|
||||
```mermaid
|
||||
journey
|
||||
title My working day
|
||||
section Go to work
|
||||
Make tea: 5: Me
|
||||
Go upstairs: 3: Me
|
||||
Do work: 1: Me, Cat
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 3: Me
|
||||
```
|
||||
|
||||
### C4 diagram [<a href="https://mermaid-js.github.io/mermaid/#/c4c">docs</a>]
|
||||
|
||||
```
|
||||
C4Context
|
||||
title System Context diagram for Internet Banking System
|
||||
|
||||
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
|
||||
Person(customerB, "Banking Customer B")
|
||||
Person_Ext(customerC, "Banking Customer C")
|
||||
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
|
||||
|
||||
Person(customerD, "Banking Customer D", "A customer of the bank, <br/> with personal bank accounts.")
|
||||
|
||||
Enterprise_Boundary(b1, "BankBoundary") {
|
||||
|
||||
SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
||||
|
||||
System_Boundary(b2, "BankBoundary2") {
|
||||
System(SystemA, "Banking System A")
|
||||
System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
|
||||
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
|
||||
SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
|
||||
|
||||
Boundary(b3, "BankBoundary3", "boundary") {
|
||||
SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.")
|
||||
SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
}
|
||||
|
||||
BiRel(customerA, SystemAA, "Uses")
|
||||
BiRel(SystemAA, SystemE, "Uses")
|
||||
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
|
||||
Rel(SystemC, customerA, "Sends e-mails to")
|
||||
```
|
||||
|
||||
```mermaid
|
||||
C4Context
|
||||
title System Context diagram for Internet Banking System
|
||||
|
||||
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
|
||||
Person(customerB, "Banking Customer B")
|
||||
Person_Ext(customerC, "Banking Customer C")
|
||||
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
|
||||
|
||||
Person(customerD, "Banking Customer D", "A customer of the bank, <br/> with personal bank accounts.")
|
||||
|
||||
Enterprise_Boundary(b1, "BankBoundary") {
|
||||
|
||||
SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
||||
|
||||
System_Boundary(b2, "BankBoundary2") {
|
||||
System(SystemA, "Banking System A")
|
||||
System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
|
||||
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
|
||||
SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
|
||||
|
||||
Boundary(b3, "BankBoundary3", "boundary") {
|
||||
SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.")
|
||||
SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
}
|
||||
|
||||
BiRel(customerA, SystemAA, "Uses")
|
||||
BiRel(SystemAA, SystemE, "Uses")
|
||||
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
|
||||
Rel(SystemC, customerA, "Sends e-mails to")
|
||||
```
|
||||
|
||||
## Release
|
||||
|
||||
For those who have the permission to do so:
|
||||
|
||||
Update version number in `package.json`.
|
||||
|
||||
```sh
|
||||
npm publish
|
||||
```
|
||||
|
||||
The above command generates files into the `dist` folder and publishes them to npmjs.org.
|
||||
|
||||
## Related projects
|
||||
|
||||
- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli)
|
||||
- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor)
|
||||
- [HTTP Server](https://github.com/TomWright/mermaid-server)
|
||||
|
||||
## Contributors [](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [](https://github.com/mermaid-js/mermaid/graphs/contributors) [](https://github.com/mermaid-js/mermaid/graphs/contributors)
|
||||
|
||||
Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out.
|
||||
|
||||
Detailed information about how to contribute can be found in the [contribution guide](CONTRIBUTING.md)
|
||||
|
||||
## Security and safe diagrams
|
||||
|
||||
For public sites, it can be precarious to retrieve text from users on the internet, storing that content for presentation in a browser at a later stage. The reason is that the user content can contain embedded malicious scripts that will run when the data is presented. For Mermaid this is a risk, specially as mermaid diagrams contain many characters that are used in html which makes the standard sanitation unusable as it also breaks the diagrams. We still make an effort to sanitise the incoming code and keep refining the process but it is hard to guarantee that there are no loop holes.
|
||||
|
||||
As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security.
|
||||
|
||||
_Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._
|
||||
|
||||
## Reporting vulnerabilities
|
||||
|
||||
To report a vulnerability, please e-mail security@mermaid.live with a description of the issue, the steps you took to create the issue, affected versions, and if known, mitigations for the issue.
|
||||
|
||||
## Appreciation
|
||||
|
||||
A quick note from Knut Sveidqvist:
|
||||
|
||||
> _Many thanks to the [d3](https://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!_
|
||||
>
|
||||
> _Thanks also to the [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering._
|
||||
>
|
||||
> _Thank you to [Tyler Long](https://github.com/tylerlong) who has been a collaborator since April 2017._
|
||||
>
|
||||
> _Thank you to the ever-growing list of [contributors](https://github.com/knsv/mermaid/graphs/contributors) that brought the project this far!_
|
||||
|
||||
---
|
||||
|
||||
_Mermaid was created by Knut Sveidqvist for easier documentation._
|
||||
|
||||
334
README.zh-CN.md
Normal file
334
README.zh-CN.md
Normal file
@@ -0,0 +1,334 @@
|
||||
# mermaid
|
||||
|
||||
[](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [](https://www.npmjs.com/package/mermaid) [](https://bundlephobia.com/package/mermaid) [](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [](https://www.jsdelivr.com/package/npm/mermaid) [](https://www.npmjs.com/package/mermaid) [](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [](https://twitter.com/mermaidjs_)
|
||||
|
||||
[English](./README.md) | 简体中文
|
||||
|
||||
<img src="./img/header.png" alt="" />
|
||||
|
||||
:trophy: **Mermaid 被提名并获得了 [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) 的 "The most exciting use of technology" 奖项!!!**
|
||||
|
||||
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
||||
|
||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/img/book-banner-pre-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||
|
||||
## 关于 Mermaid
|
||||
|
||||
<!-- <Main description> -->
|
||||
|
||||
Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。
|
||||
|
||||
> Doc-Rot 是 Mermaid 致力于解决的一个难题。
|
||||
|
||||
绘图和编写文档花费了开发者宝贵的开发时间,而且随着业务的变更,它很快就会过期。 但是如果缺少了图表或文档,对于生产力和团队新人的业务学习都会产生巨大的阻碍。 <br/>
|
||||
Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。<br/>
|
||||
<br/>
|
||||
Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。<br/>
|
||||
你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/misc/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
|
||||
|
||||
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md).
|
||||
|
||||
🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [文档](https://mermaidjs.github.io) | 🙌 [贡献](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [更新日志](./docs/CHANGELOG.md)
|
||||
|
||||
<!-- </Main description> -->
|
||||
|
||||
## 示例
|
||||
|
||||
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。**
|
||||
|
||||
<table>
|
||||
<!-- <Flowchart> -->
|
||||
|
||||
### 流程图 [<a href="https://mermaid-js.github.io/mermaid/#/flowchart">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0hhcmRdIC0tPnxUZXh0fCBCKFJvdW5kKVxuICAgIEIgLS0-IEN7RGVjaXNpb259XG4gICAgQyAtLT58T25lfCBEW1Jlc3VsdCAxXVxuICAgIEMgLS0-fFR3b3wgRVtSZXN1bHQgMl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
||||
|
||||
```
|
||||
flowchart LR
|
||||
A[Hard] -->|Text| B(Round)
|
||||
B --> C{Decision}
|
||||
C -->|One| D[Result 1]
|
||||
C -->|Two| E[Result 2]
|
||||
```
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[Hard] -->|Text| B(Round)
|
||||
B --> C{Decision}
|
||||
C -->|One| D[Result 1]
|
||||
C -->|Two| E[Result 2]
|
||||
```
|
||||
|
||||
### 时序图 [<a href="https://mermaid-js.github.io/mermaid/#/sequenceDiagram">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG5BbGljZS0-PkpvaG46IEhlbGxvIEpvaG4sIGhvdyBhcmUgeW91P1xubG9vcCBIZWFsdGhjaGVja1xuICAgIEpvaG4tPj5Kb2huOiBGaWdodCBhZ2FpbnN0IGh5cG9jaG9uZHJpYVxuZW5kXG5Ob3RlIHJpZ2h0IG9mIEpvaG46IFJhdGlvbmFsIHRob3VnaHRzIVxuSm9obi0tPj5BbGljZTogR3JlYXQhXG5Kb2huLT4-Qm9iOiBIb3cgYWJvdXQgeW91P1xuQm9iLS0-PkpvaG46IEpvbGx5IGdvb2QhIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
||||
|
||||
```
|
||||
sequenceDiagram
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
```
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
```
|
||||
|
||||
### 甘特图 [<a href="https://mermaid-js.github.io/mermaid/#/gantt">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2FudHRcbnNlY3Rpb24gU2VjdGlvblxuQ29tcGxldGVkIDpkb25lLCAgICBkZXMxLCAyMDE0LTAxLTA2LDIwMTQtMDEtMDhcbkFjdGl2ZSAgICAgICAgOmFjdGl2ZSwgIGRlczIsIDIwMTQtMDEtMDcsIDNkXG5QYXJhbGxlbCAxICAgOiAgICAgICAgIGRlczMsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAyICAgOiAgICAgICAgIGRlczQsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAzICAgOiAgICAgICAgIGRlczUsIGFmdGVyIGRlczMsIDFkXG5QYXJhbGxlbCA0ICAgOiAgICAgICAgIGRlczYsIGFmdGVyIGRlczQsIDFkIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
||||
|
||||
```
|
||||
gantt
|
||||
section Section
|
||||
Completed :done, des1, 2014-01-06,2014-01-08
|
||||
Active :active, des2, 2014-01-07, 3d
|
||||
Parallel 1 : des3, after des1, 1d
|
||||
Parallel 2 : des4, after des1, 1d
|
||||
Parallel 3 : des5, after des3, 1d
|
||||
Parallel 4 : des6, after des4, 1d
|
||||
```
|
||||
|
||||
```mermaid
|
||||
gantt
|
||||
section Section
|
||||
Completed :done, des1, 2014-01-06,2014-01-08
|
||||
Active :active, des2, 2014-01-07, 3d
|
||||
Parallel 1 : des3, after des1, 1d
|
||||
Parallel 2 : des4, after des1, 1d
|
||||
Parallel 3 : des5, after des3, 1d
|
||||
Parallel 4 : des6, after des4, 1d
|
||||
```
|
||||
|
||||
### 类图 [<a href="https://mermaid-js.github.io/mermaid/#/classDiagram">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5DbGFzczAxIDx8LS0gQXZlcnlMb25nQ2xhc3MgOiBDb29sXG48PGludGVyZmFjZT4-IENsYXNzMDFcbkNsYXNzMDkgLS0-IEMyIDogV2hlcmUgYW0gaT9cbkNsYXNzMDkgLS0qIEMzXG5DbGFzczA5IC0tfD4gQ2xhc3MwN1xuQ2xhc3MwNyA6IGVxdWFscygpXG5DbGFzczA3IDogT2JqZWN0W10gZWxlbWVudERhdGFcbkNsYXNzMDEgOiBzaXplKClcbkNsYXNzMDEgOiBpbnQgY2hpbXBcbkNsYXNzMDEgOiBpbnQgZ29yaWxsYVxuY2xhc3MgQ2xhc3MxMCB7XG4gID4-c2VydmljZT4-XG4gIGludCBpZFxuICBzaXplKClcbn0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
||||
|
||||
```
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<Interface>> Class01
|
||||
Class09 --> C2 : Where am I?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
size()
|
||||
}
|
||||
```
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<Interface>> Class01
|
||||
Class09 --> C2 : Where am I?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
size()
|
||||
}
|
||||
```
|
||||
|
||||
### 状态图 [[<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
|
||||
|
||||
```
|
||||
stateDiagram-v2
|
||||
[*] --> Still
|
||||
Still --> [*]
|
||||
Still --> Moving
|
||||
Moving --> Still
|
||||
Moving --> Crash
|
||||
Crash --> [*]
|
||||
```
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Still
|
||||
Still --> [*]
|
||||
Still --> Moving
|
||||
Moving --> Still
|
||||
Moving --> Crash
|
||||
Crash --> [*]
|
||||
```
|
||||
|
||||
### 饼图 [<a href="https://mermaid-js.github.io/mermaid/#/pie">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoicGllXG5cIkRvZ3NcIiA6IDQyLjk2XG5cIkNhdHNcIiA6IDUwLjA1XG5cIlJhdHNcIiA6IDEwLjAxIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
||||
|
||||
```
|
||||
pie
|
||||
"Dogs" : 386
|
||||
"Cats" : 85
|
||||
"Rats" : 15
|
||||
```
|
||||
|
||||
```mermaid
|
||||
pie
|
||||
"Dogs" : 386
|
||||
"Cats" : 85
|
||||
"Rats" : 15
|
||||
```
|
||||
|
||||
### Git 图 [实验特性 - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2l0R3JhcGg6XG5vcHRpb25zXG57XG4gICAgXCJub2RlU3BhY2luZ1wiOiAxNTAsXG4gICAgXCJub2RlUmFkaXVzXCI6IDEwXG59XG5lbmRcbmNvbW1pdFxuYnJhbmNoIG5ld2JyYW5jaFxuY2hlY2tvdXQgbmV3YnJhbmNoXG5jb21taXRcbmNvbW1pdFxuY2hlY2tvdXQgbWFzdGVyXG5jb21taXRcbmNvbW1pdFxubWVyZ2UgbmV3YnJhbmNoXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
||||
|
||||
### 用户体验旅程图 [<a href="https://mermaid-js.github.io/mermaid/#/user-journey">文档</a> - <a href="https://mermaid.live/edit#pako:eNpljzEPgkAMhf9K05nFGJdbJXFiYmVpuKIncDVHL4QQ_ruHaILaqXnf63vpjLVYRoMAd4nB81R5SKNOO4ZiglFC6_wVLL3JwLU68XARUHnhTQcoqGVQJgMnAwV_5GSMj0HJhcHAcU_y7d7AYVUzOJP-ddyk3ydZGf0n66uldPqCPxWYYc-hJ2fTj_OqVqg3Tplo0mq5odhphZVfkpWiSjn5Go2GyBnGhyXl3NE1UI-moW7g5QkSoF5m">live editor</a>]
|
||||
|
||||
```
|
||||
journey
|
||||
title My working day
|
||||
section Go to work
|
||||
Make tea: 5: Me
|
||||
Go upstairs: 3: Me
|
||||
Do work: 1: Me, Cat
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 3: Me
|
||||
```
|
||||
|
||||
```mermaid
|
||||
journey
|
||||
title My working day
|
||||
section Go to work
|
||||
Make tea: 5: Me
|
||||
Go upstairs: 3: Me
|
||||
Do work: 1: Me, Cat
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 3: Me
|
||||
```
|
||||
|
||||
### C4 图 [<a href="https://mermaid-js.github.io/mermaid/#/c4c">文档</a>]
|
||||
|
||||
```
|
||||
C4Context
|
||||
title System Context diagram for Internet Banking System
|
||||
|
||||
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
|
||||
Person(customerB, "Banking Customer B")
|
||||
Person_Ext(customerC, "Banking Customer C")
|
||||
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
|
||||
|
||||
Person(customerD, "Banking Customer D", "A customer of the bank, <br/> with personal bank accounts.")
|
||||
|
||||
Enterprise_Boundary(b1, "BankBoundary") {
|
||||
|
||||
SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
||||
|
||||
System_Boundary(b2, "BankBoundary2") {
|
||||
System(SystemA, "Banking System A")
|
||||
System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
|
||||
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
|
||||
SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
|
||||
|
||||
Boundary(b3, "BankBoundary3", "boundary") {
|
||||
SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.")
|
||||
SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
}
|
||||
|
||||
BiRel(customerA, SystemAA, "Uses")
|
||||
BiRel(SystemAA, SystemE, "Uses")
|
||||
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
|
||||
Rel(SystemC, customerA, "Sends e-mails to")
|
||||
```
|
||||
|
||||
```mermaid
|
||||
C4Context
|
||||
title System Context diagram for Internet Banking System
|
||||
|
||||
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
|
||||
Person(customerB, "Banking Customer B")
|
||||
Person_Ext(customerC, "Banking Customer C")
|
||||
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
|
||||
|
||||
Person(customerD, "Banking Customer D", "A customer of the bank, <br/> with personal bank accounts.")
|
||||
|
||||
Enterprise_Boundary(b1, "BankBoundary") {
|
||||
|
||||
SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
||||
|
||||
System_Boundary(b2, "BankBoundary2") {
|
||||
System(SystemA, "Banking System A")
|
||||
System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
|
||||
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
|
||||
SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
|
||||
|
||||
Boundary(b3, "BankBoundary3", "boundary") {
|
||||
SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.")
|
||||
SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
|
||||
}
|
||||
}
|
||||
|
||||
BiRel(customerA, SystemAA, "Uses")
|
||||
BiRel(SystemAA, SystemE, "Uses")
|
||||
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
|
||||
Rel(SystemC, customerA, "Sends e-mails to")
|
||||
```
|
||||
|
||||
## 发布
|
||||
|
||||
对于有权限的同学来说,你可以通过以下步骤来完成发布操作:
|
||||
|
||||
更新 `package.json` 中的版本号,然后执行如下命令:
|
||||
|
||||
```sh
|
||||
npm publish
|
||||
```
|
||||
|
||||
以上的命令会将文件打包到 `dist` 目录并发布至 npmjs.org.
|
||||
|
||||
## 相关项目
|
||||
|
||||
- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli)
|
||||
- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor)
|
||||
- [HTTP Server](https://github.com/TomWright/mermaid-server)
|
||||
|
||||
## 贡献者 [](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [](https://github.com/mermaid-js/mermaid/graphs/contributors) [](https://github.com/mermaid-js/mermaid/graphs/contributors)
|
||||
|
||||
Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。
|
||||
|
||||
关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。
|
||||
|
||||
## 安全
|
||||
|
||||
对于公开网站来说,从互联网上的用户处检索文本、存储供后续在浏览器中展示的内容可能是不安全的,理由是用户的内容可能嵌入一些数据加载完成之后就会运行的恶意脚本,这些对于 Mermaid 来说毫无疑问是一个风险,尤其是 mermaid 图表还包含了许多在 html 中使用的字符,这意味着我们难以使用常规的手段来过滤不安全代码,因为这些常规手段会造成图表损坏。我们仍然在努力对获取到的代码进行安全过滤并不断完善我们的程序,但很难保证没有漏洞。
|
||||
|
||||
作为拥有外部用户的网站的额外安全级别,我们很高兴推出一个新的安全级别,其中的图表在沙盒 iframe 中渲染,防止代码中的 javascript 被执行,这是在安全性方面迈出的一大步。
|
||||
|
||||
_很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在可能的恶意代码被阻止时,也会损失部分交互能力_。
|
||||
|
||||
## 报告漏洞
|
||||
|
||||
如果想要报告漏洞,请发送邮件到 security@mermaid.live, 并附上问题的描述、复现问题的步骤、受影响的版本,以及解决问题的方案(如果有的话)。
|
||||
|
||||
## 鸣谢
|
||||
|
||||
来自 Knut Sveidqvist:
|
||||
|
||||
> _特别感谢 [d3](https://d3js.org/) 和 [dagre-d3](https://github.com/cpettitt/dagre-d3) 这两个优秀的项目,它们提供了图形布局和绘图工具库! _ >_同样感谢 [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) 提供了时序图语法的使用。 感谢 Jessica Peter 提供了甘特图渲染的灵感。_ >_感谢 [Tyler Long](https://github.com/tylerlong) 从 2017 年四月开始成为了项目的合作者。_
|
||||
>
|
||||
> _感谢越来越多的 [贡献者们](https://github.com/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_
|
||||
|
||||
---
|
||||
|
||||
_Mermaid 是由 Knut Sveidqvist 创建,它为了更简单的文档编写而生。_
|
||||
5
V10-BreakingChanges.md
Normal file
5
V10-BreakingChanges.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# A collection of updates that change the behaviour
|
||||
|
||||
## Lazy loading and asynchronisity
|
||||
|
||||
- Invalid dates are rendered as syntax error instead of returning best guess or the current date
|
||||
79
__mocks__/d3.ts
Normal file
79
__mocks__/d3.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
// @ts-nocheck TODO: Fix TS
|
||||
import { vi } from 'vitest';
|
||||
|
||||
const NewD3 = function () {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
function returnThis() {
|
||||
return this;
|
||||
}
|
||||
return {
|
||||
append: function () {
|
||||
return NewD3();
|
||||
},
|
||||
lower: returnThis,
|
||||
attr: returnThis,
|
||||
style: returnThis,
|
||||
text: returnThis,
|
||||
0: {
|
||||
0: {
|
||||
getBBox: function () {
|
||||
return {
|
||||
height: 10,
|
||||
width: 20,
|
||||
};
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const select = function () {
|
||||
return new NewD3();
|
||||
};
|
||||
|
||||
export const selectAll = function () {
|
||||
return new NewD3();
|
||||
};
|
||||
|
||||
export const curveBasis = 'basis';
|
||||
export const curveLinear = 'linear';
|
||||
export const curveCardinal = 'cardinal';
|
||||
|
||||
export const MockD3 = (name, parent) => {
|
||||
const children = [];
|
||||
const elem = {
|
||||
get __children() {
|
||||
return children;
|
||||
},
|
||||
get __name() {
|
||||
return name;
|
||||
},
|
||||
get __parent() {
|
||||
return parent;
|
||||
},
|
||||
node() {
|
||||
return {
|
||||
getBBox() {
|
||||
return {
|
||||
x: 5,
|
||||
y: 10,
|
||||
height: 15,
|
||||
width: 20,
|
||||
};
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
elem.append = (name) => {
|
||||
const mockElem = MockD3(name, elem);
|
||||
children.push(mockElem);
|
||||
return mockElem;
|
||||
};
|
||||
elem.lower = vi.fn(() => elem);
|
||||
elem.attr = vi.fn(() => elem);
|
||||
elem.text = vi.fn(() => elem);
|
||||
elem.style = vi.fn(() => elem);
|
||||
return elem;
|
||||
};
|
||||
1
__mocks__/dagre-d3.ts
Normal file
1
__mocks__/dagre-d3.ts
Normal file
@@ -0,0 +1 @@
|
||||
// DO NOT delete this file. It is used by vitest to mock the dagre-d3 module.
|
||||
3
__mocks__/entity-decode/browser.ts
Normal file
3
__mocks__/entity-decode/browser.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
module.exports = function (txt: string) {
|
||||
return txt;
|
||||
};
|
||||
19
applitools.config.js
Normal file
19
applitools.config.js
Normal file
@@ -0,0 +1,19 @@
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { defineConfig } = require('cypress');
|
||||
|
||||
module.exports = defineConfig({
|
||||
testConcurrency: 1,
|
||||
browser: [
|
||||
// Add browsers with different viewports
|
||||
// { width: 800, height: 600, name: 'chrome' },
|
||||
// { width: 700, height: 500, name: 'firefox' },
|
||||
// { width: 1600, height: 1200, name: 'ie11' },
|
||||
// { width: 1024, height: 768, name: 'edgechromium' },
|
||||
// { width: 800, height: 600, name: 'safari' },
|
||||
// // Add mobile emulation devices in Portrait mode
|
||||
// { deviceName: 'iPhone X', screenOrientation: 'portrait' },
|
||||
// { deviceName: 'Pixel 2', screenOrientation: 'portrait' },
|
||||
],
|
||||
// set batch name to the configuration
|
||||
// batchName: `Mermaid ${process.env.APPLI_BRANCH ?? "'no APPLI_BRANCH set'"}`,
|
||||
});
|
||||
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var fs = require('fs')
|
||||
, chalk = require('chalk')
|
||||
, error = chalk.bold.red
|
||||
, cli = require('../lib/cli.js')
|
||||
, lib = require('../lib')
|
||||
|
||||
cli.parse(process.argv.slice(2), function(err, message, options) {
|
||||
if (err) {
|
||||
console.error(
|
||||
error('\nYou had errors in your syntax. Use --help for further information.')
|
||||
)
|
||||
err.forEach(function (e) {
|
||||
console.error(e.message)
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
else if (message) {
|
||||
console.log(message)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
lib.process(options.files, options)
|
||||
})
|
||||
28
bower.json
28
bower.json
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": "mermaid",
|
||||
"authors": [
|
||||
"knsv <knut@sveido.com>"
|
||||
],
|
||||
"description": "Markdownish syntax for generating flowcharts, sequence diagrams and gantt charts.",
|
||||
"main": "dist/mermaid.slim.js",
|
||||
"keywords": [
|
||||
"diagram",
|
||||
"markdown",
|
||||
"flowchart",
|
||||
"sequence diagram",
|
||||
"gantt"
|
||||
],
|
||||
"license": "MIT",
|
||||
"ignore": [
|
||||
"*",
|
||||
"!dist/",
|
||||
"!dist/*",
|
||||
"!LICENSE"
|
||||
],
|
||||
"devDependencies": {
|
||||
"jasmine": "~2.0.4",
|
||||
"dagre": "0.6.2",
|
||||
"d3": "3.3.8",
|
||||
"dagre-d3": "0.3.3"
|
||||
}
|
||||
}
|
||||
132
cSpell.json
Normal file
132
cSpell.json
Normal file
@@ -0,0 +1,132 @@
|
||||
{
|
||||
"version": "0.2",
|
||||
"language": "en",
|
||||
"words": [
|
||||
"acyclicer",
|
||||
"adamiecki",
|
||||
"alois",
|
||||
"antiscript",
|
||||
"applitools",
|
||||
"asciidoctor",
|
||||
"ashish",
|
||||
"astah",
|
||||
"bbox",
|
||||
"bilkent",
|
||||
"bisheng",
|
||||
"braintree",
|
||||
"brolin",
|
||||
"brotli",
|
||||
"classdef",
|
||||
"codedoc",
|
||||
"colour",
|
||||
"cpettitt",
|
||||
"customizability",
|
||||
"cuzon",
|
||||
"cytoscape",
|
||||
"dagre",
|
||||
"descr",
|
||||
"docsify",
|
||||
"docsy",
|
||||
"doku",
|
||||
"dompurify",
|
||||
"edgechromium",
|
||||
"faber",
|
||||
"flatmap",
|
||||
"ftplugin",
|
||||
"gantt",
|
||||
"gitea",
|
||||
"gitgraph",
|
||||
"globby",
|
||||
"graphlib",
|
||||
"grav",
|
||||
"greywolf",
|
||||
"inkdrop",
|
||||
"jaoude",
|
||||
"jison",
|
||||
"kaufmann",
|
||||
"khroma",
|
||||
"klemm",
|
||||
"klink",
|
||||
"knsv",
|
||||
"knut",
|
||||
"laganeckas",
|
||||
"lintstagedrc",
|
||||
"lucida",
|
||||
"matthieu",
|
||||
"mdbook",
|
||||
"mermerd",
|
||||
"mindaugas",
|
||||
"mindmap",
|
||||
"mindmaps",
|
||||
"mitigations",
|
||||
"mkdocs",
|
||||
"orlandoni",
|
||||
"phpbb",
|
||||
"plantuml",
|
||||
"playfair",
|
||||
"podlite",
|
||||
"ranksep",
|
||||
"redmine",
|
||||
"sandboxed",
|
||||
"setupgraphviewbox",
|
||||
"shiki",
|
||||
"sidharth",
|
||||
"sphinxcontrib",
|
||||
"statediagram",
|
||||
"stylis",
|
||||
"substate",
|
||||
"sveidqvist",
|
||||
"techn",
|
||||
"treemap",
|
||||
"ts-nocheck",
|
||||
"tuleap",
|
||||
"unist",
|
||||
"verdana",
|
||||
"viewports",
|
||||
"vinod",
|
||||
"visio",
|
||||
"vitepress",
|
||||
"xlink",
|
||||
"yash"
|
||||
],
|
||||
"patterns": [
|
||||
{ "name": "Markdown links", "pattern": "\\((.*)\\)", "description": "" },
|
||||
{
|
||||
"name": "Markdown code blocks",
|
||||
"pattern": "/^(\\s*`{3,}).*[\\s\\S]*?^\\1/gmx",
|
||||
"description": "Taken from the cSpell example at https://cspell.org/configuration/patterns/#verbose-regular-expressions"
|
||||
},
|
||||
{
|
||||
"name": "Inline code blocks",
|
||||
"pattern": "\\`([^\\`\\r\\n]+?)\\`",
|
||||
"description": "https://stackoverflow.com/questions/41274241/how-to-capture-inline-markdown-code-but-not-a-markdown-code-fence-with-regex"
|
||||
},
|
||||
{ "name": "Link contents", "pattern": "\\<a(.*)\\>", "description": "" },
|
||||
{ "name": "Snippet references", "pattern": "-- snippet:(.*)", "description": "" },
|
||||
{
|
||||
"name": "Snippet references 2",
|
||||
"pattern": "\\<\\[sample:(.*)",
|
||||
"description": "another kind of snippet reference"
|
||||
},
|
||||
{ "name": "Multi-line code blocks", "pattern": "/^\\s*```[\\s\\S]*?^\\s*```/gm" },
|
||||
{
|
||||
"name": "HTML Tags",
|
||||
"pattern": "<[^>]*>",
|
||||
"description": "Reference: https://stackoverflow.com/questions/11229831/regular-expression-to-remove-html-tags-from-a-string"
|
||||
}
|
||||
],
|
||||
"ignoreRegExpList": [
|
||||
"Markdown links",
|
||||
"Markdown code blocks",
|
||||
"Inline code blocks",
|
||||
"Link contents",
|
||||
"Snippet references",
|
||||
"Snippet references 2",
|
||||
"Multi-line code blocks",
|
||||
"HTML Tags"
|
||||
],
|
||||
"ignorePaths": [
|
||||
"packages/mermaid/src/docs/CHANGELOG.md",
|
||||
"packages/mermaid/src/docs/.vitepress/redirect.ts"
|
||||
]
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
// Karma configuration
|
||||
// Generated on Mon Nov 03 2014 07:53:38 GMT+0100 (CET)
|
||||
|
||||
module.exports = function (config) {
|
||||
config.set({
|
||||
|
||||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
||||
basePath: '',
|
||||
|
||||
// frameworks to use
|
||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||
frameworks: ['jasmine'],
|
||||
|
||||
|
||||
// list of files / patterns to load in the browser
|
||||
files: [
|
||||
'../src/**/*.js'
|
||||
],
|
||||
|
||||
|
||||
// list of files to exclude
|
||||
exclude: ['../src/backup/**/*.js'],
|
||||
|
||||
|
||||
// preprocess matching files before serving them to the browser
|
||||
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
||||
|
||||
|
||||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress'
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
reporters: ['progress'],
|
||||
|
||||
|
||||
// web server port
|
||||
port: 9876,
|
||||
|
||||
|
||||
// enable / disable colors in the output (reporters and logs)
|
||||
colors: true,
|
||||
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_DEBUG,
|
||||
|
||||
|
||||
// enable / disable watching file and executing tests whenever any file changes
|
||||
autoWatch: true,
|
||||
|
||||
|
||||
// start these browsers
|
||||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
||||
browsers: ['Chrome'],
|
||||
|
||||
// Continuous Integration mode
|
||||
// if true, Karma captures browsers, runs the tests and exits
|
||||
singleRun: false
|
||||
});
|
||||
};
|
||||
22
cypress.config.cjs
Normal file
22
cypress.config.cjs
Normal file
@@ -0,0 +1,22 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
|
||||
const { defineConfig } = require('cypress');
|
||||
const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin');
|
||||
|
||||
module.exports = defineConfig({
|
||||
projectId: 'n2sma2',
|
||||
e2e: {
|
||||
specPattern: 'cypress/integration/**/*.{js,jsx,ts,tsx}',
|
||||
setupNodeEvents(on, config) {
|
||||
addMatchImageSnapshotPlugin(on, config);
|
||||
// copy any needed variables from process.env to config.env
|
||||
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
||||
|
||||
// do not forget to return the changed config object!
|
||||
return config;
|
||||
},
|
||||
},
|
||||
video: false,
|
||||
});
|
||||
|
||||
require('@applitools/eyes-cypress')(module);
|
||||
10
cypress/.eslintrc.json
Normal file
10
cypress/.eslintrc.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"env": {
|
||||
"cypress/globals": true
|
||||
},
|
||||
"extends": ["plugin:cypress/recommended"],
|
||||
"plugins": ["cypress"],
|
||||
"rules": {
|
||||
"cypress/no-unnecessary-waiting": 0
|
||||
}
|
||||
}
|
||||
5
cypress/fixtures/example.json
Normal file
5
cypress/fixtures/example.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
||||
141
cypress/helpers/util.js
Normal file
141
cypress/helpers/util.js
Normal file
@@ -0,0 +1,141 @@
|
||||
const utf8ToB64 = (str) => {
|
||||
return window.btoa(unescape(encodeURIComponent(str)));
|
||||
};
|
||||
|
||||
const batchId = 'mermid-batch' + new Date().getTime();
|
||||
|
||||
export const mermaidUrl = (graphStr, options, api) => {
|
||||
const obj = {
|
||||
code: graphStr,
|
||||
mermaid: options,
|
||||
};
|
||||
const objStr = JSON.stringify(obj);
|
||||
let url = 'http://localhost:9000/e2e.html?graph=' + utf8ToB64(objStr);
|
||||
if (api) {
|
||||
url = 'http://localhost:9000/xss.html?graph=' + graphStr;
|
||||
}
|
||||
|
||||
if (options.listUrl) {
|
||||
cy.log(options.listId, ' ', url);
|
||||
}
|
||||
|
||||
return url;
|
||||
};
|
||||
|
||||
export const imgSnapshotTest = (graphStr, _options, api = false, validation) => {
|
||||
cy.log(_options);
|
||||
const options = Object.assign(_options);
|
||||
if (!options.fontFamily) {
|
||||
options.fontFamily = 'courier';
|
||||
}
|
||||
if (!options.sequence) {
|
||||
options.sequence = {};
|
||||
}
|
||||
if (!options.sequence || (options.sequence && !options.sequence.actorFontFamily)) {
|
||||
options.sequence.actorFontFamily = 'courier';
|
||||
}
|
||||
if (options.sequence && !options.sequence.noteFontFamily) {
|
||||
options.sequence.noteFontFamily = 'courier';
|
||||
}
|
||||
options.sequence.actorFontFamily = 'courier';
|
||||
options.sequence.noteFontFamily = 'courier';
|
||||
options.sequence.messageFontFamily = 'courier';
|
||||
if (options.sequence && !options.sequence.actorFontFamily) {
|
||||
options.sequence.actorFontFamily = 'courier';
|
||||
}
|
||||
if (!options.fontSize) {
|
||||
options.fontSize = '16px';
|
||||
}
|
||||
const useAppli = Cypress.env('useAppli');
|
||||
cy.log('Hello ' + useAppli ? 'Appli' : 'image-snapshot');
|
||||
const name = (options.name || cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
|
||||
|
||||
if (useAppli) {
|
||||
cy.log('Opening eyes ' + Cypress.spec.name + ' --- ' + name);
|
||||
cy.eyesOpen({
|
||||
appName: 'Mermaid',
|
||||
testName: name,
|
||||
batchName: Cypress.spec.name,
|
||||
batchId: batchId + Cypress.spec.name,
|
||||
});
|
||||
}
|
||||
|
||||
const url = mermaidUrl(graphStr, options, api);
|
||||
|
||||
cy.visit(url);
|
||||
if (validation) {
|
||||
cy.get('svg').should(validation);
|
||||
}
|
||||
cy.get('svg');
|
||||
// Default name to test title
|
||||
|
||||
if (useAppli) {
|
||||
cy.log('Check eyes' + Cypress.spec.name);
|
||||
cy.eyesCheckWindow('Click!');
|
||||
cy.log('Closing eyes: ' + Cypress.spec.name);
|
||||
cy.eyesClose();
|
||||
} else {
|
||||
cy.matchImageSnapshot(name);
|
||||
}
|
||||
};
|
||||
|
||||
export const urlSnapshotTest = (url, _options, api = false, validation) => {
|
||||
cy.log(_options);
|
||||
const options = Object.assign(_options);
|
||||
if (!options.fontFamily) {
|
||||
options.fontFamily = 'courier';
|
||||
}
|
||||
if (!options.sequence) {
|
||||
options.sequence = {};
|
||||
}
|
||||
if (!options.sequence || (options.sequence && !options.sequence.actorFontFamily)) {
|
||||
options.sequence.actorFontFamily = 'courier';
|
||||
}
|
||||
if (options.sequence && !options.sequence.noteFontFamily) {
|
||||
options.sequence.noteFontFamily = 'courier';
|
||||
}
|
||||
options.sequence.actorFontFamily = 'courier';
|
||||
options.sequence.noteFontFamily = 'courier';
|
||||
options.sequence.messageFontFamily = 'courier';
|
||||
if (options.sequence && !options.sequence.actorFontFamily) {
|
||||
options.sequence.actorFontFamily = 'courier';
|
||||
}
|
||||
if (!options.fontSize) {
|
||||
options.fontSize = '16px';
|
||||
}
|
||||
const useAppli = Cypress.env('useAppli');
|
||||
cy.log('Hello ' + useAppli ? 'Appli' : 'image-snapshot');
|
||||
const name = (options.name || cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
|
||||
|
||||
if (useAppli) {
|
||||
cy.log('Opening eyes 2' + Cypress.spec.name);
|
||||
cy.eyesOpen({
|
||||
appName: 'Mermaid',
|
||||
testName: name,
|
||||
batchName: Cypress.spec.name,
|
||||
batchId: batchId + Cypress.spec.name,
|
||||
});
|
||||
}
|
||||
|
||||
cy.visit(url);
|
||||
if (validation) {
|
||||
cy.get('svg').should(validation);
|
||||
}
|
||||
cy.get('body');
|
||||
// Default name to test title
|
||||
|
||||
if (useAppli) {
|
||||
cy.log('Check eyes 2' + Cypress.spec.name);
|
||||
cy.eyesCheckWindow('Click!');
|
||||
cy.log('Closing eyes 2' + Cypress.spec.name);
|
||||
cy.eyesClose();
|
||||
} else {
|
||||
cy.matchImageSnapshot(name);
|
||||
}
|
||||
};
|
||||
|
||||
export const renderGraph = (graphStr, options, api) => {
|
||||
const url = mermaidUrl(graphStr, options, api);
|
||||
|
||||
cy.visit(url);
|
||||
};
|
||||
129
cypress/integration/other/configuration.spec.js
Normal file
129
cypress/integration/other/configuration.spec.js
Normal file
@@ -0,0 +1,129 @@
|
||||
import { renderGraph } from '../../helpers/util';
|
||||
describe('Configuration', () => {
|
||||
describe('arrowMarkerAbsolute', () => {
|
||||
it('should handle default value false of arrowMarkerAbsolute', () => {
|
||||
renderGraph(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{}
|
||||
);
|
||||
|
||||
// Check the marker-end property to make sure it is properly set to
|
||||
// start with #
|
||||
cy.get('.edgePaths').within(() => {
|
||||
cy.get('path')
|
||||
.first()
|
||||
.should('have.attr', 'marker-end')
|
||||
.should('exist')
|
||||
.and('include', 'url(#');
|
||||
});
|
||||
});
|
||||
it('should handle default value false of arrowMarkerAbsolute', () => {
|
||||
renderGraph(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{}
|
||||
);
|
||||
|
||||
// Check the marker-end property to make sure it is properly set to
|
||||
// start with #
|
||||
cy.get('.edgePaths').within(() => {
|
||||
cy.get('path')
|
||||
.first()
|
||||
.should('have.attr', 'marker-end')
|
||||
.should('exist')
|
||||
.and('include', 'url(#');
|
||||
});
|
||||
});
|
||||
it('should handle arrowMarkerAbsolute explicitly set to false', () => {
|
||||
renderGraph(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{
|
||||
arrowMarkerAbsolute: false,
|
||||
}
|
||||
);
|
||||
|
||||
// Check the marker-end property to make sure it is properly set to
|
||||
// start with #
|
||||
cy.get('.edgePaths').within(() => {
|
||||
cy.get('path')
|
||||
.first()
|
||||
.should('have.attr', 'marker-end')
|
||||
.should('exist')
|
||||
.and('include', 'url(#');
|
||||
});
|
||||
});
|
||||
it('should handle arrowMarkerAbsolute explicitly set to "false" as false', () => {
|
||||
renderGraph(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{
|
||||
arrowMarkerAbsolute: 'false',
|
||||
}
|
||||
);
|
||||
|
||||
// Check the marker-end property to make sure it is properly set to
|
||||
// start with #
|
||||
cy.get('.edgePaths').within(() => {
|
||||
cy.get('path')
|
||||
.first()
|
||||
.should('have.attr', 'marker-end')
|
||||
.should('exist')
|
||||
.and('include', 'url(#');
|
||||
});
|
||||
});
|
||||
it('should handle arrowMarkerAbsolute set to true', () => {
|
||||
renderGraph(
|
||||
`flowchart TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{
|
||||
arrowMarkerAbsolute: true,
|
||||
}
|
||||
);
|
||||
|
||||
cy.get('.edgePaths').within(() => {
|
||||
cy.get('path')
|
||||
.first()
|
||||
.should('have.attr', 'marker-end')
|
||||
.should('exist')
|
||||
.and('include', 'url(http://localhost');
|
||||
});
|
||||
});
|
||||
it('should not taint the initial configuration when using multiple directives', () => {
|
||||
const url = 'http://localhost:9000/regression/issue-1874.html';
|
||||
cy.viewport(1440, 1024);
|
||||
cy.visit(url);
|
||||
|
||||
cy.get('svg');
|
||||
cy.matchImageSnapshot(
|
||||
'configuration.spec-should-not-taint-initial-configuration-when-using-multiple-directives'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
13
cypress/integration/other/external-diagrams.spec.js
Normal file
13
cypress/integration/other/external-diagrams.spec.js
Normal file
@@ -0,0 +1,13 @@
|
||||
describe('mermaid', () => {
|
||||
describe('registerDiagram', () => {
|
||||
it('should work on @mermaid-js/mermaid-mindmap and mermaid-example-diagram', () => {
|
||||
const url = 'http://localhost:9000/external-diagrams-mindmap.html';
|
||||
cy.visit(url);
|
||||
|
||||
cy.get('svg', {
|
||||
// may be a bit slower than normal, since vite might need to re-compile mermaid/mermaid-mindmap/mermaid-example-diagram
|
||||
timeout: 10000,
|
||||
}).matchImageSnapshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
10
cypress/integration/other/ghsa.spec.js
Normal file
10
cypress/integration/other/ghsa.spec.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import { urlSnapshotTest } from '../../helpers/util';
|
||||
|
||||
describe('CSS injections', () => {
|
||||
it('should not allow CSS injections outside of the diagram', () => {
|
||||
urlSnapshotTest('http://localhost:9000/ghsa1.html', {
|
||||
logLevel: 1,
|
||||
flowchart: { htmlLabels: false },
|
||||
});
|
||||
});
|
||||
});
|
||||
181
cypress/integration/other/interaction.spec.js
Normal file
181
cypress/integration/other/interaction.spec.js
Normal file
@@ -0,0 +1,181 @@
|
||||
describe('Interaction', () => {
|
||||
describe('Security level loose', () => {
|
||||
beforeEach(() => {
|
||||
cy.visit('http://localhost:9000/click_security_loose.html');
|
||||
});
|
||||
|
||||
it('Graph: should handle a click on a node with a bound function', () => {
|
||||
cy.contains('FunctionTest1').parents('.node').click();
|
||||
cy.get('.created-by-click').should('have.text', 'Clicked By Flow');
|
||||
});
|
||||
|
||||
it('Graph: should handle a click on a node with a bound function with args', () => {
|
||||
cy.contains('FunctionArgTest2').parents('.node').click();
|
||||
cy.get('.created-by-click-2').should('have.text', 'Clicked By Flow: ARGUMENT');
|
||||
});
|
||||
|
||||
it('Flowchart: should handle a click on a node with a bound function where the node starts with a number', () => {
|
||||
cy.contains('2FunctionArg').parents('.node').click();
|
||||
cy.get('.created-by-click-2').should('have.text', 'Clicked By Flow: ARGUMENT');
|
||||
});
|
||||
|
||||
it('Graph: should handle a click on a node with a bound url', () => {
|
||||
// When there is a URL, cy.contains selects the a tag instead of the span. The .node is a child of a, so we have to use find instead of parent.
|
||||
cy.contains('URLTest1').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('Graph: should handle a click on a node with a bound url where the node starts with a number', () => {
|
||||
cy.contains('2URL').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('Flowchart-v2: should handle a click on a node with a bound function', () => {
|
||||
cy.contains('FunctionTest2').parents('.node').click();
|
||||
cy.get('.created-by-click').should('have.text', 'Clicked By Flow');
|
||||
});
|
||||
|
||||
it('Flowchart-v2: should handle a click on a node with a bound function where the node starts with a number', () => {
|
||||
cy.contains('10Function').parents('.node').click();
|
||||
cy.get('.created-by-click').should('have.text', 'Clicked By Flow');
|
||||
});
|
||||
|
||||
it('Flowchart-v2: should handle a click on a node with a bound url', () => {
|
||||
cy.contains('URLTest2').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('Flowchart-v2: should handle a click on a node with a bound url where the node starts with a number', () => {
|
||||
cy.contains('20URL').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound URL clicking on the rect', () => {
|
||||
cy.get('rect#cl1').click({ force: true });
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound URL clicking on the text', () => {
|
||||
cy.get('text#cl1-text').click({ force: true });
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function without args', () => {
|
||||
cy.get('rect#cl2').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('have.text', 'Clicked By Gant cl2');
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function with args', () => {
|
||||
cy.get('rect#cl3').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('have.text', 'Clicked By Gant test1 test2 test3');
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function without args', () => {
|
||||
cy.get('text#cl2-text').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('have.text', 'Clicked By Gant cl2');
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function with args ', () => {
|
||||
cy.get('text#cl3-text').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('have.text', 'Clicked By Gant test1 test2 test3');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Interaction - security level tight', () => {
|
||||
beforeEach(() => {
|
||||
cy.visit('http://localhost:9000/click_security_strict.html');
|
||||
});
|
||||
it('should handle a click on a node without a bound function', () => {
|
||||
cy.contains('Function1').parents('.node').click();
|
||||
cy.get('.created-by-click').should('not.exist');
|
||||
});
|
||||
|
||||
it('should handle a click on a node with a bound function where the node starts with a number', () => {
|
||||
cy.contains('1Function').parents('.node').click();
|
||||
cy.get('.created-by-click').should('not.exist');
|
||||
});
|
||||
|
||||
it('should handle a click on a node with a bound url', () => {
|
||||
cy.contains('URL1').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a node with a bound url where the node starts with a number', () => {
|
||||
cy.contains('2URL').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound URL clicking on the rect', () => {
|
||||
cy.get('rect#cl1').click({ force: true });
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound URL clicking on the text', () => {
|
||||
cy.get('text#cl1-text').click({ force: true });
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function', () => {
|
||||
cy.get('rect#cl2').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('not.exist');
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function', () => {
|
||||
cy.get('text#cl2-text').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('not.exist');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Interaction - security level other, missspelling', () => {
|
||||
beforeEach(() => {
|
||||
cy.visit('http://localhost:9000/click_security_other.html');
|
||||
});
|
||||
|
||||
it('should handle a click on a node with a bound function', () => {
|
||||
cy.contains('Function1').parents('.node').click();
|
||||
cy.get('.created-by-click').should('not.exist');
|
||||
});
|
||||
|
||||
it('should handle a click on a node with a bound function where the node starts with a number', () => {
|
||||
cy.contains('1Function').parents('.node').click();
|
||||
cy.get('.created-by-click').should('not.exist');
|
||||
});
|
||||
|
||||
it('should handle a click on a node with a bound url', () => {
|
||||
cy.contains('URL1').find('.node').click();
|
||||
cy.location().should(({ href }) => {
|
||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function', () => {
|
||||
cy.get('rect#cl2').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('not.exist');
|
||||
});
|
||||
|
||||
it('should handle a click on a task with a bound function', () => {
|
||||
cy.get('text#cl2-text').click({ force: true });
|
||||
cy.get('.created-by-gant-click').should('not.exist');
|
||||
});
|
||||
});
|
||||
});
|
||||
19
cypress/integration/other/rerender.spec.js
Normal file
19
cypress/integration/other/rerender.spec.js
Normal file
@@ -0,0 +1,19 @@
|
||||
describe('Rerendering', () => {
|
||||
it('should be able to render after an error has occurred', () => {
|
||||
const url = 'http://localhost:9000/render-after-error.html';
|
||||
cy.viewport(1440, 1024);
|
||||
cy.visit(url);
|
||||
cy.get('#graphDiv').should('exist');
|
||||
});
|
||||
|
||||
it('should be able to render and rerender a graph via API', () => {
|
||||
const url = 'http://localhost:9000/rerender.html';
|
||||
cy.viewport(1440, 1024);
|
||||
cy.visit(url);
|
||||
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
||||
|
||||
cy.get('body').find('#rerender').click({ force: true });
|
||||
|
||||
cy.get('#graph [id^=flowchart-A]').should('have.text', 'Saturday');
|
||||
});
|
||||
});
|
||||
16
cypress/integration/other/webpackUsage.spec.js
Normal file
16
cypress/integration/other/webpackUsage.spec.js
Normal file
@@ -0,0 +1,16 @@
|
||||
describe('Sequencediagram', () => {
|
||||
it('should render a simple sequence diagrams', () => {
|
||||
const url = 'http://localhost:9000/webpackUsage.html';
|
||||
|
||||
cy.visit(url);
|
||||
cy.get('body').find('svg').should('have.length', 1);
|
||||
});
|
||||
it('should handle html escapings properly', () => {
|
||||
const url = 'http://localhost:9000/webpackUsage.html?test-html-escaping=true';
|
||||
|
||||
cy.visit(url);
|
||||
cy.get('body').find('svg').should('have.length', 1);
|
||||
|
||||
cy.get('g.label > foreignobject > div').should('not.contain.text', '<b>');
|
||||
});
|
||||
});
|
||||
135
cypress/integration/other/xss.spec.js
Normal file
135
cypress/integration/other/xss.spec.js
Normal file
@@ -0,0 +1,135 @@
|
||||
import { mermaidUrl } from '../../helpers/util.js';
|
||||
describe('XSS', () => {
|
||||
it('should handle xss in tags', () => {
|
||||
const str =
|
||||
'eyJjb2RlIjoiXG5ncmFwaCBMUlxuICAgICAgQi0tPkQoPGltZyBvbmVycm9yPWxvY2F0aW9uPWBqYXZhc2NyaXB0XFx1MDAzYXhzc0F0dGFja1xcdTAwMjhkb2N1bWVudC5kb21haW5cXHUwMDI5YCBzcmM9eD4pOyIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In19';
|
||||
|
||||
const url = mermaidUrl(str, {}, true);
|
||||
|
||||
cy.visit(url);
|
||||
cy.wait(1000).then(() => {
|
||||
cy.get('.mermaid').should('exist');
|
||||
});
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should not allow tags in the css', () => {
|
||||
const str =
|
||||
'eyJjb2RlIjoiJSV7aW5pdDogeyAnZm9udEZhbWlseSc6ICdcXFwiPjwvc3R5bGU+PGltZyBzcmM9eCBvbmVycm9yPXhzc0F0dGFjaygpPid9IH0lJVxuZ3JhcGggTFJcbiAgICAgQSAtLT4gQiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0IiwiZmxvd2NoYXJ0Ijp7Imh0bWxMYWJlbHMiOmZhbHNlfX0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9';
|
||||
|
||||
const url = mermaidUrl(
|
||||
str,
|
||||
{
|
||||
theme: 'default',
|
||||
flowchart: {
|
||||
htmlMode: false,
|
||||
},
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
cy.visit(url);
|
||||
cy.wait(1000).then(() => {
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle xss in tags in non-html mode', () => {
|
||||
const str =
|
||||
'eyJjb2RlIjoiXG5ncmFwaCBMUlxuICAgICAgQi0tPkQoPGltZyBvbmVycm9yPWxvY2F0aW9uPWBqYXZhc2NyaXB0XFx1MDAzYXhzc0F0dGFja1xcdTAwMjhkb2N1bWVudC5kb21haW5cXHUwMDI5YCBzcmM9eD4pOyIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0IiwiZmxvd2NoYXJ0Ijp7Imh0bWxMYWJlbHMiOmZhbHNlfX19';
|
||||
|
||||
const url = mermaidUrl(
|
||||
str,
|
||||
{
|
||||
theme: 'default',
|
||||
flowchart: {
|
||||
htmlMode: false,
|
||||
},
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
cy.visit(url);
|
||||
cy.wait(1000);
|
||||
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
|
||||
it('should not allow changing the __proto__ attribute using config', () => {
|
||||
cy.visit('http://localhost:9000/xss2.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating htmlLabels into a false positive', () => {
|
||||
cy.visit('http://localhost:9000/xss4.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript', () => {
|
||||
cy.visit('http://localhost:9000/xss5.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror', () => {
|
||||
cy.visit('http://localhost:9000/xss6.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror in state diagrams with dagre wrapper', () => {
|
||||
cy.visit('http://localhost:9000/xss8.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror in state diagrams with dagre d3', () => {
|
||||
cy.on('uncaught:exception', (_err, _runnable) => {
|
||||
return false; // continue rendering even if there if mermaid throws an error
|
||||
});
|
||||
cy.visit('http://localhost:9000/xss9.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror in state diagrams with dagre d3', () => {
|
||||
cy.visit('http://localhost:9000/xss10.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror in state diagrams with dagre d3', () => {
|
||||
cy.visit('http://localhost:9000/xss11.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror in state diagrams with dagre d3', () => {
|
||||
cy.visit('http://localhost:9000/xss12.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript using onerror in state diagrams with dagre d3', () => {
|
||||
cy.visit('http://localhost:9000/xss13.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should not allow manipulating antiscript to run javascript iframes in class diagrams', () => {
|
||||
cy.visit('http://localhost:9000/xss14.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should sanitize cardinalities properly in class diagrams', () => {
|
||||
cy.visit('http://localhost:9000/xss18.html');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should sanitize colons properly', () => {
|
||||
cy.visit('http://localhost:9000/xss20.html');
|
||||
cy.wait(1000);
|
||||
cy.get('a').click('');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
it('should sanitize colons properly', () => {
|
||||
cy.visit('http://localhost:9000/xss21.html');
|
||||
cy.wait(1000);
|
||||
cy.get('a').click('');
|
||||
cy.wait(1000);
|
||||
cy.get('#the-malware').should('not.exist');
|
||||
});
|
||||
});
|
||||
59
cypress/integration/rendering/appli.spec.js
Normal file
59
cypress/integration/rendering/appli.spec.js
Normal file
@@ -0,0 +1,59 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util.js';
|
||||
|
||||
describe('Git Graph diagram', () => {
|
||||
it('1: should render a simple gitgraph with commit on main branch', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "1"
|
||||
commit id: "2"
|
||||
commit id: "3"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
// it(`ultraFastTest`, function () {
|
||||
// // Navigate to the url we want to test
|
||||
// // ⭐️ Note to see visual bugs, run the test using the above URL for the 1st run.
|
||||
// // but then change the above URL to https://demo.applitools.com/index_v2.html
|
||||
// // (for the 2nd run)
|
||||
// cy.visit('https://demo.applitools.com');
|
||||
|
||||
// // Call Open on eyes to initialize a test session
|
||||
// cy.eyesOpen({
|
||||
// appName: 'Demo App',
|
||||
// testName: 'UltraFast grid demo',
|
||||
// });
|
||||
|
||||
// // check the login page with fluent api, see more info here
|
||||
// // https://applitools.com/docs/topics/sdk/the-eyes-sdk-check-fluent-api.html
|
||||
// cy.eyesCheckWindow({
|
||||
// tag: 'Login Window',
|
||||
// target: 'window',
|
||||
// fully: true,
|
||||
// });
|
||||
|
||||
// cy.get('#log-in').click();
|
||||
|
||||
// // Check the app page
|
||||
// cy.eyesCheckWindow({
|
||||
// tag: 'App Window',
|
||||
// target: 'window',
|
||||
// fully: true,
|
||||
// });
|
||||
|
||||
// // Call Close on eyes to let the server know it should display the results
|
||||
// cy.eyesClose();
|
||||
// });
|
||||
// it('works', () => {
|
||||
// cy.visit('https://applitools.com/helloworld');
|
||||
// cy.eyesOpen({
|
||||
// appName: 'Hello World!',
|
||||
// testName: 'My first JavaScript test!',
|
||||
// browser: { width: 800, height: 600 },
|
||||
// });
|
||||
// cy.eyesCheckWindow('Main Page');
|
||||
// cy.get('button').click();
|
||||
// cy.eyesCheckWindow('Click!');
|
||||
// cy.eyesClose();
|
||||
// });
|
||||
});
|
||||
511
cypress/integration/rendering/classDiagram-v2.spec.js
Normal file
511
cypress/integration/rendering/classDiagram-v2.spec.js
Normal file
@@ -0,0 +1,511 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util';
|
||||
describe('Class diagram V2', () => {
|
||||
it('0: should render a simple class diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
|
||||
classA -- classB : Inheritance
|
||||
classA -- classC : link
|
||||
classC -- classD : link
|
||||
classB -- classD
|
||||
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('1: should render a simple class diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 *-- Class04
|
||||
Class05 o-- Class06
|
||||
Class07 .. Class08
|
||||
Class09 --> C2 : Where am i?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class12 <|.. Class08
|
||||
Class11 ..>Class12
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class01 : -int privateChimp
|
||||
Class01 : +int publicGorilla
|
||||
Class01 : #int protectedMarmoset
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('2: should render a simple class diagrams with cardinality', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 "1" <|--|> "*" AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 "1" *-- "*" Class04
|
||||
Class05 "1" o-- "many" Class06
|
||||
Class07 "1" .. "*" Class08
|
||||
Class09 "1" --> "*" C2 : Where am i?
|
||||
Class09 "*" --* "*" C3
|
||||
Class09 "1" --|> "1" Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 "1" <--> "*" C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render a simple class diagram with different visibilities', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class01 : -privateMethod()
|
||||
Class01 : +publicMethod()
|
||||
Class01 : #protectedMethod()
|
||||
Class01 : -int privateChimp
|
||||
Class01 : +int publicGorilla
|
||||
Class01 : #int protectedMarmoset
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render multiple class diagrams', () => {
|
||||
imgSnapshotTest(
|
||||
[
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 "1" <|--|> "*" AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 "1" *-- "*" Class04
|
||||
Class05 "1" o-- "many" Class06
|
||||
Class07 "1" .. "*" Class08
|
||||
Class09 "1" --> "*" C2 : Where am i?
|
||||
Class09 "*" --* "*" C3
|
||||
Class09 "1" --|> "1" Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 "1" <--> "*" C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 "1" <|--|> "*" AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 "1" *-- "*" Class04
|
||||
Class05 "1" o-- "many" Class06
|
||||
Class07 "1" .. "*" Class08
|
||||
Class09 "1" --> "*" C2 : Where am i?
|
||||
Class09 "*" --* "*" C3
|
||||
Class09 "1" --|> "1" Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 "1" <--> "*" C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
],
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('4: should render a simple class diagram with comments', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
%% this is a comment
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 *-- Class04
|
||||
Class05 o-- Class06
|
||||
Class07 .. Class08
|
||||
Class09 --> C2 : Where am i?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('5: should render a simple class diagram with abstract method', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
Class01 : someMethod()*
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('6: should render a simple class diagram with static method', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
Class01 : someMethod()$
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('7: should render a simple class diagram with Generic class', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Class01~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('8: should render a simple class diagram with Generic class and relations', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01~T~ <|-- AveryLongClass : Cool
|
||||
Class03~T~ *-- Class04~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('9: should render a simple class diagram with clickable link', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01~T~ <|-- AveryLongClass : Cool
|
||||
Class03~T~ *-- Class04~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
link Class01 "google.com" "A Tooltip"
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('10: should render a simple class diagram with clickable callback', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
Class01~T~ <|-- AveryLongClass : Cool
|
||||
Class03~T~ *-- Class04~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
callback Class01 "functionCall" "A Tooltip"
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('11: should render a simple class diagram with return type on method', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Class10~T~ {
|
||||
int[] id
|
||||
test(int[] ids) bool
|
||||
testArray() bool[]
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('12: should render a simple class diagram with generic types', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Class10~T~ {
|
||||
int[] id
|
||||
List~int~ ids
|
||||
test(List~int~ ids) List~bool~
|
||||
testArray() bool[]
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('13: should render a simple class diagram with css classes applied', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Class10 {
|
||||
int[] id
|
||||
List~int~ ids
|
||||
test(List~int~ ids) List~bool~
|
||||
testArray() bool[]
|
||||
}
|
||||
|
||||
cssClass "Class10" exClass2
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('14: should render a simple class diagram with css classes applied directly', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Class10:::exClass2 {
|
||||
int[] id
|
||||
List~int~ ids
|
||||
test(List~int~ ids) List~bool~
|
||||
testArray() bool[]
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('15: should render a simple class diagram with css classes applied two multiple classes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Class10
|
||||
class Class20
|
||||
|
||||
cssClass "Class10, class20" exClass2
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('16a: should render a simple class diagram with static field', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
class Foo {
|
||||
+String bar$
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('16b: should handle the direction statement with TB', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
direction TB
|
||||
class Student {
|
||||
-idCard : IdCard
|
||||
}
|
||||
class IdCard{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
class Bike{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
Student "1" --o "1" IdCard : carries
|
||||
Student "1" --o "1" Bike : rides
|
||||
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('18: should handle the direction statement with LR', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
direction LR
|
||||
class Student {
|
||||
-idCard : IdCard
|
||||
}
|
||||
class IdCard{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
class Bike{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
Student "1" --o "1" IdCard : carries
|
||||
Student "1" --o "1" Bike : rides
|
||||
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('17a: should handle the direction statement with BT', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
direction BT
|
||||
class Student {
|
||||
-idCard : IdCard
|
||||
}
|
||||
class IdCard{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
class Bike{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
Student "1" --o "1" IdCard : carries
|
||||
Student "1" --o "1" Bike : rides
|
||||
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('17b: should handle the direction statement with RL', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
direction RL
|
||||
class Student {
|
||||
-idCard : IdCard
|
||||
}
|
||||
class IdCard{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
class Bike{
|
||||
-id : int
|
||||
-name : string
|
||||
}
|
||||
Student "1" --o "1" IdCard : carries
|
||||
Student "1" --o "1" Bike : rides
|
||||
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('18: should render a simple class diagram with notes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram-v2
|
||||
note "I love this diagram!\nDo you love it?"
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
size()
|
||||
}
|
||||
note for Class10 "Cool class\nI said it's very cool class!"
|
||||
|
||||
`,
|
||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('1433: should render a simple class with a title', () => {
|
||||
imgSnapshotTest(
|
||||
`---
|
||||
title: simple class diagram
|
||||
---
|
||||
classDiagram-v2
|
||||
class Class10
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
427
cypress/integration/rendering/classDiagram.spec.js
Normal file
427
cypress/integration/rendering/classDiagram.spec.js
Normal file
@@ -0,0 +1,427 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
describe('Class diagram', () => {
|
||||
it('1: should render a simple class diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 *-- Class04
|
||||
Class05 o-- Class06
|
||||
Class07 .. Class08
|
||||
Class09 --> C2 : Where am i?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class12 <|.. Class08
|
||||
Class11 ..>Class12
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class01 : -int privateChimp
|
||||
Class01 : +int publicGorilla
|
||||
Class01 : #int protectedMarmoset
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('2: should render a simple class diagrams with cardinality', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01 "1" <|--|> "*" AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 "1" *-- "*" Class04
|
||||
Class05 "1" o-- "many" Class06
|
||||
Class07 "1" .. "*" Class08
|
||||
Class09 "1" --> "*" C2 : Where am i?
|
||||
Class09 "*" --* "*" C3
|
||||
Class09 "1" --|> "1" Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 "1" <--> "*" C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('3: should render a simple class diagram with different visibilities', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class01 : -privateMethod()
|
||||
Class01 : +publicMethod()
|
||||
Class01 : #protectedMethod()
|
||||
Class01 : -int privateChimp
|
||||
Class01 : +int publicGorilla
|
||||
Class01 : #int protectedMarmoset
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('4: should render a simple class diagram with comments', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
%% this is a comment
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 *-- Class04
|
||||
Class05 o-- Class06
|
||||
Class07 .. Class08
|
||||
Class09 --> C2 : Where am i?
|
||||
Class09 --* C3
|
||||
Class09 --|> Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('5: should render a simple class diagram with abstract method', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
Class01 : someMethod()*
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('6: should render a simple class diagram with static method', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01 <|-- AveryLongClass : Cool
|
||||
Class01 : someMethod()$
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('7: should render a simple class diagram with Generic class', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
class Class01~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('8: should render a simple class diagram with Generic class and relations', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01~T~ <|-- AveryLongClass : Cool
|
||||
Class03~T~ *-- Class04~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('9: should render a simple class diagram with clickable link', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01~T~ <|-- AveryLongClass : Cool
|
||||
Class03~T~ *-- Class04~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
link Class01 "google.com" "A Tooltip"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('10: should render a simple class diagram with clickable callback', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
Class01~T~ <|-- AveryLongClass : Cool
|
||||
Class03~T~ *-- Class04~T~
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 <--> C2: Cool label
|
||||
class Class10~T~ {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
callback Class01 "functionCall" "A Tooltip"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('11: should render a simple class diagram with return type on method', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
class Class10~T~ {
|
||||
int[] id
|
||||
test(int[] ids) bool
|
||||
testArray() bool[]
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('12: should render a simple class diagram with generic types', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
class Class10~T~ {
|
||||
int[] id
|
||||
List~int~ ids
|
||||
test(List~int~ ids) List~bool~
|
||||
testArray() bool[]
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('13: should render a simple class diagram with css classes applied', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
class Class10 {
|
||||
int[] id
|
||||
List~int~ ids
|
||||
test(List~int~ ids) List~bool~
|
||||
testArray() bool[]
|
||||
}
|
||||
|
||||
class Class10:::exClass2
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('14: should render a simple class diagram with css classes applied directly', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
class Class10:::exClass2 {
|
||||
int[] id
|
||||
List~int~ ids
|
||||
test(List~int~ ids) List~bool~
|
||||
testArray() bool[]
|
||||
}
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('15: should render a simple class diagram with css classes applied two multiple classes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
class Class10
|
||||
class Class20
|
||||
|
||||
cssClass "Class10, Class20" exClass2
|
||||
class Class20:::exClass2
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('16: should render multiple class diagrams', () => {
|
||||
imgSnapshotTest(
|
||||
[
|
||||
`
|
||||
classDiagram
|
||||
Class01 "1" <|--|> "*" AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 "1" *-- "*" Class04
|
||||
Class05 "1" o-- "many" Class06
|
||||
Class07 "1" .. "*" Class08
|
||||
Class09 "1" --> "*" C2 : Where am i?
|
||||
Class09 "*" --* "*" C3
|
||||
Class09 "1" --|> "1" Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 "1" <--> "*" C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
`
|
||||
classDiagram
|
||||
Class01 "1" <|--|> "*" AveryLongClass : Cool
|
||||
<<interface>> Class01
|
||||
Class03 "1" *-- "*" Class04
|
||||
Class05 "1" o-- "many" Class06
|
||||
Class07 "1" .. "*" Class08
|
||||
Class09 "1" --> "*" C2 : Where am i?
|
||||
Class09 "*" --* "*" C3
|
||||
Class09 "1" --|> "1" Class07
|
||||
Class07 : equals()
|
||||
Class07 : Object[] elementData
|
||||
Class01 : size()
|
||||
Class01 : int chimp
|
||||
Class01 : int gorilla
|
||||
Class08 "1" <--> "*" C2: Cool label
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
test()
|
||||
}
|
||||
`,
|
||||
],
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
// it('17: should render a class diagram when useMaxWidth is true (default)', () => {
|
||||
// renderGraph(
|
||||
// `
|
||||
// classDiagram
|
||||
// Class01 <|-- AveryLongClass : Cool
|
||||
// Class01 : size()
|
||||
// Class01 : int chimp
|
||||
// Class01 : int gorilla
|
||||
// Class01 : -int privateChimp
|
||||
// Class01 : +int publicGorilla
|
||||
// Class01 : #int protectedMarmoset
|
||||
// `,
|
||||
// { class: { useMaxWidth: true } }
|
||||
// );
|
||||
// cy.get('svg')
|
||||
// .should((svg) => {
|
||||
// expect(svg).to.have.attr('width', '100%');
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(332, 333);
|
||||
// // expect(svg).to.have.attr('height', '218');
|
||||
// const style = svg.attr('style');
|
||||
// expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
// const maxWidthValue = parseInt(style.match(/[\d.]+/g).join(''));
|
||||
// // use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// expect(maxWidthValue).to.be.within(203, 204);
|
||||
// });
|
||||
// });
|
||||
|
||||
// it('18: should render a class diagram when useMaxWidth is false', () => {
|
||||
// renderGraph(
|
||||
// `
|
||||
// classDiagram
|
||||
// Class01 <|-- AveryLongClass : Cool
|
||||
// Class01 : size()
|
||||
// Class01 : int chimp
|
||||
// Class01 : int gorilla
|
||||
// Class01 : -int privateChimp
|
||||
// Class01 : +int publicGorilla
|
||||
// Class01 : #int protectedMarmoset
|
||||
// `,
|
||||
// { class: { useMaxWidth: false } }
|
||||
// );
|
||||
// cy.get('svg')
|
||||
// .should((svg) => {
|
||||
// const width = parseFloat(svg.attr('width'));
|
||||
// // use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// expect(width).to.be.within(100, 101);
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(332, 333);
|
||||
// // expect(svg).to.have.attr('height', '332');
|
||||
// // expect(svg).to.not.have.attr('style');
|
||||
// });
|
||||
// });
|
||||
|
||||
it('19: should render a simple class diagram with notes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
classDiagram
|
||||
note "I love this diagram!\nDo you love it?"
|
||||
class Class10 {
|
||||
<<service>>
|
||||
int id
|
||||
size()
|
||||
}
|
||||
note for Class10 "Cool class\nI said it's very cool class!"
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
});
|
||||
140
cypress/integration/rendering/conf-and-directives.spec.js
Normal file
140
cypress/integration/rendering/conf-and-directives.spec.js
Normal file
@@ -0,0 +1,140 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util.js';
|
||||
|
||||
describe('Configuration and directives - nodes should be light blue', () => {
|
||||
it('No config - use default', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
A(Default) --> B[/Another/]
|
||||
A --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('Settings from initialize - nodes should be green', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
A(Forest) --> B[/Another/]
|
||||
A --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end `,
|
||||
{ theme: 'forest' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('Settings from initialize overriding themeVariable - nodes should be red', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
|
||||
|
||||
%%{init: { 'theme': 'base', 'themeVariables':{ 'primaryColor': '#ff0000'}}}%%
|
||||
graph TD
|
||||
A(Start) --> B[/Another/]
|
||||
A[/Another/] --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{ theme: 'base', themeVariables: { primaryColor: '#ff0000' }, logLevel: 0 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('Settings from directive - nodes should be grey', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': 'neutral'} }%%
|
||||
graph TD
|
||||
A(Start) --> B[/Another/]
|
||||
A[/Another/] --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('Settings from directive overriding theme variable - nodes should be red', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: {'theme': 'base', 'themeVariables':{ 'primaryColor': '#ff0000'}}}%%
|
||||
graph TD
|
||||
A(Start) --> B[/Another/]
|
||||
A[/Another/] --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('Settings from initialize and directive - nodes should be grey', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': 'neutral'} }%%
|
||||
graph TD
|
||||
A(Start) --> B[/Another/]
|
||||
A[/Another/] --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{ theme: 'forest' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('Theme from initialize, directive overriding theme variable - nodes should be red', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: {'theme': 'base', 'themeVariables':{ 'primaryColor': '#ff0000'}}}%%
|
||||
graph TD
|
||||
A(Start) --> B[/Another/]
|
||||
A[/Another/] --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{ theme: 'base' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('Theme variable from initialize, theme from directive - nodes should be red', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': 'base'} }%%
|
||||
graph TD
|
||||
A(Start) --> B[/Another/]
|
||||
A[/Another/] --> C[End]
|
||||
subgraph section
|
||||
B
|
||||
C
|
||||
end
|
||||
`,
|
||||
{ themeVariables: { primaryColor: '#ff0000' } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
describe('when rendering several diagrams', () => {
|
||||
it('diagrams should not taint later diagrams', () => {
|
||||
const url = 'http://localhost:9000/theme-directives.html';
|
||||
cy.visit(url);
|
||||
cy.get('svg');
|
||||
cy.matchImageSnapshot('conf-and-directives.spec-when-rendering-several-diagrams-diagram-1');
|
||||
});
|
||||
});
|
||||
});
|
||||
20
cypress/integration/rendering/current.spec.js
Normal file
20
cypress/integration/rendering/current.spec.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util';
|
||||
|
||||
describe('State diagram', () => {
|
||||
it('should render a state with states in it', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state PersonalizedCockpit {
|
||||
Other
|
||||
state Parent {
|
||||
C
|
||||
}
|
||||
}
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
12
cypress/integration/rendering/debug.spec.js
Normal file
12
cypress/integration/rendering/debug.spec.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util';
|
||||
|
||||
describe('Flowchart', () => {
|
||||
it('34: testing the label width in percy', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas]
|
||||
`,
|
||||
{ theme: 'forest', fontFamily: '"Noto Sans SC", sans-serif' }
|
||||
);
|
||||
});
|
||||
});
|
||||
289
cypress/integration/rendering/erDiagram.spec.js
Normal file
289
cypress/integration/rendering/erDiagram.spec.js
Normal file
@@ -0,0 +1,289 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
describe('Entity Relationship Diagram', () => {
|
||||
it('should render a simple ER diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render an ER diagram with a recursive relationship', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||..o{ CUSTOMER : refers
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render an ER diagram with multiple relationships between the same two entities', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||--|{ ADDRESS : "invoiced at"
|
||||
CUSTOMER ||--|{ ADDRESS : "receives goods at"
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render a cyclical ER diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
A ||--|{ B : likes
|
||||
B ||--|{ C : likes
|
||||
C ||--|{ A : likes
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render a not-so-simple ER diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
CUSTOMER ||--o{ INVOICE : "liable for"
|
||||
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
||||
INVOICE ||--|{ ORDER : covers
|
||||
ORDER ||--|{ ORDER-ITEM : includes
|
||||
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
||||
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render multiple ER diagrams', () => {
|
||||
imgSnapshotTest(
|
||||
[
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
],
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render an ER diagram with blank or empty labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
BOOK }|..|{ AUTHOR : ""
|
||||
BOOK }|..|{ GENRE : " "
|
||||
AUTHOR }|..|{ GENRE : " "
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render an ER diagrams when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
{ er: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height', '465');
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
expect(maxWidthValue).to.be.within(140 * 0.95, 140 * 1.05);
|
||||
});
|
||||
});
|
||||
|
||||
it('should render an ER when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
{ er: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
expect(width).to.be.within(140 * 0.95, 140 * 1.05);
|
||||
// expect(svg).to.have.attr('height', '465');
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
|
||||
it('should render entities that have no relationships', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
DEAD_PARROT
|
||||
HERMIT
|
||||
RECLUSE
|
||||
SOCIALITE }o--o{ SOCIALITE : "interacts with"
|
||||
RECLUSE }o--o{ SOCIALITE : avoids
|
||||
`,
|
||||
{ er: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities with and without attributes', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
BOOK { string title }
|
||||
AUTHOR }|..|{ BOOK : writes
|
||||
BOOK { float price }
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities with generic and array attributes', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
BOOK {
|
||||
string title
|
||||
string[] authors
|
||||
type~T~ type
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities and attributes with big and small entity names', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
PRIVATE_FINANCIAL_INSTITUTION {
|
||||
string name
|
||||
int turnover
|
||||
}
|
||||
PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs
|
||||
EMPLOYEE { bool officer_of_firm }
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities with keys', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||
string name PK
|
||||
}
|
||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||
BOOK {
|
||||
float price
|
||||
string author FK
|
||||
string title PK
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities with comments', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||
string name "comment"
|
||||
}
|
||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||
BOOK {
|
||||
string author
|
||||
string title "author comment"
|
||||
float price "price comment"
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities with keys and comments', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||
string name PK "comment"
|
||||
}
|
||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||
BOOK {
|
||||
string description
|
||||
float price "price comment"
|
||||
string title PK "title comment"
|
||||
string author FK
|
||||
}
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render entities with aliases', () => {
|
||||
renderGraph(
|
||||
`
|
||||
erDiagram
|
||||
T1 one or zero to one or more T2 : test
|
||||
T2 one or many optionally to zero or one T3 : test
|
||||
T3 zero or more to zero or many T4 : test
|
||||
T4 many(0) to many(1) T5 : test
|
||||
T5 many optionally to one T6 : test
|
||||
T6 only one optionally to only one T1 : test
|
||||
T4 0+ to 1+ T6 : test
|
||||
T1 1 to 1 T3 : test
|
||||
`,
|
||||
{ logLevel: 1 }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('1433: should render a simple ER diagram with a title', () => {
|
||||
imgSnapshotTest(
|
||||
`---
|
||||
title: simple ER diagram
|
||||
---
|
||||
erDiagram
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
ORDER ||--|{ LINE-ITEM : contains
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
677
cypress/integration/rendering/flowchart-v2.spec.js
Normal file
677
cypress/integration/rendering/flowchart-v2.spec.js
Normal file
@@ -0,0 +1,677 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
describe('Flowchart v2', () => {
|
||||
it('1: should render a simple flowchart', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('2: should render a simple flowchart with diagramPadding set to 0', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
%% this is a comment
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { diagramPadding: 0 } }
|
||||
);
|
||||
});
|
||||
|
||||
it('3: a link with correct arrowhead to a subgraph', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
P1
|
||||
P1 -->P1.5
|
||||
subgraph P1.5
|
||||
P2
|
||||
P2.5(( A ))
|
||||
P3
|
||||
end
|
||||
P2 --> P4
|
||||
P3 --> P6
|
||||
P1.5 --> P5
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('4: Length of edges', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
L1 --- L2
|
||||
L2 --- C
|
||||
M1 ---> C
|
||||
R1 .-> R2
|
||||
R2 <.-> C
|
||||
C -->|Label 1| E1
|
||||
C <-- Label 2 ---> E2
|
||||
C ----> E3
|
||||
C <-...-> E4
|
||||
C ======> E5
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('5: should render escaped without html labels', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
a["<strong>Haiya</strong>"]---->b
|
||||
`,
|
||||
{ htmlLabels: false, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
});
|
||||
it('6: should render non-escaped with html labels', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
a["<strong>Haiya</strong>"]===>b
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('7: should render a flowchart when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`flowchart TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(446 * 0.95, 446 * 1.05);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
expect(maxWidthValue).to.be.within(290 * 0.95 - 1, 290 * 1.05);
|
||||
});
|
||||
});
|
||||
it('8: should render a flowchart when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`flowchart TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// expect(height).to.be.within(446 * 0.95, 446 * 1.05);
|
||||
expect(width).to.be.within(290 * 0.95 - 1, 290 * 1.05);
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
|
||||
it('V2 - 16: Render Stadium shape', () => {
|
||||
imgSnapshotTest(
|
||||
` flowchart TD
|
||||
A([stadium shape test])
|
||||
A -->|Get money| B([Go shopping])
|
||||
B --> C([Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?])
|
||||
C -->|One| D([Laptop])
|
||||
C -->|Two| E([iPhone])
|
||||
C -->|Three| F([Car<br/>wroom wroom])
|
||||
click A "index.html#link-clicked" "link test"
|
||||
click B testClick "click test"
|
||||
classDef someclass fill:#f96;
|
||||
class A someclass;
|
||||
class C someclass;
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('50: handle nested subgraphs in reverse order', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart LR
|
||||
a -->b
|
||||
subgraph A
|
||||
B
|
||||
end
|
||||
subgraph B
|
||||
b
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('51: handle nested subgraphs in reverse order', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart LR
|
||||
a -->b
|
||||
subgraph A
|
||||
B
|
||||
end
|
||||
subgraph B
|
||||
b
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('52: handle nested subgraphs in several levels', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TB
|
||||
b-->B
|
||||
a-->c
|
||||
subgraph O
|
||||
A
|
||||
end
|
||||
subgraph B
|
||||
c
|
||||
end
|
||||
subgraph A
|
||||
a
|
||||
b
|
||||
B
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('53: handle nested subgraphs with edges in and out', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TB
|
||||
internet
|
||||
nat
|
||||
routeur
|
||||
lb1
|
||||
lb2
|
||||
compute1
|
||||
compute2
|
||||
subgraph project
|
||||
routeur
|
||||
nat
|
||||
subgraph subnet1
|
||||
compute1
|
||||
lb1
|
||||
end
|
||||
subgraph subnet2
|
||||
compute2
|
||||
lb2
|
||||
end
|
||||
end
|
||||
internet --> routeur
|
||||
routeur --> subnet1 & subnet2
|
||||
subnet1 & subnet2 --> nat --> internet
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('54: handle nested subgraphs with outgoing links', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
subgraph main
|
||||
subgraph subcontainer
|
||||
subcontainer-child
|
||||
end
|
||||
subcontainer-child--> subcontainer-sibling
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('55: handle nested subgraphs with outgoing links 2', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TD
|
||||
|
||||
subgraph one[One]
|
||||
subgraph sub_one[Sub One]
|
||||
_sub_one
|
||||
end
|
||||
subgraph sub_two[Sub Two]
|
||||
_sub_two
|
||||
end
|
||||
_one
|
||||
end
|
||||
|
||||
%% here, either the first or the second one
|
||||
sub_one --> sub_two
|
||||
_one --> b
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('56: handle nested subgraphs with outgoing links 3', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TB
|
||||
subgraph container_Beta
|
||||
process_C-->Process_D
|
||||
end
|
||||
subgraph container_Alpha
|
||||
process_A-->process_B
|
||||
process_A-->|messages|process_C
|
||||
end
|
||||
process_B-->|via_AWSBatch|container_Beta
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('57: handle nested subgraphs with outgoing links 4', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart LR
|
||||
subgraph A
|
||||
a -->b
|
||||
end
|
||||
subgraph B
|
||||
b
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('57: handle nested subgraphs with outgoing links 2', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TB
|
||||
c1-->a2
|
||||
subgraph one
|
||||
a1-->a2
|
||||
end
|
||||
subgraph two
|
||||
b1-->b2
|
||||
end
|
||||
subgraph three
|
||||
c1-->c2
|
||||
end
|
||||
one --> two
|
||||
three --> two
|
||||
two --> c2
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('57.x: handle nested subgraphs with outgoing links 5', () => {
|
||||
imgSnapshotTest(
|
||||
`%% this does not produce the desired result
|
||||
flowchart TB
|
||||
subgraph container_Beta
|
||||
process_C-->Process_D
|
||||
end
|
||||
subgraph container_Alpha
|
||||
process_A-->process_B
|
||||
process_B-->|via_AWSBatch|container_Beta
|
||||
process_A-->|messages|process_C
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('58: handle styling with style expressions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
id1(Start)-->id2(Stop)
|
||||
style id1 fill:#f9f,stroke:#333,stroke-width:4px
|
||||
style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('59: handle styling of subgraphs and links', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart TD
|
||||
A[Christmas] ==> D
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
A[Christmas] ==> C
|
||||
subgraph T ["Test"]
|
||||
A
|
||||
B
|
||||
C
|
||||
end
|
||||
|
||||
classDef Test fill:#F84E68,stroke:#333,color:white;
|
||||
class A,T Test
|
||||
classDef TestSub fill:green;
|
||||
class T TestSub
|
||||
linkStyle 0,1 color:orange, stroke: orange;
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('60: handle styling for all node shapes - v2', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
A[red text] -->|default style| B(blue text)
|
||||
C([red text]) -->|default style| D[[blue text]]
|
||||
E[(red text)] -->|default style| F((blue text))
|
||||
G>red text] -->|default style| H{blue text}
|
||||
I{{red text}} -->|default style| J[/blue text/]
|
||||
K[\\ red text\\] -->|default style| L[/blue text\\]
|
||||
M[\\ red text/] -->|default style| N[blue text];
|
||||
O(((red text))) -->|default style| P(((blue text)));
|
||||
linkStyle default color:Sienna;
|
||||
style A stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style B stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style C stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style D stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style E stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style F stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style G stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style H stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style I stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style J stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style K stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style L stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style M stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style N stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
style O stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||
style P stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose', logLevel: 2 }
|
||||
);
|
||||
});
|
||||
it('61: fontawesome icons in edge labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart TD
|
||||
C -->|fa:fa-car Car| F[fa:fa-car Car]
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('62: should render styled subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart TB
|
||||
A
|
||||
B
|
||||
subgraph foo[Foo SubGraph]
|
||||
C
|
||||
D
|
||||
end
|
||||
subgraph bar[Bar SubGraph]
|
||||
E
|
||||
F
|
||||
end
|
||||
G
|
||||
|
||||
A-->B
|
||||
B-->C
|
||||
C-->D
|
||||
B-->D
|
||||
D-->E
|
||||
E-->A
|
||||
E-->F
|
||||
F-->D
|
||||
F-->G
|
||||
B-->G
|
||||
G-->D
|
||||
|
||||
style foo fill:#F99,stroke-width:2px,stroke:#F0F,color:darkred
|
||||
style bar fill:#999,stroke-width:10px,stroke:#0F0,color:blue
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('63: title on subgraphs should be themable', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
||||
flowchart LR
|
||||
subgraph A
|
||||
a --> b
|
||||
end
|
||||
subgraph B
|
||||
i -->f
|
||||
end
|
||||
A --> B
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('65: text-color from classes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
classDef dark fill:#000,stroke:#000,stroke-width:4px,color:#fff
|
||||
Lorem --> Ipsum --> Dolor
|
||||
class Lorem,Dolor dark
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('66: More nested subgraph cases (TB)', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart TB
|
||||
subgraph two
|
||||
b1
|
||||
end
|
||||
subgraph three
|
||||
c2
|
||||
end
|
||||
|
||||
three --> two
|
||||
two --> c2
|
||||
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('67: More nested subgraph cases (RL)', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart RL
|
||||
subgraph two
|
||||
b1
|
||||
end
|
||||
subgraph three
|
||||
c2
|
||||
end
|
||||
|
||||
three --> two
|
||||
two --> c2
|
||||
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('68: More nested subgraph cases (BT)', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart BT
|
||||
subgraph two
|
||||
b1
|
||||
end
|
||||
subgraph three
|
||||
c2
|
||||
end
|
||||
|
||||
three --> two
|
||||
two --> c2
|
||||
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('69: More nested subgraph cases (LR)', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
subgraph two
|
||||
b1
|
||||
end
|
||||
subgraph three
|
||||
c2
|
||||
end
|
||||
|
||||
three --> two
|
||||
two --> c2
|
||||
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('70: Handle nested subgraph cases (TB) link out and link between subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart TB
|
||||
subgraph S1
|
||||
sub1 -->sub2
|
||||
end
|
||||
subgraph S2
|
||||
sub4
|
||||
end
|
||||
S1 --> S2
|
||||
sub1 --> sub4
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('71: Handle nested subgraph cases (RL) link out and link between subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart RL
|
||||
subgraph S1
|
||||
sub1 -->sub2
|
||||
end
|
||||
subgraph S2
|
||||
sub4
|
||||
end
|
||||
S1 --> S2
|
||||
sub1 --> sub4
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('72: Handle nested subgraph cases (BT) link out and link between subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart BT
|
||||
subgraph S1
|
||||
sub1 -->sub2
|
||||
end
|
||||
subgraph S2
|
||||
sub4
|
||||
end
|
||||
S1 --> S2
|
||||
sub1 --> sub4
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('74: Handle nested subgraph cases (RL) link out and link between subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart RL
|
||||
subgraph S1
|
||||
sub1 -->sub2
|
||||
end
|
||||
subgraph S2
|
||||
sub4
|
||||
end
|
||||
S1 --> S2
|
||||
sub1 --> sub4
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('74: Handle labels for multiple edges from and to the same couple of nodes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart RL
|
||||
subgraph one
|
||||
a1 -- l1 --> a2
|
||||
a1 -- l2 --> a2
|
||||
end
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('76: handle unicode encoded character with HTML labels true', () => {
|
||||
imgSnapshotTest(
|
||||
`flowchart TB
|
||||
a{{"Lorem 'ipsum' dolor 'sit' amet, 'consectetur' adipiscing 'elit'."}}
|
||||
--> b{{"Lorem #quot;ipsum#quot; dolor #quot;sit#quot; amet,#quot;consectetur#quot; adipiscing #quot;elit#quot;."}}
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('2050: handling of different rendering direction in subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
|
||||
subgraph TOP
|
||||
direction TB
|
||||
subgraph B1
|
||||
direction RL
|
||||
i1 -->f1
|
||||
end
|
||||
subgraph B2
|
||||
direction BT
|
||||
i2 -->f2
|
||||
end
|
||||
end
|
||||
A --> TOP --> B
|
||||
B1 --> B2
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
|
||||
it('2388: handling default in the node name', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
default-index.js --> dot.template.js
|
||||
index.js --> module-utl.js
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('2824: Clipping of edges', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart TD
|
||||
A --> B
|
||||
A --> C
|
||||
B --> C
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('1433: should render a titled flowchart with titleTopMargin set to 0', () => {
|
||||
imgSnapshotTest(
|
||||
`---
|
||||
title: Simple flowchart
|
||||
---
|
||||
flowchart TD
|
||||
A --> B
|
||||
`,
|
||||
{ titleTopMargin: 0 }
|
||||
);
|
||||
});
|
||||
});
|
||||
894
cypress/integration/rendering/flowchart.spec.js
Normal file
894
cypress/integration/rendering/flowchart.spec.js
Normal file
@@ -0,0 +1,894 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
describe('Graph', () => {
|
||||
it('1: should render a simple flowchart no htmlLabels', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('2: should render a simple flowchart with htmlLabels', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { htmlLabels: true }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('3: should render a simple flowchart with line breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me thinksssss<br/>ssssssssssssssssssssss<br/>sssssssssssssssssssssssssss}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[Car]
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('4: should render a simple flowchart with trapezoid and inverse trapezoid vertex options.', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
A[/Christmas\\]
|
||||
A -->|Get money| B[\\Go shopping/]
|
||||
B --> C{Let me thinksssss<br/>ssssssssssssssssssssss<br/>sssssssssssssssssssssssssss}
|
||||
C -->|One| D[/Laptop/]
|
||||
C -->|Two| E[\\iPhone\\]
|
||||
C -->|Three| F[Car]
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('5: should style nodes via a class.', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
1A --> 1B
|
||||
1B --> 1C
|
||||
1C --> D
|
||||
1C --> E
|
||||
|
||||
classDef processHead fill:#888888,color:white,font-weight:bold,stroke-width:3px,stroke:#001f3f
|
||||
class 1A,1B,D,E processHead
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('6: should render a flowchart full of circles', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph LR
|
||||
47(SAM.CommonFA.FMESummary)-->48(SAM.CommonFA.CommonFAFinanceBudget)
|
||||
37(SAM.CommonFA.BudgetSubserviceLineVolume)-->48(SAM.CommonFA.CommonFAFinanceBudget)
|
||||
35(SAM.CommonFA.PopulationFME)-->47(SAM.CommonFA.FMESummary)
|
||||
41(SAM.CommonFA.MetricCost)-->47(SAM.CommonFA.FMESummary)
|
||||
44(SAM.CommonFA.MetricOutliers)-->47(SAM.CommonFA.FMESummary)
|
||||
46(SAM.CommonFA.MetricOpportunity)-->47(SAM.CommonFA.FMESummary)
|
||||
40(SAM.CommonFA.OPVisits)-->47(SAM.CommonFA.FMESummary)
|
||||
38(SAM.CommonFA.CommonFAFinanceRefund)-->47(SAM.CommonFA.FMESummary)
|
||||
43(SAM.CommonFA.CommonFAFinancePicuDays)-->47(SAM.CommonFA.FMESummary)
|
||||
42(SAM.CommonFA.CommonFAFinanceNurseryDays)-->47(SAM.CommonFA.FMESummary)
|
||||
45(SAM.CommonFA.MetricPreOpportunity)-->46(SAM.CommonFA.MetricOpportunity)
|
||||
35(SAM.CommonFA.PopulationFME)-->45(SAM.CommonFA.MetricPreOpportunity)
|
||||
41(SAM.CommonFA.MetricCost)-->45(SAM.CommonFA.MetricPreOpportunity)
|
||||
41(SAM.CommonFA.MetricCost)-->44(SAM.CommonFA.MetricOutliers)
|
||||
39(SAM.CommonFA.ChargeDetails)-->43(SAM.CommonFA.CommonFAFinancePicuDays)
|
||||
39(SAM.CommonFA.ChargeDetails)-->42(SAM.CommonFA.CommonFAFinanceNurseryDays)
|
||||
39(SAM.CommonFA.ChargeDetails)-->41(SAM.CommonFA.MetricCost)
|
||||
39(SAM.CommonFA.ChargeDetails)-->40(SAM.CommonFA.OPVisits)
|
||||
35(SAM.CommonFA.PopulationFME)-->39(SAM.CommonFA.ChargeDetails)
|
||||
36(SAM.CommonFA.PremetricCost)-->39(SAM.CommonFA.ChargeDetails)
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('7: should render a flowchart full of icons', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002("fa:fa-creative-commons My System | Test Environment")
|
||||
82072290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Business Logic Server:Service 1")
|
||||
db052290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Business Logic Server:Service 2")
|
||||
4e112290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Report Server:Service 1")
|
||||
30122290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Report Server:Service 2")
|
||||
5e112290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Dedicated Test Business Logic Server:Service 1")
|
||||
c1112290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Dedicated Test Business Logic Server:Service 2")
|
||||
b7042290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\\SharedDbInstance].[SupportDb]")
|
||||
8f102290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\\SharedDbInstance].[DevelopmentDb]")
|
||||
0e102290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\\SharedDbInstance].[TestDb]")
|
||||
07132290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\\SharedDbInstance].[SharedReportingDb]")
|
||||
c7072290_1ec3_e711_8c5a_005056ad0002("fa:fa-server Shared Business Logic Server")
|
||||
ca122290_1ec3_e711_8c5a_005056ad0002("fa:fa-server Shared Report Server")
|
||||
68102290_1ec3_e711_8c5a_005056ad0002("fa:fa-server Dedicated Test Business Logic Server")
|
||||
f4112290_1ec3_e711_8c5a_005056ad0002("fa:fa-database [DBServer\\SharedDbInstance]")
|
||||
d6072290_1ec3_e711_8c5a_005056ad0002("fa:fa-server DBServer")
|
||||
71082290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs DBServer\\:MSSQLSERVER")
|
||||
c0102290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs DBServer\\:SQLAgent")
|
||||
9a072290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs DBServer\\:SQLBrowser")
|
||||
1d0a2290_1ec3_e711_8c5a_005056ad0002("fa:fa-server VmHost1")
|
||||
200a2290_1ec3_e711_8c5a_005056ad0002("fa:fa-server VmHost2")
|
||||
1c0a2290_1ec3_e711_8c5a_005056ad0002("fa:fa-server VmHost3")
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002-->82072290_1ec3_e711_8c5a_005056ad0002
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002-->db052290_1ec3_e711_8c5a_005056ad0002
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002-->4e112290_1ec3_e711_8c5a_005056ad0002
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002-->30122290_1ec3_e711_8c5a_005056ad0002
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002-->5e112290_1ec3_e711_8c5a_005056ad0002
|
||||
9e122290_1ec3_e711_8c5a_005056ad0002-->c1112290_1ec3_e711_8c5a_005056ad0002
|
||||
82072290_1ec3_e711_8c5a_005056ad0002-->b7042290_1ec3_e711_8c5a_005056ad0002
|
||||
82072290_1ec3_e711_8c5a_005056ad0002-->8f102290_1ec3_e711_8c5a_005056ad0002
|
||||
82072290_1ec3_e711_8c5a_005056ad0002-->0e102290_1ec3_e711_8c5a_005056ad0002
|
||||
82072290_1ec3_e711_8c5a_005056ad0002-->c7072290_1ec3_e711_8c5a_005056ad0002
|
||||
db052290_1ec3_e711_8c5a_005056ad0002-->c7072290_1ec3_e711_8c5a_005056ad0002
|
||||
db052290_1ec3_e711_8c5a_005056ad0002-->82072290_1ec3_e711_8c5a_005056ad0002
|
||||
4e112290_1ec3_e711_8c5a_005056ad0002-->b7042290_1ec3_e711_8c5a_005056ad0002
|
||||
4e112290_1ec3_e711_8c5a_005056ad0002-->8f102290_1ec3_e711_8c5a_005056ad0002
|
||||
4e112290_1ec3_e711_8c5a_005056ad0002-->0e102290_1ec3_e711_8c5a_005056ad0002
|
||||
4e112290_1ec3_e711_8c5a_005056ad0002-->07132290_1ec3_e711_8c5a_005056ad0002
|
||||
4e112290_1ec3_e711_8c5a_005056ad0002-->ca122290_1ec3_e711_8c5a_005056ad0002
|
||||
30122290_1ec3_e711_8c5a_005056ad0002-->ca122290_1ec3_e711_8c5a_005056ad0002
|
||||
30122290_1ec3_e711_8c5a_005056ad0002-->4e112290_1ec3_e711_8c5a_005056ad0002
|
||||
5e112290_1ec3_e711_8c5a_005056ad0002-->8f102290_1ec3_e711_8c5a_005056ad0002
|
||||
5e112290_1ec3_e711_8c5a_005056ad0002-->68102290_1ec3_e711_8c5a_005056ad0002
|
||||
c1112290_1ec3_e711_8c5a_005056ad0002-->68102290_1ec3_e711_8c5a_005056ad0002
|
||||
c1112290_1ec3_e711_8c5a_005056ad0002-->5e112290_1ec3_e711_8c5a_005056ad0002
|
||||
b7042290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
|
||||
8f102290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
|
||||
0e102290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
|
||||
07132290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
|
||||
c7072290_1ec3_e711_8c5a_005056ad0002-->1d0a2290_1ec3_e711_8c5a_005056ad0002
|
||||
ca122290_1ec3_e711_8c5a_005056ad0002-->200a2290_1ec3_e711_8c5a_005056ad0002
|
||||
68102290_1ec3_e711_8c5a_005056ad0002-->1c0a2290_1ec3_e711_8c5a_005056ad0002
|
||||
f4112290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
|
||||
f4112290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002
|
||||
f4112290_1ec3_e711_8c5a_005056ad0002-->c0102290_1ec3_e711_8c5a_005056ad0002
|
||||
f4112290_1ec3_e711_8c5a_005056ad0002-->9a072290_1ec3_e711_8c5a_005056ad0002
|
||||
d6072290_1ec3_e711_8c5a_005056ad0002-->1c0a2290_1ec3_e711_8c5a_005056ad0002
|
||||
71082290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
|
||||
c0102290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
|
||||
c0102290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002
|
||||
9a072290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
|
||||
9a072290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('8: should render labels with numbers at the start', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TB;subgraph "number as labels";1;end;
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('9: should render subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TB
|
||||
subgraph One
|
||||
a1-->a2
|
||||
end
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('10: should render subgraphs with a title starting with a digit', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TB
|
||||
subgraph 2Two
|
||||
a1-->a2
|
||||
end
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('11: should render styled subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TB
|
||||
A
|
||||
B
|
||||
subgraph foo[Foo SubGraph]
|
||||
C
|
||||
D
|
||||
end
|
||||
subgraph bar[Bar SubGraph]
|
||||
E
|
||||
F
|
||||
end
|
||||
G
|
||||
|
||||
A-->B
|
||||
B-->C
|
||||
C-->D
|
||||
B-->D
|
||||
D-->E
|
||||
E-->A
|
||||
E-->F
|
||||
F-->D
|
||||
F-->G
|
||||
B-->G
|
||||
G-->D
|
||||
|
||||
style foo fill:#F99,stroke-width:2px,stroke:#F0F,color:darkred
|
||||
style bar fill:#999,stroke-width:10px,stroke:#0F0,color:blue
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('12: should render a flowchart with long names and class definitions', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
sid-B3655226-6C29-4D00-B685-3D5C734DC7E1["
|
||||
|
||||
提交申请
|
||||
熊大
|
||||
"];
|
||||
class sid-B3655226-6C29-4D00-B685-3D5C734DC7E1 node-executed;
|
||||
sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A["
|
||||
负责人审批
|
||||
强子
|
||||
"];
|
||||
class sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A node-executed;
|
||||
sid-E27C0367-E6D6-497F-9736-3CDC21FDE221["
|
||||
DBA审批
|
||||
强子
|
||||
"];
|
||||
class sid-E27C0367-E6D6-497F-9736-3CDC21FDE221 node-executed;
|
||||
sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD["
|
||||
SA审批
|
||||
阿美
|
||||
"];
|
||||
class sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD node-executed;
|
||||
sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7["
|
||||
主管审批
|
||||
光头强
|
||||
"];
|
||||
class sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7 node-executed;
|
||||
sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89["
|
||||
DBA确认
|
||||
强子
|
||||
"];
|
||||
class sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89 node-executed;
|
||||
sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937["
|
||||
SA确认
|
||||
阿美
|
||||
"];
|
||||
class sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937 node-executed;
|
||||
sid-4FC27B48-A6F9-460A-A675-021F5854FE22["
|
||||
结束
|
||||
"];
|
||||
class sid-4FC27B48-A6F9-460A-A675-021F5854FE22 node-executed;
|
||||
sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E["
|
||||
SA执行1
|
||||
强子
|
||||
"];
|
||||
class sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E node-executed;
|
||||
sid-6C2120F3-D940-4958-A067-0903DCE879C4["
|
||||
SA执行2
|
||||
强子
|
||||
"];
|
||||
class sid-6C2120F3-D940-4958-A067-0903DCE879C4 node-executed;
|
||||
sid-9180E2A0-5C4B-435F-B42F-0D152470A338["
|
||||
DBA执行1
|
||||
强子
|
||||
"];
|
||||
class sid-9180E2A0-5C4B-435F-B42F-0D152470A338 node-executed;
|
||||
sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD["
|
||||
DBA执行3
|
||||
强子
|
||||
"];
|
||||
class sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD node-executed;
|
||||
sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756["
|
||||
DBA执行2
|
||||
强子
|
||||
"];
|
||||
class sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756 node-executed;
|
||||
sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93["
|
||||
DBA执行4
|
||||
强子
|
||||
"];
|
||||
class sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93 node-executed;
|
||||
sid-1897B30A-9C5C-4D5B-B80B-76A038785070["
|
||||
负责人确认
|
||||
梁静茹
|
||||
"];
|
||||
class sid-1897B30A-9C5C-4D5B-B80B-76A038785070 node-executed;
|
||||
sid-B3655226-6C29-4D00-B685-3D5C734DC7E1-->sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7;
|
||||
sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A-->sid-1897B30A-9C5C-4D5B-B80B-76A038785070;
|
||||
sid-E27C0367-E6D6-497F-9736-3CDC21FDE221-->sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89;
|
||||
sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD-->sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937;
|
||||
sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E-->sid-6C2120F3-D940-4958-A067-0903DCE879C4;
|
||||
sid-9180E2A0-5C4B-435F-B42F-0D152470A338-->sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756;
|
||||
sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD-->sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93;
|
||||
sid-6C2120F3-D940-4958-A067-0903DCE879C4-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
|
||||
sid-1897B30A-9C5C-4D5B-B80B-76A038785070-->sid-4FC27B48-A6F9-460A-A675-021F5854FE22;
|
||||
sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937-->sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E;
|
||||
sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89-->sid-9180E2A0-5C4B-435F-B42F-0D152470A338;
|
||||
sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89-->sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD;
|
||||
sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
|
||||
sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
|
||||
sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD;
|
||||
sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-E27C0367-E6D6-497F-9736-3CDC21FDE221;
|
||||
sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937-->sid-6C2120F3-D940-4958-A067-0903DCE879C4;
|
||||
sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
|
||||
sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-4FC27B48-A6F9-460A-A675-021F5854FE22;
|
||||
`,
|
||||
{ fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('13: should render color of styled nodes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph LR
|
||||
foo-->bar
|
||||
|
||||
classDef foo fill:lightblue,color:green,stroke:#FF9E2C,font-weight:bold
|
||||
style foo fill:#F99,stroke-width:2px,stroke:#F0F
|
||||
style bar fill:#999,color: #00ff00, stroke-width:10px,stroke:#0F0
|
||||
`,
|
||||
{
|
||||
listUrl: false,
|
||||
listId: 'color styling',
|
||||
fontFamily: 'courier',
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('14: should render hexagons', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{{Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?}}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[Car]
|
||||
click A "index.html#link-clicked" "link test"
|
||||
click B testClick "click test"
|
||||
classDef someclass fill:#f96;
|
||||
class A someclass;
|
||||
class C someclass;
|
||||
`,
|
||||
{
|
||||
listUrl: false,
|
||||
listId: 'color styling',
|
||||
fontFamily: 'courier',
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('15: should render a simple flowchart with comments', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
%% this is a comment
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('16: Render Stadium shape', () => {
|
||||
imgSnapshotTest(
|
||||
` graph TD
|
||||
A([stadium shape test])
|
||||
A -->|Get money| B([Go shopping])
|
||||
B --> C([Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?])
|
||||
C -->|One| D([Laptop])
|
||||
C -->|Two| E([iPhone])
|
||||
C -->|Three| F([Car<br/>wroom wroom])
|
||||
click A "index.html#link-clicked" "link test"
|
||||
click B testClick "click test"
|
||||
classDef someclass fill:#f96;
|
||||
class A someclass;
|
||||
class C someclass;
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('17: Render multiline texts', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
A1[Multi<br>Line] -->|Multi<br>Line| B1(Multi<br>Line)
|
||||
C1[Multi<br/>Line] -->|Multi<br/>Line| D1(Multi<br/>Line)
|
||||
E1[Multi<br />Line] -->|Multi<br />Line| F1(Multi<br />Line)
|
||||
A2[Multi<br>Line] -->|Multi<br>Line| B2(Multi<br>Line)
|
||||
C2[Multi<br/>Line] -->|Multi<br/>Line| D2(Multi<br/>Line)
|
||||
E2[Multi<br />Line] -->|Multi<br />Line| F2(Multi<br />Line)
|
||||
linkStyle 0 stroke:DarkGray,stroke-width:2px
|
||||
linkStyle 1 stroke:DarkGray,stroke-width:2px
|
||||
linkStyle 2 stroke:DarkGray,stroke-width:2px
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('18: Chaining of nodes', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
a --> b --> c
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('19: Multiple nodes and chaining in one statement', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
a --> b & c--> d
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('20: Multiple nodes and chaining in one statement', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[ h ] -- hello --> B[" test "]:::exClass & C --> D;
|
||||
classDef exClass background:#bbb,border:1px solid red;
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('21: Render cylindrical shape', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
A[(cylindrical<br />shape<br />test)]
|
||||
A -->|Get money| B1[(Go shopping 1)]
|
||||
A -->|Get money| B2[(Go shopping 2)]
|
||||
A -->|Get money| B3[(Go shopping 3)]
|
||||
C[(Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?)]
|
||||
B1 --> C
|
||||
B2 --> C
|
||||
B3 --> C
|
||||
C -->|One| D[(Laptop)]
|
||||
C -->|Two| E[(iPhone)]
|
||||
C -->|Three| F[(Car)]
|
||||
click A "index.html#link-clicked" "link test"
|
||||
click B testClick "click test"
|
||||
classDef someclass fill:#f96;
|
||||
class A someclass;`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('22: Render a simple flowchart with nodeSpacing set to 100', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
%% this is a comment
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { nodeSpacing: 50 }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('23: Render a simple flowchart with rankSpacing set to 100', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
%% this is a comment
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { rankSpacing: '100' }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('24: Keep node label text (if already defined) when a style is applied', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
A(( )) -->|step 1| B(( ))
|
||||
B(( )) -->|step 2| C(( ))
|
||||
C(( )) -->|step 3| D(( ))
|
||||
linkStyle 1 stroke:greenyellow,stroke-width:2px
|
||||
style C fill:greenyellow,stroke:green,stroke-width:4px
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('25: Handle link click events (link, anchor, mailto, other protocol, script)', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TB
|
||||
TITLE["Link Click Events<br>(click the nodes below)"]
|
||||
A["link test (open in same tab)"]
|
||||
B["link test (open in new tab)"]
|
||||
C[anchor test]
|
||||
D[mailto test]
|
||||
E[other protocol test]
|
||||
F[script test]
|
||||
TITLE --> A & B & C & D & E & F
|
||||
click A "https://mermaid-js.github.io/mermaid/#/" "link test (open in same tab)"
|
||||
click B "https://mermaid-js.github.io/mermaid/#/" "link test (open in new tab)" _blank
|
||||
click C "#link-clicked"
|
||||
click D "mailto:user@user.user" "mailto test"
|
||||
click E "notes://do-your-thing/id" "other protocol test"
|
||||
click F "javascript:alert('test')" "script test"
|
||||
`,
|
||||
{ securityLevel: 'loose', fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('26: Set text color of nodes and links according to styles when html labels are enabled', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
A[red<br>text] -->|red<br>text| B(blue<br>text)
|
||||
C[/red<br/>text/] -->|blue<br/>text| D{blue<br/>text}
|
||||
E{{default<br />style}} -->|default<br />style| F([default<br />style])
|
||||
linkStyle default color:Sienna;
|
||||
linkStyle 0 color:red;
|
||||
linkStyle 1 stroke:DarkGray,stroke-width:2px,color:#0000ff
|
||||
style A color:red;
|
||||
style B color:blue;
|
||||
style C stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style D stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
click B "index.html#link-clicked" "link test"
|
||||
click D testClick "click test"
|
||||
`,
|
||||
{ flowchart: { htmlLabels: true } }
|
||||
);
|
||||
});
|
||||
|
||||
it('27: Set text color of nodes and links according to styles when html labels are disabled', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
A[red<br>text] -->|red<br>text| B(blue<br>text)
|
||||
C[/red<br/>text/] -->|blue<br/>text| D{blue<br/>text}
|
||||
E{{default<br />style}} -->|default<br />style| F([default<br />style])
|
||||
linkStyle default color:Sienna;
|
||||
linkStyle 0 color:red;
|
||||
linkStyle 1 stroke:DarkGray,stroke-width:2px,color:#0000ff
|
||||
style A color:red;
|
||||
style B color:blue;
|
||||
style C stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style D stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
click B "index.html#link-clicked" "link test"
|
||||
click D testClick "click test"
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('28: Apply default class to all nodes which do not have another class assigned (htmlLabels enabled)', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[myClass1] --> B[default] & C[default]
|
||||
B[default] & C[default] --> D[myClass2]
|
||||
classDef default stroke-width:2px,fill:none,stroke:silver
|
||||
classDef node color:red
|
||||
classDef myClass1 color:#0000ff
|
||||
classDef myClass2 stroke:#0000ff,fill:#ccccff
|
||||
class A myClass1
|
||||
class D myClass2
|
||||
`,
|
||||
{ flowchart: { htmlLabels: true } }
|
||||
);
|
||||
});
|
||||
|
||||
it('29: Apply default class to all nodes which do not have another class assigned (htmlLabels disabled)', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[myClass1] --> B[default] & C[default]
|
||||
B[default] & C[default] --> D[myClass2]
|
||||
classDef default stroke-width:2px,fill:none,stroke:silver
|
||||
classDef node color:red
|
||||
classDef myClass1 color:#0000ff
|
||||
classDef myClass2 stroke:#0000ff,fill:#ccccff
|
||||
class A myClass1
|
||||
class D myClass2
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('30: Possibility to style text color of nodes and subgraphs as well as apply classes to subgraphs', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
subgraph id1 [title is set]
|
||||
A-->B
|
||||
end
|
||||
subgraph id2 [title]
|
||||
E
|
||||
end
|
||||
|
||||
B-->C
|
||||
|
||||
subgraph id3
|
||||
C-->D
|
||||
end
|
||||
class id3,id2,A redBg;
|
||||
class id3,A whiteTxt;
|
||||
classDef redBg fill:#622;
|
||||
classDef whiteTxt color: white;
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('31: should not slice off edges that are to the left of the left-most vertex', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
work --> sleep
|
||||
sleep --> work
|
||||
eat --> sleep
|
||||
work --> eat
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('32: Render Subroutine shape', () => {
|
||||
imgSnapshotTest(
|
||||
`graph LR
|
||||
A[[subroutine shape test]]
|
||||
A -->|Get money| B[[Go shopping]]
|
||||
B --> C[[Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?]]
|
||||
C -->|One| D[[Laptop]]
|
||||
C -->|Two| E[[iPhone]]
|
||||
C -->|Three| F[[Car<br/>wroom wroom]]
|
||||
click A "index.html#link-clicked" "link test"
|
||||
click B testClick "click test"
|
||||
classDef someclass fill:#f96;
|
||||
class A someclass;
|
||||
class C someclass;
|
||||
`,
|
||||
{ flowchart: { htmlLabels: false }, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('33: should render a simple flowchart with diagramPadding set to 0', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
%% this is a comment
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { diagramPadding: 0 } }
|
||||
);
|
||||
});
|
||||
|
||||
it('34: testing the label width in percy', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
A[Christmas]
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('35: should honor minimum edge length as specified by the user', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
L1 --- L2
|
||||
L2 --- C
|
||||
M1 ---> C
|
||||
R1 .-> R2
|
||||
R2 <.-> C
|
||||
C -->|Label 1| E1
|
||||
C -- Label 2 ---> E2
|
||||
C ----> E3
|
||||
C -----> E4
|
||||
C ======> E5
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('36: should render escaped without html labels', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
a["<strong>Haiya</strong>"]-->b
|
||||
`,
|
||||
{ htmlLabels: false, flowchart: { htmlLabels: false } }
|
||||
);
|
||||
});
|
||||
it('37: should render non-escaped with html labels', () => {
|
||||
imgSnapshotTest(
|
||||
`graph TD
|
||||
a["<strong>Haiya</strong>"]-->b
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('38: should render a flowchart when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// use within because the absolute value can be slightly different depending on the environment ±10%
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(446 * 0.95, 446 * 1.05);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
expect(maxWidthValue).to.be.within(300 * 0.9, 300 * 1.1);
|
||||
});
|
||||
});
|
||||
it('39: should render a flowchart when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`graph TD
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
C -->|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
`,
|
||||
{ flowchart: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±10%
|
||||
// expect(height).to.be.within(446 * 0.95, 446 * 1.05);
|
||||
expect(width).to.be.within(300 * 0.9, 300 * 1.1);
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
it('58: handle styling with style expressions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph LR
|
||||
id1(Start)-->id2(Stop)
|
||||
style id1 fill:#f9f,stroke:#333,stroke-width:4px
|
||||
style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('60: handle styling for all node shapes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph LR
|
||||
A[red text] -->|default style| B(blue text)
|
||||
C([red text]) -->|default style| D[[blue text]]
|
||||
E[(red text)] -->|default style| F((blue text))
|
||||
G>red text] -->|default style| H{blue text}
|
||||
I{{red text}} -->|default style| J[/blue text/]
|
||||
linkStyle default color:Sienna;
|
||||
style A stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style B stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
style C stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style D stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
style E stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style F stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
style G stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style H stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
style I stroke:#ff0000,fill:#ffcccc,color:#ff0000
|
||||
style J stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('61: fontawesome icons in edge labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TD
|
||||
C -->|fa:fa-car Car| F[fa:fa-car Car]
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('62: fontawesome icons in edge labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TB
|
||||
subgraph bar[Bar]
|
||||
F
|
||||
end
|
||||
style bar fill:#999,stroke-width:10px,stroke:#0F0,color:blue
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('63: fontawesome icons in edge labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
graph TB
|
||||
A
|
||||
B
|
||||
subgraph foo[Foo SubGraph]
|
||||
C
|
||||
D
|
||||
end
|
||||
subgraph bar[Bar SubGraph]
|
||||
E
|
||||
F
|
||||
end
|
||||
G
|
||||
|
||||
A-->B
|
||||
B-->C
|
||||
C-->D
|
||||
B-->D
|
||||
D-->E
|
||||
E-->A
|
||||
E-->F
|
||||
F-->D
|
||||
F-->G
|
||||
B-->G
|
||||
G-->D
|
||||
|
||||
style foo fill:#F99,stroke-width:2px,stroke:#F0F,color:darkred
|
||||
style bar fill:#999,stroke-width:10px,stroke:#0F0,color:blue
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('64: fontawesome icons in edge labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
||||
flowchart LR
|
||||
subgraph A
|
||||
a --> b
|
||||
end
|
||||
subgraph B
|
||||
i -->f
|
||||
end
|
||||
A --> B
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
it('65: text-color from classes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
flowchart LR
|
||||
classDef dark fill:#000,stroke:#000,stroke-width:4px,color:#fff
|
||||
Lorem --> Ipsum --> Dolor
|
||||
class Lorem,Dolor dark
|
||||
`,
|
||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||
);
|
||||
});
|
||||
});
|
||||
470
cypress/integration/rendering/gantt.spec.js
Normal file
470
cypress/integration/rendering/gantt.spec.js
Normal file
@@ -0,0 +1,470 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.js';
|
||||
|
||||
describe('Gantt diagram', () => {
|
||||
beforeEach(() => {
|
||||
cy.clock(new Date('1010-10-10').getTime());
|
||||
});
|
||||
it('should render a gantt chart', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d/%m
|
||||
title Adding GANTT diagram to mermaid
|
||||
excludes weekdays 2014-01-10
|
||||
|
||||
section A section
|
||||
Completed task :done, des1, 2014-01-06,2014-01-08
|
||||
Active task :active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
|
||||
section Critical tasks
|
||||
Completed task in the critical line :crit, done, 2014-01-06,24h
|
||||
Implement parser and jison :crit, done, after des1, 2d
|
||||
Create tests for parser :crit, active, 3d
|
||||
Future task in critical line :crit, 5d
|
||||
Create tests for renderer :2d
|
||||
Add to mermaid :1d
|
||||
|
||||
section Documentation
|
||||
Describe gantt syntax :active, a1, after des1, 3d
|
||||
Add gantt diagram to demo page :after a1 , 20h
|
||||
Add another diagram to demo page :doc1, after a1 , 48h
|
||||
|
||||
section Last section
|
||||
Describe gantt syntax :after doc1, 3d
|
||||
Add gantt diagram to demo page : 20h
|
||||
Add another diagram to demo page : 48h
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('Handle multiline section titles with different line breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d/%m
|
||||
title GANTT diagram with multiline section titles
|
||||
excludes weekdays 2014-01-10
|
||||
|
||||
section A section<br>multiline
|
||||
Completed task : done, des1, 2014-01-06,2014-01-08
|
||||
Active task : active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
|
||||
section Critical tasks<br/>multiline
|
||||
Completed task in the critical line : crit, done, 2014-01-06, 24h
|
||||
Implement parser and jison : crit, done, after des1, 2d
|
||||
Create tests for parser : crit, active, 3d
|
||||
Future task in critical line : crit, 5d
|
||||
Create tests for renderer : 2d
|
||||
Add to mermaid : 1d
|
||||
|
||||
section Documentation<br />multiline
|
||||
Describe gantt syntax : active, a1, after des1, 3d
|
||||
Add gantt diagram to demo page : after a1, 20h
|
||||
Add another diagram to demo page : doc1, after a1, 48h
|
||||
|
||||
section Last section<br />multiline
|
||||
Describe gantt syntax : after doc1, 3d
|
||||
Add gantt diagram to demo page : 20h
|
||||
Add another diagram to demo page : 48h
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('Multiple dependencies syntax', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d/%m
|
||||
title Adding GANTT diagram to mermaid
|
||||
excludes weekdays 2014-01-10
|
||||
|
||||
apple :a, 2017-07-20, 1w
|
||||
banana :crit, b, 2017-07-23, 1d
|
||||
cherry :active, c, after b a, 1d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should FAIL redering a gantt chart for issue #1060 with invalid date', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
excludes weekdays 2017-01-10
|
||||
title Projects Timeline
|
||||
|
||||
section asdf
|
||||
specs :done, :ps, 2019-05-10, 50d
|
||||
Plasma :pc, 2019-06-20, 60d
|
||||
Rollup :or, 2019-08-20, 50d
|
||||
|
||||
section CEL
|
||||
|
||||
plasma-chamber :done, :pc, 2019-05-20, 60d
|
||||
Plasma Implementation (Rust) :por, 2019-06-20, 120d
|
||||
Predicates (Atomic Swap) :pred, 2019-07-20, 60d
|
||||
|
||||
section DEX
|
||||
|
||||
History zkSNARK :hs, 2019-08-10, 40d
|
||||
Exit :vs, after hs, 60d
|
||||
PredicateSpec :ps, 2019-09-1, 20d
|
||||
PlasmaIntegration :pi, after ps,40d
|
||||
|
||||
|
||||
section Events
|
||||
|
||||
ETHBoston :done, :eb, 2019-09-08, 3d
|
||||
DevCon :active, :dc, 2019-10-08, 3d
|
||||
|
||||
section Plasma Calls & updates
|
||||
OVM :ovm, 2019-07-12, 120d
|
||||
Plasma call 26 :pc26, 2019-08-21, 1d
|
||||
Plasma call 27 :pc27, 2019-09-03, 1d
|
||||
Plasma call 28 :pc28, 2019-09-17, 1d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should hide today marker', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title Hide today marker (vertical line should not be visible)
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d
|
||||
todayMarker off
|
||||
section Section1
|
||||
Today: 1, -1h
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should style today marker', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title Style today marker (vertical line should be 5px wide and half-transparent blue)
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d
|
||||
todayMarker stroke-width:5px,stroke:#00f,opacity:0.5
|
||||
section Section1
|
||||
Today: 1, -1h
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle milliseconds', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat x
|
||||
axisFormat %L
|
||||
section Section
|
||||
A task :a1, 0, 30ms
|
||||
Another task :after a1, 20ms
|
||||
section Another
|
||||
Another another task :b1, 20, 12ms
|
||||
Another another another task :after b1, 0.024s
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a gantt diagram when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`
|
||||
gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d/%m
|
||||
title Adding GANTT diagram to mermaid
|
||||
excludes weekdays 2014-01-10
|
||||
|
||||
section A section
|
||||
Completed task :done, des1, 2014-01-06,2014-01-08
|
||||
Active task :active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
|
||||
section Critical tasks
|
||||
Completed task in the critical line :crit, done, 2014-01-06,24h
|
||||
Implement parser and jison :crit, done, after des1, 2d
|
||||
Create tests for parser :crit, active, 3d
|
||||
Future task in critical line :crit, 5d
|
||||
Create tests for renderer :2d
|
||||
Add to mermaid :1d
|
||||
|
||||
section Documentation
|
||||
Describe gantt syntax :active, a1, after des1, 3d
|
||||
Add gantt diagram to demo page :after a1 , 20h
|
||||
Add another diagram to demo page :doc1, after a1 , 48h
|
||||
|
||||
section Last section
|
||||
Describe gantt syntax :after doc1, 3d
|
||||
Add gantt diagram to demo page : 20h
|
||||
Add another diagram to demo page : 48h
|
||||
`,
|
||||
{ gantt: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(484 * 0.95, 484 * 1.05);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
expect(maxWidthValue).to.be.within(984 * 0.95, 984 * 1.05);
|
||||
});
|
||||
});
|
||||
|
||||
it('should render a gantt diagram when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`
|
||||
gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d/%m
|
||||
title Adding GANTT diagram to mermaid
|
||||
excludes weekdays 2014-01-10
|
||||
|
||||
section A section
|
||||
Completed task :done, des1, 2014-01-06,2014-01-08
|
||||
Active task :active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
|
||||
section Critical tasks
|
||||
Completed task in the critical line :crit, done, 2014-01-06,24h
|
||||
Implement parser and jison :crit, done, after des1, 2d
|
||||
Create tests for parser :crit, active, 3d
|
||||
Future task in critical line :crit, 5d
|
||||
Create tests for renderer :2d
|
||||
Add to mermaid :1d
|
||||
|
||||
section Documentation
|
||||
Describe gantt syntax :active, a1, after des1, 3d
|
||||
Add gantt diagram to demo page :after a1 , 20h
|
||||
Add another diagram to demo page :doc1, after a1 , 48h
|
||||
|
||||
section Last section
|
||||
Describe gantt syntax :after doc1, 3d
|
||||
Add gantt diagram to demo page : 20h
|
||||
Add another diagram to demo page : 48h
|
||||
`,
|
||||
{ gantt: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// expect(height).to.be.within(484 * 0.95, 484 * 1.05);
|
||||
expect(width).to.be.within(984 * 0.95, 984 * 1.05);
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
it('should render a gantt diagram with data labels at the top when topAxis is true', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d/%m
|
||||
title Adding GANTT diagram to mermaid
|
||||
excludes weekdays 2014-01-10
|
||||
|
||||
section A section
|
||||
Completed task :done, des1, 2014-01-06,2014-01-08
|
||||
Active task :active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
|
||||
section Critical tasks
|
||||
Completed task in the critical line :crit, done, 2014-01-06,24h
|
||||
Implement parser and jison :crit, done, after des1, 2d
|
||||
Create tests for parser :crit, active, 3d
|
||||
Future task in critical line :crit, 5d
|
||||
Create tests for renderer :2d
|
||||
Add to mermaid :1d
|
||||
|
||||
section Documentation
|
||||
Describe gantt syntax :active, a1, after des1, 3d
|
||||
Add gantt diagram to demo page :after a1 , 20h
|
||||
Add another diagram to demo page :doc1, after a1 , 48h
|
||||
|
||||
section Last section
|
||||
Describe gantt syntax :after doc1, 3d
|
||||
Add gantt diagram to demo page : 20h
|
||||
Add another diagram to demo page : 48h
|
||||
`,
|
||||
{ gantt: { topAxis: true } }
|
||||
);
|
||||
});
|
||||
|
||||
it('should render accessibility tags', function () {
|
||||
const expectedTitle = 'Gantt Diagram';
|
||||
const expectedAccDescription = 'Tasks for Q4';
|
||||
renderGraph(
|
||||
`
|
||||
gantt
|
||||
accTitle: ${expectedTitle}
|
||||
accDescr: ${expectedAccDescription}
|
||||
dateFormat YYYY-MM-DD
|
||||
section Section
|
||||
A task :a1, 2014-01-01, 30d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
const el = svg.get(0);
|
||||
const children = [...el.children];
|
||||
|
||||
const titleEl = children.find(function (node) {
|
||||
return node.tagName === 'title';
|
||||
});
|
||||
const descriptionEl = children.find(function (node) {
|
||||
return node.tagName === 'desc';
|
||||
});
|
||||
|
||||
expect(titleEl).to.exist;
|
||||
expect(titleEl.textContent).to.equal(expectedTitle);
|
||||
expect(descriptionEl).to.exist;
|
||||
expect(descriptionEl.textContent).to.equal(expectedAccDescription);
|
||||
});
|
||||
});
|
||||
|
||||
it('should render a gantt diagram with tick is 15 minutes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %H:%M
|
||||
tickInterval 15minute
|
||||
excludes weekends
|
||||
|
||||
section Section
|
||||
A task : a1, 2022-10-03, 6h
|
||||
Another task : after a1, 6h
|
||||
section Another
|
||||
Task in sec : 2022-10-03, 3h
|
||||
another task : 3h
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a gantt diagram with tick is 6 hours', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %d %H:%M
|
||||
tickInterval 6hour
|
||||
excludes weekends
|
||||
|
||||
section Section
|
||||
A task : a1, 2022-10-03, 1d
|
||||
Another task : after a1, 2d
|
||||
section Another
|
||||
Task in sec : 2022-10-04, 2d
|
||||
another task : 2d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a gantt diagram with tick is 1 day', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %m-%d
|
||||
tickInterval 1day
|
||||
excludes weekends
|
||||
|
||||
section Section
|
||||
A task : a1, 2022-10-01, 30d
|
||||
Another task : after a1, 20d
|
||||
section Another
|
||||
Task in sec : 2022-10-20, 12d
|
||||
another task : 24d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a gantt diagram with tick is 1 week', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %m-%d
|
||||
tickInterval 1week
|
||||
excludes weekends
|
||||
|
||||
section Section
|
||||
A task : a1, 2022-10-01, 30d
|
||||
Another task : after a1, 20d
|
||||
section Another
|
||||
Task in sec : 2022-10-20, 12d
|
||||
another task : 24d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a gantt diagram with tick is 1 month', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %m-%d
|
||||
tickInterval 1month
|
||||
excludes weekends
|
||||
|
||||
section Section
|
||||
A task : a1, 2022-10-01, 30d
|
||||
Another task : after a1, 20d
|
||||
section Another
|
||||
Task in sec : 2022-10-20, 12d
|
||||
another task : 24d
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a gantt diagram with tick is 1 day and topAxis is true', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
title A Gantt Diagram
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %m-%d
|
||||
tickInterval 1day
|
||||
excludes weekends
|
||||
|
||||
section Section
|
||||
A task : a1, 2022-10-01, 30d
|
||||
Another task : after a1, 20d
|
||||
section Another
|
||||
Task in sec : 2022-10-20, 12d
|
||||
another task : 24d
|
||||
`,
|
||||
{ gantt: { topAxis: true } }
|
||||
);
|
||||
});
|
||||
});
|
||||
336
cypress/integration/rendering/gitGraph.spec.js
Normal file
336
cypress/integration/rendering/gitGraph.spec.js
Normal file
@@ -0,0 +1,336 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util.js';
|
||||
|
||||
describe('Git Graph diagram', () => {
|
||||
it('1: should render a simple gitgraph with commit on main branch', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "1"
|
||||
commit id: "2"
|
||||
commit id: "3"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('2: should render a simple gitgraph with commit on main branch with Id', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "One"
|
||||
commit id: "Two"
|
||||
commit id: "Three"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('3: should render a simple gitgraph with different commitTypes on main branch ', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "Normal Commit"
|
||||
commit id: "Reverse Commit" type: REVERSE
|
||||
commit id: "Hightlight Commit" type: HIGHLIGHT
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('4: should render a simple gitgraph with tags commitTypes on main branch ', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "Normal Commit with tag" tag: "v1.0.0"
|
||||
commit id: "Reverse Commit with tag" type: REVERSE tag: "RC_1"
|
||||
commit id: "Hightlight Commit" type: HIGHLIGHT tag: "8.8.4"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('5: should render a simple gitgraph with two branches', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "1"
|
||||
commit id: "2"
|
||||
branch develop
|
||||
checkout develop
|
||||
commit id: "3"
|
||||
commit id: "4"
|
||||
checkout main
|
||||
commit id: "5"
|
||||
commit id: "6"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('6: should render a simple gitgraph with two branches and merge commit', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "1"
|
||||
commit id: "2"
|
||||
branch develop
|
||||
checkout develop
|
||||
commit id: "3"
|
||||
commit id: "4"
|
||||
checkout main
|
||||
merge develop
|
||||
commit id: "5"
|
||||
commit id: "6"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('7: should render a simple gitgraph with three branches and tagged merge commit', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "1"
|
||||
commit id: "2"
|
||||
branch nice_feature
|
||||
checkout nice_feature
|
||||
commit id: "3"
|
||||
checkout main
|
||||
commit id: "4"
|
||||
checkout nice_feature
|
||||
branch very_nice_feature
|
||||
checkout very_nice_feature
|
||||
commit id: "5"
|
||||
checkout main
|
||||
commit id: "6"
|
||||
checkout nice_feature
|
||||
commit id: "7"
|
||||
checkout main
|
||||
merge nice_feature id: "12345" tag: "my merge commit"
|
||||
checkout very_nice_feature
|
||||
commit id: "8"
|
||||
checkout main
|
||||
commit id: "9"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('8: should render a simple gitgraph with more than 8 branchs & overriding variables', () => {
|
||||
imgSnapshotTest(
|
||||
`%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
|
||||
'gitBranchLabel0': '#ffffff',
|
||||
'gitBranchLabel1': '#ffffff',
|
||||
'gitBranchLabel2': '#ffffff',
|
||||
'gitBranchLabel3': '#ffffff',
|
||||
'gitBranchLabel4': '#ffffff',
|
||||
'gitBranchLabel5': '#ffffff',
|
||||
'gitBranchLabel6': '#ffffff',
|
||||
'gitBranchLabel7': '#ffffff',
|
||||
} } }%%
|
||||
gitGraph
|
||||
checkout main
|
||||
branch branch1
|
||||
branch branch2
|
||||
branch branch3
|
||||
branch branch4
|
||||
branch branch5
|
||||
branch branch6
|
||||
branch branch7
|
||||
branch branch8
|
||||
branch branch9
|
||||
checkout branch1
|
||||
commit id: "1"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('9: should render a simple gitgraph with rotated labels', () => {
|
||||
imgSnapshotTest(
|
||||
`%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'gitGraph': {
|
||||
'rotateCommitLabel': true
|
||||
} } }%%
|
||||
gitGraph
|
||||
commit id: "75f7219e83b321cd3fdde7dcf83bc7c1000a6828"
|
||||
commit id: "0db4784daf82736dec4569e0dc92980d328c1f2e"
|
||||
commit id: "7067e9973f9eaa6cd4a4b723c506d1eab598e83e"
|
||||
commit id: "66972321ad6c199013b5b31f03b3a86fa3f9817d"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('10: should render a simple gitgraph with horizontal labels', () => {
|
||||
imgSnapshotTest(
|
||||
`%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'gitGraph': {
|
||||
'rotateCommitLabel': false
|
||||
} } }%%
|
||||
gitGraph
|
||||
commit id: "Alpha"
|
||||
commit id: "Beta"
|
||||
commit id: "Gamma"
|
||||
commit id: "Delta"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('11: should render a simple gitgraph with cherry pick commit', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gitGraph
|
||||
commit id: "ZERO"
|
||||
branch develop
|
||||
commit id:"A"
|
||||
checkout main
|
||||
commit id:"ONE"
|
||||
checkout develop
|
||||
commit id:"B"
|
||||
checkout main
|
||||
commit id:"TWO"
|
||||
cherry-pick id:"A"
|
||||
commit id:"THREE"
|
||||
checkout develop
|
||||
commit id:"C"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('11: should render a gitgraph with cherry pick commit with custom tag', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gitGraph
|
||||
commit id: "ZERO"
|
||||
branch develop
|
||||
commit id:"A"
|
||||
checkout main
|
||||
commit id:"ONE"
|
||||
checkout develop
|
||||
commit id:"B"
|
||||
checkout main
|
||||
commit id:"TWO"
|
||||
cherry-pick id:"A" tag: "snapshot"
|
||||
commit id:"THREE"
|
||||
checkout develop
|
||||
commit id:"C"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('11: should render a gitgraph with cherry pick commit with no tag', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gitGraph
|
||||
commit id: "ZERO"
|
||||
branch develop
|
||||
commit id:"A"
|
||||
checkout main
|
||||
commit id:"ONE"
|
||||
checkout develop
|
||||
commit id:"B"
|
||||
checkout main
|
||||
commit id:"TWO"
|
||||
cherry-pick id:"A" tag: ""
|
||||
commit id:"THREE"
|
||||
checkout develop
|
||||
commit id:"C"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('11: should render a simple gitgraph with two cherry pick commit', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gitGraph
|
||||
commit id: "ZERO"
|
||||
branch develop
|
||||
commit id:"A"
|
||||
checkout main
|
||||
commit id:"ONE"
|
||||
checkout develop
|
||||
commit id:"B"
|
||||
branch featureA
|
||||
commit id:"FIX"
|
||||
commit id: "FIX-2"
|
||||
checkout main
|
||||
commit id:"TWO"
|
||||
cherry-pick id:"A"
|
||||
commit id:"THREE"
|
||||
cherry-pick id:"FIX"
|
||||
checkout develop
|
||||
commit id:"C"
|
||||
merge featureA
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('12: should render commits for more than 8 branches', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gitGraph
|
||||
checkout main
|
||||
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
||||
commit id: "1-abcdefg"
|
||||
checkout main
|
||||
branch branch1
|
||||
commit id: "2-abcdefg"
|
||||
checkout main
|
||||
merge branch1
|
||||
branch branch2
|
||||
commit id: "3-abcdefg"
|
||||
checkout main
|
||||
merge branch2
|
||||
branch branch3
|
||||
commit id: "4-abcdefg"
|
||||
checkout main
|
||||
merge branch3
|
||||
branch branch4
|
||||
commit id: "5-abcdefg"
|
||||
checkout main
|
||||
merge branch4
|
||||
branch branch5
|
||||
commit id: "6-abcdefg"
|
||||
checkout main
|
||||
merge branch5
|
||||
branch branch6
|
||||
commit id: "7-abcdefg"
|
||||
checkout main
|
||||
merge branch6
|
||||
branch branch7
|
||||
commit id: "8-abcdefg"
|
||||
checkout main
|
||||
merge branch7
|
||||
branch branch8
|
||||
commit id: "9-abcdefg"
|
||||
checkout main
|
||||
merge branch8
|
||||
branch branch9
|
||||
commit id: "10-abcdefg"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('13: should render a simple gitgraph with three branches,custom merge commit id,tag,type', () => {
|
||||
imgSnapshotTest(
|
||||
`gitGraph
|
||||
commit id: "1"
|
||||
commit id: "2"
|
||||
branch nice_feature
|
||||
checkout nice_feature
|
||||
commit id: "3"
|
||||
checkout main
|
||||
commit id: "4"
|
||||
checkout nice_feature
|
||||
branch very_nice_feature
|
||||
checkout very_nice_feature
|
||||
commit id: "5"
|
||||
checkout main
|
||||
commit id: "6"
|
||||
checkout nice_feature
|
||||
commit id: "7"
|
||||
checkout main
|
||||
merge nice_feature id: "customID" tag: "customTag" type: REVERSE
|
||||
checkout very_nice_feature
|
||||
commit id: "8"
|
||||
checkout main
|
||||
commit id: "9"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('1433: should render a simple gitgraph with a title', () => {
|
||||
imgSnapshotTest(
|
||||
`---
|
||||
title: simple gitGraph
|
||||
---
|
||||
gitGraph
|
||||
commit id: "1-abcdefg"
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
13
cypress/integration/rendering/info.spec.js
Normal file
13
cypress/integration/rendering/info.spec.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util.js';
|
||||
|
||||
describe('Sequencediagram', () => {
|
||||
it('should render a simple info diagrams', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
info
|
||||
showInfo
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
66
cypress/integration/rendering/journey.spec.js
Normal file
66
cypress/integration/rendering/journey.spec.js
Normal file
@@ -0,0 +1,66 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.js';
|
||||
|
||||
describe('User journey diagram', () => {
|
||||
it('Simple test', () => {
|
||||
imgSnapshotTest(
|
||||
`journey
|
||||
title Adding journey diagram functionality to mermaid
|
||||
section Order from website
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a user journey chart', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
journey
|
||||
title My working day
|
||||
section Go to work
|
||||
Make tea: 5: Me
|
||||
Go upstairs: 3: Me
|
||||
Do work: 1: Me, Cat
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 3: Me
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a user journey diagram when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`journey
|
||||
title E-Commerce
|
||||
section Order from website
|
||||
Add to cart: 5: Me
|
||||
section Checkout from website
|
||||
Add payment details: 5: Me
|
||||
`,
|
||||
{ journey: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
expect(svg).to.have.attr('height');
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.eq(565);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
expect(maxWidthValue).to.eq(700);
|
||||
});
|
||||
});
|
||||
|
||||
it('should render a user journey diagram when useMaxWidth is false', () => {
|
||||
imgSnapshotTest(
|
||||
`journey
|
||||
title E-Commerce
|
||||
section Order from website
|
||||
Add to cart: 5: Me
|
||||
section Checkout from website
|
||||
Add payment details: 5: Me
|
||||
`,
|
||||
{ journey: { useMaxWidth: false } }
|
||||
);
|
||||
});
|
||||
});
|
||||
233
cypress/integration/rendering/mindmap.spec.ts
Normal file
233
cypress/integration/rendering/mindmap.spec.ts
Normal file
@@ -0,0 +1,233 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.js';
|
||||
|
||||
/**
|
||||
* Check whether the SVG Element has a Mindmap root
|
||||
*
|
||||
* Sometimes, Cypress takes a snapshot before the mermaid mindmap has finished
|
||||
* generating the SVG.
|
||||
*
|
||||
* @param $p - The element to check.
|
||||
*/
|
||||
function shouldHaveRoot($p: JQuery<SVGSVGElement>) {
|
||||
// get HTML Element from jquery element
|
||||
const svgElement = $p[0];
|
||||
expect(svgElement.nodeName).equal('svg');
|
||||
|
||||
const sectionRoots = svgElement.getElementsByClassName('mindmap-node section-root');
|
||||
// mindmap should have at least one root section
|
||||
expect(sectionRoots).to.have.lengthOf.at.least(1);
|
||||
}
|
||||
|
||||
describe('Mindmaps', () => {
|
||||
it('Only a root', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('a root with a shape', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root[root]
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('a root with wrapping text and a shape', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root[A root with a long text that wraps to keep the node size in check]
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('a root with an icon', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root[root]
|
||||
::icon(mdi mdi-fire)
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('Blang and cloud shape', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root))bang((
|
||||
::icon(mdi mdi-fire)
|
||||
a))Another bang((
|
||||
::icon(mdi mdi-fire)
|
||||
a)A cloud(
|
||||
::icon(mdi mdi-fire)
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('Blang and cloud shape with icons', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root))bang((
|
||||
|
||||
a))Another bang((
|
||||
a)A cloud(
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('braches', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root
|
||||
child1
|
||||
grandchild 1
|
||||
grandchild 2
|
||||
child2
|
||||
grandchild 3
|
||||
grandchild 4
|
||||
child3
|
||||
grandchild 5
|
||||
grandchild 6
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
|
||||
it('braches with shapes and labels', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root
|
||||
child1((Circle))
|
||||
grandchild 1
|
||||
grandchild 2
|
||||
child2(Round rectangle)
|
||||
grandchild 3
|
||||
grandchild 4
|
||||
child3[Square]
|
||||
grandchild 5
|
||||
::icon(mdi mdi-fire)
|
||||
gc6((grand<br/>child 6))
|
||||
::icon(mdi mdi-fire)
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
it('text shouhld wrap with icon', () => {
|
||||
imgSnapshotTest(
|
||||
`mindmap
|
||||
root
|
||||
Child3(A node with an icon and with a long text that wraps to keep the node size in check)
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
});
|
||||
it('square shape', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
mindmap
|
||||
root[
|
||||
The root
|
||||
]
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('rounded rect shape', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
mindmap
|
||||
root((
|
||||
The root
|
||||
))
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('circle shape', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
mindmap
|
||||
root(
|
||||
The root
|
||||
)
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('default shape', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
mindmap
|
||||
The root
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('adding children', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
mindmap
|
||||
The root
|
||||
child1
|
||||
child2
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('adding grand children', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
mindmap
|
||||
The root
|
||||
child1
|
||||
child2
|
||||
child3
|
||||
`,
|
||||
{},
|
||||
undefined,
|
||||
shouldHaveRoot
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
/* The end */
|
||||
});
|
||||
78
cypress/integration/rendering/pie.spec.js
Normal file
78
cypress/integration/rendering/pie.spec.js
Normal file
@@ -0,0 +1,78 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.js';
|
||||
|
||||
describe('Pie Chart', () => {
|
||||
it('should render a simple pie diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
pie title Sports in Sweden
|
||||
"Bandy" : 40
|
||||
"Ice-Hockey" : 80
|
||||
"Football" : 90
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a simple pie diagram with long labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
pie title NETFLIX
|
||||
"Time spent looking for movie" : 90
|
||||
"Time spent watching it" : 10
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a simple pie diagram with capital letters for labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
pie title What Voldemort doesn't have?
|
||||
"FRIENDS" : 2
|
||||
"FAMILY" : 3
|
||||
"NOSE" : 45
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a pie diagram when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`
|
||||
pie title Sports in Sweden
|
||||
"Bandy" : 40
|
||||
"Ice-Hockey" : 80
|
||||
"Football" : 90
|
||||
`,
|
||||
{ pie: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.eq(450);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
expect(maxWidthValue).to.eq(984);
|
||||
});
|
||||
});
|
||||
it('should render a pie diagram when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`
|
||||
pie title Sports in Sweden
|
||||
"Bandy" : 40
|
||||
"Ice-Hockey" : 80
|
||||
"Football" : 90
|
||||
`,
|
||||
{ pie: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// expect(height).to.eq(450);
|
||||
expect(width).to.eq(984);
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
});
|
||||
114
cypress/integration/rendering/requirement.spec.js
Normal file
114
cypress/integration/rendering/requirement.spec.js
Normal file
@@ -0,0 +1,114 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.js';
|
||||
|
||||
describe('Requirement diagram', () => {
|
||||
it('sample', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
requirementDiagram
|
||||
|
||||
requirement test_req {
|
||||
id: 1
|
||||
text: the test text.
|
||||
risk: high
|
||||
verifymethod: test
|
||||
}
|
||||
|
||||
functionalRequirement test_req2 {
|
||||
id: 1.1
|
||||
text: the second test text.
|
||||
risk: low
|
||||
verifymethod: inspection
|
||||
}
|
||||
|
||||
performanceRequirement test_req3 {
|
||||
id: 1.2
|
||||
text: the third test text.
|
||||
risk: medium
|
||||
verifymethod: demonstration
|
||||
}
|
||||
|
||||
element test_entity {
|
||||
type: simulation
|
||||
}
|
||||
|
||||
element test_entity2 {
|
||||
type: word doc
|
||||
docRef: reqs/test_entity
|
||||
}
|
||||
|
||||
|
||||
test_entity - satisfies -> test_req2
|
||||
test_req - traces -> test_req2
|
||||
test_req - contains -> test_req3
|
||||
test_req <- copies - test_entity2
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render accessibility tags', function () {
|
||||
const expectedTitle = 'Gantt Diagram';
|
||||
const expectedAccDescription = 'Tasks for Q4';
|
||||
renderGraph(
|
||||
`
|
||||
requirementDiagram
|
||||
accTitle: ${expectedTitle}
|
||||
accDescr: ${expectedAccDescription}
|
||||
|
||||
requirement test_req {
|
||||
id: 1
|
||||
text: the test text.
|
||||
risk: high
|
||||
verifymethod: test
|
||||
}
|
||||
|
||||
functionalRequirement test_req2 {
|
||||
id: 1.1
|
||||
text: the second test text.
|
||||
risk: low
|
||||
verifymethod: inspection
|
||||
}
|
||||
|
||||
performanceRequirement test_req3 {
|
||||
id: 1.2
|
||||
text: the third test text.
|
||||
risk: medium
|
||||
verifymethod: demonstration
|
||||
}
|
||||
|
||||
element test_entity {
|
||||
type: simulation
|
||||
}
|
||||
|
||||
element test_entity2 {
|
||||
type: word doc
|
||||
docRef: reqs/test_entity
|
||||
}
|
||||
|
||||
|
||||
test_entity - satisfies -> test_req2
|
||||
test_req - traces -> test_req2
|
||||
test_req - contains -> test_req3
|
||||
test_req <- copies - test_entity2
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
const el = svg.get(0);
|
||||
const children = [...el.children];
|
||||
|
||||
const titleEl = children.find(function (node) {
|
||||
return node.tagName === 'title';
|
||||
});
|
||||
const descriptionEl = children.find(function (node) {
|
||||
return node.tagName === 'desc';
|
||||
});
|
||||
|
||||
expect(titleEl).to.exist;
|
||||
expect(titleEl.textContent).to.equal(expectedTitle);
|
||||
expect(descriptionEl).to.exist;
|
||||
expect(descriptionEl.textContent).to.equal(expectedAccDescription);
|
||||
});
|
||||
});
|
||||
});
|
||||
785
cypress/integration/rendering/sequencediagram.spec.js
Normal file
785
cypress/integration/rendering/sequencediagram.spec.js
Normal file
@@ -0,0 +1,785 @@
|
||||
/// <reference types="Cypress" />
|
||||
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
context('Sequence diagram', () => {
|
||||
it('should render a simple sequence diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant Alice
|
||||
participant Bob
|
||||
participant John as John<br/>Second Line
|
||||
Alice ->> Bob: Hello Bob, how are you?
|
||||
Bob-->>John: How about you John?
|
||||
Bob--x Alice: I am good thanks!
|
||||
Bob-x John: I am good thanks!
|
||||
Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||
Bob-->Alice: Checking with John...
|
||||
alt either this
|
||||
Alice->>John: Yes
|
||||
else or this
|
||||
Alice->>John: No
|
||||
else or this will happen
|
||||
Alice->John: Maybe
|
||||
end
|
||||
par this happens in parallel
|
||||
Alice -->> Bob: Parallel message 1
|
||||
and
|
||||
Alice -->> John: Parallel message 2
|
||||
end
|
||||
`,
|
||||
{ sequence: { actorFontFamily: 'courier' } }
|
||||
);
|
||||
});
|
||||
it('should handle different line breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant 1 as multiline<br>using #lt;br#gt;
|
||||
participant 2 as multiline<br/>using #lt;br/#gt;
|
||||
participant 3 as multiline<br />using #lt;br /#gt;
|
||||
participant 4 as multiline<br \t/>using #lt;br \t/#gt;
|
||||
1->>2: multiline<br>using #lt;br#gt;
|
||||
note right of 2: multiline<br>using #lt;br#gt;
|
||||
2->>3: multiline<br/>using #lt;br/#gt;
|
||||
note right of 3: multiline<br/>using #lt;br/#gt;
|
||||
3->>4: multiline<br />using #lt;br /#gt;
|
||||
note right of 4: multiline<br />using #lt;br /#gt;
|
||||
4->>1: multiline<br />using #lt;br /#gt;
|
||||
note right of 1: multiline<br \t/>using #lt;br \t/#gt;
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should handle line breaks and wrap annotations', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant Alice
|
||||
participant Bob
|
||||
participant John as John<br/>Second Line
|
||||
Alice ->> Bob: Hello Bob, how are you?
|
||||
Bob-->>John: How about you John?
|
||||
Note right of John: John thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||
Bob-->Alice: Checking with John...
|
||||
Note over John:wrap: John looks like he's still thinking, so Bob prods him a bit.
|
||||
Bob-x John: Hey John -<br/>we're still waiting to know<br/>how you're doing
|
||||
Note over John:nowrap: John's trying hard not to break his train of thought.
|
||||
Bob-x John:wrap: John! Are you still debating about how you're doing? How long does it take??
|
||||
Note over John: After a few more moments, John<br/>finally snaps out of it.
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render loops with a slight margin', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
loop Loopy
|
||||
Bob->>Alice: Pasten
|
||||
end `,
|
||||
{ wrap: true }
|
||||
);
|
||||
});
|
||||
context('font settings', () => {
|
||||
it('should render different note fonts when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: I should have bigger fonts
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { noteFontSize: 18, noteFontFamily: 'Arial' } }
|
||||
);
|
||||
});
|
||||
it('should render different message fonts when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { messageFontSize: 18, messageFontFamily: 'Arial' } }
|
||||
);
|
||||
});
|
||||
it('should render different actor fonts when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { actorFontSize: 18, actorFontFamily: 'times' } }
|
||||
);
|
||||
});
|
||||
it('should render notes aligned to the left when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: I am left aligned
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { noteAlign: 'left' } }
|
||||
);
|
||||
});
|
||||
it('should render multi-line notes aligned to the left when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: I am left aligned<br>but also<br>multiline
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { noteAlign: 'left' } }
|
||||
);
|
||||
});
|
||||
it('should render notes aligned to the right when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: I am right aligned
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { noteAlign: 'right' } }
|
||||
);
|
||||
});
|
||||
it('should render multi-line notes aligned to the right when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: I am right aligned<br>but also<br>multiline
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ sequence: { noteAlign: 'right' } }
|
||||
);
|
||||
});
|
||||
it('should render multi-line messages aligned to the left when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short<br>but also<br>multiline
|
||||
Bob->>Alice: Short as well<br>and also<br>multiline
|
||||
`,
|
||||
{ sequence: { messageAlign: 'left' } }
|
||||
);
|
||||
});
|
||||
it('should render multi-line messages aligned to the right when configured', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short<br>but also<br>multiline
|
||||
Bob->>Alice: Short as well<br>and also<br>multiline
|
||||
`,
|
||||
{ sequence: { messageAlign: 'right' } }
|
||||
);
|
||||
});
|
||||
});
|
||||
context('auth width scaling', () => {
|
||||
it('should render long actor descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant A as Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
A->>Bob: Hola
|
||||
Bob-->A: Pasten !
|
||||
`,
|
||||
{ logLevel: 0 }
|
||||
);
|
||||
});
|
||||
it('should wrap (inline) long actor descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant A as wrap:Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
A->>Bob: Hola
|
||||
Bob-->A: Pasten !
|
||||
`,
|
||||
{ logLevel: 0 }
|
||||
);
|
||||
});
|
||||
it('should wrap (directive) long actor descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: {'config': {'wrap': true }}}%%
|
||||
sequenceDiagram
|
||||
participant A as Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
A->>Bob: Hola
|
||||
Bob-->A: Pasten !
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should be possible to use actor symbols instead of boxes', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
actor Alice
|
||||
actor Bob
|
||||
Alice->>Bob: Hi Bob
|
||||
Bob->>Alice: Hi Alice
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long notes left of actor', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hola
|
||||
Note left of Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long notes wrapped (inline) left of actor', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hola
|
||||
Note left of Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long notes right of actor', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hola
|
||||
Note right of Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long notes wrapped (inline) right of actor', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hola
|
||||
Note right of Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long notes over actor', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hola
|
||||
Note over Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long notes wrapped (inline) over actor', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hola
|
||||
Note over Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long messages from an actor to the left to one to the right', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long messages wrapped (inline) from an actor to the left to one to the right', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob:wrap:Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
Bob->>Alice: I'm short though
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long messages from an actor to the right to one to the left', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
Bob->>Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render long messages wrapped (inline) from an actor to the right to one to the left', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
Bob->>Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
context('background rects', () => {
|
||||
it('should render a single and nested rects', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant A
|
||||
participant B
|
||||
participant C
|
||||
participant D
|
||||
participant E
|
||||
participant G
|
||||
|
||||
A ->>+ B: Task 1
|
||||
rect rgb(178, 102, 255)
|
||||
B ->>+ C: Task 2
|
||||
C -->>- B: Return
|
||||
end
|
||||
|
||||
A ->> D: Task 3
|
||||
rect rgb(0, 128, 255)
|
||||
D ->>+ E: Task 4
|
||||
rect rgb(0, 204, 0)
|
||||
E ->>+ G: Task 5
|
||||
G -->>- E: Return
|
||||
end
|
||||
E ->> E: Task 6
|
||||
end
|
||||
D -->> A: Complete
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render a single and nested opt with long test overflowing', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant A
|
||||
participant B
|
||||
participant C
|
||||
participant D
|
||||
participant E
|
||||
participant G
|
||||
|
||||
A ->>+ B: Task 1
|
||||
opt this is an opt with a long title that will overflow
|
||||
B ->>+ C: Task 2
|
||||
C -->>- B: Return
|
||||
end
|
||||
|
||||
A ->> D: Task 3
|
||||
opt this is another opt with a long title that will overflow
|
||||
D ->>+ E: Task 4
|
||||
opt this is a nested opt with a long title that will overflow
|
||||
E ->>+ G: Task 5
|
||||
G -->>- E: Return
|
||||
end
|
||||
E ->> E: Task 6
|
||||
end
|
||||
D -->> A: Complete
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render a single and nested opt with long test wrapping', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'config': { 'wrap': true } } }%%
|
||||
sequenceDiagram
|
||||
participant A
|
||||
participant B
|
||||
participant C
|
||||
participant D
|
||||
participant E
|
||||
participant G
|
||||
|
||||
A ->>+ B: Task 1
|
||||
opt this is an opt with a long title that will overflow
|
||||
B ->>+ C: Task 2
|
||||
C -->>- B: Return
|
||||
end
|
||||
|
||||
A ->> D: Task 3
|
||||
opt this is another opt with a long title that will overflow
|
||||
D ->>+ E: Task 4
|
||||
opt this is a nested opt with a long title that will overflow
|
||||
E ->>+ G: Task 5
|
||||
G -->>- E: Return
|
||||
end
|
||||
E ->> E: Task 6
|
||||
end
|
||||
D -->> A: Complete
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render rect around and inside loops', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
A ->> B: 1
|
||||
rect rgb(204, 0, 102)
|
||||
loop check C
|
||||
C ->> C: Every 10 seconds
|
||||
end
|
||||
end
|
||||
A ->> B: 2
|
||||
loop check D
|
||||
C ->> D: 3
|
||||
rect rgb(153, 153, 255)
|
||||
D -->> D: 5
|
||||
D --> C: 4
|
||||
end
|
||||
end
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render rect around and inside alts', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
A ->> B: 1
|
||||
rect rgb(204, 0, 102)
|
||||
alt yes
|
||||
C ->> C: 1
|
||||
else no
|
||||
rect rgb(0, 204, 204)
|
||||
C ->> C: 0
|
||||
end
|
||||
end
|
||||
end
|
||||
B ->> A: Return
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render rect around and inside opts', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
A ->> B: 1
|
||||
rect rgb(204, 0, 102)
|
||||
opt maybe
|
||||
C -->> D: Do something
|
||||
rect rgb(0, 204, 204)
|
||||
C ->> C: 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
opt possibly
|
||||
rect rgb(0, 204, 204)
|
||||
C ->> C: 0
|
||||
end
|
||||
end
|
||||
B ->> A: Return
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render rect around and inside criticals', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
A ->> B: 1
|
||||
rect rgb(204, 0, 102)
|
||||
critical yes
|
||||
C ->> C: 1
|
||||
option no
|
||||
rect rgb(0, 204, 204)
|
||||
C ->> C: 0
|
||||
end
|
||||
end
|
||||
end
|
||||
B ->> A: Return
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render rect around and inside breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
A ->> B: 1
|
||||
rect rgb(204, 0, 102)
|
||||
break yes
|
||||
rect rgb(0, 204, 204)
|
||||
C ->> C: 0
|
||||
end
|
||||
end
|
||||
end
|
||||
B ->> A: Return
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render autonumber when configured with such', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
`,
|
||||
{ sequence: { actorMargin: 50, showSequenceNumbers: true } }
|
||||
);
|
||||
});
|
||||
it('should render autonumber when autonumber keyword is used', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render autonumber with different line breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
Alice->>John: Hello John,<br>how are you?
|
||||
Alice->>John: John,<br/>can you hear me?
|
||||
John-->>Alice: Hi Alice,<br />I can hear you!
|
||||
John-->>Alice: I feel great!
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render dark theme from init directive and configure font size 24 font', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: {'theme': 'dark', 'config': {'fontSize': 24}}}%%
|
||||
sequenceDiagram
|
||||
Alice->>John: Hello John, how are you?
|
||||
Alice->>John: John, can you hear me?
|
||||
John-->>Alice: Hi Alice, I can hear you!
|
||||
John-->>Alice: I feel great!
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render with wrapping enabled', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'config': { 'wrap': true }}}%%
|
||||
sequenceDiagram
|
||||
participant A as Alice, the talkative one
|
||||
A->>John: Hello John, how are you today? I'm feeling quite verbose today.
|
||||
A->>John: John, can you hear me? If you are not available, we can talk later.
|
||||
John-->>A: Hi Alice, I can hear you! I was finishing up an important meeting.
|
||||
John-->>A: I feel great! I was not ignoring you. I am sorry you had to wait for a response.
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
it('should render with an init directive', () => {
|
||||
imgSnapshotTest(
|
||||
`%%{init: { "theme": "dark", 'config': { "fontFamily": "Menlo", "fontSize": 18, "fontWeight": 400, "wrap": true }}}%%
|
||||
sequenceDiagram
|
||||
Alice->>Bob: Hello Bob, how are you? If you are not available right now, I can leave you a message. Please get back to me as soon as you can!
|
||||
Note left of Alice: Bob thinks
|
||||
Bob->>Alice: Fine!`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
context('directives', () => {
|
||||
it('should override config with directive settings', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { "config": { "mirrorActors": true }}}%%
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: config set to mirrorActors: false<br/>directive set to mirrorActors: true
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
sequence: { mirrorActors: false, noteFontSize: 18, noteFontFamily: 'Arial' },
|
||||
}
|
||||
);
|
||||
});
|
||||
it('should override config with directive settings 2', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { "config": { "mirrorActors": false, "wrap": true }}}%%
|
||||
sequenceDiagram
|
||||
Alice->>Bob: I'm short
|
||||
note left of Alice: config: mirrorActors=true<br/>directive: mirrorActors=false
|
||||
Bob->>Alice: Short as well
|
||||
`,
|
||||
{ logLevel: 0, sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' } }
|
||||
);
|
||||
});
|
||||
});
|
||||
context('links', () => {
|
||||
it('should support actor links and properties EXPERIMENTAL: USE WITH CAUTION', () => {
|
||||
//Be aware that the syntax for "properties" is likely to be changed.
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { "config": { "mirrorActors": true, "forceMenus": true }}}%%
|
||||
sequenceDiagram
|
||||
participant a as Alice
|
||||
participant j as John
|
||||
note right of a: Hello world!
|
||||
properties a: {"class": "internal-service-actor", "type": "@clock"}
|
||||
properties j: {"class": "external-service-actor", "type": "@computer"}
|
||||
links a: {"Repo": "https://www.contoso.com/repo", "Swagger": "https://www.contoso.com/swagger"}
|
||||
links j: {"Repo": "https://www.contoso.com/repo"}
|
||||
links a: {"Dashboard": "https://www.contoso.com/dashboard", "On-Call": "https://www.contoso.com/oncall"}
|
||||
link a: Contacts @ https://contacts.contoso.com/?contact=alice@contoso.com
|
||||
a->>j: Hello John, how are you?
|
||||
j-->>a: Great!
|
||||
`,
|
||||
{ logLevel: 0, sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' } }
|
||||
);
|
||||
});
|
||||
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
||||
//Be aware that the syntax for "properties" is likely to be changed.
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { "config": { "mirrorActors": false, "forceMenus": true, "wrap": true }}}%%
|
||||
sequenceDiagram
|
||||
participant a as Alice
|
||||
participant j as John
|
||||
note right of a: Hello world!
|
||||
properties a: {"class": "internal-service-actor", "type": "@clock"}
|
||||
properties j: {"class": "external-service-actor", "type": "@computer"}
|
||||
links a: {"Repo": "https://www.contoso.com/repo", "Swagger": "https://www.contoso.com/swagger"}
|
||||
links j: {"Repo": "https://www.contoso.com/repo"}
|
||||
links a: {"Dashboard": "https://www.contoso.com/dashboard", "On-Call": "https://www.contoso.com/oncall"}
|
||||
a->>j: Hello John, how are you?
|
||||
j-->>a: Great!
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
sequence: { mirrorActors: false, noteFontSize: 18, noteFontFamily: 'Arial' },
|
||||
}
|
||||
);
|
||||
});
|
||||
it("shouldn't display unused participants", () => {
|
||||
//Be aware that the syntax for "properties" is likely to be changed.
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { "config": { "sequence": {"hideUnusedParticipants": true }}}}%%
|
||||
sequenceDiagram
|
||||
participant a
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
sequence: { mirrorActors: false, noteFontSize: 18, noteFontFamily: 'Arial' },
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
context('svg size', () => {
|
||||
it('should render a sequence diagram when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant Alice
|
||||
participant Bob
|
||||
participant John as John<br/>Second Line
|
||||
Alice ->> Bob: Hello Bob, how are you?
|
||||
Bob-->>John: How about you John?
|
||||
Bob--x Alice: I am good thanks!
|
||||
Bob-x John: I am good thanks!
|
||||
Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||
Bob-->Alice: Checking with John...
|
||||
alt either this
|
||||
Alice->>John: Yes
|
||||
else or this
|
||||
Alice->>John: No
|
||||
else or this will happen
|
||||
Alice->John: Maybe
|
||||
end
|
||||
par this happens in parallel
|
||||
Alice -->> Bob: Parallel message 1
|
||||
and
|
||||
Alice -->> John: Parallel message 2
|
||||
end
|
||||
`,
|
||||
{ sequence: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(920, 971);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
expect(maxWidthValue).to.be.within(820 * 0.95, 820 * 1.05);
|
||||
});
|
||||
});
|
||||
it('should render a sequence diagram when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`
|
||||
sequenceDiagram
|
||||
participant Alice
|
||||
participant Bob
|
||||
participant John as John<br/>Second Line
|
||||
Alice ->> Bob: Hello Bob, how are you?
|
||||
Bob-->>John: How about you John?
|
||||
Bob--x Alice: I am good thanks!
|
||||
Bob-x John: I am good thanks!
|
||||
Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||
Bob-->Alice: Checking with John...
|
||||
alt either this
|
||||
Alice->>John: Yes
|
||||
else or this
|
||||
Alice->>John: No
|
||||
else or this will happen
|
||||
Alice->John: Maybe
|
||||
end
|
||||
par this happens in parallel
|
||||
Alice -->> Bob: Parallel message 1
|
||||
and
|
||||
Alice -->> John: Parallel message 2
|
||||
end
|
||||
`,
|
||||
{ sequence: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// expect(height).to.be.within(920, 971);
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
expect(width).to.be.within(820 * 0.95, 820 * 1.05);
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
574
cypress/integration/rendering/stateDiagram-v2.spec.js
Normal file
574
cypress/integration/rendering/stateDiagram-v2.spec.js
Normal file
@@ -0,0 +1,574 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
describe('State diagram', () => {
|
||||
it('v2 should render a simple info', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
info
|
||||
`,
|
||||
{ logLevel: 1, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a simple state diagrams', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a long descriptions instead of id when available', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
|
||||
[*] --> S1
|
||||
state "Some long name" as S1
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a long descriptions with additional descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
|
||||
[*] --> S1
|
||||
state "Some long name" as S1: The description
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a single state with short descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state "A long long name" as long1
|
||||
state "A" as longlonglongid
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a transition descriptions with new lines', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
|
||||
[*] --> S1
|
||||
S1 --> S2: long line using<br/>should work
|
||||
S1 --> S3: long line using <br>should work
|
||||
S1 --> S4: long line using \\nshould work
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a state with a note', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
State1: The state with a note
|
||||
note right of State1
|
||||
Important information! You can write
|
||||
notes.
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a state with on the left side when so specified', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
State1: The state with a note with minus - and plus + in it
|
||||
note left of State1
|
||||
Important information! You can write
|
||||
notes with . and in them.
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a state with a note together with another state', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
State1: The state with a note +,-
|
||||
note right of State1
|
||||
Important information! You can write +,-
|
||||
notes.
|
||||
end note
|
||||
State1 --> State2 : With +,-
|
||||
note left of State2 : This is the note +,-<br/>
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a note with multiple lines in it', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
State1: The state with a note
|
||||
note right of State1
|
||||
Important information! You\ncan write
|
||||
notes with multiple lines...
|
||||
Here is another line...
|
||||
And another line...
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('v2 should handle multiline notes with different line breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
State1
|
||||
note right of State1
|
||||
Line1<br>Line2<br/>Line3<br />Line4<br />Line5
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('v2 should render a states with descriptions including multi-line descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
State1: This a a single line description
|
||||
State2: This a a multi line description
|
||||
State2: here comes the multi part
|
||||
[*] --> State1
|
||||
State1 --> State2
|
||||
State2 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a simple state diagrams 2', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> State1
|
||||
State1 --> State2
|
||||
State1 --> State3
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a simple state diagrams with labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> State1
|
||||
State1 --> State2 : Transition 1
|
||||
State1 --> State3 : Transition 2
|
||||
State1 --> State4 : Transition 3
|
||||
State1 --> State5 : Transition 4
|
||||
State2 --> State3 : Transition 5
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render state descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state "Long state description" as XState1
|
||||
state "Another Long state description" as XState2
|
||||
XState2 : New line
|
||||
XState1 --> XState2
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render composite states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> NotShooting: Pacifist
|
||||
NotShooting --> A
|
||||
NotShooting --> B
|
||||
NotShooting --> C
|
||||
|
||||
state NotShooting {
|
||||
[*] --> Idle: Yet another long long öong öong öong label
|
||||
Idle --> Configuring : EvConfig
|
||||
Configuring --> Idle : EvConfig EvConfig EvConfig EvConfig EvConfig
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render multiple composite states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*]-->TV
|
||||
|
||||
state TV {
|
||||
[*] --> Off: Off to start with
|
||||
On --> Off : Turn off
|
||||
Off --> On : Turn on
|
||||
}
|
||||
|
||||
TV--> Console
|
||||
|
||||
state Console {
|
||||
[*] --> Off2: Off to start with
|
||||
On2--> Off2 : Turn off
|
||||
Off2 --> On2 : Turn on
|
||||
On2-->Playing
|
||||
|
||||
state Playing {
|
||||
Alive --> Dead
|
||||
Dead-->Alive
|
||||
}
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('v2 should render forks in composite states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*]-->TV
|
||||
|
||||
state TV {
|
||||
state fork_state <<fork>>
|
||||
[*] --> fork_state
|
||||
fork_state --> State2
|
||||
fork_state --> State3
|
||||
|
||||
state join_state <<join>>
|
||||
State2 --> join_state
|
||||
State3 --> join_state
|
||||
join_state --> State4
|
||||
State4 --> [*]
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('v2 should render forks and joins', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state fork_state <<fork>>
|
||||
[*] --> fork_state
|
||||
fork_state --> State2
|
||||
fork_state --> State3
|
||||
|
||||
state join_state <<join>>
|
||||
State2 --> join_state
|
||||
State3 --> join_state
|
||||
join_state --> State4
|
||||
State4 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render concurrency states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> Active
|
||||
|
||||
state Active {
|
||||
[*] --> NumLockOff
|
||||
NumLockOff --> NumLockOn : EvNumLockPressed
|
||||
NumLockOn --> NumLockOff : EvNumLockPressed
|
||||
--
|
||||
[*] --> CapsLockOff
|
||||
CapsLockOff --> CapsLockOn : EvCapsLockPressed
|
||||
CapsLockOn --> CapsLockOff : EvCapsLockPressed
|
||||
--
|
||||
[*] --> ScrollLockOff
|
||||
ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
|
||||
ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('v2 should render a state with states in it', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state PilotCockpit {
|
||||
state Parent {
|
||||
C
|
||||
}
|
||||
}
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 it should be possibel to use a choice', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> Off
|
||||
Off --> On
|
||||
state MyChoice [[choice]]
|
||||
On --> MyChoice
|
||||
MyChoice --> Washing
|
||||
MyChoice --> Drying
|
||||
Washing --> Finished
|
||||
Finished --> [*]
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 A compound state should be able to link to itself', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state Active {
|
||||
Idle
|
||||
}
|
||||
Inactive --> Idle: ACT
|
||||
Active --> Active: LOG
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 width of compond state should grow with title if title is wider', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state "Long state name 2" as NotShooting {
|
||||
a-->b
|
||||
}
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 state label with names in it', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
Yswsii: Your state with spaces in it
|
||||
[*] --> Yswsii
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 Simplest composite state', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state Parent {
|
||||
C
|
||||
}
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 should handle multiple arrows from one node to another', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
a --> b: Start
|
||||
a --> b: Stop
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 should handle multiple notes added to one state', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
MyState
|
||||
note left of MyState : I am a leftie
|
||||
note right of MyState : I am a rightie
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 should handle different rendering directions in composite states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
direction LR
|
||||
state A {
|
||||
direction BT
|
||||
a --> b
|
||||
}
|
||||
state C {
|
||||
direction RL
|
||||
c --> d
|
||||
}
|
||||
A --> C
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 handle transition from one state in a composite state to a composite state', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
state S1 {
|
||||
sub1 -->sub2
|
||||
}
|
||||
|
||||
state S2 {
|
||||
sub4
|
||||
}
|
||||
S1 --> S2
|
||||
sub1 --> sub4
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('v2 should render a state diagram when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`
|
||||
stateDiagram-v2
|
||||
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ state: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(177, 178);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
expect(maxWidthValue).to.be.within(65, 85);
|
||||
});
|
||||
});
|
||||
it('v2 should render a state diagram when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`
|
||||
stateDiagram-v2
|
||||
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ state: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// expect(height).to.be.within(177, 178);
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
expect(width).to.be.within(65, 85);
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
|
||||
it('v2 should render a state diagram and set the correct length of the labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> 1
|
||||
1 --> 2: test({ foo#colon; 'far' })
|
||||
2 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
describe('classDefs and applying classes', () => {
|
||||
it('v2 states can have a class applied', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
[*] --> A
|
||||
A --> B: test({ foo#colon; 'far' })
|
||||
B --> [*]
|
||||
classDef badBadEvent fill:#f00,color:white,font-weight:bold
|
||||
class B badBadEvent
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('v2 can have multiple classes applied to multiple states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram-v2
|
||||
classDef notMoving fill:white
|
||||
classDef movement font-style:italic;
|
||||
classDef badBadEvent fill:#f00,color:white,font-weight:bold
|
||||
|
||||
[*] --> Still
|
||||
Still --> [*]
|
||||
Still --> Moving
|
||||
Moving --> Still
|
||||
Moving --> Crash
|
||||
Crash --> [*]
|
||||
|
||||
class Still notMoving
|
||||
class Moving, Crash movement
|
||||
class Crash badBadEvent
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
});
|
||||
it('1433: should render a simple state diagram with a title', () => {
|
||||
imgSnapshotTest(
|
||||
`---
|
||||
title: simple state diagram
|
||||
---
|
||||
stateDiagram-v2
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{}
|
||||
);
|
||||
});
|
||||
});
|
||||
393
cypress/integration/rendering/stateDiagram.spec.js
Normal file
393
cypress/integration/rendering/stateDiagram.spec.js
Normal file
@@ -0,0 +1,393 @@
|
||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util';
|
||||
|
||||
describe('State diagram', () => {
|
||||
it('should render a simple state diagrams', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a long descriptions instead of id when available', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
|
||||
[*] --> S1
|
||||
state "Some long name" as S1
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a long descriptions with additional descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
|
||||
[*] --> S1
|
||||
state "Some long name" as S1: The description
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a single state with short descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state "A long long name" as long1
|
||||
state "A" as longlonglongid
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a transition descriptions with new lines', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
|
||||
[*] --> S1
|
||||
S1 --> S2: long line using<br/>should work
|
||||
S1 --> S3: long line using <br>should work
|
||||
S1 --> S4: long line using \\nshould work
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a state with a note', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
State1: The state with a note
|
||||
note right of State1
|
||||
Important information! You can write
|
||||
notes.
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a state with on the left side when so specified', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
State1: The state with a note with minus - and plus + in it
|
||||
note left of State1
|
||||
Important information! You can write
|
||||
notes with . and in them.
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a state with a note together with another state', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
State1: The state with a note +,-
|
||||
note right of State1
|
||||
Important information! You can write +,-
|
||||
notes.
|
||||
end note
|
||||
State1 --> State2 : With +,-
|
||||
note left of State2 : This is the note +,-<br/>
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a note with multiple lines in it', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
State1: The state with a note
|
||||
note right of State1
|
||||
Important information! You\ncan write
|
||||
notes with multiple lines...
|
||||
Here is another line...
|
||||
And another line...
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('should handle multiline notes with different line breaks', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
State1
|
||||
note right of State1
|
||||
Line1<br>Line2<br/>Line3<br />Line4<br />Line5
|
||||
end note
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
|
||||
it('should render a states with descriptions including multi-line descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
State1: This a a single line description
|
||||
State2: This a a multi line description
|
||||
State2: here comes the multi part
|
||||
[*] --> State1
|
||||
State1 --> State2
|
||||
State2 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a simple state diagrams 2', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> State1
|
||||
State1 --> State2
|
||||
State1 --> State3
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a simple state diagrams with labels', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> State1
|
||||
State1 --> State2 : Transition 1
|
||||
State1 --> State3 : Transition 2
|
||||
State1 --> State4 : Transition 3
|
||||
State1 --> State5 : Transition 4
|
||||
State2 --> State3 : Transition 5
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render state descriptions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state "Long state description" as XState1
|
||||
state "Another Long state description" as XState2
|
||||
XState2 : New line
|
||||
XState1 --> XState2
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render composite states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> NotShooting: Pacifist
|
||||
NotShooting --> A
|
||||
NotShooting --> B
|
||||
NotShooting --> C
|
||||
|
||||
state NotShooting {
|
||||
[*] --> Idle: Yet another long long öong öong öong label
|
||||
Idle --> Configuring : EvConfig
|
||||
Configuring --> Idle : EvConfig EvConfig EvConfig EvConfig EvConfig
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render multiple composit states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*]-->TV
|
||||
|
||||
state TV {
|
||||
[*] --> Off: Off to start with
|
||||
On --> Off : Turn off
|
||||
Off --> On : Turn on
|
||||
}
|
||||
|
||||
TV--> Console
|
||||
|
||||
state Console {
|
||||
[*] --> Off2: Off to start with
|
||||
On2--> Off2 : Turn off
|
||||
Off2 --> On2 : Turn on
|
||||
On2-->Playing
|
||||
|
||||
state Playing {
|
||||
Alive --> Dead
|
||||
Dead-->Alive
|
||||
}
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('should render forks in composit states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*]-->TV
|
||||
|
||||
state TV {
|
||||
state fork_state <<fork>>
|
||||
[*] --> fork_state
|
||||
fork_state --> State2
|
||||
fork_state --> State3
|
||||
|
||||
state join_state <<join>>
|
||||
State2 --> join_state
|
||||
State3 --> join_state
|
||||
join_state --> State4
|
||||
State4 --> [*]
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
});
|
||||
it('should render forks and joins', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state fork_state <<fork>>
|
||||
[*] --> fork_state
|
||||
fork_state --> State2
|
||||
fork_state --> State3
|
||||
|
||||
state join_state <<join>>
|
||||
State2 --> join_state
|
||||
State3 --> join_state
|
||||
join_state --> State4
|
||||
State4 --> [*]
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render concurrency states', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> Active
|
||||
|
||||
state Active {
|
||||
[*] --> NumLockOff
|
||||
NumLockOff --> NumLockOn : EvNumLockPressed
|
||||
NumLockOn --> NumLockOff : EvNumLockPressed
|
||||
--
|
||||
[*] --> CapsLockOff
|
||||
CapsLockOff --> CapsLockOn : EvCapsLockPressed
|
||||
CapsLockOn --> CapsLockOff : EvCapsLockPressed
|
||||
--
|
||||
[*] --> ScrollLockOff
|
||||
ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
|
||||
ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
|
||||
}
|
||||
`,
|
||||
{ logLevel: 0, fontFamily: 'courier' }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a state with states in it', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state PilotCockpit {
|
||||
state Parent {
|
||||
C
|
||||
}
|
||||
}
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('Simplest composite state', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
state Parent {
|
||||
C
|
||||
}
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('should handle multiple arrows from one node to another', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
stateDiagram
|
||||
a --> b: Start
|
||||
a --> b: Stop
|
||||
`,
|
||||
{
|
||||
logLevel: 0,
|
||||
fontFamily: 'courier',
|
||||
}
|
||||
);
|
||||
});
|
||||
it('should render a state diagram when useMaxWidth is true (default)', () => {
|
||||
renderGraph(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ state: { useMaxWidth: true } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
expect(svg).to.have.attr('width', '100%');
|
||||
// expect(svg).to.have.attr('height');
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
// expect(height).to.be.within(176, 178);
|
||||
const style = svg.attr('style');
|
||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// Todo investigate difference
|
||||
// expect(maxWidthValue).to.be.within(112 * .95, 112 * 1.05);
|
||||
expect(maxWidthValue).to.be.within(65, 85);
|
||||
});
|
||||
});
|
||||
it('should render a state diagram when useMaxWidth is false', () => {
|
||||
renderGraph(
|
||||
`
|
||||
stateDiagram
|
||||
[*] --> State1
|
||||
State1 --> [*]
|
||||
`,
|
||||
{ state: { useMaxWidth: false } }
|
||||
);
|
||||
cy.get('svg').should((svg) => {
|
||||
// const height = parseFloat(svg.attr('height'));
|
||||
const width = parseFloat(svg.attr('width'));
|
||||
// expect(height).to.be.within(176, 178);
|
||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||
// Todo investigate difference
|
||||
// expect(width).to.be.within(112 * .95, 112 * 1.05);
|
||||
expect(width).to.be.within(65, 85);
|
||||
|
||||
expect(svg).to.not.have.attr('style');
|
||||
});
|
||||
});
|
||||
});
|
||||
333
cypress/integration/rendering/theme.spec.js
Normal file
333
cypress/integration/rendering/theme.spec.js
Normal file
@@ -0,0 +1,333 @@
|
||||
import { imgSnapshotTest } from '../../helpers/util.js';
|
||||
|
||||
describe('themeCSS balancing, it', () => {
|
||||
it('should not allow unbalanced CSS definitions', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'themeCSS': '} * { background: red }' } }%%
|
||||
flowchart TD
|
||||
a --> b
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should not allow unbalanced CSS definitions 2', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'themeCSS': '\u007D * { background: red }' } }%%
|
||||
flowchart TD
|
||||
a2 --> b2
|
||||
`,
|
||||
{}
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
});
|
||||
|
||||
// TODO: Delete/Rename this describe, keeping the inner contents.
|
||||
describe('Pie Chart', () => {
|
||||
// beforeEach(()=>{
|
||||
// cy.clock((new Date('2014-06-09')).getTime());
|
||||
// });
|
||||
|
||||
['default', 'forest', 'dark', 'neutral'].forEach((theme) => {
|
||||
describe(theme, () => {
|
||||
it('should render a pie diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
pie title Sports in Sweden
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
"Bandy" : 40
|
||||
"Ice-Hockey" : 80
|
||||
"Football" : 90
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a flowchart diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0} }%%
|
||||
graph TD
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
B --> G[/Another/]
|
||||
C ==>|One| D[Laptop]
|
||||
C -->|Two| E[iPhone]
|
||||
C -->|Three| F[fa:fa-car Car]
|
||||
subgraph section
|
||||
C
|
||||
D
|
||||
E
|
||||
F
|
||||
G
|
||||
end
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a new flowchart diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': '${theme}'} }%%
|
||||
flowchart TD
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
A[Christmas] -->|Get money| B(Go shopping)
|
||||
B --> C{Let me think}
|
||||
B --> G[Another]
|
||||
C ==>|One| D[Laptop]
|
||||
C x--x|Two| E[iPhone]
|
||||
C o--o|Three| F[fa:fa-car Car]
|
||||
subgraph section
|
||||
C
|
||||
D
|
||||
E
|
||||
F
|
||||
G
|
||||
end
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a sequence diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': '${theme}'} }%%
|
||||
sequenceDiagram
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
autonumber
|
||||
par Action 1
|
||||
Alice->>John: Hello John, how are you?
|
||||
and Action 2
|
||||
Alice->>Bob: Hello Bob, how are you?
|
||||
end
|
||||
Alice->>+John: Hello John, how are you?
|
||||
Alice->>+John: John, can you hear me?
|
||||
John-->>-Alice: Hi Alice, I can hear you!
|
||||
Note right of John: John is perceptive
|
||||
John-->>-Alice: I feel great!
|
||||
loop Every minute
|
||||
John-->Alice: Great!
|
||||
end
|
||||
|
||||
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
|
||||
it('should render a class diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': '${theme}'} }%%
|
||||
classDiagram
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
Animal "*" <|-- "1" Duck
|
||||
Animal "1" <|-- "10" Fish
|
||||
Animal <|-- Zebra
|
||||
Animal : +int age
|
||||
Animal : +String gender
|
||||
Animal: +isMammal()
|
||||
Animal: +mate()
|
||||
class Duck{
|
||||
+String beakColor
|
||||
+swim()
|
||||
+quack()
|
||||
}
|
||||
class Fish{
|
||||
-int sizeInFeet
|
||||
-canEat()
|
||||
}
|
||||
class Zebra{
|
||||
+bool is_wild
|
||||
+run()
|
||||
}
|
||||
classA <|-- classB
|
||||
classC *-- classD
|
||||
classE o-- classF
|
||||
classG <-- classH
|
||||
classI -- classJ
|
||||
classK <.. classL
|
||||
classM <|.. classN
|
||||
classO .. classP
|
||||
classA --|> classB : Inheritance
|
||||
classC --* classD : Composition
|
||||
classE --o classF : Aggregation
|
||||
classG --> classH : Association
|
||||
classI -- classJ : Link(Solid)
|
||||
classK ..> classL : Dependency
|
||||
classM ..|> classN : Realization
|
||||
classO .. classP : Link(Dashed)
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a state diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': '${theme}'} }%%
|
||||
stateDiagram
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
[*] --> Active
|
||||
|
||||
state Active {
|
||||
[*] --> NumLockOff
|
||||
NumLockOff --> NumLockOn : EvNumLockPressed
|
||||
NumLockOn --> NumLockOff : EvNumLockPressed
|
||||
--
|
||||
[*] --> CapsLockOff
|
||||
CapsLockOff --> CapsLockOn : EvCapsLockPressed
|
||||
CapsLockOn --> CapsLockOff : EvCapsLockPressed
|
||||
--
|
||||
[*] --> ScrollLockOff
|
||||
ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
|
||||
ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
|
||||
}
|
||||
state SomethingElse {
|
||||
A --> B
|
||||
B --> A
|
||||
}
|
||||
|
||||
Active --> SomethingElse
|
||||
note right of SomethingElse : This is the note to the right.
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a state diagram (v2)', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': '${theme}'} }%%
|
||||
stateDiagram-v2
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
[*] --> Active
|
||||
|
||||
state Active {
|
||||
[*] --> NumLockOff
|
||||
NumLockOff --> NumLockOn : EvNumLockPressed
|
||||
NumLockOn --> NumLockOff : EvNumLockPressed
|
||||
--
|
||||
[*] --> CapsLockOff
|
||||
CapsLockOff --> CapsLockOn : EvCapsLockPressed
|
||||
CapsLockOn --> CapsLockOff : EvCapsLockPressed
|
||||
--
|
||||
[*] --> ScrollLockOff
|
||||
ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
|
||||
ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
|
||||
}
|
||||
state SomethingElse {
|
||||
A --> B
|
||||
B --> A
|
||||
}
|
||||
|
||||
Active --> SomethingElse2
|
||||
note right of SomethingElse2 : This is the note to the right.
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a er diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
erDiagram
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
||||
CUSTOMER ||--o{ ORDER : places
|
||||
CUSTOMER ||--o{ INVOICE : "liable for"
|
||||
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
||||
INVOICE ||--|{ ORDER : covers
|
||||
ORDER ||--|{ ORDER-ITEM : includes
|
||||
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
||||
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
||||
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a user journey diagram', () => {
|
||||
imgSnapshotTest(
|
||||
`
|
||||
%%{init: { 'logLevel': 0, 'theme': '${theme}'} }%%
|
||||
journey
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
title My working day
|
||||
section Go to work
|
||||
Make tea: 5: Me
|
||||
Go upstairs: 3: Me
|
||||
Do work: 1: Me, Cat
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 5: Me
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
it('should render a gantt diagram', () => {
|
||||
cy.clock(new Date('2014-01-06').getTime());
|
||||
imgSnapshotTest(
|
||||
`
|
||||
gantt
|
||||
accTitle: This is a title
|
||||
accDescr: This is a description
|
||||
|
||||
dateFormat :YYYY-MM-DD
|
||||
title :Adding GANTT diagram functionality to mermaid
|
||||
excludes :excludes the named dates/days from being included in a charted task..
|
||||
section A section
|
||||
Completed task :done, des1, 2014-01-06,2014-01-08
|
||||
Active task :active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
|
||||
section Critical tasks
|
||||
Completed task in the critical line :crit, done, 2014-01-06,24h
|
||||
Implement parser and jison :crit, done, after des1, 2d
|
||||
Create tests for parser :crit, active, 3d
|
||||
Future task in critical line :crit, 5d
|
||||
Create tests for renderer :2d
|
||||
Add to mermaid :1d
|
||||
|
||||
section Documentation
|
||||
Describe gantt syntax :active, a1, after des1, 3d
|
||||
Add gantt diagram to demo page :after a1 , 20h
|
||||
Add another diagram to demo page :doc1, after a1 , 48h
|
||||
|
||||
section Last section
|
||||
Describe gantt syntax :after doc1, 3d
|
||||
Add gantt diagram to demo page :20h
|
||||
Add another diagram to demo page :48h
|
||||
`,
|
||||
{ theme }
|
||||
);
|
||||
cy.get('svg');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
61
cypress/platform/bundle-test.js
Normal file
61
cypress/platform/bundle-test.js
Normal file
@@ -0,0 +1,61 @@
|
||||
import mermaid from '../../packages/mermaid/src/mermaid';
|
||||
|
||||
let code = `flowchart LR
|
||||
Power_Supply --> Transmitter_A
|
||||
Power_Supply --> Transmitter_B
|
||||
Transmitter_A --> D
|
||||
Transmitter_B --> D`;
|
||||
|
||||
let code2 = `gantt
|
||||
dateFormat YYYY-MM-DD
|
||||
title Adding GANTT diagram functionality to mermaid
|
||||
section A section
|
||||
Completed task :done, des1, 2014-01-06,2014-01-08
|
||||
Active task :active, des2, 2014-01-09, 3d
|
||||
Future task : des3, after des2, 5d
|
||||
Future task2 : des4, after des3, 5d
|
||||
section Critical tasks
|
||||
Completed task in the critical line :crit, done, 2014-01-06,24h
|
||||
Implement parser and jison :crit, done, after des1, 2d
|
||||
Create tests for parser :crit, active, 3d
|
||||
Future task in critical line :crit, 5d
|
||||
Create tests for renderer :2d
|
||||
Add to mermaid :1d`;
|
||||
|
||||
const code3 = `flowchart TD
|
||||
A(<img scr='https://iconscout.com/ms-icon-310x310.png' width='20' height='20' />)
|
||||
B(<b>Bold text!</b>)`;
|
||||
|
||||
if (location.href.match('test-html-escaping')) {
|
||||
code = code3;
|
||||
}
|
||||
|
||||
mermaid.initialize({
|
||||
theme: 'default',
|
||||
// fontFamily: '"Lucida Console", Monaco, monospace',
|
||||
startOnLoad: false,
|
||||
securityLevel: 'loose',
|
||||
flowchart: {
|
||||
htmlLabels: true,
|
||||
},
|
||||
gantt: {
|
||||
axisFormatter: [
|
||||
[
|
||||
'%Y-%m-%d',
|
||||
(d) => {
|
||||
return d.getDay() === 1;
|
||||
},
|
||||
],
|
||||
],
|
||||
},
|
||||
});
|
||||
mermaid.render(
|
||||
'the-id-of-the-svg',
|
||||
code,
|
||||
(svg) => {
|
||||
console.log(svg);
|
||||
const elem = document.querySelector('#graph-to-be');
|
||||
elem.innerHTML = svg;
|
||||
}
|
||||
// ,document.querySelector('#tmp')
|
||||
);
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user