Shopify / seafoam

A tool for working with compiler graphs dumped by the GraalVM compiler
MIT License
126 stars 22 forks source link

Basic Mermaid styling #61

Closed chrisseaton closed 2 years ago

chrisseaton commented 2 years ago

Before:

flowchart TD
  node0["Start"]
  node1["P(0)"]
  node2["P(1)"]
  node3["P(2)"]
  node4["P(3)"]
  node5["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:187"]
  node6["C(-1)"]
  node7["MethodCallTarget"]
  node8["Call String.hashCode"]
  node9["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:187"]
  node10["IntegerSwitch [97299, 101574]"]
  node11["Begin"]
  node12["Begin"]
  node13["Begin"]
  node14["C(instance:String)"]
  node15["IsNull"]
  node16["Guard not, else NullCheckException"]
  node17["π"]
  node19["If"]
  node20["=="]
  node21["Begin"]
  node22["Begin"]
  node23["If"]
  node24["InstanceOf a!# java.lang.String"]
  node25["Begin"]
  node26["Begin"]
  node28["C(0)"]
  node29["Guard, else ClassCastException"]
  node30["InstanceOf a# java.lang.String"]
  node31["LoadField String.coder"]
  node32["LoadField String.coder"]
  node33["π"]
  node34["If"]
  node35["=="]
  node36["Begin"]
  node37["Begin"]
  node39["Guard not, else NullCheckException"]
  node40["IsNull"]
  node41["LoadField String.value"]
  node42["π"]
  node43["Guard not, else NullCheckException"]
  node44["IsNull"]
  node45["LoadField String.value"]
  node46["π"]
  node47["ArrayLength"]
  node48["ArrayLength"]
  node49["If"]
  node50["=="]
  node51["Begin"]
  node52["Begin"]
  node54["ArrayLength"]
  node55["If"]
  node56["=="]
  node57["Begin"]
  node58["Begin"]
  node59["ArrayLength"]
  node60["ArrayEquals"]
  node63["C(1)"]
  node65["Merge"]
  node66["End"]
  node67["End"]
  node68["End"]
  node69["ϕ"]
  node70["End"]
  node71["End"]
  node72["End"]
  node73["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:187"]
  node74["=="]
  node75["Guard not, else UnreachedCode"]
  node76["End"]
  node77["Merge"]
  node78["End"]
  node79["ϕ"]
  node80["C(instance:String)"]
  node81["Guard not, else NullCheckException"]
  node82["π"]
  node84["If"]
  node85["=="]
  node86["Begin"]
  node87["Begin"]
  node88["If"]
  node89["InstanceOf a!# java.lang.String"]
  node90["Begin"]
  node91["Begin"]
  node93["Guard, else ClassCastException"]
  node94["InstanceOf a# java.lang.String"]
  node95["LoadField String.coder"]
  node96["LoadField String.coder"]
  node97["π"]
  node98["If"]
  node99["=="]
  node100["Begin"]
  node101["Begin"]
  node103["Guard not, else NullCheckException"]
  node104["IsNull"]
  node105["LoadField String.value"]
  node106["π"]
  node107["Guard not, else NullCheckException"]
  node108["IsNull"]
  node109["LoadField String.value"]
  node110["π"]
  node111["ArrayLength"]
  node112["ArrayLength"]
  node113["If"]
  node114["=="]
  node115["Begin"]
  node116["Begin"]
  node118["ArrayLength"]
  node119["If"]
  node120["=="]
  node121["Begin"]
  node122["Begin"]
  node123["ArrayLength"]
  node124["ArrayEquals"]
  node128["Merge"]
  node129["End"]
  node130["End"]
  node131["End"]
  node132["ϕ"]
  node133["End"]
  node134["End"]
  node135["End"]
  node136["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:187"]
  node137["=="]
  node138["Guard not, else UnreachedCode"]
  node139["End"]
  node140["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:187"]
  node141["IntegerSwitch [0, 1]"]
  node142["Begin"]
  node143["Begin"]
  node144["Begin"]
  node145["StoreField JavaExamples.intField"]
  node146["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:198"]
  node148["StoreField JavaExamples.intField"]
  node149["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:194"]
  node150["End"]
  node151["Merge"]
  node152["End"]
  node153["ϕ"]
  node154["StoreField JavaExamples.intField"]
  node155["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:190"]
  node156["End"]
  node157["FrameState JavaExamples#exampleStringSwitch JavaExamples.java:201"]
  node158["Return"]
  node5 --> node0
  node0 --> node8
  node1 --> node5
  node2 --> node5
  node3 --> node5
  node4 --> node5
  node1 --> node7
  node9 --> node8
  node7 --> node8
  node8 --> node10
  node2 --> node9
  node3 --> node9
  node4 --> node9
  node1 --> node9
  node6 --> node9
  node8 --> node9
  node8 --> node10
  node1 --> node15
  node15 --> node16
  node16 --> node19
  node16 --> node17
  node1 --> node17
  node20 --> node19
  node14 --> node20
  node24 --> node23
  node14 --> node24
  node30 --> node29
  node29 --> node31
  node14 --> node30
  node31 --> node32
  node32 --> node34
  node29 --> node33
  node14 --> node33
  node35 --> node34
  node31 --> node35
  node32 --> node35
  node40 --> node39
  node39 --> node41
  node41 --> node43
  node39 --> node42
  node44 --> node43
  node43 --> node45
  node45 --> node47
  node43 --> node46
  node41 --> node47
  node47 --> node48
  node45 --> node48
  node48 --> node49
  node50 --> node49
  node47 --> node50
  node48 --> node50
  node41 --> node54
  node54 --> node55
  node56 --> node55
  node54 --> node56
  node28 --> node56
  node41 --> node59
  node59 --> node60
  node41 --> node60
  node45 --> node60
  node59 --> node60
  node73 --> node65
  node65 --> node75
  node65 --> node69
  node28 --> node69
  node28 --> node69
  node28 --> node69
  node60 --> node69
  node63 --> node69
  node63 --> node69
  node2 --> node73
  node3 --> node73
  node4 --> node73
  node6 --> node73
  node69 --> node73
  node69 --> node74
  node28 --> node74
  node74 --> node75
  node140 --> node77
  node77 --> node141
  node77 --> node79
  node6 --> node79
  node63 --> node79
  node28 --> node79
  node15 --> node81
  node81 --> node84
  node81 --> node82
  node1 --> node82
  node85 --> node84
  node80 --> node85
  node89 --> node88
  node80 --> node89
  node94 --> node93
  node93 --> node95
  node80 --> node94
  node95 --> node96
  node96 --> node98
  node93 --> node97
  node80 --> node97
  node99 --> node98
  node95 --> node99
  node96 --> node99
  node104 --> node103
  node103 --> node105
  node105 --> node107
  node103 --> node106
  node108 --> node107
  node107 --> node109
  node109 --> node111
  node107 --> node110
  node105 --> node111
  node111 --> node112
  node109 --> node112
  node112 --> node113
  node114 --> node113
  node111 --> node114
  node112 --> node114
  node105 --> node118
  node118 --> node119
  node120 --> node119
  node118 --> node120
  node28 --> node120
  node105 --> node123
  node123 --> node124
  node105 --> node124
  node109 --> node124
  node123 --> node124
  node136 --> node128
  node128 --> node138
  node128 --> node132
  node28 --> node132
  node28 --> node132
  node28 --> node132
  node124 --> node132
  node63 --> node132
  node63 --> node132
  node2 --> node136
  node3 --> node136
  node4 --> node136
  node6 --> node136
  node132 --> node136
  node132 --> node137
  node28 --> node137
  node137 --> node138
  node2 --> node140
  node3 --> node140
  node4 --> node140
  node79 --> node140
  node79 --> node141
  node4 --> node145
  node146 --> node145
  node4 --> node146
  node3 --> node148
  node149 --> node148
  node3 --> node149
  node157 --> node151
  node151 --> node158
  node151 --> node153
  node4 --> node153
  node3 --> node153
  node2 --> node153
  node2 --> node154
  node155 --> node154
  node2 --> node155
  node153 --> node157
  node153 --> node158
  node1 --> node20
  node1 --> node31
  node14 --> node32
  node1 --> node40
  node1 --> node42
  node14 --> node44
  node14 --> node46
  node1 --> node85
  node1 --> node95
  node80 --> node96
  node1 --> node104
  node1 --> node106
  node80 --> node108
  node80 --> node110
  node1 --> node41
  node14 --> node45
  node1 --> node105
  node80 --> node109
  node10 --> node16
  node10 --> node81
  node19 --> node23
  node23 --> node29
  node34 --> node39
  node49 --> node54
  node55 --> node59
  node23 --> node65
  node34 --> node65
  node49 --> node65
  node60 --> node65
  node55 --> node65
  node19 --> node65
  node10 --> node77
  node75 --> node77
  node84 --> node88
  node88 --> node93
  node98 --> node103
  node113 --> node118
  node119 --> node123
  node88 --> node128
  node98 --> node128
  node113 --> node128
  node124 --> node128
  node119 --> node128
  node84 --> node128
  node138 --> node77
  node141 --> node154
  node141 --> node148
  node141 --> node145
  node145 --> node151
  node148 --> node151
  node154 --> node151

