diff --git a/setup.py b/setup.py
index fca6988..d6427ef 100644
--- a/setup.py
+++ b/setup.py
@@ -24,6 +24,7 @@ setup(
"pytest==3.6.0",
"tabulate==0.8.2",
"selenium==3.12.0",
+ "lxml==4.2.4",
"pylint==1.9.2",
"pytest-pylint==0.9.0",
"cx-Freeze==5.1.1",
diff --git a/vasl_templates/webapp/static/snippets.js b/vasl_templates/webapp/static/snippets.js
index c50f2f8..66bed84 100644
--- a/vasl_templates/webapp/static/snippets.js
+++ b/vasl_templates/webapp/static/snippets.js
@@ -335,8 +335,11 @@ function make_raw_capability( name, capability )
{
// generate the raw capability string
var buf = [ name ] ;
- for ( var i=0 ; i < capability.length ; ++i )
- buf.push( escapeHTML(capability[i][0]), ""+escapeHTML(capability[i][1])+"" ) ;
+ for ( var i=0 ; i < capability.length ; ++i ) {
+ buf.push( escapeHTML( capability[i][0] ) ) ;
+ if ( capability[i][1] )
+ buf.push( "", escapeHTML( capability[i][1] ), "" ) ;
+ }
return buf.join( "" ) ;
}
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1940.txt
index 3b8364c..d8a95f0 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1940.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1940.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1940 ===
-Name Radio Crew survival Capabilities (effective) # Notes
------------------ ------- ------------------------------------ ------------------------------------------ ------------- ----- ---------------------
-T-37 ® CS 2 n/a n/a 1 H† M
-T-27 ® CS 2 n/a n/a 1.1† M Q
-T-40 ® CS 2 n/a n/a 2† H†
-T-50 ® CS 4 A4[2] n/a 3 n/a
-T-60 M40 ® CS 2 n/a n/a 4 n/a
-T-60 M42 ®† CS 2 n/a n/a 4 C†
-T-70 ®† CS 2 A4[2] n/a 5 C†
-T-26 M33 ® CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® CS 3 n/a n/a 6 D M P
-T-26 M31 ® CS 3 n/a n/a 6.1† M P
-T-26 M32 ® CS 3 n/a n/a 6.2† M P
-OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
-OT-133 ® CS 3 n/a n/a 7† M P
-BT-2A ® CS 3 n/a n/a 7.1† M
-BT-5 M34 ® CS 3 n/a n/a 8† M P
-BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
-BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® CS 5 s8 s8 11† M
-T-28 M34(L) ® CS 5 s8 s8 11.1† M
-T-28E M40 ® CS 6 s8 s8 12† M
-T-28E M40(L) ® CS 6 s8 s8 12.1† M
-T-34 M40 ® CS 5 n/a n/a 13 M
-T-34 M41 ®† CS 5 A4[2] n/a 14† C† M
-OT-34 ®† CS 4 A2[2] AP7 AP7 15† C† M
-T-34 M43 n/a CS 5 A4[2] n/a 16† n/a
-T-43 ®† CS 5 A4[2] n/a 17 C† M
-T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
-M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
-T-44 n/a CS 5 A6[5] n/a 20 B† M
-T-35 ® CS 8 s9 s9 21† M
-SMK n/a CS 7 n/a n/a 21.1 M T†
-T-100 n/a CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a CS 6 n/a n/a 22† M
-KV-1E n/a CS 6 n/a n/a 23 D M
-KV-1 M41 n/a CS 6 A4[2] n/a 23 D M
-KV-1 M42 n/a CS 6 A4[2] n/a 23 D M
-KV-2 n/a CS 7 AP9 AP9 24† M
-KV-8 n/a CS 6 A4[2] AP7 AP7 15† D M
-KV-1S n/a CS 6 A4[2] n/a 25† n/a
-KV-85 n/a CS 5 A4[3]5[4] n/a 26 B†
-IS-2 n/a CS 6 n/a n/a 27 B†
-IS-2m n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a CS 4 (brew up) A5[3] n/a 30† n/a
-SU-76i(g) n/a CS 5 A5[3] n/a 31 K
-SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a CS 6 s8 s8 34 G†
-ISU-152 n/a CS 6 n/a n/a 34 G†
-SU-85 n/a CS 5 A5[3] HE7 s7 HE7 s7 35 n/a
-SU-100 n/a CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a CS 4 A5[3] HE7 HE7 37 K
-BA-20 ® CS 3 n/a n/a 38 n/a
-BA-6 ® CS 4 A4[2] n/a 39 n/a
-BA-64B n/a CS 2 n/a n/a 40† A†
-ZSU-37 n/a CS 4 n/a n/a 41† A†
-SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
-LANO AT ® CS 5 A4[2+] n/a 44.1 n/a
-LANO AA ® CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a CS 2 n/a n/a 46 L†
-Komsomolet n/a CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a cs 6 n/a n/a 47 n/a
-ZIS-5 n/a cs 7 n/a n/a 47 n/a
-IAG-6 n/a cs 7 n/a n/a 47 n/a
-NKL-6 n/a CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a CS 4 C6 C6 48 N O LL
-Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a CS 5 (brew up) WP6[J4+]†[] s8 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a CS 7 D6[J4]7[5]†[] HE7[F3]8[4+]†[] sD6[4+] sM8† sM8† 53† N LL
-M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a cs 7 n/a n/a 60† n/a
+Name Radio Crew survival Capabilities (effective) # Notes
+----------------- ------- ------------------------------------ -------------------------------------- ------------- ----- ---------------------
+T-37 ® CS 2 n/a n/a 1 H† M
+T-27 ® CS 2 n/a n/a 1.1† M Q
+T-40 ® CS 2 n/a n/a 2† H†
+T-50 ® CS 4 A4[2] n/a 3 n/a
+T-60 M40 ® CS 2 n/a n/a 4 n/a
+T-60 M42 ®† CS 2 n/a n/a 4 C†
+T-70 ®† CS 2 A4[2] n/a 5 C†
+T-26 M33 ® CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® CS 3 n/a n/a 6 D M P
+T-26 M31 ® CS 3 n/a n/a 6.1† M P
+T-26 M32 ® CS 3 n/a n/a 6.2† M P
+OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
+OT-133 ® CS 3 n/a n/a 7† M P
+BT-2A ® CS 3 n/a n/a 7.1† M
+BT-5 M34 ® CS 3 n/a n/a 8† M P
+BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
+BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® CS 5 s8 s8 11† M
+T-28 M34(L) ® CS 5 s8 s8 11.1† M
+T-28E M40 ® CS 6 s8 s8 12† M
+T-28E M40(L) ® CS 6 s8 s8 12.1† M
+T-34 M40 ® CS 5 n/a n/a 13 M
+T-34 M41 ®† CS 5 A4[2] n/a 14† C† M
+OT-34 ®† CS 4 A2[2] AP7 AP7 15† C† M
+T-34 M43 n/a CS 5 A4[2] n/a 16† n/a
+T-43 ®† CS 5 A4[2] n/a 17 C† M
+T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
+M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
+T-44 n/a CS 5 A6[5] n/a 20 B† M
+T-35 ® CS 8 s9 s9 21† M
+SMK n/a CS 7 n/a n/a 21.1 M T†
+T-100 n/a CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a CS 6 n/a n/a 22† M
+KV-1E n/a CS 6 n/a n/a 23 D M
+KV-1 M41 n/a CS 6 A4[2] n/a 23 D M
+KV-1 M42 n/a CS 6 A4[2] n/a 23 D M
+KV-2 n/a CS 7 AP9 AP9 24† M
+KV-8 n/a CS 6 A4[2] AP7 AP7 15† D M
+KV-1S n/a CS 6 A4[2] n/a 25† n/a
+KV-85 n/a CS 5 A4[3]5[4] n/a 26 B†
+IS-2 n/a CS 6 n/a n/a 27 B†
+IS-2m n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a CS 4 (brew up) A5[3] n/a 30† n/a
+SU-76i(g) n/a CS 5 A5[3] n/a 31 K
+SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a CS 6 s8 s8 34 G†
+ISU-152 n/a CS 6 n/a n/a 34 G†
+SU-85 n/a CS 5 A5[3] HE7 s7 HE7 s7 35 n/a
+SU-100 n/a CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a CS 4 A5[3] HE7 HE7 37 K
+BA-20 ® CS 3 n/a n/a 38 n/a
+BA-6 ® CS 4 A4[2] n/a 39 n/a
+BA-64B n/a CS 2 n/a n/a 40† A†
+ZSU-37 n/a CS 4 n/a n/a 41† A†
+SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
+LANO AT ® CS 5 A4[2+] n/a 44.1 n/a
+LANO AA ® CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a CS 2 n/a n/a 46 L†
+Komsomolet n/a CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a cs 6 n/a n/a 47 n/a
+ZIS-5 n/a cs 7 n/a n/a 47 n/a
+IAG-6 n/a cs 7 n/a n/a 47 n/a
+NKL-6 n/a CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a CS 4 C6 C6 48 N O LL
+Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a CS 5 (brew up) WP6[J4+]† s8 s8 50† N O R†1 LL
+Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† sM8† 53† N LL
+M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1941.txt
index fd995ca..ad23b28 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1941.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1941.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1941 ===
-Name Radio Crew survival Capabilities (effective) # Notes
------------------ ------- ------------------------------------ ------------------------------------------ ------------- ----- ---------------------
-T-37 ® CS 2 n/a n/a 1 H† M
-T-27 ® CS 2 n/a n/a 1.1† M Q
-T-40 ® CS 2 n/a n/a 2† H†
-T-50 ® CS 4 A4[2] n/a 3 n/a
-T-60 M40 ® CS 2 n/a n/a 4 n/a
-T-60 M42 ®† CS 2 n/a n/a 4 C†
-T-70 ®† CS 2 A4[2] n/a 5 C†
-T-26 M33 ® CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® CS 3 n/a n/a 6 D M P
-T-26 M31 ® CS 3 n/a n/a 6.1† M P
-T-26 M32 ® CS 3 n/a n/a 6.2† M P
-OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
-OT-133 ® CS 3 n/a n/a 7† M P
-BT-2A ® CS 3 n/a n/a 7.1† M
-BT-5 M34 ® CS 3 n/a n/a 8† M P
-BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
-BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® CS 5 s8 s8 11† M
-T-28 M34(L) ® CS 5 s8 s8 11.1† M
-T-28E M40 ® CS 6 s8 s8 12† M
-T-28E M40(L) ® CS 6 s8 s8 12.1† M
-T-34 M40 ® CS 5 n/a n/a 13 M
-T-34 M41 ®† CS 5 A4[2] n/a 14† C† M
-OT-34 ®† CS 4 A2[2] AP7 AP7 15† C† M
-T-34 M43 n/a CS 5 A4[2] n/a 16† n/a
-T-43 ®† CS 5 A4[2] n/a 17 C† M
-T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
-M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
-T-44 n/a CS 5 A6[5] n/a 20 B† M
-T-35 ® CS 8 s9 s9 21† M
-SMK n/a CS 7 n/a n/a 21.1 M T†
-T-100 n/a CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a CS 6 n/a n/a 22† M
-KV-1E n/a CS 6 n/a n/a 23 D M
-KV-1 M41 n/a CS 6 A4[2] n/a 23 D M
-KV-1 M42 n/a CS 6 A4[2] n/a 23 D M
-KV-2 n/a CS 7 AP9 AP9 24† M
-KV-8 n/a CS 6 A4[2] AP7 AP7 15† D M
-KV-1S n/a CS 6 A4[2] n/a 25† n/a
-KV-85 n/a CS 5 A4[3]5[4] n/a 26 B†
-IS-2 n/a CS 6 n/a n/a 27 B†
-IS-2m n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a CS 4 (brew up) A5[3] n/a 30† n/a
-SU-76i(g) n/a CS 5 A5[3] n/a 31 K
-SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a CS 6 s8 s8 34 G†
-ISU-152 n/a CS 6 n/a n/a 34 G†
-SU-85 n/a CS 5 A5[3] HE7 s7 HE7 s7 35 n/a
-SU-100 n/a CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a CS 4 A5[3] HE7 HE7 37 K
-BA-20 ® CS 3 n/a n/a 38 n/a
-BA-6 ® CS 4 A4[2] n/a 39 n/a
-BA-64B n/a CS 2 n/a n/a 40† A†
-ZSU-37 n/a CS 4 n/a n/a 41† A†
-SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
-LANO AT ® CS 5 A4[2+] n/a 44.1 n/a
-LANO AA ® CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a CS 2 n/a n/a 46 L†
-Komsomolet n/a CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a cs 6 n/a n/a 47 n/a
-ZIS-5 n/a cs 7 n/a n/a 47 n/a
-IAG-6 n/a cs 7 n/a n/a 47 n/a
-NKL-6 n/a CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a CS 4 C6 C6 48 N O LL
-Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a CS 5 (brew up) WP6[J4+]†[] s8 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a CS 7 D6[J4]7[5]†[] HE7[F3]8[4+]†[] sD6[4+] sM8† sM8† 53† N LL
-M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a cs 7 n/a n/a 60† n/a
+Name Radio Crew survival Capabilities (effective) # Notes
+----------------- ------- ------------------------------------ -------------------------------------- ------------- ----- ---------------------
+T-37 ® CS 2 n/a n/a 1 H† M
+T-27 ® CS 2 n/a n/a 1.1† M Q
+T-40 ® CS 2 n/a n/a 2† H†
+T-50 ® CS 4 A4[2] n/a 3 n/a
+T-60 M40 ® CS 2 n/a n/a 4 n/a
+T-60 M42 ®† CS 2 n/a n/a 4 C†
+T-70 ®† CS 2 A4[2] n/a 5 C†
+T-26 M33 ® CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® CS 3 n/a n/a 6 D M P
+T-26 M31 ® CS 3 n/a n/a 6.1† M P
+T-26 M32 ® CS 3 n/a n/a 6.2† M P
+OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
+OT-133 ® CS 3 n/a n/a 7† M P
+BT-2A ® CS 3 n/a n/a 7.1† M
+BT-5 M34 ® CS 3 n/a n/a 8† M P
+BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
+BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® CS 5 s8 s8 11† M
+T-28 M34(L) ® CS 5 s8 s8 11.1† M
+T-28E M40 ® CS 6 s8 s8 12† M
+T-28E M40(L) ® CS 6 s8 s8 12.1† M
+T-34 M40 ® CS 5 n/a n/a 13 M
+T-34 M41 ®† CS 5 A4[2] n/a 14† C† M
+OT-34 ®† CS 4 A2[2] AP7 AP7 15† C† M
+T-34 M43 n/a CS 5 A4[2] n/a 16† n/a
+T-43 ®† CS 5 A4[2] n/a 17 C† M
+T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
+M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
+T-44 n/a CS 5 A6[5] n/a 20 B† M
+T-35 ® CS 8 s9 s9 21† M
+SMK n/a CS 7 n/a n/a 21.1 M T†
+T-100 n/a CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a CS 6 n/a n/a 22† M
+KV-1E n/a CS 6 n/a n/a 23 D M
+KV-1 M41 n/a CS 6 A4[2] n/a 23 D M
+KV-1 M42 n/a CS 6 A4[2] n/a 23 D M
+KV-2 n/a CS 7 AP9 AP9 24† M
+KV-8 n/a CS 6 A4[2] AP7 AP7 15† D M
+KV-1S n/a CS 6 A4[2] n/a 25† n/a
+KV-85 n/a CS 5 A4[3]5[4] n/a 26 B†
+IS-2 n/a CS 6 n/a n/a 27 B†
+IS-2m n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a CS 4 (brew up) A5[3] n/a 30† n/a
+SU-76i(g) n/a CS 5 A5[3] n/a 31 K
+SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a CS 6 s8 s8 34 G†
+ISU-152 n/a CS 6 n/a n/a 34 G†
+SU-85 n/a CS 5 A5[3] HE7 s7 HE7 s7 35 n/a
+SU-100 n/a CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a CS 4 A5[3] HE7 HE7 37 K
+BA-20 ® CS 3 n/a n/a 38 n/a
+BA-6 ® CS 4 A4[2] n/a 39 n/a
+BA-64B n/a CS 2 n/a n/a 40† A†
+ZSU-37 n/a CS 4 n/a n/a 41† A†
+SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
+LANO AT ® CS 5 A4[2+] n/a 44.1 n/a
+LANO AA ® CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a CS 2 n/a n/a 46 L†
+Komsomolet n/a CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a cs 6 n/a n/a 47 n/a
+ZIS-5 n/a cs 7 n/a n/a 47 n/a
+IAG-6 n/a cs 7 n/a n/a 47 n/a
+NKL-6 n/a CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a CS 4 C6 C6 48 N O LL
+Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a CS 5 (brew up) WP6[J4+]† s8 s8 50† N O R†1 LL
+Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† sM8† 53† N LL
+M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1942.txt
index c5e371e..2ab2d45 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1942.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1942.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1942 ===
-Name Radio Crew survival Capabilities (effective) # Notes
------------------ ------- ------------------------------------ ------------------------------------------ ------------- ----- ---------------------
-T-37 ® CS 2 n/a n/a 1 H† M
-T-27 ® CS 2 n/a n/a 1.1† M Q
-T-40 ® CS 2 n/a n/a 2† H†
-T-50 ® CS 4 A4[2] A4 3 n/a
-T-60 M40 ® CS 2 n/a n/a 4 n/a
-T-60 M42 ®† CS 2 n/a n/a 4 C†
-T-70 ®† CS 2 A4[2] A4 5 C†
-T-26 M33 ® CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® CS 3 n/a n/a 6 D M P
-T-26 M31 ® CS 3 n/a n/a 6.1† M P
-T-26 M32 ® CS 3 n/a n/a 6.2† M P
-OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
-OT-133 ® CS 3 n/a n/a 7† M P
-BT-2A ® CS 3 n/a n/a 7.1† M
-BT-5 M34 ® CS 3 n/a n/a 8† M P
-BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
-BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® CS 5 s8 s8 11† M
-T-28 M34(L) ® CS 5 s8 s8 11.1† M
-T-28E M40 ® CS 6 s8 s8 12† M
-T-28E M40(L) ® CS 6 s8 s8 12.1† M
-T-34 M40 ® CS 5 n/a n/a 13 M
-T-34 M41 ®† CS 5 A4[2] A4 14† C† M
-OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
-T-34 M43 n/a CS 5 A4[2] A4 16† n/a
-T-43 ®† CS 5 A4[2] A4 17 C† M
-T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
-M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
-T-44 n/a CS 5 A6[5] n/a 20 B† M
-T-35 ® CS 8 s9 s9 21† M
-SMK n/a CS 7 n/a n/a 21.1 M T†
-T-100 n/a CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a CS 6 n/a n/a 22† M
-KV-1E n/a CS 6 n/a n/a 23 D M
-KV-1 M41 n/a CS 6 A4[2] A4 23 D M
-KV-1 M42 n/a CS 6 A4[2] A4 23 D M
-KV-2 n/a CS 7 AP9 AP9 24† M
-KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
-KV-1S n/a CS 6 A4[2] A4 25† n/a
-KV-85 n/a CS 5 A4[3]5[4] n/a 26 B†
-IS-2 n/a CS 6 n/a n/a 27 B†
-IS-2m n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a CS 4 (brew up) A5[3] n/a 30† n/a
-SU-76i(g) n/a CS 5 A5[3] n/a 31 K
-SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a CS 6 s8 s8 34 G†
-ISU-152 n/a CS 6 n/a n/a 34 G†
-SU-85 n/a CS 5 A5[3] HE7 s7 HE7 s7 35 n/a
-SU-100 n/a CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a CS 4 A5[3] HE7 HE7 37 K
-BA-20 ® CS 3 n/a n/a 38 n/a
-BA-6 ® CS 4 A4[2] A4 39 n/a
-BA-64B n/a CS 2 n/a n/a 40† A†
-ZSU-37 n/a CS 4 n/a n/a 41† A†
-SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
-LANO AT ® CS 5 A4[2+] A4 44.1 n/a
-LANO AA ® CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a CS 2 n/a n/a 46 L†
-Komsomolet n/a CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a cs 6 n/a n/a 47 n/a
-ZIS-5 n/a cs 7 n/a n/a 47 n/a
-IAG-6 n/a cs 7 n/a n/a 47 n/a
-NKL-6 n/a CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a CS 4 C6 C6 48 N O LL
-Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a CS 5 (brew up) WP6[J4+]†[] s8 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a CS 7 D6[J4]7[5]†[] HE7[F3]8[4+]†[] sD6[4+] sM8† sM8† 53† N LL
-M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a cs 7 n/a n/a 60† n/a
+Name Radio Crew survival Capabilities (effective) # Notes
+----------------- ------- ------------------------------------ -------------------------------------- ------------- ----- ---------------------
+T-37 ® CS 2 n/a n/a 1 H† M
+T-27 ® CS 2 n/a n/a 1.1† M Q
+T-40 ® CS 2 n/a n/a 2† H†
+T-50 ® CS 4 A4[2] A4 3 n/a
+T-60 M40 ® CS 2 n/a n/a 4 n/a
+T-60 M42 ®† CS 2 n/a n/a 4 C†
+T-70 ®† CS 2 A4[2] A4 5 C†
+T-26 M33 ® CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® CS 3 n/a n/a 6 D M P
+T-26 M31 ® CS 3 n/a n/a 6.1† M P
+T-26 M32 ® CS 3 n/a n/a 6.2† M P
+OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
+OT-133 ® CS 3 n/a n/a 7† M P
+BT-2A ® CS 3 n/a n/a 7.1† M
+BT-5 M34 ® CS 3 n/a n/a 8† M P
+BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
+BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® CS 5 s8 s8 11† M
+T-28 M34(L) ® CS 5 s8 s8 11.1† M
+T-28E M40 ® CS 6 s8 s8 12† M
+T-28E M40(L) ® CS 6 s8 s8 12.1† M
+T-34 M40 ® CS 5 n/a n/a 13 M
+T-34 M41 ®† CS 5 A4[2] A4 14† C† M
+OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
+T-34 M43 n/a CS 5 A4[2] A4 16† n/a
+T-43 ®† CS 5 A4[2] A4 17 C† M
+T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
+M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
+T-44 n/a CS 5 A6[5] n/a 20 B† M
+T-35 ® CS 8 s9 s9 21† M
+SMK n/a CS 7 n/a n/a 21.1 M T†
+T-100 n/a CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a CS 6 n/a n/a 22† M
+KV-1E n/a CS 6 n/a n/a 23 D M
+KV-1 M41 n/a CS 6 A4[2] A4 23 D M
+KV-1 M42 n/a CS 6 A4[2] A4 23 D M
+KV-2 n/a CS 7 AP9 AP9 24† M
+KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
+KV-1S n/a CS 6 A4[2] A4 25† n/a
+KV-85 n/a CS 5 A4[3]5[4] n/a 26 B†
+IS-2 n/a CS 6 n/a n/a 27 B†
+IS-2m n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a CS 4 (brew up) A5[3] n/a 30† n/a
+SU-76i(g) n/a CS 5 A5[3] n/a 31 K
+SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a CS 6 s8 s8 34 G†
+ISU-152 n/a CS 6 n/a n/a 34 G†
+SU-85 n/a CS 5 A5[3] HE7 s7 HE7 s7 35 n/a
+SU-100 n/a CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a CS 4 A5[3] HE7 HE7 37 K
+BA-20 ® CS 3 n/a n/a 38 n/a
+BA-6 ® CS 4 A4[2] A4 39 n/a
+BA-64B n/a CS 2 n/a n/a 40† A†
+ZSU-37 n/a CS 4 n/a n/a 41† A†
+SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
+LANO AT ® CS 5 A4[2+] A4 44.1 n/a
+LANO AA ® CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a CS 2 n/a n/a 46 L†
+Komsomolet n/a CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a cs 6 n/a n/a 47 n/a
+ZIS-5 n/a cs 7 n/a n/a 47 n/a
+IAG-6 n/a cs 7 n/a n/a 47 n/a
+NKL-6 n/a CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a CS 4 C6 C6 48 N O LL
+Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a CS 5 (brew up) WP6[J4+]† s8 s8 50† N O R†1 LL
+Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† sM8† 53† N LL
+M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1943.txt
index d8b3717..04a1d9a 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1943.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1943.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1943 ===
-Name Radio Crew survival Capabilities (effective) # Notes
------------------ ------- ------------------------------------ ------------------------------------------ ------------- ----- ---------------------
-T-37 ® CS 2 n/a n/a 1 H† M
-T-27 ® CS 2 n/a n/a 1.1† M Q
-T-40 ® CS 2 n/a n/a 2† H†
-T-50 ® CS 4 A4[2] A4 3 n/a
-T-60 M40 ® CS 2 n/a n/a 4 n/a
-T-60 M42 ®† CS 2 n/a n/a 4 C†
-T-70 ®† CS 2 A4[2] A4 5 C†
-T-26 M33 ® CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® CS 3 n/a n/a 6 D M P
-T-26 M31 ® CS 3 n/a n/a 6.1† M P
-T-26 M32 ® CS 3 n/a n/a 6.2† M P
-OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
-OT-133 ® CS 3 n/a n/a 7† M P
-BT-2A ® CS 3 n/a n/a 7.1† M
-BT-5 M34 ® CS 3 n/a n/a 8† M P
-BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
-BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® CS 5 s8 s8 11† M
-T-28 M34(L) ® CS 5 s8 s8 11.1† M
-T-28E M40 ® CS 6 s8 s8 12† M
-T-28E M40(L) ® CS 6 s8 s8 12.1† M
-T-34 M40 ® CS 5 n/a n/a 13 M
-T-34 M41 ®† CS 5 A4[2] A4 14† C† M
-OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
-T-34 M43 n/a CS 5 A4[2] A4 16† n/a
-T-43 ®† CS 5 A4[2] A4 17 C† M
-T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
-M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
-T-44 n/a CS 5 A6[5] n/a 20 B† M
-T-35 ® CS 8 s9 s9 21† M
-SMK n/a CS 7 n/a n/a 21.1 M T†
-T-100 n/a CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a CS 6 n/a n/a 22† M
-KV-1E n/a CS 6 n/a n/a 23 D M
-KV-1 M41 n/a CS 6 A4[2] A4 23 D M
-KV-1 M42 n/a CS 6 A4[2] A4 23 D M
-KV-2 n/a CS 7 AP9 AP9 24† M
-KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
-KV-1S n/a CS 6 A4[2] A4 25† n/a
-KV-85 n/a CS 5 A4[3]5[4] A4 26 B†
-IS-2 n/a CS 6 n/a n/a 27 B†
-IS-2m n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a CS 4 (brew up) A5[3] A5 30† n/a
-SU-76i(g) n/a CS 5 A5[3] A5 31 K
-SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a CS 6 s8 s8 34 G†
-ISU-152 n/a CS 6 n/a n/a 34 G†
-SU-85 n/a CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
-SU-100 n/a CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a CS 4 A5[3] HE7 A5 HE7 37 K
-BA-20 ® CS 3 n/a n/a 38 n/a
-BA-6 ® CS 4 A4[2] A4 39 n/a
-BA-64B n/a CS 2 n/a n/a 40† A†
-ZSU-37 n/a CS 4 n/a n/a 41† A†
-SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
-LANO AT ® CS 5 A4[2+] A4 44.1 n/a
-LANO AA ® CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a CS 2 n/a n/a 46 L†
-Komsomolet n/a CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a cs 6 n/a n/a 47 n/a
-ZIS-5 n/a cs 7 n/a n/a 47 n/a
-IAG-6 n/a cs 7 n/a n/a 47 n/a
-NKL-6 n/a CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a CS 4 C6 C6 48 N O LL
-Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a CS 5 (brew up) WP6[J4+]†[] s8 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a CS 7 D6[J4]7[5]†[] HE7[F3]8[4+]†[] sD6[4+] sM8† sM8† 53† N LL
-M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a cs 7 n/a n/a 60† n/a
+Name Radio Crew survival Capabilities (effective) # Notes
+----------------- ------- ------------------------------------ -------------------------------------- ------------- ----- ---------------------
+T-37 ® CS 2 n/a n/a 1 H† M
+T-27 ® CS 2 n/a n/a 1.1† M Q
+T-40 ® CS 2 n/a n/a 2† H†
+T-50 ® CS 4 A4[2] A4 3 n/a
+T-60 M40 ® CS 2 n/a n/a 4 n/a
+T-60 M42 ®† CS 2 n/a n/a 4 C†
+T-70 ®† CS 2 A4[2] A4 5 C†
+T-26 M33 ® CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® CS 3 n/a n/a 6 D M P
+T-26 M31 ® CS 3 n/a n/a 6.1† M P
+T-26 M32 ® CS 3 n/a n/a 6.2† M P
+OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
+OT-133 ® CS 3 n/a n/a 7† M P
+BT-2A ® CS 3 n/a n/a 7.1† M
+BT-5 M34 ® CS 3 n/a n/a 8† M P
+BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
+BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® CS 5 s8 s8 11† M
+T-28 M34(L) ® CS 5 s8 s8 11.1† M
+T-28E M40 ® CS 6 s8 s8 12† M
+T-28E M40(L) ® CS 6 s8 s8 12.1† M
+T-34 M40 ® CS 5 n/a n/a 13 M
+T-34 M41 ®† CS 5 A4[2] A4 14† C† M
+OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
+T-34 M43 n/a CS 5 A4[2] A4 16† n/a
+T-43 ®† CS 5 A4[2] A4 17 C† M
+T-34/85 n/a CS 6 A5[4] sD6† sD6† 18† J†
+M4/76(a) n/a CS 6 A3[4] s8 sM8 s8 sM8 19† N
+T-44 n/a CS 5 A6[5] n/a 20 B† M
+T-35 ® CS 8 s9 s9 21† M
+SMK n/a CS 7 n/a n/a 21.1 M T†
+T-100 n/a CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a CS 6 n/a n/a 22† M
+KV-1E n/a CS 6 n/a n/a 23 D M
+KV-1 M41 n/a CS 6 A4[2] A4 23 D M
+KV-1 M42 n/a CS 6 A4[2] A4 23 D M
+KV-2 n/a CS 7 AP9 AP9 24† M
+KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
+KV-1S n/a CS 6 A4[2] A4 25† n/a
+KV-85 n/a CS 5 A4[3]5[4] A4 26 B†
+IS-2 n/a CS 6 n/a n/a 27 B†
+IS-2m n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a CS 4 (brew up) A5[3] A5 30† n/a
+SU-76i(g) n/a CS 5 A5[3] A5 31 K
+SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a CS 6 s8 s8 34 G†
+ISU-152 n/a CS 6 n/a n/a 34 G†
+SU-85 n/a CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
+SU-100 n/a CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a CS 4 A5[3] HE7 A5 HE7 37 K
+BA-20 ® CS 3 n/a n/a 38 n/a
+BA-6 ® CS 4 A4[2] A4 39 n/a
+BA-64B n/a CS 2 n/a n/a 40† A†
+ZSU-37 n/a CS 4 n/a n/a 41† A†
+SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
+LANO AT ® CS 5 A4[2+] A4 44.1 n/a
+LANO AA ® CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a CS 2 n/a n/a 46 L†
+Komsomolet n/a CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a cs 6 n/a n/a 47 n/a
+ZIS-5 n/a cs 7 n/a n/a 47 n/a
+IAG-6 n/a cs 7 n/a n/a 47 n/a
+NKL-6 n/a CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a CS 4 C6 C6 48 N O LL
+Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a CS 5 (brew up) WP6[J4+]† s8 s8 50† N O R†1 LL
+Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† sM8† 53† N LL
+M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt
index 9e6a30d..025e042 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1944 ===
-Name Radio Crew survival Capabilities (effective) # Notes
------------------ ------- ------------------------------------ ------------------------------------------ ------------- ----- ---------------------
-T-37 ® CS 2 n/a n/a 1 H† M
-T-27 ® CS 2 n/a n/a 1.1† M Q
-T-40 ® CS 2 n/a n/a 2† H†
-T-50 ® CS 4 A4[2] A4 3 n/a
-T-60 M40 ® CS 2 n/a n/a 4 n/a
-T-60 M42 ®† CS 2 n/a n/a 4 C†
-T-70 ®† CS 2 A4[2] A4 5 C†
-T-26 M33 ® CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® CS 3 n/a n/a 6 D M P
-T-26 M31 ® CS 3 n/a n/a 6.1† M P
-T-26 M32 ® CS 3 n/a n/a 6.2† M P
-OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
-OT-133 ® CS 3 n/a n/a 7† M P
-BT-2A ® CS 3 n/a n/a 7.1† M
-BT-5 M34 ® CS 3 n/a n/a 8† M P
-BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
-BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® CS 5 s8 s8 11† M
-T-28 M34(L) ® CS 5 s8 s8 11.1† M
-T-28E M40 ® CS 6 s8 s8 12† M
-T-28E M40(L) ® CS 6 s8 s8 12.1† M
-T-34 M40 ® CS 5 n/a n/a 13 M
-T-34 M41 ®† CS 5 A4[2] A4 14† C† M
-OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
-T-34 M43 n/a CS 5 A4[2] A4 16† n/a
-T-43 ®† CS 5 A4[2] A4 17 C† M
-T-34/85 n/a CS 6 A5[4] sD6† A5 sD6† 18† J†
-M4/76(a) n/a CS 6 A3[4] s8 sM8 A3 s8 sM8 19† N
-T-44 n/a CS 5 A6[5] n/a 20 B† M
-T-35 ® CS 8 s9 s9 21† M
-SMK n/a CS 7 n/a n/a 21.1 M T†
-T-100 n/a CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a CS 6 n/a n/a 22† M
-KV-1E n/a CS 6 n/a n/a 23 D M
-KV-1 M41 n/a CS 6 A4[2] A4 23 D M
-KV-1 M42 n/a CS 6 A4[2] A4 23 D M
-KV-2 n/a CS 7 AP9 AP9 24† M
-KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
-KV-1S n/a CS 6 A4[2] A4 25† n/a
-KV-85 n/a CS 5 A4[3]5[4] A5 26 B†
-IS-2 n/a CS 6 n/a n/a 27 B†
-IS-2m n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a CS 4 (brew up) A5[3] A5 30† n/a
-SU-76i(g) n/a CS 5 A5[3] A5 31 K
-SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a CS 6 s8 s8 34 G†
-ISU-152 n/a CS 6 n/a n/a 34 G†
-SU-85 n/a CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
-SU-100 n/a CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a CS 4 A5[3] HE7 A5 HE7 37 K
-BA-20 ® CS 3 n/a n/a 38 n/a
-BA-6 ® CS 4 A4[2] A4 39 n/a
-BA-64B n/a CS 2 n/a n/a 40† A†
-ZSU-37 n/a CS 4 n/a n/a 41† A†
-SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
-LANO AT ® CS 5 A4[2+] A4 44.1 n/a
-LANO AA ® CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a CS 2 n/a n/a 46 L†
-Komsomolet n/a CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a cs 6 n/a n/a 47 n/a
-ZIS-5 n/a cs 7 n/a n/a 47 n/a
-IAG-6 n/a cs 7 n/a n/a 47 n/a
-NKL-6 n/a CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a CS 4 C6 C6 48 N O LL
-Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a CS 5 (brew up) WP6[J4+]†[] s8 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a CS 7 D6[J4]7[5]†[] HE7[F3]8[4+]†[] sD6[4+] sM8† HE8 sD6 sM8† 53† N LL
-M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a cs 7 n/a n/a 60† n/a
+Name Radio Crew survival Capabilities (effective) # Notes
+----------------- ------- ------------------------------------ -------------------------------------- ------------- ----- ---------------------
+T-37 ® CS 2 n/a n/a 1 H† M
+T-27 ® CS 2 n/a n/a 1.1† M Q
+T-40 ® CS 2 n/a n/a 2† H†
+T-50 ® CS 4 A4[2] A4 3 n/a
+T-60 M40 ® CS 2 n/a n/a 4 n/a
+T-60 M42 ®† CS 2 n/a n/a 4 C†
+T-70 ®† CS 2 A4[2] A4 5 C†
+T-26 M33 ® CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® CS 3 n/a n/a 6 D M P
+T-26 M31 ® CS 3 n/a n/a 6.1† M P
+T-26 M32 ® CS 3 n/a n/a 6.2† M P
+OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
+OT-133 ® CS 3 n/a n/a 7† M P
+BT-2A ® CS 3 n/a n/a 7.1† M
+BT-5 M34 ® CS 3 n/a n/a 8† M P
+BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
+BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® CS 5 s8 s8 11† M
+T-28 M34(L) ® CS 5 s8 s8 11.1† M
+T-28E M40 ® CS 6 s8 s8 12† M
+T-28E M40(L) ® CS 6 s8 s8 12.1† M
+T-34 M40 ® CS 5 n/a n/a 13 M
+T-34 M41 ®† CS 5 A4[2] A4 14† C† M
+OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
+T-34 M43 n/a CS 5 A4[2] A4 16† n/a
+T-43 ®† CS 5 A4[2] A4 17 C† M
+T-34/85 n/a CS 6 A5[4] sD6† A5 sD6† 18† J†
+M4/76(a) n/a CS 6 A3[4] s8 sM8 A3 s8 sM8 19† N
+T-44 n/a CS 5 A6[5] n/a 20 B† M
+T-35 ® CS 8 s9 s9 21† M
+SMK n/a CS 7 n/a n/a 21.1 M T†
+T-100 n/a CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a CS 6 n/a n/a 22† M
+KV-1E n/a CS 6 n/a n/a 23 D M
+KV-1 M41 n/a CS 6 A4[2] A4 23 D M
+KV-1 M42 n/a CS 6 A4[2] A4 23 D M
+KV-2 n/a CS 7 AP9 AP9 24† M
+KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
+KV-1S n/a CS 6 A4[2] A4 25† n/a
+KV-85 n/a CS 5 A4[3]5[4] A5 26 B†
+IS-2 n/a CS 6 n/a n/a 27 B†
+IS-2m n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a CS 4 (brew up) A5[3] A5 30† n/a
+SU-76i(g) n/a CS 5 A5[3] A5 31 K
+SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a CS 6 s8 s8 34 G†
+ISU-152 n/a CS 6 n/a n/a 34 G†
+SU-85 n/a CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
+SU-100 n/a CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a CS 4 A5[3] HE7 A5 HE7 37 K
+BA-20 ® CS 3 n/a n/a 38 n/a
+BA-6 ® CS 4 A4[2] A4 39 n/a
+BA-64B n/a CS 2 n/a n/a 40† A†
+ZSU-37 n/a CS 4 n/a n/a 41† A†
+SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
+LANO AT ® CS 5 A4[2+] A4 44.1 n/a
+LANO AA ® CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a CS 2 n/a n/a 46 L†
+Komsomolet n/a CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a cs 6 n/a n/a 47 n/a
+ZIS-5 n/a cs 7 n/a n/a 47 n/a
+IAG-6 n/a cs 7 n/a n/a 47 n/a
+NKL-6 n/a CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a CS 4 C6 C6 48 N O LL
+Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a CS 5 (brew up) WP6[J4+]† s8 s8 50† N O R†1 LL
+Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† HE8 sD6 sM8† 53† N LL
+M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt
index 7501495..7684a74 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1945 ===
-Name Radio Crew survival Capabilities (effective) # Notes
------------------ ------- ------------------------------------ ------------------------------------------ --------------- ----- ---------------------
-T-37 ® CS 2 n/a n/a 1 H† M
-T-27 ® CS 2 n/a n/a 1.1† M Q
-T-40 ® CS 2 n/a n/a 2† H†
-T-50 ® CS 4 A4[2] A4 3 n/a
-T-60 M40 ® CS 2 n/a n/a 4 n/a
-T-60 M42 ®† CS 2 n/a n/a 4 C†
-T-70 ®† CS 2 A4[2] A4 5 C†
-T-26 M33 ® CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® CS 3 n/a n/a 6 D M P
-T-26 M31 ® CS 3 n/a n/a 6.1† M P
-T-26 M32 ® CS 3 n/a n/a 6.2† M P
-OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
-OT-133 ® CS 3 n/a n/a 7† M P
-BT-2A ® CS 3 n/a n/a 7.1† M
-BT-5 M34 ® CS 3 n/a n/a 8† M P
-BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
-BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® CS 5 s8 s8 11† M
-T-28 M34(L) ® CS 5 s8 s8 11.1† M
-T-28E M40 ® CS 6 s8 s8 12† M
-T-28E M40(L) ® CS 6 s8 s8 12.1† M
-T-34 M40 ® CS 5 n/a n/a 13 M
-T-34 M41 ®† CS 5 A4[2] A4 14† C† M
-OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
-T-34 M43 n/a CS 5 A4[2] A4 16† n/a
-T-43 ®† CS 5 A4[2] A4 17 C† M
-T-34/85 n/a CS 6 A5[4] sD6† A5 sD6† 18† J†
-M4/76(a) n/a CS 6 A3[4] s8 sM8 A3 s8 sM8 19† N
-T-44 n/a CS 5 A6[5] A6 20 B† M
-T-35 ® CS 8 s9 s9 21† M
-SMK n/a CS 7 n/a n/a 21.1 M T†
-T-100 n/a CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a CS 6 n/a n/a 22† M
-KV-1E n/a CS 6 n/a n/a 23 D M
-KV-1 M41 n/a CS 6 A4[2] A4 23 D M
-KV-1 M42 n/a CS 6 A4[2] A4 23 D M
-KV-2 n/a CS 7 AP9 AP9 24† M
-KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
-KV-1S n/a CS 6 A4[2] A4 25† n/a
-KV-85 n/a CS 5 A4[3]5[4] A5 26 B†
-IS-2 n/a CS 6 n/a n/a 27 B†
-IS-2m n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a CS 4 (brew up) A5[3] A5 30† n/a
-SU-76i(g) n/a CS 5 A5[3] A5 31 K
-SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a CS 6 s8 s8 34 G†
-ISU-152 n/a CS 6 n/a n/a 34 G†
-SU-85 n/a CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
-SU-100 n/a CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a CS 4 A5[3] HE7 A5 HE7 37 K
-BA-20 ® CS 3 n/a n/a 38 n/a
-BA-6 ® CS 4 A4[2] A4 39 n/a
-BA-64B n/a CS 2 n/a n/a 40† A†
-ZSU-37 n/a CS 4 n/a n/a 41† A†
-SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
-LANO AT ® CS 5 A4[2+] A4 44.1 n/a
-LANO AA ® CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a CS 2 n/a n/a 46 L†
-Komsomolet n/a CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a cs 6 n/a n/a 47 n/a
-ZIS-5 n/a cs 7 n/a n/a 47 n/a
-IAG-6 n/a cs 7 n/a n/a 47 n/a
-NKL-6 n/a CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a CS 4 C6 C6 48 N O LL
-Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a CS 5 (brew up) WP6[J4+]†[] s8 WP6 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a CS 7 D6[J4]7[5]†[] HE7[F3]8[4+]†[] sD6[4+] sM8† D7 HE8 sD6 sM8† 53† N LL
-M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a cs 7 n/a n/a 60† n/a
+Name Radio Crew survival Capabilities (effective) # Notes
+----------------- ------- ------------------------------------ -------------------------------------- --------------- ----- ---------------------
+T-37 ® CS 2 n/a n/a 1 H† M
+T-27 ® CS 2 n/a n/a 1.1† M Q
+T-40 ® CS 2 n/a n/a 2† H†
+T-50 ® CS 4 A4[2] A4 3 n/a
+T-60 M40 ® CS 2 n/a n/a 4 n/a
+T-60 M42 ®† CS 2 n/a n/a 4 C†
+T-70 ®† CS 2 A4[2] A4 5 C†
+T-26 M33 ® CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® CS 3 n/a n/a 6 D M P
+T-26 M31 ® CS 3 n/a n/a 6.1† M P
+T-26 M32 ® CS 3 n/a n/a 6.2† M P
+OT-26 ® CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a CS 3 n/a n/a 6.4† M
+OT-133 ® CS 3 n/a n/a 7† M P
+BT-2A ® CS 3 n/a n/a 7.1† M
+BT-5 M34 ® CS 3 n/a n/a 8† M P
+BT-7 M37 ® CS 3 n/a n/a 9 D I† M P
+BT-7A n/a CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® CS 5 s8 s8 11† M
+T-28 M34(L) ® CS 5 s8 s8 11.1† M
+T-28E M40 ® CS 6 s8 s8 12† M
+T-28E M40(L) ® CS 6 s8 s8 12.1† M
+T-34 M40 ® CS 5 n/a n/a 13 M
+T-34 M41 ®† CS 5 A4[2] A4 14† C† M
+OT-34 ®† CS 4 A2[2] AP7 A2 AP7 15† C† M
+T-34 M43 n/a CS 5 A4[2] A4 16† n/a
+T-43 ®† CS 5 A4[2] A4 17 C† M
+T-34/85 n/a CS 6 A5[4] sD6† A5 sD6† 18† J†
+M4/76(a) n/a CS 6 A3[4] s8 sM8 A3 s8 sM8 19† N
+T-44 n/a CS 5 A6[5] A6 20 B† M
+T-35 ® CS 8 s9 s9 21† M
+SMK n/a CS 7 n/a n/a 21.1 M T†
+T-100 n/a CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a CS 6 n/a n/a 22† M
+KV-1E n/a CS 6 n/a n/a 23 D M
+KV-1 M41 n/a CS 6 A4[2] A4 23 D M
+KV-1 M42 n/a CS 6 A4[2] A4 23 D M
+KV-2 n/a CS 7 AP9 AP9 24† M
+KV-8 n/a CS 6 A4[2] AP7 A4 AP7 15† D M
+KV-1S n/a CS 6 A4[2] A4 25† n/a
+KV-85 n/a CS 5 A4[3]5[4] A5 26 B†
+IS-2 n/a CS 6 n/a n/a 27 B†
+IS-2m n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a CS 4 (brew up) A5[3] A5 30† n/a
+SU-76i(g) n/a CS 5 A5[3] A5 31 K
+SU-122 n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a CS 6 s8 s8 34 G†
+ISU-152 n/a CS 6 n/a n/a 34 G†
+SU-85 n/a CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
+SU-100 n/a CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a CS 4 A5[3] HE7 A5 HE7 37 K
+BA-20 ® CS 3 n/a n/a 38 n/a
+BA-6 ® CS 4 A4[2] A4 39 n/a
+BA-64B n/a CS 2 n/a n/a 40† A†
+ZSU-37 n/a CS 4 n/a n/a 41† A†
+SU-12 n/a CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a CS 4 n/a n/a 44 A† F†
+LANO AT ® CS 5 A4[2+] A4 44.1 n/a
+LANO AA ® CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a CS 2 n/a n/a 46 L†
+Komsomolet n/a CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a cs 6 n/a n/a 47 n/a
+ZIS-5 n/a cs 7 n/a n/a 47 n/a
+IAG-6 n/a cs 7 n/a n/a 47 n/a
+NKL-6 n/a CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a CS 4 C6 C6 48 N O LL
+Lee(a) n/a CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a CS 5 (brew up) WP6[J4+]† s8 WP6 s8 50† N O R†1 LL
+Sherman III(L)(a) n/a CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† D7 HE8 sD6 sM8† 53† N LL
+M3A1 Scout Car(a) n/a CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/test_vo_reports.py b/vasl_templates/webapp/tests/test_vo_reports.py
index b383a7a..95d2bf9 100644
--- a/vasl_templates/webapp/tests/test_vo_reports.py
+++ b/vasl_templates/webapp/tests/test_vo_reports.py
@@ -5,19 +5,14 @@ import io
import shutil
import re
+import lxml.html
+import lxml.etree
import tabulate
-import pytest
-from vasl_templates.webapp.tests.utils import find_child, find_children, wait_for
+from vasl_templates.webapp.tests.utils import find_child, wait_for
# ---------------------------------------------------------------------
-# NOTE: Running these checks is fairly slow, and once done, don't provide a great deal of value
-# in the day-to-day development process, so we make them optional.
-@pytest.mark.skipif(
- pytest.config.option.short_tests, #pylint: disable=no-member
- reason = "--short-tests specified"
-)
def test_vo_reports( webapp, webdriver ):
"""Check the vehicle/ordnance reports."""
@@ -89,22 +84,26 @@ def get_vo_report( webapp, webdriver, nat, vo_type, year ):
webdriver.get(
webapp.url_for( "get_vo_report", nat=nat, vo_type=vo_type, year=year )
)
- wait_for( 5, lambda: find_child("#results").is_displayed() )
+ wait_for( 2, lambda: find_child("#results").is_displayed() )
- # unload the results
- def getval( cell ):
- """Get a table cell's value (cleaned up)."""
- val = cell.get_attribute( "innerHTML" )
+ def tidy( cell ):
+ """Tidy up a cell value."""
+ val = lxml.etree.tostring( cell ).decode( "utf-8" ) #pylint: disable=c-extension-no-member
+ mo = re.search( r"^<(th|td).*?>(.*)\1>$", val )
+ val = mo.group(2)
if val == "n/a":
return "n/a"
val = val.replace( '', "" ).replace( "", "" )
+ val = val.replace( "†", "\u2020" ).replace( "®", "\u00ae" )
return val
+
+ # unload the results
+ # NOTE: Getting each table cell via Selenium is insanely slow - we parse the HTML manually :-/
results = []
- elem = find_child( "#results" )
- for row in find_children( "tr", elem ):
- if not results:
- results.append( [ getval(c) for c in find_children("th",row) ] )
- else:
- results.append( [ getval(c) for c in find_children("td",row) ] )
+ doc = lxml.html.fromstring( webdriver.page_source )
+ for row in doc.xpath( "//div[@id='results']//table//tr" ):
+ tag = "td" if results else "th"
+ cells = row.xpath( ".//{}".format( tag ) )
+ results.append( list( tidy(c) for c in cells ) )
return results