After:

flowchart TD
  subgraph B0
    node0("0 Start")
    style node0 fill:#e98693,stroke:black,color:#1a1919;
    node7("7 MethodCallTarget")
    style node7 fill:#f9f9f9,stroke:black,color:#1a1919;
    node8("8 Call String.hashCode")
    style node8 fill:#da2d4f,stroke:black,color:#ffffff;
    node15{{"15 IsNull"}}
    style node15 fill:#3cb4a4,stroke:black,color:#1a1919;
    node10("10 IntegerSwitch [97299, 101574]")
    style node10 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B1
    node16("16 Guard not, else NullCheckException")
    style node16 fill:#ffa500,stroke:black,color:#1a1919;
    node20{{"20 =="}}
    style node20 fill:#3cb4a4,stroke:black,color:#1a1919;
    node19("19 If")
    style node19 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B3
    node24("24 InstanceOf a!# java.lang.String")
    style node24 fill:#f9f9f9,stroke:black,color:#1a1919;
    node23("23 If")
    style node23 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B4
    node30("30 InstanceOf a# java.lang.String")
    style node30 fill:#f9f9f9,stroke:black,color:#1a1919;
    node29("29 Guard, else ClassCastException")
    style node29 fill:#ffa500,stroke:black,color:#1a1919;
    node31("31 LoadField String.coder")
    style node31 fill:#c39bd3,stroke:black,color:#1a1919;
    node32("32 LoadField String.coder")
    style node32 fill:#c39bd3,stroke:black,color:#1a1919;
    node35{{"35 =="}}
    style node35 fill:#3cb4a4,stroke:black,color:#1a1919;
    node34("34 If")
    style node34 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B5
    node40{{"40 IsNull"}}
    style node40 fill:#3cb4a4,stroke:black,color:#1a1919;
    node39("39 Guard not, else NullCheckException")
    style node39 fill:#ffa500,stroke:black,color:#1a1919;
    node41("41 LoadField String.value")
    style node41 fill:#c39bd3,stroke:black,color:#1a1919;
    node44{{"44 IsNull"}}
    style node44 fill:#3cb4a4,stroke:black,color:#1a1919;
    node43("43 Guard not, else NullCheckException")
    style node43 fill:#ffa500,stroke:black,color:#1a1919;
    node45("45 LoadField String.value")
    style node45 fill:#c39bd3,stroke:black,color:#1a1919;
    node47("47 ArrayLength")
    style node47 fill:#c39bd3,stroke:black,color:#1a1919;
    node48("48 ArrayLength")
    style node48 fill:#c39bd3,stroke:black,color:#1a1919;
    node50{{"50 =="}}
    style node50 fill:#3cb4a4,stroke:black,color:#1a1919;
    node49("49 If")
    style node49 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B6
    node54("54 ArrayLength")
    style node54 fill:#c39bd3,stroke:black,color:#1a1919;
    node56{{"56 =="}}
    style node56 fill:#3cb4a4,stroke:black,color:#1a1919;
    node55("55 If")
    style node55 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B8
    node59("59 ArrayLength")
    style node59 fill:#c39bd3,stroke:black,color:#1a1919;
    node60("60 ArrayEquals")
    style node60 fill:#c39bd3,stroke:black,color:#1a1919;
  end
  subgraph B12
    node65("65 Merge")
    style node65 fill:#e98693,stroke:black,color:#1a1919;
    node74{{"74 =="}}
    style node74 fill:#3cb4a4,stroke:black,color:#1a1919;
    node75("75 Guard not, else UnreachedCode")
    style node75 fill:#ffa500,stroke:black,color:#1a1919;
    node69("69 ϕ")
    style node69 fill:#f9f9f9,stroke:black,color:#1a1919;
  end
  subgraph B13
    node81("81 Guard not, else NullCheckException")
    style node81 fill:#ffa500,stroke:black,color:#1a1919;
    node85{{"85 =="}}
    style node85 fill:#3cb4a4,stroke:black,color:#1a1919;
    node84("84 If")
    style node84 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B15
    node89("89 InstanceOf a!# java.lang.String")
    style node89 fill:#f9f9f9,stroke:black,color:#1a1919;
    node88("88 If")
    style node88 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B16
    node94("94 InstanceOf a# java.lang.String")
    style node94 fill:#f9f9f9,stroke:black,color:#1a1919;
    node93("93 Guard, else ClassCastException")
    style node93 fill:#ffa500,stroke:black,color:#1a1919;
    node95("95 LoadField String.coder")
    style node95 fill:#c39bd3,stroke:black,color:#1a1919;
    node96("96 LoadField String.coder")
    style node96 fill:#c39bd3,stroke:black,color:#1a1919;
    node99{{"99 =="}}
    style node99 fill:#3cb4a4,stroke:black,color:#1a1919;
    node98("98 If")
    style node98 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B17
    node104{{"104 IsNull"}}
    style node104 fill:#3cb4a4,stroke:black,color:#1a1919;
    node103("103 Guard not, else NullCheckException")
    style node103 fill:#ffa500,stroke:black,color:#1a1919;
    node105("105 LoadField String.value")
    style node105 fill:#c39bd3,stroke:black,color:#1a1919;
    node108{{"108 IsNull"}}
    style node108 fill:#3cb4a4,stroke:black,color:#1a1919;
    node107("107 Guard not, else NullCheckException")
    style node107 fill:#ffa500,stroke:black,color:#1a1919;
    node109("109 LoadField String.value")
    style node109 fill:#c39bd3,stroke:black,color:#1a1919;
    node111("111 ArrayLength")
    style node111 fill:#c39bd3,stroke:black,color:#1a1919;
    node112("112 ArrayLength")
    style node112 fill:#c39bd3,stroke:black,color:#1a1919;
    node114{{"114 =="}}
    style node114 fill:#3cb4a4,stroke:black,color:#1a1919;
    node113("113 If")
    style node113 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B18
    node118("118 ArrayLength")
    style node118 fill:#c39bd3,stroke:black,color:#1a1919;
    node120{{"120 =="}}
    style node120 fill:#3cb4a4,stroke:black,color:#1a1919;
    node119("119 If")
    style node119 fill:#e98693,stroke:black,color:#1a1919;
  end
  subgraph B20
    node123("123 ArrayLength")
    style node123 fill:#c39bd3,stroke:black,color:#1a1919;
    node124("124 ArrayEquals")
    style node124 fill:#c39bd3,stroke:black,color:#1a1919;
  end
  subgraph B24
    node128("128 Merge")
    style node128 fill:#e98693,stroke:black,color:#1a1919;
    node137{{"137 =="}}
    style node137 fill:#3cb4a4,stroke:black,color:#1a1919;
    node138("138 Guard not, else UnreachedCode")
    style node138 fill:#ffa500,stroke:black,color:#1a1919;
    node132("132 ϕ")
    style node132 fill:#f9f9f9,stroke:black,color:#1a1919;
  end
  subgraph B26
    node77("77 Merge")
    style node77 fill:#e98693,stroke:black,color:#1a1919;
    node141("141 IntegerSwitch [0, 1]")
    style node141 fill:#e98693,stroke:black,color:#1a1919;
    node79("79 ϕ")
    style node79 fill:#f9f9f9,stroke:black,color:#1a1919;
  end
  subgraph B27
    node154("154 StoreField JavaExamples.intField")
    style node154 fill:#c39bd3,stroke:black,color:#1a1919;
  end
  subgraph B28
    node148("148 StoreField JavaExamples.intField")
    style node148 fill:#c39bd3,stroke:black,color:#1a1919;
  end
  subgraph B29
    node145("145 StoreField JavaExamples.intField")
    style node145 fill:#c39bd3,stroke:black,color:#1a1919;
  end
  subgraph B30
    node151("151 Merge")
    style node151 fill:#e98693,stroke:black,color:#1a1919;
    node158("158 Return")
    style node158 fill:#e98693,stroke:black,color:#1a1919;
    node153("153 ϕ")
    style node153 fill:#f9f9f9,stroke:black,color:#1a1919;
  end
  node0 --> node8
  linkStyle 0 stroke:#da2d4f,stroke-width:2px;
  inline1x7(["1 P(0)"])
  style inline1x7 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x7 --> node7
  linkStyle 1 stroke:#3cb4a4,stroke-width:px;
  node7 --> node8
  linkStyle 2 stroke:#343d46,stroke-width:px;
  node8 --> node10
  linkStyle 3 stroke:#da2d4f,stroke-width:2px;
  node8 --> node10
  linkStyle 4 stroke:#3cb4a4,stroke-width:px;
  inline1x15(["1 P(0)"])
  style inline1x15 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x15 --> node15
  linkStyle 5 stroke:#3cb4a4,stroke-width:px;
  node15 --> node16
  linkStyle 6 stroke:#3cb4a4,stroke-width:px;
  node16 --> node19
  linkStyle 7 stroke:#da2d4f,stroke-width:2px;
  node20 --> node19
  linkStyle 8 stroke:#3cb4a4,stroke-width:px;
  inline14x20(["14 C(instance:String)"])
  style inline14x20 fill:#d7ede7,stroke:black,color:#1a1919;
  inline14x20 --> node20
  linkStyle 9 stroke:#3cb4a4,stroke-width:px;
  node24 --> node23
  linkStyle 10 stroke:#3cb4a4,stroke-width:px;
  inline14x24(["14 C(instance:String)"])
  style inline14x24 fill:#d7ede7,stroke:black,color:#1a1919;
  inline14x24 --> node24
  linkStyle 11 stroke:#3cb4a4,stroke-width:px;
  node30 --> node29
  linkStyle 12 stroke:#3cb4a4,stroke-width:px;
  node29 --> node31
  linkStyle 13 stroke:#da2d4f,stroke-width:2px;
  inline14x30(["14 C(instance:String)"])
  style inline14x30 fill:#d7ede7,stroke:black,color:#1a1919;
  inline14x30 --> node30
  linkStyle 14 stroke:#3cb4a4,stroke-width:px;
  node31 --> node32
  linkStyle 15 stroke:#da2d4f,stroke-width:2px;
  node32 --> node34
  linkStyle 16 stroke:#da2d4f,stroke-width:2px;
  node35 --> node34
  linkStyle 17 stroke:#3cb4a4,stroke-width:px;
  node31 --> node35
  linkStyle 18 stroke:#3cb4a4,stroke-width:px;
  node32 --> node35
  linkStyle 19 stroke:#3cb4a4,stroke-width:px;
  node40 --> node39
  linkStyle 20 stroke:#3cb4a4,stroke-width:px;
  node39 --> node41
  linkStyle 21 stroke:#da2d4f,stroke-width:2px;
  node41 --> node43
  linkStyle 22 stroke:#da2d4f,stroke-width:2px;
  node44 --> node43
  linkStyle 23 stroke:#3cb4a4,stroke-width:px;
  node43 --> node45
  linkStyle 24 stroke:#da2d4f,stroke-width:2px;
  node45 --> node47
  linkStyle 25 stroke:#da2d4f,stroke-width:2px;
  node41 --> node47
  linkStyle 26 stroke:#3cb4a4,stroke-width:px;
  node47 --> node48
  linkStyle 27 stroke:#da2d4f,stroke-width:2px;
  node45 --> node48
  linkStyle 28 stroke:#3cb4a4,stroke-width:px;
  node48 --> node49
  linkStyle 29 stroke:#da2d4f,stroke-width:2px;
  node50 --> node49
  linkStyle 30 stroke:#3cb4a4,stroke-width:px;
  node47 --> node50
  linkStyle 31 stroke:#3cb4a4,stroke-width:px;
  node48 --> node50
  linkStyle 32 stroke:#3cb4a4,stroke-width:px;
  node41 --> node54
  linkStyle 33 stroke:#3cb4a4,stroke-width:px;
  node54 --> node55
  linkStyle 34 stroke:#da2d4f,stroke-width:2px;
  node56 --> node55
  linkStyle 35 stroke:#3cb4a4,stroke-width:px;
  node54 --> node56
  linkStyle 36 stroke:#3cb4a4,stroke-width:px;
  inline28x56(["28 C(0)"])
  style inline28x56 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x56 --> node56
  linkStyle 37 stroke:#3cb4a4,stroke-width:px;
  node41 --> node59
  linkStyle 38 stroke:#3cb4a4,stroke-width:px;
  node59 --> node60
  linkStyle 39 stroke:#da2d4f,stroke-width:2px;
  node41 --> node60
  linkStyle 40 stroke:#3cb4a4,stroke-width:px;
  node45 --> node60
  linkStyle 41 stroke:#3cb4a4,stroke-width:px;
  node59 --> node60
  linkStyle 42 stroke:#3cb4a4,stroke-width:px;
  node65 --> node75
  linkStyle 43 stroke:#da2d4f,stroke-width:2px;
  node65 --> node69
  linkStyle 44 stroke:#343d46,stroke-width:px;
  inline28x69(["28 C(0)"])
  style inline28x69 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x69 --> node69
  linkStyle 45 stroke:#3cb4a4,stroke-width:px;
  inline28x69(["28 C(0)"])
  style inline28x69 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x69 --> node69
  linkStyle 46 stroke:#3cb4a4,stroke-width:px;
  inline28x69(["28 C(0)"])
  style inline28x69 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x69 --> node69
  linkStyle 47 stroke:#3cb4a4,stroke-width:px;
  node60 --> node69
  linkStyle 48 stroke:#3cb4a4,stroke-width:px;
  inline63x69(["63 C(1)"])
  style inline63x69 fill:#d7ede7,stroke:black,color:#1a1919;
  inline63x69 --> node69
  linkStyle 49 stroke:#3cb4a4,stroke-width:px;
  inline63x69(["63 C(1)"])
  style inline63x69 fill:#d7ede7,stroke:black,color:#1a1919;
  inline63x69 --> node69
  linkStyle 50 stroke:#3cb4a4,stroke-width:px;
  node69 --> node74
  linkStyle 51 stroke:#3cb4a4,stroke-width:px;
  inline28x74(["28 C(0)"])
  style inline28x74 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x74 --> node74
  linkStyle 52 stroke:#3cb4a4,stroke-width:px;
  node74 --> node75
  linkStyle 53 stroke:#3cb4a4,stroke-width:px;
  node77 --> node141
  linkStyle 54 stroke:#da2d4f,stroke-width:2px;
  node77 --> node79
  linkStyle 55 stroke:#343d46,stroke-width:px;
  inline6x79(["6 C(-1)"])
  style inline6x79 fill:#d7ede7,stroke:black,color:#1a1919;
  inline6x79 --> node79
  linkStyle 56 stroke:#3cb4a4,stroke-width:px;
  inline63x79(["63 C(1)"])
  style inline63x79 fill:#d7ede7,stroke:black,color:#1a1919;
  inline63x79 --> node79
  linkStyle 57 stroke:#3cb4a4,stroke-width:px;
  inline28x79(["28 C(0)"])
  style inline28x79 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x79 --> node79
  linkStyle 58 stroke:#3cb4a4,stroke-width:px;
  node15 --> node81
  linkStyle 59 stroke:#3cb4a4,stroke-width:px;
  node81 --> node84
  linkStyle 60 stroke:#da2d4f,stroke-width:2px;
  node85 --> node84
  linkStyle 61 stroke:#3cb4a4,stroke-width:px;
  inline80x85(["80 C(instance:String)"])
  style inline80x85 fill:#d7ede7,stroke:black,color:#1a1919;
  inline80x85 --> node85
  linkStyle 62 stroke:#3cb4a4,stroke-width:px;
  node89 --> node88
  linkStyle 63 stroke:#3cb4a4,stroke-width:px;
  inline80x89(["80 C(instance:String)"])
  style inline80x89 fill:#d7ede7,stroke:black,color:#1a1919;
  inline80x89 --> node89
  linkStyle 64 stroke:#3cb4a4,stroke-width:px;
  node94 --> node93
  linkStyle 65 stroke:#3cb4a4,stroke-width:px;
  node93 --> node95
  linkStyle 66 stroke:#da2d4f,stroke-width:2px;
  inline80x94(["80 C(instance:String)"])
  style inline80x94 fill:#d7ede7,stroke:black,color:#1a1919;
  inline80x94 --> node94
  linkStyle 67 stroke:#3cb4a4,stroke-width:px;
  node95 --> node96
  linkStyle 68 stroke:#da2d4f,stroke-width:2px;
  node96 --> node98
  linkStyle 69 stroke:#da2d4f,stroke-width:2px;
  node99 --> node98
  linkStyle 70 stroke:#3cb4a4,stroke-width:px;
  node95 --> node99
  linkStyle 71 stroke:#3cb4a4,stroke-width:px;
  node96 --> node99
  linkStyle 72 stroke:#3cb4a4,stroke-width:px;
  node104 --> node103
  linkStyle 73 stroke:#3cb4a4,stroke-width:px;
  node103 --> node105
  linkStyle 74 stroke:#da2d4f,stroke-width:2px;
  node105 --> node107
  linkStyle 75 stroke:#da2d4f,stroke-width:2px;
  node108 --> node107
  linkStyle 76 stroke:#3cb4a4,stroke-width:px;
  node107 --> node109
  linkStyle 77 stroke:#da2d4f,stroke-width:2px;
  node109 --> node111
  linkStyle 78 stroke:#da2d4f,stroke-width:2px;
  node105 --> node111
  linkStyle 79 stroke:#3cb4a4,stroke-width:px;
  node111 --> node112
  linkStyle 80 stroke:#da2d4f,stroke-width:2px;
  node109 --> node112
  linkStyle 81 stroke:#3cb4a4,stroke-width:px;
  node112 --> node113
  linkStyle 82 stroke:#da2d4f,stroke-width:2px;
  node114 --> node113
  linkStyle 83 stroke:#3cb4a4,stroke-width:px;
  node111 --> node114
  linkStyle 84 stroke:#3cb4a4,stroke-width:px;
  node112 --> node114
  linkStyle 85 stroke:#3cb4a4,stroke-width:px;
  node105 --> node118
  linkStyle 86 stroke:#3cb4a4,stroke-width:px;
  node118 --> node119
  linkStyle 87 stroke:#da2d4f,stroke-width:2px;
  node120 --> node119
  linkStyle 88 stroke:#3cb4a4,stroke-width:px;
  node118 --> node120
  linkStyle 89 stroke:#3cb4a4,stroke-width:px;
  inline28x120(["28 C(0)"])
  style inline28x120 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x120 --> node120
  linkStyle 90 stroke:#3cb4a4,stroke-width:px;
  node105 --> node123
  linkStyle 91 stroke:#3cb4a4,stroke-width:px;
  node123 --> node124
  linkStyle 92 stroke:#da2d4f,stroke-width:2px;
  node105 --> node124
  linkStyle 93 stroke:#3cb4a4,stroke-width:px;
  node109 --> node124
  linkStyle 94 stroke:#3cb4a4,stroke-width:px;
  node123 --> node124
  linkStyle 95 stroke:#3cb4a4,stroke-width:px;
  node128 --> node138
  linkStyle 96 stroke:#da2d4f,stroke-width:2px;
  node128 --> node132
  linkStyle 97 stroke:#343d46,stroke-width:px;
  inline28x132(["28 C(0)"])
  style inline28x132 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x132 --> node132
  linkStyle 98 stroke:#3cb4a4,stroke-width:px;
  inline28x132(["28 C(0)"])
  style inline28x132 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x132 --> node132
  linkStyle 99 stroke:#3cb4a4,stroke-width:px;
  inline28x132(["28 C(0)"])
  style inline28x132 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x132 --> node132
  linkStyle 100 stroke:#3cb4a4,stroke-width:px;
  node124 --> node132
  linkStyle 101 stroke:#3cb4a4,stroke-width:px;
  inline63x132(["63 C(1)"])
  style inline63x132 fill:#d7ede7,stroke:black,color:#1a1919;
  inline63x132 --> node132
  linkStyle 102 stroke:#3cb4a4,stroke-width:px;
  inline63x132(["63 C(1)"])
  style inline63x132 fill:#d7ede7,stroke:black,color:#1a1919;
  inline63x132 --> node132
  linkStyle 103 stroke:#3cb4a4,stroke-width:px;
  node132 --> node137
  linkStyle 104 stroke:#3cb4a4,stroke-width:px;
  inline28x137(["28 C(0)"])
  style inline28x137 fill:#d7ede7,stroke:black,color:#1a1919;
  inline28x137 --> node137
  linkStyle 105 stroke:#3cb4a4,stroke-width:px;
  node137 --> node138
  linkStyle 106 stroke:#3cb4a4,stroke-width:px;
  node79 --> node141
  linkStyle 107 stroke:#3cb4a4,stroke-width:px;
  inline4x145(["4 P(3)"])
  style inline4x145 fill:#d7ede7,stroke:black,color:#1a1919;
  inline4x145 --> node145
  linkStyle 108 stroke:#3cb4a4,stroke-width:px;
  inline3x148(["3 P(2)"])
  style inline3x148 fill:#d7ede7,stroke:black,color:#1a1919;
  inline3x148 --> node148
  linkStyle 109 stroke:#3cb4a4,stroke-width:px;
  node151 --> node158
  linkStyle 110 stroke:#da2d4f,stroke-width:2px;
  node151 --> node153
  linkStyle 111 stroke:#343d46,stroke-width:px;
  inline4x153(["4 P(3)"])
  style inline4x153 fill:#d7ede7,stroke:black,color:#1a1919;
  inline4x153 --> node153
  linkStyle 112 stroke:#3cb4a4,stroke-width:px;
  inline3x153(["3 P(2)"])
  style inline3x153 fill:#d7ede7,stroke:black,color:#1a1919;
  inline3x153 --> node153
  linkStyle 113 stroke:#3cb4a4,stroke-width:px;
  inline2x153(["2 P(1)"])
  style inline2x153 fill:#d7ede7,stroke:black,color:#1a1919;
  inline2x153 --> node153
  linkStyle 114 stroke:#3cb4a4,stroke-width:px;
  inline2x154(["2 P(1)"])
  style inline2x154 fill:#d7ede7,stroke:black,color:#1a1919;
  inline2x154 --> node154
  linkStyle 115 stroke:#3cb4a4,stroke-width:px;
  node153 --> node158
  linkStyle 116 stroke:#3cb4a4,stroke-width:px;
  inline1x20(["1 P(0)"])
  style inline1x20 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x20 --> node20
  linkStyle 117 stroke:#3cb4a4,stroke-width:px;
  inline1x31(["1 P(0)"])
  style inline1x31 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x31 --> node31
  linkStyle 118 stroke:#3cb4a4,stroke-width:px;
  inline14x32(["14 C(instance:String)"])
  style inline14x32 fill:#d7ede7,stroke:black,color:#1a1919;
  inline14x32 --> node32
  linkStyle 119 stroke:#3cb4a4,stroke-width:px;
  inline1x40(["1 P(0)"])
  style inline1x40 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x40 --> node40
  linkStyle 120 stroke:#3cb4a4,stroke-width:px;
  inline14x44(["14 C(instance:String)"])
  style inline14x44 fill:#d7ede7,stroke:black,color:#1a1919;
  inline14x44 --> node44
  linkStyle 121 stroke:#3cb4a4,stroke-width:px;
  inline1x85(["1 P(0)"])
  style inline1x85 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x85 --> node85
  linkStyle 122 stroke:#3cb4a4,stroke-width:px;
  inline1x95(["1 P(0)"])
  style inline1x95 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x95 --> node95
  linkStyle 123 stroke:#3cb4a4,stroke-width:px;
  inline80x96(["80 C(instance:String)"])
  style inline80x96 fill:#d7ede7,stroke:black,color:#1a1919;
  inline80x96 --> node96
  linkStyle 124 stroke:#3cb4a4,stroke-width:px;
  inline1x104(["1 P(0)"])
  style inline1x104 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x104 --> node104
  linkStyle 125 stroke:#3cb4a4,stroke-width:px;
  inline80x108(["80 C(instance:String)"])
  style inline80x108 fill:#d7ede7,stroke:black,color:#1a1919;
  inline80x108 --> node108
  linkStyle 126 stroke:#3cb4a4,stroke-width:px;
  inline1x41(["1 P(0)"])
  style inline1x41 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x41 --> node41
  linkStyle 127 stroke:#3cb4a4,stroke-width:px;
  inline14x45(["14 C(instance:String)"])
  style inline14x45 fill:#d7ede7,stroke:black,color:#1a1919;
  inline14x45 --> node45
  linkStyle 128 stroke:#3cb4a4,stroke-width:px;
  inline1x105(["1 P(0)"])
  style inline1x105 fill:#d7ede7,stroke:black,color:#1a1919;
  inline1x105 --> node105
  linkStyle 129 stroke:#3cb4a4,stroke-width:px;
  inline80x109(["80 C(instance:String)"])
  style inline80x109 fill:#d7ede7,stroke:black,color:#1a1919;
  inline80x109 --> node109
  linkStyle 130 stroke:#3cb4a4,stroke-width:px;
  node10 --> node16
  linkStyle 131 stroke:#da2d4f,stroke-width:2px;
  node10 --> node81
  linkStyle 132 stroke:#da2d4f,stroke-width:2px;
  node19 --> node23
  linkStyle 133 stroke:#da2d4f,stroke-width:2px;
  node23 --> node29
  linkStyle 134 stroke:#da2d4f,stroke-width:2px;
  node34 --> node39
  linkStyle 135 stroke:#da2d4f,stroke-width:2px;
  node49 --> node54
  linkStyle 136 stroke:#da2d4f,stroke-width:2px;
  node55 --> node59
  linkStyle 137 stroke:#da2d4f,stroke-width:2px;
  node23 --> node65
  linkStyle 138 stroke:#da2d4f,stroke-width:2px;
  node34 --> node65
  linkStyle 139 stroke:#da2d4f,stroke-width:2px;
  node49 --> node65
  linkStyle 140 stroke:#da2d4f,stroke-width:2px;
  node60 --> node65
  linkStyle 141 stroke:#da2d4f,stroke-width:2px;
  node55 --> node65
  linkStyle 142 stroke:#da2d4f,stroke-width:2px;
  node19 --> node65
  linkStyle 143 stroke:#da2d4f,stroke-width:2px;
  node10 --> node77
  linkStyle 144 stroke:#da2d4f,stroke-width:2px;
  node75 --> node77
  linkStyle 145 stroke:#da2d4f,stroke-width:2px;
  node84 --> node88
  linkStyle 146 stroke:#da2d4f,stroke-width:2px;
  node88 --> node93
  linkStyle 147 stroke:#da2d4f,stroke-width:2px;
  node98 --> node103
  linkStyle 148 stroke:#da2d4f,stroke-width:2px;
  node113 --> node118
  linkStyle 149 stroke:#da2d4f,stroke-width:2px;
  node119 --> node123
  linkStyle 150 stroke:#da2d4f,stroke-width:2px;
  node88 --> node128
  linkStyle 151 stroke:#da2d4f,stroke-width:2px;
  node98 --> node128
  linkStyle 152 stroke:#da2d4f,stroke-width:2px;
  node113 --> node128
  linkStyle 153 stroke:#da2d4f,stroke-width:2px;
  node124 --> node128
  linkStyle 154 stroke:#da2d4f,stroke-width:2px;
  node119 --> node128
  linkStyle 155 stroke:#da2d4f,stroke-width:2px;
  node84 --> node128
  linkStyle 156 stroke:#da2d4f,stroke-width:2px;
  node138 --> node77
  linkStyle 157 stroke:#da2d4f,stroke-width:2px;
  node141 --> node154
  linkStyle 158 stroke:#da2d4f,stroke-width:2px;
  node141 --> node148
  linkStyle 159 stroke:#da2d4f,stroke-width:2px;
  node141 --> node145
  linkStyle 160 stroke:#da2d4f,stroke-width:2px;
  node145 --> node151
  linkStyle 161 stroke:#da2d4f,stroke-width:2px;
  node148 --> node151
  linkStyle 162 stroke:#da2d4f,stroke-width:2px;
  node154 --> node151
  linkStyle 163 stroke:#da2d4f,stroke-width:2px;

I liked Mermaid's default styling for clusters, so I actually adopted it for Graphviz as well.

Before:

before

After:

after