From e0e9fdd86a8dccc2f292f8c23441c66601a56e9e Mon Sep 17 00:00:00 2001
From: Ziktofel <ziktofel@gmail.com>
Date: Fri, 15 Mar 2024 17:33:03 +0100
Subject: [PATCH] SC2: Multi-campaign (#2954)

Adds HotS, LotV and NCO campaigns to SC2 game.
The world's name has changed to reflect that (it's not only Wings of Liberty now)
The client was patched in a way that can still join to games generated prior this change
---------

Co-authored-by: Magnemania <magnemight@gmail.com>
Co-authored-by: EnvyDragon <138727357+EnvyDragon@users.noreply.github.com>
Co-authored-by: Matthew <matthew.marinets@gmail.com>
Co-authored-by: hopop201 <benjy.hopop201@gmail.com>
Co-authored-by: Salzkorn <salzkitty@gmail.com>
Co-authored-by: genderdruid <pallyoffail@gmail.com>
Co-authored-by: MadiMadsen <137329235+MadiMadsen@users.noreply.github.com>
Co-authored-by: neocerber <neocerber@gmail.com>
Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
---
 README.md                                     |    2 +-
 Starcraft2Client.py                           |    2 +-
 .../{sc2wolTracker.js => sc2Tracker.js}       |   10 +-
 .../static/icons/sc2/SC2_Lab_BioSteel_L1.png  |  Bin 5945 -> 0 bytes
 .../static/icons/sc2/SC2_Lab_BioSteel_L2.png  |  Bin 6699 -> 0 bytes
 .../static/icons/sc2/advanceballistics.png    |  Bin 11624 -> 0 bytes
 .../static/icons/sc2/autoturretblackops.png   |  Bin 8834 -> 0 bytes
 .../static/icons/sc2/biomechanicaldrone.png   |  Bin 6999 -> 0 bytes
 .../static/icons/sc2/burstcapacitors.png      |  Bin 2579 -> 0 bytes
 .../icons/sc2/crossspectrumdampeners.png      |  Bin 5344 -> 0 bytes
 .../static/static/icons/sc2/cyclone.png       |  Bin 8524 -> 0 bytes
 .../static/icons/sc2/cyclonerangeupgrade.png  |  Bin 12682 -> 0 bytes
 .../static/static/icons/sc2/drillingclaws.png |  Bin 8451 -> 0 bytes
 .../static/icons/sc2/emergencythrusters.png   |  Bin 6796 -> 0 bytes
 .../static/icons/sc2/hellionbattlemode.png    |  Bin 8210 -> 0 bytes
 .../icons/sc2/high-explosive-spidermine.png   |  Bin 14334 -> 0 bytes
 .../static/icons/sc2/hyperflightrotors.png    |  Bin 14285 -> 0 bytes
 .../static/static/icons/sc2/hyperfluxor.png   |  Bin 9261 -> 0 bytes
 .../static/static/icons/sc2/impalerrounds.png |  Bin 4347 -> 0 bytes
 .../static/icons/sc2/improvedburstlaser.png   |  Bin 11115 -> 0 bytes
 .../static/icons/sc2/improvedsiegemode.png    |  Bin 14293 -> 0 bytes
 .../static/icons/sc2/interferencematrix.png   |  Bin 10537 -> 0 bytes
 .../icons/sc2/internalizedtechmodule.png      |  Bin 16425 -> 0 bytes
 .../static/static/icons/sc2/jotunboosters.png |  Bin 5740 -> 0 bytes
 .../static/static/icons/sc2/jumpjets.png      |  Bin 17881 -> 0 bytes
 .../static/icons/sc2/lasertargetingsystem.png |  Bin 14802 -> 0 bytes
 .../static/static/icons/sc2/liberator.png     |  Bin 9012 -> 0 bytes
 .../static/static/icons/sc2/lockdown.png      |  Bin 8289 -> 0 bytes
 .../static/icons/sc2/magfieldaccelerator.png  |  Bin 11459 -> 0 bytes
 .../static/icons/sc2/magrailmunitions.png     |  Bin 19193 -> 0 bytes
 .../icons/sc2/medivacemergencythrusters.png   |  Bin 8954 -> 0 bytes
 .../icons/sc2/neosteelfortifiedarmor.png      |  Bin 13032 -> 0 bytes
 .../static/static/icons/sc2/opticalflare.png  |  Bin 11440 -> 0 bytes
 .../static/icons/sc2/optimizedlogistics.png   |  Bin 13116 -> 0 bytes
 .../static/icons/sc2/reapercombatdrugs.png    |  Bin 7102 -> 0 bytes
 .../static/static/icons/sc2/restoration.png   |  Bin 7754 -> 0 bytes
 .../static/icons/sc2/ripwavemissiles.png      |  Bin 13628 -> 0 bytes
 .../static/icons/sc2/shreddermissile.png      |  Bin 9827 -> 0 bytes
 .../icons/sc2/siegetank-spidermines.png       |  Bin 12764 -> 0 bytes
 .../static/icons/sc2/siegetankrange.png       |  Bin 11833 -> 0 bytes
 .../static/icons/sc2/specialordance.png       |  Bin 12992 -> 0 bytes
 .../static/static/icons/sc2/spidermine.png    |  Bin 3872 -> 0 bytes
 .../static/icons/sc2/staticempblast.png       |  Bin 12094 -> 0 bytes
 .../static/static/icons/sc2/superstimpack.png |  Bin 14901 -> 0 bytes
 .../static/icons/sc2/targetingoptics.png      |  Bin 8431 -> 0 bytes
 .../static/icons/sc2/terran-cloak-color.png   |  Bin 8134 -> 0 bytes
 .../static/icons/sc2/terran-emp-color.png     |  Bin 7693 -> 0 bytes
 .../sc2/terrandefendermodestructureattack.png |  Bin 14017 -> 0 bytes
 .../static/static/icons/sc2/thorsiegemode.png |  Bin 11345 -> 0 bytes
 .../static/icons/sc2/transformationservos.png |  Bin 9215 -> 0 bytes
 .../static/static/icons/sc2/valkyrie.png      |  Bin 7490 -> 0 bytes
 .../static/static/icons/sc2/warpjump.png      |  Bin 8665 -> 0 bytes
 .../icons/sc2/widowmine-attackrange.png       |  Bin 13367 -> 0 bytes
 .../icons/sc2/widowmine-deathblossom.png      |  Bin 12946 -> 0 bytes
 .../static/static/icons/sc2/widowmine.png     |  Bin 5671 -> 0 bytes
 .../static/icons/sc2/widowminehidden.png      |  Bin 12777 -> 0 bytes
 WebHostLib/static/styles/sc2Tracker.css       |  160 ++
 WebHostLib/static/styles/sc2wolTracker.css    |  112 -
 WebHostLib/templates/tracker__Starcraft2.html | 1090 +++++++
 .../tracker__Starcraft2WingsOfLiberty.html    |  366 ---
 WebHostLib/tracker.py                         | 1208 ++++++--
 docs/CODEOWNERS                               |    4 +-
 setup.py                                      |    1 -
 test/general/test_items.py                    |    4 +-
 worlds/_sc2common/bot/bot_ai.py               |    3 +
 worlds/sc2/Client.py                          | 1631 +++++++++++
 worlds/sc2/ClientGui.py                       |  304 ++
 worlds/sc2/ItemGroups.py                      |  100 +
 worlds/sc2/ItemNames.py                       |  661 +++++
 worlds/sc2/Items.py                           | 2553 +++++++++++++++++
 worlds/sc2/Locations.py                       | 1638 +++++++++++
 worlds/sc2/MissionTables.py                   |  737 +++++
 worlds/sc2/Options.py                         |  908 ++++++
 worlds/sc2/PoolFilter.py                      |  595 ++++
 worlds/sc2/Regions.py                         |  691 +++++
 worlds/sc2/Rules.py                           |  952 ++++++
 worlds/sc2/Starcraft2.kv                      |   28 +
 worlds/sc2/__init__.py                        |  482 ++++
 worlds/sc2/docs/contributors.md               |   42 +
 worlds/sc2/docs/en_Starcraft 2.md             |   64 +
 worlds/{sc2wol => sc2}/docs/setup_en.md       |   67 +-
 worlds/{sc2wol => sc2}/requirements.txt       |    0
 worlds/sc2/test/__init__.py                   |    0
 worlds/sc2/test/test_Regions.py               |   41 +
 worlds/sc2/test/test_base.py                  |   11 +
 worlds/sc2/test/test_options.py               |    7 +
 worlds/sc2wol/Client.py                       | 1222 --------
 worlds/sc2wol/Items.py                        |  421 ---
 worlds/sc2wol/Locations.py                    |  516 ----
 worlds/sc2wol/LogicMixin.py                   |  148 -
 worlds/sc2wol/MissionTables.py                |  230 --
 worlds/sc2wol/Options.py                      |  362 ---
 worlds/sc2wol/PoolFilter.py                   |  367 ---
 worlds/sc2wol/Regions.py                      |  313 --
 worlds/sc2wol/Starcraft2.kv                   |   16 -
 worlds/sc2wol/__init__.py                     |  324 ---
 .../docs/en_Starcraft 2 Wings of Liberty.md   |   54 -
 97 files changed, 13708 insertions(+), 4739 deletions(-)
 rename WebHostLib/static/assets/{sc2wolTracker.js => sc2Tracker.js} (85%)
 delete mode 100644 WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/advanceballistics.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/autoturretblackops.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/biomechanicaldrone.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/burstcapacitors.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/crossspectrumdampeners.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/cyclone.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/cyclonerangeupgrade.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/drillingclaws.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/emergencythrusters.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/hellionbattlemode.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/high-explosive-spidermine.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/hyperflightrotors.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/hyperfluxor.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/impalerrounds.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/improvedburstlaser.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/improvedsiegemode.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/interferencematrix.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/internalizedtechmodule.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/jotunboosters.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/jumpjets.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/lasertargetingsystem.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/liberator.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/lockdown.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/magfieldaccelerator.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/magrailmunitions.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/medivacemergencythrusters.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/neosteelfortifiedarmor.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/opticalflare.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/optimizedlogistics.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/reapercombatdrugs.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/restoration.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/ripwavemissiles.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/shreddermissile.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/siegetank-spidermines.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/siegetankrange.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/specialordance.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/spidermine.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/staticempblast.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/superstimpack.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/targetingoptics.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/terran-cloak-color.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/terran-emp-color.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/terrandefendermodestructureattack.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/thorsiegemode.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/transformationservos.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/valkyrie.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/warpjump.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/widowmine-attackrange.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/widowmine-deathblossom.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/widowmine.png
 delete mode 100644 WebHostLib/static/static/icons/sc2/widowminehidden.png
 create mode 100644 WebHostLib/static/styles/sc2Tracker.css
 delete mode 100644 WebHostLib/static/styles/sc2wolTracker.css
 create mode 100644 WebHostLib/templates/tracker__Starcraft2.html
 delete mode 100644 WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html
 create mode 100644 worlds/sc2/Client.py
 create mode 100644 worlds/sc2/ClientGui.py
 create mode 100644 worlds/sc2/ItemGroups.py
 create mode 100644 worlds/sc2/ItemNames.py
 create mode 100644 worlds/sc2/Items.py
 create mode 100644 worlds/sc2/Locations.py
 create mode 100644 worlds/sc2/MissionTables.py
 create mode 100644 worlds/sc2/Options.py
 create mode 100644 worlds/sc2/PoolFilter.py
 create mode 100644 worlds/sc2/Regions.py
 create mode 100644 worlds/sc2/Rules.py
 create mode 100644 worlds/sc2/Starcraft2.kv
 create mode 100644 worlds/sc2/__init__.py
 create mode 100644 worlds/sc2/docs/contributors.md
 create mode 100644 worlds/sc2/docs/en_Starcraft 2.md
 rename worlds/{sc2wol => sc2}/docs/setup_en.md (50%)
 rename worlds/{sc2wol => sc2}/requirements.txt (100%)
 create mode 100644 worlds/sc2/test/__init__.py
 create mode 100644 worlds/sc2/test/test_Regions.py
 create mode 100644 worlds/sc2/test/test_base.py
 create mode 100644 worlds/sc2/test/test_options.py
 delete mode 100644 worlds/sc2wol/Client.py
 delete mode 100644 worlds/sc2wol/Items.py
 delete mode 100644 worlds/sc2wol/Locations.py
 delete mode 100644 worlds/sc2wol/LogicMixin.py
 delete mode 100644 worlds/sc2wol/MissionTables.py
 delete mode 100644 worlds/sc2wol/Options.py
 delete mode 100644 worlds/sc2wol/PoolFilter.py
 delete mode 100644 worlds/sc2wol/Regions.py
 delete mode 100644 worlds/sc2wol/Starcraft2.kv
 delete mode 100644 worlds/sc2wol/__init__.py
 delete mode 100644 worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md

diff --git a/README.md b/README.md
index 3c3c4147..d914f860 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ Currently, the following games are supported:
 * Hollow Knight
 * The Witness
 * Sonic Adventure 2: Battle
-* Starcraft 2: Wings of Liberty
+* Starcraft 2
 * Donkey Kong Country 3
 * Dark Souls 3
 * Super Mario World
diff --git a/Starcraft2Client.py b/Starcraft2Client.py
index 87b50d35..fb219a69 100644
--- a/Starcraft2Client.py
+++ b/Starcraft2Client.py
@@ -3,7 +3,7 @@ from __future__ import annotations
 import ModuleUpdate
 ModuleUpdate.update()
 
-from worlds.sc2wol.Client import launch
+from worlds.sc2.Client import launch
 import Utils
 
 if __name__ == "__main__":
diff --git a/WebHostLib/static/assets/sc2wolTracker.js b/WebHostLib/static/assets/sc2Tracker.js
similarity index 85%
rename from WebHostLib/static/assets/sc2wolTracker.js
rename to WebHostLib/static/assets/sc2Tracker.js
index a698214b..30d4acd6 100644
--- a/WebHostLib/static/assets/sc2wolTracker.js
+++ b/WebHostLib/static/assets/sc2Tracker.js
@@ -25,16 +25,16 @@ window.addEventListener('load', () => {
 
   // Collapsible advancement sections
   const categories = document.getElementsByClassName("location-category");
-  for (let i = 0; i < categories.length; i++) {
-    let hide_id = categories[i].id.split('-')[0];
-    if (hide_id == 'Total') {
+  for (let category of categories) {
+    let hide_id = category.id.split('_')[0];
+    if (hide_id === 'Total') {
       continue;
     }
-    categories[i].addEventListener('click', function() {
+    category.addEventListener('click', function() {
       // Toggle the advancement list
       document.getElementById(hide_id).classList.toggle("hide");
       // Change text of the header
-      const tab_header = document.getElementById(hide_id+'-header').children[0];
+      const tab_header = document.getElementById(hide_id+'_header').children[0];
       const orig_text = tab_header.innerHTML;
       let new_text;
       if (orig_text.includes("▼")) {
diff --git a/WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png b/WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png
deleted file mode 100644
index 8fb366b93ff0debd825faf213132da839c04a89b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5945
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
b{dxZfe_t5aW3%%500000NkvXXu0mjf5o%#o

diff --git a/WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png b/WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png
deleted file mode 100644
index 336dc5f77af2f679e4b5734887aaccfdd5e5dac4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6699
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
BH~9bn

diff --git a/WebHostLib/static/static/icons/sc2/advanceballistics.png b/WebHostLib/static/static/icons/sc2/advanceballistics.png
deleted file mode 100644
index 1bf7df9fb74ce9b4b5403de20b657d40deb05daf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11624
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

diff --git a/WebHostLib/static/static/icons/sc2/autoturretblackops.png b/WebHostLib/static/static/icons/sc2/autoturretblackops.png
deleted file mode 100644
index 552707831a005fcb9f9ef12c6f7379577355d5c5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8834
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
Eg6#q-ApigX

diff --git a/WebHostLib/static/static/icons/sc2/biomechanicaldrone.png b/WebHostLib/static/static/icons/sc2/biomechanicaldrone.png
deleted file mode 100644
index e7ebf4031619f66461de686511e9212989c34ff6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6999
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

diff --git a/WebHostLib/static/static/icons/sc2/burstcapacitors.png b/WebHostLib/static/static/icons/sc2/burstcapacitors.png
deleted file mode 100644
index 3af9b20a1698065fa07a7729b74cfed01b094a27..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2579
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

diff --git a/WebHostLib/static/static/icons/sc2/crossspectrumdampeners.png b/WebHostLib/static/static/icons/sc2/crossspectrumdampeners.png
deleted file mode 100644
index d1c0c6c9a01050df51d171481302cdffc38326dd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5344
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

diff --git a/WebHostLib/static/static/icons/sc2/cyclone.png b/WebHostLib/static/static/icons/sc2/cyclone.png
deleted file mode 100644
index d2016116ea3b908f074fa858b45709277b376ba6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8524
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
GLSTZ`gqtA%

diff --git a/WebHostLib/static/static/icons/sc2/cyclonerangeupgrade.png b/WebHostLib/static/static/icons/sc2/cyclonerangeupgrade.png
deleted file mode 100644
index 351be570d11b870ce3d1065208c13a06814df44a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12682
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
Eg7O=+9{>OV

diff --git a/WebHostLib/static/static/icons/sc2/drillingclaws.png b/WebHostLib/static/static/icons/sc2/drillingclaws.png
deleted file mode 100644
index 2b067a6e44d4f787505814b9bfdbc54e006a6d2d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8451
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

diff --git a/WebHostLib/static/static/icons/sc2/emergencythrusters.png b/WebHostLib/static/static/icons/sc2/emergencythrusters.png
deleted file mode 100644
index 159fba37c903d47ef1a4b9b1a62c9c416f0a7720..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6796
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

diff --git a/WebHostLib/static/static/icons/sc2/hellionbattlemode.png b/WebHostLib/static/static/icons/sc2/hellionbattlemode.png
deleted file mode 100644
index 56bfd98c924c3f3258f63dfee3debe98e9cbef71..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8210
zcmV+tAno6YP)<h;3K|Lk000e1NJLTq002w?002w~1^@s6$Cptn0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQAH8LKweEk3b9uG-GK~#9!?VEpmll8gx-~CD2
zv>|EQv>_pFXxdT;g;r=OD=?x6RM1%tim)Azx_SJ;aBd!_)5mSjZMsL@ba>o+9=B(D
zbZ#nhpaqoG0bQYhjg-*RG;L@|nl{a^CQTdKl%7BCk~V-SICtck*Xxy6?%((Q{oL1&
z&vjkj8@`Y)<O}&{5vf#~v*ByE-LT<nx4j9>{sNH;$c<~NA8Ii+4L!5QFt!24o>^mX
zKeNWLT`Ce4eu2(el9MJXZZS3u<)n$mHo(}Jvtew^*)VqCg~!Hj-mqazDiTR9*RjQa
z7GN!1W@s`jUL*q8{K8`~`@d3C!*w+^-@9A^OZ<$kD_XkDz|v&~8n@R*H&(1MKu#sV
zcmKR~EB<i!fy)iBxW7A6iIi)z<&6N^Y&i^%0I>SeEfg)Q=C!XZ0ARUF&UX)*@3LB~
z&;L`K<Qbr}*>bGC9smlLRRi$U;u!$^th|u-9G)+H*tnSMn$3>^7)mArqWS&WsAk=N
z(9Cj`oF~c)EC1<Da*}Bt(Pqm_v@!{W%c`S*{aZ;P%T@B|aZOp;hAZ#?aW&BYiTPcI
zR3}Om<p9Geq7;$UV%__X0xaP(dlLys|F1tBNw#*olN8z0Rm~kX5@k6APK8-gRYgRW
zMMRdxk6wFYdP`667^fr6pZH}=VMk;*{J$c@;cv(?vTi9~RBkAkS+MlviIaySkx1~e
z)UfE_ASXwu>g;hkQgW0k;zmLMG(37A5C35sfm0#YEzpHtKV-QBz?G^F0U98@r*7A;
z&&?i0#Xw8`{OjmA{Aa@9iG7BZ2Hf88(}4Zp-nyS(mVg1|DOFb~r>V9%yB#TUBOwg4
z1>aV8%*+!vEd^lR0v!O~x2afq<w^h^edyjhCV?iAUj0bTiYtom)Ghc*Ie_KRTLfEQ
z2Eb~uVzpQahr^UFF`&-X+U;G|Zy(%S_xfdFl9R<h5bR8ZP><8GGCfs<Rw4K>twPTC
zwl+kMYw7k<eBB-F`O8katQPXLy48E?cKsZfl5^)@ni4beZpjmcR2iz7SPs2~<<ML7
z+1e<pD8p*8vUcNIx*cwgHya7``y~>oY+c17gC@}LHwFX#z-0p%fH+hBwN$BeL0*Q4
z16Bud38Ta(oQC8ST!SMFDGFG%`3JoEtEU+1@8d@g-Gf9F$LgAmo3-<<esH*_BQq<~
z!)d<`Q{Ag1j?Kc+_AZN;>S%AXkS-CEE>326c#NBGTgL~7Tj}@tIoi}znm0pZ@OwjV
zL?YqA%LXusRC-Oo?_ZD{52?wC*u4V`4o4V^PXb`=jT_kdhgV5XOrWGhA3bmOjI87{
z&*^Z7@Y^i_3<ho3&9Bnq4&e6(DJz{t-TRHqnKP5EukXfiRXK*MD)9S4w3^I0Ku#nQ
ze(Q5dT+a`f40WCs&w${i<!K^{a%5C2ssf;~p`ONu`sndTnoS&OHVG+Ju_C%XbJ}8o
z*M0Cfa;0#t^@M}E_Zwr$^9(h0yBk@%;aZCIg#dFeCzF&+5s7X;6%OkvHL@sZo`Eo`
z+<es2HBqp%S}nc3E_!=iWM?bzkEG&ohgiEri#k)xuH6lIy6YJlura-81B1b4%H|d0
z_X}*I{kR?N3>DfLY5@9Ne%vk(ZkK1yWn+>e5!+Iw>J`K%WA65%o>f7o%|UP&`n_(7
z@@GJNJjSCfwAuzJnLC{>r<+re0j7JpFyv<N{@d@c^Y#BCJ;{gp@Gh=id^H*I4z5(s
zrO)ocX7AzGH{HVrzIJRj8^#ZgQZ`plczBq$mX-%R?%ww<4<06>1UMpB3w|l&cLPv7
zuR@5RCtEQr5zNfm)rH+VL9A?c4=;RuIqx+H=JvDuHse!P^6&$jqQ?}bsQ@_K*#>|!
zImp8DG7cPU!r^d|oR|!-z;?oR_;Z_lPZqgaUjg8;n__@!{jibN4;#_uYOr>7QMY$r
z3{W<^2aQ_Jdku~3Ziw|yhO4S${sHFCDB`fyj9R7Sz`-WeDkT-=W!O&GcK^M=`iDAw
zfTGIvti5$}%(l9{^=NZ*F)Ue(wabRh?xAX7AsV$Do81!yYj;B<Wi=al_<>CruBzs-
z$F~5mU`A1lhD{c`!wIndvLdd*RJ|sWs$GBAw;sfL!pez}0?PjNY0{=$0f|{)`3tQd
z8fpE|NZ9A0ps)aUx08_9Mcy<8Q!=MBa5|CM3k@8#Sn&r9w7bL99k8M-TY&7|wL~O3
zdfy&Kn^w*n`+rAzMh;_1V*LF>7N4u<e~&RXcKI-UiFRhi75eq+X$rQ!U5DRPPntr5
za*p7)6w{07YpFxMa6RhE^>nwqkKgNNWOx|A*G+ghf~&U&YiB!(>>R#y^^NS`Wn{We
z$&H(?VL${@T^9WoH~k%MPAR>ZkD0KaumapN81x_i+!qih6~J{BSLn+&|ND9>=IeQ7
zyuNSz{o?>p&}OX@w%hl=hB!@vI4xZOGe>afhUL}hOG<I|_OO4Kk?;KcR_^=7Z85jf
ztSpW$S1vOESUi2McR$6`7ye^3ED@ckxO!pQ;(NX=y>`n_AF0V(-FVo9quYggngVB9
zIX$L&g1t7Ba~3mT*)Q;=mO27<6QSV|l9Q((%g7=$5a2ZNn3|0ON6Rl@D5zxrE+Z!`
zP8xO^nJP+&YM5<TD@VP1F&{Gl+yZoPIug0qA^h>dJL>-Uy*r+2>FWNV#nx^9%xHyv
zQT2Rn&C@%8%ro0Yhl`^7-R*UZxQzHec$l0uLeiZg3KQ}=g`dw!x^%okyYndk!h~b)
zQCTHumdDd2Xjb7ya%WVqZ}+okW>j!Xi4YJs{^+^5j~L^H{8`2i*Va6-G&}rtfIYpU
z#_zwmb>U~CVfsbY8`f{yvU6m*E>)bBNvKb#+4mi9X3%S8&}+rhUdNbsKal||X+^@o
zlM*A03=JSt6_T8ij#RDX<iS5M<h27ZLq89>Vj6PAG(4_u?A@(QSC^2QDkU{l%EA3_
z(eHDhnNfkQvk}SZPLx?0`1-s@PPl!?FGeXgf4TIw$1CF=?ixts(Pk-mX%Y1YJ%QTc
zaIkyAfG$mBrStUfl$PpCe)IBc@%r-WHhp<@5rFB9?Pu31COBDvff1LCu(R&G7j<<s
zk?sMHWj}IVC34*&mM_uLcJwgjqlYQf&&Pb+#Qp=X2u`M;imEF&lRKk=uFgg@Gb#Wp
z|M!iZ053=ZQKr<?<Mwxa!g0-+yt1cPggU>XruFdFLzfI#={)`2rKS3fWu^McCZmb<
zo3`-UmQC{jOb2TToi@Zql|-LlLKXoe8G=6wch@1B7JIB%ro_|!=0u`hun2Gp;LMpX
zfG(Yj*}M;r*M_;h9ujrr&Jf73t+SEQh=sCQI)E(TPpy5Pk(^BFPT<=g16)RhR=I(*
zT)?Mt`c+pN?k$>A^33UkDbpRUeoiM$L76c`cxV)x<v8=N$Y(Uzh`+mz(Sd{5j&EaC
zS}W?Xk!v)kxp`(18CP7z?BY56t?pf}oqdvyP$_W<X+(x$N}3XP>nrpRgvr$^5szAt
zbk(!}y?5v{e<=JS1I(Q{jlt0*7M2!s^msk}Jv%7T43MihMfzx%zkb+E`$-2=#i`8A
z$w)|oqQUU+6|z)Ovwtw$ecr}OBBk1EesO1++)7TSh~Ih3h@>kC_Z)rS?XtdqNgAe^
zp?%`cZ{7*O^S>1Ouhx#P=zeR54Og!V0F_#aO0A?Y(ZjXH>gX{>U~aJz{$%7xs}u4j
zu3wyO<ZKn#wYQO$_XHEX_ean2R*MT$M-Kp|jvlJ!>9O^==yD48#p9u-auIfq8;8e3
zeTPGMc3JwDY`)+j5=HG*`8ibOD=m+|YkXEpIN*=a0Gzb6?&BwJEsHaKlOG{DmIQoK
zu(aCi>UY;+Jk&Iizm?CAtwH5$NJ<iv)?s&|QY$gL1GM!8D9VbRfAX)_m-5n|jA$nT
zHY?l6+vCfMX-Zt(&L~*3mTw%lQ>_qW@^i++Ff1<B^U4mv<h7zOTlWhQSS6QJm9N6)
z4Pf&{n@I&{{vWuybk%#d1b{!E*;((FQSX*fmFc72Edv<1B;s0imEm?E=?q9`g9T9c
zZaogW6Ng>!JL>650NTbuYwHur>PK3gf|dcTy=5`iP)rlHn+`Xjn5Jasp2jFxE0$F7
z*j?4Ezq&Mfe6CU`E^2ZVRL#@JTx+t10c==M%mY`K^5E6NJ?lH1=w?;{T(|Q22d~o=
zFJ>}uKzFOD?y-yZVIq+zf6>w<zjSnUF*qE-9~?qIGY_xNN5C7v?eXC8`&d|h1$p^e
zrm3fKva6HRV{ydA#bF<gV{odRlVekG_jWMg>n3o@OO7Z+^RWZWEsDq4d61m^Wrz~`
zar8JCWt7y^DYyqi9BDp^rm%noSFhlnuT5v=(&;F~5bSlcI!{5dGznuzCx2}|N`|7G
zfx$4R#!@&nmcno(jAw9|$Z3#FiD&P@BdlCHmpiVn;;6~Yi=EYcYr~hBk{Drc%K!<=
z>nW^UPGb68+#bzPkLj5$K;)tTOH546kY!|SmStoxYvv4sp^3ufsi83afdKu1AU3-L
zQF0=I{(dA=r=r$qn30}<r+*;&6Q>Hd6iZVH^$*h0H&K4p6{rcgJL#}=kgv<9!_onR
zeikiVLS|ML4SV)6U6F<^KMP%c763na>92x@$)^hSwowVmDKbXFe#9~@r$U0ZFU?o*
z{j2r-@jxp8D=YP^tkm<j-b^}sBXsr(nD~ZraGvlZQ;3l%#A4~xX$$PfYu`8n+9xte
ztuDVvTcD$E=PsI>g))jVJ9AR~%7I3$V&l5Cs5KhF98TJ3{98S5?=@oX>WSrBT^~IW
zMOUCZXIooKD@C(}TyfWXt?YcSMHuw*Sv<IUG4*B}iwkq9Z?_@N&;mq4KC8vmIl=e#
zbh!B8yQb*+&i%sj&%P>Sd5P$pds>gVupV;(SeV2$K9SQmtXlcqx*a<)tXx5>#YSn#
zxp}G0?qJ{k1Ei-5L{&9i!@{b?6i1vq^>S?#G}kfV-ln}1^{WnxgM6I|OS>IW#1eB|
zbBmx6Pd@r%?tA1RUU~M#=)RT9XPxsLA+Hs2hV}=3Ge1^kX*Z6J_%fH~D^Bd`aLwG)
z;d*@iLVXNqPj%#7aO@sOQ^&>Ul8K_?J2v0Za=7s@o?Zu4LNx%J)yimOi24IYHms}0
zcG5{`D2&tLM5$7a|K|#HqOp-JufD?FbEM2#aLvS<6bWy)s-%Y8>{(bN)(K5?+OgZs
zteC0c7d2HB|KwFR-c-XYKYxm<YgUt6Si~#OKgV}&xs^qwWvt!23IBko5B!Sr4Wn3{
zW7o>X)2ip{sGcWi@_oN)iVG<XxaL2GxVw&USUmZZ)0V&7r1!h6trtgJ;}f&)xaZEh
z=Pz8q^js}RjYj(YegL{`C+QCi&>sjgRgz9-w%}XJ%F8G$F2w0@VQg%qw4#Etg%x;@
z3R%YXKR!?X3=R8__tPJ8qscC&Kh(!qY7#D|ozQ>~Q3C-F9qxWMEuMoeb1Hw>S;y*|
z|BZKE`W;6P?B~t@{1wxcN*as;-LcpP`eESd^9|$FNM!pld*4bxUVFqs?GX#7a@NG1
z0Sh1!iJ@I%CyzY;?bD+pr!S6&MZ&GWdgl2$z#vXZMx)hI|9%~sJS{eR4^;~%!hF-g
zrs)4<4FhO8(8zNyJj>HReSn?2Cu;arB{kGHZyoPn=Hu!SsDOT61uJH1*mc}S@lRf5
z#Y_#hb~F3l7V_1qYgW@>Y~rck{)RW7-9m%W2>3s;8W9`{w*xb4k96pOO~5y+ZZ=$K
z<i8ym4vkz=YBWuw$)8^_e`#uJ>I7IPtVkqj;~F-=R7pBsub;B=GSVgKC{;@K?G~b#
zQmsa*R`czDStdB|-Su>I+GzKVP?EotscAwG36G8<PLmKC2;%B-;20cc#Y_zy?tVJl
z{b<H{*HpQjsd72C&Q9z-J>0lTXo$RjaDNbZ`eQm}USKEi>ip66b;&_%+DN*V&@=-%
zGWBWe2V0v$KF1Dg)7E<;gGWa$sU9ZHl<I-a$%)C|(3k3QIbE1OG@+j-XqQ5%#AIwD
zRU(a^<M;Uq2mREn%C`WzSDsx-?fngyJi?SGlP83aByuGwbOnZlW=Dq~ak`37&~c_s
z2fzzA7}$Qy%IhCksh%qYo!TR2q~rUYKe>(VN3C4@{MNC}*RHlayY21kfeymq3ue>B
zdBtx4YtO9vBBDb*c4PUcPQJr~VOMxCyj`o)2CWuruhn8bqR3GoPLt#SSS{^Q;8Idj
zNJ&ZIMCXal#CR%OExsQW7i2sF@aDT#6sdxra1D(RCV~D_0tc#h_=!Xyd5VOQ;ovw2
zoOp&8ZZt4mspgq?_tQQ;e^xZUzephi;P;1HsVFMUs3<DD3y?W_duuN=t}JQR4d1!G
zbe3EqAm8EaTOS_s+djIWe34@M&=gg7SC1<b;tQf_O^)&hKCe&b_xbVr`~d#~LO#89
zM+Y^lbWzRH%f*;HAyjfHwm_K0Y8mwoKZ<EWsYaYGB<umN&}Q3y%!=}n7kToAHCUg%
zk9R&4Xh~y>i8XVyY(Hu}w;*`!n!7e0X>JByIIq=6r6q+b>Do3&G}(UB?>$j};R^hx
z6Su3U$2|dH&x&yxGKEO^)cA5Dkbe&F<7SyFNx>EfM@<qyED^wRIS#~}vu3uIO)qVy
z_DCDg-F&U^k`h8O$5a%>a>R$OH~f0*LDRBUhwG;Eq<qsS2T`-b|FN?cKbsF5&VU7k
z!{G>tqNEkG70hyvuyx9W7ib*_QyL60e`+$dmL5bve7pxyVi2Ey7?1BXRXPQSErNxt
zEH7hac^P;A@)e3dXr@%BVU|oBQ-c{(uZcSl0&_<zzMNu`b7o<6Y`p5D8uMXS2ZN(x
zcA8yJba+F5`&>*$AwIF7qc3!8ewLVS|0%YbU9^sC*hzPYcJG9iBuW&dh!O~gM+I`+
z-N}5NhHh^^+YTP3&)bhOV=BrFA$QD5ncz*&9fi=TF!GEn7A;sJ4DfUu{XR#kJVSlR
z<8!p1l_RUd;qXSF@sPv+9U$~sYuMEBNbCQ&1E0P@NJ(l671R_?BI04FwYaFYxT2eU
z{$XTN0f-(yQ4IqyPFgP2X|S9%S-mj77;}d}%!~4iC+|8Z2lD&<wSLIy@P>Lnc^B~#
zKw7tK{+xBo=D)pe+5D;2G_7Su>6HsE1lo$(ia9Iw0!YQgCc5DvxTZkCJMAtu?KE-X
zM2NgRaTK&OY5RPgCI+}O;K{R#(M_G$cI}F_v{_o%{_Z#t9tmRWXhf4=apEH$ulHgG
z|A~2+C{6mMN3PUwxcADrw*sPf+J(rncEK!w{`>#1?V;Vr%>2+Wf3r{r6=Wp4;uJ9N
zrTs#*6T5fETsKp-6unA;UL^op^KvW;P|ui&>EQn8x@wvVhc}t@6yX-i+)@e)=JNIq
zVK#N$Be&7e?&8TELN%gr<{})Hy4DU;?X15~pZa5FMu^g+EY&JDeE%x_<G|FrYdfj6
zOej-hr-kLSi>5B0U9@HS>>?JVjmB1Chv2@~g|}UzR^dylz@JtT-QVL7=DC?1F4mXp
zu|9e?+DD$7h^7bkqc5+FE=y8R<M4tcWt6~>;DU=L0rq6AiH1q$tu7E!pAJ(kpDAD!
zxr&O-OZ02I0>ifhQ-8SI#2%{)X^!9*s&xXR-+gR<%z5ukBG!v@6};3bJp9)dmUG1J
z;Dj=Ey3;KhC$Ak8wBfabCQ1vmY`I|twZ|+}&(`ty;jSoX`tnMA_H#L9Tl*0TbtRZB
z%`sq|MIp+=;qbvv3)uOhq@*HOaZ^RE;#o(3X!Qrqfas+rD|s?8c``9q<V~X>Lqx5`
zPrEnF^~D+NK4zw~&qHUQhwk7hZ2ci@{UPeRTyz9RqF@1dQc7cP)^+p^)|cxsIb0|t
zVus@rqF@22YrcWYaT3$P{kR-<NR%-pX^bgJW1Nb_lP*;vm*?Q|_TusOA`;11q*E|G
zL(EBUh@|)k>H<SndWQBJy(jkWh(scePXk!o*?#PyRh7Hj`g{hn+mG4pr*f7a*;ENu
zo6x%VC&e~DoXDt}t(tJ+(g|~uWXMqZU!=)Vh%=apGTn`TEVfahimPQ*Tuef!m1Nge
z(ii-iX19<QJ-N6TrKn*Hz;M^Yf~I7M;=(~c;h=v9K=HzwRRDH#6B4<S(1;98x=<Qg
ztagC3nmSV(2E8!H<MsF7T;=NN+4-qWQkx~6W6*1Nw)OdP%x=L)6=q5~VY4HfGYhRo
z9R)2K!sQ{7;x*V@6CYWOcqdX6N2ish$Rd>KZj|Znm~(UD_Qk4tsFh(wO?15^GoAbP
zwerex0NR0TfNzQ<vQ^=r|DN$`0|Ae-+0ky)7cUg56``Im8cBd$NsxVZ6=q`t+AQJA
zlR8ryz_WbBRHlp4FvIM;C#)|2f250J!+ydP3I6^7(y0=(8a1kPp$%a6h%tM_I1!Rw
zO;$P@g@g{Tf^^wL#UddrSil(#)5gWlz3}(Owr;K3Cn?EHXKtp1mybL6hJ4@Hm&^3+
zi*EgT(MQe3Q596)6!16~OXSKs<)Q>Mk^uD%^?0V?M4Kf?tB_-Lc}Pg`0PHY*Xxuzr
zufH_Fv{}+Q);|A{lDwRA0E-T;KLDAAsCKO>bYT>2q{|h+<_ciz3o`#pH8?sav`m^3
zLYeMCDH*RW^t_1kwD3WKbF7L41oIme3&BK@sbOxWaL<>IJ1FdWehgqwlc_Kq?y+2G
z`cm=2nxjb}m);f>&ex;|7(s+}d?t}LOHM+92Zd4z&~7p|Rl9n6EEfydM0ZG?({S4@
z+L*6oMJH0u%J2n1o7!y{EjBb7VSR4NT;`U{<+ewkV~s%@J$|lyQZ=^A#fj{DV@Dfm
ziJcadcMSpGFpd+0q)U?sGD4_p`zhDn+m+!6z6)kxaq$VsX^J0<(v{y8NrZ;5a=c(>
zH48jYtyQ6zrUq!Q+rD)*V7_Ep;qv&`Z`)=*Xm0alPbAOhnZcveP^!~#+o~#_`n|xh
znwy*9tHS>6byi+@%)s_KD@|Q4j9n9<esox<>1R$~5OYoCJfVi?vIe4HMXMLNYmR&z
zSOBNTPLGCzJr77#Wk<sS=Nyql`Bk6Ct^)9T9Y`}&xVi-w;p%p5xm1&k)gTeST61mT
zzi;0r0I$oAZNMZYiK1!Att+cg&n)KU|9Y8{k`kJmoAIS-S!2-h!jBCoD_^81ETuG8
z5e4n+4q%>2(8iu4Td96}2#YbcXBlJ!;FR@crSg-2cFuS*R7KI$(d&>Zl&XB-7cQq`
z<{6wXs*Z4;ZI8FLd02C8A%#Wqk36wdr-?~~0ZK|rq8bM9!efHJo2+4S_57G0fO4)7
z9h-i)5y>RYiuM}2wja6FsOI-N+QxsqK%2|y*f|L-KDCAcq^HH-0Nka{NnR?=nTU8k
z&oGJo6IQH{h#5{5Bathxn+3Lh!`=6@^UrT$X=`QE{SRZv6LhM<*hYiVOv8zoz8}f>
zP^blmZ#u9Q!z~R29JNSP0!>&%EwAl(vD{=a9^!K#7fim>)8eZ}!pWu5jHLB`?}#3d
z=oAxC(-jOM9t)u=oFJnXn;l(IF_yOR-e;nWMe_vOv#7KX(gh3Hw#SFLD@^jZmFX+j
zQuq2}7;c&PLO0;3MLpPr$zr_SWHJ7q&plu<(K1n_0B#IN!nZ5Z#d^i~lz{Q?LkW5W
zvl|jg&k8HDvz&?$H4AeE%^Mt*;<5|iD%8b@B(n%OY6&`oWVu3rEBb;m9{%N~DZudm
zG+>{&9u|&-UBEAa-vZaUf}sZhy?89PNI6Nn)&qY5`p$PfbC(c))oP+98BM8F)lrjV
zunAz0&xw4hdHSXEEB{lLp0a3iq#1%Sv&nR?r_Z$)K%1Liq|Md+RGX`tVePWawfjSO
zdTq$Fg;_o$!^yExI9X6xdA1HuuLZTY(QNXBmb->VY?nP?7c1J_{JWB-D!(Pq))aVp
zZFqWZNMyS60_N$pybSayN1W{@@8GZgztFHt5qY*|i9B2LAD&)Y5m2Dh6{C<RjT7e)
z;!|}y_rLetDn6$Y_dj^=9AK|@rlG)4DaGX(#^o6qwpc9dJiQ&;_(IN=q@*N`G(*u+
zy3jBt%}_iI<j2RwCwzg-1ydJAzBEIT{{<3X$QJ_e-!YH3?Bjkewg3PC07*qoM6N<$
Ef<zJfNdN!<

diff --git a/WebHostLib/static/static/icons/sc2/high-explosive-spidermine.png b/WebHostLib/static/static/icons/sc2/high-explosive-spidermine.png
deleted file mode 100644
index 40a5991ebb808be644a69e80dba8a68115c86380..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14334
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
G{C@z-2s91=

diff --git a/WebHostLib/static/static/icons/sc2/hyperflightrotors.png b/WebHostLib/static/static/icons/sc2/hyperflightrotors.png
deleted file mode 100644
index 3753258458769357ecd299f44b44dc9a3be45e8d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14285
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%0AJpb%7_`c7(-v2?Su1`^4UB&S;2m{@A
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

diff --git a/WebHostLib/static/static/icons/sc2/hyperfluxor.png b/WebHostLib/static/static/icons/sc2/hyperfluxor.png
deleted file mode 100644
index cdd95bb515bef7d712352f33e40f92aca5fbb871..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9261
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
P00000NkvXXu0mjfj`g)7

diff --git a/WebHostLib/static/static/icons/sc2/impalerrounds.png b/WebHostLib/static/static/icons/sc2/impalerrounds.png
deleted file mode 100644
index b00e0c475827388aa30c6470055aceecb04b8e27..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4347
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

diff --git a/WebHostLib/static/static/icons/sc2/improvedburstlaser.png b/WebHostLib/static/static/icons/sc2/improvedburstlaser.png
deleted file mode 100644
index 8a48e38e874d290294b4c18f3a7caaed02a82f63..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11115
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

diff --git a/WebHostLib/static/static/icons/sc2/improvedsiegemode.png b/WebHostLib/static/static/icons/sc2/improvedsiegemode.png
deleted file mode 100644
index f19dad952bb571357e72fe2bca831e127f3396db..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14293
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
Dh}d_J

diff --git a/WebHostLib/static/static/icons/sc2/interferencematrix.png b/WebHostLib/static/static/icons/sc2/interferencematrix.png
deleted file mode 100644
index ced928aa57a911105d0dd1979ae6054a51a41e48..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10537
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

diff --git a/WebHostLib/static/static/icons/sc2/internalizedtechmodule.png b/WebHostLib/static/static/icons/sc2/internalizedtechmodule.png
deleted file mode 100644
index e97f3db0d29a464bb36762d7aef9986e64fc5db3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 16425
zcmV+^K-RyBP)<h;3K|Lk000e1NJLTq003G5003GD1^@s6IH*Aa0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQA1}R{=&>;W-AOJ~3K~#9!?7VlFWLJ6a`&&C!
zuIj3;&T*zE2hEH$L8BZ1fxwsy7aNS@xlTBo<H&IWXA_Ju25i6>VN4JLB#?x%MjA<z
zbL{S!&be~haos<vy490}IN*QobN2J}Gu2aFwfBDax4!Ux@3-Lp9{>0F|I;BZdo7p!
zt_mR(ga8oI_i4N@5kkED$8zaY_5TH=1R><|b0|VcU;0RS$$1vfFMr6jUF(pq@VD|6
z?rr&b#gBlOyvp|}jeq@RKUbVnyUNWieSr|dr~@Wl6affDD2hP(NMF_gt$#$+@s)M3
zg^*$q_y+ny2q`2;&;LmSEw1sqybO%x0Elax^J>@h!>&<n{P=(c*o%g`9QaFs7D5Oq
z>*y^St@M3YN@*{iOZvWY=}pK>K#@`kz?b!3gb;$o@BAUy$yd43u4Ndn^Z>7B(bob{
z{E$_@_+5*Z>@Itl%CgrQ;9UW<5MuEUB_O1fzLc`MbRmLfBr!!1C_+I|RVjp!)PWVQ
z=lOsVjYa`UI24q#vkSs;9XdNY<mBX}kT2hpxW>(24wU#2UEtMRg1GFQ%YhQhjONvx
zfBF9#4UjJa*@gu#2l|rFF1Kh!2%*-EQo2h|LRABv@7)m$1b0Ov;c&nVxIzfI=(`=q
z5w>j;jYMQL8o>;hn5NF$Tt<K@TU%SO9ZTG}YnRMtv&z|Xrx~A`mcGAqQF7T*TMp9V
zL-()ozPt=DmVIWq@06EW-0~HvUIwCn70|D>+RO&fPXhM?PQ!w)dMvZ(#urHGFMB_!
z>)NlkHnqH~r8(7P7^Wws^r`y;QL}17Ra923Tm=eDO-+!=WaQ*jSr~z!yyK2r<m>Nw
zy*PhvP)GzD)@|g%;5p8oJ|XuVImC(6=avJ)HLTIUY^lo20+6_ds}NTJB@pj<_q)ZW
z%^R_*mOOFt1Se0PVrXbsIF7UY;mNC<>vC&X03Fx~1c5KUQjlJHp(u(jr9?{UG|W2~
z3<mzVqrLriyV^Sf0KSy?QX+kya=A=vTN~?FuVH?Ej#FpPGCDqvqNr@#w2>RGzm9Y|
z&8AITc+KnX;e|bW86F<yt#5w^r%#+@erlZmeBkSR=|8^mW2a8hNQh`8g6ldsu8ZgS
zxUP%q`PjAtz+2z?7C!wi|3WMp;q(9YS&pAL$;NdX=;-Vwn=6vZW~fyw%+Aa(JUq<4
z{rg$SEWFxF7zF+Z_~x>Q6KGhxeThXk0@l*uOWEJw+jsBkfmMOI`8jH}8k(*H64!BA
zwQ_)tjt)+pJ;l*uM=4irx_f%qwq-N%SeR6@nb+QZFRNCs1z>z^lrzUq5Pbj7ux;ly
zYL(4wzwsvSxa+n2#b5jd!$U(qGQhic?c%L({%PW|IERlOX3z7_GCnazJQk%=sj!eO
zaMxXT@aa!~mes3Q@wKmhl|TOD-=n*$m!JQoU*-+>+)FB*0#|bM=piiIK~+^e*JX5c
zl>5K+O}_E12k<=ahh545@K)dnAak|YB9;Y1U4ZZ#8HS=NH$_9?Pp%pm*tTlr0OfLt
zp$o%=!yz`V-v~(dAK1sx#Zh9h1RFMPU|>ZrhOTnmb=$b-o}Z$#r-R{h!`%O^ue100
z=NOwB<#n%pEt}SD<+?4~=;`Sv91l<|l=<EN`8)jUzkcpj0laO?HnwirOu1a3tD~FF
z&Mx}<SD*-$!$%MC?_c@?7e>eVtq=Y>AOFNZ0q~Buzn$-X`+olSpZpoW{|6sJH|p;B
z?5Q*S+vh&P_{2E*LJ7~8sH#RZ8lxrMLa~_Rsi&V~bbRuMUDm_EF9YMRXwl;30Mw{f
z6yZzXIeF>?g?ygPn>MrUx~*7tjftso4j(;AHdkat{|Yv5+DIf4AQp>q?;GCCZMWY6
z3jE;VNBQbkzs%XQXBZk8;f^=oNZ;00vXyZzE*MC&N-z_ry|tZx`ot%A@Zs+=JwE+I
ztavB8cI@E5!TlUObPxf=6HTmHy@s1^yqR1s$N1zVfB9D*=8yjHL+pETKX=@D8?CJ=
zo_Ok6ZocIf02byl#NtsR(J+;2l~TD#EEc6$tl+v1!^4A|IB|l375&_K>y13MXD=gT
zQ?GPs_7zrKPi-&r(Lxv!)J95&rm8naBH@plhOx6yD4?n;uYcV=%+JsA(t!h*!4TWF
zY-QCzKlyx?ZCkhVwzs{D{(*k7^EvLj?@K)K_#@2CFL2_-Y2N&^_wdn={VnNWD@6)a
zsugP03a;(rdlGz~!>5k%_#;nq_VgepkDX>=DzkLax}kB?u3faYq}jW7FSS~gSS*h3
z`&hP3sa&F3sp5F>;Sc{AANtUr^3-Ebap!CA<jy;8=Fvx=MALOjg)+5TjY2+;83@qX
z-NA`t$M};E{SJXZ5Z9AfmW}7S6pCdEg(8t~ka#@8Q+r;bTD7hP^aH@J1CxLzgfN8=
zw(tAS6|Ms*H3?M!Ra19FLg7ya41K5X`>3i)TYDRGbF)-yF2DRszs%Nc8#sFODA#Y>
z!QFS>Lo6BP*x{pm;om;TiIc~eonGM7xwHJnpZyXa|C7%EP;urcTV))_#+MSI)KeZ+
zRcVPdqhMfDWqe_h{Ra*)o0;cJU-~lcsLjBdmF(ZYAJ=sWm;oe>N>oZ}w#DT1Jnwq<
zJNU1!ew~+I*vGEjJGuMLTX^h=XQ`H}-1ns~5RJ#U>+X9{Rh3e)L_8iRo{aO^PyZti
zJn%Kr={72r8n)w5DOae~EG)|+8VQrl<vDud%(Z~NANUPm3eXfqF@+G0=Xv(>+!P^%
zD(kMp1yB{W(=_zgX`0$?+YT-1G|6NWQ!{gDx<PX?Nnig;-thW2v2({wD5}cC-+PEp
zf9eyAj$dT(+$iTR4sre4HnQW5*Ym=OJ)9jqj$=DCMH4h9(j<a$0)Zg9sv~_#*{V>e
z6|iiZNI1+5Yi?otrp-M0{U@mvtDHW28sGB?1R5YKbvv<Km&vI)ZoTamzW31g866pC
z$Mzf8xM3BKJp3fHQ?q>PAOD`|nJMOGr!n*Z1FP0xTNbu$6ADFGxnd26552_v!YsjH
z1mE+KQr5E;0hLOXww4t6LXk?fb~T_+H~e%75UQ%GKs_D4EMZ@K?KRT94nx;otEy^G
zqq;*P$>#EeLt!qATwwI#2=95<{{z71KKE(9_Vuq&C>J?9bOF6b=U4yv18jfI7G|gB
z7?~O2^w=2=pFhIs3uibze3~;C&yvYxsn#kOrhyp=&=iUjGZO^WFlT3v^MUvM0%s1K
zC0EMfc`jzatn*rmKv5K`md)J40<ma>XP@3fI1*v!uAO*pg$KX$eQd|$lb`q-X6L3!
zr&|dHLrhLi($th9)!dA2+qkYvb8CutEXm&IpP^c<plKSas!_8n%H;~4@1ZIR=~R-D
ziK_<26U%^B6h+Z|-@iK7aYf-E6nrTOheDtz<nkpHMI{&vqH7Tr7Up>P`wx-J<#_b5
z@8SFK{N8=ow#|*Zwli^dn&M2ER7Zlg?pBb3a<R<Z+yV#2#<8jvimRZyIw3WP)CJAa
zX1Wqx_=d-S{>N9DJUEFN3S!w7reQ7-SE{N~t=1@4Dmb>wM?U%yTH0E9-_QOWXV0GD
zzwY}F+S<DK`@jD%)3cMLn_DOpawOtSNGaLBZ!ayaZ3snBt5wNo3+%e_7T)uo5AfiF
z_fslYa9x*VQ-YS}G?UZQOiWI(W?%)Y`g=J)JaRRzMmCIeF=ghJ*t;dFQ&4B<R8^%|
zEK)94K_~=+0bIwSyQiD^xjBv;IfPJDp5MC{+qFrw#o7PBVP5#geqt?A+E%vGv#yhl
zm2ITElC-p^>0Q}fU-lJ?a<M`&U!;^Paro?Eo}YUTGoX?=lR?#V%9Rp^Vbm{Nf@Wwq
zjzg(jA)ha@`^Fvo+OPixU;g*|`0{;U;uk;gv+Ta{7XJO;Kg;0Y8Je1sc%Fv@@`XIH
zSb~}9NzR-;!Pad%$YmGEW-@rb#~bc_3tP5qXZXS(*@ZcxktnX~a^}ow&YnHP*w{t7
z+gll*oS|B)UE50KrDWSREm{h^2D^k%6fDcevTA6CfvTzqA!tpvk<Dd6736XSYPEVq
zwrdWdL=fpooQli&7X~@EcMv_KlW2?6+Lxwtpq<v9G|gQ}!cAe4Z7F)z^sw!YE!0XD
zkAL!MD%lz`AklSw$vPBOK}t!vT*dV~6a{|&_x_0Skx7344}XtM8&-4A>t4?T4}62Y
zd!NNLO&rHVQ9LvuupNt1DNi5}VE?|oBoa+@cJ`3T%%kZ#T|J$6UK<Av?Bmp_)6CA#
zaq;2^)6<hAn-XZMf@$cqwxqZ?I`PARzPd#>0{9Zr$a*fQ>n5tI;kq8-sEPD_3|%J@
zicl<-a9o?QkqI{J9$@YDD|zAJqbyA1upJvCXb^9S<9R;P^T|&Ym>Ztw#FM8nLI#P}
zILY<|fmo2%RcR6}QO-R-$ikrvX4Js;>`T_BqSal7<GPee6>hzGH{D%5eDJq^lTs<m
z@BY@WQOM_b_|b<N{Railmsqw%G!jAAHLA60eKplA4(@w__-mR-x3rLMO*1n!&0qiZ
zM;IR;WBvL~+;Ynu-1GVfM-Ct1iKiat+|W6;U$>e5o~~B}+Lu1pBK}1K>Lrp%N*`4Z
zpeP!y<06DYI26M3J!0VmLJ@d1n_|Aie0G8BZe2n5hE~oUNpStW>q#Y>*z@24#!gIQ
zTMmk$5KDv!L`;z2c|N(BJei3sLJ=H)`Xqs{NlPe6BoQWG%A+dkl7(oxhV*@ERSVm3
zh=hZ@>E55>yWjmT&+K`U+i$y_c)W?1_P^A~N)#&93Wi~#X&R++iD)E>rm2)GWu)(u
z&1TS4g>-A0kNv~nbL{9b-upA}<BmJ;0v`qk2XP#Sn|9vB``-J0KJiZ<=aGlM!-h2j
zM8Y9T<;oR4deOyQ)pdw^>q#!ReJQ1{>jsLdP_0^Mx=O$_5kioN$8lT-508oQX^fPL
zmQwlFryj>HIILUOLo6LY`+>^Jtv&31;}(uSbC%Qlho}{8Jl`df2oZ_~k&SkkFC@a2
z1Og_GXTN-%vL0YGRi#p?;CPZ+wZ>g{-bq(y51;y%f5vqkHf`KYwNhbxd=%+PbW=mq
zRD=M}b#V|BOGQG#AVN_n7V^CLr{75=8sWX~ekY-Dlt2IQU((Um!PLYgxm=D@r%s_N
z8in>&48!0Te(o1p$SknunI8}^bV}u`QmNObNgM3sCDfvjV3+|^O~ds(0s#|62+UxR
zc%lj4^Qc-?rYB~IuaBTA8qT~&YF!N5ci8j5LB@_vv;7y=(R5RY6>bM7o<Gk$zi<<}
zs`K1KhgcZPA*F{I4G@e4hy_CR;9D-CE=KQq1%U5))GP<rbx1VDx$DlmId$eVXV0Hu
z%jV6j=<DO~kpnokjSvdH=i?~?-}iAH4<T$cTf=c&JlEl-n{H*>*6qCg?LW=RfwlbW
z=RZ%aYH{+!Nqpa<Ii2P;uXzoss$u9lLI_TuKFyA;*K_RH0nVHqdR6}UGWHI!oO6;=
zqG+nnb)#-=K1<b@ZkR;FQKVC2W@?r~waB(jYsifkaUGAQ6;XUgk~vu-*%K$+8Q|!?
z(;WWlc@mvblD9@^@)86e4Y2hMYiQ|g=HzpOEKKGIrjyvNgYWxGX_642C<4oN>i*WM
zvE{nWba!?0ANPHkVyVE+9lKCf!P#?Xa2*fBG;uu-$8oS5Zco=#T+gRkt<clm!`t5a
zZhq%~eGuIY@%b-)fuXZQD5^><5kpl}diuM`%w_q{uinSZ^bDy~Gx1oQRHBLXYu0h*
z+|Y76R<7t*E^8lXm*j!VNPj7%)C^Oqsz$9=Ls0~Vp(BKXX&R_PVoS-`_!Lr?G_^G`
zabg-Rq!LMmsLt0Y&Xj50+=LM}C=FGpO**W4eH)c(m2;1ckzL4h-K{IwediWx1&gV(
zb0}#A%e7Ecb$ROt&+~Cy7vJ|V44n<@HgMs>1x}qg$%_6ydV0D!H+T-qvJpbXbzOX4
z;<|1l_ii*+TnB;V-S2!a_doDWPM<l;BM(2xb5B3dh2de=tXs>5jT;F^f;{kzZ}V4w
z{SgivKDcx(hH3CCKmR{?!<~1t|G+-RCTFiqjl~k7B(ITm2(kE{L}F;VP!t8nanUpl
z-OxZNG&Lm<La>loU~XofSZf4TRVhqXFhd%;Fepsr@g1LVI)I`H7KV#xnnt)YKv;&T
zjyXiTLJ)+5kDubqzKbN9qByRLZQGYHUs4EM&%?GIT-PO)OwrQP%7KFin3<hp=Z-gE
zXewvUoW}PhLP#vzLHZJjL}`@jj_XmYmbv++oAIUOv;X=TKKYNI<-*V~Cr+Lq8ja#Q
z4w|a*zd!UReB`e_3_xp3EAM#wI|&6t95{G@haY={t?PcB-j41ipw)ot`<^eQvy?vz
zfnc#us$8Qpj1U4Lg!DWg$8j)CjZiQ|C=?>qlq8?ca^~DQDz!4*Ydf%uHs$#$h7rK4
z`cxL`DU=yD@m-(Nbd_L}Nx0d>%}Fw2Ibyvbnwn!QoGUUnmca}eNZ-T1%*WMzY~7uB
zo=0a#C)H|&Q)f=2X(}CU9Tf68ve_)2=i_;9y+D!vQj=aHsnx1zy3Xyl-NC0m{V8_t
zyovSeHt^I_Pok<Sspe+ZtXaz+{=x4rf&9*Qyo)Cvdy3cJ{aW&wdA47-h4m{|bNt{L
zT2t*1far!O!M-3u5id(!q(olkSC%{G<<>0~RjUUS-=$osGBq_#C>W+Wkz{6OhS8C6
z)R0PRPn!I2g<94|*K~Ya;#wZ6p<o1c+_Fb)!6KM82`567r>j&gi+EQU#ZkzP6+uX(
zCviO&gjmXzd@1pKAIJ6ZeTlAVbai!8ER~qgWJtslG$j&DPEX=CIw8LAL%l7Bl(PPS
zTo22tv18kICdMZ@dHO8xeb4)O_St99bPe0G>1yxfzWeUu<Nx$=0RHrU|2bd#`hQ{Q
z8b=NuX7a)~M_)QZKruOAzQBB90d19zp3w0tzVIFYnwf`kDYqe(=>ZfWguu{sOfx{W
zYBM{R;pmAIoIX29AP^uD4I^DirC7yt1X6+#)DWmR6%SO<!y2`Mja_sJr43Bepgdp0
z7m{!)h@E#S&6hC(I=)v2bU8?i2H^W1w&M_u#%OQvV0LDXd@e^@dpn_Ui1CRDJh$FA
z7MD>F()aNi)asfwYx&l99$?4zU6_W+(9j^B>(blX%YlOj`G=4G9nHxUfAyDt!#m&h
zHa`EEe?{0Dy?q1BRI@Cs$g<*(yHM7vj4Vu|RuyW~HQcJp<!5e$L$1|<Ub1MrW}zqw
z(MX&?Ab_rGRLW%rFAfup#^~y7M|Bk@2WJRI>#UmZ)s+aI?IBd9PX0{Uc$S9|)sZgb
z=SrxCAQ%l`6<tcX3YxBgFBdB+mb7CHi}qzb7fz>J2uH$<Pfp-@9*IN}MG@q3IXti7
zcEpvk499h7ZEa<Ae3Xf)Dek!aZia>i(G&$$QHVrhJoLQ>8K0WqhV47~e}DOZ@Uf5m
zJ<ojaDIR(8VgBLBKX9>mgn2)U-C3byYYSG%#;^EzWe>mRd&{ek%d=|bn)#nVdajG-
z+Ju8a!og6zI#W~@<`-~0Npn*Q(=f@;71@0AIywj1DbAG8H4`+Do{y|RW!%PdeN<ni
zI9Xxl!aPPuL(?>zvWr!9&=zxM-@9bVBYk|oE<qEDptZFX-}A}k^8ln%DO|_JvMgld
zK})%)M3a~B3mxt496oxO_Kq&n%`Hq!OyD>!Ev>DbJ#(7po_iL6+itm)2fp=929KR1
z+!^7YhyIzI%#aGCnAtPW$#0&cd1DH-T}LPa-}3Pt|El@(6+ky6VB(StMNvepW}yg(
z#^R`&hV3}iY8LYg84!Y|WSrbop8Zc8A&>}AD3<8xY-h##e(aJ>@nVf?#zuM))z&CZ
zSIABm(1RMPrcf)|IF5^=C<w$-z+03y_)=0AL4j$SB$Fu$#R7$V9)zI1wT*0c0mpGr
zL|tNcsWb(AUlIxh35J4<PfW6AU>*5fj(k2xu~@(`L%g`}C1&Pl*}QQxot+&#_~5tc
z>*;5-eG(ay1m{E8^A^(a5feK7$pL~ZgD4TD9{gOXypqD|5+5y=`Dp4uOWU?_eMu~m
zARG+g`!1gEF*7%h>q*irDI$R|2Oc`g@UaWbPiJ`kJNqfmRdHRPmgY2DZrh9mYIz&!
zfY1b<CGl%Ml~T2yhRKF@M<|yBG|%(vS`sM<hr&doF|rF;@`XH+NR&h(P9~SBS9_k1
z@7GtY^kqGedmgUi5RF7B77M7V!RmoEOwUXKKJi2X&+|BZ^e_NBcI?2aHTs!rB(sS*
z0$CHc>VPLuZIy~wq$Qf9rM(rxAXEYJ5+&*7LY!--cYZ^yD3MsTD!QhUOr%jY9m}dx
zEtgRg9bGdB87Av@t>c$I{7c;Zjyo7TI?3K|zeKH6<<y~bR2_?0Yn1$Kk@n_R63tO6
z*(#N+MWs|jAdsH7lr=0Kb>HkSy$*##AOv&s^VqgcGMOS23R1}Dah!TqvM6%(q`&0b
zUEd=T4l_A9MLOL=TYEdXd=Ag`=<MpERH<_Q{5b@IjT<*HF*8o6HAE(nMUetoSsvX4
zN<?9?Kcxf}geES>Ph5_t_6pKWS(hEClu88>@dWLy?c|F&X6B};)hf7-gQBQJV^OAu
zr>HnJUiXV{;HID6&Diib!-qyV_T*8{?t2I`qEXJ9Opjy<H$^Belu=w26{R6`5C~6P
z;^%|_e6iGk2n2(;jzczA?~b>(wGj#hnP14@xGsjSzI+pn8<4(_lmf#rm^eShx^-JI
zbREaG070s`m6!JKqf#xidSEq)c${OW4}htXZJNhV__$BIn4XEP+gO^#igi6$j>BAK
z23^zfgm;Ai=@m#NUMBaJ0j_BpHQT}rglTK*B9mKSAv;f@RHRg{5();0C8CTRn_$n^
z_dv;EY<7ZpPn=!v+rjPczn!VG6P(|7j=|$YJpa&3XqrmU3^H>jhi0ni0S&x*N8I=2
zGEGF?oyZ32reWeZHsxx)7>dPWIJQHvSgN}ku}Ih~id^eAqN)n6>#>l@l1{hadp?Sy
z5{^d+1cMBoKMTP6_3LqLo9se{TF^yT48phQloCb!&-i#l61Szsj@{eH=Smbxc@(KE
zQ{-Qw*}FFJf0-l<&-X;lu2QwC43C^cN}qVViDV+h^z1a5T%P7sKbh<t;Xshy-cEk%
z-EZXL@FXV=o#2IUK8F%F=-brKO}}^xx7xRIao-3>pE<_d_$=f5rU|4C^pK8QwCgTJ
zav58@I6wfprsKE{wo}*BB@%H;#d>E)C<<bkm{j@_>DMzU!!WRHhia`xvMGgO28o8_
z1VaI;6^qf4ivV=AwNuFDk+zSPR;kU`P`)ha*xf<kV<tyFc!G94#ioI6eC5Rlk!6Xr
zCDM@~uW-Y!lK2N%suZbOWmH9Bes+@CnQ>C77NmqwC_tf@M^jD0;V4b%80Vfj!{7Y;
z-*W3)Zsq3NZ{*gyb~8CT!<l1edH%WQ@HLOMH>~B3U$~R8b7NFy%4Dar%#Ke}b!#{k
zi@I1<d70;svYy%@8f=`4=hn5~@mQQ}E{o&1sH)oV=K}nCZ1Vm3kE*IvDrGd?AQ5Xq
zdXiu;Od=j*VP=NO$?=9*GDa@5fZ+wG=`LQ#qcB`V`v(<mr;f9}!u#%hGcj6tapDC;
zM&Ok^e8>MGZ1m+8Eu>uTJTy&{hOVQjYD4_z;kyn(5k!IkLJ<R0pMjNY(RGb-vBc1k
z^BjEoB_gpXTW;IREpNJ+J6?ASuM6G9$mvl|96rh5{1BF9p@vmf-?oZdk~ebju|pht
z>=?cyL0=ltXcR0SAaGn4*LCq+58Vh5jzn3=&f>aWz5CM0S{kbn>DL9B0<bI_!!Xee
z1IxBiRgGA@iTSx1%9Rp|5a^mpv5+UEg{bKzeA~lRO=^)Ud;jSre(I0z;KR554gWFs
zAPb|jShE&x-o>~4tBrMBy~EOIzlh~aR#6mLzX1pZLnNA-sFcfio<~bdE3K`qgu($(
zBm*ngf`sd~Y{#~0<g*z@&kpi$&wh?*bCm0E+rp|_HgWqKZ>Q>&sgz2bK5&xfAAW)D
zui3>N@4buZv(ubAaE@R!Sm&Y}rMK@%R83&jYLv^BdYP>#sG5rJdHB+=yB%MG;^9lM
zEgR4CsMRdm+dGIQniw7(t7i=j$}|uN6OJcP7TaZwv{F?yP(Zi>Y)SD#jqbaf`NVI2
z43jipIr#5zLE_H4IC%%@%Byu*<h5Lfys{CF^nHKn#zLV8H(b91fNVC4?bu{88GO&j
zG!6RtSF&#XCPHS2u?xcl%n<4BEKaS$WB2djOJDdF$>wG@-Mo=)cW>slx82RoyLa=0
zuRX$C^E8`p+r*jur*Yl7E2vk8brwt@ux*>FRjqe?T!(74#!~o`63_MU<f6-{>rtAU
z({%OpVcAZ-tQP`J)zNglQK|cAnzmHBD~dw0sflXB#j06|ag|D>!0UeRR??!6kDU5T
zE*=@CI%wg}xOnCI%K2eqAeZyea+z-wzVwyFbkK2KhA#|JDwo)>ego^)t)pgHl!`_A
z`ubV3W-SVE^w=>@o;XfsZjSMpDK3nU5ebK}3}|idz_Wdx`Sx=>^X;eUS<%Z~@46jB
z)j9U`L3-A#CYeZ4EaxwK<UYRdEfMOPR&Ubg^F?gi$FZGyi_J8NhGT?6VS=F$fj|J?
z_sM4FC>4v1E`J@+NGOVw6325fbOV4wp+GngKvgw1r8n{PzGo;W#@YO<J^ayif6fCZ
zzr&Zm|0TR*K9!*=_Pkx#X~zHn9vVqRK~%lmny)5_zDjfU@+Y8aA{Y#bXf%Rl*;FbO
z!r=%r)6<+EJWFS17dKqLga7$E|BGlO!uKC~h?6HzFgSP~-}49sLj+9|flsAW23I09
zmtfSStEU+sAKNPMjZb_9BN(7-V>{KNix$)|Y6|Z1DpA&ZY0~rYJr7l_`{Po%OuD6B
zfTU7sqR}W)*4tO*QknVrS@QV;x~>tAMjO7`s%J2|fnBp`iX}<6v@kL@%Ei$UZo6?e
zk3IS*zq;dt{MK*(2D2Swd@%W2oO^bJ4}I~E$dBg84d?L|{6*jVs*dF%N3DUkS8v&v
zEzPOay{Tk#Z%ev`csz!xDkzFVFc>12&Eq*Pg+h@h9{T}%_dbuJs;H`h83@#?GRLJ*
zETV)o5<ShtdQ!w!br9X$j|k|vGg-RUchh%WFShM6cyy5Bd=XVuQIy4sMdCM9Mu9+(
zP$YuydE~NLnvzL2Z@doE&;Ut3pJ!@nf~lz~X6NT9mCCq{Qa%(6lFeo5>m8u4cO|xM
z;W!R`y?u<1UgYSpBh1dtvVPqLOhaSu3wyXBxsBJi{}g*)+Q)Bv<ku(+=E)Biu`>?R
zme<nWRhP{lE|uk%s7aRtt*Kf%8jaoy^jfw>C=etTiDCv!bX{lFz$(_SUC;A-_Yw{T
z>1^+yW?M+l$Msw+tA<yp5nbCueA56@3Ticp@98wJTS2fpjUEb9n3$oI&oMqcLpfW;
z4C{D~#IftyO`RaBmr}YJAR3D{mU)q2C`?N_&CvPN3=N%UeqoMswTATTGB#Dy>e-U-
z6AFgN7jvZ3ZEV@JjjC0}wrn~&+KI&?JoV(`<O+F4#>UvWV<)C*@X`}6a^HPl=1b4q
z$F42AaB@|q24~SU?NT;FToq`&@ve6{(8?u1YiesW7JFkb5a^Y@PoY?#SSsRqUR`jK
zOffMvMY&S0cZTC}7BUMcibADQ#`k>!0fT(8#MIafh0$5uVukW-o`BHk-@cwudo$8k
zm_2%)&aM=#eQl&WlJzc3u1vLJqpI~VA*DpqG@{Wsnx;`HSMWWbSW}9rsd37M0-A23
zs0ykgmKp#`BT(wPj^{e4n!)yMJ8?W0DWOy<vFoNA8J`^I`0-;D3VBYRIgR6aT$~x@
z#HrJ~@2(H9X3I(*dGrTM%>^kX_$(*;PXOO<0Ij@gi&ix)9gD{9H4LK{DN$4vMN#m4
zk7B7zA{NIqgVbsk#Zr-`L;~OUC>9I2u7i}|x;|JAezk<Dfn(JWhDv69p0E+2W8(^9
z-EHW}CTa^av?QZAo+Q!~Cf*VwGm)WYznmj0ibgCJN7r?#)hdNTj?V6048tIwnM2d`
zOUD|Px}*Zn_i1WMGCDrW$`xzq?C8R_Eh?o7fnbnbH{QhPg;DbPES~EzI6R1D)%eJt
z{vCZCef-6r{y8PPOt2}4XL<Fa=n~R`<I61i3ZRv1hD;$EdJ5%|yiZZ;%AazzLM$3X
z)9M6%v0Ne;3}MwQ%H=AhQi*6HhN3IX&(5Q`l4LxFv}$OE;K;+zGP>s!-95eBc+Wkg
zx9=ufDG>>1)JipCp#ZnPWf#eoI9AQUZ|FH}%SH$=117HPkjrIArd!cX6Nyiq)fUSt
z2Z0a@w(SrKhS4>_{ona71PXy*5Ysd`bl?c-bTgm-;urbMr@z3LzxWlt^UVi&>G{JL
zn!>OB!LLv%mQczHUd=-_)TIpQioV%3vW{y8LtWQfqS4qJOw;VUy!)amDuqIk&h`$v
zySfR7!&o&7L)Vy}pCcTNuw~m8lIaxVljBTGPEaV82nT{B;xQcC!b388Vvuko#)ccW
zkZNgXwp?TC{Ar?Q05h4uOhj-TAGc7YR<&_GA6?gJN;czrF14D4=eYE)SdCq+P%ae_
z4Y#q#{s{p>QBV|t<2bDB?dQ<Z1JrDr-8*hU2<Yl+N8)0rI;&Q$qOHA)8*bdf3(q~v
z2Y%(}U!HpRC0^M>F&gg7ty^?`ivf-|Tt{u$EVzF)AAM;s)U<Ro61mqfjJ_)vKw0N~
z9oNCKZHk3FnOv61*=e@#+(Ca|502+@@!~LvL;^$8$rkfeYBda1Clm-^*;RaC=+J3G
z(HPrq-i{g!QPmCRXQ#=G=a@P*O-pAp>u%meI1#3tEl`-x5eX;IO&tVe78Z!dlBAkb
zWEW;$-U6T@no$%5A?mt4*L6`8m2@h}!;d|T<JfH3vW0X@D}`K%p`jrj{lUXL@SXd4
z{>jJr<R?E)CSSOcaI^e62fc`vydoH0;W{oI77{{{zHb4Tfxx=X_V&+2qtRP0=|}^f
z=Mo5nP*CxG7t=7AUsymfb^h+J{*ISke3la@j}wnK;rSk}<8u7uapuZdsQCmG9W!iF
zwJfTRPtBIR<9C0BH~q}p=<V$1Z~x?XIrW1_x$dT&NL^)WdIlq?(v?b6%a=HLV3_g(
zm_e2Kxfw#iD7$XHovHC5=B6j>y1T|CwW?@KNGOVe?Kq^9Ne~K$PaGi;Z=$QS7b$(F
zXC}yHGPI<cC>BagXL7HY8!LuVuL?boQhv2Dm6d6Lyf~EaTw&1-rBXeQ*7cTXH2Ox<
zFnTYq&V>+|x`D167={5TjEs+R?;Gyr&2Rc?YBh_CBg6H)TL^-oAVEDqCX+!47!-3w
zRG|=yMeuzOp{l(2*dA7{S;HG{xP`OhLpa_%yKmc$E}*BYmF~`VuHSYYTefVVdtEE8
z2jhdY1VaH9=4a6jgPxuh<g*L-zKbGM{ACjh0Iur-l29<rioSkQi6#U-3N8U%qb=P+
ze|I;o<8yv&{1TnZRmF^6odBqBM8a|4kyn%6Y0H7ub-g7Pi@nh>jNV0SSnN#envSNK
zD5^kFRHkQUXl`ldw}11u5sE@nQ;K{p!}!D)!9Wn#bx9=RSQU#*u|O~sBDatw5)5JJ
zI=-e;t6Dg|%gt|j9eJzF)P=KLzh*5R9UZJ%Il#)kmBb=(PK};tb}mD4ZkFs^9;AV$
zYfOxdl4weiOeM)K%+*Khgo2bW)1~2Xm}D}EVHiwLPvY7&Qi%ldNQ`JSMt4UC=Z1zj
zaP0UG1^FuB@7QIo;}RdOTq|VOlksKUj+X`MD5{3zOI+8-laletaaQ!Lpf%mf!u%Y*
z@3U_0CPIM_j^jW>JGW}p0C6LP?}8Z!;yO0*NCe^gMB*`K#wIy@>@expcBB@>vpssc
zda2ZEv?klIYd-gX<v||%&nFo<HA!!OidfvhFoJ|aVU8Z&kM9e*yH_9t_`Zkhdg!`N
zD%DIPkwAJr#bN>9mw28>Hk)O3ZjMU1$kWd~!~Ubke)OsTSMf})DG9r@ao6ZrEauaq
zPGNe!PbQOL+qN4(sNDa+{R9F*DwPsFef@0OxE1O9go7b0+eXth)~{QObS$KzAccaV
z8)%9`AZRi>KFP_$$B4w@=+OkjBNs`<Q>^Y=OK(>{)1$K(6<E7=1+k_WrJ@C*{u7PG
z@qNjmL;KM~5n9_i2p9$(?H#l<w;+(@b9pSws&mh(ifIOEN;T8g-ofzL1g8cs{GV-1
zRi6?QSJ`GrUR@G)sgSC!hZN!p@^rD?q$moLlM~$grZ@5ScfO17J^Vcig<_o*b8NP3
z-A-p`FOhJF)^sc7N`+K1$+|TIc&<aSTJM0zLtzvlsFf>B4UgjaKG9f`xm<y8I7X#b
z=H$>ZM#e|U=gLft%`-ERVQw~y?RbPE8mi)uY)WF=4yR5YBbDx8&DsrUn#z1;0nhV@
z#iE3x5u(v3(L|hhvWe!FG!Bw8gM<IAyM$e{U{O`gR}@t)HSLzN@J3-P1fJ_*yDpJ%
zm|JeWop3zCx4-iMs;ZOAX6fziVb!X&NGVt~u$tC%8#T*f#mWKtdpcQ|o5Qg^TAR}-
zDyXW;)WvZM*)0A2tC`Oh`NsGEizi?F0Y}ds!LC?L49_q#K9BGE7^YFbBB3BuAJuT_
z>1o3>;KImB4jnth3;XvmIXjJE8iXSug24d6NQiJWL^vA6$46HbqLIk|F^E#i#jPgf
zs}ay#@@AvtmICpzDrAwm6rd^!mR-Y_9;s9cMJU{I>)o6i9^%Cp_p)LA2F{&7&!;}~
zFAR^4l1w!*uyPfq89)M?H*Tb>tAn|PIc&?umx5?h6GJD@FgH0xy1NI@)0nt$5!aS@
zj*qIS1Og^zz(CcMCGEWLOU!^lIBHU^<;mnSjE;_x&t>W9?qZ;?58wC5<#H5DC35*J
zxonn@5n$_@P26<-ZW6J?Pr`6tRb{9w&pI?!O-Cc)H|mDohhNu~DT<1&8Au^fg-Sl3
zB^V0O-q}ZcTRY)!6h$={9y-s$!W<v{$B%Mu=scEVvF5q~R<B!4wNhnfYKm|uLTkF2
zidCUh$dfG;@HLG}u1FvfAkvcL$P;@=#B_|XNhA`bmbE#4=p;r!2c<DUq^U?Gg+hs9
zp@Q!TqM;~lEp2plbP$il>LYNjOU<@W)w-T~&A=METDwt%hUa@6KXa0WZ05%S`4tP6
zYv$2Hh;+Q3-u21G+?-(qP#OiK=Q_-1=2*LK1DRZb!J%_(*?b*=P=s=&!asiUqtvV_
zeXIL9bMz#ZsBzEF-9tDWWqxLkTsB8I6rr=dgVwe-g1SnfRH9<p%#TmdzjZybRv{el
zh$do$LLp{G<~VoaJZ8{9RTUi9p;W3;F4VwRh=yadG^a^6HK8gBj^j|NR<Z0FW*|UY
zYa9JNeRQ>T5;Ov2a#<F#3j_><^B0DgnVbD_fWBG@zLZC6m-fJ4wtUxhMWs>|p->1R
z>imYHsQA8YjG@)gG?heC3Psb|`_f**;V`>zyp7Jz9`3mN9$tLuY39bJF<LdAd2A0)
zKk*dreE++cE6$RA=sA4XCmM-i27ESch|%8B$s>FAQm$HrLJ{;p0LLoTQ!(G8ST14P
z4z^?CmVJa&Fx4Q*<`Cg<7)5~VdX&p$Y}-cDG?GnCB%7LOiZ|5<oP3{hsnl4Z3V}cX
zPx`MoZv2xtt|_2V6h+#$L#0whRaL^F2#Qc~eH$qRmTi%0Zb8*F3Z){=sTN*%=>?h+
zDbg(+Tz~V8j7*&8$bkc-b|lHQ<oV1;KgVtN-p-A8?q+6Un!`^VtV_xw^}X`C+S}N@
zVFM#hiRRu8Mh|P?`h+4Ogf6)-a*_GD9HCH{XfU=koay-<j$`B44xZ-`4u|RJ=p>a)
z5ebJeRUOaua4dUiSA@kOBq1f0N`+FX^pi*|#I?HM*CdsMqBKXNk$Y8D>+^gXoWbIR
zlt-?Rp}Vh-U?@VlR6;ilq=do2bA-ZSnp%=X`{Imd2FVq3q^@gbIya5=QjPb&>;0%{
z4Y%YnIWmD&wJ=Q+UkX~2DUzuK1=Z*1GcOX2_*BX^Pu~9m+3`Hhi6kxQG=YGL>wERi
zc(sZElBpy;-My^n>!+)&gP;+>bKEO7pHdofGsm{kRF%G-UQV7p!|eRrj|22c;CnwZ
z@vjJx4hDm7(p0tA^PKuFVVX`L7@}M*QnRXb_pG44OHaM!uIVba<1jllMJnA))0!lP
zZZbT327kuK*lBWb>=0WMTX@~}dkCf?1Vn&xv0U%oxE_k3W1@2C2TybH)HxENB=&;D
zFDRs&n+XIB%9RS$Y6aV}F#{%D9i6NmSVdn?KdD3#rNLeMzF!A*X}V9=Wyh|I84Qwc
zNz>X|&+i|8^6{k^@gLJiSFh%yubFiyiqfJg>gyFn=~vZydtWFDrWqic%Mgi0NTpgS
zS1WZ+p&?E*O@m6MO08BU(UPQfdpot$H3kRH5nU6Z+EeB9)2Dg=z3;EnF1Dbny&F?E
z$Q5#wN@Y|{r8(Zjnt@d`$6APn!X#2LG)+fQRWwy47LC!<)y=xq>sZyl5>qp&Rm#|w
z4Go#M?|F4=mOh^EA%q|lj?kKJp*a$#nlEDNCja)8FEctZ_T##a%Y)&o%Q|AQShBmP
z_g+Pa{z9REY$$kyqEfDwXz%F442H04R%5^2m$h=bsguoQ&<%rRUkfcO+L=5!%It<o
zQhthyUmT&jP~kmqd=Fz2qi8~>v#Xot<}|M3P{`*|H4Vcwuw5J5w(xxq&Cu!Z?PueL
zjdZnj($bW!GjKv(niTNddM^;)$8l_2&%-bb48tU7nrM#Cxszu&xPKq<V35JFF&=;Z
znV&?wJ8>0K>8e@BC5P*J^mKRA+S<;Aix(Ijy-1;u$8v0RO+!_6Y{x;>)TKt~Qd3xh
zVVYbxHAL^aUeedMa?{$o_}<s%m_NTjUu*@3GRN6>Vn4gL@8+o|o<`F&+S=O*27`>J
zTbP@hqgtzwPN!*W?;skDVOurqs!gR-qGA=%R1HPd5sHtZ*0&w?@ewEpMM2ke6h*<%
zG`v!ksi`R{RvE_#QZocKRpEP2KmOm9Xk0rO3WSi<EgC_y(2O@mW6}P$mR3^DDNMt_
zaV#RSIDt?EpGB_sim|WyE?oH{Va;UIy3M%VlCej}=uPx+-+}*R_qLn(^5^bjUEdnI
zySpitic14Q(O8V0-afW&y`CLAchS|^ja8|Vo6j&mH&3l<qpG5jLDW^G)k=k$RjbQ)
z6@_ZKfGPxrFPXY<5#f2X_jS|1c@y0$`cS3dg~Nv#9=-6B0`}Frj!OhIhLH|NqxV*A
zyT4E@pa_L@bDBsbiV+AQG!4&pUzXN3B(p-i%=j6G$?(uc)^rcBZS@vroCPX&nQa4G
z=nQs}o5*wa^f~Ul^LAX<Ls1ms@fh8`eYCZ<;kzCq7cO%0$Z;md#&DeaEV%R<b1Jef
z$#q?qQl*S-S-4gWO%bTRWPW0jpsKQE+fLf9zn-a(PT6<Jjf^rrKFywed#@NQ`tK@O
zuGyT`bUodaOx+s{h59YaqFk#|v1-H<O(>d9u~bB9=$I8nTrv8!xEZ?Vx(uBg;>Pvc
zx%K*+Ir`!WzW3FKShr#wJ?-6$TpR%bTd&`Ot{bFMDaJ=ed123U96NNF$?*wX*TXPO
zgj(N9!uLE7qQN)U#X7Z01q1M^73ODWNQ5J7+;|;rH*9CVyM;%NJjYzIM7UO=Hl1V7
z!I#Jtaz9B|aq=oz$E#@0>Uwj$sp*Y@V5m<K0$=*nEQ?C5MzvO5l4&W89lI8bfXjVI
zAP`_;a+2&qj-P$YyLip5cW~m^Nsb&k!fm(Q#=yV;2M-;jDIO=8OfoVu!k#CdA~U~0
zFciWJ1W+{vNqq<1#evbfVo_ik2CC<ipU;xb%+iudGO%VN&FeQ)UeUo1&K>6Xfya<`
ziM5?8h|d%_cJ>^{&K&<q`{Y+G2~(~Pbg*x6GY?JC>OyeOt#@7gItQ}2MVhz@e=VgX
z6bf<t#Bo~EE!=VUt!%sQdiK8X0&T6Wj8Ba7&HKNJ^jvoC+Qr#ZXP6wHAlNAVmv7Bq
zrz2f7-5?r?5)GNmOpS5z!UbBIl5E<%6?0$>v(0giWiRslQ{N?3o+Bo0dUoDM(|nb=
z3*$WW+~coi2i+g_IMygwYClreu@p7srOklld%8({6kqWFwRdhkahzuy|GhJ_vtSOp
zz%D0q3bw&+NaQ$i94Q1jNu7i0#%&zgU!j+g`Vsm8de^I7T9r~?RBG$i@j<Tb*cciU
zQnChOOn?Q9fdzBeWp@tm+lv`sI4t0{PNXXD<?d)^^vpBwJcs}P`8&3~2HDzda499a
zrV))s`NPG}sIRN#^DCF>>+5BH{wd4pWtP%Q-kXxiFqusHvv7pJEg3%Q$-)SQsIIO;
z+LFP6J|>gH)WoW3?|6r7c^N(Fc@hurQD0Y1Ze)=9P!^>_`Oyv<v<T^mVQ%zvVOiGm
zDrbmYYaM<JEjCqF)ou}tR0<8vPYk?PSJ2q2P=&IxGF&D3^w*y<IM7c+eLW40%|s#*
zgeDkGCK($`vf?wYG)=>G!LlsO0+afh25?<&-~0#DQ<Jp4c$oH%pQ2SZ@a6ntZYQo%
zZshp*SQ~Rwa}2r;1@R~;%cQCDAl&QY?l*lrN{&3Qa8B%0>oD^53zd=@N@+W4Mg&HW
z38~hQm8-y&RnHef;5ZH?C8fk-F{Y!XgbNDS;ACZbIg^u<%*@Wv*wn;V_j}ghzfCVR
zBCRZU@7!i=_z_jHN=}{rh=QhO?u;kt>HZth_%a_I-_HxhRb;a+-GhS^?F%uLN^`8^
zLl(RL#XoP|;>P{1=UJe0ce0cbFu&R~-C&g;zUOw1R4zE68zR6JT&Lbi*TFOlG~FxM
z>$-vTA-0YqnVg)Wt+j=aX>g#W1!>uI-|gh_caNy6tL1}Veu7qCPxn-ku4|uBsx9#P
z(NYQ`g%nvKMn<OTx_ytP=KVZfm?hqP6nkWfq5D02`E5Tx<TCQLvXrN#qMqes3Xj|)
z9M8y_=8chX-8G(v-)nTpWwUGbV5Jm=h5JZ6=;NJ}Z_(cIHoe{541V)96_HX-oj#3K
zUB``~J_fFJQXrRjDXvlVc8tP9)jav*C@ZPQ<kC5Ei%SSoP+WV2(1K)Xc#!__2^N+X
zpSLZ8gU;1X6lJv$BIZkTsAs#H!l#}&tcQJTR5nR0UP*Oz9j@*0@L@lZh(~&#olQ{{
zuV7|oo}1TiGc(f9`|q71wXc{<0|^qnH#xZ9<m3Sp%`HPe6=$L)%Yi|tRWU?Nackfn
zrH2kt)BFabUkwqOo@XRAPhx1``*2#tR)HP0YvJGH><fJ_d-Qh3c6`#MX@(If9NWUm
zD2At=VA~F+8De65jERXc78Vw$s;c456Yc!{(q%$!jx*=a@w+RR>3uxNk(LtL+MuSa
zkXn5|p<0u~p=lzc4(=DTEM(F=bp<cK_X*V%b<B465}92hCj_5&-uk|Fha7v+VcD{E
zD1^|2Dc0(_&k8E><|8@F7OrDaTvSYYX_>@>1Xa~lU`xz!*vsyu<jl{0K~;H-L{AUr
z&YtE%R~JL62eiLdMD*P#wo}Bw#RTS&Vrq}?XXP*B*bm{cW75)kf<tA^7*mTp`twy1
z{r$|Wq`7my+vA8o|78Iaehj@cD{D(6A>BpCwx9Uj7L*_0@BRDeRrDO`B{!~ZGoBnH
z5{(cJn>dd5`{MF4$6h+d=~EwY{pt<gI{q4?xZEG<;nmkGu+Nv1sff{ftCW%kLB@DW
z;_@8nCnk-p$7ydmN@j41(aTrq?7Yr+YMRm1ESdkVi2tms7x-e6p?B>W3P3rwJ)N4F
zxuEMttRxa?*K{5AEZ*UP-_Y<<^zmepoMTZLkK?*t5#Dla3PNGd{rqEQXXc2Pl~Vo6
zPx$SXKk;%~ISpqUc~W7~JXk{EoK2*rh?&_OMWJRoP8`M>p5U*){|%kpT`XmD%&aW)
z1FQ$Y1>o*x8*Yf=HsGVZPPiRRS&B+Z-i%jO|Ei=ka#9EpmQtprlv#yxd`j!OxR>&n
z9c!-dN|ba-FD|LnT#9H}6hrrl^a@2LlToj{cvPJ~bC#a3z81&cc$E>B)urnfdH>9D
z$`4klRALf$$`bRAL#Q-Pai~%;y(ot6b#m>-byl{1$Yr2e8r0JYMgnpV;FsMJlN|6J
za1FQujBRpY)5k_{R;|GBP2~8AqN$Y10TdJzww6ZAJ~YGOM%Q%~UDtW4l(PKsHp0J4
z7bRVV2#nrT*p{s_>9jIUQ<`Q-+O~}l0x6|3G(#O}JuEde5K@FI%T)hRzY6PF;`KF3
zEK0S!yn<sG6qm#>U7dxor22Mzc=LB7pP_^Q$v~&tWqU2epf|Ejs1`ieBA&R-43J@?
z4vWsZ%$~E8p*^J`Aq**{FBcN3Fbq8^rOYa+auAqA?Ok5^X`l+EK+<)+!Rm%#Af-}j
zRq9hI!e&?*hQZ3piYhEB6j|FsI<_)&1KaYVmQc75O=wEkHd)sS8ezL>0<gW1SiXmm
z&(Oi+w|f)RrU*md20^;v-o!Qs%Ru=f<k@6xJJ}i6An>_d>)GOZ-`C@pD}Q^@G))*r
zNVu+pu6t9<UB^Mwh0ruZ3ItL~p&S>vu|5!#-xK8b?A`Ej`Q%ggDq0yl-Ux(vo8PD{
zsugl;R;`>o7u=vBxY|JvAfA-3f2sjmFhKO8MM20ggr;di6CrPIzw3Glj;^7kQqpme
zj<Y6byTg8}?a`2%Jv5(j)h^y1+&<(cC(Zkiwo{<oOV}*7qI5*CGL=tPaP2#(X`1&y
z{0YAb;dN>}8bm(DOm;c{e~@1N&kIYEAJ>oT|9<@&!hdYVe!6o)00000NkvXXu0mjf
D09+_4

diff --git a/WebHostLib/static/static/icons/sc2/jotunboosters.png b/WebHostLib/static/static/icons/sc2/jotunboosters.png
deleted file mode 100644
index 25720306e5c2d580647e3abdcfb2bf86af30d0fe..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5740
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

diff --git a/WebHostLib/static/static/icons/sc2/jumpjets.png b/WebHostLib/static/static/icons/sc2/jumpjets.png
deleted file mode 100644
index dfdfef4052ca530ad55f5f6dcff7e8a7db319a9c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17881
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
IM6N<$g5<P>j{pDw

diff --git a/WebHostLib/static/static/icons/sc2/lasertargetingsystem.png b/WebHostLib/static/static/icons/sc2/lasertargetingsystem.png
deleted file mode 100644
index c57899b270ff580c51980956089b24e629c18128..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14802
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%0DrIK4aA9w&=
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
HKYsZSQ8Lzx

diff --git a/WebHostLib/static/static/icons/sc2/liberator.png b/WebHostLib/static/static/icons/sc2/liberator.png
deleted file mode 100644
index 31507be5fe680afe5524d4bc55ff48e238d9a7ef..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9012
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
a(f<ZR)^3fINL7vi0000<MNUMnLSTaWfUl_l

diff --git a/WebHostLib/static/static/icons/sc2/lockdown.png b/WebHostLib/static/static/icons/sc2/lockdown.png
deleted file mode 100644
index a2e7f5dc3e3faa541ce8c7448f0a6a69402ea522..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8289
zcmV-nAfDfeP)<h;3K|Lk000e1NJLTq002w?002w~1^@s6$Cptn0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQABmwfhKKlRw9$raAK~#9!?VNpV9Os?iKReIv
zaL6UsOOsl0MVd4%niM5kGHJb7veY;R(m1(uu7@P>wMc!JI}~Ws{88kRz8z2;(xQJ{
zl0yUZe8~a6>!l5l=C!!oUE{k(P9W>elu1dZM3JVv5=DCH6`5Tvx!lprKC}Jfd3I-J
zxwNF@ilRjZ7|g!R%QN5k{@#Djz%Q2vS|azcj{#Km8u`C4#_g`#?DyJl_dC{V0Eg;>
z0v0?d3W%QrWKRS9exIuk_|SsK27hZd?#MkrZU$HoWD&TQ15_HX5p6Q?+JRBvZs4H*
zAEc?e4N-ysTKfJyeeXiAPH^Xl{;>+kt=Ecm`k#e*x{;XvD*OvZEPqI`xc=Xa02una
zSCwJ5M6HO?-i5cZroXp_FKw3_m|{0FCoBmS+n{0xz6Xx4*btEss&3!_sYz42Z7<Ux
z8K%a^0jfcUMfFhuz>HlWUI50z&ngz!dQ~Ep4_Gt+U@VRyOm$bWIMOX)L@fhAMAb3U
ziX+;))aVpw5u+o8x1LiY(Ert!yM++oLc|QI0rF}<MJ@0@N9te&$6g0b#MCVdKwbg9
z2fVYL%7_FMyQwLtMKE?8_ygc5a9jTd5e-P4VP>@sR*-SAIGAw^=^|=u12Bw;2(ZYB
z8kjvJ3cQU~Xn82ipwb<m3ma<)&#eO{%s5nh#yNIgfflvEF8KFYDf<lb9Ip<T0?iBy
zmHR#5_XD8CG@0xm!>Sr6=`*Vi7Qha5oC%S@12#+_C;+1sVzIEi1i%tze2cJ)0E0w(
zH_~+xiPTm$*Y>g3w^dRiYWdbcGdLukQA^#W=QJ=)1O@9K>+Nqf7#A9qzTvY=JO=cI
zR76Cd)B_{x-?(Q)!aB=P`x{n=dR~EjUBI%E;hVJjLS{vL^ttc||90B{FWCu&OoK|x
zhX9kC#RfBKhxMZ8st4<p)V+E7x4J5n0DFO6@NPAVrSU*MStJ$$E2yjLI?L*)gC(p)
z*r7}IG(YcCLuw5!*RpCm-tVu?miDAt8=c1{Y*vG+J=nkl4oc0o-c)mjH8^mhsaW_=
zG>#WD!=TlflR#JrWYh{D)H@jdzGo;5+-MqRHCUr*IJFkuf1u&`J9*d$u&hOmL*6YB
z>qtRMA95pyw~-5jCQAx5ucW01sCt3>mO)&+W`G5J6%p1Uk(km~8l)g#ZVfQ~M1|GX
z9Nc6Y(V2!0D-7PS2?vL^9x$3#>*EdV`P&t>y`e=j19Wu4x&ltvHu7!>(GpkSwRa*n
zav1F?1zHWP+O~e5A^;cxS1c@v(I#FmL}ISC3O<E3Q{1T5QL#7@uxiw=Deq`l49)bY
z|7ENf{+{+wp42LGqk(~y0*nV(^mfDlFQoN{aW#%tFW_AXuxIil!s-nAS(xo9*jR)1
zG*UXqyAsb?2gAhhBp5Z9MAUA(tSIKz)L~>hhJ}5UNK9FoMzOk|<+0uH*bvMu!ol5e
zXh^Nm_c`X=930&FK$kIJ97E3JkXLeeS8~J-?^h4@jmzN&2@15jj_bg4)|H_MTGD$g
z%|+4(h?OuEVA|5uJa!R_*Zd$gsM^46SAkVq4(^7}Jnw(MxD>wPs@4_f=GFG~^Wpz%
z>S@3B)z;L*69-3-7v^x*)-hikLyV=6GdcLqPnsBpfa_wH!m7gay?(D^gAvnK^Zo$y
z8Mck0Z}hD~V6}I_F8$wQLu&n`7Rkv4wQaTF(z03s-p)3NWWK>|(A&!jP&cU_oV+lP
zI5>>hm%{n)Gl+dD#8?We=Ovu;mwZ=delf%>Wf&63yT$kM28;%M=IgLvEZL&tC68$G
zAn;AYh!1;O*&C*E70jB>>QK(59rqQsH8BdkO2@=LF^<@q#(r%jpkHQS)j;0L;GR3F
zj<LeAqX?Mz((N^@j<EH$tG-tr+cAdtH~%2)PDCBdLj&sgmrvoI3NzMPyAJEV&U1>Z
zie1jSMy7~YDV+jd1UsueeW4Q(RS^KJ7E4w!tX+l?|2WW9jR*|01JRPeh_+yK?0^;@
zv`V!FYhsjWdWZTg(NPCWUd`f_B0gA?GdS0-U?e*6mXwwAHaC!W?fUAhmoei?CAgbq
zDvnFE#q<dn@Onf%h4Ic6_{R5PXE*fhAYw@5yLS-1Nz6k7SZU?^RhAVn(Q;mm-zn9F
ztSawPm5v7DE)m0Ata|Qup|TOk+*D|iXKLaAc4)t*fx;cBE&Ey%qam>BK)w7e_~UQE
zg&B3OrOf+Yvvhln(rsUi?Df*takc5|Uz+u|7q9xvnY^jSbY!pE9@eU%7Irm^zjmMZ
zTADH}*3!SrFwBp~Vx3)B9T?FTV(}dq(H0QGzgQwgbnoMJu&k%{;vLvg2h08LG)(Io
zdRK{oOtd5Vl-m$VbRsr4sLBeSV-sy_r~C28NR5rqIrs>jgO6ZYQ7U&`?DY~A#|1Nr
z(UwBQ)mjggdUn8jtCY{HJb~za2>I?ETGHKENA_aBF-x>}2i(yLT}z1}l}@W$-B>HY
zqKL-7>s9V-1oB~(W=g*b;8tC!GDQhYp)oa6u(=4`+DF>i3;U0N)<MQIkHQ`c`-Tl|
zo$#d}!kKyHNyk%=9)nVj)L<Xrva(Xp{_Y?m4#{JqB#(^}+4opzKuOD@YdV9g*UZ8!
zUeU!XE|dCT7rE*Y-0SCw6%vSt`>@_V18-;W?B`%~kkZ>rh(mqEo<D+|T*mzH0QQt(
zx;-Va+9Z^V2rG`L%6iUB%2KsSDtkLmzsa(>2yM;dxwelzin%A?EY`pR1r|Ul2dOb2
zEZWIqqYQrG<I00LeHG{AOjuOXU6|v8nA(}`{ey3?{MzMkD7*W})<ON?B=8*KlPZ`O
zhqR-7d8N6mmDRYUEFooS+Z1|Jw<4B2j<7U19hzZr{oS4p?>mwVgLQf?e6n~7ax)67
z+zcx>iu4>+-v0RKego@62UUdgrSGZTcMl*21Nz05l>YQ2F%8<0FTTY2f9HedUO$h~
z*^4>!bVH1)0G5+Wb+E*tzO8_@B|@MH9oaO1_Wppmh1Zc9Fw+)_S*1m-x58#V{%dMr
z&b2)5T)}77v0?T3#z~)Hn>n2_S74=&j`7avs}#=6k~}s_=QDd*n_k3yO|i^)G({}k
zMf|s)!<o)d`qPsvJ<-LHFTTXmYnNDlP5E11ez_@F{NN<+jY5cF*2I_=$C;n2Fwhh*
zBRTBLZF`q;&yv0BLg@iNc0Qh_bVFOE=`8NqS$I=h!u2)0^|ksHjP<Kv8PGFIyswvI
zFO0D;d6Qka9M62}7yu{#^`DSAJr9v`&@p58;bETt><iF0$TxqO1$mW^ePV<!zg2>$
zdO-2gk`4??m<4cF)HuwIGVYgtiu>6kaJUcakcGhxI3L4$VjONSDp$*q&>lzHS)^T-
zh>of%dxR@cO#u__{dzk9-P+uCswdR3S1}|pF-T%!kdn>>yJwX(6p8NoRu)&m(5dD2
zE<}4bHt_ssP5`hlxyZ90QBVApfAkfNY=fsyE7#wc=Z{|c3jh2Yzsn1s803fF%`kU0
z&kLUz<iGx)q5ig!!(KSK^`_ofg2U<_YL4yZAHNQrDYfQvP{<()Hqy?sU0E;Mq{N21
z@;XL)zXGhbWX=JwZV%J}18~k>4FQHJk?YEb^48Zdl3n$Dyxdr0_X{ro@S~ScF?2{h
zn3G@qVFShO5MZ_Ck6!u;|KY7KGq*R-+|@iE`@~~(4fnG)zvv&@o@y>jZ!9a&o@+=Y
z<+ayeP=HB0kFYu$K{FaZG_{O!<7U8|_4z)lW>;}469y|Fie3%0jWx`kk$Rz{29o+b
zK<3;Wne+48fVFk`@)xHV+1ttd)dF)@^9=v$iTZzC!(l6K_JoUF{O9vHlQ(fDZ(<%A
zAa-!8)eonJwld6UT7`~URg73fZf0S9O|7N{q7|!skoZ$$*cB+vl<?lVi@bURHdbI`
z1+T32R&BL9p);-4csI%J1gn`m>G2^f+vd#Mn^+%t4x=}vkLhe!{c{<Q^isGsi%hgK
zb})fVv@-F*H1wrO?nyI$@j9NJ!?SbHVnBz5J$n*+_9XJ*B=X@TZdu@#1@;CoHVC^?
zuq%aK5!mf%q!B|#1RjxUGlp%Oo$@x9G1_`zEntDVl;UrFB1QQv?YS>!?%TqMhf?&V
zTRA_Sr?<yqDO<+5JcHPo!rVU=&QAEAYv^mLO=;r({XXM&PxRmO+H!Fg^Z3V+Q_F}6
zbsu7)5AoJ0_T|~FhOe~?Z)1BMwlyw%R5_FE(m{2XHp_cbe<yYO<rSOW9t-b1KXV}8
z%YhDpeMc``lvqrv>n~nbR<Uz`AJ?ZA?|D7%)+}=IDmZuRfQ9aNzYm;f?LwB<9>A?=
z>)rOk))QgCf($cy2QlyVAnjtkV&qgk<egldVL`9}jGZaO&J^;!oCfb6+0W$G2ex~n
zzYbcge_UTHjk7qlg=M1WG0ieffc<+z3=?hL$jwzmYuDDI<aV(n$f}b&T@~>(?z?$n
z{rzxfL2XA<lq+DD9qeKWGtmRtS?GBLWCdIsAxx#S053C(cc)12(NQ2zHVH<HMK%vc
z4|G2F0ZJE_5f3Ne;USXU4I}F5p)lz`l(cIzOA^OZR?JRXEN5M;bS>9kM&8ci+?v8$
zTM6Bvh?$Vj<NYj&y{f&Xqe<4!_EI``9nyp9UJ%G~zG-+AZ5A(in=2S?ehtxGTvT8+
zEcVngmX5)w)ga5dGF{3;?nd3SUp_mlLGzcs(N=D!!*QT(hjms@d&4z16a&pC2XQWD
zxOp+0v6Z*gcW*Tu0vTPsh^{_(G#M_k{G6VCsIe>vmZG^1lllj?KT~T0@=H)EK<ZH)
zHzlED*MU0nIi(kSM=h3TZI))skXB{1(zMR?N6fIB6v(i49`bM0xu{q-@MM~SC)1qz
z^C=cDtsr)!k+-uL-95El4@6g=0;{%6YsPBe;zyNlRyue6=L?O@)C97Wt%KE!UCk9-
z!UszO*1Nwm1lIZQE2=MFvsu1o!?m+v71a&q$BrZClujz#aq1#jI5bGY^L1S8$w6*j
z%rfv~niIb{!8bqm*9xN@X~d3n$nlkHOUSh)%=}0QtY0*itO7W9GMK#+5dhiKkLy5e
zxDSTY6lzDzmay7;AX`(c4zyax)eLT7x!x|YT<m852gW$om*gA2|1Fk(yoPajnAqWA
z9q8YIN&RFG?WXwa&*B|T!LwSq7YZu1bbf)tYZ>e(4!}`$EGK8UvRY*9SU<n<`4iZ7
z8E)zE6js7bDS**A2(4*&vIi^+EXdm`?^jLsVfC3vLo+(JROR+-TMc4U6TH5HEb6T3
z+sY3!hx@`i9nh7cr#=j6T~^Cp$1N=1zh8D_#Q*Y{57*0a#@P(U*$lBiJPGF(;9oos
zM*<<uQGMLm`Ox{sj%_aqMyF=flRYq=R%_!vV<|*Rr-D*_4^Wo`<a!plo`pwMCZY6~
z=M>ANZne3j{ghopYJGPBve&otS2UVtLo-XhF^_y>Ua{+tF7!?=V19cZ=W~G$p0EB0
z&J8Kh{?m`($Mf)qI`%v|%-C?U4%FDOer8_PQAK8|&N8EO5OXMS&Oe)m=`4(=ac-^Q
z%>;bG+!8Xk)QHLZJFc-^<6B+aX3K#tIQ=69RC+h0cVlT0a0*LEy9id;Pw?Idvw}mq
z&^x&RFTaZOAAd)IeKvzUItY6c8ngv?dI)~JJ%eY?G<RUVd<J{+6%E`+70Vi!1=N8P
zslG<gnldbajp2#JKovmj>DLZxKh_fi*kj77Ii`nuW)YcR#;e%G+!Au5fVYw%w&w^U
znL@5EfwdF6y^CzSh27o-)>@q%09JlUwJ^BAKlw1U+Z0~<vU+fH!^A)T61?;r<Q+IT
z2#*iKqguaRSY~G9HZd>4@!^Mvc@c~|1w^$KccTDN3oF>tJU9q5vv8mvep3bQ2`!rT
z<O24RgUHm{B)kwH%>Xm%>7939*Ey{L?6(%Np4h4z+%t=~XBLUIC-F84Iy0fR?zQv8
z_8h?+eVYFMh6;L3VILh<x+uGSEb2D05#XO4hC_WYxda!Qv&~(e+WO<+fJk0igo`)f
z$*`MbPhKassa4T-y0B@sq9)HpKfPnW<<s41puW+bM09jw1RC4iYv*xh&oTc~|E7nZ
z9rgh`t94PWg<x`_{<&sB+divuXZ*=YcvAyAxePC#SKIqp4nL>X-odTCX%}z$?5d3e
z5FP1zCJ?tirFUP)=;(*UKvRarY8L7Ay9f=GXip;c9H|4=bg5ak+BV;&6h6R(>o{Yb
z#6SBnfB&!R?CDd3buql(#Txw;pbX0yAFKoYiea#YVSY|8i|4bf8mQkk_rqcxsR$4e
z@pfppv8R>wvsXQmW8)YPD<8}A;t=nK+#=k#rn>(h>ct#Bg4m%zunSpaM;to}vu`d#
zR}!wQ!>=AzY@MH1Ie5>+i(2qMO4zsG3*-}%ux}i(VIc~@k%pw;+A8+W6xsG3?47I1
zc`n<;c8@{Q!al2eI0^;i?JTaeunrGmnI=}dMeAEDcq?nT#T-<!2*-vhRs06y$UXfq
zSz6QERanZvEnm+#*YfwyJ*_Q;w)G6_GYul~Vjt$Go@;)R<9%>?8Sl~x-lc}p*o!IH
zr>a+@`%;YVQ$}F+N)9id!{|&Q9!_CTDzNHd(sr#0SLW`UwcGYq)Ie(*I_WxOY^0%`
za^G=;PBO~1rEvV#)DI{kFK3#Ab-WM$Rg(hkl@iR9)b>h~o(m0DNCB;`;LJ`TSF^g$
z!hdk3nK=!bQV~rGAk}+1uHNPvMq8kBFVH;V&NUQnQ(BkZUW6;J;|9#Q>{|B!-*V&Y
zYJEyK$n94*;l0xUz=58v4EuKO{TcqVoUVwE;m%#~m3em>Q|rPYXj_iA^V=FiqZyip
zCp_W0RZ(7tLKa$LU>HyV_tpZ~Hs+(Ph#d}$C!h^DbR6t3<Gi(HxLtr!No9Ge4n*T{
zpcczns&OT1tJbKi1=z^I-I8kkxLd-zG!0}y6d`J37qU3LPJI>cWiiWnTB9~&-4dK4
zI7Qqmrx1w*)<-^y)ia8DXaX^qCic-m`1@(>q)q9a48_@H<k~t`6s$rPQ32rzgS+=v
z`QE;_;=M(!#1q(4H?by~SeO%I81F2EL2I1qHPQ)ldH9zTx)0;89ynuQzNp(bXI7c{
z{&~iZDi+V2TMRM4nV-VE6?PHCg#TSmW#M-AelB@$w?b-!MKr0v+S#wR{bSfui&zr_
zSQ7)-yMR+OYCSQAxql*bp5E>lLmwIrl<@=N955i}rzUXz+Z0~At|9zX>6X~1kE?Nv
z`wvLYsC22kqV(*{*+s^V4lwp~KUcp$yZvnkQaW-fi#N6Mz`DMvTj4pS?PpQ|_S9mS
zWhb<$KQ)8X8_t+smkOYv4~_UB&DGXINJE&Pn!x^9xVt9^6o9d>3-{ae82fx3yB)*s
z1z3Gq&8iiUP7&!AAF#K=s35B4s&FNaRPB=@52CFTGPA@dMsdIQI-L*i#2&KXACBQ<
zGI)KRn1wLK?aB(*zcb6iku*aeKFIvV0zBGD>D*N~Y!P!uD88baN)ktgh<hf*%h`Ye
zULvtSUH`4~>7A;U2qc~!BK@;2;zvg~`QsV5mBF-ig3;=Pz7%Lx6#JE7#E?bj4fTI+
zVFCN?d8~@9(&>&3n+06Ts%fy^(ixb)!25U2E8#5{Fj|!|mz#M=Bq>cP&`NJ!g&`$^
z;>0lCsrhZs^Xlin#=_qmr1bcH;!p1-{<LnTbk&X5mkpc5{(#=GRbxv1x9-+0=RWy+
z-y#$2D;o)0X5-jy#54Xia$oz4fD@Ld-XKy}ekE{!L8ULtc|>ctj9!|W#n=@`oESlz
z7=eEa?tl4TaJ6|ref@7Pz+W%GSHDmE$SCorM{!)U;R*S5$RM)-^*N%7EbHf$ahYwL
zmo?I_CR6Co#<AU)U-0J%lrC)Jq;3{`upTt0?*$wCqgIGzL9pTzqsUY93M@dJ7{T4}
z;ES)^Q;U|)E9G1|-Jo~_Gv1a}8L2^m-ovWR1rh_lb^`O0er`{mUZ8Ygj?$X}NoZu(
z11kNR;;4EaRnLoJL=<=;vWcih5XNGCGJ~AYz{COUfB!?0UwEOeSmp2i7Vg(yRU)_2
zz_uRWD3m8pK}9w38nG_S_(-iP7l@!6e`shH=?YZJ=dRbM0vaFKkNN9Iu{L}_3a2wL
zJ&$Docd~G21u6}S-gU#1wv^P#d+V^O4W633YM61~%?R$(-i3W;9_!dJ_USpSXEf9F
z>@@f5ufoCoa6$K^9^4N%ayYpqyiI>*tr6=&#JX@wb9jX_jfib46Nc4=xw<tcY<yrp
z;@JZYxh|cmdMFKxQ}^an7&PM^mG1@-ZRTcdtcB+A*tJ&8eFI_8a)Aq9xQxBgJb0Jx
z8lJoMKn|>Duc;0nfDu)QF@}1#fK_<;lp5oOMW3*DR_boV`vCQTO229oY-rm8*2+92
z5BMxQGf%AS*1-}7hj4ELhYrBxCAe^z*bW_>mx>{lJ?LUs`e9Wx!$yW+&k$mVB7=DL
z0P-i7C`>J4UkK>6ChU@K5zk%U4z%h$l|B*a&)tqH9U+Vuq8h`gsN;ogAglz|##KnB
z;cYc2SC$b-tb<BCtw+F~z6pa#3Zvs#>v|eyjhv0WCzY)&n_(5!AfnxAVxK<j?|r94
z{OJ)&Ke<Hd+&o;K$68;7j&4|A1!=2!;f8@M7co5vRf&kUAuC0^stZ&Ns&1rN@ZB7+
znw2yJUZqr@=PfHGyo#t7X?@OT)tXFWzp0x<F3geqrz&%5jSpZ?-z53z<Jc9U)6v)Y
zg_b9G!}t)fZYvNK^bxnAbZ(B)xp_+G=dmiQN+R@(Hn~|u>V6QfypGhJzp_%S>7U>$
z8nzY5@C5mYQD@jzQP6Xb?4nLfZ=HN<zd4Wf)G&pw{RJdCN&fbUI%ukB`+Plr@8ndG
zMCj>#VyxGnKLk+Le%i2(M~C&e#<e4QYY8!~@@{f^iQKEx+HIL{u1bup!BY(^ud)tR
z*$gbNG1n8G{)e@Xi18gFV$>H+{VEteMY#r?8EyCdr(_zt(W>dTr{t%PV~r0`X!zg0
zWi{Bu1{pm$2g891`FMj3?N&g^>1Di&%h<QVZj4o!^T7g~yBl?O0T`84A1tW7=i+tX
z<6!4_pI6BQV*{v)C{<61XC#K_mGvCyJVICqeP2$So;)ulq5`qPe7))o;AjO}`f~^S
ze-6<0!4&2pKTNR)8vqRYU5iDGQ4`2u>aOkJ-_F??HYbb7<xIV?&$0{1QXUc4)-%w$
zAe|DXVIZ9%!qCdTqS@pb;BD4iE*qr0pCU+*s5Q;tQ`7?t6DfTbc*SLmL@)Bra!6Et
zEv!X2w}{Lw!fYH@0~R|pgnXzAvA?0LwW!b0pTJCnC*3<|Rm|w>tuy84-@N4vQkOxU
zoJ!rA0kDE@MBPzss<Y&SwF-m}ti990)nSwGC<<ZKLG!~ZiD4z`z<IaT#f=?)K<sM$
z<xVcZBYSa~#@MezqCNd^YrPI!>0DSBiJvx1T4=HG0&SzR<Xc&9vw$=_4Ul#fYWk|?
zMr_ep^1)-t?Y)2hl`CGYPs?Zxv5oc~JPno+cr%K3Tl+#iqs<L-ZPHY{6CTl4SOe!y
z`G7Q<BCkmox3^hn@Uu#I8ZaY5*yn0)4c`H8?S4FcZ3Mh`fY*S>!-xw#pU?ndD$pvf
z|85Hrm>O)x@$4e8hz_arBu=@aJC*eW0_o~lwf=&lQJ-OeI6n==TsZX-6#d#;0xD{2
zR<xU-)rMPt4OSJTjpw1%QynPTu=P#?uiTH7jOssRz+?Pfh<ye~t4f3l!*u|tTn|sb
zfK9~J8gabfYh_|BiMppOTEefE5mqOTl%cmd$%kT9F&tpwnK!~NPcd8da|A`a+ITcz
zvA|SoDQ&!JxvF>8`k>VK!nI(XYaYC>1Hl<gEt+9AP;GoeozzyLRn^!5jNbvqv@pzs
zUo&Gs)sq<Uz#CLzAthkM;-To+Gep%0yy3~C6(cbJ+A9~`@bP9iz72FYdv+0`W*sa5
z!zp<omEo0ZJJ(Qb)L9z=hP|!dP#0Wc8XxywfDr(#!`C3fYidsGZ%fjE)mT>b)NFh`
z3EeARuJZrhQjf7C4T>!YhRK#!{53t1f!`|C7=Ic1_z3ry2-XnnZuf%6|KosYM%Bm?
z9J_2(`rcOWwQ1(D=9fg-`i9C#lLB$@g_MzoW4wk3Wi%O&xUahDFTT{SSJ|$>{mZ2}
f(|)=9T`vC{7wDFv8w0=100000NkvXXu0mjf!80AP

diff --git a/WebHostLib/static/static/icons/sc2/magfieldaccelerator.png b/WebHostLib/static/static/icons/sc2/magfieldaccelerator.png
deleted file mode 100644
index 0272b4b73892fa735ad850ba22ecaf0646b08a95..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11459
zcmV;!EIiYRP)<h;3K|Lk000e1NJLTq002w?002w~1^@s6$Cptn0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQC3OUs^^ZNh*AOJ~3K~#9!?VM+nWLI_Xf9Kv?
zIdqOQ-IHge$(pQD&M1+D1jYhA3?kVe+Yf9oPJnI9vq{e;3Pc7WgoGp{A(W+27=_8H
zr)N6n?yByteB*f^&aJNM(TotE{N7uxweITbTQ}~r_dfsq-+LeU@6R9f5pUpk0Z4xn
z{{_!@ru&|5zpQ#*@dmF=)j5BVz^YF&{EbsDBwqhPsvq?AzW*VEb|%4`>BV^?0+Xi~
zm<H(ncMEW;l*Xe<D5u^`_csf$U++o(A2KB&Un|&Czw1E2|LgezD+|#Eq)~NJ`JnQa
zuexHrFI*`>3W3xln*RX8e;7}y@A$_F|2K(16CgDKQX;(aF|z7m1wxxYFqM~6`XWxT
z0#W@}R5SrV6TU{^3rb4-+rL&=QXL<ZFbj<O?<%T<ICqY5ige4WXZv?uqzm4Lq*JPW
zo&cc<gs!QV625diwI3a%D-l9~F6OB^u0;9|r+MH>fsmki5*gC)bhTeA-$zO%9HF84
z($K2RO;ib1FAtEXo=G!6xayw5len(%f2)jy^d&8P0Y@bayOM7KeW&r`^8{Aj;gv^F
z7wilO{!PLrDX;}N8fdyuFE7*$h4ghG=nG4N2y0592qY353AP8q7bHr8<xwZ3Lr~!P
zHy22x5OYHEG=V0SbUdl<sg>0T)IB_ju%#N5suvN`7or5IRrFQ!pG}I2;Ded~O|a7O
z_?U#@vP=XRr&DXgw^=EmHK1{yfNiqMUNte_CiE&hC=Zja&AkY&1lt8$R;JnV^)$c`
z5cJP+Wm#Ivj&(7A6wAL=t5^A04bU`{O$+ti11t|5uRJ=w&p_>yz7!o_<)u{n1>nN%
zrpL!6l!WqWhJ;eJ51Thj3Ros#d9@@pp?>uIeF0Iqk@SBzH1z_WuTi$AzLzhm`$E=z
zVU-<?BdY`{)U`#GU_Jk3%lC)|AZ$P+sJ;gc2n8UhfuXBw>i#`V2TU7gN?_UQ_*e)+
z2IxAZi!h!CQ^ITs3MM$P)0Q;3lEE{XBxOJ2e*zk0G^iI<j-%|1$}i-4N<aZ$t8`xg
zrU#~58HIobAx)iI7J~HE+3@vU`o|en+9^GyH8mlq4MQTNwnzYix_W6%sAF9TC8wgP
z(>d^LXsd^Hi=j0EbrGlwLVXOPVF-jEZ^N_4;ogJF5$Yb~Y|OIEPyHBY0I7~4kYP=Y
ztmVIu;p=DF(FOF1`3aOp6<zf`rYYmsP-a)wys}xlKv+~XAt=-UIIc3$WDw#ZsEa~V
z1mXduJph&imJ8D+6#eg(2PG4VC5Y&7!8*8fGc*OjDnO*JhQ{WF)Gk|1o&e*M1$xIk
z=zEDbtsdjxFid8Z(=(LMc25UtjnjZgDFkkLw98Yb;cHg4X^1M@FORYzlxb*Gw66SH
zwb@1d$FN<0dNv>tRwh#$hGa;6H-x(WY*7t}<D0tWs?7rmB@i}jSPGk0!IEZJw*rP|
zbbfZ9$Er8Ii}i2*5J&SisfiS>@W{<}ad7W({%GSO3KL@#v*5Z)8+0*eP_MyiM%5l!
z<!<m@0haX9oG(0GS1(Z(l;t~5LqJronh2`E8C5<@^Y@#!5_(%q2`FqRlMEYbzvDut
zsQx-qO&qSL1nf!m9F_&11s86Bt2e>IHfUS5nt0?Kh7QGf?BN5vR2U<anqkY(<Mj0A
zc;;94lL#3&;X2lI*082&kUO4$fsDGJp@ZWg<$SDuMhz=}JPDp7E5eYzGuC}Avpgty
zYG2f-5=s?vESsMuln=8!C^$+ei)*1d3W<Qa-b_wund8CeEEGM^17H~Q(Xg(od$=a-
zJPY2k9hTNYWYtzg?M)0E2r)4@O5eb%ghOezH40vMejiH%1)6H()ORi>7&Opi9k*PO
zX3tY2Jbe^q9OYBPN*P?_>4Tcnnq*n7t`FU-p@Qjal_w#rLD&ahTGec-`<vzq(DOjL
zP#1!wHBcW>Lbg2UNrRDx>o&v1o7F6Z4g-_$d>0%Yf=mhYAjHG!9!uNc>UFR%0OM)+
z_VE>5WZyuoH_KCx+{ym2LA2Uh5@CZyfglSKaelgcfRC(=A!a<r>(=q7+aWUZC@&m=
zv<ay~#pQUs#w7W@8s_>CK+~$?jIxRO!U|~0T!a2GW&BjuG}njiO;Kp{O)sE9(Sp$|
z3{1d=7WnK(Vd)C^*8Om7sE+G4yPUHs!`2lrTY$k793F<*JgjSmxTWqlz2#GU^S(a%
zv!mo6{1$O5&u}<K%d%xSrp0V7M~{^wsp%Zd**rb~ZJ`j$8#T^Z{5((oR<gGn@<P3^
z^!>Fh5vTAMqB<PHcR7YXc}XE?59-_y)M(JEBCoQ>1hmSm*%*X~rUV<%e8}OOadQkh
zldz~3YQhQ=WlR{Eg=`K!ejR-F<8UGiANr=woi8>}vfDV&)5@{&m1JZmS};yBY||1g
zkr{=P6A;>Q3ya@>56iB)kqsLb@tdFC!Qu2Y2|Y+-Lj!iHNNPI8WU<6lA;*%MH~}Gf
z^kjw=jqTia=}Ar;>gBE{V59_n(>@%k#DxQv$K4XLq7pJX^N_xPu=LN-1Y45^KMiTD
zu>24<tW{<^U8w&X0?I*Kvf>^iLYZ7$OyMV8D12nvkhj!qx2y#|a3w_Q;G56Dub)WJ
zTwBB0Z6Q*n5}`nVg~<j)ppKekJ=VZ6PIe!l;o9qX(+57yHP`JVH8IThzV;=WTU(hN
z8RPcveV5gZO++#|Y*8Q@1lRR&J%KJHov~V48q?fzm4|Ix{O7$el7-_lFp*c%aD73P
zT%MhEc&CI>0YM+>7f(g{vI@aUB(mVDDLkYre}iv+F&&bI(kjbSJ}M}b>9xg`HUShY
zh06+-f&j@VEUbeI*TR<d@V+mF`T3DX-m}^v8jxfiliHvTdJs=Iq=yf)`-M@?S-XnA
zd+>42x$;sh&*Y(df5sCJKg>{1FG9c#H~%pgp1XrX`}g5yXIWMoB&NZnCCFJe7j!hU
zKsVUB%H+_1<k!2vwjtvvl<)XaOnFv!<(XNm)A3<QkR{*qg?&Gzp#Wh_R{}&RAs8rN
z*&2iTs50AvtuT%0K*?6ldT}k(#g)!KwIBLZ@XZg~EWNwHb4MerU+CfLf}o*eOP8as
z?k8EB;A4OH8E*dU=h1}Vh22l{&^>o^WbZx<O`~l=J7yuzE6+Yd=b}Zty8A`K@d&ws
zN!Ajy#{}<L)q!opigo?;Oh~@{TUgqvSg)Q@B`gGJQfZkVTWV*bV2xAwC+TAf>7axY
z(JR6V>&j2zW1^Y>w8x++rl$Lnt>QJ?Ra-0s%{9tA13JuPVY;CF*x{EU5_0+E4QbLp
zjngw+$JRv}CkG}O8Y*zvJKxGjzW7xd7cJt%KsS#)@N1rb>@jk)8Jb#KNF?H9rl(0y
zjPvrYXV`i1#cbQQg=e085-Skl(&i`^H8+s;N^HMmfB^7~hhT9FB;v4p5HfZpTyvGP
zFVn5!6hig&k$yR@OB%}54B-P-O_^Urht?>xL?IkdnpU(F$g~_4<2BbQ6Vx>@Ej4xL
zEXbJ(i$&w`gC`+94e#Ba<IX)UkL@WEj@R(%yYA%T8{bLZHF@ASck#P>?xDZCo0_^h
zmakfgW0{Qg^)fL%%}gdkV|^X{$B)yw>MZJ7+9;)FiJ3wAnBe-$X2_=D3qOHS2s)c!
z--z;CWkSHC!l?L>iO1>L*?CA`R3DMhl{tb!znag^HH4rep+Xl&Do5@(YST4nPC{)A
z0)}$*#gdBma^<+s15H;Z5Eby`VYp%o+;n!4vHGj{r`vx@M@s|GJ^whn9(#ntd-h^m
zHcOT-BODHs8XYDzJ<a&cG^zeUmbW(J#o`Q)j&a`l#b{eEqSW&!JJ*h~dNI7R2fq7T
zXl{Vzt<W_I{WIYDih!)JDta~G7N>`<r*-<eA9$Csm5>UZH;0u88oGLU*YWu#4{D;&
zkW@^9<3iC?W|=pY_E|pF5!4}{0a1jvUj^4~1jkA8x!>ws`w#D=qoszQfA_Pz@YJiM
z(zDdm)e&z?Qpn6QG(1HA)Fipd2^yuwE!);HZQA@|EX{i_-pK4wnl(**yz^#@fnNCD
z-LR(@I@{G`GdKf1DMjU!Ss1rW8>1}9hfZZS>kR`}Q6|ZQLNNzT5rx!UsbV<%uqmuV
zT`eRd>iD9mgjlkmX!~53u5RR6P@IBwYvG0);p`R|a<8Mm_K#U_?BU;U`zRvcgLR?{
znVY4(vjfkvnH=aNozF8eF+p%T&E@S2iD+=ex(<GJVw{T;5hlBOS+l5*t2e;!o`8FI
zsrxQ%gT@3*=Adf|a;`F=0F{})?8nMsUzsI(-QfF_K++Q+<AyT5#xR70@=sKyQ33&|
zjVhMGcGTv$kSqFv(v<3J0^B?-2*TBW4Hxc!yt9^9rrynX!61A1E-t@dCoir(n;(4b
z`~1V-eu$a8L*HbY(Wx}U>1py)6RZe_*s^j3L$f8$U)w~+g}wWG+1Qcg!gGtPY=<8{
z1TS|%BB4mdrUcBIzOWp{uLXQ6YEB3OYz<1T&(KIbPriQeJuf4p3A982(GY>Sp-45$
zzp(DpJ|P35A*IH}k{S}nQ)U_uE3j%yNCqGvVbvyh^PfO{TbM(A?`F7oE;Bv5um%rP
zO3$#TSmNSq-o%&x@e92C$`O_}gn9PmgA7c~5;u!%uc@OokzllB<B(%h$2z|K$P1ji
ze1dDXLwXke{RfKEs!b}>uZyXP=GY|6T0SLJO*M&%5HwW4FEr2vdKDcmsPganDOn>I
zm6T{-7~_V<01f3?#L(5I`+g`A^yy%!@K)YbXRlrkZ@vtYVJK#xqXEJtxb_3kx)tvI
ztHq2InlQvDh2#4%36e8n96H)Vb5jF)vW^EIc!bR>7tnj?5N*<9b7K-2h)|T0fyo)(
zv8992F$+6#koR2&4?YgN_9~V)6i^VRKCbX!*A%483XxD&8TXVNVacs<TT;?*Nq#9+
zs!{VdXC5tGo!1lKh5bwr!k;C5(<)QL2xWpr3#KyQS`Z6BYaP_psnLuGh#0V7F$^69
zGYv~O57N<dCr1BXqV3DTHZd&=Jrttrg=aWt<wCSbjQ_an2^QBhaQ=b@906IgK+beX
zgdCDul$<=lTQ60@8W;oN(?o`@{OL>yx~CMJvAhbE?fCp%&<ErON(n?YyK+i`s5;xP
zoz9180vQm9@^m5mi-rvKK++dh$%S+t&TfM9&w_?JIB^1=c}7hPOP9b|8(_^A#hwO|
zP}^ye_3BwwKT3Y67e@prWHSVGK_-`H?C1e5+I|lGGbM&{E=AYE^IRIj0rrec5D!6N
zra<S4VW!65NVm%Wl}!H`gODyM+Q@V((4owxhBQd(P#;h@Q}>C_kXE6o1b9-;C4!|q
z18}X5B`aLLP%0kOm3=#2B`laNz>X#Gu}>*7@y;(p!$Menj&iz2NL`~?gyru7D-Q#E
z7huUE5{)%2<J`Y5%8U>gu1O#grLTX81)VypR;|F!O`vN@OsB;DRF=9(m<}03Pj=B<
z3lBf6W<uLmnWKQAqKN6d!g!hijRA0@K1lWHbK6z^$^k}l3V25}$W_!z{N7kn2$kY2
zr_vAz!_V~zp=LeTnagq`CBy}6SPuHx(Dw+`#$oHlkf;S$gHRht8=6*tbOQ{(vX=1j
zdTN6Mbazj4>BSLxMrV1rCjnS!(q(;Hl)6xf<An^aWs$W^x@L<kPu8)sHo)r5<20`-
zvTK*(^6P69RU|w`GA3(a!zyU0Q_epgQ<)~+&sAnike!9D9yr*e6rew&XsLiUN2yoG
z)k3@uaFxFBq^==#-A~3=8MP-MW<Y&dWpef$huKf7wAIE-AP@$}fW#^YG?b^BDE9P9
zYL>NP9v&c@n`L6e;>o8ScC3%Gw|^Qt5MgP3l2Tg3$_#VU(hQIEgxHe`v#qX{v+8oJ
zKCh4V74Z0DaQFz+#FfUZ-U_Q$fL;X6QkpHIisBB&0%$c&2qS`*&k*jNWW#C*2cf%9
zL5zg1n2WiLxtxn9UsHc$aGI&pH+#?WgJ?~!6kXH=6ou1}gi^^j*AOgU4~>h#i$QD=
z1Zq*aV!-oa1Vbh4se@#?1*Vl`$F)UH>>uao(G^^`+2y4J5yVKI4Hu4ac9ToUg*|DL
z(P4*+&P@?plp<Y%2mVuO`?)(|;Sy+RhNc>rn69H#dnv)@6_~{!k+UyE57#o>{T!C<
zlIa~_;MKzzC!gWX%_ga|@;ybXlCzj&m46>a?MDaYS_vsZ+AhL!74Vc&jYMroZMqJb
zymI8{pQmO)qXzUANG?$mu*~{H6ag(dh3q$Rh|;(w%&Mi6c(YlSu7juVpJLbV43=*g
z;MxzB2)4klzX<s(ykjd2c8(BkhJijPxNzm0m4HGq&_h9_A$a&V0j#rbVf(v2MS5Tl
z^-J10_KRQPIVKJ3J2-adPq0mgY(Bwd=YkAF|4GPLkh6VS+N)A2Sy7%h6dFm1=7Q$=
z=`P)8Q4>KW-SiBEf%C6`MN2`(AlM3#b|1%>ryx5|;v{lJH=5LhO{^2}z|Y{Eop9-U
z$62xrmRtcR_QB8p0=h;ZUZdjI9h<?5z@~)|sR1+6i4i;>%U;OXD?Plp_W)B(^|T*&
zn9+x3C^#AePnwMGdKR}-AV0PhdvXF}^#!y~9OCR%CcAdQSOx|&N?T1&{iV#&zfMV_
zai+>Xj|$jp3PUvLCs2#9av@x}Q)!kZAryyjv#M2+B_IwIeAV^9OM&5e2uz$2IQa}D
z>)?UA;rw1$wiSN-_weK{D21TCUIp=;>tWGG81I98!wuNpCCIS^1$!E&xSyGsQ6d2s
zZF+?1M1(_+?PJq57czdJhn96~2_$QnJlaj`g_kjKEYJCi_A#4-gL`4rgsFnh<N4^{
zXItll_Qo}=Tn*qsou7@i9I#8UaT&b*Ef8yfTwW1|@mdH(R2D%9HPs7E4VSb*cfpxd
z)Bp4k%uGW~0tmt#_d?)4MHRQ!!uCaQ>GiPUe3gwz?{3Fx`aGdrE3+qF;PAem(ls{7
zglW-KW7FBvM7!mX4g~2Q$Wrs%UTT7pzOEjcR;)tk1{3KB3!Qsdv=V-C2aM!>iU$QL
zOy6mF^7Mj|XA)SsqDX)yB_bYBv7{@(EUDzhHCKTiRk53NA-Vt(4ZxIdf^iTL-{Cu;
z#etlHB)JLbdsPW8mxoLSA~97MdhJfQ{Ca5ZfQiGf`#uO79rUIyq<Q2BT`zoz<GBLU
znj{o($QmJ<Lvb9tKq4GNPD~;aH5@(M%a!LXVa&BCOpa22!CUEj@K;=Z=?uFbhZFrU
zT!e{&UuERe(gi=mE?!$uA%1V>TY_f@WFn|E#xh|+JzRM)L~DIo#8YP2yaY%CwLm8@
z1AX_wfv1xcOow=5fuIg;&Cp&4YuA7b!hwB?Xk5?+SG^4uY=W7m;fW_2C^UbBA3ydq
z&FhzO;$$}s2kv6!y0!Ec(|ExMi)!mw6@{Tx4y%x5L7j)RHKr$0ILRn`j||ZkHyG1v
zNk8=x@7Vq-(;0Z;aWJFMGo)Bw-B8jfc~J1Gs+8m#OXNyX2~0&Kpu&Zm2@&AJZP2k4
z3VAg{B|4$D!#}fAnb(nD!9CxH!4pYZ8W+-37iVHzKqSDile0*-hh#EO$0As|7&dQ)
zXah|4z+GPid%<n2dH>&X-nvE>zGW{TzU~@A$pppPIzr=9gllW52}c=EW#}GE6ApSz
z2tm3q&bp3H0x63^Da)ST0G$ilF$+<yUUWarP4KlZLoon-X&B2_itH@E?4j(3#Oce>
z#i=-K-a$U&Ds5ZMju&i#RcAvk1A!<+Iw83bw1vPJ?7JK8`XwCN7pAs8$@0Z90$PTm
zEYMh6M_pqbBG$=lel6+LEGM5I;wg6sC!eMOEM0Rw=iK@^c3!!Wnb{G3`TZ|*-X&M@
z_M30vdtdz$jVo6%H95uVNE7?}2gutF8COsrwUJ2lP>5V%mX=t8y+flc?r1<SOtWLb
z2{y0y_}+J*F9l{8PNtOkMGTdnu)GS9Sj{*)s>b$=IBcHKbb<67#KKlsy8<?EQO?}~
znwCMlNjddbz6n43IdmO2NYo@*zdk}VXy8c)DFvPoq%s*&Qz=}>Az5F~ip5K4b%Gq+
zZ{n`Mo(pgNOWyJJivf7~<wxl4KEYsjFMogcNBN@<eUvrlY+*8+VN?k6$Btu#!(=^=
zoMq#<It!9IMOX5xBhy^8Ji+#+I(DudW!p~mc0a!p_H`?l(L14hS4dM?FUzY?tK}-n
zph{Sak~1%!e0?A0IEu$ww+t39SI)d-Du0!Tfh+<oP$<COgAHstE5@>xB97x?O0dyz
zq#z^|l@yG{i9{k~W@owYhYyfk(#VZp{RTU3d@lgUyI-X5<Vi;QhB)xzZiWYknVHQn
zH95g`?|wJ`^69^!ZP_w<CsM?vpy;{80|urI8PlcUSgdPpBqU=rx6iQcA~@Ow&pi)^
zyTM67ItzU>m16y@Q-Kgdl&gZ3(46_{4|yh&oU4rw>WDSVpktx3^^yy1?JBtT49HGF
z>Hu8$4*1pf0-yiW5QAd|i&|U)Qo}-$x50H?!qEUo$;nsuA`Oo#|L4be%isPh!AO+J
z>0S=+eVMVr5stj_Dklyf0V71m^5rax#QFIh-{*##-@}F-J9+t~mk8B2ke{5QCKki=
zJaVo}Cgbwnjjf#BT+bs12l(UbW|<m<U)-f~poNeM(oak(k~3n!tn1@xzv?j{l*MS}
zIC8$z7pFBzt;&fd<A~-a2uDDRL36u848y&U%Yt11D+{}i!uDH>eDWJ5KKG#}BEc|i
zjW(_$i5Or+3}y!hnNH<daq$&g`{~cqan5!C4jy`(!QMf74j$pqOD~g}O3~7}h~|z?
zMu$fk>>t8)JnsC_PuR5MTz2n%3Da>Q6r$uf%-SBd)cLdR?X*QB{Pu7+x4or6Z2-RV
zBUPSI2&zQPKpG};iqFgYsNVA{s3SfnR&pzV-IjkKa19s`2tvyurBM_8keh)_TBXRO
zP~==T1;;-IH-1|3sehf|bDwFzBTh%Ni(z{le(nS{XD#C0U-&MY-}){9diwX!+kK3|
zu9F;kaW_N#10?DjS-<l<a=ARm4<ErS+2qU;vxNfP$4}6@u!Bo3znowG@@{JC>oK!=
zIuZ%4SX@sw<8pN5C|~>&hlmbe_%Wn&5Kk!AGB%^qYeC)b1FGWm!@4p<$2U61Qy|ur
zugQF$mJd@+E+B=DZ0S%@eAhvkO{qe+Y#vh6>aS@+I0P|6@biC`Tyr!0*#}eH@e_|y
zuft$(mJ2`fZa(z&9|IcGxe<;X+|5Ye09`Nd<;W|qq6I>%+_(uN6lS2Oms~ba$+F4h
z3rwV^5eSy8Siyn)2iUfACks0lGdwy(EEp$YM0n)rG~3Re<U6-1s^**bD$PnJm0+fF
z&@-+4lI_>$muvAuJ_ak7w3|L~t>SfFKl7~#@B~sy&@^Of1bJcvj-G_6S(O<Qeg(5>
ztI8cIARL$24*cjV@UC0ow)af)iLXSt`S$N{<NI#~BzyKe%-GN%<Gn*1+5Hj|qoXWX
zv67|*9Sjc)Ffn!liAJtuGCVOs&(Ii&Sc1jvEtrnS`1BNe4t4S7E6(Hg`(GrOPGiJ|
zc>mRscWr}vpM-m!Qc*)~Liwl3oXT=b37)1jN61RDw%i!yNXXh1lrMiz1KOO^_i04|
zNZUjnJpz3e45bua(Tz&+tEQ_ug=7TmS!ig5^RHG(j~9+6`MU@2V#~IxIDUK=gS{si
z?d@aWNEai${pg_(Yj*4;pD)mL-~gs&<4G7vr5GNcz%v~-C*!PdYvecMDe@x7g0>be
zS`wpw*kVadD|h_$EN6R?XAi;`e+tKjAyK2)6rsaR0gg{8E)PwWTp51m%PLn!3PmR5
z{n@g*7vYp*l+(b9Q}W^^3(-9QEdjp`MJQDVh(%S3Eo?(l!0PK@^+qtFjXd$pIsD++
zlYH><J)FI|mi;g7X7I>y29F)ZwjElRE+-U=GuYEhE}H|PF`F-PtbdT{befA7bl~VN
ze}Byyj*U$6)dK^(_0laYiUm2mcbJ8Bd)fVu9+8?nU-{qg)JqVEK{%!gWC8(|e?0Eb
zh(d!|$FFHK{02xzIeF9b%N_hO`mzkFz^eDUnQtj8lC)JxxX^<zT~s#-8VXhfEvR!~
z{pGOX3W!8u(!7Du+*O1wTgdXm|H9Y*{BLN|K0%G8^Xtc+Wch}5)U~xSIXcErZy!=<
z*se#<*cg*jDe64QH7iz9aCEeo&BkSQe0zT{n|Ex&oOU>}XAhrvOO7kw3CCWBuimc0
z8!fKbhQ_d>$TKz^8H1Uk8t9Cp9DB@AZ?E~5RB)=w1VjZTNI8$wKW#>>+=wAGf#FG&
z$c-8_FOF~%E{&F-9E}=K<HDx%;p$Jq^37n%^^6q%lF`yOx?gyRh{&>Z%NAaEau@xF
zj&t>uTQC|Ikj_|4jSP{`WN|%@@pOjnfdND=!>UM(we^j3Ha4-Ve~dr9WH~Y2;fpT}
zQJBoIDSDW1eb{2zO8D-N;D`6Xv<sGBdesz#WDN2y93E9=OhSXKs|d(MutE-&oQl7y
z_Uv;pbVV+Mz+HaNs9se<_8JW<_xT9jfZB+%ap6Ko4Bq@PXg?29N5UK#x&<?N5hEw}
zG5E@_@z6MN;3((bd^6YFbR9qX`Y$-xJ;LTyojmvGbA)PY$rg%q4UbdG%y3rJprfuH
z5sG1>asS~HtZGei$(F@@@N2)JyJv*kZ-VQ$!=p#w*N;Og55mV*K@A$?D)Pv?aBvjH
zb4p|Kt|A~~eiBCjv$o^a!sh@03baW?K~&PfG9vKgd<gH&clO?y+N|fQs5OC6CJvJU
zS}tA8jf?AP%;gj<^S)0)Gy%{5croelUlLxkg_A$~D*3)HL^MIFV3VE6kWHo8bnyk8
z>^jQt9({?e>y{G<2%g+?oWZeCmQY}QB1mhrhMb5nT`D0E9GT4US8rNPc5;^QJh_h_
z+zL%e`1)_)iC2|IIrzfTp&_bf#DWX^hhZ%1Q&B<{`9*wHusxOi&N_aJ;3>kYZc8k;
z>*|7j3BT}pWBs(H0`tVF;l)D8uwSR(SP)qYQ%3?g*=6WGKO_IrgEY3a5Q_u}mokJr
zi%3%&`}Q5B>%bANdFxe-j2F4%-e-|QgX{zw43l$f!z4pdrfewKCPF~><Sc92Yq?-y
z4gc}ri+ud8ihcd!FQ9h{EJHOnn2xHiO@<*ESDk44hkRjas$Ml{sNmZ3Nx{jI(l}kK
z;4XQFUTDqFO&Z#3sshfaVJ;w}8cjP|xT)5l2?NZW;=Wh^kwklC9D8_#zJVe&E6$=g
zGJpt%5V}rpDo@Ul^mm_R^QN`9c9v&fJi?R>YeJGs+H2`A3evVDV>+0wM_3QgH8slz
z&h5m@S)|-9Zn_M<_DjVqWc&)pfZqoY2|-;_`J?^A%4e11!jLh?HjuMn#`f!0wYd(D
z*Vvj?RXkz%O=lAN9my}Nd{{X@GS`kgZ+(Se5N*X8#Li1peMBSykAE97M<sG;o^bPG
zI->&&yt1F>jt=Znk$g5o#48dC2FMjHo_YLPwr*TQYeR&i-8~2+fF97unHD8S;&_sP
zCfGMVO+#Gc;stSD>N&w%E`vv3fR}regBG4LL8C0Jgo--$4J)7J_?=`SL%p!+DifS_
zd?vzA=6F?ps=A}s@XNQ#J)csl$wZt1R%mmjJEFo?#1hcH7}{2-OmfJAtNu!v!@#R>
z^w>D7&uJl29H6&%jG*w)9E*e@F+7V%EW)9#UZy8goV#TMj^mQIY;4;kV>?)`B&ZvV
z7hLvEPSH_g&^KVwv1FV=5q|V2xB<Ut&lf~AtbA6c1p7x}yr2s9B8J*D)C4tcsk#Zz
zH$S&ZP_n9aNkbK(gsbW^%VAR03I?w&)R_YvnqOa0Zh8-cX2a4=aN{>%^DQvGFG(c6
z5?j+5=*hEnW0<MILGqSMA}BC$3F9E7OC%oSsaKCsas^8kFJda2$CZ*$Kxf95JUcv1
zt~km6I)4G@Xb}#l4zXjK%|p*9?Fbvne;NW}VTeazDi8a|V6v#fvRD9Wg9?bw_>Bsd
zoTF%76Xuj#s0|;;#tbD;*Q>NCR-p~;biubaZ%_GX2b>aUb+G&sP_qq2zSYL)(0ZZ^
zqAXqC&e0P#!C08}OLe9urWIA9xg-pUv@KFakB|;4BPEiy$JkU3sRtP=xD3wDaBU}i
zV$(u`=`b}5MtT3or|If}=MO_X;+u(3;a4mI6InPs0W+3*&YGZV9W0bPbKMGUBhO%d
zWj_`7g;nxft<SJ*i}$+0_q+<SATqWJDJ}+Y3JM2039etx!bOtl6FTvLi&=Dd@#SfD
zY-wa<GR0UXPe2z4SJBhkI^(Q}hB>@{kn`K77>^h{(O1Cm3jFz|MjE{uo;#Z2yc@^3
z{_XJGJ&MPY!HO0nql#u4%D~AqWG&@uYW-5tlnE)@PxFiUbn~fiTJ97!w5pC?@AQk#
zNQog|&m`w67yUcwL9}2!kPAYt1L~U4;w6%8)5N@CCJqnN*&Zh|l4D@lV*Ob$bgRHr
z-X#%>a>25CI;K5_`}(-{ZBu;aE6};vqkGupPu49XGZ^FLbU(NL+Zfls8-DyH_@{3|
z&aZY1X(|PWu4v`sX*F90b(L6lfsrDNnQ9iKssyuonTN7gg)~3b^tpV~tu*mh+n}se
z?#R~<z7-QD%iQ)HV_O1E6T}y#nB7~#9M5A!>S)@!oRt@)>3E^UQ@={H<LVANT1=dL
z2rVB$_Kb7Z)hVue7mPj!<`i6dnMco~7Q;gs7G5#RZSQlKJ`SIH54_Z?>Lz@8oOo0@
z?!hz+WflGk8%neC4osLzOUnMlImPKz<EoHWsr#}#C9qT1nwj%;6`^}?sKHcLm7Plu
zN!WtvQLqz)5&;TR?KE7ev%njpFfz%a^Py$$EYCkxM`Kfn)Sg+kTr|oR|5zf{4iEn)
zyl^+%_V=)9C*1lM8J29yP`d`6{04mQhcN7^0z9G8m*@eQGF5BdcvktPSU}aH&D!cW
zPgZJC<tb(0Wr$Q>L`3sVP|Ep>gLtR9^D0{UG`&XR_f_wBQu_RBzy_y4a7iuAts{`i
zk~;}|?t_kV;Z6VSaqoxvG4o;G_aAwdZGwZ3!~GwD=?pY>fZYeQ!Z~jTXB58vLHOMs
zup>|xs4$?e0i#8QuhK<jddZN2GieK^?FyIWosx^Fu52y~%kw+#%1!>&-n<&=m*XDq
z4XiD8dQLw;AQ&WwR2gj&CB)1axqYA)V0sLOhamkBEV~}w_FET@<eBV)+dm9@pHt;e
z$rjZS^3);N5rEML;ofKA@E8OV{wf4M*2*|Akx@+uGbO)UE~FlJ-0xSCbIV1|?+~tb
zHs$K*GF&LHfM8Z>rFY8GHs!5qIjG{P%YeOBU{!au9h^{z0Ddv8SAyJLkkg>m!$6lR
zw3|%BL!W`pE8*B9@X|xz)IjZ0mG~`{pfL$ECfxnBYIsj&Ar|+0rZp9EO__eoXDNZX
zQfZd$LCW&|m6#tOYvMJP-vs@A<%uBZ&zzRuMeH&kpPl09=hpX<un)+dF_sjn0NC(+
zQ!JG*7qzo!%SN_hfO`zw35eH0c0$#MdIBaVAw3TJAAtU0Rh$wq)KCQtC9IZu6(k=U
zPzAZsh`+RqU&20S!c<Xd(6p%@I1y55uarLv&MoKQKYCfS%BvRyG^JVPb$qJV2C8mo
z@aFred74(`&z=Ro3=EyJOqg2<BLyO85O7@8CJm5GQ2!VIgWKMBDIbVsXfBk<6)Z{v
z$8qW!5JwN7jSM2=3FK@JIhjFNHbT>ofdDcdg-95Y&cWam((+Vt1rX%~%2)xJHW9Xm
z%vkD~LpqdPWX4uyljXozuQ+t+Ync!NsR^}ind_-#ugYk?EL_t=I#or!^0itfkg9V=
z!XDte5`I^uT_L|=w^UhkOdt#c!?9IQRWLxnvatc}+6}yY`wGstb@Kf~Opf$nqa#Zt
zL@<Phz{#7)qN!Yft|N6FDKxx%2`{gT?4%HL73)H1kh75`Rq7`#Pd$iU29=&#>q}JH
zQ{-I8E7UcrYT3$}YE2VJpNJK*vJjl~<Xm^2=gGNhfw{%o{OeBwJ-~#V@4o`&rG@4T
zOvi9s94V0jgMcQ`Ots1pH4z#-aC1dURm;r?O+8(?p-cLGhaPHGIGDeJmYiFlPrjx-
zxC{aRZ&_kdKMiV;^Jxo#=E-tT147pbNGc|JhL7fty5_HSD3A#0uS6#+5lh((mDzx@
zbmZyM%VItms=dx?ny<GUsjMocmuFZUbKd>@lMVm8A{B;6o9DxR&yuCp7uJMYw@_-Q
zET$+ct6!Zir&mtOh*KPF`K9D(mOPcG>4$nl>#hEwYI;g^RPI?Ys{|%a!#)1@hyR*|
degFUd{2vEV6Ql8c!Ycp(002ovPDHLkV1fr@qh|mB

diff --git a/WebHostLib/static/static/icons/sc2/magrailmunitions.png b/WebHostLib/static/static/icons/sc2/magrailmunitions.png
deleted file mode 100644
index ec303498ccdbffc072664429e7a943a128c84025..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 19193
zcmV*FKx)5<P)<h;3K|Lk000e1NJLTq003G5003GD1^@s6IH*Aa0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQ9B{9ssRUrTXAOJ~3K~#9!?7U}`UDtW0`Rsl2
z&7pD?s*nRg0wf3qFo~onN}?6)mMyiH?XhRIJ?(brX}4v|Vcd3)!*us}Y^}D(V|QDQ
zYL9GLZCMh75;F-9BtZZ~1}dPcP&wUr?n!&kk8=wIgKYnv)wfoyb#L8MXPxt&Z@*u9
zzYYK6^*>(!e|m{`yw}%12w?!S`(AXv)u1&9@%Gc`cb!)2^p8U5?y*7(A<$Y0tx5lw
zo)xXpLI^g0b$T)4ofoUSKcai3>3PIk_aOw=FI1y%IEm0&YpoSpgOr940+J-rQVIbA
zr4#^C%InvWUYmaF4mUrfH`2X7A-i8GrIgZItM|gwd=KC^zm!4<yZbrrUW8098idd{
z{)^~d!sc!3>z}(<tTkFl0ZIzco4|_epr8Sb5E4Tg2!XhMlDC1aP$&=@sfE@`2!Y%L
zMkCVaAcW8=MHeZA)JiLjKr1b@KnN+dAvPaV3T&bhq?AHPiB?(*DKLZ-pixSv*SKk8
z>02SCG^CV<(prT<5F|+wc28+&jRMp^1hm+EueFY~)*+DIAVNwhbdsnWtUtA#&4;{s
z^6ovO(K<C7**)eh!w^D}T3Y(gNum%U7KUjeg(Qw6p|#Q=-nz2%;ebRS&>|6=k4Q@c
z5}gRpi0-P2yB3{341v~(NYWcY2%!_Dx=RES5+SrkB?(%CVMt+F7N%_xg`rSMB7_iH
zkXmw*Br$-HhLlpuBuPk_K$t?1Y+AT^164>sc5he!N-5=Uq9Ud2aU824r9^9i?Km2(
zb&|wg)6~i^OsTXYiDQJ2S_ry!uXPH#KpF-@2oVGw5p)7=Stg$6B7_ieoain;38fU-
zY+h6<y+lz!(D4z{xNZ$nNMapQS1X8&5{}9cZwO)QJmubsRw5E%7$AfYreP4rv54bD
z7=|H)K*w<+eZM6PX=pE#)k-Cz*=T6naqzNP(QY+q)HXyHL|n(EFgPf@OpZ>cEiA*d
zlO%~3=H{jvjrzJY3`2COmh>UKjrwl1XxZiEO)FMifZc2^^H5K<cz6FmDXX=P+wD-t
zv80eM3D<K(7=|d7Xeq(6Z2&qQ{{}1S@{15skUk{Gb!4qpXW`ns2IwE?Gcs9^D2%ky
zT4<$Y6o<M}?N<kHy_;OFVAM8NNY5h$8f}@jjzwEe1*b%#bd8Lgm+^$B^NlffY`sMm
zdvi2f8(OJ^TqY}9&8BR&+R`!&jSxDDLSt=Z72j{s)7vN3*H%@iBE4m7yO^1p&~Ki2
z1!<UsQKaK2;O1LyqJLnE=pWvK5YlNi8}Z54jz9hUx4-qJIEf=5>8|j1z07wy#v8~S
z(=;pn1HC`h(^LG^j$H%gT+U6RFji6s(e^u{)l#C6>!DmJ6DKiI93oKK&3M8v4Bc)v
zbr^-hG|jGe)LmC9wC80gl*)8`U!FU2hLx37sy$_P?A)r+T0~KVQcBe8HMP1jsc%30
zeRBJbkFmbGq@y^LhGC+#Qdzek4EafMq4^@0@-JxT6QCv%k(^!>L%sXB?IYhqCu!;^
z49K~zSXx{b%~l&jqSMt0^K-LeZGBB-v#$2?dA)PbKAp|j%uQd`hH1*>rA5B?Q$MWl
zzUO_MKXXc$w$0AHx5(c9A#30MoA0u1$9w8)fB&a9coNNxP8u-YK^=PYsYofkku8It
z85rpO`LV6NgCoP$yhIdi*DAW6RV<aVg>23&wAzhA98;)NdkVQ+wqO{tAkYQRa|+dJ
zwdlG|L7)n@V;3C9DL9T*ux+aVssO4mFgTdsd-KhCDaems9?u6sQ0VXP%@<4gyk(pD
ze4$uqw`zrniL?1av7Eo{(7lCHshpPv`Fy@muw6S}ELHOd2k*=GtL^!<crI_=x}NuT
zcXCq~FXx)q;@mw)9>@<3^yG7eLT+fVKZh1M+x2pu=jJl5n;YITnk$#e*;;Kqr%7@>
zef|0M)s_6U>8bqc>Qe5mBlqQg=F`8LFXW2(UAy+=Y|F|`UOAtYQg}!1f2hBIaA^P1
z!u-PY)v5EFa7rnxuCGeo3urbSndiB?2M7Cqp<K?6^!FDLLZGxtmxTnS6qad`&DykD
z8?3L@uuPX+HiJ@{pc4>95nk5AaWjNLNRq_Y!zLjFQ53SVzJ_5K?Af=U{(%7|$H%#H
zc^t>_D3*!{0gjU)jzZ3yKE~?m5?i<JrP|Yv?>EsZAx<LNVVf<*-R$6YS_>f?#c9g-
zM!fOLs~rE*o7{8cUOdmmvC~Doy0(sOIT)6WN)lYpW^iDbt=qP9`qXQ@^!(E_YHQ@O
zIezumKTA)g7r))awr%?R2gw(ToO<IJvscGCbolOyX*tP@&p-2Y6h(fQhRyE;^k&?g
z0JyHZyHY89XxomyLDzNYbV8&|571hJ6sWG>%;!8bA<N4vM6sY$EF**@3`2b1$23iH
zxg1()!Z5fY>`kMN`o;#0dYvs>w{i2qTWK}woIZJ)R<ljHT*7f|48y{*9VW-mbLrwK
zise2=$9AKVn2z59V8h?Qv9lZ~JwUNF%*@&pQ|HH-IJ(5c4?jj<r9h%J?Y7UxMgt*D
zyiDeLTt2pK7jK?^gFpE%zsH9@_6g9MPk!o$x$pjmSX{V<5P~oW34#vUY@Th~cQbu;
zf-@&yp;2$lT)KGisd}we??$!n4YZWP6hcU?bqrux_SoKiLyzpeX?P?IVxlM^Q5tze
zCb4OqNutR(E}myltFN%SvO%Fx!Sg(lSmC$YBr2wmFJjp?VbJNW4v7$8nl?e;v%ENu
z=Xu<I*Ac2cJ)AjximAz~<nwuo#R5_qxNe4eZH+fiAH{F`?A&z=`9c}rZ(*7i?VwFF
zsI#MbGozh@tXvGZ>)r=BeE3d;A&J6}>Dfi3VKX>1LbJKSAOAnU%X80slQ&*}g)jWo
zpYd;h>ECnDk$c!Wx}6Vy<m0R?FA;_ziPGuHR*E3#pn=_cZzhaFp8nPo=gyry_e2y%
z|1i)Zjh(Iooy|JK_uRkZLxY2*ktj+4h+{>pQY)65c}+L*3j#&8H;bmt<x5wn)oWxj
z1qy`%Ac#64ey5G=x#aUjq9`VbL!>kSfnlVVvbMTNv(aGBO*eD!wnHo~F7U?ducH!8
zPhS<=GO;WdfXkOoF*SLK-riwGx9&z@Af*XXvb4HDE|=rM2Oed|&fTo7uM-9#t7~=q
zFlKmUl$F(G{_ywz6E8gbO^&|sEGJGJ=lA~0U-Iz7k8=Fw=ehgH1J_q!3bewstTgu3
znjr8=l7#;LVHOvc&cFQP^N%M<(g2Ju(8(qh8#jh`Qp)Q<_x0z8?z(5&hs%}xNcyEl
zrl~b?tWg@IOo2`!LA9De7(SOS%wrffLD*ttc@cz7KI@_U2ACG@b_ao?P%2>>7D3>5
z(_(>?299mhYSx*Xxk|a(!+j4vLN=G<*vl_7e{GK5zCLofEK*85FU#`M9B-aFN)UwX
z*l`oZQWd4ab{y)>CiU7XeydHZ)uIz5C`?92M;X6ziGTNtKgrosud}?gNVRW(zkT8v
z9=i7)o_gX*#<uTb_tp_MY7LS^VVFiYxzL-r0CAk)`)%SRW_D)w-0QEs`b5X~n?eXF
z1mD4;r7&)!j=q7y@PS)LKiJ=&-y(zpA&??XJG6!<Qp7Qsrb+)mhFkBba`eT^%w21d
z&%0Qrg^-Gc*$Fy{WaPH{i54ah(jbTxL8nDFSHR0;34@R*3b8E<DGe;!L2Fo;n<4Pq
z+;QYSZn^akm(HK(jn__)%Vp{9>m_yCS)`C$IQIq<6X&Q@`WPA8i7-qI(?n_T{Wb`J
zX}R<d3@|Y<&cFYa|CPxr=UH7@q0-aGfBWxGaOl7-oH}`qD2{pY#b?Omi|pAxM#~S-
zTI1MOH(drH(=0Pd5^9YaQxg;CUw`%ZlfLgaK?o^@0VLft{05E|(nvwn2|!OZH+1l}
zEsqWlmqyV7AvDtL7F-Y{iN<wJ+U*A8<JXv*-yjSV{7#GjOjBZ*7SYNSgAe}@hd=Yn
zXqBOU?iEB5gXz(3)iF(jLa~C@5C%TdFp!3cZCf}_hV``-W@jeZzGD{;Kl%}(DCGI4
zzfHZ~U}$)ROvc5uT`HA6HdYroeex*nR-LiYT@=e@5)Fo7A_U|LB`#k)!~gNW{~Xt*
zC#h|0&^I)~=fCs>x9r``iPz77Pz(-l;gA35Kl7h{>o*zRx}AIPydBHQ(rC6YObcm<
zbai*rk0^>bclOOQCtiQ;$)M9|rrEtTL92HG-HkfLCeYQM?9kym#y&JOTprckBMn1f
z7?LPf3=9_O_)XqCeU*AG;_}5+`ug)!s~I+G0j6mZERB=fc^^kU{d*)GjkjYTnc;o3
zC*CAppU21)Y5Q%GIG|W8VL2Xw?}G-@vM@~xFOx&X30EhtAf@1u4}FyFyY}+xv6ne>
z`V`e_F9U;v7^XqKP{wsVE?#(pi7RI*m3kQ-8ABKrLYkCICBE?a|H`+X{5z63Veicc
z`18O13R_3FaN^Zd2%&M@48vQ-IPvN+o_ppwzWk*xvb4Iwk^3HCq`yL|9TLUyb%WbX
z1J9j5d*=ADqfbUr)Vh&6-UW1*z^_wBr6)IZ$6aF|8s1VGRVs}z3@K1bQ?6vGRxQ5q
z#95}V*4Z*vCYN=XyH=-M&63Nxtc{<?$@Fl~fBZc0=m6)A*YVfe6nAeUzwbWcm3hMH
zGnj6UC=vMWIvLL+n=25<5lNh2m?nmlxLy|1v{+i0W#QT^Hy=F22Oj%4i;D|<>!~M+
z<AmYSQ8Jk<mSt0}^sruA;moOH1VO;)*e;5tJf$p5P0jG-Fa5vV_uwP^;h+5t)pCVX
zuf2g5ihQBW@W@tPIrbcX{-=LH7_{&_m*<~-k#B$VYm98)$?XUBBMpc3^>vaY!7wC=
z){I}da`x3@N1qDAunV*>yQSiH$I(*W0CY9mf9IWBKRi5I8WpLVO*z^S?AqDGvrk{(
zg%_sCWo?2Wrl&WD(t?GV75ur&RBwHV5B&CDv;WqeEUhW7kYTZI6VwBoN`cIQ_W=&^
z`0Gd=f|IA!sDaSri)Ex?5Je%IM&sBnu9wAcx0o6~PbQP&yT1EV3=D7Kn@@a|3+K)<
zI5a{}PY;HX(vj=Bj9-3}`I!kEx4`u5BCj5QkpqYB;Mach|03&pTzK;grftzbxP@#k
z&zJuCkNNCx{~F7S3v_&+C{F0<DKj-W#ov74FIiq)<Bq%TVawPM3kyrEtgRv?OifIj
zedXxOPX$5HN|QffcFP&>23klVwMv05mAt__?%w+0k>T>FRthN~i8W(edstYg@n@fV
z1<$i^9E&hWV{F&fMC&VT|GuB#(C_>ywNi=oN!V`-w)cWnlB@+5je0_2NX(n|6P5PS
zzVarrK8uyB(rI@Hf;O(_k;!DyNs?xiNKDhjaXmnCZF-#L#X0VI;QieH{tt5Y&C|U2
z?9*hkd3t;Mh{A|^t;WjAGDlx}hHrlT%ba}UHEzG-9zOG#pC<?tCN5pU%VZfE8Dn|z
z8o&QLzsBeP{ErAaKBj52YwvzW$F?v#GlT18a9xLIpMHUFee<hq8QsSH_a31g#LUjj
zFf}!C_Vw3ZeX7&xbb;o*!#gRYDW#CA3v{964&8QW_`}0nN~38lSYx{e<#Lw4_|sRo
zbYYotIfG$Jq!hGTA<^nIcmCKfvg>Dmokay#+X<5$P0N>T1r8QqOAi>PM2DK7Bk*<%
zFnZuYl12-)F^gf_#9>UkRYyq3<_egGMI6Pbv@nllyI7V(y|&Jk3vbff*T)b1&p%ES
zg?#=`KF8|XG8#<~##H-;Ieg?n?z#VA?!NDR+;;ddQo6M2K9*&XFO+!xnaBC;Z~rPU
zJo_z@Bw@?8z5LYA{yTp9XMdT89(<T)eT~;%J&snIzWyGjCZ_n(7ypVzv&F~1`x9*0
zGRAYyK6B=kqc1%fMNw-r1@AVC-WA?SA%xfjI+t?>_U-TcVE;gFENw4ohKDMgJUPc#
zzkG&rB|{h~WVij3v{osN?xXrWzrm%GD=b`D!L4L*2W{riTx|+kP3V`fqXGkYK~8A)
zTkz-}mxZv*@vnT2VzG*s&5*=`cB@Gz^vPthxNe3dj!BXPDFvo!;kp^LPMDdRAPNH}
zCnqQri+t(_{{{Cv@P2MRd?$PN9iVTZAKNlnUA)Hg&pg31-+Y|@fl-FHY~e5d<g@(Q
zAO9ZH(^v7l4B!39AK_Pi{j)s$zPs_;nm7!(<F32evu77qu3TbjYMQ>jDyC`it#3ZV
z3(tRp+YjGCCX;{j>rZ~|Dc|>7|CCyXvB}Yyj6JY(ci)Gr)$Ev338p2<Wj#*4agB+I
zRlJOYWlDlDCW#exyvpb&ei^&}c2>@wBCH2QD<P&Z$Pal01;JbhGaJzHA(pVUAh@|t
zaA`K;+~55it@=F8w!*etve_(XgTN1HG}bXKNj6^sBuNrs7!oN>EZd>l+sii||9igu
z^(Xn)pZ+CoK5&rv*(t7$U*yuclZ;<F$HM#!tyU9LS}ZQkaCPb;FFpTlp8fWd1VKop
z(!;;~rQhPyKl5+!ayhQftkUsYBuR{A+1zr=Z5+PyZr0Y8Ie+F&q+!t0Tj9dFi+ttp
zzepH{XO@>&pW0Yo|3`r~#SJOA=UM}!TYDZWmNR2XoZz@7reQNZy-rV0mR2hyj1p|y
zL^YNu?YRr*&Yz+^H-&2pk}yHF1A-Nwq>+#<xw!o%z6n>>Ar4@B22M2K_?Q0xcllY2
z>=@Hmr<s_X!u4Fr<qFa;NMcRBUL%S-<Z^jzC(~^;X|lN-%|?SKAO9MUeCQ(#4fXTN
zOV6^gzDgK`2q~~E3&ThsN)pEm4UaKDKgYMe@i>l?<;amc_?_SX6Ye{5H*;$d8yl@|
z{}L?QLu1ftH5usd=YjXVAJ=oZeCYz~YpeA1_7DaEZ=87TT%*}~DoK)7x7K0YSayC}
z3f`sS1i*I8{-NQ@hx0jSEQ%CbYkI0V=I0y4Ny3gD6*_)|-ww&z9gO>bg)r%*ed=Xo
zCP%hfBn(1~PDIoQh*knD!$S1gWb<&FfGJ;a^0{O5U;Z6BVvvg$XPKH<Ac_JO7v_oL
zm~y3p=ecMtXt#ZQzk%b}cwP?EG%!tzum0WN;(8hW*(blB)#XJ@!^Cl29M?feNfM|0
z9(H_O&m|0EUU=>qR#(^Psh0W7Fa2-q*>f|iEeL`rP0qUUv6K>FNQ5+KHflJI!yR|s
z!;T%>Sy-53a&iLKaj|UsT(jAJ66gYrd1G_-?NNt7YMpkxZO0tw?=L=<%erGxtWZj0
z8ZbCqq+So`bYjM~Rj}d>+Lb$4+4f_^<EL>N%Y?Nyre)#vmI)LXK?r_CeaXj31ov-o
z30;FzZ*H*l)Gy*9xG>q~^2MtNDRCT|Bu-dbT3~f$1=r0`DwQz|gD8w?HZ}lFrMH)p
zCtm0D8z=eUfAKG|Et5vQjx<e_)(D|73<Dt~DoIF^h<u^Mv6o)p^2H0}aydTz3%`t%
z@CSeJdz5>I**Z1?!bE9>X<BHlu2(6Ml6IqxQVF|u?&Y>aw-E+y&YeAj-wxi?N<68x
z?o!9~TF1M9HoNucZkf~^s8sVG_B?wmiWIJ6lF6FXHhgTy#BnUv)|!kC8g#PzXl3su
zw=qZT`$VxK+-Tq`$PZKqZHrFb#|mTiXF>ZGZ?ruMC;ltFi_bE-UgFY)N&I$*<66Ys
z4s;a8C>4{*nzUO1*=!!iwowY&oi;(x=FL+ldFTTl;oxnDn4Y>qCYwPBi8PEZxM_nz
zsf3=selB0W$m_>nAqYbL)ldIxZa;jOC%^U;YU?XZTs}po6EV7NABBQVoPgNuvvzCm
zO2>qqHc^~V?d{`^JMO}9E#5qJ>WuG)PXg_K3~1v<pbf+5FO{;7Ii58ZM~Ym|A)B{3
z`r;Im<E!kyWgrE6ah0{Oj9<Br0RsAp1xnQ(!bq_)zlPOn)7M`_RPqdFp=cVMYL3u4
zf1ce}f0q@%$eD99%+D>S>3tXx#|d#95k(0f`tbWHmvbyE&JuLOl%s76r8H3(GC6UD
zLwDRwPfriEjdi49U>YVuq}4#B6FQxCnk}wv@Z8hiWMN@}4}9=LeDq`A&8x>=Bn(4J
z<q8tT<qL0cb@CFW@-RcgRnR7J+SNyEjgSUO6cC32Q52KO7P#fWtuz|7vnNlSd_rFb
zT9`tJ_XK*gMINV(S!1A3$bQ(etTC-MrLv3PikO^SC+H-s*L+4siu6@%=2kVA)Lp3B
z8hYs}J=HQd9o);%a35F3m#EDw^T^FT3~uk?)wL{BYgrDhf0jZx&djRI{Ol^7PKaSj
zO2q<}ZBeT=dF0Ut*tT_qE0@RFyLW^zYVq>X6KD;CgF~36#njX!xnc>|vuL+lcwQEz
z(w3VLk|c^TO%ubkdH(5da_Rg9ZaH|6ANkQAWp;X!R<nWYxoD-3(juELvbH?Kxzoq-
z{e;1hZFrtbr_)aB8&V>WM3Ik9He-8}wY812$Bw@AL>Pwcl-h;)p3ZQysC2zKYsmg=
z#(m5*tT7>>T=7_0X)!<7B%gOt2`n!+*|Xij89KnL=ZZM~3LR-MefbKFrDbl~x1Bo=
z@22gyS)N@YN?azK-Hhp1xJQ4U`F5FX)@E>MfPAh>A)lpODPTy+;9x&{_w8U}Vv<VL
zqg=Il<K$(=FV8YJH;*Q!SSYf(vP!w956`ukp16c<+hnqNwARFNgi<kuLYd>oj`G?o
zN7=e<2mi}Y{3LPUv$V7X0({>`N(0j}P>CXwEdYv3=T2~S;sV7|m1=d6L~D{H>2`)R
zan!+(X}Ed*{JGP|jvjp~2!i%M(qVZ!(1s!VT-Sa~NHJ!bCi%R>@^XttJ;1aKY}-gn
zg-O6=<3lV?CpcGMCRZ#_-L;pn)8zbXr|GE{_~1haI6oiog|jY><MCr-e~BYEsC7J~
z(Bz9Y`Fw^r60EG$u`Gj;Ekn%A&R{!&U3>a?<=9!ypPeON$l<sat1Am^Y^)JQ5j%G6
zqg1T0aBY@mqfQw5<Z=ZxnqsNU`EzG^_UUinxjBC1M}LgIo(k7yrm-F8dJ}mwf-x<V
zIEgV0i(J0I`q~1Q&YwW5gub2u48tVR3MmY9(#^27;^Ku1ZytU5<?jgeJ9QmzNk3A8
z5kV)S<A>BXI;^ev#F3)YNwCZqlZ0#aL6$J+)pHc99<D!)TT3wdcjB8R{`T*Wa&3Nt
zN5AWCCVNYa>L(fVE^=X`hhib1)r3|nKp2|Qtr-fXAq>MIj$*XZ?A+bQmCIK-b#fXn
z<6;;R%Q8{QrrxMiTWhd5b&jG3u9rn?SYBAB)oikR?|$ZHukrGW&k@I($3FT&hKKsQ
zAiF4~@G==3*Fhx;-SuL^fglJ`N>S<Q!*8{C`MD=pTA1eWkq=Pq86-esIvJ9vjfz8r
ze49E+{6hj7{We*sMr?}al0>n--lp9OQ3-^dn6_a+?33AYh+bFIkt<}%S;9y#etwdA
zXNJ<=0}S4JGsh;^m^)VIqxa_7-#JR#&tlmo<q~NTT|%oB<NE;vLmqLgIe%uA{{Axc
zT8*PGUBtFiEuLkXXqAR-DvHUP0rB8nTv~49tWS~a-3lT{6vn)9;soPYt`G(R4?pq<
z4?grh)>l_j317EMVi^_!i$p2nC?-)c(lBv7Nf?C0VT|K?ShmB|<Ru!78i#IwkkM^>
zux*=2XyUZ(qBPgVN4i@g)o&#!-^rrs>JD|Pv<x~4VJ9Jq5;{Rb$B$^XB1C4CylapI
z0W))TE={ac4-HIHQ#=0#t@&#d_T0p`Rt8wP`Z(K5bF_7yLcwNexX9SnGClnn3VDls
z&ZbuLSy^n5FL?9~IJ|oN63u3KovsW+Vp;|r-zQjE<=!9sGzWh0KVa|q5tj6RmS!#@
zR1??Bvb3;76b86%h9mdhN2OdwX^rLBAiKI>op!cO!@x8Rq>xA<F$@#eb8#F8m88<q
zLa{`xw#p07eTCykzeU?`k;&$;Z4bkAgm_B~wkdQL-$}OnHk{Gv#UzO$3}eD5bp%nE
zqyiAB=_rr55iohRPA8T)o{QNPE_#l|;?gp+cF5?S1`iCp#;WgNTLNK9yo^Pm=uxd^
zn9J3enXQq{TWqX{6iXQ{U7BKQauwG#F{FWIn;-;n7}318$lX8mlic(}|ADE~lStE~
z=kQNcyYyA&=e|nTt6^F;p6Ai&1gYe#T)?qRBBe1+izG=%;-s647?`Gs)|x1akU}Da
z#CB|i6a+zlN)ob}98nx{_RKLB7iTzl+r11Ak71gY{)dF<-<djYuyfxJNfMndSu5?b
zgkeG$NBD^ip@EhX*RzqP1xUh3)6<h@&-P)~#TbX|7Z`M|vK;l}IjQ)@G$ocPv2ByF
zZ56V4n?^mLzaQr3*Essp6)el3P)JkoSZNF?Sf8HZ)=&Hp5B%!yGj*{=yVV3M!7>%S
z2fvTC{8sY8*I2*w8h+crwk_rt7n#2{O+IUJ;NT&GC_-xmra>G>2-48avMf?XY}!3R
zr*&|&?n)#Q3~7<eS*)+lbM(b0*uD1<ogmPLVe0Ro%zqnoyi3Essnk<ScXiA1`r=5E
zggDm3P6;!U$8>BqC9cx4P(pHbsm)|iq_3d3tMUr#O$AyYO#{z!@Z5B1TBeEX+H4uA
zuytFNO2y*Yr_Zsx)S|CHPq~sMmv<->JT_(~*nZ!G{PREh3qlRG`Wm8~#V%y9Jd=8|
z!NL3P;a~m2|H<KpzL(IiQCnNW^RkTY*iW+!6BFaOjzu<`#V{ncWp_2#DMi?}jcJ;s
z67aO{VVEY4V`JGCs=Ky8!G8b%AOJ~3K~%~!**rqPg|o+*96u}d4FePJ1YF(_WW0@2
zQf)Zbh2tWXH@~HwqpRyMZA{N)Q<;g7AWaO@!ph{h(itGxI6<#I!|aNQ-wwLTflP16
zGBFGzy$Q>rTFG$il?h%wKF#oOk^aF9g`!QhH-l$&$d}7}>^J_Dq6?vykQ*yw=Uimo
zCA4jd)hrL+Dv5>7-5>iozURk(6EEXHuui$sN83+0_2y+xo;;0dNDBFUDy5Jz&9s#Q
z1g2$T8s>GhWcL`uG_fr6diUEfOkCHcS>K@3@%g97b`e78x5gPXaTIHnSX~XnTPH}n
zzXn7#qS`#hz;2vemLLgH(!?+wwCNCLdXc8ht@exPxI?3z;J6(u%jmYJpis<XNRucI
z@jR2O)5|>mmD9Mk$&TF>Dpjv*4}$i>Wj^>bzr)DEtxQja7zKmO?i~4&#p>l6Ed?Lh
zWmCyW&d&Q}Y?BXs><7s8jIna@IiC6I-|+QseT!;u57Se<_??Kuw;!NXDp1>KTvyv_
zmENN?(iN<(PXMH)Q$t9!X`qxK3d2-sWtv)EuRhV8*U|4O+wE5G^ya)upW|4M2`RRA
zC1c(CLF$!-ln}Nc+e3EGgP65>Vk3_zk09MVB2&b#?!opF`e*-$b|*v&i#SdYQj^4r
zP7rj}q83RUGdNh`<(Dt<=YR4FyZ82T*L@>oJO|gYQSEsK4?fJjKk@4<&1sgG0^D{?
zoPgEuAc`*cS55X54W?>}tZ9&U41%~x%^77f^C(H{61R=6VYqo_XXhEeGD8?8RLUhv
zr5q|zDMd;UT671J()xywpb~X`sHoeO>IMfPbJynIoS3-!WE91IcRc4i&ak|Vz>`Gj
zI1aUgO&p~i7Q+zN4-^1)7Judp8_f=0p%-U$9CD+G(g@NtNs8NW>X%uWTV!KNF*If{
zIFu*o#Ps&%$YgAmm)EJ)8}#;6s5M%A<LhUULa_f}AN_p=+N}sFG`eGQ)5m`n?LecG
z(1|5wsi~|+Ox9x#?eMs@FVFN!Kx{(E1{K9zTi3kN%CjmW9^M<Ue5sGvvZz+eoIf|t
zOE12}{M<4RK6HewTSpK=(&=<ka1Dt>qqI&HR91>j7=|dF(w||ZjRg%Nx#1!FgU(Rj
zz~+TQQJAJHn~hpJCZyD6w0GTA3Oj>Z8K=2COK0!^Nz@{kcn!UH5g9hgyAJmH1?tOl
z_@T+la;uwRcDQz}#@c#|M#E=ixq)H9Gf$u4t6x6DzFYda`IZ5qP+^(|t@;AP`|juN
z{ReSsAU%_Oj|G+_Ck5NXgt3i)>4rj;9jYUFI+n#m$KW-;hpRQok=kz(OdVxv-b5t{
zUdG{$yY_R_{vqb(F7w~N^f)I@oI^;B=Q`JQNQRkK0yq7NX_}a(nR5CKV|h}_cO)SQ
z@fMYQ=Q!H7EwTT=L9w_n&*b=dayf7F$)&$K?LH{KK{WFk;<k^F-MWLdi<fCloxxg}
z!)*qLtH)?}6r!U^R(;}Fv1LnvILgrJB;*S=J(VnR6!GnET)_8ZZaX|krQ*@3hd7Rf
z@57P1Kgk{mwh5sD3yy)Zp`;Z(kz}>0pc9ZQStLc1hV+=+a5x{B9BzD$!rapwn=W9R
zX=N{t5|TtPvSomt-V&ECO!4FsPq4glga;nD3(s?CwS1ILv(Q9?QVBw)j#9`}cNaww
zDoIdr!h4PDy%$HDH%h{!Vf2k{-S%Dk4%|AXw9DMw971<+T@Qrp3LXU-35^B3+rN+D
zTkj+rEfa<jNi2||PiO9V8tb!2=>dW;OlUMi;y59SH9-(FG*Y6~jQF!ZK1QMF@cu`4
zP%L<urU9zX(AYs9x#!0bK;BA!lTc7FU~ko+=t;sDNHo5$*zh&iLW2v!pl9k;Zkqa!
zoSx1RD}iZ>?pSDQF>#z=m<GcmeHcc}nbYT(nOUK)e~_M@B2gHkG}mRtNup981*mSu
zt(0bdVe!nw_|%heoLuMV_tf5XC1KZrc3ii&T<!g?OeQlnvSka!(g^blb%IVE$05}r
zBN0xPq`pY|%u~3PUiRI4AA?&*$>a*?Sh6<tEY0;<6i%9x3Q3Y^+U=N*AJJ$8Y~R_-
z<m4((eDy5*Z|P&(jxuOLsgy;^2DcynF{*{JuKolH7L;8WbOp9b3+RC<2^6#gnA^}?
zZd-I_>+Cu88D?f$EH^A1SG?!&uu`domnsDYhw?1UU*(NAE>SG?uzkli1d5;&Af=H?
zD^!vO1|kg!g@lFqr8Ac=Pd*vP*PWr&9dCSB^-gR37R?BOFohIx7*gx3GBVstCie)J
zFI;AQZ5+>T;<_GMNkpznG<TM>zx#u<9{6XB9yo$ZY)mcCNd(d)NfKJ^4oRYLm5tUK
zl_)IVAn-#joSVnA4EhFh1VKXEh!Cnlu5TZ@dLL~C8TnQ=P_;l=upS7c4>Hz-rlc;Q
zj!E2x;n#ngwTa72*ZatL5Xb3*>f-ZO44~5+ZZ$%3g$y5f>@cq%zrbJr)qi99>V4dG
z*Fh?kGOeahoW$6cNgO9AA+bygt#y~PwSLE7?7K&l-<o}9b2(_Om6k%FFxXhHQOJ4R
ze)s@ar-!+E^*r_FEV)dGB!?^vAa%^di(h5(rLSN(9$r3=QVMD2)AK7$r;{q@RcsR&
zf}VbxP7pIWzDlv=P$;;dG`1~iH#ZpE_rt7f$?`(XzOq5Z6L0h6RR?mGfQDqFp};T^
zMM>|4r^zfn&ZHhd>WDbf7)pbYE_*}XVBJD@vp`84X&l$&?t5?M^vNgq;upTa^3pZl
z_uvDJjcp+eBigNYS}RcrDoHR511aS{xz@oAPLeoE=!5|Zjp(ZVo2?F(nXqlFOke*4
zOpIS;Y5ojSuV7gw(y%bIc{C;(3uz9ZqIFbKLrNFjEop^eOp++jlF_jeYim9;Gc^hY
z2h)&%M5~xan8C>3#)t!f3mbldDGdtF+bO{5ig6+g)->eSBdY74XUQmF8Ya2Cpwmg`
zaFo*NN|ULSO>{++S}QEaAYX9sn~IlSI7<*}sy!u6zHthzC5H|jV9&l?lq+S{*Ei5w
zVcRxD>BPbf1M+Ona&N}n=6BfX0Id~kYjs^LwaI4PbesT-C{e`CHlF9O@1~uUs{;i7
zEcv`ir{myv43zY+?Fw!t&(hRiqg8}fc6Z&1wDK1#I-LN+5G>BuSY2sS?d`?)V;YT+
z*7^dKZHHMh`&pR?kgX1;Wf1o{xK#`L9aS1zz^(#V8F=l|-?PxZf>j)%Vnno>5kjP3
zC$Z|zc&D==!jLGXv2BB5(V?%e#0$@!<CS9<>F+OM7zP`)23Ia$AeVJnUEko~f&B~)
z_OrCKN*G0HPtve%U=B7X|KG!+-{B|n`Ml0$b1W{bQYz&rmGW4QftINN$M-u(sTmx|
zVi>oAv}yYZ8|wj`P+{2_+RZiMsD&_6orP2aEi_7`69igAoG8{-TSx&~X&Utq!!%gG
zHjlGoC$?uYd48EzBcZ40U`b8J5)2ki4DoKTE5Qbp<lE@co#cJVMy<p8s>HMeh5^1G
z69h?`<(V2{jbTc%d6VIhDic>$IdS3w{rv?j%Os2xmSwTNw1B@dPscTQ;l)?D<>o!y
zeDi+Vtu{-`E7vXfE&3Jj&C%&b7&kgYp>Nv1M|1+k`E!@(bRzotdvRRzIzwu$@Y@}v
zj1e-OKk?jzD2|CEP)Z;S8$mbOL8aRfY;MCK1#zNiw}bS3q-nK6EKA@AE`_l>Xt$tU
zYoS6-Qz+(S>O>ReQO=rpmc){8rM8PpU#D-tqdG9c+G>r=N(;wsV%Y-QG04Z7jrD+b
zE5fi+PPQ%R?JE%Yn&+QANiJ*SWn9|rkSJF8vn%wy|A(<Z{3(K${xgL0oH)^;R%>w2
zkvkb1-NK32Pok852Mr7U(S#+AW1*DdmIM3AW;2{Td7hc+IR=LZ$Ye4|VRW~ZP~H7f
z6haF!o{3=^wAu<S@<_9aRx==76lr4v-bz9Jc1Ww)AxSh*tY|kQbkreG1+4NIwdD@A
z)dq%^NTt|75d;x_CuYw`TIS5yf@;BHy*Y&=&yy){C5jd31k;c>j)`rXY`7gdL4xZV
zwEUPTNYF~-dL|N==bkx9(D5l0Gx(hdji52RKz3}DBfs*0<K?m}h<=>&e~vkKobmH5
zYV{`XyZ;Eo!$aD5%foi_!uQGy#oNh4N<<vRqTTe_wtXA<LXqRIyw26Bd4`4uC>HWa
z(<1GZDTGugC6H3!*e0fFVFfPjS|3TG&?>>S%yi*&xAoB7I`<~0Ns-31je3B{6cA39
z#zvjSS_9j*yWcC4C?@R01f7^&!x=6I9^thbw^qJQU$vho$q^^<^?22?O&r_Ab6c#f
zw-JWG_Dte1?Hu*?RXP2}G!qlE^i&HZ-E_OTx<Z)1eZTZYcHEcc!m%cI+;fN>kKW3&
zPyP*yM?cTn)w6t~(<YA5uIuVnt9|2sF#Ho*S#O1ctyY`fz6y^#`aX^yJH^$ja|{gh
zQthc=nP!(pG=c=J1v=3f22@HWL3@Pd*$iPP==SEiqo5+q&!RBFwhb)PNQ+hilF-NP
z?+33!usBE54oD)^o%3_jbk|L|+79u<m~4NZxP6+Qku`+94OD`R4GM(<hAFUZAImiH
zG8SIe!dh&yw(g@6#n4EZ#(KorH?L4G=P)e;kwB}_W_`ow@W1>mZu{h&TsW=i9m(-n
ze?o1|;Qmkib1v<>i>Yt^A+1Z#FuT&C?RVZr9XDp=H;yP9@K$E%d0yX+ojX6$+uu7T
zgeD9^Y}aG^j;%-`nVh^v5X88yjb)|-j+=r1=77FwNh~YR%F+cwe+{Kl@s2RM$EbAD
zE1R`wHUnJOL`X@{Y9h0}Y<u|oi8flSPc5d=0_o~eiAE`n5Q@pBiJQrC|Il%4yM+>|
z_D+zty-XveGTXATOo44lJl8=AK^P}gN+q6q=1tbuYLv@a3{z68`AlD$WB8s&`JX=b
zN0fkOUGVV&WL(L(1{o`chboi~et^g*vvBU{nVGAzPbrNL2*b1tK&kGMy}=oZw>d+E
zz_1LY)Woqu3qhyd#>nNk^X^-zR4Tmu((6o3EikfWfNVw}4ZFK1M}iP0f!`*Z?<ZH-
z%EHVQayf@Y*{CqVwhT-|va#;tx{_?pLFu%XkZ6mjxr*OvB2Ak(2|-C@w<a7%2~ikf
zxDGY1kHy+7=Ey9az(Fb>%e1j<6De$@VPjf0jul{=29{-G+de|V)~y3P{?$`lxjaK}
zZviQw<%cZJEMnLupZtx_aZ3flCOonS$`W2%1w();O4@Br))5SU=zE#CwuF4`-++p)
zhjr=(la@CI9q)Lh8y%_Z^*XF>>RH=puyf}aAN|<-DHiigj9+7YqfVT}2%!<AdlYG<
zh=L9F-25=3J0GA{tCK`c&}q^V1QDhw2!fcnJ8#}yT?nlRVofAWgaoZ3P%%O$#6dvN
z_NfJmjmV|Xx<aQhORdqN-EQM|e4-%e_Wv9*ZWhnWkj<vU`(DOo=dONQ%?{5$dzMNi
zhv!*nG|Nj3me+kozWXP*<)INqHQb(q9d24v*;;@d4h%$)$p{)*h!hMA4Us7nHaC?L
z3c(FQ$h&%mZ)fQ47G?;IX_!c9VOchgW6}1T3=H-2@$dN{J9chidU}DS#Z|(f)9o!P
zgwO<j8`qZH`_K<?%bnj(qZQF<uaG1fFKf}?pS$i9wMrYL(st>r%(6atjyO{#7O4av
zP9n65Fk}Kk;VT2z3MoXFn4jBVZef*;T7w|$;0FOw7^MXuDRJx!UM5Q>lcl$}jOV)i
z?cW?F(FvuBhmeAejSfq5%k)(WeC#KGiC5-fp$5Z12M{LoyRbb6d-5=*q0fS`K^Sn`
z7@P5(kSHw#H`I>g+tf1RUCIv70#llphJoW+_<oCpg(VvG7Hg{;7^cB@edPVzbMIl6
zmsXjbUBqwupcACfNGWL6H)uDOICRIu-2Z`}A(2&T>#OwjX0U7%t-y9Hl30<%8YNBq
zR*jY8Uj)}cd09F^K&#!M+3L{o1A+v6Trzr@=E4Q8UJIERpJ#e{f%UaoI$s`#gn>^O
zg$Mz*?cq2cLp|Gh^_5vpoET?pw2Em+q9|cywNBfQIr#lQO?h`eeTy-kgliE*F_a|O
z5-cMv)sAK1HV<xdVKCbrmVX<1TE7?2=o@Wa2u#z!vhD6rj!CQ4Wc<n`OAE`mnF6g=
zo8`qN!Z70Adk^uEk3LM2Buq}sQm?mCd6m>i2|>qaV`YZzJ9hDbkN!Nx{#&><JDqN7
zBIWgHL@AwatmpQydg5_dJWXc%%_J(K(`w`UKJ}(gJy3+gBV4}7+?C6WPqmqv+F)vO
znemBP7MB)jH0p$5hbRmP;{dG^JUa{6y!g_228W7xo{5x#b~|EqZj~*g18n=?PjU5P
z$dO8fqv2cwmcvx8=n1eS7!n)<wz#m%21jWf-$2UZ9dYz`qz=n6h3z;Z9W^sZ62;8b
zX*|b9Da}jIzl4wmmSeNJyhN+fV(-44eBUP@quNtoe0-Yq^*V7JA*IHUX(xGgd6sg~
z<%1vlDSEejghsuEP8waYO1Iz?D=a6=(!x56kN*lol@>j__7cY-q2Hksgf#q!uoKaq
zJIliCGPAQSmY3Sh&$qZbwa)+7-kCkgb=~*<bIx6Ro1VRA1~ZreFvLa>A}LaqWs8bT
z+htjFWZ9`Cs`5kRDyNjkyyeNS`3I6p@(`DoD!ZbJ<&sST6e)>IL`yUUfdm0!832P>
zF>7~EuXjDi59fAI4+x@Md33qwWgfbEZvXC?d(Q9s`z}j&H+itS&d%N*-JnAp$AnQA
zOO&|!@l{qHJmBJU^OVXyK{sY=bDvJEIQjeknaaWxU({RdH$vWBiHKv!+0aNKO2O7(
z3vey)0S8m~C%ryXbdO;C+2@{rW#Qz>d7}rBtgfswJW|H>9M;x085<o%T9Qt?&G`5z
zjb@Ya(J{_F{S>WMn>$OZpap);#kOS+X(0$Zc&=u4{yBs*MRoT+s2Y})BMcRmC9y0?
zqCM*Cx5>pTOrHNLh0$p&1a_`O;*5YSlB~T>Sies<a?r|fGm}`;?HX%}G)+v`ipH{S
z3OSp<`tBQSKddr4J3_tI<<{*z?%mqp!o|~k<G=hbyts>JC2Z}*Xf3H~7ta%nIA-JX
zGlM$`eZ1wyjT<*EU%qrH=ytotM8dMPR{gR0XBJur#y!vd`iYY#7p9NR;rSlzR+oGC
z?o*kZ;Ds-|NUBoq-&<y8rb3~ZM`;M77~k_bfBq?KM{?`7(Wdx$AKRAMR6-CZF-irD
zjLzW|&(LgENuzaCDoIld+Yva9q}jFET)M%*#&yawr?9M;#{LR>>(>b$ULmf2M5o<G
zDGRMZCFYc>6a+y`7{;VJMhiuGD9`%#2CrZGfO5G&l4zFiS6RBbL9-L`o&Wkj`1bES
z&-<@`NKHG)krLfj!fI7;rR@^iP_&_7(?<{ch5qEmjmxjS_FA{w?aId#`ZGI2KbI3>
z*p=_R^&?*R!k2jZ!ZUpS#pg+ql%4He8qGFZNlu=aWwJ6(7)3~FhL){%izxE=)n9#q
zN@aq}mw&?j`)kb2O;aisuq+#mB#uH<vdj3`2>HSvu(A9W`<rjmZdcJ_1lKV{!)91y
z?`Q9E^U6OUZHuteAP!*e_z>lZ1(dQ7mO{5<RB8w?agvgzE=qL_*E$u9j}LL_@2;}D
z)8@?CDXP_got-w@yA96%(wA_b{?}Z)y2ttXX}<gBO`L@QeSDfQO6aVHyn{#Hf?*qc
zX>jm9JwpvZN}}(a+XtvWrD5r<Xy5ZDPn<gOwPLYw;_lKC-A<QNi%+q*coNTdaU7e;
z$q6b`lf-di29}nUnWJVC;xJ`)c8ZgyX4!hU%j(J&w&UP>h6YAvTAQi>&$k(yyg<G<
zO}n|m#@ZU)PKTh|Lg)m`Env9?{9=WX=?g48{aZ{eyhv^9CTSYuWTcBENl8;}K&sft
z_Oz0?p3VMVgP;7ryM``cS?uq%xpD0Q?Pka~{`h}V^eg<}yFcd4nK^QW93TF42}d|M
zQzc~4rroee5RBzvE@xJCZ)5xL+Q%PXx^(GM7zBZk*@{;GgcYqJRjJbXg7M0@{_#~>
ztp;Cx`8PRx?kvqlgH9))(QE-`TG8WS8;4s5jbeYl#z=XHfB&to^X8jB<-=dxCI}-c
zl`%ZWK?@6|APm~rR?I}@X^N#u$|FC(v284O9IP@*mhtkV<cp(7JCE&+k+kp7YS+=)
zLP`hUcg^rLRU~Oj(6xxd1lzKC|EDW#ZtgQTS7v0aK%*Y8z18I5<^gAZ`6W)h@N2C6
z@Ew9?lh@w(1+RSV1-|gYJU_p-N-0QjE*vKsbGXx%lsDm24o(!0&Zh>Eejx|Ek)K#-
zrTZPD@lBd!>){4}_x-=&%U}5_vvbE$x{i<*?RJMWNs*S3!APNzLZeg)LU3@<AYUr*
z+h2c)iSZHMe*5Qi+aYsv75to!w8)0F5VW^&y&*2X_y<T!qH#HB#xxooq9~%%XrXlj
zKOaE4hgO;(h(R}r3O+gC!!o9?l!kI7iDK#YL#ovVL6~6K0<BFqTCcTGz;nO-@34a|
zyZ6_ybV_}9pEuw7h-aQX!*kC_?yVoty|RLTHYGec!Br)h-+^NuxDH3zTm2LC(Q~x@
zMDR`+$6{qrdPc{_IXGzW#^qP}@>hP1)9238YPCT?yVWI4RHpHhfH^&AEztrxoepsr
z^Tl6&mP%!uS6_XbrMs)l&(APaDj;nOtz!@tanvM^yM1A%r3Jp75Jw3~qO(<-5_OCj
zu#m>FtJP=|1`)pRk<Yu7hJ4aArrl{#E_;-;$3ZQiw%0{ku<_s_)APr<@X~Lx@zF=L
zYX=5l^j)@AH)yv57SEpG;<;n&He)vLJw((ZS{J7ILBZx?7e414HhevXsHR7h95Ca4
zLZQXs+ssZbv}U+m#`S!D{KGeR@7;IE`#xi1M!M#>7Fws+wvico84m2Z4pJD-TCG;&
z%$a$<{U3gp`MF8%-Cbd4w@MO4Sf*t`>jac(w^bS=MM|MyGhA};9DtN43^SVSfJr$J
zbVH&rLS{Z9`@2o!@!=VmbYvt)q396DDfMc|g_plcX=I9rckYsg0b0c*VHc7n&FT(U
zKe*2Qn|B!U;N*!icJqMfy%p|%67rV~Xnck`NFW6IF%8S7-m825@rS^?LFN+jd5__d
zG9O*N!W)-gBaLH@%}g^qJcOV3jLDTSoN8%-?Fd}g!Lp6d?B4D^rJ(}f{=?tn%P&38
z=H?FT>$`M<091NdY@MKW(#JS_Uoc#D@m&ksG8Y^tDw7VIf=f#vr0Iqa>H!ZP?6I;^
zXMMFnZNEzx#<V*zje`(?>BTd2YE8QJCXk?Yj7lSP5<%F)69Ic0>wNhB6`I>SoR}>#
zmW!~iKH#mlyZrZUgM$<-A?1LF^P{By&pbzao;N--JM&7hSX|JL*(oi{rcfxdy|u;C
z?b}Sv&T#6~smwb%BvHnEs^?&CNgLO5u!P1oJP7jn9M694EQP$!$JduQIOrIAwaoU-
zY_2++GnyZRDGO}dCXPGoY+NHrQX_vrBQ4X(77KaORI^{LBc){u+=^&4LfY+^R<niD
zDPQ`xe}s-D8z0?7C9$#C)@C%PRf1LtxnhAd3fbGM5l1N#lVf-;G*|YxRV`!9+PIsa
zT>sH)uU&3+x?O}6QXV}=%SYDmktc^hAO)aPv#}j{;A;??;jvM=VVCcJ@2|Of<qDIN
z6U@v^;ro834bixci)%}K$6{h)j5tZy+}vXM!8+U9dwk_9FY+J%==UiWJnr0iK)v2X
zr7=R7xt~@EsKoqRClS(C43z|>ViBbr;wU6Z(mn{Ll*0Gj{y59FC5~fZIi{(RLJ)S_
z6h_A>4Ubb@StpIcKI31j1g#^`F>$v^8Z_};fumZ~HkMhrc>`BPoSOE?uifLneYeH;
zmK~M%dY1e2$Ohu^8Ww#NyAwiaDUH6b2W0C$cCA1s2(1_!8^f|J{`POa$Lp6aF+4oX
z!tq&3g}iZR6kuDD;o%ZHJ3IXJ??0g3>Eh>e+`hBS($X?#&z|5vedphB=JXu*?yj)C
zQzMEa(>@D@(n(f;gfxj!Dr9)Lh~t?JFHIFuY=}8h8qsH`9rh1hhAU?nN>T`dR!n~C
zDLP4s`uaL)6ri#dtkW2snj5RrknX`Q!ND#%XkaBx!s-SO?_5K*Yk0PxcH=hhf4FBK
zC{H}H8XwD#?rGzWAkrDp7fT3G2`XFNN-LB$L>raH6bd=UC&u}QpS{Ol{>7gWMggZ!
zFJ_&f0b~lB^&pq?P-)7?*FIsWoM(4?hgZLUnIu)XevUhL?o%!o`Su@vlb2uq0-GD#
ztgdbo1R+`_NTJZ#>ef0Y3_9fU1<K_K8V9kt{i!m1KF6lh321k^*p^M2u~s{sm@rBS
z;{=_6$d9vfkf#-EJXd4O6d@9`N2Ccli4Z!4G$IM=kTlUz9Z$Eg<0@C)`w4e%+~E0H
zmr2zS`;AB(N$&UzLFcDQ>KfT60V1-d#7s`KR=qPq|2gV;K9iLRmhRl<PyhFyu(7_*
z!ijlCM@O+8i-Us$TFoZ2v(s#CZSwx#|BOQ3&2W@9&1Rb@jQHJeyv(=0^;<+?z|ztK
z8jYrTeqz}FjwO&HrQK}s?2Es_iBt3J@9vYPW{ea@5%qeLG*L()a9x{`ksMP~C1&T!
z6!K>8u;Mm*T|sN&JXU3vV!@)|X$m<(J}=4TB%Ukq9CIT)TT#vfNsHyBWt#gB8B158
zz64P-b#$sx<^u-+00`bmL_t&!!yb;FFFvyc_k3?+=GgQr#Zqyh&-O>qcc>RSGlsSL
zAv5N4EDFUE2eo}Zy!s)9Vv(mWJdF^LFXXv*_Z|-)?r?m5o-h8&i)?Oevi4wwGiMjE
zY^#4fTYPGs#l?BHw{}@u-2@GVLLSiU?=`U<3rEIyxnUO1ynxmr>uXD-NeDO;3wchT
zt1wx~Grusx-0@*1D<!6<%cN<_%KaVkLuCrj{T_imL@F%oq>Y<&uq}=4NNh`B+bNQi
zT+X48vuPYOxqE+|PN&0D^COH5xpZ0$YMV>fs~ewOO5?B#LRz+M_|Ym=Pb8wdt}`}s
zZ2Fa<q0+*m*(p+5eP2$|bKvDL%cN&26-OagKKMCFl5p|jGnC6^@_C<|pWGr&5(@bO
z-EN1<<S5TvJV%-)BvDL~CIsD(N@a{+dhv7A>UFA(8h*iJce_rr(IyN-T-QO01g!+8
z&U~Js;R>tEcWE_ifMjZBgp;Sn7#gzCS`bAE#gfO)c7x^RU2NT9=Gossl^2X7uk9k^
zHX>{yREo+7IEA8*iepw+Ho0?a1(hb8K4pZdL11i}Th+}Q`|Ecut2FMI7$wUQXsuP6
zK5<36o;x-@Rr&f*xpZPMHK<SC6B42IfDx)jWKSY(Tzm0zE}r9Z{rU~o*4H?(u)z8A
z=a@NGq19{>M-k`Go#BPgKT8}NYkSABvm?C1vJCgQ+T5dFt5Vyp5yv5(XLKmdW)~^J
z_sj&RQdwZ`#6_yrIuAFN+21*!JUq%!*<*CnXKK1cb+5y{dwcBfcSwUa<6e`>`7fcJ
z5^>Z)N`(wt$TY<Dj7#tKcAcBI9<aK$%}~kZ)ciP(V;m5K(4Z4q_3i8XTlX)iH0fqB
zD3(@QWx~b5LUV-I;rrg?v13!eQz)2ov^av14Dk1k2t5T_r2R}Gr4^3jQY;i$zQ4?a
z<z*_<(=0A7a`NN?Cr`~&Dwb$>x@0#V+m_^V9z&%e8qFqezV#zMx_XUnD>SlZM`m;e
z146c&UBW0Pm$ONtHic4w#nYc7j2)KmFY$0=gYk(8DpLj4*AKY2R5h)=6m%kiYHpIQ
zf561?lZ?-w!nYzEN29bk#cb`?GY(6{%=9p`v!mFSBnrErqKsFlX;!zc>~F7LRw@mI
z>0PW$7W;^_!uZ~ao*kR-`IE=yj(xLKD$VuJ(2tRX3Mu-6PpuU~%R`Vwh-^qJ85<j;
zesI7qesPstF3-Y=1%hrsH|X}ol9m+Y^La)`M_FFE&+BhqX6e=vVLL!d!!zmKU`=X#
zsx4#F*69S~d>5@^QWdcH)LDi`=DB@qmDa&7Nu=1{GoNF;uN{<9bV5nEw?^aETX>dY
zWab3IwTYvEYVCkVqe&s}GBa6bd?cR<gv`kVl^{_hVJoWcZTz6Nzx`vabz;V}(l-Ct
z`Y|T31BI4SdXtrjmqy1%&Kli@%IM99>1f7d=<qo$GNET*VVnJ8Sr*cg<nnpqDCGLJ
zYbd2zeCjm$oDafi^~&Wkp6l`MPu}6xORuv2U=5XM(`<--1Xthu&p=)&j%^bs3C(5;
z*O9ocLl`zWe!Rl;v9qkMw@Km#<D-TF5Jj3ePVroaW}`)*9MU*s`{Q?M?rh+X%%Cj?
zsbhw6Hlsx!Tc&h_026JNBDBf`M2bdj>&o`VgFo-I+qZg;VJT$hAN^>d5td0@Gv6jj
zlORcw(D!pQ`9k5i(M2C_h(~qdIxD)BJ-$VsH7SHK_ZAr`CYRYv^wNY*pF7L=*eIo;
zA!@ZM|M#!|5AVGDHbJw4P+;3mrr}fB=jk4>cu3Si<JuCf6pdyFfg+#x3A!C7$8*fg
z9j8|JIB0Zm>;Owbr(;Mv`GQ9rMMQ}P%VYD_4XSIOP?=q%GBHNZfp)!4x77lrv+K|q
z;WDP#sC}~aaP3d3d%LeHrNToMvZ4L-l9~qj&`!1)#)Ez0=;-jToIZQzJC&)4e`QPQ
zB}v*&(=^apC&o6#WUvV#v_>cnHJ>6A?;Cwbe;Q$BygSYQ{=PmwKd)c@^<O6l0&(fp
zzvbcfhHf_#bfPH_mvn}0^}_RdI_qBeTINY7GMcPJBUBv46pIBpI$F{ibk4V>ZTot4
zy)LTztHKdgrBY-0X-R__cDu1QPV6}fLz80q<XN0to+t{5J8gnS3mr$8=tV7*O2VMq
zS*}%ge^}k$eIpEm)xi^-l+x8&$4aUA(L&o9hLL3Kb+>ni3WeO6*}2)T6^q6BIF1`p
z6xCI#B4cgSR~e-mo$AB>d>}wlo135qQCgve5W3lDD93R~l32t^q;1R5^?D1-wzcOu
z+Hq_S)BAdad65z7#UOalgBFxP5GSd$ZHs))*9a{HsC?d+?T!`)2M4L3qb+H27^P)l
zNk<FmAT3{Lgig~4X<JCk(g=h~Qla8VYpnztl_XIk41@I~igwdfb(B`oQC+>Twbp4*
zTmM;wMhM{uA?z$_568B~JU=(AlnT-`4F|)^`k|OwYcUWSnavDzFRVo)wAM-u0ODE*
zK@uk#5SC?;rm60QIrb9&q#Qir^#5Z9NSVe)KpV$J-HW5@%}aaIG^G)aZ6T#psS@U%
zXk#3u`x;Lr&}lFIQ}mvTS;(a_gOkHeu2)!n*lY}3Ykv-Kq|m)LtHTT&;bd1B{}V!0
zvu!cMy!9dR{So&prTh7YS+-*qe5q8nEXCn9^pZ&XpQ44#YOM}eu|C9R_!M4qn1pGD
z16myNi~F@Wj5-~N;OzZHcqE)vGmwxfGS^0wQvC%u7?FBplyzi<_Jvtyb$>dK7CA78
zltKzQXx!8*j6h0+mJFa(hgq<~JY1E@-7=y`{V5!Az=x&33BwVY*}yFNQBmblp;@MA
z)sLEV4MYqM8V?NCcQ7_jo9Nd=`LXFi&`-?peM08!6W8xRzU^RgoIbP{`?RagBY#9Z
z`XwLp<@KZ2+0T}Jtg~4!j_3a~<yiEDO!_f{Cq3}%<I9viPSn3-M*qv}pa1J00d=I$
UcRs)j2LJ#707*qoM6N<$f*X!}zW@LL

diff --git a/WebHostLib/static/static/icons/sc2/medivacemergencythrusters.png b/WebHostLib/static/static/icons/sc2/medivacemergencythrusters.png
deleted file mode 100644
index 1c7ce9d6ab1adf75a439880dfc5c4efc5c205e8f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8954
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
UXRO3;KmY&$07*qoM6N<$f_+btga7~l

diff --git a/WebHostLib/static/static/icons/sc2/neosteelfortifiedarmor.png b/WebHostLib/static/static/icons/sc2/neosteelfortifiedarmor.png
deleted file mode 100644
index 04d68d35dc46ceb2613bcdda496daf8d7706c42c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13032
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

diff --git a/WebHostLib/static/static/icons/sc2/opticalflare.png b/WebHostLib/static/static/icons/sc2/opticalflare.png
deleted file mode 100644
index f888fd518b998801464cae41ee340c15764716b2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11440
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
KMNUMnLSTaUD~=HW

diff --git a/WebHostLib/static/static/icons/sc2/optimizedlogistics.png b/WebHostLib/static/static/icons/sc2/optimizedlogistics.png
deleted file mode 100644
index dcf5fd72da860f815325f8b22ab21c2f4cf9ee72..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13116
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
WfCW`lI?E*h0000<MNUMnLSTZjaa79y

diff --git a/WebHostLib/static/static/icons/sc2/reapercombatdrugs.png b/WebHostLib/static/static/icons/sc2/reapercombatdrugs.png
deleted file mode 100644
index b9f2f055c265cbf24200a8469948776cdfed6de6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7102
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

diff --git a/WebHostLib/static/static/icons/sc2/restoration.png b/WebHostLib/static/static/icons/sc2/restoration.png
deleted file mode 100644
index f5c94e1aeefdd1ec2f64d3a44f2f6cec9a7aeb50..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7754
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
QF8}}l07*qoM6N<$f)DZ>AOHXW

diff --git a/WebHostLib/static/static/icons/sc2/ripwavemissiles.png b/WebHostLib/static/static/icons/sc2/ripwavemissiles.png
deleted file mode 100644
index f68e820397652a0e3177a9e03cda1954b1ab12a0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13628
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
O0000<MNUMnLSTYhhbsC2

diff --git a/WebHostLib/static/static/icons/sc2/shreddermissile.png b/WebHostLib/static/static/icons/sc2/shreddermissile.png
deleted file mode 100644
index 40899095fe3aa63efd90ea092a859321ac13a176..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9827
zcmV-pCY;%cP)<h;3K|Lk000e1NJLTq002w?002w~1^@s6$Cptn0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQCIX1E3i&_8xAOJ~3K~#9!?VNvXBj<VNKl8pb
zqoF8rNm1g8maJXw%38}-o!D7>V|R@t+qB6gb?*`fMb5bv#pQ6gLjVKU2JKx?^cRBW
zaA@uh`KLjzITUT38h4F@Ymz2ua~n8b$60&3>uhAptJN-dWpb&d#N~+Mh$E6SbAQZm
zh9gn7i^JVt8Q_J);S6WyJKyK~Jn!>7Gw{>pr_2A#MH#m8%)k3nt$g{M07%*m02)mT
zK%_kr0L!dlnKg7xc-C&$U)Sm4C>j8c;~=FZnVV5k)5qQP^qc_b?pR)Oa+cciIjqe!
zIy)Vu+iucrZwF^2K#|eOh^`m@YoyRKGyd=Q+QC|hRP|t82idbg_0IuS2VBKouSP!?
zzhZAM4z7pLj8PZpbX#{EZ8W0*N_WR}{i6kok;#ajZF>O4M}JAC56{Zx?KM~L*-kc{
z6xnoA1(eZ5!qbf;fB=+)=!xWrF8XKRQ=||=grD`%w9?sbi1hTFlAfMZHdkH|$;sLN
zv4z|1DcyEck=lsj_BskeRe}rfhvLfMe>pO7TnUaVh0uiO_7tfa{qKe6I#LJ(sxA;x
zpz5M?XG3_so(PVoD2l(oR1iWzdck=FpH)4XK?o^4*YVs=+mV_f9S_y(*$#jj0tUj!
zWXKxG#tUDe_~?_p%zcZn`ok>P<fk%NV_@u<KFEjiR5EEA<<|ko7zO~#n`Ur#gL`4O
z6#(<<68fPT(nd!ygoSZ9hit84Ar$HP+e#yY-Ldwt-UvS%sU)4QqX4+JjZ_l|4FTYG
zZKMjQ2@&qvYC@+&bpJpXx)}WRF1F7sKpV}_ah)6fXBWmY(m}{U28MuT?mexVZ=CA^
znB`?kFMW;TqfeeF&J`Xjtyb@|S~mHqEUCI3J7CVqdjPA|8UXopN&%=fw})y#;o&Eh
z>MLI(bNm!Wb{fM@`?zja4w4B4z!=X5pc=97r9g4I{zVJT!1Wx#SQ1(mv@E2Qp+p?8
zc-m-Y@biBLu8F{`gWImSdjU&K9>LyR^Gd6id&Q}Y2An9p^tC@NKKjsfajrmZy@Azg
zvv9~z%3J;ko|?^2F*@Grtr~NM;DSs`sckjMr&BS|tm-P(tyQv_#fUNEGf-WQpT3X^
z?*5B2a(%!OietBt0i)^IN*^q#8Mt}?_<Ak2e;+u!P`5zWFh;X3fYa$~A~RCee;v36
zK(FHtN|!qDn@)D&ad&<7G6Bo}G&8ess<z%BIcAU?Gr|pL4jJ@8o4YH|++BHAZ`D}6
zRU>~W9Xrw5PV~QZYnAp?hQh;7(!NtBF+M|LG6HpgWpS{^^C4iiZ6l3@f5LV<0z`|>
zZxE~ysJ$%HHAs&^FMcek>K~S>ehv6_r`JKMQgM3Ge&Mfq-JX`r-{U^;p2u{|8;gdK
z__Q{9D09rag=nsG|ENXYy~D$YTnd`aVXsBjZ80{cGN$&J&5kfNI!ej*IFwFt%N<2e
zjbnEdR6T*JC-6FL5)(5ZN3pl=U~k<)Xi0iITXb4?P)AcZ9UIqm18*rXCJH2{?jn)R
zA~hA)^N^~FR8>6N#_Q}N6p5BjA$6UuwGHMS-!%w8H9)8!RD`O7s={aj#xvl!;CcbE
zwf+z&ii)Cqqf@)tRFmVHKq$TTcCYX0{JXzV!m5=-r%@((^bxeo^w7I)Zrfzj2F2+N
znUul$rX3D|g^Y~-HF8t2{p~yD@UMC8Jn6gUNZ&O_s&M?k*e7|o5c{lWvf=;Qp)}ec
zs|P}eq02<pXVz{fQUOg12U6d^&j3pY1zcFQ5*@RGo}ED-0@%Woe`2MINu%il_u#!5
zrY0hDxGyV1uzbJ@7`dr%*o_MIoidrZ_hMwHY2I2Teb-zBz=(mSN57YU;6ajy3n6HO
zV8uW@lxAnGav)A3kwgm|#~@hR=qOUt!g0Xj4%0B#+9-+cNS02cjGmnd41Xm8qmafZ
zq`6);F}Hn29h=Qkm`qUJXj9#^F-@EMvJqg**#e2&07E*KFZO}xZw7$%LEC=wwTM~i
z?0$A-vveAMFs)@WNX^%HYpr}BSlW0VIhw@TvHTSy`k-dvbbJ7vZr4{Sse{uQWS7_v
zm})41Q*9w~>lN=rcE%w)1Fa4J!cBO+k>#<U&v9&`hJC{q)|xU(ZhnS^CuYd6l)3o*
z3x0g#G+D1V$)yd_cilJiLTVd7!EV2X`NC_=|H9MMS*MbGgwm_egKm($_YsU#4kMAo
zyi+4NUGyE7=Y&9o@zm|waECEf08N9gjnpNwFWW)b;OyEs;OnN8;0k~qj&uWDhBM5_
z<grcvp!LlPSC-FnV&N3inG_Y%_he<WiG9PtIGV>e>eE}3NpkZ(V{-E|JbrV9FMO}e
zxl$8=%0E0u<sY7lE<iO7WWtFLJ&k_#Rp0DieV*cj@1rduFPa(8W8SF+rj+u5+S$fh
zy}sWBQyKK>W3bzTZa1LXfJXH?(CbFq2f?k|ho*0yozB3@J%IT?v>k%Bxlx7!A!rq|
ziG9PuzELCd{zZ&p9>a(<rM^<;;`L?-*4r(~sd<vpXUfXoeTn+DQ=EA6clK>(w=FV(
z{&cJ+dNLAutGq_HVa84Ht|Br$pmmxCnhv_|hY`Kbz8EbGIrIQfD=^;yu;PJhHUMlh
zx}){Y3YCP;bSA}gCKbPkz$A@@YzWrMH_vnKw)Ku@{?_^m$>|e5JCC2De(gMG|NHNA
z=3oA93@m`eXp%;~76YqQE3<R06gR<pAKG(Q#^Rs%fE8+E0F=Gcft{T_bQSwGY<xs|
zT|+9(!u_t@sJMVvZ&{ozIXrmp-4rG#0QmFuD(||>;9Wh5y;`Te?$0GJT&r<m!{JKB
zBBlE}QL9@RJrJ5eY7(hS?14a0Gc=s$6^u~>BWa)=nZn$<%*8)>l8-$74AraWX_WkP
zHAD_Nn_xsHz47AnFqVk0x%)WU$eyqu2xvQP3%A!rIDr`|iqAS#gj&|!?$3j9g{pZ2
z65`r>0n@X2p=a}M=Z=3z?MCFHtDALy9vFZ&xLmka<HEIC_<tWPYo`-vjfM=?IUNUo
zF6)EUwY$g!*gO8|Wb;{!$rG%vp674B^eH~_^fRn?u28M`Bjzy9os9vNob|n|XUFBB
zyJO>Y4`5X?iB)ezK=lcwYH@QO<|VDtlAA0pk_cS>AZY6WU;z0%{P>m~0d}Jvf(4Kq
z)v0Z^u-aXc2@T5|ZjN2Mi)Ls*H)L3UnVLHlg7(m_KI7lC0l=)a64sl(DdvCnLwn+}
zXd>O&GKYfXYoUdCBW}(@H;_W?VW>7-!;-~C(RZJT@fi~1GqmrNq4MK6XpTOVWdJ9S
z=ehExzg<3;3|V&2GL{`<MDwsM8{4umH%#nq{35>f^*`dHANy<!wAzbjN#0!~fBFm<
zdjeUzL1(M64=kx_=!qn>&7nZ;nNJRi+i<`NQ&|^qH*a16@MeympgC%=lRraw<-8vv
zv~6rnXXgF~S;-e@)~eL6ejn5X^T&>I;ra~>RVO=@!)k4#kLlPge}ZhaZ9t-F8hT%6
zY}jqt*gJM;mQs}@(>@Dol^R*|5<mRXr+Dn?ub}PJxV*YT;R8=H{m5zm{tXbqHtX2E
z1kTPnQuDQ~Yk)KioJJjc^))(Z2(%EyL2!ho;Rb<fU&DlExNg_ppAW0~`7AMe{Dcco
zzUJReHJM~){uIr6nPxpc^=Q`odE5N4qtqKFxon2~;R066*Ac6=O>)%0+KEhfEIl@m
z-)qs`@x8J!>fhyVr;F9JNT!n{Q%S70@9sCRzQV*k4>KKv7wPFE0JPh!5UhiiPH6>q
z&-Zdbr^JBS#q_J6G#|)>g!iYmUK0S#JDYwA=lBV>8+BfP={cJ9GU?n5GxMiNPezmJ
z=Egd?Y=(Le2hATZ4tVo4$*~mHj*Zo}$>%a869%1N9@lEN=<Y^=qggjYmL=0ktY$ns
zsb9Si0@Vl04~O<UqQu?)dD!I=_NA9%VEL@l_L-j4bbqKix-k}hCxblOeuk~rTmUg1
zNBF)+Kki5Qfms%h&yx<!5s1J#b~FZ-|C>G|lL>?5XoBQuf^uz>&Ta>NL`NUdadsgw
zYS7-XG3#asSboN5Qt4`NoK+vNX60s_VU5jw>}tGp7Q0+}Oa1HvA~X%D1>op<P&nD6
zW5YDeZdECl8`R7!$w^5vKkFsm{c%Qj%e;4S1|BW)weK&pa``Mtt$%_|8tpdo$BW3(
z1g33=UZq+oW2DEKT1;aGd46-#q^op8(*rPX``;CdQzS;GXzz5%<uVkeb3wM_0ZOl5
zp!E6$GOZH2XV9+Ku)QGABr^Brk1tWb{6hxjfCI`Nuqp^^`ex{kjQRO|O&d((xP1pG
z{o2HS4Kt<+ICk6hb7N~*8*Ah_4Tl6jS}HS>PxIsl7PvU-X9cRa>a17m954DNx_PI;
z#CSFY3*ezs@1@c68FJ%|8~%LoXpU?#N2657yb&>@Rx`=xqmba@%YK%`_SPu9eqrC8
zZr5uhf-G$9+*z!(QUp}b9tsvx1J4b?l9~=e#ImyN4J!t}8wAX;+d>)%FPWVU(X?u7
zR64nE<MXdocx-MW1Z=91BR9T3KUJ+%c<7N+kv?sjWF`VIW+Ic%9L<qU7+97af|eRf
za_QwLrPMH^gkb6QSK!#=ByxG$^%~We&eACDsR`_5R=++V<5D9v-8aFY1{wox4@fcW
zBfxCevD=EZu@-4jem4BSvauZi<vWFkPM+YQlP5w}^;uS}lqpP4Q<(7s;L@^x=Q9%-
ziVH=u#fgwz=8Za*Wrrgf1g}%mxuGXJ$TV|h$v?;0;vT>f`$6l2CH0s`94>A$8qw$d
z>78!J60Tt&Ra~pF<{E{f(ri|cnW=%w&l<()BF1={;&hOGeSHbJ)eW-4b*86gIkB(^
zJ-D*GgtglyKU*L>>n8#;WtbT&ppQ#xw`$Z(ll)|!eBL*&&H5&mWg&EdwPTSDm^nQ=
zPx{aVsb-mpV-K_N#HRqbzVrgj&12qN!o0aegRBo4iJ)lGjuTEwgwSw;ATDB-@N20u
ziIk2P;dj8)NT&U}YF;?&O+E4H;pv#dED$e&74Gu)yYvr{8EtOVsBij%6x7zL!B{6h
zo+p1-p4u&ccCdK=;((6TXxnY9AhnX8%!6=9AM%gU+}fo2y)U!Em&qMF>CarI{QZmX
z`y`DUOL)u6nANobNs_p(g9yal4bEQ<=I+%1EL9?<^OgjRyyP1%xgwRrm?<jerL!1Q
z0o5~8`%R<b2c~_N?Opm{<tFmfc5g@X(Ag>S=?RuD_~x{DauMCpsnu%KYPBE@<%5+>
zCP^lfNL>rS@*PBwKBIo!H%~h-%^N>}2Y>bRD9Icbzwy<fWi~0LUyTYs>u;Na+PlqQ
zPG7j&b?j~b#O(D_koPJD$-Y_g51tMH8>nh;)v4a9$G{p~^0NhMYt``orSDzx8(x0t
zjGs6hU}kNjMk<ve8BCA|f$Fo&YHl2OahLx5w<-RU&+yO_PlcdKDPsx3J^&#Qs(2@<
zyCFpo2iNar34TD49zufMz?hiDX*IAnO&X&|q53?fDpYSSP%umyn+=RngT!cp`W<Va
za9gGJl5ZZ1?^$H+ykAWI^uP8e)1~WI&_*@Nr4rkw$>c<abO2V!v>>R|g80oa;)3q9
z;~G`^#ur)m*l+OI$DU&O>tCdy7K1>vf9XL&KyiFQ?+2<<fCrA#MM_PPQuhG-PL4>!
z#4wNPCzhOninM>x?F~Q5&fM=u|Mtc*jm<_B8|}nT-fCLp3wajbv*-(awHAUEGN{pD
z+cZgKGNdz^7+3&CGM@U`r>p72!14U>Wclk~q*=Mb!pDB&AJzNivr!weF7lFM5AC8-
zj50hHF<*Nw4qDp|QpkxAq`lLdK3I$IS&Xyc`V}fSZVUx0pU+b)7Gt0pNrTL>Ol%B-
zW^G3SYvtu{(yUzJqrd#A;bB8;Rb1Eh>Xtm9kjp->_B4g`nP%6PN#yUtm|Tc|zhg(K
znQ|?R!2t3F-#eDBUl|xHOdmZOg4GxMVzC(NST-NUd5NSCO!iooV;?+5_E<K?u4F3C
z#LCOxr26K~w*;*ZmOLO>m3!)vGV06|nu6kb;Gu{-@Xvwqp5vmZBjCD7Au(+OFEIr|
zCAaWF?6tG>+#b8yB%Pg2bWO0eQO9$-j2$vC#xkteHW8YRK*wrr&}`NzU0-2zbd+?~
zU?ic1<H)gN7-OTDTMc?{4`&qQsD>QX@Kl(2&ryy)yuj94lUKiSk+H-Ws#Nh@hY>^b
zJMV-)c6MwwS6)QR-p&1|KT5ZHk)}5q_F5oRJn7*n9ter2Ku-aLC<|5o)z-CF+u0K*
zC5nQ1^`f)aOCD&7T|3eg-N;bCxfHc3ocuJ63tx$J%xcG2(QHOJ_HwyQI_c9rH<1ep
zzQg;-rlzM^ulU)HnR^NYz6r`pHz~ii7D~aOj;6;9(kX-Hw#|0SH_?^veTDfC!u$vS
z73IHqW(bS4$a5-@XC0>RVp#LqLCYX;^_xo}aM_cerrRimX49xOsFtd<tv1`+5g^;!
z+tfGf<R)@VOinNn6jkQ$U*w5j{v=QQ@+bXi)%0`-8o-bK_M#8?)hgxJ)<UqR@1Lcy
z*$8#iNcdm@q*Df|fflWm?|miEyUaTh|AWE`@lHL+AXtN-wXXTqo8+-GA;bDYZCiE>
ztdNxh)u;LU7ddhNA}1DohftWFi5;VSwMu2RO8IKME2r|>8kN`9VqooE(qr*;_3IbW
zM-m6J%OCQcMfxsyC=%SR7p6mofM#z-LY_IX$i{Yp?e#T`saY8RHF)XIVkd8#@nS^b
zo+6A4obaeaE|tQtA(u+g^<1*Yv)p(5XL$YfC0={=FL>aAMe-y0zz=n}va*70`aq?|
zQgnM=oUX%IA{o{_lW7CJ7Z;tbRU(<1rO}AMcZ5U==}(vxCjv}}pm9t;z$6u^0Ny)g
zT;{~0Ki>Ta#*}Y5iNXxYxzq1B?kOHGa_WKo+rR$$(t-P2Sy`c8uanE=$mMc$2l^vA
zd+LwLv_Z08(SJuVnB1Qe6LC9K|1lb7OwW>;nk92$k?g&`2_+0)klWQV?P{6gM?U9=
z6@UAOSgYsW60G9!A~TbIs=0joCNqbRP->QV?ysMPPkb`m_E-Of|No!=<+E%zeXzo^
zp{mjCbwl8E^k5q1J043fP<kaQ`lb&}04oPyWFM@!X}Sjiwr6J<0_Be*WD=<mtXScp
zFhjdq#=81~e|PVB+;<46!#;pZXR$W+=h@4*Zw@{5efRmt_@n>y`4B812G+hhXCmpd
z>X3o86_oexH2J??<gorQ9~=+23%W#0=M?Qw4*l>9S~7{AOrjeGjOS_8Y9#vIe7ylN
zo|LRzUBRlBu+~c?r;6k{!NmLBXK386qA9DC-z+0^0VAN<zTPb^EYL6;{P?wt6z?hG
zNRPz_9-?R#`Rs3ghOwj;v;uTvjVe+#NCujjF%p=~b~r_vH8ON66*57wxABup<bHM$
zh%~mJ<B!Zy_i<1nlN19Pj+mDe2|v0Xy?Y+*P!9dj{t}iQ^k=p23~ykoT{?>uWIC+%
z5~a(RC|$lp<93zo;R0*dqFmL@)reisKKC3;%Tc;{@d3XJ=d-{0nW4w&cl8*WMs{or
zL)U4vTCr``?6|`@{rKqv^()q4twhL(Jvsi6Vg0toetKswSe;;wr;TMo&;X3Pe5N&)
zm$>ouXEDaI1N~o7`nYjB9v1Y0v$tIq7ZzB0W0}Q;1r{H8ki`cc^g;Z~uN(-Lkw{{U
zCb4(gv^yOVK}mmiAi+6nWN2W<z{=<I@Y*|yz1~{G<Y@9h(eGLoS~5w;vcgUnBO3u_
zE-zueu{5OrtAvp$ysbnGW7g8;i!5EfG<5qyP^fKe)-VS8A`-gJZm-R(kzv-zGHYZ>
zJwC&^7kuaQxzGIve&zGelAp{|+o-)$untTh0(i#!d!!3pJ1DtnP6s)n(+wVEaD;|_
zcm{iW8+&^j^M!AL9Z}eBH4s7z13|mxPg@d4j*=KL$W9jMHX|J>Th}SvUBKRGP&2D6
zUtOkj^$KUd^G*N82m`wl1;EAeNfN3-)vQuTr6{(QuulWvqhm$BQ(a-T^#+XP$Uc0U
zcTMEjUS8%~Uw?@|_~;4#_}dm2T8U^kSH!)df`ZH2OpSaSR>FSJerNG+hfcFar`f_8
zXxHxCE@S@v*Pt_ezTh|=94FeoQ5)Vrzg}La`ev1>nJ5+B2MfUN*ddFiCJH3<1P!Z!
zp&1whCH%#?c^2p91F(EqS#8x>TfV^T!b#TNxWKvR{+L&;RyjFW;N;xY+j+)!Fg5B6
zU$^TI%fjt+af2$g47zTt%Rgf0^7#V~;=0}ad9;o7z+3*}P|yl@`=)#L+uw-Ce!39@
zts2xR4b32-Cql3QmR9}vYHlpY+*lNTtSw()_TH16{`kM;%ip=gh1Kf8CAPs?{t$+#
zd%*JWy8C`a=o)fF$Jy;*U%mL2cSH<Ks~o2jyHVGdF0%0O8S+5w)o<?6rAX_FbMusf
zi|?DGF=Ajg8w}14+nqN5=EJ|p;yr$!?6cqg2HmTrkX>_QIo5#Lg_F!KJj~kiD*#+r
zU5^;1X%SI|slDsQJf#@;23!}ryzJn#Rh+ihhtt)^=vK>guPy~Ki~))P!ic609)N}`
z)Y$0Q79HEd>2)wS)_LK7{Ta!^5k&EQlsh?$l!1{lu<A9k20ZxaNiv6XWC~L>>^7~g
zq~qz-nmgF8f}tkBQ?NU`e9Fx-eexlA;v?|HM>us?fn={qve)EYhQ_-LjohZimEAPY
zZ9w&U6}#8Q?zK7hMhU5lp&3{_p%C<tp=h|?kQBAk>);&FVa)19XqoXiMcHG}iUvwN
zwL2K_h30W(iJNaMab#e&Fg+cg?-h?l;Yc@llC0B<v*3*I(=_G}o~QAH=l%VD`*(Qc
zcR#=Hm@_YbgH+`T&7fmD^x`{KsMY%x&v|Rn4*-k8ijf5Dwqd=rf3`UYmZHVL5{d}N
zLCd+nd6t`REb;h1jpmExN{w=*M(KKqv)?<rZy#NaSWr|9io&4e+L%9hJ_g#%`_CK*
z8bI-A@$F*=&yDN4;|v%5uqSFH0nG+%n?v&bdzqz2%n}0)YKlbe$=(h!_}t(4bHh`Q
zEK;e|s8nj4e|d?s|NAVZQi)P2x>1(h2^m&Y42p`uStmNTK4>902Y{9idSvsH?<|8c
zjA7A}rbb$o!f@4e7B)9BbbC+Xl0z7QZ%{!|qdgSqw-E^i6b~U)6vgu!KZL|n1fC+$
z)lsC-5%@g~Xd_`h{p#{hIQ1+4l}hOvl^fS-?ey?^E*;yUQC`CnNs@|!iidDrQc~xk
zu?enj-Qnu(Dm|%kdwZMfyB$)yyG*_EGV0I&f)CEoBB{bOTR(b{NnK@9SDD$}Vq>ex
z*3>*>nMr2cT{c}U%Hg;nG-dF<YOcJ}&YpNog224;BPWiWn($w3U^a$htn8TwC^F1u
zh#?6_sT#<^E*i1lL~XOdxv%~qr=R*9vy1-J#oDZ34Lq6K*s*Br#IwDnJ2gs;8l{0L
z+WDJnoWFUK@^`-zG3`Si=FA_&AH~TwDil|L<TG=8W{6u9@xP8UT*EqcgRX7H6NvrR
zpnbYE94sld;Xn<~F(EXKwWV_*X#1vCLx3wCFzN4uR{6W{#y~56;QjkR1IPpqx+X_c
z2ZOdZJ{>ekPoM&>>c<k}XxdXi4n*+Qhykz$3Z07LSBv}IF?}GVY9NFfuwD4z2fztU
zLkYk$M2D@~8i(?;oPO$av|5{VcbZ{$b<6cIf_8!Rrpe~UEgqUKQXJ1?wk;~<Tg+q*
zMfdoP*CWlEn*(}ei$}>8k5Kyl^Q?DzB<!fZU`)-??d;O+XKNKDFiE~@UVXWpoj)Z3
z%&RZQ%WRsW1-%4X80q$NMJO^VzsWeWbg?In+1Je0?<w`y>z?ArYyo@Q(r-im`~Uf8
zWMBO;k3D>b;?JCkdR>C{gta%<Fw1LXHJkpFJh%85>8U2?x;_K)nxyNjv;2e0EI2wd
z?>YfN#-#Xx4|D1lm$3gjcocEF4%>D9hoYfP9^r1sH~Tkt-97Q?L6QDm4H{(3UQ_Bf
z*vf%MTJ?ZlcWt2ENHgLtd(YCidWmnnxg1oFW<yn&y?d6&AM-P~R>}8txxx`%`t~zi
zX!|!JA9UgLgNEf7FR*;>0t=sr!idG+`Ygu%C;0B~e<5OFP|e?-JVI*Y=G&%sWOOkj
zI?zM$O;RYrH%TR~K{2rU3ATZE-Gtw(IzmW<K7x=cB50oxni_A5^!C(URDZkH_7<(}
zEw)-)td-Z;+S=mC-A70##%Q;;Xt%ZixMljxu!6S(oQU2(!Sah27;kKlKmAy^Zv3vp
z+_`a+#!VlnTC*Mk)=6ftn<hX7c*b0PrJcR!lmrxW^=0S4W|WX!gF+o^OdF^a$6gE+
z#dG}uAoWBz(Dm5R#xk*S(6Uxu<Aoo-5Y-sh*O-6saTbk;&9&Zs_SRl}iQ2gz#@2oK
z_ddt*_nnThY<k)M?Ww8aJ4<3neN01<uJjo)j*w5Gh;bB65$XsE5(SAaB|=pLW~qRV
z&<qqsq9_vG7>gW$rXdnK2#~slP$izwW4#S7Hj1j?2@g+r2vx?1NFaoc5IWnfHlvv-
zQq%L4Y9?#7I(NVK=culgQMClBmf$CeEO(?%7Z`QBm}UcecNcm+CT3^+S1=d`*{M8w
zvq9@dl}Vv8V_V!;Ugni#0aZ0tRn>TA^NkmFv-6Kh6d}#4KkDr<$%N`pJEez^<G@o$
zISxWmLeHlm@EbS!%<3r~R^|Wz1XM{xK~#&m)O3WD2t@|ZRtJ9-FMJ3}2nj+U28N~w
zru&v7+TOffB{`O&c+Y**)+@NK$B73X;?3(<qbmD=7eCzFp<ar#Y2sf0xysS0DMk+;
z#%i_LydHgj$4IiRCvO6OwfV*iyV-l*8+b`SaNP@-D-`LWh;gKR3K$pah!Tmt&#pl;
zR1_J1^rYXA7Ct<n#-A8d;{XiSjziF;#0y)k{HJ+^6nL(Ot_W)Dl@PSjiti+HhYQqi
zukQnGZr9hkK4=q#Nk*rpLeOyiQh6V=t}jwIxAmkC*s+Hto~M}CUf$omBZclE4(OBW
zKPuPn2@M}!8USlB*wy>b>_mVL_sa(yPt%92li|B^mR^0CGldyWJn#@#E?*>fxWN1a
z53({)2dL=D*#0YLpJzgLnFn(3eir}>KmY#7N&Nlu%viNMz)t{{`)RL%gxCPX##EsQ
z7wJh9&lEyDqN@6YgOgGQGzCTws)2$;RTD_52WBb#7)<(4g=wmW6f%0-h!B2IC`bG`
zX@5vHrfF|CdP1kCNP0r$>h-Hk9Vv3?aDmr;@(QWRDO{OgYo|?5sPu%&Pf|rpHE6`^
zwb@wP#M(5u`+@uEHCw1-MsM=?Q8$-JxFbuiyC%*L4=bJj^5yS;tpu?6Gw)TlU0s-~
zFZJS8BO%>Ay%oO){F+d;PYx@bgkDh9+%OJPb)Qi|Dn@ESaahEP3|{P3DZ+b4$#u_(
zVz_}U>7|#>^5COqI6A+`jg=(|GYcfgnpmwUnlB}ylHo#chtiAZIr|^K#F>BpG(Z<1
zfBF>p7f)T|JKz0pL0IAE>PET>Kxv49cy?>uH8N8&h^1}>puH+p?SsJeASi7Nh79a`
zp_C7Z)WV##8w-5po_dUwZ~fi|PYwh<GD-l1?*nr~(9B$(+Irc`Pt8zTU5=ekAGC#*
z|B8jui{~kwJI}%=KGcZ<+o!K-_np|j_v8QURyctl>3V}1{^;drV^f;lTJIW}DXm{7
z18}4q8+_DPs3{o(Ox1dWPCz$wXDDF(3si7pvZeIBgB+e)_vFD0bR3L<8pP50MRs@m
z$6oq?85ptsKeG|9b-wQtAKG2~t)~Z0C$X0R{Kl_*TKVE%e8r11O!3dwHrKlVqZ7w9
zsY*vjZUygE1XY)43B>^=5JC}{pbQ0Gkuq`&5|9cCB4S3o1n&yzg>Swbcs4P3g2i=|
zy}`8z18x`SxLQ!FaK*LKO*eUHMq2f9|7&6Up-;%_X9|ys;&z#0tKt@06`udgXA{P~
z^J4Dj-tPcCuiMrEasGF{V7>PXf8YUROC{O2B;_BIcFfE@Dj=Z<O>?ED`ERGxbuV}%
z*p;d-q^2t|z(ml6EPb%VzUL8j81j11(6j?^0`e&k*S!7<CmqMZbzL+?i(YXWa4d=y
z4RS#hDgcdwUFZ0j_c3?oecs&9y&s~k#jc_y9Dcg|bou|f{2yS@p5(`Kfx7?z002ov
JPDHLkV1jdtSn&V=

diff --git a/WebHostLib/static/static/icons/sc2/siegetank-spidermines.png b/WebHostLib/static/static/icons/sc2/siegetank-spidermines.png
deleted file mode 100644
index 1b9f8cf060979c2dde3146672262c03c4d2d37b9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12764
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

diff --git a/WebHostLib/static/static/icons/sc2/siegetankrange.png b/WebHostLib/static/static/icons/sc2/siegetankrange.png
deleted file mode 100644
index 5aef00a656c93c6c595f8a25ec0f1292478bb572..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11833
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

diff --git a/WebHostLib/static/static/icons/sc2/specialordance.png b/WebHostLib/static/static/icons/sc2/specialordance.png
deleted file mode 100644
index 4f7410d7ca9e250b0305fae35b0ccee603b2e5ee..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12992
zcmV;xGC$3UP)<h;3K|Lk000e1NJLTq002w?002w~1^@s6$Cptn0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQCE-gL>#vlLyAOJ~3K~#9!?YwD>W$Ag}_j{MK
z-nI6wt+$!(>6zwiq$!aihcP8e)Z#=UWikn11VRuSNDwD5l6*{T<Vz4F76Js0ZCOyP
zBnTu?maT=B<XGY&iaTe9oTc}@Yv1mA?pfX?AI`0wnr06v13>}=x<CQdU3E{L`<&-}
zmjD0%Jn)yVf1{W93;bLFe)=W;Ke)&D`nw(>1l~XCcmJaI>Q8)5|8Hurcitp~7NDnB
z^pCwkyz^J;xA;ew@g5M<3wbfU{^Q?2e!b)G>R)>2mg)=n+Ash@;*<h}#~QHq_?Epm
z@p-(*i<1}f{s$YZHoQj&DL{Gf-un_TC!EGTZZP@ClZ1$b5ZXImg0KF6bejC*j&ke(
z)BjLHh!`Q1_dfUD=YX1iRe;wg-lxF3sU@9vZv4oSK`<+X)YB*D5yCs`q?BUnQ9?LV
zI;0XpD!g~K+X;lIAGpLFJ7VoeQcCX-0x1b`gvtw>w8-XG@SRyW*!S#iKo|;=M(qXT
zp^%5WQ<oA#2tg2r!aD~ZVT=*rQ96+IXPMrf$6IHmR>~`_g|!Ae)K?IA?<EjA@B5Xh
zw(wpbd$kavcIl~?>PMEALV1tCdxx*RDoD~Z>FmO%gwm&h%314>QivcDN^2_X{IQ)~
zSqM>#@Okc?R6+z11c3nIB}frytj7moAf*nZk3yHEiD)%rIayfqy=Q*Z6{}B4@!+oX
zU;I56_HT&5JMW5|vM8mkDwMBel%!s2CA{}S3W3tvJLeSMi)OnmtaW~HcqD^B39U6!
zO5vQhX_|;e+VF#ZkMTG|N$G2w2%&;NN<msx)y62x{!wYFyC;sZIO&n^cv$^&ckH%t
zclO8T&tLo>f+&8!F{YAI8fz*kq?FEsQrdf|MP50GVlS4@A+`2ZHWp&s6K?wf_F&%&
zDG}`%WT%5lQz4se(ln&iZF<gMk_Rt-jGc>@sjl2{{Gb0bv#)(cEZW@9fA~YPIlqK0
z3TLW9HX990k-J-0uZptBWuz6^XvE>}w%1CdqChmeGhDd*ysxT?dsnY884N^K=Azkb
z`k9#-zq7eTl@~q^LMg;MiA(~44#H3>l#myD<Kf?~jM=EepLaqC{dmw92%+)b06s|4
zQ;W~N^t<Wo{Ey%a&KkT_)3E39rodGOAthC1kUE64iAy@T^Y23}tm2o~5RpROxI)=K
zLQh6WThM8x$nzIC`p{3Ze}0kt<{19BUuN#}|CGhy0j+0WLUtBGM>M;07*o(_HM#uE
zd2YUag&Q|+P)r6?*_ee>%dDI|%b)+zza;A&kv1B%=jQp*S6<=VvzNGW^%`4uZnJyu
z4qJEb;srDsP4NC*!P_}c7>3hR=*jZppBxSc|C#eH7Z4zXp2jo($Y4T<V44|dEi8Rx
z>GDgz=XE%%wZvP4MG{9LRas)o5}ZTm+VG~VaODI$$?(==lP>DH7YW|~VSIZD+3KR^
zyL8(MF&^^f)6bFLAHYBOyDWX_cbVyLlb(GVHNQ+Ym@vr;(2BS<gNhO^T{w@Bk}v(~
zpCY^=@Q&WW9%s*;<^!+1f(j$P{Q2MK{?#kQX@f8f`S2%xg4V(U_ujsWH5H@7Lw4@p
z!&D_Y2&Ms6;GIJVK^TTO=a52B8T;1$u>UiaF%JYHM4-L*6TquS29q+FdKkLVd@7w=
z{Fxw*y0)s2Dxi)R66Xw3N`#astx$o+JB!o-I&C1Mgdhs=4{zgM{W{!vn<P7;Au5^+
zb6o%EC5GR6$iin{VEy$!p}TyF@Tq6W@r?QdWRwsl2|5UI5>B07XJu`f?|$!1ilQV|
zlK$ZVOUtKdH(T6(`z?|%;N_2el=i|RcdlQfDhqDB`4*-qc=qL&IoRDL2m`_}WN>su
zmFGwSQmW&ugwhHr6dsRt?%|{?KIfe434}r*rzHmJq=(_X1qjmSTKm+>r&JKk;5<6e
z)LFu#gP<;1l&qf+9w{V25FmuC-CYN$?kw@?v&75GG}|d@Gv@lG53zq`kLADh(=3?*
z;?fHg2ux*=S`)XL%$+_%(u|PG(wb@V><iEG`ggv=&8u(G=`@*SL!_@bwKPv<3`v^O
z+uLQ_>+!x1e1P|V^c6NAY;dr%NuV^RFI?d4rAzE>Zh#OhE-w?NDaJaA@faZ_Qc9e)
zNGVWCVV%356~%8l=LXaGC7xt3JvEpQ;&ipOc<L8*7|u9rQBtC`u3c6Nf;dKoAtDG7
z&Y^-3sWiqpq*TO7OxR3O%_fa*o6hngxBu#A*s_Y%zw__Y*}H=~dx5l(pu>nDj_EEf
z61LhD)?%cfQi^nbj?U6Dx9&Y4NE@gmB}!A)R#qq`IY@!jnzY%(7{h~GH<??U=ao<V
zBw^a(t=C@V?QeV?;T>n5zQFL{5COEhUD8$?5l0l0NnHR7fwdM<=f8)OqWCTQj=`Sj
zVe0ru21&Y}%*=jDN8zjxVp=+Rv<^^8BEl4OjMpJZg|Y@a$q1wdr3o7;s@)-(n`3rm
zkq00AX?knRJoOKMnZ=E3Brku6<%^dX7ZA5wG-o=Dii$x|GAwe&cuEzJ6(#o{K14+!
zVKbsM89^XfT3R5CLdvSF%Pj#>6r!Zy=C$iolboOag?|Tx<l39xW7Iohc5#83#U&1R
zb|@wjTvgKSbO6W(1GG|g$>toDwGZ;D`keD_a9oES8%%#+S5;fjX{DU-bzTr!)^_(E
zYdw@X=m?S~sxyyhb<v#;2!(VNvdU3H&`3jeUidioI%{0~m4C?0jn@f3@L{4TV7E8m
z(0F2Rh=3s;InyC+HVA@{aBiMt<rKCoIo#Z$=pW(nRHHGscXn7`I>q_*HIDZ78Ta})
zAxPtxxY=go;X}Uo`OovopZjZEdHq!$-n_xBH{asJpZsa&R#!RP+{8Jk#u@EKlPpci
zvy31JkWzxP)*lyQk9DQ`vBqKAy?LY*Nbj)%g!dp7)>KI0k<Q|+15@ILho~w?#R*k=
zj>c0@!O|%f+LEdr(L24w@<0C;eCtcZD@&v%<L+*cGSGzWgoRT}RHgtbWTS;#nj=_S
zp)=EEer}%5>^#d+%z6;8@o<|j{q7%d>(y^^U_8|*<C&LUqQAFCe`k+|)=c_GbZ5J4
zZ*5`AoKOD3r}$s~`~Qyq;UU|1?=ZWv%I^L9C@FC`oVBFQCV7_OrfsXJyCwf5c;bmM
zOh?H|Iy?7^VI0i~71Zx^zRr#Uln%gIFs8n4Hl*6ThuD3H?CsJR9#WmZz>SM5H2(Fg
zoZ8>TUj8erJbRf#9kV~4(3+pe*b0F`G$P#TQ?x$tJhLypNP6}hs&eFa?r{IjHz@Y^
z@WU~U3l}Lbon?1-gK9KjyMMsW{vNZ7^R&BdhKKtE0s<*X(uBS3Eq?UJKElSshipB#
z&tx!Q`OFzSFz)w}T4AdStpl7jl#>ZkDV+BY@~Zl6=lxI!RNXc{ek4zJsZw|;CDwVo
z@C1Rz*}720g0mi>G{#gYDL^S?6cTmY#G=BbF}KqtieLRh+Q0rkF<D%o^Yk+ub-Qc~
zb7tQ6GL^N=EG^@7fqr_0Q_ox^NxNLsF+UnbEHAC|=K5K_a{mF>_O^Ka&J{XG+f+)x
z`YOxoX9>qccCKCJ_1m|2`Pt`at*<e@|A1B$<DF$^cb9T9=HLFszs?)q`X=Mikj*={
zSvhx}{{CLwPfCe*o}}5Nm}Ge8cmiPLAM-GAvaIl7ny$7NPW_^a<2e;42x{-*xY!dC
z=R88H`VR_FNkY`=(3+d!@Rgrue_XNtKmKi6k!ONueYQciahL4w4a}%VGmVI5+o+c>
zuy*-<EC(HaGEDePx6O=Fe7)D>iZS$OnpCmCjK}mhH%W!&@^de<_JI%c{--ZOD`jgk
zp*lR`sq^P4vN6IzpaYUHWP5Ximp}L;Y;W)I@b+!IG0e=*1A=TgL`sGC7NHc*SWH!d
z5cl$`_?+{8BtRj)&%-<?U@nB1hI^&(Q}ZgRk;idR2%PhEm8=9p*F~++3cq}s{^|;?
z|Mee}6l1c^Docxt3`Qdk$7578rPXfGXoQT{yPRKJrCUlqmTEpdKf_j@^Q$}i+_4qg
zrq6>bZ=tW>C26);zWgjNoV$c0WG)-=AFiL~r)FmOJ5|NjpMQ;m(U7&LFLL$U-yy9G
zoj9VbDh_tG_=Ugz8Locsd*u0qy^V*oX6MO<eWGRuB_t9@(rjYOio7cPd%=nFNnoOL
z&U-vU1qi8;DyVx&t?>w)^+>4*;s_sxkhak?3$$lv$j@CS+Zi(R+7~c!%Iv}dI*!>N
zj8SpI;`%Dx^>v2No#pA5USK(z<&{>OPtDJBJ1_Z_-2--=W6XrD8&_#uxy?*_hJ_D*
zkmoNxM`abW*6`_>E@_!_E>3v=`f1es3^(rH<)!DI<0n4;<6OM_9BI3a5|S%#yve0Y
z&+ze2ev*E#&;HIfLP%Pj2DbNrY*Jty1Yt;!Bsk~lVEsc3=1&wCUTTfh0p8mBKcxbx
zA3>SkS*!!4L*ho8V19|<>_vLdy+CyJRl@BDwARj$#xeVcN2oZYGuNfDyh?WYY2vjd
z?!SG7H?Mz}yN5gc&h8GszO}`+H5~XMH?O@(_v$^Gaf9Hwr#aJ^!;L+&0zNxG%lR~A
z<Q)I{;DDgJz_aI`qVSGC`{p+p^?H2wJKtt|XPfTqELCNA<GbJGLmz#G?)(DTa0J4$
z^2`gQs$$mflVuZ}hoq4b1fg)&iYM6RT?TvPWl~6_4sm#tmguB`48rL<6hf;<RkjL3
zWT0p$$9Qp_!?9uJ>wkorKZS13(9d&Rpy|wY>6|^o=;9fke&JbWT)<IPajzKhk8Zum
zfBL0A;=A{55C@if*RPO%_bTC}!k%7Xc7C2jCZtO6so5FMCn;m=_{Mm|H-|&QR)hB9
z0;@}>xO(qCU;gGdxPSK^-}vg+D9V!AxjEkW-s_}|grE4?pQAE{-3Jed!x%Mlnz^`O
zUiFwva-`HmN#dS_&OV+c#YtClGC-)X1_y;gC=cEum7W5p6;3LMB2>FgIKRN|Q_my6
z^-aQWeSze{C6p56#?tDvnOR+@cXpk%=Poj5H7_i#^7k%XW>6ITi-Q9;j`rxrnzyfC
zC3@>NqBp_J&LC&n%r|ElJIM=4!09k#zpD82(TFdNGNMqiKkhNgb2_aKv4w--fVq`r
zM*SY&{>C@>@lSjL5ago~7cN~QZnYQ>`c%U{Nq32I`yqi=*c`lfD6MN?(wHB5B&TJC
z^j;~XmPjFRrbK#ykO5w52tu6H1ZhIhYLPS&?9v+JNYj1w3&<!YNSinTK^)Otm}5NC
zAw9FoeAuGn1;5yB^L(IDz-*LqaqSE@4iCw$+$Neh!Z1NB%tNC|VmuvhS&I|A3b<n|
z-^>fN)_`TSe?Yw7CrDC~PKTLOr$}bHtgN4AcW;lqy*)bJ8OowSNlCNau6xI-AW0JT
zb4|~tq-l(--9}Cm-}k*V@4;UoB}fgr&Y!j_@JOT-cw2j#N*V->l%(5b_vsfXuH9nk
z`l~EHdl{LgZ0zsTneP(M&XS#)<MiA-%D_v_gyk?~vncrDV92g_-0UAxZXeR|0VD58
z=jU-})>zaDH{bdmMXNz?JkOVtCg^|&NlPm>Mq|>W0bv+pI*LjPn3-WT8k4lz2qhS2
zV-^+{7>`D@XXj{lXE>TnsLGN?r^`Uj(1=q4DKTY<K-l+U*W`O}Pfn=7dl}TnQEI%9
zNUac3fO7<K1Yts?C8M>c*;||;`QzW9+S_DiZH>|kkcvi{k|hz%`8g6I=B4E2MhbYY
z<pl!|R!eMYnAZ(T9T6u@SYP4P+A6LnxM50ex{5FEZ}K}2Zt#U0Z?n6z$;g(Fm$Z;H
zW@nK>h>8>9cAGFw>CDfOrVX6;=rANNa^fhW-EM<`d@>=9W0p=W69z%u8cBi2JOAWl
zIQ1|g#5;5%2q~oyh(JIk6i!H#4)M<7reGl|M8^?PtHsXRMf}Yj8n6EulOW;BTUXF&
zgLWgPJv+zVOqWyL83HGGDhXK#LynB$$|S>h$Ed1EbB979bckA7#I7!})abCMQa-$}
z%&9=JUFB?#N0{ARWE2u2Xp{!oXd;y&$R{W%u-4F?on>odgWhn+`q{I@al}EtPY?vO
zI$ea6lx2Z6hA0jxvT=QSP{&Ns4<JFj_jQN;i1!rUIlOQv3Bnls6qeRef`}rV4p3TR
zXBQaHFB1L6uOap}v5RLY%8IZhnd@|LQ4H-SahTAOlII&KQV4G4Ia|i!B#iq*+LMA_
zHYCF0mX}yvTBNNa=9(!#+imk)81Qyp@XwA88Fd$!Q-Y(x04*d@BgR-ml%|vt0@GlS
z=WOom@bCT7FL7>dox9hs)!mBswAw9{3aF~8hOCvwdskaVND#uGs42YgPbw>>oYRy-
za#Bg}sM{bB#n4$mEUZA%0OwFR8cB?qU%`wk{5QWqZX8-doFsIjfNs0ZE)|W%1+-3B
z(wfyUWUnmw`gqL5dooiHj3&q|!;~d@rcG;Uj?+<!wT_oV#q)ux`weGk0;`P{##*YP
zBnl&B7!U*jQ4$k|5eV40caP8hjlaQ1UwMVi2ltVxcAB!tNs<&D1UTm~RYe$vD5V}T
zYjqoVYzxE*?&E~P{9|Fvdm)_1RVB`r2s|QAaqU_B%o3tKLzJf2?gH7)Hml8;WPS-e
zBvC-8kzj*>akqmGLd1APB4N9#_~s;M&k5R5NY5%-VT&9^9E1c*^DK0_<W|xUo@bK;
zEhU+?+$;))-qSBLj>>{|7$E}<QX&I|(g8|qymKh$2)*O>t($eW4nxYaVltT!MNv(J
zh??v_1`q3x?T+b2cS73WpO7U_2oQv*`$ZuTO4kh0U>|p|fs7JFXAa$5#3;$Q*}>ho
zgXkY}?($_e_j^QI)9Q5DjzVV6oFN_zxHY)X=G;7A4HJ}5%r;seBbr%`aEfYvmFUdV
z=!FKWafqxe7o}h+&^Ql!rs8f<Vg%qVfd?fOXoVC4Z#_~gJP<}PaS(9-<}IFm_7XxU
zTvZ}~vMdP#O%MdQsziq&)`PPS5IE=X-oLvqI%Z1VZLkx~lLslJ5IVv;iw*;PS>mJy
z9iSvA;UNgflQzMy$Gtb-U}^0%i;Ig`Qy_wnNgA_0J401@ax|He9F-YCVd%sutJc%&
z9k9Q(PdO>!nWyQlc2PQFEt0&fB_WUrxa%c76%e|TqHqMhJ~~p?2D8(D*I1{b*=jM#
zbClLd0oFUTRuuUJ59lzYDsqq#tu&%mprE8g3Mo!Rs`sk&{kwWeg!D3su-@an$0BN2
zItuHfDK%Bxz{U|`f15ySEP~QHnrRc4B+%{9j8o<p7Wi4MxfCkC-0yQWpRnF&^59^f
ztf(l<oUj<-_8$-(G}#ZEq;X8zZ6lRrWF7Y$*f2(UjW?b+oZ|0QRTtORQk5mfRzyP3
zXf>G}9Fi9WaS~IQiVDca88QgbVMyUU&UvCx)wG2aH3=f#ReSl9Di(c$`95h?yuj58
zAdN^<g0x9BnUJ*Gh(O^08#kDEkOx~tVMLgum~n<qVoW2YxwJ?WCN!PnLvhGj6p~wq
zRUti-^B^12EDO9TiQ<4V4$(>y;OIJoay5fAtSW}t7-<cq@Mt_rYMiw7y;_U+7LTXQ
z3q(<nqz!g&-)1x#5l0E5!``DK*-TQBC}LbAGj%JZRLxgBLh|cM-+TYA!>3OK`A1?j
z4?c)Op}nQ5Dr^*^g+!%I+{^-cet~46i&{B_P$1$acI_Dkr69{Dge!~KB&FMEqGavv
zv8)9=J!?2J6`RF`u2y7ahOh-;vx|!pgs)lChLkn#?qTRGxiv^{v8Ey@O9V9nBbC5U
z1u<S}k~Bpci}#+x{-CDLw8R*L0Hjvrd5#nUtt3K8!X&P<q^mK0;Suiv=|4t-JUX0S
zVk;>H;0<zghz(*$Ta?8F@(H1wAxoP~s5tfVkMgOHe3)dm$ycx4BA_5|Bs9Vh>0wq2
zI!aM_7#K@oDq<X=5cH0Nt&~WuaiZpHf|`uLde6XGO7D=~<E`PC_tHuuq`=`2(&9u-
z#70rXevuOdA!(yYF&Lnvz)jyX%qHZM3D#Iz?GCdGixiUyagtCvhv$S>J%)?P$J(VD
z`if#~W0q0|P!!0?2r(W&K0@XhVsMCgcn{kf;&(@k|F1vb;O-4d53NRwUOPv*xQ0kO
zs4$_S6oIVc+t?Z^X9%o8IZrjc!D`A>c?6~Rlz1l2(zBM$vSQ*K)>*I?eSC7fM?Si9
zhrnYdIRdDhr`>LmHX0N~0p8cgPpP{8G8X4yJQ}jFx<a$nqRexYQq!jX$?8S@<R5s)
z%%Yd)F5r!UY=r3T;roZE;SmUn?53F3Eb8D8aqTs}H{L;CyGlM8ap~pfNiSU>l5M0A
zv~>VL?j2+2>YmMetf|P0oS^nG#$`d}9F0Iw356Gu%vm;#CDEEWA-S845lZ9V_3(WS
zLs^Re!Z>0)$!IoPgh4=_)#QdXmOyJNQ(<jIcYcm<efi7uj(WWKksssQYp-D{GbM<h
zEU?v&c~~98@`)7puL|i)e4~v?+lZC3gv)2a8KktxD56MOh@GoM<3l>h89WnYtm?R8
z3S?CviV4lIuCgc2lDj$?SJog)1I{6pqHvxl42jB|VXwz`8cjAwF@e%#&a;#xjEj=e
zn3{YMpr)E&;T$-JcdkA%&NCj4n4g<ND}9XD)P1m0R7F|$e?l-jzrgj^UuQDt*TLIb
zOjR9M`^OsGCl;>ne5aH{Y0sdC-FQ&5DoFz~Gl!aABAA=Sw!7qUOtgKESb_{gMx~+A
zOo^0aXv%3*A&94C%|T@tIm^Tud{M$U!&!?CLdq~8i4%gN<YDiCycqFNhiEB?y=2^I
z(P_0=iWADp5Gh^PU+$eY*i;571m$qZ_~?lB7hgoFnnsgT-LEm0Y&=E@iFJ<og$1M#
z+`f91APkWRDr>y4)ephLPH=C+BM=g+18BEUjyi)3dnl9Rs}a5tVlC*SJ*4ndrb34a
zrFAG{2&|)D7N}G)m^$^yItnjHrR1nA@RJFqtngt(5JiMaao{{vr%M!uwI@2qcrrm4
z!wZcj+eJa)U40&>>LE8hIJPX&LQsxJxT>PtZZjD4AN@uYhFIswvWy_mpcJFwfIw?L
z_H%!YQLo2jG~(#!P#j$!d9dG?67@T!|4Dd9c<;UUQX+*0FR)S*H5xUO8EEhxC7@bZ
z#!H2_mMG9<MNT;y;L17rlN_y%_~UHEL95BGv9yAKxd84@a$3$2D1`_@To@AQfFNzL
zsx%)+QgZKjZ9HN-pRg20+#U3&$_gdqG?Ufg)?1G^jxsN3D#hN;E@2q)@&`Z2l~-TI
z7z@s#gMhNCC?*+k7~q7Ym`qqZdybW}XL;?<zEZ1`!pJM7MJ=3ul81SJoG%~MVO~gq
zR2Tyys8u`GR45eAgLV~(shG?zp`xhPtd}{qswj(+)Op6%GCJJj?QFsq8x3Z)Vo@p9
z+8x%@2HX2R!Z5^2frumGASCwioL2lunxKS4d3aritb`$NAMT;7p{W9-sE?X=4qRQI
znKDO2F_Zp)-f+O!S}tC^NI4vGu)T$_j@_dkd6tp1nji#$4hf=&tFOP#*1dbgX~JYO
z5!M*-B=}xGNy_e>n<`TTQYm~8;)KH$1wq_`AVzpcR86prHa?7y0-T4+I)>wnWZ1{#
zEm{l9EG8B0C}d;}4@N`UrXq<VP_=BqdXP$DyvKS-l}1X5nFecP3>&7b@i|e``vPhy
zgZDUVFlC9UEQJ}fytK$hx5Iz=H~%IV*4J5CT4H{7mi6^DHum<JWEs!D^dj54yOa+e
zVx6TdN~BWtXO`-u2-ZJIMg2};Q{zFxPlKYc6|R^dr6dTW8f23Khs0QmXtW_p072Mn
zqr{lpc>?25&NJ6)b9px5=i5yVt>rfk4iV0<IqFf#`dItvREhC*Jyv;-udz>(AVfu;
z!W*P>C{xtQ#JL)Sv4*Oum}D7Zif_4m!b>l_$Y!I-)}1@tc;ih3o>QwU7~?p#vVsHd
zUb~LMW6FwbG^{hDm||Ne2VTCfa24X+mA(pulL{{-=#U^zrUGD3nN2X`F)q)EM@NY6
z46ZYaD|3dUAz_jtltwB=97YIh37w^@Brn7fA80huQA*UA$93i~N>LOA+FH~Ugesgv
z`1)zih+0Di5CkD!YpfR-@9^GYjlmjAJ{}QAA<`JegCV2d5#3IQXP<qJmtK02rNu?|
zw|6MBjK!rzu6_5rY~R06oTL<aPLXBkpq^)#LOf4^3E!oyI3dFp0vQC4B$-GMzGl7+
z5NM4<)>87NRm!AESoYXEI-(UNSQ(+ECe#6yb7a1bXH6-Yk&sm-QBc$JS<)o522I_%
zC?T2DLItFhG?XH=25$|*RXAJVoTwQr=di|56$Rc}lyzhW2V{djYWiU96wO#!U1M#1
zojlL+_$kxvao%C3Mz67Ehj;EIj_;ok^dAdi&Uq1~$fSw076L^z$q2n8&;ibQ41&Ov
z1YtlKH4u{nlnAiaA)*FWhM>Y)%Mawv0nm_w$a}Om*hvpnX7!C$rjDHgCayk`8bKrk
zp;Ta9{lHv-v<B&9EmtTjvf&UV6ywbe?!W#T7)!RlPv9KgZWpwsvQ<r8NJ*I&9337K
zM-h!i6Bz_pJ8jP2)jqt}k$fy0DDQn$mR^dw3ir(p!RmR;Q<vfFGw8)tTo57ij4+g#
z*(FRif+}aQvxzh%qk}yLy*@=*l6lWgRUfNar3r+@$^fG^UP^3LF`i5?rXmo6iT4!F
zAq9j8Qc;(Q0)fF{t-}?e+w=ec5V1)_K~#B5RTkvg7?bB{Yq|T@TP&}x@n8MjzsJvf
z`qM0|ud}_oOYiUyyvI}(LJ0PE_vjrSGBZ0vtJ9$<3Y@EJJ2!o>?=}DSL~Vr&0x#1B
zK1y)j;ClOr!C{S01u^0KUZnGHeVq8h1;QqnW*2KL%`{=Kw}TlEnCx%E=0ohb&&1?>
zFPi{xHjY>cgPJ*SbQy;s4nbKOCR0i1#6v!9tRpFi#5<wZI*&0GrmBx(J{lvOr#w33
zV0V}E7cOw;>J^+deDvcV=SM#BQB<68)H|XoORB15XKM>B6?2PA6jjC1-hSP1`x+m!
z)`;n`{Jyf{i6n@3Ug)HOZ_gkXSI~1ycr9V)KH}aridVnR=#AGgy+ecpW)~Ti72Vlc
z;v{B&dmHJY+}xlzJjCT04~^l~(U?F8UQS|~2o`2$$+V($)Dt8YtoIyL6+2~(!7EXB
z23jbr_qB&r6*ey^#}leahH{o`-+P0_*;(eh9sbql|A4Rj$rt$gm%c=(1n+zPdCJP-
zoFgAk*xTNw-EGrowHOVDlx0a-S-f|T>N{71{6B#C7AMSB<;dZI(1U$MHUw``ag3aq
zM|5U!#*#hUz}~n{csRjzW+<#hYt7Q)5?i-!P>qK4_V+ltd!NyGz@VD&N24)^z)Q^r
z%R$IY7}IKm6lQ`nhJL?~tx7VfxLQ<{Q)DA^mU7xydpxEnsU{g&zlWXVWJf*vdwab6
z!V4U1?=Tq*YmMvP9(Qit;_mHR9PI4SY`4j>x__OUuLmQB!!h3EnBi6p0|9l>D&!9a
z5Z_Ib_-Zot(YTNB4u?WU5h9AQGQfu#9i@1!2u6p9(@!yJ&d}d@K<Cs7YpW~dgFf->
zER(zU7@j)CNGZ0D4*0LPAMotVEZfGABY1XojjwNP(j4^2n<2aTkWM4uS}Ay=C^;R3
zSRs*tCiQUO97U0%%Zh585je}en>Sf(HA#Yiw_be}C2Pzp3`4xs+`e%G?;L}EAE6}O
znJ&#vhsh+z8G{Z&jE&Gr*StVgiR0;zDTd^KputY4HgQ#50lU)TtDK<G!W9Z9pb90;
zom;d%_%Q|_`XsI2`zJ&Ti<~}tmd&kAOkPrq2DES9!Z#DVl3X2(_{QNr7DrMVK6>UH
z?e$d#*Y7arJVR4)@Zc8G!Y_Bbv_ef&1(eod!w@Yb!y<=CL4c>fv&-hSYy6c<m)P0Z
zU^Ez@RLxDMX-e;?$FSe0)kx?a9U-M+esK|mWY|Bz*$N>;WYk3nPhPW1?p-+H3BKd;
z!G>uAF0jV<sx)|O38Vm5bLJ+WfRYF)$g_Z`x6j<xHlt5`n(W(u!enQQygN@A#uTHB
zu-j#jdrqYb1Pg7Ric(gL<!L4O)59Z<@T@GaaCL7VKN#Z29aI?5-`L_P8*<+kq(ZQ4
z;i<(Hl9?GQYpC}3sKz6%z4{&2=H{4bwYY!vDnd%?iCd2~hTV-#gsas?WmPde++k&P
zjeL@mXOl;fNJ~LJ$tlYko%J5~Bu_e_)0dBQ`l``bNKZfY8NztMRVCIlom~c7)$ELr
zHPIx3kcOX-Uwnp9zoc{J+vxdIBxy?jV4q282)YY+p-EQPh`Vhr&2;#=MuShx&v8vf
z^gS3~akO_pBo(vsv#czw(P?)0`1~o>8XYPmQ5+Ej0SDKvQ|%pa@9I@%!jKE6&#-m#
zCPkJ_la@pHdOB`zdz&PVky<kz3{XOlG#m5}k7}&Ud)!o(IvJ0_f%EQOUX{P?y&pfW
zqJGR^SisAqu@J4F|E!4P1#b+_Gvz16bhKXJysP745TG%LxXp0=GOfEeX=;Uwnmqr(
zAE7tQ+27eE$S0(Ei4~s1BxVE2X(9QsG-6+dOxiOHgOF^$k5-cNtE+V5CVzEqj$c?_
z<@D(@9O{58U-=5<<`xI{@6l13r`OlH`_@|&<1tbx%A!`}C?VM0-lohll155dRtydg
zSv_-xNnSAS_t8N;a8^%$NV4&0Ds&R}3R8W~c|V>G&chTOQ}6JSvL1W{uhQ01w07pR
zE(qsMIc;`@!q}R=vd-b0uNfXGA&5u=LGS4cO!fveuYM1kq)bK=&YgdnaW>}uy?Zs;
zn`Kl*&Q2h?Vhv}7<P&Mc$V&#zHa+3lyz>BUD%y(+7^(QNG)9<;|NWnTj{7%m5?7Y}
z+c#-P5vnZN+jxl90cD=o2(H#-<1xD%o5WGwZR~ArF*`rc{K^VD_csvJT>{>Fy!B|U
zNSiIJ^H^)|6{h-4=Ug^5*yGb|LLfLEVMfI1Vz9FQSrJC_uBu0vp@vyZS>k-1-o2k1
zPHK`sVmgcLwieOf{T4}Qj@@3LQSXq8XU`C*fQ^GAOc0O+F-f2~!tnN#v;1T;Vb)nh
zGoj~7ZoYMe*n<xPzH{X*e&zT71vhTrrsF)5oo$MPLk>1JNy8A6=Tt?3vxYcHD2jpy
zx9^};T{R8*eU?{OdHVAExPS9Dlko^0hP7x#2+Fb~8;#IX5r!egnEP2i`7P&t_8tSK
z;&|rU0bV8Pf?QnrEMYW{v$)#o)5g@}WsQAVV{qPstc5G7v<#kkAK7cK6MyfkG?$h*
z+S#Ueu+Q_CpJS32Jh=aW`Q=sm{XV1q5kWKIYgxw4Y|N=fgUomcBX)MSxc`-}as4~r
z;gA3P&lvQ2%pu9Pw{gP(M;n`jLegoq825VM9Z8bnJ>0)_8&{TiJgu277oK~LAc)x6
z+@!a^PY{MUXKUulI?AE|4@HsVstWJ@y{yQ8+j&2pdY63CB*;4na|+VgDHB`^erh7&
zSlA)7M+XWga@=qTVMx67fW}ifTOa#5g5Uo&mN0~kHoFH~d~H19Q=k5MTGu0X?mb{`
zWs$+&kZ@vfq2@P^j`(7u$-LA&ymcS5w?!-jM|-=>;R%Z|!|@IjIlY}7LZw(=TVr@|
zh_jYBZs0xKyLl6=AxUBof-_G)&7e2r-i@2!?Nk?LA5n5eo>S&IS}T;42nnvTC$psZ
z;i6!Nmr{A80#oBo-cQ+6DR5KB#0!UX9;b5TIAe6wC%OI_?qeUO|I&|RKKGAV`01ae
ztrh$CZu0iGUt?imh6g)4OfVd6KOoy|)QIPB#Eops{iux+5#`|q>kD0;d1{R}-*}sY
z%?+fjD90J0)SP|lJo#|Ics!&Lr#NeQc<%w_WK0y-Xzt4C)7-mtm&4ut8VWa_vaBAl
z=4Fv%Oda#;v20cA%Z$?}MRfI)u0K&$2qf~IvO+eROLF=2XGEMV9E&l;37wR+7AYjo
z*jl@w)HDeMG+aS7dyc~o|0MEjf5PaiUm~2Jr`b%{-P+^u;1D4+`Dn=2^&8B$T680Y
z9A)UTpxd0`sr7S&#fXlQ%(t4%b~{iOWW7EMGc%l8SRfmX=p7u8L?J>*9^Ac4RZP%2
zKt~Y^r<T~;-lunPgbo5sRbh=qs(OP!RTLC?4%AJ)QVIlE>oCULFHQAZ&bjf4iQIQ(
zN$MRi)3PFME(Po7{#_9z^WIPApr`1jn9^0w)~Lbpl$$jMq{KVNTyKl~@&`Eh?B7DY
z{!NNM{{qAbt@%?ZDamtBIUY0Gen{CrLiF}=y*{D$w3<y;R?cyF?>2X@U*r0lZ;%c8
z#5yEW3grxg!$T(Hl18(EmYVI24az)23PBXb%q=Z)cyPpMnAPhQrm}e@JaH6J<~dba
z)~CeSS{aVVR0f1VYjtmu=f7p2U@(0`qxq=Z_s%-uy_Z_ys+wdFfY$Ydpmnw;Af|F5
zZ!Hoih6AhsDdEhY{wC^UzrgNq{7cM#{7X!J@7J+jbMD3WGu%F8((fa(oN+!TDI#no
z$gL$S6-IVA+S#NU4hW^^@WDg&ts~TR{1Hmf=*%O8;KA*iHDaL^QJONlw7}v15qVak
zwZ?i6&J*YWtpt<t7+V>Hpyni|58N1w5Rx=asZ1rDcj5<=AmW`>VM1x=r1U<|p)3f(
z5Umx)3ycv=$`T!fXjwa`vo+!A%L*~hIr1Ls9p}IJ+r%IG8SekuKPCJx=Ggu9U&a|r
z^ZffLgkU@#Bcos%A1!uLkw!76mKNA~EyLy$w3b9#BZC@3tSlI7==FybSw=Y-1CmCo
zMR#_V{hb4<YN{La7Vkhxf$*O3aDa355iH9JtrSu~RaFQniQ^dW9c5X*=Wa3mBmtrf
z!$5XsLeXsFvk|7M@YZ083}+ot6vK4UM_v7UY*nHK*hz+PC1b#P#r#+Qkl^Kya_jH^
zef+u04FB8z1g#o~*||DwI!9Sn#6e6NE2<*H8%vxdWYgVbLJIP{U^p02R0g3GVM8Ji
z=w^#nvrQaD?Cl=b5V`Qv+A*k?k>DAR2K9~#A*jl-R$Bw6EKy1m#qo3x2Oz|RV;1)@
zHOga^ejW5h5Y7cFXZ{0p*bzeDgoLz#ZqE=TX-yc|8iTh&Aj1fp$5$oC15M6D<pqTk
z%=b2!5fQte`6=wFm(hRt+t|C;rrWn**gK%e3JO~y!X{n>4EG<B^#_axJ^DvS3<m@9
zYyv`}qnP>S71A`Rr&5IE=x`rX6*Xq&9YWT|3biI54KS6d_4v-B)O3c*nn%VuR!|Ee
z$jjn)#`)wA0XOX>zkhE9Lh9q~PQv>_rj0Wyj6W!=3SZQyrt_X4P7zUrkqRfL*RmER
zYSI@eabDn6fHM}PAV<?2?lUv??EKWnC_nmHFtv&>iW_7PZ&8&cMO9IGg^wES-?`3U
ze}`&P`&kf1BuRrL3<*L_m^5%@#`x%f;n5KSHzhCxN=N80L~Bhk>{AsvN-DgwQ%12S
ztDUigVSrW&Q&r$SrK$dGn2mqAGUnm*JgO<YW8b~qsouR~kJrhFq%j*_y!@XBt7rcs
zRIrGxM!qU@JVpkAa7s%NL>}S2x6TVMgp^Wv@4WZk6NCt@g$g5Nn);yKqMK@8u3Zq@
z?|X$@$H;>N4~Xa={5L-S{QrUP&JlK(h-Mc2=>B!#t9leh$5UNB67RjY)*_>ZFnQ)p
zF&0uOlu$zIzzZpBxtMp@vc#5!mr5f1@rFS6NYd+^$9pTHD3l;3MOnU@73Hsv^Xy-p
zsKFux^82<som_`SJuqJh9Z0o)?$go2sgIhX9J?~#!@5dHe7$@Q=e;xD<AqdCNJZT{
zdGEkU9XRhDNaa-+c%*cx@*)TWs_wk6x(iGePW$S?Js<qDUj^p~+g)^=c#{n=MNSmQ
zD6M=^lz8WabIyt5)l3L4MU8d}A!V%`cg`6rm{N91sp+a9iIBpXsuCc)5JDpG&RQ{j
z|6XaT+s4{m@87k?Fqk@4_1*@PG5{pb6#%-`o^!@nZ%qDZN2CzKJI^~RZGTJ_JKn)4
zy+7u!j#~v+i;oo^E%1fM)1DPnB}_(tp-q?nFTB*r<#Q)9<>N~u-|3&E2=F{QqVG-9
z3GryHQ;n+$FOFB2`C9fTq~x&yf$8opFYrjEuu%%mBJv41H{BV8_ufk(Y8Ko%_o(rx
zAI@}>$rP*c?<m2KrQ^qHX#a#Qq5eb$oQ`@31obv2=iOu)x5U&o_J{3peG*kZ{ovk%
zQ13EAonqw4A+HlRE+2im#{}EcQ48;-#7iZFF<{E$Ri=-at?68l@c!}5rsAX)@Ps<h
z|Ik&Nk55-kFC?bMFHRUtz>^{Czgz_Tm#_b4U;j7U=QDpiDVW~?0000<MNUMnLSTaO
CW&@T0

diff --git a/WebHostLib/static/static/icons/sc2/spidermine.png b/WebHostLib/static/static/icons/sc2/spidermine.png
deleted file mode 100644
index bb39cf0bf8ce3c6646907fd7770aead83c3c6f52..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3872
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

diff --git a/WebHostLib/static/static/icons/sc2/staticempblast.png b/WebHostLib/static/static/icons/sc2/staticempblast.png
deleted file mode 100644
index 38f36151077514b8004a260012d68c68c72ec99a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12094
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

diff --git a/WebHostLib/static/static/icons/sc2/superstimpack.png b/WebHostLib/static/static/icons/sc2/superstimpack.png
deleted file mode 100644
index 0fba8ce5749ad42fe9fa5c86246280aade0e1fa4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14901
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

diff --git a/WebHostLib/static/static/icons/sc2/targetingoptics.png b/WebHostLib/static/static/icons/sc2/targetingoptics.png
deleted file mode 100644
index 057a40f08e3097f095239cb437618258d58fcb59..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8431
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
RD`x-z002ovPDHLkV1k*$H<<tc

diff --git a/WebHostLib/static/static/icons/sc2/terran-cloak-color.png b/WebHostLib/static/static/icons/sc2/terran-cloak-color.png
deleted file mode 100644
index 44d1bb9541fb1800722d81d623be86db950e8c91..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8134
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

diff --git a/WebHostLib/static/static/icons/sc2/terran-emp-color.png b/WebHostLib/static/static/icons/sc2/terran-emp-color.png
deleted file mode 100644
index 972b828c75e273453a38ed92d61a8d433a3e94ea..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7693
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
Hu0mjfW_<P%

diff --git a/WebHostLib/static/static/icons/sc2/terrandefendermodestructureattack.png b/WebHostLib/static/static/icons/sc2/terrandefendermodestructureattack.png
deleted file mode 100644
index 9d5982655183e176563d2b89cf0b209f29fa0a66..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14017
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

diff --git a/WebHostLib/static/static/icons/sc2/thorsiegemode.png b/WebHostLib/static/static/icons/sc2/thorsiegemode.png
deleted file mode 100644
index a298fb57de5a10de67b9d1c88ad2576884df5967..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11345
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
F{6DM(Flhh)

diff --git a/WebHostLib/static/static/icons/sc2/transformationservos.png b/WebHostLib/static/static/icons/sc2/transformationservos.png
deleted file mode 100644
index f7f0524ac15cfe5743fef2b81d810b49bc2b5930..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9215
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
Vd!Yh$bCUo7002ovPDHLkV1o5`%vb;b

diff --git a/WebHostLib/static/static/icons/sc2/valkyrie.png b/WebHostLib/static/static/icons/sc2/valkyrie.png
deleted file mode 100644
index 9cbf339b10db0ecef77028799321627d068e580c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7490
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
M07*qoM6N<$f-r-FHvj+t

diff --git a/WebHostLib/static/static/icons/sc2/warpjump.png b/WebHostLib/static/static/icons/sc2/warpjump.png
deleted file mode 100644
index ff0a7b1af4aaeb9fa6cd112b093c3300d8b46041..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8665
zcmV;~Atv65P)<h;3K|Lk000e1NJLTq002w?002w~1^@s6$Cptn0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1N_Y@Q_Y@nK-DZG
zlS&G?{HhRqMF>F*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc|
zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP
zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X
z<XAurDkR4b{s+IiHH(uIZc;c2^uE~k#|RMI1zHW;{yw(t)(H@J2ClS@zt#k1K1pwM
zwD=J)unk;XcQknqxZD9^Pr77CjufEjFBXCKGy0}H5V-~V*4*CO`#607veZ@j1~@nb
zMoW~v?(yzWcW?imY4`U7FS2rsb~dWr00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z3ljhU3ljkVnw%H_000McNliru=LiQCEi>;WsDJ<fAJ$1kK~#9!?VNvn8|9tn-<CYe
z$YU!~WF{7Nl*lo5oVW=#X&}MjM<|r#$6ZU8AJ<*D0$uh8ZSUIBA9Q=&?!LHo>A`W=
zUT;};3vAiavTW&gleUB(rjU@3klG|DacrC@QKZOGq)5mfYtTr_{qc-uB+Cg&*!$yN
z$Mbs4OR_YYdFDNz@AvsW-|sVq58H?B!}ekOf44Q9>I<n!Ite`NbUFVFa07WHM+5U*
zCjp0ap8TGq%8r@CdLDSs{Mk{thys*=a@FBV*1N`8Cu+v2cC}l7IvdIbpdFy^s*4wt
zayfTPdw{8UA_wGs9ibv{Oz|mhEu%HIE%M0O<4FTJ={-+vSiGoLPEI8o)E2ctZBeD5
zYcXDjEM?0&UWfc%(Alz}R4NsnPG=*~;B-12)!lja*=P6MeDlpK8yXrK&IXuQYLYTe
zm$QnX10*Ln#Ai(_ya3D`)@y#)qR0Rk@9J|O*#zdjNX31=f?rliz7wkk27nrBr|)Bz
zFnv73R6IdTdw`BL1C&ps08kbv0OTjrcvTgjsshkj_M>`K>v(MipE#dW#^;pJPEB(_
zYdDR%#09vV0v3Scf}()sQr&3b3`Smjr3O{hph`NOW;&X&fH~$%xPr~-Z)b4Km+&m}
z;XYp>e^dj&Rg!AX9q0_8c6Ok4c91+6qitCip7sE_c!FF!!3Ar2t$mXdNfvbm@Tn@9
zWD=jMvb?#s=6JI1#_N#(&44w|wd0)1GCz~flWkbXb^5MdjT%%*Mw29?NlL{6#=APw
zd>Pk#87-Qn5S>N}Dmdr6ges0|=oMfKz1FGvuDgUlM}XwP7|DY%)Xt6?Sf2I(0NM!+
z?SzKfr9v4C)|{r|kpJ)dFxe|x3Zu35gzXn~i`SkY0HZthV5AL{?j{Op1EzJHO->4_
z0_A)On%yYNytvMjDIC|)4rQ%lshw>YPMz*c`|$?_jLGmQ086gu2f%IU=;<up?j^{6
zAKCp88^!`ZZifqRn~K~lOtgazVGM}Boj7Pgp#uTb`#wM>v0X`^!F^^5J5}qy=3+vF
zeZ=-3CO#G=J{Co8bR+pCTz;XR!nBTlB#*=GL|){^-PZ=d^k^0%rGsq4Qab|#*9j9!
zM-!x@2|Qjm-X-EU*+U6@D?`YBahciihy}{>QC*>$K57W%s;Jg`4+=4ocu??~AkVcm
zo++sQYc2*LJiL#c|GKqypzBsBqzh={GcaAi;dbI|a@K;XYHDX2eIFaJKviD-!2s<8
zA+m?WXWk_NWWNtRok34$YhZc(etiDcQ}$UyLqS2pL7b$iK9v{+JUH>-tou!j!utX_
z?e`nLbQ3py<qsI%yn~S!b^tK4ZFlVe;TKN3kT&XmUq}@w&+1p-$NEt_10)X$D0(?h
z`p6{yMQx;`35;A8?~*orp@8+93M|?0h0^I^DJW=YBuNrNsISFTRg5G~JOJd(NT&mr
z^?r&nzH<S#?hBtFbVVNk_uu?Q;hen!j9i@6!ES|<fT0<}+=@^>S)#0!YR=$q_tSH6
zH<2R|4v$XItSS_=0<L*3WLZW#o~5PJ%aY~7M~378!>?|kb8#1uw{tANbQKujE&3n<
zqg%p4Ni!J$?zrg=>wF&5Q|V;zHrASKk`yHqnu3Q()6=C$(~6&MY(F=J4gKZML_Ae8
zkh~HupNq_h?XVp_;f&k?nS4S&?Mb@V2nb_4#?cBIQj^4V(i|n{3E$V!>BZA&-{0X^
zw=i(|dba)Kd7gXdDMq*Lrgz;c0)FAtLtR|}40PFH#O~4Eytwrx0B*eI26~qE)b&NB
z1C3nGXBAi}(&y&GBCm!|`y+=>#<@Voxxg*%WEC)3QP4HbdLO)~i*!6qIxadRpC@C?
z7)VVLE=8(=<>~anF>#!M%hv<&+(S=^(RkY)@j7p>0Cr%4$bkcd2iLHwcNIVWh1f4}
zo-pN&FKl8Xn~<AjZoA@k`a-L!%+^zLJ*^18m_AovX9DX~tpY0$5~eV|bKLsQ-|nZ-
zSg=6Nh8271Al{FxvS5Ag>g$p5(z|YD{Y^b^K&Wc}9(M2FbJ{+K5AC*qMHoe)#Zp?7
z$uk0V`bfW3IVrUYN9k%+@Gdil_5E4UL0Tw)HLvvI4Y)~eO`=5wC`md=bE}W(R0boj
zBm3NDz^mX=70Oz{K2Jbl)qof+!+XMPxOxNL3)>jq6{dT2ALF~iJo|h9qc#p)+e`b^
z!VKdtj-t$Ov5&XNgHLkX0eDcs+t9-L>#ns&{Ek|m7B44ieO$qIJNLExLBm-AbD7Y*
z%e?3*9X+L6z+C1g8D)}N#jvde6<mfy=7{Ko<d$*D4Ja#AT&hALsae39E>dxwui#0z
zNFGa~E>uw$s-z2IuDJHb4FLEWg^B(6Gv8&;FSo+9=;NC2-6VW$BNUDZpJW`#;g^~P
ztVN>l{T~~&u50lHU8e<>bR<A`pB7l-DS(+_fo4IozBARO?aAW0y3O_rL9t&oELW3^
z!!J%T9Zup>6{LWIvRXvl+O8yeqj37kV*<L<=a|zJ?s)Qk0Jep<i4ft%QR_R`B9Haz
z?($KJYB+-mrKrZ%-)tt>wG@EpI};3P8ejh6eT<Ed(bL@{Abrrl)ktX;GywN`GI~l!
zZk5qv^&_GZR4kKJ{9as5_FXDsP)KUHRAG{i1rphf5u`xvjZhcbbHVP5`bZxY0DZwg
zZE*SGDDi4oQ|68AXhB-!p)hIS8nllU>{?26;($Hf3AFL>BM))I^*4%Gvv@sW$M6}0
zn|t!zEK$}?U*lF_kq;6YdVC6sd3!|kxsm40Beyq)?2}Qtyg2<%a=UFOs(6Ku>AGSi
z6EE!M&aeC@!pnyVZyz>&o=|K~6K1t^%?eVvjNKRAo;wbG{bv-8Yk0cs8KI+D#)xDw
z4jsohbezD|t6_VN@RnTy_(DIupIB|}A03YZ@c7TfsCwl!R|3#8D12$8D9$(f%UyF1
zdZ(i)FY)4C(_a61(1UldqgG|+MO4EA=(=VV*FJm)o9}yyYahPjw0E!l+U}aa7hh<{
zQ9t_VH;KF)MjOwP**?kixb2*!ke8+_m(X<O5;1^m*~M+&_!H~GpS$x>M*l?sP}kc&
zEV(7Zrtdv&{XMpI_}mmGFA*0nheRNmkLQHCzyhU5g(AGyb)!s(&TA7{YjW*b<)`C6
z_P}m<{>wiG;D;Z%kJ}!<x9)tspI>L2Ok-PZ`0!Ggq5FSU?>5ppneCIfD+$TFM0O+m
zv;fn$el-vL=I?p<Ghbu$m%FS@MyBun4XEowB)3H9zO<j7!GRiBr&8Bx<1jhoLyu(8
zV_Cdw+VQSw$KCEB^ZbPE+kze&R8_0M%Dt6h*H<=MpWplTLj)SdO$cuvCj7<-H~iPn
zSl{Q~NinhWO`^NU39b@qYn>k;bXA|V&-DJZ1<X>Id4mg)j0LOGZhF#G+P?^;0ffIh
z1m6X9FvN{tyW85gXK;XD|HHFqABU;8^qti93a8uB?I&=1FZshc^usxf;~Is$L9<^t
z?UoyZB!6lLr=hQkJDq+t#`ps}YqK8zbQ9svzld>o%Dyp+74*I7>RcS^7sWA>kBlHA
zBd<}B*QmJHsL0cxg;O@HccEjjhuGFJ;;)b6YxZ&Pi{G>Z=~<GPe(NZYJ|@iYPwu&k
z<_mp<Ukamkih&|^I8JP<@MEw2)vwPitf;_JR;YN_+9skOo<i4klm$%`W(sI0W@sUZ
z(kG@C>Zf}ko1YVw_mXx-Zh4MMe$IP)FWPG{pp3l2kM~xgDBmRkwCxF!kBr#o-I+w+
znIvl_G?f*8vGuj0Hux=A03ZM6O>-(E6BpMcnV>$pS~&Sv$9I@1CzYYU8=^QVtfgZx
zbap1G-r8qE%Hdw@K|h=`<15Kb6VD*IC6YfKC-fcRgS59(#Gee4el1=D%Dc9m?Dne9
zZnr1Q@(O=_n6frNXsrk*@~;V47QBNww7qGxy=j!aY1G@+S+LqK?WXJU<#WQ)r_7lM
z^Q_O`+%-%xl|=1S3BMFR_pm~}wGS<vMClVU73OH0Q3aNfHwb)2TzvBBF|=^H2A2P_
zc1i^}^oXstrpv^rTR5CUxvT@y;zIPWFw5k&L=8A)O#t^AJFY6dkrJ>>h3$B7qxIb-
zU;lS?*OJd^7Oc~?WW>HHr&8A`eOUXQeJ4HrD!Gv)+Ng#yV5=a#M_icy(l&a&K0szN
zL*&oJ2$LO}v{T35=tUpRp^ph=%H3v$prKrQvh3_Yc-F*z+N?e`OSsw;JiT6&J~41a
zzBM9j47l<B+v!=qio7iLPbLqdC_eOTp4^l@D7lI*2Kxqi`jw}J+FN8Y;SBn5@w>p4
zLfNsGBJ8~X41JiVUnTaqkf>9x&w*E9rM4!BKC!O`6o9-;1gmnd2l)a!m7<U5D8%y^
z@v0H71zZ95sk0-^63%9c(zHQgQbQ|)wzqav?jBr8&-zuhR-$&AWjq;Ai;vt?hTK$^
zpc<?@htIqL`DEULbyg->fi-6`@N50F4h9(e>tWKbPojr2^(mhHQ%rtmRDg3-U`<u#
zO11Hnt~2vi7O71}YLjsV>QhIhX_5YRwJA^qOj+SY8_(98SMs0*%;T|>lGVTlSBOb@
zIJ&DwVQy92y!a`g&1sS?7pit4S5_>ORR5@(QcP$3!Kx8#7O;xC?7uze<2ehMv{0^5
z82a4V+NKLtTmc1#nQwQs38m|A&jM6c2fp$C+X-IXV?onqvUDuy#pCf2iyx$;y^}V)
zM3YgXNijvr=}AjnZq-ffrHBP9{_^OVrFWE7!IS1I$>Sxu2m8748=qz4cmAH}6VJ_(
z6FB@5PQMGM-v!OJ3Mplr7>6{ZCE|jm`Svo4nb)&0uV~F8W&@NKw;;7REt4%I@;D7p
zZVjP56T#S<h34As1g`02!%ysBG?Nm8NbEOb?EJze`oFji^%^mS(hg)v{mypwop<#R
z`QQ7<9ZZ|R#?QVkdBgp8)3bhnu`R=lZyl*|$t_ohFjDp%FQp5V4hbOT<7O4fE7NqP
ziYug0h-esZC6R(MuAq!7*ak7s<2iGisx{ZcQy4`olLc`4#jCW!i?KJ0!z?tH%~D?E
zxe+2iA13sv0qZzBzOa$_Z|vY&JCLn;1@QIz$&92dSZ6&oQdS9D?^!QSyy?3?5+msM
zHW2^nkSI&N7=hUq)mZPqT_FW+D2Z`MgJ~V(h|bLGAT5${N)F_94|2PQ?9LeSx)9oH
zF>5wZ0cA{z6FDdAP1x1zL*HVDBa!DuYJgS4s#aHx<L_@}`19Lv&iep4edWSnozjM;
ze@^^N^Z(~bINPgW&7MFX(V0qRklS;3*L2`r(?R;R36#q^ENB%_6>v=IXwO7YZVh4V
z&0-wRQW(u3E%RdR&(^36VC?7iM0(BlZ$Rl1gFy0yLv`vpljfZ3L;spZ-#-89E<&GL
zK}?=vvYfzJ1e4_izG4HT|8pC~A{2|z=yiiES(~oP6g`a;J&p8Tbs6vKGdSkWqj6yi
zjSE{S7IkQDw6;c96Z)|{#atPAp`WH655>bXl;15;%$C7bL|UStT;2vQ2Pc~y%#7t|
zT;QbXvR3p=k$iNTLQ1FklS`1*dB~j}^npeaZ%vSRW*i(KwacUr9pw|tZ|2c2e1o1)
zAJ<&@DdyemMbGHG{i8Q2N<|F4j8PJs9?kyc87XYwvD@q%(cg+?0sf1Ew5|@G`8tft
z2Wu<dtNZEuXg{T#P|WVvwz20mQ8bm?Jm`}-CV#UJ?`m@?z?B_LJ|QxzMoc67tQfiE
zt`_8FEo6TYr>)n6_ofi~XvU2De9-1X9}#{i`-Ct>?~MVpT^Wp{I<LMeW(ME-i^l-i
zvgxaH_P>zQ&fFvu8^a_vidZb$s<Q5}PoEafLvR0z-J7?t`-QC-Zkhfo1gw$Y3fQ;(
z>0R`Fbf7K{+w<CX3zpngTPxHfIlNc2lihj%sYAhtX;zF^3123^Gm3nn7w=7CDx;5P
zATfpSt{yUvkC~MznZi*!OZ@7q8~N6^1guwoE8rz|L_b(gzXGeKI=m}N>*^rG|M_2S
z6+LnzcmKXvO0eqV>sj^j^-!!0E0ld68&*|Yb@@7WzqXC>oqH@;a=?Rr{Fs@KGXZWD
z3X?iSSW@wY`u-{8Wi9CYvrK-+jtkrVw43}$3jM7#-aEU|V^d@|CM=azpjDLSxX8=o
zSpb_eMV;QCAvfbdZ&jgDW^LmDH(v4y7QE$RGI|_(ecbeu2hsP#!;d_`!;d_`Q=9&Y
z&Evaq7A5X&3~_H`h=xl(O1wcQ9yyG!QO4IO6OaSe)_low^gszcP@?<auO&+cr_+Z%
zF+=vnNsOoyM{5fpQ_>wcLmnJHJ5nti(~(!qTJaT9nEbnOSmuS0g8oVZxf$e>^HBUU
zZOy%m{ceI31^j<}G1;w2Asch^UC@ThCDCA%K6vGO(_<o4{O2$Hisv5qZhe-cyQeP9
z=<Dh}?J-xbsr7Z*SbWa+<&=TGC4+pSSpqzuQO+3XRrAWWzv?IZw7G`t(;@3UfPSbp
zjPPF+<XqZW0lVRz+vr(6cxqT?dsL5|@iAAeSzq(_ffFNjplW>Et}G6pglnleRSKKy
z#%@`H9?qbLvv~i*66-rzwt)ri?5D};A^p23t*aM{5M+-Xqiy)Z8yI<M7uw<UxdAIg
zQ+)ZQC+(c~>b|*QUC?a-+f|&ZQ&`^x^{Z%}-!)VRY}K0e{BYhwB!9WXg63$I>Y$Y~
z2Kufn@@lVTl5(Gq$#0E7Bgh}|)u^kwumjM2&!8CrY^k;8l|5|z(Posz{!>Dm6PW)z
z59AF3>w2xy{Mgnv8Gn5jx!kORhaxd}!ynrnJ2t^cMmW)aUl8x29*$O-X;#*W>>nnp
zXOMkfe5pJeTJ40L{zv!m<Ne=c&tU;f&N{(shl~2OUN!O0LL>BUypGsk4@0AH`W(?<
z!c><zxAk10Qi^G?%*O@SiW?Z;9koX7zDxVjCNmUr;^s&`56rPh<+OFlfVuv3Z0nnB
z`re~+$6MFe)*7o}-Mw^>&&nYN8tuCq**{D+mB8B?z}p(&gSM7S+sJKAF!lN*Etj_8
z?r*i?Fv|kg+Wx9zt++XF{P&?+OSrV3@arSzHcC!z8)e`=QB2tQ;NMuV#$Vrsb|h_W
zO3+WBd)3?^eRd}Y%+lIOQK)mtvVj_4L#c@Mx_k2wdtMl-JKjwX-OWu8-CdvT91IYD
zaO8~Os%wK5u=pFbCfheSU;!(f(9X_>^_#GUA9{}Lyt&tcDU19l!P){wVthCKzF-Zk
zO8cxF;@;^ILd$AnvZ4L^EMNdFFKlP!H5;tIZ}~6R)$ISjGQR@gbH3}j>xr-P?31>S
zoqBx|Wu@no>QdJ(KDD~epz3`}V4;-(cKmQ7lj8|m7S~pyD?UM8z64)ufUJ43se|Hm
za(OrJ$$mnO3X?#^I}MjLe6knt@=Y^Iw2u<6EL+FEe;#FYRNURB<qElj=Bnq9_3_i;
z=ZXJgnD#&H!?RLl-4U^xd+o13&*QPp@M^ZE4&a;urOQvrT$Ncs_@uz<5P`lB`zD5o
zKW{H)VJc70zyMpGdLA-)3e#n9)t44d3v9<fY!MC-Fw$8he{FE+y}-U}se=*HCM<tv
zh)|<KsL`$i43{-VPKvG4_EBOvPL|{373>kPx3{0z$X2Gz3Qq1|5<<|jQYHS6VR9=~
zwq0D{zO~=5ely;sk)E(4_1th8&p>_YZs5;^YGZ#pUR&^4F4oG%_f4F;!YZ)rbqoTU
z<oDsZAc(J90LzRYCUHV2!*4Fp3^gi5ikby&HY|Wq6Ijjqir#*qvZ``d{N*snVjkGC
zvi{MSbsg&&XLHSGQzozqw9>l<fz_gKi8mum{jPRE=vdxGYz|nbntVIXbTpFuK3smE
z2`XxB)vdKNR0C^BPu9VzR@npS?As@NN5v%HuT|8wZqa(yEm}|a?}<3h-xZvtver6v
z4gby1oX4yNHhTf#87WMv&SV!s@_TU2cSBL9Auo)(kTEC0Ck@(H_Tukeg6x%{vCNRU
z`aKriN8W8a;nqc6=*27}Kn2e$J6<7wGzF6d^hDZv4xp6JQ_^)@0dbRzcb)id4RJU<
z!L@#SvB~yVhM+INs#k6y{Ov6yAKZ*vmI?Is;ygNm_iB|)HbZh-6#bBnj7&kxV`w^x
z>LYnLO7cJq-K>wwUN;oZGOVaqmwnOGktEZRB!z6PaynMlmgwKu^mAh4qoiXKq+@gY
zhvy&vG5Mn@^rLC?gl#H?Oa>!cUp~t`6Jc|@ekoGlUx>(Ey~0*m^5qHCtGZCviO<3h
ziBwYsmZipH8K#bjbG1}GS!ZO<!X!)P0iB9$!78M46w*12tcFns%U&xH8{fwpn|@CG
zol)ZNjFOHWu+%jh)`7Qn&k3t+R*sx<{ZO^}#4esUp?z`uQPj&#Am0|#9CgFe`a0#d
zQ>Slo$1?x+lW!w!KRMxa+cxg<DJ-alwPzpESL+`=@psG(3#fqwSg;(kVCj3a$Sb^j
ze8FnI^v<JfPTOXg{O#%US=GP{O}7-5jU+4r6?IjDR>`N#sj|6&Ih^2hL8BWzCw}Cd
z=c4pp0mTI7^vay{O1Rp<=+uc!4|8zi5an43M0Kr7<06ABqr~0_Grnbv{E;NG2};+@
zutL*7({PwQa!ERrbZcz|Kycj(a;`LshBCxH62|k9fHn66SP*rSG9Sf}y)sPcM8Xl0
zo5yVHnJM6Ca8NeNI3x#U^U-v}EEqSq#H+H*&&<K(*(t0vtx<A_B6#V&0#36tb-v||
z2$>xbvO6N+6;9f-v<=Tvd#)IJBTQ^Zn9Mf2^Li`^E|-8+QP_JRd7$)OrSfj7^pYU0
zYZvqO_qQ<>PB0Zt5dSIAD$07d-+3EPJ@GSSz;l5ehb5n^&mNbJvi)jCH}XOc`Y~Zi
z>L<HN{$l*>oPKFqqcp8iE*O*x#;jC{A35a59TG#g1*>|Fw={sKD?rC3eHN_vj<5wv
zk0ooARe|Q1Cty{8S*fKjtv_`V^1?n=_4l#zLb0Z;;|4pOr0q`53Ckhbmo6`Cv7jl-
z{3L%dj<U@E!Q!xrS=Om*PFQVq%BqG{n_{i^6XjX3{FektZ9mMmTYkb+xPCqT9e3GP
zu8!-w+4smcJl(CtHjUNoD|=-NTs1WJLJ#hR9?KlH{b!L6bC&H#zAK2N78z+l6AeBv
zrqcL&7n6Ku8zo&rKQ?9EB{k55r^AD1u@4NL@#lufCvq@3jXpVLpYgqd*c=8lN+35w
zsf4RR7yFce8KA7wbI%6G{@V`7WGS2w7wMd@;GD0Jy{nB4tOek?4R4ZuD}`Q!`~_Z;
zqiIm2nk5Kwzzaq3RGofYM>$VIHCKjf(Hw=8K_R8pJw<$4U?s!ADM_cUh_48cd`3j*
z`mw6cEUe8G#5TP_K9NJ8%n4W(P}Q%E=6Q;RIeXN7-x^Y{$4GAz3B~fe8jkt)NPV66
z;@WB5V<WWR(@$=f`NVHEto9b`-;c<ujI7GIWP6GxfW3#2(mrV5+EN2c+bcR#d99W;
zfTz2I*rqqgy%Vp6RjsUwUo2Mn$6{@Wtt=NqeFfHBtpe<GhrZ8s-iv9!rytMi0P)A_
zr&@Bm=wIN<fVB=x33||?Ik6p?IxVdC9VMNvTA$_ed(ieK>Ojd0TP$@|!vbnyfep&)
zfix#90QL7nq_@WFfR*3XaGEOnb#@28&hD_lc~%E3b=AUZ!QJk`J-_yvl3QbE<Hk<`
ztkFs7WEmVF&zGTSAo*n|X339ba5$hmqvL3jaW#VM0@*FxQ2IcW%+4{>!KV@bwg*ZD
z0mNCUd^b6PG89W9uU@I{=mO}H&kc}2s-s2Hl(alXMz86yvy_7qISvnPp`*WxktJbb
zBNO0*+=~;CFqaR=GTy-s>miKHq)y?OhH*?N$taoi$C(0T^_m=taW)Ebx@DYA=2|Sj
zjLYvv8_!Ulv7Mn)k&y!}$miR>E3>^C7B#R+Mgb>I6V|L&tnH2O;sB8!2tQd_aZ@;v
zr+gZl*zv?>+AkJUqZV@x=`5GgqdD9`5BX@W7S=HhnoO^BVy4!Q7d}8Cw*t#Z+yAJ;
z(In$k%xAuj=8(_#kl7WR6IRKXWo|PiTV;AxFHC4lJ~u$*2g77{CSY1e^2tcE9-Eez
z`f!^dJNm`c>*6~<Zl!9bD$}8&c$h37t$i@Q0*w<h;FjJO)ak>DS?aQ2RqvzBn(H0S
zp(m!$v$d01W5#x(j_Q$ji5rrII+c0Xh}l7QXQC=|px2osfV;~_M}HTwkqM!$3zriA
z!Pa{J74)D-bI7JyTCgfDZ+tKx=5zr?(ZQLhPD!u2uwny}SHU^2LF}UoaC$Ohs{|;S
zrYlJ<N}7gKF)P*6S=6hRpdHMjC9}x0CfU9VeI%dW4dx>(%$|gsbIagG0Z8R>mZnI&
zJVB^kCGpIN^?hl&V2*-5^kW)&N`rY$%E=t1s&%x^S*mh6oRo^CbI(?k^a3T_z$u?P
zF4L14^rX1JQq{Ric^w*zs<e@YdX*^SYmxeVm-@*N+P)OpzI4s`t&5Sx2<N{@%q0A)
z10-IaATcySU_)2cw60JWO6YN6l7(3hQp`5N)4@7r9HviZ8>(T6_s09ess>fc&+3?_
z;ZjwUP9Mpa56vAA_xecw^Z5Ikh5w=e>E8*Ht-wkQO)xohz=Bm-+pouSWOv4__eNGf
rBhxc<qk#|Ghwa1mVf(QC|K0u%jf?9TC92uT00000NkvXXu0mjfP?!q8

diff --git a/WebHostLib/static/static/icons/sc2/widowmine-attackrange.png b/WebHostLib/static/static/icons/sc2/widowmine-attackrange.png
deleted file mode 100644
index 8f5e09c6a593845abdc16eb12755f4d2632927aa..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13367
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
N002ovPDHLkV1mnDw5$LC

diff --git a/WebHostLib/static/static/icons/sc2/widowmine-deathblossom.png b/WebHostLib/static/static/icons/sc2/widowmine-deathblossom.png
deleted file mode 100644
index 7097db05e6c0da7760362b090ad385232f2220b9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12946
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
IM6N<$g1}Pepa1{>

diff --git a/WebHostLib/static/static/icons/sc2/widowmine.png b/WebHostLib/static/static/icons/sc2/widowmine.png
deleted file mode 100644
index 802c49a83d882539becb20df50e6d8a360cc6001..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5671
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
N002ovPDHLkV1hnhB6a`(

diff --git a/WebHostLib/static/static/icons/sc2/widowminehidden.png b/WebHostLib/static/static/icons/sc2/widowminehidden.png
deleted file mode 100644
index e568742e8a50c5a1084e6d6de4a43309908f49de..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12777
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

diff --git a/WebHostLib/static/styles/sc2Tracker.css b/WebHostLib/static/styles/sc2Tracker.css
new file mode 100644
index 00000000..29a719a1
--- /dev/null
+++ b/WebHostLib/static/styles/sc2Tracker.css
@@ -0,0 +1,160 @@
+#player-tracker-wrapper{
+    margin: 0;
+}
+
+#tracker-table td {
+    vertical-align: top;
+}
+
+.inventory-table-area{
+    border: 2px solid #000000;
+    border-radius: 4px;
+    padding: 3px 10px 3px 10px;
+}
+
+.inventory-table-area:has(.inventory-table-terran) {
+    width: 690px;
+    background-color: #525494;
+}
+
+.inventory-table-area:has(.inventory-table-zerg) {
+    width: 360px;
+    background-color: #9d60d2;
+}
+
+.inventory-table-area:has(.inventory-table-protoss) {
+    width: 400px;
+    background-color: #d2b260;
+}
+
+#tracker-table .inventory-table td{
+    width: 40px;
+    height: 40px;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.inventory-table td.title{
+    padding-top: 10px;
+    height: 20px;
+    font-family: "JuraBook", monospace;
+    font-size: 16px;
+    font-weight: bold;
+}
+
+.inventory-table img{
+    height: 100%;
+    max-width: 40px;
+    max-height: 40px;
+    border: 1px solid #000000;
+    filter: grayscale(100%) contrast(75%) brightness(20%);
+    background-color: black;
+}
+
+.inventory-table img.acquired{
+    filter: none;
+    background-color: black;
+}
+
+.inventory-table .tint-terran img.acquired {
+    filter: sepia(100%) saturate(300%) brightness(130%) hue-rotate(120deg)
+}
+
+.inventory-table .tint-protoss img.acquired {
+    filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(180deg)
+}
+
+.inventory-table .tint-level-1 img.acquired {
+    filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg)
+}
+
+.inventory-table .tint-level-2 img.acquired {
+    filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) hue-rotate(120deg)
+}
+
+.inventory-table .tint-level-3 img.acquired {
+    filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) hue-rotate(240deg)
+}
+
+.inventory-table div.counted-item {
+    position: relative;
+}
+
+.inventory-table div.item-count {
+    width: 160px;
+    text-align: left;
+    color: black;
+    font-family: "JuraBook", monospace;
+    font-weight: bold;
+}
+
+#location-table{
+    border: 2px solid #000000;
+    border-radius: 4px;
+    background-color: #87b678;
+    padding: 10px 3px 3px;
+    font-family: "JuraBook", monospace;
+    font-size: 16px;
+    font-weight: bold;
+    cursor: default;
+}
+
+#location-table table{
+    width: 100%;
+}
+
+#location-table th{
+    vertical-align: middle;
+    text-align: left;
+    padding-right: 10px;
+}
+
+#location-table td{
+    padding-top: 2px;
+    padding-bottom: 2px;
+    line-height: 20px;
+}
+
+#location-table td.counter {
+    text-align: right;
+    font-size: 14px;
+}
+
+#location-table td.toggle-arrow {
+    text-align: right;
+}
+
+#location-table tr#Total-header {
+    font-weight: bold;
+}
+
+#location-table img{
+    height: 100%;
+    max-width: 30px;
+    max-height: 30px;
+}
+
+#location-table tbody.locations {
+    font-size: 16px;
+}
+
+#location-table td.location-name {
+    padding-left: 16px;
+}
+
+#location-table td:has(.location-column) {
+    vertical-align: top;
+}
+
+#location-table .location-column {
+    width: 100%;
+    height: 100%;
+}
+
+#location-table .location-column .spacer {
+    min-height: 24px;
+}
+
+.hide {
+    display: none;
+}
diff --git a/WebHostLib/static/styles/sc2wolTracker.css b/WebHostLib/static/styles/sc2wolTracker.css
deleted file mode 100644
index a7d8bd28..00000000
--- a/WebHostLib/static/styles/sc2wolTracker.css
+++ /dev/null
@@ -1,112 +0,0 @@
-#player-tracker-wrapper{
-    margin: 0;
-}
-
-#inventory-table{
-    border-top: 2px solid #000000;
-    border-left: 2px solid #000000;
-    border-right: 2px solid #000000;
-    border-top-left-radius: 4px;
-    border-top-right-radius: 4px;
-    padding: 3px 3px 10px;
-    width: 710px;
-    background-color: #525494;
-}
-
-#inventory-table td{
-    width: 40px;
-    height: 40px;
-    text-align: center;
-    vertical-align: middle;
-}
-
-#inventory-table td.title{
-    padding-top: 10px;
-    height: 20px;
-    font-family: "JuraBook", monospace;
-    font-size: 16px;
-    font-weight: bold;
-}
-
-#inventory-table img{
-    height: 100%;
-    max-width: 40px;
-    max-height: 40px;
-    border: 1px solid #000000;
-    filter: grayscale(100%) contrast(75%) brightness(20%);
-    background-color: black;
-}
-
-#inventory-table img.acquired{
-    filter: none;
-    background-color: black;
-}
-
-#inventory-table div.counted-item {
-    position: relative;
-}
-
-#inventory-table div.item-count {
-    text-align: left;
-    color: black;
-    font-family: "JuraBook", monospace;
-    font-weight: bold;
-}
-
-#location-table{
-    width: 710px;
-    border-left: 2px solid #000000;
-    border-right: 2px solid #000000;
-    border-bottom: 2px solid #000000;
-    border-bottom-left-radius: 4px;
-    border-bottom-right-radius: 4px;
-    background-color: #525494;
-    padding: 10px 3px 3px;
-    font-family: "JuraBook", monospace;
-    font-size: 16px;
-    font-weight: bold;
-    cursor: default;
-}
-
-#location-table th{
-    vertical-align: middle;
-    text-align: left;
-    padding-right: 10px;
-}
-
-#location-table td{
-    padding-top: 2px;
-    padding-bottom: 2px;
-    line-height: 20px;
-}
-
-#location-table td.counter {
-    text-align: right;
-    font-size: 14px;
-}
-
-#location-table td.toggle-arrow {
-    text-align: right;
-}
-
-#location-table tr#Total-header {
-    font-weight: bold;
-}
-
-#location-table img{
-    height: 100%;
-    max-width: 30px;
-    max-height: 30px;
-}
-
-#location-table tbody.locations {
-    font-size: 16px;
-}
-
-#location-table td.location-name {
-    padding-left: 16px;
-}
-
-.hide {
-    display: none;
-}
diff --git a/WebHostLib/templates/tracker__Starcraft2.html b/WebHostLib/templates/tracker__Starcraft2.html
new file mode 100644
index 00000000..b4252df2
--- /dev/null
+++ b/WebHostLib/templates/tracker__Starcraft2.html
@@ -0,0 +1,1090 @@
+<!DOCTYPE html>
+{% macro sc2_icon(name) -%}
+    <img src="{{ icons[name] }}" class="{{ 'acquired' if name in acquired_items }}" title="{{ name }}" />
+{% endmacro -%}
+{% macro sc2_progressive_icon(name, url, level) -%}
+    <img src="{{ url }}" class="{{ 'acquired' if name in acquired_items }}" title="{{ name }}{% if level > 0 %} (Level {{ level }}){% endif %}" />
+{% endmacro -%}
+{% macro sc2_progressive_icon_with_custom_name(item_name, url, title) -%}
+    <img src="{{ url }}" class="{{ 'acquired' if item_name in acquired_items }}" title="{{ title }}" />
+{% endmacro -%}
+{%+ macro sc2_tint_level(level) %}
+    tint-level-{{ level }}
+{%+ endmacro %}
+{% macro sc2_render_area(area) %}
+    <tr class="location-category" id="{{area}}_header">
+        <td>{{ area }} {{'▼' if area != 'Total'}}</td>
+        <td class="counter">{{ checks_done[area] }} / {{ checks_in_area[area] }}</td>
+    </tr>
+    <tbody class="locations hide" id="{{area}}">
+    {% for location in location_info[area] %}
+        <tr>
+            <td class="location-name">{{ location }}</td>
+            <td class="counter">{{ '✔' if location_info[area][location] else '' }}</td>
+        </tr>
+    {% endfor %}
+    </tbody>
+{% endmacro -%}
+{% macro sc2_loop_areas(column_index, column_count) %}
+    {% for area in checks_in_area if checks_in_area[area] > 0 and area != 'Total' %}
+        {% if loop.index0 < (loop.length / column_count) * (column_index + 1)
+                and loop.index0 >= (loop.length / column_count) * (column_index) %}
+            {{ sc2_render_area(area) }}
+        {% endif %}
+    {% endfor %}
+{% endmacro -%}
+<html lang="en">
+<head>
+    <title>{{ player_name }}&apos;s Tracker</title>
+    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='styles/sc2Tracker.css') }}"/>
+    <script type="application/ecmascript" src="{{ url_for('static', filename='assets/sc2Tracker.js') }}"></script>
+    <link rel="stylesheet" media="screen" href="https://fontlibrary.org//face/jura" type="text/css"/>
+</head>
+
+<body>
+    {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #}
+    <div style="margin-bottom: 0.5rem">
+        <a href="{{ url_for("get_generic_game_tracker", tracker=room.tracker, tracked_team=team, tracked_player=player) }}">Switch To Generic Tracker</a>
+    </div>
+
+    <div id="player-tracker-wrapper" data-tracker="{{ room.tracker|suuid }}">
+        <table id="tracker-table">
+            <tbody id="inventory-table">
+                <tr>
+                    <td colspan="3" class="inventory-table-area">
+                        <table class="inventory-table">
+                            <tr>
+                                <td colspan="15" class="title">
+                                    <h3>{{ player_name }}&apos;s Starcraft 2 Tracker</h3>
+                                    Starting Resources
+                                </td>
+                            </tr>
+                            <tr>
+                                <td><img src="{{ icons['Starting Minerals'] }}" class="{{ 'acquired' if 'Additional Starting Minerals' in acquired_items }}" title="Starting Minerals" /></td>
+                                <td colspan="2"><div class="item-count">+{{ minerals_count }}</div></td>
+                                <td><img src="{{ icons['Starting Vespene'] }}" class="{{ 'acquired' if 'Additional Starting Vespene' in acquired_items }}" title="Starting Vespene" /></td>
+                                <td colspan="2"><div class="item-count">+{{ vespene_count }}</div></td>
+                                <td><img src="{{ icons['Starting Supply'] }}" class="{{ 'acquired' if 'Additional Starting Supply' in acquired_items }}" title="Starting Supply" /></td>
+                                <td colspan="2"><div class="item-count">+{{ supply_count }}</div></td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="inventory-table-area">
+                        <table class="inventory-table inventory-table-terran">
+                            <tr>
+                                <td colspan="15" class="title">
+                                    Terran
+                                </td>
+                            </tr>
+                            <tr>
+                                <td colspan="15" class="title">
+                                    Weapon & Armor Upgrades
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_progressive_icon('Progressive Terran Infantry Weapon', terran_infantry_weapon_url, terran_infantry_weapon_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Terran Infantry Armor', terran_infantry_armor_url, terran_infantry_armor_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Terran Vehicle Weapon', terran_vehicle_weapon_url, terran_vehicle_weapon_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Terran Vehicle Armor', terran_vehicle_armor_url, terran_vehicle_armor_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Terran Ship Weapon', terran_ship_weapon_url, terran_ship_weapon_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Terran Ship Armor', terran_ship_armor_url, terran_ship_armor_level) }}</td>
+
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Ultra-Capacitors') }}</td>
+                                <td>{{ sc2_icon('Vanadium Plating') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="15" class="title">
+                                    Base
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Bunker') }}</td>
+                                <td>{{ sc2_icon('Projectile Accelerator (Bunker)') }}</td>
+                                <td>{{ sc2_icon('Neosteel Bunker (Bunker)') }}</td>
+                                <td>{{ sc2_icon('Shrike Turret (Bunker)') }}</td>
+                                <td>{{ sc2_icon('Fortified Bunker (Bunker)') }}</td>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Missile Turret') }}</td>
+                                <td>{{ sc2_icon('Titanium Housing (Missile Turret)') }}</td>
+                                <td>{{ sc2_icon('Hellstorm Batteries (Missile Turret)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Tech Reactor') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Orbital Depots') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Command Center Reactor') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Orbital Command', orbital_command_url, orbital_command_name) }}</td>
+                                <td>{{ sc2_icon('Planetary Fortress') }}</td>
+                                <td {% if augmented_thrusters_planetary_fortress_level == 1 %}class="tint-terran"{% endif %}>{{ sc2_progressive_icon_with_custom_name('Progressive Augmented Thrusters (Planetary Fortress)', augmented_thrusters_planetary_fortress_url, augmented_thrusters_planetary_fortress_name) }}</td>
+                                <td>{{ sc2_icon('Advanced Targeting (Planetary Fortress)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Advanced Construction (SCV)') }}</td>
+                                <td>{{ sc2_icon('Dual-Fusion Welders (SCV)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Micro-Filtering') }}</td>
+                                <td>{{ sc2_icon('Automated Refinery') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Sensor Tower') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Perdition Turret') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Hive Mind Emulator') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Psi Disrupter') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="7" class="title">
+                                    Infantry
+                                </td>
+                                <td></td>
+                                <td colspan="7" class="title">
+                                    Vehicles
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Marine') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Marine)', stimpack_marine_url, stimpack_marine_name) }}</td>
+                                <td>{{ sc2_icon('Combat Shield (Marine)') }}</td>
+                                <td>{{ sc2_icon('Laser Targeting System (Marine)') }}</td>
+                                <td>{{ sc2_icon('Magrail Munitions (Marine)') }}</td>
+                                <td>{{ sc2_icon('Optimized Logistics (Marine)') }}</td>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Hellion') }}</td>
+                                <td>{{ sc2_icon('Twin-Linked Flamethrower (Hellion)') }}</td>
+                                <td>{{ sc2_icon('Thermite Filaments (Hellion)') }}</td>
+                                <td>{{ sc2_icon('Hellbat Aspect (Hellion)') }}</td>
+                                <td>{{ sc2_icon('Smart Servos (Hellion)') }}</td>
+                                <td>{{ sc2_icon('Optimized Logistics (Hellion)') }}</td>
+                                <td>{{ sc2_icon('Jump Jets (Hellion)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Medic') }}</td>
+                                <td>{{ sc2_icon('Advanced Medic Facilities (Medic)') }}</td>
+                                <td>{{ sc2_icon('Stabilizer Medpacks (Medic)') }}</td>
+                                <td>{{ sc2_icon('Restoration (Medic)') }}</td>
+                                <td>{{ sc2_icon('Optical Flare (Medic)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Medic)') }}</td>
+                                <td>{{ sc2_icon('Adaptive Medpacks (Medic)') }}</td>
+                                <td></td>
+                                <td></td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Hellion)', stimpack_hellion_url, stimpack_hellion_name) }}</td>
+                                <td>{{ sc2_icon('Infernal Plating (Hellion)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Nano Projector (Medic)') }}</td>
+                                <td colspan="6"></td>
+                                <td>{{ sc2_icon('Vulture') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Replenishable Magazine (Vulture)', replenishable_magazine_vulture_url, replenishable_magazine_vulture_name) }}</td>
+                                <td>{{ sc2_icon('Ion Thrusters (Vulture)') }}</td>
+                                <td>{{ sc2_icon('Auto Launchers (Vulture)') }}</td>
+                                <td>{{ sc2_icon('Auto-Repair (Vulture)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Firebat') }}</td>
+                                <td>{{ sc2_icon('Incinerator Gauntlets (Firebat)') }}</td>
+                                <td>{{ sc2_icon('Juggernaut Plating (Firebat)') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Firebat)', stimpack_firebat_url, stimpack_firebat_name) }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Firebat)') }}</td>
+                                <td>{{ sc2_icon('Infernal Pre-Igniter (Firebat)') }}</td>
+                                <td>{{ sc2_icon('Kinetic Foam (Firebat)') }}</td>
+                                <td colspan="6"></td>
+                                <td>{{ sc2_icon('Cerberus Mine (Spider Mine)') }}</td>
+                                <td>{{ sc2_icon('High Explosive Munition (Spider Mine)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Nano Projectors (Firebat)') }}</td>
+                                <td colspan="6"></td>
+                                <td>{{ sc2_icon('Goliath') }}</td>
+                                <td>{{ sc2_icon('Multi-Lock Weapons System (Goliath)') }}</td>
+                                <td>{{ sc2_icon('Ares-Class Targeting System (Goliath)') }}</td>
+                                <td>{{ sc2_icon('Jump Jets (Goliath)') }}</td>
+                                <td>{{ sc2_icon('Shaped Hull (Goliath)') }}</td>
+                                <td>{{ sc2_icon('Optimized Logistics (Goliath)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Goliath)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Marauder') }}</td>
+                                <td>{{ sc2_icon('Concussive Shells (Marauder)') }}</td>
+                                <td>{{ sc2_icon('Kinetic Foam (Marauder)') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Marauder)', stimpack_marauder_url, stimpack_marauder_name) }}</td>
+                                <td>{{ sc2_icon('Laser Targeting System (Marauder)') }}</td>
+                                <td>{{ sc2_icon('Magrail Munitions (Marauder)') }}</td>
+                                <td>{{ sc2_icon('Internal Tech Module (Marauder)') }}</td>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Internal Tech Module (Goliath)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Juggernaut Plating (Marauder)') }}</td>
+                                <td colspan="6"></td>
+                                <td>{{ sc2_icon('Diamondback') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Tri-Lithium Power Cell (Diamondback)', trilithium_power_cell_diamondback_url, trilithium_power_cell_diamondback_name) }}</td>
+                                <td>{{ sc2_icon('Shaped Hull (Diamondback)') }}</td>
+                                <td>{{ sc2_icon('Hyperfluxor (Diamondback)') }}</td>
+                                <td>{{ sc2_icon('Burst Capacitors (Diamondback)') }}</td>
+                                <td>{{ sc2_icon('Ion Thrusters (Diamondback)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Diamondback)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Reaper') }}</td>
+                                <td>{{ sc2_icon('U-238 Rounds (Reaper)') }}</td>
+                                <td>{{ sc2_icon('G-4 Clusterbomb (Reaper)') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Reaper)', stimpack_reaper_url, stimpack_reaper_name) }}</td>
+                                <td>{{ sc2_icon('Laser Targeting System (Reaper)') }}</td>
+                                <td>{{ sc2_icon('Advanced Cloaking Field (Reaper)') }}</td>
+                                <td>{{ sc2_icon('Spider Mines (Reaper)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Siege Tank') }}</td>
+                                <td>{{ sc2_icon('Maelstrom Rounds (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Shaped Blast (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Jump Jets (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Spider Mines (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Smart Servos (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Graduating Range (Siege Tank)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Combat Drugs (Reaper)') }}</td>
+                                <td>{{ sc2_icon('Jet Pack Overdrive (Reaper)') }}</td>
+                                <td colspan="6"></td>
+                                <td>{{ sc2_icon('Laser Targeting System (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Advanced Siege Tech (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Internal Tech Module (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Shaped Hull (Siege Tank)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Siege Tank)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Ghost') }}</td>
+                                <td>{{ sc2_icon('Ocular Implants (Ghost)') }}</td>
+                                <td>{{ sc2_icon('Crius Suit (Ghost)') }}</td>
+                                <td>{{ sc2_icon('EMP Rounds (Ghost)') }}</td>
+                                <td>{{ sc2_icon('Lockdown (Ghost)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Ghost)') }}</td>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Thor') }}</td>
+                                <td>{{ sc2_icon('330mm Barrage Cannon (Thor)') }}</td>
+                                <td class="{{ sc2_tint_level(immortality_protocol_thor_level) }}">{{ sc2_progressive_icon_with_custom_name('Progressive Immortality Protocol (Thor)', immortality_protocol_thor_url, immortality_protocol_thor_name) }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive High Impact Payload (Thor)', high_impact_payload_thor_url, high_impact_payload_thor_name) }}</td>
+                                <td>{{ sc2_icon('Button With a Skull on It (Thor)') }}</td>
+                                <td>{{ sc2_icon('Laser Targeting System (Thor)') }}</td>
+                                <td>{{ sc2_icon('Large Scale Field Construction (Thor)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Spectre') }}</td>
+                                <td>{{ sc2_icon('Psionic Lash (Spectre)') }}</td>
+                                <td>{{ sc2_icon('Nyx-Class Cloaking Module (Spectre)') }}</td>
+                                <td class="tint-terran">{{ sc2_icon('Impaler Rounds (Spectre)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Spectre)') }}</td>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Predator') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Predator)') }}</td>
+                                <td>{{ sc2_icon('Cloak (Predator)') }}</td>
+                                <td>{{ sc2_icon('Charge (Predator)') }}</td>
+                                <td>{{ sc2_icon('Predator\'s Fury (Predator)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('HERC') }}</td>
+                                <td>{{ sc2_icon('Juggernaut Plating (HERC)') }}</td>
+                                <td>{{ sc2_icon('Kinetic Foam (HERC)') }}</td>
+                                <td colspan="5"></td>
+                                <td>{{ sc2_icon('Widow Mine') }}</td>
+                                <td>{{ sc2_icon('Drilling Claws (Widow Mine)') }}</td>
+                                <td>{{ sc2_icon('Concealment (Widow Mine)') }}</td>
+                                <td>{{ sc2_icon('Black Market Launchers (Widow Mine)') }}</td>
+                                <td>{{ sc2_icon('Executioner Missiles (Widow Mine)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="8"></td>
+                                <td>{{ sc2_icon('Cyclone') }}</td>
+                                <td>{{ sc2_icon('Mag-Field Accelerators (Cyclone)') }}</td>
+                                <td>{{ sc2_icon('Mag-Field Launchers (Cyclone)') }}</td>
+                                <td>{{ sc2_icon('Targeting Optics (Cyclone)') }}</td>
+                                <td>{{ sc2_icon('Rapid Fire Launchers (Cyclone)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Cyclone)') }}</td>
+                                <td>{{ sc2_icon('Internal Tech Module (Cyclone)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="8"></td>
+                                <td>{{ sc2_icon('Warhound') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Warhound)') }}</td>
+                                <td>{{ sc2_icon('Reinforced Plating (Warhound)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="15" class="title">
+                                    Starships
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Medivac') }}</td>
+                                <td>{{ sc2_icon('Rapid Deployment Tube (Medivac)') }}</td>
+                                <td>{{ sc2_icon('Advanced Healing AI (Medivac)') }}</td>
+                                <td>{{ sc2_icon('Expanded Hull (Medivac)') }}</td>
+                                <td>{{ sc2_icon('Afterburners (Medivac)') }}</td>
+                                <td>{{ sc2_icon('Scatter Veil (Medivac)') }}</td>
+                                <td>{{ sc2_icon('Advanced Cloaking Field (Medivac)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Raven') }}</td>
+                                <td>{{ sc2_icon('Bio Mechanical Repair Drone (Raven)') }}</td>
+                                <td>{{ sc2_icon('Spider Mines (Raven)') }}</td>
+                                <td>{{ sc2_icon('Railgun Turret (Raven)') }}</td>
+                                <td>{{ sc2_icon('Hunter-Seeker Weapon (Raven)') }}</td>
+                                <td>{{ sc2_icon('Interference Matrix (Raven)') }}</td>
+                                <td>{{ sc2_icon('Anti-Armor Missile (Raven)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Wraith') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Tomahawk Power Cells (Wraith)', tomahawk_power_cells_wraith_url, tomahawk_power_cells_wraith_name) }}</td>
+                                <td>{{ sc2_icon('Displacement Field (Wraith)') }}</td>
+                                <td>{{ sc2_icon('Advanced Laser Technology (Wraith)') }}</td>
+                                <td>{{ sc2_icon('Trigger Override (Wraith)') }}</td>
+                                <td>{{ sc2_icon('Internal Tech Module (Wraith)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Wraith)') }}</td>
+                                <td></td>
+                                <td></td>
+                                <td>{{ sc2_icon('Internal Tech Module (Raven)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Raven)') }}</td>
+                                <td>{{ sc2_icon('Durable Materials (Raven)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Viking') }}</td>
+                                <td>{{ sc2_icon('Ripwave Missiles (Viking)') }}</td>
+                                <td>{{ sc2_icon('Phobos-Class Weapons System (Viking)') }}</td>
+                                <td>{{ sc2_icon('Smart Servos (Viking)') }}</td>
+                                <td>{{ sc2_icon('Anti-Mechanical Munition (Viking)') }}</td>
+                                <td>{{ sc2_icon('Shredder Rounds (Viking)') }}</td>
+                                <td>{{ sc2_icon('W.I.L.D. Missiles (Viking)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Science Vessel') }}</td>
+                                <td>{{ sc2_icon('EMP Shockwave (Science Vessel)') }}</td>
+                                <td>{{ sc2_icon('Defensive Matrix (Science Vessel)') }}</td>
+                                <td>{{ sc2_icon('Improved Nano-Repair (Science Vessel)') }}</td>
+                                <td>{{ sc2_icon('Advanced AI Systems (Science Vessel)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Banshee') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Cross-Spectrum Dampeners (Banshee)', crossspectrum_dampeners_banshee_url, crossspectrum_dampeners_banshee_name) }}</td>
+                                <td>{{ sc2_icon('Shockwave Missile Battery (Banshee)') }}</td>
+                                <td>{{ sc2_icon('Hyperflight Rotors (Banshee)') }}</td>
+                                <td>{{ sc2_icon('Laser Targeting System (Banshee)') }}</td>
+                                <td>{{ sc2_icon('Internal Tech Module (Banshee)') }}</td>
+                                <td>{{ sc2_icon('Shaped Hull (Banshee)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Hercules') }}</td>
+                                <td>{{ sc2_icon('Internal Fusion Module (Hercules)') }}</td>
+                                <td>{{ sc2_icon('Tactical Jump (Hercules)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Advanced Targeting Optics (Banshee)') }}</td>
+                                <td class="tint-terran">{{ sc2_icon('Distortion Blasters (Banshee)') }}</td>
+                                <td>{{ sc2_icon('Rocket Barrage (Banshee)') }}</td>
+                                <td colspan="4"></td>
+                                <td>{{ sc2_icon('Liberator') }}</td>
+                                <td>{{ sc2_icon('Advanced Ballistics (Liberator)') }}</td>
+                                <td>{{ sc2_icon('Raid Artillery (Liberator)') }}</td>
+                                <td>{{ sc2_icon('Cloak (Liberator)') }}</td>
+                                <td>{{ sc2_icon('Laser Targeting System (Liberator)') }}</td>
+                                <td>{{ sc2_icon('Optimized Logistics (Liberator)') }}</td>
+                                <td>{{ sc2_icon('Smart Servos (Liberator)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Battlecruiser') }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Missile Pods (Battlecruiser)', missile_pods_battlecruiser_url, missile_pods_battlecruiser_level) }}</td>
+                                <td class="{{ sc2_tint_level(defensive_matrix_battlecruiser_level) }}">{{ sc2_progressive_icon_with_custom_name('Progressive Defensive Matrix (Battlecruiser)', defensive_matrix_battlecruiser_url, defensive_matrix_battlecruiser_name) }}</td>
+                                <td>{{ sc2_icon('Tactical Jump (Battlecruiser)') }}</td>
+                                <td>{{ sc2_icon('Cloak (Battlecruiser)') }}</td>
+                                <td>{{ sc2_icon('ATX Laser Battery (Battlecruiser)') }}</td>
+                                <td>{{ sc2_icon('Optimized Logistics (Battlecruiser)') }}</td>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Resource Efficiency (Liberator)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Internal Tech Module (Battlecruiser)') }}</td>
+                                <td>{{ sc2_icon('Behemoth Plating (Battlecruiser)') }}</td>
+                                <td>{{ sc2_icon('Covert Ops Engines (Battlecruiser)') }}</td>
+                                <td colspan="4"></td>
+                                <td>{{ sc2_icon('Valkyrie') }}</td>
+                                <td>{{ sc2_icon('Enhanced Cluster Launchers (Valkyrie)') }}</td>
+                                <td>{{ sc2_icon('Shaped Hull (Valkyrie)') }}</td>
+                                <td>{{ sc2_icon('Flechette Missiles (Valkyrie)') }}</td>
+                                <td>{{ sc2_icon('Afterburners (Valkyrie)') }}</td>
+                                <td>{{ sc2_icon('Launching Vector Compensator (Valkyrie)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Valkyrie)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="15" class="title">
+                                    Mercenaries
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('War Pigs') }}</td>
+                                <td>{{ sc2_icon('Devil Dogs') }}</td>
+                                <td>{{ sc2_icon('Hammer Securities') }}</td>
+                                <td>{{ sc2_icon('Spartan Company') }}</td>
+                                <td>{{ sc2_icon('Siege Breakers') }}</td>
+                                <td>{{ sc2_icon('Hel\'s Angels') }}</td>
+                                <td>{{ sc2_icon('Dusk Wings') }}</td>
+                                <td>{{ sc2_icon('Jackson\'s Revenge') }}</td>
+                                <td>{{ sc2_icon('Skibi\'s Angels') }}</td>
+                                <td>{{ sc2_icon('Death Heads') }}</td>
+                                <td>{{ sc2_icon('Winged Nightmares') }}</td>
+                                <td>{{ sc2_icon('Midnight Riders') }}</td>
+                                <td>{{ sc2_icon('Brynhilds') }}</td>
+                                <td>{{ sc2_icon('Jotun') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="15" class="title">
+                                    General Upgrades
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_progressive_icon('Progressive Fire-Suppression System', firesuppression_system_url, firesuppression_system_level) }}</td>
+                                <td>{{ sc2_icon('Orbital Strike') }}</td>
+                                <td>{{ sc2_icon('Cellular Reactor') }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Regenerative Bio-Steel', regenerative_biosteel_url, regenerative_biosteel_level) }}</td>
+                                <td>{{ sc2_icon('Structure Armor') }}</td>
+                                <td>{{ sc2_icon('Hi-Sec Auto Tracking') }}</td>
+                                <td>{{ sc2_icon('Advanced Optics') }}</td>
+                                <td>{{ sc2_icon('Rogue Forces') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="15" class="title">
+                                    Nova Equipment
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('C20A Canister Rifle (Nova Weapon)') }}</td>
+                                <td>{{ sc2_icon('Hellfire Shotgun (Nova Weapon)') }}</td>
+                                <td>{{ sc2_icon('Plasma Rifle (Nova Weapon)') }}</td>
+                                <td>{{ sc2_icon('Monomolecular Blade (Nova Weapon)') }}</td>
+                                <td>{{ sc2_icon('Blazefire Gunblade (Nova Weapon)') }}</td>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Stim Infusion (Nova Gadget)') }}</td>
+                                <td>{{ sc2_icon('Pulse Grenades (Nova Gadget)') }}</td>
+                                <td>{{ sc2_icon('Flashbang Grenades (Nova Gadget)') }}</td>
+                                <td>{{ sc2_icon('Ionic Force Field (Nova Gadget)') }}</td>
+                                <td>{{ sc2_icon('Holo Decoy (Nova Gadget)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Stealth Suit Module (Nova Suit Module)', stealth_suit_module_nova_suit_module_url, stealth_suit_module_nova_suit_module_name) }}</td>
+                                <td>{{ sc2_icon('Energy Suit Module (Nova Suit Module)') }}</td>
+                                <td>{{ sc2_icon('Armored Suit Module (Nova Suit Module)') }}</td>
+                                <td>{{ sc2_icon('Jump Suit Module (Nova Suit Module)') }}</td>
+                                <td colspan="4"></td>
+                                <td>{{ sc2_icon('Ghost Visor (Nova Equipment)') }}</td>
+                                <td>{{ sc2_icon('Rangefinder Oculus (Nova Equipment)') }}</td>
+                                <td>{{ sc2_icon('Domination (Nova Ability)') }}</td>
+                                <td>{{ sc2_icon('Blink (Nova Ability)') }}</td>
+                                <td>{{ sc2_icon('Tac Nuke Strike (Nova Ability)') }}</td>
+                            </tr>
+                        </table>
+                    </td>
+                    <td class="inventory-table-area">
+                        <table class="inventory-table inventory-table-zerg">
+                            <tr>
+                                <td colspan="8" class="title">
+                                    Zerg
+                                </td>
+                            </tr>
+                            <tr>
+                                <td colspan="8" class="title">
+                                    Weapon & Armor Upgrades
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_progressive_icon('Progressive Zerg Melee Attack', zerg_melee_attack_url, zerg_melee_attack_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Zerg Missile Attack', zerg_missile_attack_url, zerg_missile_attack_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Zerg Ground Carapace', zerg_ground_carapace_url, zerg_ground_carapace_level) }}</td>
+                                <td></td>
+                                <td>{{ sc2_progressive_icon('Progressive Zerg Flyer Attack', zerg_flyer_attack_url, zerg_flyer_attack_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Zerg Flyer Carapace', zerg_flyer_carapace_url, zerg_flyer_carapace_level) }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="8" class="title">
+                                    Base
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Automated Extractors (Kerrigan Tier 3)') }}</td>
+                                <td>{{ sc2_icon('Vespene Efficiency (Kerrigan Tier 5)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Twin Drones (Kerrigan Tier 5)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Improved Overlords (Kerrigan Tier 3)') }}</td>
+                                <td>{{ sc2_icon('Ventral Sacs (Overlord)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Malignant Creep (Kerrigan Tier 5)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Spine Crawler') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Spore Crawler') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="8" class="title">
+                                    Units
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Zergling') }}</td>
+                                <td>{{ sc2_icon('Raptor Strain (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Swarmling Strain (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Hardened Carapace (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Adrenal Overload (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Metabolic Boost (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Shredding Claws (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Zergling Reconstitution (Kerrigan Tier 3)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Baneling Aspect (Zergling)') }}</td>
+                                <td>{{ sc2_icon('Splitter Strain (Baneling)') }}</td>
+                                <td>{{ sc2_icon('Hunter Strain (Baneling)') }}</td>
+                                <td>{{ sc2_icon('Corrosive Acid (Baneling)') }}</td>
+                                <td>{{ sc2_icon('Rupture (Baneling)') }}</td>
+                                <td>{{ sc2_icon('Regenerative Acid (Baneling)') }}</td>
+                                <td>{{ sc2_icon('Centrifugal Hooks (Baneling)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Tunneling Jaws (Baneling)') }}</td>
+                                <td>{{ sc2_icon('Rapid Metamorph (Baneling)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Swarm Queen') }}</td>
+                                <td>{{ sc2_icon('Spawn Larvae (Swarm Queen)') }}</td>
+                                <td>{{ sc2_icon('Deep Tunnel (Swarm Queen)') }}</td>
+                                <td>{{ sc2_icon('Organic Carapace (Swarm Queen)') }}</td>
+                                <td>{{ sc2_icon('Bio-Mechanical Transfusion (Swarm Queen)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Swarm Queen)') }}</td>
+                                <td>{{ sc2_icon('Incubator Chamber (Swarm Queen)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Roach') }}</td>
+                                <td>{{ sc2_icon('Vile Strain (Roach)') }}</td>
+                                <td>{{ sc2_icon('Corpser Strain (Roach)') }}</td>
+                                <td>{{ sc2_icon('Hydriodic Bile (Roach)') }}</td>
+                                <td>{{ sc2_icon('Adaptive Plating (Roach)') }}</td>
+                                <td>{{ sc2_icon('Tunneling Claws (Roach)') }}</td>
+                                <td>{{ sc2_icon('Glial Reconstitution (Roach)') }}</td>
+                                <td>{{ sc2_icon('Organic Carapace (Roach)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Ravager Aspect (Roach)') }}</td>
+                                <td>{{ sc2_icon('Potent Bile (Ravager)') }}</td>
+                                <td>{{ sc2_icon('Bloated Bile Ducts (Ravager)') }}</td>
+                                <td>{{ sc2_icon('Deep Tunnel (Ravager)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Hydralisk') }}</td>
+                                <td>{{ sc2_icon('Frenzy (Hydralisk)') }}</td>
+                                <td>{{ sc2_icon('Ancillary Carapace (Hydralisk)') }}</td>
+                                <td>{{ sc2_icon('Grooved Spines (Hydralisk)') }}</td>
+                                <td>{{ sc2_icon('Muscular Augments (Hydralisk)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Hydralisk)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Impaler Aspect (Hydralisk)') }}</td>
+                                <td>{{ sc2_icon('Adaptive Talons (Impaler)') }}</td>
+                                <td>{{ sc2_icon('Secretion Glands (Impaler)') }}</td>
+                                <td>{{ sc2_icon('Hardened Tentacle Spines (Impaler)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Lurker Aspect (Hydralisk)') }}</td>
+                                <td>{{ sc2_icon('Seismic Spines (Lurker)') }}</td>
+                                <td>{{ sc2_icon('Adapted Spines (Lurker)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Aberration') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Swarm Host') }}</td>
+                                <td>{{ sc2_icon('Carrion Strain (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Creeper Strain (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Burrow (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Rapid Incubation (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Pressurized Glands (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Locust Metabolic Boost (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Enduring Locusts (Swarm Host)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Organic Carapace (Swarm Host)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Swarm Host)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Infestor') }}</td>
+                                <td>{{ sc2_icon('Infested Terran (Infestor)') }}</td>
+                                <td>{{ sc2_icon('Microbial Shroud (Infestor)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Defiler') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Ultralisk') }}</td>
+                                <td>{{ sc2_icon('Noxious Strain (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Torrasque Strain (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Burrow Charge (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Tissue Assimilation (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Monarch Blades (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Anabolic Synthesis (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Chitinous Plating (Ultralisk)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Organic Carapace (Ultralisk)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Ultralisk)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Mutalisk') }}</td>
+                                <td>{{ sc2_icon('Rapid Regeneration (Mutalisk)') }}</td>
+                                <td>{{ sc2_icon('Sundering Glaive (Mutalisk)') }}</td>
+                                <td>{{ sc2_icon('Vicious Glaive (Mutalisk)') }}</td>
+                                <td>{{ sc2_icon('Severing Glaive (Mutalisk)') }}</td>
+                                <td>{{ sc2_icon('Aerodynamic Glaive Shape (Mutalisk)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Corruptor') }}</td>
+                                <td>{{ sc2_icon('Corruption (Corruptor)') }}</td>
+                                <td>{{ sc2_icon('Caustic Spray (Corruptor)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Brood Lord Aspect (Mutalisk/Corruptor)') }}</td>
+                                <td>{{ sc2_icon('Porous Cartilage (Brood Lord)') }}</td>
+                                <td>{{ sc2_icon('Evolved Carapace (Brood Lord)') }}</td>
+                                <td>{{ sc2_icon('Splitter Mitosis (Brood Lord)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Brood Lord)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Viper Aspect (Mutalisk/Corruptor)') }}</td>
+                                <td>{{ sc2_icon('Parasitic Bomb (Viper)') }}</td>
+                                <td>{{ sc2_icon('Paralytic Barbs (Viper)') }}</td>
+                                <td>{{ sc2_icon('Virulent Microbes (Viper)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Guardian Aspect (Mutalisk/Corruptor)') }}</td>
+                                <td>{{ sc2_icon('Prolonged Dispersion (Guardian)') }}</td>
+                                <td>{{ sc2_icon('Primal Adaptation (Guardian)') }}</td>
+                                <td>{{ sc2_icon('Soronan Acid (Guardian)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Devourer Aspect (Mutalisk/Corruptor)') }}</td>
+                                <td>{{ sc2_icon('Corrosive Spray (Devourer)') }}</td>
+                                <td>{{ sc2_icon('Gaping Maw (Devourer)') }}</td>
+                                <td>{{ sc2_icon('Improved Osmosis (Devourer)') }}</td>
+                                <td>{{ sc2_icon('Prescient Spores (Devourer)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Brood Queen') }}</td>
+                                <td>{{ sc2_icon('Fungal Growth (Brood Queen)') }}</td>
+                                <td>{{ sc2_icon('Ensnare (Brood Queen)') }}</td>
+                                <td>{{ sc2_icon('Enhanced Mitochondria (Brood Queen)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Scourge') }}</td>
+                                <td>{{ sc2_icon('Virulent Spores (Scourge)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Scourge)') }}</td>
+                                <td>{{ sc2_icon('Swarm Scourge (Scourge)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="8" class="title">
+                                    Mercenaries
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Infested Medics') }}</td>
+                                <td>{{ sc2_icon('Infested Siege Tanks') }}</td>
+                                <td>{{ sc2_icon('Infested Banshees') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="8" class="title">
+                                    Kerrigan
+                                </td>
+                            </tr>
+                            <tr>
+                                <td colspan="7"><div class="item-count">Level: {{ kerrigan_level }}</div></td>
+                                <td>{{ sc2_icon('Primal Form (Kerrigan)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Kinetic Blast (Kerrigan Tier 1)') }}</td>
+                                <td>{{ sc2_icon('Heroic Fortitude (Kerrigan Tier 1)') }}</td>
+                                <td>{{ sc2_icon('Leaping Strike (Kerrigan Tier 1)') }}</td>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Crushing Grip (Kerrigan Tier 2)') }}</td>
+                                <td>{{ sc2_icon('Chain Reaction (Kerrigan Tier 2)') }}</td>
+                                <td>{{ sc2_icon('Psionic Shift (Kerrigan Tier 2)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Wild Mutation (Kerrigan Tier 4)') }}</td>
+                                <td>{{ sc2_icon('Spawn Banelings (Kerrigan Tier 4)') }}</td>
+                                <td>{{ sc2_icon('Mend (Kerrigan Tier 4)') }}</td>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Infest Broodlings (Kerrigan Tier 6)') }}</td>
+                                <td>{{ sc2_icon('Fury (Kerrigan Tier 6)') }}</td>
+                                <td>{{ sc2_icon('Ability Efficiency (Kerrigan Tier 6)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Apocalypse (Kerrigan Tier 7)') }}</td>
+                                <td>{{ sc2_icon('Spawn Leviathan (Kerrigan Tier 7)') }}</td>
+                                <td>{{ sc2_icon('Drop-Pods (Kerrigan Tier 7)') }}</td>
+                            </tr>
+                        </table>
+                    </td>
+                    <td class="inventory-table-area">
+                        <table class="inventory-table inventory-table-protoss">
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Protoss
+                                </td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Weapon & Armor Upgrades
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_progressive_icon('Progressive Protoss Ground Weapon', protoss_ground_weapon_url, protoss_ground_weapon_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Protoss Ground Armor', protoss_ground_armor_url, protoss_ground_armor_level) }}</td>
+                                <td></td>
+                                <td>{{ sc2_progressive_icon('Progressive Protoss Air Weapon', protoss_air_weapon_url, protoss_air_weapon_level) }}</td>
+                                <td>{{ sc2_progressive_icon('Progressive Protoss Air Armor', protoss_air_armor_url, protoss_air_armor_level) }}</td>
+                                <td></td>
+                                <td>{{ sc2_progressive_icon('Progressive Protoss Shields', protoss_shields_url, protoss_shields_level) }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Quatro') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Base
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Photon Cannon') }}</td>
+                                <td>{{ sc2_icon('Khaydarin Monolith') }}</td>
+                                <td>{{ sc2_icon('Shield Battery') }}</td>
+                                <td>{{ sc2_icon('Enhanced Targeting') }}</td>
+                                <td>{{ sc2_icon('Optimized Ordnance') }}</td>
+                                <td>{{ sc2_icon('Khalai Ingenuity') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Orbital Assimilators') }}</td>
+                                <td>{{ sc2_icon('Amplified Assimilators') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Warp Harmonization') }}</td>
+                                <td>{{ sc2_icon('Superior Warp Gates') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Nexus Overcharge') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Gateway
+                                </td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Zealot') }}</td>
+                                <td>{{ sc2_icon('Centurion') }}</td>
+                                <td>{{ sc2_icon('Sentinel') }}</td>
+                                <td>{{ sc2_icon('Leg Enhancements (Zealot/Sentinel/Centurion)') }}</td>
+                                <td>{{ sc2_icon('Shield Capacity (Zealot/Sentinel/Centurion)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Supplicant') }}</td>
+                                <td>{{ sc2_icon('Blood Shield (Supplicant)') }}</td>
+                                <td>{{ sc2_icon('Soul Augmentation (Supplicant)') }}</td>
+                                <td>{{ sc2_icon('Shield Regeneration (Supplicant)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Sentry') }}</td>
+                                <td>{{ sc2_icon('Force Field (Sentry)') }}</td>
+                                <td>{{ sc2_icon('Hallucination (Sentry)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Energizer') }}</td>
+                                <td>{{ sc2_icon('Reclamation (Energizer)') }}</td>
+                                <td>{{ sc2_icon('Forged Chassis (Energizer)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Cloaking Module (Sentry/Energizer/Havoc)') }}</td>
+                                <td>{{ sc2_icon('Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Havoc') }}</td>
+                                <td>{{ sc2_icon('Detect Weakness (Havoc)') }}</td>
+                                <td>{{ sc2_icon('Bloodshard Resonance (Havoc)') }}</td>
+                            </tr>
+                            <tr>
+                                <td></td>
+                                <td>{{ sc2_icon('Stalker') }}</td>
+                                <td>{{ sc2_icon('Instigator') }}</td>
+                                <td>{{ sc2_icon('Slayer') }}</td>
+                                <td>{{ sc2_icon('Disintegrating Particles (Stalker/Instigator/Slayer)') }}</td>
+                                <td>{{ sc2_icon('Particle Reflection (Stalker/Instigator/Slayer)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Dragoon') }}</td>
+                                <td>{{ sc2_icon('High Impact Phase Disruptor (Dragoon)') }}</td>
+                                <td>{{ sc2_icon('Trillic Compression System (Dragoon)') }}</td>
+                                <td>{{ sc2_icon('Singularity Charge (Dragoon)') }}</td>
+                                <td>{{ sc2_icon('Enhanced Strider Servos (Dragoon)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Adept') }}</td>
+                                <td>{{ sc2_icon('Shockwave (Adept)') }}</td>
+                                <td>{{ sc2_icon('Resonating Glaives (Adept)') }}</td>
+                                <td>{{ sc2_icon('Phase Bulwark (Adept)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('High Templar') }}</td>
+                                <td>{{ sc2_icon('Signifier') }}</td>
+                                <td class="tint-protoss">{{ sc2_icon('Unshackled Psionic Storm (High Templar/Signifier)') }}</td>
+                                <td>{{ sc2_icon('Hallucination (High Templar/Signifier)') }}</td>
+                                <td>{{ sc2_icon('Khaydarin Amulet (High Templar/Signifier)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('High Archon (Archon)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Ascendant') }}</td>
+                                <td>{{ sc2_icon('Power Overwhelming (Ascendant)') }}</td>
+                                <td>{{ sc2_icon('Chaotic Attunement (Ascendant)') }}</td>
+                                <td>{{ sc2_icon('Blood Amulet (Ascendant)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Dark Archon') }}</td>
+                                <td>{{ sc2_icon('Feedback (Dark Archon)') }}</td>
+                                <td>{{ sc2_icon('Maelstrom (Dark Archon)') }}</td>
+                                <td>{{ sc2_icon('Argus Talisman (Dark Archon)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Dark Templar') }}</td>
+                                <td>{{ sc2_icon('Dark Archon Meld (Dark Templar)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Avenger') }}</td>
+                                <td>{{ sc2_icon('Blood Hunter') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Shroud of Adun (Dark Templar/Avenger/Blood Hunter)') }}</td>
+                                <td>{{ sc2_icon('Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)') }}</td>
+                                <td>{{ sc2_icon('Blink (Dark Templar/Avenger/Blood Hunter)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Dark Templar/Avenger/Blood Hunter)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Robotics Facility
+                                </td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Warp Prism') }}</td>
+                                <td>{{ sc2_icon('Gravitic Drive (Warp Prism)') }}</td>
+                                <td>{{ sc2_icon('Phase Blaster (Warp Prism)') }}</td>
+                                <td>{{ sc2_icon('War Configuration (Warp Prism)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Immortal') }}</td>
+                                <td>{{ sc2_icon('Annihilator') }}</td>
+                                <td>{{ sc2_icon('Singularity Charge (Immortal/Annihilator)') }}</td>
+                                <td>{{ sc2_icon('Advanced Targeting Mechanics (Immortal/Annihilator)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Vanguard') }}</td>
+                                <td>{{ sc2_icon('Agony Launchers (Vanguard)') }}</td>
+                                <td>{{ sc2_icon('Matter Dispersion (Vanguard)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Colossus') }}</td>
+                                <td>{{ sc2_icon('Pacification Protocol (Colossus)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Wrathwalker') }}</td>
+                                <td>{{ sc2_icon('Rapid Power Cycling (Wrathwalker)') }}</td>
+                                <td>{{ sc2_icon('Eye of Wrath (Wrathwalker)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Observer') }}</td>
+                                <td>{{ sc2_icon('Gravitic Boosters (Observer)') }}</td>
+                                <td>{{ sc2_icon('Sensor Array (Observer)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Reaver') }}</td>
+                                <td>{{ sc2_icon('Scarab Damage (Reaver)') }}</td>
+                                <td>{{ sc2_icon('Solarite Payload (Reaver)') }}</td>
+                                <td>{{ sc2_icon('Reaver Capacity (Reaver)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Reaver)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Disruptor') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Stargate
+                                </td>
+                            </tr>
+                            <tr>
+                                <td colspan="2"></td>
+                                <td>{{ sc2_icon('Phoenix') }}</td>
+                                <td>{{ sc2_icon('Mirage') }}</td>
+                                <td>{{ sc2_icon('Ionic Wavelength Flux (Phoenix/Mirage)') }}</td>
+                                <td>{{ sc2_icon('Anion Pulse-Crystals (Phoenix/Mirage)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Corsair') }}</td>
+                                <td>{{ sc2_icon('Stealth Drive (Corsair)') }}</td>
+                                <td>{{ sc2_icon('Argus Jewel (Corsair)') }}</td>
+                                <td>{{ sc2_icon('Sustaining Disruption (Corsair)') }}</td>
+                                <td>{{ sc2_icon('Neutron Shields (Corsair)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Destroyer') }}</td>
+                                <td>{{ sc2_icon('Reforged Bloodshard Core (Destroyer)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Void Ray') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Flux Vanes (Void Ray/Destroyer)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Carrier') }}</td>
+                                <td>{{ sc2_icon('Graviton Catapult (Carrier)') }}</td>
+                                <td>{{ sc2_icon('Hull of Past Glories (Carrier)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Scout') }}</td>
+                                <td>{{ sc2_icon('Combat Sensor Array (Scout)') }}</td>
+                                <td>{{ sc2_icon('Apial Sensors (Scout)') }}</td>
+                                <td>{{ sc2_icon('Gravitic Thrusters (Scout)') }}</td>
+                                <td>{{ sc2_icon('Advanced Photon Blasters (Scout)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Tempest') }}</td>
+                                <td>{{ sc2_icon('Tectonic Destabilizers (Tempest)') }}</td>
+                                <td>{{ sc2_icon('Quantic Reactor (Tempest)') }}</td>
+                                <td>{{ sc2_icon('Gravity Sling (Tempest)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Mothership') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Arbiter') }}</td>
+                                <td>{{ sc2_icon('Chronostatic Reinforcement (Arbiter)') }}</td>
+                                <td>{{ sc2_icon('Khaydarin Core (Arbiter)') }}</td>
+                                <td>{{ sc2_icon('Spacetime Anchor (Arbiter)') }}</td>
+                                <td>{{ sc2_icon('Resource Efficiency (Arbiter)') }}</td>
+                                <td>{{ sc2_icon('Enhanced Cloak Field (Arbiter)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="3"></td>
+                                <td>{{ sc2_icon('Oracle') }}</td>
+                                <td>{{ sc2_icon('Stealth Drive (Oracle)') }}</td>
+                                <td>{{ sc2_icon('Stasis Calibration (Oracle)') }}</td>
+                                <td>{{ sc2_icon('Temporal Acceleration Beam (Oracle)') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    General Upgrades
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Matrix Overload') }}</td>
+                                <td>{{ sc2_icon('Guardian Shell') }}</td>
+                            </tr>
+                            <tr>
+                                <td colspan="9" class="title">
+                                    Spear of Adun
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Chrono Surge (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_progressive_icon_with_custom_name('Progressive Proxy Pylon (Spear of Adun Calldown)', proxy_pylon_spear_of_adun_calldown_url, proxy_pylon_spear_of_adun_calldown_name) }}</td>
+                                <td>{{ sc2_icon('Pylon Overcharge (Spear of Adun Calldown)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Mass Recall (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_icon('Shield Overcharge (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_icon('Deploy Fenix (Spear of Adun Calldown)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Reconstruction Beam (Spear of Adun Auto-Cast)') }}</td>
+                            </tr>
+                            <tr>
+                                <td>{{ sc2_icon('Orbital Strike (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_icon('Temporal Field (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_icon('Solar Lance (Spear of Adun Calldown)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Purifier Beam (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_icon('Time Stop (Spear of Adun Calldown)') }}</td>
+                                <td>{{ sc2_icon('Solar Bombardment (Spear of Adun Calldown)') }}</td>
+                                <td></td>
+                                <td>{{ sc2_icon('Overwatch (Spear of Adun Auto-Cast)') }}</td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+            </tbody>
+            <tr>
+                <td colspan="3" id="location-table">
+                    <table>
+                        <tr>
+                            <td>
+                                <table class="location-column">
+                                    {{ sc2_loop_areas(0, 3) }}
+                                </table>
+                            </td>
+                            <td>
+                                <table class="location-column">
+                                    {{ sc2_loop_areas(1, 3) }}
+                                </table>
+                            </td>
+                            <td>
+                                <table class="location-column">
+                                    {{ sc2_loop_areas(2, 3) }}
+                                    <tr><td class="spacer">&nbsp;</td></tr>
+                                    {{ sc2_render_area('Total') }}
+                                </table>
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+            </tr>
+        </table>
+    </div>
+</body>
+</html>
diff --git a/WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html b/WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html
deleted file mode 100644
index c27f690d..00000000
--- a/WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html
+++ /dev/null
@@ -1,366 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <title>{{ player_name }}&apos;s Tracker</title>
-    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='styles/sc2wolTracker.css') }}"/>
-    <script type="application/ecmascript" src="{{ url_for('static', filename='assets/sc2wolTracker.js') }}"></script>
-    <link rel="stylesheet" media="screen" href="https://fontlibrary.org//face/jura" type="text/css"/>
-</head>
-
-<body>
-    {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #}
-    <div style="margin-bottom: 0.5rem">
-        <a href="{{ url_for("get_generic_game_tracker", tracker=room.tracker, tracked_team=team, tracked_player=player) }}">Switch To Generic Tracker</a>
-    </div>
-
-    <div id="player-tracker-wrapper" data-tracker="{{ room.tracker|suuid }}">
-        <table id="inventory-table">
-            <tr>
-                <td colspan="15" class="title">
-                    Starting Resources
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Starting Minerals'] }}" class="{{ 'acquired' if '+15 Starting Minerals' in acquired_items }}" title="Starting Minerals" /></td>
-                <td colspan="2"><div class="item-count">+{{ minerals_count }}</div></td>
-                <td><img src="{{ icons['Starting Vespene'] }}" class="{{ 'acquired' if '+15 Starting Vespene' in acquired_items }}" title="Starting Vespene" /></td>
-                <td colspan="2"><div class="item-count">+{{ vespene_count }}</div></td>
-                <!--
-                <td><img src="{{ icons['Starting Supply'] }}" class="{{ 'acquired' if '+2 Starting Supply' in acquired_items }}" title="Starting Supply" /></td>
-                <td colspan="2"><div class="item-count">+{{ supply_count }}</div></td>
-                -->
-            </tr>
-            <tr>
-                <td colspan="15" class="title">
-                    Weapon & Armor Upgrades
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ infantry_weapon_url }}" class="{{ 'acquired' if 'Progressive Infantry Weapon' in acquired_items }}" title="Progressive Infantry Weapons{% if infantry_weapon_level > 0 %} (Level {{ infantry_weapon_level }}){% endif %}" /></td>
-                <td><img src="{{ infantry_armor_url }}" class="{{ 'acquired' if 'Progressive Infantry Armor' in acquired_items }}" title="Progressive Infantry Armor{% if infantry_armor_level > 0 %} (Level {{ infantry_armor_level }}){% endif %}" /></td>
-                <td><img src="{{ vehicle_weapon_url }}" class="{{ 'acquired' if 'Progressive Vehicle Weapon' in acquired_items }}" title="Progressive Vehicle Weapons{% if vehicle_weapon_level > 0 %} (Level {{ vehicle_weapon_level }}){% endif %}" /></td>
-                <td><img src="{{ vehicle_armor_url }}" class="{{ 'acquired' if 'Progressive Vehicle Armor' in acquired_items }}" title="Progressive Vehicle Armor{% if vehicle_armor_level > 0 %} (Level {{ vehicle_armor_level }}){% endif %}" /></td>
-                <td><img src="{{ ship_weapon_url }}" class="{{ 'acquired' if 'Progressive Ship Weapon' in acquired_items }}" title="Progressive Ship Weapons{% if ship_weapon_level > 0 %} (Level {{ ship_weapon_level }}){% endif %}" /></td>
-                <td><img src="{{ ship_armor_url }}" class="{{ 'acquired' if 'Progressive Ship Armor' in acquired_items }}" title="Progressive Ship Armor{% if ship_armor_level > 0 %} (Level {{ ship_armor_level }}){% endif %}" /></td>
-                <td colspan="2"></td>
-                <td><img src="{{ icons['Ultra-Capacitors'] }}" class="{{ 'acquired' if 'Ultra-Capacitors' in acquired_items }}" title="Ultra-Capacitors" /></td>
-                <td><img src="{{ icons['Vanadium Plating'] }}" class="{{ 'acquired' if 'Vanadium Plating' in acquired_items }}" title="Vanadium Plating" /></td>
-            </tr>
-            <tr>
-                <td colspan="15" class="title">
-                    Base
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Bunker'] }}" class="{{ 'acquired' if 'Bunker' in acquired_items }}" title="Bunker" /></td>
-                <td><img src="{{ icons['Projectile Accelerator (Bunker)'] }}" class="{{ 'acquired' if 'Projectile Accelerator (Bunker)' in acquired_items }}" title="Projectile Accelerator (Bunker)" /></td>
-                <td><img src="{{ icons['Neosteel Bunker (Bunker)'] }}" class="{{ 'acquired' if 'Neosteel Bunker (Bunker)' in acquired_items }}" title="Neosteel Bunker (Bunker)" /></td>
-                <td><img src="{{ icons['Shrike Turret (Bunker)'] }}" class="{{ 'acquired' if 'Shrike Turret (Bunker)' in acquired_items }}" title="Shrike Turret (Bunker)" /></td>
-                <td><img src="{{ icons['Fortified Bunker (Bunker)'] }}" class="{{ 'acquired' if 'Fortified Bunker (Bunker)' in acquired_items }}" title="Fortified Bunker (Bunker)" /></td>
-                <td colspan="3"></td>
-                <td><img src="{{ icons['Missile Turret'] }}" class="{{ 'acquired' if 'Missile Turret' in acquired_items }}" title="Missile Turret" /></td>
-                <td><img src="{{ icons['Titanium Housing (Missile Turret)'] }}" class="{{ 'acquired' if 'Titanium Housing (Missile Turret)' in acquired_items }}" title="Titanium Housing (Missile Turret)" /></td>
-                <td><img src="{{ icons['Hellstorm Batteries (Missile Turret)'] }}" class="{{ 'acquired' if 'Hellstorm Batteries (Missile Turret)' in acquired_items }}" title="Hellstorm Batteries (Missile Turret)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Orbital Command (Building)'] }}" class="{{ 'acquired' if 'Orbital Command (Building)' in acquired_items }}" title="Orbital Command (Building)" /></td>
-                <td><img src="{{ icons['Command Center Reactor'] }}" class="{{ 'acquired' if 'Command Center Reactor' in acquired_items }}" title="Command Center Reactor" /></td>
-                <td><img src="{{ icons['Planetary Fortress'] }}" class="{{ 'acquired' if 'Planetary Fortress' in acquired_items }}" title="Planetary Fortress" /></td>
-                <td></td>
-                <td><img src="{{ icons['Advanced Construction (SCV)'] }}" class="{{ 'acquired' if 'Advanced Construction (SCV)' in acquired_items }}" title="Advanced Construction (SCV)" /></td>
-                <td><img src="{{ icons['Dual-Fusion Welders (SCV)'] }}" class="{{ 'acquired' if 'Dual-Fusion Welders (SCV)' in acquired_items }}" title="Dual-Fusion Welders (SCV)" /></td>
-                <td></td>
-                <td><img src="{{ icons['Micro-Filtering'] }}" class="{{ 'acquired' if 'Micro-Filtering' in acquired_items }}" title="Micro-Filtering" /></td>
-                <td><img src="{{ icons['Automated Refinery'] }}" class="{{ 'acquired' if 'Automated Refinery' in acquired_items }}" title="Automated Refinery" /></td>
-                <td></td>
-                <td><img src="{{ icons['Tech Reactor'] }}" class="{{ 'acquired' if 'Tech Reactor' in acquired_items }}" title="Tech Reactor" /></td>
-                <td></td>
-                <td><img src="{{ icons['Orbital Depots'] }}" class="{{ 'acquired' if 'Orbital Depots' in acquired_items }}" title="Orbital Depots" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Sensor Tower'] }}" class="{{ 'acquired' if 'Sensor Tower' in acquired_items }}" title="Sensor Tower" /></td>
-                <td></td>
-                <td><img src="{{ icons['Perdition Turret'] }}" class="{{ 'acquired' if 'Perdition Turret' in acquired_items }}" title="Perdition Turret" /></td>
-                <td></td>
-                <td><img src="{{ icons['Hive Mind Emulator'] }}" class="{{ 'acquired' if 'Hive Mind Emulator' in acquired_items }}" title="Hive Mind Emulator" /></td>
-                <td></td>
-                <td><img src="{{ icons['Psi Disrupter'] }}" class="{{ 'acquired' if 'Psi Disrupter' in acquired_items }}" title="Psi Disrupter" /></td>
-            </tr>
-            <tr>
-                <td colspan="7" class="title">
-                    Infantry
-                </td>
-                <td></td>
-                <td colspan="7" class="title">
-                    Vehicles
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Marine'] }}" class="{{ 'acquired' if 'Marine' in acquired_items }}" title="Marine" /></td>
-                <td><img src="{{ stimpack_marine_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Marine)' in acquired_items }}" title="{{ stimpack_marine_name }}" /></td>
-                <td><img src="{{ icons['Combat Shield (Marine)'] }}" class="{{ 'acquired' if 'Combat Shield (Marine)' in acquired_items }}" title="Combat Shield (Marine)" /></td>
-                <td><img src="{{ icons['Laser Targeting System (Marine)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Marine)' in acquired_items }}" title="Laser Targeting System (Marine)" /></td>
-                <td><img src="{{ icons['Magrail Munitions (Marine)'] }}" class="{{ 'acquired' if 'Magrail Munitions (Marine)' in acquired_items }}" title="Magrail Munitions (Marine)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Marine)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Marine)' in acquired_items }}" title="Optimized Logistics (Marine)" /></td>
-                <td colspan="2"></td>
-                <td><img src="{{ icons['Hellion'] }}" class="{{ 'acquired' if 'Hellion' in acquired_items }}" title="Hellion" /></td>
-                <td><img src="{{ icons['Twin-Linked Flamethrower (Hellion)'] }}" class="{{ 'acquired' if 'Twin-Linked Flamethrower (Hellion)' in acquired_items }}" title="Twin-Linked Flamethrower (Hellion)" /></td>
-                <td><img src="{{ icons['Thermite Filaments (Hellion)'] }}" class="{{ 'acquired' if 'Thermite Filaments (Hellion)' in acquired_items }}" title="Thermite Filaments (Hellion)" /></td>
-                <td><img src="{{ icons['Hellbat Aspect (Hellion)'] }}" class="{{ 'acquired' if 'Hellbat Aspect (Hellion)' in acquired_items }}" title="Hellbat Aspect (Hellion)" /></td>
-                <td><img src="{{ icons['Smart Servos (Hellion)'] }}" class="{{ 'acquired' if 'Smart Servos (Hellion)' in acquired_items }}" title="Smart Servos (Hellion)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Hellion)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Hellion)' in acquired_items }}" title="Optimized Logistics (Hellion)" /></td>
-                <td><img src="{{ icons['Jump Jets (Hellion)'] }}" class="{{ 'acquired' if 'Jump Jets (Hellion)' in acquired_items }}" title="Jump Jets (Hellion)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Medic'] }}" class="{{ 'acquired' if 'Medic' in acquired_items }}" title="Medic" /></td>
-                <td><img src="{{ icons['Advanced Medic Facilities (Medic)'] }}" class="{{ 'acquired' if 'Advanced Medic Facilities (Medic)' in acquired_items }}" title="Advanced Medic Facilities (Medic)" /></td>
-                <td><img src="{{ icons['Stabilizer Medpacks (Medic)'] }}" class="{{ 'acquired' if 'Stabilizer Medpacks (Medic)' in acquired_items }}" title="Stabilizer Medpacks (Medic)" /></td>
-                <td><img src="{{ icons['Restoration (Medic)'] }}" class="{{ 'acquired' if 'Restoration (Medic)' in acquired_items }}" title="Restoration (Medic)" /></td>
-                <td><img src="{{ icons['Optical Flare (Medic)'] }}" class="{{ 'acquired' if 'Optical Flare (Medic)' in acquired_items }}" title="Optical Flare (Medic)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Medic)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Medic)' in acquired_items }}" title="Optimized Logistics (Medic)" /></td>
-                <td colspan="2"></td>
-                <td></td>
-                <td><img src="{{ stimpack_hellion_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Hellion)' in acquired_items }}" title="{{ stimpack_hellion_name }}" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Firebat'] }}" class="{{ 'acquired' if 'Firebat' in acquired_items }}" title="Firebat" /></td>
-                <td><img src="{{ icons['Incinerator Gauntlets (Firebat)'] }}" class="{{ 'acquired' if 'Incinerator Gauntlets (Firebat)' in acquired_items }}" title="Incinerator Gauntlets (Firebat)" /></td>
-                <td><img src="{{ icons['Juggernaut Plating (Firebat)'] }}" class="{{ 'acquired' if 'Juggernaut Plating (Firebat)' in acquired_items }}" title="Juggernaut Plating (Firebat)" /></td>
-                <td><img src="{{ stimpack_firebat_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Firebat)' in acquired_items }}" title="{{ stimpack_firebat_name }}" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Firebat)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Firebat)' in acquired_items }}" title="Optimized Logistics (Firebat)" /></td>
-                <td colspan="3"></td>
-                <td><img src="{{ icons['Vulture'] }}" class="{{ 'acquired' if 'Vulture' in acquired_items }}" title="Vulture" /></td>
-                <td><img src="{{ icons['Replenishable Magazine (Vulture)'] }}" class="{{ 'acquired' if 'Replenishable Magazine (Vulture)' in acquired_items }}" title="Replenishable Magazine (Vulture)" /></td>
-                <td><img src="{{ icons['Ion Thrusters (Vulture)'] }}" class="{{ 'acquired' if 'Ion Thrusters (Vulture)' in acquired_items }}" title="Ion Thrusters (Vulture)" /></td>
-                <td><img src="{{ icons['Auto Launchers (Vulture)'] }}" class="{{ 'acquired' if 'Auto Launchers (Vulture)' in acquired_items }}" title="Auto Launchers (Vulture)" /></td>
-                <td></td>
-                <td><img src="{{ icons['Cerberus Mine (Spider Mine)'] }}" class="{{ 'acquired' if 'Cerberus Mine (Spider Mine)' in acquired_items }}" title="Cerberus Mine (Spider Mine)" /></td>
-                <td><img src="{{ icons['High Explosive Munition (Spider Mine)'] }}" class="{{ 'acquired' if 'High Explosive Munition (Spider Mine)' in acquired_items }}" title="High Explosive Munition (Spider Mine)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Marauder'] }}" class="{{ 'acquired' if 'Marauder' in acquired_items }}" title="Marauder" /></td>
-                <td><img src="{{ icons['Concussive Shells (Marauder)'] }}" class="{{ 'acquired' if 'Concussive Shells (Marauder)' in acquired_items }}" title="Concussive Shells (Marauder)" /></td>
-                <td><img src="{{ icons['Kinetic Foam (Marauder)'] }}" class="{{ 'acquired' if 'Kinetic Foam (Marauder)' in acquired_items }}" title="Kinetic Foam (Marauder)" /></td>
-                <td><img src="{{ stimpack_marauder_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Marauder)' in acquired_items }}" title="{{ stimpack_marauder_name }}" /></td>
-                <td><img src="{{ icons['Laser Targeting System (Marauder)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Marauder)' in acquired_items }}" title="Laser Targeting System (Marauder)" /></td>
-                <td><img src="{{ icons['Magrail Munitions (Marauder)'] }}" class="{{ 'acquired' if 'Magrail Munitions (Marauder)' in acquired_items }}" title="Magrail Munitions (Marauder)" /></td>
-                <td><img src="{{ icons['Internal Tech Module (Marauder)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Marauder)' in acquired_items }}" title="Internal Tech Module (Marauder)" /></td>
-                <td></td>
-                <td><img src="{{ icons['Goliath'] }}" class="{{ 'acquired' if 'Goliath' in acquired_items }}" title="Goliath" /></td>
-                <td><img src="{{ icons['Multi-Lock Weapons System (Goliath)'] }}" class="{{ 'acquired' if 'Multi-Lock Weapons System (Goliath)' in acquired_items }}" title="Multi-Lock Weapons System (Goliath)" /></td>
-                <td><img src="{{ icons['Ares-Class Targeting System (Goliath)'] }}" class="{{ 'acquired' if 'Ares-Class Targeting System (Goliath)' in acquired_items }}" title="Ares-Class Targeting System (Goliath)" /></td>
-                <td><img src="{{ icons['Jump Jets (Goliath)'] }}" class="{{ 'acquired' if 'Jump Jets (Goliath)' in acquired_items }}" title="Jump Jets (Goliath)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Goliath)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Goliath)' in acquired_items }}" title="Optimized Logistics (Goliath)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Reaper'] }}" class="{{ 'acquired' if 'Reaper' in acquired_items }}" title="Reaper" /></td>
-                <td><img src="{{ icons['U-238 Rounds (Reaper)'] }}" class="{{ 'acquired' if 'U-238 Rounds (Reaper)' in acquired_items }}" title="U-238 Rounds (Reaper)" /></td>
-                <td><img src="{{ icons['G-4 Clusterbomb (Reaper)'] }}" class="{{ 'acquired' if 'G-4 Clusterbomb (Reaper)' in acquired_items }}" title="G-4 Clusterbomb (Reaper)" /></td>
-                <td><img src="{{ stimpack_reaper_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Reaper)' in acquired_items }}" title="{{ stimpack_reaper_name }}" /></td>
-                <td><img src="{{ icons['Laser Targeting System (Reaper)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Reaper)' in acquired_items }}" title="Laser Targeting System (Reaper)" /></td>
-                <td><img src="{{ icons['Advanced Cloaking Field (Reaper)'] }}" class="{{ 'acquired' if 'Advanced Cloaking Field (Reaper)' in acquired_items }}" title="Advanced Cloaking Field (Reaper)" /></td>
-                <td><img src="{{ icons['Spider Mines (Reaper)'] }}" class="{{ 'acquired' if 'Spider Mines (Reaper)' in acquired_items }}" title="Spider Mines (Reaper)" /></td>
-                <td></td>
-                <td><img src="{{ icons['Diamondback'] }}" class="{{ 'acquired' if 'Diamondback' in acquired_items }}" title="Diamondback" /></td>
-                <td><img src="{{ icons['Tri-Lithium Power Cell (Diamondback)'] }}" class="{{ 'acquired' if 'Tri-Lithium Power Cell (Diamondback)' in acquired_items }}" title="Tri-Lithium Power Cell (Diamondback)" /></td>
-                <td><img src="{{ icons['Shaped Hull (Diamondback)'] }}" class="{{ 'acquired' if 'Shaped Hull (Diamondback)' in acquired_items }}" title="Shaped Hull (Diamondback)" /></td>
-                <td><img src="{{ icons['Hyperfluxor (Diamondback)'] }}" class="{{ 'acquired' if 'Hyperfluxor (Diamondback)' in acquired_items }}" title="Hyperfluxor (Diamondback)" /></td>
-                <td><img src="{{ icons['Burst Capacitors (Diamondback)'] }}" class="{{ 'acquired' if 'Burst Capacitors (Diamondback)' in acquired_items }}" title="Burst Capacitors (Diamondback)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Diamondback)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Diamondback)' in acquired_items }}" title="Optimized Logistics (Diamondback)" /></td>
-            </tr>
-            <tr>
-                <td></td>
-                <td><img src="{{ icons['Combat Drugs (Reaper)'] }}" class="{{ 'acquired' if 'Combat Drugs (Reaper)' in acquired_items }}" title="Combat Drugs (Reaper)" /></td>
-                <td colspan="6"></td>
-                <td><img src="{{ icons['Siege Tank'] }}" class="{{ 'acquired' if 'Siege Tank' in acquired_items }}" title="Siege Tank" /></td>
-                <td><img src="{{ icons['Maelstrom Rounds (Siege Tank)'] }}" class="{{ 'acquired' if 'Maelstrom Rounds (Siege Tank)' in acquired_items }}" title="Maelstrom Rounds (Siege Tank)" /></td>
-                <td><img src="{{ icons['Shaped Blast (Siege Tank)'] }}" class="{{ 'acquired' if 'Shaped Blast (Siege Tank)' in acquired_items }}" title="Shaped Blast (Siege Tank)" /></td>
-                <td><img src="{{ icons['Jump Jets (Siege Tank)'] }}" class="{{ 'acquired' if 'Jump Jets (Siege Tank)' in acquired_items }}" title="Jump Jets (Siege Tank)" /></td>
-                <td><img src="{{ icons['Spider Mines (Siege Tank)'] }}" class="{{ 'acquired' if 'Spider Mines (Siege Tank)' in acquired_items }}" title="Spider Mines (Siege Tank)" /></td>
-                <td><img src="{{ icons['Smart Servos (Siege Tank)'] }}" class="{{ 'acquired' if 'Smart Servos (Siege Tank)' in acquired_items }}" title="Smart Servos (Siege Tank)" /></td>
-                <td><img src="{{ icons['Graduating Range (Siege Tank)'] }}" class="{{ 'acquired' if 'Graduating Range (Siege Tank)' in acquired_items }}" title="Graduating Range (Siege Tank)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Ghost'] }}" class="{{ 'acquired' if 'Ghost' in acquired_items }}" title="Ghost" /></td>
-                <td><img src="{{ icons['Ocular Implants (Ghost)'] }}" class="{{ 'acquired' if 'Ocular Implants (Ghost)' in acquired_items }}" title="Ocular Implants (Ghost)" /></td>
-                <td><img src="{{ icons['Crius Suit (Ghost)'] }}" class="{{ 'acquired' if 'Crius Suit (Ghost)' in acquired_items }}" title="Crius Suit (Ghost)" /></td>
-                <td><img src="{{ icons['EMP Rounds (Ghost)'] }}" class="{{ 'acquired' if 'EMP Rounds (Ghost)' in acquired_items }}" title="EMP Rounds (Ghost)" /></td>
-                <td><img src="{{ icons['Lockdown (Ghost)'] }}" class="{{ 'acquired' if 'Lockdown (Ghost)' in acquired_items }}" title="Lockdown (Ghost)" /></td>
-                <td colspan="3"></td>
-                <td></td>
-                <td><img src="{{ icons['Laser Targeting System (Siege Tank)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Siege Tank)' in acquired_items }}" title="Laser Targeting System (Siege Tank)" /></td>
-                <td><img src="{{ icons['Advanced Siege Tech (Siege Tank)'] }}" class="{{ 'acquired' if 'Advanced Siege Tech (Siege Tank)' in acquired_items }}" title="Advanced Siege Tech (Siege Tank)" /></td>
-                <td><img src="{{ icons['Internal Tech Module (Siege Tank)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Siege Tank)' in acquired_items }}" title="Internal Tech Module (Siege Tank)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Spectre'] }}" class="{{ 'acquired' if 'Spectre' in acquired_items }}" title="Spectre" /></td>
-                <td><img src="{{ icons['Psionic Lash (Spectre)'] }}" class="{{ 'acquired' if 'Psionic Lash (Spectre)' in acquired_items }}" title="Psionic Lash (Spectre)" /></td>
-                <td><img src="{{ icons['Nyx-Class Cloaking Module (Spectre)'] }}" class="{{ 'acquired' if 'Nyx-Class Cloaking Module (Spectre)' in acquired_items }}" title="Nyx-Class Cloaking Module (Spectre)" /></td>
-                <td><img src="{{ icons['Impaler Rounds (Spectre)'] }}" class="{{ 'acquired' if 'Impaler Rounds (Spectre)' in acquired_items }}" title="Impaler Rounds (Spectre)" /></td>
-                <td colspan="4"></td>
-                <td><img src="{{ icons['Thor'] }}" class="{{ 'acquired' if 'Thor' in acquired_items }}" title="Thor" /></td>
-                <td><img src="{{ icons['330mm Barrage Cannon (Thor)'] }}" class="{{ 'acquired' if '330mm Barrage Cannon (Thor)' in acquired_items }}" title="330mm Barrage Cannon (Thor)" /></td>
-                <td><img src="{{ icons['Immortality Protocol (Thor)'] }}" class="{{ 'acquired' if 'Immortality Protocol (Thor)' in acquired_items }}" title="Immortality Protocol (Thor)" /></td>
-                <td><img src="{{ high_impact_payload_thor_url }}" class="{{ 'acquired' if 'Progressive High Impact Payload (Thor)' in acquired_items }}" title="{{ high_impact_payload_thor_name }}" /></td>
-            </tr>
-            <tr>
-                <td colspan="8"></td>
-                <td><img src="{{ icons['Predator'] }}" class="{{ 'acquired' if 'Predator' in acquired_items }}" title="Predator" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Predator)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Predator)' in acquired_items }}" title="Optimized Logistics (Predator)" /></td>
-            </tr>
-            <tr>
-                <td colspan="8"></td>
-                <td><img src="{{ icons['Widow Mine'] }}" class="{{ 'acquired' if 'Widow Mine' in acquired_items }}" title="Widow Mine" /></td>
-                <td><img src="{{ icons['Drilling Claws (Widow Mine)'] }}" class="{{ 'acquired' if 'Drilling Claws (Widow Mine)' in acquired_items }}" title="Drilling Claws (Widow Mine)" /></td>
-                <td><img src="{{ icons['Concealment (Widow Mine)'] }}" class="{{ 'acquired' if 'Concealment (Widow Mine)' in acquired_items }}" title="Concealment (Widow Mine)" /></td>
-                <td><img src="{{ icons['Black Market Launchers (Widow Mine)'] }}" class="{{ 'acquired' if 'Black Market Launchers (Widow Mine)' in acquired_items }}" title="Black Market Launchers (Widow Mine)" /></td>
-                <td><img src="{{ icons['Executioner Missiles (Widow Mine)'] }}" class="{{ 'acquired' if 'Executioner Missiles (Widow Mine)' in acquired_items }}" title="Executioner Missiles (Widow Mine)" /></td>
-            </tr>
-            <tr>
-                <td colspan="8"></td>
-                <td><img src="{{ icons['Cyclone'] }}" class="{{ 'acquired' if 'Cyclone' in acquired_items }}" title="Cyclone" /></td>
-                <td><img src="{{ icons['Mag-Field Accelerators (Cyclone)'] }}" class="{{ 'acquired' if 'Mag-Field Accelerators (Cyclone)' in acquired_items }}" title="Mag-Field Accelerators (Cyclone)" /></td>
-                <td><img src="{{ icons['Mag-Field Launchers (Cyclone)'] }}" class="{{ 'acquired' if 'Mag-Field Launchers (Cyclone)' in acquired_items }}" title="Mag-Field Launchers (Cyclone)" /></td>
-                <td><img src="{{ icons['Targeting Optics (Cyclone)'] }}" class="{{ 'acquired' if 'Targeting Optics (Cyclone)' in acquired_items }}" title="Targeting Optics (Cyclone)" /></td>
-                <td><img src="{{ icons['Rapid Fire Launchers (Cyclone)'] }}" class="{{ 'acquired' if 'Rapid Fire Launchers (Cyclone)' in acquired_items }}" title="Rapid Fire Launchers (Cyclone)" /></td>
-            </tr>
-            <tr>
-                <td colspan="15" class="title">
-                    Starships
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Medivac'] }}" class="{{ 'acquired' if 'Medivac' in acquired_items }}" title="Medivac" /></td>
-                <td><img src="{{ icons['Rapid Deployment Tube (Medivac)'] }}" class="{{ 'acquired' if 'Rapid Deployment Tube (Medivac)' in acquired_items }}" title="Rapid Deployment Tube (Medivac)" /></td>
-                <td><img src="{{ icons['Advanced Healing AI (Medivac)'] }}" class="{{ 'acquired' if 'Advanced Healing AI (Medivac)' in acquired_items }}" title="Advanced Healing AI (Medivac)" /></td>
-                <td><img src="{{ icons['Expanded Hull (Medivac)'] }}" class="{{ 'acquired' if 'Expanded Hull (Medivac)' in acquired_items }}" title="Expanded Hull (Medivac)" /></td>
-                <td><img src="{{ icons['Afterburners (Medivac)'] }}" class="{{ 'acquired' if 'Afterburners (Medivac)' in acquired_items }}" title="Afterburners (Medivac)" /></td>
-                <td colspan="3"></td>
-                <td><img src="{{ icons['Raven'] }}" class="{{ 'acquired' if 'Raven' in acquired_items }}" title="Raven" /></td>
-                <td><img src="{{ icons['Bio Mechanical Repair Drone (Raven)'] }}" class="{{ 'acquired' if 'Bio Mechanical Repair Drone (Raven)' in acquired_items }}" title="Bio Mechanical Repair Drone (Raven)" /></td>
-                <td><img src="{{ icons['Spider Mines (Raven)'] }}" class="{{ 'acquired' if 'Spider Mines (Raven)' in acquired_items }}" title="Spider Mines (Raven)" /></td>
-                <td><img src="{{ icons['Railgun Turret (Raven)'] }}" class="{{ 'acquired' if 'Railgun Turret (Raven)' in acquired_items }}" title="Railgun Turret (Raven)" /></td>
-                <td><img src="{{ icons['Hunter-Seeker Weapon (Raven)'] }}" class="{{ 'acquired' if 'Hunter-Seeker Weapon (Raven)' in acquired_items }}" title="Hunter-Seeker Weapon (Raven)" /></td>
-                <td><img src="{{ icons['Interference Matrix (Raven)'] }}" class="{{ 'acquired' if 'Interference Matrix (Raven)' in acquired_items }}" title="Interference Matrix (Raven)" /></td>
-                <td><img src="{{ icons['Anti-Armor Missile (Raven)'] }}" class="{{ 'acquired' if 'Anti-Armor Missile (Raven)' in acquired_items }}" title="Anti-Armor Missile (Raven)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Wraith'] }}" class="{{ 'acquired' if 'Wraith' in acquired_items }}" title="Wraith" /></td>
-                <td><img src="{{ icons['Tomahawk Power Cells (Wraith)'] }}" class="{{ 'acquired' if 'Tomahawk Power Cells (Wraith)' in acquired_items }}" title="Tomahawk Power Cells (Wraith)" /></td>
-                <td><img src="{{ icons['Displacement Field (Wraith)'] }}" class="{{ 'acquired' if 'Displacement Field (Wraith)' in acquired_items }}" title="Displacement Field (Wraith)" /></td>
-                <td><img src="{{ icons['Advanced Laser Technology (Wraith)'] }}" class="{{ 'acquired' if 'Advanced Laser Technology (Wraith)' in acquired_items }}" title="Advanced Laser Technology (Wraith)" /></td>
-                <td colspan="4"></td>
-                <td></td>
-                <td><img src="{{ icons['Internal Tech Module (Raven)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Raven)' in acquired_items }}" title="Internal Tech Module (Raven)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Viking'] }}" class="{{ 'acquired' if 'Viking' in acquired_items }}" title="Viking" /></td>
-                <td><img src="{{ icons['Ripwave Missiles (Viking)'] }}" class="{{ 'acquired' if 'Ripwave Missiles (Viking)' in acquired_items }}" title="Ripwave Missiles (Viking)" /></td>
-                <td><img src="{{ icons['Phobos-Class Weapons System (Viking)'] }}" class="{{ 'acquired' if 'Phobos-Class Weapons System (Viking)' in acquired_items }}" title="Phobos-Class Weapons System (Viking)" /></td>
-                <td><img src="{{ icons['Smart Servos (Viking)'] }}" class="{{ 'acquired' if 'Smart Servos (Viking)' in acquired_items }}" title="Smart Servos (Viking)" /></td>
-                <td><img src="{{ icons['Magrail Munitions (Viking)'] }}" class="{{ 'acquired' if 'Magrail Munitions (Viking)' in acquired_items }}" title="Magrail Munitions (Viking)" /></td>
-                <td colspan="3"></td>
-                <td><img src="{{ icons['Science Vessel'] }}" class="{{ 'acquired' if 'Science Vessel' in acquired_items }}" title="Science Vessel" /></td>
-                <td><img src="{{ icons['EMP Shockwave (Science Vessel)'] }}" class="{{ 'acquired' if 'EMP Shockwave (Science Vessel)' in acquired_items }}" title="EMP Shockwave (Science Vessel)" /></td>
-                <td><img src="{{ icons['Defensive Matrix (Science Vessel)'] }}" class="{{ 'acquired' if 'Defensive Matrix (Science Vessel)' in acquired_items }}" title="Defensive Matrix (Science Vessel)" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Banshee'] }}" class="{{ 'acquired' if 'Banshee' in acquired_items }}" title="Banshee" /></td>
-                <td><img src="{{ crossspectrum_dampeners_banshee_url }}" class="{{ 'acquired' if 'Progressive Cross-Spectrum Dampeners (Banshee)' in acquired_items }}" title="{{ crossspectrum_dampeners_banshee_name }}" /></td>
-                <td><img src="{{ icons['Shockwave Missile Battery (Banshee)'] }}" class="{{ 'acquired' if 'Shockwave Missile Battery (Banshee)' in acquired_items }}" title="Shockwave Missile Battery (Banshee)" /></td>
-                <td><img src="{{ icons['Hyperflight Rotors (Banshee)'] }}" class="{{ 'acquired' if 'Hyperflight Rotors (Banshee)' in acquired_items }}" title="Hyperflight Rotors (Banshee)" /></td>
-                <td><img src="{{ icons['Laser Targeting System (Banshee)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Banshee)' in acquired_items }}" title="Laser Targeting System (Banshee)" /></td>
-                <td><img src="{{ icons['Internal Tech Module (Banshee)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Banshee)' in acquired_items }}" title="Internal Tech Module (Banshee)" /></td>
-                <td colspan="2"></td>
-                <td><img src="{{ icons['Hercules'] }}" class="{{ 'acquired' if 'Hercules' in acquired_items }}" title="Hercules" /></td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Battlecruiser'] }}" class="{{ 'acquired' if 'Battlecruiser' in acquired_items }}" title="Battlecruiser" /></td>
-                <td><img src="{{ icons['Missile Pods (Battlecruiser)'] }}" class="{{ 'acquired' if 'Missile Pods (Battlecruiser)' in acquired_items }}" title="Missile Pods (Battlecruiser)" /></td>
-                <td><img src="{{ icons['Defensive Matrix (Battlecruiser)'] }}" class="{{ 'acquired' if 'Defensive Matrix (Battlecruiser)' in acquired_items }}" title="Defensive Matrix (Battlecruiser)" /></td>
-                <td><img src="{{ icons['Tactical Jump (Battlecruiser)'] }}" class="{{ 'acquired' if 'Tactical Jump (Battlecruiser)' in acquired_items }}" title="Tactical Jump (Battlecruiser)" /></td>
-                <td><img src="{{ icons['Cloak (Battlecruiser)'] }}" class="{{ 'acquired' if 'Cloak (Battlecruiser)' in acquired_items }}" title="Cloak (Battlecruiser)" /></td>
-                <td><img src="{{ icons['ATX Laser Battery (Battlecruiser)'] }}" class="{{ 'acquired' if 'ATX Laser Battery (Battlecruiser)' in acquired_items }}" title="ATX Laser Battery (Battlecruiser)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Battlecruiser)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Battlecruiser)' in acquired_items }}" title="Optimized Logistics (Battlecruiser)" /></td>
-                <td></td>
-                <td><img src="{{ icons['Liberator'] }}" class="{{ 'acquired' if 'Liberator' in acquired_items }}" title="Liberator" /></td>
-                <td><img src="{{ icons['Advanced Ballistics (Liberator)'] }}" class="{{ 'acquired' if 'Advanced Ballistics (Liberator)' in acquired_items }}" title="Advanced Ballistics (Liberator)" /></td>
-                <td><img src="{{ icons['Raid Artillery (Liberator)'] }}" class="{{ 'acquired' if 'Raid Artillery (Liberator)' in acquired_items }}" title="Raid Artillery (Liberator)" /></td>
-                <td><img src="{{ icons['Cloak (Liberator)'] }}" class="{{ 'acquired' if 'Cloak (Liberator)' in acquired_items }}" title="Cloak (Liberator)" /></td>
-                <td><img src="{{ icons['Laser Targeting System (Liberator)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Liberator)' in acquired_items }}" title="Laser Targeting System (Liberator)" /></td>
-                <td><img src="{{ icons['Optimized Logistics (Liberator)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Liberator)' in acquired_items }}" title="Optimized Logistics (Liberator)" /></td>
-            </tr>
-            <tr>
-                <td></td>
-                <td><img src="{{ icons['Internal Tech Module (Battlecruiser)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Battlecruiser)' in acquired_items }}" title="Internal Tech Module (Battlecruiser)" /></td>
-                <td colspan="6"></td>
-                <td><img src="{{ icons['Valkyrie'] }}" class="{{ 'acquired' if 'Valkyrie' in acquired_items }}" title="Valkyrie" /></td>
-                <td><img src="{{ icons['Enhanced Cluster Launchers (Valkyrie)'] }}" class="{{ 'acquired' if 'Enhanced Cluster Launchers (Valkyrie)' in acquired_items }}" title="Enhanced Cluster Launchers (Valkyrie)" /></td>
-                <td><img src="{{ icons['Shaped Hull (Valkyrie)'] }}" class="{{ 'acquired' if 'Shaped Hull (Valkyrie)' in acquired_items }}" title="Shaped Hull (Valkyrie)" /></td>
-                <td><img src="{{ icons['Burst Lasers (Valkyrie)'] }}" class="{{ 'acquired' if 'Burst Lasers (Valkyrie)' in acquired_items }}" title="Burst Lasers (Valkyrie)" /></td>
-                <td><img src="{{ icons['Afterburners (Valkyrie)'] }}" class="{{ 'acquired' if 'Afterburners (Valkyrie)' in acquired_items }}" title="Afterburners (Valkyrie)" /></td>
-            </tr>
-            <tr>
-                <td colspan="15" class="title">
-                    Mercenaries
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['War Pigs'] }}" class="{{ 'acquired' if 'War Pigs' in acquired_items }}" title="War Pigs" /></td>
-                <td><img src="{{ icons['Devil Dogs'] }}" class="{{ 'acquired' if 'Devil Dogs' in acquired_items }}" title="Devil Dogs" /></td>
-                <td><img src="{{ icons['Hammer Securities'] }}" class="{{ 'acquired' if 'Hammer Securities' in acquired_items }}" title="Hammer Securities" /></td>
-                <td><img src="{{ icons['Spartan Company'] }}" class="{{ 'acquired' if 'Spartan Company' in acquired_items }}" title="Spartan Company" /></td>
-                <td><img src="{{ icons['Siege Breakers'] }}" class="{{ 'acquired' if 'Siege Breakers' in acquired_items }}" title="Siege Breakers" /></td>
-                <td><img src="{{ icons['Hel\'s Angel'] }}" class="{{ 'acquired' if 'Hel\'s Angel' in acquired_items }}" title="Hel's Angel" /></td>
-                <td><img src="{{ icons['Dusk Wings'] }}" class="{{ 'acquired' if 'Dusk Wings' in acquired_items }}" title="Dusk Wings" /></td>
-                <td><img src="{{ icons['Jackson\'s Revenge'] }}" class="{{ 'acquired' if 'Jackson\'s Revenge' in acquired_items }}" title="Jackson's Revenge" /></td>
-            </tr>
-            <tr>
-                <td colspan="15" class="title">
-                    General Upgrades
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Fire-Suppression System (Building)'] }}" class="{{ 'acquired' if 'Fire-Suppression System (Building)' in acquired_items }}" title="Fire-Suppression System (Building)" /></td>
-                <td><img src="{{ icons['Orbital Strike'] }}" class="{{ 'acquired' if 'Orbital Strike' in acquired_items }}" title="Orbital Strike" /></td>
-                <td><img src="{{ icons['Cellular Reactor'] }}" class="{{ 'acquired' if 'Cellular Reactor' in acquired_items }}" title="Cellular Reactor" /></td>
-                <td><img src="{{ regenerative_biosteel_url }}" class="{{ 'acquired' if 'Progressive Regenerative Bio-Steel' in acquired_items }}" title="Progressive Regenerative Bio-Steel{% if regenerative_biosteel_level > 0 %} (Level {{ regenerative_biosteel_level }}){% endif %}" /></td>
-            </tr>
-            <tr>
-                <td colspan="15" class="title">
-                    Protoss Units
-                </td>
-            </tr>
-            <tr>
-                <td><img src="{{ icons['Zealot'] }}" class="{{ 'acquired' if 'Zealot' in acquired_items }}" title="Zealot" /></td>
-                <td><img src="{{ icons['Stalker'] }}" class="{{ 'acquired' if 'Stalker' in acquired_items }}" title="Stalker" /></td>
-                <td><img src="{{ icons['High Templar'] }}" class="{{ 'acquired' if 'High Templar' in acquired_items }}" title="High Templar" /></td>
-                <td><img src="{{ icons['Dark Templar'] }}" class="{{ 'acquired' if 'Dark Templar' in acquired_items }}" title="Dark Templar" /></td>
-                <td><img src="{{ icons['Immortal'] }}" class="{{ 'acquired' if 'Immortal' in acquired_items }}" title="Immortal" /></td>
-                <td><img src="{{ icons['Colossus'] }}" class="{{ 'acquired' if 'Colossus' in acquired_items }}" title="Colossus" /></td>
-                <td><img src="{{ icons['Phoenix'] }}" class="{{ 'acquired' if 'Phoenix' in acquired_items }}" title="Phoenix" /></td>
-                <td><img src="{{ icons['Void Ray'] }}" class="{{ 'acquired' if 'Void Ray' in acquired_items }}" title="Void Ray" /></td>
-                <td><img src="{{ icons['Carrier'] }}" class="{{ 'acquired' if 'Carrier' in acquired_items }}" title="Carrier" /></td>
-            </tr>
-        </table>
-        <table id="location-table">
-            {% for area in checks_in_area %}
-            {% if checks_in_area[area] > 0 %}
-            <tr class="location-category" id="{{area}}-header">
-                <td>{{ area }} {{'▼' if area != 'Total'}}</td>
-                <td class="counter">{{ checks_done[area] }} / {{ checks_in_area[area] }}</td>
-            </tr>
-            <tbody class="locations hide" id="{{area}}">
-                {% for location in location_info[area] %}
-                <tr>
-                    <td class="location-name">{{ location }}</td>
-                    <td class="counter">{{ '✔' if location_info[area][location] else '' }}</td>
-                </tr>
-                {% endfor %}
-            </tbody>
-            {% endif %}
-            {% endfor %}
-        </table>
-    </div>
-</body>
-</html>
diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py
index e8b1ae5b..c2fdab0e 100644
--- a/WebHostLib/tracker.py
+++ b/WebHostLib/tracker.py
@@ -1553,212 +1553,298 @@ if "ChecksFinder" in network_data_package["games"]:
 
     _player_trackers["ChecksFinder"] = render_ChecksFinder_tracker
 
-if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
-    def render_Starcraft2WingsOfLiberty_tracker(tracker_data: TrackerData, team: int, player: int) -> str:
+if "Starcraft 2" in network_data_package["games"]:
+    def render_Starcraft2_tracker(tracker_data: TrackerData, team: int, player: int) -> str:
         SC2WOL_LOC_ID_OFFSET = 1000
+        SC2HOTS_LOC_ID_OFFSET = 20000000  # Avoid clashes with The Legend of Zelda
+        SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000
+        SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500
+
         SC2WOL_ITEM_ID_OFFSET = 1000
+        SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000
+        SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000
+
+        slot_data = tracker_data.get_slot_data(team, player)
+        minerals_per_item = slot_data.get("minerals_per_item", 15)
+        vespene_per_item = slot_data.get("vespene_per_item", 15)
+        starting_supply_per_item = slot_data.get("starting_supply_per_item", 2)
+
+        github_icon_base_url = "https://matthewmarinets.github.io/ap_sc2_icons/icons/"
+        organics_icon_base_url = "https://0rganics.org/archipelago/sc2wol/"
 
         icons = {
             "Starting Minerals":                           "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-mineral-protoss.png",
             "Starting Vespene":                            "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-gas-terran.png",
-            "Starting Supply":                             "https://static.wikia.nocookie.net/starcraft/images/d/d3/TerranSupply_SC2_Icon1.gif",
+            "Starting Supply":                             github_icon_base_url + "blizzard/icon-supply-terran_nobg.png",
 
-            "Infantry Weapons Level 1":                    "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel1.png",
-            "Infantry Weapons Level 2":                    "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel2.png",
-            "Infantry Weapons Level 3":                    "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel3.png",
-            "Infantry Armor Level 1":                      "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel1.png",
-            "Infantry Armor Level 2":                      "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel2.png",
-            "Infantry Armor Level 3":                      "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel3.png",
-            "Vehicle Weapons Level 1":                     "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel1.png",
-            "Vehicle Weapons Level 2":                     "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel2.png",
-            "Vehicle Weapons Level 3":                     "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel3.png",
-            "Vehicle Armor Level 1":                       "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel1.png",
-            "Vehicle Armor Level 2":                       "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel2.png",
-            "Vehicle Armor Level 3":                       "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel3.png",
-            "Ship Weapons Level 1":                        "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel1.png",
-            "Ship Weapons Level 2":                        "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel2.png",
-            "Ship Weapons Level 3":                        "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel3.png",
-            "Ship Armor Level 1":                          "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel1.png",
-            "Ship Armor Level 2":                          "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel2.png",
-            "Ship Armor Level 3":                          "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel3.png",
+            "Terran Infantry Weapons Level 1":             "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel1.png",
+            "Terran Infantry Weapons Level 2":             "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel2.png",
+            "Terran Infantry Weapons Level 3":             "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel3.png",
+            "Terran Infantry Armor Level 1":               "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel1.png",
+            "Terran Infantry Armor Level 2":               "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel2.png",
+            "Terran Infantry Armor Level 3":               "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel3.png",
+            "Terran Vehicle Weapons Level 1":              "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel1.png",
+            "Terran Vehicle Weapons Level 2":              "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel2.png",
+            "Terran Vehicle Weapons Level 3":              "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel3.png",
+            "Terran Vehicle Armor Level 1":                "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel1.png",
+            "Terran Vehicle Armor Level 2":                "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel2.png",
+            "Terran Vehicle Armor Level 3":                "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel3.png",
+            "Terran Ship Weapons Level 1":                 "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel1.png",
+            "Terran Ship Weapons Level 2":                 "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel2.png",
+            "Terran Ship Weapons Level 3":                 "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel3.png",
+            "Terran Ship Armor Level 1":                   "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel1.png",
+            "Terran Ship Armor Level 2":                   "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel2.png",
+            "Terran Ship Armor Level 3":                   "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel3.png",
 
             "Bunker":                                      "https://static.wikia.nocookie.net/starcraft/images/c/c5/Bunker_SC2_Icon1.jpg",
             "Missile Turret":                              "https://static.wikia.nocookie.net/starcraft/images/5/5f/MissileTurret_SC2_Icon1.jpg",
             "Sensor Tower":                                "https://static.wikia.nocookie.net/starcraft/images/d/d2/SensorTower_SC2_Icon1.jpg",
 
-            "Projectile Accelerator (Bunker)":             "https://0rganics.org/archipelago/sc2wol/ProjectileAccelerator.png",
-            "Neosteel Bunker (Bunker)":                    "https://0rganics.org/archipelago/sc2wol/NeosteelBunker.png",
-            "Titanium Housing (Missile Turret)":           "https://0rganics.org/archipelago/sc2wol/TitaniumHousing.png",
-            "Hellstorm Batteries (Missile Turret)":        "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png",
-            "Advanced Construction (SCV)":                 "https://0rganics.org/archipelago/sc2wol/AdvancedConstruction.png",
-            "Dual-Fusion Welders (SCV)":                   "https://0rganics.org/archipelago/sc2wol/Dual-FusionWelders.png",
-            "Fire-Suppression System (Building)":          "https://0rganics.org/archipelago/sc2wol/Fire-SuppressionSystem.png",
-            "Orbital Command (Building)":                  "https://0rganics.org/archipelago/sc2wol/OrbitalCommandCampaign.png",
+            "Projectile Accelerator (Bunker)":             github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-bunkerresearchbundle_05.png",
+            "Neosteel Bunker (Bunker)":                    organics_icon_base_url + "NeosteelBunker.png",
+            "Titanium Housing (Missile Turret)":           organics_icon_base_url + "TitaniumHousing.png",
+            "Hellstorm Batteries (Missile Turret)":        github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png",
+            "Advanced Construction (SCV)":                 github_icon_base_url + "blizzard/btn-ability-mengsk-trooper-advancedconstruction.png",
+            "Dual-Fusion Welders (SCV)":                   github_icon_base_url + "blizzard/btn-upgrade-swann-scvdoublerepair.png",
+            "Fire-Suppression System Level 1":             organics_icon_base_url + "Fire-SuppressionSystem.png",
+            "Fire-Suppression System Level 2":             github_icon_base_url + "blizzard/btn-upgrade-swann-firesuppressionsystem.png",
+
+            "Orbital Command":                             organics_icon_base_url + "OrbitalCommandCampaign.png",
+            "Planetary Command Module":                    github_icon_base_url + "original/btn-orbital-fortress.png",
+            "Lift Off (Planetary Fortress)":               github_icon_base_url + "blizzard/btn-ability-terran-liftoff.png",
+            "Armament Stabilizers (Planetary Fortress)":   github_icon_base_url + "blizzard/btn-ability-mengsk-siegetank-flyingtankarmament.png",
+            "Advanced Targeting (Planetary Fortress)":     github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png",
 
             "Marine":                                      "https://static.wikia.nocookie.net/starcraft/images/4/47/Marine_SC2_Icon1.jpg",
-            "Medic":                                       "https://static.wikia.nocookie.net/starcraft/images/7/74/Medic_SC2_Rend1.jpg",
-            "Firebat":                                     "https://static.wikia.nocookie.net/starcraft/images/3/3c/Firebat_SC2_Rend1.jpg",
+            "Medic":                                       github_icon_base_url + "blizzard/btn-unit-terran-medic.png",
+            "Firebat":                                     github_icon_base_url + "blizzard/btn-unit-terran-firebat.png",
             "Marauder":                                    "https://static.wikia.nocookie.net/starcraft/images/b/ba/Marauder_SC2_Icon1.jpg",
             "Reaper":                                      "https://static.wikia.nocookie.net/starcraft/images/7/7d/Reaper_SC2_Icon1.jpg",
+            "Ghost":                                       "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg",
+            "Spectre":                                     github_icon_base_url + "original/btn-unit-terran-spectre.png",
+            "HERC":                                        github_icon_base_url + "blizzard/btn-unit-terran-herc.png",
 
-            "Stimpack (Marine)":                           "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
-            "Super Stimpack (Marine)":                     "/static/static/icons/sc2/superstimpack.png",
-            "Combat Shield (Marine)":                      "https://0rganics.org/archipelago/sc2wol/CombatShieldCampaign.png",
-            "Laser Targeting System (Marine)":             "/static/static/icons/sc2/lasertargetingsystem.png",
-            "Magrail Munitions (Marine)":                  "/static/static/icons/sc2/magrailmunitions.png",
-            "Optimized Logistics (Marine)":                "/static/static/icons/sc2/optimizedlogistics.png",
-            "Advanced Medic Facilities (Medic)":           "https://0rganics.org/archipelago/sc2wol/AdvancedMedicFacilities.png",
-            "Stabilizer Medpacks (Medic)":                 "https://0rganics.org/archipelago/sc2wol/StabilizerMedpacks.png",
-            "Restoration (Medic)":                         "/static/static/icons/sc2/restoration.png",
-            "Optical Flare (Medic)":                       "/static/static/icons/sc2/opticalflare.png",
-            "Optimized Logistics (Medic)":                 "/static/static/icons/sc2/optimizedlogistics.png",
-            "Incinerator Gauntlets (Firebat)":             "https://0rganics.org/archipelago/sc2wol/IncineratorGauntlets.png",
-            "Juggernaut Plating (Firebat)":                "https://0rganics.org/archipelago/sc2wol/JuggernautPlating.png",
-            "Stimpack (Firebat)":                          "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
-            "Super Stimpack (Firebat)":                    "/static/static/icons/sc2/superstimpack.png",
-            "Optimized Logistics (Firebat)":               "/static/static/icons/sc2/optimizedlogistics.png",
-            "Concussive Shells (Marauder)":                "https://0rganics.org/archipelago/sc2wol/ConcussiveShellsCampaign.png",
-            "Kinetic Foam (Marauder)":                     "https://0rganics.org/archipelago/sc2wol/KineticFoam.png",
-            "Stimpack (Marauder)":                         "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
-            "Super Stimpack (Marauder)":                   "/static/static/icons/sc2/superstimpack.png",
-            "Laser Targeting System (Marauder)":           "/static/static/icons/sc2/lasertargetingsystem.png",
-            "Magrail Munitions (Marauder)":                "/static/static/icons/sc2/magrailmunitions.png",
-            "Internal Tech Module (Marauder)":             "/static/static/icons/sc2/internalizedtechmodule.png",
-            "U-238 Rounds (Reaper)":                       "https://0rganics.org/archipelago/sc2wol/U-238Rounds.png",
-            "G-4 Clusterbomb (Reaper)":                    "https://0rganics.org/archipelago/sc2wol/G-4Clusterbomb.png",
-            "Stimpack (Reaper)":                           "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
-            "Super Stimpack (Reaper)":                     "/static/static/icons/sc2/superstimpack.png",
-            "Laser Targeting System (Reaper)":             "/static/static/icons/sc2/lasertargetingsystem.png",
-            "Advanced Cloaking Field (Reaper)":            "/static/static/icons/sc2/terran-cloak-color.png",
-            "Spider Mines (Reaper)":                       "/static/static/icons/sc2/spidermine.png",
-            "Combat Drugs (Reaper)":                       "/static/static/icons/sc2/reapercombatdrugs.png",
+            "Stimpack (Marine)":                           github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png",
+            "Super Stimpack (Marine)":                     github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png",
+            "Combat Shield (Marine)":                      github_icon_base_url + "blizzard/btn-techupgrade-terran-combatshield-color.png",
+            "Laser Targeting System (Marine)":             github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Magrail Munitions (Marine)":                  github_icon_base_url + "blizzard/btn-upgrade-terran-magrailmunitions.png",
+            "Optimized Logistics (Marine)":                github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png",
+            "Advanced Medic Facilities (Medic)":           organics_icon_base_url + "AdvancedMedicFacilities.png",
+            "Stabilizer Medpacks (Medic)":                 github_icon_base_url + "blizzard/btn-upgrade-raynor-stabilizermedpacks.png",
+            "Restoration (Medic)":                         github_icon_base_url + "original/btn-ability-terran-restoration@scbw.png",
+            "Optical Flare (Medic)":                       github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-dragoonsolariteflare.png",
+            "Resource Efficiency (Medic)":                 github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Adaptive Medpacks (Medic)":                   github_icon_base_url + "blizzard/btn-ability-terran-heal-color.png",
+            "Nano Projector (Medic)":                      github_icon_base_url + "blizzard/talent-raynor-level03-firebatmedicrange.png",
+            "Incinerator Gauntlets (Firebat)":             github_icon_base_url + "blizzard/btn-upgrade-raynor-incineratorgauntlets.png",
+            "Juggernaut Plating (Firebat)":                github_icon_base_url + "blizzard/btn-upgrade-raynor-juggernautplating.png",
+            "Stimpack (Firebat)":                          github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png",
+            "Super Stimpack (Firebat)":                    github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png",
+            "Resource Efficiency (Firebat)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Infernal Pre-Igniter (Firebat)":              github_icon_base_url + "blizzard/btn-upgrade-terran-infernalpreigniter.png",
+            "Kinetic Foam (Firebat)":                      organics_icon_base_url + "KineticFoam.png",
+            "Nano Projectors (Firebat)":                   github_icon_base_url + "blizzard/talent-raynor-level03-firebatmedicrange.png",
+            "Concussive Shells (Marauder)":                github_icon_base_url + "blizzard/btn-ability-terran-punishergrenade-color.png",
+            "Kinetic Foam (Marauder)":                     organics_icon_base_url + "KineticFoam.png",
+            "Stimpack (Marauder)":                         github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png",
+            "Super Stimpack (Marauder)":                   github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png",
+            "Laser Targeting System (Marauder)":           github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Magrail Munitions (Marauder)":                github_icon_base_url + "blizzard/btn-upgrade-terran-magrailmunitions.png",
+            "Internal Tech Module (Marauder)":             github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Juggernaut Plating (Marauder)":               organics_icon_base_url + "JuggernautPlating.png",
+            "U-238 Rounds (Reaper)":                       organics_icon_base_url + "U-238Rounds.png",
+            "G-4 Clusterbomb (Reaper)":                    github_icon_base_url + "blizzard/btn-upgrade-terran-kd8chargeex3.png",
+            "Stimpack (Reaper)":                           github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png",
+            "Super Stimpack (Reaper)":                     github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png",
+            "Laser Targeting System (Reaper)":             github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Advanced Cloaking Field (Reaper)":            github_icon_base_url + "original/btn-permacloak-reaper.png",
+            "Spider Mines (Reaper)":                       github_icon_base_url + "original/btn-ability-terran-spidermine.png",
+            "Combat Drugs (Reaper)":                       github_icon_base_url + "blizzard/btn-upgrade-terran-reapercombatdrugs.png",
+            "Jet Pack Overdrive (Reaper)":                 github_icon_base_url + "blizzard/btn-ability-hornerhan-reaper-flightmode.png",
+            "Ocular Implants (Ghost)":                     organics_icon_base_url + "OcularImplants.png",
+            "Crius Suit (Ghost)":                          github_icon_base_url + "original/btn-permacloak-ghost.png",
+            "EMP Rounds (Ghost)":                          github_icon_base_url + "blizzard/btn-ability-terran-emp-color.png",
+            "Lockdown (Ghost)":                            github_icon_base_url + "original/btn-abilty-terran-lockdown@scbw.png",
+            "Resource Efficiency (Ghost)":                 github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Psionic Lash (Spectre)":                      organics_icon_base_url + "PsionicLash.png",
+            "Nyx-Class Cloaking Module (Spectre)":         github_icon_base_url + "original/btn-permacloak-spectre.png",
+            "Impaler Rounds (Spectre)":                    github_icon_base_url + "blizzard/btn-techupgrade-terran-impalerrounds.png",
+            "Resource Efficiency (Spectre)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Juggernaut Plating (HERC)":                   organics_icon_base_url + "JuggernautPlating.png",
+            "Kinetic Foam (HERC)":                         organics_icon_base_url + "KineticFoam.png",
 
             "Hellion":                                     "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg",
-            "Vulture":                                     "https://static.wikia.nocookie.net/starcraft/images/d/da/Vulture_WoL.jpg",
-            "Goliath":                                     "https://static.wikia.nocookie.net/starcraft/images/e/eb/Goliath_WoL.jpg",
-            "Diamondback":                                 "https://static.wikia.nocookie.net/starcraft/images/a/a6/Diamondback_WoL.jpg",
+            "Vulture":                                     github_icon_base_url + "blizzard/btn-unit-terran-vulture.png",
+            "Goliath":                                     github_icon_base_url + "blizzard/btn-unit-terran-goliath.png",
+            "Diamondback":                                 github_icon_base_url + "blizzard/btn-unit-terran-cobra.png",
             "Siege Tank":                                  "https://static.wikia.nocookie.net/starcraft/images/5/57/SiegeTank_SC2_Icon1.jpg",
+            "Thor":                                        "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg",
+            "Predator":                                    github_icon_base_url + "original/btn-unit-terran-predator.png",
+            "Widow Mine":                                  github_icon_base_url + "blizzard/btn-unit-terran-widowmine.png",
+            "Cyclone":                                     github_icon_base_url + "blizzard/btn-unit-terran-cyclone.png",
+            "Warhound":                                    github_icon_base_url + "blizzard/btn-unit-terran-warhound.png",
 
-            "Twin-Linked Flamethrower (Hellion)":          "https://0rganics.org/archipelago/sc2wol/Twin-LinkedFlamethrower.png",
-            "Thermite Filaments (Hellion)":                "https://0rganics.org/archipelago/sc2wol/ThermiteFilaments.png",
-            "Hellbat Aspect (Hellion)":                    "/static/static/icons/sc2/hellionbattlemode.png",
-            "Smart Servos (Hellion)":                      "/static/static/icons/sc2/transformationservos.png",
-            "Optimized Logistics (Hellion)":               "/static/static/icons/sc2/optimizedlogistics.png",
-            "Jump Jets (Hellion)":                         "/static/static/icons/sc2/jumpjets.png",
-            "Stimpack (Hellion)":                          "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
-            "Super Stimpack (Hellion)":                    "/static/static/icons/sc2/superstimpack.png",
-            "Cerberus Mine (Spider Mine)":                 "https://0rganics.org/archipelago/sc2wol/CerberusMine.png",
-            "High Explosive Munition (Spider Mine)":       "/static/static/icons/sc2/high-explosive-spidermine.png",
-            "Replenishable Magazine (Vulture)":            "https://0rganics.org/archipelago/sc2wol/ReplenishableMagazine.png",
-            "Ion Thrusters (Vulture)":                     "/static/static/icons/sc2/emergencythrusters.png",
-            "Auto Launchers (Vulture)":                    "/static/static/icons/sc2/jotunboosters.png",
-            "Multi-Lock Weapons System (Goliath)":         "https://0rganics.org/archipelago/sc2wol/Multi-LockWeaponsSystem.png",
-            "Ares-Class Targeting System (Goliath)":       "https://0rganics.org/archipelago/sc2wol/Ares-ClassTargetingSystem.png",
-            "Jump Jets (Goliath)":                         "/static/static/icons/sc2/jumpjets.png",
-            "Optimized Logistics (Goliath)":               "/static/static/icons/sc2/optimizedlogistics.png",
-            "Tri-Lithium Power Cell (Diamondback)":        "https://0rganics.org/archipelago/sc2wol/Tri-LithiumPowerCell.png",
-            "Shaped Hull (Diamondback)":                   "https://0rganics.org/archipelago/sc2wol/ShapedHull.png",
-            "Hyperfluxor (Diamondback)":                   "/static/static/icons/sc2/hyperfluxor.png",
-            "Burst Capacitors (Diamondback)":              "/static/static/icons/sc2/burstcapacitors.png",
-            "Optimized Logistics (Diamondback)":           "/static/static/icons/sc2/optimizedlogistics.png",
-            "Maelstrom Rounds (Siege Tank)":               "https://0rganics.org/archipelago/sc2wol/MaelstromRounds.png",
-            "Shaped Blast (Siege Tank)":                   "https://0rganics.org/archipelago/sc2wol/ShapedBlast.png",
-            "Jump Jets (Siege Tank)":                      "/static/static/icons/sc2/jumpjets.png",
-            "Spider Mines (Siege Tank)":                   "/static/static/icons/sc2/siegetank-spidermines.png",
-            "Smart Servos (Siege Tank)":                   "/static/static/icons/sc2/transformationservos.png",
-            "Graduating Range (Siege Tank)":               "/static/static/icons/sc2/siegetankrange.png",
-            "Laser Targeting System (Siege Tank)":         "/static/static/icons/sc2/lasertargetingsystem.png",
-            "Advanced Siege Tech (Siege Tank)":            "/static/static/icons/sc2/improvedsiegemode.png",
-            "Internal Tech Module (Siege Tank)":           "/static/static/icons/sc2/internalizedtechmodule.png",
+            "Twin-Linked Flamethrower (Hellion)":          github_icon_base_url + "blizzard/btn-upgrade-mengsk-trooper-flamethrower.png",
+            "Thermite Filaments (Hellion)":                github_icon_base_url + "blizzard/btn-upgrade-terran-infernalpreigniter.png",
+            "Hellbat Aspect (Hellion)":                    github_icon_base_url + "blizzard/btn-unit-terran-hellionbattlemode.png",
+            "Smart Servos (Hellion)":                      github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png",
+            "Optimized Logistics (Hellion)":               github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png",
+            "Jump Jets (Hellion)":                         github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png",
+            "Stimpack (Hellion)":                          github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png",
+            "Super Stimpack (Hellion)":                    github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png",
+            "Infernal Plating (Hellion)":                  github_icon_base_url + "blizzard/btn-upgrade-swann-hellarmor.png",
+            "Cerberus Mine (Spider Mine)":                 github_icon_base_url + "blizzard/btn-upgrade-raynor-cerberusmines.png",
+            "High Explosive Munition (Spider Mine)":       github_icon_base_url + "original/btn-ability-terran-spidermine.png",
+            "Replenishable Magazine (Vulture)":            github_icon_base_url + "blizzard/btn-upgrade-raynor-replenishablemagazine.png",
+            "Replenishable Magazine (Free) (Vulture)":     github_icon_base_url + "blizzard/btn-upgrade-raynor-replenishablemagazine.png",
+            "Ion Thrusters (Vulture)":                     github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png",
+            "Auto Launchers (Vulture)":                    github_icon_base_url + "blizzard/btn-upgrade-terran-jotunboosters.png",
+            "Auto-Repair (Vulture)":                       github_icon_base_url + "blizzard/ui_tipicon_campaign_space01-repair.png",
+            "Multi-Lock Weapons System (Goliath)":         github_icon_base_url + "blizzard/btn-upgrade-swann-multilockweaponsystem.png",
+            "Ares-Class Targeting System (Goliath)":       github_icon_base_url + "blizzard/btn-upgrade-swann-aresclasstargetingsystem.png",
+            "Jump Jets (Goliath)":                         github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png",
+            "Optimized Logistics (Goliath)":               github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png",
+            "Shaped Hull (Goliath)":                       organics_icon_base_url + "ShapedHull.png",
+            "Resource Efficiency (Goliath)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Internal Tech Module (Goliath)":              github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Tri-Lithium Power Cell (Diamondback)":        github_icon_base_url + "original/btn-upgrade-terran-trilithium-power-cell.png",
+            "Tungsten Spikes (Diamondback)":               github_icon_base_url + "original/btn-upgrade-terran-tungsten-spikes.png",
+            "Shaped Hull (Diamondback)":                   organics_icon_base_url + "ShapedHull.png",
+            "Hyperfluxor (Diamondback)":                   github_icon_base_url + "blizzard/btn-upgrade-mengsk-engineeringbay-orbitaldrop.png",
+            "Burst Capacitors (Diamondback)":              github_icon_base_url + "blizzard/btn-ability-terran-electricfield.png",
+            "Ion Thrusters (Diamondback)":                 github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png",
+            "Resource Efficiency (Diamondback)":           github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Maelstrom Rounds (Siege Tank)":               github_icon_base_url + "blizzard/btn-upgrade-raynor-maelstromrounds.png",
+            "Shaped Blast (Siege Tank)":                   organics_icon_base_url + "ShapedBlast.png",
+            "Jump Jets (Siege Tank)":                      github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png",
+            "Spider Mines (Siege Tank)":                   github_icon_base_url + "blizzard/btn-upgrade-siegetank-spidermines.png",
+            "Smart Servos (Siege Tank)":                   github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png",
+            "Graduating Range (Siege Tank)":               github_icon_base_url + "blizzard/btn-upgrade-terran-nova-siegetankrange.png",
+            "Laser Targeting System (Siege Tank)":         github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Advanced Siege Tech (Siege Tank)":            github_icon_base_url + "blizzard/btn-upgrade-raynor-improvedsiegemode.png",
+            "Internal Tech Module (Siege Tank)":           github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Shaped Hull (Siege Tank)":                    organics_icon_base_url + "ShapedHull.png",
+            "Resource Efficiency (Siege Tank)":            github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "330mm Barrage Cannon (Thor)":                 github_icon_base_url + "original/btn-ability-thor-330mm.png",
+            "Immortality Protocol (Thor)":                 github_icon_base_url + "blizzard/btn-techupgrade-terran-immortalityprotocol.png",
+            "Immortality Protocol (Free) (Thor)":          github_icon_base_url + "blizzard/btn-techupgrade-terran-immortalityprotocol.png",
+            "High Impact Payload (Thor)":                  github_icon_base_url + "blizzard/btn-unit-terran-thorsiegemode.png",
+            "Smart Servos (Thor)":                         github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png",
+            "Button With a Skull on It (Thor)":            github_icon_base_url + "blizzard/btn-ability-terran-nuclearstrike-color.png",
+            "Laser Targeting System (Thor)":               github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Large Scale Field Construction (Thor)":       github_icon_base_url + "blizzard/talent-swann-level12-immortalityprotocol.png",
+            "Resource Efficiency (Predator)":              github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Cloak (Predator)":                            github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png",
+            "Charge (Predator)":                           github_icon_base_url + "blizzard/btn-ability-protoss-charge-color.png",
+            "Predator's Fury (Predator)":                  github_icon_base_url + "blizzard/btn-ability-protoss-shadowfury.png",
+            "Drilling Claws (Widow Mine)":                 github_icon_base_url + "blizzard/btn-upgrade-terran-researchdrillingclaws.png",
+            "Concealment (Widow Mine)":                    github_icon_base_url + "blizzard/btn-ability-terran-widowminehidden.png",
+            "Black Market Launchers (Widow Mine)":         github_icon_base_url + "blizzard/btn-ability-hornerhan-widowmine-attackrange.png",
+            "Executioner Missiles (Widow Mine)":           github_icon_base_url + "blizzard/btn-ability-hornerhan-widowmine-deathblossom.png",
+            "Mag-Field Accelerators (Cyclone)":            github_icon_base_url + "blizzard/btn-upgrade-terran-magfieldaccelerator.png",
+            "Mag-Field Launchers (Cyclone)":               github_icon_base_url + "blizzard/btn-upgrade-terran-cyclonerangeupgrade.png",
+            "Targeting Optics (Cyclone)":                  github_icon_base_url + "blizzard/btn-upgrade-swann-targetingoptics.png",
+            "Rapid Fire Launchers (Cyclone)":              github_icon_base_url + "blizzard/btn-upgrade-raynor-ripwavemissiles.png",
+            "Resource Efficiency (Cyclone)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Internal Tech Module (Cyclone)":              github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Resource Efficiency (Warhound)":              github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Reinforced Plating (Warhound)":               github_icon_base_url + "original/btn-research-zerg-fortifiedbunker.png",
 
             "Medivac":                                     "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg",
-            "Wraith":                                      "https://static.wikia.nocookie.net/starcraft/images/7/75/Wraith_WoL.jpg",
+            "Wraith":                                      github_icon_base_url + "blizzard/btn-unit-terran-wraith.png",
             "Viking":                                      "https://static.wikia.nocookie.net/starcraft/images/2/2a/Viking_SC2_Icon1.jpg",
             "Banshee":                                     "https://static.wikia.nocookie.net/starcraft/images/3/32/Banshee_SC2_Icon1.jpg",
             "Battlecruiser":                               "https://static.wikia.nocookie.net/starcraft/images/f/f5/Battlecruiser_SC2_Icon1.jpg",
+            "Raven":                                       "https://static.wikia.nocookie.net/starcraft/images/1/19/SC2_Lab_Raven_Icon.png",
+            "Science Vessel":                              "https://static.wikia.nocookie.net/starcraft/images/c/c3/SC2_Lab_SciVes_Icon.png",
+            "Hercules":                                    "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png",
+            "Liberator":                                   github_icon_base_url + "blizzard/btn-unit-terran-liberator.png",
+            "Valkyrie":                                    github_icon_base_url + "original/btn-unit-terran-valkyrie@scbw.png",
 
-            "Rapid Deployment Tube (Medivac)":             "https://0rganics.org/archipelago/sc2wol/RapidDeploymentTube.png",
-            "Advanced Healing AI (Medivac)":               "https://0rganics.org/archipelago/sc2wol/AdvancedHealingAI.png",
-            "Expanded Hull (Medivac)":                     "/static/static/icons/sc2/neosteelfortifiedarmor.png",
-            "Afterburners (Medivac)":                      "/static/static/icons/sc2/medivacemergencythrusters.png",
-            "Tomahawk Power Cells (Wraith)":               "https://0rganics.org/archipelago/sc2wol/TomahawkPowerCells.png",
-            "Displacement Field (Wraith)":                 "https://0rganics.org/archipelago/sc2wol/DisplacementField.png",
-            "Advanced Laser Technology (Wraith)":          "/static/static/icons/sc2/improvedburstlaser.png",
-            "Ripwave Missiles (Viking)":                   "https://0rganics.org/archipelago/sc2wol/RipwaveMissiles.png",
-            "Phobos-Class Weapons System (Viking)":        "https://0rganics.org/archipelago/sc2wol/Phobos-ClassWeaponsSystem.png",
-            "Smart Servos (Viking)":                       "/static/static/icons/sc2/transformationservos.png",
-            "Magrail Munitions (Viking)":                  "/static/static/icons/sc2/magrailmunitions.png",
-            "Cross-Spectrum Dampeners (Banshee)":          "/static/static/icons/sc2/crossspectrumdampeners.png",
-            "Advanced Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png",
-            "Shockwave Missile Battery (Banshee)":         "https://0rganics.org/archipelago/sc2wol/ShockwaveMissileBattery.png",
-            "Hyperflight Rotors (Banshee)":                "/static/static/icons/sc2/hyperflightrotors.png",
-            "Laser Targeting System (Banshee)":            "/static/static/icons/sc2/lasertargetingsystem.png",
-            "Internal Tech Module (Banshee)":              "/static/static/icons/sc2/internalizedtechmodule.png",
-            "Missile Pods (Battlecruiser)":                "https://0rganics.org/archipelago/sc2wol/MissilePods.png",
-            "Defensive Matrix (Battlecruiser)":            "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png",
-            "Tactical Jump (Battlecruiser)":               "/static/static/icons/sc2/warpjump.png",
-            "Cloak (Battlecruiser)":                       "/static/static/icons/sc2/terran-cloak-color.png",
-            "ATX Laser Battery (Battlecruiser)":           "/static/static/icons/sc2/specialordance.png",
-            "Optimized Logistics (Battlecruiser)":         "/static/static/icons/sc2/optimizedlogistics.png",
-            "Internal Tech Module (Battlecruiser)":        "/static/static/icons/sc2/internalizedtechmodule.png",
-
-            "Ghost":                                       "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg",
-            "Spectre":                                     "https://static.wikia.nocookie.net/starcraft/images/0/0d/Spectre_WoL.jpg",
-            "Thor":                                        "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg",
-
-            "Widow Mine":                                  "/static/static/icons/sc2/widowmine.png",
-            "Cyclone":                                     "/static/static/icons/sc2/cyclone.png",
-            "Liberator":                                   "/static/static/icons/sc2/liberator.png",
-            "Valkyrie":                                    "/static/static/icons/sc2/valkyrie.png",
-
-            "Ocular Implants (Ghost)":                     "https://0rganics.org/archipelago/sc2wol/OcularImplants.png",
-            "Crius Suit (Ghost)":                          "https://0rganics.org/archipelago/sc2wol/CriusSuit.png",
-            "EMP Rounds (Ghost)":                          "/static/static/icons/sc2/terran-emp-color.png",
-            "Lockdown (Ghost)":                            "/static/static/icons/sc2/lockdown.png",
-            "Psionic Lash (Spectre)":                      "https://0rganics.org/archipelago/sc2wol/PsionicLash.png",
-            "Nyx-Class Cloaking Module (Spectre)":         "https://0rganics.org/archipelago/sc2wol/Nyx-ClassCloakingModule.png",
-            "Impaler Rounds (Spectre)":                    "/static/static/icons/sc2/impalerrounds.png",
-            "330mm Barrage Cannon (Thor)":                 "https://0rganics.org/archipelago/sc2wol/330mmBarrageCannon.png",
-            "Immortality Protocol (Thor)":                 "https://0rganics.org/archipelago/sc2wol/ImmortalityProtocol.png",
-            "High Impact Payload (Thor)":                  "/static/static/icons/sc2/thorsiegemode.png",
-            "Smart Servos (Thor)":                         "/static/static/icons/sc2/transformationservos.png",
-
-            "Optimized Logistics (Predator)":              "/static/static/icons/sc2/optimizedlogistics.png",
-            "Drilling Claws (Widow Mine)":                 "/static/static/icons/sc2/drillingclaws.png",
-            "Concealment (Widow Mine)":                    "/static/static/icons/sc2/widowminehidden.png",
-            "Black Market Launchers (Widow Mine)":         "/static/static/icons/sc2/widowmine-attackrange.png",
-            "Executioner Missiles (Widow Mine)":           "/static/static/icons/sc2/widowmine-deathblossom.png",
-            "Mag-Field Accelerators (Cyclone)":            "/static/static/icons/sc2/magfieldaccelerator.png",
-            "Mag-Field Launchers (Cyclone)":               "/static/static/icons/sc2/cyclonerangeupgrade.png",
-            "Targeting Optics (Cyclone)":                  "/static/static/icons/sc2/targetingoptics.png",
-            "Rapid Fire Launchers (Cyclone)":              "/static/static/icons/sc2/ripwavemissiles.png",
-            "Bio Mechanical Repair Drone (Raven)":         "/static/static/icons/sc2/biomechanicaldrone.png",
-            "Spider Mines (Raven)":                        "/static/static/icons/sc2/siegetank-spidermines.png",
-            "Railgun Turret (Raven)":                      "/static/static/icons/sc2/autoturretblackops.png",
-            "Hunter-Seeker Weapon (Raven)":                "/static/static/icons/sc2/specialordance.png",
-            "Interference Matrix (Raven)":                 "/static/static/icons/sc2/interferencematrix.png",
-            "Anti-Armor Missile (Raven)":                  "/static/static/icons/sc2/shreddermissile.png",
-            "Internal Tech Module (Raven)":                "/static/static/icons/sc2/internalizedtechmodule.png",
-            "EMP Shockwave (Science Vessel)":              "/static/static/icons/sc2/staticempblast.png",
-            "Defensive Matrix (Science Vessel)":           "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png",
-            "Advanced Ballistics (Liberator)":             "/static/static/icons/sc2/advanceballistics.png",
-            "Raid Artillery (Liberator)":                  "/static/static/icons/sc2/terrandefendermodestructureattack.png",
-            "Cloak (Liberator)":                           "/static/static/icons/sc2/terran-cloak-color.png",
-            "Laser Targeting System (Liberator)":          "/static/static/icons/sc2/lasertargetingsystem.png",
-            "Optimized Logistics (Liberator)":             "/static/static/icons/sc2/optimizedlogistics.png",
-            "Enhanced Cluster Launchers (Valkyrie)":       "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png",
-            "Shaped Hull (Valkyrie)":                      "https://0rganics.org/archipelago/sc2wol/ShapedHull.png",
-            "Burst Lasers (Valkyrie)":                     "/static/static/icons/sc2/improvedburstlaser.png",
-            "Afterburners (Valkyrie)":                     "/static/static/icons/sc2/medivacemergencythrusters.png",
+            "Rapid Deployment Tube (Medivac)":             organics_icon_base_url + "RapidDeploymentTube.png",
+            "Advanced Healing AI (Medivac)":               github_icon_base_url + "blizzard/btn-ability-mengsk-medivac-doublehealbeam.png",
+            "Expanded Hull (Medivac)":                     github_icon_base_url + "blizzard/btn-upgrade-mengsk-engineeringbay-neosteelfortifiedarmor.png",
+            "Afterburners (Medivac)":                      github_icon_base_url + "blizzard/btn-upgrade-terran-medivacemergencythrusters.png",
+            "Scatter Veil (Medivac)":                      github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png",
+            "Advanced Cloaking Field (Medivac)":           github_icon_base_url + "original/btn-permacloak-medivac.png",
+            "Tomahawk Power Cells (Wraith)":               organics_icon_base_url + "TomahawkPowerCells.png",
+            "Unregistered Cloaking Module (Wraith)":       github_icon_base_url + "original/btn-permacloak-wraith.png",
+            "Trigger Override (Wraith)":                   github_icon_base_url + "blizzard/btn-ability-hornerhan-wraith-attackspeed.png",
+            "Internal Tech Module (Wraith)":               github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Resource Efficiency (Wraith)":                github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Displacement Field (Wraith)":                 github_icon_base_url + "blizzard/btn-upgrade-swann-displacementfield.png",
+            "Advanced Laser Technology (Wraith)":          github_icon_base_url + "blizzard/btn-upgrade-swann-improvedburstlaser.png",
+            "Ripwave Missiles (Viking)":                   github_icon_base_url + "blizzard/btn-upgrade-raynor-ripwavemissiles.png",
+            "Phobos-Class Weapons System (Viking)":        github_icon_base_url + "blizzard/btn-upgrade-raynor-phobosclassweaponssystem.png",
+            "Smart Servos (Viking)":                       github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png",
+            "Anti-Mechanical Munition (Viking)":           github_icon_base_url + "blizzard/btn-ability-terran-ignorearmor.png",
+            "Shredder Rounds (Viking)":                    github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-piercingattacks.png",
+            "W.I.L.D. Missiles (Viking)":                  github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-missileupgrade.png",
+            "Cross-Spectrum Dampeners (Banshee)":          github_icon_base_url + "original/btn-banshee-cross-spectrum-dampeners.png",
+            "Advanced Cross-Spectrum Dampeners (Banshee)": github_icon_base_url + "original/btn-permacloak-banshee.png",
+            "Shockwave Missile Battery (Banshee)":         github_icon_base_url + "blizzard/btn-upgrade-raynor-shockwavemissilebattery.png",
+            "Hyperflight Rotors (Banshee)":                github_icon_base_url + "blizzard/btn-upgrade-terran-hyperflightrotors.png",
+            "Laser Targeting System (Banshee)":            github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Internal Tech Module (Banshee)":              github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Shaped Hull (Banshee)":                       organics_icon_base_url + "ShapedHull.png",
+            "Advanced Targeting Optics (Banshee)":         github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png",
+            "Distortion Blasters (Banshee)":               github_icon_base_url + "blizzard/btn-techupgrade-terran-cloakdistortionfield.png",
+            "Rocket Barrage (Banshee)":                    github_icon_base_url + "blizzard/btn-upgrade-terran-nova-bansheemissilestrik.png",
+            "Missile Pods (Battlecruiser) Level 1":        organics_icon_base_url + "MissilePods.png",
+            "Missile Pods (Battlecruiser) Level 2":        github_icon_base_url + "blizzard/btn-upgrade-terran-nova-bansheemissilestrik.png",
+            "Defensive Matrix (Battlecruiser)":            github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png",
+            "Advanced Defensive Matrix (Battlecruiser)":   github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png",
+            "Tactical Jump (Battlecruiser)":               github_icon_base_url + "blizzard/btn-ability-terran-warpjump.png",
+            "Cloak (Battlecruiser)":                       github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png",
+            "ATX Laser Battery (Battlecruiser)":           github_icon_base_url + "blizzard/btn-upgrade-terran-nova-specialordance.png",
+            "Optimized Logistics (Battlecruiser)":         github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png",
+            "Internal Tech Module (Battlecruiser)":        github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Behemoth Plating (Battlecruiser)":            github_icon_base_url + "original/btn-research-zerg-fortifiedbunker.png",
+            "Covert Ops Engines (Battlecruiser)":          github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png",
+            "Bio Mechanical Repair Drone (Raven)":         github_icon_base_url + "blizzard/btn-unit-biomechanicaldrone.png",
+            "Spider Mines (Raven)":                        github_icon_base_url + "blizzard/btn-upgrade-siegetank-spidermines.png",
+            "Railgun Turret (Raven)":                      github_icon_base_url + "blizzard/btn-unit-terran-autoturretblackops.png",
+            "Hunter-Seeker Weapon (Raven)":                github_icon_base_url + "blizzard/btn-upgrade-terran-nova-specialordance.png",
+            "Interference Matrix (Raven)":                 github_icon_base_url + "blizzard/btn-upgrade-terran-interferencematrix.png",
+            "Anti-Armor Missile (Raven)":                  github_icon_base_url + "blizzard/btn-ability-terran-shreddermissile-color.png",
+            "Internal Tech Module (Raven)":                github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Resource Efficiency (Raven)":                 github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Durable Materials (Raven)":                   github_icon_base_url + "blizzard/btn-upgrade-terran-durablematerials.png",
+            "EMP Shockwave (Science Vessel)":              github_icon_base_url + "blizzard/btn-ability-mengsk-ghost-staticempblast.png",
+            "Defensive Matrix (Science Vessel)":           github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png",
+            "Improved Nano-Repair (Science Vessel)":       github_icon_base_url + "blizzard/btn-upgrade-swann-improvednanorepair.png",
+            "Advanced AI Systems (Science Vessel)":        github_icon_base_url + "blizzard/btn-ability-mengsk-medivac-doublehealbeam.png",
+            "Internal Fusion Module (Hercules)":           github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png",
+            "Tactical Jump (Hercules)":                    github_icon_base_url + "blizzard/btn-ability-terran-hercules-tacticaljump.png",
+            "Advanced Ballistics (Liberator)":             github_icon_base_url + "blizzard/btn-upgrade-terran-advanceballistics.png",
+            "Raid Artillery (Liberator)":                  github_icon_base_url + "blizzard/btn-upgrade-terran-nova-terrandefendermodestructureattack.png",
+            "Cloak (Liberator)":                           github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png",
+            "Laser Targeting System (Liberator)":          github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png",
+            "Optimized Logistics (Liberator)":             github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png",
+            "Smart Servos (Liberator)":                    github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png",
+            "Resource Efficiency (Liberator)":             github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Enhanced Cluster Launchers (Valkyrie)":       github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png",
+            "Shaped Hull (Valkyrie)":                      organics_icon_base_url + "ShapedHull.png",
+            "Flechette Missiles (Valkyrie)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-missileupgrade.png",
+            "Afterburners (Valkyrie)":                     github_icon_base_url + "blizzard/btn-upgrade-terran-medivacemergencythrusters.png",
+            "Launching Vector Compensator (Valkyrie)":     github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png",
+            "Resource Efficiency (Valkyrie)":              github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
 
             "War Pigs":                                    "https://static.wikia.nocookie.net/starcraft/images/e/ed/WarPigs_SC2_Icon1.jpg",
             "Devil Dogs":                                  "https://static.wikia.nocookie.net/starcraft/images/3/33/DevilDogs_SC2_Icon1.jpg",
             "Hammer Securities":                           "https://static.wikia.nocookie.net/starcraft/images/3/3b/HammerSecurity_SC2_Icon1.jpg",
             "Spartan Company":                             "https://static.wikia.nocookie.net/starcraft/images/b/be/SpartanCompany_SC2_Icon1.jpg",
             "Siege Breakers":                              "https://static.wikia.nocookie.net/starcraft/images/3/31/SiegeBreakers_SC2_Icon1.jpg",
-            "Hel's Angel":                                 "https://static.wikia.nocookie.net/starcraft/images/6/63/HelsAngels_SC2_Icon1.jpg",
+            "Hel's Angels":                                "https://static.wikia.nocookie.net/starcraft/images/6/63/HelsAngels_SC2_Icon1.jpg",
             "Dusk Wings":                                  "https://static.wikia.nocookie.net/starcraft/images/5/52/DuskWings_SC2_Icon1.jpg",
             "Jackson's Revenge":                           "https://static.wikia.nocookie.net/starcraft/images/9/95/JacksonsRevenge_SC2_Icon1.jpg",
+            "Skibi's Angels":                              github_icon_base_url + "blizzard/btn-unit-terran-medicelite.png",
+            "Death Heads":                                 github_icon_base_url + "blizzard/btn-unit-terran-deathhead.png",
+            "Winged Nightmares":                           github_icon_base_url + "blizzard/btn-unit-collection-wraith-junker.png",
+            "Midnight Riders":                             github_icon_base_url + "blizzard/btn-unit-terran-liberatorblackops.png",
+            "Brynhilds":                                   github_icon_base_url + "blizzard/btn-unit-collection-vikingfighter-covertops.png",
+            "Jotun":                                       github_icon_base_url + "blizzard/btn-unit-terran-thormengsk.png",
 
             "Ultra-Capacitors":                            "https://static.wikia.nocookie.net/starcraft/images/2/23/SC2_Lab_Ultra_Capacitors_Icon.png",
             "Vanadium Plating":                            "https://static.wikia.nocookie.net/starcraft/images/6/67/SC2_Lab_VanPlating_Icon.png",
@@ -1766,8 +1852,6 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
             "Micro-Filtering":                             "https://static.wikia.nocookie.net/starcraft/images/2/20/SC2_Lab_MicroFilter_Icon.png",
             "Automated Refinery":                          "https://static.wikia.nocookie.net/starcraft/images/7/71/SC2_Lab_Auto_Refinery_Icon.png",
             "Command Center Reactor":                      "https://static.wikia.nocookie.net/starcraft/images/e/ef/SC2_Lab_CC_Reactor_Icon.png",
-            "Raven":                                       "https://static.wikia.nocookie.net/starcraft/images/1/19/SC2_Lab_Raven_Icon.png",
-            "Science Vessel":                              "https://static.wikia.nocookie.net/starcraft/images/c/c3/SC2_Lab_SciVes_Icon.png",
             "Tech Reactor":                                "https://static.wikia.nocookie.net/starcraft/images/c/c5/SC2_Lab_Tech_Reactor_Icon.png",
             "Orbital Strike":                              "https://static.wikia.nocookie.net/starcraft/images/d/df/SC2_Lab_Orb_Strike_Icon.png",
 
@@ -1775,23 +1859,372 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
             "Fortified Bunker (Bunker)":                   "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png",
             "Planetary Fortress":                          "https://static.wikia.nocookie.net/starcraft/images/0/0b/SC2_Lab_PlanetFortress_Icon.png",
             "Perdition Turret":                            "https://static.wikia.nocookie.net/starcraft/images/a/af/SC2_Lab_PerdTurret_Icon.png",
-            "Predator":                                    "https://static.wikia.nocookie.net/starcraft/images/8/83/SC2_Lab_Predator_Icon.png",
-            "Hercules":                                    "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png",
             "Cellular Reactor":                            "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png",
-            "Regenerative Bio-Steel Level 1":              "/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png",
-            "Regenerative Bio-Steel Level 2":              "/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png",
+            "Regenerative Bio-Steel Level 1":              github_icon_base_url + "original/btn-regenerativebiosteel-green.png",
+            "Regenerative Bio-Steel Level 2":              github_icon_base_url + "original/btn-regenerativebiosteel-blue.png",
+            "Regenerative Bio-Steel Level 3":              github_icon_base_url + "blizzard/btn-research-zerg-regenerativebio-steel.png",
             "Hive Mind Emulator":                          "https://static.wikia.nocookie.net/starcraft/images/b/bc/SC2_Lab_Hive_Emulator_Icon.png",
             "Psi Disrupter":                               "https://static.wikia.nocookie.net/starcraft/images/c/cf/SC2_Lab_Psi_Disruptor_Icon.png",
 
-            "Zealot":                                      "https://static.wikia.nocookie.net/starcraft/images/6/6e/Icon_Protoss_Zealot.jpg",
+            "Structure Armor":                             github_icon_base_url + "blizzard/btn-upgrade-terran-buildingarmor.png",
+            "Hi-Sec Auto Tracking":                        github_icon_base_url + "blizzard/btn-upgrade-terran-hisecautotracking.png",
+            "Advanced Optics":                             github_icon_base_url + "blizzard/btn-upgrade-swann-vehiclerangeincrease.png",
+            "Rogue Forces":                                github_icon_base_url + "blizzard/btn-unit-terran-tosh.png",
+
+            "Ghost Visor (Nova Equipment)":                github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-ghostvisor.png",
+            "Rangefinder Oculus (Nova Equipment)":         github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-rangefinderoculus.png",
+            "Domination (Nova Ability)":                   github_icon_base_url + "blizzard/btn-ability-nova-domination.png",
+            "Blink (Nova Ability)":                        github_icon_base_url + "blizzard/btn-upgrade-nova-blink.png",
+            "Stealth Suit Module (Nova Suit Module)":      github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-stealthsuit.png",
+            "Cloak (Nova Suit Module)":                    github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png",
+            "Permanently Cloaked (Nova Suit Module)":      github_icon_base_url + "blizzard/btn-upgrade-nova-tacticalstealthsuit.png",
+            "Energy Suit Module (Nova Suit Module)":       github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-apolloinfantrysuit.png",
+            "Armored Suit Module (Nova Suit Module)":      github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-blinksuit.png",
+            "Jump Suit Module (Nova Suit Module)":         github_icon_base_url + "blizzard/btn-upgrade-nova-jetpack.png",
+            "C20A Canister Rifle (Nova Weapon)":           github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-canisterrifle.png",
+            "Hellfire Shotgun (Nova Weapon)":              github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-shotgun.png",
+            "Plasma Rifle (Nova Weapon)":                  github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-plasmagun.png",
+            "Monomolecular Blade (Nova Weapon)":           github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-monomolecularblade.png",
+            "Blazefire Gunblade (Nova Weapon)":            github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-gunblade_sword.png",
+            "Stim Infusion (Nova Gadget)":                 github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png",
+            "Pulse Grenades (Nova Gadget)":                github_icon_base_url + "blizzard/btn-upgrade-nova-btn-upgrade-nova-pulsegrenade.png",
+            "Flashbang Grenades (Nova Gadget)":            github_icon_base_url + "blizzard/btn-upgrade-nova-btn-upgrade-nova-flashgrenade.png",
+            "Ionic Force Field (Nova Gadget)":             github_icon_base_url + "blizzard/btn-upgrade-terran-nova-personaldefensivematrix.png",
+            "Holo Decoy (Nova Gadget)":                    github_icon_base_url + "blizzard/btn-upgrade-nova-holographicdecoy.png",
+            "Tac Nuke Strike (Nova Ability)":              github_icon_base_url + "blizzard/btn-ability-terran-nuclearstrike-color.png",
+
+            "Zerg Melee Attack Level 1":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level1.png",
+            "Zerg Melee Attack Level 2":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level2.png",
+            "Zerg Melee Attack Level 3":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level3.png",
+            "Zerg Missile Attack Level 1":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level1.png",
+            "Zerg Missile Attack Level 2":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level2.png",
+            "Zerg Missile Attack Level 3":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level3.png",
+            "Zerg Ground Carapace Level 1":                github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level1.png",
+            "Zerg Ground Carapace Level 2":                github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level2.png",
+            "Zerg Ground Carapace Level 3":                github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level3.png",
+            "Zerg Flyer Attack Level 1":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level1.png",
+            "Zerg Flyer Attack Level 2":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level2.png",
+            "Zerg Flyer Attack Level 3":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level3.png",
+            "Zerg Flyer Carapace Level 1":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level1.png",
+            "Zerg Flyer Carapace Level 2":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level2.png",
+            "Zerg Flyer Carapace Level 3":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level3.png",
+
+            "Automated Extractors (Kerrigan Tier 3)":      github_icon_base_url + "blizzard/btn-ability-kerrigan-automatedextractors.png",
+            "Vespene Efficiency (Kerrigan Tier 5)":        github_icon_base_url + "blizzard/btn-ability-kerrigan-vespeneefficiency.png",
+            "Twin Drones (Kerrigan Tier 5)":               github_icon_base_url + "blizzard/btn-ability-kerrigan-twindrones.png",
+            "Improved Overlords (Kerrigan Tier 3)":        github_icon_base_url + "blizzard/btn-ability-kerrigan-improvedoverlords.png",
+            "Ventral Sacs (Overlord)":                     github_icon_base_url + "blizzard/btn-upgrade-zerg-ventralsacs.png",
+            "Malignant Creep (Kerrigan Tier 5)":           github_icon_base_url + "blizzard/btn-ability-kerrigan-malignantcreep.png",
+
+            "Spine Crawler":                               github_icon_base_url + "blizzard/btn-building-zerg-spinecrawler.png",
+            "Spore Crawler":                               github_icon_base_url + "blizzard/btn-building-zerg-sporecrawler.png",
+
+            "Zergling":                                    github_icon_base_url + "blizzard/btn-unit-zerg-zergling.png",
+            "Swarm Queen":                                 github_icon_base_url + "blizzard/btn-unit-zerg-broodqueen.png",
+            "Roach":                                       github_icon_base_url + "blizzard/btn-unit-zerg-roach.png",
+            "Hydralisk":                                   github_icon_base_url + "blizzard/btn-unit-zerg-hydralisk.png",
+            "Aberration":                                  github_icon_base_url + "blizzard/btn-unit-zerg-aberration.png",
+            "Mutalisk":                                    github_icon_base_url + "blizzard/btn-unit-zerg-mutalisk.png",
+            "Corruptor":                                   github_icon_base_url + "blizzard/btn-unit-zerg-corruptor.png",
+            "Swarm Host":                                  github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost.png",
+            "Infestor":                                    github_icon_base_url + "blizzard/btn-unit-zerg-infestor.png",
+            "Defiler":                                     github_icon_base_url + "original/btn-unit-zerg-defiler@scbw.png",
+            "Ultralisk":                                   github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk.png",
+            "Brood Queen":                                 github_icon_base_url + "blizzard/btn-unit-zerg-classicqueen.png",
+            "Scourge":                                     github_icon_base_url + "blizzard/btn-unit-zerg-scourge.png",
+
+            "Baneling Aspect (Zergling)":                  github_icon_base_url + "blizzard/btn-unit-zerg-baneling.png",
+            "Ravager Aspect (Roach)":                      github_icon_base_url + "blizzard/btn-unit-zerg-ravager.png",
+            "Impaler Aspect (Hydralisk)":                  github_icon_base_url + "blizzard/btn-unit-zerg-impaler.png",
+            "Lurker Aspect (Hydralisk)":                   github_icon_base_url + "blizzard/btn-unit-zerg-lurker.png",
+            "Brood Lord Aspect (Mutalisk/Corruptor)":      github_icon_base_url + "blizzard/btn-unit-zerg-broodlord.png",
+            "Viper Aspect (Mutalisk/Corruptor)":           github_icon_base_url + "blizzard/btn-unit-zerg-viper.png",
+            "Guardian Aspect (Mutalisk/Corruptor)":        github_icon_base_url + "blizzard/btn-unit-zerg-primalguardian.png",
+            "Devourer Aspect (Mutalisk/Corruptor)":        github_icon_base_url + "blizzard/btn-unit-zerg-devourerex3.png",
+
+            "Raptor Strain (Zergling)":                    github_icon_base_url + "blizzard/btn-unit-zerg-zergling-raptor.png",
+            "Swarmling Strain (Zergling)":                 github_icon_base_url + "blizzard/btn-unit-zerg-zergling-swarmling.png",
+            "Hardened Carapace (Zergling)":                github_icon_base_url + "blizzard/btn-upgrade-zerg-hardenedcarapace.png",
+            "Adrenal Overload (Zergling)":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-adrenaloverload.png",
+            "Metabolic Boost (Zergling)":                  github_icon_base_url + "blizzard/btn-upgrade-zerg-hotsmetabolicboost.png",
+            "Shredding Claws (Zergling)":                  github_icon_base_url + "blizzard/btn-upgrade-zergling-armorshredding.png",
+            "Zergling Reconstitution (Kerrigan Tier 3)":   github_icon_base_url + "blizzard/btn-ability-kerrigan-zerglingreconstitution.png",
+            "Splitter Strain (Baneling)":                  github_icon_base_url + "blizzard/talent-zagara-level14-unlocksplitterling.png",
+            "Hunter Strain (Baneling)":                    github_icon_base_url + "blizzard/btn-ability-zerg-cliffjump-baneling.png",
+            "Corrosive Acid (Baneling)":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-corrosiveacid.png",
+            "Rupture (Baneling)":                          github_icon_base_url + "blizzard/btn-upgrade-zerg-rupture.png",
+            "Regenerative Acid (Baneling)":                github_icon_base_url + "blizzard/btn-upgrade-zerg-regenerativebile.png",
+            "Centrifugal Hooks (Baneling)":                github_icon_base_url + "blizzard/btn-upgrade-zerg-centrifugalhooks.png",
+            "Tunneling Jaws (Baneling)":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-tunnelingjaws.png",
+            "Rapid Metamorph (Baneling)":                  github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png",
+            "Spawn Larvae (Swarm Queen)":                  github_icon_base_url + "blizzard/btn-unit-zerg-larva.png",
+            "Deep Tunnel (Swarm Queen)":                   github_icon_base_url + "blizzard/btn-ability-zerg-deeptunnel.png",
+            "Organic Carapace (Swarm Queen)":              github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png",
+            "Bio-Mechanical Transfusion (Swarm Queen)":    github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-biomechanicaltransfusion.png",
+            "Resource Efficiency (Swarm Queen)":           github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Incubator Chamber (Swarm Queen)":             github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-incubationchamber.png",
+            "Vile Strain (Roach)":                         github_icon_base_url + "blizzard/btn-unit-zerg-roach-vile.png",
+            "Corpser Strain (Roach)":                      github_icon_base_url + "blizzard/btn-unit-zerg-roach-corpser.png",
+            "Hydriodic Bile (Roach)":                      github_icon_base_url + "blizzard/btn-upgrade-zerg-hydriaticacid.png",
+            "Adaptive Plating (Roach)":                    github_icon_base_url + "blizzard/btn-upgrade-zerg-adaptivecarapace.png",
+            "Tunneling Claws (Roach)":                     github_icon_base_url + "blizzard/btn-upgrade-zerg-hotstunnelingclaws.png",
+            "Glial Reconstitution (Roach)":                github_icon_base_url + "blizzard/btn-upgrade-zerg-glialreconstitution.png",
+            "Organic Carapace (Roach)":                    github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png",
+            "Potent Bile (Ravager)":                       github_icon_base_url + "blizzard/potentbile_coop.png",
+            "Bloated Bile Ducts (Ravager)":                github_icon_base_url + "blizzard/btn-ability-zerg-abathur-corrosivebilelarge.png",
+            "Deep Tunnel (Ravager)":                       github_icon_base_url + "blizzard/btn-ability-zerg-deeptunnel.png",
+            "Frenzy (Hydralisk)":                          github_icon_base_url + "blizzard/btn-upgrade-zerg-frenzy.png",
+            "Ancillary Carapace (Hydralisk)":              github_icon_base_url + "blizzard/btn-upgrade-zerg-ancillaryarmor.png",
+            "Grooved Spines (Hydralisk)":                  github_icon_base_url + "blizzard/btn-upgrade-zerg-hotsgroovedspines.png",
+            "Muscular Augments (Hydralisk)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-evolvemuscularaugments.png",
+            "Resource Efficiency (Hydralisk)":             github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Adaptive Talons (Impaler)":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-adaptivetalons.png",
+            "Secretion Glands (Impaler)":                  github_icon_base_url + "blizzard/btn-ability-zerg-creepspread.png",
+            "Hardened Tentacle Spines (Impaler)":          github_icon_base_url + "blizzard/btn-ability-zerg-dehaka-impaler-tenderize.png",
+            "Seismic Spines (Lurker)":                     github_icon_base_url + "blizzard/btn-upgrade-kerrigan-seismicspines.png",
+            "Adapted Spines (Lurker)":                     github_icon_base_url + "blizzard/btn-upgrade-zerg-groovedspines.png",
+            "Vicious Glaive (Mutalisk)":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-viciousglaive.png",
+            "Rapid Regeneration (Mutalisk)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-rapidregeneration.png",
+            "Sundering Glaive (Mutalisk)":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-explosiveglaive.png",
+            "Severing Glaive (Mutalisk)":                  github_icon_base_url + "blizzard/btn-upgrade-zerg-explosiveglaive.png",
+            "Aerodynamic Glaive Shape (Mutalisk)":         github_icon_base_url + "blizzard/btn-ability-dehaka-airbonusdamage.png",
+            "Corruption (Corruptor)":                      github_icon_base_url + "blizzard/btn-ability-zerg-causticspray.png",
+            "Caustic Spray (Corruptor)":                   github_icon_base_url + "blizzard/btn-ability-zerg-corruption-color.png",
+            "Porous Cartilage (Brood Lord)":               github_icon_base_url + "blizzard/btn-upgrade-kerrigan-broodlordspeed.png",
+            "Evolved Carapace (Brood Lord)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-chitinousplating.png",
+            "Splitter Mitosis (Brood Lord)":               github_icon_base_url + "blizzard/abilityicon_spawnbroodlings_square.png",
+            "Resource Efficiency (Brood Lord)":            github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Parasitic Bomb (Viper)":                      github_icon_base_url + "blizzard/btn-ability-zerg-parasiticbomb.png",
+            "Paralytic Barbs (Viper)":                     github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-abduct.png",
+            "Virulent Microbes (Viper)":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-castrange.png",
+            "Prolonged Dispersion (Guardian)":             github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-prolongeddispersion.png",
+            "Primal Adaptation (Guardian)":                github_icon_base_url + "blizzard/biomassrecovery_coop.png",
+            "Soronan Acid (Guardian)":                     github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-biomass.png",
+            "Corrosive Spray (Devourer)":                  github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-devourer-corrosivespray.png",
+            "Gaping Maw (Devourer)":                       github_icon_base_url + "blizzard/btn-ability-zerg-explode-color.png",
+            "Improved Osmosis (Devourer)":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-pneumatizedcarapace.png",
+            "Prescient Spores (Devourer)":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level2.png",
+            "Carrion Strain (Swarm Host)":                 github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost-carrion.png",
+            "Creeper Strain (Swarm Host)":                 github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost-creeper.png",
+            "Burrow (Swarm Host)":                         github_icon_base_url + "blizzard/btn-ability-zerg-burrow-color.png",
+            "Rapid Incubation (Swarm Host)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-rapidincubation.png",
+            "Pressurized Glands (Swarm Host)":             github_icon_base_url + "blizzard/btn-upgrade-zerg-pressurizedglands.png",
+            "Locust Metabolic Boost (Swarm Host)":         github_icon_base_url + "blizzard/btn-upgrade-zerg-glialreconstitution.png",
+            "Enduring Locusts (Swarm Host)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-evolveincreasedlocustlifetime.png",
+            "Organic Carapace (Swarm Host)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png",
+            "Resource Efficiency (Swarm Host)":            github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Infested Terran (Infestor)":                  github_icon_base_url + "blizzard/btn-unit-zerg-infestedmarine.png",
+            "Microbial Shroud (Infestor)":                 github_icon_base_url + "blizzard/btn-ability-zerg-darkswarm.png",
+            "Noxious Strain (Ultralisk)":                  github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk-noxious.png",
+            "Torrasque Strain (Ultralisk)":                github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk-torrasque.png",
+            "Burrow Charge (Ultralisk)":                   github_icon_base_url + "blizzard/btn-upgrade-zerg-burrowcharge.png",
+            "Tissue Assimilation (Ultralisk)":             github_icon_base_url + "blizzard/btn-upgrade-zerg-tissueassimilation.png",
+            "Monarch Blades (Ultralisk)":                  github_icon_base_url + "blizzard/btn-upgrade-zerg-monarchblades.png",
+            "Anabolic Synthesis (Ultralisk)":              github_icon_base_url + "blizzard/btn-upgrade-zerg-anabolicsynthesis.png",
+            "Chitinous Plating (Ultralisk)":               github_icon_base_url + "blizzard/btn-upgrade-zerg-chitinousplating.png",
+            "Organic Carapace (Ultralisk)":                github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png",
+            "Resource Efficiency (Ultralisk)":             github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Fungal Growth (Brood Queen)":                 github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-researchqueenfungalgrowth.png",
+            "Ensnare (Brood Queen)":                       github_icon_base_url + "blizzard/btn-ability-zerg-fungalgrowth-color.png",
+            "Enhanced Mitochondria (Brood Queen)":         github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-queenenergyregen.png",
+            "Virulent Spores (Scourge)":                   github_icon_base_url + "blizzard/btn-upgrade-zagara-scourgesplashdamage.png",
+            "Resource Efficiency (Scourge)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Swarm Scourge (Scourge)":                     github_icon_base_url + "original/btn-upgrade-custom-triple-scourge.png",
+
+            "Infested Medics":                             github_icon_base_url + "blizzard/btn-unit-terran-medicelite.png",
+            "Infested Siege Tanks":                        github_icon_base_url + "original/btn-unit-terran-siegetankmercenary-tank.png",
+            "Infested Banshees":                           github_icon_base_url + "original/btn-unit-terran-bansheemercenary.png",
+
+            "Primal Form (Kerrigan)":                      github_icon_base_url + "blizzard/btn-unit-zerg-kerriganinfested.png",
+            "Kinetic Blast (Kerrigan Tier 1)":             github_icon_base_url + "blizzard/btn-ability-kerrigan-kineticblast.png",
+            "Heroic Fortitude (Kerrigan Tier 1)":          github_icon_base_url + "blizzard/btn-ability-kerrigan-heroicfortitude.png",
+            "Leaping Strike (Kerrigan Tier 1)":            github_icon_base_url + "blizzard/btn-ability-kerrigan-leapingstrike.png",
+            "Crushing Grip (Kerrigan Tier 2)":             github_icon_base_url + "blizzard/btn-ability-swarm-kerrigan-crushinggrip.png",
+            "Chain Reaction (Kerrigan Tier 2)":            github_icon_base_url + "blizzard/btn-ability-swarm-kerrigan-chainreaction.png",
+            "Psionic Shift (Kerrigan Tier 2)":             github_icon_base_url + "blizzard/btn-ability-kerrigan-psychicshift.png",
+            "Wild Mutation (Kerrigan Tier 4)":             github_icon_base_url + "blizzard/btn-ability-kerrigan-wildmutation.png",
+            "Spawn Banelings (Kerrigan Tier 4)":           github_icon_base_url + "blizzard/abilityicon_spawnbanelings_square.png",
+            "Mend (Kerrigan Tier 4)":                      github_icon_base_url + "blizzard/btn-ability-zerg-transfusion-color.png",
+            "Infest Broodlings (Kerrigan Tier 6)":         github_icon_base_url + "blizzard/abilityicon_spawnbroodlings_square.png",
+            "Fury (Kerrigan Tier 6)":                      github_icon_base_url + "blizzard/btn-ability-kerrigan-fury.png",
+            "Ability Efficiency (Kerrigan Tier 6)":        github_icon_base_url + "blizzard/btn-ability-kerrigan-abilityefficiency.png",
+            "Apocalypse (Kerrigan Tier 7)":                github_icon_base_url + "blizzard/btn-ability-kerrigan-apocalypse.png",
+            "Spawn Leviathan (Kerrigan Tier 7)":           github_icon_base_url + "blizzard/btn-unit-zerg-leviathan.png",
+            "Drop-Pods (Kerrigan Tier 7)":                 github_icon_base_url + "blizzard/btn-ability-kerrigan-droppods.png",
+
+            "Protoss Ground Weapon Level 1":               github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel1.png",
+            "Protoss Ground Weapon Level 2":               github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel2.png",
+            "Protoss Ground Weapon Level 3":               github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel3.png",
+            "Protoss Ground Armor Level 1":                github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel1.png",
+            "Protoss Ground Armor Level 2":                github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel2.png",
+            "Protoss Ground Armor Level 3":                github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel3.png",
+            "Protoss Shields Level 1":                     github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png",
+            "Protoss Shields Level 2":                     github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel2.png",
+            "Protoss Shields Level 3":                     github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel3.png",
+            "Protoss Air Weapon Level 1":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel1.png",
+            "Protoss Air Weapon Level 2":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel2.png",
+            "Protoss Air Weapon Level 3":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel3.png",
+            "Protoss Air Armor Level 1":                   github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel1.png",
+            "Protoss Air Armor Level 2":                   github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel2.png",
+            "Protoss Air Armor Level 3":                   github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel3.png",
+
+            "Quatro":                                      github_icon_base_url + "blizzard/btn-progression-protoss-fenix-6-forgeresearch.png",
+
+            "Photon Cannon":                               github_icon_base_url + "blizzard/btn-building-protoss-photoncannon.png",
+            "Khaydarin Monolith":                          github_icon_base_url + "blizzard/btn-unit-protoss-khaydarinmonolith.png",
+            "Shield Battery":                              github_icon_base_url + "blizzard/btn-building-protoss-shieldbattery.png",
+
+            "Enhanced Targeting":                          github_icon_base_url + "blizzard/btn-upgrade-karax-turretrange.png",
+            "Optimized Ordnance":                          github_icon_base_url + "blizzard/btn-upgrade-karax-turretattackspeed.png",
+            "Khalai Ingenuity":                            github_icon_base_url + "blizzard/btn-upgrade-karax-pylonwarpininstantly.png",
+            "Orbital Assimilators":                        github_icon_base_url + "blizzard/btn-ability-spearofadun-orbitalassimilator.png",
+            "Amplified Assimilators":                      github_icon_base_url + "original/btn-research-terran-microfiltering.png",
+            "Warp Harmonization":                          github_icon_base_url + "blizzard/btn-ability-spearofadun-warpharmonization.png",
+            "Superior Warp Gates":                         github_icon_base_url + "blizzard/talent-artanis-level03-warpgatecharges.png",
+            "Nexus Overcharge":                            github_icon_base_url + "blizzard/btn-ability-spearofadun-nexusovercharge.png",
+
+            "Zealot":                                      github_icon_base_url + "blizzard/btn-unit-protoss-zealot-aiur.png",
+            "Centurion":                                   github_icon_base_url + "blizzard/btn-unit-protoss-zealot-nerazim.png",
+            "Sentinel":                                    github_icon_base_url + "blizzard/btn-unit-protoss-zealot-purifier.png",
+            "Supplicant":                                  github_icon_base_url + "blizzard/btn-unit-protoss-alarak-taldarim-supplicant.png",
+            "Sentry":                                      github_icon_base_url + "blizzard/btn-unit-protoss-sentry.png",
+            "Energizer":                                   github_icon_base_url + "blizzard/btn-unit-protoss-sentry-purifier.png",
+            "Havoc":                                       github_icon_base_url + "blizzard/btn-unit-protoss-sentry-taldarim.png",
             "Stalker":                                     "https://static.wikia.nocookie.net/starcraft/images/0/0d/Icon_Protoss_Stalker.jpg",
+            "Instigator":                                  github_icon_base_url + "blizzard/btn-unit-protoss-stalker-purifier.png",
+            "Slayer":                                      github_icon_base_url + "blizzard/btn-unit-protoss-alarak-taldarim-stalker.png",
+            "Dragoon":                                     github_icon_base_url + "blizzard/btn-unit-protoss-dragoon-void.png",
+            "Adept":                                       github_icon_base_url + "blizzard/btn-unit-protoss-adept-purifier.png",
             "High Templar":                                "https://static.wikia.nocookie.net/starcraft/images/a/a0/Icon_Protoss_High_Templar.jpg",
+            "Signifier":                                   github_icon_base_url + "original/btn-unit-protoss-hightemplar-nerazim.png",
+            "Ascendant":                                   github_icon_base_url + "blizzard/btn-unit-protoss-hightemplar-taldarim.png",
+            "Dark Archon":                                 github_icon_base_url + "blizzard/talent-vorazun-level05-unlockdarkarchon.png",
             "Dark Templar":                                "https://static.wikia.nocookie.net/starcraft/images/9/90/Icon_Protoss_Dark_Templar.jpg",
+            "Avenger":                                     github_icon_base_url + "blizzard/btn-unit-protoss-darktemplar-aiur.png",
+            "Blood Hunter":                                github_icon_base_url + "blizzard/btn-unit-protoss-darktemplar-taldarim.png",
+
+            "Leg Enhancements (Zealot/Sentinel/Centurion)": github_icon_base_url + "blizzard/btn-ability-protoss-charge-color.png",
+            "Shield Capacity (Zealot/Sentinel/Centurion)": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png",
+            "Blood Shield (Supplicant)":                   github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-supplicantarmor.png",
+            "Soul Augmentation (Supplicant)":              github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-supplicantextrashields.png",
+            "Shield Regeneration (Supplicant)":            github_icon_base_url + "blizzard/btn-ability-protoss-voidarmor.png",
+            "Force Field (Sentry)":                        github_icon_base_url + "blizzard/btn-ability-protoss-forcefield-color.png",
+            "Hallucination (Sentry)":                      github_icon_base_url + "blizzard/btn-ability-protoss-hallucination-color.png",
+            "Reclamation (Energizer)":                     github_icon_base_url + "blizzard/btn-ability-protoss-reclamation.png",
+            "Forged Chassis (Energizer)":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel0.png",
+            "Detect Weakness (Havoc)":                     github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-havoctargetlockbuffed.png",
+            "Bloodshard Resonance (Havoc)":                github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-rangeincrease.png",
+            "Cloaking Module (Sentry/Energizer/Havoc)":    github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-permanentcloak.png",
+            "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)": github_icon_base_url + "blizzard/btn-upgrade-karax-energyregen200.png",
+            "Disintegrating Particles (Stalker/Instigator/Slayer)": github_icon_base_url + "blizzard/btn-ability-protoss-phasedisruptor.png",
+            "Particle Reflection (Stalker/Instigator/Slayer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-adeptchampionbounceattack.png",
+            "High Impact Phase Disruptor (Dragoon)":       github_icon_base_url + "blizzard/btn-ability-protoss-phasedisruptor.png",
+            "Trillic Compression System (Dragoon)":        github_icon_base_url + "blizzard/btn-ability-protoss-dragoonchassis.png",
+            "Singularity Charge (Dragoon)":                github_icon_base_url + "blizzard/btn-upgrade-artanis-singularitycharge.png",
+            "Enhanced Strider Servos (Dragoon)":           github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png",
+            "Shockwave (Adept)":                           github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-adept-recochetglaiveupgraded.png",
+            "Resonating Glaives (Adept)":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-resonatingglaives.png",
+            "Phase Bulwark (Adept)":                       github_icon_base_url + "blizzard/btn-upgrade-protoss-adeptshieldupgrade.png",
+            "Unshackled Psionic Storm (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-ability-protoss-psistorm.png",
+            "Hallucination (High Templar/Signifier)":      github_icon_base_url + "blizzard/btn-ability-protoss-hallucination-color.png",
+            "Khaydarin Amulet (High Templar/Signifier)":   github_icon_base_url + "blizzard/btn-upgrade-protoss-khaydarinamulet.png",
+            "High Archon (Archon)":                        github_icon_base_url + "blizzard/btn-upgrade-artanis-healingpsionicstorm.png",
+            "Power Overwhelming (Ascendant)":              github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-ascendantspermanentlybetter.png",
+            "Chaotic Attunement (Ascendant)":              github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-ascendant'spsiorbtravelsfurther.png",
+            "Blood Amulet (Ascendant)":                    github_icon_base_url + "blizzard/btn-upgrade-protoss-wrathwalker-chargetimeimproved.png",
+            "Feedback (Dark Archon)":                      github_icon_base_url + "blizzard/btn-ability-protoss-feedback-color.png",
+            "Maelstrom (Dark Archon)":                     github_icon_base_url + "blizzard/btn-ability-protoss-voidstasis.png",
+            "Argus Talisman (Dark Archon)":                github_icon_base_url + "original/btn-upgrade-protoss-argustalisman@scbw.png",
+            "Dark Archon Meld (Dark Templar)":             github_icon_base_url + "blizzard/talent-vorazun-level05-unlockdarkarchon.png",
+            "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/talent-vorazun-level01-shadowstalk.png",
+            "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-terran-heal-color.png",
+            "Blink (Dark Templar/Avenger/Blood Hunter)":   github_icon_base_url + "blizzard/btn-ability-protoss-shadowdash.png",
+            "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+
+            "Warp Prism":                                  github_icon_base_url + "blizzard/btn-unit-protoss-warpprism.png",
             "Immortal":                                    "https://static.wikia.nocookie.net/starcraft/images/c/c1/Icon_Protoss_Immortal.jpg",
-            "Colossus":                                    "https://static.wikia.nocookie.net/starcraft/images/4/40/Icon_Protoss_Colossus.jpg",
+            "Annihilator":                                 github_icon_base_url + "blizzard/btn-unit-protoss-immortal-nerazim.png",
+            "Vanguard":                                    github_icon_base_url + "blizzard/btn-unit-protoss-immortal-taldarim.png",
+            "Colossus":                                    github_icon_base_url + "blizzard/btn-unit-protoss-colossus-purifier.png",
+            "Wrathwalker":                                 github_icon_base_url + "blizzard/btn-unit-protoss-colossus-taldarim.png",
+            "Observer":                                    github_icon_base_url + "blizzard/btn-unit-protoss-observer.png",
+            "Reaver":                                      github_icon_base_url + "blizzard/btn-unit-protoss-reaver.png",
+            "Disruptor":                                   github_icon_base_url + "blizzard/btn-unit-protoss-disruptor.png",
+
+            "Gravitic Drive (Warp Prism)":                 github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticdrive.png",
+            "Phase Blaster (Warp Prism)":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel0.png",
+            "War Configuration (Warp Prism)":              github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-graviticdrive.png",
+            "Singularity Charge (Immortal/Annihilator)":   github_icon_base_url + "blizzard/btn-upgrade-artanis-singularitycharge.png",
+            "Advanced Targeting Mechanics (Immortal/Annihilator)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png",
+            "Agony Launchers (Vanguard)":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-vanguard-aoeradiusincreased.png",
+            "Matter Dispersion (Vanguard)":                github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png",
+            "Pacification Protocol (Colossus)":            github_icon_base_url + "blizzard/btn-ability-protoss-chargedblast.png",
+            "Rapid Power Cycling (Wrathwalker)":           github_icon_base_url + "blizzard/btn-upgrade-protoss-wrathwalker-chargetimeimproved.png",
+            "Eye of Wrath (Wrathwalker)":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-extendedthermallance.png",
+            "Gravitic Boosters (Observer)":                github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticbooster.png",
+            "Sensor Array (Observer)":                     github_icon_base_url + "blizzard/btn-ability-zeratul-observer-sensorarray.png",
+            "Scarab Damage (Reaver)":                      github_icon_base_url + "blizzard/btn-ability-protoss-scarabshot.png",
+            "Solarite Payload (Reaver)":                   github_icon_base_url + "blizzard/btn-upgrade-artanis-scarabsplashradius.png",
+            "Reaver Capacity (Reaver)":                    github_icon_base_url + "original/btn-upgrade-protoss-increasedscarabcapacity@scbw.png",
+            "Resource Efficiency (Reaver)":                github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+
             "Phoenix":                                     "https://static.wikia.nocookie.net/starcraft/images/b/b1/Icon_Protoss_Phoenix.jpg",
-            "Void Ray":                                    "https://static.wikia.nocookie.net/starcraft/images/1/1d/VoidRay_SC2_Rend1.jpg",
+            "Mirage":                                      github_icon_base_url + "blizzard/btn-unit-protoss-phoenix-purifier.png",
+            "Corsair":                                     github_icon_base_url + "blizzard/btn-unit-protoss-corsair.png",
+            "Destroyer":                                   github_icon_base_url + "blizzard/btn-unit-protoss-voidray-taldarim.png",
+            "Void Ray":                                    github_icon_base_url + "blizzard/btn-unit-protoss-voidray-nerazim.png",
             "Carrier":                                     "https://static.wikia.nocookie.net/starcraft/images/2/2c/Icon_Protoss_Carrier.jpg",
+            "Scout":                                       github_icon_base_url + "original/btn-unit-protoss-scout.png",
+            "Tempest":                                     github_icon_base_url + "blizzard/btn-unit-protoss-tempest-purifier.png",
+            "Mothership":                                  github_icon_base_url + "blizzard/btn-unit-protoss-mothership-taldarim.png",
+            "Arbiter":                                     github_icon_base_url + "blizzard/btn-unit-protoss-arbiter.png",
+            "Oracle":                                      github_icon_base_url + "blizzard/btn-unit-protoss-oracle.png",
+
+            "Ionic Wavelength Flux (Phoenix/Mirage)":      github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel0.png",
+            "Anion Pulse-Crystals (Phoenix/Mirage)":       github_icon_base_url + "blizzard/btn-upgrade-protoss-phoenixrange.png",
+            "Stealth Drive (Corsair)":                     github_icon_base_url + "blizzard/btn-upgrade-vorazun-corsairpermanentlycloaked.png",
+            "Argus Jewel (Corsair)":                       github_icon_base_url + "blizzard/btn-ability-protoss-stasistrap.png",
+            "Sustaining Disruption (Corsair)":             github_icon_base_url + "blizzard/btn-ability-protoss-disruptionweb.png",
+            "Neutron Shields (Corsair)":                   github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png",
+            "Reforged Bloodshard Core (Destroyer)":        github_icon_base_url + "blizzard/btn-amonshardsarmor.png",
+            "Flux Vanes (Void Ray/Destroyer)":             github_icon_base_url + "blizzard/btn-upgrade-protoss-fluxvanes.png",
+            "Graviton Catapult (Carrier)":                 github_icon_base_url + "blizzard/btn-upgrade-protoss-gravitoncatapult.png",
+            "Hull of Past Glories (Carrier)":              github_icon_base_url + "blizzard/btn-progression-protoss-fenix-14-colossusandcarrierchampionsresearch.png",
+            "Combat Sensor Array (Scout)":                 github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-scoutchampionrange.png",
+            "Apial Sensors (Scout)":                       github_icon_base_url + "blizzard/btn-upgrade-tychus-detection.png",
+            "Gravitic Thrusters (Scout)":                  github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticbooster.png",
+            "Advanced Photon Blasters (Scout)":            github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel3.png",
+            "Tectonic Destabilizers (Tempest)":            github_icon_base_url + "blizzard/btn-ability-protoss-disruptionblast.png",
+            "Quantic Reactor (Tempest)":                   github_icon_base_url + "blizzard/btn-upgrade-protoss-researchgravitysling.png",
+            "Gravity Sling (Tempest)":                     github_icon_base_url + "blizzard/btn-upgrade-protoss-tectonicdisruptors.png",
+            "Chronostatic Reinforcement (Arbiter)":        github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel2.png",
+            "Khaydarin Core (Arbiter)":                    github_icon_base_url + "blizzard/btn-upgrade-protoss-adeptshieldupgrade.png",
+            "Spacetime Anchor (Arbiter)":                  github_icon_base_url + "blizzard/btn-ability-protoss-stasisfield.png",
+            "Resource Efficiency (Arbiter)":               github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png",
+            "Enhanced Cloak Field (Arbiter)":              github_icon_base_url + "blizzard/btn-ability-stetmann-stetzonegenerator-speed.png",
+            "Stealth Drive (Oracle)":                      github_icon_base_url + "blizzard/btn-upgrade-vorazun-oraclepermanentlycloaked.png",
+            "Stasis Calibration (Oracle)":                 github_icon_base_url + "blizzard/btn-ability-protoss-oracle-stasiscalibration.png",
+            "Temporal Acceleration Beam (Oracle)":         github_icon_base_url + "blizzard/btn-ability-protoss-oraclepulsarcannonon.png",
+
+            "Matrix Overload":                             github_icon_base_url + "blizzard/btn-ability-spearofadun-matrixoverload.png",
+            "Guardian Shell":                              github_icon_base_url + "blizzard/btn-ability-spearofadun-guardianshell.png",
+
+            "Chrono Surge (Spear of Adun Calldown)":       github_icon_base_url + "blizzard/btn-ability-spearofadun-chronosurge.png",
+            "Proxy Pylon (Spear of Adun Calldown)":        github_icon_base_url + "blizzard/btn-ability-spearofadun-deploypylon.png",
+            "Warp In Reinforcements (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-warpinreinforcements.png",
+            "Pylon Overcharge (Spear of Adun Calldown)":   github_icon_base_url + "blizzard/btn-ability-protoss-purify.png",
+            "Orbital Strike (Spear of Adun Calldown)":     github_icon_base_url + "blizzard/btn-ability-spearofadun-orbitalstrike.png",
+            "Temporal Field (Spear of Adun Calldown)":     github_icon_base_url + "blizzard/btn-ability-spearofadun-temporalfield.png",
+            "Solar Lance (Spear of Adun Calldown)":        github_icon_base_url + "blizzard/btn-ability-spearofadun-solarlance.png",
+            "Mass Recall (Spear of Adun Calldown)":        github_icon_base_url + "blizzard/btn-ability-spearofadun-massrecall.png",
+            "Shield Overcharge (Spear of Adun Calldown)":  github_icon_base_url + "blizzard/btn-ability-spearofadun-shieldovercharge.png",
+            "Deploy Fenix (Spear of Adun Calldown)":       github_icon_base_url + "blizzard/btn-unit-protoss-fenix.png",
+            "Purifier Beam (Spear of Adun Calldown)":      github_icon_base_url + "blizzard/btn-ability-spearofadun-purifierbeam.png",
+            "Time Stop (Spear of Adun Calldown)":          github_icon_base_url + "blizzard/btn-ability-spearofadun-timestop.png",
+            "Solar Bombardment (Spear of Adun Calldown)":  github_icon_base_url + "blizzard/btn-ability-spearofadun-solarbombardment.png",
+
+            "Reconstruction Beam (Spear of Adun Auto-Cast)": github_icon_base_url + "blizzard/btn-ability-spearofadun-reconstructionbeam.png",
+            "Overwatch (Spear of Adun Auto-Cast)":         github_icon_base_url + "blizzard/btn-ability-zeratul-chargedcrystal-psionicwinds.png",
 
             "Nothing":                                     "",
         }
@@ -1824,97 +2257,310 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
             "Gates of Hell":           range(SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2700),
             "Belly of the Beast":      range(SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2800),
             "Shatter the Sky":         range(SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2900),
+            "All-In":                  range(SC2WOL_LOC_ID_OFFSET + 2900, SC2WOL_LOC_ID_OFFSET + 3000),
+
+            "Lab Rat":                 range(SC2HOTS_LOC_ID_OFFSET + 100, SC2HOTS_LOC_ID_OFFSET + 200),
+            "Back in the Saddle":      range(SC2HOTS_LOC_ID_OFFSET + 200, SC2HOTS_LOC_ID_OFFSET + 300),
+            "Rendezvous":              range(SC2HOTS_LOC_ID_OFFSET + 300, SC2HOTS_LOC_ID_OFFSET + 400),
+            "Harvest of Screams":      range(SC2HOTS_LOC_ID_OFFSET + 400, SC2HOTS_LOC_ID_OFFSET + 500),
+            "Shoot the Messenger":     range(SC2HOTS_LOC_ID_OFFSET + 500, SC2HOTS_LOC_ID_OFFSET + 600),
+            "Enemy Within":            range(SC2HOTS_LOC_ID_OFFSET + 600, SC2HOTS_LOC_ID_OFFSET + 700),
+            "Domination":              range(SC2HOTS_LOC_ID_OFFSET + 700, SC2HOTS_LOC_ID_OFFSET + 800),
+            "Fire in the Sky":         range(SC2HOTS_LOC_ID_OFFSET + 800, SC2HOTS_LOC_ID_OFFSET + 900),
+            "Old Soldiers":            range(SC2HOTS_LOC_ID_OFFSET + 900, SC2HOTS_LOC_ID_OFFSET + 1000),
+            "Waking the Ancient":      range(SC2HOTS_LOC_ID_OFFSET + 1000, SC2HOTS_LOC_ID_OFFSET + 1100),
+            "The Crucible":            range(SC2HOTS_LOC_ID_OFFSET + 1100, SC2HOTS_LOC_ID_OFFSET + 1200),
+            "Supreme":                 range(SC2HOTS_LOC_ID_OFFSET + 1200, SC2HOTS_LOC_ID_OFFSET + 1300),
+            "Infested":                range(SC2HOTS_LOC_ID_OFFSET + 1300, SC2HOTS_LOC_ID_OFFSET + 1400),
+            "Hand of Darkness":        range(SC2HOTS_LOC_ID_OFFSET + 1400, SC2HOTS_LOC_ID_OFFSET + 1500),
+            "Phantoms of the Void":    range(SC2HOTS_LOC_ID_OFFSET + 1500, SC2HOTS_LOC_ID_OFFSET + 1600),
+            "With Friends Like These": range(SC2HOTS_LOC_ID_OFFSET + 1600, SC2HOTS_LOC_ID_OFFSET + 1700),
+            "Conviction":              range(SC2HOTS_LOC_ID_OFFSET + 1700, SC2HOTS_LOC_ID_OFFSET + 1800),
+            "Planetfall":              range(SC2HOTS_LOC_ID_OFFSET + 1800, SC2HOTS_LOC_ID_OFFSET + 1900),
+            "Death From Above":        range(SC2HOTS_LOC_ID_OFFSET + 1900, SC2HOTS_LOC_ID_OFFSET + 2000),
+            "The Reckoning":           range(SC2HOTS_LOC_ID_OFFSET + 2000, SC2HOTS_LOC_ID_OFFSET + 2100),
+
+            "Dark Whispers":           range(SC2LOTV_LOC_ID_OFFSET + 100, SC2LOTV_LOC_ID_OFFSET + 200),
+            "Ghosts in the Fog":       range(SC2LOTV_LOC_ID_OFFSET + 200, SC2LOTV_LOC_ID_OFFSET + 300),
+            "Evil Awoken":             range(SC2LOTV_LOC_ID_OFFSET + 300, SC2LOTV_LOC_ID_OFFSET + 400),
+
+            "For Aiur!":               range(SC2LOTV_LOC_ID_OFFSET + 400, SC2LOTV_LOC_ID_OFFSET + 500),
+            "The Growing Shadow":      range(SC2LOTV_LOC_ID_OFFSET + 500, SC2LOTV_LOC_ID_OFFSET + 600),
+            "The Spear of Adun":       range(SC2LOTV_LOC_ID_OFFSET + 600, SC2LOTV_LOC_ID_OFFSET + 700),
+            "Sky Shield":              range(SC2LOTV_LOC_ID_OFFSET + 700, SC2LOTV_LOC_ID_OFFSET + 800),
+            "Brothers in Arms":        range(SC2LOTV_LOC_ID_OFFSET + 800, SC2LOTV_LOC_ID_OFFSET + 900),
+            "Amon's Reach":            range(SC2LOTV_LOC_ID_OFFSET + 900, SC2LOTV_LOC_ID_OFFSET + 1000),
+            "Last Stand":              range(SC2LOTV_LOC_ID_OFFSET + 1000, SC2LOTV_LOC_ID_OFFSET + 1100),
+            "Forbidden Weapon":        range(SC2LOTV_LOC_ID_OFFSET + 1100, SC2LOTV_LOC_ID_OFFSET + 1200),
+            "Temple of Unification":   range(SC2LOTV_LOC_ID_OFFSET + 1200, SC2LOTV_LOC_ID_OFFSET + 1300),
+            "The Infinite Cycle":      range(SC2LOTV_LOC_ID_OFFSET + 1300, SC2LOTV_LOC_ID_OFFSET + 1400),
+            "Harbinger of Oblivion":   range(SC2LOTV_LOC_ID_OFFSET + 1400, SC2LOTV_LOC_ID_OFFSET + 1500),
+            "Unsealing the Past":      range(SC2LOTV_LOC_ID_OFFSET + 1500, SC2LOTV_LOC_ID_OFFSET + 1600),
+            "Purification":            range(SC2LOTV_LOC_ID_OFFSET + 1600, SC2LOTV_LOC_ID_OFFSET + 1700),
+            "Steps of the Rite":       range(SC2LOTV_LOC_ID_OFFSET + 1700, SC2LOTV_LOC_ID_OFFSET + 1800),
+            "Rak'Shir":                range(SC2LOTV_LOC_ID_OFFSET + 1800, SC2LOTV_LOC_ID_OFFSET + 1900),
+            "Templar's Charge":        range(SC2LOTV_LOC_ID_OFFSET + 1900, SC2LOTV_LOC_ID_OFFSET + 2000),
+            "Templar's Return":        range(SC2LOTV_LOC_ID_OFFSET + 2000, SC2LOTV_LOC_ID_OFFSET + 2100),
+            "The Host":                range(SC2LOTV_LOC_ID_OFFSET + 2100, SC2LOTV_LOC_ID_OFFSET + 2200),
+            "Salvation":               range(SC2LOTV_LOC_ID_OFFSET + 2200, SC2LOTV_LOC_ID_OFFSET + 2300),
+
+            "Into the Void":           range(SC2LOTV_LOC_ID_OFFSET + 2300, SC2LOTV_LOC_ID_OFFSET + 2400),
+            "The Essence of Eternity": range(SC2LOTV_LOC_ID_OFFSET + 2400, SC2LOTV_LOC_ID_OFFSET + 2500),
+            "Amon's Fall":             range(SC2LOTV_LOC_ID_OFFSET + 2500, SC2LOTV_LOC_ID_OFFSET + 2600),
+
+            "The Escape":              range(SC2NCO_LOC_ID_OFFSET + 100, SC2NCO_LOC_ID_OFFSET + 200),
+            "Sudden Strike":           range(SC2NCO_LOC_ID_OFFSET + 200, SC2NCO_LOC_ID_OFFSET + 300),
+            "Enemy Intelligence":      range(SC2NCO_LOC_ID_OFFSET + 300, SC2NCO_LOC_ID_OFFSET + 400),
+            "Trouble In Paradise":     range(SC2NCO_LOC_ID_OFFSET + 400, SC2NCO_LOC_ID_OFFSET + 500),
+            "Night Terrors":           range(SC2NCO_LOC_ID_OFFSET + 500, SC2NCO_LOC_ID_OFFSET + 600),
+            "Flashpoint":              range(SC2NCO_LOC_ID_OFFSET + 600, SC2NCO_LOC_ID_OFFSET + 700),
+            "In the Enemy's Shadow":   range(SC2NCO_LOC_ID_OFFSET + 700, SC2NCO_LOC_ID_OFFSET + 800),
+            "Dark Skies":              range(SC2NCO_LOC_ID_OFFSET + 800, SC2NCO_LOC_ID_OFFSET + 900),
+            "End Game":                range(SC2NCO_LOC_ID_OFFSET + 900, SC2NCO_LOC_ID_OFFSET + 1000),
         }
 
         display_data = {}
 
         # Grouped Items
         grouped_item_ids = {
-            "Progressive Weapon Upgrade":       107 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Armor Upgrade":        108 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Infantry Upgrade":     109 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Vehicle Upgrade":      110 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Ship Upgrade":         111 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET
+            "Progressive Terran Weapon Upgrade":        107 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Armor Upgrade":         108 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Infantry Upgrade":      109 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Vehicle Upgrade":       110 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Ship Upgrade":          111 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Weapon/Armor Upgrade":  112 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Zerg Weapon Upgrade":          105 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Armor Upgrade":           106 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Ground Upgrade":          107 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Flyer Upgrade":           108 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Weapon/Armor Upgrade":    109 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Protoss Weapon Upgrade":       105 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Protoss Armor Upgrade":        106 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Protoss Ground Upgrade":       107 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Protoss Air Upgrade":          108 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Protoss Weapon/Armor Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET,
         }
         grouped_item_replacements = {
-            "Progressive Weapon Upgrade":   ["Progressive Infantry Weapon", "Progressive Vehicle Weapon",
-                                             "Progressive Ship Weapon"],
-            "Progressive Armor Upgrade":    ["Progressive Infantry Armor", "Progressive Vehicle Armor",
-                                             "Progressive Ship Armor"],
-            "Progressive Infantry Upgrade": ["Progressive Infantry Weapon", "Progressive Infantry Armor"],
-            "Progressive Vehicle Upgrade":  ["Progressive Vehicle Weapon", "Progressive Vehicle Armor"],
-            "Progressive Ship Upgrade":     ["Progressive Ship Weapon", "Progressive Ship Armor"]
+            "Progressive Terran Weapon Upgrade":   ["Progressive Terran Infantry Weapon",
+                                                    "Progressive Terran Vehicle Weapon",
+                                                    "Progressive Terran Ship Weapon"],
+            "Progressive Terran Armor Upgrade":    ["Progressive Terran Infantry Armor",
+                                                    "Progressive Terran Vehicle Armor",
+                                                    "Progressive Terran Ship Armor"],
+            "Progressive Terran Infantry Upgrade": ["Progressive Terran Infantry Weapon",
+                                                    "Progressive Terran Infantry Armor"],
+            "Progressive Terran Vehicle Upgrade":  ["Progressive Terran Vehicle Weapon",
+                                                    "Progressive Terran Vehicle Armor"],
+            "Progressive Terran Ship Upgrade":     ["Progressive Terran Ship Weapon", "Progressive Terran Ship Armor"],
+            "Progressive Zerg Weapon Upgrade":     ["Progressive Zerg Melee Attack", "Progressive Zerg Missile Attack",
+                                                    "Progressive Zerg Flyer Attack"],
+            "Progressive Zerg Armor Upgrade":      ["Progressive Zerg Ground Carapace",
+                                                    "Progressive Zerg Flyer Carapace"],
+            "Progressive Zerg Ground Upgrade":     ["Progressive Zerg Melee Attack", "Progressive Zerg Missile Attack",
+                                                    "Progressive Zerg Ground Carapace"],
+            "Progressive Zerg Flyer Upgrade":      ["Progressive Zerg Flyer Attack", "Progressive Zerg Flyer Carapace"],
+            "Progressive Protoss Weapon Upgrade":  ["Progressive Protoss Ground Weapon",
+                                                    "Progressive Protoss Air Weapon"],
+            "Progressive Protoss Armor Upgrade":   ["Progressive Protoss Ground Armor", "Progressive Protoss Shields",
+                                                    "Progressive Protoss Air Armor"],
+            "Progressive Protoss Ground Upgrade":  ["Progressive Protoss Ground Weapon",
+                                                    "Progressive Protoss Ground Armor",
+                                                    "Progressive Protoss Shields"],
+            "Progressive Protoss Air Upgrade":     ["Progressive Protoss Air Weapon", "Progressive Protoss Air Armor",
+                                                    "Progressive Protoss Shields"]
         }
-        grouped_item_replacements["Progressive Weapon/Armor Upgrade"] = grouped_item_replacements[
-                                                                            "Progressive Weapon Upgrade"] + \
-                                                                        grouped_item_replacements[
-                                                                            "Progressive Armor Upgrade"]
+        grouped_item_replacements["Progressive Terran Weapon/Armor Upgrade"] = \
+            grouped_item_replacements["Progressive Terran Weapon Upgrade"] \
+            + grouped_item_replacements["Progressive Terran Armor Upgrade"]
+        grouped_item_replacements["Progressive Zerg Weapon/Armor Upgrade"] = \
+            grouped_item_replacements["Progressive Zerg Weapon Upgrade"] \
+            + grouped_item_replacements["Progressive Zerg Armor Upgrade"]
+        grouped_item_replacements["Progressive Protoss Weapon/Armor Upgrade"] = \
+            grouped_item_replacements["Progressive Protoss Weapon Upgrade"] \
+            + grouped_item_replacements["Progressive Protoss Armor Upgrade"]
         replacement_item_ids = {
-            "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Infantry Armor":  102 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Vehicle Weapon":  103 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Vehicle Armor":   104 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Ship Weapon":     105 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Ship Armor":      106 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Infantry Armor":  102 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Vehicle Weapon":  103 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Vehicle Armor":   104 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Ship Weapon":     105 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Ship Armor":      106 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Zerg Melee Attack":      100 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Missile Attack":    101 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Ground Carapace":   102 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Flyer Attack":      103 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Flyer Carapace":    104 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Protoss Ground Weapon":  100 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Ground Armor":   101 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Shields":        102 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Air Weapon":     103 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Air Armor":      104 + SC2LOTV_ITEM_ID_OFFSET,
         }
 
-        inventory = tracker_data.get_player_inventory_counts(team, player)
+        inventory: collections.Counter = tracker_data.get_player_inventory_counts(team, player)
         for grouped_item_name, grouped_item_id in grouped_item_ids.items():
             count: int = inventory[grouped_item_id]
             if count > 0:
                 for replacement_item in grouped_item_replacements[grouped_item_name]:
                     replacement_id: int = replacement_item_ids[replacement_item]
-                    inventory[replacement_id] = count
+                    if replacement_id not in inventory or count > inventory[replacement_id]:
+                        # If two groups provide the same individual item, maximum is used
+                        # (this behavior is used for Protoss Shields)
+                        inventory[replacement_id] = count
 
         # Determine display for progressive items
         progressive_items = {
-            "Progressive Infantry Weapon":                    100 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Infantry Armor":                     102 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Vehicle Weapon":                     103 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Vehicle Armor":                      104 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Ship Weapon":                        105 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Ship Armor":                         106 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Stimpack (Marine)":                  208 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Stimpack (Firebat)":                 226 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Stimpack (Marauder)":                228 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Stimpack (Reaper)":                  250 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Stimpack (Hellion)":                 259 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive High Impact Payload (Thor)":         361 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET,
-            "Progressive Regenerative Bio-Steel":             617 + SC2WOL_ITEM_ID_OFFSET
+            "Progressive Terran Infantry Weapon":                   100 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Infantry Armor":                    102 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Vehicle Weapon":                    103 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Vehicle Armor":                     104 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Ship Weapon":                       105 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Terran Ship Armor":                        106 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Fire-Suppression System":                  206 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Orbital Command":                          207 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Stimpack (Marine)":                        208 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Stimpack (Firebat)":                       226 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Stimpack (Marauder)":                      228 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Stimpack (Reaper)":                        250 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Stimpack (Hellion)":                       259 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Replenishable Magazine (Vulture)":         303 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Tri-Lithium Power Cell (Diamondback)":     306 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Tomahawk Power Cells (Wraith)":            312 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Cross-Spectrum Dampeners (Banshee)":       316 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Missile Pods (Battlecruiser)":             318 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Defensive Matrix (Battlecruiser)":         319 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Immortality Protocol (Thor)":              325 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive High Impact Payload (Thor)":               361 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Augmented Thrusters (Planetary Fortress)": 388 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Regenerative Bio-Steel":                   617 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Stealth Suit Module (Nova Suit Module)":   904 + SC2WOL_ITEM_ID_OFFSET,
+            "Progressive Zerg Melee Attack":                        100 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Missile Attack":                      101 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Ground Carapace":                     102 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Flyer Attack":                        103 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Zerg Flyer Carapace":                      104 + SC2HOTS_ITEM_ID_OFFSET,
+            "Progressive Protoss Ground Weapon":                    100 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Ground Armor":                     101 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Shields":                          102 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Air Weapon":                       103 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Protoss Air Armor":                        104 + SC2LOTV_ITEM_ID_OFFSET,
+            "Progressive Proxy Pylon (Spear of Adun Calldown)":     701 + SC2LOTV_ITEM_ID_OFFSET,
         }
+        # Format: L0, L1, L2, L3
         progressive_names = {
-            "Progressive Infantry Weapon":                    ["Infantry Weapons Level 1", "Infantry Weapons Level 1",
-                                                               "Infantry Weapons Level 2", "Infantry Weapons Level 3"],
-            "Progressive Infantry Armor":                     ["Infantry Armor Level 1", "Infantry Armor Level 1",
-                                                               "Infantry Armor Level 2", "Infantry Armor Level 3"],
-            "Progressive Vehicle Weapon":                     ["Vehicle Weapons Level 1", "Vehicle Weapons Level 1",
-                                                               "Vehicle Weapons Level 2", "Vehicle Weapons Level 3"],
-            "Progressive Vehicle Armor":                      ["Vehicle Armor Level 1", "Vehicle Armor Level 1",
-                                                               "Vehicle Armor Level 2", "Vehicle Armor Level 3"],
-            "Progressive Ship Weapon":                        ["Ship Weapons Level 1", "Ship Weapons Level 1",
-                                                               "Ship Weapons Level 2", "Ship Weapons Level 3"],
-            "Progressive Ship Armor":                         ["Ship Armor Level 1", "Ship Armor Level 1",
-                                                               "Ship Armor Level 2", "Ship Armor Level 3"],
-            "Progressive Stimpack (Marine)":                  ["Stimpack (Marine)", "Stimpack (Marine)",
-                                                               "Super Stimpack (Marine)"],
-            "Progressive Stimpack (Firebat)":                 ["Stimpack (Firebat)", "Stimpack (Firebat)",
-                                                               "Super Stimpack (Firebat)"],
-            "Progressive Stimpack (Marauder)":                ["Stimpack (Marauder)", "Stimpack (Marauder)",
-                                                               "Super Stimpack (Marauder)"],
-            "Progressive Stimpack (Reaper)":                  ["Stimpack (Reaper)", "Stimpack (Reaper)",
-                                                               "Super Stimpack (Reaper)"],
-            "Progressive Stimpack (Hellion)":                 ["Stimpack (Hellion)", "Stimpack (Hellion)",
-                                                               "Super Stimpack (Hellion)"],
-            "Progressive High Impact Payload (Thor)":         ["High Impact Payload (Thor)",
-                                                               "High Impact Payload (Thor)", "Smart Servos (Thor)"],
-            "Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)",
-                                                               "Cross-Spectrum Dampeners (Banshee)",
-                                                               "Advanced Cross-Spectrum Dampeners (Banshee)"],
-            "Progressive Regenerative Bio-Steel":             ["Regenerative Bio-Steel Level 1",
-                                                               "Regenerative Bio-Steel Level 1",
-                                                               "Regenerative Bio-Steel Level 2"]
+            "Progressive Terran Infantry Weapon":               ["Terran Infantry Weapons Level 1", 
+                                                                 "Terran Infantry Weapons Level 1",
+                                                                 "Terran Infantry Weapons Level 2", 
+                                                                 "Terran Infantry Weapons Level 3"],
+            "Progressive Terran Infantry Armor":                ["Terran Infantry Armor Level 1", 
+                                                                 "Terran Infantry Armor Level 1",
+                                                                 "Terran Infantry Armor Level 2", 
+                                                                 "Terran Infantry Armor Level 3"],
+            "Progressive Terran Vehicle Weapon":                ["Terran Vehicle Weapons Level 1", 
+                                                                 "Terran Vehicle Weapons Level 1",
+                                                                 "Terran Vehicle Weapons Level 2", 
+                                                                 "Terran Vehicle Weapons Level 3"],
+            "Progressive Terran Vehicle Armor":                 ["Terran Vehicle Armor Level 1", 
+                                                                 "Terran Vehicle Armor Level 1",
+                                                                 "Terran Vehicle Armor Level 2", 
+                                                                 "Terran Vehicle Armor Level 3"],
+            "Progressive Terran Ship Weapon":                   ["Terran Ship Weapons Level 1",
+                                                                 "Terran Ship Weapons Level 1",
+                                                                 "Terran Ship Weapons Level 2",
+                                                                 "Terran Ship Weapons Level 3"],
+            "Progressive Terran Ship Armor":                    ["Terran Ship Armor Level 1", 
+                                                                 "Terran Ship Armor Level 1",
+                                                                 "Terran Ship Armor Level 2", 
+                                                                 "Terran Ship Armor Level 3"],
+            "Progressive Fire-Suppression System":              ["Fire-Suppression System Level 1",
+                                                                 "Fire-Suppression System Level 1",
+                                                                 "Fire-Suppression System Level 2"],
+            "Progressive Orbital Command":                      ["Orbital Command", "Orbital Command",
+                                                                 "Planetary Command Module"],
+            "Progressive Stimpack (Marine)":                    ["Stimpack (Marine)", "Stimpack (Marine)",
+                                                                 "Super Stimpack (Marine)"],
+            "Progressive Stimpack (Firebat)":                   ["Stimpack (Firebat)", "Stimpack (Firebat)",
+                                                                 "Super Stimpack (Firebat)"],
+            "Progressive Stimpack (Marauder)":                  ["Stimpack (Marauder)", "Stimpack (Marauder)",
+                                                                 "Super Stimpack (Marauder)"],
+            "Progressive Stimpack (Reaper)":                    ["Stimpack (Reaper)", "Stimpack (Reaper)",
+                                                                 "Super Stimpack (Reaper)"],
+            "Progressive Stimpack (Hellion)":                   ["Stimpack (Hellion)", "Stimpack (Hellion)",
+                                                                 "Super Stimpack (Hellion)"],
+            "Progressive Replenishable Magazine (Vulture)":     ["Replenishable Magazine (Vulture)",
+                                                                 "Replenishable Magazine (Vulture)",
+                                                                 "Replenishable Magazine (Free) (Vulture)"],
+            "Progressive Tri-Lithium Power Cell (Diamondback)": ["Tri-Lithium Power Cell (Diamondback)",
+                                                                 "Tri-Lithium Power Cell (Diamondback)",
+                                                                 "Tungsten Spikes (Diamondback)"],
+            "Progressive Tomahawk Power Cells (Wraith)":        ["Tomahawk Power Cells (Wraith)",
+                                                                 "Tomahawk Power Cells (Wraith)",
+                                                                 "Unregistered Cloaking Module (Wraith)"],
+            "Progressive Cross-Spectrum Dampeners (Banshee)":   ["Cross-Spectrum Dampeners (Banshee)",
+                                                                 "Cross-Spectrum Dampeners (Banshee)",
+                                                                 "Advanced Cross-Spectrum Dampeners (Banshee)"],
+            "Progressive Missile Pods (Battlecruiser)":         ["Missile Pods (Battlecruiser) Level 1",
+                                                                 "Missile Pods (Battlecruiser) Level 1",
+                                                                 "Missile Pods (Battlecruiser) Level 2"],
+            "Progressive Defensive Matrix (Battlecruiser)":     ["Defensive Matrix (Battlecruiser)",
+                                                                 "Defensive Matrix (Battlecruiser)",
+                                                                 "Advanced Defensive Matrix (Battlecruiser)"],
+            "Progressive Immortality Protocol (Thor)":          ["Immortality Protocol (Thor)",
+                                                                 "Immortality Protocol (Thor)",
+                                                                 "Immortality Protocol (Free) (Thor)"],
+            "Progressive High Impact Payload (Thor)":           ["High Impact Payload (Thor)",
+                                                                 "High Impact Payload (Thor)", "Smart Servos (Thor)"],
+            "Progressive Augmented Thrusters (Planetary Fortress)": ["Lift Off (Planetary Fortress)",
+                                                                     "Lift Off (Planetary Fortress)",
+                                                                     "Armament Stabilizers (Planetary Fortress)"],
+            "Progressive Regenerative Bio-Steel":               ["Regenerative Bio-Steel Level 1",
+                                                                 "Regenerative Bio-Steel Level 1",
+                                                                 "Regenerative Bio-Steel Level 2",
+                                                                 "Regenerative Bio-Steel Level 3"],
+            "Progressive Stealth Suit Module (Nova Suit Module)": ["Stealth Suit Module (Nova Suit Module)",
+                                                                   "Cloak (Nova Suit Module)",
+                                                                   "Permanently Cloaked (Nova Suit Module)"],
+            "Progressive Zerg Melee Attack":                    ["Zerg Melee Attack Level 1",
+                                                                 "Zerg Melee Attack Level 1",
+                                                                 "Zerg Melee Attack Level 2",
+                                                                 "Zerg Melee Attack Level 3"],
+            "Progressive Zerg Missile Attack":                  ["Zerg Missile Attack Level 1",
+                                                                 "Zerg Missile Attack Level 1",
+                                                                 "Zerg Missile Attack Level 2",
+                                                                 "Zerg Missile Attack Level 3"],
+            "Progressive Zerg Ground Carapace":                 ["Zerg Ground Carapace Level 1",
+                                                                 "Zerg Ground Carapace Level 1",
+                                                                 "Zerg Ground Carapace Level 2",
+                                                                 "Zerg Ground Carapace Level 3"],
+            "Progressive Zerg Flyer Attack":                    ["Zerg Flyer Attack Level 1",
+                                                                 "Zerg Flyer Attack Level 1",
+                                                                 "Zerg Flyer Attack Level 2",
+                                                                 "Zerg Flyer Attack Level 3"],
+            "Progressive Zerg Flyer Carapace":                  ["Zerg Flyer Carapace Level 1",
+                                                                 "Zerg Flyer Carapace Level 1",
+                                                                 "Zerg Flyer Carapace Level 2",
+                                                                 "Zerg Flyer Carapace Level 3"],
+            "Progressive Protoss Ground Weapon":                ["Protoss Ground Weapon Level 1",
+                                                                 "Protoss Ground Weapon Level 1",
+                                                                 "Protoss Ground Weapon Level 2",
+                                                                 "Protoss Ground Weapon Level 3"],
+            "Progressive Protoss Ground Armor":                 ["Protoss Ground Armor Level 1",
+                                                                 "Protoss Ground Armor Level 1",
+                                                                 "Protoss Ground Armor Level 2",
+                                                                 "Protoss Ground Armor Level 3"],
+            "Progressive Protoss Shields":                      ["Protoss Shields Level 1", "Protoss Shields Level 1",
+                                                                 "Protoss Shields Level 2", "Protoss Shields Level 3"],
+            "Progressive Protoss Air Weapon":                   ["Protoss Air Weapon Level 1",
+                                                                 "Protoss Air Weapon Level 1",
+                                                                 "Protoss Air Weapon Level 2",
+                                                                 "Protoss Air Weapon Level 3"],
+            "Progressive Protoss Air Armor":                    ["Protoss Air Armor Level 1",
+                                                                 "Protoss Air Armor Level 1",
+                                                                 "Protoss Air Armor Level 2",
+                                                                 "Protoss Air Armor Level 3"],
+            "Progressive Proxy Pylon (Spear of Adun Calldown)": ["Proxy Pylon (Spear of Adun Calldown)",
+                                                                 "Proxy Pylon (Spear of Adun Calldown)",
+                                                                 "Warp In Reinforcements (Spear of Adun Calldown)"]
         }
         for item_name, item_id in progressive_items.items():
             level = min(inventory[item_id], len(progressive_names[item_name]) - 1)
@@ -1925,24 +2571,62 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
                          .replace("(", "")
                          .replace(")", ""))
             display_data[base_name + "_level"] = level
-            display_data[base_name + "_url"] = icons[display_name]
+            display_data[base_name + "_url"] = icons[display_name] if display_name in icons else "FIXME"
             display_data[base_name + "_name"] = display_name
 
         # Multi-items
         multi_items = {
-            "+15 Starting Minerals": 800 + SC2WOL_ITEM_ID_OFFSET,
-            "+15 Starting Vespene":  801 + SC2WOL_ITEM_ID_OFFSET,
-            "+2 Starting Supply":    802 + SC2WOL_ITEM_ID_OFFSET
+            "Additional Starting Minerals": 800 + SC2WOL_ITEM_ID_OFFSET,
+            "Additional Starting Vespene":  801 + SC2WOL_ITEM_ID_OFFSET,
+            "Additional Starting Supply":   802 + SC2WOL_ITEM_ID_OFFSET
         }
         for item_name, item_id in multi_items.items():
             base_name = item_name.split()[-1].lower()
             count = inventory[item_id]
             if base_name == "supply":
-                count = count * 2
-                display_data[base_name + "_count"] = count
-            else:
-                count = count * 15
-                display_data[base_name + "_count"] = count
+                count = count * starting_supply_per_item
+            elif base_name == "minerals":
+                count = count * minerals_per_item
+            elif base_name == "vespene":
+                count = count * vespene_per_item
+            display_data[base_name + "_count"] = count
+        # Kerrigan level
+        level_items = {
+            "1 Kerrigan Level":     509 + SC2HOTS_ITEM_ID_OFFSET,
+            "2 Kerrigan Levels":    508 + SC2HOTS_ITEM_ID_OFFSET,
+            "3 Kerrigan Levels":    507 + SC2HOTS_ITEM_ID_OFFSET,
+            "4 Kerrigan Levels":    506 + SC2HOTS_ITEM_ID_OFFSET,
+            "5 Kerrigan Levels":    505 + SC2HOTS_ITEM_ID_OFFSET,
+            "6 Kerrigan Levels":    504 + SC2HOTS_ITEM_ID_OFFSET,
+            "7 Kerrigan Levels":    503 + SC2HOTS_ITEM_ID_OFFSET,
+            "8 Kerrigan Levels":    502 + SC2HOTS_ITEM_ID_OFFSET,
+            "9 Kerrigan Levels":    501 + SC2HOTS_ITEM_ID_OFFSET,
+            "10 Kerrigan Levels":   500 + SC2HOTS_ITEM_ID_OFFSET,
+            "14 Kerrigan Levels":   510 + SC2HOTS_ITEM_ID_OFFSET,
+            "35 Kerrigan Levels":   511 + SC2HOTS_ITEM_ID_OFFSET,
+            "70 Kerrigan Levels":   512 + SC2HOTS_ITEM_ID_OFFSET,
+        }
+        level_amounts = {
+            "1 Kerrigan Level":     1,
+            "2 Kerrigan Levels":    2,
+            "3 Kerrigan Levels":    3,
+            "4 Kerrigan Levels":    4,
+            "5 Kerrigan Levels":    5,
+            "6 Kerrigan Levels":    6,
+            "7 Kerrigan Levels":    7,
+            "8 Kerrigan Levels":    8,
+            "9 Kerrigan Levels":    9,
+            "10 Kerrigan Levels":   10,
+            "14 Kerrigan Levels":   14,
+            "35 Kerrigan Levels":   35,
+            "70 Kerrigan Levels":   70,
+        }
+        kerrigan_level = 0
+        for item_name, item_id in level_items.items():
+            count = inventory[item_id]
+            amount = level_amounts[item_name]
+            kerrigan_level += count * amount
+        display_data["kerrigan_level"] = kerrigan_level
 
         # Victory condition
         game_state = tracker_data.get_player_client_status(team, player)
@@ -1951,7 +2635,7 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
         # Turn location IDs into mission objective counts
         locations = tracker_data.get_player_locations(team, player)
         checked_locations = tracker_data.get_player_checked_locations(team, player)
-        lookup_name = lambda id: tracker_data.location_id_to_name["Starcraft 2 Wings of Liberty"][id]
+        lookup_name = lambda id: tracker_data.location_id_to_name["Starcraft 2"][id]
         location_info = {mission_name: {lookup_name(id): (id in checked_locations) for id in mission_locations if
                                         id in set(locations)} for mission_name, mission_locations in
                          sc2wol_location_ids.items()}
@@ -1963,9 +2647,9 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
                           mission_name, mission_locations in sc2wol_location_ids.items()}
         checks_in_area['Total'] = sum(checks_in_area.values())
 
-        lookup_any_item_id_to_name = tracker_data.item_id_to_name["Starcraft 2 Wings of Liberty"]
+        lookup_any_item_id_to_name = tracker_data.item_id_to_name["Starcraft 2"]
         return render_template(
-            "tracker__Starcraft2WingsOfLiberty.html",
+            "tracker__Starcraft2.html",
             inventory=inventory,
             icons=icons,
             acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0},
@@ -1979,4 +2663,4 @@ if "Starcraft 2 Wings of Liberty" in network_data_package["games"]:
             **display_data,
         )
 
-    _player_trackers["Starcraft 2 Wings of Liberty"] = render_Starcraft2WingsOfLiberty_tracker
+    _player_trackers["Starcraft 2"] = render_Starcraft2_tracker
diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS
index d6730b73..dea869fb 100644
--- a/docs/CODEOWNERS
+++ b/docs/CODEOWNERS
@@ -134,8 +134,8 @@
 # Sonic Adventure 2 Battle
 /worlds/sa2b/ @PoryGone @RaspberrySpace
 
-# Starcraft 2 Wings of Liberty
-/worlds/sc2wol/ @Ziktofel
+# Starcraft 2
+/worlds/sc2/ @Ziktofel
 
 # Super Metroid
 /worlds/sm/ @lordlou
diff --git a/setup.py b/setup.py
index 68cab1d5..ffb7e02f 100644
--- a/setup.py
+++ b/setup.py
@@ -84,7 +84,6 @@ non_apworlds: set = {
 # LogicMixin is broken before 3.10 import revamp
 if sys.version_info < (3,10):
     non_apworlds.add("Hollow Knight")
-    non_apworlds.add("Starcraft 2 Wings of Liberty")
 
 def download_SNI():
     print("Updating SNI")
diff --git a/test/general/test_items.py b/test/general/test_items.py
index 82b60303..25623d4d 100644
--- a/test/general/test_items.py
+++ b/test/general/test_items.py
@@ -23,8 +23,8 @@ class TestBase(unittest.TestCase):
                 {"Pendants", "Crystals"},
             "Ocarina of Time":
                 {"medallions", "stones", "rewards", "logic_bottles"},
-            "Starcraft 2 Wings of Liberty":
-                {"Missions"},
+            "Starcraft 2":
+                {"Missions", "WoL Missions"},
         }
         for game_name, world_type in AutoWorldRegister.world_types.items():
             with self.subTest(game_name, game_name=game_name):
diff --git a/worlds/_sc2common/bot/bot_ai.py b/worlds/_sc2common/bot/bot_ai.py
index 79c11a5a..b08f8af2 100644
--- a/worlds/_sc2common/bot/bot_ai.py
+++ b/worlds/_sc2common/bot/bot_ai.py
@@ -12,6 +12,8 @@ from .position import Point2
 from .unit import Unit
 from .units import Units
 
+from worlds._sc2common.bot import logger
+
 if TYPE_CHECKING:
     from .game_info import Ramp
 
@@ -310,6 +312,7 @@ class BotAI(BotAIInternal):
         :param message:
         :param team_only:"""
         assert isinstance(message, str), f"{message} is not a string"
+        logger.debug("Sending message: " + message)
         await self.client.chat_send(message, team_only)
 
     def in_map_bounds(self, pos: Union[Point2, tuple, list]) -> bool:
diff --git a/worlds/sc2/Client.py b/worlds/sc2/Client.py
new file mode 100644
index 00000000..fe6efb9c
--- /dev/null
+++ b/worlds/sc2/Client.py
@@ -0,0 +1,1631 @@
+from __future__ import annotations
+
+import asyncio
+import copy
+import ctypes
+import enum
+import inspect
+import logging
+import multiprocessing
+import os.path
+import re
+import sys
+import tempfile
+import typing
+import queue
+import zipfile
+import io
+import random
+import concurrent.futures
+from pathlib import Path
+
+# CommonClient import first to trigger ModuleUpdater
+from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
+from Utils import init_logging, is_windows, async_start
+from worlds.sc2 import ItemNames
+from worlds.sc2.ItemGroups import item_name_groups, unlisted_item_name_groups
+from worlds.sc2 import Options
+from worlds.sc2.Options import (
+    MissionOrder, KerriganPrimalStatus, kerrigan_unit_available, KerriganPresence,
+    GameSpeed, GenericUpgradeItems, GenericUpgradeResearch, ColorChoice, GenericUpgradeMissions,
+    LocationInclusion, ExtraLocations, MasteryLocations, ChallengeLocations, VanillaLocations,
+    DisableForcedCamera, SkipCutscenes, GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, RequiredTactics,
+    SpearOfAdunPresence, SpearOfAdunPresentInNoBuild, SpearOfAdunAutonomouslyCastAbilityPresence,
+    SpearOfAdunAutonomouslyCastPresentInNoBuild
+)
+
+
+if __name__ == "__main__":
+    init_logging("SC2Client", exception_logger="Client")
+
+logger = logging.getLogger("Client")
+sc2_logger = logging.getLogger("Starcraft2")
+
+import nest_asyncio
+from worlds._sc2common import bot
+from worlds._sc2common.bot.data import Race
+from worlds._sc2common.bot.main import run_game
+from worlds._sc2common.bot.player import Bot
+from worlds.sc2.Items import lookup_id_to_name, get_full_item_list, ItemData, type_flaggroups, upgrade_numbers, upgrade_numbers_all
+from worlds.sc2.Locations import SC2WOL_LOC_ID_OFFSET, LocationType, SC2HOTS_LOC_ID_OFFSET
+from worlds.sc2.MissionTables import lookup_id_to_mission, SC2Campaign, lookup_name_to_mission, \
+    lookup_id_to_campaign, MissionConnection, SC2Mission, campaign_mission_table, SC2Race, get_no_build_missions
+from worlds.sc2.Regions import MissionInfo
+
+import colorama
+from Options import Option
+from NetUtils import ClientStatus, NetworkItem, JSONtoTextParser, JSONMessagePart, add_json_item, add_json_location, add_json_text, JSONTypes
+from MultiServer import mark_raw
+
+pool = concurrent.futures.ThreadPoolExecutor(1)
+loop = asyncio.get_event_loop_policy().new_event_loop()
+nest_asyncio.apply(loop)
+MAX_BONUS: int = 28
+VICTORY_MODULO: int = 100
+
+# GitHub repo where the Map/mod data is hosted for /download_data command
+DATA_REPO_OWNER = "Ziktofel"
+DATA_REPO_NAME = "Archipelago-SC2-data"
+DATA_API_VERSION = "API3"
+
+# Bot controller
+CONTROLLER_HEALTH: int = 38281
+CONTROLLER2_HEALTH: int = 38282
+
+# Games
+STARCRAFT2 = "Starcraft 2"
+STARCRAFT2_WOL = "Starcraft 2 Wings of Liberty"
+
+
+# Data version file path.
+# This file is used to tell if the downloaded data are outdated
+# Associated with /download_data command
+def get_metadata_file() -> str:
+    return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt"
+
+
+class ConfigurableOptionType(enum.Enum):
+    INTEGER = enum.auto()
+    ENUM = enum.auto()
+
+class ConfigurableOptionInfo(typing.NamedTuple):
+    name: str
+    variable_name: str
+    option_class: typing.Type[Option]
+    option_type: ConfigurableOptionType = ConfigurableOptionType.ENUM
+    can_break_logic: bool = False
+
+
+class ColouredMessage:
+    def __init__(self, text: str = '') -> None:
+        self.parts: typing.List[dict] = []
+        if text:
+            self(text)
+    def __call__(self, text: str) -> 'ColouredMessage':
+        add_json_text(self.parts, text)
+        return self
+    def coloured(self, text: str, colour: str) -> 'ColouredMessage':
+        add_json_text(self.parts, text, type="color", color=colour)
+        return self
+    def location(self, location_id: int, player_id: int = 0) -> 'ColouredMessage':
+        add_json_location(self.parts, location_id, player_id)
+        return self
+    def item(self, item_id: int, player_id: int = 0, flags: int = 0) -> 'ColouredMessage':
+        add_json_item(self.parts, item_id, player_id, flags)
+        return self
+    def player(self, player_id: int) -> 'ColouredMessage':
+        add_json_text(self.parts, str(player_id), type=JSONTypes.player_id)
+        return self
+    def send(self, ctx: SC2Context) -> None:
+        ctx.on_print_json({"data": self.parts, "cmd": "PrintJSON"})
+
+
+class StarcraftClientProcessor(ClientCommandProcessor):
+    ctx: SC2Context
+    echo_commands = True
+
+    def formatted_print(self, text: str) -> None:
+        """Prints with kivy formatting to the GUI, and also prints to command-line and to all logs"""
+        # Note(mm): Bold/underline can help readability, but unfortunately the CommonClient does not filter bold tags from command-line output.
+        # Regardless, using `on_print_json` to get formatted text in the GUI and output in the command-line and in the logs,
+        # without having to branch code from CommonClient
+        self.ctx.on_print_json({"data": [{"text": text}]})
+
+    def _cmd_difficulty(self, difficulty: str = "") -> bool:
+        """Overrides the current difficulty set for the world.  Takes the argument casual, normal, hard, or brutal"""
+        options = difficulty.split()
+        num_options = len(options)
+
+        if num_options > 0:
+            difficulty_choice = options[0].lower()
+            if difficulty_choice == "casual":
+                self.ctx.difficulty_override = 0
+            elif difficulty_choice == "normal":
+                self.ctx.difficulty_override = 1
+            elif difficulty_choice == "hard":
+                self.ctx.difficulty_override = 2
+            elif difficulty_choice == "brutal":
+                self.ctx.difficulty_override = 3
+            else:
+                self.output("Unable to parse difficulty '" + options[0] + "'")
+                return False
+
+            self.output("Difficulty set to " + options[0])
+            return True
+
+        else:
+            if self.ctx.difficulty == -1:
+                self.output("Please connect to a seed before checking difficulty.")
+            else:
+                current_difficulty = self.ctx.difficulty
+                if self.ctx.difficulty_override >= 0:
+                    current_difficulty = self.ctx.difficulty_override
+                self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty])
+            self.output("To change the difficulty, add the name of the difficulty after the command.")
+            return False
+
+
+    def _cmd_game_speed(self, game_speed: str = "") -> bool:
+        """Overrides the current game speed for the world.
+         Takes the arguments default, slower, slow, normal, fast, faster"""
+        options = game_speed.split()
+        num_options = len(options)
+
+        if num_options > 0:
+            speed_choice = options[0].lower()
+            if speed_choice == "default":
+                self.ctx.game_speed_override = 0
+            elif speed_choice == "slower":
+                self.ctx.game_speed_override = 1
+            elif speed_choice == "slow":
+                self.ctx.game_speed_override = 2
+            elif speed_choice == "normal":
+                self.ctx.game_speed_override = 3
+            elif speed_choice == "fast":
+                self.ctx.game_speed_override = 4
+            elif speed_choice == "faster":
+                self.ctx.game_speed_override = 5
+            else:
+                self.output("Unable to parse game speed '" + options[0] + "'")
+                return False
+
+            self.output("Game speed set to " + options[0])
+            return True
+
+        else:
+            if self.ctx.game_speed == -1:
+                self.output("Please connect to a seed before checking game speed.")
+            else:
+                current_speed = self.ctx.game_speed
+                if self.ctx.game_speed_override >= 0:
+                    current_speed = self.ctx.game_speed_override
+                self.output("Current game speed: "
+                            + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed])
+            self.output("To change the game speed, add the name of the speed after the command,"
+                        " or Default to select based on difficulty.")
+            return False
+    
+    @mark_raw
+    def _cmd_received(self, filter_search: str = "") -> bool:
+        """List received items.
+        Pass in a parameter to filter the search by partial item name or exact item group."""
+        # Groups must be matched case-sensitively, so we properly capitalize the search term
+        # eg. "Spear of Adun" over "Spear Of Adun" or "spear of adun"
+        # This fails a lot of item name matches, but those should be found by partial name match
+        formatted_filter_search = " ".join([(part.lower() if len(part) <= 3 else part.lower().capitalize()) for part in filter_search.split()])
+
+        def item_matches_filter(item_name: str) -> bool:
+            # The filter can be an exact group name or a partial item name
+            # Partial item name can be matched case-insensitively
+            if filter_search.lower() in item_name.lower():
+                return True
+            # The search term should already be formatted as a group name
+            if formatted_filter_search in item_name_groups and item_name in item_name_groups[formatted_filter_search]:
+                return True
+            return False
+
+        items = get_full_item_list()
+        categorized_items: typing.Dict[SC2Race, typing.List[int]] = {}
+        parent_to_child: typing.Dict[int, typing.List[int]] = {}
+        items_received: typing.Dict[int, typing.List[NetworkItem]] = {}
+        filter_match_count = 0
+        for item in self.ctx.items_received:
+            items_received.setdefault(item.item, []).append(item)
+        items_received_set = set(items_received)
+        for item_data in items.values():
+            if item_data.parent_item:
+                parent_to_child.setdefault(items[item_data.parent_item].code, []).append(item_data.code)
+            else:
+                categorized_items.setdefault(item_data.race, []).append(item_data.code)
+        for faction in SC2Race:
+            has_printed_faction_title = False
+            def print_faction_title():
+                if not has_printed_faction_title:
+                    self.formatted_print(f" [u]{faction.name}[/u] ")
+            
+            for item_id in categorized_items[faction]:
+                item_name = self.ctx.item_names[item_id]
+                received_child_items = items_received_set.intersection(parent_to_child.get(item_id, []))
+                matching_children = [child for child in received_child_items
+                                    if item_matches_filter(self.ctx.item_names[child])]
+                received_items_of_this_type = items_received.get(item_id, [])
+                item_is_match = item_matches_filter(item_name)
+                if item_is_match or len(matching_children) > 0:
+                    # Print found item if it or its children match the filter
+                    if item_is_match:
+                        filter_match_count += len(received_items_of_this_type)
+                    for item in received_items_of_this_type:
+                        print_faction_title()
+                        has_printed_faction_title = True
+                        (ColouredMessage('* ').item(item.item, flags=item.flags)
+                            (" from ").location(item.location, self.ctx.slot)
+                            (" by ").player(item.player)
+                        ).send(self.ctx)
+                
+                if received_child_items:
+                    # We have this item's children
+                    if len(matching_children) == 0:
+                        # ...but none of them match the filter
+                        continue
+
+                    if not received_items_of_this_type:
+                        # We didn't receive the item itself
+                        print_faction_title()
+                        has_printed_faction_title = True
+                        ColouredMessage("- ").coloured(item_name, "black")(" - not obtained").send(self.ctx)
+                    
+                    for child_item in matching_children:
+                        received_items_of_this_type = items_received.get(child_item, [])
+                        for item in received_items_of_this_type:
+                            filter_match_count += len(received_items_of_this_type)
+                            (ColouredMessage('  * ').item(item.item, flags=item.flags)
+                                (" from ").location(item.location, self.ctx.slot)
+                                (" by ").player(item.player)
+                            ).send(self.ctx)
+                    
+                    non_matching_children = len(received_child_items) - len(matching_children)
+                    if non_matching_children > 0:
+                        self.formatted_print(f"  + {non_matching_children} child items that don't match the filter")
+        if filter_search == "":
+            self.formatted_print(f"[b]Obtained: {len(self.ctx.items_received)} items[/b]")
+        else:
+            self.formatted_print(f"[b]Filter \"{filter_search}\" found {filter_match_count} out of {len(self.ctx.items_received)} obtained items[/b]")
+        return True
+    
+    def _cmd_option(self, option_name: str = "", option_value: str = "") -> None:
+        """Sets a Starcraft game option that can be changed after generation. Use "/option list" to see all options."""
+
+        LOGIC_WARNING = f"  *Note changing this may result in logically unbeatable games*\n"
+
+        options = (
+            ConfigurableOptionInfo('kerrigan_presence', 'kerrigan_presence', Options.KerriganPresence, can_break_logic=True),
+            ConfigurableOptionInfo('soa_presence', 'spear_of_adun_presence', Options.SpearOfAdunPresence, can_break_logic=True),
+            ConfigurableOptionInfo('soa_in_nobuilds', 'spear_of_adun_present_in_no_build', Options.SpearOfAdunPresentInNoBuild, can_break_logic=True),
+            ConfigurableOptionInfo('control_ally', 'take_over_ai_allies', Options.TakeOverAIAllies, can_break_logic=True),
+            ConfigurableOptionInfo('minerals_per_item', 'minerals_per_item', Options.MineralsPerItem, ConfigurableOptionType.INTEGER),
+            ConfigurableOptionInfo('gas_per_item', 'vespene_per_item', Options.VespenePerItem, ConfigurableOptionType.INTEGER),
+            ConfigurableOptionInfo('supply_per_item', 'starting_supply_per_item', Options.StartingSupplyPerItem, ConfigurableOptionType.INTEGER),
+            ConfigurableOptionInfo('no_forced_camera', 'disable_forced_camera', Options.DisableForcedCamera),
+            ConfigurableOptionInfo('skip_cutscenes', 'skip_cutscenes', Options.SkipCutscenes),
+        )
+
+        WARNING_COLOUR = "salmon"
+        CMD_COLOUR = "slateblue"
+        boolean_option_map = {
+            'y': 'true', 'yes': 'true', 'n': 'false', 'no': 'false',
+        }
+
+        help_message = ColouredMessage(inspect.cleandoc("""
+            Options
+        --------------------
+        """))('\n')
+        for option in options:
+            option_help_text = inspect.cleandoc(option.option_class.__doc__ or "No description provided.").split('\n', 1)[0]
+            help_message.coloured(option.name, CMD_COLOUR)(": " + " | ".join(option.option_class.options)
+                + f" -- {option_help_text}\n")
+            if option.can_break_logic:
+                help_message.coloured(LOGIC_WARNING, WARNING_COLOUR)
+        help_message("--------------------\nEnter an option without arguments to see its current value.\n")
+
+        if not option_name or option_name == 'list' or option_name == 'help':
+            help_message.send(self.ctx)
+            return
+        for option in options:
+            if option_name == option.name:
+                option_value = boolean_option_map.get(option_value, option_value)
+                if not option_value:
+                    pass
+                elif option.option_type == ConfigurableOptionType.ENUM and option_value in option.option_class.options:
+                    self.ctx.__dict__[option.variable_name] = option.option_class.options[option_value]
+                elif option.option_type == ConfigurableOptionType.INTEGER:
+                    try:
+                        self.ctx.__dict__[option.variable_name] = int(option_value, base=0)
+                    except:
+                        self.output(f"{option_value} is not a valid integer")
+                else:
+                    self.output(f"Unknown option value '{option_value}'")
+                ColouredMessage(f"{option.name} is '{option.option_class.get_option_name(self.ctx.__dict__[option.variable_name])}'").send(self.ctx)
+                break
+        else:
+            self.output(f"Unknown option '{option_name}'")
+            help_message.send(self.ctx)
+
+    def _cmd_color(self, faction: str = "", color: str = "") -> None:
+        """Changes the player color for a given faction."""
+        player_colors = [
+            "White", "Red", "Blue", "Teal",
+            "Purple", "Yellow", "Orange", "Green",
+            "LightPink", "Violet", "LightGrey", "DarkGreen",
+            "Brown", "LightGreen", "DarkGrey", "Pink",
+            "Rainbow", "Random", "Default"
+        ]
+        var_names = {
+            'raynor': 'player_color_raynor',
+            'kerrigan': 'player_color_zerg',
+            'primal': 'player_color_zerg_primal',
+            'protoss': 'player_color_protoss',
+            'nova': 'player_color_nova',
+        }
+        faction = faction.lower()
+        if not faction:
+            for faction_name, key in var_names.items():
+                self.output(f"Current player color for {faction_name}: {player_colors[self.ctx.__dict__[key]]}")
+            self.output("To change your color, add the faction name and color after the command.")
+            self.output("Available factions: " + ', '.join(var_names))
+            self.output("Available colors: " + ', '.join(player_colors))
+            return
+        elif faction not in var_names:
+            self.output(f"Unknown faction '{faction}'.")
+            self.output("Available factions: " + ', '.join(var_names))
+            return
+        match_colors = [player_color.lower() for player_color in player_colors]
+        if not color:
+            self.output(f"Current player color for {faction}: {player_colors[self.ctx.__dict__[var_names[faction]]]}")
+            self.output("To change this faction's colors, add the name of the color after the command.")
+            self.output("Available colors: " + ', '.join(player_colors))
+        else:
+            if color.lower() not in match_colors:
+                self.output(color + " is not a valid color.  Available colors: " + ', '.join(player_colors))
+                return
+            if color.lower() == "random":
+                color = random.choice(player_colors[:16])
+            self.ctx.__dict__[var_names[faction]] = match_colors.index(color.lower())
+            self.ctx.pending_color_update = True
+            self.output(f"Color for {faction} set to " + player_colors[self.ctx.__dict__[var_names[faction]]])
+
+    def _cmd_disable_mission_check(self) -> bool:
+        """Disables the check to see if a mission is available to play.  Meant for co-op runs where one player can play
+        the next mission in a chain the other player is doing."""
+        self.ctx.missions_unlocked = True
+        sc2_logger.info("Mission check has been disabled")
+        return True
+
+    def _cmd_play(self, mission_id: str = "") -> bool:
+        """Start a Starcraft 2 mission"""
+
+        options = mission_id.split()
+        num_options = len(options)
+
+        if num_options > 0:
+            mission_number = int(options[0])
+
+            self.ctx.play_mission(mission_number)
+
+        else:
+            sc2_logger.info(
+                "Mission ID needs to be specified.  Use /unfinished or /available to view ids for available missions.")
+            return False
+
+        return True
+
+    def _cmd_available(self) -> bool:
+        """Get what missions are currently available to play"""
+
+        request_available_missions(self.ctx)
+        return True
+
+    def _cmd_unfinished(self) -> bool:
+        """Get what missions are currently available to play and have not had all locations checked"""
+
+        request_unfinished_missions(self.ctx)
+        return True
+
+    @mark_raw
+    def _cmd_set_path(self, path: str = '') -> bool:
+        """Manually set the SC2 install directory (if the automatic detection fails)."""
+        if path:
+            os.environ["SC2PATH"] = path
+            is_mod_installed_correctly()
+            return True
+        else:
+            sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.")
+        return False
+
+    def _cmd_download_data(self) -> bool:
+        """Download the most recent release of the necessary files for playing SC2 with
+        Archipelago. Will overwrite existing files."""
+        pool.submit(self._download_data)
+        return True
+
+    @staticmethod
+    def _download_data() -> bool:
+        if "SC2PATH" not in os.environ:
+            check_game_install_path()
+
+        if os.path.exists(get_metadata_file()):
+            with open(get_metadata_file(), "r") as f:
+                metadata = f.read()
+        else:
+            metadata = None
+
+        tempzip, metadata = download_latest_release_zip(
+            DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, metadata=metadata, force_download=True)
+
+        if tempzip:
+            try:
+                zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"])
+                sc2_logger.info(f"Download complete. Package installed.")
+                if metadata is not None:
+                    with open(get_metadata_file(), "w") as f:
+                        f.write(metadata)
+            finally:
+                os.remove(tempzip)
+        else:
+            sc2_logger.warning("Download aborted/failed. Read the log for more information.")
+            return False
+        return True
+
+
+class SC2JSONtoTextParser(JSONtoTextParser):
+    def __init__(self, ctx) -> None:
+        self.handlers = {
+            "ItemSend": self._handle_color,
+            "ItemCheat": self._handle_color,
+            "Hint": self._handle_color,
+        }
+        super().__init__(ctx)
+
+    def _handle_color(self, node: JSONMessagePart) -> str:
+        codes = node["color"].split(";")
+        buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes)
+        return buffer + self._handle_text(node) + '</c>'
+
+    def color_code(self, code: str) -> str:
+        return '<c val="' + self.color_codes[code] + '">'
+
+
+class SC2Context(CommonContext):
+    command_processor = StarcraftClientProcessor
+    game = STARCRAFT2
+    items_handling = 0b111
+
+    def __init__(self, *args, **kwargs) -> None:
+        super(SC2Context, self).__init__(*args, **kwargs)
+        self.raw_text_parser = SC2JSONtoTextParser(self)
+
+        self.difficulty = -1
+        self.game_speed = -1
+        self.disable_forced_camera = 0
+        self.skip_cutscenes = 0
+        self.all_in_choice = 0
+        self.mission_order = 0
+        self.player_color_raynor = ColorChoice.option_blue
+        self.player_color_zerg = ColorChoice.option_orange
+        self.player_color_zerg_primal = ColorChoice.option_purple
+        self.player_color_protoss = ColorChoice.option_blue
+        self.player_color_nova = ColorChoice.option_dark_grey
+        self.pending_color_update = False
+        self.kerrigan_presence = 0
+        self.kerrigan_primal_status = 0
+        self.levels_per_check = 0
+        self.checks_per_level = 1
+        self.mission_req_table: typing.Dict[SC2Campaign, typing.Dict[str, MissionInfo]] = {}
+        self.final_mission: int = 29
+        self.announcements: queue.Queue = queue.Queue()
+        self.sc2_run_task: typing.Optional[asyncio.Task] = None
+        self.missions_unlocked: bool = False  # allow launching missions ignoring requirements
+        self.generic_upgrade_missions = 0
+        self.generic_upgrade_research = 0
+        self.generic_upgrade_items = 0
+        self.location_inclusions: typing.Dict[LocationType, int] = {}
+        self.plando_locations: typing.List[str] = []
+        self.current_tooltip = None
+        self.last_loc_list = None
+        self.difficulty_override = -1
+        self.game_speed_override = -1
+        self.mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {}
+        self.last_bot: typing.Optional[ArchipelagoBot] = None
+        self.slot_data_version = 2
+        self.grant_story_tech = 0
+        self.required_tactics = RequiredTactics.option_standard
+        self.take_over_ai_allies = TakeOverAIAllies.option_false
+        self.spear_of_adun_presence = SpearOfAdunPresence.option_not_present
+        self.spear_of_adun_present_in_no_build = SpearOfAdunPresentInNoBuild.option_false
+        self.spear_of_adun_autonomously_cast_ability_presence = SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present
+        self.spear_of_adun_autonomously_cast_present_in_no_build = SpearOfAdunAutonomouslyCastPresentInNoBuild.option_false
+        self.minerals_per_item = 15
+        self.vespene_per_item = 15
+        self.starting_supply_per_item = 2
+        self.nova_covert_ops_only = False
+        self.kerrigan_levels_per_mission_completed = 0
+
+    async def server_auth(self, password_requested: bool = False) -> None:
+        self.game = STARCRAFT2
+        if password_requested and not self.password:
+            await super(SC2Context, self).server_auth(password_requested)
+        await self.get_username()
+        await self.send_connect()
+        if self.ui:
+            self.ui.first_check = True
+
+    def is_legacy_game(self):
+        return self.game == STARCRAFT2_WOL
+
+    def event_invalid_game(self):
+        if self.is_legacy_game():
+            self.game = STARCRAFT2
+            super().event_invalid_game()
+        else:
+            self.game = STARCRAFT2_WOL
+            async_start(self.send_connect())
+
+    def on_package(self, cmd: str, args: dict) -> None:
+        if cmd == "Connected":
+            self.difficulty = args["slot_data"]["game_difficulty"]
+            self.game_speed = args["slot_data"].get("game_speed", GameSpeed.option_default)
+            self.disable_forced_camera = args["slot_data"].get("disable_forced_camera", DisableForcedCamera.default)
+            self.skip_cutscenes = args["slot_data"].get("skip_cutscenes", SkipCutscenes.default)
+            self.all_in_choice = args["slot_data"]["all_in_map"]
+            self.slot_data_version = args["slot_data"].get("version", 2)
+            slot_req_table: dict = args["slot_data"]["mission_req"]
+
+            first_item = list(slot_req_table.keys())[0]
+            # Maintaining backwards compatibility with older slot data
+            if first_item in [str(campaign.id) for campaign in SC2Campaign]:
+                # Multi-campaign
+                self.mission_req_table = {}
+                for campaign_id in slot_req_table:
+                    campaign = lookup_id_to_campaign[int(campaign_id)]
+                    self.mission_req_table[campaign] = {
+                        mission: self.parse_mission_info(mission_info)
+                        for mission, mission_info in slot_req_table[campaign_id].items()
+                    }
+            else:
+                # Old format
+                self.mission_req_table = {SC2Campaign.GLOBAL: {
+                        mission: self.parse_mission_info(mission_info)
+                        for mission, mission_info in slot_req_table.items()
+                    }
+                }
+
+            self.mission_order = args["slot_data"].get("mission_order", MissionOrder.option_vanilla)
+            self.final_mission = args["slot_data"].get("final_mission", SC2Mission.ALL_IN.id)
+            self.player_color_raynor = args["slot_data"].get("player_color_terran_raynor", ColorChoice.option_blue)
+            self.player_color_zerg = args["slot_data"].get("player_color_zerg", ColorChoice.option_orange)
+            self.player_color_zerg_primal = args["slot_data"].get("player_color_zerg_primal", ColorChoice.option_purple)
+            self.player_color_protoss = args["slot_data"].get("player_color_protoss", ColorChoice.option_blue)
+            self.player_color_nova = args["slot_data"].get("player_color_nova", ColorChoice.option_dark_grey)
+            self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", GenericUpgradeMissions.default)
+            self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", GenericUpgradeItems.option_individual_items)
+            self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", GenericUpgradeResearch.option_vanilla)
+            self.kerrigan_presence = args["slot_data"].get("kerrigan_presence", KerriganPresence.option_vanilla)
+            self.kerrigan_primal_status = args["slot_data"].get("kerrigan_primal_status", KerriganPrimalStatus.option_vanilla)
+            self.kerrigan_levels_per_mission_completed = args["slot_data"].get("kerrigan_levels_per_mission_completed", 0)
+            self.kerrigan_levels_per_mission_completed_cap = args["slot_data"].get("kerrigan_levels_per_mission_completed_cap", -1)
+            self.kerrigan_total_level_cap = args["slot_data"].get("kerrigan_total_level_cap", -1)
+            self.grant_story_tech = args["slot_data"].get("grant_story_tech", GrantStoryTech.option_false)
+            self.grant_story_levels = args["slot_data"].get("grant_story_levels", GrantStoryLevels.option_additive)
+            self.required_tactics = args["slot_data"].get("required_tactics", RequiredTactics.option_standard)
+            self.take_over_ai_allies = args["slot_data"].get("take_over_ai_allies", TakeOverAIAllies.option_false)
+            self.spear_of_adun_presence = args["slot_data"].get("spear_of_adun_presence", SpearOfAdunPresence.option_not_present)
+            self.spear_of_adun_present_in_no_build = args["slot_data"].get("spear_of_adun_present_in_no_build", SpearOfAdunPresentInNoBuild.option_false)
+            self.spear_of_adun_autonomously_cast_ability_presence = args["slot_data"].get("spear_of_adun_autonomously_cast_ability_presence", SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present)
+            self.spear_of_adun_autonomously_cast_present_in_no_build = args["slot_data"].get("spear_of_adun_autonomously_cast_present_in_no_build", SpearOfAdunAutonomouslyCastPresentInNoBuild.option_false)
+            self.minerals_per_item = args["slot_data"].get("minerals_per_item", 15)
+            self.vespene_per_item = args["slot_data"].get("vespene_per_item", 15)
+            self.starting_supply_per_item = args["slot_data"].get("starting_supply_per_item", 2)
+            self.nova_covert_ops_only = args["slot_data"].get("nova_covert_ops_only", False)
+
+            if self.required_tactics == RequiredTactics.option_no_logic:
+                # Locking Grant Story Tech/Levels if no logic
+                self.grant_story_tech = GrantStoryTech.option_true
+                self.grant_story_levels = GrantStoryLevels.option_minimum
+
+            self.location_inclusions = {
+                LocationType.VICTORY: LocationInclusion.option_enabled, # Victory checks are always enabled
+                LocationType.VANILLA: args["slot_data"].get("vanilla_locations", VanillaLocations.default),
+                LocationType.EXTRA: args["slot_data"].get("extra_locations", ExtraLocations.default),
+                LocationType.CHALLENGE: args["slot_data"].get("challenge_locations", ChallengeLocations.default),
+                LocationType.MASTERY: args["slot_data"].get("mastery_locations", MasteryLocations.default),
+            }
+            self.plando_locations = args["slot_data"].get("plando_locations", [])
+
+            self.build_location_to_mission_mapping()
+
+            # Looks for the required maps and mods for SC2. Runs check_game_install_path.
+            maps_present = is_mod_installed_correctly()
+            if os.path.exists(get_metadata_file()):
+                with open(get_metadata_file(), "r") as f:
+                    current_ver = f.read()
+                    sc2_logger.debug(f"Current version: {current_ver}")
+                if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver):
+                    sc2_logger.info("NOTICE: Update for required files found. Run /download_data to install.")
+            elif maps_present:
+                sc2_logger.warning("NOTICE: Your map files may be outdated (version number not found). "
+                                   "Run /download_data to update them.")
+
+    @staticmethod
+    def parse_mission_info(mission_info: dict[str, typing.Any]) -> MissionInfo:
+        if mission_info.get("id") is not None:
+            mission_info["mission"] = lookup_id_to_mission[mission_info["id"]]
+        elif isinstance(mission_info["mission"], int):
+            mission_info["mission"] = lookup_id_to_mission[mission_info["mission"]]
+
+        return MissionInfo(
+            **{field: value for field, value in mission_info.items() if field in MissionInfo._fields}
+        )
+
+    def find_campaign(self, mission_name: str) -> SC2Campaign:
+        data = self.mission_req_table
+        for campaign in data.keys():
+            if mission_name in data[campaign].keys():
+                return campaign
+        sc2_logger.info(f"Attempted to find campaign of unknown mission '{mission_name}'; defaulting to GLOBAL")
+        return SC2Campaign.GLOBAL
+
+
+
+    def on_print_json(self, args: dict) -> None:
+        # goes to this world
+        if "receiving" in args and self.slot_concerns_self(args["receiving"]):
+            relevant = True
+        # found in this world
+        elif "item" in args and self.slot_concerns_self(args["item"].player):
+            relevant = True
+        # not related
+        else:
+            relevant = False
+
+        if relevant:
+            self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"])))
+
+        super(SC2Context, self).on_print_json(args)
+
+    def run_gui(self) -> None:
+        from .ClientGui import start_gui
+        start_gui(self)
+
+
+    async def shutdown(self) -> None:
+        await super(SC2Context, self).shutdown()
+        if self.last_bot:
+            self.last_bot.want_close = True
+        if self.sc2_run_task:
+            self.sc2_run_task.cancel()
+
+    def play_mission(self, mission_id: int) -> bool:
+        if self.missions_unlocked or is_mission_available(self, mission_id):
+            if self.sc2_run_task:
+                if not self.sc2_run_task.done():
+                    sc2_logger.warning("Starcraft 2 Client is still running!")
+                self.sc2_run_task.cancel()  # doesn't actually close the game, just stops the python task
+            if self.slot is None:
+                sc2_logger.warning("Launching Mission without Archipelago authentication, "
+                                   "checks will not be registered to server.")
+            self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id),
+                                                    name="Starcraft 2 Launch")
+            return True
+        else:
+            sc2_logger.info(
+                f"{lookup_id_to_mission[mission_id].mission_name} is not currently unlocked.  "
+                f"Use /unfinished or /available to see what is available.")
+            return False
+
+    def build_location_to_mission_mapping(self) -> None:
+        mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = {
+            mission_info.mission.id: set() for campaign_mission in self.mission_req_table.values() for mission_info in campaign_mission.values()
+        }
+
+        for loc in self.server_locations:
+            offset = SC2WOL_LOC_ID_OFFSET if loc < SC2HOTS_LOC_ID_OFFSET \
+                else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO)
+            mission_id, objective = divmod(loc - offset, VICTORY_MODULO)
+            mission_id_to_location_ids[mission_id].add(objective)
+        self.mission_id_to_location_ids = {mission_id: sorted(objectives) for mission_id, objectives in
+                                           mission_id_to_location_ids.items()}
+
+    def locations_for_mission(self, mission_name: str):
+        mission = lookup_name_to_mission[mission_name]
+        mission_id: int = mission.id
+        objectives = self.mission_id_to_location_ids[mission_id]
+        for objective in objectives:
+            yield get_location_offset(mission_id) + mission_id * VICTORY_MODULO + objective
+
+
+class CompatItemHolder(typing.NamedTuple):
+    name: str
+    quantity: int = 1
+
+
+async def main():
+    multiprocessing.freeze_support()
+    parser = get_base_parser()
+    parser.add_argument('--name', default=None, help="Slot Name to connect as.")
+    args = parser.parse_args()
+
+    ctx = SC2Context(args.connect, args.password)
+    ctx.auth = args.name
+    if ctx.server_task is None:
+        ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop")
+
+    if gui_enabled:
+        ctx.run_gui()
+    ctx.run_cli()
+
+    await ctx.exit_event.wait()
+
+    await ctx.shutdown()
+
+# These items must be given to the player if the game is generated on version 2
+API2_TO_API3_COMPAT_ITEMS: typing.Set[CompatItemHolder] = {
+    CompatItemHolder(ItemNames.PHOTON_CANNON),
+    CompatItemHolder(ItemNames.OBSERVER),
+    CompatItemHolder(ItemNames.WARP_HARMONIZATION),
+    CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON, 3),
+    CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR, 3),
+    CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, 3),
+    CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON, 3),
+    CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR, 3),
+    CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, 3)
+}
+
+
+def compat_item_to_network_items(compat_item: CompatItemHolder) -> typing.List[NetworkItem]:
+    item_id = get_full_item_list()[compat_item.name].code
+    network_item = NetworkItem(item_id, 0, 0, 0)
+    return compat_item.quantity * [network_item]
+
+
+def calculate_items(ctx: SC2Context) -> typing.Dict[SC2Race, typing.List[int]]:
+    items = ctx.items_received.copy()
+    # Items unlocked in API2 by default (Prophecy default items)
+    if ctx.slot_data_version < 3:
+        for compat_item in API2_TO_API3_COMPAT_ITEMS:
+            items.extend(compat_item_to_network_items(compat_item))
+
+    network_item: NetworkItem
+    accumulators: typing.Dict[SC2Race, typing.List[int]] = {race: [0 for _ in type_flaggroups[race]] for race in SC2Race}
+
+    # Protoss Shield grouped item specific logic
+    shields_from_ground_upgrade: int = 0
+    shields_from_air_upgrade: int = 0
+
+    item_list = get_full_item_list()
+    for network_item in items:
+        name: str = lookup_id_to_name[network_item.item]
+        item_data: ItemData = item_list[name]
+
+        # exists exactly once
+        if item_data.quantity == 1:
+            accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] |= 1 << item_data.number
+
+        # exists multiple times
+        elif item_data.type in ["Upgrade", "Progressive Upgrade","Progressive Upgrade 2"]:
+            flaggroup = type_flaggroups[item_data.race][item_data.type]
+
+            # Generic upgrades apply only to Weapon / Armor upgrades
+            if item_data.type != "Upgrade" or ctx.generic_upgrade_items == 0:
+                accumulators[item_data.race][flaggroup] += 1 << item_data.number
+            else:
+                if name == ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE:
+                    shields_from_ground_upgrade += 1
+                if name == ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE:
+                    shields_from_air_upgrade += 1
+                for bundled_number in upgrade_numbers[item_data.number]:
+                    accumulators[item_data.race][flaggroup] += 1 << bundled_number
+
+            # Regen bio-steel nerf with API3 - undo for older games
+            if ctx.slot_data_version < 3 and name == ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL:
+                current_level = (accumulators[item_data.race][flaggroup] >> item_data.number) % 4
+                if current_level == 2:
+                    # Switch from level 2 to level 3 for compatibility
+                    accumulators[item_data.race][flaggroup] += 1 << item_data.number
+        # sum
+        else:
+            if name == ItemNames.STARTING_MINERALS:
+                accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.minerals_per_item
+            elif name == ItemNames.STARTING_VESPENE:
+                accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.vespene_per_item
+            elif name == ItemNames.STARTING_SUPPLY:
+                accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.starting_supply_per_item
+            else:
+                accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += item_data.number
+
+    # Fix Shields from generic upgrades by unit class (Maximum of ground/air upgrades)
+    if shields_from_ground_upgrade > 0 or shields_from_air_upgrade > 0:
+        shield_upgrade_level = max(shields_from_ground_upgrade, shields_from_air_upgrade)
+        shield_upgrade_item = item_list[ItemNames.PROGRESSIVE_PROTOSS_SHIELDS]
+        for _ in range(0, shield_upgrade_level):
+            accumulators[shield_upgrade_item.race][type_flaggroups[shield_upgrade_item.race][shield_upgrade_item.type]] += 1 << shield_upgrade_item.number
+
+    # Kerrigan levels per check
+    accumulators[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]] += (len(ctx.checked_locations) // ctx.checks_per_level) * ctx.levels_per_check
+
+    # Upgrades from completed missions
+    if ctx.generic_upgrade_missions > 0:
+        total_missions = sum(len(ctx.mission_req_table[campaign]) for campaign in ctx.mission_req_table)
+        for race in SC2Race:
+            if "Upgrade" not in type_flaggroups[race]:
+                continue
+            upgrade_flaggroup = type_flaggroups[race]["Upgrade"]
+            num_missions = ctx.generic_upgrade_missions * total_missions
+            amounts = [
+                num_missions // 100,
+                2 * num_missions // 100,
+                3 * num_missions // 100
+            ]
+            upgrade_count = 0
+            completed = len([id for id in ctx.mission_id_to_location_ids if get_location_offset(id) + VICTORY_MODULO * id in ctx.checked_locations])
+            for amount in amounts:
+                if completed >= amount:
+                    upgrade_count += 1
+            # Equivalent to "Progressive Weapon/Armor Upgrade" item
+            for bundled_number in upgrade_numbers[upgrade_numbers_all[race]]:
+                accumulators[race][upgrade_flaggroup] += upgrade_count << bundled_number
+
+    return accumulators
+
+
+def calc_difficulty(difficulty: int):
+    if difficulty == 0:
+        return 'C'
+    elif difficulty == 1:
+        return 'N'
+    elif difficulty == 2:
+        return 'H'
+    elif difficulty == 3:
+        return 'B'
+
+    return 'X'
+
+
+def get_kerrigan_level(ctx: SC2Context, items: typing.Dict[SC2Race, typing.List[int]], missions_beaten: int) -> int:
+    item_value = items[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]]
+    mission_value = missions_beaten * ctx.kerrigan_levels_per_mission_completed
+    if ctx.kerrigan_levels_per_mission_completed_cap != -1:
+        mission_value = min(mission_value, ctx.kerrigan_levels_per_mission_completed_cap)
+    total_value = item_value + mission_value
+    if ctx.kerrigan_total_level_cap != -1:
+        total_value = min(total_value, ctx.kerrigan_total_level_cap)
+    return total_value
+
+
+def calculate_kerrigan_options(ctx: SC2Context) -> int:
+    options = 0
+
+    # Bits 0, 1
+    # Kerrigan unit available
+    if ctx.kerrigan_presence in kerrigan_unit_available:
+        options |= 1 << 0
+
+    # Bit 2
+    # Kerrigan primal status by map
+    if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_vanilla:
+        options |= 1 << 2
+
+    return options
+
+
+def caclulate_soa_options(ctx: SC2Context) -> int:
+    options = 0
+
+    # Bits 0, 1
+    # SoA Calldowns available
+    soa_presence_value = 0
+    if ctx.spear_of_adun_presence == SpearOfAdunPresence.option_not_present:
+        soa_presence_value = 0
+    elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_lotv_protoss:
+        soa_presence_value = 1
+    elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_protoss:
+        soa_presence_value = 2
+    elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere:
+        soa_presence_value = 3
+    options |= soa_presence_value << 0
+
+    # Bit 2
+    # SoA Calldowns for no-builds
+    if ctx.spear_of_adun_present_in_no_build == SpearOfAdunPresentInNoBuild.option_true:
+        options |= 1 << 2
+
+    # Bits 3,4
+    # Autocasts
+    soa_autocasts_presence_value = 0
+    if ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present:
+        soa_autocasts_presence_value = 0
+    elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_lotv_protoss:
+        soa_autocasts_presence_value = 1
+    elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_protoss:
+        soa_autocasts_presence_value = 2
+    elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere:
+        soa_autocasts_presence_value = 3
+    options |= soa_autocasts_presence_value << 3
+
+    # Bit 5
+    # Autocasts in no-builds
+    if ctx.spear_of_adun_autonomously_cast_present_in_no_build == SpearOfAdunAutonomouslyCastPresentInNoBuild.option_true:
+        options |= 1 << 5
+
+    return options
+
+def kerrigan_primal(ctx: SC2Context, items: typing.Dict[SC2Race, typing.List[int]]) -> bool:
+    if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_zerg:
+        return True
+    elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_human:
+        return False
+    elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_level_35:
+            return items[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]] >= 35
+    elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_half_completion:
+        total_missions = len(ctx.mission_id_to_location_ids)
+        completed = len([(mission_id * VICTORY_MODULO + get_location_offset(mission_id)) in ctx.checked_locations
+                         for mission_id in ctx.mission_id_to_location_ids])
+        return completed >= (total_missions / 2)
+    elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_item:
+        codes = [item.item for item in ctx.items_received]
+        return get_full_item_list()[ItemNames.KERRIGAN_PRIMAL_FORM].code in codes
+    return False
+
+async def starcraft_launch(ctx: SC2Context, mission_id: int):
+    sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id].mission_name}. If game does not launch check log file for errors.")
+
+    with DllDirectory(None):
+        run_game(bot.maps.get(lookup_id_to_mission[mission_id].map_file), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id),
+                                                                name="Archipelago", fullscreen=True)], realtime=True)
+
+
+class ArchipelagoBot(bot.bot_ai.BotAI):
+    __slots__ = [
+        'game_running',
+        'mission_completed',
+        'boni',
+        'setup_done',
+        'ctx',
+        'mission_id',
+        'want_close',
+        'can_read_game',
+        'last_received_update',
+    ]
+
+    def __init__(self, ctx: SC2Context, mission_id: int):
+        self.game_running = False
+        self.mission_completed = False
+        self.want_close = False
+        self.can_read_game = False
+        self.last_received_update: int = 0
+        self.setup_done = False
+        self.ctx = ctx
+        self.ctx.last_bot = self
+        self.mission_id = mission_id
+        self.boni = [False for _ in range(MAX_BONUS)]
+
+        super(ArchipelagoBot, self).__init__()
+
+    async def on_step(self, iteration: int):
+        if self.want_close:
+            self.want_close = False
+            await self._client.leave()
+            return
+        game_state = 0
+        if not self.setup_done:
+            self.setup_done = True
+            start_items = calculate_items(self.ctx)
+            missions_beaten = self.missions_beaten_count()
+            kerrigan_level = get_kerrigan_level(self.ctx, start_items, missions_beaten)
+            kerrigan_options = calculate_kerrigan_options(self.ctx)
+            soa_options = caclulate_soa_options(self.ctx)
+            if self.ctx.difficulty_override >= 0:
+                difficulty = calc_difficulty(self.ctx.difficulty_override)
+            else:
+                difficulty = calc_difficulty(self.ctx.difficulty)
+            if self.ctx.game_speed_override >= 0:
+                game_speed = self.ctx.game_speed_override
+            else:
+                game_speed = self.ctx.game_speed
+            await self.chat_send("?SetOptions {} {} {} {} {} {} {} {} {} {} {} {} {}".format(
+                difficulty,
+                self.ctx.generic_upgrade_research,
+                self.ctx.all_in_choice,
+                game_speed,
+                self.ctx.disable_forced_camera,
+                self.ctx.skip_cutscenes,
+                kerrigan_options,
+                self.ctx.grant_story_tech,
+                self.ctx.take_over_ai_allies,
+                soa_options,
+                self.ctx.mission_order,
+                1 if self.ctx.nova_covert_ops_only else 0,
+                self.ctx.grant_story_levels
+            ))
+            await self.chat_send("?GiveResources {} {} {}".format(
+                start_items[SC2Race.ANY][0],
+                start_items[SC2Race.ANY][1],
+                start_items[SC2Race.ANY][2]
+            ))
+            await self.updateTerranTech(start_items)
+            await self.updateZergTech(start_items, kerrigan_level)
+            await self.updateProtossTech(start_items)
+            await self.updateColors()
+            await self.chat_send("?LoadFinished")
+            self.last_received_update = len(self.ctx.items_received)
+
+        else:
+            if self.ctx.pending_color_update:
+                await self.updateColors()
+
+            if not self.ctx.announcements.empty():
+                message = self.ctx.announcements.get(timeout=1)
+                await self.chat_send("?SendMessage " + message)
+                self.ctx.announcements.task_done()
+
+            # Archipelago reads the health
+            controller1_state = 0
+            controller2_state = 0
+            for unit in self.all_own_units():
+                if unit.health_max == CONTROLLER_HEALTH:
+                    controller1_state = int(CONTROLLER_HEALTH - unit.health)
+                    self.can_read_game = True
+                elif unit.health_max == CONTROLLER2_HEALTH:
+                    controller2_state = int(CONTROLLER2_HEALTH - unit.health)
+                    self.can_read_game = True
+            game_state = controller1_state + (controller2_state << 15)
+
+            if iteration == 160 and not game_state & 1:
+                await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " +
+                                     "Starcraft 2 (This is likely a map issue)")
+
+            if self.last_received_update < len(self.ctx.items_received):
+                current_items = calculate_items(self.ctx)
+                missions_beaten = self.missions_beaten_count()
+                kerrigan_level = get_kerrigan_level(self.ctx, current_items, missions_beaten)
+                await self.updateTerranTech(current_items)
+                await self.updateZergTech(current_items, kerrigan_level)
+                await self.updateProtossTech(current_items)
+                self.last_received_update = len(self.ctx.items_received)
+
+            if game_state & 1:
+                if not self.game_running:
+                    print("Archipelago Connected")
+                    self.game_running = True
+
+                if self.can_read_game:
+                    if game_state & (1 << 1) and not self.mission_completed:
+                        if self.mission_id != self.ctx.final_mission:
+                            print("Mission Completed")
+                            await self.ctx.send_msgs(
+                                [{"cmd": 'LocationChecks',
+                                  "locations": [get_location_offset(self.mission_id) + VICTORY_MODULO * self.mission_id]}])
+                            self.mission_completed = True
+                        else:
+                            print("Game Complete")
+                            await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}])
+                            self.mission_completed = True
+
+                    for x, completed in enumerate(self.boni):
+                        if not completed and game_state & (1 << (x + 2)):
+                            await self.ctx.send_msgs(
+                                [{"cmd": 'LocationChecks',
+                                  "locations": [get_location_offset(self.mission_id) + VICTORY_MODULO * self.mission_id + x + 1]}])
+                            self.boni[x] = True
+                else:
+                    await self.chat_send("?SendMessage LostConnection - Lost connection to game.")
+
+    def missions_beaten_count(self):
+        return len([location for location in self.ctx.checked_locations if location % VICTORY_MODULO == 0])
+
+    async def updateColors(self):
+        await self.chat_send("?SetColor rr " + str(self.ctx.player_color_raynor))
+        await self.chat_send("?SetColor ks " + str(self.ctx.player_color_zerg))
+        await self.chat_send("?SetColor pz " + str(self.ctx.player_color_zerg_primal))
+        await self.chat_send("?SetColor da " + str(self.ctx.player_color_protoss))
+        await self.chat_send("?SetColor nova " + str(self.ctx.player_color_nova))
+        self.ctx.pending_color_update = False
+
+    async def updateTerranTech(self, current_items):
+        terran_items = current_items[SC2Race.TERRAN]
+        await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {} {} {} {} {}".format(
+            terran_items[0], terran_items[1], terran_items[2], terran_items[3], terran_items[4],
+            terran_items[5], terran_items[6], terran_items[7], terran_items[8], terran_items[9], terran_items[10],
+            terran_items[11], terran_items[12], terran_items[13]))
+
+    async def updateZergTech(self, current_items, kerrigan_level):
+        zerg_items = current_items[SC2Race.ZERG]
+        kerrigan_primal_by_items = kerrigan_primal(self.ctx, current_items)
+        kerrigan_primal_bot_value = 1 if kerrigan_primal_by_items else 0
+        await self.chat_send("?GiveZergTech {} {} {} {} {} {} {} {} {} {} {} {}".format(
+            kerrigan_level, kerrigan_primal_bot_value, zerg_items[0], zerg_items[1], zerg_items[2],
+            zerg_items[3], zerg_items[4], zerg_items[5], zerg_items[6], zerg_items[9], zerg_items[10], zerg_items[11]
+        ))
+
+    async def updateProtossTech(self, current_items):
+        protoss_items = current_items[SC2Race.PROTOSS]
+        await self.chat_send("?GiveProtossTech {} {} {} {} {} {} {} {} {} {}".format(
+            protoss_items[0], protoss_items[1], protoss_items[2], protoss_items[3], protoss_items[4],
+            protoss_items[5], protoss_items[6], protoss_items[7], protoss_items[8], protoss_items[9]
+        ))
+
+
+def request_unfinished_missions(ctx: SC2Context) -> None:
+    if ctx.mission_req_table:
+        message = "Unfinished Missions: "
+        unlocks = initialize_blank_mission_dict(ctx.mission_req_table)
+        unfinished_locations: typing.Dict[SC2Mission, typing.List[str]] = {}
+
+        _, unfinished_missions = calc_unfinished_missions(ctx, unlocks=unlocks)
+
+        for mission in unfinished_missions:
+            objectives = set(ctx.locations_for_mission(mission))
+            if objectives:
+                remaining_objectives = objectives.difference(ctx.checked_locations)
+                unfinished_locations[mission] = [ctx.location_names[location_id] for location_id in remaining_objectives]
+            else:
+                unfinished_locations[mission] = []
+
+        # Removing All-In from location pool
+        final_mission = lookup_id_to_mission[ctx.final_mission]
+        if final_mission in unfinished_missions.keys():
+            message = f"Final Mission Available: {final_mission}[{ctx.final_mission}]\n" + message
+            if unfinished_missions[final_mission] == -1:
+                unfinished_missions.pop(final_mission)
+
+        message += ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}[{ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id}] " +
+                             mark_up_objectives(
+                                 f"[{len(unfinished_missions[mission])}/"
+                                 f"{sum(1 for _ in ctx.locations_for_mission(mission))}]",
+                                 ctx, unfinished_locations, mission)
+                             for mission in unfinished_missions)
+
+        if ctx.ui:
+            ctx.ui.log_panels['All'].on_message_markup(message)
+            ctx.ui.log_panels['Starcraft2'].on_message_markup(message)
+        else:
+            sc2_logger.info(message)
+    else:
+        sc2_logger.warning("No mission table found, you are likely not connected to a server.")
+
+
+def calc_unfinished_missions(ctx: SC2Context, unlocks: typing.Optional[typing.Dict] = None):
+    unfinished_missions: typing.List[str] = []
+    locations_completed: typing.List[typing.Union[typing.Set[int], typing.Literal[-1]]] = []
+
+    if not unlocks:
+        unlocks = initialize_blank_mission_dict(ctx.mission_req_table)
+
+    available_missions = calc_available_missions(ctx, unlocks)
+
+    for name in available_missions:
+        objectives = set(ctx.locations_for_mission(name))
+        if objectives:
+            objectives_completed = ctx.checked_locations & objectives
+            if len(objectives_completed) < len(objectives):
+                unfinished_missions.append(name)
+                locations_completed.append(objectives_completed)
+
+        else:  # infer that this is the final mission as it has no objectives
+            unfinished_missions.append(name)
+            locations_completed.append(-1)
+
+    return available_missions, dict(zip(unfinished_missions, locations_completed))
+
+
+def is_mission_available(ctx: SC2Context, mission_id_to_check: int) -> bool:
+    unfinished_missions = calc_available_missions(ctx)
+
+    return any(mission_id_to_check == ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id for mission in unfinished_missions)
+
+
+def mark_up_mission_name(ctx: SC2Context, mission_name: str, unlock_table: typing.Dict) -> str:
+    """Checks if the mission is required for game completion and adds '*' to the name to mark that."""
+
+    campaign = ctx.find_campaign(mission_name)
+    mission_info = ctx.mission_req_table[campaign][mission_name]
+    if mission_info.completion_critical:
+        if ctx.ui:
+            message = "[color=AF99EF]" + mission_name + "[/color]"
+        else:
+            message = "*" + mission_name + "*"
+    else:
+        message = mission_name
+
+    if ctx.ui:
+        campaign_missions = list(ctx.mission_req_table[campaign].keys())
+        unlocks: typing.List[str]
+        index = campaign_missions.index(mission_name)
+        if index in unlock_table[campaign]:
+            unlocks = unlock_table[campaign][index]
+        else:
+            unlocks = []
+
+        if len(unlocks) > 0:
+            pre_message = f"[ref={mission_info.mission.id}|Unlocks: "
+            pre_message += ", ".join(f"{unlock}({ctx.mission_req_table[ctx.find_campaign(unlock)][unlock].mission.id})" for unlock in unlocks)
+            pre_message += f"]"
+            message = pre_message + message + "[/ref]"
+
+    return message
+
+
+def mark_up_objectives(message, ctx, unfinished_locations, mission):
+    formatted_message = message
+
+    if ctx.ui:
+        locations = unfinished_locations[mission]
+        campaign = ctx.find_campaign(mission)
+
+        pre_message = f"[ref={list(ctx.mission_req_table[campaign]).index(mission) + 30}|"
+        pre_message += "<br>".join(location for location in locations)
+        pre_message += f"]"
+        formatted_message = pre_message + message + "[/ref]"
+
+    return formatted_message
+
+
+def request_available_missions(ctx: SC2Context):
+    if ctx.mission_req_table:
+        message = "Available Missions: "
+
+        # Initialize mission unlock table
+        unlocks = initialize_blank_mission_dict(ctx.mission_req_table)
+
+        missions = calc_available_missions(ctx, unlocks)
+        message += \
+            ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}"
+                      f"[{ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id}]"
+                      for mission in missions)
+
+        if ctx.ui:
+            ctx.ui.log_panels['All'].on_message_markup(message)
+            ctx.ui.log_panels['Starcraft2'].on_message_markup(message)
+        else:
+            sc2_logger.info(message)
+    else:
+        sc2_logger.warning("No mission table found, you are likely not connected to a server.")
+
+
+def calc_available_missions(ctx: SC2Context, unlocks: typing.Optional[dict] = None) -> typing.List[str]:
+    available_missions: typing.List[str] = []
+    missions_complete = 0
+
+    # Get number of missions completed
+    for loc in ctx.checked_locations:
+        if loc % VICTORY_MODULO == 0:
+            missions_complete += 1
+
+    for campaign in ctx.mission_req_table:
+        # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips
+        for mission_name in ctx.mission_req_table[campaign]:
+            if unlocks:
+                for unlock in ctx.mission_req_table[campaign][mission_name].required_world:
+                    parsed_unlock = parse_unlock(unlock)
+                    # TODO prophecy-only wants to connect to WoL here
+                    index = parsed_unlock.connect_to - 1
+                    unlock_mission = list(ctx.mission_req_table[parsed_unlock.campaign])[index]
+                    unlock_campaign = ctx.find_campaign(unlock_mission)
+                    if unlock_campaign in unlocks:
+                        if index not in unlocks[unlock_campaign]:
+                            unlocks[unlock_campaign][index] = list()
+                        unlocks[unlock_campaign][index].append(mission_name)
+
+            if mission_reqs_completed(ctx, mission_name, missions_complete):
+                available_missions.append(mission_name)
+
+    return available_missions
+
+
+def parse_unlock(unlock: typing.Union[typing.Dict[typing.Literal["connect_to", "campaign"], int], MissionConnection, int]) -> MissionConnection:
+    if isinstance(unlock, int):
+        # Legacy
+        return MissionConnection(unlock)
+    elif isinstance(unlock, MissionConnection):
+        return unlock
+    else:
+        # Multi-campaign
+        return MissionConnection(unlock["connect_to"], lookup_id_to_campaign[unlock["campaign"]])
+
+
+def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int) -> bool:
+    """Returns a bool signifying if the mission has all requirements complete and can be done
+
+    Arguments:
+    ctx -- instance of SC2Context
+    locations_to_check -- the mission string name to check
+    missions_complete -- an int of how many missions have been completed
+    mission_path -- a list of missions that have already been checked
+    """
+    campaign = ctx.find_campaign(mission_name)
+
+    if len(ctx.mission_req_table[campaign][mission_name].required_world) >= 1:
+        # A check for when the requirements are being or'd
+        or_success = False
+
+        # Loop through required missions
+        for req_mission in ctx.mission_req_table[campaign][mission_name].required_world:
+            req_success = True
+            parsed_req_mission = parse_unlock(req_mission)
+
+            # Check if required mission has been completed
+            mission_id = ctx.mission_req_table[parsed_req_mission.campaign][
+                list(ctx.mission_req_table[parsed_req_mission.campaign])[parsed_req_mission.connect_to - 1]].mission.id
+            if not (mission_id * VICTORY_MODULO + get_location_offset(mission_id)) in ctx.checked_locations:
+                if not ctx.mission_req_table[campaign][mission_name].or_requirements:
+                    return False
+                else:
+                    req_success = False
+
+            # Grid-specific logic (to avoid long path checks and infinite recursion)
+            if ctx.mission_order in (MissionOrder.option_grid, MissionOrder.option_mini_grid, MissionOrder.option_medium_grid):
+                if req_success:
+                    return True
+                else:
+                    if parsed_req_mission == ctx.mission_req_table[campaign][mission_name].required_world[-1]:
+                        return False
+                    else:
+                        continue
+
+            # Recursively check required mission to see if it's requirements are met, in case !collect has been done
+            # Skipping recursive check on Grid settings to speed up checks and avoid infinite recursion
+            if not mission_reqs_completed(ctx, list(ctx.mission_req_table[parsed_req_mission.campaign])[parsed_req_mission.connect_to - 1], missions_complete):
+                if not ctx.mission_req_table[campaign][mission_name].or_requirements:
+                    return False
+                else:
+                    req_success = False
+
+            # If requirement check succeeded mark or as satisfied
+            if ctx.mission_req_table[campaign][mission_name].or_requirements and req_success:
+                or_success = True
+
+        if ctx.mission_req_table[campaign][mission_name].or_requirements:
+            # Return false if or requirements not met
+            if not or_success:
+                return False
+
+        # Check number of missions
+        if missions_complete >= ctx.mission_req_table[campaign][mission_name].number:
+            return True
+        else:
+            return False
+    else:
+        return True
+
+
+def initialize_blank_mission_dict(location_table: typing.Dict[SC2Campaign, typing.Dict[str, MissionInfo]]):
+    unlocks: typing.Dict[SC2Campaign, typing.Dict] = {}
+
+    for mission in list(location_table):
+        unlocks[mission] = {}
+
+    return unlocks
+
+
+def check_game_install_path() -> bool:
+    # First thing: go to the default location for ExecuteInfo.
+    # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it.
+    if is_windows:
+        # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow.
+        # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555#
+        import ctypes.wintypes
+        CSIDL_PERSONAL = 5  # My Documents
+        SHGFP_TYPE_CURRENT = 0  # Get current, not default value
+
+        buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)
+        ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf)
+        documentspath: str = buf.value
+        einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt"))
+    else:
+        einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF]))
+
+    # Check if the file exists.
+    if os.path.isfile(einfo):
+
+        # Open the file and read it, picking out the latest executable's path.
+        with open(einfo) as f:
+            content = f.read()
+        if content:
+            search_result = re.search(r" = (.*)Versions", content)
+            if not search_result:
+                sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, "
+                                    "then try again.")
+                return False
+            base = search_result.group(1)
+
+            if os.path.exists(base):
+                executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions")
+
+                # Finally, check the path for an actual executable.
+                # If we find one, great. Set up the SC2PATH.
+                if os.path.isfile(executable):
+                    sc2_logger.info(f"Found an SC2 install at {base}!")
+                    sc2_logger.debug(f"Latest executable at {executable}.")
+                    os.environ["SC2PATH"] = base
+                    sc2_logger.debug(f"SC2PATH set to {base}.")
+                    return True
+                else:
+                    sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.")
+            else:
+                sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.")
+    else:
+        sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. "
+                           f"If that fails, please run /set_path with your SC2 install directory.")
+    return False
+
+
+def is_mod_installed_correctly() -> bool:
+    """Searches for all required files."""
+    if "SC2PATH" not in os.environ:
+        check_game_install_path()
+    sc2_path: str = os.environ["SC2PATH"]
+    mapdir = sc2_path / Path('Maps/ArchipelagoCampaign')
+    mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerSuper", "ArchipelagoPatches",
+            "ArchipelagoTriggers", "ArchipelagoPlayerWoL", "ArchipelagoPlayerHotS",
+            "ArchipelagoPlayerLotV", "ArchipelagoPlayerLotVPrologue", "ArchipelagoPlayerNCO"]
+    modfiles = [sc2_path / Path("Mods/" + mod + ".SC2Mod") for mod in mods]
+    wol_required_maps: typing.List[str] = ["WoL" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission
+                         if mission.campaign in (SC2Campaign.WOL, SC2Campaign.PROPHECY)]
+    hots_required_maps: typing.List[str] = ["HotS" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.HOTS]]
+    lotv_required_maps: typing.List[str] = ["LotV" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission
+                                            if mission.campaign in (SC2Campaign.LOTV, SC2Campaign.PROLOGUE, SC2Campaign.EPILOGUE)]
+    nco_required_maps: typing.List[str] = ["NCO" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.NCO]]
+    required_maps = wol_required_maps + hots_required_maps + lotv_required_maps + nco_required_maps
+    needs_files = False
+
+    # Check for maps.
+    missing_maps: typing.List[str] = []
+    for mapfile in required_maps:
+        if not os.path.isfile(mapdir / mapfile):
+            missing_maps.append(mapfile)
+    if len(missing_maps) >= 19:
+        sc2_logger.warning(f"All map files missing from {mapdir}.")
+        needs_files = True
+    elif len(missing_maps) > 0:
+        for map in missing_maps:
+            sc2_logger.debug(f"Missing {map} from {mapdir}.")
+        sc2_logger.warning(f"Missing {len(missing_maps)} map files.")
+        needs_files = True
+    else:  # Must be no maps missing
+        sc2_logger.info(f"All maps found in {mapdir}.")
+
+    # Check for mods.
+    for modfile in modfiles:
+        if os.path.isfile(modfile) or os.path.isdir(modfile):
+            sc2_logger.info(f"Archipelago mod found at {modfile}.")
+        else:
+            sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.")
+            needs_files = True
+
+    # Final verdict.
+    if needs_files:
+        sc2_logger.warning(f"Required files are missing. Run /download_data to acquire them.")
+        return False
+    else:
+        sc2_logger.debug(f"All map/mod files are properly installed.")
+        return True
+
+
+class DllDirectory:
+    # Credit to Black Sliver for this code.
+    # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw
+    _old: typing.Optional[str] = None
+    _new: typing.Optional[str] = None
+
+    def __init__(self, new: typing.Optional[str]):
+        self._new = new
+
+    def __enter__(self):
+        old = self.get()
+        if self.set(self._new):
+            self._old = old
+
+    def __exit__(self, *args):
+        if self._old is not None:
+            self.set(self._old)
+
+    @staticmethod
+    def get() -> typing.Optional[str]:
+        if sys.platform == "win32":
+            n = ctypes.windll.kernel32.GetDllDirectoryW(0, None)
+            buf = ctypes.create_unicode_buffer(n)
+            ctypes.windll.kernel32.GetDllDirectoryW(n, buf)
+            return buf.value
+        # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific
+        return None
+
+    @staticmethod
+    def set(s: typing.Optional[str]) -> bool:
+        if sys.platform == "win32":
+            return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0
+        # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific
+        return False
+
+
+def download_latest_release_zip(
+    owner: str,
+    repo: str,
+    api_version: str,
+    metadata: typing.Optional[str] = None,
+    force_download=False
+) -> typing.Tuple[str, typing.Optional[str]]:
+    """Downloads the latest release of a GitHub repo to the current directory as a .zip file."""
+    import requests
+
+    headers = {"Accept": 'application/vnd.github.v3+json'}
+    url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}"
+
+    r1 = requests.get(url, headers=headers)
+    if r1.status_code == 200:
+        latest_metadata = r1.json()
+        cleanup_downloaded_metadata(latest_metadata)
+        latest_metadata = str(latest_metadata)
+        # sc2_logger.info(f"Latest version: {latest_metadata}.")
+    else:
+        sc2_logger.warning(f"Status code: {r1.status_code}")
+        sc2_logger.warning(f"Failed to reach GitHub. Could not find download link.")
+        sc2_logger.warning(f"text: {r1.text}")
+        return "", metadata
+
+    if (force_download is False) and (metadata == latest_metadata):
+        sc2_logger.info("Latest version already installed.")
+        return "", metadata
+
+    sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.")
+    download_url = r1.json()["assets"][0]["browser_download_url"]
+
+    r2 = requests.get(download_url, headers=headers)
+    if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)):
+        tempdir = tempfile.gettempdir()
+        file = tempdir + os.sep + f"{repo}.zip"
+        with open(file, "wb") as fh:
+            fh.write(r2.content)
+        sc2_logger.info(f"Successfully downloaded {repo}.zip.")
+        return file, latest_metadata
+    else:
+        sc2_logger.warning(f"Status code: {r2.status_code}")
+        sc2_logger.warning("Download failed.")
+        sc2_logger.warning(f"text: {r2.text}")
+        return "", metadata
+
+
+def cleanup_downloaded_metadata(medatada_json: dict) -> None:
+    for asset in medatada_json['assets']:
+        del asset['download_count']
+
+
+def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool:
+    import requests
+
+    headers = {"Accept": 'application/vnd.github.v3+json'}
+    url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}"
+
+    r1 = requests.get(url, headers=headers)
+    if r1.status_code == 200:
+        latest_metadata = r1.json()
+        cleanup_downloaded_metadata(latest_metadata)
+        latest_metadata = str(latest_metadata)
+        if metadata != latest_metadata:
+            return True
+        else:
+            return False
+
+    else:
+        sc2_logger.warning(f"Failed to reach GitHub while checking for updates.")
+        sc2_logger.warning(f"Status code: {r1.status_code}")
+        sc2_logger.warning(f"text: {r1.text}")
+        return False
+
+
+def get_location_offset(mission_id):
+    return SC2WOL_LOC_ID_OFFSET if mission_id <= SC2Mission.ALL_IN.id \
+        else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO)
+
+
+def launch():
+    colorama.init()
+    asyncio.run(main())
+    colorama.deinit()
diff --git a/worlds/sc2/ClientGui.py b/worlds/sc2/ClientGui.py
new file mode 100644
index 00000000..167583fd
--- /dev/null
+++ b/worlds/sc2/ClientGui.py
@@ -0,0 +1,304 @@
+from typing import *
+import asyncio
+
+from kvui import GameManager, HoverBehavior, ServerToolTip
+from kivy.app import App
+from kivy.clock import Clock
+from kivy.uix.tabbedpanel import TabbedPanelItem
+from kivy.uix.gridlayout import GridLayout
+from kivy.lang import Builder
+from kivy.uix.label import Label
+from kivy.uix.button import Button
+from kivy.uix.floatlayout import FloatLayout
+from kivy.uix.scrollview import ScrollView
+from kivy.properties import StringProperty
+
+from worlds.sc2.Client import SC2Context, calc_unfinished_missions, parse_unlock
+from worlds.sc2.MissionTables import lookup_id_to_mission, lookup_name_to_mission, campaign_race_exceptions, \
+    SC2Mission, SC2Race, SC2Campaign
+from worlds.sc2.Locations import LocationType, lookup_location_id_to_type
+from worlds.sc2.Options import LocationInclusion
+from worlds.sc2 import SC2World, get_first_mission
+
+
+class HoverableButton(HoverBehavior, Button):
+    pass
+
+
+class MissionButton(HoverableButton):
+    tooltip_text = StringProperty("Test")
+
+    def __init__(self, *args, **kwargs):
+        super(HoverableButton, self).__init__(*args, **kwargs)
+        self.layout = FloatLayout()
+        self.popuplabel = ServerToolTip(text=self.text, markup=True)
+        self.popuplabel.padding = [5, 2, 5, 2]
+        self.layout.add_widget(self.popuplabel)
+
+    def on_enter(self):
+        self.popuplabel.text = self.tooltip_text
+
+        if self.ctx.current_tooltip:
+            App.get_running_app().root.remove_widget(self.ctx.current_tooltip)
+
+        if self.tooltip_text == "":
+            self.ctx.current_tooltip = None
+        else:
+            App.get_running_app().root.add_widget(self.layout)
+            self.ctx.current_tooltip = self.layout
+
+    def on_leave(self):
+        self.ctx.ui.clear_tooltip()
+
+    @property
+    def ctx(self) -> SC2Context:
+        return App.get_running_app().ctx
+
+class CampaignScroll(ScrollView):
+    pass
+
+class MultiCampaignLayout(GridLayout):
+    pass
+
+class CampaignLayout(GridLayout):
+    pass
+
+class MissionLayout(GridLayout):
+    pass
+
+class MissionCategory(GridLayout):
+    pass
+
+class SC2Manager(GameManager):
+    logging_pairs = [
+        ("Client", "Archipelago"),
+        ("Starcraft2", "Starcraft2"),
+    ]
+    base_title = "Archipelago Starcraft 2 Client"
+
+    campaign_panel: Optional[CampaignLayout] = None
+    last_checked_locations: Set[int] = set()
+    mission_id_to_button: Dict[int, MissionButton] = {}
+    launching: Union[bool, int] = False  # if int -> mission ID
+    refresh_from_launching = True
+    first_check = True
+    first_mission = ""
+    ctx: SC2Context
+
+    def __init__(self, ctx) -> None:
+        super().__init__(ctx)
+
+    def clear_tooltip(self) -> None:
+        if self.ctx.current_tooltip:
+            App.get_running_app().root.remove_widget(self.ctx.current_tooltip)
+
+        self.ctx.current_tooltip = None
+
+    def build(self):
+        container = super().build()
+
+        panel = TabbedPanelItem(text="Starcraft 2 Launcher")
+        panel.content = CampaignScroll()
+        self.campaign_panel = MultiCampaignLayout()
+        panel.content.add_widget(self.campaign_panel)
+
+        self.tabs.add_widget(panel)
+
+        Clock.schedule_interval(self.build_mission_table, 0.5)
+
+        return container
+
+    def build_mission_table(self, dt) -> None:
+        if (not self.launching and (not self.last_checked_locations == self.ctx.checked_locations or
+                                    not self.refresh_from_launching)) or self.first_check:
+            assert self.campaign_panel is not None
+            self.refresh_from_launching = True
+
+            self.campaign_panel.clear_widgets()
+            if self.ctx.mission_req_table:
+                self.last_checked_locations = self.ctx.checked_locations.copy()
+                self.first_check = False
+                self.first_mission = get_first_mission(self.ctx.mission_req_table)
+
+                self.mission_id_to_button = {}
+
+                available_missions, unfinished_missions = calc_unfinished_missions(self.ctx)
+
+                multi_campaign_layout_height = 0
+
+                for campaign, missions in sorted(self.ctx.mission_req_table.items(), key=lambda item: item[0].id):
+                    categories: Dict[str, List[str]] = {}
+
+                    # separate missions into categories
+                    for mission_index in missions:
+                        mission_info = self.ctx.mission_req_table[campaign][mission_index]
+                        if mission_info.category not in categories:
+                            categories[mission_info.category] = []
+
+                        categories[mission_info.category].append(mission_index)
+
+                    max_mission_count = max(len(categories[category]) for category in categories)
+                    if max_mission_count == 1:
+                        campaign_layout_height = 115
+                    else:
+                        campaign_layout_height = (max_mission_count + 2) * 50
+                    multi_campaign_layout_height += campaign_layout_height
+                    campaign_layout = CampaignLayout(size_hint_y=None, height=campaign_layout_height)
+                    if campaign != SC2Campaign.GLOBAL:
+                        campaign_layout.add_widget(
+                            Label(text=campaign.campaign_name, size_hint_y=None, height=25, outline_width=1)
+                        )
+                    mission_layout = MissionLayout()
+
+                    for category in categories:
+                        category_name_height = 0
+                        category_spacing = 3
+                        if category.startswith('_'):
+                            category_display_name = ''
+                        else:
+                            category_display_name = category
+                            category_name_height += 25
+                            category_spacing = 10
+                        category_panel = MissionCategory(padding=[category_spacing,6,category_spacing,6])
+                        category_panel.add_widget(
+                            Label(text=category_display_name, size_hint_y=None, height=category_name_height, outline_width=1))
+
+                        for mission in categories[category]:
+                            text: str = mission
+                            tooltip: str = ""
+                            mission_obj: SC2Mission = lookup_name_to_mission[mission]
+                            mission_id: int = mission_obj.id
+                            mission_data = self.ctx.mission_req_table[campaign][mission]
+                            remaining_locations, plando_locations, remaining_count = self.sort_unfinished_locations(mission)
+                            # Map has uncollected locations
+                            if mission in unfinished_missions:
+                                if self.any_valuable_locations(remaining_locations):
+                                    text = f"[color=6495ED]{text}[/color]"
+                                else:
+                                    text = f"[color=A0BEF4]{text}[/color]"
+                            elif mission in available_missions:
+                                text = f"[color=FFFFFF]{text}[/color]"
+                            # Map requirements not met
+                            else:
+                                text = f"[color=a9a9a9]{text}[/color]"
+                                tooltip = f"Requires: "
+                                if mission_data.required_world:
+                                    tooltip += ", ".join(list(self.ctx.mission_req_table[parse_unlock(req_mission).campaign])[parse_unlock(req_mission).connect_to - 1] for
+                                                            req_mission in
+                                                            mission_data.required_world)
+
+                                    if mission_data.number:
+                                        tooltip += " and "
+                                if mission_data.number:
+                                    tooltip += f"{self.ctx.mission_req_table[campaign][mission].number} missions completed"
+
+                            if mission_id == self.ctx.final_mission:
+                                if mission in available_missions:
+                                    text = f"[color=FFBC95]{mission}[/color]"
+                                else:
+                                    text = f"[color=D0C0BE]{mission}[/color]"
+                                if tooltip:
+                                    tooltip += "\n"
+                                tooltip += "Final Mission"
+
+                            if remaining_count > 0:
+                                if tooltip:
+                                    tooltip += "\n\n"
+                                tooltip += f"-- Uncollected locations --"
+                                for loctype in LocationType:
+                                    if len(remaining_locations[loctype]) > 0:
+                                        if loctype == LocationType.VICTORY:
+                                            tooltip += f"\n- {remaining_locations[loctype][0]}"
+                                        else:
+                                            tooltip += f"\n{self.get_location_type_title(loctype)}:\n- "
+                                            tooltip += "\n- ".join(remaining_locations[loctype])
+                                if len(plando_locations) > 0:
+                                    tooltip += f"\nPlando:\n- "
+                                    tooltip += "\n- ".join(plando_locations)
+                            
+                            MISSION_BUTTON_HEIGHT = 50
+                            for pad in range(mission_data.ui_vertical_padding):
+                                column_spacer = Label(text='', size_hint_y=None, height=MISSION_BUTTON_HEIGHT)
+                                category_panel.add_widget(column_spacer)
+                            mission_button = MissionButton(text=text, size_hint_y=None, height=MISSION_BUTTON_HEIGHT)
+                            mission_race = mission_obj.race
+                            if mission_race == SC2Race.ANY:
+                                mission_race = mission_obj.campaign.race
+                            race = campaign_race_exceptions.get(mission_obj, mission_race)
+                            racial_colors = {
+                                SC2Race.TERRAN: (0.24, 0.84, 0.68),
+                                SC2Race.ZERG: (1, 0.65, 0.37),
+                                SC2Race.PROTOSS: (0.55, 0.7, 1)
+                            }
+                            if race in racial_colors:
+                                mission_button.background_color = racial_colors[race]
+                            mission_button.tooltip_text = tooltip
+                            mission_button.bind(on_press=self.mission_callback)
+                            self.mission_id_to_button[mission_id] = mission_button
+                            category_panel.add_widget(mission_button)
+
+                        category_panel.add_widget(Label(text=""))
+                        mission_layout.add_widget(category_panel)
+                    campaign_layout.add_widget(mission_layout)
+                    self.campaign_panel.add_widget(campaign_layout)
+                self.campaign_panel.height = multi_campaign_layout_height
+
+        elif self.launching:
+            assert self.campaign_panel is not None
+            self.refresh_from_launching = False
+
+            self.campaign_panel.clear_widgets()
+            self.campaign_panel.add_widget(Label(text="Launching Mission: " +
+                                                        lookup_id_to_mission[self.launching].mission_name))
+            if self.ctx.ui:
+                self.ctx.ui.clear_tooltip()
+
+    def mission_callback(self, button: MissionButton) -> None:
+        if not self.launching:
+            mission_id: int = next(k for k, v in self.mission_id_to_button.items() if v == button)
+            if self.ctx.play_mission(mission_id):
+                self.launching = mission_id
+                Clock.schedule_once(self.finish_launching, 10)
+
+    def finish_launching(self, dt):
+        self.launching = False
+    
+    def sort_unfinished_locations(self, mission_name: str) -> Tuple[Dict[LocationType, List[str]], List[str], int]:
+        locations: Dict[LocationType, List[str]] = {loctype: [] for loctype in LocationType}
+        count = 0
+        for loc in self.ctx.locations_for_mission(mission_name):
+            if loc in self.ctx.missing_locations:
+                count += 1
+                locations[lookup_location_id_to_type[loc]].append(self.ctx.location_names[loc])
+
+        plando_locations = []
+        for plando_loc in self.ctx.plando_locations:
+            for loctype in LocationType:
+                if plando_loc in locations[loctype]:
+                    locations[loctype].remove(plando_loc)
+                    plando_locations.append(plando_loc)
+
+        return locations, plando_locations, count
+
+    def any_valuable_locations(self, locations: Dict[LocationType, List[str]]) -> bool:
+        for loctype in LocationType:
+            if len(locations[loctype]) > 0 and self.ctx.location_inclusions[loctype] == LocationInclusion.option_enabled:
+                return True
+        return False
+
+    def get_location_type_title(self, location_type: LocationType) -> str:
+        title = location_type.name.title().replace("_", " ")
+        if self.ctx.location_inclusions[location_type] == LocationInclusion.option_disabled:
+            title += " (Nothing)"
+        elif self.ctx.location_inclusions[location_type] == LocationInclusion.option_resources:
+            title += " (Resources)"
+        else:
+            title += ""
+        return title
+
+def start_gui(context: SC2Context):
+    context.ui = SC2Manager(context)
+    context.ui_task = asyncio.create_task(context.ui.async_run(), name="UI")
+    import pkgutil
+    data = pkgutil.get_data(SC2World.__module__, "Starcraft2.kv").decode()
+    Builder.load_string(data)
diff --git a/worlds/sc2/ItemGroups.py b/worlds/sc2/ItemGroups.py
new file mode 100644
index 00000000..a77fb920
--- /dev/null
+++ b/worlds/sc2/ItemGroups.py
@@ -0,0 +1,100 @@
+import typing
+from . import Items, ItemNames
+from .MissionTables import campaign_mission_table, SC2Campaign, SC2Mission
+
+"""
+Item name groups, given to Archipelago and used in YAMLs and /received filtering.
+For non-developers the following will be useful:
+* Items with a bracket get groups named after the unbracketed part
+  * eg. "Advanced Healing AI (Medivac)" is accessible as "Advanced Healing AI"
+  * The exception to this are item names that would be ambiguous (eg. "Resource Efficiency")
+* Item flaggroups get unique groups as well as combined groups for numbered flaggroups
+  * eg. "Unit" contains all units, "Armory" contains "Armory 1" through "Armory 6"
+  * The best place to look these up is at the bottom of Items.py
+* Items that have a parent are grouped together
+  * eg. "Zergling Items" contains all items that have "Zergling" as a parent
+  * These groups do NOT contain the parent item
+  * This currently does not include items with multiple potential parents, like some LotV unit upgrades
+* All items are grouped by their race ("Terran", "Protoss", "Zerg", "Any")
+* Hand-crafted item groups can be found at the bottom of this file
+"""
+
+item_name_groups: typing.Dict[str, typing.List[str]] = {}
+
+# Groups for use in world logic
+item_name_groups["Missions"] = ["Beat " + mission.mission_name for mission in SC2Mission]
+item_name_groups["WoL Missions"] = ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.WOL]] + \
+                                   ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.PROPHECY]]
+
+# These item name groups should not show up in documentation
+unlisted_item_name_groups = {
+    "Missions", "WoL Missions"
+}
+
+# Some item names only differ in bracketed parts
+# These items are ambiguous for short-hand name groups
+bracketless_duplicates: typing.Set[str]
+# This is a list of names in ItemNames with bracketed parts removed, for internal use
+_shortened_names = [(name[:name.find(' (')] if '(' in name else name)
+      for name in [ItemNames.__dict__[name] for name in ItemNames.__dir__() if not name.startswith('_')]]
+# Remove the first instance of every short-name from the full item list
+bracketless_duplicates = set(_shortened_names)
+for name in bracketless_duplicates:
+    _shortened_names.remove(name)
+# The remaining short-names are the duplicates
+bracketless_duplicates = set(_shortened_names)
+del _shortened_names
+
+# All items get sorted into their data type
+for item, data in Items.get_full_item_list().items():
+    # Items get assigned to their flaggroup's type
+    item_name_groups.setdefault(data.type, []).append(item)
+    # Numbered flaggroups get sorted into an unnumbered group
+    # Currently supports numbers of one or two digits
+    if data.type[-2:].strip().isnumeric:
+        type_group = data.type[:-2].strip()
+        item_name_groups.setdefault(type_group, []).append(item)
+        # Flaggroups with numbers are unlisted
+        unlisted_item_name_groups.add(data.type)
+    # Items with a bracket get a short-hand name group for ease of use in YAMLs
+    if '(' in item:
+        short_name = item[:item.find(' (')]
+        # Ambiguous short-names are dropped
+        if short_name not in bracketless_duplicates:
+            item_name_groups[short_name] = [item]
+            # Short-name groups are unlisted
+            unlisted_item_name_groups.add(short_name)
+    # Items with a parent get assigned to their parent's group
+    if data.parent_item:
+        # The parent groups need a special name, otherwise they are ambiguous with the parent
+        parent_group = f"{data.parent_item} Items"
+        item_name_groups.setdefault(parent_group, []).append(item)
+        # Parent groups are unlisted
+        unlisted_item_name_groups.add(parent_group)
+    # All items get assigned to their race's group
+    race_group = data.race.name.capitalize()
+    item_name_groups.setdefault(race_group, []).append(item)
+
+
+# Hand-made groups
+item_name_groups["Aiur"] = [
+    ItemNames.ZEALOT, ItemNames.DRAGOON, ItemNames.SENTRY, ItemNames.AVENGER, ItemNames.HIGH_TEMPLAR,
+    ItemNames.IMMORTAL, ItemNames.REAVER,
+    ItemNames.PHOENIX, ItemNames.SCOUT, ItemNames.ARBITER, ItemNames.CARRIER,
+]
+item_name_groups["Nerazim"] = [
+    ItemNames.CENTURION, ItemNames.STALKER, ItemNames.DARK_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.DARK_ARCHON,
+    ItemNames.ANNIHILATOR,
+    ItemNames.CORSAIR, ItemNames.ORACLE, ItemNames.VOID_RAY,
+]
+item_name_groups["Tal'Darim"] = [
+    ItemNames.SUPPLICANT, ItemNames.SLAYER, ItemNames.HAVOC, ItemNames.BLOOD_HUNTER, ItemNames.ASCENDANT,
+    ItemNames.VANGUARD, ItemNames.WRATHWALKER,
+    ItemNames.DESTROYER, ItemNames.MOTHERSHIP,
+    ItemNames.WARP_PRISM_PHASE_BLASTER,
+]
+item_name_groups["Purifier"] = [
+    ItemNames.SENTINEL, ItemNames.ADEPT, ItemNames.INSTIGATOR, ItemNames.ENERGIZER,
+    ItemNames.COLOSSUS, ItemNames.DISRUPTOR,
+    ItemNames.MIRAGE, ItemNames.TEMPEST,
+]
\ No newline at end of file
diff --git a/worlds/sc2/ItemNames.py b/worlds/sc2/ItemNames.py
new file mode 100644
index 00000000..10c71391
--- /dev/null
+++ b/worlds/sc2/ItemNames.py
@@ -0,0 +1,661 @@
+"""
+A complete collection of Starcraft 2 item names as strings.
+Users of this data may make some assumptions about the structure of a name:
+* The upgrade for a unit will end with the unit's name in parentheses
+* Weapon / armor upgrades may be grouped by a common prefix specified within this file
+"""
+
+# Terran Units
+MARINE         = "Marine"
+MEDIC          = "Medic"
+FIREBAT        = "Firebat"
+MARAUDER       = "Marauder"
+REAPER         = "Reaper"
+HELLION        = "Hellion"
+VULTURE        = "Vulture"
+GOLIATH        = "Goliath"
+DIAMONDBACK    = "Diamondback"
+SIEGE_TANK     = "Siege Tank"
+MEDIVAC        = "Medivac"
+WRAITH         = "Wraith"
+VIKING         = "Viking"
+BANSHEE        = "Banshee"
+BATTLECRUISER  = "Battlecruiser"
+GHOST          = "Ghost"
+SPECTRE        = "Spectre"
+THOR           = "Thor"
+RAVEN          = "Raven"
+SCIENCE_VESSEL = "Science Vessel"
+PREDATOR       = "Predator"
+HERCULES       = "Hercules"
+# Extended units
+LIBERATOR      = "Liberator"
+VALKYRIE       = "Valkyrie"
+WIDOW_MINE     = "Widow Mine"
+CYCLONE        = "Cyclone"
+HERC           = "HERC"
+WARHOUND       = "Warhound"
+
+# Terran Buildings
+BUNKER                              = "Bunker"
+MISSILE_TURRET                      = "Missile Turret"
+SENSOR_TOWER                        = "Sensor Tower"
+PLANETARY_FORTRESS                  = "Planetary Fortress"
+PERDITION_TURRET                    = "Perdition Turret"
+HIVE_MIND_EMULATOR                  = "Hive Mind Emulator"
+PSI_DISRUPTER                       = "Psi Disrupter"
+
+# Terran Weapon / Armor Upgrades
+TERRAN_UPGRADE_PREFIX = "Progressive Terran"
+TERRAN_INFANTRY_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Infantry"
+TERRAN_VEHICLE_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Vehicle"
+TERRAN_SHIP_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Ship"
+
+PROGRESSIVE_TERRAN_INFANTRY_WEAPON      = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Weapon"
+PROGRESSIVE_TERRAN_INFANTRY_ARMOR       = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Armor"
+PROGRESSIVE_TERRAN_VEHICLE_WEAPON       = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Weapon"
+PROGRESSIVE_TERRAN_VEHICLE_ARMOR        = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Armor"
+PROGRESSIVE_TERRAN_SHIP_WEAPON          = f"{TERRAN_SHIP_UPGRADE_PREFIX} Weapon"
+PROGRESSIVE_TERRAN_SHIP_ARMOR           = f"{TERRAN_SHIP_UPGRADE_PREFIX} Armor"
+PROGRESSIVE_TERRAN_WEAPON_UPGRADE       = f"{TERRAN_UPGRADE_PREFIX} Weapon Upgrade"
+PROGRESSIVE_TERRAN_ARMOR_UPGRADE        = f"{TERRAN_UPGRADE_PREFIX} Armor Upgrade"
+PROGRESSIVE_TERRAN_INFANTRY_UPGRADE     = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Upgrade"
+PROGRESSIVE_TERRAN_VEHICLE_UPGRADE      = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Upgrade"
+PROGRESSIVE_TERRAN_SHIP_UPGRADE         = f"{TERRAN_SHIP_UPGRADE_PREFIX} Upgrade"
+PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon/Armor Upgrade"
+
+# Mercenaries
+WAR_PIGS          = "War Pigs"
+DEVIL_DOGS        = "Devil Dogs"
+HAMMER_SECURITIES = "Hammer Securities"
+SPARTAN_COMPANY   = "Spartan Company"
+SIEGE_BREAKERS    = "Siege Breakers"
+HELS_ANGELS       = "Hel's Angels"
+DUSK_WINGS        = "Dusk Wings"
+JACKSONS_REVENGE  = "Jackson's Revenge"
+SKIBIS_ANGELS     = "Skibi's Angels"
+DEATH_HEADS       = "Death Heads"
+WINGED_NIGHTMARES = "Winged Nightmares"
+MIDNIGHT_RIDERS   = "Midnight Riders"
+BRYNHILDS         = "Brynhilds"
+JOTUN             = "Jotun"
+
+# Lab / Global
+ULTRA_CAPACITORS                    = "Ultra-Capacitors"
+VANADIUM_PLATING                    = "Vanadium Plating"
+ORBITAL_DEPOTS                      = "Orbital Depots"
+MICRO_FILTERING                     = "Micro-Filtering"
+AUTOMATED_REFINERY                  = "Automated Refinery"
+COMMAND_CENTER_REACTOR              = "Command Center Reactor"
+TECH_REACTOR                        = "Tech Reactor"
+ORBITAL_STRIKE                      = "Orbital Strike"
+CELLULAR_REACTOR                    = "Cellular Reactor"
+PROGRESSIVE_REGENERATIVE_BIO_STEEL  = "Progressive Regenerative Bio-Steel"
+PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM = "Progressive Fire-Suppression System"
+PROGRESSIVE_ORBITAL_COMMAND         = "Progressive Orbital Command"
+STRUCTURE_ARMOR                     = "Structure Armor"
+HI_SEC_AUTO_TRACKING                = "Hi-Sec Auto Tracking"
+ADVANCED_OPTICS                     = "Advanced Optics"
+ROGUE_FORCES                        = "Rogue Forces"
+
+# Terran Unit Upgrades
+BANSHEE_HYPERFLIGHT_ROTORS                         = "Hyperflight Rotors (Banshee)"
+BANSHEE_INTERNAL_TECH_MODULE                       = "Internal Tech Module (Banshee)"
+BANSHEE_LASER_TARGETING_SYSTEM                     = "Laser Targeting System (Banshee)"
+BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS       = "Progressive Cross-Spectrum Dampeners (Banshee)"
+BANSHEE_SHOCKWAVE_MISSILE_BATTERY                  = "Shockwave Missile Battery (Banshee)"
+BANSHEE_SHAPED_HULL                                = "Shaped Hull (Banshee)"
+BANSHEE_ADVANCED_TARGETING_OPTICS                  = "Advanced Targeting Optics (Banshee)"
+BANSHEE_DISTORTION_BLASTERS                        = "Distortion Blasters (Banshee)"
+BANSHEE_ROCKET_BARRAGE                             = "Rocket Barrage (Banshee)"
+BATTLECRUISER_ATX_LASER_BATTERY                    = "ATX Laser Battery (Battlecruiser)"
+BATTLECRUISER_CLOAK                                = "Cloak (Battlecruiser)"
+BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX         = "Progressive Defensive Matrix (Battlecruiser)"
+BATTLECRUISER_INTERNAL_TECH_MODULE                 = "Internal Tech Module (Battlecruiser)"
+BATTLECRUISER_PROGRESSIVE_MISSILE_PODS             = "Progressive Missile Pods (Battlecruiser)"
+BATTLECRUISER_OPTIMIZED_LOGISTICS                  = "Optimized Logistics (Battlecruiser)"
+BATTLECRUISER_TACTICAL_JUMP                        = "Tactical Jump (Battlecruiser)"
+BATTLECRUISER_BEHEMOTH_PLATING                     = "Behemoth Plating (Battlecruiser)"
+BATTLECRUISER_COVERT_OPS_ENGINES                   = "Covert Ops Engines (Battlecruiser)"
+BUNKER_NEOSTEEL_BUNKER                             = "Neosteel Bunker (Bunker)"
+BUNKER_PROJECTILE_ACCELERATOR                      = "Projectile Accelerator (Bunker)"
+BUNKER_SHRIKE_TURRET                               = "Shrike Turret (Bunker)"
+BUNKER_FORTIFIED_BUNKER                            = "Fortified Bunker (Bunker)"
+CYCLONE_MAG_FIELD_ACCELERATORS                     = "Mag-Field Accelerators (Cyclone)"
+CYCLONE_MAG_FIELD_LAUNCHERS                        = "Mag-Field Launchers (Cyclone)"
+CYCLONE_RAPID_FIRE_LAUNCHERS                       = "Rapid Fire Launchers (Cyclone)"
+CYCLONE_TARGETING_OPTICS                           = "Targeting Optics (Cyclone)"
+CYCLONE_RESOURCE_EFFICIENCY                        = "Resource Efficiency (Cyclone)"
+CYCLONE_INTERNAL_TECH_MODULE                       = "Internal Tech Module (Cyclone)"
+DIAMONDBACK_BURST_CAPACITORS                       = "Burst Capacitors (Diamondback)"
+DIAMONDBACK_HYPERFLUXOR                            = "Hyperfluxor (Diamondback)"
+DIAMONDBACK_RESOURCE_EFFICIENCY                    = "Resource Efficiency (Diamondback)"
+DIAMONDBACK_SHAPED_HULL                            = "Shaped Hull (Diamondback)"
+DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL     = "Progressive Tri-Lithium Power Cell (Diamondback)"
+DIAMONDBACK_ION_THRUSTERS                          = "Ion Thrusters (Diamondback)"
+FIREBAT_INCINERATOR_GAUNTLETS                      = "Incinerator Gauntlets (Firebat)"
+FIREBAT_JUGGERNAUT_PLATING                         = "Juggernaut Plating (Firebat)"
+FIREBAT_RESOURCE_EFFICIENCY                        = "Resource Efficiency (Firebat)"
+FIREBAT_PROGRESSIVE_STIMPACK                       = "Progressive Stimpack (Firebat)"
+FIREBAT_INFERNAL_PRE_IGNITER                       = "Infernal Pre-Igniter (Firebat)"
+FIREBAT_KINETIC_FOAM                               = "Kinetic Foam (Firebat)"
+FIREBAT_NANO_PROJECTORS                            = "Nano Projectors (Firebat)"
+GHOST_CRIUS_SUIT                                   = "Crius Suit (Ghost)"
+GHOST_EMP_ROUNDS                                   = "EMP Rounds (Ghost)"
+GHOST_LOCKDOWN                                     = "Lockdown (Ghost)"
+GHOST_OCULAR_IMPLANTS                              = "Ocular Implants (Ghost)"
+GHOST_RESOURCE_EFFICIENCY                          = "Resource Efficiency (Ghost)"
+GOLIATH_ARES_CLASS_TARGETING_SYSTEM                = "Ares-Class Targeting System (Goliath)"
+GOLIATH_JUMP_JETS                                  = "Jump Jets (Goliath)"
+GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM                  = "Multi-Lock Weapons System (Goliath)"
+GOLIATH_OPTIMIZED_LOGISTICS                        = "Optimized Logistics (Goliath)"
+GOLIATH_SHAPED_HULL                                = "Shaped Hull (Goliath)"
+GOLIATH_RESOURCE_EFFICIENCY                        = "Resource Efficiency (Goliath)"
+GOLIATH_INTERNAL_TECH_MODULE                       = "Internal Tech Module (Goliath)"
+HELLION_HELLBAT_ASPECT                             = "Hellbat Aspect (Hellion)"
+HELLION_JUMP_JETS                                  = "Jump Jets (Hellion)"
+HELLION_OPTIMIZED_LOGISTICS                        = "Optimized Logistics (Hellion)"
+HELLION_PROGRESSIVE_STIMPACK                       = "Progressive Stimpack (Hellion)"
+HELLION_SMART_SERVOS                               = "Smart Servos (Hellion)"
+HELLION_THERMITE_FILAMENTS                         = "Thermite Filaments (Hellion)"
+HELLION_TWIN_LINKED_FLAMETHROWER                   = "Twin-Linked Flamethrower (Hellion)"
+HELLION_INFERNAL_PLATING                           = "Infernal Plating (Hellion)"
+HERC_JUGGERNAUT_PLATING                            = "Juggernaut Plating (HERC)"
+HERC_KINETIC_FOAM                                  = "Kinetic Foam (HERC)"
+HERC_RESOURCE_EFFICIENCY                           = "Resource Efficiency (HERC)"
+HERCULES_INTERNAL_FUSION_MODULE                    = "Internal Fusion Module (Hercules)"
+HERCULES_TACTICAL_JUMP                             = "Tactical Jump (Hercules)"
+LIBERATOR_ADVANCED_BALLISTICS                      = "Advanced Ballistics (Liberator)"
+LIBERATOR_CLOAK                                    = "Cloak (Liberator)"
+LIBERATOR_LASER_TARGETING_SYSTEM                   = "Laser Targeting System (Liberator)"
+LIBERATOR_OPTIMIZED_LOGISTICS                      = "Optimized Logistics (Liberator)"
+LIBERATOR_RAID_ARTILLERY                           = "Raid Artillery (Liberator)"
+LIBERATOR_SMART_SERVOS                             = "Smart Servos (Liberator)"
+LIBERATOR_RESOURCE_EFFICIENCY                      = "Resource Efficiency (Liberator)"
+MARAUDER_CONCUSSIVE_SHELLS                         = "Concussive Shells (Marauder)"
+MARAUDER_INTERNAL_TECH_MODULE                      = "Internal Tech Module (Marauder)"
+MARAUDER_KINETIC_FOAM                              = "Kinetic Foam (Marauder)"
+MARAUDER_LASER_TARGETING_SYSTEM                    = "Laser Targeting System (Marauder)"
+MARAUDER_MAGRAIL_MUNITIONS                         = "Magrail Munitions (Marauder)"
+MARAUDER_PROGRESSIVE_STIMPACK                      = "Progressive Stimpack (Marauder)"
+MARAUDER_JUGGERNAUT_PLATING                        = "Juggernaut Plating (Marauder)"
+MARINE_COMBAT_SHIELD                               = "Combat Shield (Marine)"
+MARINE_LASER_TARGETING_SYSTEM                      = "Laser Targeting System (Marine)"
+MARINE_MAGRAIL_MUNITIONS                           = "Magrail Munitions (Marine)"
+MARINE_OPTIMIZED_LOGISTICS                         = "Optimized Logistics (Marine)"
+MARINE_PROGRESSIVE_STIMPACK                        = "Progressive Stimpack (Marine)"
+MEDIC_ADVANCED_MEDIC_FACILITIES                    = "Advanced Medic Facilities (Medic)"
+MEDIC_OPTICAL_FLARE                                = "Optical Flare (Medic)"
+MEDIC_RESOURCE_EFFICIENCY                          = "Resource Efficiency (Medic)"
+MEDIC_RESTORATION                                  = "Restoration (Medic)"
+MEDIC_STABILIZER_MEDPACKS                          = "Stabilizer Medpacks (Medic)"
+MEDIC_ADAPTIVE_MEDPACKS                            = "Adaptive Medpacks (Medic)"
+MEDIC_NANO_PROJECTOR                               = "Nano Projector (Medic)"
+MEDIVAC_ADVANCED_HEALING_AI                        = "Advanced Healing AI (Medivac)"
+MEDIVAC_AFTERBURNERS                               = "Afterburners (Medivac)"
+MEDIVAC_EXPANDED_HULL                              = "Expanded Hull (Medivac)"
+MEDIVAC_RAPID_DEPLOYMENT_TUBE                      = "Rapid Deployment Tube (Medivac)"
+MEDIVAC_SCATTER_VEIL                               = "Scatter Veil (Medivac)"
+MEDIVAC_ADVANCED_CLOAKING_FIELD                    = "Advanced Cloaking Field (Medivac)"
+MISSILE_TURRET_HELLSTORM_BATTERIES                 = "Hellstorm Batteries (Missile Turret)"
+MISSILE_TURRET_TITANIUM_HOUSING                    = "Titanium Housing (Missile Turret)"
+PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS = "Progressive Augmented Thrusters (Planetary Fortress)"
+PLANETARY_FORTRESS_ADVANCED_TARGETING              = "Advanced Targeting (Planetary Fortress)"
+PREDATOR_RESOURCE_EFFICIENCY                       = "Resource Efficiency (Predator)"
+PREDATOR_CLOAK                                     = "Cloak (Predator)"
+PREDATOR_CHARGE                                    = "Charge (Predator)"
+PREDATOR_PREDATOR_S_FURY                           = "Predator's Fury (Predator)"
+RAVEN_ANTI_ARMOR_MISSILE                           = "Anti-Armor Missile (Raven)"
+RAVEN_BIO_MECHANICAL_REPAIR_DRONE                  = "Bio Mechanical Repair Drone (Raven)"
+RAVEN_HUNTER_SEEKER_WEAPON                         = "Hunter-Seeker Weapon (Raven)"
+RAVEN_INTERFERENCE_MATRIX                          = "Interference Matrix (Raven)"
+RAVEN_INTERNAL_TECH_MODULE                         = "Internal Tech Module (Raven)"
+RAVEN_RAILGUN_TURRET                               = "Railgun Turret (Raven)"
+RAVEN_SPIDER_MINES                                 = "Spider Mines (Raven)"
+RAVEN_RESOURCE_EFFICIENCY                          = "Resource Efficiency (Raven)"
+RAVEN_DURABLE_MATERIALS                            = "Durable Materials (Raven)"
+REAPER_ADVANCED_CLOAKING_FIELD                     = "Advanced Cloaking Field (Reaper)"
+REAPER_COMBAT_DRUGS                                = "Combat Drugs (Reaper)"
+REAPER_G4_CLUSTERBOMB                              = "G-4 Clusterbomb (Reaper)"
+REAPER_LASER_TARGETING_SYSTEM                      = "Laser Targeting System (Reaper)"
+REAPER_PROGRESSIVE_STIMPACK                        = "Progressive Stimpack (Reaper)"
+REAPER_SPIDER_MINES                                = "Spider Mines (Reaper)"
+REAPER_U238_ROUNDS                                 = "U-238 Rounds (Reaper)"
+REAPER_JET_PACK_OVERDRIVE                          = "Jet Pack Overdrive (Reaper)"
+SCIENCE_VESSEL_DEFENSIVE_MATRIX                    = "Defensive Matrix (Science Vessel)"
+SCIENCE_VESSEL_EMP_SHOCKWAVE                       = "EMP Shockwave (Science Vessel)"
+SCIENCE_VESSEL_IMPROVED_NANO_REPAIR                = "Improved Nano-Repair (Science Vessel)"
+SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS                 = "Advanced AI Systems (Science Vessel)"
+SCV_ADVANCED_CONSTRUCTION                          = "Advanced Construction (SCV)"
+SCV_DUAL_FUSION_WELDERS                            = "Dual-Fusion Welders (SCV)"
+SCV_HOSTILE_ENVIRONMENT_ADAPTATION                 = "Hostile Environment Adaptation (SCV)"
+SIEGE_TANK_ADVANCED_SIEGE_TECH                     = "Advanced Siege Tech (Siege Tank)"
+SIEGE_TANK_GRADUATING_RANGE                        = "Graduating Range (Siege Tank)"
+SIEGE_TANK_INTERNAL_TECH_MODULE                    = "Internal Tech Module (Siege Tank)"
+SIEGE_TANK_JUMP_JETS                               = "Jump Jets (Siege Tank)"
+SIEGE_TANK_LASER_TARGETING_SYSTEM                  = "Laser Targeting System (Siege Tank)"
+SIEGE_TANK_MAELSTROM_ROUNDS                        = "Maelstrom Rounds (Siege Tank)"
+SIEGE_TANK_SHAPED_BLAST                            = "Shaped Blast (Siege Tank)"
+SIEGE_TANK_SMART_SERVOS                            = "Smart Servos (Siege Tank)"
+SIEGE_TANK_SPIDER_MINES                            = "Spider Mines (Siege Tank)"
+SIEGE_TANK_SHAPED_HULL                             = "Shaped Hull (Siege Tank)"
+SIEGE_TANK_RESOURCE_EFFICIENCY                     = "Resource Efficiency (Siege Tank)"
+SPECTRE_IMPALER_ROUNDS                             = "Impaler Rounds (Spectre)"
+SPECTRE_NYX_CLASS_CLOAKING_MODULE                  = "Nyx-Class Cloaking Module (Spectre)"
+SPECTRE_PSIONIC_LASH                               = "Psionic Lash (Spectre)"
+SPECTRE_RESOURCE_EFFICIENCY                        = "Resource Efficiency (Spectre)"
+SPIDER_MINE_CERBERUS_MINE                          = "Cerberus Mine (Spider Mine)"
+SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION                = "High Explosive Munition (Spider Mine)"
+THOR_330MM_BARRAGE_CANNON                          = "330mm Barrage Cannon (Thor)"
+THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL              = "Progressive Immortality Protocol (Thor)"
+THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD               = "Progressive High Impact Payload (Thor)"
+THOR_BUTTON_WITH_A_SKULL_ON_IT                     = "Button With a Skull on It (Thor)"
+THOR_LASER_TARGETING_SYSTEM                        = "Laser Targeting System (Thor)"
+THOR_LARGE_SCALE_FIELD_CONSTRUCTION                = "Large Scale Field Construction (Thor)"
+VALKYRIE_AFTERBURNERS                              = "Afterburners (Valkyrie)"
+VALKYRIE_FLECHETTE_MISSILES                        = "Flechette Missiles (Valkyrie)"
+VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS                = "Enhanced Cluster Launchers (Valkyrie)"
+VALKYRIE_SHAPED_HULL                               = "Shaped Hull (Valkyrie)"
+VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR              = "Launching Vector Compensator (Valkyrie)"
+VALKYRIE_RESOURCE_EFFICIENCY                       = "Resource Efficiency (Valkyrie)"
+VIKING_ANTI_MECHANICAL_MUNITION                    = "Anti-Mechanical Munition (Viking)"
+VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM                 = "Phobos-Class Weapons System (Viking)"
+VIKING_RIPWAVE_MISSILES                            = "Ripwave Missiles (Viking)"
+VIKING_SMART_SERVOS                                = "Smart Servos (Viking)"
+VIKING_SHREDDER_ROUNDS                             = "Shredder Rounds (Viking)"
+VIKING_WILD_MISSILES                               = "W.I.L.D. Missiles (Viking)"
+VULTURE_AUTO_LAUNCHERS                             = "Auto Launchers (Vulture)"
+VULTURE_ION_THRUSTERS                              = "Ion Thrusters (Vulture)"
+VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE         = "Progressive Replenishable Magazine (Vulture)"
+VULTURE_AUTO_REPAIR                                = "Auto-Repair (Vulture)"
+WARHOUND_RESOURCE_EFFICIENCY                       = "Resource Efficiency (Warhound)"
+WARHOUND_REINFORCED_PLATING                        = "Reinforced Plating (Warhound)"
+WIDOW_MINE_BLACK_MARKET_LAUNCHERS                  = "Black Market Launchers (Widow Mine)"
+WIDOW_MINE_CONCEALMENT                             = "Concealment (Widow Mine)"
+WIDOW_MINE_DRILLING_CLAWS                          = "Drilling Claws (Widow Mine)"
+WIDOW_MINE_EXECUTIONER_MISSILES                    = "Executioner Missiles (Widow Mine)"
+WRAITH_ADVANCED_LASER_TECHNOLOGY                   = "Advanced Laser Technology (Wraith)"
+WRAITH_DISPLACEMENT_FIELD                          = "Displacement Field (Wraith)"
+WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS            = "Progressive Tomahawk Power Cells (Wraith)"
+WRAITH_TRIGGER_OVERRIDE                            = "Trigger Override (Wraith)"
+WRAITH_INTERNAL_TECH_MODULE                        = "Internal Tech Module (Wraith)"
+WRAITH_RESOURCE_EFFICIENCY                         = "Resource Efficiency (Wraith)"
+
+# Nova
+NOVA_GHOST_VISOR                        = "Ghost Visor (Nova Equipment)"
+NOVA_RANGEFINDER_OCULUS                 = "Rangefinder Oculus (Nova Equipment)"
+NOVA_DOMINATION                         = "Domination (Nova Ability)"
+NOVA_BLINK                              = "Blink (Nova Ability)"
+NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE    = "Progressive Stealth Suit Module (Nova Suit Module)"
+NOVA_ENERGY_SUIT_MODULE                 = "Energy Suit Module (Nova Suit Module)"
+NOVA_ARMORED_SUIT_MODULE                = "Armored Suit Module (Nova Suit Module)"
+NOVA_JUMP_SUIT_MODULE                   = "Jump Suit Module (Nova Suit Module)"
+NOVA_C20A_CANISTER_RIFLE                = "C20A Canister Rifle (Nova Weapon)"
+NOVA_HELLFIRE_SHOTGUN                   = "Hellfire Shotgun (Nova Weapon)"
+NOVA_PLASMA_RIFLE                       = "Plasma Rifle (Nova Weapon)"
+NOVA_MONOMOLECULAR_BLADE                = "Monomolecular Blade (Nova Weapon)"
+NOVA_BLAZEFIRE_GUNBLADE                 = "Blazefire Gunblade (Nova Weapon)"
+NOVA_STIM_INFUSION                      = "Stim Infusion (Nova Gadget)"
+NOVA_PULSE_GRENADES                     = "Pulse Grenades (Nova Gadget)"
+NOVA_FLASHBANG_GRENADES                 = "Flashbang Grenades (Nova Gadget)"
+NOVA_IONIC_FORCE_FIELD                  = "Ionic Force Field (Nova Gadget)"
+NOVA_HOLO_DECOY                         = "Holo Decoy (Nova Gadget)"
+NOVA_NUKE                               = "Tac Nuke Strike (Nova Ability)"
+
+# Zerg Units
+ZERGLING      = "Zergling"
+SWARM_QUEEN   = "Swarm Queen"
+ROACH         = "Roach"
+HYDRALISK     = "Hydralisk"
+ABERRATION    = "Aberration"
+MUTALISK      = "Mutalisk"
+SWARM_HOST    = "Swarm Host"
+INFESTOR      = "Infestor"
+ULTRALISK     = "Ultralisk"
+CORRUPTOR     = "Corruptor"
+SCOURGE       = "Scourge"
+BROOD_QUEEN   = "Brood Queen"
+DEFILER       = "Defiler"
+
+# Zerg Buildings
+SPORE_CRAWLER = "Spore Crawler"
+SPINE_CRAWLER = "Spine Crawler"
+
+# Zerg Weapon / Armor Upgrades
+ZERG_UPGRADE_PREFIX = "Progressive Zerg"
+ZERG_FLYER_UPGRADE_PREFIX = f"{ZERG_UPGRADE_PREFIX} Flyer"
+
+PROGRESSIVE_ZERG_MELEE_ATTACK         = f"{ZERG_UPGRADE_PREFIX} Melee Attack"
+PROGRESSIVE_ZERG_MISSILE_ATTACK       = f"{ZERG_UPGRADE_PREFIX} Missile Attack"
+PROGRESSIVE_ZERG_GROUND_CARAPACE      = f"{ZERG_UPGRADE_PREFIX} Ground Carapace"
+PROGRESSIVE_ZERG_FLYER_ATTACK         = f"{ZERG_FLYER_UPGRADE_PREFIX} Attack"
+PROGRESSIVE_ZERG_FLYER_CARAPACE       = f"{ZERG_FLYER_UPGRADE_PREFIX} Carapace"
+PROGRESSIVE_ZERG_WEAPON_UPGRADE       = f"{ZERG_UPGRADE_PREFIX} Weapon Upgrade"
+PROGRESSIVE_ZERG_ARMOR_UPGRADE        = f"{ZERG_UPGRADE_PREFIX} Armor Upgrade"
+PROGRESSIVE_ZERG_GROUND_UPGRADE       = f"{ZERG_UPGRADE_PREFIX} Ground Upgrade"
+PROGRESSIVE_ZERG_FLYER_UPGRADE        = f"{ZERG_FLYER_UPGRADE_PREFIX} Upgrade"
+PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon/Armor Upgrade"
+
+# Zerg Unit Upgrades
+ZERGLING_HARDENED_CARAPACE              = "Hardened Carapace (Zergling)"
+ZERGLING_ADRENAL_OVERLOAD               = "Adrenal Overload (Zergling)"
+ZERGLING_METABOLIC_BOOST                = "Metabolic Boost (Zergling)"
+ZERGLING_SHREDDING_CLAWS                = "Shredding Claws (Zergling)"
+ROACH_HYDRIODIC_BILE                    = "Hydriodic Bile (Roach)"
+ROACH_ADAPTIVE_PLATING                  = "Adaptive Plating (Roach)"
+ROACH_TUNNELING_CLAWS                   = "Tunneling Claws (Roach)"
+ROACH_GLIAL_RECONSTITUTION              = "Glial Reconstitution (Roach)"
+ROACH_ORGANIC_CARAPACE                  = "Organic Carapace (Roach)"
+HYDRALISK_FRENZY                        = "Frenzy (Hydralisk)"
+HYDRALISK_ANCILLARY_CARAPACE            = "Ancillary Carapace (Hydralisk)"
+HYDRALISK_GROOVED_SPINES                = "Grooved Spines (Hydralisk)"
+HYDRALISK_MUSCULAR_AUGMENTS             = "Muscular Augments (Hydralisk)"
+HYDRALISK_RESOURCE_EFFICIENCY           = "Resource Efficiency (Hydralisk)"
+BANELING_CORROSIVE_ACID                 = "Corrosive Acid (Baneling)"
+BANELING_RUPTURE                        = "Rupture (Baneling)"
+BANELING_REGENERATIVE_ACID              = "Regenerative Acid (Baneling)"
+BANELING_CENTRIFUGAL_HOOKS              = "Centrifugal Hooks (Baneling)"
+BANELING_TUNNELING_JAWS                 = "Tunneling Jaws (Baneling)"
+BANELING_RAPID_METAMORPH                = "Rapid Metamorph (Baneling)"
+MUTALISK_VICIOUS_GLAIVE                 = "Vicious Glaive (Mutalisk)"
+MUTALISK_RAPID_REGENERATION             = "Rapid Regeneration (Mutalisk)"
+MUTALISK_SUNDERING_GLAIVE               = "Sundering Glaive (Mutalisk)"
+MUTALISK_SEVERING_GLAIVE                = "Severing Glaive (Mutalisk)"
+MUTALISK_AERODYNAMIC_GLAIVE_SHAPE       = "Aerodynamic Glaive Shape (Mutalisk)"
+SWARM_HOST_BURROW                       = "Burrow (Swarm Host)"
+SWARM_HOST_RAPID_INCUBATION             = "Rapid Incubation (Swarm Host)"
+SWARM_HOST_PRESSURIZED_GLANDS           = "Pressurized Glands (Swarm Host)"
+SWARM_HOST_LOCUST_METABOLIC_BOOST       = "Locust Metabolic Boost (Swarm Host)"
+SWARM_HOST_ENDURING_LOCUSTS             = "Enduring Locusts (Swarm Host)"
+SWARM_HOST_ORGANIC_CARAPACE             = "Organic Carapace (Swarm Host)"
+SWARM_HOST_RESOURCE_EFFICIENCY          = "Resource Efficiency (Swarm Host)"
+ULTRALISK_BURROW_CHARGE                 = "Burrow Charge (Ultralisk)"
+ULTRALISK_TISSUE_ASSIMILATION           = "Tissue Assimilation (Ultralisk)"
+ULTRALISK_MONARCH_BLADES                = "Monarch Blades (Ultralisk)"
+ULTRALISK_ANABOLIC_SYNTHESIS            = "Anabolic Synthesis (Ultralisk)"
+ULTRALISK_CHITINOUS_PLATING             = "Chitinous Plating (Ultralisk)"
+ULTRALISK_ORGANIC_CARAPACE              = "Organic Carapace (Ultralisk)"
+ULTRALISK_RESOURCE_EFFICIENCY           = "Resource Efficiency (Ultralisk)"
+CORRUPTOR_CORRUPTION                    = "Corruption (Corruptor)"
+CORRUPTOR_CAUSTIC_SPRAY                 = "Caustic Spray (Corruptor)"
+SCOURGE_VIRULENT_SPORES                 = "Virulent Spores (Scourge)"
+SCOURGE_RESOURCE_EFFICIENCY             = "Resource Efficiency (Scourge)"
+SCOURGE_SWARM_SCOURGE                   = "Swarm Scourge (Scourge)"
+DEVOURER_CORROSIVE_SPRAY                = "Corrosive Spray (Devourer)"
+DEVOURER_GAPING_MAW                     = "Gaping Maw (Devourer)"
+DEVOURER_IMPROVED_OSMOSIS               = "Improved Osmosis (Devourer)"
+DEVOURER_PRESCIENT_SPORES               = "Prescient Spores (Devourer)"
+GUARDIAN_PROLONGED_DISPERSION           = "Prolonged Dispersion (Guardian)"
+GUARDIAN_PRIMAL_ADAPTATION              = "Primal Adaptation (Guardian)"
+GUARDIAN_SORONAN_ACID                   = "Soronan Acid (Guardian)"
+IMPALER_ADAPTIVE_TALONS                 = "Adaptive Talons (Impaler)"
+IMPALER_SECRETION_GLANDS                = "Secretion Glands (Impaler)"
+IMPALER_HARDENED_TENTACLE_SPINES        = "Hardened Tentacle Spines (Impaler)"
+LURKER_SEISMIC_SPINES                   = "Seismic Spines (Lurker)"
+LURKER_ADAPTED_SPINES                   = "Adapted Spines (Lurker)"
+RAVAGER_POTENT_BILE                     = "Potent Bile (Ravager)"
+RAVAGER_BLOATED_BILE_DUCTS              = "Bloated Bile Ducts (Ravager)"
+RAVAGER_DEEP_TUNNEL                     = "Deep Tunnel (Ravager)"
+VIPER_PARASITIC_BOMB                    = "Parasitic Bomb (Viper)"
+VIPER_PARALYTIC_BARBS                   = "Paralytic Barbs (Viper)"
+VIPER_VIRULENT_MICROBES                 = "Virulent Microbes (Viper)"
+BROOD_LORD_POROUS_CARTILAGE             = "Porous Cartilage (Brood Lord)"
+BROOD_LORD_EVOLVED_CARAPACE             = "Evolved Carapace (Brood Lord)"
+BROOD_LORD_SPLITTER_MITOSIS             = "Splitter Mitosis (Brood Lord)"
+BROOD_LORD_RESOURCE_EFFICIENCY          = "Resource Efficiency (Brood Lord)"
+INFESTOR_INFESTED_TERRAN                = "Infested Terran (Infestor)"
+INFESTOR_MICROBIAL_SHROUD               = "Microbial Shroud (Infestor)"
+SWARM_QUEEN_SPAWN_LARVAE                = "Spawn Larvae (Swarm Queen)"
+SWARM_QUEEN_DEEP_TUNNEL                 = "Deep Tunnel (Swarm Queen)"
+SWARM_QUEEN_ORGANIC_CARAPACE            = "Organic Carapace (Swarm Queen)"
+SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION  = "Bio-Mechanical Transfusion (Swarm Queen)"
+SWARM_QUEEN_RESOURCE_EFFICIENCY         = "Resource Efficiency (Swarm Queen)"
+SWARM_QUEEN_INCUBATOR_CHAMBER           = "Incubator Chamber (Swarm Queen)"
+BROOD_QUEEN_FUNGAL_GROWTH               = "Fungal Growth (Brood Queen)"
+BROOD_QUEEN_ENSNARE                     = "Ensnare (Brood Queen)"
+BROOD_QUEEN_ENHANCED_MITOCHONDRIA       = "Enhanced Mitochondria (Brood Queen)"
+
+# Zerg Strains
+ZERGLING_RAPTOR_STRAIN     = "Raptor Strain (Zergling)"
+ZERGLING_SWARMLING_STRAIN  = "Swarmling Strain (Zergling)"
+ROACH_VILE_STRAIN          = "Vile Strain (Roach)"
+ROACH_CORPSER_STRAIN       = "Corpser Strain (Roach)"
+BANELING_SPLITTER_STRAIN   = "Splitter Strain (Baneling)"
+BANELING_HUNTER_STRAIN     = "Hunter Strain (Baneling)"
+SWARM_HOST_CARRION_STRAIN  = "Carrion Strain (Swarm Host)"
+SWARM_HOST_CREEPER_STRAIN  = "Creeper Strain (Swarm Host)"
+ULTRALISK_NOXIOUS_STRAIN   = "Noxious Strain (Ultralisk)"
+ULTRALISK_TORRASQUE_STRAIN = "Torrasque Strain (Ultralisk)"
+
+# Morphs
+ZERGLING_BANELING_ASPECT                = "Baneling Aspect (Zergling)"
+HYDRALISK_IMPALER_ASPECT                = "Impaler Aspect (Hydralisk)"
+HYDRALISK_LURKER_ASPECT                 = "Lurker Aspect (Hydralisk)"
+MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT    = "Brood Lord Aspect (Mutalisk/Corruptor)"
+MUTALISK_CORRUPTOR_VIPER_ASPECT         = "Viper Aspect (Mutalisk/Corruptor)"
+MUTALISK_CORRUPTOR_GUARDIAN_ASPECT      = "Guardian Aspect (Mutalisk/Corruptor)"
+MUTALISK_CORRUPTOR_DEVOURER_ASPECT      = "Devourer Aspect (Mutalisk/Corruptor)"
+ROACH_RAVAGER_ASPECT                    = "Ravager Aspect (Roach)"
+
+# Zerg Mercs
+INFESTED_MEDICS      = "Infested Medics"
+INFESTED_SIEGE_TANKS = "Infested Siege Tanks"
+INFESTED_BANSHEES    = "Infested Banshees"
+    
+# Kerrigan Upgrades
+KERRIGAN_KINETIC_BLAST           = "Kinetic Blast (Kerrigan Tier 1)"
+KERRIGAN_HEROIC_FORTITUDE        = "Heroic Fortitude (Kerrigan Tier 1)"
+KERRIGAN_LEAPING_STRIKE          = "Leaping Strike (Kerrigan Tier 1)"
+KERRIGAN_CRUSHING_GRIP           = "Crushing Grip (Kerrigan Tier 2)"
+KERRIGAN_CHAIN_REACTION          = "Chain Reaction (Kerrigan Tier 2)"
+KERRIGAN_PSIONIC_SHIFT           = "Psionic Shift (Kerrigan Tier 2)"
+KERRIGAN_WILD_MUTATION           = "Wild Mutation (Kerrigan Tier 4)"
+KERRIGAN_SPAWN_BANELINGS         = "Spawn Banelings (Kerrigan Tier 4)"
+KERRIGAN_MEND                    = "Mend (Kerrigan Tier 4)"
+KERRIGAN_INFEST_BROODLINGS       = "Infest Broodlings (Kerrigan Tier 6)"
+KERRIGAN_FURY                    = "Fury (Kerrigan Tier 6)"
+KERRIGAN_ABILITY_EFFICIENCY      = "Ability Efficiency (Kerrigan Tier 6)"
+KERRIGAN_APOCALYPSE              = "Apocalypse (Kerrigan Tier 7)"
+KERRIGAN_SPAWN_LEVIATHAN         = "Spawn Leviathan (Kerrigan Tier 7)"
+KERRIGAN_DROP_PODS               = "Drop-Pods (Kerrigan Tier 7)"
+KERRIGAN_PRIMAL_FORM             = "Primal Form (Kerrigan)"
+
+# Misc Upgrades
+KERRIGAN_ZERGLING_RECONSTITUTION = "Zergling Reconstitution (Kerrigan Tier 3)"
+KERRIGAN_IMPROVED_OVERLORDS      = "Improved Overlords (Kerrigan Tier 3)"
+KERRIGAN_AUTOMATED_EXTRACTORS    = "Automated Extractors (Kerrigan Tier 3)"
+KERRIGAN_TWIN_DRONES             = "Twin Drones (Kerrigan Tier 5)"
+KERRIGAN_MALIGNANT_CREEP         = "Malignant Creep (Kerrigan Tier 5)"
+KERRIGAN_VESPENE_EFFICIENCY      = "Vespene Efficiency (Kerrigan Tier 5)"
+OVERLORD_VENTRAL_SACS            = "Ventral Sacs (Overlord)"
+
+# Kerrigan Levels
+KERRIGAN_LEVELS_1  = "1 Kerrigan Level"
+KERRIGAN_LEVELS_2  = "2 Kerrigan Levels"
+KERRIGAN_LEVELS_3  = "3 Kerrigan Levels"
+KERRIGAN_LEVELS_4  = "4 Kerrigan Levels"
+KERRIGAN_LEVELS_5  = "5 Kerrigan Levels"
+KERRIGAN_LEVELS_6  = "6 Kerrigan Levels"
+KERRIGAN_LEVELS_7  = "7 Kerrigan Levels"
+KERRIGAN_LEVELS_8  = "8 Kerrigan Levels"
+KERRIGAN_LEVELS_9  = "9 Kerrigan Levels"
+KERRIGAN_LEVELS_10 = "10 Kerrigan Levels"
+KERRIGAN_LEVELS_14 = "14 Kerrigan Levels"
+KERRIGAN_LEVELS_35 = "35 Kerrigan Levels"
+KERRIGAN_LEVELS_70 = "70 Kerrigan Levels"
+
+# Protoss Units
+ZEALOT       = "Zealot"
+STALKER      = "Stalker"
+HIGH_TEMPLAR = "High Templar"
+DARK_TEMPLAR = "Dark Templar"
+IMMORTAL     = "Immortal"
+COLOSSUS     = "Colossus"
+PHOENIX      = "Phoenix"
+VOID_RAY     = "Void Ray"
+CARRIER      = "Carrier"
+OBSERVER     = "Observer"
+CENTURION    = "Centurion"
+SENTINEL     = "Sentinel"
+SUPPLICANT   = "Supplicant"
+INSTIGATOR   = "Instigator"
+SLAYER       = "Slayer"
+SENTRY       = "Sentry"
+ENERGIZER    = "Energizer"
+HAVOC        = "Havoc"
+SIGNIFIER    = "Signifier"
+ASCENDANT    = "Ascendant"
+AVENGER      = "Avenger"
+BLOOD_HUNTER = "Blood Hunter"
+DRAGOON      = "Dragoon"
+DARK_ARCHON  = "Dark Archon"
+ADEPT        = "Adept"
+WARP_PRISM   = "Warp Prism"
+ANNIHILATOR  = "Annihilator"
+VANGUARD     = "Vanguard"
+WRATHWALKER  = "Wrathwalker"
+REAVER       = "Reaver"
+DISRUPTOR    = "Disruptor"
+MIRAGE       = "Mirage"
+CORSAIR      = "Corsair"
+DESTROYER    = "Destroyer"
+SCOUT        = "Scout"
+TEMPEST      = "Tempest"
+MOTHERSHIP   = "Mothership"
+ARBITER      = "Arbiter"
+ORACLE       = "Oracle"
+
+# Upgrades
+PROTOSS_UPGRADE_PREFIX                   = "Progressive Protoss"
+PROTOSS_GROUND_UPGRADE_PREFIX            = f"{PROTOSS_UPGRADE_PREFIX} Ground"
+PROTOSS_AIR_UPGRADE_PREFIX               = f"{PROTOSS_UPGRADE_PREFIX} Air"
+PROGRESSIVE_PROTOSS_GROUND_WEAPON        = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Weapon"
+PROGRESSIVE_PROTOSS_GROUND_ARMOR         = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Armor"
+PROGRESSIVE_PROTOSS_SHIELDS              = f"{PROTOSS_UPGRADE_PREFIX} Shields"
+PROGRESSIVE_PROTOSS_AIR_WEAPON           = f"{PROTOSS_AIR_UPGRADE_PREFIX} Weapon"
+PROGRESSIVE_PROTOSS_AIR_ARMOR            = f"{PROTOSS_AIR_UPGRADE_PREFIX} Armor"
+PROGRESSIVE_PROTOSS_WEAPON_UPGRADE       = f"{PROTOSS_UPGRADE_PREFIX} Weapon Upgrade"
+PROGRESSIVE_PROTOSS_ARMOR_UPGRADE        = f"{PROTOSS_UPGRADE_PREFIX} Armor Upgrade"
+PROGRESSIVE_PROTOSS_GROUND_UPGRADE       = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Upgrade"
+PROGRESSIVE_PROTOSS_AIR_UPGRADE          = f"{PROTOSS_AIR_UPGRADE_PREFIX} Upgrade"
+PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon/Armor Upgrade"
+
+# Buildings
+PHOTON_CANNON       = "Photon Cannon"
+KHAYDARIN_MONOLITH  = "Khaydarin Monolith"
+SHIELD_BATTERY      = "Shield Battery"
+
+# Unit Upgrades
+SUPPLICANT_BLOOD_SHIELD                                 = "Blood Shield (Supplicant)"
+SUPPLICANT_SOUL_AUGMENTATION                            = "Soul Augmentation (Supplicant)"
+SUPPLICANT_SHIELD_REGENERATION                          = "Shield Regeneration (Supplicant)"
+ADEPT_SHOCKWAVE                                         = "Shockwave (Adept)"
+ADEPT_RESONATING_GLAIVES                                = "Resonating Glaives (Adept)"
+ADEPT_PHASE_BULWARK                                     = "Phase Bulwark (Adept)"
+STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES      = "Disintegrating Particles (Stalker/Instigator/Slayer)"
+STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION           = "Particle Reflection (Stalker/Instigator/Slayer)"
+DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS                    = "High Impact Phase Disruptor (Dragoon)"
+DRAGOON_TRILLIC_COMPRESSION_SYSTEM                      = "Trillic Compression System (Dragoon)"
+DRAGOON_SINGULARITY_CHARGE                              = "Singularity Charge (Dragoon)"
+DRAGOON_ENHANCED_STRIDER_SERVOS                         = "Enhanced Strider Servos (Dragoon)"
+SCOUT_COMBAT_SENSOR_ARRAY                               = "Combat Sensor Array (Scout)"
+SCOUT_APIAL_SENSORS                                     = "Apial Sensors (Scout)"
+SCOUT_GRAVITIC_THRUSTERS                                = "Gravitic Thrusters (Scout)"
+SCOUT_ADVANCED_PHOTON_BLASTERS                          = "Advanced Photon Blasters (Scout)"
+TEMPEST_TECTONIC_DESTABILIZERS                          = "Tectonic Destabilizers (Tempest)"
+TEMPEST_QUANTIC_REACTOR                                 = "Quantic Reactor (Tempest)"
+TEMPEST_GRAVITY_SLING                                   = "Gravity Sling (Tempest)"
+PHOENIX_MIRAGE_IONIC_WAVELENGTH_FLUX                    = "Ionic Wavelength Flux (Phoenix/Mirage)"
+PHOENIX_MIRAGE_ANION_PULSE_CRYSTALS                     = "Anion Pulse-Crystals (Phoenix/Mirage)"
+CORSAIR_STEALTH_DRIVE                                   = "Stealth Drive (Corsair)"
+CORSAIR_ARGUS_JEWEL                                     = "Argus Jewel (Corsair)"
+CORSAIR_SUSTAINING_DISRUPTION                           = "Sustaining Disruption (Corsair)"
+CORSAIR_NEUTRON_SHIELDS                                 = "Neutron Shields (Corsair)"
+ORACLE_STEALTH_DRIVE                                    = "Stealth Drive (Oracle)"
+ORACLE_STASIS_CALIBRATION                               = "Stasis Calibration (Oracle)"
+ORACLE_TEMPORAL_ACCELERATION_BEAM                       = "Temporal Acceleration Beam (Oracle)"
+ARBITER_CHRONOSTATIC_REINFORCEMENT                      = "Chronostatic Reinforcement (Arbiter)"
+ARBITER_KHAYDARIN_CORE                                  = "Khaydarin Core (Arbiter)"
+ARBITER_SPACETIME_ANCHOR                                = "Spacetime Anchor (Arbiter)"
+ARBITER_RESOURCE_EFFICIENCY                             = "Resource Efficiency (Arbiter)"
+ARBITER_ENHANCED_CLOAK_FIELD                            = "Enhanced Cloak Field (Arbiter)"
+CARRIER_GRAVITON_CATAPULT                               = "Graviton Catapult (Carrier)"
+CARRIER_HULL_OF_PAST_GLORIES                            = "Hull of Past Glories (Carrier)"
+VOID_RAY_DESTROYER_FLUX_VANES                           = "Flux Vanes (Void Ray/Destroyer)"
+DESTROYER_REFORGED_BLOODSHARD_CORE                      = "Reforged Bloodshard Core (Destroyer)"
+WARP_PRISM_GRAVITIC_DRIVE                               = "Gravitic Drive (Warp Prism)"
+WARP_PRISM_PHASE_BLASTER                                = "Phase Blaster (Warp Prism)"
+WARP_PRISM_WAR_CONFIGURATION                            = "War Configuration (Warp Prism)"
+OBSERVER_GRAVITIC_BOOSTERS                              = "Gravitic Boosters (Observer)"
+OBSERVER_SENSOR_ARRAY                                   = "Sensor Array (Observer)"
+REAVER_SCARAB_DAMAGE                                    = "Scarab Damage (Reaver)"
+REAVER_SOLARITE_PAYLOAD                                 = "Solarite Payload (Reaver)"
+REAVER_REAVER_CAPACITY                                  = "Reaver Capacity (Reaver)"
+REAVER_RESOURCE_EFFICIENCY                              = "Resource Efficiency (Reaver)"
+VANGUARD_AGONY_LAUNCHERS                                = "Agony Launchers (Vanguard)"
+VANGUARD_MATTER_DISPERSION                              = "Matter Dispersion (Vanguard)"
+IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE                 = "Singularity Charge (Immortal/Annihilator)"
+IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS       = "Advanced Targeting Mechanics (Immortal/Annihilator)"
+COLOSSUS_PACIFICATION_PROTOCOL                          = "Pacification Protocol (Colossus)"
+WRATHWALKER_RAPID_POWER_CYCLING                         = "Rapid Power Cycling (Wrathwalker)"
+WRATHWALKER_EYE_OF_WRATH                                = "Eye of Wrath (Wrathwalker)"
+DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN        = "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)"
+DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING = "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)"
+DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK                 = "Blink (Dark Templar/Avenger/Blood Hunter)"
+DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY   = "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)"
+DARK_TEMPLAR_DARK_ARCHON_MELD                           = "Dark Archon Meld (Dark Templar)"
+HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM         = "Unshackled Psionic Storm (High Templar/Signifier)"
+HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION                    = "Hallucination (High Templar/Signifier)"
+HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET                 = "Khaydarin Amulet (High Templar/Signifier)"
+ARCHON_HIGH_ARCHON                                      = "High Archon (Archon)"
+DARK_ARCHON_FEEDBACK                                    = "Feedback (Dark Archon)"
+DARK_ARCHON_MAELSTROM                                   = "Maelstrom (Dark Archon)"
+DARK_ARCHON_ARGUS_TALISMAN                              = "Argus Talisman (Dark Archon)"
+ASCENDANT_POWER_OVERWHELMING                            = "Power Overwhelming (Ascendant)"
+ASCENDANT_CHAOTIC_ATTUNEMENT                            = "Chaotic Attunement (Ascendant)"
+ASCENDANT_BLOOD_AMULET                                  = "Blood Amulet (Ascendant)"
+SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE                  = "Cloaking Module (Sentry/Energizer/Havoc)"
+SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING  = "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)"
+SENTRY_FORCE_FIELD                                      = "Force Field (Sentry)"
+SENTRY_HALLUCINATION                                    = "Hallucination (Sentry)"
+ENERGIZER_RECLAMATION                                   = "Reclamation (Energizer)"
+ENERGIZER_FORGED_CHASSIS                                = "Forged Chassis (Energizer)"
+HAVOC_DETECT_WEAKNESS                                   = "Detect Weakness (Havoc)"
+HAVOC_BLOODSHARD_RESONANCE                              = "Bloodshard Resonance (Havoc)"
+ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS              = "Leg Enhancements (Zealot/Sentinel/Centurion)"
+ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY               = "Shield Capacity (Zealot/Sentinel/Centurion)"
+
+# Spear Of Adun
+SOA_CHRONO_SURGE            = "Chrono Surge (Spear of Adun Calldown)"
+SOA_PROGRESSIVE_PROXY_PYLON = "Progressive Proxy Pylon (Spear of Adun Calldown)"
+SOA_PYLON_OVERCHARGE        = "Pylon Overcharge (Spear of Adun Calldown)"
+SOA_ORBITAL_STRIKE          = "Orbital Strike (Spear of Adun Calldown)"
+SOA_TEMPORAL_FIELD          = "Temporal Field (Spear of Adun Calldown)"
+SOA_SOLAR_LANCE             = "Solar Lance (Spear of Adun Calldown)"
+SOA_MASS_RECALL             = "Mass Recall (Spear of Adun Calldown)"
+SOA_SHIELD_OVERCHARGE       = "Shield Overcharge (Spear of Adun Calldown)"
+SOA_DEPLOY_FENIX            = "Deploy Fenix (Spear of Adun Calldown)"
+SOA_PURIFIER_BEAM           = "Purifier Beam (Spear of Adun Calldown)"
+SOA_TIME_STOP               = "Time Stop (Spear of Adun Calldown)"
+SOA_SOLAR_BOMBARDMENT       = "Solar Bombardment (Spear of Adun Calldown)"
+
+# Generic upgrades
+MATRIX_OVERLOAD             = "Matrix Overload"
+QUATRO                      = "Quatro"
+NEXUS_OVERCHARGE            = "Nexus Overcharge"
+ORBITAL_ASSIMILATORS        = "Orbital Assimilators"
+WARP_HARMONIZATION          = "Warp Harmonization"
+GUARDIAN_SHELL              = "Guardian Shell"
+RECONSTRUCTION_BEAM         = "Reconstruction Beam (Spear of Adun Auto-Cast)"
+OVERWATCH                   = "Overwatch (Spear of Adun Auto-Cast)"
+SUPERIOR_WARP_GATES         = "Superior Warp Gates"
+ENHANCED_TARGETING          = "Enhanced Targeting"
+OPTIMIZED_ORDNANCE          = "Optimized Ordnance"
+KHALAI_INGENUITY            = "Khalai Ingenuity"
+AMPLIFIED_ASSIMILATORS      = "Amplified Assimilators"
+
+# Filler items
+STARTING_MINERALS = "Additional Starting Minerals"
+STARTING_VESPENE  = "Additional Starting Vespene"
+STARTING_SUPPLY   = "Additional Starting Supply"
+NOTHING           = "Nothing"
diff --git a/worlds/sc2/Items.py b/worlds/sc2/Items.py
new file mode 100644
index 00000000..85fb34e8
--- /dev/null
+++ b/worlds/sc2/Items.py
@@ -0,0 +1,2553 @@
+import inspect
+from pydoc import describe
+
+from BaseClasses import Item, ItemClassification, MultiWorld
+import typing
+
+from .Options import get_option_value, RequiredTactics
+from .MissionTables import SC2Mission, SC2Race, SC2Campaign, campaign_mission_table
+from . import ItemNames
+from worlds.AutoWorld import World
+
+
+class ItemData(typing.NamedTuple):
+    code: int
+    type: str
+    number: int  # Important for bot commands to send the item into the game
+    race: SC2Race
+    classification: ItemClassification = ItemClassification.useful
+    quantity: int = 1
+    parent_item: typing.Optional[str] = None
+    origin: typing.Set[str] = {"wol"}
+    description: typing.Optional[str] = None
+    important_for_filtering: bool = False
+
+    def is_important_for_filtering(self):
+        return self.important_for_filtering \
+            or self.classification == ItemClassification.progression \
+            or self.classification == ItemClassification.progression_skip_balancing
+
+
+class StarcraftItem(Item):
+    game: str = "Starcraft 2"
+
+
+def get_full_item_list():
+    return item_table
+
+
+SC2WOL_ITEM_ID_OFFSET = 1000
+SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000
+SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000
+
+# Descriptions
+WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc("""
+    Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades.
+""")
+LASER_TARGETING_SYSTEMS_DESCRIPTION = "Increases vision by 2 and weapon range by 1."
+STIMPACK_SMALL_COST = 10
+STIMPACK_SMALL_HEAL = 30
+STIMPACK_LARGE_COST = 20
+STIMPACK_LARGE_HEAL = 60
+STIMPACK_TEMPLATE = inspect.cleandoc("""
+    Level 1: Stimpack: Increases unit movement and attack speed for 15 seconds. Injures the unit for {} life.
+    Level 2: Super Stimpack: Instead of injuring the unit, heals the unit for {} life instead.
+""")
+STIMPACK_SMALL_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_SMALL_COST, STIMPACK_SMALL_HEAL)
+STIMPACK_LARGE_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_LARGE_COST, STIMPACK_LARGE_HEAL)
+SMART_SERVOS_DESCRIPTION = "Increases transformation speed between modes."
+INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE = "{} can be trained from a {} without an attached Tech Lab."
+RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE = "Reduces {} resource and supply cost."
+RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE = "Reduces {} resource cost."
+CLOAK_DESCRIPTION_TEMPLATE = "Allows {} to use the Cloak ability."
+
+
+# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games.
+item_table = {
+    # WoL
+    ItemNames.MARINE:
+        ItemData(0 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="General-purpose infantry."),
+    ItemNames.MEDIC:
+        ItemData(1 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Support trooper. Heals nearby biological units."),
+    ItemNames.FIREBAT:
+        ItemData(2 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Specialized anti-infantry attacker."),
+    ItemNames.MARAUDER:
+        ItemData(3 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Heavy assault infantry."),
+    ItemNames.REAPER:
+        ItemData(4 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Raider. Capable of jumping up and down cliffs. Throws explosive mines."),
+    ItemNames.HELLION:
+        ItemData(5 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Fast scout. Has a flame attack that damages all enemy units in its line of fire."),
+    ItemNames.VULTURE:
+        ItemData(6 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Fast skirmish unit. Can use the Spider Mine ability."),
+    ItemNames.GOLIATH:
+        ItemData(7 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Heavy-fire support unit."),
+    ItemNames.DIAMONDBACK:
+        ItemData(8 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Fast, high-damage hovertank. Rail Gun can fire while the Diamondback is moving."),
+    ItemNames.SIEGE_TANK:
+        ItemData(9 + SC2WOL_ITEM_ID_OFFSET, "Unit", 9, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Heavy tank. Long-range artillery in Siege Mode."),
+    ItemNames.MEDIVAC:
+        ItemData(10 + SC2WOL_ITEM_ID_OFFSET, "Unit", 10, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Air transport. Heals nearby biological units."),
+    ItemNames.WRAITH:
+        ItemData(11 + SC2WOL_ITEM_ID_OFFSET, "Unit", 11, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Highly mobile flying unit. Excellent at surgical strikes."),
+    ItemNames.VIKING:
+        ItemData(12 + SC2WOL_ITEM_ID_OFFSET, "Unit", 12, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Durable support flyer. Loaded with strong anti-capital air missiles. 
+                     Can switch into Assault Mode to attack ground units.
+                     """
+                 )),
+    ItemNames.BANSHEE:
+        ItemData(13 + SC2WOL_ITEM_ID_OFFSET, "Unit", 13, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Tactical-strike aircraft."),
+    ItemNames.BATTLECRUISER:
+        ItemData(14 + SC2WOL_ITEM_ID_OFFSET, "Unit", 14, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Powerful warship."),
+    ItemNames.GHOST:
+        ItemData(15 + SC2WOL_ITEM_ID_OFFSET, "Unit", 15, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Infiltration unit. Can use Snipe and Cloak abilities. Can also call down Tactical Nukes.
+                     """
+                 )),
+    ItemNames.SPECTRE:
+        ItemData(16 + SC2WOL_ITEM_ID_OFFSET, "Unit", 16, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Infiltration unit. Can use Ultrasonic Pulse, Psionic Lash, and Cloak. 
+                     Can also call down Tactical Nukes.
+                     """
+                 )),
+    ItemNames.THOR:
+        ItemData(17 + SC2WOL_ITEM_ID_OFFSET, "Unit", 17, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Heavy assault mech."),
+    # EE units
+    ItemNames.LIBERATOR:
+        ItemData(18 + SC2WOL_ITEM_ID_OFFSET, "Unit", 18, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"nco", "ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Artillery fighter. Loaded with missiles that deal area damage to enemy air targets. 
+                     Can switch into Defender Mode to provide siege support.
+                     """
+                 )),
+    ItemNames.VALKYRIE:
+        ItemData(19 + SC2WOL_ITEM_ID_OFFSET, "Unit", 19, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"bw"},
+                 description=inspect.cleandoc(
+                     """
+                     Advanced anti-aircraft fighter. 
+                     Able to use cluster missiles that deal area damage to air targets.
+                     """
+                 )),
+    ItemNames.WIDOW_MINE:
+        ItemData(20 + SC2WOL_ITEM_ID_OFFSET, "Unit", 20, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Robotic mine. Launches missiles at nearby enemy units while burrowed. 
+                     Attacks deal splash damage in a small area around the target. 
+                     Widow Mine is revealed when Sentinel Missile is on cooldown.
+                     """
+                 )),
+    ItemNames.CYCLONE:
+        ItemData(21 + SC2WOL_ITEM_ID_OFFSET, "Unit", 21, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Mobile assault vehicle. Can use Lock On to quickly fire while moving.
+                     """
+                 )),
+    ItemNames.HERC:
+        ItemData(22 + SC2WOL_ITEM_ID_OFFSET, "Unit", 26, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Front-line infantry. Can use Grapple.
+                     """
+                 )),
+    ItemNames.WARHOUND:
+        ItemData(23 + SC2WOL_ITEM_ID_OFFSET, "Unit", 27, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Anti-vehicle mech. Haywire missiles do bonus damage to mechanical units.
+                     """
+                 )),
+
+    # Some other items are moved to Upgrade group because of the way how the bot message is parsed
+    ItemNames.PROGRESSIVE_TERRAN_INFANTRY_WEAPON:
+        ItemData(100 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.TERRAN,
+                 quantity=3,
+                 description=inspect.cleandoc(
+                     f"""
+                     Increases damage of Terran infantry units. 
+                     {WEAPON_ARMOR_UPGRADE_NOTE}
+                     """
+                 )),
+    ItemNames.PROGRESSIVE_TERRAN_INFANTRY_ARMOR:
+        ItemData(102 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.TERRAN,
+                 quantity=3,
+                 description=inspect.cleandoc(
+                     f"""
+                     Increases armor of Terran infantry units. 
+                     {WEAPON_ARMOR_UPGRADE_NOTE}
+                     """
+                 )),
+    ItemNames.PROGRESSIVE_TERRAN_VEHICLE_WEAPON:
+        ItemData(103 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.TERRAN,
+                 quantity=3,
+                 description=inspect.cleandoc(
+                     f"""
+                     Increases damage of Terran vehicle units. 
+                     {WEAPON_ARMOR_UPGRADE_NOTE}
+                     """
+                 )),
+    ItemNames.PROGRESSIVE_TERRAN_VEHICLE_ARMOR:
+        ItemData(104 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.TERRAN,
+                 quantity=3,
+                 description=inspect.cleandoc(
+                     f"""
+                     Increases armor of Terran vehicle units. 
+                     {WEAPON_ARMOR_UPGRADE_NOTE}
+                     """
+                 )),
+    ItemNames.PROGRESSIVE_TERRAN_SHIP_WEAPON:
+        ItemData(105 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.TERRAN,
+                 quantity=3,
+                 description=inspect.cleandoc(
+                     f"""
+                     Increases damage of Terran starship units. 
+                     {WEAPON_ARMOR_UPGRADE_NOTE}
+                     """
+                 )),
+    ItemNames.PROGRESSIVE_TERRAN_SHIP_ARMOR:
+        ItemData(106 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, SC2Race.TERRAN,
+                 quantity=3,
+                 description=inspect.cleandoc(
+                     f"""
+                     Increases armor of Terran starship units. 
+                     {WEAPON_ARMOR_UPGRADE_NOTE}
+                     """
+                 )),
+    # Upgrade bundle 'number' values are used as indices to get affected 'number's
+    ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.TERRAN, quantity=3),
+    ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 1, SC2Race.TERRAN, quantity=3),
+    ItemNames.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.TERRAN, quantity=3),
+    ItemNames.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 3, SC2Race.TERRAN, quantity=3),
+    ItemNames.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.TERRAN, quantity=3),
+    ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 5, SC2Race.TERRAN, quantity=3),
+
+    # Unit and structure upgrades
+    ItemNames.BUNKER_PROJECTILE_ACCELERATOR:
+        ItemData(200 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0, SC2Race.TERRAN,
+                 parent_item=ItemNames.BUNKER,
+                 description="Increases range of all units in the Bunker by 1."),
+    ItemNames.BUNKER_NEOSTEEL_BUNKER:
+        ItemData(201 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1, SC2Race.TERRAN,
+                 parent_item=ItemNames.BUNKER,
+                 description="Increases the number of Bunker slots by 2."),
+    ItemNames.MISSILE_TURRET_TITANIUM_HOUSING:
+        ItemData(202 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MISSILE_TURRET,
+                 description="Increases Missile Turret life by 75."),
+    ItemNames.MISSILE_TURRET_HELLSTORM_BATTERIES:
+        ItemData(203 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3, SC2Race.TERRAN,
+                 parent_item=ItemNames.MISSILE_TURRET,
+                 description="The Missile Turret unleashes an additional flurry of missiles with each attack."),
+    ItemNames.SCV_ADVANCED_CONSTRUCTION:
+        ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4, SC2Race.TERRAN,
+                 description="Multiple SCVs can construct a structure, reducing its construction time."),
+    ItemNames.SCV_DUAL_FUSION_WELDERS:
+        ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5, SC2Race.TERRAN,
+                 description="SCVs repair twice as fast."),
+    ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM:
+        ItemData(206 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 24, SC2Race.TERRAN,
+                 quantity=2,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: While on low health, Terran structures are repaired to half health instead of burning down.
+                     Level 2: Terran structures are repaired to full health instead of half health
+                     """
+                 )),
+    ItemNames.PROGRESSIVE_ORBITAL_COMMAND:
+        ItemData(207 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 26, SC2Race.TERRAN,
+                 quantity=2, classification=ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Allows Command Centers to use Scanner Sweep and Calldown: MULE abilities.
+                     Level 2: Orbital Command abilities work even in Planetary Fortress mode.
+                     """
+                 )),
+    ItemNames.MARINE_PROGRESSIVE_STIMPACK:
+        ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 0, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.MARINE, quantity=2,
+                 description=STIMPACK_SMALL_DESCRIPTION),
+    ItemNames.MARINE_COMBAT_SHIELD:
+        ItemData(209 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.MARINE,
+                 description="Increases Marine life by 10."),
+    ItemNames.MEDIC_ADVANCED_MEDIC_FACILITIES:
+        ItemData(210 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIC,
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Medics", "Barracks")),
+    ItemNames.MEDIC_STABILIZER_MEDPACKS:
+        ItemData(211 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.MEDIC,
+                 description="Increases Medic heal speed. Reduces the amount of energy required for each heal."),
+    ItemNames.FIREBAT_INCINERATOR_GAUNTLETS:
+        ItemData(212 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 12, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.FIREBAT,
+                 description="Increases Firebat's damage radius by 40%"),
+    ItemNames.FIREBAT_JUGGERNAUT_PLATING:
+        ItemData(213 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 13, SC2Race.TERRAN,
+                 parent_item=ItemNames.FIREBAT,
+                 description="Increases Firebat's armor by 2."),
+    ItemNames.MARAUDER_CONCUSSIVE_SHELLS:
+        ItemData(214 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 14, SC2Race.TERRAN,
+                 parent_item=ItemNames.MARAUDER,
+                 description="Marauder attack temporarily slows all units in target area."),
+    ItemNames.MARAUDER_KINETIC_FOAM:
+        ItemData(215 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15, SC2Race.TERRAN,
+                 parent_item=ItemNames.MARAUDER,
+                 description="Increases Marauder life by 25."),
+    ItemNames.REAPER_U238_ROUNDS:
+        ItemData(216 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16, SC2Race.TERRAN,
+                 parent_item=ItemNames.REAPER,
+                 description=inspect.cleandoc(
+                     """
+                     Increases Reaper pistol attack range by 1.
+                     Reaper pistols do additional 3 damage to Light Armor.
+                     """
+                 )),
+    ItemNames.REAPER_G4_CLUSTERBOMB:
+        ItemData(217 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.REAPER,
+                 description="Timed explosive that does heavy area damage."),
+    ItemNames.CYCLONE_MAG_FIELD_ACCELERATORS:
+        ItemData(218 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 18, SC2Race.TERRAN,
+                 parent_item=ItemNames.CYCLONE, origin={"ext"},
+                 description="Increases Cyclone Lock On damage"),
+    ItemNames.CYCLONE_MAG_FIELD_LAUNCHERS:
+        ItemData(219 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 19, SC2Race.TERRAN,
+                 parent_item=ItemNames.CYCLONE, origin={"ext"},
+                 description="Increases Cyclone attack range by 2."),
+    ItemNames.MARINE_LASER_TARGETING_SYSTEM:
+        ItemData(220 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MARINE, origin={"nco"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.MARINE_MAGRAIL_MUNITIONS:
+        ItemData(221 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 20, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.MARINE, origin={"nco"},
+                 description="Deals 20 damage to target unit. Autocast on attack with a cooldown."),
+    ItemNames.MARINE_OPTIMIZED_LOGISTICS:
+        ItemData(222 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 21, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MARINE, origin={"nco"},
+                 description="Increases Marine training speed."),
+    ItemNames.MEDIC_RESTORATION:
+        ItemData(223 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 22, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"},
+                 description="Removes negative status effects from target allied unit."),
+    ItemNames.MEDIC_OPTICAL_FLARE:
+        ItemData(224 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 23, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"},
+                 description="Reduces vision range of target enemy unit. Disables detection."),
+    ItemNames.MEDIC_RESOURCE_EFFICIENCY:
+        ItemData(225 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 24, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Medic")),
+    ItemNames.FIREBAT_PROGRESSIVE_STIMPACK:
+        ItemData(226 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 6, SC2Race.TERRAN,
+                 parent_item=ItemNames.FIREBAT, quantity=2, origin={"bw"},
+                 description=STIMPACK_LARGE_DESCRIPTION),
+    ItemNames.FIREBAT_RESOURCE_EFFICIENCY:
+        ItemData(227 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 25, SC2Race.TERRAN,
+                 parent_item=ItemNames.FIREBAT, origin={"bw"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Firebat")),
+    ItemNames.MARAUDER_PROGRESSIVE_STIMPACK:
+        ItemData(228 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 8, SC2Race.TERRAN,
+                 parent_item=ItemNames.MARAUDER, quantity=2, origin={"nco"},
+                 description=STIMPACK_LARGE_DESCRIPTION),
+    ItemNames.MARAUDER_LASER_TARGETING_SYSTEM:
+        ItemData(229 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 26, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.MARAUDER_MAGRAIL_MUNITIONS:
+        ItemData(230 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 27, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"},
+                 description="Deals 20 damage to target unit. Autocast on attack with a cooldown."),
+    ItemNames.MARAUDER_INTERNAL_TECH_MODULE:
+        ItemData(231 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 28, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Marauders", "Barracks")),
+    ItemNames.SCV_HOSTILE_ENVIRONMENT_ADAPTATION:
+        ItemData(232 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 29, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, origin={"bw"},
+                 description="Increases SCV life by 15 and attack speed slightly."),
+    ItemNames.MEDIC_ADAPTIVE_MEDPACKS:
+        ItemData(233 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.MEDIC, origin={"ext"},
+                 description="Allows Medics to heal mechanical and air units."),
+    ItemNames.MEDIC_NANO_PROJECTOR:
+        ItemData(234 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"ext"},
+                 description="Increases Medic heal range by 2."),
+    ItemNames.FIREBAT_INFERNAL_PRE_IGNITER:
+        ItemData(235 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, SC2Race.TERRAN,
+                 parent_item=ItemNames.FIREBAT, origin={"bw"},
+                 description="Firebats do an additional 4 damage to Light Armor."),
+    ItemNames.FIREBAT_KINETIC_FOAM:
+        ItemData(236 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3, SC2Race.TERRAN,
+                 parent_item=ItemNames.FIREBAT, origin={"ext"},
+                 description="Increases Firebat life by 100."),
+    ItemNames.FIREBAT_NANO_PROJECTORS:
+        ItemData(237 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4, SC2Race.TERRAN,
+                 parent_item=ItemNames.FIREBAT, origin={"ext"},
+                 description="Increases Firebat attack range by 2"),
+    ItemNames.MARAUDER_JUGGERNAUT_PLATING:
+        ItemData(238 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5, SC2Race.TERRAN,
+                 parent_item=ItemNames.MARAUDER, origin={"ext"},
+                 description="Increases Marauder's armor by 2."),
+    ItemNames.REAPER_JET_PACK_OVERDRIVE:
+        ItemData(239 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 6, SC2Race.TERRAN,
+                 parent_item=ItemNames.REAPER, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Allows the Reaper to fly for 10 seconds.
+                     While flying, the Reaper can attack air units.
+                     """
+                 )),
+    ItemNames.HELLION_INFERNAL_PLATING:
+        ItemData(240 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 7, SC2Race.TERRAN,
+                 parent_item=ItemNames.HELLION, origin={"ext"},
+                 description="Increases Hellion and Hellbat armor by 2."),
+    ItemNames.VULTURE_AUTO_REPAIR:
+        ItemData(241 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 8, SC2Race.TERRAN,
+                 parent_item=ItemNames.VULTURE, origin={"ext"},
+                 description="Vultures regenerate life."),
+    ItemNames.GOLIATH_SHAPED_HULL:
+        ItemData(242 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 9, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco", "ext"},
+                 description="Increases Goliath life by 25."),
+    ItemNames.GOLIATH_RESOURCE_EFFICIENCY:
+        ItemData(243 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 10, SC2Race.TERRAN,
+                 parent_item=ItemNames.GOLIATH, origin={"nco", "bw"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Goliath")),
+    ItemNames.GOLIATH_INTERNAL_TECH_MODULE:
+        ItemData(244 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 11, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco", "bw"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Goliaths", "Factory")),
+    ItemNames.SIEGE_TANK_SHAPED_HULL:
+        ItemData(245 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 12, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco", "ext"},
+                 description="Increases Siege Tank life by 25."),
+    ItemNames.SIEGE_TANK_RESOURCE_EFFICIENCY:
+        ItemData(246 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13, SC2Race.TERRAN,
+                 parent_item=ItemNames.SIEGE_TANK, origin={"bw"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Siege Tank")),
+    ItemNames.PREDATOR_CLOAK:
+        ItemData(247 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"},
+                 description=CLOAK_DESCRIPTION_TEMPLATE.format("Predators")),
+    ItemNames.PREDATOR_CHARGE:
+        ItemData(248 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"},
+                 description="Allows Predators to intercept enemy ground units."),
+    ItemNames.MEDIVAC_SCATTER_VEIL:
+        ItemData(249 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 16, SC2Race.TERRAN,
+                 parent_item=ItemNames.MEDIVAC, origin={"ext"},
+                 description="Medivacs get 100 shields."),
+    ItemNames.REAPER_PROGRESSIVE_STIMPACK:
+        ItemData(250 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 10, SC2Race.TERRAN,
+                 parent_item=ItemNames.REAPER, quantity=2, origin={"nco"},
+                 description=STIMPACK_SMALL_DESCRIPTION),
+    ItemNames.REAPER_LASER_TARGETING_SYSTEM:
+        ItemData(251 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"nco"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.REAPER_ADVANCED_CLOAKING_FIELD:
+        ItemData(252 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, SC2Race.TERRAN,
+                 parent_item=ItemNames.REAPER, origin={"nco"},
+                 description="Reapers are permanently cloaked."),
+    ItemNames.REAPER_SPIDER_MINES:
+        ItemData(253 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"nco"},
+                 important_for_filtering=True,
+                 description="Allows Reapers to lay Spider Mines. 3 charges per Reaper."),
+    ItemNames.REAPER_COMBAT_DRUGS:
+        ItemData(254 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 20, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"ext"},
+                 description="Reapers regenerate life while out of combat."),
+    ItemNames.HELLION_HELLBAT_ASPECT:
+        ItemData(255 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 21, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.HELLION, origin={"nco"},
+                 description="Allows Hellions to transform into Hellbats."),
+    ItemNames.HELLION_SMART_SERVOS:
+        ItemData(256 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 22, SC2Race.TERRAN,
+                 parent_item=ItemNames.HELLION, origin={"nco"},
+                 description="Transforms faster between modes. Hellions can attack while moving."),
+    ItemNames.HELLION_OPTIMIZED_LOGISTICS:
+        ItemData(257 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.HELLION, origin={"nco"},
+                 description="Increases Hellion training speed."),
+    ItemNames.HELLION_JUMP_JETS:
+        ItemData(258 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.HELLION, origin={"nco"},
+                 description=inspect.cleandoc(
+                     """
+                     Increases movement speed in Hellion mode.
+                     In Hellbat mode, launches the Hellbat toward enemy ground units and briefly stuns them.
+                     """
+                 )),
+    ItemNames.HELLION_PROGRESSIVE_STIMPACK:
+        ItemData(259 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 12, SC2Race.TERRAN,
+                 parent_item=ItemNames.HELLION, quantity=2, origin={"nco"},
+                 description=STIMPACK_LARGE_DESCRIPTION),
+    ItemNames.VULTURE_ION_THRUSTERS:
+        ItemData(260 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.VULTURE, origin={"bw"},
+                 description="Increases Vulture movement speed."),
+    ItemNames.VULTURE_AUTO_LAUNCHERS:
+        ItemData(261 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 26, SC2Race.TERRAN,
+                 parent_item=ItemNames.VULTURE, origin={"bw"},
+                 description="Allows Vultures to attack while moving."),
+    ItemNames.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION:
+        ItemData(262 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 27, SC2Race.TERRAN,
+                 origin={"bw"},
+                 description="Increases Spider mine damage."),
+    ItemNames.GOLIATH_JUMP_JETS:
+        ItemData(263 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 28, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.GOLIATH, origin={"nco"},
+                 description="Allows Goliaths to jump up and down cliffs."),
+    ItemNames.GOLIATH_OPTIMIZED_LOGISTICS:
+        ItemData(264 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 29, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco"},
+                 description="Increases Goliath training speed."),
+    ItemNames.DIAMONDBACK_HYPERFLUXOR:
+        ItemData(265 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 0, SC2Race.TERRAN,
+                 parent_item=ItemNames.DIAMONDBACK, origin={"ext"},
+                 description="Increases Diamondback attack speed."),
+    ItemNames.DIAMONDBACK_BURST_CAPACITORS:
+        ItemData(266 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.DIAMONDBACK, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     While not attacking, the Diamondback charges its weapon. 
+                     The next attack does 10 additional damage.
+                     """
+                 )),
+    ItemNames.DIAMONDBACK_RESOURCE_EFFICIENCY:
+        ItemData(267 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 2, SC2Race.TERRAN,
+                 parent_item=ItemNames.DIAMONDBACK, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Diamondback")),
+    ItemNames.SIEGE_TANK_JUMP_JETS:
+        ItemData(268 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 3, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, origin={"nco"},
+                 description=inspect.cleandoc(
+                     """
+                     Repositions Siege Tank to a target location. 
+                     Can be used in either mode and to jump up and down cliffs. 
+                     """
+                 )),
+    ItemNames.SIEGE_TANK_SPIDER_MINES:
+        ItemData(269 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 4, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"},
+                 important_for_filtering=True,
+                 description=inspect.cleandoc(
+                     """
+                     Allows Siege Tanks to lay Spider Mines. 
+                     Lays 3 Spider Mines at once. 3 charges
+                     """
+                 )),
+    ItemNames.SIEGE_TANK_SMART_SERVOS:
+        ItemData(270 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 5, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"},
+                 description=SMART_SERVOS_DESCRIPTION),
+    ItemNames.SIEGE_TANK_GRADUATING_RANGE:
+        ItemData(271 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 6, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Increases the Siege Tank's attack range by 1 every 3 seconds while in Siege Mode, 
+                     up to a maximum of 5 additional range.
+                     """
+                 )),
+    ItemNames.SIEGE_TANK_LASER_TARGETING_SYSTEM:
+        ItemData(272 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 7, SC2Race.TERRAN,
+                 parent_item=ItemNames.SIEGE_TANK, origin={"nco"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.SIEGE_TANK_ADVANCED_SIEGE_TECH:
+        ItemData(273 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 8, SC2Race.TERRAN,
+                 parent_item=ItemNames.SIEGE_TANK, origin={"ext"},
+                 description="Siege Tanks gain +3 armor in Siege Mode."),
+    ItemNames.SIEGE_TANK_INTERNAL_TECH_MODULE:
+        ItemData(274 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 9, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Siege Tanks", "Factory")),
+    ItemNames.PREDATOR_RESOURCE_EFFICIENCY:
+        ItemData(275 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 10, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"},
+                 description="Decreases Predator resource and supply cost."),
+    ItemNames.MEDIVAC_EXPANDED_HULL:
+        ItemData(276 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 11, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, origin={"ext"},
+                 description="Increases Medivac cargo space by 4."),
+    ItemNames.MEDIVAC_AFTERBURNERS:
+        ItemData(277 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 12, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, origin={"ext"},
+                 description="Ability. Temporarily increases the Medivac's movement speed by 70%."),
+    ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY:
+        ItemData(278 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 13, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.WRAITH, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Burst Lasers do more damage and can hit both ground and air targets.
+                     Replaces Gemini Missiles weapon.
+                     """
+                 )),
+    ItemNames.VIKING_SMART_SERVOS:
+        ItemData(279 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 14, SC2Race.TERRAN,
+                 parent_item=ItemNames.VIKING, origin={"ext"},
+                 description=SMART_SERVOS_DESCRIPTION),
+    ItemNames.VIKING_ANTI_MECHANICAL_MUNITION:
+        ItemData(280 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 15, SC2Race.TERRAN,
+                 parent_item=ItemNames.VIKING, origin={"ext"},
+                 description="Increases Viking damage to mechanical units while in Assault Mode."),
+    ItemNames.DIAMONDBACK_ION_THRUSTERS:
+        ItemData(281 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 21, SC2Race.TERRAN,
+                 parent_item=ItemNames.DIAMONDBACK, origin={"ext"},
+                 description="Increases Diamondback movement speed."),
+    ItemNames.WARHOUND_RESOURCE_EFFICIENCY:
+        ItemData(282 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 13, SC2Race.TERRAN,
+                 parent_item=ItemNames.WARHOUND, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Warhound")),
+    ItemNames.WARHOUND_REINFORCED_PLATING:
+        ItemData(283 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 14, SC2Race.TERRAN,
+                 parent_item=ItemNames.WARHOUND, origin={"ext"},
+                 description="Increases Warhound armor by 2."),
+    ItemNames.HERC_RESOURCE_EFFICIENCY:
+        ItemData(284 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 15, SC2Race.TERRAN,
+                 parent_item=ItemNames.HERC, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("HERC")),
+    ItemNames.HERC_JUGGERNAUT_PLATING:
+        ItemData(285 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 16, SC2Race.TERRAN,
+                 parent_item=ItemNames.WARHOUND, origin={"ext"},
+                 description="Increases HERC armor by 2."),
+    ItemNames.HERC_KINETIC_FOAM:
+        ItemData(286 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 17, SC2Race.TERRAN,
+                 parent_item=ItemNames.WARHOUND, origin={"ext"},
+                 description="Increases HERC life by 50."),
+
+    ItemNames.HELLION_TWIN_LINKED_FLAMETHROWER:
+        ItemData(300 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 16, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.HELLION,
+                 description="Doubles the width of the Hellion's flame attack."),
+    ItemNames.HELLION_THERMITE_FILAMENTS:
+        ItemData(301 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 17, SC2Race.TERRAN,
+                 parent_item=ItemNames.HELLION,
+                 description="Hellions do an additional 10 damage to Light Armor."),
+    ItemNames.SPIDER_MINE_CERBERUS_MINE:
+        ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 18, SC2Race.TERRAN,
+                 classification=ItemClassification.filler,
+                 description="Increases trigger and blast radius of Spider Mines."),
+    ItemNames.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE:
+        ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 16, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.VULTURE, quantity=2,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Allows Vultures to replace used Spider Mines. Costs 15 minerals.
+                     Level 2: Replacing used Spider Mines no longer costs minerals.
+                     """
+                 )),
+    ItemNames.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM:
+        ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 19, SC2Race.TERRAN,
+                 parent_item=ItemNames.GOLIATH,
+                 description="Goliaths can attack both ground and air targets simultaneously."),
+    ItemNames.GOLIATH_ARES_CLASS_TARGETING_SYSTEM:
+        ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 20, SC2Race.TERRAN,
+                 parent_item=ItemNames.GOLIATH,
+                 description="Increases Goliath ground attack range by 1 and air by 3."),
+    ItemNames.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL:
+        ItemData(306 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 4, SC2Race.TERRAN,
+                 parent_item=ItemNames.DIAMONDBACK, quantity=2,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Tri-Lithium Power Cell: Increases Diamondback attack range by 1.
+                     Level 2: Tungsten Spikes: Increases Diamondback attack range by 3.
+                     """
+                 )),
+    ItemNames.DIAMONDBACK_SHAPED_HULL:
+        ItemData(307 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 22, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.DIAMONDBACK,
+                 description="Increases Diamondback life by 50."),
+    ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS:
+        ItemData(308 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 23, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK,
+                 description="Siege Tanks do an additional 40 damage to the primary target in Siege Mode."),
+    ItemNames.SIEGE_TANK_SHAPED_BLAST:
+        ItemData(309 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 24, SC2Race.TERRAN,
+                 parent_item=ItemNames.SIEGE_TANK,
+                 description="Reduces splash damage to friendly targets while in Siege Mode by 75%."),
+    ItemNames.MEDIVAC_RAPID_DEPLOYMENT_TUBE:
+        ItemData(310 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 25, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC,
+                 description="Medivacs deploy loaded troops almost instantly."),
+    ItemNames.MEDIVAC_ADVANCED_HEALING_AI:
+        ItemData(311 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 26, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC,
+                 description="Medivacs can heal two targets at once."),
+    ItemNames.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS:
+        ItemData(312 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 18, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, quantity=2,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Tomahawk Power Cells: Increases Wraith starting energy by 100.
+                     Level 2: Unregistered Cloaking Module: Wraiths do not require energy to cloak and remain cloaked.
+                     """
+                 )),
+    ItemNames.WRAITH_DISPLACEMENT_FIELD:
+        ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 27, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.WRAITH,
+                 description="Wraiths evade 20% of incoming attacks while cloaked."),
+    ItemNames.VIKING_RIPWAVE_MISSILES:
+        ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 28, SC2Race.TERRAN,
+                 parent_item=ItemNames.VIKING,
+                 description="Vikings do area damage while in Fighter Mode"),
+    ItemNames.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM:
+        ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 29, SC2Race.TERRAN,
+                 parent_item=ItemNames.VIKING,
+                 description="Increases Viking attack range by 1 in Assault mode and 2 in Fighter mode."),
+    ItemNames.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS:
+        ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 2, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, quantity=2,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Banshees can remain cloaked twice as long.
+                     Level 2: Banshees do not require energy to cloak and remain cloaked.
+                     """
+                 )),
+    ItemNames.BANSHEE_SHOCKWAVE_MISSILE_BATTERY:
+        ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 0, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.BANSHEE,
+                 description="Banshees do area damage in a straight line."),
+    ItemNames.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS:
+        ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 2, SC2Race.TERRAN,
+                 parent_item=ItemNames.BATTLECRUISER, quantity=2,
+                 description="Spell. Missile Pods do damage to air targets in a target area."),
+    ItemNames.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX:
+        ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 20, SC2Race.TERRAN,
+                 parent_item=ItemNames.BATTLECRUISER, quantity=2,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Spell. For 20 seconds the Battlecruiser gains a shield that can absorb up to 200 damage.
+                     Level 2: Passive. Battlecruiser gets 200 shields.
+                     """
+                 )),
+    ItemNames.GHOST_OCULAR_IMPLANTS:
+        ItemData(320 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 2, SC2Race.TERRAN,
+                 parent_item=ItemNames.GHOST,
+                 description="Increases Ghost sight range by 3 and attack range by 2."),
+    ItemNames.GHOST_CRIUS_SUIT:
+        ItemData(321 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 3, SC2Race.TERRAN,
+                 parent_item=ItemNames.GHOST,
+                 description="Cloak no longer requires energy to activate or maintain."),
+    ItemNames.SPECTRE_PSIONIC_LASH:
+        ItemData(322 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 4, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.SPECTRE,
+                 description="Spell. Deals 200 damage to a single target."),
+    ItemNames.SPECTRE_NYX_CLASS_CLOAKING_MODULE:
+        ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 5, SC2Race.TERRAN,
+                 parent_item=ItemNames.SPECTRE,
+                 description="Cloak no longer requires energy to activate or maintain."),
+    ItemNames.THOR_330MM_BARRAGE_CANNON:
+        ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 6, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.THOR,
+                 description=inspect.cleandoc(
+                     """
+                     Improves 250mm Strike Cannons ability to deal area damage and stun units in a small area.
+                     Can be also freely aimed on ground.
+                     """
+                 )),
+    ItemNames.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL:
+        ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 22, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.THOR, quantity=2,
+                 description=inspect.cleandoc("""
+                 Level 1: Allows destroyed Thors to be reconstructed on the field. Costs Vespene Gas.
+                 Level 2: Thors are automatically reconstructed after falling for free.
+                 """
+        )),
+    ItemNames.LIBERATOR_ADVANCED_BALLISTICS:
+        ItemData(326 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 7, SC2Race.TERRAN,
+                 parent_item=ItemNames.LIBERATOR, origin={"ext"},
+                 description="Increases Liberator range by 3 in Defender Mode."),
+    ItemNames.LIBERATOR_RAID_ARTILLERY:
+        ItemData(327 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 8, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.LIBERATOR, origin={"nco"},
+                 description="Allows Liberators to attack structures while in Defender Mode."),
+    ItemNames.WIDOW_MINE_DRILLING_CLAWS:
+        ItemData(328 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 9, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.WIDOW_MINE, origin={"ext"},
+                 description="Allows Widow Mines to burrow and unburrow faster."),
+    ItemNames.WIDOW_MINE_CONCEALMENT:
+        ItemData(329 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 10, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.WIDOW_MINE, origin={"ext"},
+                 description="Burrowed Widow Mines are no longer revealed when the Sentinel Missile is on cooldown."),
+    ItemNames.MEDIVAC_ADVANCED_CLOAKING_FIELD:
+        ItemData(330 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 11, SC2Race.TERRAN,
+                 parent_item=ItemNames.MEDIVAC, origin={"ext"},
+                 description="Medivacs are permanently cloaked."),
+    ItemNames.WRAITH_TRIGGER_OVERRIDE:
+        ItemData(331 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 12, SC2Race.TERRAN,
+                 parent_item=ItemNames.WRAITH, origin={"ext"},
+                 description="Wraith attack speed increases by 10% with each attack, up to a maximum of 100%."),
+    ItemNames.WRAITH_INTERNAL_TECH_MODULE:
+        ItemData(332 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 13, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, origin={"bw"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Wraiths", "Starport")),
+    ItemNames.WRAITH_RESOURCE_EFFICIENCY:
+        ItemData(333 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 14, SC2Race.TERRAN,
+                 parent_item=ItemNames.WRAITH, origin={"bw"},
+                 description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Wraith")),
+    ItemNames.VIKING_SHREDDER_ROUNDS:
+        ItemData(334 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 15, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.VIKING, origin={"ext"},
+                 description="Attacks in Assault mode do line splash damage."),
+    ItemNames.VIKING_WILD_MISSILES:
+        ItemData(335 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 16, SC2Race.TERRAN,
+                 parent_item=ItemNames.VIKING, origin={"ext"},
+                 description="Launches 5 rockets at the target unit. Each rocket does 25 (40 vs armored) damage."),
+    ItemNames.BANSHEE_SHAPED_HULL:
+        ItemData(336 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 17, SC2Race.TERRAN,
+                 parent_item=ItemNames.BANSHEE, origin={"ext"},
+                 description="Increases Banshee life by 100."),
+    ItemNames.BANSHEE_ADVANCED_TARGETING_OPTICS:
+        ItemData(337 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 18, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.BANSHEE, origin={"ext"},
+                 description="Increases Banshee attack range by 2 while cloaked."),
+    ItemNames.BANSHEE_DISTORTION_BLASTERS:
+        ItemData(338 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 19, SC2Race.TERRAN,
+                 parent_item=ItemNames.BANSHEE, origin={"ext"},
+                 description="Increases Banshee attack damage by 25% while cloaked."),
+    ItemNames.BANSHEE_ROCKET_BARRAGE:
+        ItemData(339 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 20, SC2Race.TERRAN,
+                 parent_item=ItemNames.BANSHEE, origin={"ext"},
+                 description="Deals 75 damage to enemy ground units in the target area."),
+    ItemNames.GHOST_RESOURCE_EFFICIENCY:
+        ItemData(340 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 21, SC2Race.TERRAN,
+                 parent_item=ItemNames.GHOST, origin={"bw"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Ghost")),
+    ItemNames.SPECTRE_RESOURCE_EFFICIENCY:
+        ItemData(341 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 22, SC2Race.TERRAN,
+                 parent_item=ItemNames.SPECTRE, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Spectre")),
+    ItemNames.THOR_BUTTON_WITH_A_SKULL_ON_IT:
+        ItemData(342 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 23, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.THOR, origin={"ext"},
+                 description="Allows Thors to launch nukes."),
+    ItemNames.THOR_LASER_TARGETING_SYSTEM:
+        ItemData(343 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 24, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.THOR, origin={"ext"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.THOR_LARGE_SCALE_FIELD_CONSTRUCTION:
+        ItemData(344 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 25, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.THOR, origin={"ext"},
+                 description="Allows Thors to be built by SCVs like a structure."),
+    ItemNames.RAVEN_RESOURCE_EFFICIENCY:
+        ItemData(345 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 26, SC2Race.TERRAN,
+                 parent_item=ItemNames.RAVEN, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Raven")),
+    ItemNames.RAVEN_DURABLE_MATERIALS:
+        ItemData(346 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 27, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"ext"},
+                 description="Extends timed life duration of Raven's summoned objects."),
+    ItemNames.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR:
+        ItemData(347 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 28, SC2Race.TERRAN,
+                 parent_item=ItemNames.SCIENCE_VESSEL, origin={"ext"},
+                 description="Nano-Repair no longer requires energy to use."),
+    ItemNames.SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS:
+        ItemData(348 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 29, SC2Race.TERRAN,
+                 parent_item=ItemNames.SCIENCE_VESSEL, origin={"ext"},
+                 description="Science Vessel can use Nano-Repair at two targets at once."),
+    ItemNames.CYCLONE_RESOURCE_EFFICIENCY:
+        ItemData(349 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 0, SC2Race.TERRAN,
+                 parent_item=ItemNames.CYCLONE, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Cyclone")),
+    ItemNames.BANSHEE_HYPERFLIGHT_ROTORS:
+        ItemData(350 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"ext"},
+                 description="Increases Banshee movement speed."),
+    ItemNames.BANSHEE_LASER_TARGETING_SYSTEM:
+        ItemData(351 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 2, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"nco"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.BANSHEE_INTERNAL_TECH_MODULE:
+        ItemData(352 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 3, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"nco"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Banshees", "Starport")),
+    ItemNames.BATTLECRUISER_TACTICAL_JUMP:
+        ItemData(353 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 4, SC2Race.TERRAN,
+                 parent_item=ItemNames.BATTLECRUISER, origin={"nco", "ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Allows Battlecruisers to warp to a target location anywhere on the map.
+                     """
+                 )),
+    ItemNames.BATTLECRUISER_CLOAK:
+        ItemData(354 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 5, SC2Race.TERRAN,
+                 parent_item=ItemNames.BATTLECRUISER, origin={"nco"},
+                 description=CLOAK_DESCRIPTION_TEMPLATE.format("Battlecruisers")),
+    ItemNames.BATTLECRUISER_ATX_LASER_BATTERY:
+        ItemData(355 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 6, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.BATTLECRUISER, origin={"nco"},
+                 description=inspect.cleandoc(
+                     """
+                     Battlecruisers can attack while moving, 
+                     do the same damage to both ground and air targets, and fire faster.
+                     """
+                 )),
+    ItemNames.BATTLECRUISER_OPTIMIZED_LOGISTICS:
+        ItemData(356 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 7, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.BATTLECRUISER, origin={"ext"},
+                 description="Increases Battlecruiser training speed."),
+    ItemNames.BATTLECRUISER_INTERNAL_TECH_MODULE:
+        ItemData(357 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 8, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.BATTLECRUISER, origin={"nco"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Battlecruisers", "Starport")),
+    ItemNames.GHOST_EMP_ROUNDS:
+        ItemData(358 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 9, SC2Race.TERRAN,
+                 parent_item=ItemNames.GHOST, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Spell. Does 100 damage to shields and drains all energy from units in the targeted area. 
+                     Cloaked units hit by EMP are revealed for a short time.
+                     """
+                 )),
+    ItemNames.GHOST_LOCKDOWN:
+        ItemData(359 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 10, SC2Race.TERRAN,
+                 parent_item=ItemNames.GHOST, origin={"bw"},
+                 description="Spell. Stuns a target mechanical unit for a long time."),
+    ItemNames.SPECTRE_IMPALER_ROUNDS:
+        ItemData(360 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 11, SC2Race.TERRAN,
+                 parent_item=ItemNames.SPECTRE, origin={"ext"},
+                 description="Spectres do additional damage to armored targets."),
+    ItemNames.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD:
+        ItemData(361 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 14, SC2Race.TERRAN,
+                 parent_item=ItemNames.THOR, quantity=2, origin={"ext"},
+                 description=inspect.cleandoc(
+                     f"""
+                     Level 1: Allows Thors to transform in order to use an alternative air attack.
+                     Level 2: {SMART_SERVOS_DESCRIPTION}
+                     """
+                 )),
+    ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE:
+        ItemData(363 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 12, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.RAVEN, origin={"nco"},
+                 description="Spell. Deploys a drone that can heal biological or mechanical units."),
+    ItemNames.RAVEN_SPIDER_MINES:
+        ItemData(364 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 13, SC2Race.TERRAN,
+                 parent_item=ItemNames.RAVEN, origin={"nco"}, important_for_filtering=True,
+                 description="Spell. Deploys 3 Spider Mines to a target location."),
+    ItemNames.RAVEN_RAILGUN_TURRET:
+        ItemData(365 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 14, SC2Race.TERRAN,
+                 parent_item=ItemNames.RAVEN, origin={"nco"},
+                 description=inspect.cleandoc(
+                     """
+                     Spell. Allows Ravens to deploy an advanced Auto-Turret, 
+                     that can attack enemy ground units in a straight line.
+                     """
+                 )),
+    ItemNames.RAVEN_HUNTER_SEEKER_WEAPON:
+        ItemData(366 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 15, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, parent_item=ItemNames.RAVEN, origin={"nco"},
+                 description="Allows Ravens to attack with a Hunter-Seeker weapon."),
+    ItemNames.RAVEN_INTERFERENCE_MATRIX:
+        ItemData(367 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 16, SC2Race.TERRAN,
+                 parent_item=ItemNames.RAVEN, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Spell. Target enemy Mechanical or Psionic unit can't attack or use abilities for a short duration.
+                     """
+                 )),
+    ItemNames.RAVEN_ANTI_ARMOR_MISSILE:
+        ItemData(368 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 17, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"ext"},
+                 description="Spell. Decreases target and nearby enemy units armor by 2."),
+    ItemNames.RAVEN_INTERNAL_TECH_MODULE:
+        ItemData(369 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 18, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"nco"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Ravens", "Starport")),
+    ItemNames.SCIENCE_VESSEL_EMP_SHOCKWAVE:
+        ItemData(370 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 19, SC2Race.TERRAN,
+                 parent_item=ItemNames.SCIENCE_VESSEL, origin={"bw"},
+                 description="Spell. Depletes all energy and shields of all units in a target area."),
+    ItemNames.SCIENCE_VESSEL_DEFENSIVE_MATRIX:
+        ItemData(371 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 20, SC2Race.TERRAN,
+                 parent_item=ItemNames.SCIENCE_VESSEL, origin={"bw"},
+                 description=inspect.cleandoc(
+                     """
+                     Spell. Provides a target unit with a defensive barrier that can absorb up to 250 damage
+                     """
+                 )),
+    ItemNames.CYCLONE_TARGETING_OPTICS:
+        ItemData(372 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 21, SC2Race.TERRAN,
+                 parent_item=ItemNames.CYCLONE, origin={"ext"},
+                 description="Increases Cyclone Lock On casting range and the range while Locked On."),
+    ItemNames.CYCLONE_RAPID_FIRE_LAUNCHERS:
+        ItemData(373 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 22, SC2Race.TERRAN,
+                 parent_item=ItemNames.CYCLONE, origin={"ext"},
+                 description="The first 12 shots of Lock On are fired more quickly."),
+    ItemNames.LIBERATOR_CLOAK:
+        ItemData(374 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 23, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"},
+                 description=CLOAK_DESCRIPTION_TEMPLATE.format("Liberators")),
+    ItemNames.LIBERATOR_LASER_TARGETING_SYSTEM:
+        ItemData(375 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 24, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"ext"},
+                 description=LASER_TARGETING_SYSTEMS_DESCRIPTION),
+    ItemNames.LIBERATOR_OPTIMIZED_LOGISTICS:
+        ItemData(376 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 25, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"},
+                 description="Increases Liberator training speed."),
+    ItemNames.WIDOW_MINE_BLACK_MARKET_LAUNCHERS:
+        ItemData(377 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 26, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.WIDOW_MINE, origin={"ext"},
+                 description="Increases Widow Mine Sentinel Missile range."),
+    ItemNames.WIDOW_MINE_EXECUTIONER_MISSILES:
+        ItemData(378 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 27, SC2Race.TERRAN,
+                 parent_item=ItemNames.WIDOW_MINE, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Reduces Sentinel Missile cooldown.
+                     When killed, Widow Mines will launch several missiles at random enemy targets.
+                     """
+                 )),
+    ItemNames.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS:
+        ItemData(379 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 28,
+                 SC2Race.TERRAN, parent_item=ItemNames.VALKYRIE, origin={"ext"},
+                 description="Valkyries fire 2 additional rockets each volley."),
+    ItemNames.VALKYRIE_SHAPED_HULL:
+        ItemData(380 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 29, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"},
+                 description="Increases Valkyrie life by 50."),
+    ItemNames.VALKYRIE_FLECHETTE_MISSILES:
+        ItemData(381 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 0, SC2Race.TERRAN,
+                 parent_item=ItemNames.VALKYRIE, origin={"ext"},
+                 description="Equips Valkyries with Air-to-Surface missiles to attack ground units."),
+    ItemNames.VALKYRIE_AFTERBURNERS:
+        ItemData(382 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"},
+                 description="Ability. Temporarily increases the Valkyries's movement speed by 70%."),
+    ItemNames.CYCLONE_INTERNAL_TECH_MODULE:
+        ItemData(383 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 2, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.CYCLONE, origin={"ext"},
+                 description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Cyclones", "Factory")),
+    ItemNames.LIBERATOR_SMART_SERVOS:
+        ItemData(384 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 3, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"},
+                 description=SMART_SERVOS_DESCRIPTION),
+    ItemNames.LIBERATOR_RESOURCE_EFFICIENCY:
+        ItemData(385 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 4, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Liberator")),
+    ItemNames.HERCULES_INTERNAL_FUSION_MODULE:
+        ItemData(386 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 5, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.HERCULES, origin={"ext"},
+                 description="Hercules can be trained from a Starport without having a Fusion Core."),
+    ItemNames.HERCULES_TACTICAL_JUMP:
+        ItemData(387 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 6, SC2Race.TERRAN,
+                 parent_item=ItemNames.HERCULES, origin={"ext"},
+                 description=inspect.cleandoc(
+                     """
+                     Allows Hercules to warp to a target location anywhere on the map.
+                     """
+                 )),
+    ItemNames.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS:
+        ItemData(388 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 28, SC2Race.TERRAN,
+                 parent_item=ItemNames.PLANETARY_FORTRESS, origin={"ext"}, quantity=2,
+                 description=inspect.cleandoc(
+                    """
+                    Level 1: Lift Off - Planetary Fortress can lift off.
+                    Level 2: Armament Stabilizers - Planetary Fortress can attack while lifted off.
+                    """
+                 )),
+    ItemNames.PLANETARY_FORTRESS_ADVANCED_TARGETING:
+        ItemData(389 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 7, SC2Race.TERRAN,
+                 parent_item=ItemNames.PLANETARY_FORTRESS, origin={"ext"},
+                 description="Planetary Fortress can attack air units."),
+    ItemNames.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR:
+        ItemData(390 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 8, SC2Race.TERRAN,
+                 classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"},
+                 description="Allows Valkyries to shoot air while moving."),
+    ItemNames.VALKYRIE_RESOURCE_EFFICIENCY:
+        ItemData(391 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 9, SC2Race.TERRAN,
+                 parent_item=ItemNames.VALKYRIE, origin={"ext"},
+                 description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Valkyrie")),
+    ItemNames.PREDATOR_PREDATOR_S_FURY:
+        ItemData(392 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 10, SC2Race.TERRAN,
+                 parent_item=ItemNames.PREDATOR, origin={"ext"},
+                 description="Predators can use an attack that jumps between targets."),
+    ItemNames.BATTLECRUISER_BEHEMOTH_PLATING:
+        ItemData(393 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 11, SC2Race.TERRAN,
+                 parent_item=ItemNames.BATTLECRUISER, origin={"ext"},
+                 description="Increases Battlecruiser armor by 2."),
+    ItemNames.BATTLECRUISER_COVERT_OPS_ENGINES:
+        ItemData(394 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 12, SC2Race.TERRAN,
+                 parent_item=ItemNames.BATTLECRUISER, origin={"nco"},
+                 description="Increases Battlecruiser movement speed."),
+
+    #Buildings
+    ItemNames.BUNKER:
+        ItemData(400 + SC2WOL_ITEM_ID_OFFSET, "Building", 0, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Defensive structure. Able to load infantry units, giving them +1 range to their attacks."),
+    ItemNames.MISSILE_TURRET:
+        ItemData(401 + SC2WOL_ITEM_ID_OFFSET, "Building", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Anti-air defensive structure."),
+    ItemNames.SENSOR_TOWER:
+        ItemData(402 + SC2WOL_ITEM_ID_OFFSET, "Building", 2, SC2Race.TERRAN,
+                 description="Reveals locations of enemy units at long range."),
+
+    ItemNames.WAR_PIGS:
+        ItemData(500 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 0, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Mercenary Marines"),
+    ItemNames.DEVIL_DOGS:
+        ItemData(501 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 1, SC2Race.TERRAN,
+                 classification=ItemClassification.filler,
+                 description="Mercenary Firebats"),
+    ItemNames.HAMMER_SECURITIES:
+        ItemData(502 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 2, SC2Race.TERRAN,
+                 description="Mercenary Marauders"),
+    ItemNames.SPARTAN_COMPANY:
+        ItemData(503 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 3, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Mercenary Goliaths"),
+    ItemNames.SIEGE_BREAKERS:
+        ItemData(504 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 4, SC2Race.TERRAN,
+                 description="Mercenary Siege Tanks"),
+    ItemNames.HELS_ANGELS:
+        ItemData(505 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 5, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Mercenary Vikings"),
+    ItemNames.DUSK_WINGS:
+        ItemData(506 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 6, SC2Race.TERRAN,
+                 description="Mercenary Banshees"),
+    ItemNames.JACKSONS_REVENGE:
+        ItemData(507 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 7, SC2Race.TERRAN,
+                 description="Mercenary Battlecruiser"),
+    ItemNames.SKIBIS_ANGELS:
+        ItemData(508 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 8, SC2Race.TERRAN,
+                 origin={"ext"},
+                 description="Mercenary Medics"),
+    ItemNames.DEATH_HEADS:
+        ItemData(509 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 9, SC2Race.TERRAN,
+                 origin={"ext"},
+                 description="Mercenary Reapers"),
+    ItemNames.WINGED_NIGHTMARES:
+        ItemData(510 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 10, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Mercenary Wraiths"),
+    ItemNames.MIDNIGHT_RIDERS:
+        ItemData(511 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 11, SC2Race.TERRAN,
+                 origin={"ext"},
+                 description="Mercenary Liberators"),
+    ItemNames.BRYNHILDS:
+        ItemData(512 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 12, SC2Race.TERRAN,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Mercenary Valkyries"),
+    ItemNames.JOTUN:
+        ItemData(513 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 13, SC2Race.TERRAN,
+                 origin={"ext"},
+                 description="Mercenary Thor"),
+
+    ItemNames.ULTRA_CAPACITORS:
+        ItemData(600 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 0, SC2Race.TERRAN,
+                 description="Increases attack speed of units by 5% per weapon upgrade."),
+    ItemNames.VANADIUM_PLATING:
+        ItemData(601 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 1, SC2Race.TERRAN,
+                 description="Increases the life of units by 5% per armor upgrade."),
+    ItemNames.ORBITAL_DEPOTS:
+        ItemData(602 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 2, SC2Race.TERRAN,
+                 description="Supply depots are built instantly."),
+    ItemNames.MICRO_FILTERING:
+        ItemData(603 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 3, SC2Race.TERRAN,
+                 description="Refineries produce Vespene gas 25% faster."),
+    ItemNames.AUTOMATED_REFINERY:
+        ItemData(604 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 4, SC2Race.TERRAN,
+                 description="Eliminates the need for SCVs in vespene gas production."),
+    ItemNames.COMMAND_CENTER_REACTOR:
+        ItemData(605 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 5, SC2Race.TERRAN,
+                 description="Command Centers can train two SCVs at once."),
+    ItemNames.RAVEN:
+        ItemData(606 + SC2WOL_ITEM_ID_OFFSET, "Unit", 22, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Aerial Caster unit."),
+    ItemNames.SCIENCE_VESSEL:
+        ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Unit", 23, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Aerial Caster unit. Can repair mechanical units."),
+    ItemNames.TECH_REACTOR:
+        ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 6, SC2Race.TERRAN,
+                 description="Merges Tech Labs and Reactors into one add on structure to provide both functions."),
+    ItemNames.ORBITAL_STRIKE:
+        ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, SC2Race.TERRAN,
+                 description="Trained units from Barracks are instantly deployed on rally point."),
+    ItemNames.BUNKER_SHRIKE_TURRET:
+        ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6, SC2Race.TERRAN,
+                 parent_item=ItemNames.BUNKER,
+                 description="Adds an automated turret to Bunkers."),
+    ItemNames.BUNKER_FORTIFIED_BUNKER:
+        ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7, SC2Race.TERRAN,
+                 parent_item=ItemNames.BUNKER,
+                 description="Bunkers have more life."),
+    ItemNames.PLANETARY_FORTRESS:
+        ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Building", 3, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Allows Command Centers to upgrade into a defensive structure with a turret and additional armor.
+                     Planetary Fortresses cannot Lift Off, or cast Orbital Command spells.
+                     """
+                 )),
+    ItemNames.PERDITION_TURRET:
+        ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Building", 4, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Automated defensive turret. Burrows down while no enemies are nearby."),
+    ItemNames.PREDATOR:
+        ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Unit", 24, SC2Race.TERRAN,
+                 classification=ItemClassification.filler,
+                 description="Anti-infantry specialist that deals area damage with each attack."),
+    ItemNames.HERCULES:
+        ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Unit", 25, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Massive transport ship."),
+    ItemNames.CELLULAR_REACTOR:
+        ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8, SC2Race.TERRAN,
+                 description="All Terran spellcasters get +100 starting and maximum energy."),
+    ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL:
+        ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 4, SC2Race.TERRAN, quantity=3,
+                 classification= ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Allows Terran mechanical units to regenerate health while not in combat.
+                     Each level increases life regeneration speed.
+                     """
+                 )),
+    ItemNames.HIVE_MIND_EMULATOR:
+        ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Building", 5, SC2Race.TERRAN,
+                 ItemClassification.progression,
+                 description="Defensive structure. Can permanently Mind Control Zerg units."),
+    ItemNames.PSI_DISRUPTER:
+        ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Building", 6, SC2Race.TERRAN,
+                 classification=ItemClassification.progression,
+                 description="Defensive structure. Slows the attack and movement speeds of all nearby Zerg units."),
+    ItemNames.STRUCTURE_ARMOR:
+        ItemData(620 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9, SC2Race.TERRAN,
+                 description="Increases armor of all Terran structures by 2."),
+    ItemNames.HI_SEC_AUTO_TRACKING:
+        ItemData(621 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, SC2Race.TERRAN,
+                 description="Increases attack range of all Terran structures by 1."),
+    ItemNames.ADVANCED_OPTICS:
+        ItemData(622 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, SC2Race.TERRAN,
+                 description="Increases attack range of all Terran mechanical units by 1."),
+    ItemNames.ROGUE_FORCES:
+        ItemData(623 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12, SC2Race.TERRAN,
+                 description="Mercenary calldowns are no longer limited by charges."),
+
+    ItemNames.ZEALOT:
+        ItemData(700 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Powerful melee warrior. Can use the charge ability."),
+    ItemNames.STALKER: 
+        ItemData(701 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Ranged attack strider. Can use the Blink ability."),
+    ItemNames.HIGH_TEMPLAR: 
+        ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Potent psionic master. Can use the Feedback and Psionic Storm abilities. Can merge into an Archon."),             
+    ItemNames.DARK_TEMPLAR: 
+        ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Deadly warrior-assassin. Permanently cloaked. Can use the Shadow Fury ability."),
+    ItemNames.IMMORTAL: 
+        ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Assault strider. Can use Barrier to absorb damage."),
+    ItemNames.COLOSSUS:
+        ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Battle strider with a powerful area attack. Can walk up and down cliffs. Attacks set fire to the ground, dealing extra damage to enemies over time."),
+    ItemNames.PHOENIX:
+        ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities."),
+    ItemNames.VOID_RAY:
+        ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Surgical strike craft. Has the Prismatic Alignment and Prismatic Range abilities."),
+    ItemNames.CARRIER:
+        ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"wol", "lotv"},
+                 description="Capital ship. Builds and launches Interceptors that attack enemy targets. Repair Drones heal nearby mechanical units."),
+
+    # Filler items to fill remaining spots
+    ItemNames.STARTING_MINERALS:
+        ItemData(800 + SC2WOL_ITEM_ID_OFFSET, "Minerals", 15, SC2Race.ANY, quantity=0,
+                 classification=ItemClassification.filler,
+                 description="Increases the starting minerals for all missions."),
+    ItemNames.STARTING_VESPENE:
+        ItemData(801 + SC2WOL_ITEM_ID_OFFSET, "Vespene", 15, SC2Race.ANY, quantity=0,
+                 classification=ItemClassification.filler,
+                 description="Increases the starting vespene for all missions."),
+    ItemNames.STARTING_SUPPLY:
+        ItemData(802 + SC2WOL_ITEM_ID_OFFSET, "Supply", 2, SC2Race.ANY, quantity=0,
+                 classification=ItemClassification.filler,
+                 description="Increases the starting supply for all missions."),
+    # This item is used to "remove" location from the game. Never placed unless plando'd
+    ItemNames.NOTHING:
+        ItemData(803 + SC2WOL_ITEM_ID_OFFSET, "Nothing Group", 2, SC2Race.ANY, quantity=0,
+                 classification=ItemClassification.trap,
+                 description="Does nothing. Used to remove a location from the game."),
+
+    # Nova gear
+    ItemNames.NOVA_GHOST_VISOR:
+        ItemData(900 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 0, SC2Race.TERRAN, origin={"nco"},
+                 description="Reveals the locations of enemy units in the fog of war around Nova. Can detect cloaked units."),
+    ItemNames.NOVA_RANGEFINDER_OCULUS:
+        ItemData(901 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 1, SC2Race.TERRAN, origin={"nco"},
+                 description="Increaases Nova's vision range and non-melee weapon attack range by 2. Also increases range of melee weapons by 1."),
+    ItemNames.NOVA_DOMINATION:
+        ItemData(902 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 2, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to mind-control a target enemy unit."),
+    ItemNames.NOVA_BLINK:
+        ItemData(903 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 3, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to teleport a short distance and cloak for 10s."),
+    ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE:
+        ItemData(904 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 0, SC2Race.TERRAN, quantity=2, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description=inspect.cleandoc(
+                     """
+                     Level 1: Gives Nova the ability to cloak.
+                     Level 2: Nova is permanently cloaked.
+                     """
+                 )),
+    ItemNames.NOVA_ENERGY_SUIT_MODULE:
+        ItemData(905 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 4, SC2Race.TERRAN, origin={"nco"},
+                 description="Increases Nova's maximum energy and energy regeneration rate."),
+    ItemNames.NOVA_ARMORED_SUIT_MODULE:
+        ItemData(906 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 5, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Increases Nova's health by 100 and armour by 1. Nova also regenerates life quickly out of combat."),
+    ItemNames.NOVA_JUMP_SUIT_MODULE:
+        ItemData(907 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 6, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Increases Nova's movement speed and allows her to jump up and down cliffs."),
+    ItemNames.NOVA_C20A_CANISTER_RIFLE:
+        ItemData(908 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 7, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Allows Nova to equip the C20A Canister Rifle, which has a ranged attack and allows Nova to cast Snipe."),
+    ItemNames.NOVA_HELLFIRE_SHOTGUN:
+        ItemData(909 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 8, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Allows Nova to equip the Hellfire Shotgun, which has a short-range area attack in a cone and allows Nova to cast Penetrating Blast."),
+    ItemNames.NOVA_PLASMA_RIFLE:
+        ItemData(910 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 9, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Allows Nova to equip the Plasma Rifle, which has a rapidfire ranged attack and allows Nova to cast Plasma Shot."),
+    ItemNames.NOVA_MONOMOLECULAR_BLADE:
+        ItemData(911 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 10, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Allows Nova to equip the Monomolecular Blade, which has a melee attack and allows Nova to cast Dash Attack."),
+    ItemNames.NOVA_BLAZEFIRE_GUNBLADE:
+        ItemData(912 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 11, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Allows Nova to equip the Blazefire Gunblade, which has a melee attack and allows Nova to cast Fury of One."),
+    ItemNames.NOVA_STIM_INFUSION:
+        ItemData(913 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 12, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to heal herself and temporarily increase her movement and attack speeds."),
+    ItemNames.NOVA_PULSE_GRENADES:
+        ItemData(914 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 13, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to throw a grenade dealing large damage in an area."),
+    ItemNames.NOVA_FLASHBANG_GRENADES:
+        ItemData(915 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 14, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to throw a grenade to stun enemies and disable detection in a large area."),
+    ItemNames.NOVA_IONIC_FORCE_FIELD:
+        ItemData(916 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 15, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to shield herself temporarily."),
+    ItemNames.NOVA_HOLO_DECOY:
+        ItemData(917 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 16, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to summon a decoy unit which enemies will prefer to target and takes reduced damage."),
+    ItemNames.NOVA_NUKE:
+        ItemData(918 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 17, SC2Race.TERRAN, origin={"nco"},
+                 classification=ItemClassification.progression,
+                 description="Gives Nova the ability to launch tactical nukes built from the Shadow Ops."),
+
+    # HotS
+    ItemNames.ZERGLING:
+        ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 0, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Fast inexpensive melee attacker. Hatches in pairs from a single larva. Can morph into a Baneling."),
+    ItemNames.SWARM_QUEEN:
+        ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 1, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Ranged support caster. Can use the Spawn Creep Tumor and Rapid Transfusion abilities."),
+    ItemNames.ROACH:
+        ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 2, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Durable short ranged attacker. Regenerates life quickly when burrowed."),
+    ItemNames.HYDRALISK:
+        ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 3, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="High-damage generalist ranged attacker."),
+    ItemNames.ZERGLING_BANELING_ASPECT:
+        ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 5, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Anti-ground suicide unit. Does damage over a small area on death."),
+    ItemNames.ABERRATION:
+        ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 5, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Durable melee attacker that deals heavy damage and can walk over other units."),
+    ItemNames.MUTALISK:
+        ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 6, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Fragile flying attacker. Attacks bounce between targets."),
+    ItemNames.SWARM_HOST:
+        ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 7, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Siege unit that attacks by rooting in place and continually spawning Locusts."),
+    ItemNames.INFESTOR:
+        ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 8, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Support caster that can move while burrowed. Can use the Fungal Growth, Parasitic Domination, and Consumption abilities."),
+    ItemNames.ULTRALISK:
+        ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 9, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Massive melee attacker. Has an area-damage cleave attack."),
+    ItemNames.SPORE_CRAWLER:
+        ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 10, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Anti-air defensive structure that can detect cloaked units."),
+    ItemNames.SPINE_CRAWLER:
+        ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 11, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"hots"},
+                 description="Anti-ground defensive structure."),
+    ItemNames.CORRUPTOR:
+        ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 12, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Anti-air flying attacker specializing in taking down enemy capital ships."),
+    ItemNames.SCOURGE:
+        ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 13, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"bw", "ext"},
+                 description="Flying anti-air suicide unit. Hatches in pairs from a single larva."),
+    ItemNames.BROOD_QUEEN:
+        ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 4, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"bw", "ext"},
+                 description="Flying support caster. Can cast the Ocular Symbiote and Spawn Broodlings abilities."),
+    ItemNames.DEFILER:
+        ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 14, SC2Race.ZERG,
+                 classification=ItemClassification.progression, origin={"bw"},
+                 description="Support caster. Can use the Dark Swarm, Consume, and Plague abilities."),
+
+    ItemNames.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    # Upgrade bundle 'number' values are used as indices to get affected 'number's
+    ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 7, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 9, SC2Race.ZERG, quantity=3, origin={"hots"}),
+    ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 10, SC2Race.ZERG, quantity=3, origin={"hots"}),
+
+    ItemNames.ZERGLING_HARDENED_CARAPACE:
+        ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 0, SC2Race.ZERG, parent_item=ItemNames.ZERGLING,
+                 origin={"hots"}, description="Increases Zergling health by +10."),
+    ItemNames.ZERGLING_ADRENAL_OVERLOAD:
+        ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 1, SC2Race.ZERG, parent_item=ItemNames.ZERGLING,
+                 origin={"hots"}, description="Increases Zergling attack speed."),
+    ItemNames.ZERGLING_METABOLIC_BOOST:
+        ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 2, SC2Race.ZERG, parent_item=ItemNames.ZERGLING,
+                 origin={"hots"}, classification=ItemClassification.filler,
+                 description="Increases Zergling movement speed."),
+    ItemNames.ROACH_HYDRIODIC_BILE:
+        ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 3, SC2Race.ZERG, parent_item=ItemNames.ROACH,
+                 origin={"hots"}, description="Roaches deal +8 damage to light targets."),
+    ItemNames.ROACH_ADAPTIVE_PLATING:
+        ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 4, SC2Race.ZERG, parent_item=ItemNames.ROACH,
+                 origin={"hots"}, description="Roaches gain +3 armour when their life is below 50%."),
+    ItemNames.ROACH_TUNNELING_CLAWS:
+        ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 5, SC2Race.ZERG, parent_item=ItemNames.ROACH,
+                 origin={"hots"}, classification=ItemClassification.filler,
+                 description="Allows Roaches to move while burrowed."),
+    ItemNames.HYDRALISK_FRENZY:
+        ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 6, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK,
+                 origin={"hots"},
+                 description="Allows Hydralisks to use the Frenzy ability, which increases their attack speed by 50%."),
+    ItemNames.HYDRALISK_ANCILLARY_CARAPACE:
+        ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 7, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK,
+                 origin={"hots"}, classification=ItemClassification.filler, description="Hydralisks gain +20 health."),
+    ItemNames.HYDRALISK_GROOVED_SPINES:
+        ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 8, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK,
+                 origin={"hots"}, description="Hydralisks gain +1 range."),
+    ItemNames.BANELING_CORROSIVE_ACID:
+        ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 9, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"},
+                 description="Increases the damage banelings deal to their primary target. Splash damage remains the same."),
+    ItemNames.BANELING_RUPTURE:
+        ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 10, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"},
+                 classification=ItemClassification.filler,
+                 description="Increases the splash radius of baneling attacks."),
+    ItemNames.BANELING_REGENERATIVE_ACID:
+        ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 11, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"},
+                 classification=ItemClassification.filler,
+                 description="Banelings will heal nearby friendly units when they explode."),
+    ItemNames.MUTALISK_VICIOUS_GLAIVE:
+        ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 12, SC2Race.ZERG, parent_item=ItemNames.MUTALISK,
+                 origin={"hots"}, description="Mutalisks attacks will bounce an additional 3 times."),
+    ItemNames.MUTALISK_RAPID_REGENERATION:
+        ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 13, SC2Race.ZERG, parent_item=ItemNames.MUTALISK,
+                 origin={"hots"}, description="Mutalisks will regenerate quickly when out of combat."),
+    ItemNames.MUTALISK_SUNDERING_GLAIVE:
+        ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 14, SC2Race.ZERG, parent_item=ItemNames.MUTALISK,
+                 origin={"hots"}, description="Mutalisks deal increased damage to their primary target."),
+    ItemNames.SWARM_HOST_BURROW:
+        ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 15, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"hots"}, classification=ItemClassification.filler,
+                 description="Allows Swarm Hosts to burrow instead of root to spawn locusts."),
+    ItemNames.SWARM_HOST_RAPID_INCUBATION:
+        ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 16, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"hots"}, description="Swarm Hosts will spawn locusts 20% faster."),
+    ItemNames.SWARM_HOST_PRESSURIZED_GLANDS:
+        ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 17, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"hots"}, classification=ItemClassification.progression,
+                 description="Allows Swarm Host Locusts to attack air targets."),
+    ItemNames.ULTRALISK_BURROW_CHARGE:
+        ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 18, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"hots"},
+                 description="Allows Ultralisks to burrow and charge at enemy units, knocking back and stunning units when it emerges."),
+    ItemNames.ULTRALISK_TISSUE_ASSIMILATION:
+        ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 19, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"hots"}, description="Ultralisks recover health when they deal damage."),
+    ItemNames.ULTRALISK_MONARCH_BLADES:
+        ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 20, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"hots"}, description="Ultralisks gain increased splash damage."),
+    ItemNames.CORRUPTOR_CAUSTIC_SPRAY:
+        ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 21, SC2Race.ZERG, parent_item=ItemNames.CORRUPTOR,
+                 origin={"ext"},
+                 description="Allows Corruptors to use the Caustic Spray ability, which deals ramping damage to buildings over time."),
+    ItemNames.CORRUPTOR_CORRUPTION:
+        ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 22, SC2Race.ZERG, parent_item=ItemNames.CORRUPTOR,
+                 origin={"ext"},
+                 description="Allows Corruptors to use the Corruption ability, which causes a target enemy unit to take increased damage."),
+    ItemNames.SCOURGE_VIRULENT_SPORES:
+        ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 23, SC2Race.ZERG, parent_item=ItemNames.SCOURGE,
+                 origin={"ext"}, description="Scourge will deal splash damage."),
+    ItemNames.SCOURGE_RESOURCE_EFFICIENCY:
+        ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 24, SC2Race.ZERG, parent_item=ItemNames.SCOURGE,
+                 origin={"ext"}, classification=ItemClassification.progression,
+                 description="Reduces the cost of Scourge by 50 gas per egg."),
+    ItemNames.SCOURGE_SWARM_SCOURGE:
+        ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 25, SC2Race.ZERG, parent_item=ItemNames.SCOURGE,
+                 origin={"ext"}, description="An extra Scourge will be built from each egg at no additional cost."),
+    ItemNames.ZERGLING_SHREDDING_CLAWS:
+        ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 26, SC2Race.ZERG, parent_item=ItemNames.ZERGLING,
+                 origin={"ext"}, description="Zergling attacks will temporarily reduce their target's armour to 0."),
+    ItemNames.ROACH_GLIAL_RECONSTITUTION:
+        ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 27, SC2Race.ZERG, parent_item=ItemNames.ROACH,
+                 origin={"ext"}, description="Increases Roach movement speed."),
+    ItemNames.ROACH_ORGANIC_CARAPACE:
+        ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 28, SC2Race.ZERG, parent_item=ItemNames.ROACH,
+                 origin={"ext"}, description="Increases Roach health by +25."),
+    ItemNames.HYDRALISK_MUSCULAR_AUGMENTS:
+        ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 29, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK,
+                 origin={"bw"}, description="Increases Hydralisk movement speed."),
+    ItemNames.HYDRALISK_RESOURCE_EFFICIENCY:
+        ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 0, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK,
+                 origin={"bw"}, description="Reduces Hydralisk resource cost by 25/25 and supply cost by 1."),
+    ItemNames.BANELING_CENTRIFUGAL_HOOKS:
+        ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 1, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"},
+                 description="Increases the movement speed of Banelings."),
+    ItemNames.BANELING_TUNNELING_JAWS:
+        ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 2, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"},
+                 description="Allows Banelings to move while burrowed."),
+    ItemNames.BANELING_RAPID_METAMORPH:
+        ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 3, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, description="Banelings morph faster."),
+    ItemNames.MUTALISK_SEVERING_GLAIVE:
+        ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 4, SC2Race.ZERG, parent_item=ItemNames.MUTALISK,
+                 origin={"ext"}, description="Mutalisk bounce attacks will deal full damage."),
+    ItemNames.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE:
+        ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 5, SC2Race.ZERG, parent_item=ItemNames.MUTALISK,
+                 origin={"ext"}, description="Increases the attack range of Mutalisks by 2."),
+    ItemNames.SWARM_HOST_LOCUST_METABOLIC_BOOST:
+        ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 6, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"ext"}, classification=ItemClassification.filler,
+                 description="Increases Locust movement speed."),
+    ItemNames.SWARM_HOST_ENDURING_LOCUSTS:
+        ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 7, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"ext"}, description="Increases the duration of Swarm Hosts' Locusts by 10s."),
+    ItemNames.SWARM_HOST_ORGANIC_CARAPACE:
+        ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 8, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"ext"}, description="Increases Swarm Host health by +40."),
+    ItemNames.SWARM_HOST_RESOURCE_EFFICIENCY:
+        ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 9, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"ext"}, description="Reduces Swarm Host resource cost by 100/25."),
+    ItemNames.ULTRALISK_ANABOLIC_SYNTHESIS:
+        ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 10, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"bw"}, classification=ItemClassification.filler),
+    ItemNames.ULTRALISK_CHITINOUS_PLATING:
+        ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 11, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"bw"}),
+    ItemNames.ULTRALISK_ORGANIC_CARAPACE:
+        ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 12, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"ext"}),
+    ItemNames.ULTRALISK_RESOURCE_EFFICIENCY:
+        ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 13, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"bw"}),
+    ItemNames.DEVOURER_CORROSIVE_SPRAY:
+        ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 14, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}),
+    ItemNames.DEVOURER_GAPING_MAW:
+        ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 15, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}),
+    ItemNames.DEVOURER_IMPROVED_OSMOSIS:
+        ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 16, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"},
+                 classification=ItemClassification.filler),
+    ItemNames.DEVOURER_PRESCIENT_SPORES:
+        ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 17, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}),
+    ItemNames.GUARDIAN_PROLONGED_DISPERSION:
+        ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 18, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}),
+    ItemNames.GUARDIAN_PRIMAL_ADAPTATION:
+        ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 19, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}),
+    ItemNames.GUARDIAN_SORONAN_ACID:
+        ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 20, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}),
+    ItemNames.IMPALER_ADAPTIVE_TALONS:
+        ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 21, SC2Race.ZERG,
+                 parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"},
+                 classification=ItemClassification.filler),
+    ItemNames.IMPALER_SECRETION_GLANDS:
+        ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 22, SC2Race.ZERG,
+                 parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}),
+    ItemNames.IMPALER_HARDENED_TENTACLE_SPINES:
+        ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 23, SC2Race.ZERG,
+                 parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}),
+    ItemNames.LURKER_SEISMIC_SPINES:
+        ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 24, SC2Race.ZERG,
+                 parent_item=ItemNames.HYDRALISK_LURKER_ASPECT, origin={"ext"}),
+    ItemNames.LURKER_ADAPTED_SPINES:
+        ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 25, SC2Race.ZERG,
+                 parent_item=ItemNames.HYDRALISK_LURKER_ASPECT, origin={"ext"}),
+    ItemNames.RAVAGER_POTENT_BILE:
+        ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 26, SC2Race.ZERG,
+                 parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}),
+    ItemNames.RAVAGER_BLOATED_BILE_DUCTS:
+        ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 27, SC2Race.ZERG,
+                 parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}),
+    ItemNames.RAVAGER_DEEP_TUNNEL:
+        ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 28, SC2Race.ZERG,
+                 parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}),
+    ItemNames.VIPER_PARASITIC_BOMB:
+        ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 29, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}),
+    ItemNames.VIPER_PARALYTIC_BARBS:
+        ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 0, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}),
+    ItemNames.VIPER_VIRULENT_MICROBES:
+        ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 1, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}),
+    ItemNames.BROOD_LORD_POROUS_CARTILAGE:
+        ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 2, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}),
+    ItemNames.BROOD_LORD_EVOLVED_CARAPACE:
+        ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 3, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}),
+    ItemNames.BROOD_LORD_SPLITTER_MITOSIS:
+        ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 4, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}),
+    ItemNames.BROOD_LORD_RESOURCE_EFFICIENCY:
+        ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 5, SC2Race.ZERG,
+                 parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}),
+    ItemNames.INFESTOR_INFESTED_TERRAN:
+        ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 6, SC2Race.ZERG, parent_item=ItemNames.INFESTOR,
+                 origin={"ext"}),
+    ItemNames.INFESTOR_MICROBIAL_SHROUD:
+        ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 7, SC2Race.ZERG, parent_item=ItemNames.INFESTOR,
+                 origin={"ext"}),
+    ItemNames.SWARM_QUEEN_SPAWN_LARVAE:
+        ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 8, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN,
+                 origin={"ext"}),
+    ItemNames.SWARM_QUEEN_DEEP_TUNNEL:
+        ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 9, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN,
+                 origin={"ext"}),
+    ItemNames.SWARM_QUEEN_ORGANIC_CARAPACE:
+        ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 10, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN,
+                 origin={"ext"}, classification=ItemClassification.filler),
+    ItemNames.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION:
+        ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 11, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN,
+                 origin={"ext"}),
+    ItemNames.SWARM_QUEEN_RESOURCE_EFFICIENCY:
+        ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 12, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN,
+                 origin={"ext"}),
+    ItemNames.SWARM_QUEEN_INCUBATOR_CHAMBER:
+        ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 13, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN,
+                 origin={"ext"}),
+    ItemNames.BROOD_QUEEN_FUNGAL_GROWTH:
+        ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 14, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN,
+                 origin={"ext"}),
+    ItemNames.BROOD_QUEEN_ENSNARE:
+        ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 15, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN,
+                 origin={"ext"}),
+    ItemNames.BROOD_QUEEN_ENHANCED_MITOCHONDRIA:
+        ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 16, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN,
+                 origin={"ext"}),
+
+    ItemNames.ZERGLING_RAPTOR_STRAIN:
+        ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 0, SC2Race.ZERG, parent_item=ItemNames.ZERGLING,
+                 origin={"hots"},
+                 description="Allows Zerglings to jump up and down cliffs and leap onto enemies. Also increases Zergling attack damage by 2."),
+    ItemNames.ZERGLING_SWARMLING_STRAIN:
+        ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 1, SC2Race.ZERG, parent_item=ItemNames.ZERGLING,
+                 origin={"hots"},
+                 description="Zerglings will spawn instantly and with an extra Zergling per egg at no additional cost."),
+    ItemNames.ROACH_VILE_STRAIN:
+        ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 2, SC2Race.ZERG, parent_item=ItemNames.ROACH, origin={"hots"},
+                 description="Roach attacks will slow the movement and attack speed of enemies."),
+    ItemNames.ROACH_CORPSER_STRAIN:
+        ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 3, SC2Race.ZERG, parent_item=ItemNames.ROACH, origin={"hots"},
+                 description="Units killed after being attacked by Roaches will spawn 2 Roachlings."),
+    ItemNames.HYDRALISK_IMPALER_ASPECT:
+        ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 0, SC2Race.ZERG, origin={"hots"},
+                 classification=ItemClassification.progression,
+                 description="Allows Hydralisks to morph into Impalers."),
+    ItemNames.HYDRALISK_LURKER_ASPECT:
+        ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 1, SC2Race.ZERG, origin={"hots"},
+                 classification=ItemClassification.progression, description="Allows Hydralisks to morph into Lurkers."),
+    ItemNames.BANELING_SPLITTER_STRAIN:
+        ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 6, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"},
+                 description="Banelings will split into two smaller Splitterlings on exploding."),
+    ItemNames.BANELING_HUNTER_STRAIN:
+        ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 7, SC2Race.ZERG,
+                 parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"},
+                 description="Allows Banelings to jump up and down cliffs and leap onto enemies."),
+    ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT:
+        ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 2, SC2Race.ZERG, origin={"hots"},
+                 classification=ItemClassification.progression,
+                 description="Allows Mutalisks and Corruptors to morph into Brood Lords."),
+    ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT:
+        ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 3, SC2Race.ZERG, origin={"hots"},
+                 classification=ItemClassification.progression,
+                 description="Allows Mutalisks and Corruptors to morph into Vipers."),
+    ItemNames.SWARM_HOST_CARRION_STRAIN:
+        ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 10, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"hots"}, description="Swarm Hosts will spawn Flying Locusts."),
+    ItemNames.SWARM_HOST_CREEPER_STRAIN:
+        ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 11, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST,
+                 origin={"hots"}, classification=ItemClassification.filler,
+                 description="Allows Swarm Hosts to teleport to any creep on the map in vision. Swarm Hosts will spread creep around them when rooted or burrowed."),
+    ItemNames.ULTRALISK_NOXIOUS_STRAIN:
+        ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 12, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"hots"}, classification=ItemClassification.filler,
+                 description="Ultralisks will periodically spread poison, damaging nearby biological enemies."),
+    ItemNames.ULTRALISK_TORRASQUE_STRAIN:
+        ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 13, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK,
+                 origin={"hots"}, description="Ultralisks will revive after being killed."),
+
+    ItemNames.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 0, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 1, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 2, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 3, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 4, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 5, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 0, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.filler),
+    ItemNames.KERRIGAN_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 1, SC2Race.ZERG, origin={"hots"}),
+    ItemNames.KERRIGAN_AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 2, SC2Race.ZERG, origin={"hots"}),
+    ItemNames.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 6, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 7, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 8, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 3, SC2Race.ZERG, origin={"hots"}),
+    ItemNames.KERRIGAN_MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 4, SC2Race.ZERG, origin={"hots"}),
+    ItemNames.KERRIGAN_VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 5, SC2Race.ZERG, origin={"hots"}),
+    ItemNames.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 9, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 10, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 11, SC2Race.ZERG, origin={"hots"}),
+    ItemNames.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 12, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 13, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 14, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression),
+    # Handled separately from other abilities
+    ItemNames.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, "Primal Form", 0, SC2Race.ZERG, origin={"hots"}),
+
+    ItemNames.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, "Level", 10, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, "Level", 9, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, "Level", 8, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, "Level", 7, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, "Level", 6, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, "Level", 5, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, "Level", 4, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing),
+    ItemNames.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, "Level", 3, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing),
+    ItemNames.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, "Level", 2, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing),
+    ItemNames.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, "Level", 1, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing),
+    ItemNames.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, "Level", 14, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, "Level", 35, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+    ItemNames.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, "Level", 70, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression),
+
+    # Zerg Mercs
+    ItemNames.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 0, SC2Race.ZERG, origin={"ext"}),
+    ItemNames.INFESTED_SIEGE_TANKS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 1, SC2Race.ZERG, origin={"ext"}),
+    ItemNames.INFESTED_BANSHEES: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 2, SC2Race.ZERG, origin={"ext"}),
+
+    # Misc Upgrades
+    ItemNames.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 6, SC2Race.ZERG, origin={"bw"}),
+
+    # Morphs
+    ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 6, SC2Race.ZERG, origin={"bw"}),
+    ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 7, SC2Race.ZERG, origin={"bw"}),
+    ItemNames.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 8, SC2Race.ZERG, origin={"ext"}),
+
+
+    # Protoss Units (those that aren't as items in WoL (Prophecy))
+    ItemNames.OBSERVER: ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 9, SC2Race.PROTOSS, 
+                 classification=ItemClassification.filler, origin={"wol"},
+                 description="Flying spy. Cloak renders the unit invisible to enemies without detection."),
+    ItemNames.CENTURION: ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 10, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Powerful melee warrior. Has the Shadow Charge and Darkcoil abilities."),
+    ItemNames.SENTINEL: ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 11, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Powerful melee warrior. Has the Charge and Reconstruction abilities."),
+    ItemNames.SUPPLICANT: ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 12, SC2Race.PROTOSS, 
+                 classification=ItemClassification.filler, important_for_filtering=True, origin={"ext"},
+                 description="Powerful melee warrior. Has powerful damage resistant shields."),
+    ItemNames.INSTIGATOR: ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 13, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Ranged support strider. Can store multiple Blink charges."),
+    ItemNames.SLAYER: ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 14, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Ranged attack strider. Can use the Phase Blink and Phasing Armor abilities."),
+    ItemNames.SENTRY: ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 15, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Robotic support unit can use the Guardian Shield ability and restore the shields of nearby Protoss units."),
+    ItemNames.ENERGIZER: ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 16, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Robotic support unit. Can use the Chrono Beam ability and become stationary to power nearby structures."),
+    ItemNames.HAVOC: ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 17, SC2Race.PROTOSS,
+                 origin={"lotv"}, important_for_filtering=True,
+                 description="Robotic support unit. Can use the Target Lock and Force Field abilities and increase the range of nearby Protoss units."),
+    ItemNames.SIGNIFIER: ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 18, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Potent permanently cloaked psionic master. Can use the Feedback and Crippling Psionic Storm abilities. Can merge into an Archon."),
+    ItemNames.ASCENDANT: ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 19, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Potent psionic master. Can use the Psionic Orb, Mind Blast, and Sacrifice abilities."),
+    ItemNames.AVENGER: ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 20, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Deadly warrior-assassin. Permanently cloaked. Recalls to the nearest Dark Shrine upon death."),
+    ItemNames.BLOOD_HUNTER: ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 21, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Deadly warrior-assassin. Permanently cloaked. Can use the Void Stasis ability."),
+    ItemNames.DRAGOON: ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 22, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Ranged assault strider. Has enhanced health and damage."),
+    ItemNames.DARK_ARCHON: ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 23, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Potent psionic master. Can use the Confuse and Mind Control abilities."),
+    ItemNames.ADEPT: ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 24, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Ranged specialist. Can use the Psionic Transfer ability."),
+    ItemNames.WARP_PRISM: ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 25, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Flying transport. Can carry units and become stationary to deploy a power field."),
+    ItemNames.ANNIHILATOR: ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 26, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Assault Strider. Can use the Shadow Cannon ability to damage air and ground units."),
+    ItemNames.VANGUARD: ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 27, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Assault Strider. Deals splash damage around the primary target."),
+    ItemNames.WRATHWALKER: ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 28, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Battle strider with a powerful single target attack.  Can walk up and down cliffs."),
+    ItemNames.REAVER: ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 29, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Area damage siege unit. Builds and launches explosive Scarabs for high burst damage."),
+    ItemNames.DISRUPTOR: ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 0, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Robotic disruption unit. Can use the Purification Nova ability to deal heavy area damage."),
+    ItemNames.MIRAGE: ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 1, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities."),
+    ItemNames.CORSAIR: ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 2, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Air superiority starfighter. Can use the Disruption Web ability."),
+    ItemNames.DESTROYER: ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 3, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Area assault craft. Can use the Destruction Beam ability to attack multiple units at once."),
+    ItemNames.SCOUT: ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 4, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Versatile high-speed fighter."),
+    ItemNames.TEMPEST: ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 5, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Siege artillery craft. Attacks from long range. Can use the Disintegration ability."),
+    ItemNames.MOTHERSHIP: ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 6, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Ultimate Protoss vessel, Can use the Vortex and Mass Recall abilities. Cloaks nearby units and structures."),
+    ItemNames.ARBITER: ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 7, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="Army support craft. Has the Stasis Field and Recall abilities. Cloaks nearby units."),
+    ItemNames.ORACLE: ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 8, SC2Race.PROTOSS, 
+                 classification=ItemClassification.progression, origin={"ext"},
+                 description="Flying caster. Can use the Revelation and Stasis Ward abilities."),
+
+    # Protoss Upgrades
+    ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    # Upgrade bundle 'number' values are used as indices to get affected 'number's
+    ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 11, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 12, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 13, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 14, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+    ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 15, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}),
+
+    # Protoss Buildings
+    ItemNames.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, "Building", 0, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"wol", "lotv"}),
+    ItemNames.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, "Building", 1, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}),
+    ItemNames.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, "Building", 2, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}),
+
+    # Protoss Unit Upgrades
+    ItemNames.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 0, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT),
+    ItemNames.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 1, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT),
+    ItemNames.SUPPLICANT_SHIELD_REGENERATION: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 2, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT),
+    ItemNames.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 3, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT),
+    ItemNames.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 4, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT),
+    ItemNames.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 5, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT),
+    ItemNames.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 6, SC2Race.PROTOSS, origin={"ext"}, classification=ItemClassification.progression),
+    ItemNames.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 7, SC2Race.PROTOSS, origin={"ext"}, classification=ItemClassification.progression),
+    ItemNames.DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 8, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.DRAGOON),
+    ItemNames.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 9, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.DRAGOON),
+    ItemNames.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 10, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.DRAGOON),
+    ItemNames.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.DRAGOON),
+    ItemNames.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 12, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.SCOUT),
+    ItemNames.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 13, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.SCOUT),
+    ItemNames.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 14, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.SCOUT),
+    ItemNames.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 15, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.SCOUT),
+    ItemNames.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 16, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.TEMPEST),
+    ItemNames.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 17, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.TEMPEST),
+    ItemNames.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 18, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.TEMPEST),
+    ItemNames.PHOENIX_MIRAGE_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 19, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.PHOENIX_MIRAGE_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 20, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 21, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.CORSAIR),
+    ItemNames.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 22, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.CORSAIR),
+    ItemNames.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 23, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.CORSAIR),
+    ItemNames.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 24, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.CORSAIR),
+    ItemNames.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 25, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE),
+    ItemNames.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 26, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE),
+    ItemNames.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 27, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE),
+    ItemNames.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 28, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER),
+    ItemNames.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 29, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER),
+    ItemNames.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 0, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER),
+    ItemNames.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 1, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.ARBITER),
+    ItemNames.ARBITER_ENHANCED_CLOAK_FIELD: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 2, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.ARBITER),
+    ItemNames.CARRIER_GRAVITON_CATAPULT:
+        ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 3, SC2Race.PROTOSS, origin={"wol"},
+                 parent_item=ItemNames.CARRIER,
+                 description="Carriers can launch Interceptors more quickly."),
+    ItemNames.CARRIER_HULL_OF_PAST_GLORIES:
+        ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 4, SC2Race.PROTOSS, origin={"bw"},
+                 parent_item=ItemNames.CARRIER,
+                 description="Carriers gain +2 armour."),
+    ItemNames.VOID_RAY_DESTROYER_FLUX_VANES:
+        ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 5, SC2Race.PROTOSS, classification=ItemClassification.filler,
+                 origin={"ext"},
+                 description="Increases Void Ray and Destroyer movement speed."),
+    ItemNames.DESTROYER_REFORGED_BLOODSHARD_CORE:
+        ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 6, SC2Race.PROTOSS, origin={"ext"},
+                 parent_item=ItemNames.DESTROYER,
+                 description="When fully charged, the Destroyer's Destruction Beam weapon does full damage to secondary targets."),
+    ItemNames.WARP_PRISM_GRAVITIC_DRIVE:
+        ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 7, SC2Race.PROTOSS, classification=ItemClassification.filler,
+                 origin={"ext"}, parent_item=ItemNames.WARP_PRISM,
+                 description="Increases the movement speed of Warp Prisms."),
+    ItemNames.WARP_PRISM_PHASE_BLASTER:
+        ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 8, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"ext"}, parent_item=ItemNames.WARP_PRISM,
+                 description="Equips Warp Prisms with an auto-attack that can hit ground and air targets."),
+    ItemNames.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 9, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.WARP_PRISM),
+    ItemNames.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 10, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.OBSERVER),
+    ItemNames.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.OBSERVER),
+    ItemNames.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 12, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.REAVER),
+    ItemNames.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 13, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.REAVER),
+    ItemNames.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 14, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.REAVER),
+    ItemNames.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 15, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.REAVER),
+    ItemNames.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 16, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.VANGUARD),
+    ItemNames.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 17, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.VANGUARD),
+    ItemNames.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 18, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 19, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"ext"}),
+    ItemNames.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 20, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.COLOSSUS),
+    ItemNames.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 21, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.WRATHWALKER),
+    ItemNames.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 22, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.WRATHWALKER),
+    ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 23, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 24, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 25, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"ext"}),
+    ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 26, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 27, SC2Race.PROTOSS, origin={"bw"}, important_for_filtering=True ,parent_item=ItemNames.DARK_TEMPLAR),
+    ItemNames.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 28, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 29, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}),
+    ItemNames.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 0, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 1, SC2Race.PROTOSS, origin={"ext"}, important_for_filtering=True),
+    ItemNames.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 2, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 3, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 4, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 5, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT),
+    ItemNames.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 6, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT),
+    ItemNames.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 7, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT),
+    ItemNames.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 8, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 9, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 10, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SENTRY),
+    ItemNames.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SENTRY),
+    ItemNames.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 12, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ENERGIZER),
+    ItemNames.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 13, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ENERGIZER),
+    ItemNames.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 14, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.HAVOC),
+    ItemNames.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 15, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.HAVOC),
+    ItemNames.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 16, SC2Race.PROTOSS, origin={"bw"}),
+    ItemNames.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 17, SC2Race.PROTOSS, origin={"bw"}),
+
+    # SoA Calldown powers
+    ItemNames.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 0, SC2Race.PROTOSS, origin={"lotv"}),
+    ItemNames.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, "Progressive Upgrade", 0, SC2Race.PROTOSS, origin={"lotv"}, quantity=2),
+    ItemNames.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 1, SC2Race.PROTOSS, origin={"ext"}),
+    ItemNames.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 2, SC2Race.PROTOSS, origin={"lotv"}),
+    ItemNames.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 3, SC2Race.PROTOSS, origin={"lotv"}),
+    ItemNames.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 4, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}),
+    ItemNames.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 5, SC2Race.PROTOSS, origin={"lotv"}),
+    ItemNames.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 6, SC2Race.PROTOSS, origin={"lotv"}),
+    ItemNames.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 7, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}),
+    ItemNames.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 8, SC2Race.PROTOSS, origin={"lotv"}),
+    ItemNames.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 9, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}),
+    ItemNames.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 10, SC2Race.PROTOSS, origin={"lotv"}),
+
+    # Generic Protoss Upgrades
+    ItemNames.MATRIX_OVERLOAD:
+        ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 0, SC2Race.PROTOSS, origin={"lotv"},
+                 description=r"All friendly units gain 25% movement speed and 15% attack speed within a Pylon's power field and for 15 seconds after leaving it."),
+    ItemNames.QUATRO:
+        ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 1, SC2Race.PROTOSS, origin={"ext"},
+                 description="All friendly Protoss units gain the equivalent of their +1 armour, attack, and shield upgrades."),
+    ItemNames.NEXUS_OVERCHARGE:
+        ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 2, SC2Race.PROTOSS, origin={"lotv"},
+                 important_for_filtering=True, description="The Protoss Nexus gains a long-range auto-attack."),
+    ItemNames.ORBITAL_ASSIMILATORS:
+        ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 3, SC2Race.PROTOSS, origin={"lotv"},
+                 description="Assimilators automatically harvest Vespene Gas without the need for Probes."),
+    ItemNames.WARP_HARMONIZATION:
+        ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 4, SC2Race.PROTOSS, origin={"lotv"},
+                 description=r"Stargates and Robotics Facilities can transform to utilize Warp In technology. Warp In cooldowns are 20% faster than original build times."),
+    ItemNames.GUARDIAN_SHELL:
+        ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 5, SC2Race.PROTOSS, origin={"lotv"},
+                 description="The Spear of Adun passively shields friendly Protoss units before death, making them invulnerable for 5 seconds. Each unit can only be shielded once every 60 seconds."),
+    ItemNames.RECONSTRUCTION_BEAM:
+        ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 6, SC2Race.PROTOSS,
+                 classification=ItemClassification.progression, origin={"lotv"},
+                 description="The Spear of Adun will passively heal mechanical units for 5 and non-biological structures for 10 life per second. Up to 3 targets can be repaired at once."),
+    ItemNames.OVERWATCH:
+        ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 7, SC2Race.PROTOSS, origin={"ext"},
+                 description="Once per second, the Spear of Adun will last-hit a damaged enemy unit that is below 50 health."),
+    ItemNames.SUPERIOR_WARP_GATES:
+        ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 8, SC2Race.PROTOSS, origin={"ext"},
+                 description="Protoss Warp Gates can hold up to 3 charges of unit warp-ins."),
+    ItemNames.ENHANCED_TARGETING:
+        ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 9, SC2Race.PROTOSS, origin={"ext"},
+                 description="Protoss defensive structures gain +2 range."),
+    ItemNames.OPTIMIZED_ORDNANCE:
+        ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 10, SC2Race.PROTOSS, origin={"ext"},
+                 description="Increases the attack speed of Protoss defensive structures by 25%."),
+    ItemNames.KHALAI_INGENUITY:
+        ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 11, SC2Race.PROTOSS, origin={"ext"},
+                 description="Pylons, Photon Cannons, Monoliths, and Shield Batteries warp in near-instantly."),
+    ItemNames.AMPLIFIED_ASSIMILATORS:
+        ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 12, SC2Race.PROTOSS, origin={"ext"},
+                 description=r"Assimilators produce Vespene gas 25% faster."),
+}
+
+
+def get_item_table():
+    return item_table
+
+
+basic_units = {
+    SC2Race.TERRAN: {
+        ItemNames.MARINE,
+        ItemNames.MARAUDER,
+        ItemNames.GOLIATH,
+        ItemNames.HELLION,
+        ItemNames.VULTURE,
+        ItemNames.WARHOUND,
+    },
+    SC2Race.ZERG: {
+        ItemNames.ZERGLING,
+        ItemNames.SWARM_QUEEN,
+        ItemNames.ROACH,
+        ItemNames.HYDRALISK,
+    },
+    SC2Race.PROTOSS: {
+        ItemNames.ZEALOT,
+        ItemNames.CENTURION,
+        ItemNames.SENTINEL,
+        ItemNames.STALKER,
+        ItemNames.INSTIGATOR,
+        ItemNames.SLAYER,
+        ItemNames.DRAGOON,
+        ItemNames.ADEPT,
+    }
+}
+
+advanced_basic_units = {
+    SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({
+        ItemNames.REAPER,
+        ItemNames.DIAMONDBACK,
+        ItemNames.VIKING,
+        ItemNames.SIEGE_TANK,
+        ItemNames.BANSHEE,
+        ItemNames.THOR,
+        ItemNames.BATTLECRUISER,
+        ItemNames.CYCLONE
+    }),
+    SC2Race.ZERG: basic_units[SC2Race.ZERG].union({
+        ItemNames.INFESTOR,
+        ItemNames.ABERRATION,
+    }),
+    SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({
+        ItemNames.DARK_TEMPLAR,
+        ItemNames.BLOOD_HUNTER,
+        ItemNames.AVENGER,
+        ItemNames.IMMORTAL,
+        ItemNames.ANNIHILATOR,
+        ItemNames.VANGUARD,
+    })
+}
+
+no_logic_starting_units = {
+    SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({
+        ItemNames.FIREBAT,
+        ItemNames.GHOST,
+        ItemNames.SPECTRE,
+        ItemNames.WRAITH,
+        ItemNames.RAVEN,
+        ItemNames.PREDATOR,
+        ItemNames.LIBERATOR,
+        ItemNames.HERC,
+    }),
+    SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({
+        ItemNames.ULTRALISK,
+        ItemNames.SWARM_HOST
+    }),
+    SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({
+        ItemNames.CARRIER,
+        ItemNames.TEMPEST,
+        ItemNames.VOID_RAY,
+        ItemNames.DESTROYER,
+        ItemNames.COLOSSUS,
+        ItemNames.WRATHWALKER,
+        ItemNames.SCOUT,
+        ItemNames.HIGH_TEMPLAR,
+        ItemNames.SIGNIFIER,
+        ItemNames.ASCENDANT,
+        ItemNames.DARK_ARCHON,
+        ItemNames.SUPPLICANT,
+    })
+}
+
+not_balanced_starting_units = {
+    ItemNames.SIEGE_TANK,
+    ItemNames.THOR,
+    ItemNames.BANSHEE,
+    ItemNames.BATTLECRUISER,
+    ItemNames.ULTRALISK,
+    ItemNames.CARRIER,
+    ItemNames.TEMPEST,
+}
+
+
+def get_basic_units(world: World, race: SC2Race) -> typing.Set[str]:
+    logic_level = get_option_value(world, 'required_tactics')
+    if logic_level == RequiredTactics.option_no_logic:
+        return no_logic_starting_units[race]
+    elif logic_level == RequiredTactics.option_advanced:
+        return advanced_basic_units[race]
+    else:
+        return basic_units[race]
+
+
+# Items that can be placed before resources if not already in
+# General upgrades and Mercs
+second_pass_placeable_items: typing.Tuple[str, ...] = (
+    # Global weapon/armor upgrades
+    ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE,
+    ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE,
+    ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE,
+    ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE,
+    ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE,
+    ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE,
+    ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE,
+    ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE,
+    ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE,
+    ItemNames.PROGRESSIVE_PROTOSS_SHIELDS,
+    # Terran Buildings without upgrades
+    ItemNames.SENSOR_TOWER,
+    ItemNames.HIVE_MIND_EMULATOR,
+    ItemNames.PSI_DISRUPTER,
+    ItemNames.PERDITION_TURRET,
+    # Terran units without upgrades
+    ItemNames.HERC,
+    ItemNames.WARHOUND,
+    # General Terran upgrades without any dependencies
+    ItemNames.SCV_ADVANCED_CONSTRUCTION,
+    ItemNames.SCV_DUAL_FUSION_WELDERS,
+    ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM,
+    ItemNames.PROGRESSIVE_ORBITAL_COMMAND,
+    ItemNames.ULTRA_CAPACITORS,
+    ItemNames.VANADIUM_PLATING,
+    ItemNames.ORBITAL_DEPOTS,
+    ItemNames.MICRO_FILTERING,
+    ItemNames.AUTOMATED_REFINERY,
+    ItemNames.COMMAND_CENTER_REACTOR,
+    ItemNames.TECH_REACTOR,
+    ItemNames.CELLULAR_REACTOR,
+    ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL,  # Place only L1
+    ItemNames.STRUCTURE_ARMOR,
+    ItemNames.HI_SEC_AUTO_TRACKING,
+    ItemNames.ADVANCED_OPTICS,
+    ItemNames.ROGUE_FORCES,
+    # Mercenaries (All races)
+    *[item_name for item_name, item_data in get_full_item_list().items()
+      if item_data.type == "Mercenary"],
+    # Kerrigan and Nova levels, abilities and generally useful stuff
+    *[item_name for item_name, item_data in get_full_item_list().items()
+      if item_data.type in ("Level", "Ability", "Evolution Pit", "Nova Gear")],
+    ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE,
+    # Zerg static defenses
+    ItemNames.SPORE_CRAWLER,
+    ItemNames.SPINE_CRAWLER,
+    # Defiler, Aberration (no upgrades)
+    ItemNames.DEFILER,
+    ItemNames.ABERRATION,
+    # Spear of Adun Abilities
+    ItemNames.SOA_CHRONO_SURGE,
+    ItemNames.SOA_PROGRESSIVE_PROXY_PYLON,
+    ItemNames.SOA_PYLON_OVERCHARGE,
+    ItemNames.SOA_ORBITAL_STRIKE,
+    ItemNames.SOA_TEMPORAL_FIELD,
+    ItemNames.SOA_SOLAR_LANCE,
+    ItemNames.SOA_MASS_RECALL,
+    ItemNames.SOA_SHIELD_OVERCHARGE,
+    ItemNames.SOA_DEPLOY_FENIX,
+    ItemNames.SOA_PURIFIER_BEAM,
+    ItemNames.SOA_TIME_STOP,
+    ItemNames.SOA_SOLAR_BOMBARDMENT,
+    # Protoss generic upgrades
+    ItemNames.MATRIX_OVERLOAD,
+    ItemNames.QUATRO,
+    ItemNames.NEXUS_OVERCHARGE,
+    ItemNames.ORBITAL_ASSIMILATORS,
+    ItemNames.WARP_HARMONIZATION,
+    ItemNames.GUARDIAN_SHELL,
+    ItemNames.RECONSTRUCTION_BEAM,
+    ItemNames.OVERWATCH,
+    ItemNames.SUPERIOR_WARP_GATES,
+    ItemNames.KHALAI_INGENUITY,
+    ItemNames.AMPLIFIED_ASSIMILATORS,
+    # Protoss static defenses
+    ItemNames.PHOTON_CANNON,
+    ItemNames.KHAYDARIN_MONOLITH,
+    ItemNames.SHIELD_BATTERY
+)
+
+
+filler_items: typing.Tuple[str, ...] = (
+    ItemNames.STARTING_MINERALS,
+    ItemNames.STARTING_VESPENE,
+    ItemNames.STARTING_SUPPLY,
+)
+
+# Defense rating table
+# Commented defense ratings are handled in LogicMixin
+defense_ratings = {
+    ItemNames.SIEGE_TANK: 5,
+    # "Maelstrom Rounds": 2,
+    ItemNames.PLANETARY_FORTRESS: 3,
+    # Bunker w/ Marine/Marauder: 3,
+    ItemNames.PERDITION_TURRET: 2,
+    ItemNames.VULTURE: 1,
+    ItemNames.BANSHEE: 1,
+    ItemNames.BATTLECRUISER: 1,
+    ItemNames.LIBERATOR: 4,
+    ItemNames.WIDOW_MINE: 1,
+    # "Concealment (Widow Mine)": 1
+}
+zerg_defense_ratings = {
+    ItemNames.PERDITION_TURRET: 2,
+    # Bunker w/ Firebat: 2,
+    ItemNames.LIBERATOR: -2,
+    ItemNames.HIVE_MIND_EMULATOR: 3,
+    ItemNames.PSI_DISRUPTER: 3,
+}
+air_defense_ratings = {
+    ItemNames.MISSILE_TURRET: 2,
+}
+
+kerrigan_levels = [item_name for item_name, item_data in get_full_item_list().items()
+                        if item_data.type == "Level" and item_data.race == SC2Race.ZERG]
+
+spider_mine_sources = {
+    ItemNames.VULTURE,
+    ItemNames.REAPER_SPIDER_MINES,
+    ItemNames.SIEGE_TANK_SPIDER_MINES,
+    ItemNames.RAVEN_SPIDER_MINES,
+}
+
+progressive_if_nco = {
+    ItemNames.MARINE_PROGRESSIVE_STIMPACK,
+    ItemNames.FIREBAT_PROGRESSIVE_STIMPACK,
+    ItemNames.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS,
+    ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL,
+}
+
+progressive_if_ext = {
+    ItemNames.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE,
+    ItemNames.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS,
+    ItemNames.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX,
+    ItemNames.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS,
+    ItemNames.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL,
+    ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM,
+    ItemNames.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL
+}
+
+kerrigan_actives: typing.List[typing.Set[str]] = [
+    {ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE},
+    {ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT},
+    set(),
+    {ItemNames.KERRIGAN_WILD_MUTATION, ItemNames.KERRIGAN_SPAWN_BANELINGS, ItemNames.KERRIGAN_MEND},
+    set(),
+    set(),
+    {ItemNames.KERRIGAN_APOCALYPSE, ItemNames.KERRIGAN_SPAWN_LEVIATHAN, ItemNames.KERRIGAN_DROP_PODS},
+]
+
+kerrigan_passives: typing.List[typing.Set[str]] = [
+    {ItemNames.KERRIGAN_HEROIC_FORTITUDE},
+    {ItemNames.KERRIGAN_CHAIN_REACTION},
+    {ItemNames.KERRIGAN_ZERGLING_RECONSTITUTION, ItemNames.KERRIGAN_IMPROVED_OVERLORDS, ItemNames.KERRIGAN_AUTOMATED_EXTRACTORS},
+    set(),
+    {ItemNames.KERRIGAN_TWIN_DRONES, ItemNames.KERRIGAN_MALIGNANT_CREEP, ItemNames.KERRIGAN_VESPENE_EFFICIENCY},
+    {ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY, ItemNames.KERRIGAN_ABILITY_EFFICIENCY},
+    set(),
+]
+
+kerrigan_only_passives = {
+    ItemNames.KERRIGAN_HEROIC_FORTITUDE, ItemNames.KERRIGAN_CHAIN_REACTION,
+    ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY, ItemNames.KERRIGAN_ABILITY_EFFICIENCY,
+}
+
+spear_of_adun_calldowns = {
+    ItemNames.SOA_CHRONO_SURGE,
+    ItemNames.SOA_PROGRESSIVE_PROXY_PYLON,
+    ItemNames.SOA_PYLON_OVERCHARGE,
+    ItemNames.SOA_ORBITAL_STRIKE,
+    ItemNames.SOA_TEMPORAL_FIELD,
+    ItemNames.SOA_SOLAR_LANCE,
+    ItemNames.SOA_MASS_RECALL,
+    ItemNames.SOA_SHIELD_OVERCHARGE,
+    ItemNames.SOA_DEPLOY_FENIX,
+    ItemNames.SOA_PURIFIER_BEAM,
+    ItemNames.SOA_TIME_STOP,
+    ItemNames.SOA_SOLAR_BOMBARDMENT
+}
+
+spear_of_adun_castable_passives = {
+    ItemNames.RECONSTRUCTION_BEAM,
+    ItemNames.OVERWATCH,
+}
+
+nova_equipment = {
+    *[item_name for item_name, item_data in get_full_item_list().items()
+      if item_data.type == "Nova Gear"],
+    ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE
+}
+
+# 'number' values of upgrades for upgrade bundle items
+upgrade_numbers = [
+    # Terran
+    {0, 4, 8}, # Weapon
+    {2, 6, 10}, # Armor
+    {0, 2}, # Infantry
+    {4, 6}, # Vehicle
+    {8, 10}, # Starship
+    {0, 2, 4, 6, 8, 10}, # All
+    # Zerg
+    {0, 2, 6}, # Weapon
+    {4, 8}, # Armor
+    {0, 2, 4}, # Ground
+    {6, 8}, # Flyer
+    {0, 2, 4, 6, 8}, # All
+    # Protoss
+    {0, 6}, # Weapon
+    {2, 4, 8}, # Armor
+    {0, 2}, # Ground, Shields are handled specially
+    {6, 8}, # Air, Shields are handled specially
+    {0, 2, 4, 6, 8}, # All
+]
+# 'upgrade_numbers' indices for all upgrades
+upgrade_numbers_all = {
+    SC2Race.TERRAN: 5,
+    SC2Race.ZERG: 10,
+    SC2Race.PROTOSS: 15,
+}
+
+# Names of upgrades to be included for different options
+upgrade_included_names = [
+    { # Individual Items
+        ItemNames.PROGRESSIVE_TERRAN_INFANTRY_WEAPON,
+        ItemNames.PROGRESSIVE_TERRAN_INFANTRY_ARMOR,
+        ItemNames.PROGRESSIVE_TERRAN_VEHICLE_WEAPON,
+        ItemNames.PROGRESSIVE_TERRAN_VEHICLE_ARMOR,
+        ItemNames.PROGRESSIVE_TERRAN_SHIP_WEAPON,
+        ItemNames.PROGRESSIVE_TERRAN_SHIP_ARMOR,
+        ItemNames.PROGRESSIVE_ZERG_MELEE_ATTACK,
+        ItemNames.PROGRESSIVE_ZERG_MISSILE_ATTACK,
+        ItemNames.PROGRESSIVE_ZERG_GROUND_CARAPACE,
+        ItemNames.PROGRESSIVE_ZERG_FLYER_ATTACK,
+        ItemNames.PROGRESSIVE_ZERG_FLYER_CARAPACE,
+        ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON,
+        ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR,
+        ItemNames.PROGRESSIVE_PROTOSS_SHIELDS,
+        ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON,
+        ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR,
+    },
+    { # Bundle Weapon And Armor
+        ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE,
+        ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE,
+        ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE,
+        ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE,
+        ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE,
+        ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE,
+    },
+    { # Bundle Unit Class
+        ItemNames.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE,
+        ItemNames.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE,
+        ItemNames.PROGRESSIVE_TERRAN_SHIP_UPGRADE,
+        ItemNames.PROGRESSIVE_ZERG_GROUND_UPGRADE,
+        ItemNames.PROGRESSIVE_ZERG_FLYER_UPGRADE,
+        ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE,
+        ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE,
+    },
+    { # Bundle All
+        ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE,
+        ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE,
+        ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE,
+    }
+]
+
+lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if
+                                            data.code}
+
+# Map type to expected int
+type_flaggroups: typing.Dict[SC2Race, typing.Dict[str, int]] = {
+    SC2Race.ANY: {
+        "Minerals": 0,
+        "Vespene": 1,
+        "Supply": 2,
+        "Goal": 3,
+        "Nothing Group": 4,
+    },
+    SC2Race.TERRAN: {
+        "Armory 1": 0,
+        "Armory 2": 1,
+        "Armory 3": 2,
+        "Armory 4": 3,
+        "Armory 5": 4,
+        "Armory 6": 5,
+        "Progressive Upgrade": 6,  # Unit upgrades that exist multiple times (Stimpack / Super Stimpack)
+        "Laboratory": 7,
+        "Upgrade": 8,  # Weapon / Armor upgrades
+        "Unit": 9,
+        "Building": 10,
+        "Mercenary": 11,
+        "Nova Gear": 12,
+        "Progressive Upgrade 2": 13,
+    },
+    SC2Race.ZERG: {
+        "Ability": 0,
+        "Mutation 1": 1,
+        "Strain": 2,
+        "Morph": 3,
+        "Upgrade": 4,
+        "Mercenary": 5,
+        "Unit": 6,
+        "Level": 7,
+        "Primal Form": 8,
+        "Evolution Pit": 9,
+        "Mutation 2": 10,
+        "Mutation 3": 11
+    },
+    SC2Race.PROTOSS: {
+        "Unit": 0,
+        "Unit 2": 1,
+        "Upgrade": 2,  # Weapon / Armor upgrades
+        "Building": 3,
+        "Progressive Upgrade": 4,
+        "Spear of Adun": 5,
+        "Solarite Core": 6,
+        "Forge 1": 7,
+        "Forge 2": 8,
+        "Forge 3": 9,
+    }
+}
diff --git a/worlds/sc2/Locations.py b/worlds/sc2/Locations.py
new file mode 100644
index 00000000..5a03f223
--- /dev/null
+++ b/worlds/sc2/Locations.py
@@ -0,0 +1,1638 @@
+from enum import IntEnum
+from typing import List, Tuple, Optional, Callable, NamedTuple, Set, Any
+from BaseClasses import MultiWorld
+from . import ItemNames
+from .Options import get_option_value, kerrigan_unit_available, RequiredTactics, GrantStoryTech, LocationInclusion, \
+    EnableHotsMissions
+from .Rules import SC2Logic
+
+from BaseClasses import Location
+from worlds.AutoWorld import World
+
+SC2WOL_LOC_ID_OFFSET = 1000
+SC2HOTS_LOC_ID_OFFSET = 20000000  # Avoid clashes with The Legend of Zelda
+SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000
+SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500
+
+
+class SC2Location(Location):
+    game: str = "Starcraft2"
+
+
+class LocationType(IntEnum):
+    VICTORY = 0  # Winning a mission
+    VANILLA = 1  # Objectives that provided metaprogression in the original campaign, along with a few other locations for a balanced experience
+    EXTRA = 2  # Additional locations based on mission progression, collecting in-mission rewards, etc. that do not significantly increase the challenge.
+    CHALLENGE = 3  # Challenging objectives, often harder than just completing a mission, and often associated with Achievements
+    MASTERY = 4  # Extremely challenging objectives often associated with Masteries and Feats of Strength in the original campaign
+
+
+class LocationData(NamedTuple):
+    region: str
+    name: str
+    code: Optional[int]
+    type: LocationType
+    rule: Optional[Callable[[Any], bool]] = Location.access_rule
+
+
+def get_location_types(world: World, inclusion_type: LocationInclusion) -> Set[LocationType]:
+    """
+
+    :param multiworld:
+    :param player:
+    :param inclusion_type: Level of inclusion to check for
+    :return: A list of location types that match the inclusion type
+    """
+    exclusion_options = [
+        ("vanilla_locations", LocationType.VANILLA),
+        ("extra_locations", LocationType.EXTRA),
+        ("challenge_locations", LocationType.CHALLENGE),
+        ("mastery_locations", LocationType.MASTERY)
+    ]
+    excluded_location_types = set()
+    for option_name, location_type in exclusion_options:
+        if get_option_value(world, option_name) is inclusion_type:
+            excluded_location_types.add(location_type)
+    return excluded_location_types
+
+
+def get_plando_locations(world: World) -> List[str]:
+    """
+
+    :param multiworld:
+    :param player:
+    :return: A list of locations affected by a plando in a world
+    """
+    if world is None:
+        return []
+    plando_locations = []
+    for plando_setting in world.multiworld.plando_items[world.player]:
+        plando_locations += plando_setting.get("locations", [])
+        plando_setting_location = plando_setting.get("location", None)
+        if plando_setting_location is not None:
+            plando_locations.append(plando_setting_location)
+
+    return plando_locations
+
+
+def get_locations(world: Optional[World]) -> Tuple[LocationData, ...]:
+    # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option
+    logic_level = get_option_value(world, 'required_tactics')
+    adv_tactics = logic_level != RequiredTactics.option_standard
+    kerriganless = get_option_value(world, 'kerrigan_presence') not in kerrigan_unit_available \
+        or get_option_value(world, "enable_hots_missions") == EnableHotsMissions.option_false
+    story_tech_granted = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true
+    logic = SC2Logic(world)
+    player = None if world is None else world.player
+    location_table: List[LocationData] = [
+        # WoL
+        LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100, LocationType.VICTORY),
+        LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101, LocationType.VANILLA),
+        LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102, LocationType.VANILLA),
+        LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103, LocationType.VANILLA),
+        LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104, LocationType.VANILLA),
+        LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105, LocationType.VANILLA),
+        LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106, LocationType.VANILLA),
+        LocationData("Liberation Day", "Liberation Day: Special Delivery", SC2WOL_LOC_ID_OFFSET + 107, LocationType.EXTRA),
+        LocationData("Liberation Day", "Liberation Day: Transport", SC2WOL_LOC_ID_OFFSET + 108, LocationType.EXTRA),
+        LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, LocationType.VICTORY,
+                     lambda state: logic.terran_early_tech(state)),
+        LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, LocationType.VANILLA,
+                     lambda state: logic.terran_early_tech(state)),
+        LocationData("The Outlaws", "The Outlaws: North Resource Pickups", SC2WOL_LOC_ID_OFFSET + 202, LocationType.EXTRA,
+                     lambda state: logic.terran_early_tech(state)),
+        LocationData("The Outlaws", "The Outlaws: Bunker", SC2WOL_LOC_ID_OFFSET + 203, LocationType.VANILLA,
+                     lambda state: logic.terran_early_tech(state)),
+        LocationData("The Outlaws", "The Outlaws: Close Resource Pickups", SC2WOL_LOC_ID_OFFSET + 204, LocationType.EXTRA),
+        LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, LocationType.VICTORY,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_defense_rating(state, True) >= 2 and
+                                   (adv_tactics or logic.terran_basic_anti_air(state))),
+        LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301, LocationType.VANILLA),
+        LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_defense_rating(state, True) >= 2),
+        LocationData("Zero Hour", "Zero Hour: First Hatchery", SC2WOL_LOC_ID_OFFSET + 304, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Zero Hour", "Zero Hour: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 305, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Zero Hour", "Zero Hour: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 306, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Zero Hour", "Zero Hour: Fourth Hatchery", SC2WOL_LOC_ID_OFFSET + 307, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Zero Hour", "Zero Hour: Ride's on its Way", SC2WOL_LOC_ID_OFFSET + 308, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Zero Hour", "Zero Hour: Hold Just a Little Longer", SC2WOL_LOC_ID_OFFSET + 309, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_defense_rating(state, True) >= 2),
+        LocationData("Zero Hour", "Zero Hour: Cavalry's on the Way", SC2WOL_LOC_ID_OFFSET + 310, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_defense_rating(state, True) >= 2),
+        LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, LocationType.VICTORY,
+                     lambda state: logic.terran_early_tech(state) and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("Evacuation", "Evacuation: North Chrysalis", SC2WOL_LOC_ID_OFFSET + 401, LocationType.VANILLA),
+        LocationData("Evacuation", "Evacuation: West Chrysalis", SC2WOL_LOC_ID_OFFSET + 402, LocationType.VANILLA,
+                     lambda state: logic.terran_early_tech(state)),
+        LocationData("Evacuation", "Evacuation: East Chrysalis", SC2WOL_LOC_ID_OFFSET + 403, LocationType.VANILLA,
+                     lambda state: logic.terran_early_tech(state)),
+        LocationData("Evacuation", "Evacuation: Reach Hanson", SC2WOL_LOC_ID_OFFSET + 404, LocationType.EXTRA),
+        LocationData("Evacuation", "Evacuation: Secret Resource Stash", SC2WOL_LOC_ID_OFFSET + 405, LocationType.EXTRA),
+        LocationData("Evacuation", "Evacuation: Flawless", SC2WOL_LOC_ID_OFFSET + 406, LocationType.CHALLENGE,
+                     lambda state: logic.terran_early_tech(state) and
+                                   logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, LocationType.VICTORY,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 4 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, LocationType.VANILLA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, LocationType.VANILLA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: North Infested Command Center", SC2WOL_LOC_ID_OFFSET + 503, LocationType.EXTRA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: South Infested Command Center", SC2WOL_LOC_ID_OFFSET + 504, LocationType.EXTRA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: Northwest Bar", SC2WOL_LOC_ID_OFFSET + 505, LocationType.EXTRA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: North Bar", SC2WOL_LOC_ID_OFFSET + 506, LocationType.EXTRA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Outbreak", "Outbreak: South Bar", SC2WOL_LOC_ID_OFFSET + 507, LocationType.EXTRA,
+                     lambda state: logic.terran_defense_rating(state, True, False) >= 2 and
+                                   (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, LocationType.VICTORY,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Safe Haven", "Safe Haven: First Terror Fleet", SC2WOL_LOC_ID_OFFSET + 604, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Safe Haven", "Safe Haven: Second Terror Fleet", SC2WOL_LOC_ID_OFFSET + 605, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Safe Haven", "Safe Haven: Third Terror Fleet", SC2WOL_LOC_ID_OFFSET + 606, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state)),
+        LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, LocationType.VICTORY,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Haven's Fall", "Haven's Fall: Northeast Colony Base", SC2WOL_LOC_ID_OFFSET + 704, LocationType.CHALLENGE,
+                     lambda state: logic.terran_respond_to_colony_infestations(state)),
+        LocationData("Haven's Fall", "Haven's Fall: East Colony Base", SC2WOL_LOC_ID_OFFSET + 705, LocationType.CHALLENGE,
+                     lambda state: logic.terran_respond_to_colony_infestations(state)),
+        LocationData("Haven's Fall", "Haven's Fall: Middle Colony Base", SC2WOL_LOC_ID_OFFSET + 706, LocationType.CHALLENGE,
+                     lambda state: logic.terran_respond_to_colony_infestations(state)),
+        LocationData("Haven's Fall", "Haven's Fall: Southeast Colony Base", SC2WOL_LOC_ID_OFFSET + 707, LocationType.CHALLENGE,
+                     lambda state: logic.terran_respond_to_colony_infestations(state)),
+        LocationData("Haven's Fall", "Haven's Fall: Southwest Colony Base", SC2WOL_LOC_ID_OFFSET + 708, LocationType.CHALLENGE,
+                     lambda state: logic.terran_respond_to_colony_infestations(state)),
+        LocationData("Haven's Fall", "Haven's Fall: Southwest Gas Pickups", SC2WOL_LOC_ID_OFFSET + 709, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Haven's Fall", "Haven's Fall: East Gas Pickups", SC2WOL_LOC_ID_OFFSET + 710, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Haven's Fall", "Haven's Fall: Southeast Gas Pickups", SC2WOL_LOC_ID_OFFSET + 711, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   logic.terran_competent_anti_air(state) and
+                                   logic.terran_defense_rating(state, True) >= 3),
+        LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, LocationType.VICTORY,
+                     lambda state: logic.terran_common_unit(state) and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801, LocationType.VANILLA),
+        LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802, LocationType.VANILLA),
+        LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("Smash and Grab", "Smash and Grab: First Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 805, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("Smash and Grab", "Smash and Grab: Second Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 806, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state) and
+                                   (adv_tactics and logic.terran_basic_anti_air(state)
+                                    or logic.terran_competent_anti_air(state))),
+        LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, LocationType.VICTORY,
+                     lambda state: logic.terran_basic_anti_air(state)
+                                   and logic.terran_defense_rating(state, False, True) >= 8
+                                   and logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, LocationType.VANILLA,
+                     lambda state: logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, LocationType.VANILLA,
+                     lambda state: logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, LocationType.VANILLA,
+                     lambda state: logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Moebius Base", SC2WOL_LOC_ID_OFFSET + 904, LocationType.EXTRA,
+                     lambda state: logic.marine_medic_upgrade(state) or adv_tactics),
+        LocationData("The Dig", "The Dig: Door Outer Layer", SC2WOL_LOC_ID_OFFSET + 905, LocationType.EXTRA,
+                     lambda state: logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Door Thermal Barrier", SC2WOL_LOC_ID_OFFSET + 906, LocationType.EXTRA,
+                     lambda state: logic.terran_basic_anti_air(state)
+                                   and logic.terran_defense_rating(state, False, True) >= 8
+                                   and logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Cutting Through the Core", SC2WOL_LOC_ID_OFFSET + 907, LocationType.EXTRA,
+                     lambda state: logic.terran_basic_anti_air(state)
+                                   and logic.terran_defense_rating(state, False, True) >= 8
+                                   and logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Dig", "The Dig: Structure Access Imminent", SC2WOL_LOC_ID_OFFSET + 908, LocationType.EXTRA,
+                     lambda state: logic.terran_basic_anti_air(state)
+                                   and logic.terran_defense_rating(state, False, True) >= 8
+                                   and logic.terran_defense_rating(state, False, False) >= 6
+                                   and logic.terran_common_unit(state)
+                                   and (logic.marine_medic_upgrade(state) or adv_tactics)),
+        LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, LocationType.VICTORY,
+                     lambda state: logic.terran_basic_anti_air(state) and
+                                   (logic.terran_air(state)
+                                    or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player)
+                                    and logic.terran_common_unit(state))),
+        LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core", SC2WOL_LOC_ID_OFFSET + 1001, LocationType.VANILLA),
+        LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002, LocationType.VANILLA,
+                     lambda state: (logic.terran_air(state)
+                                    or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player)
+                                    and logic.terran_common_unit(state))),
+        LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, LocationType.EXTRA,
+                     lambda state: logic.terran_can_rescue(state)),
+        LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, LocationType.EXTRA,
+                     lambda state: logic.terran_can_rescue(state)),
+        LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, LocationType.EXTRA,
+                     lambda state: logic.terran_can_rescue(state)),
+        LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, LocationType.EXTRA,
+                     lambda state: logic.terran_can_rescue(state)),
+        LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, LocationType.EXTRA,
+                     lambda state: logic.terran_can_rescue(state)),
+        LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, LocationType.VANILLA,
+                     lambda state: logic.terran_basic_anti_air(state) and
+                                   (logic.terran_air(state)
+                                    or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player)
+                                    and logic.terran_common_unit(state))),
+        LocationData("The Moebius Factor", "The Moebius Factor: 3rd Data Core", SC2WOL_LOC_ID_OFFSET + 1009, LocationType.VANILLA,
+                     lambda state: logic.terran_basic_anti_air(state) and
+                                   (logic.terran_air(state)
+                                    or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player)
+                                    and logic.terran_common_unit(state))),
+        LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, LocationType.VICTORY,
+                     lambda state: logic.terran_beats_protoss_deathball(state)),
+        LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101, LocationType.VANILLA),
+        LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102, LocationType.VANILLA),
+        LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, LocationType.VANILLA,
+                     lambda state: logic.terran_beats_protoss_deathball(state)),
+        LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, LocationType.VANILLA,
+                     lambda state: logic.terran_beats_protoss_deathball(state)),
+        LocationData("Supernova", "Supernova: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1105, LocationType.EXTRA),
+        LocationData("Supernova", "Supernova: Middle Base", SC2WOL_LOC_ID_OFFSET + 1106, LocationType.EXTRA,
+                     lambda state: logic.terran_beats_protoss_deathball(state)),
+        LocationData("Supernova", "Supernova: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1107, LocationType.EXTRA,
+                     lambda state: logic.terran_beats_protoss_deathball(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, LocationType.VICTORY,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201, LocationType.EXTRA),
+        LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, LocationType.VANILLA,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, LocationType.VANILLA,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Mothership", SC2WOL_LOC_ID_OFFSET + 1206, LocationType.EXTRA,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Expansion Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1207, LocationType.EXTRA,
+                     lambda state: adv_tactics or logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Middle Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1208, LocationType.EXTRA,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Southeast Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1209, LocationType.EXTRA,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Stargate Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1210, LocationType.EXTRA,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Northwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1211, LocationType.CHALLENGE,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: West Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1212, LocationType.CHALLENGE,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Maw of the Void", "Maw of the Void: Southwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1213, LocationType.CHALLENGE,
+                     lambda state: logic.terran_survives_rip_field(state)),
+        LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, LocationType.VICTORY,
+                     lambda state: adv_tactics or
+                                   logic.terran_basic_anti_air(state) and (
+                                           logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301, LocationType.VANILLA),
+        LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)),
+        LocationData("Devil's Playground", "Devil's Playground: North Reapers", SC2WOL_LOC_ID_OFFSET + 1303, LocationType.EXTRA),
+        LocationData("Devil's Playground", "Devil's Playground: Middle Reapers", SC2WOL_LOC_ID_OFFSET + 1304, LocationType.EXTRA,
+                     lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)),
+        LocationData("Devil's Playground", "Devil's Playground: Southwest Reapers", SC2WOL_LOC_ID_OFFSET + 1305, LocationType.EXTRA,
+                     lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)),
+        LocationData("Devil's Playground", "Devil's Playground: Southeast Reapers", SC2WOL_LOC_ID_OFFSET + 1306, LocationType.EXTRA,
+                     lambda state: adv_tactics or
+                                   logic.terran_basic_anti_air(state) and (
+                                           logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Devil's Playground", "Devil's Playground: East Reapers", SC2WOL_LOC_ID_OFFSET + 1307, LocationType.CHALLENGE,
+                     lambda state: logic.terran_basic_anti_air(state) and
+                                    (adv_tactics or
+                                           logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Devil's Playground", "Devil's Playground: Zerg Cleared", SC2WOL_LOC_ID_OFFSET + 1308, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_anti_air(state) and (
+                                           logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401, LocationType.VANILLA),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, LocationType.VANILLA,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, LocationType.VANILLA,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Middle Base", SC2WOL_LOC_ID_OFFSET + 1404, LocationType.EXTRA,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Main Base", SC2WOL_LOC_ID_OFFSET + 1405,
+                     LocationType.MASTERY,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)
+                                   and logic.terran_beats_protoss_deathball(state)
+                                   and logic.terran_base_trasher(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: No Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1406, LocationType.CHALLENGE,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)
+                                    and logic.terran_competent_ground_to_air(state)
+                                   and logic.terran_beats_protoss_deathball(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 1 Terrazine Node Sealed", SC2WOL_LOC_ID_OFFSET + 1407, LocationType.CHALLENGE,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)
+                                   and logic.terran_competent_ground_to_air(state)
+                                   and logic.terran_beats_protoss_deathball(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 2 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1408, LocationType.CHALLENGE,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)
+                                   and logic.terran_beats_protoss_deathball(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 3 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1409, LocationType.CHALLENGE,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)
+                                   and logic.terran_competent_comp(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 4 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1410, LocationType.EXTRA,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)),
+        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 5 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1411, LocationType.EXTRA,
+                     lambda state: logic.welcome_to_the_jungle_requirement(state)),
+        LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500, LocationType.VICTORY),
+        LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501, LocationType.VANILLA),
+        LocationData("Breakout", "Breakout: Siege Tank Prison", SC2WOL_LOC_ID_OFFSET + 1502, LocationType.VANILLA),
+        LocationData("Breakout", "Breakout: First Checkpoint", SC2WOL_LOC_ID_OFFSET + 1503, LocationType.EXTRA),
+        LocationData("Breakout", "Breakout: Second Checkpoint", SC2WOL_LOC_ID_OFFSET + 1504, LocationType.EXTRA),
+        LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600, LocationType.VICTORY),
+        LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601, LocationType.EXTRA),
+        LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602, LocationType.EXTRA),
+        LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603, LocationType.VANILLA),
+        LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604, LocationType.VANILLA),
+        LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605, LocationType.VANILLA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, LocationType.VICTORY,
+                     lambda state: logic.great_train_robbery_train_stopper(state) and
+                                   logic.terran_basic_anti_air(state)),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701, LocationType.VANILLA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702, LocationType.VANILLA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703, LocationType.VANILLA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Close Diamondback", SC2WOL_LOC_ID_OFFSET + 1704, LocationType.EXTRA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Northwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1705, LocationType.EXTRA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: North Diamondback", SC2WOL_LOC_ID_OFFSET + 1706, LocationType.EXTRA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Northeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1707, LocationType.EXTRA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Southwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1708, LocationType.EXTRA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Southeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1709, LocationType.EXTRA),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Kill Team", SC2WOL_LOC_ID_OFFSET + 1710, LocationType.CHALLENGE,
+                     lambda state: (adv_tactics or logic.terran_common_unit(state)) and
+                                   logic.great_train_robbery_train_stopper(state) and
+                                   logic.terran_basic_anti_air(state)),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: Flawless", SC2WOL_LOC_ID_OFFSET + 1711, LocationType.CHALLENGE,
+                     lambda state: logic.great_train_robbery_train_stopper(state) and
+                                   logic.terran_basic_anti_air(state)),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: 2 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1712, LocationType.EXTRA,
+                     lambda state: logic.great_train_robbery_train_stopper(state)),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: 4 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1713, LocationType.EXTRA,
+                     lambda state: logic.great_train_robbery_train_stopper(state) and
+                                   logic.terran_basic_anti_air(state)),
+        LocationData("The Great Train Robbery", "The Great Train Robbery: 6 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1714, LocationType.EXTRA,
+                     lambda state: logic.great_train_robbery_train_stopper(state) and
+                                   logic.terran_basic_anti_air(state)),
+        LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, LocationType.VICTORY,
+                     lambda state: logic.terran_common_unit(state) and
+                                   (adv_tactics or logic.terran_basic_anti_air)),
+        LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803, LocationType.VANILLA),
+        LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, LocationType.VANILLA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Cutthroat", "Cutthroat: North Command Center", SC2WOL_LOC_ID_OFFSET + 1805, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Cutthroat", "Cutthroat: South Command Center", SC2WOL_LOC_ID_OFFSET + 1806, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Cutthroat", "Cutthroat: West Command Center", SC2WOL_LOC_ID_OFFSET + 1807, LocationType.EXTRA,
+                     lambda state: logic.terran_common_unit(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, LocationType.VICTORY,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901, LocationType.EXTRA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902,
+                     LocationType.CHALLENGE,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903, LocationType.VANILLA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, LocationType.VANILLA,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, LocationType.VANILLA,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: West Base", SC2WOL_LOC_ID_OFFSET + 1906, LocationType.EXTRA,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Northwest Base", SC2WOL_LOC_ID_OFFSET + 1907, LocationType.EXTRA,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Northeast Base", SC2WOL_LOC_ID_OFFSET + 1908, LocationType.EXTRA,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Engine of Destruction", "Engine of Destruction: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1909, LocationType.EXTRA,
+                     lambda state: logic.engine_of_destruction_requirement(state)),
+        LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, LocationType.VICTORY,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004, LocationType.VANILLA),
+        LocationData("Media Blitz", "Media Blitz: All Barracks", SC2WOL_LOC_ID_OFFSET + 2005, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: All Factories", SC2WOL_LOC_ID_OFFSET + 2006, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: All Starports", SC2WOL_LOC_ID_OFFSET + 2007, LocationType.EXTRA,
+                     lambda state: adv_tactics or logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: Odin Not Trashed", SC2WOL_LOC_ID_OFFSET + 2008, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Media Blitz", "Media Blitz: Surprise Attack Ends", SC2WOL_LOC_ID_OFFSET + 2009, LocationType.EXTRA),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, LocationType.VICTORY,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101, LocationType.VANILLA),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, LocationType.VANILLA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103, LocationType.VANILLA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, LocationType.VANILLA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, LocationType.VANILLA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Fusion Reactor", SC2WOL_LOC_ID_OFFSET + 2106, LocationType.EXTRA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Entrance Holding Pen", SC2WOL_LOC_ID_OFFSET + 2107, LocationType.EXTRA),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Cargo Bay Warbot", SC2WOL_LOC_ID_OFFSET + 2108, LocationType.EXTRA),
+        LocationData("Piercing the Shroud", "Piercing the Shroud: Escape Warbot", SC2WOL_LOC_ID_OFFSET + 2109, LocationType.EXTRA,
+                     lambda state: logic.marine_medic_upgrade(state)),
+        LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200, LocationType.VICTORY),
+        LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201, LocationType.VANILLA),
+        LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202, LocationType.VANILLA),
+        LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203, LocationType.VANILLA),
+        LocationData("Whispers of Doom", "Whispers of Doom: First Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2204, LocationType.EXTRA),
+        LocationData("Whispers of Doom", "Whispers of Doom: Second Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2205, LocationType.EXTRA),
+        LocationData("Whispers of Doom", "Whispers of Doom: Third Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2206, LocationType.EXTRA),
+        LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.protoss_common_unit(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.protoss_common_unit(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Northeast Base", SC2WOL_LOC_ID_OFFSET + 2304, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Southwest Base", SC2WOL_LOC_ID_OFFSET + 2305, LocationType.CHALLENGE,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Maar", SC2WOL_LOC_ID_OFFSET + 2306, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Northwest Preserver", SC2WOL_LOC_ID_OFFSET + 2307, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: Southwest Preserver", SC2WOL_LOC_ID_OFFSET + 2308, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("A Sinister Turn", "A Sinister Turn: East Preserver", SC2WOL_LOC_ID_OFFSET + 2309, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, LocationType.VICTORY,
+                     lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)),
+        LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401, LocationType.VANILLA),
+        LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, LocationType.VANILLA,
+                     lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)),
+        LocationData("Echoes of the Future", "Echoes of the Future: Base", SC2WOL_LOC_ID_OFFSET + 2403, LocationType.EXTRA),
+        LocationData("Echoes of the Future", "Echoes of the Future: Southwest Tendril", SC2WOL_LOC_ID_OFFSET + 2404, LocationType.EXTRA),
+        LocationData("Echoes of the Future", "Echoes of the Future: Southeast Tendril", SC2WOL_LOC_ID_OFFSET + 2405, LocationType.EXTRA,
+                     lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)),
+        LocationData("Echoes of the Future", "Echoes of the Future: Northeast Tendril", SC2WOL_LOC_ID_OFFSET + 2406, LocationType.EXTRA,
+                     lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)),
+        LocationData("Echoes of the Future", "Echoes of the Future: Northwest Tendril", SC2WOL_LOC_ID_OFFSET + 2407, LocationType.EXTRA,
+                     lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)),
+        LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500, LocationType.VICTORY),
+        LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, LocationType.VANILLA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, LocationType.VANILLA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("In Utter Darkness", "In Utter Darkness: Urun", SC2WOL_LOC_ID_OFFSET + 2503, LocationType.EXTRA),
+        LocationData("In Utter Darkness", "In Utter Darkness: Mohandar", SC2WOL_LOC_ID_OFFSET + 2504, LocationType.EXTRA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("In Utter Darkness", "In Utter Darkness: Selendis", SC2WOL_LOC_ID_OFFSET + 2505, LocationType.EXTRA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("In Utter Darkness", "In Utter Darkness: Artanis", SC2WOL_LOC_ID_OFFSET + 2506, LocationType.EXTRA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, LocationType.VICTORY,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: 2 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2602, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: 4 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2603, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: 6 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2604, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: 8 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2605, LocationType.CHALLENGE,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: Southwest Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2606, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: Northwest Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2607, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: Northeast Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2608, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: East Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2609, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: Southeast Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2610, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Gates of Hell", "Gates of Hell: Expansion Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2611, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state) and
+                                   logic.terran_defense_rating(state, True) > 6),
+        LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700, LocationType.VICTORY),
+        LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701, LocationType.EXTRA),
+        LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702, LocationType.EXTRA),
+        LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703, LocationType.EXTRA),
+        LocationData("Belly of the Beast", "Belly of the Beast: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 2704, LocationType.VANILLA),
+        LocationData("Belly of the Beast", "Belly of the Beast: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 2705, LocationType.VANILLA),
+        LocationData("Belly of the Beast", "Belly of the Beast: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 2706, LocationType.VANILLA),
+        LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.VANILLA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: East Hatchery", SC2WOL_LOC_ID_OFFSET + 2806, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: North Hatchery", SC2WOL_LOC_ID_OFFSET + 2807, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("Shatter the Sky", "Shatter the Sky: Mid Hatchery", SC2WOL_LOC_ID_OFFSET + 2808, LocationType.EXTRA,
+                     lambda state: logic.terran_competent_comp(state)),
+        LocationData("All-In", "All-In: Victory", SC2WOL_LOC_ID_OFFSET + 2900, LocationType.VICTORY,
+                     lambda state: logic.all_in_requirement(state)),
+        LocationData("All-In", "All-In: First Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2901, LocationType.EXTRA,
+                     lambda state: logic.all_in_requirement(state)),
+        LocationData("All-In", "All-In: Second Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2902, LocationType.EXTRA,
+                     lambda state: logic.all_in_requirement(state)),
+        LocationData("All-In", "All-In: Third Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2903, LocationType.EXTRA,
+                     lambda state: logic.all_in_requirement(state)),
+        LocationData("All-In", "All-In: Fourth Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2904, LocationType.EXTRA,
+                     lambda state: logic.all_in_requirement(state)),
+        LocationData("All-In", "All-In: Fifth Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2905, LocationType.EXTRA,
+                     lambda state: logic.all_in_requirement(state)),
+
+        # HotS
+        LocationData("Lab Rat", "Lab Rat: Victory", SC2HOTS_LOC_ID_OFFSET + 100, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Lab Rat", "Lab Rat: Gather Minerals", SC2HOTS_LOC_ID_OFFSET + 101, LocationType.VANILLA),
+        LocationData("Lab Rat", "Lab Rat: South Zergling Group", SC2HOTS_LOC_ID_OFFSET + 102, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.zerg_common_unit(state)),
+        LocationData("Lab Rat", "Lab Rat: East Zergling Group", SC2HOTS_LOC_ID_OFFSET + 103, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.zerg_common_unit(state)),
+        LocationData("Lab Rat", "Lab Rat: West Zergling Group", SC2HOTS_LOC_ID_OFFSET + 104, LocationType.VANILLA,
+                     lambda state: adv_tactics or logic.zerg_common_unit(state)),
+        LocationData("Lab Rat", "Lab Rat: Hatchery", SC2HOTS_LOC_ID_OFFSET + 105, LocationType.EXTRA),
+        LocationData("Lab Rat", "Lab Rat: Overlord", SC2HOTS_LOC_ID_OFFSET + 106, LocationType.EXTRA),
+        LocationData("Lab Rat", "Lab Rat: Gas Turrets", SC2HOTS_LOC_ID_OFFSET + 107, LocationType.EXTRA,
+                     lambda state: adv_tactics or logic.zerg_common_unit(state)),
+        LocationData("Back in the Saddle", "Back in the Saddle: Victory", SC2HOTS_LOC_ID_OFFSET + 200, LocationType.VICTORY,
+                     lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted),
+        LocationData("Back in the Saddle", "Back in the Saddle: Defend the Tram", SC2HOTS_LOC_ID_OFFSET + 201, LocationType.EXTRA,
+                     lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted),
+        LocationData("Back in the Saddle", "Back in the Saddle: Kinetic Blast", SC2HOTS_LOC_ID_OFFSET + 202, LocationType.VANILLA),
+        LocationData("Back in the Saddle", "Back in the Saddle: Crushing Grip", SC2HOTS_LOC_ID_OFFSET + 203, LocationType.VANILLA),
+        LocationData("Back in the Saddle", "Back in the Saddle: Reach the Sublevel", SC2HOTS_LOC_ID_OFFSET + 204, LocationType.EXTRA),
+        LocationData("Back in the Saddle", "Back in the Saddle: Door Section Cleared", SC2HOTS_LOC_ID_OFFSET + 205, LocationType.EXTRA,
+                     lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted),
+        LocationData("Rendezvous", "Rendezvous: Victory", SC2HOTS_LOC_ID_OFFSET + 300, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Rendezvous", "Rendezvous: Right Queen", SC2HOTS_LOC_ID_OFFSET + 301, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Rendezvous", "Rendezvous: Center Queen", SC2HOTS_LOC_ID_OFFSET + 302, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Rendezvous", "Rendezvous: Left Queen", SC2HOTS_LOC_ID_OFFSET + 303, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Rendezvous", "Rendezvous: Hold Out Finished", SC2HOTS_LOC_ID_OFFSET + 304, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: Victory", SC2HOTS_LOC_ID_OFFSET + 400, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: First Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 401, LocationType.VANILLA),
+        LocationData("Harvest of Screams", "Harvest of Screams: North Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 402, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: West Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 403, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: Lost Brood", SC2HOTS_LOC_ID_OFFSET + 404, LocationType.EXTRA),
+        LocationData("Harvest of Screams", "Harvest of Screams: Northeast Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 405, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: Northwest Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 406, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: Southwest Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 407, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)),
+        LocationData("Harvest of Screams", "Harvest of Screams: Nafash", SC2HOTS_LOC_ID_OFFSET + 408, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: Victory", SC2HOTS_LOC_ID_OFFSET + 500, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: East Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 501, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: Center Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 502, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) or adv_tactics),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: West Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 503, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: Destroy 4 Shuttles", SC2HOTS_LOC_ID_OFFSET + 504, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: Frozen Expansion", SC2HOTS_LOC_ID_OFFSET + 505, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: Southwest Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 506, LocationType.EXTRA),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: Southeast Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 507, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) or adv_tactics),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: West Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 508, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)),
+        LocationData("Shoot the Messenger", "Shoot the Messenger: East Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 509, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state)),
+        LocationData("Enemy Within", "Enemy Within: Victory", SC2HOTS_LOC_ID_OFFSET + 600, LocationType.VICTORY,
+                     lambda state: logic.zerg_pass_vents(state)
+                                   and (logic.story_tech_granted
+                                        or state.has_any({ItemNames.ZERGLING_RAPTOR_STRAIN, ItemNames.ROACH,
+                                                         ItemNames.HYDRALISK, ItemNames.INFESTOR}, player))
+                     ),
+        LocationData("Enemy Within", "Enemy Within: Infest Giant Ursadon", SC2HOTS_LOC_ID_OFFSET + 601, LocationType.VANILLA,
+                     lambda state: logic.zerg_pass_vents(state)),
+        LocationData("Enemy Within", "Enemy Within: First Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 602, LocationType.VANILLA,
+                     lambda state: logic.zerg_pass_vents(state)),
+        LocationData("Enemy Within", "Enemy Within: Second Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 603, LocationType.VANILLA,
+                     lambda state: logic.zerg_pass_vents(state)),
+        LocationData("Enemy Within", "Enemy Within: Third Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 604, LocationType.VANILLA,
+                     lambda state: logic.zerg_pass_vents(state)),
+        LocationData("Enemy Within", "Enemy Within: Warp Drive", SC2HOTS_LOC_ID_OFFSET + 605, LocationType.EXTRA,
+                     lambda state: logic.zerg_pass_vents(state)),
+        LocationData("Enemy Within", "Enemy Within: Stasis Quadrant", SC2HOTS_LOC_ID_OFFSET + 606, LocationType.EXTRA,
+                     lambda state: logic.zerg_pass_vents(state)),
+        LocationData("Domination", "Domination: Victory", SC2HOTS_LOC_ID_OFFSET + 700, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)),
+        LocationData("Domination", "Domination: Center Infested Command Center", SC2HOTS_LOC_ID_OFFSET + 701, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Domination", "Domination: North Infested Command Center", SC2HOTS_LOC_ID_OFFSET + 702, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Domination", "Domination: Repel Zagara", SC2HOTS_LOC_ID_OFFSET + 703, LocationType.EXTRA),
+        LocationData("Domination", "Domination: Close Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 704, LocationType.EXTRA),
+        LocationData("Domination", "Domination: South Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 705, LocationType.EXTRA,
+                     lambda state: adv_tactics or logic.zerg_common_unit(state)),
+        LocationData("Domination", "Domination: Southwest Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 706, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Domination", "Domination: Southeast Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 707, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)),
+        LocationData("Domination", "Domination: North Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 708, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Domination", "Domination: Northeast Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 709, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: Victory", SC2HOTS_LOC_ID_OFFSET + 800, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: West Biomass", SC2HOTS_LOC_ID_OFFSET + 801, LocationType.VANILLA),
+        LocationData("Fire in the Sky", "Fire in the Sky: North Biomass", SC2HOTS_LOC_ID_OFFSET + 802, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: South Biomass", SC2HOTS_LOC_ID_OFFSET + 803, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: Destroy 3 Gorgons", SC2HOTS_LOC_ID_OFFSET + 804, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: Close Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 805, LocationType.EXTRA),
+        LocationData("Fire in the Sky", "Fire in the Sky: South Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 806, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: North Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 807, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: West Queen Rescue", SC2HOTS_LOC_ID_OFFSET + 808, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Fire in the Sky", "Fire in the Sky: East Queen Rescue", SC2HOTS_LOC_ID_OFFSET + 809, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Old Soldiers", "Old Soldiers: Victory", SC2HOTS_LOC_ID_OFFSET + 900, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Old Soldiers", "Old Soldiers: East Science Lab", SC2HOTS_LOC_ID_OFFSET + 901, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Old Soldiers", "Old Soldiers: North Science Lab", SC2HOTS_LOC_ID_OFFSET + 902, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Old Soldiers", "Old Soldiers: Get Nuked", SC2HOTS_LOC_ID_OFFSET + 903, LocationType.EXTRA),
+        LocationData("Old Soldiers", "Old Soldiers: Entrance Gate", SC2HOTS_LOC_ID_OFFSET + 904, LocationType.EXTRA),
+        LocationData("Old Soldiers", "Old Soldiers: Citadel Gate", SC2HOTS_LOC_ID_OFFSET + 905, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Old Soldiers", "Old Soldiers: South Expansion", SC2HOTS_LOC_ID_OFFSET + 906, LocationType.EXTRA),
+        LocationData("Old Soldiers", "Old Soldiers: Rich Mineral Expansion", SC2HOTS_LOC_ID_OFFSET + 907, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Waking the Ancient", "Waking the Ancient: Victory", SC2HOTS_LOC_ID_OFFSET + 1000, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Waking the Ancient", "Waking the Ancient: Center Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1001, LocationType.VANILLA),
+        LocationData("Waking the Ancient", "Waking the Ancient: East Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1002, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   (adv_tactics and logic.zerg_basic_anti_air(state)
+                                    or logic.zerg_competent_anti_air(state))),
+        LocationData("Waking the Ancient", "Waking the Ancient: South Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1003, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   (adv_tactics and logic.zerg_basic_anti_air(state)
+                                    or logic.zerg_competent_anti_air(state))),
+        LocationData("Waking the Ancient", "Waking the Ancient: Finish Feeding", SC2HOTS_LOC_ID_OFFSET + 1004, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Waking the Ancient", "Waking the Ancient: South Proxy Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1005, LocationType.CHALLENGE,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Waking the Ancient", "Waking the Ancient: East Proxy Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1006, LocationType.CHALLENGE,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Waking the Ancient", "Waking the Ancient: South Main Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1007, LocationType.CHALLENGE,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Waking the Ancient", "Waking the Ancient: East Main Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1008, LocationType.CHALLENGE,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Crucible", "The Crucible: Victory", SC2HOTS_LOC_ID_OFFSET + 1100, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_defense(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Crucible", "The Crucible: Tyrannozor", SC2HOTS_LOC_ID_OFFSET + 1101, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_defense(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Crucible", "The Crucible: Reach the Pool", SC2HOTS_LOC_ID_OFFSET + 1102, LocationType.VANILLA),
+        LocationData("The Crucible", "The Crucible: 15 Minutes Remaining", SC2HOTS_LOC_ID_OFFSET + 1103, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_defense(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Crucible", "The Crucible: 5 Minutes Remaining", SC2HOTS_LOC_ID_OFFSET + 1104, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_defense(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Crucible", "The Crucible: Pincer Attack", SC2HOTS_LOC_ID_OFFSET + 1105, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_defense(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Crucible", "The Crucible: Yagdra Claims Brakk's Pack", SC2HOTS_LOC_ID_OFFSET + 1106, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_defense(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Supreme", "Supreme: Victory", SC2HOTS_LOC_ID_OFFSET + 1200, LocationType.VICTORY,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: First Relic", SC2HOTS_LOC_ID_OFFSET + 1201, LocationType.VANILLA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: Second Relic", SC2HOTS_LOC_ID_OFFSET + 1202, LocationType.VANILLA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: Third Relic", SC2HOTS_LOC_ID_OFFSET + 1203, LocationType.VANILLA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: Fourth Relic", SC2HOTS_LOC_ID_OFFSET + 1204, LocationType.VANILLA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: Yagdra", SC2HOTS_LOC_ID_OFFSET + 1205, LocationType.EXTRA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: Kraith", SC2HOTS_LOC_ID_OFFSET + 1206, LocationType.EXTRA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Supreme", "Supreme: Slivan", SC2HOTS_LOC_ID_OFFSET + 1207, LocationType.EXTRA,
+                     lambda state: logic.supreme_requirement(state)),
+        LocationData("Infested", "Infested: Victory", SC2HOTS_LOC_ID_OFFSET + 1300, LocationType.VICTORY,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   ((logic.zerg_competent_anti_air(state) and state.has(ItemNames.INFESTOR, player)) or
+                                   (adv_tactics and logic.zerg_basic_anti_air(state)))),
+        LocationData("Infested", "Infested: East Science Facility", SC2HOTS_LOC_ID_OFFSET + 1301, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Infested", "Infested: Center Science Facility", SC2HOTS_LOC_ID_OFFSET + 1302, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Infested", "Infested: West Science Facility", SC2HOTS_LOC_ID_OFFSET + 1303, LocationType.VANILLA,
+                     lambda state: logic.zerg_common_unit(state) and
+                                   logic.zerg_basic_anti_air(state) and
+                                   logic.spread_creep(state)),
+        LocationData("Infested", "Infested: First Intro Garrison", SC2HOTS_LOC_ID_OFFSET + 1304, LocationType.EXTRA),
+        LocationData("Infested", "Infested: Second Intro Garrison", SC2HOTS_LOC_ID_OFFSET + 1305, LocationType.EXTRA),
+        LocationData("Infested", "Infested: Base Garrison", SC2HOTS_LOC_ID_OFFSET + 1306, LocationType.EXTRA),
+        LocationData("Infested", "Infested: East Garrison", SC2HOTS_LOC_ID_OFFSET + 1307, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)
+                                   and (adv_tactics or state.has(ItemNames.INFESTOR, player))),
+        LocationData("Infested", "Infested: Mid Garrison", SC2HOTS_LOC_ID_OFFSET + 1308, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)
+                                   and (adv_tactics or state.has(ItemNames.INFESTOR, player))),
+        LocationData("Infested", "Infested: North Garrison", SC2HOTS_LOC_ID_OFFSET + 1309, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)
+                                   and (adv_tactics or state.has(ItemNames.INFESTOR, player))),
+        LocationData("Infested", "Infested: Close Southwest Garrison", SC2HOTS_LOC_ID_OFFSET + 1310, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)
+                                   and (adv_tactics or state.has(ItemNames.INFESTOR, player))),
+        LocationData("Infested", "Infested: Far Southwest Garrison", SC2HOTS_LOC_ID_OFFSET + 1311, LocationType.EXTRA,
+                     lambda state: logic.zerg_common_unit(state)
+                                   and logic.zerg_basic_anti_air(state)
+                                   and (adv_tactics or state.has(ItemNames.INFESTOR, player))),
+        LocationData("Hand of Darkness", "Hand of Darkness: Victory", SC2HOTS_LOC_ID_OFFSET + 1400, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: North Brutalisk", SC2HOTS_LOC_ID_OFFSET + 1401, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: South Brutalisk", SC2HOTS_LOC_ID_OFFSET + 1402, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 1 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1403, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 2 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1404, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 3 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1405, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 4 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1406, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 5 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1407, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 6 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1408, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Hand of Darkness", "Hand of Darkness: Kill 7 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1409, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_basic_anti_air(state)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Victory", SC2HOTS_LOC_ID_OFFSET + 1500, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Northwest Crystal", SC2HOTS_LOC_ID_OFFSET + 1501, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Northeast Crystal", SC2HOTS_LOC_ID_OFFSET + 1502, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: South Crystal", SC2HOTS_LOC_ID_OFFSET + 1503, LocationType.VANILLA),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Base Established", SC2HOTS_LOC_ID_OFFSET + 1504, LocationType.EXTRA),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Close Temple", SC2HOTS_LOC_ID_OFFSET + 1505, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Mid Temple", SC2HOTS_LOC_ID_OFFSET + 1506, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Southeast Temple", SC2HOTS_LOC_ID_OFFSET + 1507, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Northeast Temple", SC2HOTS_LOC_ID_OFFSET + 1508, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("Phantoms of the Void", "Phantoms of the Void: Northwest Temple", SC2HOTS_LOC_ID_OFFSET + 1509, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   (logic.zerg_competent_anti_air(state) or adv_tactics)),
+        LocationData("With Friends Like These", "With Friends Like These: Victory", SC2HOTS_LOC_ID_OFFSET + 1600, LocationType.VICTORY),
+        LocationData("With Friends Like These", "With Friends Like These: Pirate Capital Ship", SC2HOTS_LOC_ID_OFFSET + 1601, LocationType.VANILLA),
+        LocationData("With Friends Like These", "With Friends Like These: First Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1602, LocationType.VANILLA),
+        LocationData("With Friends Like These", "With Friends Like These: Second Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1603, LocationType.VANILLA),
+        LocationData("With Friends Like These", "With Friends Like These: Third Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1604, LocationType.VANILLA),
+        LocationData("Conviction", "Conviction: Victory", SC2HOTS_LOC_ID_OFFSET + 1700, LocationType.VICTORY,
+                     lambda state: logic.two_kerrigan_actives(state) and
+                                   (logic.basic_kerrigan(state) or logic.story_tech_granted) or kerriganless),
+        LocationData("Conviction", "Conviction: First Secret Documents", SC2HOTS_LOC_ID_OFFSET + 1701, LocationType.VANILLA,
+                     lambda state: logic.two_kerrigan_actives(state) or kerriganless),
+        LocationData("Conviction", "Conviction: Second Secret Documents", SC2HOTS_LOC_ID_OFFSET + 1702, LocationType.VANILLA,
+                     lambda state: logic.two_kerrigan_actives(state) and
+                                   (logic.basic_kerrigan(state) or logic.story_tech_granted) or kerriganless),
+        LocationData("Conviction", "Conviction: Power Coupling", SC2HOTS_LOC_ID_OFFSET + 1703, LocationType.EXTRA,
+                     lambda state: logic.two_kerrigan_actives(state) or kerriganless),
+        LocationData("Conviction", "Conviction: Door Blasted", SC2HOTS_LOC_ID_OFFSET + 1704, LocationType.EXTRA,
+                     lambda state: logic.two_kerrigan_actives(state) or kerriganless),
+        LocationData("Planetfall", "Planetfall: Victory", SC2HOTS_LOC_ID_OFFSET + 1800, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: East Gate", SC2HOTS_LOC_ID_OFFSET + 1801, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: Northwest Gate", SC2HOTS_LOC_ID_OFFSET + 1802, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: North Gate", SC2HOTS_LOC_ID_OFFSET + 1803, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: 1 Bile Launcher Deployed", SC2HOTS_LOC_ID_OFFSET + 1804, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: 2 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1805, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: 3 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1806, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: 4 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1807, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: 5 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1808, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: Sons of Korhal", SC2HOTS_LOC_ID_OFFSET + 1809, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: Night Wolves", SC2HOTS_LOC_ID_OFFSET + 1810, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: West Expansion", SC2HOTS_LOC_ID_OFFSET + 1811, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Planetfall", "Planetfall: Mid Expansion", SC2HOTS_LOC_ID_OFFSET + 1812, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Death From Above", "Death From Above: Victory", SC2HOTS_LOC_ID_OFFSET + 1900, LocationType.VICTORY,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Death From Above", "Death From Above: First Power Link", SC2HOTS_LOC_ID_OFFSET + 1901, LocationType.VANILLA),
+        LocationData("Death From Above", "Death From Above: Second Power Link", SC2HOTS_LOC_ID_OFFSET + 1902, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Death From Above", "Death From Above: Third Power Link", SC2HOTS_LOC_ID_OFFSET + 1903, LocationType.VANILLA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Death From Above", "Death From Above: Expansion Command Center", SC2HOTS_LOC_ID_OFFSET + 1904, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("Death From Above", "Death From Above: Main Path Command Center", SC2HOTS_LOC_ID_OFFSET + 1905, LocationType.EXTRA,
+                     lambda state: logic.zerg_competent_comp(state) and
+                                   logic.zerg_competent_anti_air(state)),
+        LocationData("The Reckoning", "The Reckoning: Victory", SC2HOTS_LOC_ID_OFFSET + 2000, LocationType.VICTORY,
+                     lambda state: logic.the_reckoning_requirement(state)),
+        LocationData("The Reckoning", "The Reckoning: South Lane", SC2HOTS_LOC_ID_OFFSET + 2001, LocationType.VANILLA,
+                     lambda state: logic.the_reckoning_requirement(state)),
+        LocationData("The Reckoning", "The Reckoning: North Lane", SC2HOTS_LOC_ID_OFFSET + 2002, LocationType.VANILLA,
+                     lambda state: logic.the_reckoning_requirement(state)),
+        LocationData("The Reckoning", "The Reckoning: East Lane", SC2HOTS_LOC_ID_OFFSET + 2003, LocationType.VANILLA,
+                     lambda state: logic.the_reckoning_requirement(state)),
+        LocationData("The Reckoning", "The Reckoning: Odin", SC2HOTS_LOC_ID_OFFSET + 2004, LocationType.EXTRA,
+                     lambda state: logic.the_reckoning_requirement(state)),
+
+        # LotV Prologue
+        LocationData("Dark Whispers", "Dark Whispers: Victory", SC2LOTV_LOC_ID_OFFSET + 100, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Dark Whispers", "Dark Whispers: First Prisoner Group", SC2LOTV_LOC_ID_OFFSET + 101, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Dark Whispers", "Dark Whispers: Second Prisoner Group", SC2LOTV_LOC_ID_OFFSET + 102, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Dark Whispers", "Dark Whispers: First Pylon", SC2LOTV_LOC_ID_OFFSET + 103, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Dark Whispers", "Dark Whispers: Second Pylon", SC2LOTV_LOC_ID_OFFSET + 104, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Ghosts in the Fog", "Ghosts in the Fog: Victory", SC2LOTV_LOC_ID_OFFSET + 200, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Ghosts in the Fog", "Ghosts in the Fog: South Rock Formation", SC2LOTV_LOC_ID_OFFSET + 201, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Ghosts in the Fog", "Ghosts in the Fog: West Rock Formation", SC2LOTV_LOC_ID_OFFSET + 202, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Ghosts in the Fog", "Ghosts in the Fog: East Rock Formation", SC2LOTV_LOC_ID_OFFSET + 203, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) \
+                                   and logic.protoss_anti_armor_anti_air(state) \
+                                   and logic.protoss_can_attack_behind_chasm(state)),
+        LocationData("Evil Awoken", "Evil Awoken: Victory", SC2LOTV_LOC_ID_OFFSET + 300, LocationType.VICTORY,
+                     lambda state: adv_tactics or logic.protoss_stalker_upgrade(state)),
+        LocationData("Evil Awoken", "Evil Awoken: Temple Investigated", SC2LOTV_LOC_ID_OFFSET + 301, LocationType.EXTRA),
+        LocationData("Evil Awoken", "Evil Awoken: Void Catalyst", SC2LOTV_LOC_ID_OFFSET + 302, LocationType.EXTRA),
+        LocationData("Evil Awoken", "Evil Awoken: First Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 303, LocationType.VANILLA),
+        LocationData("Evil Awoken", "Evil Awoken: Second Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 304, LocationType.VANILLA),
+        LocationData("Evil Awoken", "Evil Awoken: Third Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 305, LocationType.VANILLA),
+
+
+        # LotV
+        LocationData("For Aiur!", "For Aiur!: Victory", SC2LOTV_LOC_ID_OFFSET + 400, LocationType.VICTORY),
+        LocationData("For Aiur!", "For Aiur!: Southwest Hive", SC2LOTV_LOC_ID_OFFSET + 401, LocationType.VANILLA),
+        LocationData("For Aiur!", "For Aiur!: Northwest Hive", SC2LOTV_LOC_ID_OFFSET + 402, LocationType.VANILLA),
+        LocationData("For Aiur!", "For Aiur!: Northeast Hive", SC2LOTV_LOC_ID_OFFSET + 403, LocationType.VANILLA),
+        LocationData("For Aiur!", "For Aiur!: East Hive", SC2LOTV_LOC_ID_OFFSET + 404, LocationType.VANILLA),
+        LocationData("For Aiur!", "For Aiur!: West Conduit", SC2LOTV_LOC_ID_OFFSET + 405, LocationType.EXTRA),
+        LocationData("For Aiur!", "For Aiur!: Middle Conduit", SC2LOTV_LOC_ID_OFFSET + 406, LocationType.EXTRA),
+        LocationData("For Aiur!", "For Aiur!: Northeast Conduit", SC2LOTV_LOC_ID_OFFSET + 407, LocationType.EXTRA),
+        LocationData("The Growing Shadow", "The Growing Shadow: Victory", SC2LOTV_LOC_ID_OFFSET + 500, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("The Growing Shadow", "The Growing Shadow: Close Pylon", SC2LOTV_LOC_ID_OFFSET + 501, LocationType.VANILLA),
+        LocationData("The Growing Shadow", "The Growing Shadow: East Pylon", SC2LOTV_LOC_ID_OFFSET + 502, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("The Growing Shadow", "The Growing Shadow: West Pylon", SC2LOTV_LOC_ID_OFFSET + 503, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("The Growing Shadow", "The Growing Shadow: Nexus", SC2LOTV_LOC_ID_OFFSET + 504, LocationType.EXTRA),
+        LocationData("The Growing Shadow", "The Growing Shadow: Templar Base", SC2LOTV_LOC_ID_OFFSET + 505, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: Victory", SC2LOTV_LOC_ID_OFFSET + 600, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state)
+                                    and logic.protoss_anti_light_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: Close Warp Gate", SC2LOTV_LOC_ID_OFFSET + 601, LocationType.VANILLA),
+        LocationData("The Spear of Adun", "The Spear of Adun: West Warp Gate", SC2LOTV_LOC_ID_OFFSET + 602, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: North Warp Gate", SC2LOTV_LOC_ID_OFFSET + 603, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: North Power Cell", SC2LOTV_LOC_ID_OFFSET + 604, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: East Power Cell", SC2LOTV_LOC_ID_OFFSET + 605, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: South Power Cell", SC2LOTV_LOC_ID_OFFSET + 606, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("The Spear of Adun", "The Spear of Adun: Southeast Power Cell", SC2LOTV_LOC_ID_OFFSET + 607, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Victory", SC2LOTV_LOC_ID_OFFSET + 700, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Mid EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 701, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Southeast EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 702, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: North EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 703, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Mid Stabilizer", SC2LOTV_LOC_ID_OFFSET + 704, LocationType.EXTRA),
+        LocationData("Sky Shield", "Sky Shield: Southwest Stabilizer", SC2LOTV_LOC_ID_OFFSET + 705, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Northwest Stabilizer", SC2LOTV_LOC_ID_OFFSET + 706, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Northeast Stabilizer", SC2LOTV_LOC_ID_OFFSET + 707, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: Southeast Stabilizer", SC2LOTV_LOC_ID_OFFSET + 708, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: West Raynor Base", SC2LOTV_LOC_ID_OFFSET + 709, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Sky Shield", "Sky Shield: East Raynor Base", SC2LOTV_LOC_ID_OFFSET + 710, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_basic_anti_air(state)),
+        LocationData("Brothers in Arms", "Brothers in Arms: Victory", SC2LOTV_LOC_ID_OFFSET + 800, LocationType.VICTORY,
+                     lambda state: logic.brothers_in_arms_requirement(state)),
+        LocationData("Brothers in Arms", "Brothers in Arms: Mid Science Facility", SC2LOTV_LOC_ID_OFFSET + 801, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state) or logic.take_over_ai_allies),
+        LocationData("Brothers in Arms", "Brothers in Arms: North Science Facility", SC2LOTV_LOC_ID_OFFSET + 802, LocationType.VANILLA,
+                     lambda state: logic.brothers_in_arms_requirement(state)
+                                   or logic.take_over_ai_allies
+                                   and logic.advanced_tactics
+                                   and (
+                                           logic.terran_common_unit(state)
+                                           or logic.protoss_common_unit(state)
+                                   )
+                     ),
+        LocationData("Brothers in Arms", "Brothers in Arms: South Science Facility", SC2LOTV_LOC_ID_OFFSET + 803, LocationType.VANILLA,
+                     lambda state: logic.brothers_in_arms_requirement(state)),
+        LocationData("Amon's Reach", "Amon's Reach: Victory", SC2LOTV_LOC_ID_OFFSET + 900, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Amon's Reach", "Amon's Reach: Close Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 901, LocationType.VANILLA),
+        LocationData("Amon's Reach", "Amon's Reach: North Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 902, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Amon's Reach", "Amon's Reach: East Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 903, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Amon's Reach", "Amon's Reach: West Launch Bay", SC2LOTV_LOC_ID_OFFSET + 904, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Amon's Reach", "Amon's Reach: South Launch Bay", SC2LOTV_LOC_ID_OFFSET + 905, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Amon's Reach", "Amon's Reach: Northwest Launch Bay", SC2LOTV_LOC_ID_OFFSET + 906, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Amon's Reach", "Amon's Reach: East Launch Bay", SC2LOTV_LOC_ID_OFFSET + 907, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Last Stand", "Last Stand: Victory", SC2LOTV_LOC_ID_OFFSET + 1000, LocationType.VICTORY,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("Last Stand", "Last Stand: West Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1001, LocationType.VANILLA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("Last Stand", "Last Stand: North Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1002, LocationType.VANILLA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("Last Stand", "Last Stand: East Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1003, LocationType.VANILLA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("Last Stand", "Last Stand: 1 Billion Zerg", SC2LOTV_LOC_ID_OFFSET + 1004, LocationType.EXTRA,
+                     lambda state: logic.last_stand_requirement(state)),
+        LocationData("Last Stand", "Last Stand: 1.5 Billion Zerg", SC2LOTV_LOC_ID_OFFSET + 1005, LocationType.VANILLA,
+                     lambda state: logic.last_stand_requirement(state) and (
+                         state.has_all({ItemNames.KHAYDARIN_MONOLITH, ItemNames.PHOTON_CANNON, ItemNames.SHIELD_BATTERY}, player)
+                         or state.has_any({ItemNames.SOA_SOLAR_LANCE, ItemNames.SOA_DEPLOY_FENIX}, player)
+                     )),
+        LocationData("Forbidden Weapon", "Forbidden Weapon: Victory", SC2LOTV_LOC_ID_OFFSET + 1100, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Forbidden Weapon", "Forbidden Weapon: South Solarite", SC2LOTV_LOC_ID_OFFSET + 1101, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Forbidden Weapon", "Forbidden Weapon: North Solarite", SC2LOTV_LOC_ID_OFFSET + 1102, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Forbidden Weapon", "Forbidden Weapon: Northwest Solarite", SC2LOTV_LOC_ID_OFFSET + 1103, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: Victory", SC2LOTV_LOC_ID_OFFSET + 1200, LocationType.VICTORY,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: Mid Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1201, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: West Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1202, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: South Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1203, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: East Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1204, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: North Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1205, LocationType.EXTRA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("Temple of Unification", "Temple of Unification: Titanic Warp Prism", SC2LOTV_LOC_ID_OFFSET + 1206, LocationType.VANILLA,
+                     lambda state: logic.protoss_common_unit(state)
+                                   and logic.protoss_anti_armor_anti_air(state)),
+        LocationData("The Infinite Cycle", "The Infinite Cycle: Victory", SC2LOTV_LOC_ID_OFFSET + 1300, LocationType.VICTORY,
+                     lambda state: logic.the_infinite_cycle_requirement(state)),
+        LocationData("The Infinite Cycle", "The Infinite Cycle: First Hall of Revelation", SC2LOTV_LOC_ID_OFFSET + 1301, LocationType.EXTRA,
+                     lambda state: logic.the_infinite_cycle_requirement(state)),
+        LocationData("The Infinite Cycle", "The Infinite Cycle: Second Hall of Revelation", SC2LOTV_LOC_ID_OFFSET + 1302, LocationType.EXTRA,
+                     lambda state: logic.the_infinite_cycle_requirement(state)),
+        LocationData("The Infinite Cycle", "The Infinite Cycle: First Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1303, LocationType.VANILLA,
+                     lambda state: logic.the_infinite_cycle_requirement(state)),
+        LocationData("The Infinite Cycle", "The Infinite Cycle: Second Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1304, LocationType.VANILLA,
+                     lambda state: logic.the_infinite_cycle_requirement(state)),
+        LocationData("The Infinite Cycle", "The Infinite Cycle: Third Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1305, LocationType.VANILLA,
+                     lambda state: logic.the_infinite_cycle_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Victory", SC2LOTV_LOC_ID_OFFSET + 1400, LocationType.VICTORY,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Artanis", SC2LOTV_LOC_ID_OFFSET + 1401, LocationType.EXTRA),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Northwest Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1402, LocationType.EXTRA,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Northeast Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1403, LocationType.EXTRA,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Southwest Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1404, LocationType.EXTRA,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Southeast Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1405, LocationType.EXTRA,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: South Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1406, LocationType.VANILLA),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Mid Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1407, LocationType.VANILLA,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: North Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1408, LocationType.VANILLA,
+                     lambda state: logic.harbinger_of_oblivion_requirement(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: Victory", SC2LOTV_LOC_ID_OFFSET + 1500, LocationType.VICTORY,
+                     lambda state: logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: Zerg Cleared", SC2LOTV_LOC_ID_OFFSET + 1501, LocationType.EXTRA),
+        LocationData("Unsealing the Past", "Unsealing the Past: First Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1502, LocationType.EXTRA,
+                     lambda state: logic.advanced_tactics \
+                                   or logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: Second Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1503, LocationType.EXTRA,
+                     lambda state: logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: Third Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1504, LocationType.EXTRA,
+                     lambda state: logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: Fourth Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1505, LocationType.EXTRA,
+                     lambda state: logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: South Power Core", SC2LOTV_LOC_ID_OFFSET + 1506, LocationType.VANILLA,
+                     lambda state: logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Unsealing the Past", "Unsealing the Past: East Power Core", SC2LOTV_LOC_ID_OFFSET + 1507, LocationType.VANILLA,
+                     lambda state: logic.protoss_basic_splash(state)
+                                   and logic.protoss_anti_light_anti_air(state)),
+        LocationData("Purification", "Purification: Victory", SC2LOTV_LOC_ID_OFFSET + 1600, LocationType.VICTORY,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: North Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1601, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: North Sector: Northeast Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1602, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: North Sector: Southeast Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1603, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: South Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1604, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: South Sector: North Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1605, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: South Sector: East Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1606, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: West Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1607, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: West Sector: Mid Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1608, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: West Sector: East Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1609, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: East Sector: North Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1610, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: East Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1611, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: East Sector: South Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1612, LocationType.EXTRA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Purification", "Purification: Purifier Warden", SC2LOTV_LOC_ID_OFFSET + 1613, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: Victory", SC2LOTV_LOC_ID_OFFSET + 1700, LocationType.VICTORY,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: First Terrazine Fog", SC2LOTV_LOC_ID_OFFSET + 1701, LocationType.EXTRA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: Southwest Guardian", SC2LOTV_LOC_ID_OFFSET + 1702, LocationType.EXTRA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: West Guardian", SC2LOTV_LOC_ID_OFFSET + 1703, LocationType.EXTRA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: Northwest Guardian", SC2LOTV_LOC_ID_OFFSET + 1704, LocationType.EXTRA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: Northeast Guardian", SC2LOTV_LOC_ID_OFFSET + 1705, LocationType.EXTRA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: North Mothership", SC2LOTV_LOC_ID_OFFSET + 1706, LocationType.VANILLA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Steps of the Rite", "Steps of the Rite: South Mothership", SC2LOTV_LOC_ID_OFFSET + 1707, LocationType.VANILLA,
+                     lambda state: logic.steps_of_the_rite_requirement(state)),
+        LocationData("Rak'Shir", "Rak'Shir: Victory", SC2LOTV_LOC_ID_OFFSET + 1800, LocationType.VICTORY,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Rak'Shir", "Rak'Shir: North Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1801, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Rak'Shir", "Rak'Shir: Southwest Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1802, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Rak'Shir", "Rak'Shir: East Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1803, LocationType.VANILLA,
+                     lambda state: logic.protoss_competent_comp(state)),
+        LocationData("Templar's Charge", "Templar's Charge: Victory", SC2LOTV_LOC_ID_OFFSET + 1900, LocationType.VICTORY,
+                     lambda state: logic.templars_charge_requirement(state)),
+        LocationData("Templar's Charge", "Templar's Charge: Northwest Power Core", SC2LOTV_LOC_ID_OFFSET + 1901, LocationType.EXTRA,
+                     lambda state: logic.templars_charge_requirement(state)),
+        LocationData("Templar's Charge", "Templar's Charge: Northeast Power Core", SC2LOTV_LOC_ID_OFFSET + 1902, LocationType.EXTRA,
+                     lambda state: logic.templars_charge_requirement(state)),
+        LocationData("Templar's Charge", "Templar's Charge: Southeast Power Core", SC2LOTV_LOC_ID_OFFSET + 1903, LocationType.EXTRA,
+                     lambda state: logic.templars_charge_requirement(state)),
+        LocationData("Templar's Charge", "Templar's Charge: West Hybrid Statis Chamber", SC2LOTV_LOC_ID_OFFSET + 1904, LocationType.VANILLA,
+                     lambda state: logic.templars_charge_requirement(state)),
+        LocationData("Templar's Charge", "Templar's Charge: Southeast Hybrid Statis Chamber", SC2LOTV_LOC_ID_OFFSET + 1905, LocationType.VANILLA,
+                     lambda state: logic.protoss_fleet(state)),
+        LocationData("Templar's Return", "Templar's Return: Victory", SC2LOTV_LOC_ID_OFFSET + 2000, LocationType.VICTORY,
+                     lambda state: logic.templars_return_requirement(state)),
+        LocationData("Templar's Return", "Templar's Return: Citadel: First Gate", SC2LOTV_LOC_ID_OFFSET + 2001, LocationType.EXTRA),
+        LocationData("Templar's Return", "Templar's Return: Citadel: Second Gate", SC2LOTV_LOC_ID_OFFSET + 2002, LocationType.EXTRA),
+        LocationData("Templar's Return", "Templar's Return: Citadel: Power Structure", SC2LOTV_LOC_ID_OFFSET + 2003, LocationType.VANILLA),
+        LocationData("Templar's Return", "Templar's Return: Temple Grounds: Gather Army", SC2LOTV_LOC_ID_OFFSET + 2004, LocationType.VANILLA,
+                     lambda state: logic.templars_return_requirement(state)),
+        LocationData("Templar's Return", "Templar's Return: Temple Grounds: Power Structure", SC2LOTV_LOC_ID_OFFSET + 2005, LocationType.VANILLA,
+                     lambda state: logic.templars_return_requirement(state)),
+        LocationData("Templar's Return", "Templar's Return: Caverns: Purifier", SC2LOTV_LOC_ID_OFFSET + 2006, LocationType.EXTRA,
+                     lambda state: logic.templars_return_requirement(state)),
+        LocationData("Templar's Return", "Templar's Return: Caverns: Dark Templar", SC2LOTV_LOC_ID_OFFSET + 2007, LocationType.EXTRA,
+                     lambda state: logic.templars_return_requirement(state)),
+        LocationData("The Host", "The Host: Victory", SC2LOTV_LOC_ID_OFFSET + 2100, LocationType.VICTORY,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: Southeast Void Shard", SC2LOTV_LOC_ID_OFFSET + 2101, LocationType.VICTORY,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: South Void Shard", SC2LOTV_LOC_ID_OFFSET + 2102, LocationType.EXTRA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: Southwest Void Shard", SC2LOTV_LOC_ID_OFFSET + 2103, LocationType.EXTRA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: North Void Shard", SC2LOTV_LOC_ID_OFFSET + 2104, LocationType.EXTRA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: Northwest Void Shard", SC2LOTV_LOC_ID_OFFSET + 2105, LocationType.EXTRA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: Nerazim Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2106, LocationType.VANILLA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: Tal'darim Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2107, LocationType.VANILLA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("The Host", "The Host: Purifier Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2108, LocationType.VANILLA,
+                     lambda state: logic.the_host_requirement(state)),
+        LocationData("Salvation", "Salvation: Victory", SC2LOTV_LOC_ID_OFFSET + 2200, LocationType.VICTORY,
+                     lambda state: logic.salvation_requirement(state)),
+        LocationData("Salvation", "Salvation: Fabrication Matrix", SC2LOTV_LOC_ID_OFFSET + 2201, LocationType.EXTRA,
+                     lambda state: logic.salvation_requirement(state)),
+        LocationData("Salvation", "Salvation: Assault Cluster", SC2LOTV_LOC_ID_OFFSET + 2202, LocationType.EXTRA,
+                     lambda state: logic.salvation_requirement(state)),
+        LocationData("Salvation", "Salvation: Hull Breach", SC2LOTV_LOC_ID_OFFSET + 2203, LocationType.EXTRA,
+                     lambda state: logic.salvation_requirement(state)),
+        LocationData("Salvation", "Salvation: Core Critical", SC2LOTV_LOC_ID_OFFSET + 2204, LocationType.EXTRA,
+                     lambda state: logic.salvation_requirement(state)),
+
+        # Epilogue
+        LocationData("Into the Void", "Into the Void: Victory", SC2LOTV_LOC_ID_OFFSET + 2300, LocationType.VICTORY,
+                     lambda state: logic.into_the_void_requirement(state)),
+        LocationData("Into the Void", "Into the Void: Corruption Source", SC2LOTV_LOC_ID_OFFSET + 2301, LocationType.EXTRA),
+        LocationData("Into the Void", "Into the Void: Southwest Forward Position", SC2LOTV_LOC_ID_OFFSET + 2302, LocationType.VANILLA,
+                     lambda state: logic.into_the_void_requirement(state)),
+        LocationData("Into the Void", "Into the Void: Northwest Forward Position", SC2LOTV_LOC_ID_OFFSET + 2303, LocationType.VANILLA,
+                     lambda state: logic.into_the_void_requirement(state)),
+        LocationData("Into the Void", "Into the Void: Southeast Forward Position", SC2LOTV_LOC_ID_OFFSET + 2304, LocationType.VANILLA,
+                     lambda state: logic.into_the_void_requirement(state)),
+        LocationData("Into the Void", "Into the Void: Northeast Forward Position", SC2LOTV_LOC_ID_OFFSET + 2305, LocationType.VANILLA),
+        LocationData("The Essence of Eternity", "The Essence of Eternity: Victory", SC2LOTV_LOC_ID_OFFSET + 2400, LocationType.VICTORY,
+                     lambda state: logic.essence_of_eternity_requirement(state)),
+        LocationData("The Essence of Eternity", "The Essence of Eternity: Void Trashers", SC2LOTV_LOC_ID_OFFSET + 2401, LocationType.EXTRA),
+        LocationData("Amon's Fall", "Amon's Fall: Victory", SC2LOTV_LOC_ID_OFFSET + 2500, LocationType.VICTORY,
+                     lambda state: logic.amons_fall_requirement(state)),
+
+        # Nova Covert Ops
+        LocationData("The Escape", "The Escape: Victory", SC2NCO_LOC_ID_OFFSET + 100, LocationType.VICTORY,
+                     lambda state: logic.the_escape_requirement(state)),
+        LocationData("The Escape", "The Escape: Rifle", SC2NCO_LOC_ID_OFFSET + 101, LocationType.VANILLA,
+                     lambda state: logic.the_escape_first_stage_requirement(state)),
+        LocationData("The Escape", "The Escape: Grenades", SC2NCO_LOC_ID_OFFSET + 102, LocationType.VANILLA,
+                     lambda state: logic.the_escape_first_stage_requirement(state)),
+        LocationData("The Escape", "The Escape: Agent Delta", SC2NCO_LOC_ID_OFFSET + 103, LocationType.VANILLA,
+                     lambda state: logic.the_escape_requirement(state)),
+        LocationData("The Escape", "The Escape: Agent Pierce", SC2NCO_LOC_ID_OFFSET + 104, LocationType.VANILLA,
+                     lambda state: logic.the_escape_requirement(state)),
+        LocationData("The Escape", "The Escape: Agent Stone", SC2NCO_LOC_ID_OFFSET + 105, LocationType.VANILLA,
+                     lambda state: logic.the_escape_requirement(state)),
+        LocationData("Sudden Strike", "Sudden Strike: Victory", SC2NCO_LOC_ID_OFFSET + 200, LocationType.VICTORY,
+                     lambda state: logic.sudden_strike_can_reach_objectives(state)),
+        LocationData("Sudden Strike", "Sudden Strike: Research Center", SC2NCO_LOC_ID_OFFSET + 201, LocationType.VANILLA,
+                     lambda state: logic.sudden_strike_can_reach_objectives(state)),
+        LocationData("Sudden Strike", "Sudden Strike: Weaponry Labs", SC2NCO_LOC_ID_OFFSET + 202, LocationType.VANILLA,
+                     lambda state: logic.sudden_strike_requirement(state)),
+        LocationData("Sudden Strike", "Sudden Strike: Brutalisk", SC2NCO_LOC_ID_OFFSET + 203, LocationType.EXTRA,
+                     lambda state: logic.sudden_strike_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: Victory", SC2NCO_LOC_ID_OFFSET + 300, LocationType.VICTORY,
+                     lambda state: logic.enemy_intelligence_third_stage_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: West Garrison", SC2NCO_LOC_ID_OFFSET + 301, LocationType.EXTRA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: Close Garrison", SC2NCO_LOC_ID_OFFSET + 302, LocationType.EXTRA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: Northeast Garrison", SC2NCO_LOC_ID_OFFSET + 303, LocationType.EXTRA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: Southeast Garrison", SC2NCO_LOC_ID_OFFSET + 304, LocationType.EXTRA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)
+                                   and logic.enemy_intelligence_cliff_garrison(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: South Garrison", SC2NCO_LOC_ID_OFFSET + 305, LocationType.EXTRA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: All Garrisons", SC2NCO_LOC_ID_OFFSET + 306, LocationType.VANILLA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)
+                                   and logic.enemy_intelligence_cliff_garrison(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: Forces Rescued", SC2NCO_LOC_ID_OFFSET + 307, LocationType.VANILLA,
+                     lambda state: logic.enemy_intelligence_first_stage_requirement(state)),
+        LocationData("Enemy Intelligence", "Enemy Intelligence: Communications Hub", SC2NCO_LOC_ID_OFFSET + 308, LocationType.VANILLA,
+                     lambda state: logic.enemy_intelligence_second_stage_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: Victory", SC2NCO_LOC_ID_OFFSET + 400, LocationType.VICTORY,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: West Hatchery", SC2NCO_LOC_ID_OFFSET + 401, LocationType.VANILLA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: North Hatchery", SC2NCO_LOC_ID_OFFSET + 402, LocationType.VANILLA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: East Hatchery", SC2NCO_LOC_ID_OFFSET + 403, LocationType.VANILLA),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: Northwest Hatchery", SC2NCO_LOC_ID_OFFSET + 404, LocationType.VANILLA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: Southwest Hatchery", SC2NCO_LOC_ID_OFFSET + 405, LocationType.VANILLA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: East Hatchery", SC2NCO_LOC_ID_OFFSET + 406, LocationType.VANILLA),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: North Shield Projector", SC2NCO_LOC_ID_OFFSET + 407, LocationType.EXTRA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: East Shield Projector", SC2NCO_LOC_ID_OFFSET + 408, LocationType.EXTRA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: South Shield Projector", SC2NCO_LOC_ID_OFFSET + 409, LocationType.EXTRA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: West Shield Projector", SC2NCO_LOC_ID_OFFSET + 410, LocationType.EXTRA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Trouble In Paradise", "Trouble In Paradise: Fleet Beacon", SC2NCO_LOC_ID_OFFSET + 411, LocationType.VANILLA,
+                     lambda state: logic.trouble_in_paradise_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: Victory", SC2NCO_LOC_ID_OFFSET + 500, LocationType.VICTORY,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: 1 Terrazine Node Collected", SC2NCO_LOC_ID_OFFSET + 501, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: 2 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 502, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: 3 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 503, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: 4 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 504, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: 5 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 505, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: HERC Outpost", SC2NCO_LOC_ID_OFFSET + 506, LocationType.VANILLA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: Umojan Mine", SC2NCO_LOC_ID_OFFSET + 507, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: Blightbringer", SC2NCO_LOC_ID_OFFSET + 508, LocationType.VANILLA,
+                     lambda state: logic.night_terrors_requirement(state)
+                                   and logic.nova_ranged_weapon(state)
+                                   and state.has_any(
+                         {ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PULSE_GRENADES, ItemNames.NOVA_STIM_INFUSION,
+                          ItemNames.NOVA_HOLO_DECOY}, player)),
+        LocationData("Night Terrors", "Night Terrors: Science Facility", SC2NCO_LOC_ID_OFFSET + 509, LocationType.EXTRA,
+                     lambda state: logic.night_terrors_requirement(state)),
+        LocationData("Night Terrors", "Night Terrors: Eradicators", SC2NCO_LOC_ID_OFFSET + 510, LocationType.VANILLA,
+                     lambda state: logic.night_terrors_requirement(state)
+                                   and logic.nova_any_weapon(state)),
+        LocationData("Flashpoint", "Flashpoint: Victory", SC2NCO_LOC_ID_OFFSET + 600, LocationType.VICTORY,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Close North Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 601, LocationType.EXTRA,
+                     lambda state: state.has_any(
+                         {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player)
+                                   or logic.terran_common_unit(state)),
+        LocationData("Flashpoint", "Flashpoint: Close East Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 602, LocationType.EXTRA,
+                     lambda state: state.has_any(
+                         {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player)
+                                   or logic.terran_common_unit(state)),
+        LocationData("Flashpoint", "Flashpoint: Far North Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 603, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Far East Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 604, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Experimental Weapon", SC2NCO_LOC_ID_OFFSET + 605, LocationType.VANILLA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Northwest Subway Entrance", SC2NCO_LOC_ID_OFFSET + 606, LocationType.VANILLA,
+                     lambda state: state.has_any(
+                         {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player)
+                                   and logic.terran_common_unit(state)
+                                   or logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Southeast Subway Entrance", SC2NCO_LOC_ID_OFFSET + 607, LocationType.VANILLA,
+                     lambda state: state.has_any(
+                         {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player)
+                                   and logic.terran_common_unit(state)
+                                   or logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Northeast Subway Entrance", SC2NCO_LOC_ID_OFFSET + 608, LocationType.VANILLA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Expansion Hatchery", SC2NCO_LOC_ID_OFFSET + 609, LocationType.EXTRA,
+                     lambda state: state.has(ItemNames.LIBERATOR_RAID_ARTILLERY, player) and logic.terran_common_unit(state)
+                                   or logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Baneling Spawns", SC2NCO_LOC_ID_OFFSET + 610, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Mutalisk Spawns", SC2NCO_LOC_ID_OFFSET + 611, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Nydus Worm Spawns", SC2NCO_LOC_ID_OFFSET + 612, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Lurker Spawns", SC2NCO_LOC_ID_OFFSET + 613, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Brood Lord Spawns", SC2NCO_LOC_ID_OFFSET + 614, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("Flashpoint", "Flashpoint: Ultralisk Spawns", SC2NCO_LOC_ID_OFFSET + 615, LocationType.EXTRA,
+                     lambda state: logic.flashpoint_far_requirement(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Victory", SC2NCO_LOC_ID_OFFSET + 700, LocationType.VICTORY,
+                     lambda state: logic.enemy_shadow_victory(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Domination Visor", SC2NCO_LOC_ID_OFFSET + 701, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_domination(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Resupply Crate", SC2NCO_LOC_ID_OFFSET + 702, LocationType.EXTRA,
+                     lambda state: logic.enemy_shadow_first_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Facility Access", SC2NCO_LOC_ID_OFFSET + 703, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_first_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Northwest Door Lock", SC2NCO_LOC_ID_OFFSET + 704, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_door_controls(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Southeast Door Lock", SC2NCO_LOC_ID_OFFSET + 705, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_door_controls(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Blazefire Gunblade", SC2NCO_LOC_ID_OFFSET + 706, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_second_stage(state)
+                                   and (story_tech_granted
+                                        or state.has(ItemNames.NOVA_BLINK, player)
+                                        or (adv_tactics and state.has_all({ItemNames.NOVA_DOMINATION, ItemNames.NOVA_HOLO_DECOY, ItemNames.NOVA_JUMP_SUIT_MODULE}, player))
+                                        )
+                     ),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Blink Suit", SC2NCO_LOC_ID_OFFSET + 707, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_second_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Advanced Weaponry", SC2NCO_LOC_ID_OFFSET + 708, LocationType.VANILLA,
+                     lambda state: logic.enemy_shadow_second_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Entrance Resupply Crate", SC2NCO_LOC_ID_OFFSET + 709, LocationType.EXTRA,
+                     lambda state: logic.enemy_shadow_first_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: West Resupply Crate", SC2NCO_LOC_ID_OFFSET + 710, LocationType.EXTRA,
+                     lambda state: logic.enemy_shadow_second_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: North Resupply Crate", SC2NCO_LOC_ID_OFFSET + 711, LocationType.EXTRA,
+                     lambda state: logic.enemy_shadow_second_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: East Resupply Crate", SC2NCO_LOC_ID_OFFSET + 712, LocationType.EXTRA,
+                     lambda state: logic.enemy_shadow_second_stage(state)),
+        LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: South Resupply Crate", SC2NCO_LOC_ID_OFFSET + 713, LocationType.EXTRA,
+                     lambda state: logic.enemy_shadow_second_stage(state)),
+        LocationData("Dark Skies", "Dark Skies: Victory", SC2NCO_LOC_ID_OFFSET + 800, LocationType.VICTORY,
+                     lambda state: logic.dark_skies_requirement(state)),
+        LocationData("Dark Skies", "Dark Skies: First Squadron of Dominion Fleet", SC2NCO_LOC_ID_OFFSET + 801, LocationType.EXTRA,
+                     lambda state: logic.dark_skies_requirement(state)),
+        LocationData("Dark Skies", "Dark Skies: Remainder of Dominion Fleet", SC2NCO_LOC_ID_OFFSET + 802, LocationType.EXTRA,
+                     lambda state: logic.dark_skies_requirement(state)),
+        LocationData("Dark Skies", "Dark Skies: Ji'nara", SC2NCO_LOC_ID_OFFSET + 803, LocationType.EXTRA,
+                     lambda state: logic.dark_skies_requirement(state)),
+        LocationData("Dark Skies", "Dark Skies: Science Facility", SC2NCO_LOC_ID_OFFSET + 804, LocationType.VANILLA,
+                     lambda state: logic.dark_skies_requirement(state)),
+        LocationData("End Game", "End Game: Victory", SC2NCO_LOC_ID_OFFSET + 900, LocationType.VICTORY,
+                     lambda state: logic.end_game_requirement(state) and logic.nova_any_weapon(state)),
+        LocationData("End Game", "End Game: Xanthos", SC2NCO_LOC_ID_OFFSET + 901, LocationType.VANILLA,
+                     lambda state: logic.end_game_requirement(state)),
+    ]
+
+    beat_events = []
+    # Filtering out excluded locations
+    if world is not None:
+        excluded_location_types = get_location_types(world, LocationInclusion.option_disabled)
+        plando_locations = get_plando_locations(world)
+        exclude_locations = get_option_value(world, "exclude_locations")
+        location_table = [location for location in location_table
+                          if (LocationType is LocationType.VICTORY or location.name not in exclude_locations)
+                          and location.type not in excluded_location_types
+                          or location.name in plando_locations]
+    for i, location_data in enumerate(location_table):
+        # Removing all item-based logic on No Logic
+        if logic_level == RequiredTactics.option_no_logic:
+            location_data = location_data._replace(rule=Location.access_rule)
+            location_table[i] = location_data
+        # Generating Beat event locations
+        if location_data.name.endswith((": Victory", ": Defeat")):
+            beat_events.append(
+                location_data._replace(name="Beat " + location_data.name.rsplit(": ", 1)[0], code=None)
+            )
+    return tuple(location_table + beat_events)
+
+lookup_location_id_to_type = {loc.code: loc.type for loc in get_locations(None) if loc.code is not None}
\ No newline at end of file
diff --git a/worlds/sc2/MissionTables.py b/worlds/sc2/MissionTables.py
new file mode 100644
index 00000000..99b6448a
--- /dev/null
+++ b/worlds/sc2/MissionTables.py
@@ -0,0 +1,737 @@
+from typing import NamedTuple, Dict, List, Set, Union, Literal, Iterable, Callable
+from enum import IntEnum, Enum
+
+
+class SC2Race(IntEnum):
+    ANY = 0
+    TERRAN = 1
+    ZERG = 2
+    PROTOSS = 3
+
+
+class MissionPools(IntEnum):
+    STARTER = 0
+    EASY = 1
+    MEDIUM = 2
+    HARD = 3
+    VERY_HARD = 4
+    FINAL = 5
+
+
+class SC2CampaignGoalPriority(IntEnum):
+    """
+    Campaign's priority to goal election
+    """
+    NONE = 0
+    MINI_CAMPAIGN = 1  # A goal shouldn't be in a mini-campaign if there's at least one 'big' campaign
+    HARD = 2  # A campaign ending with a hard mission
+    VERY_HARD = 3  # A campaign ending with a very hard mission
+    EPILOGUE = 4  # Epilogue shall be always preferred as the goal if present
+
+
+class SC2Campaign(Enum):
+
+    def __new__(cls, *args, **kwargs):
+        value = len(cls.__members__) + 1
+        obj = object.__new__(cls)
+        obj._value_ = value
+        return obj
+
+    def __init__(self, campaign_id: int, name: str, goal_priority: SC2CampaignGoalPriority,  race: SC2Race):
+        self.id = campaign_id
+        self.campaign_name = name
+        self.goal_priority = goal_priority
+        self.race = race
+
+    GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY
+    WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN
+    PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS
+    HOTS = 3, "Heart of the Swarm", SC2CampaignGoalPriority.HARD, SC2Race.ZERG
+    PROLOGUE = 4, "Whispers of Oblivion (Legacy of the Void: Prologue)", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS
+    LOTV = 5, "Legacy of the Void", SC2CampaignGoalPriority.VERY_HARD, SC2Race.PROTOSS
+    EPILOGUE = 6, "Into the Void (Legacy of the Void: Epilogue)", SC2CampaignGoalPriority.EPILOGUE, SC2Race.ANY
+    NCO = 7, "Nova Covert Ops", SC2CampaignGoalPriority.HARD, SC2Race.TERRAN
+
+
+class SC2Mission(Enum):
+
+    def __new__(cls, *args, **kwargs):
+        value = len(cls.__members__) + 1
+        obj = object.__new__(cls)
+        obj._value_ = value
+        return obj
+
+    def __init__(self, mission_id: int, name: str, campaign: SC2Campaign, area: str, race: SC2Race, pool: MissionPools, map_file: str, build: bool = True):
+        self.id = mission_id
+        self.mission_name = name
+        self.campaign = campaign
+        self.area = area
+        self.race = race
+        self.pool = pool
+        self.map_file = map_file
+        self.build = build
+
+    # Wings of Liberty
+    LIBERATION_DAY = 1, "Liberation Day", SC2Campaign.WOL, "Mar Sara", SC2Race.ANY, MissionPools.STARTER, "ap_liberation_day", False
+    THE_OUTLAWS = 2, "The Outlaws", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_the_outlaws"
+    ZERO_HOUR = 3, "Zero Hour", SC2Campaign.WOL, "Mar Sara",  SC2Race.TERRAN, MissionPools.EASY, "ap_zero_hour"
+    EVACUATION = 4, "Evacuation", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_evacuation"
+    OUTBREAK = 5, "Outbreak", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_outbreak"
+    SAFE_HAVEN = 6, "Safe Haven", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_safe_haven"
+    HAVENS_FALL = 7, "Haven's Fall", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_havens_fall"
+    SMASH_AND_GRAB = 8, "Smash and Grab", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.EASY, "ap_smash_and_grab"
+    THE_DIG = 9, "The Dig", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_dig"
+    THE_MOEBIUS_FACTOR = 10, "The Moebius Factor", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_moebius_factor"
+    SUPERNOVA = 11, "Supernova", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_supernova"
+    MAW_OF_THE_VOID = 12, "Maw of the Void", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_maw_of_the_void"
+    DEVILS_PLAYGROUND = 13, "Devil's Playground", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.EASY, "ap_devils_playground"
+    WELCOME_TO_THE_JUNGLE = 14, "Welcome to the Jungle", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_welcome_to_the_jungle"
+    BREAKOUT = 15, "Breakout", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_breakout", False
+    GHOST_OF_A_CHANCE = 16, "Ghost of a Chance", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_ghost_of_a_chance", False
+    THE_GREAT_TRAIN_ROBBERY = 17, "The Great Train Robbery", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_great_train_robbery"
+    CUTTHROAT = 18, "Cutthroat", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_cutthroat"
+    ENGINE_OF_DESTRUCTION = 19, "Engine of Destruction", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.HARD, "ap_engine_of_destruction"
+    MEDIA_BLITZ = 20, "Media Blitz", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_media_blitz"
+    PIERCING_OF_THE_SHROUD = 21, "Piercing the Shroud", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.STARTER, "ap_piercing_the_shroud", False
+    GATES_OF_HELL = 26, "Gates of Hell", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_gates_of_hell"
+    BELLY_OF_THE_BEAST = 27, "Belly of the Beast", SC2Campaign.WOL, "Char", SC2Race.ANY, MissionPools.STARTER, "ap_belly_of_the_beast", False
+    SHATTER_THE_SKY = 28, "Shatter the Sky", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_shatter_the_sky"
+    ALL_IN = 29, "All-In", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_all_in"
+
+    # Prophecy
+    WHISPERS_OF_DOOM = 22, "Whispers of Doom", SC2Campaign.PROPHECY, "_1", SC2Race.ANY, MissionPools.STARTER, "ap_whispers_of_doom", False
+    A_SINISTER_TURN = 23, "A Sinister Turn", SC2Campaign.PROPHECY, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_a_sinister_turn"
+    ECHOES_OF_THE_FUTURE = 24, "Echoes of the Future", SC2Campaign.PROPHECY, "_3", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_echoes_of_the_future"
+    IN_UTTER_DARKNESS = 25, "In Utter Darkness", SC2Campaign.PROPHECY, "_4", SC2Race.PROTOSS, MissionPools.HARD, "ap_in_utter_darkness"
+
+    # Heart of the Swarm
+    LAB_RAT = 30, "Lab Rat", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.STARTER, "ap_lab_rat"
+    BACK_IN_THE_SADDLE = 31, "Back in the Saddle", SC2Campaign.HOTS, "Umoja", SC2Race.ANY, MissionPools.STARTER, "ap_back_in_the_saddle", False
+    RENDEZVOUS = 32, "Rendezvous", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.EASY, "ap_rendezvous"
+    HARVEST_OF_SCREAMS = 33, "Harvest of Screams", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_harvest_of_screams"
+    SHOOT_THE_MESSENGER = 34, "Shoot the Messenger", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_shoot_the_messenger"
+    ENEMY_WITHIN = 35, "Enemy Within", SC2Campaign.HOTS, "Kaldir", SC2Race.ANY, MissionPools.EASY, "ap_enemy_within", False
+    DOMINATION = 36, "Domination", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.EASY, "ap_domination"
+    FIRE_IN_THE_SKY = 37, "Fire in the Sky", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_fire_in_the_sky"
+    OLD_SOLDIERS = 38, "Old Soldiers", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_old_soldiers"
+    WAKING_THE_ANCIENT = 39, "Waking the Ancient", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_waking_the_ancient"
+    THE_CRUCIBLE = 40, "The Crucible", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_crucible"
+    SUPREME = 41, "Supreme", SC2Campaign.HOTS, "Zerus", SC2Race.ANY, MissionPools.MEDIUM, "ap_supreme", False
+    INFESTED = 42, "Infested", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_infested"
+    HAND_OF_DARKNESS = 43, "Hand of Darkness", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_hand_of_darkness"
+    PHANTOMS_OF_THE_VOID = 44, "Phantoms of the Void", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_phantoms_of_the_void"
+    WITH_FRIENDS_LIKE_THESE = 45, "With Friends Like These", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.STARTER, "ap_with_friends_like_these", False
+    CONVICTION = 46, "Conviction", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.MEDIUM, "ap_conviction", False
+    PLANETFALL = 47, "Planetfall", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_planetfall"
+    DEATH_FROM_ABOVE = 48, "Death From Above", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_death_from_above"
+    THE_RECKONING = 49, "The Reckoning", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_the_reckoning"
+
+    # Prologue
+    DARK_WHISPERS = 50, "Dark Whispers", SC2Campaign.PROLOGUE, "_1", SC2Race.PROTOSS, MissionPools.EASY, "ap_dark_whispers"
+    GHOSTS_IN_THE_FOG = 51, "Ghosts in the Fog", SC2Campaign.PROLOGUE, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_ghosts_in_the_fog"
+    EVIL_AWOKEN = 52, "Evil Awoken", SC2Campaign.PROLOGUE, "_3", SC2Race.PROTOSS, MissionPools.STARTER, "ap_evil_awoken", False
+
+    # LotV
+    FOR_AIUR = 53, "For Aiur!", SC2Campaign.LOTV, "Aiur", SC2Race.ANY, MissionPools.STARTER, "ap_for_aiur", False
+    THE_GROWING_SHADOW = 54, "The Growing Shadow", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_growing_shadow"
+    THE_SPEAR_OF_ADUN = 55, "The Spear of Adun", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_spear_of_adun"
+    SKY_SHIELD = 56, "Sky Shield", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.EASY, "ap_sky_shield"
+    BROTHERS_IN_ARMS = 57, "Brothers in Arms", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_brothers_in_arms"
+    AMON_S_REACH = 58, "Amon's Reach", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.EASY, "ap_amon_s_reach"
+    LAST_STAND = 59, "Last Stand", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.HARD, "ap_last_stand"
+    FORBIDDEN_WEAPON = 60, "Forbidden Weapon", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_forbidden_weapon"
+    TEMPLE_OF_UNIFICATION = 61, "Temple of Unification", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_temple_of_unification"
+    THE_INFINITE_CYCLE = 62, "The Infinite Cycle", SC2Campaign.LOTV, "Ulnar", SC2Race.ANY, MissionPools.HARD, "ap_the_infinite_cycle", False
+    HARBINGER_OF_OBLIVION = 63, "Harbinger of Oblivion", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_harbinger_of_oblivion"
+    UNSEALING_THE_PAST = 64, "Unsealing the Past", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_unsealing_the_past"
+    PURIFICATION = 65, "Purification", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_purification"
+    STEPS_OF_THE_RITE = 66, "Steps of the Rite", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_steps_of_the_rite"
+    RAK_SHIR = 67, "Rak'Shir", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_rak_shir"
+    TEMPLAR_S_CHARGE = 68, "Templar's Charge", SC2Campaign.LOTV, "Moebius", SC2Race.PROTOSS, MissionPools.HARD, "ap_templar_s_charge"
+    TEMPLAR_S_RETURN = 69, "Templar's Return", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_templar_s_return", False
+    THE_HOST = 70, "The Host", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.HARD, "ap_the_host",
+    SALVATION = 71, "Salvation", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_salvation"
+
+    # Epilogue
+    INTO_THE_VOID = 72, "Into the Void", SC2Campaign.EPILOGUE, "_1", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_into_the_void"
+    THE_ESSENCE_OF_ETERNITY = 73, "The Essence of Eternity", SC2Campaign.EPILOGUE, "_2", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_essence_of_eternity"
+    AMON_S_FALL = 74, "Amon's Fall", SC2Campaign.EPILOGUE, "_3", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_amon_s_fall"
+
+    # Nova Covert Ops
+    THE_ESCAPE = 75, "The Escape", SC2Campaign.NCO, "_1", SC2Race.ANY, MissionPools.MEDIUM, "ap_the_escape", False
+    SUDDEN_STRIKE = 76, "Sudden Strike", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.EASY, "ap_sudden_strike"
+    ENEMY_INTELLIGENCE = 77, "Enemy Intelligence", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_enemy_intelligence"
+    TROUBLE_IN_PARADISE = 78, "Trouble In Paradise", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_trouble_in_paradise"
+    NIGHT_TERRORS = 79, "Night Terrors", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_night_terrors"
+    FLASHPOINT = 80, "Flashpoint", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_flashpoint"
+    IN_THE_ENEMY_S_SHADOW = 81, "In the Enemy's Shadow", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_in_the_enemy_s_shadow", False
+    DARK_SKIES = 82, "Dark Skies", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.HARD, "ap_dark_skies"
+    END_GAME = 83, "End Game", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_end_game"
+
+
+class MissionConnection:
+    campaign: SC2Campaign
+    connect_to: int  # -1 connects to Menu
+
+    def __init__(self, connect_to, campaign = SC2Campaign.GLOBAL):
+        self.campaign = campaign
+        self.connect_to = connect_to
+
+    def _asdict(self):
+        return {
+            "campaign": self.campaign.id,
+            "connect_to": self.connect_to
+        }
+
+
+class MissionInfo(NamedTuple):
+    mission: SC2Mission
+    required_world: List[Union[MissionConnection, Dict[Literal["campaign", "connect_to"], int]]]
+    category: str
+    number: int = 0  # number of worlds need beaten
+    completion_critical: bool = False  # missions needed to beat game
+    or_requirements: bool = False  # true if the requirements should be or-ed instead of and-ed
+    ui_vertical_padding: int = 0
+
+
+class FillMission(NamedTuple):
+    type: MissionPools
+    connect_to: List[MissionConnection]
+    category: str
+    number: int = 0  # number of worlds need beaten
+    completion_critical: bool = False  # missions needed to beat game
+    or_requirements: bool = False  # true if the requirements should be or-ed instead of and-ed
+    removal_priority: int = 0  # how many missions missing from the pool required to remove this mission
+
+
+
+def vanilla_shuffle_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.WOL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Mar Sara", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.WOL)], "Colonist"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.WOL)], "Colonist"),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Colonist", number=7),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Colonist", number=7, removal_priority=1),
+            FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.WOL)], "Artifact", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(7, SC2Campaign.WOL)], "Artifact", number=8, completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.WOL)], "Artifact", number=11, completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.WOL)], "Artifact", number=14, completion_critical=True, removal_priority=7),
+            FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.WOL)], "Artifact", completion_critical=True, removal_priority=6),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.WOL)], "Covert", number=4),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(12, SC2Campaign.WOL)], "Covert"),
+            FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.WOL)], "Covert", number=8, removal_priority=3),
+            FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.WOL)], "Covert", number=8, removal_priority=2),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.WOL)], "Rebellion", number=6),
+            FillMission(MissionPools.HARD, [MissionConnection(16, SC2Campaign.WOL)], "Rebellion"),
+            FillMission(MissionPools.HARD, [MissionConnection(17, SC2Campaign.WOL)], "Rebellion"),
+            FillMission(MissionPools.HARD, [MissionConnection(18, SC2Campaign.WOL)], "Rebellion", removal_priority=8),
+            FillMission(MissionPools.HARD, [MissionConnection(19, SC2Campaign.WOL)], "Rebellion", removal_priority=5),
+            FillMission(MissionPools.HARD, [MissionConnection(11, SC2Campaign.WOL)], "Char", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(21, SC2Campaign.WOL)], "Char", completion_critical=True, removal_priority=4),
+            FillMission(MissionPools.HARD, [MissionConnection(21, SC2Campaign.WOL)], "Char", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(22, SC2Campaign.WOL), MissionConnection(23, SC2Campaign.WOL)], "Char", completion_critical=True, or_requirements=True)
+        ],
+        SC2Campaign.PROPHECY: [
+            FillMission(MissionPools.MEDIUM, [MissionConnection(8, SC2Campaign.WOL)], "_1"),
+            FillMission(MissionPools.HARD, [MissionConnection(0, SC2Campaign.PROPHECY)], "_2", removal_priority=2),
+            FillMission(MissionPools.HARD, [MissionConnection(1, SC2Campaign.PROPHECY)], "_3", removal_priority=1),
+            FillMission(MissionPools.FINAL, [MissionConnection(2, SC2Campaign.PROPHECY)], "_4"),
+        ],
+        SC2Campaign.HOTS: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.HOTS)], "Umoja", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Umoja", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.HOTS)], "Umoja", completion_critical=True, removal_priority=1),
+            FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.HOTS)], "Kaldir", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.HOTS)], "Kaldir", completion_critical=True, removal_priority=2),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(4, SC2Campaign.HOTS)], "Kaldir", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.HOTS)], "Char", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(6, SC2Campaign.HOTS)], "Char", completion_critical=True, removal_priority=3),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(7, SC2Campaign.HOTS)], "Char", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS)], "Zerus", completion_critical=True, or_requirements=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(9, SC2Campaign.HOTS)], "Zerus", completion_critical=True, removal_priority=4),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(10, SC2Campaign.HOTS)], "Zerus", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS), MissionConnection(11, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True, removal_priority=5),
+            FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS), MissionConnection(11, SC2Campaign.HOTS)], "Dominion Space", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(15, SC2Campaign.HOTS)], "Dominion Space", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(14, SC2Campaign.HOTS), MissionConnection(16, SC2Campaign.HOTS)], "Korhal", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(17, SC2Campaign.HOTS)], "Korhal", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(18, SC2Campaign.HOTS)], "Korhal", completion_critical=True),
+        ],
+        SC2Campaign.PROLOGUE: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.PROLOGUE)], "_1"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.PROLOGUE)], "_2", removal_priority=1),
+            FillMission(MissionPools.FINAL, [MissionConnection(1, SC2Campaign.PROLOGUE)], "_3")
+        ],
+        SC2Campaign.LOTV: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.LOTV)], "Aiur", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.LOTV)], "Aiur", completion_critical=True, removal_priority=3),
+            FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.LOTV)], "Aiur", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV)], "Korhal", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.LOTV)], "Korhal", completion_critical=True, removal_priority=7),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV)], "Shakuras", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.LOTV)], "Shakuras", completion_critical=True, removal_priority=6),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV), MissionConnection(6, SC2Campaign.LOTV)], "Purifier", completion_critical=True, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV), MissionConnection(6, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], "Ulnar", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.LOTV)], "Ulnar", completion_critical=True, removal_priority=1),
+            FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.LOTV)], "Ulnar", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.LOTV)], "Purifier", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(11, SC2Campaign.LOTV)], "Purifier", completion_critical=True, removal_priority=5),
+            FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True, removal_priority=4),
+            FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.LOTV), MissionConnection(14, SC2Campaign.LOTV)], "Moebius", completion_critical=True, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.LOTV), MissionConnection(14, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(16, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True, removal_priority=2),
+            FillMission(MissionPools.FINAL, [MissionConnection(17, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True),
+        ],
+        SC2Campaign.EPILOGUE: [
+            FillMission(MissionPools.VERY_HARD, [MissionConnection(24, SC2Campaign.WOL), MissionConnection(19, SC2Campaign.HOTS), MissionConnection(18, SC2Campaign.LOTV)], "_1", completion_critical=True),
+            FillMission(MissionPools.VERY_HARD, [MissionConnection(0, SC2Campaign.EPILOGUE)], "_2", completion_critical=True, removal_priority=1),
+            FillMission(MissionPools.FINAL, [MissionConnection(1, SC2Campaign.EPILOGUE)], "_3", completion_critical=True),
+        ],
+        SC2Campaign.NCO: [
+            FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.NCO)], "_1", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.NCO)], "_1", completion_critical=True, removal_priority=6),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.NCO)], "_1", completion_critical=True, removal_priority=5),
+            FillMission(MissionPools.HARD, [MissionConnection(2, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=7),
+            FillMission(MissionPools.HARD, [MissionConnection(3, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=4),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=3),
+            FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.NCO)], "_3", completion_critical=True, removal_priority=2),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.NCO)], "_3", completion_critical=True, removal_priority=1),
+            FillMission(MissionPools.FINAL, [MissionConnection(7, SC2Campaign.NCO)], "_3", completion_critical=True),
+        ]
+    }
+
+
+def mini_campaign_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.WOL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Colonist"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.WOL)], "Colonist"),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Artifact", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.WOL)], "Artifact", number=4, completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Artifact", number=8, completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.WOL)], "Covert", number=2),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.WOL)], "Covert"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.WOL)], "Rebellion", number=3),
+            FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.WOL)], "Rebellion"),
+            FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.WOL)], "Char", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.WOL)], "Char", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(10, SC2Campaign.WOL), MissionConnection(11, SC2Campaign.WOL)], "Char", completion_critical=True, or_requirements=True)
+        ],
+        SC2Campaign.PROPHECY: [
+            FillMission(MissionPools.MEDIUM, [MissionConnection(4, SC2Campaign.WOL)], "_1"),
+            FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.PROPHECY)], "_2"),
+        ],
+        SC2Campaign.HOTS: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.HOTS)], "Umoja", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Kaldir"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.HOTS)], "Kaldir"),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Char"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.HOTS)], "Char"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.HOTS)], "Zerus", number=3),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS)], "Zerus"),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Skygeirr Station", number=5),
+            FillMission(MissionPools.HARD, [MissionConnection(7, SC2Campaign.HOTS)], "Skygeirr Station"),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Dominion Space", number=5),
+            FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.HOTS)], "Dominion Space"),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Korhal", completion_critical=True, number=8),
+            FillMission(MissionPools.FINAL, [MissionConnection(11, SC2Campaign.HOTS)], "Korhal", completion_critical=True),
+        ],
+        SC2Campaign.PROLOGUE: [
+            FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.PROLOGUE)], "_1"),
+            FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.PROLOGUE)], "_2")
+        ],
+        SC2Campaign.LOTV: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.LOTV)], "Aiur",completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.LOTV)], "Aiur", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.LOTV)], "Korhal", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.LOTV)], "Shakuras", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV), MissionConnection(3, SC2Campaign.LOTV)], "Purifier", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.LOTV)], "Purifier", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV)], "Ulnar", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(8, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True),
+        ],
+        SC2Campaign.EPILOGUE: [
+            FillMission(MissionPools.VERY_HARD, [MissionConnection(12, SC2Campaign.WOL), MissionConnection(12, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.LOTV)], "_1", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.EPILOGUE)], "_2", completion_critical=True),
+        ],
+        SC2Campaign.NCO: [
+            FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.NCO)], "_1", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.NCO)], "_1", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.NCO)], "_2", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(2, SC2Campaign.NCO)], "_3", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(3, SC2Campaign.NCO)], "_3", completion_critical=True),
+        ]
+    }
+
+
+def gauntlet_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.GLOBAL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "II", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(1)], "III", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(2)], "IV", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3)], "V", completion_critical=True),
+            FillMission(MissionPools.HARD, [MissionConnection(4)], "VI", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(5)], "Final", completion_critical=True)
+        ]
+    }
+
+
+def mini_gauntlet_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.GLOBAL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I", completion_critical=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "II", completion_critical=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1)], "III", completion_critical=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(2)], "Final", completion_critical=True)
+        ]
+    }
+
+
+def grid_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.GLOBAL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "_1"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(6), MissionConnection( 3)], "_1", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(7)], "_1", or_requirements=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(4)], "_2", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(5), MissionConnection(10), MissionConnection(7)], "_2", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(3), MissionConnection(6), MissionConnection(11)], "_2", or_requirements=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(4), MissionConnection(9), MissionConnection(12)], "_3", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(5), MissionConnection(8), MissionConnection(10), MissionConnection(13)], "_3", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(6), MissionConnection(9), MissionConnection(11), MissionConnection(14)], "_3", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(7), MissionConnection(10)], "_3", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(8), MissionConnection(13)], "_4", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(9), MissionConnection(12), MissionConnection(14)], "_4", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(10), MissionConnection(13)], "_4", or_requirements=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(11), MissionConnection(14)], "_4", or_requirements=True)
+        ]
+    }
+
+def mini_grid_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.GLOBAL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "_1"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(5)], "_1", or_requirements=True),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(3)], "_2", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(4)], "_2", or_requirements=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(3), MissionConnection(7)], "_3", or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(4), MissionConnection(6)], "_3", or_requirements=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(5), MissionConnection(7)], "_3", or_requirements=True)
+        ]
+    }
+
+def tiny_grid_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.GLOBAL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0)], "_1"),
+            FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"),
+            FillMission(MissionPools.FINAL, [MissionConnection(1), MissionConnection(2)], "_2", or_requirements=True),
+        ]
+    }
+
+def blitz_order() -> Dict[SC2Campaign, List[FillMission]]:
+    return {
+        SC2Campaign.GLOBAL: [
+            FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I"),
+            FillMission(MissionPools.EASY, [MissionConnection(-1)], "I"),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "II", number=1, or_requirements=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "II", number=1, or_requirements=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "III", number=2, or_requirements=True),
+            FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "III", number=2, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "IV", number=3, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "IV", number=3, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "V", number=4, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "V", number=4, or_requirements=True),
+            FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "Final", number=5, or_requirements=True),
+            FillMission(MissionPools.FINAL, [MissionConnection(0), MissionConnection(1)], "Final", number=5, or_requirements=True)
+        ]
+    }
+
+
+mission_orders: List[Callable[[], Dict[SC2Campaign, List[FillMission]]]] = [
+    vanilla_shuffle_order,
+    vanilla_shuffle_order,
+    mini_campaign_order,
+    grid_order,
+    mini_grid_order,
+    blitz_order,
+    gauntlet_order,
+    mini_gauntlet_order,
+    tiny_grid_order
+]
+
+
+vanilla_mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {
+    SC2Campaign.WOL: {
+        SC2Mission.LIBERATION_DAY.mission_name: MissionInfo(SC2Mission.LIBERATION_DAY, [], SC2Mission.LIBERATION_DAY.area, completion_critical=True),
+        SC2Mission.THE_OUTLAWS.mission_name: MissionInfo(SC2Mission.THE_OUTLAWS, [MissionConnection(1, SC2Campaign.WOL)], SC2Mission.THE_OUTLAWS.area, completion_critical=True),
+        SC2Mission.ZERO_HOUR.mission_name: MissionInfo(SC2Mission.ZERO_HOUR, [MissionConnection(2, SC2Campaign.WOL)], SC2Mission.ZERO_HOUR.area, completion_critical=True),
+        SC2Mission.EVACUATION.mission_name: MissionInfo(SC2Mission.EVACUATION, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.EVACUATION.area),
+        SC2Mission.OUTBREAK.mission_name: MissionInfo(SC2Mission.OUTBREAK, [MissionConnection(4, SC2Campaign.WOL)], SC2Mission.OUTBREAK.area),
+        SC2Mission.SAFE_HAVEN.mission_name: MissionInfo(SC2Mission.SAFE_HAVEN, [MissionConnection(5, SC2Campaign.WOL)], SC2Mission.SAFE_HAVEN.area, number=7),
+        SC2Mission.HAVENS_FALL.mission_name: MissionInfo(SC2Mission.HAVENS_FALL, [MissionConnection(5, SC2Campaign.WOL)], SC2Mission.HAVENS_FALL.area, number=7),
+        SC2Mission.SMASH_AND_GRAB.mission_name: MissionInfo(SC2Mission.SMASH_AND_GRAB, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.SMASH_AND_GRAB.area, completion_critical=True),
+        SC2Mission.THE_DIG.mission_name: MissionInfo(SC2Mission.THE_DIG, [MissionConnection(8, SC2Campaign.WOL)], SC2Mission.THE_DIG.area, number=8, completion_critical=True),
+        SC2Mission.THE_MOEBIUS_FACTOR.mission_name: MissionInfo(SC2Mission.THE_MOEBIUS_FACTOR, [MissionConnection(9, SC2Campaign.WOL)], SC2Mission.THE_MOEBIUS_FACTOR.area, number=11, completion_critical=True),
+        SC2Mission.SUPERNOVA.mission_name: MissionInfo(SC2Mission.SUPERNOVA, [MissionConnection(10, SC2Campaign.WOL)], SC2Mission.SUPERNOVA.area, number=14, completion_critical=True),
+        SC2Mission.MAW_OF_THE_VOID.mission_name: MissionInfo(SC2Mission.MAW_OF_THE_VOID, [MissionConnection(11, SC2Campaign.WOL)], SC2Mission.MAW_OF_THE_VOID.area, completion_critical=True),
+        SC2Mission.DEVILS_PLAYGROUND.mission_name: MissionInfo(SC2Mission.DEVILS_PLAYGROUND, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.DEVILS_PLAYGROUND.area, number=4),
+        SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name: MissionInfo(SC2Mission.WELCOME_TO_THE_JUNGLE, [MissionConnection(13, SC2Campaign.WOL)], SC2Mission.WELCOME_TO_THE_JUNGLE.area),
+        SC2Mission.BREAKOUT.mission_name: MissionInfo(SC2Mission.BREAKOUT, [MissionConnection(14, SC2Campaign.WOL)], SC2Mission.BREAKOUT.area, number=8),
+        SC2Mission.GHOST_OF_A_CHANCE.mission_name: MissionInfo(SC2Mission.GHOST_OF_A_CHANCE, [MissionConnection(14, SC2Campaign.WOL)], SC2Mission.GHOST_OF_A_CHANCE.area, number=8),
+        SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name: MissionInfo(SC2Mission.THE_GREAT_TRAIN_ROBBERY, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.THE_GREAT_TRAIN_ROBBERY.area, number=6),
+        SC2Mission.CUTTHROAT.mission_name: MissionInfo(SC2Mission.CUTTHROAT, [MissionConnection(17, SC2Campaign.WOL)], SC2Mission.THE_GREAT_TRAIN_ROBBERY.area),
+        SC2Mission.ENGINE_OF_DESTRUCTION.mission_name: MissionInfo(SC2Mission.ENGINE_OF_DESTRUCTION, [MissionConnection(18, SC2Campaign.WOL)], SC2Mission.ENGINE_OF_DESTRUCTION.area),
+        SC2Mission.MEDIA_BLITZ.mission_name: MissionInfo(SC2Mission.MEDIA_BLITZ, [MissionConnection(19, SC2Campaign.WOL)], SC2Mission.MEDIA_BLITZ.area),
+        SC2Mission.PIERCING_OF_THE_SHROUD.mission_name: MissionInfo(SC2Mission.PIERCING_OF_THE_SHROUD, [MissionConnection(20, SC2Campaign.WOL)], SC2Mission.PIERCING_OF_THE_SHROUD.area),
+        SC2Mission.GATES_OF_HELL.mission_name: MissionInfo(SC2Mission.GATES_OF_HELL, [MissionConnection(12, SC2Campaign.WOL)], SC2Mission.GATES_OF_HELL.area, completion_critical=True),
+        SC2Mission.BELLY_OF_THE_BEAST.mission_name: MissionInfo(SC2Mission.BELLY_OF_THE_BEAST, [MissionConnection(22, SC2Campaign.WOL)], SC2Mission.BELLY_OF_THE_BEAST.area, completion_critical=True),
+        SC2Mission.SHATTER_THE_SKY.mission_name: MissionInfo(SC2Mission.SHATTER_THE_SKY, [MissionConnection(22, SC2Campaign.WOL)], SC2Mission.SHATTER_THE_SKY.area, completion_critical=True),
+        SC2Mission.ALL_IN.mission_name: MissionInfo(SC2Mission.ALL_IN, [MissionConnection(23, SC2Campaign.WOL), MissionConnection(24, SC2Campaign.WOL)], SC2Mission.ALL_IN.area, or_requirements=True, completion_critical=True)
+    },
+    SC2Campaign.PROPHECY: {
+        SC2Mission.WHISPERS_OF_DOOM.mission_name: MissionInfo(SC2Mission.WHISPERS_OF_DOOM, [MissionConnection(9, SC2Campaign.WOL)], SC2Mission.WHISPERS_OF_DOOM.area),
+        SC2Mission.A_SINISTER_TURN.mission_name: MissionInfo(SC2Mission.A_SINISTER_TURN, [MissionConnection(1, SC2Campaign.PROPHECY)], SC2Mission.A_SINISTER_TURN.area),
+        SC2Mission.ECHOES_OF_THE_FUTURE.mission_name: MissionInfo(SC2Mission.ECHOES_OF_THE_FUTURE, [MissionConnection(2, SC2Campaign.PROPHECY)], SC2Mission.ECHOES_OF_THE_FUTURE.area),
+        SC2Mission.IN_UTTER_DARKNESS.mission_name: MissionInfo(SC2Mission.IN_UTTER_DARKNESS, [MissionConnection(3, SC2Campaign.PROPHECY)], SC2Mission.IN_UTTER_DARKNESS.area)
+    },
+    SC2Campaign.HOTS: {
+        SC2Mission.LAB_RAT.mission_name: MissionInfo(SC2Mission.LAB_RAT, [], SC2Mission.LAB_RAT.area, completion_critical=True),
+        SC2Mission.BACK_IN_THE_SADDLE.mission_name: MissionInfo(SC2Mission.BACK_IN_THE_SADDLE, [MissionConnection(1, SC2Campaign.HOTS)], SC2Mission.BACK_IN_THE_SADDLE.area, completion_critical=True),
+        SC2Mission.RENDEZVOUS.mission_name: MissionInfo(SC2Mission.RENDEZVOUS, [MissionConnection(2, SC2Campaign.HOTS)], SC2Mission.RENDEZVOUS.area, completion_critical=True),
+        SC2Mission.HARVEST_OF_SCREAMS.mission_name: MissionInfo(SC2Mission.HARVEST_OF_SCREAMS, [MissionConnection(3, SC2Campaign.HOTS)], SC2Mission.HARVEST_OF_SCREAMS.area),
+        SC2Mission.SHOOT_THE_MESSENGER.mission_name: MissionInfo(SC2Mission.SHOOT_THE_MESSENGER, [MissionConnection(4, SC2Campaign.HOTS)], SC2Mission.SHOOT_THE_MESSENGER.area),
+        SC2Mission.ENEMY_WITHIN.mission_name: MissionInfo(SC2Mission.ENEMY_WITHIN, [MissionConnection(5, SC2Campaign.HOTS)], SC2Mission.ENEMY_WITHIN.area),
+        SC2Mission.DOMINATION.mission_name: MissionInfo(SC2Mission.DOMINATION, [MissionConnection(3, SC2Campaign.HOTS)], SC2Mission.DOMINATION.area),
+        SC2Mission.FIRE_IN_THE_SKY.mission_name: MissionInfo(SC2Mission.FIRE_IN_THE_SKY, [MissionConnection(7, SC2Campaign.HOTS)], SC2Mission.FIRE_IN_THE_SKY.area),
+        SC2Mission.OLD_SOLDIERS.mission_name: MissionInfo(SC2Mission.OLD_SOLDIERS, [MissionConnection(8, SC2Campaign.HOTS)], SC2Mission.OLD_SOLDIERS.area),
+        SC2Mission.WAKING_THE_ANCIENT.mission_name: MissionInfo(SC2Mission.WAKING_THE_ANCIENT, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS)], SC2Mission.WAKING_THE_ANCIENT.area, completion_critical=True, or_requirements=True),
+        SC2Mission.THE_CRUCIBLE.mission_name: MissionInfo(SC2Mission.THE_CRUCIBLE, [MissionConnection(10, SC2Campaign.HOTS)], SC2Mission.THE_CRUCIBLE.area, completion_critical=True),
+        SC2Mission.SUPREME.mission_name: MissionInfo(SC2Mission.SUPREME, [MissionConnection(11, SC2Campaign.HOTS)], SC2Mission.SUPREME.area, completion_critical=True),
+        SC2Mission.INFESTED.mission_name: MissionInfo(SC2Mission.INFESTED, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS), MissionConnection(12, SC2Campaign.HOTS)], SC2Mission.INFESTED.area),
+        SC2Mission.HAND_OF_DARKNESS.mission_name: MissionInfo(SC2Mission.HAND_OF_DARKNESS, [MissionConnection(13, SC2Campaign.HOTS)], SC2Mission.HAND_OF_DARKNESS.area),
+        SC2Mission.PHANTOMS_OF_THE_VOID.mission_name: MissionInfo(SC2Mission.PHANTOMS_OF_THE_VOID, [MissionConnection(14, SC2Campaign.HOTS)], SC2Mission.PHANTOMS_OF_THE_VOID.area),
+        SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name: MissionInfo(SC2Mission.WITH_FRIENDS_LIKE_THESE, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS), MissionConnection(12, SC2Campaign.HOTS)], SC2Mission.WITH_FRIENDS_LIKE_THESE.area),
+        SC2Mission.CONVICTION.mission_name: MissionInfo(SC2Mission.CONVICTION, [MissionConnection(16, SC2Campaign.HOTS)], SC2Mission.CONVICTION.area),
+        SC2Mission.PLANETFALL.mission_name: MissionInfo(SC2Mission.PLANETFALL, [MissionConnection(15, SC2Campaign.HOTS), MissionConnection(17, SC2Campaign.HOTS)], SC2Mission.PLANETFALL.area, completion_critical=True),
+        SC2Mission.DEATH_FROM_ABOVE.mission_name: MissionInfo(SC2Mission.DEATH_FROM_ABOVE, [MissionConnection(18, SC2Campaign.HOTS)], SC2Mission.DEATH_FROM_ABOVE.area, completion_critical=True),
+        SC2Mission.THE_RECKONING.mission_name: MissionInfo(SC2Mission.THE_RECKONING, [MissionConnection(19, SC2Campaign.HOTS)], SC2Mission.THE_RECKONING.area, completion_critical=True),
+    },
+    SC2Campaign.PROLOGUE: {
+        SC2Mission.DARK_WHISPERS.mission_name: MissionInfo(SC2Mission.DARK_WHISPERS, [], SC2Mission.DARK_WHISPERS.area),
+        SC2Mission.GHOSTS_IN_THE_FOG.mission_name: MissionInfo(SC2Mission.GHOSTS_IN_THE_FOG, [MissionConnection(1, SC2Campaign.PROLOGUE)], SC2Mission.GHOSTS_IN_THE_FOG.area),
+        SC2Mission.EVIL_AWOKEN.mission_name: MissionInfo(SC2Mission.EVIL_AWOKEN, [MissionConnection(2, SC2Campaign.PROLOGUE)], SC2Mission.EVIL_AWOKEN.area)
+    },
+    SC2Campaign.LOTV: {
+        SC2Mission.FOR_AIUR.mission_name: MissionInfo(SC2Mission.FOR_AIUR, [], SC2Mission.FOR_AIUR.area, completion_critical=True),
+        SC2Mission.THE_GROWING_SHADOW.mission_name: MissionInfo(SC2Mission.THE_GROWING_SHADOW, [MissionConnection(1, SC2Campaign.LOTV)], SC2Mission.THE_GROWING_SHADOW.area, completion_critical=True),
+        SC2Mission.THE_SPEAR_OF_ADUN.mission_name: MissionInfo(SC2Mission.THE_SPEAR_OF_ADUN, [MissionConnection(2, SC2Campaign.LOTV)], SC2Mission.THE_SPEAR_OF_ADUN.area, completion_critical=True),
+        SC2Mission.SKY_SHIELD.mission_name: MissionInfo(SC2Mission.SKY_SHIELD, [MissionConnection(3, SC2Campaign.LOTV)], SC2Mission.SKY_SHIELD.area, completion_critical=True),
+        SC2Mission.BROTHERS_IN_ARMS.mission_name: MissionInfo(SC2Mission.BROTHERS_IN_ARMS, [MissionConnection(4, SC2Campaign.LOTV)], SC2Mission.BROTHERS_IN_ARMS.area, completion_critical=True),
+        SC2Mission.AMON_S_REACH.mission_name: MissionInfo(SC2Mission.AMON_S_REACH, [MissionConnection(3, SC2Campaign.LOTV)], SC2Mission.AMON_S_REACH.area, completion_critical=True),
+        SC2Mission.LAST_STAND.mission_name: MissionInfo(SC2Mission.LAST_STAND, [MissionConnection(6, SC2Campaign.LOTV)], SC2Mission.LAST_STAND.area, completion_critical=True),
+        SC2Mission.FORBIDDEN_WEAPON.mission_name: MissionInfo(SC2Mission.FORBIDDEN_WEAPON, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], SC2Mission.FORBIDDEN_WEAPON.area, completion_critical=True, or_requirements=True),
+        SC2Mission.TEMPLE_OF_UNIFICATION.mission_name: MissionInfo(SC2Mission.TEMPLE_OF_UNIFICATION, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV), MissionConnection(8, SC2Campaign.LOTV)], SC2Mission.TEMPLE_OF_UNIFICATION.area, completion_critical=True),
+        SC2Mission.THE_INFINITE_CYCLE.mission_name: MissionInfo(SC2Mission.THE_INFINITE_CYCLE, [MissionConnection(9, SC2Campaign.LOTV)], SC2Mission.THE_INFINITE_CYCLE.area, completion_critical=True),
+        SC2Mission.HARBINGER_OF_OBLIVION.mission_name: MissionInfo(SC2Mission.HARBINGER_OF_OBLIVION, [MissionConnection(10, SC2Campaign.LOTV)], SC2Mission.HARBINGER_OF_OBLIVION.area, completion_critical=True),
+        SC2Mission.UNSEALING_THE_PAST.mission_name: MissionInfo(SC2Mission.UNSEALING_THE_PAST, [MissionConnection(11, SC2Campaign.LOTV)], SC2Mission.UNSEALING_THE_PAST.area, completion_critical=True),
+        SC2Mission.PURIFICATION.mission_name: MissionInfo(SC2Mission.PURIFICATION, [MissionConnection(12, SC2Campaign.LOTV)], SC2Mission.PURIFICATION.area, completion_critical=True),
+        SC2Mission.STEPS_OF_THE_RITE.mission_name: MissionInfo(SC2Mission.STEPS_OF_THE_RITE, [MissionConnection(11, SC2Campaign.LOTV)], SC2Mission.STEPS_OF_THE_RITE.area, completion_critical=True),
+        SC2Mission.RAK_SHIR.mission_name: MissionInfo(SC2Mission.RAK_SHIR, [MissionConnection(14, SC2Campaign.LOTV)], SC2Mission.RAK_SHIR.area, completion_critical=True),
+        SC2Mission.TEMPLAR_S_CHARGE.mission_name: MissionInfo(SC2Mission.TEMPLAR_S_CHARGE, [MissionConnection(13, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV)], SC2Mission.TEMPLAR_S_CHARGE.area, completion_critical=True, or_requirements=True),
+        SC2Mission.TEMPLAR_S_RETURN.mission_name: MissionInfo(SC2Mission.TEMPLAR_S_RETURN, [MissionConnection(13, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV), MissionConnection(16, SC2Campaign.LOTV)], SC2Mission.TEMPLAR_S_RETURN.area, completion_critical=True),
+        SC2Mission.THE_HOST.mission_name: MissionInfo(SC2Mission.THE_HOST, [MissionConnection(17, SC2Campaign.LOTV)], SC2Mission.THE_HOST.area, completion_critical=True),
+        SC2Mission.SALVATION.mission_name: MissionInfo(SC2Mission.SALVATION, [MissionConnection(18, SC2Campaign.LOTV)], SC2Mission.SALVATION.area, completion_critical=True),
+    },
+    SC2Campaign.EPILOGUE: {
+        SC2Mission.INTO_THE_VOID.mission_name: MissionInfo(SC2Mission.INTO_THE_VOID, [MissionConnection(25, SC2Campaign.WOL), MissionConnection(20, SC2Campaign.HOTS), MissionConnection(19, SC2Campaign.LOTV)], SC2Mission.INTO_THE_VOID.area, completion_critical=True),
+        SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name: MissionInfo(SC2Mission.THE_ESSENCE_OF_ETERNITY, [MissionConnection(1, SC2Campaign.EPILOGUE)], SC2Mission.THE_ESSENCE_OF_ETERNITY.area, completion_critical=True),
+        SC2Mission.AMON_S_FALL.mission_name: MissionInfo(SC2Mission.AMON_S_FALL, [MissionConnection(2, SC2Campaign.EPILOGUE)], SC2Mission.AMON_S_FALL.area, completion_critical=True),
+    },
+    SC2Campaign.NCO: {
+        SC2Mission.THE_ESCAPE.mission_name: MissionInfo(SC2Mission.THE_ESCAPE, [], SC2Mission.THE_ESCAPE.area, completion_critical=True),
+        SC2Mission.SUDDEN_STRIKE.mission_name: MissionInfo(SC2Mission.SUDDEN_STRIKE, [MissionConnection(1, SC2Campaign.NCO)], SC2Mission.SUDDEN_STRIKE.area, completion_critical=True),
+        SC2Mission.ENEMY_INTELLIGENCE.mission_name: MissionInfo(SC2Mission.ENEMY_INTELLIGENCE, [MissionConnection(2, SC2Campaign.NCO)], SC2Mission.ENEMY_INTELLIGENCE.area, completion_critical=True),
+        SC2Mission.TROUBLE_IN_PARADISE.mission_name: MissionInfo(SC2Mission.TROUBLE_IN_PARADISE, [MissionConnection(3, SC2Campaign.NCO)], SC2Mission.TROUBLE_IN_PARADISE.area, completion_critical=True),
+        SC2Mission.NIGHT_TERRORS.mission_name: MissionInfo(SC2Mission.NIGHT_TERRORS, [MissionConnection(4, SC2Campaign.NCO)], SC2Mission.NIGHT_TERRORS.area, completion_critical=True),
+        SC2Mission.FLASHPOINT.mission_name: MissionInfo(SC2Mission.FLASHPOINT, [MissionConnection(5, SC2Campaign.NCO)], SC2Mission.FLASHPOINT.area, completion_critical=True),
+        SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name: MissionInfo(SC2Mission.IN_THE_ENEMY_S_SHADOW, [MissionConnection(6, SC2Campaign.NCO)], SC2Mission.IN_THE_ENEMY_S_SHADOW.area, completion_critical=True),
+        SC2Mission.DARK_SKIES.mission_name: MissionInfo(SC2Mission.DARK_SKIES, [MissionConnection(7, SC2Campaign.NCO)], SC2Mission.DARK_SKIES.area, completion_critical=True),
+        SC2Mission.END_GAME.mission_name: MissionInfo(SC2Mission.END_GAME, [MissionConnection(8, SC2Campaign.NCO)], SC2Mission.END_GAME.area, completion_critical=True),
+    }
+}
+
+lookup_id_to_mission: Dict[int, SC2Mission] = {
+    mission.id: mission for mission in SC2Mission
+}
+
+lookup_name_to_mission: Dict[str, SC2Mission] = {
+    mission.mission_name: mission for mission in SC2Mission
+}
+
+lookup_id_to_campaign: Dict[int, SC2Campaign] = {
+    campaign.id: campaign for campaign in SC2Campaign
+}
+
+
+campaign_mission_table: Dict[SC2Campaign, Set[SC2Mission]] = {
+    campaign: set() for campaign in SC2Campaign
+}
+for mission in SC2Mission:
+    campaign_mission_table[mission.campaign].add(mission)
+
+
+def get_campaign_difficulty(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> MissionPools:
+    """
+
+    :param campaign:
+    :param excluded_missions:
+    :return: Campaign's the most difficult non-excluded mission
+    """
+    excluded_mission_set = set(excluded_missions)
+    included_missions = campaign_mission_table[campaign].difference(excluded_mission_set)
+    return max([mission.pool for mission in included_missions])
+
+
+def get_campaign_goal_priority(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> SC2CampaignGoalPriority:
+    """
+    Gets a modified campaign goal priority.
+    If all the campaign's goal missions are excluded, it's ineligible to have the goal
+    If the campaign's very hard missions are excluded, the priority is lowered to hard
+    :param campaign:
+    :param excluded_missions:
+    :return:
+    """
+    if excluded_missions is None:
+        return campaign.goal_priority
+    else:
+        goal_missions = set(get_campaign_potential_goal_missions(campaign))
+        excluded_mission_set = set(excluded_missions)
+        remaining_goals = goal_missions.difference(excluded_mission_set)
+        if remaining_goals == set():
+            # All potential goals are excluded, the campaign can't be a goal
+            return SC2CampaignGoalPriority.NONE
+        elif campaign.goal_priority == SC2CampaignGoalPriority.VERY_HARD:
+            # Check if a very hard campaign doesn't get rid of it's last very hard mission
+            difficulty = get_campaign_difficulty(campaign, excluded_missions)
+            if difficulty == MissionPools.VERY_HARD:
+                return SC2CampaignGoalPriority.VERY_HARD
+            else:
+                return SC2CampaignGoalPriority.HARD
+        else:
+            return campaign.goal_priority
+
+
+class SC2CampaignGoal(NamedTuple):
+    mission: SC2Mission
+    location: str
+
+
+campaign_final_mission_locations: Dict[SC2Campaign, SC2CampaignGoal] = {
+    SC2Campaign.WOL: SC2CampaignGoal(SC2Mission.ALL_IN, "All-In: Victory"),
+    SC2Campaign.PROPHECY: SC2CampaignGoal(SC2Mission.IN_UTTER_DARKNESS, "In Utter Darkness: Kills"),
+    SC2Campaign.HOTS: None,
+    SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, "Evil Awoken: Victory"),
+    SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, "Salvation: Victory"),
+    SC2Campaign.EPILOGUE: None,
+    SC2Campaign.NCO: None,
+}
+
+campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = {
+    SC2Campaign.WOL: {
+        SC2Mission.MAW_OF_THE_VOID: "Maw of the Void: Victory",
+        SC2Mission.ENGINE_OF_DESTRUCTION: "Engine of Destruction: Victory",
+        SC2Mission.SUPERNOVA: "Supernova: Victory",
+        SC2Mission.GATES_OF_HELL: "Gates of Hell: Victory",
+        SC2Mission.SHATTER_THE_SKY: "Shatter the Sky: Victory"
+    },
+    SC2Campaign.PROPHECY: None,
+    SC2Campaign.HOTS: {
+        SC2Mission.THE_RECKONING: "The Reckoning: Victory",
+        SC2Mission.THE_CRUCIBLE: "The Crucible: Victory",
+        SC2Mission.HAND_OF_DARKNESS: "Hand of Darkness: Victory",
+        SC2Mission.PHANTOMS_OF_THE_VOID: "Phantoms of the Void: Victory",
+        SC2Mission.PLANETFALL: "Planetfall: Victory",
+        SC2Mission.DEATH_FROM_ABOVE: "Death From Above: Victory"
+    },
+    SC2Campaign.PROLOGUE: {
+        SC2Mission.GHOSTS_IN_THE_FOG: "Ghosts in the Fog: Victory"
+    },
+    SC2Campaign.LOTV: {
+        SC2Mission.THE_HOST: "The Host: Victory",
+        SC2Mission.TEMPLAR_S_CHARGE: "Templar's Charge: Victory"
+    },
+    SC2Campaign.EPILOGUE: {
+        SC2Mission.AMON_S_FALL: "Amon's Fall: Victory",
+        SC2Mission.INTO_THE_VOID: "Into the Void: Victory",
+        SC2Mission.THE_ESSENCE_OF_ETERNITY: "The Essence of Eternity: Victory",
+    },
+    SC2Campaign.NCO: {
+        SC2Mission.END_GAME: "End Game: Victory",
+        SC2Mission.FLASHPOINT: "Flashpoint: Victory",
+        SC2Mission.DARK_SKIES: "Dark Skies: Victory",
+        SC2Mission.NIGHT_TERRORS: "Night Terrors: Victory",
+        SC2Mission.TROUBLE_IN_PARADISE: "Trouble In Paradise: Victory"
+    }
+}
+
+campaign_race_exceptions: Dict[SC2Mission, SC2Race] = {
+    SC2Mission.WITH_FRIENDS_LIKE_THESE: SC2Race.TERRAN
+}
+
+
+def get_goal_location(mission: SC2Mission) -> Union[str, None]:
+    """
+
+    :param mission:
+    :return: Goal location assigned to the goal mission
+    """
+    campaign = mission.campaign
+    primary_campaign_goal = campaign_final_mission_locations[campaign]
+    if primary_campaign_goal is not None:
+        if primary_campaign_goal.mission == mission:
+            return primary_campaign_goal.location
+
+    campaign_alt_goals = campaign_alt_final_mission_locations[campaign]
+    if campaign_alt_goals is not None:
+        return campaign_alt_goals.get(mission)
+
+    return None
+
+
+def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]:
+    """
+
+    :param campaign:
+    :return: All missions that can be the campaign's goal
+    """
+    missions: List[SC2Mission] = list()
+    primary_goal_mission = campaign_final_mission_locations[campaign]
+    if primary_goal_mission is not None:
+        missions.append(primary_goal_mission.mission)
+    alt_goal_locations = campaign_alt_final_mission_locations[campaign]
+    if alt_goal_locations is not None:
+        for mission in alt_goal_locations.keys():
+            missions.append(mission)
+
+    return missions
+
+
+def get_no_build_missions() -> List[SC2Mission]:
+    return [mission for mission in SC2Mission if not mission.build]
diff --git a/worlds/sc2/Options.py b/worlds/sc2/Options.py
new file mode 100644
index 00000000..88febb70
--- /dev/null
+++ b/worlds/sc2/Options.py
@@ -0,0 +1,908 @@
+from dataclasses import dataclass, fields, Field
+from typing import FrozenSet, Union, Set
+
+from Options import Choice, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range, PerGameCommonOptions
+from .MissionTables import SC2Campaign, SC2Mission, lookup_name_to_mission, MissionPools, get_no_build_missions, \
+    campaign_mission_table
+from worlds.AutoWorld import World
+
+
+class GameDifficulty(Choice):
+    """
+    The difficulty of the campaign, affects enemy AI, starting units, and game speed.
+
+    For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level
+    lower than the vanilla game
+    """
+    display_name = "Game Difficulty"
+    option_casual = 0
+    option_normal = 1
+    option_hard = 2
+    option_brutal = 3
+    default = 1
+
+
+class GameSpeed(Choice):
+    """Optional setting to override difficulty-based game speed."""
+    display_name = "Game Speed"
+    option_default = 0
+    option_slower = 1
+    option_slow = 2
+    option_normal = 3
+    option_fast = 4
+    option_faster = 5
+    default = option_default
+
+
+class DisableForcedCamera(Toggle):
+    """
+    Prevents the game from moving or locking the camera without the player's consent.
+    """
+    display_name = "Disable Forced Camera Movement"
+
+
+class SkipCutscenes(Toggle):
+    """
+    Skips all cutscenes and prevents dialog from blocking progress.
+    """
+    display_name = "Skip Cutscenes"
+
+
+class AllInMap(Choice):
+    """Determines what version of All-In (WoL final map) that will be generated for the campaign."""
+    display_name = "All In Map"
+    option_ground = 0
+    option_air = 1
+
+
+class MissionOrder(Choice):
+    """
+    Determines the order the missions are played in.  The last three mission orders end in a random mission.
+    Vanilla (83 total if all campaigns enabled): Keeps the standard mission order and branching from the vanilla Campaigns.
+    Vanilla Shuffled (83 total if all campaigns enabled): Keeps same branching paths from the vanilla Campaigns but randomizes the order of missions within.
+    Mini Campaign (47 total if all campaigns enabled): Shorter version of the campaign with randomized missions and optional branches.
+    Medium Grid (16):  A 4x4 grid of random missions.  Start at the top-left and forge a path towards bottom-right mission to win.
+    Mini Grid (9):  A 3x3 version of Grid.  Complete the bottom-right mission to win.
+    Blitz (12):  12 random missions that open up very quickly.  Complete the bottom-right mission to win.
+    Gauntlet (7): Linear series of 7 random missions to complete the campaign.
+    Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign.
+    Tiny Grid (4): A 2x2 version of Grid.  Complete the bottom-right mission to win.
+    Grid (variable): A grid that will resize to use all non-excluded missions.  Corners may be omitted to make the grid more square.  Complete the bottom-right mission to win.
+    """
+    display_name = "Mission Order"
+    option_vanilla = 0
+    option_vanilla_shuffled = 1
+    option_mini_campaign = 2
+    option_medium_grid = 3
+    option_mini_grid = 4
+    option_blitz = 5
+    option_gauntlet = 6
+    option_mini_gauntlet = 7
+    option_tiny_grid = 8
+    option_grid = 9
+
+
+class MaximumCampaignSize(Range):
+    """
+    Sets an upper bound on how many missions to include when a variable-size mission order is selected.
+    If a set-size mission order is selected, does nothing.
+    """
+    display_name = "Maximum Campaign Size"
+    range_start = 1
+    range_end = 83
+    default = 83
+
+
+class GridTwoStartPositions(Toggle):
+    """
+    If turned on and 'grid' mission order is selected, removes a mission from the starting
+    corner sets the adjacent two missions as the starter missions.
+    """
+    display_name = "Start with two unlocked missions on grid"
+    default = Toggle.option_false
+
+
+class ColorChoice(Choice):
+    option_white = 0
+    option_red = 1
+    option_blue = 2
+    option_teal = 3
+    option_purple = 4
+    option_yellow = 5
+    option_orange = 6
+    option_green = 7
+    option_light_pink = 8
+    option_violet = 9
+    option_light_grey = 10
+    option_dark_green = 11
+    option_brown = 12
+    option_light_green = 13
+    option_dark_grey = 14
+    option_pink = 15
+    option_rainbow = 16
+    option_default = 17
+    default = option_default
+
+
+class PlayerColorTerranRaynor(ColorChoice):
+    """Determines in-game team color for playable Raynor's Raiders (Terran) factions."""
+    display_name = "Terran Player Color (Raynor)"
+
+
+class PlayerColorProtoss(ColorChoice):
+    """Determines in-game team color for playable Protoss factions."""
+    display_name = "Protoss Player Color"
+
+
+class PlayerColorZerg(ColorChoice):
+    """Determines in-game team color for playable Zerg factions before Kerrigan becomes Primal Kerrigan."""
+    display_name = "Zerg Player Color"
+
+
+class PlayerColorZergPrimal(ColorChoice):
+    """Determines in-game team color for playable Zerg factions after Kerrigan becomes Primal Kerrigan."""
+    display_name = "Zerg Player Color (Primal)"
+
+
+class EnableWolMissions(DefaultOnToggle):
+    """
+    Enables missions from main Wings of Liberty campaign.
+    """
+    display_name = "Enable Wings of Liberty missions"
+
+
+class EnableProphecyMissions(DefaultOnToggle):
+    """
+    Enables missions from Prophecy mini-campaign.
+    """
+    display_name = "Enable Prophecy missions"
+
+
+class EnableHotsMissions(DefaultOnToggle):
+    """
+    Enables missions from Heart of the Swarm campaign.
+    """
+    display_name = "Enable Heart of the Swarm missions"
+
+
+class EnableLotVPrologueMissions(DefaultOnToggle):
+    """
+    Enables missions from Prologue campaign.
+    """
+    display_name = "Enable Prologue (Legacy of the Void) missions"
+
+
+class EnableLotVMissions(DefaultOnToggle):
+    """
+    Enables missions from Legacy of the Void campaign.
+    """
+    display_name = "Enable Legacy of the Void (main campaign) missions"
+
+
+class EnableEpilogueMissions(DefaultOnToggle):
+    """
+    Enables missions from Epilogue campaign.
+    These missions are considered very hard.
+
+    Enabling Wings of Liberty, Heart of the Swarm and Legacy of the Void is strongly recommended in order to play Epilogue.
+    Not recommended for short mission orders.
+    See also: Exclude Very Hard Missions
+    """
+    display_name = "Enable Epilogue missions"
+
+
+class EnableNCOMissions(DefaultOnToggle):
+    """
+    Enables missions from Nova Covert Ops campaign.
+
+    Note: For best gameplay experience it's recommended to also enable Wings of Liberty campaign.
+    """
+    display_name = "Enable Nova Covert Ops missions"
+
+
+class ShuffleCampaigns(DefaultOnToggle):
+    """
+    Shuffles the missions between campaigns if enabled.
+    Only available for Vanilla Shuffled and Mini Campaign mission order
+    """
+    display_name = "Shuffle Campaigns"
+
+
+class ShuffleNoBuild(DefaultOnToggle):
+    """
+    Determines if the no-build missions are included in the shuffle.
+    If turned off, the no-build missions will not appear. Has no effect for Vanilla mission order.
+    """
+    display_name = "Shuffle No-Build Missions"
+
+
+class StarterUnit(Choice):
+    """
+    Unlocks a random unit at the start of the game.
+
+    Off: No units are provided, the first unit must be obtained from the randomizer
+    Balanced: A unit that doesn't give the player too much power early on is given
+    Any Starter Unit: Any starter unit can be given
+    """
+    display_name = "Starter Unit"
+    option_off = 0
+    option_balanced = 1
+    option_any_starter_unit = 2
+
+
+class RequiredTactics(Choice):
+    """
+    Determines the maximum tactical difficulty of the world (separate from mission difficulty).  Higher settings
+    increase randomness.
+
+    Standard:  All missions can be completed with good micro and macro.
+    Advanced:  Completing missions may require relying on starting units and micro-heavy units.
+    No Logic:  Units and upgrades may be placed anywhere.  LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES!
+               Locks Grant Story Tech option to true.
+    """
+    display_name = "Required Tactics"
+    option_standard = 0
+    option_advanced = 1
+    option_no_logic = 2
+
+
+class GenericUpgradeMissions(Range):
+    """Determines the percentage of missions in the mission order that must be completed before
+    level 1 of all weapon and armor upgrades is unlocked.  Level 2 upgrades require double the amount of missions,
+    and level 3 requires triple the amount.  The required amounts are always rounded down.
+    If set to 0, upgrades are instead added to the item pool and must be found to be used."""
+    display_name = "Generic Upgrade Missions"
+    range_start = 0
+    range_end = 100
+    default = 0
+
+
+class GenericUpgradeResearch(Choice):
+    """Determines how weapon and armor upgrades affect missions once unlocked.
+
+    Vanilla:  Upgrades must be researched as normal.
+    Auto In No-Build:  In No-Build missions, upgrades are automatically researched.
+    In all other missions, upgrades must be researched as normal.
+    Auto In Build:  In No-Build missions, upgrades are unavailable as normal.
+    In all other missions, upgrades are automatically researched.
+    Always Auto:  Upgrades are automatically researched in all missions."""
+    display_name = "Generic Upgrade Research"
+    option_vanilla = 0
+    option_auto_in_no_build = 1
+    option_auto_in_build = 2
+    option_always_auto = 3
+
+
+class GenericUpgradeItems(Choice):
+    """Determines how weapon and armor upgrades are split into items.  All options produce 3 levels of each item.
+    Does nothing if upgrades are unlocked by completed mission counts.
+
+    Individual Items:  All weapon and armor upgrades are each an item,
+    resulting in 18 total upgrade items for Terran and 15 total items for Zerg and Protoss each.
+    Bundle Weapon And Armor:  All types of weapon upgrades are one item per race,
+    and all types of armor upgrades are one item per race,
+    resulting in 18 total items.
+    Bundle Unit Class:  Weapon and armor upgrades are merged,
+    but upgrades are bundled separately for each race:
+    Infantry, Vehicle, and Starship upgrades for Terran (9 items),
+    Ground and Flyer upgrades for Zerg (6 items),
+    Ground and Air upgrades for Protoss (6 items),
+    resulting in 21 total items.
+    Bundle All:  All weapon and armor upgrades are one item per race,
+    resulting in 9 total items."""
+    display_name = "Generic Upgrade Items"
+    option_individual_items = 0
+    option_bundle_weapon_and_armor = 1
+    option_bundle_unit_class = 2
+    option_bundle_all = 3
+
+
+class NovaCovertOpsItems(Toggle):
+    """
+    If turned on, the equipment upgrades from Nova Covert Ops may be present in the world.
+
+    If Nova Covert Ops campaign is enabled, this option is locked to be turned on.
+    """
+    display_name = "Nova Covert Ops Items"
+    default = Toggle.option_true
+
+
+class BroodWarItems(Toggle):
+    """If turned on, returning items from StarCraft: Brood War may appear in the world."""
+    display_name = "Brood War Items"
+    default = Toggle.option_true
+
+
+class ExtendedItems(Toggle):
+    """If turned on, original items that did not appear in Campaign mode may appear in the world."""
+    display_name = "Extended Items"
+    default = Toggle.option_true
+
+
+# Current maximum number of upgrades for a unit
+MAX_UPGRADES_OPTION = 12
+
+
+class EnsureGenericItems(Range):
+    """
+    Specifies a minimum percentage of the generic item pool that will be present for the slot.
+    The generic item pool is the pool of all generically useful items after all exclusions.
+    Generically-useful items include: Worker upgrades, Building upgrades, economy upgrades,
+    Mercenaries, Kerrigan levels and abilities, and Spear of Adun abilities
+    Increasing this percentage will make units less common.
+    """
+    display_name = "Ensure Generic Items"
+    range_start = 0
+    range_end = 100
+    default = 25
+
+
+class MinNumberOfUpgrades(Range):
+    """
+    Set a minimum to the number of upgrades a unit/structure can have.
+    Note that most units have 4 or 6 upgrades.
+    If a unit has fewer upgrades than the minimum, it will have all of its upgrades.
+
+    Doesn't affect shared unit upgrades.
+    """
+    display_name = "Minimum number of upgrades per unit/structure"
+    range_start = 0
+    range_end = MAX_UPGRADES_OPTION
+    default = 2
+
+
+class MaxNumberOfUpgrades(Range):
+    """
+    Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited.
+    Note that most unit have 4 to 6 upgrades.
+
+    Doesn't affect shared unit upgrades.
+    """
+    display_name = "Maximum number of upgrades per unit/structure"
+    range_start = -1
+    range_end = MAX_UPGRADES_OPTION
+    default = -1
+
+
+class KerriganPresence(Choice):
+    """
+    Determines whether Kerrigan is playable outside of missions that require her.
+
+    Vanilla: Kerrigan is playable as normal, appears in the same missions as in vanilla game.
+    Not Present:  Kerrigan is not playable, unless the mission requires her to be present.  Other hero units stay playable,
+        and locations normally requiring Kerrigan can be checked by any unit.
+        Kerrigan level items, active abilities and passive abilities affecting her will not appear.
+        In missions where the Kerrigan unit is required, story abilities are given in same way as Grant Story Tech is set to true
+    Not Present And No Passives:  In addition to the above, Kerrigan's passive abilities affecting other units (such as Twin Drones) will not appear.
+
+    Note: Always set to "Not Present" if Heart of the Swarm campaign is disabled.
+    """
+    display_name = "Kerrigan Presence"
+    option_vanilla = 0
+    option_not_present = 1
+    option_not_present_and_no_passives = 2
+
+
+class KerriganLevelsPerMissionCompleted(Range):
+    """
+    Determines how many levels Kerrigan gains when a mission is beaten.
+
+    NOTE: Setting this too low can result in generation failures if The Infinite Cycle or Supreme are in the mission pool.
+    """
+    display_name = "Levels Per Mission Beaten"
+    range_start = 0
+    range_end = 20
+    default = 0
+
+
+class KerriganLevelsPerMissionCompletedCap(Range):
+    """
+    Limits how many total levels Kerrigan can gain from beating missions.  This does not affect levels gained from items.  
+    Set to -1 to disable this limit.
+
+    NOTE: The following missions have these level requirements:
+    Supreme: 35
+    The Infinite Cycle: 70
+    See Grant Story Levels for more details.
+    """
+    display_name = "Levels Per Mission Beaten Cap"
+    range_start = -1
+    range_end = 140
+    default = -1
+
+
+class KerriganLevelItemSum(Range):
+    """
+    Determines the sum of the level items in the world.  This does not affect levels gained from beating missions.
+
+    NOTE: The following missions have these level requirements:
+    Supreme: 35
+    The Infinite Cycle: 70
+    See Grant Story Levels for more details.
+    """
+    display_name = "Kerrigan Level Item Sum"
+    range_start = 0
+    range_end = 140
+    default = 70
+
+
+class KerriganLevelItemDistribution(Choice):
+    """Determines the amount and size of Kerrigan level items.
+
+    Vanilla:  Uses the distribution in the vanilla campaign.
+    This entails 32 individual levels and 6 packs of varying sizes.
+    This distribution always adds up to 70, ignoring the Level Item Sum setting.
+    Smooth:  Uses a custom, condensed distribution of 10 items between sizes 4 and 10,
+    intended to fit more levels into settings with little room for filler while keeping some variance in level gains.
+    This distribution always adds up to 70, ignoring the Level Item Sum setting.
+    Size 70:  Uses items worth 70 levels each.
+    Size 35:  Uses items worth 35 levels each.
+    Size 14:  Uses items worth 14 levels each.
+    Size 10:  Uses items worth 10 levels each.
+    Size 7:  Uses items worth 7 levels each.
+    Size 5:  Uses items worth 5 levels each.
+    Size 2:  Uses items worth 2 level eachs.
+    Size 1:  Uses individual levels.  As there are not enough locations in the game for this distribution,
+    this will result in a greatly reduced total level, and is likely to remove many other items."""
+    display_name = "Kerrigan Level Item Distribution"
+    option_vanilla = 0
+    option_smooth = 1
+    option_size_70 = 2
+    option_size_35 = 3
+    option_size_14 = 4
+    option_size_10 = 5
+    option_size_7 = 6
+    option_size_5 = 7
+    option_size_2 = 8
+    option_size_1 = 9
+    default = option_smooth
+
+
+class KerriganTotalLevelCap(Range):
+    """
+    Limits how many total levels Kerrigan can gain from any source.  Depending on your other settings,
+    there may be more levels available in the world, but they will not affect Kerrigan.  
+    Set to -1 to disable this limit.
+
+    NOTE: The following missions have these level requirements:
+    Supreme: 35
+    The Infinite Cycle: 70
+    See Grant Story Levels for more details.
+    """
+    display_name = "Total Level Cap"
+    range_start = -1
+    range_end = 140
+    default = -1
+
+
+class StartPrimaryAbilities(Range):
+    """Number of Primary Abilities (Kerrigan Tier 1, 2, and 4) to start the game with.
+    If set to 4, a Tier 7 ability is also included."""
+    display_name = "Starting Primary Abilities"
+    range_start = 0
+    range_end = 4
+    default = 0
+
+
+class KerriganPrimalStatus(Choice):
+    """Determines when Kerrigan appears in her Primal Zerg form.
+    This greatly increases her energy regeneration.
+
+    Vanilla:  Kerrigan is human in missions that canonically appear before The Crucible,
+    and zerg thereafter.
+    Always Zerg:  Kerrigan is always zerg.
+    Always Human:  Kerrigan is always human.
+    Level 35:  Kerrigan is human until reaching level 35, and zerg thereafter.
+    Half Completion:  Kerrigan is human until half of the missions in the world are completed,
+    and zerg thereafter.
+    Item:  Kerrigan's Primal Form is an item. She is human until it is found, and zerg thereafter."""
+    display_name = "Kerrigan Primal Status"
+    option_vanilla = 0
+    option_always_zerg = 1
+    option_always_human = 2
+    option_level_35 = 3
+    option_half_completion = 4
+    option_item = 5
+
+
+class SpearOfAdunPresence(Choice):
+    """
+    Determines in which missions Spear of Adun calldowns will be available.
+    Affects only abilities used from Spear of Adun top menu.
+
+    Not Present: Spear of Adun calldowns are unavailable.
+    LotV Protoss: Spear of Adun calldowns are only available in LotV main campaign
+    Protoss: Spear od Adun calldowns are available in any Protoss mission
+    Everywhere: Spear od Adun calldowns are available in any mission of any race
+    """
+    display_name = "Spear of Adun Presence"
+    option_not_present = 0
+    option_lotv_protoss = 1
+    option_protoss = 2
+    option_everywhere = 3
+    default = option_lotv_protoss
+
+    # Fix case
+    @classmethod
+    def get_option_name(cls, value: int) -> str:
+        if value == SpearOfAdunPresence.option_lotv_protoss:
+            return "LotV Protoss"
+        else:
+            return super().get_option_name(value)
+
+
+class SpearOfAdunPresentInNoBuild(Toggle):
+    """
+    Determines if Spear of Adun calldowns are available in no-build missions.
+
+    If turned on, Spear of Adun calldown powers are available in missions specified under "Spear of Adun Presence".
+    If turned off, Spear of Adun calldown powers are unavailable in all no-build missions
+    """
+    display_name = "Spear of Adun Present in No-Build"
+
+
+class SpearOfAdunAutonomouslyCastAbilityPresence(Choice):
+    """
+    Determines availability of Spear of Adun powers, that are autonomously cast.
+    Affects abilities like Reconstruction Beam or Overwatch
+
+    Not Presents: Autocasts are not available.
+    LotV Protoss: Spear of Adun autocasts are only available in LotV main campaign
+    Protoss: Spear od Adun autocasts are available in any Protoss mission
+    Everywhere: Spear od Adun autocasts are available in any mission of any race
+    """
+    display_name = "Spear of Adun Autonomously Cast Powers Presence"
+    option_not_present = 0
+    option_lotv_protoss = 1
+    option_protoss = 2
+    option_everywhere = 3
+    default = option_lotv_protoss
+
+    # Fix case
+    @classmethod
+    def get_option_name(cls, value: int) -> str:
+        if value == SpearOfAdunPresence.option_lotv_protoss:
+            return "LotV Protoss"
+        else:
+            return super().get_option_name(value)
+
+
+class SpearOfAdunAutonomouslyCastPresentInNoBuild(Toggle):
+    """
+    Determines if Spear of Adun autocasts are available in no-build missions.
+
+    If turned on, Spear of Adun autocasts are available in missions specified under "Spear of Adun Autonomously Cast Powers Presence".
+    If turned off, Spear of Adun autocasts are unavailable in all no-build missions
+    """
+    display_name = "Spear of Adun Autonomously Cast Powers Present in No-Build"
+
+
+class GrantStoryTech(Toggle):
+    """
+    If set true, grants special tech required for story mission completion for duration of the mission.
+    Otherwise, you need to find these tech by a normal means as items.
+    Affects story missions like Back in the Saddle and Supreme
+
+    Locked to true if Required Tactics is set to no logic.
+    """
+    display_name = "Grant Story Tech"
+
+
+class GrantStoryLevels(Choice):
+    """
+    If enabled, grants Kerrigan the required minimum levels for the following missions:
+    Supreme: 35
+    The Infinite Cycle: 70
+    The bonus levels only apply during the listed missions, and can exceed the Total Level Cap.
+
+    If disabled, either of these missions is included, and there are not enough levels in the world, generation may fail.  
+    To prevent this, either increase the amount of levels in the world, or enable this option.
+
+    If disabled and Required Tactics is set to no logic, this option is forced to Minimum.
+
+    Disabled: Kerrigan does not get bonus levels for these missions,
+              instead the levels must be gained from items or beating missions.
+    Additive: Kerrigan gains bonus levels equal to the mission's required level.
+    Minimum: Kerrigan is either at her real level, or at the mission's required level,
+             depending on which is higher.
+    """
+    display_name = "Grant Story Levels"
+    option_disabled = 0
+    option_additive = 1
+    option_minimum = 2
+    default = option_minimum
+
+
+class TakeOverAIAllies(Toggle):
+    """
+    On maps supporting this feature allows you to take control over an AI Ally.
+    """
+    display_name = "Take Over AI Allies"
+
+
+class LockedItems(ItemSet):
+    """Guarantees that these items will be unlockable"""
+    display_name = "Locked Items"
+
+
+class ExcludedItems(ItemSet):
+    """Guarantees that these items will not be unlockable"""
+    display_name = "Excluded Items"
+
+
+class ExcludedMissions(OptionSet):
+    """Guarantees that these missions will not appear in the campaign
+    Doesn't apply to vanilla mission order.
+    It may be impossible to build a valid campaign if too many missions are excluded."""
+    display_name = "Excluded Missions"
+    valid_keys = {mission.mission_name for mission in SC2Mission}
+
+
+class ExcludeVeryHardMissions(Choice):
+    """
+    Excludes Very Hard missions outside of Epilogue campaign (All-In, Salvation, and all Epilogue missions are considered Very Hard).
+    Doesn't apply to "Vanilla" mission order.
+
+    Default: Not excluded for mission orders "Vanilla Shuffled" or "Grid" with Maximum Campaign Size >= 20,
+             excluded for any other order
+    Yes: Non-Epilogue Very Hard missions are excluded and won't be generated
+    No: Non-Epilogue Very Hard missions can appear normally. Not recommended for too short mission orders.
+
+    See also: Excluded Missions, Enable Epilogue Missions, Maximum Campaign Size
+    """
+    display_name = "Exclude Very Hard Missions"
+    option_default = 0
+    option_true = 1
+    option_false = 2
+
+    @classmethod
+    def get_option_name(cls, value):
+        return ["Default", "Yes", "No"][int(value)]
+
+
+class LocationInclusion(Choice):
+    option_enabled = 0
+    option_resources = 1
+    option_disabled = 2
+
+
+class VanillaLocations(LocationInclusion):
+    """
+    Enables or disables item rewards for completing vanilla objectives.
+    Vanilla objectives are bonus objectives from the vanilla game,
+    along with some additional objectives to balance the missions.
+    Enable these locations for a balanced experience.
+
+    Enabled: All locations fitting into this do their normal rewards
+    Resources: Forces these locations to contain Starting Resources
+    Disabled: Removes item rewards from these locations.
+
+    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
+    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
+    """
+    display_name = "Vanilla Locations"
+
+
+class ExtraLocations(LocationInclusion):
+    """
+    Enables or disables item rewards for mission progress and minor objectives.
+    This includes mandatory mission objectives,
+    collecting reinforcements and resource pickups,
+    destroying structures, and overcoming minor challenges.
+    Enables these locations to add more checks and items to your world.
+
+    Enabled: All locations fitting into this do their normal rewards
+    Resources: Forces these locations to contain Starting Resources
+    Disabled: Removes item rewards from these locations.
+
+    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
+    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
+    """
+    display_name = "Extra Locations"
+
+
+class ChallengeLocations(LocationInclusion):
+    """
+    Enables or disables item rewards for completing challenge tasks.
+    Challenges are tasks that are more difficult than completing the mission, and are often based on achievements.
+    You might be required to visit the same mission later after getting stronger in order to finish these tasks.
+    Enable these locations to increase the difficulty of completing the multiworld.
+
+    Enabled: All locations fitting into this do their normal rewards
+    Resources: Forces these locations to contain Starting Resources
+    Disabled: Removes item rewards from these locations.
+
+    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
+    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
+    """
+    display_name = "Challenge Locations"
+
+
+class MasteryLocations(LocationInclusion):
+    """
+    Enables or disables item rewards for overcoming especially difficult challenges.
+    These challenges are often based on Mastery achievements and Feats of Strength.
+    Enable these locations to add the most difficult checks to the world.
+
+    Enabled: All locations fitting into this do their normal rewards
+    Resources: Forces these locations to contain Starting Resources
+    Disabled: Removes item rewards from these locations.
+
+    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
+    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
+    """
+    display_name = "Mastery Locations"
+
+
+class MineralsPerItem(Range):
+    """
+    Configures how many minerals are given per resource item.
+    """
+    display_name = "Minerals Per Item"
+    range_start = 0
+    range_end = 500
+    default = 25
+
+
+class VespenePerItem(Range):
+    """
+    Configures how much vespene gas is given per resource item.
+    """
+    display_name = "Vespene Per Item"
+    range_start = 0
+    range_end = 500
+    default = 25
+
+
+class StartingSupplyPerItem(Range):
+    """
+    Configures how much starting supply per is given per item.
+    """
+    display_name = "Starting Supply Per Item"
+    range_start = 0
+    range_end = 200
+    default = 5
+
+
+@dataclass
+class Starcraft2Options(PerGameCommonOptions):
+    game_difficulty: GameDifficulty
+    game_speed: GameSpeed
+    disable_forced_camera: DisableForcedCamera
+    skip_cutscenes: SkipCutscenes
+    all_in_map: AllInMap
+    mission_order: MissionOrder
+    maximum_campaign_size: MaximumCampaignSize
+    grid_two_start_positions: GridTwoStartPositions
+    player_color_terran_raynor: PlayerColorTerranRaynor
+    player_color_protoss: PlayerColorProtoss
+    player_color_zerg: PlayerColorZerg
+    player_color_zerg_primal: PlayerColorZergPrimal
+    enable_wol_missions: EnableWolMissions
+    enable_prophecy_missions: EnableProphecyMissions
+    enable_hots_missions: EnableHotsMissions
+    enable_lotv_prologue_missions: EnableLotVPrologueMissions
+    enable_lotv_missions: EnableLotVMissions
+    enable_epilogue_missions: EnableEpilogueMissions
+    enable_nco_missions: EnableNCOMissions
+    shuffle_campaigns: ShuffleCampaigns
+    shuffle_no_build: ShuffleNoBuild
+    starter_unit: StarterUnit
+    required_tactics: RequiredTactics
+    ensure_generic_items: EnsureGenericItems
+    min_number_of_upgrades: MinNumberOfUpgrades
+    max_number_of_upgrades: MaxNumberOfUpgrades
+    generic_upgrade_missions: GenericUpgradeMissions
+    generic_upgrade_research: GenericUpgradeResearch
+    generic_upgrade_items: GenericUpgradeItems
+    kerrigan_presence: KerriganPresence
+    kerrigan_levels_per_mission_completed: KerriganLevelsPerMissionCompleted
+    kerrigan_levels_per_mission_completed_cap: KerriganLevelsPerMissionCompletedCap
+    kerrigan_level_item_sum: KerriganLevelItemSum
+    kerrigan_level_item_distribution: KerriganLevelItemDistribution
+    kerrigan_total_level_cap: KerriganTotalLevelCap
+    start_primary_abilities: StartPrimaryAbilities
+    kerrigan_primal_status: KerriganPrimalStatus
+    spear_of_adun_presence: SpearOfAdunPresence
+    spear_of_adun_present_in_no_build: SpearOfAdunPresentInNoBuild
+    spear_of_adun_autonomously_cast_ability_presence: SpearOfAdunAutonomouslyCastAbilityPresence
+    spear_of_adun_autonomously_cast_present_in_no_build: SpearOfAdunAutonomouslyCastPresentInNoBuild
+    grant_story_tech: GrantStoryTech
+    grant_story_levels: GrantStoryLevels
+    take_over_ai_allies: TakeOverAIAllies
+    locked_items: LockedItems
+    excluded_items: ExcludedItems
+    excluded_missions: ExcludedMissions
+    exclude_very_hard_missions: ExcludeVeryHardMissions
+    nco_items: NovaCovertOpsItems
+    bw_items: BroodWarItems
+    ext_items: ExtendedItems
+    vanilla_locations: VanillaLocations
+    extra_locations: ExtraLocations
+    challenge_locations: ChallengeLocations
+    mastery_locations: MasteryLocations
+    minerals_per_item: MineralsPerItem
+    vespene_per_item: VespenePerItem
+    starting_supply_per_item: StartingSupplyPerItem
+
+
+def get_option_value(world: World, name: str) -> Union[int,  FrozenSet]:
+    if world is None:
+        field: Field = [class_field for class_field in fields(Starcraft2Options) if class_field.name == name][0]
+        return field.type.default
+
+    player_option = getattr(world.options, name)
+
+    return player_option.value
+
+
+def get_enabled_campaigns(world: World) -> Set[SC2Campaign]:
+    enabled_campaigns = set()
+    if get_option_value(world, "enable_wol_missions"):
+        enabled_campaigns.add(SC2Campaign.WOL)
+    if get_option_value(world, "enable_prophecy_missions"):
+        enabled_campaigns.add(SC2Campaign.PROPHECY)
+    if get_option_value(world, "enable_hots_missions"):
+        enabled_campaigns.add(SC2Campaign.HOTS)
+    if get_option_value(world, "enable_lotv_prologue_missions"):
+        enabled_campaigns.add(SC2Campaign.PROLOGUE)
+    if get_option_value(world, "enable_lotv_missions"):
+        enabled_campaigns.add(SC2Campaign.LOTV)
+    if get_option_value(world, "enable_epilogue_missions"):
+        enabled_campaigns.add(SC2Campaign.EPILOGUE)
+    if get_option_value(world, "enable_nco_missions"):
+        enabled_campaigns.add(SC2Campaign.NCO)
+    return enabled_campaigns
+
+
+def get_disabled_campaigns(world: World) -> Set[SC2Campaign]:
+    all_campaigns = set(SC2Campaign)
+    enabled_campaigns = get_enabled_campaigns(world)
+    disabled_campaigns = all_campaigns.difference(enabled_campaigns)
+    disabled_campaigns.remove(SC2Campaign.GLOBAL)
+    return disabled_campaigns
+
+
+def get_excluded_missions(world: World) -> Set[SC2Mission]:
+    mission_order_type = get_option_value(world, "mission_order")
+    excluded_mission_names = get_option_value(world, "excluded_missions")
+    shuffle_no_build = get_option_value(world, "shuffle_no_build")
+    disabled_campaigns = get_disabled_campaigns(world)
+
+    excluded_missions: Set[SC2Mission] = set([lookup_name_to_mission[name] for name in excluded_mission_names])
+
+    # Excluding Very Hard missions depending on options
+    if (get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_true
+        ) or (
+            get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_default
+            and (
+                    mission_order_type not in [MissionOrder.option_vanilla_shuffled, MissionOrder.option_grid]
+                    or (
+                            mission_order_type == MissionOrder.option_grid
+                            and get_option_value(world, "maximum_campaign_size") < 20
+                    )
+            )
+    ):
+        excluded_missions = excluded_missions.union(
+            [mission for mission in SC2Mission if
+             mission.pool == MissionPools.VERY_HARD and mission.campaign != SC2Campaign.EPILOGUE]
+        )
+    # Omitting No-Build missions if not shuffling no-build
+    if not shuffle_no_build:
+        excluded_missions = excluded_missions.union(get_no_build_missions())
+    # Omitting missions not in enabled campaigns
+    for campaign in disabled_campaigns:
+        excluded_missions = excluded_missions.union(campaign_mission_table[campaign])
+
+    return excluded_missions
+
+
+campaign_depending_orders = [
+    MissionOrder.option_vanilla,
+    MissionOrder.option_vanilla_shuffled,
+    MissionOrder.option_mini_campaign
+]
+
+kerrigan_unit_available = [
+    KerriganPresence.option_vanilla,
+]
\ No newline at end of file
diff --git a/worlds/sc2/PoolFilter.py b/worlds/sc2/PoolFilter.py
new file mode 100644
index 00000000..5f8151ed
--- /dev/null
+++ b/worlds/sc2/PoolFilter.py
@@ -0,0 +1,595 @@
+from typing import Callable, Dict, List, Set, Union, Tuple
+from BaseClasses import  Item, Location
+from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \
+    progressive_if_ext, spear_of_adun_calldowns, spear_of_adun_castable_passives, nova_equipment
+from .MissionTables import mission_orders, MissionInfo, MissionPools, \
+    get_campaign_goal_priority, campaign_final_mission_locations, campaign_alt_final_mission_locations, \
+    SC2Campaign, SC2Race, SC2CampaignGoalPriority, SC2Mission
+from .Options import get_option_value, MissionOrder, \
+    get_enabled_campaigns, get_disabled_campaigns, RequiredTactics, kerrigan_unit_available, GrantStoryTech, \
+    TakeOverAIAllies, SpearOfAdunPresence, SpearOfAdunAutonomouslyCastAbilityPresence, campaign_depending_orders, \
+    ShuffleCampaigns, get_excluded_missions, ShuffleNoBuild, ExtraLocations, GrantStoryLevels
+from . import ItemNames
+from worlds.AutoWorld import World
+
+# Items with associated upgrades
+UPGRADABLE_ITEMS = {item.parent_item for item in get_full_item_list().values() if item.parent_item}
+
+BARRACKS_UNITS = {
+    ItemNames.MARINE, ItemNames.MEDIC, ItemNames.FIREBAT, ItemNames.MARAUDER,
+    ItemNames.REAPER, ItemNames.GHOST, ItemNames.SPECTRE, ItemNames.HERC,
+}
+FACTORY_UNITS = {
+    ItemNames.HELLION, ItemNames.VULTURE, ItemNames.GOLIATH, ItemNames.DIAMONDBACK,
+    ItemNames.SIEGE_TANK, ItemNames.THOR, ItemNames.PREDATOR, ItemNames.WIDOW_MINE,
+    ItemNames.CYCLONE, ItemNames.WARHOUND,
+}
+STARPORT_UNITS = {
+    ItemNames.MEDIVAC, ItemNames.WRAITH, ItemNames.VIKING, ItemNames.BANSHEE,
+    ItemNames.BATTLECRUISER, ItemNames.HERCULES, ItemNames.SCIENCE_VESSEL, ItemNames.RAVEN,
+    ItemNames.LIBERATOR, ItemNames.VALKYRIE,
+}
+
+
+def filter_missions(world: World) -> Dict[MissionPools, List[SC2Mission]]:
+
+    """
+    Returns a semi-randomly pruned tuple of no-build, easy, medium, and hard mission sets
+    """
+    world: World = world
+    mission_order_type = get_option_value(world, "mission_order")
+    shuffle_no_build = get_option_value(world, "shuffle_no_build")
+    enabled_campaigns = get_enabled_campaigns(world)
+    grant_story_tech = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true
+    grant_story_levels = get_option_value(world, "grant_story_levels") != GrantStoryLevels.option_disabled
+    extra_locations = get_option_value(world, "extra_locations")
+    excluded_missions: Set[SC2Mission] = get_excluded_missions(world)
+    mission_pools: Dict[MissionPools, List[SC2Mission]] = {}
+    for mission in SC2Mission:
+        if not mission_pools.get(mission.pool):
+            mission_pools[mission.pool] = list()
+        mission_pools[mission.pool].append(mission)
+    # A bit of safeguard:
+    for mission_pool in MissionPools:
+        if not mission_pools.get(mission_pool):
+            mission_pools[mission_pool] = []
+
+    if mission_order_type == MissionOrder.option_vanilla:
+        # Vanilla uses the entire mission pool
+        goal_priorities: Dict[SC2Campaign, SC2CampaignGoalPriority] = {campaign: get_campaign_goal_priority(campaign) for campaign in enabled_campaigns}
+        goal_level = max(goal_priorities.values())
+        candidate_campaigns = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level]
+        goal_campaign = world.random.choice(candidate_campaigns)
+        if campaign_final_mission_locations[goal_campaign] is not None:
+            mission_pools[MissionPools.FINAL] = [campaign_final_mission_locations[goal_campaign].mission]
+        else:
+            mission_pools[MissionPools.FINAL] = [list(campaign_alt_final_mission_locations[goal_campaign].keys())[0]]
+        remove_final_mission_from_other_pools(mission_pools)
+        return mission_pools
+
+    # Finding the goal map
+    goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns}
+    goal_level = max(goal_priorities.values())
+    candidate_campaigns = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level]
+    goal_campaign = world.random.choice(candidate_campaigns)
+    primary_goal = campaign_final_mission_locations[goal_campaign]
+    if primary_goal is None or primary_goal.mission in excluded_missions:
+        # No primary goal or its mission is excluded
+        candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys())
+        candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions]
+        if len(candidate_missions) == 0:
+            raise Exception("There are no valid goal missions. Please exclude fewer missions.")
+        goal_mission = world.random.choice(candidate_missions)
+    else:
+        goal_mission = primary_goal.mission
+
+    # Excluding missions
+    for difficulty, mission_pool in mission_pools.items():
+        mission_pools[difficulty] = [mission for mission in mission_pool if mission not in excluded_missions]
+    mission_pools[MissionPools.FINAL] = [goal_mission]
+
+    # Mission pool changes
+    adv_tactics = get_option_value(world, "required_tactics") != RequiredTactics.option_standard
+
+    def move_mission(mission: SC2Mission, current_pool, new_pool):
+        if mission in mission_pools[current_pool]:
+            mission_pools[current_pool].remove(mission)
+            mission_pools[new_pool].append(mission)
+    # WoL
+    if shuffle_no_build == ShuffleNoBuild.option_false or adv_tactics:
+        # Replacing No Build missions with Easy missions
+        # WoL
+        move_mission(SC2Mission.ZERO_HOUR, MissionPools.EASY, MissionPools.STARTER)
+        move_mission(SC2Mission.EVACUATION, MissionPools.EASY, MissionPools.STARTER)
+        move_mission(SC2Mission.DEVILS_PLAYGROUND, MissionPools.EASY, MissionPools.STARTER)
+        # LotV
+        move_mission(SC2Mission.THE_GROWING_SHADOW, MissionPools.EASY, MissionPools.STARTER)
+        move_mission(SC2Mission.THE_SPEAR_OF_ADUN, MissionPools.EASY, MissionPools.STARTER)
+        if extra_locations == ExtraLocations.option_enabled:
+            move_mission(SC2Mission.SKY_SHIELD, MissionPools.EASY, MissionPools.STARTER)
+        # Pushing this to Easy
+        move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, MissionPools.MEDIUM, MissionPools.EASY)
+        if shuffle_no_build == ShuffleNoBuild.option_false:
+            # Pushing Outbreak to Normal, as it cannot be placed as the second mission on Build-Only
+            move_mission(SC2Mission.OUTBREAK, MissionPools.EASY, MissionPools.MEDIUM)
+            # Pushing extra Normal missions to Easy
+            move_mission(SC2Mission.ECHOES_OF_THE_FUTURE, MissionPools.MEDIUM, MissionPools.EASY)
+            move_mission(SC2Mission.CUTTHROAT, MissionPools.MEDIUM, MissionPools.EASY)
+        # Additional changes on Advanced Tactics
+        if adv_tactics:
+            # WoL
+            move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, MissionPools.EASY, MissionPools.STARTER)
+            move_mission(SC2Mission.SMASH_AND_GRAB, MissionPools.EASY, MissionPools.STARTER)
+            move_mission(SC2Mission.THE_MOEBIUS_FACTOR, MissionPools.MEDIUM, MissionPools.EASY)
+            move_mission(SC2Mission.WELCOME_TO_THE_JUNGLE, MissionPools.MEDIUM, MissionPools.EASY)
+            move_mission(SC2Mission.ENGINE_OF_DESTRUCTION, MissionPools.HARD, MissionPools.MEDIUM)
+            # LotV
+            move_mission(SC2Mission.AMON_S_REACH, MissionPools.EASY, MissionPools.STARTER)
+    # Prophecy needs to be adjusted on tiny grid
+    if enabled_campaigns == {SC2Campaign.PROPHECY} and mission_order_type == MissionOrder.option_tiny_grid:
+        move_mission(SC2Mission.A_SINISTER_TURN, MissionPools.MEDIUM, MissionPools.EASY)
+    # Prologue's only valid starter is the goal mission
+    if enabled_campaigns == {SC2Campaign.PROLOGUE} \
+            or mission_order_type in campaign_depending_orders \
+            and get_option_value(world, "shuffle_campaigns") == ShuffleCampaigns.option_false:
+        move_mission(SC2Mission.DARK_WHISPERS, MissionPools.EASY, MissionPools.STARTER)
+    # HotS
+    kerriganless = get_option_value(world, "kerrigan_presence") not in kerrigan_unit_available \
+        or SC2Campaign.HOTS not in enabled_campaigns
+    if adv_tactics:
+        # Medium -> Easy
+        for mission in (SC2Mission.FIRE_IN_THE_SKY, SC2Mission.WAKING_THE_ANCIENT, SC2Mission.CONVICTION):
+            move_mission(mission, MissionPools.MEDIUM, MissionPools.EASY)
+        # Hard -> Medium
+        move_mission(SC2Mission.PHANTOMS_OF_THE_VOID, MissionPools.HARD, MissionPools.MEDIUM)
+        if not kerriganless:
+            # Additional starter mission assuming player starts with minimal anti-air
+            move_mission(SC2Mission.WAKING_THE_ANCIENT, MissionPools.EASY, MissionPools.STARTER)
+    if grant_story_tech:
+        # Additional starter mission if player is granted story tech
+        move_mission(SC2Mission.ENEMY_WITHIN, MissionPools.EASY, MissionPools.STARTER)
+        move_mission(SC2Mission.TEMPLAR_S_RETURN, MissionPools.EASY, MissionPools.STARTER)
+        move_mission(SC2Mission.THE_ESCAPE, MissionPools.MEDIUM, MissionPools.STARTER)
+        move_mission(SC2Mission.IN_THE_ENEMY_S_SHADOW, MissionPools.MEDIUM, MissionPools.STARTER)
+    if (grant_story_tech and grant_story_levels) or kerriganless:
+        # The player has, all the stuff he needs, provided under these settings
+        move_mission(SC2Mission.SUPREME, MissionPools.MEDIUM, MissionPools.STARTER)
+        move_mission(SC2Mission.THE_INFINITE_CYCLE, MissionPools.HARD, MissionPools.STARTER)
+    if get_option_value(world, "take_over_ai_allies") == TakeOverAIAllies.option_true:
+        move_mission(SC2Mission.HARBINGER_OF_OBLIVION, MissionPools.MEDIUM, MissionPools.STARTER)
+    if len(mission_pools[MissionPools.STARTER]) < 2 and not kerriganless or adv_tactics:
+        # Conditionally moving Easy missions to Starter
+        move_mission(SC2Mission.HARVEST_OF_SCREAMS, MissionPools.EASY, MissionPools.STARTER)
+        move_mission(SC2Mission.DOMINATION, MissionPools.EASY, MissionPools.STARTER)
+    if len(mission_pools[MissionPools.STARTER]) < 2:
+        move_mission(SC2Mission.TEMPLAR_S_RETURN, MissionPools.EASY, MissionPools.STARTER)
+    if len(mission_pools[MissionPools.STARTER]) + len(mission_pools[MissionPools.EASY]) < 2:
+        # Flashpoint needs just a few items at start but competent comp at the end
+        move_mission(SC2Mission.FLASHPOINT, MissionPools.HARD, MissionPools.EASY)
+
+    remove_final_mission_from_other_pools(mission_pools)
+    return mission_pools
+
+
+def remove_final_mission_from_other_pools(mission_pools: Dict[MissionPools, List[SC2Mission]]):
+    final_missions = mission_pools[MissionPools.FINAL]
+    for pool, missions in mission_pools.items():
+        if pool == MissionPools.FINAL:
+            continue
+        for final_mission in final_missions:
+            while final_mission in missions:
+                missions.remove(final_mission)
+
+
+def get_item_upgrades(inventory: List[Item], parent_item: Union[Item, str]) -> List[Item]:
+    item_name = parent_item.name if isinstance(parent_item, Item) else parent_item
+    return [
+        inv_item for inv_item in inventory
+        if get_full_item_list()[inv_item.name].parent_item == item_name
+    ]
+
+
+def get_item_quantity(item: Item, world: World):
+    if (not get_option_value(world, "nco_items")) \
+            and SC2Campaign.NCO in get_disabled_campaigns(world) \
+            and item.name in progressive_if_nco:
+        return 1
+    if (not get_option_value(world, "ext_items")) \
+            and item.name in progressive_if_ext:
+        return 1
+    return get_full_item_list()[item.name].quantity
+
+
+def copy_item(item: Item):
+    return Item(item.name, item.classification, item.code, item.player)
+
+
+def num_missions(world: World) -> int:
+    mission_order_type = get_option_value(world, "mission_order")
+    if mission_order_type != MissionOrder.option_grid:
+        mission_order = mission_orders[mission_order_type]()
+        misssions = [mission for campaign in mission_order for mission in mission_order[campaign]]
+        return len(misssions) - 1  # Menu
+    else:
+        mission_pools = filter_missions(world)
+        return sum(len(pool) for _, pool in mission_pools.items())
+
+
+class ValidInventory:
+
+    def has(self, item: str, player: int):
+        return item in self.logical_inventory
+
+    def has_any(self, items: Set[str], player: int):
+        return any(item in self.logical_inventory for item in items)
+
+    def has_all(self, items: Set[str], player: int):
+        return all(item in self.logical_inventory for item in items)
+
+    def has_group(self, item_group: str, player: int, count: int = 1):
+        return False  # Deliberately fails here, as item pooling is not aware about mission layout
+
+    def count_group(self, item_name_group: str, player: int) -> int:
+        return 0  # For item filtering assume no missions are beaten
+
+    def count(self, item: str, player: int) -> int:
+        return len([inventory_item for inventory_item in self.logical_inventory if inventory_item == item])
+
+    def has_units_per_structure(self) -> bool:
+        return len(BARRACKS_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \
+            len(FACTORY_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \
+            len(STARPORT_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure
+
+    def generate_reduced_inventory(self, inventory_size: int, mission_requirements: List[Tuple[str, Callable]]) -> List[Item]:
+        """Attempts to generate a reduced inventory that can fulfill the mission requirements."""
+        inventory = list(self.item_pool)
+        locked_items = list(self.locked_items)
+        item_list = get_full_item_list()
+        self.logical_inventory = [
+            item.name for item in inventory + locked_items + self.existing_items
+            if item_list[item.name].is_important_for_filtering()  # Track all Progression items and those with complex rules for filtering
+        ]
+        requirements = mission_requirements
+        parent_items = self.item_children.keys()
+        parent_lookup = {child: parent for parent, children in self.item_children.items() for child in children}
+        minimum_upgrades = get_option_value(self.world, "min_number_of_upgrades")
+
+        def attempt_removal(item: Item) -> bool:
+            inventory.remove(item)
+            # Only run logic checks when removing logic items
+            if item.name in self.logical_inventory:
+                self.logical_inventory.remove(item.name)
+                if not all(requirement(self) for (_, requirement) in mission_requirements):
+                    # If item cannot be removed, lock or revert
+                    self.logical_inventory.append(item.name)
+                    for _ in range(get_item_quantity(item, self.world)):
+                        locked_items.append(copy_item(item))
+                    return False
+            return True
+
+        # Limit the maximum number of upgrades
+        maxNbUpgrade = get_option_value(self.world, "max_number_of_upgrades")
+        if maxNbUpgrade != -1:
+            unit_avail_upgrades = {}
+            # Needed to take into account locked/existing items
+            unit_nb_upgrades = {}
+            for item in inventory:
+                cItem = item_list[item.name]
+                if item.name in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades:
+                    unit_avail_upgrades[item.name] = []
+                    unit_nb_upgrades[item.name] = 0
+                elif cItem.parent_item is not None:
+                    if cItem.parent_item not in unit_avail_upgrades:
+                        unit_avail_upgrades[cItem.parent_item] = [item]
+                        unit_nb_upgrades[cItem.parent_item] = 1
+                    else:
+                        unit_avail_upgrades[cItem.parent_item].append(item)
+                        unit_nb_upgrades[cItem.parent_item] += 1
+            # For those two categories, we count them but dont include them in removal
+            for item in locked_items + self.existing_items:
+                cItem = item_list[item.name]
+                if item.name in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades:
+                    unit_avail_upgrades[item.name] = []
+                    unit_nb_upgrades[item.name] = 0
+                elif cItem.parent_item is not None:
+                    if cItem.parent_item not in unit_avail_upgrades:
+                        unit_nb_upgrades[cItem.parent_item] = 1
+                    else:
+                        unit_nb_upgrades[cItem.parent_item] += 1
+            # Making sure that the upgrades being removed is random
+            shuffled_unit_upgrade_list = list(unit_avail_upgrades.keys())
+            self.world.random.shuffle(shuffled_unit_upgrade_list)
+            for unit in shuffled_unit_upgrade_list:
+                while (unit_nb_upgrades[unit] > maxNbUpgrade) \
+                         and (len(unit_avail_upgrades[unit]) > 0):
+                    itemCandidate = self.world.random.choice(unit_avail_upgrades[unit])
+                    success = attempt_removal(itemCandidate)
+                    # Whatever it succeed to remove the iventory or it fails and thus
+                    # lock it, the upgrade is no longer available for removal
+                    unit_avail_upgrades[unit].remove(itemCandidate)
+                    if success:
+                        unit_nb_upgrades[unit] -= 1
+
+        # Locking minimum upgrades for items that have already been locked/placed when minimum required
+        if minimum_upgrades > 0:
+            known_items = self.existing_items + locked_items
+            known_parents = [item for item in known_items if item in parent_items]
+            for parent in known_parents:
+                child_items = self.item_children[parent]
+                removable_upgrades = [item for item in inventory if item in child_items]
+                locked_upgrade_count = sum(1 if item in child_items else 0 for item in known_items)
+                self.world.random.shuffle(removable_upgrades)
+                while len(removable_upgrades) > 0 and locked_upgrade_count < minimum_upgrades:
+                    item_to_lock = removable_upgrades.pop()
+                    inventory.remove(item_to_lock)
+                    locked_items.append(copy_item(item_to_lock))
+                    locked_upgrade_count += 1
+
+        if self.min_units_per_structure > 0 and self.has_units_per_structure():
+            requirements.append(("Minimum units per structure", lambda state: state.has_units_per_structure()))
+
+        # Determining if the full-size inventory can complete campaign
+        failed_locations: List[str] = [location for (location, requirement) in requirements if not requirement(self)]
+        if len(failed_locations) > 0:
+            raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}")
+
+        # Optionally locking generic items
+        generic_items = [item for item in inventory if item.name in second_pass_placeable_items]
+        reserved_generic_percent = get_option_value(self.world, "ensure_generic_items") / 100
+        reserved_generic_amount = int(len(generic_items) * reserved_generic_percent)
+        removable_generic_items = []
+        self.world.random.shuffle(generic_items)
+        for item in generic_items[:reserved_generic_amount]:
+            locked_items.append(copy_item(item))
+            inventory.remove(item)
+            if item.name not in self.logical_inventory and item.name not in self.locked_items:
+                removable_generic_items.append(item)
+
+        # Main cull process
+        unused_items = [] # Reusable items for the second pass
+        while len(inventory) + len(locked_items) > inventory_size:
+            if len(inventory) == 0:
+                # There are more items than locations and all of them are already locked due to YAML or logic.
+                # First, drop non-logic generic items to free up space
+                while len(removable_generic_items) > 0 and len(locked_items) > inventory_size:
+                    removed_item = removable_generic_items.pop()
+                    locked_items.remove(removed_item)
+                # If there still isn't enough space, push locked items into start inventory
+                self.world.random.shuffle(locked_items)
+                while len(locked_items) > inventory_size:
+                    item: Item = locked_items.pop()
+                    self.multiworld.push_precollected(item)
+                break
+            # Select random item from removable items
+            item = self.world.random.choice(inventory)
+            # Do not remove item if it would drop upgrades below minimum
+            if minimum_upgrades > 0:
+                parent_item = parent_lookup.get(item, None)
+                if parent_item:
+                    count = sum(1 if item in self.item_children[parent_item] else 0 for item in inventory + locked_items)
+                    if count <= minimum_upgrades:
+                        if parent_item in inventory:
+                            # Attempt to remove parent instead, if possible
+                            item = parent_item
+                        else:
+                            # Lock remaining upgrades
+                            for item in self.item_children[parent_item]:
+                                if item in inventory:
+                                    inventory.remove(item)
+                                    locked_items.append(copy_item(item))
+                            continue
+
+            # Drop child items when removing a parent
+            if item in parent_items:
+                items_to_remove = [item for item in self.item_children[item] if item in inventory]
+                success = attempt_removal(item)
+                if success:
+                    while len(items_to_remove) > 0:
+                        item_to_remove = items_to_remove.pop()
+                        if item_to_remove not in inventory:
+                            continue
+                        attempt_removal(item_to_remove)
+            else:
+                # Unimportant upgrades may be added again in the second pass
+                if attempt_removal(item):
+                    unused_items.append(item.name)
+
+        # Removing extra dependencies
+        # WoL
+        logical_inventory_set = set(self.logical_inventory)
+        if not spider_mine_sources & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Spider Mine)")]
+        if not BARRACKS_UNITS & logical_inventory_set:
+            inventory = [item for item in inventory if
+                         not (item.name.startswith(ItemNames.TERRAN_INFANTRY_UPGRADE_PREFIX) or item.name == ItemNames.ORBITAL_STRIKE)]
+        if not FACTORY_UNITS & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.startswith(ItemNames.TERRAN_VEHICLE_UPGRADE_PREFIX)]
+        if not STARPORT_UNITS & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.startswith(ItemNames.TERRAN_SHIP_UPGRADE_PREFIX)]
+        # HotS
+        # Baneling without sources => remove Baneling and upgrades
+        if (ItemNames.ZERGLING_BANELING_ASPECT in self.logical_inventory
+                and ItemNames.ZERGLING not in self.logical_inventory
+                and ItemNames.KERRIGAN_SPAWN_BANELINGS not in self.logical_inventory
+        ):
+            inventory = [item for item in inventory if item.name != ItemNames.ZERGLING_BANELING_ASPECT]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.ZERGLING_BANELING_ASPECT]
+        # Spawn Banelings without Zergling => remove Baneling unit, keep upgrades except macro ones
+        if (ItemNames.ZERGLING_BANELING_ASPECT in self.logical_inventory
+            and ItemNames.ZERGLING not in self.logical_inventory
+            and ItemNames.KERRIGAN_SPAWN_BANELINGS in self.logical_inventory
+        ):
+            inventory = [item for item in inventory if item.name != ItemNames.ZERGLING_BANELING_ASPECT]
+            inventory = [item for item in inventory if item.name != ItemNames.BANELING_RAPID_METAMORPH]
+        if not {ItemNames.MUTALISK, ItemNames.CORRUPTOR, ItemNames.SCOURGE} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)]
+            locked_items = [item for item in locked_items if not item.name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)]
+        # T3 items removal rules - remove morph and its upgrades if the basic unit isn't in
+        if not {ItemNames.MUTALISK, ItemNames.CORRUPTOR} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Mutalisk/Corruptor)")]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT]
+        if ItemNames.ROACH not in logical_inventory_set:
+            inventory = [item for item in inventory if item.name != ItemNames.ROACH_RAVAGER_ASPECT]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.ROACH_RAVAGER_ASPECT]
+        if ItemNames.HYDRALISK not in logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Hydralisk)")]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.HYDRALISK_LURKER_ASPECT]
+            inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.HYDRALISK_IMPALER_ASPECT]
+        # LotV
+        # Shared unit upgrades between several units
+        if not {ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Stalker/Instigator/Slayer)")]
+        if not {ItemNames.PHOENIX, ItemNames.MIRAGE} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Phoenix/Mirage)")]
+        if not {ItemNames.VOID_RAY, ItemNames.DESTROYER} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Void Ray/Destroyer)")]
+        if not {ItemNames.IMMORTAL, ItemNames.ANNIHILATOR} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Immortal/Annihilator)")]
+        if not {ItemNames.DARK_TEMPLAR, ItemNames.AVENGER, ItemNames.BLOOD_HUNTER} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Dark Templar/Avenger/Blood Hunter)")]
+        if not {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ASCENDANT, ItemNames.DARK_TEMPLAR} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Archon)")]
+            logical_inventory_set.difference_update([item_name for item_name in logical_inventory_set if item_name.endswith("(Archon)")])
+        if not {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ARCHON_HIGH_ARCHON} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(High Templar/Signifier)")]
+        if ItemNames.SUPPLICANT not in logical_inventory_set:
+            inventory = [item for item in inventory if item.name != ItemNames.ASCENDANT_POWER_OVERWHELMING]
+        if not {ItemNames.DARK_ARCHON, ItemNames.DARK_TEMPLAR_DARK_ARCHON_MELD} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Dark Archon)")]
+        if not {ItemNames.SENTRY, ItemNames.ENERGIZER, ItemNames.HAVOC} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Sentry/Energizer/Havoc)")]
+        if not {ItemNames.SENTRY, ItemNames.ENERGIZER, ItemNames.HAVOC, ItemNames.SHIELD_BATTERY} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Sentry/Energizer/Havoc/Shield Battery)")]
+        if not {ItemNames.ZEALOT, ItemNames.CENTURION, ItemNames.SENTINEL} & logical_inventory_set:
+            inventory = [item for item in inventory if not item.name.endswith("(Zealot/Sentinel/Centurion)")]
+        # Static defense upgrades only if static defense present
+        if not {ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH, ItemNames.NEXUS_OVERCHARGE, ItemNames.SHIELD_BATTERY} & logical_inventory_set:
+            inventory = [item for item in inventory if item.name != ItemNames.ENHANCED_TARGETING]
+        if not {ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH, ItemNames.NEXUS_OVERCHARGE} & logical_inventory_set:
+            inventory = [item for item in inventory if item.name != ItemNames.OPTIMIZED_ORDNANCE]
+
+        # Cull finished, adding locked items back into inventory
+        inventory += locked_items
+
+        # Replacing empty space with generically useful items
+        replacement_items = [item for item in self.item_pool
+                             if (item not in inventory
+                                 and item not in self.locked_items
+                                 and (
+                                     item.name in second_pass_placeable_items
+                                     or item.name in unused_items))]
+        self.world.random.shuffle(replacement_items)
+        while len(inventory) < inventory_size and len(replacement_items) > 0:
+            item = replacement_items.pop()
+            inventory.append(item)
+
+        return inventory
+
+    def __init__(self, world: World ,
+                 item_pool: List[Item], existing_items: List[Item], locked_items: List[Item],
+                 used_races: Set[SC2Race], nova_equipment_used: bool):
+        self.multiworld = world.multiworld
+        self.player = world.player
+        self.world: World = world
+        self.logical_inventory = list()
+        self.locked_items = locked_items[:]
+        self.existing_items = existing_items
+        soa_presence = get_option_value(world, "spear_of_adun_presence")
+        soa_autocast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence")
+        # Initial filter of item pool
+        self.item_pool = []
+        item_quantities: dict[str, int] = dict()
+        # Inventory restrictiveness based on number of missions with checks
+        mission_count = num_missions(world)
+        self.min_units_per_structure = int(mission_count / 7)
+        min_upgrades = 1 if mission_count < 10 else 2
+        for item in item_pool:
+            item_info = get_full_item_list()[item.name]
+            if item_info.race != SC2Race.ANY and item_info.race not in used_races:
+                if soa_presence == SpearOfAdunPresence.option_everywhere \
+                        and item.name in spear_of_adun_calldowns:
+                    # Add SoA powers regardless of used races as it's present everywhere
+                    self.item_pool.append(item)
+                if soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere \
+                        and item.name in spear_of_adun_castable_passives:
+                    self.item_pool.append(item)
+                # Drop any item belonging to a race not used in the campaign
+                continue
+            if item.name in nova_equipment and not nova_equipment_used:
+                # Drop Nova equipment if there's no NCO mission generated
+                continue
+            if item_info.type == "Upgrade":
+                # Locking upgrades based on mission duration
+                if item.name not in item_quantities:
+                    item_quantities[item.name] = 0
+                item_quantities[item.name] += 1
+                if item_quantities[item.name] <= min_upgrades:
+                    self.locked_items.append(item)
+                else:
+                    self.item_pool.append(item)
+            elif item_info.type == "Goal":
+                self.locked_items.append(item)
+            else:
+                self.item_pool.append(item)
+        self.item_children: Dict[Item, List[Item]] = dict()
+        for item in self.item_pool + locked_items + existing_items:
+            if item.name in UPGRADABLE_ITEMS:
+                self.item_children[item] = get_item_upgrades(self.item_pool, item)
+
+
+def filter_items(world: World, mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], location_cache: List[Location],
+                 item_pool: List[Item], existing_items: List[Item], locked_items: List[Item]) -> List[Item]:
+    """
+    Returns a semi-randomly pruned set of items based on number of available locations.
+    The returned inventory must be capable of logically accessing every location in the world.
+    """
+    open_locations = [location for location in location_cache if location.item is None]
+    inventory_size = len(open_locations)
+    used_races = get_used_races(mission_req_table, world)
+    nova_equipment_used = is_nova_equipment_used(mission_req_table)
+    mission_requirements = [(location.name, location.access_rule) for location in location_cache]
+    valid_inventory = ValidInventory(world, item_pool, existing_items, locked_items, used_races, nova_equipment_used)
+
+    valid_items = valid_inventory.generate_reduced_inventory(inventory_size, mission_requirements)
+    return valid_items
+
+
+def get_used_races(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], world: World) -> Set[SC2Race]:
+    grant_story_tech = get_option_value(world, "grant_story_tech")
+    take_over_ai_allies = get_option_value(world, "take_over_ai_allies")
+    kerrigan_presence = get_option_value(world, "kerrigan_presence") \
+        and SC2Campaign.HOTS in get_enabled_campaigns(world)
+    missions = missions_in_mission_table(mission_req_table)
+
+    # By missions
+    races = set([mission.race for mission in missions])
+
+    # Conditionally logic-less no-builds (They're set to SC2Race.ANY):
+    if grant_story_tech == GrantStoryTech.option_false:
+        if SC2Mission.ENEMY_WITHIN in missions:
+            # Zerg units need to be unlocked
+            races.add(SC2Race.ZERG)
+        if kerrigan_presence in kerrigan_unit_available \
+                and not missions.isdisjoint({SC2Mission.BACK_IN_THE_SADDLE, SC2Mission.SUPREME, SC2Mission.CONVICTION, SC2Mission.THE_INFINITE_CYCLE}):
+            # You need some Kerrigan abilities (they're granted if Kerriganless or story tech granted)
+            races.add(SC2Race.ZERG)
+
+    # If you take over the AI Ally, you need to have its race stuff
+    if take_over_ai_allies == TakeOverAIAllies.option_true \
+            and not missions.isdisjoint({SC2Mission.THE_RECKONING}):
+        # Jimmy in The Reckoning
+        races.add(SC2Race.TERRAN)
+
+    return races
+
+def is_nova_equipment_used(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> bool:
+    missions = missions_in_mission_table(mission_req_table)
+    return any([mission.campaign == SC2Campaign.NCO for mission in missions])
+
+
+def missions_in_mission_table(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> Set[SC2Mission]:
+    return set([mission.mission for campaign_missions in mission_req_table.values() for mission in
+                campaign_missions.values()])
diff --git a/worlds/sc2/Regions.py b/worlds/sc2/Regions.py
new file mode 100644
index 00000000..e6c001b1
--- /dev/null
+++ b/worlds/sc2/Regions.py
@@ -0,0 +1,691 @@
+from typing import List, Dict, Tuple, Optional, Callable, NamedTuple, Union
+import math
+
+from BaseClasses import MultiWorld, Region, Entrance, Location, CollectionState
+from .Locations import LocationData
+from .Options import get_option_value, MissionOrder, get_enabled_campaigns, campaign_depending_orders, \
+    GridTwoStartPositions
+from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, \
+    MissionPools, SC2Campaign, get_goal_location, SC2Mission, MissionConnection
+from .PoolFilter import filter_missions
+from worlds.AutoWorld import World
+
+
+class SC2MissionSlot(NamedTuple):
+    campaign: SC2Campaign
+    slot: Union[MissionPools, SC2Mission, None]
+
+
+def create_regions(
+    world: World, locations: Tuple[LocationData, ...], location_cache: List[Location]
+) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]:
+    """
+    Creates region connections by calling the multiworld's `connect()` methods
+    Returns a 3-tuple containing:
+    * dict[SC2Campaign, Dict[str, MissionInfo]] mapping a campaign and mission name to its data
+    * int The number of missions in the world
+    * str The name of the goal location
+    """
+    mission_order_type: int = get_option_value(world, "mission_order")
+
+    if mission_order_type == MissionOrder.option_vanilla:
+        return create_vanilla_regions(world, locations, location_cache)
+    elif mission_order_type == MissionOrder.option_grid:
+        return create_grid_regions(world, locations, location_cache)
+    else:
+        return create_structured_regions(world, locations, location_cache, mission_order_type)
+
+def create_vanilla_regions(
+    world: World,
+    locations: Tuple[LocationData, ...],
+    location_cache: List[Location],
+) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]:
+    locations_per_region = get_locations_per_region(locations)
+    regions = [create_region(world, locations_per_region, location_cache, "Menu")]
+
+    mission_pools: Dict[MissionPools, List[SC2Mission]] = filter_missions(world)
+    final_mission = mission_pools[MissionPools.FINAL][0]
+
+    enabled_campaigns = get_enabled_campaigns(world)
+    names: Dict[str, int] = {}
+
+    # Generating all regions and locations for each enabled campaign
+    for campaign in enabled_campaigns:
+        for region_name in vanilla_mission_req_table[campaign].keys():
+            regions.append(create_region(world, locations_per_region, location_cache, region_name))
+    world.multiworld.regions += regions
+    vanilla_mission_reqs = {campaign: missions for campaign, missions in vanilla_mission_req_table.items() if campaign in enabled_campaigns}
+
+    def wol_cleared_missions(state: CollectionState, mission_count: int) -> bool:
+        return state.has_group("WoL Missions", world.player, mission_count)
+    
+    player: int = world.player
+    if SC2Campaign.WOL in enabled_campaigns:
+        connect(world, names, 'Menu', 'Liberation Day')
+        connect(world, names, 'Liberation Day', 'The Outlaws',
+                lambda state: state.has("Beat Liberation Day", player))
+        connect(world, names, 'The Outlaws', 'Zero Hour',
+                lambda state: state.has("Beat The Outlaws", player))
+        connect(world, names, 'Zero Hour', 'Evacuation',
+                lambda state: state.has("Beat Zero Hour", player))
+        connect(world, names, 'Evacuation', 'Outbreak',
+                lambda state: state.has("Beat Evacuation", player))
+        connect(world, names, "Outbreak", "Safe Haven",
+                lambda state: wol_cleared_missions(state, 7) and state.has("Beat Outbreak", player))
+        connect(world, names, "Outbreak", "Haven's Fall",
+                lambda state: wol_cleared_missions(state, 7) and state.has("Beat Outbreak", player))
+        connect(world, names, 'Zero Hour', 'Smash and Grab',
+                lambda state: state.has("Beat Zero Hour", player))
+        connect(world, names, 'Smash and Grab', 'The Dig',
+                lambda state: wol_cleared_missions(state, 8) and state.has("Beat Smash and Grab", player))
+        connect(world, names, 'The Dig', 'The Moebius Factor',
+                lambda state: wol_cleared_missions(state, 11) and state.has("Beat The Dig", player))
+        connect(world, names, 'The Moebius Factor', 'Supernova',
+                lambda state: wol_cleared_missions(state, 14) and state.has("Beat The Moebius Factor", player))
+        connect(world, names, 'Supernova', 'Maw of the Void',
+                lambda state: state.has("Beat Supernova", player))
+        connect(world, names, 'Zero Hour', "Devil's Playground",
+                lambda state: wol_cleared_missions(state, 4) and state.has("Beat Zero Hour", player))
+        connect(world, names, "Devil's Playground", 'Welcome to the Jungle',
+                lambda state: state.has("Beat Devil's Playground", player))
+        connect(world, names, "Welcome to the Jungle", 'Breakout',
+                lambda state: wol_cleared_missions(state, 8) and state.has("Beat Welcome to the Jungle", player))
+        connect(world, names, "Welcome to the Jungle", 'Ghost of a Chance',
+                lambda state: wol_cleared_missions(state, 8) and state.has("Beat Welcome to the Jungle", player))
+        connect(world, names, "Zero Hour", 'The Great Train Robbery',
+                lambda state: wol_cleared_missions(state, 6) and state.has("Beat Zero Hour", player))
+        connect(world, names, 'The Great Train Robbery', 'Cutthroat',
+                lambda state: state.has("Beat The Great Train Robbery", player))
+        connect(world, names, 'Cutthroat', 'Engine of Destruction',
+                lambda state: state.has("Beat Cutthroat", player))
+        connect(world, names, 'Engine of Destruction', 'Media Blitz',
+                lambda state: state.has("Beat Engine of Destruction", player))
+        connect(world, names, 'Media Blitz', 'Piercing the Shroud',
+                lambda state: state.has("Beat Media Blitz", player))
+        connect(world, names, 'Maw of the Void', 'Gates of Hell',
+                lambda state: state.has("Beat Maw of the Void", player))
+        connect(world, names, 'Gates of Hell', 'Belly of the Beast',
+                lambda state: state.has("Beat Gates of Hell", player))
+        connect(world, names, 'Gates of Hell', 'Shatter the Sky',
+                lambda state: state.has("Beat Gates of Hell", player))
+        connect(world, names, 'Gates of Hell', 'All-In',
+                lambda state: state.has('Beat Gates of Hell', player) and (
+                        state.has('Beat Shatter the Sky', player) or state.has('Beat Belly of the Beast', player)))
+
+    if SC2Campaign.PROPHECY in enabled_campaigns:
+        if SC2Campaign.WOL in enabled_campaigns:
+            connect(world, names, 'The Dig', 'Whispers of Doom',
+                    lambda state: state.has("Beat The Dig", player)),
+        else:
+            vanilla_mission_reqs[SC2Campaign.PROPHECY] = vanilla_mission_reqs[SC2Campaign.PROPHECY].copy()
+            vanilla_mission_reqs[SC2Campaign.PROPHECY][SC2Mission.WHISPERS_OF_DOOM.mission_name] = MissionInfo(
+                SC2Mission.WHISPERS_OF_DOOM, [], SC2Mission.WHISPERS_OF_DOOM.area)
+            connect(world, names, 'Menu', 'Whispers of Doom'),
+        connect(world, names, 'Whispers of Doom', 'A Sinister Turn',
+                lambda state: state.has("Beat Whispers of Doom", player))
+        connect(world, names, 'A Sinister Turn', 'Echoes of the Future',
+                lambda state: state.has("Beat A Sinister Turn", player))
+        connect(world, names, 'Echoes of the Future', 'In Utter Darkness',
+                lambda state: state.has("Beat Echoes of the Future", player))
+
+    if SC2Campaign.HOTS in enabled_campaigns:
+        connect(world, names, 'Menu', 'Lab Rat'),
+        connect(world, names, 'Lab Rat', 'Back in the Saddle',
+                lambda state: state.has("Beat Lab Rat", player)),
+        connect(world, names, 'Back in the Saddle', 'Rendezvous',
+                lambda state: state.has("Beat Back in the Saddle", player)),
+        connect(world, names, 'Rendezvous', 'Harvest of Screams',
+                lambda state: state.has("Beat Rendezvous", player)),
+        connect(world, names, 'Harvest of Screams', 'Shoot the Messenger',
+                lambda state: state.has("Beat Harvest of Screams", player)),
+        connect(world, names, 'Shoot the Messenger', 'Enemy Within',
+                lambda state: state.has("Beat Shoot the Messenger", player)),
+        connect(world, names, 'Rendezvous', 'Domination',
+                lambda state: state.has("Beat Rendezvous", player)),
+        connect(world, names, 'Domination', 'Fire in the Sky',
+                lambda state: state.has("Beat Domination", player)),
+        connect(world, names, 'Fire in the Sky', 'Old Soldiers',
+                lambda state: state.has("Beat Fire in the Sky", player)),
+        connect(world, names, 'Old Soldiers', 'Waking the Ancient',
+                lambda state: state.has("Beat Old Soldiers", player)),
+        connect(world, names, 'Enemy Within', 'Waking the Ancient',
+                lambda state: state.has("Beat Enemy Within", player)),
+        connect(world, names, 'Waking the Ancient', 'The Crucible',
+                lambda state: state.has("Beat Waking the Ancient", player)),
+        connect(world, names, 'The Crucible', 'Supreme',
+                lambda state: state.has("Beat The Crucible", player)),
+        connect(world, names, 'Supreme', 'Infested',
+                lambda state: state.has("Beat Supreme", player) and
+                            state.has("Beat Old Soldiers", player) and
+                            state.has("Beat Enemy Within", player)),
+        connect(world, names, 'Infested', 'Hand of Darkness',
+                lambda state: state.has("Beat Infested", player)),
+        connect(world, names, 'Hand of Darkness', 'Phantoms of the Void',
+                lambda state: state.has("Beat Hand of Darkness", player)),
+        connect(world, names, 'Supreme', 'With Friends Like These',
+                lambda state: state.has("Beat Supreme", player) and
+                            state.has("Beat Old Soldiers", player) and
+                            state.has("Beat Enemy Within", player)),
+        connect(world, names, 'With Friends Like These', 'Conviction',
+                lambda state: state.has("Beat With Friends Like These", player)),
+        connect(world, names, 'Conviction', 'Planetfall',
+                lambda state: state.has("Beat Conviction", player) and
+                            state.has("Beat Phantoms of the Void", player)),
+        connect(world, names, 'Planetfall', 'Death From Above',
+                lambda state: state.has("Beat Planetfall", player)),
+        connect(world, names, 'Death From Above', 'The Reckoning',
+                lambda state: state.has("Beat Death From Above", player)),
+
+    if SC2Campaign.PROLOGUE in enabled_campaigns:
+        connect(world, names, "Menu", "Dark Whispers")
+        connect(world, names, "Dark Whispers", "Ghosts in the Fog",
+                lambda state: state.has("Beat Dark Whispers", player))
+        connect(world, names, "Dark Whispers", "Evil Awoken",
+                lambda state: state.has("Beat Ghosts in the Fog", player))
+
+    if SC2Campaign.LOTV in enabled_campaigns:
+        connect(world, names, "Menu", "For Aiur!")
+        connect(world, names, "For Aiur!", "The Growing Shadow",
+                lambda state: state.has("Beat For Aiur!", player)),
+        connect(world, names, "The Growing Shadow", "The Spear of Adun",
+                lambda state: state.has("Beat The Growing Shadow", player)),
+        connect(world, names, "The Spear of Adun", "Sky Shield",
+                lambda state: state.has("Beat The Spear of Adun", player)),
+        connect(world, names, "Sky Shield", "Brothers in Arms",
+                lambda state: state.has("Beat Sky Shield", player)),
+        connect(world, names, "Brothers in Arms", "Forbidden Weapon",
+                lambda state: state.has("Beat Brothers in Arms", player)),
+        connect(world, names, "The Spear of Adun", "Amon's Reach",
+                lambda state: state.has("Beat The Spear of Adun", player)),
+        connect(world, names, "Amon's Reach", "Last Stand",
+                lambda state: state.has("Beat Amon's Reach", player)),
+        connect(world, names, "Last Stand", "Forbidden Weapon",
+                lambda state: state.has("Beat Last Stand", player)),
+        connect(world, names, "Forbidden Weapon", "Temple of Unification",
+                lambda state: state.has("Beat Brothers in Arms", player)
+                              and state.has("Beat Last Stand", player)
+                              and state.has("Beat Forbidden Weapon", player)),
+        connect(world, names, "Temple of Unification", "The Infinite Cycle",
+                lambda state: state.has("Beat Temple of Unification", player)),
+        connect(world, names, "The Infinite Cycle", "Harbinger of Oblivion",
+                lambda state: state.has("Beat The Infinite Cycle", player)),
+        connect(world, names, "Harbinger of Oblivion", "Unsealing the Past",
+                lambda state: state.has("Beat Harbinger of Oblivion", player)),
+        connect(world, names, "Unsealing the Past", "Purification",
+                lambda state: state.has("Beat Unsealing the Past", player)),
+        connect(world, names, "Purification", "Templar's Charge",
+                lambda state: state.has("Beat Purification", player)),
+        connect(world, names, "Harbinger of Oblivion", "Steps of the Rite",
+                lambda state: state.has("Beat Harbinger of Oblivion", player)),
+        connect(world, names, "Steps of the Rite", "Rak'Shir",
+                lambda state: state.has("Beat Steps of the Rite", player)),
+        connect(world, names, "Rak'Shir", "Templar's Charge",
+                lambda state: state.has("Beat Rak'Shir", player)),
+        connect(world, names, "Templar's Charge", "Templar's Return",
+                lambda state: state.has("Beat Purification", player)
+                              and state.has("Beat Rak'Shir", player)
+                              and state.has("Beat Templar's Charge", player)),
+        connect(world, names, "Templar's Return", "The Host",
+                lambda state: state.has("Beat Templar's Return", player)),
+        connect(world, names, "The Host", "Salvation",
+                lambda state: state.has("Beat The Host", player)),
+
+    if SC2Campaign.EPILOGUE in enabled_campaigns:
+        # TODO: Make this aware about excluded campaigns
+        connect(world, names, "Salvation", "Into the Void",
+                lambda state: state.has("Beat Salvation", player)
+                              and state.has("Beat The Reckoning", player)
+                              and state.has("Beat All-In", player)),
+        connect(world, names, "Into the Void", "The Essence of Eternity",
+                lambda state: state.has("Beat Into the Void", player)),
+        connect(world, names, "The Essence of Eternity", "Amon's Fall",
+                lambda state: state.has("Beat The Essence of Eternity", player)),
+
+    if SC2Campaign.NCO in enabled_campaigns:
+        connect(world, names, "Menu", "The Escape")
+        connect(world, names, "The Escape", "Sudden Strike",
+                lambda state: state.has("Beat The Escape", player))
+        connect(world, names, "Sudden Strike", "Enemy Intelligence",
+                lambda state: state.has("Beat Sudden Strike", player))
+        connect(world, names, "Enemy Intelligence", "Trouble In Paradise",
+                lambda state: state.has("Beat Enemy Intelligence", player))
+        connect(world, names, "Trouble In Paradise", "Night Terrors",
+                lambda state: state.has("Beat Evacuation", player))
+        connect(world, names, "Night Terrors", "Flashpoint",
+                lambda state: state.has("Beat Night Terrors", player))
+        connect(world, names, "Flashpoint", "In the Enemy's Shadow",
+                lambda state: state.has("Beat Flashpoint", player))
+        connect(world, names, "In the Enemy's Shadow", "Dark Skies",
+                lambda state: state.has("Beat In the Enemy's Shadow", player))
+        connect(world, names, "Dark Skies", "End Game",
+                lambda state: state.has("Beat Dark Skies", player))
+
+    goal_location = get_goal_location(final_mission)
+    assert goal_location, f"Unable to find a goal location for mission {final_mission}"
+    setup_final_location(goal_location, location_cache)
+
+    return (vanilla_mission_reqs, final_mission.id, goal_location)
+
+
+def create_grid_regions(
+    world: World,
+    locations: Tuple[LocationData, ...],
+    location_cache: List[Location],
+) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]:
+    locations_per_region = get_locations_per_region(locations)
+
+    mission_pools = filter_missions(world)
+    final_mission = mission_pools[MissionPools.FINAL][0]
+
+    mission_pool = [mission for mission_pool in mission_pools.values() for mission in mission_pool]
+
+    num_missions = min(len(mission_pool), get_option_value(world, "maximum_campaign_size"))
+    remove_top_left: bool = get_option_value(world, "grid_two_start_positions") == GridTwoStartPositions.option_true
+
+    regions = [create_region(world, locations_per_region, location_cache, "Menu")]
+    names: Dict[str, int] = {}
+    missions: Dict[Tuple[int, int], SC2Mission] = {}
+
+    grid_size_x, grid_size_y, num_corners_to_remove = get_grid_dimensions(num_missions + remove_top_left)
+    # pick missions in order along concentric diagonals
+    # each diagonal will have the same difficulty
+    # this keeps long sides from possibly stealing lower-difficulty missions from future columns
+    num_diagonals = grid_size_x + grid_size_y - 1
+    diagonal_difficulty = MissionPools.STARTER
+    missions_to_add = mission_pools[MissionPools.STARTER]
+    for diagonal in range(num_diagonals):
+        if diagonal == num_diagonals - 1:
+            diagonal_difficulty = MissionPools.FINAL
+            grid_coords = (grid_size_x-1, grid_size_y-1)
+            missions[grid_coords] = final_mission
+            break
+        if diagonal == 0 and remove_top_left:
+            continue
+        diagonal_length = min(diagonal + 1, num_diagonals - diagonal, grid_size_x, grid_size_y)
+        if len(missions_to_add) < diagonal_length:
+            raise Exception(f"There are not enough {diagonal_difficulty.name} missions to fill the campaign.  Please exclude fewer missions.")
+        for i in range(diagonal_length):
+            # (0,0) + (0,1)*diagonal + (1,-1)*i + (1,-1)*max(diagonal - grid_size_y + 1, 0)
+            grid_coords = (i + max(diagonal - grid_size_y + 1, 0), diagonal - i - max(diagonal - grid_size_y + 1, 0))
+            if grid_coords == (grid_size_x - 1, 0) and num_corners_to_remove >= 2:
+                pass
+            elif grid_coords == (0, grid_size_y - 1) and num_corners_to_remove >= 1:
+                pass
+            else:
+                mission_index = world.random.randint(0, len(missions_to_add) - 1)
+                missions[grid_coords] = missions_to_add.pop(mission_index)
+
+        if diagonal_difficulty < MissionPools.VERY_HARD:
+            diagonal_difficulty = MissionPools(diagonal_difficulty.value + 1)
+            missions_to_add.extend(mission_pools[diagonal_difficulty])
+
+    # Generating regions and locations from selected missions
+    for x in range(grid_size_x):
+        for y in range(grid_size_y):
+            if missions.get((x, y)):
+                regions.append(create_region(world, locations_per_region, location_cache, missions[(x, y)].mission_name))
+    world.multiworld.regions += regions
+
+    # This pattern is horrifying, why are we using the dict as an ordered dict???
+    slot_map: Dict[Tuple[int, int], int] = {}
+    for index, coords in enumerate(missions):
+        slot_map[coords] = index + 1
+
+    mission_req_table: Dict[str, MissionInfo] = {}
+    for coords, mission in missions.items():
+        prepend_vertical = 0
+        if not mission:
+            continue
+        connections: List[MissionConnection] = []
+        if coords == (0, 0) or (remove_top_left and sum(coords) == 1):
+            # Connect to the "Menu" starting region
+            connect(world, names, "Menu", mission.mission_name)
+        else:
+            for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
+                connected_coords = (coords[0] + dx, coords[1] + dy)
+                if connected_coords in missions:
+                    # connections.append(missions[connected_coords])
+                    connections.append(MissionConnection(slot_map[connected_coords]))
+                    connect(world, names, missions[connected_coords].mission_name, mission.mission_name,
+                            make_grid_connect_rule(missions, connected_coords, world.player),
+                            )
+        if coords[1] == 1 and not missions.get((coords[0], 0)):
+            prepend_vertical = 1
+        mission_req_table[mission.mission_name] = MissionInfo(
+            mission,
+            connections,
+            category=f'_{coords[0] + 1}',
+            or_requirements=True,
+            ui_vertical_padding=prepend_vertical,
+        )
+
+    final_mission_id = final_mission.id
+    # Changing the completion condition for alternate final missions into an event
+    final_location = get_goal_location(final_mission)
+    setup_final_location(final_location, location_cache)
+
+    return {SC2Campaign.GLOBAL: mission_req_table}, final_mission_id, final_location
+
+
+def make_grid_connect_rule(
+    missions: Dict[Tuple[int, int], SC2Mission],
+    connected_coords: Tuple[int, int],
+    player: int
+) -> Callable[[CollectionState], bool]:
+    return lambda state: state.has(f"Beat {missions[connected_coords].mission_name}", player)
+
+
+def create_structured_regions(
+    world: World,
+    locations: Tuple[LocationData, ...],
+    location_cache: List[Location],
+    mission_order_type: int,
+) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]:
+    locations_per_region = get_locations_per_region(locations)
+
+    mission_order = mission_orders[mission_order_type]()
+    enabled_campaigns = get_enabled_campaigns(world)
+    shuffle_campaigns = get_option_value(world, "shuffle_campaigns")
+
+    mission_pools: Dict[MissionPools, List[SC2Mission]] = filter_missions(world)
+    final_mission = mission_pools[MissionPools.FINAL][0]
+
+    regions = [create_region(world, locations_per_region, location_cache, "Menu")]
+
+    names: Dict[str, int] = {}
+
+    mission_slots: List[SC2MissionSlot] = []
+    mission_pool = [mission for mission_pool in mission_pools.values() for mission in mission_pool]
+
+    if mission_order_type in campaign_depending_orders:
+        # Do slot removal per campaign
+        for campaign in enabled_campaigns:
+            campaign_mission_pool = [mission for mission in mission_pool if mission.campaign == campaign]
+            campaign_mission_pool_size = len(campaign_mission_pool)
+
+            removals = len(mission_order[campaign]) - campaign_mission_pool_size
+
+            for mission in mission_order[campaign]:
+                # Removing extra missions if mission pool is too small
+                if 0 < mission.removal_priority <= removals:
+                    mission_slots.append(SC2MissionSlot(campaign, None))
+                elif mission.type == MissionPools.FINAL:
+                    if campaign == final_mission.campaign:
+                        # Campaign is elected to be goal
+                        mission_slots.append(SC2MissionSlot(campaign, final_mission))
+                    else:
+                        # Not the goal, find the most difficult mission in the pool and set the difficulty
+                        campaign_difficulty = max(mission.pool for mission in campaign_mission_pool)
+                        mission_slots.append(SC2MissionSlot(campaign, campaign_difficulty))
+                else:
+                    mission_slots.append(SC2MissionSlot(campaign, mission.type))
+    else:
+        order = mission_order[SC2Campaign.GLOBAL]
+        # Determining if missions must be removed
+        mission_pool_size = sum(len(mission_pool) for mission_pool in mission_pools.values())
+        removals = len(order) - mission_pool_size
+
+        # Initial fill out of mission list and marking All-In mission
+        for mission in order:
+            # Removing extra missions if mission pool is too small
+            if 0 < mission.removal_priority <= removals:
+                mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, None))
+            elif mission.type == MissionPools.FINAL:
+                mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, final_mission))
+            else:
+                mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, mission.type))
+
+    no_build_slots = []
+    easy_slots = []
+    medium_slots = []
+    hard_slots = []
+    very_hard_slots = []
+
+    # Search through missions to find slots needed to fill
+    for i in range(len(mission_slots)):
+        mission_slot = mission_slots[i]
+        if mission_slot is None:
+            continue
+        if isinstance(mission_slot, SC2MissionSlot):
+            if mission_slot.slot is None:
+                continue
+            if mission_slot.slot == MissionPools.STARTER:
+                no_build_slots.append(i)
+            elif mission_slot.slot == MissionPools.EASY:
+                easy_slots.append(i)
+            elif mission_slot.slot == MissionPools.MEDIUM:
+                medium_slots.append(i)
+            elif mission_slot.slot == MissionPools.HARD:
+                hard_slots.append(i)
+            elif mission_slot.slot == MissionPools.VERY_HARD:
+                very_hard_slots.append(i)
+
+    def pick_mission(slot):
+        if shuffle_campaigns or mission_order_type not in campaign_depending_orders:
+            # Pick a mission from any campaign
+            filler = world.random.randint(0, len(missions_to_add) - 1)
+            mission = missions_to_add.pop(filler)
+            slot_campaign = mission_slots[slot].campaign
+            mission_slots[slot] = SC2MissionSlot(slot_campaign, mission)
+        else:
+            # Pick a mission from required campaign
+            slot_campaign = mission_slots[slot].campaign
+            campaign_mission_candidates = [mission for mission in missions_to_add if mission.campaign == slot_campaign]
+            mission = world.random.choice(campaign_mission_candidates)
+            missions_to_add.remove(mission)
+            mission_slots[slot] = SC2MissionSlot(slot_campaign, mission)
+
+    # Add no_build missions to the pool and fill in no_build slots
+    missions_to_add: List[SC2Mission] = mission_pools[MissionPools.STARTER]
+    if len(no_build_slots) > len(missions_to_add):
+        raise Exception("There are no valid No-Build missions.  Please exclude fewer missions.")
+    for slot in no_build_slots:
+        pick_mission(slot)
+
+    # Add easy missions into pool and fill in easy slots
+    missions_to_add = missions_to_add + mission_pools[MissionPools.EASY]
+    if len(easy_slots) > len(missions_to_add):
+        raise Exception("There are not enough Easy missions to fill the campaign.  Please exclude fewer missions.")
+    for slot in easy_slots:
+        pick_mission(slot)
+
+    # Add medium missions into pool and fill in medium slots
+    missions_to_add = missions_to_add + mission_pools[MissionPools.MEDIUM]
+    if len(medium_slots) > len(missions_to_add):
+        raise Exception("There are not enough Easy and Medium missions to fill the campaign.  Please exclude fewer missions.")
+    for slot in medium_slots:
+        pick_mission(slot)
+
+    # Add hard missions into pool and fill in hard slots
+    missions_to_add = missions_to_add + mission_pools[MissionPools.HARD]
+    if len(hard_slots) > len(missions_to_add):
+        raise Exception("There are not enough missions to fill the campaign.  Please exclude fewer missions.")
+    for slot in hard_slots:
+        pick_mission(slot)
+
+    # Add very hard missions into pool and fill in very hard slots
+    missions_to_add = missions_to_add + mission_pools[MissionPools.VERY_HARD]
+    if len(very_hard_slots) > len(missions_to_add):
+        raise Exception("There are not enough missions to fill the campaign.  Please exclude fewer missions.")
+    for slot in very_hard_slots:
+        pick_mission(slot)
+
+    # Generating regions and locations from selected missions
+    for mission_slot in mission_slots:
+        if isinstance(mission_slot.slot, SC2Mission):
+            regions.append(create_region(world, locations_per_region, location_cache, mission_slot.slot.mission_name))
+    world.multiworld.regions += regions
+
+    campaigns: List[SC2Campaign]
+    if mission_order_type in campaign_depending_orders:
+        campaigns = list(enabled_campaigns)
+    else:
+        campaigns = [SC2Campaign.GLOBAL]
+
+    mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {}
+    campaign_mission_slots: Dict[SC2Campaign, List[SC2MissionSlot]] = \
+        {
+            campaign: [mission_slot for mission_slot in mission_slots if campaign == mission_slot.campaign]
+            for campaign in campaigns
+        }
+
+    slot_map: Dict[SC2Campaign, List[int]] = dict()
+
+    for campaign in campaigns:
+        mission_req_table.update({campaign: dict()})
+
+        # Mapping original mission slots to shifted mission slots when missions are removed
+        slot_map[campaign] = []
+        slot_offset = 0
+        for position, mission in enumerate(campaign_mission_slots[campaign]):
+            slot_map[campaign].append(position - slot_offset + 1)
+            if mission is None or mission.slot is None:
+                slot_offset += 1
+
+    def build_connection_rule(mission_names: List[str], missions_req: int) -> Callable:
+        player = world.player
+        if len(mission_names) > 1:
+            return lambda state: state.has_all({f"Beat {name}" for name in mission_names}, player) \
+                                 and state.has_group("Missions", player, missions_req)
+        else:
+            return lambda state: state.has(f"Beat {mission_names[0]}", player) \
+                                 and state.has_group("Missions", player, missions_req)
+
+    for campaign in campaigns:
+        # Loop through missions to create requirements table and connect regions
+        for i, mission in enumerate(campaign_mission_slots[campaign]):
+            if mission is None or mission.slot is None:
+                continue
+            connections: List[MissionConnection] = []
+            all_connections: List[SC2MissionSlot] = []
+            connection: MissionConnection
+            for connection in mission_order[campaign][i].connect_to:
+                if connection.connect_to == -1:
+                    continue
+                # If mission normally connects to an excluded campaign, connect to menu instead
+                if connection.campaign not in campaign_mission_slots:
+                    connection.connect_to = -1
+                    continue
+                while campaign_mission_slots[connection.campaign][connection.connect_to].slot is None:
+                    connection.connect_to -= 1
+                all_connections.append(campaign_mission_slots[connection.campaign][connection.connect_to])
+            for connection in mission_order[campaign][i].connect_to:
+                if connection.connect_to == -1:
+                    connect(world, names, "Menu", mission.slot.mission_name)
+                else:
+                    required_mission = campaign_mission_slots[connection.campaign][connection.connect_to]
+                    if ((required_mission is None or required_mission.slot is None)
+                            and not mission_order[campaign][i].completion_critical):  # Drop non-critical null slots
+                        continue
+                    while required_mission is None or required_mission.slot is None:  # Substituting null slot with prior slot
+                        connection.connect_to -= 1
+                        required_mission = campaign_mission_slots[connection.campaign][connection.connect_to]
+                    required_missions = [required_mission] if mission_order[campaign][i].or_requirements else all_connections
+                    if isinstance(required_mission.slot, SC2Mission):
+                        required_mission_name = required_mission.slot.mission_name
+                        required_missions_names = [mission.slot.mission_name for mission in required_missions]
+                        connect(world, names, required_mission_name, mission.slot.mission_name,
+                                build_connection_rule(required_missions_names, mission_order[campaign][i].number))
+                        connections.append(MissionConnection(slot_map[connection.campaign][connection.connect_to], connection.campaign))
+
+            mission_req_table[campaign].update({mission.slot.mission_name: MissionInfo(
+                mission.slot, connections, mission_order[campaign][i].category,
+                number=mission_order[campaign][i].number,
+                completion_critical=mission_order[campaign][i].completion_critical,
+                or_requirements=mission_order[campaign][i].or_requirements)})
+
+    final_mission_id = final_mission.id
+    # Changing the completion condition for alternate final missions into an event
+    final_location = get_goal_location(final_mission)
+    setup_final_location(final_location, location_cache)
+
+    return mission_req_table, final_mission_id, final_location
+
+
+def setup_final_location(final_location, location_cache):
+    # Final location should be near the end of the cache
+    for i in range(len(location_cache) - 1, -1, -1):
+        if location_cache[i].name == final_location:
+            location_cache[i].address = None
+            break
+
+
+def create_location(player: int, location_data: LocationData, region: Region,
+                    location_cache: List[Location]) -> Location:
+    location = Location(player, location_data.name, location_data.code, region)
+    location.access_rule = location_data.rule
+
+    location_cache.append(location)
+
+    return location
+
+
+def create_region(world: World, locations_per_region: Dict[str, List[LocationData]],
+                  location_cache: List[Location], name: str) -> Region:
+    region = Region(name, world.player, world.multiworld)
+
+    if name in locations_per_region:
+        for location_data in locations_per_region[name]:
+            location = create_location(world.player, location_data, region, location_cache)
+            region.locations.append(location)
+
+    return region
+
+
+def connect(world: World, used_names: Dict[str, int], source: str, target: str,
+            rule: Optional[Callable] = None):
+    source_region = world.get_region(source)
+    target_region = world.get_region(target)
+
+    if target not in used_names:
+        used_names[target] = 1
+        name = target
+    else:
+        used_names[target] += 1
+        name = target + (' ' * used_names[target])
+
+    connection = Entrance(world.player, name, source_region)
+
+    if rule:
+        connection.access_rule = rule
+
+    source_region.exits.append(connection)
+    connection.connect(target_region)
+
+
+def get_locations_per_region(locations: Tuple[LocationData, ...]) -> Dict[str, List[LocationData]]:
+    per_region: Dict[str, List[LocationData]] = {}
+
+    for location in locations:
+        per_region.setdefault(location.region, []).append(location)
+
+    return per_region
+
+
+def get_factors(number: int) -> Tuple[int, int]:
+    """
+    Simple factorization into pairs of numbers (x, y) using a sieve method.
+    Returns the factorization that is most square, i.e. where x + y is minimized.
+    Factor order is such that x <= y.
+    """
+    assert number > 0
+    for divisor in range(math.floor(math.sqrt(number)), 1, -1):
+        quotient = number // divisor
+        if quotient * divisor == number:
+            return divisor, quotient
+    return 1, number
+
+
+def get_grid_dimensions(size: int) -> Tuple[int, int, int]:
+    """
+    Get the dimensions of a grid mission order from the number of missions, int the format (x, y, error).
+    * Error will always be 0, 1, or 2, so the missions can be removed from the corners that aren't the start or end.
+    * Dimensions are chosen such that x <= y, as buttons in the UI are wider than they are tall.
+    * Dimensions are chosen to be maximally square. That is, x + y + error is minimized.
+    * If multiple options of the same rating are possible, the one with the larger error is chosen,
+    as it will appear more square. Compare 3x11 to 5x7-2 for an example of this.
+    """
+    dimension_candidates: List[Tuple[int, int, int]] = [(*get_factors(size + x), x) for x in (2, 1, 0)]
+    best_dimension = min(dimension_candidates, key=sum)
+    return best_dimension
+
diff --git a/worlds/sc2/Rules.py b/worlds/sc2/Rules.py
new file mode 100644
index 00000000..8b9097ea
--- /dev/null
+++ b/worlds/sc2/Rules.py
@@ -0,0 +1,952 @@
+from typing import Set
+
+from BaseClasses import  CollectionState
+from .Options import get_option_value, RequiredTactics, kerrigan_unit_available, AllInMap, \
+    GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, SpearOfAdunAutonomouslyCastAbilityPresence, \
+    get_enabled_campaigns, MissionOrder
+from .Items import get_basic_units, defense_ratings, zerg_defense_ratings, kerrigan_actives, air_defense_ratings, \
+    kerrigan_levels, get_full_item_list
+from .MissionTables import SC2Race, SC2Campaign
+from . import ItemNames
+from worlds.AutoWorld import World
+
+
+class SC2Logic:
+
+    def lock_any_item(self, state: CollectionState, items: Set[str]) -> bool:
+        """
+        Guarantees that at least one of these items will remain in the world. Doesn't affect placement.
+        Needed for cases when the dynamic pool filtering could remove all the item prerequisites
+        :param state:
+        :param items:
+        :return:
+        """
+        return self.is_item_placement(state) \
+            or state.has_any(items, self.player)
+
+    def is_item_placement(self, state):
+        """
+        Tells if it's item placement or item pool filter
+        :param state:
+        :return: True for item placement, False for pool filter
+        """
+        # has_group with count = 0 is always true for item placement and always false for SC2 item filtering
+        return state.has_group("Missions", self.player, 0)
+
+    # WoL
+    def terran_common_unit(self, state: CollectionState) -> bool:
+        return state.has_any(self.basic_terran_units, self.player)
+
+    def terran_early_tech(self, state: CollectionState):
+        """
+        Basic combat unit that can be deployed quickly from mission start
+        :param state
+        :return:
+        """
+        return (
+                state.has_any({ItemNames.MARINE, ItemNames.FIREBAT, ItemNames.MARAUDER, ItemNames.REAPER, ItemNames.HELLION}, self.player)
+                or (self.advanced_tactics and state.has_any({ItemNames.GOLIATH, ItemNames.DIAMONDBACK, ItemNames.VIKING, ItemNames.BANSHEE}, self.player))
+        )
+
+    def terran_air(self, state: CollectionState) -> bool:
+        """
+        Air units or drops on advanced tactics
+        :param state:
+        :return:
+        """
+        return (state.has_any({ItemNames.VIKING, ItemNames.WRAITH, ItemNames.BANSHEE, ItemNames.BATTLECRUISER}, self.player) or self.advanced_tactics
+                and state.has_any({ItemNames.HERCULES, ItemNames.MEDIVAC}, self.player) and self.terran_common_unit(state)
+        )
+
+    def terran_air_anti_air(self, state: CollectionState) -> bool:
+        """
+        Air-to-air
+        :param state:
+        :return:
+        """
+        return (
+            state.has(ItemNames.VIKING, self.player)
+            or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player)
+            or state.has_all({ItemNames.BATTLECRUISER, ItemNames.BATTLECRUISER_ATX_LASER_BATTERY}, self.player)
+            or self.advanced_tactics and state.has_any({ItemNames.WRAITH, ItemNames.VALKYRIE, ItemNames.BATTLECRUISER}, self.player)
+        )
+
+    def terran_competent_ground_to_air(self, state: CollectionState) -> bool:
+        """
+        Ground-to-air
+        :param state:
+        :return:
+        """
+        return (
+            state.has(ItemNames.GOLIATH, self.player)
+            or state.has(ItemNames.MARINE, self.player) and self.terran_bio_heal(state)
+            or self.advanced_tactics and state.has(ItemNames.CYCLONE, self.player)
+        )
+
+    def terran_competent_anti_air(self, state: CollectionState) -> bool:
+        """
+        Good AA unit
+        :param state:
+        :return:
+        """
+        return (
+            self.terran_competent_ground_to_air(state)
+            or self.terran_air_anti_air(state)
+        )
+
+    def welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool:
+        """
+        Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers
+        :param state:
+        :return:
+        """
+        return (
+            self.terran_common_unit(state)
+            and self.terran_competent_ground_to_air(state)
+        ) or (
+            self.advanced_tactics
+            and state.has_any({ItemNames.MARINE, ItemNames.VULTURE}, self.player)
+            and self.terran_air_anti_air(state)
+        )
+
+    def terran_basic_anti_air(self, state: CollectionState) -> bool:
+        """
+        Basic AA to deal with few air units
+        :param state:
+        :return:
+        """
+        return (
+            state.has_any({
+                ItemNames.MISSILE_TURRET, ItemNames.THOR, ItemNames.WAR_PIGS, ItemNames.SPARTAN_COMPANY,
+                ItemNames.HELS_ANGELS, ItemNames.BATTLECRUISER, ItemNames.MARINE, ItemNames.WRAITH,
+                ItemNames.VALKYRIE, ItemNames.CYCLONE, ItemNames.WINGED_NIGHTMARES, ItemNames.BRYNHILDS
+            }, self.player)
+            or self.terran_competent_anti_air(state)
+            or self.advanced_tactics and state.has_any({ItemNames.GHOST, ItemNames.SPECTRE, ItemNames.WIDOW_MINE, ItemNames.LIBERATOR}, self.player)
+        )
+
+    def terran_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int:
+        """
+        Ability to handle defensive missions
+        :param state:
+        :param zerg_enemy:
+        :param air_enemy:
+        :return:
+        """
+        defense_score = sum((defense_ratings[item] for item in defense_ratings if state.has(item, self.player)))
+        # Manned Bunker
+        if state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) and state.has(ItemNames.BUNKER, self.player):
+            defense_score += 3
+        elif zerg_enemy and state.has(ItemNames.FIREBAT, self.player) and state.has(ItemNames.BUNKER, self.player):
+            defense_score += 2
+        # Siege Tank upgrades
+        if state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS}, self.player):
+            defense_score += 2
+        if state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_GRADUATING_RANGE}, self.player):
+            defense_score += 1
+        # Widow Mine upgrade
+        if state.has_all({ItemNames.WIDOW_MINE, ItemNames.WIDOW_MINE_CONCEALMENT}, self.player):
+            defense_score += 1
+        # Viking with splash
+        if state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player):
+            defense_score += 2
+
+        # General enemy-based rules
+        if zerg_enemy:
+            defense_score += sum((zerg_defense_ratings[item] for item in zerg_defense_ratings if state.has(item, self.player)))
+        if air_enemy:
+            defense_score += sum((air_defense_ratings[item] for item in air_defense_ratings if state.has(item, self.player)))
+        if air_enemy and zerg_enemy and state.has(ItemNames.VALKYRIE, self.player):
+            # Valkyries shred mass Mutas, most common air enemy that's massed in these cases
+            defense_score += 2
+        # Advanced Tactics bumps defense rating requirements down by 2
+        if self.advanced_tactics:
+            defense_score += 2
+        return defense_score
+
+    def terran_competent_comp(self, state: CollectionState) -> bool:
+        """
+        Ability to deal with most of hard missions
+        :param state:
+        :return:
+        """
+        return (
+            (
+                (state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) and self.terran_bio_heal(state))
+                or state.has_any({ItemNames.THOR, ItemNames.BANSHEE, ItemNames.SIEGE_TANK}, self.player)
+                or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player)
+            )
+            and self.terran_competent_anti_air(state)
+        ) or (
+            state.has(ItemNames.BATTLECRUISER, self.player) and self.terran_common_unit(state)
+        )
+
+    def great_train_robbery_train_stopper(self, state: CollectionState) -> bool:
+        """
+        Ability to deal with trains (moving target with a lot of HP)
+        :param state:
+        :return:
+        """
+        return (
+            state.has_any({ItemNames.SIEGE_TANK, ItemNames.DIAMONDBACK, ItemNames.MARAUDER, ItemNames.CYCLONE, ItemNames.BANSHEE}, self.player)
+            or self.advanced_tactics
+            and (
+                state.has_all({ItemNames.REAPER, ItemNames.REAPER_G4_CLUSTERBOMB}, self.player)
+                or state.has_all({ItemNames.SPECTRE, ItemNames.SPECTRE_PSIONIC_LASH}, self.player)
+                or state.has_any({ItemNames.VULTURE, ItemNames.LIBERATOR}, self.player)
+            )
+        )
+
+    def terran_can_rescue(self, state) -> bool:
+        """
+        Rescuing in The Moebius Factor
+        :param state:
+        :return:
+        """
+        return state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES, ItemNames.RAVEN, ItemNames.VIKING}, self.player) or self.advanced_tactics
+
+    def terran_beats_protoss_deathball(self, state: CollectionState) -> bool:
+        """
+        Ability to deal with Immortals, Colossi with some air support
+        :param state:
+        :return:
+        """
+        return (
+            (
+                state.has_any({ItemNames.BANSHEE, ItemNames.BATTLECRUISER}, self.player)
+                or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player)
+            ) and self.terran_competent_anti_air(state)
+            or self.terran_competent_comp(state) and self.terran_air_anti_air(state)
+        )
+
+    def marine_medic_upgrade(self, state: CollectionState) -> bool:
+        """
+        Infantry upgrade to infantry-only no-build segments
+        :param state:
+        :return:
+        """
+        return state.has_any({
+            ItemNames.MARINE_COMBAT_SHIELD, ItemNames.MARINE_MAGRAIL_MUNITIONS, ItemNames.MEDIC_STABILIZER_MEDPACKS
+        }, self.player) \
+            or (state.count(ItemNames.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2
+                and state.has_group("Missions", self.player, 1))
+
+    def terran_survives_rip_field(self, state: CollectionState) -> bool:
+        """
+        Ability to deal with large areas with environment damage
+        :param state:
+        :return:
+        """
+        return (state.has(ItemNames.BATTLECRUISER, self.player)
+                or self.terran_air(state) and self.terran_competent_anti_air(state) and self.terran_sustainable_mech_heal(state))
+
+    def terran_sustainable_mech_heal(self, state: CollectionState) -> bool:
+        """
+        Can heal mech units without spending resources
+        :param state:
+        :return:
+        """
+        return state.has(ItemNames.SCIENCE_VESSEL, self.player) \
+            or state.has_all({ItemNames.MEDIC, ItemNames.MEDIC_ADAPTIVE_MEDPACKS}, self.player) \
+            or state.count(ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 \
+            or (self.advanced_tactics
+                and (
+                        state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player)
+                        or state.count(ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2)
+                )
+
+    def terran_bio_heal(self, state: CollectionState) -> bool:
+        """
+        Ability to heal bio units
+        :param state:
+        :return:
+        """
+        return state.has_any({ItemNames.MEDIC, ItemNames.MEDIVAC}, self.player) \
+            or self.advanced_tactics and state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player)
+
+    def terran_base_trasher(self, state: CollectionState) -> bool:
+        """
+        Can attack heavily defended bases
+        :param state:
+        :return:
+        """
+        return state.has(ItemNames.SIEGE_TANK, self.player) \
+            or state.has_all({ItemNames.BATTLECRUISER, ItemNames.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) \
+            or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) \
+            or (self.advanced_tactics
+                and ((state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, self.player)
+                      or self.can_nuke(state))
+                     and (
+                             state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player)
+                             or state.has_all({ItemNames.BANSHEE, ItemNames.BANSHEE_SHOCKWAVE_MISSILE_BATTERY}, self.player))
+                     )
+                )
+
+    def terran_mobile_detector(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.RAVEN, ItemNames.SCIENCE_VESSEL, ItemNames.PROGRESSIVE_ORBITAL_COMMAND}, self.player)
+
+    def can_nuke(self, state: CollectionState) -> bool:
+        """
+        Ability to launch nukes
+        :param state:
+        :return:
+        """
+        return (self.advanced_tactics
+                and (state.has_any({ItemNames.GHOST, ItemNames.SPECTRE}, self.player)
+                     or state.has_all({ItemNames.THOR, ItemNames.THOR_BUTTON_WITH_A_SKULL_ON_IT}, self.player)))
+
+    def terran_respond_to_colony_infestations(self, state: CollectionState) -> bool:
+        """
+        Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission
+        :param state:
+        :return:
+        """
+        return (
+            self.terran_common_unit(state)
+            and self.terran_competent_anti_air(state)
+            and (
+                    self.terran_air_anti_air(state)
+                    or state.has_any({ItemNames.BATTLECRUISER, ItemNames.VALKYRIE}, self.player)
+                )
+            and self.terran_defense_rating(state, True) >= 3
+        )
+
+    def engine_of_destruction_requirement(self, state: CollectionState):
+        return self.marine_medic_upgrade(state) \
+        and (
+                self.terran_competent_anti_air(state)
+                and self.terran_common_unit(state) or state.has(ItemNames.WRAITH, self.player)
+        )
+
+    def all_in_requirement(self, state: CollectionState):
+        """
+        All-in
+        :param state:
+        :return:
+        """
+        beats_kerrigan = state.has_any({ItemNames.MARINE, ItemNames.BANSHEE, ItemNames.GHOST}, self.player) or self.advanced_tactics
+        if get_option_value(self.world, 'all_in_map') == AllInMap.option_ground:
+            # Ground
+            defense_rating = self.terran_defense_rating(state, True, False)
+            if state.has_any({ItemNames.BATTLECRUISER, ItemNames.BANSHEE}, self.player):
+                defense_rating += 2
+            return defense_rating >= 13 and beats_kerrigan
+        else:
+            # Air
+            defense_rating = self.terran_defense_rating(state, True, True)
+            return defense_rating >= 9 and beats_kerrigan \
+                and state.has_any({ItemNames.VIKING, ItemNames.BATTLECRUISER, ItemNames.VALKYRIE}, self.player) \
+                and state.has_any({ItemNames.HIVE_MIND_EMULATOR, ItemNames.PSI_DISRUPTER, ItemNames.MISSILE_TURRET}, self.player)
+
+    # HotS
+    def zerg_common_unit(self, state: CollectionState) -> bool:
+        return state.has_any(self.basic_zerg_units, self.player)
+
+    def zerg_competent_anti_air(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.HYDRALISK, ItemNames.MUTALISK, ItemNames.CORRUPTOR, ItemNames.BROOD_QUEEN}, self.player) \
+            or state.has_all({ItemNames.SWARM_HOST, ItemNames.SWARM_HOST_PRESSURIZED_GLANDS}, self.player) \
+            or state.has_all({ItemNames.SCOURGE, ItemNames.SCOURGE_RESOURCE_EFFICIENCY}, self.player) \
+            or (self.advanced_tactics and state.has(ItemNames.INFESTOR, self.player))
+
+    def zerg_basic_anti_air(self, state: CollectionState) -> bool:
+        return self.zerg_competent_anti_air(state) or self.kerrigan_unit_available in kerrigan_unit_available or \
+               state.has_any({ItemNames.SWARM_QUEEN, ItemNames.SCOURGE}, self.player) or (self.advanced_tactics and state.has(ItemNames.SPORE_CRAWLER, self.player))
+    
+    def morph_brood_lord(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.MUTALISK, ItemNames.CORRUPTOR}, self.player) \
+            and state.has(ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, self.player)
+    
+    def morph_viper(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.MUTALISK, ItemNames.CORRUPTOR}, self.player) \
+            and state.has(ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, self.player)
+
+    def morph_impaler_or_lurker(self, state: CollectionState) -> bool:
+        return state.has(ItemNames.HYDRALISK, self.player) and state.has_any({ItemNames.HYDRALISK_IMPALER_ASPECT, ItemNames.HYDRALISK_LURKER_ASPECT}, self.player)
+
+    def zerg_competent_comp(self, state: CollectionState) -> bool:
+        advanced = self.advanced_tactics
+        core_unit = state.has_any({ItemNames.ROACH, ItemNames.ABERRATION, ItemNames.ZERGLING}, self.player)
+        support_unit = state.has_any({ItemNames.SWARM_QUEEN, ItemNames.HYDRALISK}, self.player) \
+                       or self.morph_brood_lord(state) \
+                       or advanced and (state.has_any({ItemNames.INFESTOR, ItemNames.DEFILER}, self.player) or self.morph_viper(state))
+        if core_unit and support_unit:
+            return True
+        vespene_unit = state.has_any({ItemNames.ULTRALISK, ItemNames.ABERRATION}, self.player) \
+                       or advanced and self.morph_viper(state)
+        return vespene_unit and state.has_any({ItemNames.ZERGLING, ItemNames.SWARM_QUEEN}, self.player)
+
+    def spread_creep(self, state: CollectionState) -> bool:
+        return self.advanced_tactics or state.has(ItemNames.SWARM_QUEEN, self.player)
+    
+    def zerg_competent_defense(self, state: CollectionState) -> bool:
+        return (
+            self.zerg_common_unit(state)
+            and (
+                (
+                    state.has(ItemNames.SWARM_HOST, self.player)
+                    or self.morph_brood_lord(state)
+                    or self.morph_impaler_or_lurker(state)
+                ) or (
+                    self.advanced_tactics
+                    and (self.morph_viper(state)
+                        or state.has(ItemNames.SPINE_CRAWLER, self.player))
+                )
+            )
+        )
+
+    def basic_kerrigan(self, state: CollectionState) -> bool:
+        # One active ability that can be used to defeat enemies directly on Standard
+        if not self.advanced_tactics and \
+            not state.has_any({ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE,
+                              ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT,
+                              ItemNames.KERRIGAN_SPAWN_BANELINGS}, self.player):
+            return False
+        # Two non-ultimate abilities
+        count = 0
+        for item in (ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE, ItemNames.KERRIGAN_HEROIC_FORTITUDE,
+                     ItemNames.KERRIGAN_CHAIN_REACTION, ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT,
+                     ItemNames.KERRIGAN_SPAWN_BANELINGS, ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY):
+            if state.has(item, self.player):
+                count += 1
+            if count >= 2:
+                return True
+        return False
+
+    def two_kerrigan_actives(self, state: CollectionState) -> bool:
+        count = 0
+        for i in range(7):
+            if state.has_any(kerrigan_actives[i], self.player):
+                count += 1
+        return count >= 2
+
+    def zerg_pass_vents(self, state: CollectionState) -> bool:
+        return self.story_tech_granted \
+            or state.has_any({ItemNames.ZERGLING, ItemNames.HYDRALISK, ItemNames.ROACH}, self.player) \
+            or (self.advanced_tactics and state.has(ItemNames.INFESTOR, self.player))
+
+    def supreme_requirement(self, state: CollectionState) -> bool:
+        return self.story_tech_granted \
+            or not self.kerrigan_unit_available \
+            or (
+                state.has_all({ItemNames.KERRIGAN_LEAPING_STRIKE, ItemNames.KERRIGAN_MEND}, self.player)
+                and self.kerrigan_levels(state, 35)
+            )
+
+    def kerrigan_levels(self, state: CollectionState, target: int) -> bool:
+        if self.story_levels_granted or not self.kerrigan_unit_available:
+            return True  # Levels are granted
+        if self.kerrigan_levels_per_mission_completed > 0 \
+           and self.kerrigan_levels_per_mission_completed_cap > 0 \
+           and not self.is_item_placement(state):
+            # Levels can be granted from mission completion.
+            # Item pool filtering isn't aware of missions beaten. Assume that missions beaten will fulfill this rule.
+            return True
+        # Levels from missions beaten
+        levels = self.kerrigan_levels_per_mission_completed * state.count_group("Missions", self.player)
+        if self.kerrigan_levels_per_mission_completed_cap != -1:
+            levels = min(levels, self.kerrigan_levels_per_mission_completed_cap)
+        # Levels from items
+        for kerrigan_level_item in kerrigan_levels:
+            level_amount = get_full_item_list()[kerrigan_level_item].number
+            item_count = state.count(kerrigan_level_item, self.player)
+            levels += item_count * level_amount
+        # Total level cap
+        if self.kerrigan_total_level_cap != -1:
+            levels = min(levels, self.kerrigan_total_level_cap)
+
+        return levels >= target
+
+
+    def the_reckoning_requirement(self, state: CollectionState) -> bool:
+        if self.take_over_ai_allies:
+            return self.terran_competent_comp(state) \
+                and self.zerg_competent_comp(state) \
+                and (self.zerg_competent_anti_air(state)
+                     or self.terran_competent_anti_air(state))
+        else:
+            return self.zerg_competent_comp(state) \
+                and self.zerg_competent_anti_air(state)
+
+    # LotV
+
+    def protoss_common_unit(self, state: CollectionState) -> bool:
+        return state.has_any(self.basic_protoss_units, self.player)
+
+    def protoss_basic_anti_air(self, state: CollectionState) -> bool:
+        return self.protoss_competent_anti_air(state) \
+            or state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER, ItemNames.SCOUT,
+                             ItemNames.DARK_ARCHON, ItemNames.WRATHWALKER, ItemNames.MOTHERSHIP}, self.player) \
+            or state.has_all({ItemNames.WARP_PRISM, ItemNames.WARP_PRISM_PHASE_BLASTER}, self.player) \
+            or self.advanced_tactics and state.has_any(
+                {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ASCENDANT, ItemNames.DARK_TEMPLAR,
+                 ItemNames.SENTRY, ItemNames.ENERGIZER}, self.player)
+
+    def protoss_anti_armor_anti_air(self, state: CollectionState) -> bool:
+        return self.protoss_competent_anti_air(state) \
+            or state.has_any({ItemNames.SCOUT, ItemNames.WRATHWALKER}, self.player) \
+            or (state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player)
+                and state.has(ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS, self.player))
+
+    def protoss_anti_light_anti_air(self, state: CollectionState) -> bool:
+        return self.protoss_competent_anti_air(state) \
+            or state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER}, self.player)
+
+    def protoss_competent_anti_air(self, state: CollectionState) -> bool:
+        return state.has_any(
+            {ItemNames.STALKER, ItemNames.SLAYER, ItemNames.INSTIGATOR, ItemNames.DRAGOON, ItemNames.ADEPT,
+             ItemNames.VOID_RAY, ItemNames.DESTROYER, ItemNames.TEMPEST}, self.player) \
+            or (state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER}, self.player)
+                and state.has_any({ItemNames.SCOUT, ItemNames.WRATHWALKER}, self.player)) \
+            or (self.advanced_tactics
+                and state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player)
+                and state.has(ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS, self.player))
+
+    def protoss_has_blink(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER}, self.player) \
+            or (
+                    state.has(ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player)
+                    and state.has_any({ItemNames.DARK_TEMPLAR, ItemNames.BLOOD_HUNTER, ItemNames.AVENGER}, self.player)
+            )
+
+    def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool:
+        return state.has_any(
+            {ItemNames.SCOUT, ItemNames.TEMPEST,
+             ItemNames.CARRIER, ItemNames.VOID_RAY, ItemNames.DESTROYER, ItemNames.MOTHERSHIP}, self.player) \
+            or self.protoss_has_blink(state) \
+            or (state.has(ItemNames.WARP_PRISM, self.player)
+                and (self.protoss_common_unit(state) or state.has(ItemNames.WARP_PRISM_PHASE_BLASTER, self.player))) \
+            or (self.advanced_tactics
+                and state.has_any({ItemNames.ORACLE, ItemNames.ARBITER}, self.player))
+
+    def protoss_fleet(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.CARRIER, ItemNames.TEMPEST, ItemNames.VOID_RAY, ItemNames.DESTROYER}, self.player)
+
+    def templars_return_requirement(self, state: CollectionState) -> bool:
+        return self.story_tech_granted \
+            or (
+                state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player)
+                and state.has_any({ItemNames.COLOSSUS, ItemNames.VANGUARD, ItemNames.REAVER, ItemNames.DARK_TEMPLAR}, self.player)
+                and state.has_any({ItemNames.SENTRY, ItemNames.HIGH_TEMPLAR}, self.player)
+            )
+
+    def brothers_in_arms_requirement(self, state: CollectionState) -> bool:
+        return (
+                self.protoss_common_unit(state)
+                and self.protoss_anti_armor_anti_air(state)
+                and self.protoss_hybrid_counter(state)
+        ) or (
+                self.take_over_ai_allies
+                and (
+                        self.terran_common_unit(state)
+                        or self.protoss_common_unit(state)
+                )
+                and (
+                        self.terran_competent_anti_air(state)
+                        or self.protoss_anti_armor_anti_air(state)
+                )
+                and (
+                        self.protoss_hybrid_counter(state)
+                        or state.has_any({ItemNames.BATTLECRUISER, ItemNames.LIBERATOR, ItemNames.SIEGE_TANK}, self.player)
+                        or state.has_all({ItemNames.SPECTRE, ItemNames.SPECTRE_PSIONIC_LASH}, self.player)
+                        or (state.has(ItemNames.IMMORTAL, self.player)
+                            and state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player)
+                            and self.terran_bio_heal(state))
+                )
+        )
+
+    def protoss_hybrid_counter(self, state: CollectionState) -> bool:
+        """
+        Ground Hybrids
+        """
+        return state.has_any(
+            {ItemNames.ANNIHILATOR, ItemNames.ASCENDANT, ItemNames.TEMPEST, ItemNames.CARRIER, ItemNames.VOID_RAY,
+             ItemNames.WRATHWALKER, ItemNames.VANGUARD}, self.player) \
+            or (state.has(ItemNames.IMMORTAL, self.player) or self.advanced_tactics) and state.has_any(
+                {ItemNames.STALKER, ItemNames.DRAGOON, ItemNames.ADEPT, ItemNames.INSTIGATOR, ItemNames.SLAYER}, self.player)
+
+    def the_infinite_cycle_requirement(self, state: CollectionState) -> bool:
+        return self.story_tech_granted \
+            or not self.kerrigan_unit_available \
+            or (
+                self.two_kerrigan_actives(state)
+                and self.basic_kerrigan(state)
+                and self.kerrigan_levels(state, 70)
+            )
+
+    def protoss_basic_splash(self, state: CollectionState) -> bool:
+        return state.has_any(
+            {ItemNames.ZEALOT, ItemNames.COLOSSUS, ItemNames.VANGUARD, ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER,
+             ItemNames.DARK_TEMPLAR, ItemNames.REAVER, ItemNames.ASCENDANT}, self.player)
+
+    def protoss_static_defense(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH}, self.player)
+
+    def last_stand_requirement(self, state: CollectionState) -> bool:
+        return self.protoss_common_unit(state) \
+            and self.protoss_competent_anti_air(state) \
+            and self.protoss_static_defense(state) \
+            and (
+                self.advanced_tactics
+                or self.protoss_basic_splash(state)
+            )
+
+    def harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool:
+        return self.protoss_anti_armor_anti_air(state) and (
+                self.take_over_ai_allies
+                or (
+                        self.protoss_common_unit(state)
+                        and self.protoss_hybrid_counter(state)
+                )
+        )
+
+    def protoss_competent_comp(self, state: CollectionState) -> bool:
+        return self.protoss_common_unit(state) \
+            and self.protoss_competent_anti_air(state) \
+            and self.protoss_hybrid_counter(state) \
+            and self.protoss_basic_splash(state)
+
+    def protoss_stalker_upgrade(self, state: CollectionState) -> bool:
+        return (
+                state.has_any(
+                    {
+                        ItemNames.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES,
+                        ItemNames.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION
+                    }, self.player)
+                and self.lock_any_item(state, {ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER})
+        )
+
+    def steps_of_the_rite_requirement(self, state: CollectionState) -> bool:
+        return self.protoss_competent_comp(state) \
+            or (
+                    self.protoss_common_unit(state)
+                    and self.protoss_competent_anti_air(state)
+                    and self.protoss_static_defense(state)
+            )
+
+    def protoss_heal(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.CARRIER, ItemNames.SENTRY, ItemNames.SHIELD_BATTERY, ItemNames.RECONSTRUCTION_BEAM}, self.player)
+
+    def templars_charge_requirement(self, state: CollectionState) -> bool:
+        return self.protoss_heal(state) \
+            and self.protoss_anti_armor_anti_air(state) \
+            and (
+                    self.protoss_fleet(state)
+                    or (self.advanced_tactics
+                        and self.protoss_competent_comp(state)
+                        )
+            )
+
+    def the_host_requirement(self, state: CollectionState) -> bool:
+        return (self.protoss_fleet(state)
+                and self.protoss_static_defense(state)
+                ) or (
+                self.protoss_competent_comp(state)
+                and state.has(ItemNames.SOA_TIME_STOP, self.player)
+        )
+
+    def salvation_requirement(self, state: CollectionState) -> bool:
+        return [
+            self.protoss_competent_comp(state),
+            self.protoss_fleet(state),
+            self.protoss_static_defense(state)
+        ].count(True) >= 2
+
+    def into_the_void_requirement(self, state: CollectionState) -> bool:
+        return self.protoss_competent_comp(state) \
+            or (
+                    self.take_over_ai_allies
+                    and (
+                            state.has(ItemNames.BATTLECRUISER, self.player)
+                            or (
+                                    state.has(ItemNames.ULTRALISK, self.player)
+                                    and self.protoss_competent_anti_air(state)
+                            )
+                    )
+            )
+
+    def essence_of_eternity_requirement(self, state: CollectionState) -> bool:
+        defense_score = self.terran_defense_rating(state, False, True)
+        if self.take_over_ai_allies and self.protoss_static_defense(state):
+            defense_score += 2
+        return defense_score >= 10 \
+            and (
+                    self.terran_competent_anti_air(state)
+                    or self.take_over_ai_allies
+                    and self.protoss_competent_anti_air(state)
+            ) \
+            and (
+                    state.has(ItemNames.BATTLECRUISER, self.player)
+                    or (state.has(ItemNames.BANSHEE, self.player) and state.has_any({ItemNames.VIKING, ItemNames.VALKYRIE},
+                                                                                    self.player))
+                    or self.take_over_ai_allies and self.protoss_fleet(state)
+            ) \
+            and state.has_any({ItemNames.SIEGE_TANK, ItemNames.LIBERATOR}, self.player)
+
+    def amons_fall_requirement(self, state: CollectionState) -> bool:
+        if self.take_over_ai_allies:
+            return (
+                    (
+                        state.has_any({ItemNames.BATTLECRUISER, ItemNames.CARRIER}, self.player)
+                    )
+                    or (state.has(ItemNames.ULTRALISK, self.player)
+                        and self.protoss_competent_anti_air(state)
+                        and (
+                                state.has_any({ItemNames.LIBERATOR, ItemNames.BANSHEE, ItemNames.VALKYRIE, ItemNames.VIKING}, self.player)
+                                or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player)
+                                or self.protoss_fleet(state)
+                        )
+                        and (self.terran_sustainable_mech_heal(state)
+                             or (self.spear_of_adun_autonomously_cast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere
+                                 and state.has(ItemNames.RECONSTRUCTION_BEAM, self.player))
+                             )
+                        )
+            ) \
+                and self.terran_competent_anti_air(state) \
+                and self.protoss_competent_comp(state) \
+                and self.zerg_competent_comp(state)
+        else:
+            return state.has(ItemNames.MUTALISK, self.player) and self.zerg_competent_comp(state)
+
+    def nova_any_weapon(self, state: CollectionState) -> bool:
+        return state.has_any(
+            {ItemNames.NOVA_C20A_CANISTER_RIFLE, ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PLASMA_RIFLE,
+             ItemNames.NOVA_MONOMOLECULAR_BLADE, ItemNames.NOVA_BLAZEFIRE_GUNBLADE}, self.player)
+
+    def nova_ranged_weapon(self, state: CollectionState) -> bool:
+        return state.has_any(
+            {ItemNames.NOVA_C20A_CANISTER_RIFLE, ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PLASMA_RIFLE},
+            self.player)
+
+    def nova_splash(self, state: CollectionState) -> bool:
+        return state.has_any({
+            ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_BLAZEFIRE_GUNBLADE, ItemNames.NOVA_PULSE_GRENADES
+        }, self.player) \
+            or self.advanced_tactics and state.has_any(
+                {ItemNames.NOVA_PLASMA_RIFLE, ItemNames.NOVA_MONOMOLECULAR_BLADE}, self.player)
+
+    def nova_dash(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.NOVA_MONOMOLECULAR_BLADE, ItemNames.NOVA_BLINK}, self.player)
+
+    def nova_full_stealth(self, state: CollectionState) -> bool:
+        return state.count(ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) >= 2
+
+    def nova_heal(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.NOVA_ARMORED_SUIT_MODULE, ItemNames.NOVA_STIM_INFUSION}, self.player)
+
+    def nova_escape_assist(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.NOVA_BLINK, ItemNames.NOVA_HOLO_DECOY, ItemNames.NOVA_IONIC_FORCE_FIELD}, self.player)
+
+    def the_escape_stuff_granted(self) -> bool:
+        """
+        The NCO first mission requires having too much stuff first before actually able to do anything
+        :return:
+        """
+        return self.story_tech_granted \
+            or (self.mission_order == MissionOrder.option_vanilla and self.enabled_campaigns == {SC2Campaign.NCO})
+
+    def the_escape_first_stage_requirement(self, state: CollectionState) -> bool:
+        return self.the_escape_stuff_granted() \
+            or (self.nova_ranged_weapon(state) and (self.nova_full_stealth(state) or self.nova_heal(state)))
+
+    def the_escape_requirement(self, state: CollectionState) -> bool:
+        return self.the_escape_first_stage_requirement(state) \
+            and (self.the_escape_stuff_granted() or self.nova_splash(state))
+
+    def terran_cliffjumper(self, state: CollectionState) -> bool:
+        return state.has(ItemNames.REAPER, self.player) \
+                or state.has_all({ItemNames.GOLIATH, ItemNames.GOLIATH_JUMP_JETS}, self.player) \
+                or state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_JUMP_JETS}, self.player)
+
+    def terran_able_to_snipe_defiler(self, state: CollectionState) -> bool:
+        return state.has_all({ItemNames.NOVA_JUMP_SUIT_MODULE, ItemNames.NOVA_C20A_CANISTER_RIFLE}, self.player) \
+                or state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS, ItemNames.SIEGE_TANK_JUMP_JETS}, self.player)
+
+    def sudden_strike_requirement(self, state: CollectionState) -> bool:
+        return self.sudden_strike_can_reach_objectives(state) \
+            and self.terran_able_to_snipe_defiler(state) \
+            and state.has_any({ItemNames.SIEGE_TANK, ItemNames.VULTURE}, self.player) \
+            and self.nova_splash(state) \
+            and (self.terran_defense_rating(state, True, False) >= 2
+                 or state.has(ItemNames.NOVA_JUMP_SUIT_MODULE, self.player))
+
+    def sudden_strike_can_reach_objectives(self, state: CollectionState) -> bool:
+        return self.terran_cliffjumper(state) \
+            or state.has_any({ItemNames.BANSHEE, ItemNames.VIKING}, self.player) \
+            or (
+                    self.advanced_tactics
+                    and state.has(ItemNames.MEDIVAC, self.player)
+                    and state.has_any({ItemNames.MARINE, ItemNames.MARAUDER, ItemNames.VULTURE, ItemNames.HELLION,
+                                       ItemNames.GOLIATH}, self.player)
+            )
+
+    def enemy_intelligence_garrisonable_unit(self, state: CollectionState) -> bool:
+        """
+        Has unit usable as a Garrison in Enemy Intelligence
+        :param state:
+        :return:
+        """
+        return state.has_any(
+            {ItemNames.MARINE, ItemNames.REAPER, ItemNames.MARAUDER, ItemNames.GHOST, ItemNames.SPECTRE,
+             ItemNames.HELLION, ItemNames.GOLIATH, ItemNames.WARHOUND, ItemNames.DIAMONDBACK, ItemNames.VIKING},
+            self.player)
+
+    def enemy_intelligence_cliff_garrison(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.REAPER, ItemNames.VIKING, ItemNames.MEDIVAC, ItemNames.HERCULES}, self.player) \
+            or state.has_all({ItemNames.GOLIATH, ItemNames.GOLIATH_JUMP_JETS}, self.player) \
+            or self.advanced_tactics and state.has_any({ItemNames.HELS_ANGELS, ItemNames.BRYNHILDS}, self.player)
+
+    def enemy_intelligence_first_stage_requirement(self, state: CollectionState) -> bool:
+        return self.enemy_intelligence_garrisonable_unit(state) \
+            and (self.terran_competent_comp(state)
+                 or (
+                         self.terran_common_unit(state)
+                         and self.terran_competent_anti_air(state)
+                         and state.has(ItemNames.NOVA_NUKE, self.player)
+                 )
+                 ) \
+            and self.terran_defense_rating(state, True, True) >= 5
+
+    def enemy_intelligence_second_stage_requirement(self, state: CollectionState) -> bool:
+        return self.enemy_intelligence_first_stage_requirement(state) \
+            and self.enemy_intelligence_cliff_garrison(state) \
+            and (
+                    self.story_tech_granted
+                    or (
+                            self.nova_any_weapon(state)
+                            and (
+                                    self.nova_full_stealth(state)
+                                    or (self.nova_heal(state)
+                                        and self.nova_splash(state)
+                                        and self.nova_ranged_weapon(state))
+                            )
+                    )
+            )
+
+    def enemy_intelligence_third_stage_requirement(self, state: CollectionState) -> bool:
+        return self.enemy_intelligence_second_stage_requirement(state) \
+            and (
+                    self.story_tech_granted
+                    or (
+                            state.has(ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player)
+                            and self.nova_dash(state)
+                    )
+            )
+
+    def trouble_in_paradise_requirement(self, state: CollectionState) -> bool:
+        return self.nova_any_weapon(state) \
+            and self.nova_splash(state) \
+            and self.terran_beats_protoss_deathball(state) \
+            and self.terran_defense_rating(state, True, True) >= 7
+
+    def night_terrors_requirement(self, state: CollectionState) -> bool:
+        return self.terran_common_unit(state) \
+            and self.terran_competent_anti_air(state) \
+            and (
+                # These can handle the waves of infested, even volatile ones
+                    state.has(ItemNames.SIEGE_TANK, self.player)
+                    or state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player)
+                    or (
+                            (
+                                # Regular infesteds
+                                    state.has(ItemNames.FIREBAT, self.player)
+                                    or state.has_all({ItemNames.HELLION, ItemNames.HELLION_HELLBAT_ASPECT}, self.player)
+                                    or (
+                                            self.advanced_tactics
+                                            and state.has_any({ItemNames.PERDITION_TURRET, ItemNames.PLANETARY_FORTRESS}, self.player)
+                                    )
+                            )
+                            and self.terran_bio_heal(state)
+                            and (
+                                # Volatile infesteds
+                                    state.has(ItemNames.LIBERATOR, self.player)
+                                    or (
+                                            self.advanced_tactics
+                                            and state.has_any({ItemNames.HERC, ItemNames.VULTURE}, self.player)
+                                    )
+                            )
+                    )
+            )
+
+    def flashpoint_far_requirement(self, state: CollectionState) -> bool:
+        return self.terran_competent_comp(state) \
+            and self.terran_mobile_detector(state) \
+            and self.terran_defense_rating(state, True, False) >= 6
+
+    def enemy_shadow_tripwires_tool(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.NOVA_FLASHBANG_GRENADES, ItemNames.NOVA_BLINK, ItemNames.NOVA_DOMINATION},
+                             self.player)
+
+    def enemy_shadow_door_unlocks_tool(self, state: CollectionState) -> bool:
+        return state.has_any({ItemNames.NOVA_DOMINATION, ItemNames.NOVA_BLINK, ItemNames.NOVA_JUMP_SUIT_MODULE},
+                             self.player)
+
+    def enemy_shadow_domination(self, state: CollectionState) -> bool:
+        return self.story_tech_granted \
+            or (self.nova_ranged_weapon(state)
+                and (self.nova_full_stealth(state)
+                     or state.has(ItemNames.NOVA_JUMP_SUIT_MODULE, self.player)
+                     or (self.nova_heal(state) and self.nova_splash(state))
+                     )
+                )
+
+    def enemy_shadow_first_stage(self, state: CollectionState) -> bool:
+        return self.enemy_shadow_domination(state) \
+            and (self.story_tech_granted
+                 or ((self.nova_full_stealth(state) and self.enemy_shadow_tripwires_tool(state))
+                     or (self.nova_heal(state) and self.nova_splash(state))
+                     )
+                 )
+
+    def enemy_shadow_second_stage(self, state: CollectionState) -> bool:
+        return self.enemy_shadow_first_stage(state) \
+            and (self.story_tech_granted
+                 or self.nova_splash(state)
+                 or self.nova_heal(state)
+                 or self.nova_escape_assist(state)
+                 )
+
+    def enemy_shadow_door_controls(self, state: CollectionState) -> bool:
+        return self.enemy_shadow_second_stage(state) \
+            and (self.story_tech_granted or self.enemy_shadow_door_unlocks_tool(state))
+
+    def enemy_shadow_victory(self, state: CollectionState) -> bool:
+        return self.enemy_shadow_door_controls(state) \
+            and (self.story_tech_granted or self.nova_heal(state))
+
+    def dark_skies_requirement(self, state: CollectionState) -> bool:
+        return self.terran_common_unit(state) \
+            and self.terran_beats_protoss_deathball(state) \
+            and self.terran_defense_rating(state, False, True) >= 8
+
+    def end_game_requirement(self, state: CollectionState) -> bool:
+        return self.terran_competent_comp(state) \
+            and self.terran_mobile_detector(state) \
+            and (
+                    state.has_any({ItemNames.BATTLECRUISER, ItemNames.LIBERATOR, ItemNames.BANSHEE}, self.player)
+                    or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player)
+            ) \
+            and (state.has_any({ItemNames.BATTLECRUISER, ItemNames.VIKING, ItemNames.LIBERATOR}, self.player)
+                 or (self.advanced_tactics
+                     and state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, self.player)
+                     )
+                 )
+
+    def __init__(self, world: World):
+        self.world: World = world
+        self.player = None if world is None else world.player
+        self.logic_level = get_option_value(world, 'required_tactics')
+        self.advanced_tactics = self.logic_level != RequiredTactics.option_standard
+        self.take_over_ai_allies = get_option_value(world, "take_over_ai_allies") == TakeOverAIAllies.option_true
+        self.kerrigan_unit_available = get_option_value(world, 'kerrigan_presence') in kerrigan_unit_available \
+            and SC2Campaign.HOTS in get_enabled_campaigns(world)
+        self.kerrigan_levels_per_mission_completed = get_option_value(world, "kerrigan_levels_per_mission_completed")
+        self.kerrigan_levels_per_mission_completed_cap = get_option_value(world, "kerrigan_levels_per_mission_completed_cap")
+        self.kerrigan_total_level_cap = get_option_value(world, "kerrigan_total_level_cap")
+        self.story_tech_granted = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true
+        self.story_levels_granted = get_option_value(world, "grant_story_levels") != GrantStoryLevels.option_disabled
+        self.basic_terran_units = get_basic_units(world, SC2Race.TERRAN)
+        self.basic_zerg_units = get_basic_units(world, SC2Race.ZERG)
+        self.basic_protoss_units = get_basic_units(world, SC2Race.PROTOSS)
+        self.spear_of_adun_autonomously_cast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence")
+        self.enabled_campaigns = get_enabled_campaigns(world)
+        self.mission_order = get_option_value(world, "mission_order")
diff --git a/worlds/sc2/Starcraft2.kv b/worlds/sc2/Starcraft2.kv
new file mode 100644
index 00000000..6b112c2f
--- /dev/null
+++ b/worlds/sc2/Starcraft2.kv
@@ -0,0 +1,28 @@
+<CampaignScroll>
+    scroll_type: ["content", "bars"]
+    bar_width: dp(12)
+    effect_cls: "ScrollEffect"
+
+<MultiCampaignLayout>
+    cols: 1
+    size_hint_y: None
+    height: self.minimum_height + 15
+    padding: [5,0,dp(12),0]
+
+<CampaignLayout>:
+    cols: 1
+
+<MissionLayout>:
+    rows: 1
+
+<MissionCategory>:
+    cols: 1
+    spacing: [0,5]
+
+<MissionButton>:
+    text_size: self.size
+    markup: True
+    halign: 'center'
+    valign: 'middle'
+    padding: [5,0,5,0]
+    outline_width: 1
diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py
new file mode 100644
index 00000000..fffa618d
--- /dev/null
+++ b/worlds/sc2/__init__.py
@@ -0,0 +1,482 @@
+import typing
+from dataclasses import fields
+
+from typing import List, Set, Iterable, Sequence, Dict, Callable, Union
+from math import floor, ceil
+from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification
+from worlds.AutoWorld import WebWorld, World
+from . import ItemNames
+from .Items import StarcraftItem, filler_items, get_item_table, get_full_item_list, \
+    get_basic_units, ItemData, upgrade_included_names, progressive_if_nco, kerrigan_actives, kerrigan_passives, \
+    kerrigan_only_passives, progressive_if_ext, not_balanced_starting_units, spear_of_adun_calldowns, \
+    spear_of_adun_castable_passives, nova_equipment
+from .ItemGroups import item_name_groups
+from .Locations import get_locations, LocationType, get_location_types, get_plando_locations
+from .Regions import create_regions
+from .Options import get_option_value, LocationInclusion, KerriganLevelItemDistribution, \
+    KerriganPresence, KerriganPrimalStatus, RequiredTactics, kerrigan_unit_available, StarterUnit, SpearOfAdunPresence, \
+    get_enabled_campaigns, SpearOfAdunAutonomouslyCastAbilityPresence, Starcraft2Options
+from .PoolFilter import filter_items, get_item_upgrades, UPGRADABLE_ITEMS, missions_in_mission_table, get_used_races
+from .MissionTables import MissionInfo, SC2Campaign, lookup_name_to_mission, SC2Mission, \
+    SC2Race
+
+
+class Starcraft2WebWorld(WebWorld):
+    setup = Tutorial(
+        "Multiworld Setup Guide",
+        "A guide to setting up the Starcraft 2 randomizer connected to an Archipelago Multiworld",
+        "English",
+        "setup_en.md",
+        "setup/en",
+        ["TheCondor", "Phaneros"]
+    )
+
+    tutorials = [setup]
+
+
+class SC2World(World):
+    """
+    StarCraft II is a science fiction real-time strategy video game developed and published by Blizzard Entertainment.
+    Play as one of three factions across four campaigns in a battle for supremacy of the Koprulu Sector.
+    """
+
+    game = "Starcraft 2"
+    web = Starcraft2WebWorld()
+    data_version = 6
+
+    item_name_to_id = {name: data.code for name, data in get_full_item_list().items()}
+    location_name_to_id = {location.name: location.code for location in get_locations(None)}
+    options_dataclass = Starcraft2Options
+    options: Starcraft2Options
+
+    item_name_groups = item_name_groups
+    locked_locations: typing.List[str]
+    location_cache: typing.List[Location]
+    mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {}
+    final_mission_id: int
+    victory_item: str
+    required_client_version = 0, 4, 5
+
+    def __init__(self, multiworld: MultiWorld, player: int):
+        super(SC2World, self).__init__(multiworld, player)
+        self.location_cache = []
+        self.locked_locations = []
+
+    def create_item(self, name: str) -> Item:
+        data = get_full_item_list()[name]
+        return StarcraftItem(name, data.classification, data.code, self.player)
+
+    def create_regions(self):
+        self.mission_req_table, self.final_mission_id, self.victory_item = create_regions(
+            self, get_locations(self), self.location_cache
+        )
+
+    def create_items(self):
+        setup_events(self.player, self.locked_locations, self.location_cache)
+
+        excluded_items = get_excluded_items(self)
+
+        starter_items = assign_starter_items(self, excluded_items, self.locked_locations, self.location_cache)
+
+        fill_resource_locations(self, self.locked_locations, self.location_cache)
+
+        pool = get_item_pool(self, self.mission_req_table, starter_items, excluded_items, self.location_cache)
+
+        fill_item_pool_with_dummy_items(self, self.locked_locations, self.location_cache, pool)
+
+        self.multiworld.itempool += pool
+
+    def set_rules(self):
+        self.multiworld.completion_condition[self.player] = lambda state: state.has(self.victory_item, self.player)
+
+    def get_filler_item_name(self) -> str:
+        return self.random.choice(filler_items)
+
+    def fill_slot_data(self):
+        slot_data = {}
+        for option_name in [field.name for field in fields(Starcraft2Options)]:
+            option = get_option_value(self, option_name)
+            if type(option) in {str, int}:
+                slot_data[option_name] = int(option)
+        slot_req_table = {}
+
+        # Serialize data
+        for campaign in self.mission_req_table:
+            slot_req_table[campaign.id] = {}
+            for mission in self.mission_req_table[campaign]:
+                slot_req_table[campaign.id][mission] = self.mission_req_table[campaign][mission]._asdict()
+                # Replace mission objects with mission IDs
+                slot_req_table[campaign.id][mission]["mission"] = slot_req_table[campaign.id][mission]["mission"].id
+
+                for index in range(len(slot_req_table[campaign.id][mission]["required_world"])):
+                    # TODO this is a band-aid, sometimes the mission_req_table already contains dicts
+                    # as far as I can tell it's related to having multiple vanilla mission orders
+                    if not isinstance(slot_req_table[campaign.id][mission]["required_world"][index], dict):
+                        slot_req_table[campaign.id][mission]["required_world"][index] = slot_req_table[campaign.id][mission]["required_world"][index]._asdict()
+
+        enabled_campaigns = get_enabled_campaigns(self)
+        slot_data["plando_locations"] = get_plando_locations(self)
+        slot_data["nova_covert_ops_only"] = (enabled_campaigns == {SC2Campaign.NCO})
+        slot_data["mission_req"] = slot_req_table
+        slot_data["final_mission"] = self.final_mission_id
+        slot_data["version"] = 3
+
+        if SC2Campaign.HOTS not in enabled_campaigns:
+            slot_data["kerrigan_presence"] = KerriganPresence.option_not_present
+        return slot_data
+
+
+def setup_events(player: int, locked_locations: typing.List[str], location_cache: typing.List[Location]):
+    for location in location_cache:
+        if location.address is None:
+            item = Item(location.name, ItemClassification.progression, None, player)
+
+            locked_locations.append(location.name)
+
+            location.place_locked_item(item)
+
+
+def get_excluded_items(world: World) -> Set[str]:
+    excluded_items: Set[str] = set(get_option_value(world, 'excluded_items'))
+    for item in world.multiworld.precollected_items[world.player]:
+        excluded_items.add(item.name)
+    locked_items: Set[str] = set(get_option_value(world, 'locked_items'))
+    # Starter items are also excluded items
+    starter_items: Set[str] = set(get_option_value(world, 'start_inventory'))
+    item_table = get_full_item_list()
+    soa_presence = get_option_value(world, "spear_of_adun_presence")
+    soa_autocast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence")
+    enabled_campaigns = get_enabled_campaigns(world)
+
+    # Ensure no item is both guaranteed and excluded
+    invalid_items = excluded_items.intersection(locked_items)
+    invalid_count = len(invalid_items)
+    # Don't count starter items that can appear multiple times
+    invalid_count -= len([item for item in starter_items.intersection(locked_items) if item_table[item].quantity != 1])
+    if invalid_count > 0:
+        raise Exception(f"{invalid_count} item{'s are' if invalid_count > 1 else ' is'} both locked and excluded from generation.  Please adjust your excluded items and locked items.")
+
+    def smart_exclude(item_choices: Set[str], choices_to_keep: int):
+        expected_choices = len(item_choices)
+        if expected_choices == 0:
+            return
+        item_choices = set(item_choices)
+        starter_choices = item_choices.intersection(starter_items)
+        excluded_choices = item_choices.intersection(excluded_items)
+        item_choices.difference_update(excluded_choices)
+        item_choices.difference_update(locked_items)
+        candidates = sorted(item_choices)
+        exclude_amount = min(expected_choices - choices_to_keep - len(excluded_choices) + len(starter_choices), len(candidates))
+        if exclude_amount > 0:
+            excluded_items.update(world.random.sample(candidates, exclude_amount))
+
+    # Nova gear exclusion if NCO not in campaigns
+    if SC2Campaign.NCO not in enabled_campaigns:
+        excluded_items = excluded_items.union(nova_equipment)
+
+    kerrigan_presence = get_option_value(world, "kerrigan_presence")
+    # Exclude Primal Form item if option is not set or Kerrigan is unavailable
+    if get_option_value(world, "kerrigan_primal_status") != KerriganPrimalStatus.option_item or \
+        (kerrigan_presence in {KerriganPresence.option_not_present, KerriganPresence.option_not_present_and_no_passives}):
+        excluded_items.add(ItemNames.KERRIGAN_PRIMAL_FORM)
+
+    # no Kerrigan & remove all passives => remove all abilities
+    if kerrigan_presence == KerriganPresence.option_not_present_and_no_passives:
+        for tier in range(7):
+            smart_exclude(kerrigan_actives[tier].union(kerrigan_passives[tier]), 0)
+    else:
+        # no Kerrigan, but keep non-Kerrigan passives
+        if kerrigan_presence == KerriganPresence.option_not_present:
+            smart_exclude(kerrigan_only_passives, 0)
+            for tier in range(7):
+                smart_exclude(kerrigan_actives[tier], 0)
+
+    # SOA exclusion, other cases are handled by generic race logic
+    if (soa_presence == SpearOfAdunPresence.option_lotv_protoss and SC2Campaign.LOTV not in enabled_campaigns) \
+            or soa_presence == SpearOfAdunPresence.option_not_present:
+        excluded_items.update(spear_of_adun_calldowns)
+    if (soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_lotv_protoss \
+            and SC2Campaign.LOTV not in enabled_campaigns) \
+            or soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present:
+        excluded_items.update(spear_of_adun_castable_passives)
+
+    return excluded_items
+
+
+def assign_starter_items(world: World, excluded_items: Set[str], locked_locations: List[str], location_cache: typing.List[Location]) -> List[Item]:
+    starter_items: List[Item] = []
+    non_local_items = get_option_value(world, "non_local_items")
+    starter_unit = get_option_value(world, "starter_unit")
+    enabled_campaigns = get_enabled_campaigns(world)
+    first_mission = get_first_mission(world.mission_req_table)
+    # Ensuring that first mission is completable
+    if starter_unit == StarterUnit.option_off:
+        starter_mission_locations = [location.name for location in location_cache
+                                     if location.parent_region.name == first_mission
+                                     and location.access_rule == Location.access_rule]
+        if not starter_mission_locations:
+            # Force early unit if first mission is impossible without one
+            starter_unit = StarterUnit.option_any_starter_unit
+
+    if starter_unit != StarterUnit.option_off:
+        first_race = lookup_name_to_mission[first_mission].race
+
+        if first_race == SC2Race.ANY:
+            # If the first mission is a logic-less no-build
+            mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = world.mission_req_table
+            races = get_used_races(mission_req_table, world)
+            races.remove(SC2Race.ANY)
+            if lookup_name_to_mission[first_mission].race in races:
+                # The campaign's race is in (At least one mission that's not logic-less no-build exists)
+                first_race = lookup_name_to_mission[first_mission].campaign.race
+            elif len(races) > 0:
+                # The campaign only has logic-less no-build missions. Find any other valid race
+                first_race = world.random.choice(list(races))
+
+        if first_race != SC2Race.ANY:
+            # The race of the early unit has been chosen
+            basic_units = get_basic_units(world, first_race)
+            if starter_unit == StarterUnit.option_balanced:
+                basic_units = basic_units.difference(not_balanced_starting_units)
+            if first_mission == SC2Mission.DARK_WHISPERS.mission_name:
+                # Special case - you don't have a logicless location but need an AA
+                basic_units = basic_units.difference(
+                    {ItemNames.ZEALOT, ItemNames.CENTURION, ItemNames.SENTINEL, ItemNames.BLOOD_HUNTER,
+                     ItemNames.AVENGER, ItemNames.IMMORTAL, ItemNames.ANNIHILATOR, ItemNames.VANGUARD})
+            if first_mission == SC2Mission.SUDDEN_STRIKE.mission_name:
+                # Special case - cliffjumpers
+                basic_units = {ItemNames.REAPER, ItemNames.GOLIATH, ItemNames.SIEGE_TANK, ItemNames.VIKING, ItemNames.BANSHEE}
+            local_basic_unit = sorted(item for item in basic_units if item not in non_local_items and item not in excluded_items)
+            if not local_basic_unit:
+                # Drop non_local_items constraint
+                local_basic_unit = sorted(item for item in basic_units if item not in excluded_items)
+                if not local_basic_unit:
+                    raise Exception("Early Unit: At least one basic unit must be included")
+
+            unit: Item = add_starter_item(world, excluded_items, local_basic_unit)
+            starter_items.append(unit)
+
+            # NCO-only specific rules
+            if first_mission == SC2Mission.SUDDEN_STRIKE.mission_name:
+                support_item: Union[str, None] = None
+                if unit.name == ItemNames.REAPER:
+                    support_item = ItemNames.REAPER_SPIDER_MINES
+                elif unit.name == ItemNames.GOLIATH:
+                    support_item = ItemNames.GOLIATH_JUMP_JETS
+                elif unit.name == ItemNames.SIEGE_TANK:
+                    support_item = ItemNames.SIEGE_TANK_JUMP_JETS
+                elif unit.name == ItemNames.VIKING:
+                    support_item = ItemNames.VIKING_SMART_SERVOS
+                if support_item is not None:
+                    starter_items.append(add_starter_item(world, excluded_items, [support_item]))
+                starter_items.append(add_starter_item(world, excluded_items, [ItemNames.NOVA_JUMP_SUIT_MODULE]))
+                starter_items.append(
+                    add_starter_item(world, excluded_items,
+                                     [
+                                         ItemNames.NOVA_HELLFIRE_SHOTGUN,
+                                         ItemNames.NOVA_PLASMA_RIFLE,
+                                         ItemNames.NOVA_PULSE_GRENADES
+                                     ]))
+            if enabled_campaigns == {SC2Campaign.NCO}:
+                starter_items.append(add_starter_item(world, excluded_items, [ItemNames.LIBERATOR_RAID_ARTILLERY]))
+    
+    starter_abilities = get_option_value(world, 'start_primary_abilities')
+    assert isinstance(starter_abilities, int)
+    if starter_abilities:
+        ability_count = starter_abilities
+        ability_tiers = [0, 1, 3]
+        world.random.shuffle(ability_tiers)
+        if ability_count > 3:
+            ability_tiers.append(6)
+        for tier in ability_tiers:
+            abilities = kerrigan_actives[tier].union(kerrigan_passives[tier]).difference(excluded_items, non_local_items)
+            if not abilities:
+                abilities = kerrigan_actives[tier].union(kerrigan_passives[tier]).difference(excluded_items)
+            if abilities:
+                ability_count -= 1
+                starter_items.append(add_starter_item(world, excluded_items, list(abilities)))
+                if ability_count == 0:
+                    break
+
+    return starter_items
+
+
+def get_first_mission(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> str:
+    # The first world should also be the starting world
+    campaigns = mission_req_table.keys()
+    lowest_id = min([campaign.id for campaign in campaigns])
+    first_campaign = [campaign for campaign in campaigns if campaign.id == lowest_id][0]
+    first_mission = list(mission_req_table[first_campaign])[0]
+    return first_mission
+
+
+def add_starter_item(world: World, excluded_items: Set[str], item_list: Sequence[str]) -> Item:
+
+    item_name = world.random.choice(sorted(item_list))
+
+    excluded_items.add(item_name)
+
+    item = create_item_with_correct_settings(world.player, item_name)
+
+    world.multiworld.push_precollected(item)
+
+    return item
+
+
+def get_item_pool(world: World, mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]],
+                  starter_items: List[Item], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]:
+    pool: List[Item] = []
+
+    # For the future: goal items like Artifact Shards go here
+    locked_items = []
+
+    # YAML items
+    yaml_locked_items = get_option_value(world, 'locked_items')
+    assert not isinstance(yaml_locked_items, int)
+
+    # Adjust generic upgrade availability based on options
+    include_upgrades = get_option_value(world, 'generic_upgrade_missions') == 0
+    upgrade_items = get_option_value(world, 'generic_upgrade_items')
+    assert isinstance(upgrade_items, int)
+
+    # Include items from outside main campaigns
+    item_sets = {'wol', 'hots', 'lotv'}
+    if get_option_value(world, 'nco_items') \
+            or SC2Campaign.NCO in get_enabled_campaigns(world):
+        item_sets.add('nco')
+    if get_option_value(world, 'bw_items'):
+        item_sets.add('bw')
+    if get_option_value(world, 'ext_items'):
+        item_sets.add('ext')
+
+    def allowed_quantity(name: str, data: ItemData) -> int:
+        if name in excluded_items \
+                or data.type == "Upgrade" and (not include_upgrades or name not in upgrade_included_names[upgrade_items]) \
+                or not data.origin.intersection(item_sets):
+            return 0
+        elif name in progressive_if_nco and 'nco' not in item_sets:
+            return 1
+        elif name in progressive_if_ext and 'ext' not in item_sets:
+            return 1
+        else:
+            return data.quantity
+
+    for name, data in get_item_table().items():
+        for _ in range(allowed_quantity(name, data)):
+            item = create_item_with_correct_settings(world.player, name)
+            if name in yaml_locked_items:
+                locked_items.append(item)
+            else:
+                pool.append(item)
+
+    existing_items = starter_items + [item for item in world.multiworld.precollected_items[world.player] if item not in starter_items]
+    existing_names = [item.name for item in existing_items]
+
+    # Check the parent item integrity, exclude items
+    pool[:] = [item for item in pool if pool_contains_parent(item, pool + locked_items + existing_items)]
+
+    # Removing upgrades for excluded items
+    for item_name in excluded_items:
+        if item_name in existing_names:
+            continue
+        invalid_upgrades = get_item_upgrades(pool, item_name)
+        for invalid_upgrade in invalid_upgrades:
+            pool.remove(invalid_upgrade)
+
+    fill_pool_with_kerrigan_levels(world, pool)
+    filtered_pool = filter_items(world, mission_req_table, location_cache, pool, existing_items, locked_items)
+    return filtered_pool
+
+
+def fill_item_pool_with_dummy_items(self: SC2World, locked_locations: List[str],
+                                    location_cache: List[Location], pool: List[Item]):
+    for _ in range(len(location_cache) - len(locked_locations) - len(pool)):
+        item = create_item_with_correct_settings(self.player, self.get_filler_item_name())
+        pool.append(item)
+
+
+def create_item_with_correct_settings(player: int, name: str) -> Item:
+    data = get_full_item_list()[name]
+
+    item = Item(name, data.classification, data.code, player)
+
+    return item
+
+
+def pool_contains_parent(item: Item, pool: Iterable[Item]):
+    item_data = get_full_item_list().get(item.name)
+    if item_data.parent_item is None:
+        # The item has not associated parent, the item is valid
+        return True
+    parent_item = item_data.parent_item
+    # Check if the pool contains the parent item
+    return parent_item in [pool_item.name for pool_item in pool]
+
+
+def fill_resource_locations(world: World, locked_locations: List[str], location_cache: List[Location]):
+    """
+    Filters the locations in the world using a trash or Nothing item
+    :param multiworld:
+    :param player:
+    :param locked_locations:
+    :param location_cache:
+    :return:
+    """
+    open_locations = [location for location in location_cache if location.item is None]
+    plando_locations = get_plando_locations(world)
+    resource_location_types = get_location_types(world, LocationInclusion.option_resources)
+    location_data = {sc2_location.name: sc2_location for sc2_location in get_locations(world)}
+    for location in open_locations:
+        # Go through the locations that aren't locked yet (early unit, etc)
+        if location.name not in plando_locations:
+            # The location is not plando'd
+            sc2_location = location_data[location.name]
+            if sc2_location.type in resource_location_types:
+                item_name = world.random.choice(filler_items)
+                item = create_item_with_correct_settings(world.player, item_name)
+                location.place_locked_item(item)
+                locked_locations.append(location.name)
+
+
+def place_exclusion_item(item_name, location, locked_locations, player):
+    item = create_item_with_correct_settings(player, item_name)
+    location.place_locked_item(item)
+    locked_locations.append(location.name)
+
+
+def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]):
+    total_levels = get_option_value(world, "kerrigan_level_item_sum")
+    if get_option_value(world, "kerrigan_presence") not in kerrigan_unit_available \
+            or total_levels == 0 \
+            or SC2Campaign.HOTS not in get_enabled_campaigns(world):
+        return
+    
+    def add_kerrigan_level_items(level_amount: int, item_amount: int):
+        name = f"{level_amount} Kerrigan Level"
+        if level_amount > 1:
+            name += "s"
+        for _ in range(item_amount):
+            item_pool.append(create_item_with_correct_settings(world.player, name))
+
+    sizes = [70, 35, 14, 10, 7, 5, 2, 1]
+    option = get_option_value(world, "kerrigan_level_item_distribution")
+
+    assert isinstance(option, int)
+    assert isinstance(total_levels, int)
+
+    if option in (KerriganLevelItemDistribution.option_vanilla, KerriganLevelItemDistribution.option_smooth):
+        distribution = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+        if option == KerriganLevelItemDistribution.option_vanilla:
+            distribution = [32, 0, 0, 1, 3, 0, 0, 0, 1, 1]
+        else: # Smooth
+            distribution = [0, 0, 0, 1, 1, 2, 2, 2, 1, 1]
+        for tier in range(len(distribution)):
+            add_kerrigan_level_items(tier + 1, distribution[tier])
+    else:
+        size = sizes[option - 2]
+        round_func: Callable[[float], int] = round
+        if total_levels > 70:
+            round_func = floor
+        else:
+            round_func = ceil
+        add_kerrigan_level_items(size, round_func(float(total_levels) / size))
diff --git a/worlds/sc2/docs/contributors.md b/worlds/sc2/docs/contributors.md
new file mode 100644
index 00000000..5b62466d
--- /dev/null
+++ b/worlds/sc2/docs/contributors.md
@@ -0,0 +1,42 @@
+# Contributors
+Contibutors are listed with preferred or Discord names first, with github usernames prepended with an `@`
+
+## Update 2024.0
+### Code Changes
+* Ziktofel (@Ziktofel)
+* Salzkorn (@Salzkorn)
+* EnvyDragon (@EnvyDragon)
+* Phanerus (@MatthewMarinets)
+* Madi Sylveon (@MadiMadsen)
+* Magnemania (@Magnemania)
+* Subsourian (@Subsourian)
+* Hopop (@hopop201)
+* Alice Voltaire (@AliceVoltaire)
+* Genderdruid (@ArchonofFail)
+* CrazedCollie (@FoxOfWar)
+
+### Additional Beta testing and bug reports
+* Varcklen (@Varcklen)
+* BicolourSnake (@Bicoloursnake)
+* @NobleXenon
+* Severencir (@Severencir)
+* neocerber (@neocerber)
+* Mati (@Matiya-star)
+* Ixzine
+* sweetox
+* 8thDaughterOfFrost
+* The M8
+* Berserker (@Berserker66)
+* KaitoKid
+* Sheen
+* ProfBytes
+* IncoherentOrange
+* eudaimonistic
+* Figment
+
+## Older versions
+Not all contributors to older versions of Archipelago Starcraft 2 are known.
+
+TheCondor (@TheCondor07) is the original maintainer of the project. Other known contributors include:
+* soldieroforder
+* Berserker (@Berserker66)
diff --git a/worlds/sc2/docs/en_Starcraft 2.md b/worlds/sc2/docs/en_Starcraft 2.md
new file mode 100644
index 00000000..43a7da89
--- /dev/null
+++ b/worlds/sc2/docs/en_Starcraft 2.md	
@@ -0,0 +1,64 @@
+# Starcraft 2 Wings of Liberty
+
+## What does randomization do to this game?
+
+The following unlocks are randomized as items:
+1. Your ability to build any non-worker unit.
+2. Unit specific upgrades including some combinations not available in the vanilla campaigns, such as both strain choices simultaneously for Zerg and every Spear of Adun upgrade simultaneously for Protoss!
+3. Your ability to get the generic unit upgrades, such as attack and armour upgrades.
+4. Other miscellaneous upgrades such as laboratory upgrades and mercenaries for Terran, Kerrigan levels and upgrades for Zerg, and Spear of Adun upgrades for Protoss.
+5. Small boosts to your starting mineral, vespene gas, and supply totals on each mission.
+
+You find items by making progress in these categories:
+* Completing missions
+* Completing bonus objectives (like by gathering lab research material in Wings of Liberty)
+* Reaching milestones in the mission, such as completing part of a main objective
+* Completing challenges based on achievements in the base game, such as clearing all Zerg on Devil's Playground
+
+Except for mission completion, these categories can be disabled in the game's settings. For instance, you can disable getting items for reaching required milestones.
+
+When you receive items, they will immediately become available, even during a mission, and you will be
+notified via a text box in the top-right corner of the game screen. Item unlocks are also logged in the Archipelago client.
+
+Missions are launched through the Starcraft 2 Archipelago client, through the Starcraft 2 Launcher tab. The between mission segments on the Hyperion, the Leviathan, and the Spear of Adun are not included. Additionally, metaprogression currencies such as credits and Solarite are not used.
+
+## What is the goal of this game when randomized?
+
+The goal is to beat the final mission in the mission order. The yaml configuration file controls the mission order and how missions are shuffled.
+
+## What non-randomized changes are there from vanilla Starcraft 2?
+
+1. Some missions have more vespene geysers available to allow a wider variety of units.
+2. Many new units and upgrades have been added as items, coming from co-op, melee, later campaigns, later expansions, brood war, and original ideas.
+3. Higher-tech production structures, including Factories, Starports, Robotics Facilities, and Stargates, no longer have tech requirements.
+4. Zerg missions have been adjusted to give the player a starting Lair where they would only have Hatcheries.
+5. Upgrades with a downside have had the downside removed, such as automated refineries costing more or tech reactors taking longer to build.
+6. Unit collision within the vents in Enemy Within has been adjusted to allow larger units to travel through them without getting stuck in odd places.
+7. Several vanilla bugs have been fixed.
+
+## Which of my items can be in another player's world?
+
+By default, any of StarCraft 2's items (specified above) can be in another player's world. See the
+[Advanced YAML Guide](https://archipelago.gg/tutorial/Archipelago/advanced_settings/en)
+for more information on how to change this.
+
+## Unique Local Commands
+
+The following commands are only available when using the Starcraft 2 Client to play with Archipelago. You can list them any time in the client with `/help`.
+
+* `/download_data` Download the most recent release of the necessary files for playing SC2 with Archipelago. Will overwrite existing files
+* `/difficulty [difficulty]` Overrides the difficulty set for the world.
+    * Options: casual, normal, hard, brutal
+* `/game_speed [game_speed]` Overrides the game speed for the world
+    * Options: default, slower, slow, normal, fast, faster
+* `/color [faction] [color]` Changes your color for one of your playable factions.
+    * Faction options: raynor, kerrigan, primal, protoss, nova
+    * Color options: white, red, blue, teal, purple, yellow, orange, green, lightpink, violet, lightgrey, darkgreen, brown, lightgreen, darkgrey, pink, rainbow, random, default
+* `/option [option_name] [option_value]` Sets an option normally controlled by your yaml after generation.
+    * Run without arguments to list all options.
+    * Options pertain to automatic cutscene skipping, Kerrigan presence, Spear of Adun presence, starting resource amounts, controlling AI allies, etc.
+* `/disable_mission_check` Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play the next mission in a chain the other player is doing.
+* `/play [mission_id]` Starts a Starcraft 2 mission based off of the mission_id provided
+* `/available` Get what missions are currently available to play
+* `/unfinished` Get what missions are currently available to play and have not had all locations checked
+* `/set_path [path]` Manually set the SC2 install directory (if the automatic detection fails)
diff --git a/worlds/sc2wol/docs/setup_en.md b/worlds/sc2/docs/setup_en.md
similarity index 50%
rename from worlds/sc2wol/docs/setup_en.md
rename to worlds/sc2/docs/setup_en.md
index 9bfeb3d2..10881e14 100644
--- a/worlds/sc2wol/docs/setup_en.md
+++ b/worlds/sc2/docs/setup_en.md
@@ -7,12 +7,10 @@ to obtain a config file for StarCraft 2.
 
 - [StarCraft 2](https://starcraft2.com/en-us/)
 - [The most recent Archipelago release](https://github.com/ArchipelagoMW/Archipelago/releases)
-- [StarCraft 2 AP Maps and Data](https://github.com/Ziktofel/Archipelago-SC2-data/releases)
 
 ## How do I install this randomizer?
 
-1. Install StarCraft 2 and Archipelago using the first two links above. (The StarCraft 2 client for Archipelago is
-   included by default.)
+1. Install StarCraft 2 and Archipelago using the links above. The StarCraft 2 Archipelago client is downloaded by the Archipelago installer.
    - Linux users should also follow the instructions found at the bottom of this page 
      (["Running in Linux"](#running-in-linux)).
 2. Run ArchipelagoStarcraft2Client.exe.
@@ -21,25 +19,66 @@ to obtain a config file for StarCraft 2.
 
 ## Where do I get a config file (aka "YAML") for this game?
 
-The [Player Settings](https://archipelago.gg/games/Starcraft%202%20Wings%20of%20Liberty/player-settings) page on this
-website allows you to choose your personal settings for the randomizer and download them into a config file. Remember
-the name you type in the `Player Name` box; that's the "slot name" the client will ask you for when you attempt to
-connect!
+Yaml files are configuration files that tell Archipelago how you'd like your game to be randomized, even if you're only using default options.
+When you're setting up a multiworld, every world needs its own yaml file.
 
-### And why do I need a config file?
+There are three basic ways to get a yaml:
+* You can go to the [Player Options](https://archipelago.gg/games/Starcraft%202/player-options) page, set your options in the GUI, and export the yaml.
+* You can generate a template, either by downloading it from the [Player Options](https://archipelago.gg/games/Starcraft%202/player-options) page or by generating it from the Launcher (ArchipelagoLauncher.exe). The template includes descriptions of each option, you just have to edit it in your text editor of choice.
+* You can ask someone else to share their yaml to use it for yourself or adjust it as you wish.
 
-Config files tell Archipelago how you'd like your game to be randomized, even if you're only using default settings.
-When you're setting up a multiworld, every world needs its own config file.
-Check out [Creating a YAML](https://archipelago.gg/tutorial/Archipelago/setup/en#creating-a-yaml) for more information.
+Remember the name you enter in the options page or in the yaml file, you'll need it to connect later!
+
+Note that the basic Player Options page doesn't allow you to change all advanced options, such as excluding particular units or upgrades. Go through the [Weighted Options](https://archipelago.gg/weighted-options) page for that.
+
+Check out [Creating a YAML](https://archipelago.gg/tutorial/Archipelago/setup/en#creating-a-yaml) for more game-agnostic information.
+
+### Common yaml questions
+#### How do I know I set my yaml up correctly?
+
+The simplest way to check is to test it out. Save your yaml to the Players/ folder within your Archipelago installation and run ArchipelagoGenerate.exe. You should see a new .zip file within the output/ folder of your Archipelago installation if things worked correctly. It's advisable to run ArchipelagoGenerate through a terminal so that you can see the printout, which will include any errors and the precise output file name if it's successful. If you don't like terminals, you can also check the log file in the logs/ folder.
+
+#### What does Progression Balancing do?
+
+For Starcraft 2, not much. It's an Archipelago-wide option meant to shift required items earlier in the playthrough, but Starcraft 2 tends to be much more open in what items you can use. As such, this adjustment isn't very noticeable. It can also increase generation times, so we generally recommend turning it off.
+
+#### How do I specify items in a list, like in excluded items?
+
+You can look up the syntax for yaml collections in the [YAML specification](https://yaml.org/spec/1.2.2/#21-collections). For lists, every item goes on its own line, started with a hyphen:
+
+```yaml
+excluded_items:
+  - Battlecruiser
+  - Drop-Pods (Kerrigan Tier 7)
+```
+
+An empty list is just a matching pair of square brackets: `[]`. That's the default value in the template, which should let you know to use this syntax.
+
+#### How do I specify items for the starting inventory?
+
+The starting inventory is a YAML mapping rather than a list, which associates an item with the amount you start with. The syntax looks like the item name, followed by a colon, then a whitespace character, and then the value:
+
+```yaml
+start_inventory:
+  Micro-Filtering: 1
+  Additional Starting Vespene: 5
+```
+
+An empty mapping is just a matching pair of curly braces: `{}`. That's the default value in the template, which should let you know to use this syntax.
+
+#### How do I know the exact names of items?
+
+You can look up a complete list if item names in the [Icon Repository](https://matthewmarinets.github.io/ap_sc2_icons/).
 
 ## How do I join a MultiWorld game?
 
 1. Run ArchipelagoStarcraft2Client.exe.
    - macOS users should instead follow the instructions found at ["Running in macOS"](#running-in-macos) for this step only.
 2. Type `/connect [server ip]`.
-3. Type your slot name and the server's password when prompted.
-4. Once connected, switch to the 'StarCraft 2 Launcher' tab in the client. There, you can see every mission. By default,
-   only 'Liberation Day' will be available at the beginning. Just click on a mission to start it!
+   - If you're running through the website, the server IP should be displayed near the top of the room page.
+3. Type your slot name from your YAML when prompted.
+4. If the server has a password, enter that when prompted.
+5. Once connected, switch to the 'StarCraft 2 Launcher' tab in the client. There, you can see all the missions in your world. Unreachable missions will have greyed-out text. Just click on an available mission to start it!
 
 ## The game isn't launching when I try to start a mission.
 
diff --git a/worlds/sc2wol/requirements.txt b/worlds/sc2/requirements.txt
similarity index 100%
rename from worlds/sc2wol/requirements.txt
rename to worlds/sc2/requirements.txt
diff --git a/worlds/sc2/test/__init__.py b/worlds/sc2/test/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/worlds/sc2/test/test_Regions.py b/worlds/sc2/test/test_Regions.py
new file mode 100644
index 00000000..c268b65d
--- /dev/null
+++ b/worlds/sc2/test/test_Regions.py
@@ -0,0 +1,41 @@
+import unittest
+from .test_base import Sc2TestBase
+from .. import Regions
+from .. import Options, MissionTables
+
+class TestGridsizes(unittest.TestCase):
+    def test_grid_sizes_meet_specs(self):
+        self.assertTupleEqual((1, 2, 0), Regions.get_grid_dimensions(2))
+        self.assertTupleEqual((1, 3, 0), Regions.get_grid_dimensions(3))
+        self.assertTupleEqual((2, 2, 0), Regions.get_grid_dimensions(4))
+        self.assertTupleEqual((2, 3, 1), Regions.get_grid_dimensions(5))
+        self.assertTupleEqual((2, 4, 1), Regions.get_grid_dimensions(7))
+        self.assertTupleEqual((2, 4, 0), Regions.get_grid_dimensions(8))
+        self.assertTupleEqual((3, 3, 0), Regions.get_grid_dimensions(9))
+        self.assertTupleEqual((2, 5, 0), Regions.get_grid_dimensions(10))
+        self.assertTupleEqual((3, 4, 1), Regions.get_grid_dimensions(11))
+        self.assertTupleEqual((3, 4, 0), Regions.get_grid_dimensions(12))
+        self.assertTupleEqual((3, 5, 0), Regions.get_grid_dimensions(15))
+        self.assertTupleEqual((4, 4, 0), Regions.get_grid_dimensions(16))
+        self.assertTupleEqual((4, 6, 0), Regions.get_grid_dimensions(24))
+        self.assertTupleEqual((5, 5, 0), Regions.get_grid_dimensions(25))
+        self.assertTupleEqual((5, 6, 1), Regions.get_grid_dimensions(29))
+        self.assertTupleEqual((5, 7, 2), Regions.get_grid_dimensions(33))
+
+
+class TestGridGeneration(Sc2TestBase):
+    options = {
+        "mission_order": Options.MissionOrder.option_grid,
+        "excluded_missions": [MissionTables.SC2Mission.ZERO_HOUR.mission_name,],
+        "enable_hots_missions": False,
+        "enable_prophecy_missions": True,
+        "enable_lotv_prologue_missions": False,
+        "enable_lotv_missions": False,
+        "enable_epilogue_missions": False,
+        "enable_nco_missions": False
+    }
+
+    def test_size_matches_exclusions(self):
+        self.assertNotIn(MissionTables.SC2Mission.ZERO_HOUR.mission_name, self.multiworld.regions)
+        # WoL has 29 missions. -1 for Zero Hour being excluded, +1 for the automatically-added menu location
+        self.assertEqual(len(self.multiworld.regions), 29)
diff --git a/worlds/sc2/test/test_base.py b/worlds/sc2/test/test_base.py
new file mode 100644
index 00000000..28529e37
--- /dev/null
+++ b/worlds/sc2/test/test_base.py
@@ -0,0 +1,11 @@
+from typing import *
+
+from test.TestBase import WorldTestBase
+from .. import SC2World
+from .. import Client
+
+class Sc2TestBase(WorldTestBase):
+    game = Client.SC2Context.game
+    world: SC2World
+    player: ClassVar[int] = 1
+    skip_long_tests: bool = True
diff --git a/worlds/sc2/test/test_options.py b/worlds/sc2/test/test_options.py
new file mode 100644
index 00000000..30d21f39
--- /dev/null
+++ b/worlds/sc2/test/test_options.py
@@ -0,0 +1,7 @@
+import unittest
+from .test_base import Sc2TestBase
+from .. import Options, MissionTables
+
+class TestOptions(unittest.TestCase):
+    def test_campaign_size_option_max_matches_number_of_missions(self):
+        self.assertEqual(Options.MaximumCampaignSize.range_end, len(MissionTables.SC2Mission))
diff --git a/worlds/sc2wol/Client.py b/worlds/sc2wol/Client.py
deleted file mode 100644
index 83b7b62d..00000000
--- a/worlds/sc2wol/Client.py
+++ /dev/null
@@ -1,1222 +0,0 @@
-from __future__ import annotations
-
-import asyncio
-import copy
-import ctypes
-import logging
-import multiprocessing
-import os.path
-import re
-import sys
-import tempfile
-import typing
-import queue
-import zipfile
-import io
-import random
-import concurrent.futures
-from pathlib import Path
-
-# CommonClient import first to trigger ModuleUpdater
-from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
-from Utils import init_logging, is_windows
-
-if __name__ == "__main__":
-    init_logging("SC2Client", exception_logger="Client")
-
-logger = logging.getLogger("Client")
-sc2_logger = logging.getLogger("Starcraft2")
-
-import nest_asyncio
-from worlds._sc2common import bot
-from worlds._sc2common.bot.data import Race
-from worlds._sc2common.bot.main import run_game
-from worlds._sc2common.bot.player import Bot
-from worlds.sc2wol import SC2WoLWorld
-from worlds.sc2wol.Items import lookup_id_to_name, get_full_item_list, ItemData, type_flaggroups, upgrade_numbers
-from worlds.sc2wol.Locations import SC2WOL_LOC_ID_OFFSET
-from worlds.sc2wol.MissionTables import lookup_id_to_mission
-from worlds.sc2wol.Regions import MissionInfo
-
-import colorama
-from NetUtils import ClientStatus, NetworkItem, RawJSONtoTextParser, JSONtoTextParser, JSONMessagePart
-from MultiServer import mark_raw
-
-pool = concurrent.futures.ThreadPoolExecutor(1)
-loop = asyncio.get_event_loop_policy().new_event_loop()
-nest_asyncio.apply(loop)
-max_bonus: int = 13
-victory_modulo: int = 100
-
-# GitHub repo where the Map/mod data is hosted for /download_data command
-DATA_REPO_OWNER = "Ziktofel"
-DATA_REPO_NAME = "Archipelago-SC2-data"
-DATA_API_VERSION = "API2"
-
-
-# Data version file path.
-# This file is used to tell if the downloaded data are outdated
-# Associated with /download_data command
-def get_metadata_file():
-    return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt"
-
-
-class StarcraftClientProcessor(ClientCommandProcessor):
-    ctx: SC2Context
-
-    def _cmd_difficulty(self, difficulty: str = "") -> bool:
-        """Overrides the current difficulty set for the world.  Takes the argument casual, normal, hard, or brutal"""
-        options = difficulty.split()
-        num_options = len(options)
-
-        if num_options > 0:
-            difficulty_choice = options[0].lower()
-            if difficulty_choice == "casual":
-                self.ctx.difficulty_override = 0
-            elif difficulty_choice == "normal":
-                self.ctx.difficulty_override = 1
-            elif difficulty_choice == "hard":
-                self.ctx.difficulty_override = 2
-            elif difficulty_choice == "brutal":
-                self.ctx.difficulty_override = 3
-            else:
-                self.output("Unable to parse difficulty '" + options[0] + "'")
-                return False
-
-            self.output("Difficulty set to " + options[0])
-            return True
-
-        else:
-            if self.ctx.difficulty == -1:
-                self.output("Please connect to a seed before checking difficulty.")
-            else:
-                current_difficulty = self.ctx.difficulty
-                if self.ctx.difficulty_override >= 0:
-                    current_difficulty = self.ctx.difficulty_override
-                self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty])
-            self.output("To change the difficulty, add the name of the difficulty after the command.")
-            return False
-
-
-    def _cmd_game_speed(self, game_speed: str = "") -> bool:
-        """Overrides the current game speed for the world.
-         Takes the arguments default, slower, slow, normal, fast, faster"""
-        options = game_speed.split()
-        num_options = len(options)
-
-        if num_options > 0:
-            speed_choice = options[0].lower()
-            if speed_choice == "default":
-                self.ctx.game_speed_override = 0
-            elif speed_choice == "slower":
-                self.ctx.game_speed_override = 1
-            elif speed_choice == "slow":
-                self.ctx.game_speed_override = 2
-            elif speed_choice == "normal":
-                self.ctx.game_speed_override = 3
-            elif speed_choice == "fast":
-                self.ctx.game_speed_override = 4
-            elif speed_choice == "faster":
-                self.ctx.game_speed_override = 5
-            else:
-                self.output("Unable to parse game speed '" + options[0] + "'")
-                return False
-
-            self.output("Game speed set to " + options[0])
-            return True
-
-        else:
-            if self.ctx.game_speed == -1:
-                self.output("Please connect to a seed before checking game speed.")
-            else:
-                current_speed = self.ctx.game_speed
-                if self.ctx.game_speed_override >= 0:
-                    current_speed = self.ctx.game_speed_override
-                self.output("Current game speed: "
-                            + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed])
-            self.output("To change the game speed, add the name of the speed after the command,"
-                        " or Default to select based on difficulty.")
-            return False
-
-    def _cmd_color(self, color: str = "") -> bool:
-        player_colors = [
-            "White", "Red", "Blue", "Teal",
-            "Purple", "Yellow", "Orange", "Green",
-            "LightPink", "Violet", "LightGrey", "DarkGreen",
-            "Brown", "LightGreen", "DarkGrey", "Pink",
-            "Rainbow", "Random", "Default"
-        ]
-        match_colors = [player_color.lower() for player_color in player_colors]
-        if color:
-            if color.lower() not in match_colors:
-                self.output(color + " is not a valid color.  Available colors: " + ', '.join(player_colors))
-                return False
-            if color.lower() == "random":
-                color = random.choice(player_colors[:16])
-            self.ctx.player_color = match_colors.index(color.lower())
-            self.output("Color set to " + player_colors[self.ctx.player_color])
-        else:
-            self.output("Current player color: " + player_colors[self.ctx.player_color])
-            self.output("To change your colors, add the name of the color after the command.")
-            self.output("Available colors: " + ', '.join(player_colors))
-
-    def _cmd_disable_mission_check(self) -> bool:
-        """Disables the check to see if a mission is available to play.  Meant for co-op runs where one player can play
-        the next mission in a chain the other player is doing."""
-        self.ctx.missions_unlocked = True
-        sc2_logger.info("Mission check has been disabled")
-        return True
-
-    def _cmd_play(self, mission_id: str = "") -> bool:
-        """Start a Starcraft 2 mission"""
-
-        options = mission_id.split()
-        num_options = len(options)
-
-        if num_options > 0:
-            mission_number = int(options[0])
-
-            self.ctx.play_mission(mission_number)
-
-        else:
-            sc2_logger.info(
-                "Mission ID needs to be specified.  Use /unfinished or /available to view ids for available missions.")
-            return False
-
-        return True
-
-    def _cmd_available(self) -> bool:
-        """Get what missions are currently available to play"""
-
-        request_available_missions(self.ctx)
-        return True
-
-    def _cmd_unfinished(self) -> bool:
-        """Get what missions are currently available to play and have not had all locations checked"""
-
-        request_unfinished_missions(self.ctx)
-        return True
-
-    @mark_raw
-    def _cmd_set_path(self, path: str = '') -> bool:
-        """Manually set the SC2 install directory (if the automatic detection fails)."""
-        if path:
-            os.environ["SC2PATH"] = path
-            is_mod_installed_correctly()
-            return True
-        else:
-            sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.")
-        return False
-
-    def _cmd_download_data(self) -> bool:
-        """Download the most recent release of the necessary files for playing SC2 with
-        Archipelago. Will overwrite existing files."""
-        pool.submit(self._download_data)
-        return True
-
-    @staticmethod
-    def _download_data() -> bool:
-        if "SC2PATH" not in os.environ:
-            check_game_install_path()
-
-        if os.path.exists(get_metadata_file()):
-            with open(get_metadata_file(), "r") as f:
-                metadata = f.read()
-        else:
-            metadata = None
-
-        tempzip, metadata = download_latest_release_zip(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION,
-                                                        metadata=metadata, force_download=True)
-
-        if tempzip != '':
-            try:
-                zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"])
-                sc2_logger.info(f"Download complete. Package installed.")
-                with open(get_metadata_file(), "w") as f:
-                    f.write(metadata)
-            finally:
-                os.remove(tempzip)
-        else:
-            sc2_logger.warning("Download aborted/failed. Read the log for more information.")
-            return False
-        return True
-
-
-class SC2JSONtoTextParser(JSONtoTextParser):
-    def __init__(self, ctx):
-        self.handlers = {
-            "ItemSend": self._handle_color,
-            "ItemCheat": self._handle_color,
-            "Hint": self._handle_color,
-        }
-        super().__init__(ctx)
-
-    def _handle_color(self, node: JSONMessagePart):
-        codes = node["color"].split(";")
-        buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes)
-        return buffer + self._handle_text(node) + '</c>'
-
-    def color_code(self, code: str):
-        return '<c val="' + self.color_codes[code] + '">'
-
-
-class SC2Context(CommonContext):
-    command_processor = StarcraftClientProcessor
-    game = "Starcraft 2 Wings of Liberty"
-    items_handling = 0b111
-    difficulty = -1
-    game_speed = -1
-    all_in_choice = 0
-    mission_order = 0
-    player_color = 2
-    mission_req_table: typing.Dict[str, MissionInfo] = {}
-    final_mission: int = 29
-    announcements = queue.Queue()
-    sc2_run_task: typing.Optional[asyncio.Task] = None
-    missions_unlocked: bool = False  # allow launching missions ignoring requirements
-    generic_upgrade_missions = 0
-    generic_upgrade_research = 0
-    generic_upgrade_items = 0
-    current_tooltip = None
-    last_loc_list = None
-    difficulty_override = -1
-    game_speed_override = -1
-    mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {}
-    last_bot: typing.Optional[ArchipelagoBot] = None
-
-    def __init__(self, *args, **kwargs):
-        super(SC2Context, self).__init__(*args, **kwargs)
-        self.raw_text_parser = SC2JSONtoTextParser(self)
-
-    async def server_auth(self, password_requested: bool = False):
-        if password_requested and not self.password:
-            await super(SC2Context, self).server_auth(password_requested)
-        await self.get_username()
-        await self.send_connect()
-        if self.ui:
-            self.ui.first_check = True
-
-    def on_package(self, cmd: str, args: dict):
-        if cmd in {"Connected"}:
-            self.difficulty = args["slot_data"]["game_difficulty"]
-            if "game_speed" in args["slot_data"]:
-                self.game_speed = args["slot_data"]["game_speed"]
-            else:
-                self.game_speed = 0
-            self.all_in_choice = args["slot_data"]["all_in_map"]
-            slot_req_table = args["slot_data"]["mission_req"]
-            # Maintaining backwards compatibility with older slot data
-            self.mission_req_table = {
-                mission: MissionInfo(
-                    **{field: value for field, value in mission_info.items() if field in MissionInfo._fields}
-                )
-                for mission, mission_info in slot_req_table.items()
-            }
-            self.mission_order = args["slot_data"].get("mission_order", 0)
-            self.final_mission = args["slot_data"].get("final_mission", 29)
-            self.player_color = args["slot_data"].get("player_color", 2)
-            self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", 0)
-            self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", 0)
-            self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", 0)
-
-            self.build_location_to_mission_mapping()
-
-            # Looks for the required maps and mods for SC2. Runs check_game_install_path.
-            maps_present = is_mod_installed_correctly()
-            if os.path.exists(get_metadata_file()):
-                with open(get_metadata_file(), "r") as f:
-                    current_ver = f.read()
-                    sc2_logger.debug(f"Current version: {current_ver}")
-                if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver):
-                    sc2_logger.info("NOTICE: Update for required files found. Run /download_data to install.")
-            elif maps_present:
-                sc2_logger.warning("NOTICE: Your map files may be outdated (version number not found). "
-                                   "Run /download_data to update them.")
-
-
-    def on_print_json(self, args: dict):
-        # goes to this world
-        if "receiving" in args and self.slot_concerns_self(args["receiving"]):
-            relevant = True
-        # found in this world
-        elif "item" in args and self.slot_concerns_self(args["item"].player):
-            relevant = True
-        # not related
-        else:
-            relevant = False
-
-        if relevant:
-            self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"])))
-
-        super(SC2Context, self).on_print_json(args)
-
-    def run_gui(self):
-        from kvui import GameManager, HoverBehavior, ServerToolTip
-        from kivy.app import App
-        from kivy.clock import Clock
-        from kivy.uix.tabbedpanel import TabbedPanelItem
-        from kivy.uix.gridlayout import GridLayout
-        from kivy.lang import Builder
-        from kivy.uix.label import Label
-        from kivy.uix.button import Button
-        from kivy.uix.floatlayout import FloatLayout
-        from kivy.properties import StringProperty
-
-        class HoverableButton(HoverBehavior, Button):
-            pass
-
-        class MissionButton(HoverableButton):
-            tooltip_text = StringProperty("Test")
-            ctx: SC2Context
-
-            def __init__(self, *args, **kwargs):
-                super(HoverableButton, self).__init__(*args, **kwargs)
-                self.layout = FloatLayout()
-                self.popuplabel = ServerToolTip(text=self.text)
-                self.layout.add_widget(self.popuplabel)
-
-            def on_enter(self):
-                self.popuplabel.text = self.tooltip_text
-
-                if self.ctx.current_tooltip:
-                    App.get_running_app().root.remove_widget(self.ctx.current_tooltip)
-
-                if self.tooltip_text == "":
-                    self.ctx.current_tooltip = None
-                else:
-                    App.get_running_app().root.add_widget(self.layout)
-                    self.ctx.current_tooltip = self.layout
-
-            def on_leave(self):
-                self.ctx.ui.clear_tooltip()
-
-            @property
-            def ctx(self) -> CommonContext:
-                return App.get_running_app().ctx
-
-        class MissionLayout(GridLayout):
-            pass
-
-        class MissionCategory(GridLayout):
-            pass
-
-        class SC2Manager(GameManager):
-            logging_pairs = [
-                ("Client", "Archipelago"),
-                ("Starcraft2", "Starcraft2"),
-            ]
-            base_title = "Archipelago Starcraft 2 Client"
-
-            mission_panel = None
-            last_checked_locations = {}
-            mission_id_to_button = {}
-            launching: typing.Union[bool, int] = False  # if int -> mission ID
-            refresh_from_launching = True
-            first_check = True
-            ctx: SC2Context
-
-            def __init__(self, ctx):
-                super().__init__(ctx)
-
-            def clear_tooltip(self):
-                if self.ctx.current_tooltip:
-                    App.get_running_app().root.remove_widget(self.ctx.current_tooltip)
-
-                self.ctx.current_tooltip = None
-
-            def build(self):
-                container = super().build()
-
-                panel = TabbedPanelItem(text="Starcraft 2 Launcher")
-                self.mission_panel = panel.content = MissionLayout()
-
-                self.tabs.add_widget(panel)
-
-                Clock.schedule_interval(self.build_mission_table, 0.5)
-
-                return container
-
-            def build_mission_table(self, dt):
-                if (not self.launching and (not self.last_checked_locations == self.ctx.checked_locations or
-                                            not self.refresh_from_launching)) or self.first_check:
-                    self.refresh_from_launching = True
-
-                    self.mission_panel.clear_widgets()
-                    if self.ctx.mission_req_table:
-                        self.last_checked_locations = self.ctx.checked_locations.copy()
-                        self.first_check = False
-
-                        self.mission_id_to_button = {}
-                        categories = {}
-                        available_missions, unfinished_missions = calc_unfinished_missions(self.ctx)
-
-                        # separate missions into categories
-                        for mission in self.ctx.mission_req_table:
-                            if not self.ctx.mission_req_table[mission].category in categories:
-                                categories[self.ctx.mission_req_table[mission].category] = []
-
-                            categories[self.ctx.mission_req_table[mission].category].append(mission)
-
-                        for category in categories:
-                            category_panel = MissionCategory()
-                            if category.startswith('_'):
-                                category_display_name = ''
-                            else:
-                                category_display_name = category
-                            category_panel.add_widget(
-                                Label(text=category_display_name, size_hint_y=None, height=50, outline_width=1))
-
-                            for mission in categories[category]:
-                                text: str = mission
-                                tooltip: str = ""
-                                mission_id: int = self.ctx.mission_req_table[mission].id
-                                # Map has uncollected locations
-                                if mission in unfinished_missions:
-                                    text = f"[color=6495ED]{text}[/color]"
-                                elif mission in available_missions:
-                                    text = f"[color=FFFFFF]{text}[/color]"
-                                # Map requirements not met
-                                else:
-                                    text = f"[color=a9a9a9]{text}[/color]"
-                                    tooltip = f"Requires: "
-                                    if self.ctx.mission_req_table[mission].required_world:
-                                        tooltip += ", ".join(list(self.ctx.mission_req_table)[req_mission - 1] for
-                                                             req_mission in
-                                                             self.ctx.mission_req_table[mission].required_world)
-
-                                        if self.ctx.mission_req_table[mission].number:
-                                            tooltip += " and "
-                                    if self.ctx.mission_req_table[mission].number:
-                                        tooltip += f"{self.ctx.mission_req_table[mission].number} missions completed"
-                                remaining_location_names: typing.List[str] = [
-                                    self.ctx.location_names[loc] for loc in self.ctx.locations_for_mission(mission)
-                                    if loc in self.ctx.missing_locations]
-
-                                if mission_id == self.ctx.final_mission:
-                                    if mission in available_missions:
-                                        text = f"[color=FFBC95]{mission}[/color]"
-                                    else:
-                                        text = f"[color=D0C0BE]{mission}[/color]"
-                                    if tooltip:
-                                        tooltip += "\n"
-                                    tooltip += "Final Mission"
-
-                                if remaining_location_names:
-                                    if tooltip:
-                                        tooltip += "\n"
-                                    tooltip += f"Uncollected locations:\n"
-                                    tooltip += "\n".join(remaining_location_names)
-
-                                mission_button = MissionButton(text=text, size_hint_y=None, height=50)
-                                mission_button.tooltip_text = tooltip
-                                mission_button.bind(on_press=self.mission_callback)
-                                self.mission_id_to_button[mission_id] = mission_button
-                                category_panel.add_widget(mission_button)
-
-                            category_panel.add_widget(Label(text=""))
-                            self.mission_panel.add_widget(category_panel)
-
-                elif self.launching:
-                    self.refresh_from_launching = False
-
-                    self.mission_panel.clear_widgets()
-                    self.mission_panel.add_widget(Label(text="Launching Mission: " +
-                                                             lookup_id_to_mission[self.launching]))
-                    if self.ctx.ui:
-                        self.ctx.ui.clear_tooltip()
-
-            def mission_callback(self, button):
-                if not self.launching:
-                    mission_id: int = next(k for k, v in self.mission_id_to_button.items() if v == button)
-                    if self.ctx.play_mission(mission_id):
-                        self.launching = mission_id
-                        Clock.schedule_once(self.finish_launching, 10)
-
-            def finish_launching(self, dt):
-                self.launching = False
-
-        self.ui = SC2Manager(self)
-        self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
-        import pkgutil
-        data = pkgutil.get_data(SC2WoLWorld.__module__, "Starcraft2.kv").decode()
-        Builder.load_string(data)
-
-    async def shutdown(self):
-        await super(SC2Context, self).shutdown()
-        if self.last_bot:
-            self.last_bot.want_close = True
-        if self.sc2_run_task:
-            self.sc2_run_task.cancel()
-
-    def play_mission(self, mission_id: int) -> bool:
-        if self.missions_unlocked or \
-                is_mission_available(self, mission_id):
-            if self.sc2_run_task:
-                if not self.sc2_run_task.done():
-                    sc2_logger.warning("Starcraft 2 Client is still running!")
-                self.sc2_run_task.cancel()  # doesn't actually close the game, just stops the python task
-            if self.slot is None:
-                sc2_logger.warning("Launching Mission without Archipelago authentication, "
-                                   "checks will not be registered to server.")
-            self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id),
-                                                    name="Starcraft 2 Launch")
-            return True
-        else:
-            sc2_logger.info(
-                f"{lookup_id_to_mission[mission_id]} is not currently unlocked.  "
-                f"Use /unfinished or /available to see what is available.")
-            return False
-
-    def build_location_to_mission_mapping(self):
-        mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = {
-            mission_info.id: set() for mission_info in self.mission_req_table.values()
-        }
-
-        for loc in self.server_locations:
-            mission_id, objective = divmod(loc - SC2WOL_LOC_ID_OFFSET, victory_modulo)
-            mission_id_to_location_ids[mission_id].add(objective)
-        self.mission_id_to_location_ids = {mission_id: sorted(objectives) for mission_id, objectives in
-                                           mission_id_to_location_ids.items()}
-
-    def locations_for_mission(self, mission: str):
-        mission_id: int = self.mission_req_table[mission].id
-        objectives = self.mission_id_to_location_ids[self.mission_req_table[mission].id]
-        for objective in objectives:
-            yield SC2WOL_LOC_ID_OFFSET + mission_id * 100 + objective
-
-
-async def main():
-    multiprocessing.freeze_support()
-    parser = get_base_parser()
-    parser.add_argument('--name', default=None, help="Slot Name to connect as.")
-    args = parser.parse_args()
-
-    ctx = SC2Context(args.connect, args.password)
-    ctx.auth = args.name
-    if ctx.server_task is None:
-        ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop")
-
-    if gui_enabled:
-        ctx.run_gui()
-    ctx.run_cli()
-
-    await ctx.exit_event.wait()
-
-    await ctx.shutdown()
-
-
-maps_table = [
-    "ap_liberation_day", "ap_the_outlaws", "ap_zero_hour",
-    "ap_evacuation", "ap_outbreak", "ap_safe_haven", "ap_havens_fall",
-    "ap_smash_and_grab", "ap_the_dig", "ap_the_moebius_factor", "ap_supernova", "ap_maw_of_the_void",
-    "ap_devils_playground", "ap_welcome_to_the_jungle", "ap_breakout", "ap_ghost_of_a_chance",
-    "ap_the_great_train_robbery", "ap_cutthroat", "ap_engine_of_destruction", "ap_media_blitz", "ap_piercing_the_shroud",
-    "ap_whispers_of_doom", "ap_a_sinister_turn", "ap_echoes_of_the_future", "ap_in_utter_darkness",
-    "ap_gates_of_hell", "ap_belly_of_the_beast", "ap_shatter_the_sky", "ap_all_in"
-]
-
-wol_default_categories = [
-    "Mar Sara", "Mar Sara", "Mar Sara", "Colonist", "Colonist", "Colonist", "Colonist",
-    "Artifact", "Artifact", "Artifact", "Artifact", "Artifact", "Covert", "Covert", "Covert", "Covert",
-    "Rebellion", "Rebellion", "Rebellion", "Rebellion", "Rebellion", "Prophecy", "Prophecy", "Prophecy", "Prophecy",
-    "Char", "Char", "Char", "Char"
-]
-wol_default_category_names = [
-    "Mar Sara", "Colonist", "Artifact", "Covert", "Rebellion", "Prophecy", "Char"
-]
-
-
-def calculate_items(ctx: SC2Context) -> typing.List[int]:
-    items = ctx.items_received
-    network_item: NetworkItem
-    accumulators: typing.List[int] = [0 for _ in type_flaggroups]
-
-    for network_item in items:
-        name: str = lookup_id_to_name[network_item.item]
-        item_data: ItemData = get_full_item_list()[name]
-
-        # exists exactly once
-        if item_data.quantity == 1:
-            accumulators[type_flaggroups[item_data.type]] |= 1 << item_data.number
-
-        # exists multiple times
-        elif item_data.type == "Upgrade" or item_data.type == "Progressive Upgrade":
-            flaggroup = type_flaggroups[item_data.type]
-
-            # Generic upgrades apply only to Weapon / Armor upgrades
-            if item_data.type != "Upgrade" or ctx.generic_upgrade_items == 0:
-                accumulators[flaggroup] += 1 << item_data.number
-            else:
-                for bundled_number in upgrade_numbers[item_data.number]:
-                    accumulators[flaggroup] += 1 << bundled_number
-
-        # sum
-        else:
-            accumulators[type_flaggroups[item_data.type]] += item_data.number
-
-    # Upgrades from completed missions
-    if ctx.generic_upgrade_missions > 0:
-        upgrade_flaggroup = type_flaggroups["Upgrade"]
-        num_missions = ctx.generic_upgrade_missions * len(ctx.mission_req_table)
-        amounts = [
-            num_missions // 100,
-            2 * num_missions // 100,
-            3 * num_missions // 100
-        ]
-        upgrade_count = 0
-        completed = len([id for id in ctx.mission_id_to_location_ids if SC2WOL_LOC_ID_OFFSET + victory_modulo * id in ctx.checked_locations])
-        for amount in amounts:
-            if completed >= amount:
-                upgrade_count += 1
-        # Equivalent to "Progressive Weapon/Armor Upgrade" item
-        for bundled_number in upgrade_numbers[5]:
-            accumulators[upgrade_flaggroup] += upgrade_count << bundled_number
-
-    return accumulators
-
-
-def calc_difficulty(difficulty):
-    if difficulty == 0:
-        return 'C'
-    elif difficulty == 1:
-        return 'N'
-    elif difficulty == 2:
-        return 'H'
-    elif difficulty == 3:
-        return 'B'
-
-    return 'X'
-
-
-async def starcraft_launch(ctx: SC2Context, mission_id: int):
-    sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id]}. If game does not launch check log file for errors.")
-
-    with DllDirectory(None):
-        run_game(bot.maps.get(maps_table[mission_id - 1]), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id),
-                                                                name="Archipelago", fullscreen=True)], realtime=True)
-
-
-class ArchipelagoBot(bot.bot_ai.BotAI):
-    game_running: bool = False
-    mission_completed: bool = False
-    boni: typing.List[bool]
-    setup_done: bool
-    ctx: SC2Context
-    mission_id: int
-    want_close: bool = False
-    can_read_game = False
-    last_received_update: int = 0
-
-    def __init__(self, ctx: SC2Context, mission_id):
-        self.setup_done = False
-        self.ctx = ctx
-        self.ctx.last_bot = self
-        self.mission_id = mission_id
-        self.boni = [False for _ in range(max_bonus)]
-
-        super(ArchipelagoBot, self).__init__()
-
-    async def on_step(self, iteration: int):
-        if self.want_close:
-            self.want_close = False
-            await self._client.leave()
-            return
-        game_state = 0
-        if not self.setup_done:
-            self.setup_done = True
-            start_items = calculate_items(self.ctx)
-            if self.ctx.difficulty_override >= 0:
-                difficulty = calc_difficulty(self.ctx.difficulty_override)
-            else:
-                difficulty = calc_difficulty(self.ctx.difficulty)
-            if self.ctx.game_speed_override >= 0:
-                game_speed = self.ctx.game_speed_override
-            else:
-                game_speed = self.ctx.game_speed
-            await self.chat_send("?SetOptions {} {} {} {}".format(
-                difficulty,
-                self.ctx.generic_upgrade_research,
-                self.ctx.all_in_choice,
-                game_speed
-            ))
-            await self.chat_send("?GiveResources {} {} {}".format(
-                start_items[8],
-                start_items[9],
-                start_items[10]
-            ))
-            await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {}".format(
-                start_items[0], start_items[1], start_items[2], start_items[3], start_items[4],
-                start_items[5], start_items[6], start_items[12], start_items[13], start_items[14]))
-            await self.chat_send("?GiveProtossTech {}".format(start_items[7]))
-            await self.chat_send("?SetColor rr " + str(self.ctx.player_color))  # TODO: Add faction color options
-            await self.chat_send("?LoadFinished")
-            self.last_received_update = len(self.ctx.items_received)
-
-        else:
-            if not self.ctx.announcements.empty():
-                message = self.ctx.announcements.get(timeout=1)
-                await self.chat_send("?SendMessage " + message)
-                self.ctx.announcements.task_done()
-
-            # Archipelago reads the health
-            for unit in self.all_own_units():
-                if unit.health_max == 38281:
-                    game_state = int(38281 - unit.health)
-                    self.can_read_game = True
-
-            if iteration == 160 and not game_state & 1:
-                await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " +
-                                     "Starcraft 2 (This is likely a map issue)")
-
-            if self.last_received_update < len(self.ctx.items_received):
-                current_items = calculate_items(self.ctx)
-                await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {}".format(
-                    current_items[0], current_items[1], current_items[2], current_items[3], current_items[4],
-                    current_items[5], current_items[6], current_items[12], current_items[13], current_items[14]))
-                await self.chat_send("?GiveProtossTech {}".format(current_items[7]))
-                self.last_received_update = len(self.ctx.items_received)
-
-            if game_state & 1:
-                if not self.game_running:
-                    print("Archipelago Connected")
-                    self.game_running = True
-
-                if self.can_read_game:
-                    if game_state & (1 << 1) and not self.mission_completed:
-                        if self.mission_id != self.ctx.final_mission:
-                            print("Mission Completed")
-                            await self.ctx.send_msgs(
-                                [{"cmd": 'LocationChecks',
-                                  "locations": [SC2WOL_LOC_ID_OFFSET + victory_modulo * self.mission_id]}])
-                            self.mission_completed = True
-                        else:
-                            print("Game Complete")
-                            await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}])
-                            self.mission_completed = True
-
-                    for x, completed in enumerate(self.boni):
-                        if not completed and game_state & (1 << (x + 2)):
-                            await self.ctx.send_msgs(
-                                [{"cmd": 'LocationChecks',
-                                  "locations": [SC2WOL_LOC_ID_OFFSET + victory_modulo * self.mission_id + x + 1]}])
-                            self.boni[x] = True
-
-                else:
-                    await self.chat_send("?SendMessage LostConnection - Lost connection to game.")
-
-
-def request_unfinished_missions(ctx: SC2Context):
-    if ctx.mission_req_table:
-        message = "Unfinished Missions: "
-        unlocks = initialize_blank_mission_dict(ctx.mission_req_table)
-        unfinished_locations = initialize_blank_mission_dict(ctx.mission_req_table)
-
-        _, unfinished_missions = calc_unfinished_missions(ctx, unlocks=unlocks)
-
-        # Removing All-In from location pool
-        final_mission = lookup_id_to_mission[ctx.final_mission]
-        if final_mission in unfinished_missions.keys():
-            message = f"Final Mission Available: {final_mission}[{ctx.final_mission}]\n" + message
-            if unfinished_missions[final_mission] == -1:
-                unfinished_missions.pop(final_mission)
-
-        message += ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}[{ctx.mission_req_table[mission].id}] " +
-                             mark_up_objectives(
-                                 f"[{len(unfinished_missions[mission])}/"
-                                 f"{sum(1 for _ in ctx.locations_for_mission(mission))}]",
-                                 ctx, unfinished_locations, mission)
-                             for mission in unfinished_missions)
-
-        if ctx.ui:
-            ctx.ui.log_panels['All'].on_message_markup(message)
-            ctx.ui.log_panels['Starcraft2'].on_message_markup(message)
-        else:
-            sc2_logger.info(message)
-    else:
-        sc2_logger.warning("No mission table found, you are likely not connected to a server.")
-
-
-def calc_unfinished_missions(ctx: SC2Context, unlocks=None):
-    unfinished_missions = []
-    locations_completed = []
-
-    if not unlocks:
-        unlocks = initialize_blank_mission_dict(ctx.mission_req_table)
-
-    available_missions = calc_available_missions(ctx, unlocks)
-
-    for name in available_missions:
-        objectives = set(ctx.locations_for_mission(name))
-        if objectives:
-            objectives_completed = ctx.checked_locations & objectives
-            if len(objectives_completed) < len(objectives):
-                unfinished_missions.append(name)
-                locations_completed.append(objectives_completed)
-
-        else:  # infer that this is the final mission as it has no objectives
-            unfinished_missions.append(name)
-            locations_completed.append(-1)
-
-    return available_missions, dict(zip(unfinished_missions, locations_completed))
-
-
-def is_mission_available(ctx: SC2Context, mission_id_to_check):
-    unfinished_missions = calc_available_missions(ctx)
-
-    return any(mission_id_to_check == ctx.mission_req_table[mission].id for mission in unfinished_missions)
-
-
-def mark_up_mission_name(ctx: SC2Context, mission, unlock_table):
-    """Checks if the mission is required for game completion and adds '*' to the name to mark that."""
-
-    if ctx.mission_req_table[mission].completion_critical:
-        if ctx.ui:
-            message = "[color=AF99EF]" + mission + "[/color]"
-        else:
-            message = "*" + mission + "*"
-    else:
-        message = mission
-
-    if ctx.ui:
-        unlocks = unlock_table[mission]
-
-        if len(unlocks) > 0:
-            pre_message = f"[ref={list(ctx.mission_req_table).index(mission)}|Unlocks: "
-            pre_message += ", ".join(f"{unlock}({ctx.mission_req_table[unlock].id})" for unlock in unlocks)
-            pre_message += f"]"
-            message = pre_message + message + "[/ref]"
-
-    return message
-
-
-def mark_up_objectives(message, ctx, unfinished_locations, mission):
-    formatted_message = message
-
-    if ctx.ui:
-        locations = unfinished_locations[mission]
-
-        pre_message = f"[ref={list(ctx.mission_req_table).index(mission) + 30}|"
-        pre_message += "<br>".join(location for location in locations)
-        pre_message += f"]"
-        formatted_message = pre_message + message + "[/ref]"
-
-    return formatted_message
-
-
-def request_available_missions(ctx: SC2Context):
-    if ctx.mission_req_table:
-        message = "Available Missions: "
-
-        # Initialize mission unlock table
-        unlocks = initialize_blank_mission_dict(ctx.mission_req_table)
-
-        missions = calc_available_missions(ctx, unlocks)
-        message += \
-            ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}"
-                      f"[{ctx.mission_req_table[mission].id}]"
-                      for mission in missions)
-
-        if ctx.ui:
-            ctx.ui.log_panels['All'].on_message_markup(message)
-            ctx.ui.log_panels['Starcraft2'].on_message_markup(message)
-        else:
-            sc2_logger.info(message)
-    else:
-        sc2_logger.warning("No mission table found, you are likely not connected to a server.")
-
-
-def calc_available_missions(ctx: SC2Context, unlocks=None):
-    available_missions = []
-    missions_complete = 0
-
-    # Get number of missions completed
-    for loc in ctx.checked_locations:
-        if loc % victory_modulo == 0:
-            missions_complete += 1
-
-    for name in ctx.mission_req_table:
-        # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips
-        if unlocks:
-            for unlock in ctx.mission_req_table[name].required_world:
-                unlocks[list(ctx.mission_req_table)[unlock - 1]].append(name)
-
-        if mission_reqs_completed(ctx, name, missions_complete):
-            available_missions.append(name)
-
-    return available_missions
-
-
-def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int):
-    """Returns a bool signifying if the mission has all requirements complete and can be done
-
-    Arguments:
-    ctx -- instance of SC2Context
-    locations_to_check -- the mission string name to check
-    missions_complete -- an int of how many missions have been completed
-    mission_path -- a list of missions that have already been checked
-"""
-    if len(ctx.mission_req_table[mission_name].required_world) >= 1:
-        # A check for when the requirements are being or'd
-        or_success = False
-
-        # Loop through required missions
-        for req_mission in ctx.mission_req_table[mission_name].required_world:
-            req_success = True
-
-            # Check if required mission has been completed
-            if not (ctx.mission_req_table[list(ctx.mission_req_table)[req_mission - 1]].id *
-                    victory_modulo + SC2WOL_LOC_ID_OFFSET) in ctx.checked_locations:
-                if not ctx.mission_req_table[mission_name].or_requirements:
-                    return False
-                else:
-                    req_success = False
-
-            # Grid-specific logic (to avoid long path checks and infinite recursion)
-            if ctx.mission_order in (3, 4):
-                if req_success:
-                    return True
-                else:
-                    if req_mission is ctx.mission_req_table[mission_name].required_world[-1]:
-                        return False
-                    else:
-                        continue
-
-            # Recursively check required mission to see if it's requirements are met, in case !collect has been done
-            # Skipping recursive check on Grid settings to speed up checks and avoid infinite recursion
-            if not mission_reqs_completed(ctx, list(ctx.mission_req_table)[req_mission - 1], missions_complete):
-                if not ctx.mission_req_table[mission_name].or_requirements:
-                    return False
-                else:
-                    req_success = False
-
-            # If requirement check succeeded mark or as satisfied
-            if ctx.mission_req_table[mission_name].or_requirements and req_success:
-                or_success = True
-
-        if ctx.mission_req_table[mission_name].or_requirements:
-            # Return false if or requirements not met
-            if not or_success:
-                return False
-
-        # Check number of missions
-        if missions_complete >= ctx.mission_req_table[mission_name].number:
-            return True
-        else:
-            return False
-    else:
-        return True
-
-
-def initialize_blank_mission_dict(location_table):
-    unlocks = {}
-
-    for mission in list(location_table):
-        unlocks[mission] = []
-
-    return unlocks
-
-
-def check_game_install_path() -> bool:
-    # First thing: go to the default location for ExecuteInfo.
-    # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it.
-    if is_windows:
-        # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow.
-        # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555#
-        import ctypes.wintypes
-        CSIDL_PERSONAL = 5  # My Documents
-        SHGFP_TYPE_CURRENT = 0  # Get current, not default value
-
-        buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)
-        ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf)
-        documentspath = buf.value
-        einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt"))
-    else:
-        einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF]))
-
-    # Check if the file exists.
-    if os.path.isfile(einfo):
-
-        # Open the file and read it, picking out the latest executable's path.
-        with open(einfo) as f:
-            content = f.read()
-        if content:
-            try:
-                base = re.search(r" = (.*)Versions", content).group(1)
-            except AttributeError:
-                sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, then "
-                                   f"try again.")
-                return False
-            if os.path.exists(base):
-                executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions")
-
-                # Finally, check the path for an actual executable.
-                # If we find one, great. Set up the SC2PATH.
-                if os.path.isfile(executable):
-                    sc2_logger.info(f"Found an SC2 install at {base}!")
-                    sc2_logger.debug(f"Latest executable at {executable}.")
-                    os.environ["SC2PATH"] = base
-                    sc2_logger.debug(f"SC2PATH set to {base}.")
-                    return True
-                else:
-                    sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.")
-            else:
-                sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.")
-    else:
-        sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. "
-                           f"If that fails, please run /set_path with your SC2 install directory.")
-    return False
-
-
-def is_mod_installed_correctly() -> bool:
-    """Searches for all required files."""
-    if "SC2PATH" not in os.environ:
-        check_game_install_path()
-
-    mapdir = os.environ['SC2PATH'] / Path('Maps/ArchipelagoCampaign')
-    mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerWoL", "ArchipelagoTriggers"]
-    modfiles = [os.environ["SC2PATH"] / Path("Mods/" + mod + ".SC2Mod") for mod in mods]
-    wol_required_maps = ["WoL" + os.sep + map_name + ".SC2Map" for map_name in maps_table]
-    needs_files = False
-
-    # Check for maps.
-    missing_maps = []
-    for mapfile in wol_required_maps:
-        if not os.path.isfile(mapdir / mapfile):
-            missing_maps.append(mapfile)
-    if len(missing_maps) >= 19:
-        sc2_logger.warning(f"All map files missing from {mapdir}.")
-        needs_files = True
-    elif len(missing_maps) > 0:
-        for map in missing_maps:
-            sc2_logger.debug(f"Missing {map} from {mapdir}.")
-            sc2_logger.warning(f"Missing {len(missing_maps)} map files.")
-        needs_files = True
-    else:  # Must be no maps missing
-        sc2_logger.info(f"All maps found in {mapdir}.")
-
-    # Check for mods.
-    for modfile in modfiles:
-        if os.path.isfile(modfile) or os.path.isdir(modfile):
-            sc2_logger.info(f"Archipelago mod found at {modfile}.")
-        else:
-            sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.")
-            needs_files = True
-
-    # Final verdict.
-    if needs_files:
-        sc2_logger.warning(f"Required files are missing. Run /download_data to acquire them.")
-        return False
-    else:
-        sc2_logger.debug(f"All map/mod files are properly installed.")
-        return True
-
-
-class DllDirectory:
-    # Credit to Black Sliver for this code.
-    # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw
-    _old: typing.Optional[str] = None
-    _new: typing.Optional[str] = None
-
-    def __init__(self, new: typing.Optional[str]):
-        self._new = new
-
-    def __enter__(self):
-        old = self.get()
-        if self.set(self._new):
-            self._old = old
-
-    def __exit__(self, *args):
-        if self._old is not None:
-            self.set(self._old)
-
-    @staticmethod
-    def get() -> typing.Optional[str]:
-        if sys.platform == "win32":
-            n = ctypes.windll.kernel32.GetDllDirectoryW(0, None)
-            buf = ctypes.create_unicode_buffer(n)
-            ctypes.windll.kernel32.GetDllDirectoryW(n, buf)
-            return buf.value
-        # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific
-        return None
-
-    @staticmethod
-    def set(s: typing.Optional[str]) -> bool:
-        if sys.platform == "win32":
-            return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0
-        # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific
-        return False
-
-
-def download_latest_release_zip(owner: str, repo: str, api_version: str, metadata: str = None, force_download=False) -> (str, str):
-    """Downloads the latest release of a GitHub repo to the current directory as a .zip file."""
-    import requests
-
-    headers = {"Accept": 'application/vnd.github.v3+json'}
-    url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}"
-
-    r1 = requests.get(url, headers=headers)
-    if r1.status_code == 200:
-        latest_metadata = r1.json()
-        cleanup_downloaded_metadata(latest_metadata)
-        latest_metadata = str(latest_metadata)
-        # sc2_logger.info(f"Latest version: {latest_metadata}.")
-    else:
-        sc2_logger.warning(f"Status code: {r1.status_code}")
-        sc2_logger.warning(f"Failed to reach GitHub. Could not find download link.")
-        sc2_logger.warning(f"text: {r1.text}")
-        return "", metadata
-
-    if (force_download is False) and (metadata == latest_metadata):
-        sc2_logger.info("Latest version already installed.")
-        return "", metadata
-
-    sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.")
-    download_url = r1.json()["assets"][0]["browser_download_url"]
-
-    r2 = requests.get(download_url, headers=headers)
-    if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)):
-        tempdir = tempfile.gettempdir()
-        file = tempdir + os.sep + f"{repo}.zip"
-        with open(file, "wb") as fh:
-            fh.write(r2.content)
-        sc2_logger.info(f"Successfully downloaded {repo}.zip.")
-        return file, latest_metadata
-    else:
-        sc2_logger.warning(f"Status code: {r2.status_code}")
-        sc2_logger.warning("Download failed.")
-        sc2_logger.warning(f"text: {r2.text}")
-        return "", metadata
-
-
-def cleanup_downloaded_metadata(medatada_json):
-    for asset in medatada_json['assets']:
-        del asset['download_count']
-
-
-def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool:
-    import requests
-
-    headers = {"Accept": 'application/vnd.github.v3+json'}
-    url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}"
-
-    r1 = requests.get(url, headers=headers)
-    if r1.status_code == 200:
-        latest_metadata = r1.json()
-        cleanup_downloaded_metadata(latest_metadata)
-        latest_metadata = str(latest_metadata)
-        if metadata != latest_metadata:
-            return True
-        else:
-            return False
-
-    else:
-        sc2_logger.warning(f"Failed to reach GitHub while checking for updates.")
-        sc2_logger.warning(f"Status code: {r1.status_code}")
-        sc2_logger.warning(f"text: {r1.text}")
-        return False
-
-
-def launch():
-    colorama.init()
-    asyncio.run(main())
-    colorama.deinit()
diff --git a/worlds/sc2wol/Items.py b/worlds/sc2wol/Items.py
deleted file mode 100644
index 971a7537..00000000
--- a/worlds/sc2wol/Items.py
+++ /dev/null
@@ -1,421 +0,0 @@
-from BaseClasses import Item, ItemClassification, MultiWorld
-import typing
-
-from .Options import get_option_value
-from .MissionTables import vanilla_mission_req_table
-
-
-class ItemData(typing.NamedTuple):
-    code: typing.Optional[int]
-    type: typing.Optional[str]
-    number: typing.Optional[int]
-    classification: ItemClassification = ItemClassification.useful
-    quantity: int = 1
-    parent_item: str = None
-    origin: typing.Set[str] = {"wol"}
-
-
-class StarcraftWoLItem(Item):
-    game: str = "Starcraft 2 Wings of Liberty"
-
-
-def get_full_item_list():
-    return item_table
-
-
-SC2WOL_ITEM_ID_OFFSET = 1000
-
-item_table = {
-    "Marine": ItemData(0 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, classification=ItemClassification.progression),
-    "Medic": ItemData(1 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, classification=ItemClassification.progression),
-    "Firebat": ItemData(2 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, classification=ItemClassification.progression),
-    "Marauder": ItemData(3 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, classification=ItemClassification.progression),
-    "Reaper": ItemData(4 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, classification=ItemClassification.progression),
-    "Hellion": ItemData(5 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, classification=ItemClassification.progression),
-    "Vulture": ItemData(6 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, classification=ItemClassification.progression),
-    "Goliath": ItemData(7 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, classification=ItemClassification.progression),
-    "Diamondback": ItemData(8 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, classification=ItemClassification.progression),
-    "Siege Tank": ItemData(9 + SC2WOL_ITEM_ID_OFFSET, "Unit", 9, classification=ItemClassification.progression),
-    "Medivac": ItemData(10 + SC2WOL_ITEM_ID_OFFSET, "Unit", 10, classification=ItemClassification.progression),
-    "Wraith": ItemData(11 + SC2WOL_ITEM_ID_OFFSET, "Unit", 11, classification=ItemClassification.progression),
-    "Viking": ItemData(12 + SC2WOL_ITEM_ID_OFFSET, "Unit", 12, classification=ItemClassification.progression),
-    "Banshee": ItemData(13 + SC2WOL_ITEM_ID_OFFSET, "Unit", 13, classification=ItemClassification.progression),
-    "Battlecruiser": ItemData(14 + SC2WOL_ITEM_ID_OFFSET, "Unit", 14, classification=ItemClassification.progression),
-    "Ghost": ItemData(15 + SC2WOL_ITEM_ID_OFFSET, "Unit", 15, classification=ItemClassification.progression),
-    "Spectre": ItemData(16 + SC2WOL_ITEM_ID_OFFSET, "Unit", 16, classification=ItemClassification.progression),
-    "Thor": ItemData(17 + SC2WOL_ITEM_ID_OFFSET, "Unit", 17, classification=ItemClassification.progression),
-    # EE units
-    "Liberator": ItemData(18 + SC2WOL_ITEM_ID_OFFSET, "Unit", 18, classification=ItemClassification.progression, origin={"nco", "ext"}),
-    "Valkyrie": ItemData(19 + SC2WOL_ITEM_ID_OFFSET, "Unit", 19, classification=ItemClassification.progression, origin={"bw"}),
-    "Widow Mine": ItemData(20 + SC2WOL_ITEM_ID_OFFSET, "Unit", 20, classification=ItemClassification.progression, origin={"ext"}),
-    "Cyclone": ItemData(21 + SC2WOL_ITEM_ID_OFFSET, "Unit", 21, classification=ItemClassification.progression, origin={"ext"}),
-
-    # Some other items are moved to Upgrade group because of the way how the bot message is parsed
-    "Progressive Infantry Weapon": ItemData(100 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3),
-    "Progressive Infantry Armor": ItemData(102 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3),
-    "Progressive Vehicle Weapon": ItemData(103 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3),
-    "Progressive Vehicle Armor": ItemData(104 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, quantity=3),
-    "Progressive Ship Weapon": ItemData(105 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, quantity=3),
-    "Progressive Ship Armor": ItemData(106 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, quantity=3),
-    # Upgrade bundle 'number' values are used as indices to get affected 'number's
-    "Progressive Weapon Upgrade": ItemData(107 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3),
-    "Progressive Armor Upgrade": ItemData(108 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 1, quantity=3),
-    "Progressive Infantry Upgrade": ItemData(109 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3),
-    "Progressive Vehicle Upgrade": ItemData(110 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 3, quantity=3),
-    "Progressive Ship Upgrade": ItemData(111 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3),
-    "Progressive Weapon/Armor Upgrade": ItemData(112 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 5, quantity=3),
-
-    "Projectile Accelerator (Bunker)": ItemData(200 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0, parent_item="Bunker"),
-    "Neosteel Bunker (Bunker)": ItemData(201 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1, parent_item="Bunker"),
-    "Titanium Housing (Missile Turret)": ItemData(202 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2, classification=ItemClassification.filler, parent_item="Missile Turret"),
-    "Hellstorm Batteries (Missile Turret)": ItemData(203 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3, parent_item="Missile Turret"),
-    "Advanced Construction (SCV)": ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4),
-    "Dual-Fusion Welders (SCV)": ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5),
-    "Fire-Suppression System (Building)": ItemData(206 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6),
-    "Orbital Command (Building)": ItemData(207 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7),
-    "Progressive Stimpack (Marine)": ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 0, parent_item="Marine", quantity=2),
-    "Combat Shield (Marine)": ItemData(209 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9, classification=ItemClassification.progression, parent_item="Marine"),
-    "Advanced Medic Facilities (Medic)": ItemData(210 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10, classification=ItemClassification.filler, parent_item="Medic"),
-    "Stabilizer Medpacks (Medic)": ItemData(211 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11, classification=ItemClassification.progression, parent_item="Medic"),
-    "Incinerator Gauntlets (Firebat)": ItemData(212 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 12, classification=ItemClassification.filler, parent_item="Firebat"),
-    "Juggernaut Plating (Firebat)": ItemData(213 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 13, parent_item="Firebat"),
-    "Concussive Shells (Marauder)": ItemData(214 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 14, parent_item="Marauder"),
-    "Kinetic Foam (Marauder)": ItemData(215 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15, parent_item="Marauder"),
-    "U-238 Rounds (Reaper)": ItemData(216 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16, parent_item="Reaper"),
-    "G-4 Clusterbomb (Reaper)": ItemData(217 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, classification=ItemClassification.progression, parent_item="Reaper"),
-    # Items from EE
-    "Mag-Field Accelerators (Cyclone)": ItemData(218 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 18, parent_item="Cyclone", origin={"ext"}),
-    "Mag-Field Launchers (Cyclone)": ItemData(219 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 19, parent_item="Cyclone", origin={"ext"}),
-    # Items from new mod
-    "Laser Targeting System (Marine)": ItemData(220 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, classification=ItemClassification.filler, parent_item="Marine", origin={"nco"}), # Freed slot from Stimpack
-    "Magrail Munitions (Marine)": ItemData(221 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 20, parent_item="Marine", origin={"nco"}),
-    "Optimized Logistics (Marine)": ItemData(222 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 21, classification=ItemClassification.filler, parent_item="Marine", origin={"nco"}),
-    "Restoration (Medic)": ItemData(223 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 22, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}),
-    "Optical Flare (Medic)": ItemData(224 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 23, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}),
-    "Optimized Logistics (Medic)": ItemData(225 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 24, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}),
-    "Progressive Stimpack (Firebat)": ItemData(226 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 6, parent_item="Firebat", quantity=2, origin={"bw"}),
-    "Optimized Logistics (Firebat)": ItemData(227 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 25, parent_item="Firebat", origin={"bw"}),
-    "Progressive Stimpack (Marauder)": ItemData(228 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 8, parent_item="Marauder", quantity=2, origin={"nco"}),
-    "Laser Targeting System (Marauder)": ItemData(229 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 26, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}),
-    "Magrail Munitions (Marauder)": ItemData(230 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 27, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}),
-    "Internal Tech Module (Marauder)": ItemData(231 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 28, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}),
-
-    # Items from new mod
-    "Progressive Stimpack (Reaper)": ItemData(250 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 10, parent_item="Reaper", quantity=2, origin={"nco"}),
-    "Laser Targeting System (Reaper)": ItemData(251 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 0, classification=ItemClassification.filler, parent_item="Reaper", origin={"nco"}),
-    "Advanced Cloaking Field (Reaper)": ItemData(252 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 1, parent_item="Reaper", origin={"nco"}),
-    "Spider Mines (Reaper)": ItemData(253 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 2, classification=ItemClassification.filler, parent_item="Reaper", origin={"nco"}),
-    "Combat Drugs (Reaper)": ItemData(254 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 3, classification=ItemClassification.filler, parent_item="Reaper", origin={"ext"}),
-    "Hellbat Aspect (Hellion)": ItemData(255 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 4, parent_item="Hellion", origin={"nco"}),
-    "Smart Servos (Hellion)": ItemData(256 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 5, parent_item="Hellion", origin={"nco"}),
-    "Optimized Logistics (Hellion)": ItemData(257 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 6, classification=ItemClassification.filler, parent_item="Hellion", origin={"nco"}),
-    "Jump Jets (Hellion)": ItemData(258 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 7, classification=ItemClassification.filler, parent_item="Hellion", origin={"nco"}),
-    "Progressive Stimpack (Hellion)": ItemData(259 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 12, parent_item="Hellion", quantity=2, origin={"nco"}),
-    "Ion Thrusters (Vulture)": ItemData(260 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 8, classification=ItemClassification.filler, parent_item="Vulture", origin={"bw"}),
-    "Auto Launchers (Vulture)": ItemData(261 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 9, parent_item="Vulture", origin={"bw"}),
-    "High Explosive Munition (Spider Mine)": ItemData(262 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 10, origin={"bw"}),
-    "Jump Jets (Goliath)": ItemData(263 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 11, classification=ItemClassification.filler, parent_item="Goliath", origin={"nco"}),
-    "Optimized Logistics (Goliath)": ItemData(264 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 12, classification=ItemClassification.filler, parent_item="Goliath", origin={"nco"}),
-    "Hyperfluxor (Diamondback)": ItemData(265 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 13, parent_item="Diamondback", origin={"ext"}),
-    "Burst Capacitors (Diamondback)": ItemData(266 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 14, classification=ItemClassification.filler, parent_item="Diamondback", origin={"ext"}),
-    "Optimized Logistics (Diamondback)": ItemData(267 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 15, parent_item="Diamondback", origin={"ext"}),
-    "Jump Jets (Siege Tank)": ItemData(268 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 16, parent_item="Siege Tank", origin={"nco"}),
-    "Spider Mines (Siege Tank)": ItemData(269 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 17, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}),
-    "Smart Servos (Siege Tank)": ItemData(270 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 18, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}),
-    "Graduating Range (Siege Tank)": ItemData(271 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 19, classification=ItemClassification.progression, parent_item="Siege Tank", origin={"ext"}),
-    "Laser Targeting System (Siege Tank)": ItemData(272 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 20, parent_item="Siege Tank", origin={"nco"}),
-    "Advanced Siege Tech (Siege Tank)": ItemData(273 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 21, parent_item="Siege Tank", origin={"ext"}),
-    "Internal Tech Module (Siege Tank)": ItemData(274 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 22, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}),
-    "Optimized Logistics (Predator)": ItemData(275 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 23, classification=ItemClassification.filler, parent_item="Predator", origin={"ext"}),
-    "Expanded Hull (Medivac)": ItemData(276 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 24, classification=ItemClassification.filler, parent_item="Medivac", origin={"ext"}),
-    "Afterburners (Medivac)": ItemData(277 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 25, classification=ItemClassification.filler, parent_item="Medivac", origin={"ext"}),
-    "Advanced Laser Technology (Wraith)": ItemData(278 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 26, classification=ItemClassification.progression, parent_item="Wraith", origin={"ext"}),
-    "Smart Servos (Viking)": ItemData(279 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 27, parent_item="Viking", origin={"ext"}),
-    "Magrail Munitions (Viking)": ItemData(280 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 28, parent_item="Viking", origin={"ext"}),
-
-    "Twin-Linked Flamethrower (Hellion)": ItemData(300 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, classification=ItemClassification.filler, parent_item="Hellion"),
-    "Thermite Filaments (Hellion)": ItemData(301 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1, parent_item="Hellion"),
-    "Cerberus Mine (Spider Mine)": ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, classification=ItemClassification.filler),
-    "Replenishable Magazine (Vulture)": ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3, classification=ItemClassification.filler, parent_item="Vulture"),
-    "Multi-Lock Weapons System (Goliath)": ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4, parent_item="Goliath"),
-    "Ares-Class Targeting System (Goliath)": ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5, parent_item="Goliath"),
-    "Tri-Lithium Power Cell (Diamondback)": ItemData(306 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 6, classification=ItemClassification.filler, parent_item="Diamondback"),
-    "Shaped Hull (Diamondback)": ItemData(307 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 7, classification=ItemClassification.filler, parent_item="Diamondback"),
-    "Maelstrom Rounds (Siege Tank)": ItemData(308 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 8, classification=ItemClassification.progression, parent_item="Siege Tank"),
-    "Shaped Blast (Siege Tank)": ItemData(309 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 9, parent_item="Siege Tank"),
-    "Rapid Deployment Tube (Medivac)": ItemData(310 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 10, classification=ItemClassification.filler, parent_item="Medivac"),
-    "Advanced Healing AI (Medivac)": ItemData(311 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 11, classification=ItemClassification.filler, parent_item="Medivac"),
-    "Tomahawk Power Cells (Wraith)": ItemData(312 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 12, classification=ItemClassification.filler, parent_item="Wraith"),
-    "Displacement Field (Wraith)": ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13, classification=ItemClassification.filler, parent_item="Wraith"),
-    "Ripwave Missiles (Viking)": ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14, parent_item="Viking"),
-    "Phobos-Class Weapons System (Viking)": ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15, parent_item="Viking"),
-    "Progressive Cross-Spectrum Dampeners (Banshee)": ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 2, classification=ItemClassification.filler, parent_item="Banshee", quantity=2),
-    "Shockwave Missile Battery (Banshee)": ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17, parent_item="Banshee"),
-    "Missile Pods (Battlecruiser)": ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, classification=ItemClassification.filler, parent_item="Battlecruiser"),
-    "Defensive Matrix (Battlecruiser)": ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, classification=ItemClassification.filler, parent_item="Battlecruiser"),
-    "Ocular Implants (Ghost)": ItemData(320 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 20, parent_item="Ghost"),
-    "Crius Suit (Ghost)": ItemData(321 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 21, parent_item="Ghost"),
-    "Psionic Lash (Spectre)": ItemData(322 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 22, classification=ItemClassification.progression, parent_item="Spectre"),
-    "Nyx-Class Cloaking Module (Spectre)": ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23, parent_item="Spectre"),
-    "330mm Barrage Cannon (Thor)": ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, classification=ItemClassification.filler, parent_item="Thor"),
-    "Immortality Protocol (Thor)": ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, classification=ItemClassification.filler, parent_item="Thor"),
-    # Items from EE
-    "Advanced Ballistics (Liberator)": ItemData(326 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 26, parent_item="Liberator", origin={"ext"}),
-    "Raid Artillery (Liberator)": ItemData(327 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 27, classification=ItemClassification.progression, parent_item="Liberator", origin={"nco"}),
-    "Drilling Claws (Widow Mine)": ItemData(328 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 28, classification=ItemClassification.filler, parent_item="Widow Mine", origin={"ext"}),
-    "Concealment (Widow Mine)": ItemData(329 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 29, classification=ItemClassification.progression, parent_item="Widow Mine", origin={"ext"}),
-
-    #Items from new mod
-    "Hyperflight Rotors (Banshee)": ItemData(350 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 0, classification=ItemClassification.filler, parent_item="Banshee", origin={"ext"}),
-    "Laser Targeting System (Banshee)": ItemData(351 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 1, classification=ItemClassification.filler, parent_item="Banshee", origin={"nco"}),
-    "Internal Tech Module (Banshee)": ItemData(352 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 2, classification=ItemClassification.filler, parent_item="Banshee", origin={"nco"}),
-    "Tactical Jump (Battlecruiser)": ItemData(353 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 3, parent_item="Battlecruiser", origin={"nco", "ext"}),
-    "Cloak (Battlecruiser)": ItemData(354 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 4, parent_item="Battlecruiser", origin={"nco"}),
-    "ATX Laser Battery (Battlecruiser)": ItemData(355 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 5, classification=ItemClassification.progression, parent_item="Battlecruiser", origin={"nco"}),
-    "Optimized Logistics (Battlecruiser)": ItemData(356 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 6, classification=ItemClassification.filler, parent_item="Battlecruiser", origin={"ext"}),
-    "Internal Tech Module (Battlecruiser)": ItemData(357 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 7, classification=ItemClassification.filler, parent_item="Battlecruiser", origin={"nco"}),
-    "EMP Rounds (Ghost)": ItemData(358 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 8, parent_item="Ghost", origin={"ext"}),
-    "Lockdown (Ghost)": ItemData(359 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 9, parent_item="Ghost", origin={"bw"}),
-    "Impaler Rounds (Spectre)": ItemData(360 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 10, parent_item="Spectre", origin={"ext"}),
-    "Progressive High Impact Payload (Thor)": ItemData(361 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 14, parent_item="Thor", quantity=2, origin={"ext"}),  # L2 is Smart Servos
-    "Bio Mechanical Repair Drone (Raven)": ItemData(363 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 13, parent_item="Raven", origin={"nco"}),
-    "Spider Mines (Raven)": ItemData(364 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 14, parent_item="Raven", origin={"nco"}),
-    "Railgun Turret (Raven)": ItemData(365 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 15, parent_item="Raven", origin={"nco"}),
-    "Hunter-Seeker Weapon (Raven)": ItemData(366 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 16, parent_item="Raven", origin={"nco"}),
-    "Interference Matrix (Raven)": ItemData(367 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 17, parent_item="Raven", origin={"ext"}),
-    "Anti-Armor Missile (Raven)": ItemData(368 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 18, classification=ItemClassification.filler, parent_item="Raven", origin={"ext"}),
-    "Internal Tech Module (Raven)": ItemData(369 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 19, classification=ItemClassification.filler, parent_item="Raven", origin={"nco"}),
-    "EMP Shockwave (Science Vessel)": ItemData(370 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 20, parent_item="Science Vessel", origin={"bw"}),
-    "Defensive Matrix (Science Vessel)": ItemData(371 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 21, parent_item="Science Vessel", origin={"bw"}),
-    "Targeting Optics (Cyclone)": ItemData(372 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 22, parent_item="Cyclone", origin={"ext"}),
-    "Rapid Fire Launchers (Cyclone)": ItemData(373 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 23, parent_item="Cyclone", origin={"ext"}),
-    "Cloak (Liberator)": ItemData(374 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 24, classification=ItemClassification.filler, parent_item="Liberator", origin={"nco"}),
-    "Laser Targeting System (Liberator)": ItemData(375 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 25, classification=ItemClassification.filler, parent_item="Liberator", origin={"ext"}),
-    "Optimized Logistics (Liberator)": ItemData(376 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 26, classification=ItemClassification.filler, parent_item="Liberator", origin={"nco"}),
-    "Black Market Launchers (Widow Mine)": ItemData(377 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 27, classification=ItemClassification.filler, parent_item="Widow Mine", origin={"ext"}),
-    "Executioner Missiles (Widow Mine)": ItemData(378 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 28, parent_item="Widow Mine", origin={"ext"}),
-
-    # Just lazy to create a new group for one unit
-    "Enhanced Cluster Launchers (Valkyrie)": ItemData(379 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 17, parent_item="Valkyrie", origin={"ext"}),
-    "Shaped Hull (Valkyrie)": ItemData(380 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 20, classification=ItemClassification.filler, parent_item="Valkyrie", origin={"ext"}),
-    "Burst Lasers (Valkyrie)": ItemData(381 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 21, parent_item="Valkyrie", origin={"ext"}),
-    "Afterburners (Valkyrie)": ItemData(382 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 22, classification=ItemClassification.filler, parent_item="Valkyrie", origin={"ext"}),
-
-    "Bunker": ItemData(400 + SC2WOL_ITEM_ID_OFFSET, "Building", 0, classification=ItemClassification.progression),
-    "Missile Turret": ItemData(401 + SC2WOL_ITEM_ID_OFFSET, "Building", 1, classification=ItemClassification.progression),
-    "Sensor Tower": ItemData(402 + SC2WOL_ITEM_ID_OFFSET, "Building", 2),
-
-    "War Pigs": ItemData(500 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 0, classification=ItemClassification.progression),
-    "Devil Dogs": ItemData(501 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 1, classification=ItemClassification.filler),
-    "Hammer Securities": ItemData(502 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 2),
-    "Spartan Company": ItemData(503 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 3, classification=ItemClassification.progression),
-    "Siege Breakers": ItemData(504 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 4),
-    "Hel's Angel": ItemData(505 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 5, classification=ItemClassification.progression),
-    "Dusk Wings": ItemData(506 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 6),
-    "Jackson's Revenge": ItemData(507 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 7),
-
-    "Ultra-Capacitors": ItemData(600 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 0),
-    "Vanadium Plating": ItemData(601 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 1),
-    "Orbital Depots": ItemData(602 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 2),
-    "Micro-Filtering": ItemData(603 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 3),
-    "Automated Refinery": ItemData(604 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 4),
-    "Command Center Reactor": ItemData(605 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 5),
-    "Raven": ItemData(606 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 6),
-    "Science Vessel": ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, classification=ItemClassification.progression),
-    "Tech Reactor": ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8),
-    "Orbital Strike": ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9),
-    "Shrike Turret (Bunker)": ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, parent_item="Bunker"),
-    "Fortified Bunker (Bunker)": ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, parent_item="Bunker"),
-    "Planetary Fortress": ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12, classification=ItemClassification.progression),
-    "Perdition Turret": ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 13, classification=ItemClassification.progression),
-    "Predator": ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 14, classification=ItemClassification.filler),
-    "Hercules": ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 15, classification=ItemClassification.progression),
-    "Cellular Reactor": ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 16),
-    "Progressive Regenerative Bio-Steel": ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 4, quantity=2),
-    "Hive Mind Emulator": ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 18, ItemClassification.progression),
-    "Psi Disrupter": ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 19, classification=ItemClassification.progression),
-
-    "Zealot": ItemData(700 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 0, classification=ItemClassification.progression),
-    "Stalker": ItemData(701 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 1, classification=ItemClassification.progression),
-    "High Templar": ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 2, classification=ItemClassification.progression),
-    "Dark Templar": ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 3, classification=ItemClassification.progression),
-    "Immortal": ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 4, classification=ItemClassification.progression),
-    "Colossus": ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 5),
-    "Phoenix": ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 6, classification=ItemClassification.filler),
-    "Void Ray": ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 7, classification=ItemClassification.progression),
-    "Carrier": ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 8, classification=ItemClassification.progression),
-
-    # Filler items to fill remaining spots
-    "+15 Starting Minerals": ItemData(800 + SC2WOL_ITEM_ID_OFFSET, "Minerals", 15, quantity=0, classification=ItemClassification.filler),
-    "+15 Starting Vespene": ItemData(801 + SC2WOL_ITEM_ID_OFFSET, "Vespene", 15, quantity=0, classification=ItemClassification.filler),
-    # This Filler item isn't placed by the generator yet unless plando'd
-    "+2 Starting Supply": ItemData(802 + SC2WOL_ITEM_ID_OFFSET, "Supply", 2, quantity=0, classification=ItemClassification.filler),
-    # This item is used to "remove" location from the game. Never placed unless plando'd
-    "Nothing": ItemData(803 + SC2WOL_ITEM_ID_OFFSET, "Nothing Group", 2, quantity=0, classification=ItemClassification.trap),
-
-    # "Keystone Piece": ItemData(850 + SC2WOL_ITEM_ID_OFFSET, "Goal", 0, quantity=0, classification=ItemClassification.progression_skip_balancing)
-}
-
-def get_item_table(multiworld: MultiWorld, player: int):
-    return item_table
-
-basic_units = {
-    'Marine',
-    'Marauder',
-    'Goliath',
-    'Hellion',
-    'Vulture'
-}
-
-advanced_basic_units = basic_units.union({
-    'Reaper',
-    'Diamondback',
-    'Viking'
-})
-
-
-def get_basic_units(multiworld: MultiWorld, player: int) -> typing.Set[str]:
-    if get_option_value(multiworld, player, 'required_tactics') > 0:
-        return advanced_basic_units
-    else:
-        return basic_units
-
-
-item_name_groups = {}
-for item, data in get_full_item_list().items():
-    item_name_groups.setdefault(data.type, []).append(item)
-    if data.type in ("Armory 1", "Armory 2") and '(' in item:
-        short_name = item[:item.find(' (')]
-        item_name_groups[short_name] = [item]
-item_name_groups["Missions"] = ["Beat " + mission_name for mission_name in vanilla_mission_req_table]
-
-
-# Items that can be placed before resources if not already in
-# General upgrades and Mercs
-second_pass_placeable_items: typing.Tuple[str, ...] = (
-    # Buildings without upgrades
-    "Sensor Tower",
-    "Hive Mind Emulator",
-    "Psi Disrupter",
-    "Perdition Turret",
-    # General upgrades without any dependencies
-    "Advanced Construction (SCV)",
-    "Dual-Fusion Welders (SCV)",
-    "Fire-Suppression System (Building)",
-    "Orbital Command (Building)",
-    "Ultra-Capacitors",
-    "Vanadium Plating",
-    "Orbital Depots",
-    "Micro-Filtering",
-    "Automated Refinery",
-    "Command Center Reactor",
-    "Tech Reactor",
-    "Planetary Fortress",
-    "Cellular Reactor",
-    "Progressive Regenerative Bio-Steel",  # Place only L1
-    # Mercenaries
-    "War Pigs",
-    "Devil Dogs",
-    "Hammer Securities",
-    "Spartan Company",
-    "Siege Breakers",
-    "Hel's Angel",
-    "Dusk Wings",
-    "Jackson's Revenge"
-)
-
-
-filler_items: typing.Tuple[str, ...] = (
-    '+15 Starting Minerals',
-    '+15 Starting Vespene'
-)
-
-# Defense rating table
-# Commented defense ratings are handled in LogicMixin
-defense_ratings = {
-    "Siege Tank": 5,
-    # "Maelstrom Rounds": 2,
-    "Planetary Fortress": 3,
-    # Bunker w/ Marine/Marauder: 3,
-    "Perdition Turret": 2,
-    "Missile Turret": 2,
-    "Vulture": 2,
-    "Liberator": 2,
-    "Widow Mine": 2
-    # "Concealment (Widow Mine)": 1
-}
-zerg_defense_ratings = {
-    "Perdition Turret": 2,
-    # Bunker w/ Firebat: 2,
-    "Hive Mind Emulator": 3,
-    "Psi Disruptor": 3
-}
-
-spider_mine_sources = {
-    "Vulture",
-    "Spider Mines (Reaper)",
-    "Spider Mines (Siege Tank)",
-    "Spider Mines (Raven)"
-}
-
-progressive_if_nco = {
-    "Progressive Stimpack (Marine)",
-    "Progressive Stimpack (Firebat)",
-    "Progressive Cross-Spectrum Dampeners (Banshee)",
-    "Progressive Regenerative Bio-Steel"
-}
-
-# 'number' values of upgrades for upgrade bundle items
-upgrade_numbers = [
-    {0, 4, 8}, # Weapon
-    {2, 6, 10}, # Armor
-    {0, 2}, # Infantry
-    {4, 6}, # Vehicle
-    {8, 10}, # Starship
-    {0, 2, 4, 6, 8, 10} # All
-]
-# Names of upgrades to be included for different options
-upgrade_included_names = [
-    { # Individual Items
-        "Progressive Infantry Weapon",
-        "Progressive Infantry Armor",
-        "Progressive Vehicle Weapon",
-        "Progressive Vehicle Armor",
-        "Progressive Ship Weapon",
-        "Progressive Ship Armor"
-    },
-    { # Bundle Weapon And Armor
-        "Progressive Weapon Upgrade",
-        "Progressive Armor Upgrade"
-    },
-    { # Bundle Unit Class
-        "Progressive Infantry Upgrade",
-        "Progressive Vehicle Upgrade",
-        "Progressive Starship Upgrade"
-    },
-    { # Bundle All
-        "Progressive Weapon/Armor Upgrade"
-    }
-]
-
-lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if
-                                            data.code}
-# Map type to expected int
-type_flaggroups: typing.Dict[str, int] = {
-    "Unit": 0,
-    "Upgrade": 1,  # Weapon / Armor upgrades
-    "Armory 1": 2,  # Unit upgrades
-    "Armory 2": 3,  # Unit upgrades
-    "Building": 4,
-    "Mercenary": 5,
-    "Laboratory": 6,
-    "Protoss": 7,
-    "Minerals": 8,
-    "Vespene": 9,
-    "Supply": 10,
-    "Goal": 11,
-    "Armory 3": 12,  # Unit upgrades
-    "Armory 4": 13,  # Unit upgrades
-    "Progressive Upgrade": 14,  # Unit upgrades that exist multiple times (Stimpack / Super Stimpack)
-    "Nothing Group": 15
-}
diff --git a/worlds/sc2wol/Locations.py b/worlds/sc2wol/Locations.py
deleted file mode 100644
index fba70513..00000000
--- a/worlds/sc2wol/Locations.py
+++ /dev/null
@@ -1,516 +0,0 @@
-from enum import IntEnum
-from typing import List, Tuple, Optional, Callable, NamedTuple
-from BaseClasses import MultiWorld
-from .Options import get_option_value
-
-from BaseClasses import Location
-
-SC2WOL_LOC_ID_OFFSET = 1000
-
-
-class SC2WoLLocation(Location):
-    game: str = "Starcraft2WoL"
-
-
-class LocationType(IntEnum):
-    VICTORY = 0 # Winning a mission
-    MISSION_PROGRESS = 1 # All tasks done for progressing the mission normally towards victory. All cleaning of expansion bases falls here
-    BONUS = 2 # Bonus objective, getting a campaign or mission bonus in vanilla (credits, research, bonus units or resources)
-    CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission
-    OPTIONAL_BOSS = 4 # Any boss that's not required to win the mission. All Brutalisks, Loki, etc.
-
-class LocationData(NamedTuple):
-    region: str
-    name: str
-    code: Optional[int]
-    type: LocationType
-    rule: Callable = lambda state: True
-
-
-def get_locations(multiworld: Optional[MultiWorld], player: Optional[int]) -> Tuple[LocationData, ...]:
-    # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option
-    logic_level = get_option_value(multiworld, player, 'required_tactics')
-    location_table: List[LocationData] = [
-        LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100, LocationType.VICTORY),
-        LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101, LocationType.BONUS),
-        LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102, LocationType.BONUS),
-        LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103, LocationType.BONUS),
-        LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104, LocationType.BONUS),
-        LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105, LocationType.BONUS),
-        LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106, LocationType.BONUS),
-        LocationData("Liberation Day", "Liberation Day: Special Delivery", SC2WOL_LOC_ID_OFFSET + 107, LocationType.MISSION_PROGRESS),
-        LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("The Outlaws", "The Outlaws: North Resource Pickups", SC2WOL_LOC_ID_OFFSET + 202, LocationType.BONUS),
-        LocationData("The Outlaws", "The Outlaws: Bunker", SC2WOL_LOC_ID_OFFSET + 203, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) >= 2 and
-                                   (logic_level > 0 or state._sc2wol_has_anti_air(multiworld, player))),
-        LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301, LocationType.BONUS),
-        LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) >= 2),
-        LocationData("Zero Hour", "Zero Hour: First Hatchery", SC2WOL_LOC_ID_OFFSET + 304, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Zero Hour", "Zero Hour: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 305, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Zero Hour", "Zero Hour: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 306, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Zero Hour", "Zero Hour: Fourth Hatchery", SC2WOL_LOC_ID_OFFSET + 307, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("Evacuation", "Evacuation: North Chrysalis", SC2WOL_LOC_ID_OFFSET + 401, LocationType.BONUS),
-        LocationData("Evacuation", "Evacuation: West Chrysalis", SC2WOL_LOC_ID_OFFSET + 402, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Evacuation", "Evacuation: East Chrysalis", SC2WOL_LOC_ID_OFFSET + 403, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Evacuation", "Evacuation: Reach Hanson", SC2WOL_LOC_ID_OFFSET + 404, LocationType.MISSION_PROGRESS),
-        LocationData("Evacuation", "Evacuation: Secret Resource Stash", SC2WOL_LOC_ID_OFFSET + 405, LocationType.BONUS),
-        LocationData("Evacuation", "Evacuation: Flawless", SC2WOL_LOC_ID_OFFSET + 406, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, LocationType.VICTORY,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 4 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, LocationType.BONUS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, LocationType.BONUS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: North Infested Command Center", SC2WOL_LOC_ID_OFFSET + 503, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: South Infested Command Center", SC2WOL_LOC_ID_OFFSET + 504, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: Northwest Bar", SC2WOL_LOC_ID_OFFSET + 505, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: North Bar", SC2WOL_LOC_ID_OFFSET + 506, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Outbreak", "Outbreak: South Bar", SC2WOL_LOC_ID_OFFSET + 507, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
-                                   (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Safe Haven", "Safe Haven: First Terror Fleet", SC2WOL_LOC_ID_OFFSET + 604, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Safe Haven", "Safe Haven: Second Terror Fleet", SC2WOL_LOC_ID_OFFSET + 605, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Safe Haven", "Safe Haven: Third Terror Fleet", SC2WOL_LOC_ID_OFFSET + 606, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player)),
-        LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) >= 3),
-        LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) >= 3),
-        LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) >= 3),
-        LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) >= 3),
-        LocationData("Haven's Fall", "Haven's Fall: Northeast Colony Base", SC2WOL_LOC_ID_OFFSET + 704, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_can_respond_to_colony_infestations),
-        LocationData("Haven's Fall", "Haven's Fall: East Colony Base", SC2WOL_LOC_ID_OFFSET + 705, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_can_respond_to_colony_infestations),
-        LocationData("Haven's Fall", "Haven's Fall: Middle Colony Base", SC2WOL_LOC_ID_OFFSET + 706, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_can_respond_to_colony_infestations),
-        LocationData("Haven's Fall", "Haven's Fall: Southeast Colony Base", SC2WOL_LOC_ID_OFFSET + 707, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_can_respond_to_colony_infestations),
-        LocationData("Haven's Fall", "Haven's Fall: Southwest Colony Base", SC2WOL_LOC_ID_OFFSET + 708, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_can_respond_to_colony_infestations),
-        LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801, LocationType.BONUS),
-        LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802, LocationType.BONUS),
-        LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("Smash and Grab", "Smash and Grab: First Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 805, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("Smash and Grab", "Smash and Grab: Second Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 806, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
-                                    or state._sc2wol_has_competent_anti_air(multiworld, player))),
-        LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_anti_air(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, False) >= 7),
-        LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, LocationType.BONUS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5),
-        LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, LocationType.BONUS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5),
-        LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, LocationType.BONUS,
-                     lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5),
-        LocationData("The Dig", "The Dig: Moebius Base", SC2WOL_LOC_ID_OFFSET + 904, LocationType.MISSION_PROGRESS),
-        LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_anti_air(multiworld, player) and
-                                   (state._sc2wol_has_air(multiworld, player)
-                                    or state.has_any({'Medivac', 'Hercules'}, player)
-                                    and state._sc2wol_has_common_unit(multiworld, player))),
-        LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core", SC2WOL_LOC_ID_OFFSET + 1001, LocationType.MISSION_PROGRESS),
-        LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002, LocationType.MISSION_PROGRESS,
-                     lambda state: (state._sc2wol_has_air(multiworld, player)
-                                    or state.has_any({'Medivac', 'Hercules'}, player)
-                                    and state._sc2wol_has_common_unit(multiworld, player))),
-        LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, LocationType.BONUS,
-                     lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
-        LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, LocationType.BONUS,
-                     lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
-        LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, LocationType.BONUS,
-                     lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
-        LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, LocationType.BONUS,
-                     lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
-        LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, LocationType.BONUS,
-                     lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
-        LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, LocationType.OPTIONAL_BOSS,
-                     lambda state: state._sc2wol_has_anti_air(multiworld, player) and
-                                   (state._sc2wol_has_air(multiworld, player)
-                                    or state.has_any({'Medivac', 'Hercules'}, player)
-                                    and state._sc2wol_has_common_unit(multiworld, player))),
-        LocationData("The Moebius Factor", "The Moebius Factor: 3rd Data Core", SC2WOL_LOC_ID_OFFSET + 1009, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_anti_air(multiworld, player) and
-                                   (state._sc2wol_has_air(multiworld, player)
-                                    or state.has_any({'Medivac', 'Hercules'}, player)
-                                    and state._sc2wol_has_common_unit(multiworld, player))),
-        LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, LocationType.VICTORY,
-                     lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101, LocationType.BONUS),
-        LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102, LocationType.BONUS),
-        LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, LocationType.BONUS,
-                     lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, LocationType.BONUS,
-                     lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Supernova", "Supernova: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1105, LocationType.MISSION_PROGRESS),
-        LocationData("Supernova", "Supernova: Middle Base", SC2WOL_LOC_ID_OFFSET + 1106, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Supernova", "Supernova: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1107, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, LocationType.VICTORY,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201, LocationType.MISSION_PROGRESS),
-        LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, LocationType.BONUS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, LocationType.BONUS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Mothership", SC2WOL_LOC_ID_OFFSET + 1206, LocationType.OPTIONAL_BOSS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Expansion Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1207, LocationType.MISSION_PROGRESS,
-                     lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Middle Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1208, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Southeast Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1209, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Stargate Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1210, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Northwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1211, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: West Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1212, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Maw of the Void", "Maw of the Void: Southwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1213, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
-        LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, LocationType.VICTORY,
-                     lambda state: logic_level > 0 or
-                                   state._sc2wol_has_anti_air(multiworld, player) and (
-                                           state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301, LocationType.BONUS),
-        LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, LocationType.OPTIONAL_BOSS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)),
-        LocationData("Devil's Playground", "Devil's Playground: North Reapers", SC2WOL_LOC_ID_OFFSET + 1303, LocationType.BONUS),
-        LocationData("Devil's Playground", "Devil's Playground: Middle Reapers", SC2WOL_LOC_ID_OFFSET + 1304, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)),
-        LocationData("Devil's Playground", "Devil's Playground: Southwest Reapers", SC2WOL_LOC_ID_OFFSET + 1305, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)),
-        LocationData("Devil's Playground", "Devil's Playground: Southeast Reapers", SC2WOL_LOC_ID_OFFSET + 1306, LocationType.BONUS,
-                     lambda state: logic_level > 0 or
-                                   state._sc2wol_has_anti_air(multiworld, player) and (
-                                           state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Devil's Playground", "Devil's Playground: East Reapers", SC2WOL_LOC_ID_OFFSET + 1307, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_anti_air(multiworld, player) and
-                                    (logic_level > 0 or
-                                           state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401, LocationType.BONUS),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, LocationType.BONUS,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, LocationType.BONUS,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Middle Base", SC2WOL_LOC_ID_OFFSET + 1404, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Main Base", SC2WOL_LOC_ID_OFFSET + 1405, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
-                                    and state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: No Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1406, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
-                                    and state._sc2wol_has_competent_ground_to_air(multiworld, player)
-                                   and state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 1 Terrazine Node Sealed", SC2WOL_LOC_ID_OFFSET + 1407, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
-                                   and state._sc2wol_has_competent_ground_to_air(multiworld, player)
-                                   and state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 2 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1408, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
-                                   and state._sc2wol_beats_protoss_deathball(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 3 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1409, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
-                                   and state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 4 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1410, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
-        LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 5 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1411, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
-        LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500, LocationType.VICTORY),
-        LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501, LocationType.BONUS),
-        LocationData("Breakout", "Breakout: Siege Tank Prison", SC2WOL_LOC_ID_OFFSET + 1502, LocationType.BONUS),
-        LocationData("Breakout", "Breakout: First Checkpoint", SC2WOL_LOC_ID_OFFSET + 1503, LocationType.MISSION_PROGRESS),
-        LocationData("Breakout", "Breakout: Second Checkpoint", SC2WOL_LOC_ID_OFFSET + 1504, LocationType.MISSION_PROGRESS),
-        LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600, LocationType.VICTORY),
-        LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601, LocationType.MISSION_PROGRESS),
-        LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602, LocationType.MISSION_PROGRESS),
-        LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603, LocationType.BONUS),
-        LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604, LocationType.BONUS),
-        LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_train_killers(multiworld, player) and
-                                   state._sc2wol_has_anti_air(multiworld, player)),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Close Diamondback", SC2WOL_LOC_ID_OFFSET + 1704, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Northwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1705, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: North Diamondback", SC2WOL_LOC_ID_OFFSET + 1706, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Northeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1707, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Southwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1708, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Southeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1709, LocationType.BONUS),
-        LocationData("The Great Train Robbery", "The Great Train Robbery: Kill Team", SC2WOL_LOC_ID_OFFSET + 1710, LocationType.CHALLENGE,
-                     lambda state: (logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player)) and
-                                   state._sc2wol_has_train_killers(multiworld, player) and
-                                   state._sc2wol_has_anti_air(multiworld, player)),
-        LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player) and
-                                   (logic_level > 0 or state._sc2wol_has_anti_air)),
-        LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803, LocationType.BONUS),
-        LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Cutthroat", "Cutthroat: North Command Center", SC2WOL_LOC_ID_OFFSET + 1805, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Cutthroat", "Cutthroat: South Command Center", SC2WOL_LOC_ID_OFFSET + 1806, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Cutthroat", "Cutthroat: West Command Center", SC2WOL_LOC_ID_OFFSET + 1807, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_common_unit(multiworld, player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901, LocationType.MISSION_PROGRESS),
-        LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902, LocationType.OPTIONAL_BOSS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903, LocationType.BONUS),
-        LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: West Base", SC2WOL_LOC_ID_OFFSET + 1906, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Northwest Base", SC2WOL_LOC_ID_OFFSET + 1907, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Northeast Base", SC2WOL_LOC_ID_OFFSET + 1908, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Engine of Destruction", "Engine of Destruction: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1909, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
-                                   state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
-        LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004, LocationType.BONUS),
-        LocationData("Media Blitz", "Media Blitz: All Barracks", SC2WOL_LOC_ID_OFFSET + 2005, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: All Factories", SC2WOL_LOC_ID_OFFSET + 2006, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: All Starports", SC2WOL_LOC_ID_OFFSET + 2007, LocationType.MISSION_PROGRESS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Media Blitz", "Media Blitz: Odin Not Trashed", SC2WOL_LOC_ID_OFFSET + 2008, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101, LocationType.BONUS),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103,LocationType.BONUS,
-                     lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, LocationType.OPTIONAL_BOSS,
-                     lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
-        LocationData("Piercing the Shroud", "Piercing the Shroud: Fusion Reactor", SC2WOL_LOC_ID_OFFSET + 2106, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
-        LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200, LocationType.VICTORY),
-        LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201, LocationType.BONUS),
-        LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202, LocationType.BONUS),
-        LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203, LocationType.BONUS),
-        LocationData("Whispers of Doom", "Whispers of Doom: First Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2204, LocationType.MISSION_PROGRESS),
-        LocationData("Whispers of Doom", "Whispers of Doom: Second Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2205, LocationType.MISSION_PROGRESS),
-        LocationData("Whispers of Doom", "Whispers of Doom: Third Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2206, LocationType.MISSION_PROGRESS),
-        LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Northeast Base", SC2WOL_LOC_ID_OFFSET + 2304, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Southwest Base", SC2WOL_LOC_ID_OFFSET + 2305, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Maar", SC2WOL_LOC_ID_OFFSET + 2306, LocationType.MISSION_PROGRESS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Northwest Preserver", SC2WOL_LOC_ID_OFFSET + 2307, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: Southwest Preserver", SC2WOL_LOC_ID_OFFSET + 2308, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("A Sinister Turn", "A Sinister Turn: East Preserver", SC2WOL_LOC_ID_OFFSET + 2309, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, LocationType.VICTORY,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401, LocationType.BONUS),
-        LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, LocationType.BONUS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("Echoes of the Future", "Echoes of the Future: Base", SC2WOL_LOC_ID_OFFSET + 2403, LocationType.MISSION_PROGRESS),
-        LocationData("Echoes of the Future", "Echoes of the Future: Southwest Tendril", SC2WOL_LOC_ID_OFFSET + 2404, LocationType.MISSION_PROGRESS),
-        LocationData("Echoes of the Future", "Echoes of the Future: Southeast Tendril", SC2WOL_LOC_ID_OFFSET + 2405, LocationType.MISSION_PROGRESS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("Echoes of the Future", "Echoes of the Future: Northeast Tendril", SC2WOL_LOC_ID_OFFSET + 2406, LocationType.MISSION_PROGRESS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("Echoes of the Future", "Echoes of the Future: Northwest Tendril", SC2WOL_LOC_ID_OFFSET + 2407, LocationType.MISSION_PROGRESS,
-                     lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500, LocationType.VICTORY),
-        LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
-        LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, LocationType.CHALLENGE,
-                     lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("In Utter Darkness", "In Utter Darkness: Urun", SC2WOL_LOC_ID_OFFSET + 2503, LocationType.MISSION_PROGRESS),
-        LocationData("In Utter Darkness", "In Utter Darkness: Mohandar", SC2WOL_LOC_ID_OFFSET + 2504, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("In Utter Darkness", "In Utter Darkness: Selendis", SC2WOL_LOC_ID_OFFSET + 2505, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("In Utter Darkness", "In Utter Darkness: Artanis", SC2WOL_LOC_ID_OFFSET + 2506, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
-        LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) > 6),
-        LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) > 6),
-        LocationData("Gates of Hell", "Gates of Hell: 2 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2602, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) > 6),
-        LocationData("Gates of Hell", "Gates of Hell: 4 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2603, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) > 6),
-        LocationData("Gates of Hell", "Gates of Hell: 6 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2604, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) > 6),
-        LocationData("Gates of Hell", "Gates of Hell: 8 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2605, LocationType.BONUS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
-                                   state._sc2wol_defense_rating(multiworld, player, True) > 6),
-        LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700, LocationType.VICTORY),
-        LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701, LocationType.MISSION_PROGRESS),
-        LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702, LocationType.MISSION_PROGRESS),
-        LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703, LocationType.MISSION_PROGRESS),
-        LocationData("Belly of the Beast", "Belly of the Beast: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 2704, LocationType.BONUS),
-        LocationData("Belly of the Beast", "Belly of the Beast: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 2705, LocationType.BONUS),
-        LocationData("Belly of the Beast", "Belly of the Beast: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 2706, LocationType.BONUS),
-        LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.OPTIONAL_BOSS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: East Hatchery", SC2WOL_LOC_ID_OFFSET + 2806, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: North Hatchery", SC2WOL_LOC_ID_OFFSET + 2807, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("Shatter the Sky", "Shatter the Sky: Mid Hatchery", SC2WOL_LOC_ID_OFFSET + 2808, LocationType.MISSION_PROGRESS,
-                     lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
-        LocationData("All-In", "All-In: Victory", None, LocationType.VICTORY,
-                     lambda state: state._sc2wol_final_mission_requirements(multiworld, player))
-    ]
-
-    beat_events = []
-
-    for i, location_data in enumerate(location_table):
-        # Removing all item-based logic on No Logic
-        if logic_level == 2:
-            location_data = location_data._replace(rule=Location.access_rule)
-            location_table[i] = location_data
-        # Generating Beat event locations
-        if location_data.name.endswith((": Victory", ": Defeat")):
-            beat_events.append(
-                location_data._replace(name="Beat " + location_data.name.rsplit(": ", 1)[0], code=None)
-            )
-    return tuple(location_table + beat_events)
diff --git a/worlds/sc2wol/LogicMixin.py b/worlds/sc2wol/LogicMixin.py
deleted file mode 100644
index 112302be..00000000
--- a/worlds/sc2wol/LogicMixin.py
+++ /dev/null
@@ -1,148 +0,0 @@
-from BaseClasses import MultiWorld
-from worlds.AutoWorld import LogicMixin
-from .Options import get_option_value
-from .Items import get_basic_units, defense_ratings, zerg_defense_ratings
-
-
-class SC2WoLLogic(LogicMixin):
-    def _sc2wol_has_common_unit(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has_any(get_basic_units(multiworld, player), player)
-
-    def _sc2wol_has_air(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has_any({'Viking', 'Wraith', 'Banshee', 'Battlecruiser'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 \
-                and self.has_any({'Hercules', 'Medivac'}, player) and self._sc2wol_has_common_unit(multiworld, player)
-
-    def _sc2wol_has_air_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has('Viking', player) \
-                or self.has_all({'Wraith', 'Advanced Laser Technology (Wraith)'}, player) \
-                or self.has_all({'Battlecruiser', 'ATX Laser Battery (Battlecruiser)'}, player) \
-                or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Wraith', 'Valkyrie', 'Battlecruiser'}, player)
-
-    def _sc2wol_has_competent_ground_to_air(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has('Goliath', player) \
-                or self.has('Marine', player) and self.has_any({'Medic', 'Medivac'}, player) \
-                or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Cyclone', player)
-
-    def _sc2wol_has_competent_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
-        return self._sc2wol_has_competent_ground_to_air(multiworld, player) \
-                or self._sc2wol_has_air_anti_air(multiworld, player)
-
-    def _sc2wol_welcome_to_the_jungle_requirement(self, multiworld: MultiWorld, player: int) -> bool:
-        return (
-                self._sc2wol_has_common_unit(multiworld, player)
-                and self._sc2wol_has_competent_ground_to_air(multiworld, player)
-        ) or (
-                get_option_value(multiworld, player, 'required_tactics') > 0
-                and self.has_any({'Marine', 'Vulture'}, player)
-                and self._sc2wol_has_air_anti_air(multiworld, player)
-        )
-
-    def _sc2wol_has_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has_any({'Missile Turret', 'Thor', 'War Pigs', 'Spartan Company', "Hel's Angel", 'Battlecruiser', 'Marine', 'Wraith', 'Valkyrie', 'Cyclone'}, player) \
-                or self._sc2wol_has_competent_anti_air(multiworld, player) \
-                or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre', 'Widow Mine', 'Liberator'}, player)
-
-    def _sc2wol_defense_rating(self, multiworld: MultiWorld, player: int, zerg_enemy: bool, air_enemy: bool = True) -> bool:
-        defense_score = sum((defense_ratings[item] for item in defense_ratings if self.has(item, player)))
-        if self.has_any({'Marine', 'Marauder'}, player) and self.has('Bunker', player):
-            defense_score += 3
-        if self.has_all({'Siege Tank', 'Maelstrom Rounds (Siege Tank)'}, player):
-            defense_score += 2
-        if self.has_all({'Siege Tank', 'Graduating Range (Siege Tank)'}, player):
-            defense_score += 1
-        if self.has_all({'Widow Mine', 'Concealment (Widow Mine)'}, player):
-            defense_score += 1
-        if zerg_enemy:
-            defense_score += sum((zerg_defense_ratings[item] for item in zerg_defense_ratings if self.has(item, player)))
-            if self.has('Firebat', player) and self.has('Bunker', player):
-                defense_score += 2
-        if not air_enemy and self.has('Missile Turret', player):
-            defense_score -= defense_ratings['Missile Turret']
-        # Advanced Tactics bumps defense rating requirements down by 2
-        if get_option_value(multiworld, player, 'required_tactics') > 0:
-            defense_score += 2
-        return defense_score
-
-    def _sc2wol_has_competent_comp(self, multiworld: MultiWorld, player: int) -> bool:
-        return \
-                (
-                        (
-                                self.has_any({'Marine', 'Marauder'}, player) and self.has_any({'Medivac', 'Medic'}, player)
-                                or self.has_any({'Thor', 'Banshee', 'Siege Tank'}, player)
-                                or self.has_all({'Liberator', 'Raid Artillery (Liberator)'}, player)
-                        ) and self._sc2wol_has_competent_anti_air(multiworld, player)
-                ) \
-                or \
-                (
-                        self.has('Battlecruiser', player) and self._sc2wol_has_common_unit(multiworld, player)
-                )
-
-    def _sc2wol_has_train_killers(self, multiworld: MultiWorld, player: int) -> bool:
-        return (
-                self.has_any({'Siege Tank', 'Diamondback', 'Marauder', 'Cyclone'}, player)
-                or get_option_value(multiworld, player, 'required_tactics') > 0
-                and (
-                        self.has_all({'Reaper', "G-4 Clusterbomb"}, player)
-                        or self.has_all({'Spectre', 'Psionic Lash'}, player)
-                        or self.has_any({'Vulture', 'Liberator'}, player)
-                )
-        )
-
-    def _sc2wol_able_to_rescue(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has_any({'Medivac', 'Hercules', 'Raven', 'Viking'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0
-
-    def _sc2wol_has_protoss_common_units(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has_any({'Zealot', 'Immortal', 'Stalker', 'Dark Templar'}, player) \
-                or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('High Templar', player)
-
-    def _sc2wol_has_protoss_medium_units(self, multiworld: MultiWorld, player: int) -> bool:
-        return self._sc2wol_has_protoss_common_units(multiworld, player) and \
-               self.has_any({'Stalker', 'Void Ray', 'Carrier'}, player) \
-               or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Dark Templar', player)
-
-    def _sc2wol_beats_protoss_deathball(self, multiworld: MultiWorld, player: int) -> bool:
-        return (self.has_any({'Banshee', 'Battlecruiser'}, player) or
-                self.has_all({'Liberator', 'Raid Artillery (Liberator)'}, player)) \
-            and self._sc2wol_has_competent_anti_air(multiworld, player) or \
-            self._sc2wol_has_competent_comp(multiworld, player) and self._sc2wol_has_air_anti_air(multiworld, player)
-
-    def _sc2wol_has_mm_upgrade(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has_any({"Combat Shield (Marine)", "Stabilizer Medpacks (Medic)"}, player)
-
-    def _sc2wol_survives_rip_field(self, multiworld: MultiWorld, player: int) -> bool:
-        return self.has("Battlecruiser", player) or \
-           self._sc2wol_has_air(multiworld, player) and \
-           self._sc2wol_has_competent_anti_air(multiworld, player) and \
-           self.has("Science Vessel", player)
-
-    def _sc2wol_has_nukes(self, multiworld: MultiWorld, player: int) -> bool:
-        return get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre'}, player)
-
-    def _sc2wol_can_respond_to_colony_infestations(self, multiworld: MultiWorld, player: int) -> bool:
-        return self._sc2wol_has_common_unit(multiworld, player) \
-            and self._sc2wol_has_competent_anti_air(multiworld, player) \
-            and \
-                (
-                    self._sc2wol_has_air_anti_air(multiworld, player) or
-                    self.has_any({'Battlecruiser', 'Valkyrie'}), player
-                ) \
-            and \
-            self._sc2wol_defense_rating(multiworld, player, True) >= 3
-
-    def _sc2wol_final_mission_requirements(self, multiworld: MultiWorld, player: int):
-        beats_kerrigan = self.has_any({'Marine', 'Banshee', 'Ghost'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0
-        if get_option_value(multiworld, player, 'all_in_map') == 0:
-            # Ground
-            defense_rating = self._sc2wol_defense_rating(multiworld, player, True, False)
-            if self.has_any({'Battlecruiser', 'Banshee'}, player):
-                defense_rating += 3
-            return defense_rating >= 12 and beats_kerrigan
-        else:
-            # Air
-            defense_rating = self._sc2wol_defense_rating(multiworld, player, True, True)
-            return defense_rating >= 8 and beats_kerrigan \
-                and self.has_any({'Viking', 'Battlecruiser', 'Valkyrie'}, player) \
-                and self.has_any({'Hive Mind Emulator', 'Psi Disruptor', 'Missile Turret'}, player)
-
-    def _sc2wol_cleared_missions(self, multiworld: MultiWorld, player: int, mission_count: int) -> bool:
-        return self.has_group("Missions", player, mission_count)
diff --git a/worlds/sc2wol/MissionTables.py b/worlds/sc2wol/MissionTables.py
deleted file mode 100644
index 298cd7a9..00000000
--- a/worlds/sc2wol/MissionTables.py
+++ /dev/null
@@ -1,230 +0,0 @@
-from typing import NamedTuple, Dict, List
-from enum import IntEnum
-
-no_build_regions_list = ["Liberation Day", "Breakout", "Ghost of a Chance", "Piercing the Shroud", "Whispers of Doom",
-                         "Belly of the Beast"]
-easy_regions_list = ["The Outlaws", "Zero Hour", "Evacuation", "Outbreak", "Smash and Grab", "Devil's Playground"]
-medium_regions_list = ["Safe Haven", "Haven's Fall", "The Dig", "The Moebius Factor", "Supernova",
-                       "Welcome to the Jungle", "The Great Train Robbery", "Cutthroat", "Media Blitz",
-                       "A Sinister Turn", "Echoes of the Future"]
-hard_regions_list = ["Maw of the Void", "Engine of Destruction", "In Utter Darkness", "Gates of Hell",
-                     "Shatter the Sky"]
-
-
-class MissionPools(IntEnum):
-    STARTER = 0
-    EASY = 1
-    MEDIUM = 2
-    HARD = 3
-    FINAL = 4
-
-
-class MissionInfo(NamedTuple):
-    id: int
-    required_world: List[int]
-    category: str
-    number: int = 0  # number of worlds need beaten
-    completion_critical: bool = False  # missions needed to beat game
-    or_requirements: bool = False  # true if the requirements should be or-ed instead of and-ed
-
-
-class FillMission(NamedTuple):
-    type: int
-    connect_to: List[int]  # -1 connects to Menu
-    category: str
-    number: int = 0  # number of worlds need beaten
-    completion_critical: bool = False  # missions needed to beat game
-    or_requirements: bool = False  # true if the requirements should be or-ed instead of and-ed
-    removal_priority: int = 0  # how many missions missing from the pool required to remove this mission
-
-
-vanilla_shuffle_order = [
-    FillMission(MissionPools.STARTER, [-1], "Mar Sara", completion_critical=True),
-    FillMission(MissionPools.EASY, [0], "Mar Sara", completion_critical=True),
-    FillMission(MissionPools.EASY, [1], "Mar Sara", completion_critical=True),
-    FillMission(MissionPools.EASY, [2], "Colonist"),
-    FillMission(MissionPools.MEDIUM, [3], "Colonist"),
-    FillMission(MissionPools.HARD, [4], "Colonist", number=7),
-    FillMission(MissionPools.HARD, [4], "Colonist", number=7, removal_priority=1),
-    FillMission(MissionPools.EASY, [2], "Artifact", completion_critical=True),
-    FillMission(MissionPools.MEDIUM, [7], "Artifact", number=8, completion_critical=True),
-    FillMission(MissionPools.HARD, [8], "Artifact", number=11, completion_critical=True),
-    FillMission(MissionPools.HARD, [9], "Artifact", number=14, completion_critical=True, removal_priority=11),
-    FillMission(MissionPools.HARD, [10], "Artifact", completion_critical=True, removal_priority=10),
-    FillMission(MissionPools.MEDIUM, [2], "Covert", number=4),
-    FillMission(MissionPools.MEDIUM, [12], "Covert"),
-    FillMission(MissionPools.HARD, [13], "Covert", number=8, removal_priority=3),
-    FillMission(MissionPools.HARD, [13], "Covert", number=8, removal_priority=2),
-    FillMission(MissionPools.MEDIUM, [2], "Rebellion", number=6),
-    FillMission(MissionPools.HARD, [16], "Rebellion"),
-    FillMission(MissionPools.HARD, [17], "Rebellion"),
-    FillMission(MissionPools.HARD, [18], "Rebellion", removal_priority=12),
-    FillMission(MissionPools.HARD, [19], "Rebellion", removal_priority=5),
-    FillMission(MissionPools.MEDIUM, [8], "Prophecy", removal_priority=9),
-    FillMission(MissionPools.HARD, [21], "Prophecy", removal_priority=8),
-    FillMission(MissionPools.HARD, [22], "Prophecy", removal_priority=7),
-    FillMission(MissionPools.HARD, [23], "Prophecy", removal_priority=6),
-    FillMission(MissionPools.HARD, [11], "Char", completion_critical=True),
-    FillMission(MissionPools.HARD, [25], "Char", completion_critical=True, removal_priority=4),
-    FillMission(MissionPools.HARD, [25], "Char", completion_critical=True),
-    FillMission(MissionPools.FINAL, [26, 27], "Char", completion_critical=True, or_requirements=True)
-]
-
-mini_campaign_order = [
-    FillMission(MissionPools.STARTER, [-1], "Mar Sara", completion_critical=True),
-    FillMission(MissionPools.EASY, [0], "Colonist"),
-    FillMission(MissionPools.MEDIUM, [1], "Colonist"),
-    FillMission(MissionPools.EASY, [0], "Artifact", completion_critical=True),
-    FillMission(MissionPools.MEDIUM, [3], "Artifact", number=4, completion_critical=True),
-    FillMission(MissionPools.HARD, [4], "Artifact", number=8, completion_critical=True),
-    FillMission(MissionPools.MEDIUM, [0], "Covert", number=2),
-    FillMission(MissionPools.HARD, [6], "Covert"),
-    FillMission(MissionPools.MEDIUM, [0], "Rebellion", number=3),
-    FillMission(MissionPools.HARD, [8], "Rebellion"),
-    FillMission(MissionPools.MEDIUM, [4], "Prophecy"),
-    FillMission(MissionPools.HARD, [10], "Prophecy"),
-    FillMission(MissionPools.HARD, [5], "Char", completion_critical=True),
-    FillMission(MissionPools.HARD, [5], "Char", completion_critical=True),
-    FillMission(MissionPools.FINAL, [12, 13], "Char", completion_critical=True, or_requirements=True)
-]
-
-gauntlet_order = [
-    FillMission(MissionPools.STARTER, [-1], "I", completion_critical=True),
-    FillMission(MissionPools.EASY, [0], "II", completion_critical=True),
-    FillMission(MissionPools.EASY, [1], "III", completion_critical=True),
-    FillMission(MissionPools.MEDIUM, [2], "IV", completion_critical=True),
-    FillMission(MissionPools.MEDIUM, [3], "V", completion_critical=True),
-    FillMission(MissionPools.HARD, [4], "VI", completion_critical=True),
-    FillMission(MissionPools.FINAL, [5], "Final", completion_critical=True)
-]
-
-mini_gauntlet_order = [
-    FillMission(MissionPools.STARTER, [-1], "I", completion_critical=True),
-    FillMission(MissionPools.EASY, [0], "II", completion_critical=True),
-    FillMission(MissionPools.MEDIUM, [1], "III", completion_critical=True),
-    FillMission(MissionPools.FINAL, [2], "Final", completion_critical=True)
-]
-
-grid_order = [
-    FillMission(MissionPools.STARTER, [-1], "_1"),
-    FillMission(MissionPools.EASY, [0], "_1"),
-    FillMission(MissionPools.MEDIUM, [1, 6, 3], "_1", or_requirements=True),
-    FillMission(MissionPools.HARD, [2, 7], "_1", or_requirements=True),
-    FillMission(MissionPools.EASY, [0], "_2"),
-    FillMission(MissionPools.MEDIUM, [1, 4], "_2", or_requirements=True),
-    FillMission(MissionPools.HARD, [2, 5, 10, 7], "_2", or_requirements=True),
-    FillMission(MissionPools.HARD, [3, 6, 11], "_2", or_requirements=True),
-    FillMission(MissionPools.MEDIUM, [4, 9, 12], "_3", or_requirements=True),
-    FillMission(MissionPools.HARD, [5, 8, 10, 13], "_3", or_requirements=True),
-    FillMission(MissionPools.HARD, [6, 9, 11, 14], "_3", or_requirements=True),
-    FillMission(MissionPools.HARD, [7, 10], "_3", or_requirements=True),
-    FillMission(MissionPools.HARD, [8, 13], "_4", or_requirements=True),
-    FillMission(MissionPools.HARD, [9, 12, 14], "_4", or_requirements=True),
-    FillMission(MissionPools.HARD, [10, 13], "_4", or_requirements=True),
-    FillMission(MissionPools.FINAL, [11, 14], "_4", or_requirements=True)
-]
-
-mini_grid_order = [
-    FillMission(MissionPools.STARTER, [-1], "_1"),
-    FillMission(MissionPools.EASY, [0], "_1"),
-    FillMission(MissionPools.MEDIUM, [1, 5], "_1", or_requirements=True),
-    FillMission(MissionPools.EASY, [0], "_2"),
-    FillMission(MissionPools.MEDIUM, [1, 3], "_2", or_requirements=True),
-    FillMission(MissionPools.HARD, [2, 4], "_2", or_requirements=True),
-    FillMission(MissionPools.MEDIUM, [3, 7], "_3", or_requirements=True),
-    FillMission(MissionPools.HARD, [4, 6], "_3", or_requirements=True),
-    FillMission(MissionPools.FINAL, [5, 7], "_3", or_requirements=True)
-]
-
-tiny_grid_order = [
-    FillMission(MissionPools.STARTER, [-1], "_1"),
-    FillMission(MissionPools.MEDIUM, [0], "_1"),
-    FillMission(MissionPools.EASY, [0], "_2"),
-    FillMission(MissionPools.FINAL, [1, 2], "_2", or_requirements=True),
-]
-
-blitz_order = [
-    FillMission(MissionPools.STARTER, [-1], "I"),
-    FillMission(MissionPools.EASY, [-1], "I"),
-    FillMission(MissionPools.MEDIUM, [0, 1], "II", number=1, or_requirements=True),
-    FillMission(MissionPools.MEDIUM, [0, 1], "II", number=1, or_requirements=True),
-    FillMission(MissionPools.MEDIUM, [0, 1], "III", number=2, or_requirements=True),
-    FillMission(MissionPools.MEDIUM, [0, 1], "III", number=2, or_requirements=True),
-    FillMission(MissionPools.HARD, [0, 1], "IV", number=3, or_requirements=True),
-    FillMission(MissionPools.HARD, [0, 1], "IV", number=3, or_requirements=True),
-    FillMission(MissionPools.HARD, [0, 1], "V", number=4, or_requirements=True),
-    FillMission(MissionPools.HARD, [0, 1], "V", number=4, or_requirements=True),
-    FillMission(MissionPools.HARD, [0, 1], "Final", number=5, or_requirements=True),
-    FillMission(MissionPools.FINAL, [0, 1], "Final", number=5, or_requirements=True)
-]
-
-mission_orders = [
-    vanilla_shuffle_order,
-    vanilla_shuffle_order,
-    mini_campaign_order,
-    grid_order,
-    mini_grid_order,
-    blitz_order,
-    gauntlet_order,
-    mini_gauntlet_order,
-    tiny_grid_order
-]
-
-
-vanilla_mission_req_table = {
-    "Liberation Day": MissionInfo(1, [], "Mar Sara", completion_critical=True),
-    "The Outlaws": MissionInfo(2, [1], "Mar Sara", completion_critical=True),
-    "Zero Hour": MissionInfo(3, [2], "Mar Sara", completion_critical=True),
-    "Evacuation": MissionInfo(4, [3], "Colonist"),
-    "Outbreak": MissionInfo(5, [4], "Colonist"),
-    "Safe Haven": MissionInfo(6, [5], "Colonist", number=7),
-    "Haven's Fall": MissionInfo(7, [5], "Colonist", number=7),
-    "Smash and Grab": MissionInfo(8, [3], "Artifact", completion_critical=True),
-    "The Dig": MissionInfo(9, [8], "Artifact", number=8, completion_critical=True),
-    "The Moebius Factor": MissionInfo(10, [9], "Artifact", number=11, completion_critical=True),
-    "Supernova": MissionInfo(11, [10], "Artifact", number=14, completion_critical=True),
-    "Maw of the Void": MissionInfo(12, [11], "Artifact", completion_critical=True),
-    "Devil's Playground": MissionInfo(13, [3], "Covert", number=4),
-    "Welcome to the Jungle": MissionInfo(14, [13], "Covert"),
-    "Breakout": MissionInfo(15, [14], "Covert", number=8),
-    "Ghost of a Chance": MissionInfo(16, [14], "Covert", number=8),
-    "The Great Train Robbery": MissionInfo(17, [3], "Rebellion", number=6),
-    "Cutthroat": MissionInfo(18, [17], "Rebellion"),
-    "Engine of Destruction": MissionInfo(19, [18], "Rebellion"),
-    "Media Blitz": MissionInfo(20, [19], "Rebellion"),
-    "Piercing the Shroud": MissionInfo(21, [20], "Rebellion"),
-    "Whispers of Doom": MissionInfo(22, [9], "Prophecy"),
-    "A Sinister Turn": MissionInfo(23, [22], "Prophecy"),
-    "Echoes of the Future": MissionInfo(24, [23], "Prophecy"),
-    "In Utter Darkness": MissionInfo(25, [24], "Prophecy"),
-    "Gates of Hell": MissionInfo(26, [12], "Char", completion_critical=True),
-    "Belly of the Beast": MissionInfo(27, [26], "Char", completion_critical=True),
-    "Shatter the Sky": MissionInfo(28, [26], "Char", completion_critical=True),
-    "All-In": MissionInfo(29, [27, 28], "Char", completion_critical=True, or_requirements=True)
-}
-
-lookup_id_to_mission: Dict[int, str] = {
-    data.id: mission_name for mission_name, data in vanilla_mission_req_table.items() if data.id}
-
-starting_mission_locations = {
-    "Liberation Day": "Liberation Day: Victory",
-    "Breakout": "Breakout: Victory",
-    "Ghost of a Chance": "Ghost of a Chance: Victory",
-    "Piercing the Shroud": "Piercing the Shroud: Victory",
-    "Whispers of Doom": "Whispers of Doom: Victory",
-    "Belly of the Beast": "Belly of the Beast: Victory",
-    "Zero Hour": "Zero Hour: First Group Rescued",
-    "Evacuation": "Evacuation: Reach Hanson",
-    "Devil's Playground": "Devil's Playground: Tosh's Miners",
-    "Smash and Grab": "Smash and Grab: First Relic",
-    "The Great Train Robbery": "The Great Train Robbery: North Defiler"
-}
-
-
-alt_final_mission_locations = {
-    "Maw of the Void": "Maw of the Void: Victory",
-    "Engine of Destruction": "Engine of Destruction: Victory",
-    "Supernova": "Supernova: Victory",
-    "Gates of Hell": "Gates of Hell: Victory",
-    "Shatter the Sky": "Shatter the Sky: Victory"
-}
\ No newline at end of file
diff --git a/worlds/sc2wol/Options.py b/worlds/sc2wol/Options.py
deleted file mode 100644
index e4b6a740..00000000
--- a/worlds/sc2wol/Options.py
+++ /dev/null
@@ -1,362 +0,0 @@
-from typing import Dict, FrozenSet, Union
-from BaseClasses import MultiWorld
-from Options import Choice, Option, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range
-from .MissionTables import vanilla_mission_req_table
-
-ORDER_VANILLA = 0
-ORDER_VANILLA_SHUFFLED = 1
-
-class GameDifficulty(Choice):
-    """
-    The difficulty of the campaign, affects enemy AI, starting units, and game speed.
-
-    For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level
-    lower than the vanilla game
-    """
-    display_name = "Game Difficulty"
-    option_casual = 0
-    option_normal = 1
-    option_hard = 2
-    option_brutal = 3
-    default = 1
-
-class GameSpeed(Choice):
-    """Optional setting to override difficulty-based game speed."""
-    display_name = "Game Speed"
-    option_default = 0
-    option_slower = 1
-    option_slow = 2
-    option_normal = 3
-    option_fast = 4
-    option_faster = 5
-    default = option_default
-
-class FinalMap(Choice):
-    """
-    Determines if the final map and goal of the campaign.
-    All in: You need to beat All-in map
-    Random Hard: A random hard mission is selected as a goal.
-                Beat this mission in order to complete the game.
-                All-in map won't be in the campaign
-
-    Vanilla mission order always ends with All in mission!
-
-    Warning: Using All-in with a short mission order (7 or fewer missions) is not recommended,
-        as there might not be enough locations to place all the required items,
-        any excess required items will be placed into the player's starting inventory!
-
-    This option is short-lived. It may be changed in the future
-    """
-    display_name = "Final Map"
-    option_all_in = 0
-    option_random_hard = 1
-
-class AllInMap(Choice):
-    """Determines what version of All-In (final map) that will be generated for the campaign."""
-    display_name = "All In Map"
-    option_ground = 0
-    option_air = 1
-
-
-class MissionOrder(Choice):
-    """
-    Determines the order the missions are played in.  The last three mission orders end in a random mission.
-    Vanilla (29): Keeps the standard mission order and branching from the WoL Campaign.
-    Vanilla Shuffled (29): Keeps same branching paths from the WoL Campaign but randomizes the order of missions within.
-    Mini Campaign (15): Shorter version of the campaign with randomized missions and optional branches.
-    Grid (16):  A 4x4 grid of random missions.  Start at the top-left and forge a path towards bottom-right mission to win.
-    Mini Grid (9):  A 3x3 version of Grid.  Complete the bottom-right mission to win.
-    Blitz (12):  12 random missions that open up very quickly.  Complete the bottom-right mission to win.
-    Gauntlet (7): Linear series of 7 random missions to complete the campaign.
-    Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign.
-    Tiny Grid (4): A 2x2 version of Grid.  Complete the bottom-right mission to win.
-    """
-    display_name = "Mission Order"
-    option_vanilla = 0
-    option_vanilla_shuffled = 1
-    option_mini_campaign = 2
-    option_grid = 3
-    option_mini_grid = 4
-    option_blitz = 5
-    option_gauntlet = 6
-    option_mini_gauntlet = 7
-    option_tiny_grid = 8
-
-
-class PlayerColor(Choice):
-    """Determines in-game team color."""
-    display_name = "Player Color"
-    option_white = 0
-    option_red = 1
-    option_blue = 2
-    option_teal = 3
-    option_purple = 4
-    option_yellow = 5
-    option_orange = 6
-    option_green = 7
-    option_light_pink = 8
-    option_violet = 9
-    option_light_grey = 10
-    option_dark_green = 11
-    option_brown = 12
-    option_light_green = 13
-    option_dark_grey = 14
-    option_pink = 15
-    option_rainbow = 16
-    option_default = 17
-    default = option_default
-
-
-class ShuffleProtoss(DefaultOnToggle):
-    """Determines if the 3 protoss missions are included in the shuffle if Vanilla mission order is not enabled.
-    If turned off, the 3 protoss missions will not appear and Protoss units are removed from the pool."""
-    display_name = "Shuffle Protoss Missions"
-
-
-class ShuffleNoBuild(DefaultOnToggle):
-    """Determines if the 5 no-build missions are included in the shuffle if Vanilla mission order is not enabled.
-    If turned off, the 5 no-build missions will not appear."""
-    display_name = "Shuffle No-Build Missions"
-
-
-class EarlyUnit(DefaultOnToggle):
-    """
-    Guarantees that the first mission will contain a unit.
-
-    Each mission available to be the first mission has a pre-defined location where the unit should spawn.
-    This location gets overriden over any exclusion. It's guaranteed to be reachable with an empty inventory.
-    """
-    display_name = "Early Unit"
-
-
-class RequiredTactics(Choice):
-    """Determines the maximum tactical difficulty of the seed (separate from mission difficulty).  Higher settings
-    increase randomness.
-
-    Standard:  All missions can be completed with good micro and macro.
-    Advanced:  Completing missions may require relying on starting units and micro-heavy units.
-    No Logic:  Units and upgrades may be placed anywhere.  LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES!"""
-    display_name = "Required Tactics"
-    option_standard = 0
-    option_advanced = 1
-    option_no_logic = 2
-
-
-class UnitsAlwaysHaveUpgrades(DefaultOnToggle):
-    """
-    If turned on, all upgrades will be present for each unit and structure in the seed.
-    This usually results in fewer units.
-
-    See also: Max Number of Upgrades
-    """
-    display_name = "Units Always Have Upgrades"
-
-
-class GenericUpgradeMissions(Range):
-    """Determines the percentage of missions in the mission order that must be completed before
-    level 1 of all weapon and armor upgrades is unlocked.  Level 2 upgrades require double the amount of missions,
-    and level 3 requires triple the amount.  The required amounts are always rounded down.
-    If set to 0, upgrades are instead added to the item pool and must be found to be used."""
-    display_name = "Generic Upgrade Missions"
-    range_start = 0
-    range_end = 100
-    default = 0
-
-
-class GenericUpgradeResearch(Choice):
-    """Determines how weapon and armor upgrades affect missions once unlocked.
-
-    Vanilla:  Upgrades must be researched as normal.
-    Auto In No-Build:  In No-Build missions, upgrades are automatically researched.
-    In all other missions, upgrades must be researched as normal.
-    Auto In Build:  In No-Build missions, upgrades are unavailable as normal.
-    In all other missions, upgrades are automatically researched.
-    Always Auto:  Upgrades are automatically researched in all missions."""
-    display_name = "Generic Upgrade Research"
-    option_vanilla = 0
-    option_auto_in_no_build = 1
-    option_auto_in_build = 2
-    option_always_auto = 3
-
-
-class GenericUpgradeItems(Choice):
-    """Determines how weapon and armor upgrades are split into items.  All options produce 3 levels of each item.
-    Does nothing if upgrades are unlocked by completed mission counts.
-
-    Individual Items:  All weapon and armor upgrades are each an item,
-    resulting in 18 total upgrade items.
-    Bundle Weapon And Armor:  All types of weapon upgrades are one item,
-    and all types of armor upgrades are one item,
-    resulting in 6 total items.
-    Bundle Unit Class:  Weapon and armor upgrades are merged,
-    but Infantry, Vehicle, and Starship upgrades are bundled separately,
-    resulting in 9 total items.
-    Bundle All:  All weapon and armor upgrades are one item,
-    resulting in 3 total items."""
-    display_name = "Generic Upgrade Items"
-    option_individual_items = 0
-    option_bundle_weapon_and_armor = 1
-    option_bundle_unit_class = 2
-    option_bundle_all = 3
-
-
-class NovaCovertOpsItems(Toggle):
-    """If turned on, the equipment upgrades from Nova Covert Ops may be present in the world."""
-    display_name = "Nova Covert Ops Items"
-    default = Toggle.option_true
-
-
-class BroodWarItems(Toggle):
-    """If turned on, returning items from StarCraft: Brood War may appear in the world."""
-    display_name = "Brood War Items"
-    default = Toggle.option_true
-
-
-class ExtendedItems(Toggle):
-    """If turned on, original items that did not appear in Campaign mode may appear in the world."""
-    display_name = "Extended Items"
-    default = Toggle.option_true
-
-
-class MaxNumberOfUpgrades(Range):
-    """
-    Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited.
-    Note that most unit have 4 or 6 upgrades.
-
-    If used with Units Always Have Upgrades, each unit has this given amount of upgrades (if there enough upgrades exist)
-
-    See also: Units Always Have Upgrades
-    """
-    display_name = "Maximum number of upgrades per unit/structure"
-    range_start = -1
-    # Do not know the maximum, but it is less than 123!
-    range_end = 123
-    default = -1
-
-
-class LockedItems(ItemSet):
-    """Guarantees that these items will be unlockable"""
-    display_name = "Locked Items"
-
-
-class ExcludedItems(ItemSet):
-    """Guarantees that these items will not be unlockable"""
-    display_name = "Excluded Items"
-
-
-class ExcludedMissions(OptionSet):
-    """Guarantees that these missions will not appear in the campaign
-    Doesn't apply to vanilla mission order.
-    It may be impossible to build a valid campaign if too many missions are excluded."""
-    display_name = "Excluded Missions"
-    valid_keys = {mission_name for mission_name in vanilla_mission_req_table.keys() if mission_name != 'All-In'}
-
-
-class LocationInclusion(Choice):
-    option_enabled = 0
-    option_trash = 1
-    option_nothing = 2
-
-
-class MissionProgressLocations(LocationInclusion):
-    """
-    Enables or disables item rewards for progressing (not finishing) a mission.
-    Progressing a mission is usually a task of completing or progressing into a main objective.
-    Clearing an expansion base also counts here.
-
-    Enabled: All locations fitting into this do their normal rewards
-    Trash: Forces a trash item in
-    Nothing: No rewards for this type of tasks, effectively disabling such locations
-
-    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
-    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
-    """
-    display_name = "Mission Progress Locations"
-
-
-class BonusLocations(LocationInclusion):
-    """
-    Enables or disables item rewards for completing bonus tasks.
-    Bonus tasks are those giving you a campaign-wide or mission-wide bonus in vanilla game:
-    Research, credits, bonus units or resources, etc.
-
-    Enabled: All locations fitting into this do their normal rewards
-    Trash: Forces a trash item in
-    Nothing: No rewards for this type of tasks, effectively disabling such locations
-
-    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
-    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
-    """
-    display_name = "Bonus Locations"
-
-
-class ChallengeLocations(LocationInclusion):
-    """
-    Enables or disables item rewards for completing challenge tasks.
-    Challenges are tasks that have usually higher requirements to be completed
-    than to complete the mission they're in successfully.
-    You might be required to visit the same mission later when getting stronger in order to finish these tasks.
-
-    Enabled: All locations fitting into this do their normal rewards
-    Trash: Forces a trash item in
-    Nothing: No rewards for this type of tasks, effectively disabling such locations
-
-    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
-    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
-    """
-    display_name = "Challenge Locations"
-
-
-class OptionalBossLocations(LocationInclusion):
-    """
-    Enables or disables item rewards for defeating optional bosses.
-    An optional boss is any boss that's not required to kill in order to finish the mission successfully.
-    All Brutalisks, Loki, etc. belongs here.
-
-    Enabled: All locations fitting into this do their normal rewards
-    Trash: Forces a trash item in
-    Nothing: No rewards for this type of tasks, effectively disabling such locations
-
-    Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
-    See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
-    """
-    display_name = "Optional Boss Locations"
-
-
-# noinspection PyTypeChecker
-sc2wol_options: Dict[str, Option] = {
-    "game_difficulty": GameDifficulty,
-    "game_speed": GameSpeed,
-    "all_in_map": AllInMap,
-    "final_map": FinalMap,
-    "mission_order": MissionOrder,
-    "player_color": PlayerColor,
-    "shuffle_protoss": ShuffleProtoss,
-    "shuffle_no_build": ShuffleNoBuild,
-    "early_unit": EarlyUnit,
-    "required_tactics": RequiredTactics,
-    "units_always_have_upgrades": UnitsAlwaysHaveUpgrades,
-    "max_number_of_upgrades": MaxNumberOfUpgrades,
-    "generic_upgrade_missions": GenericUpgradeMissions,
-    "generic_upgrade_research": GenericUpgradeResearch,
-    "generic_upgrade_items": GenericUpgradeItems,
-    "locked_items": LockedItems,
-    "excluded_items": ExcludedItems,
-    "excluded_missions": ExcludedMissions,
-    "nco_items": NovaCovertOpsItems,
-    "bw_items": BroodWarItems,
-    "ext_items": ExtendedItems,
-    "mission_progress_locations": MissionProgressLocations,
-    "bonus_locations": BonusLocations,
-    "challenge_locations": ChallengeLocations,
-    "optional_boss_locations": OptionalBossLocations
-}
-
-
-def get_option_value(multiworld: MultiWorld, player: int, name: str) -> Union[int,  FrozenSet]:
-    if multiworld is None:
-        return sc2wol_options[name].default
-
-    player_option = getattr(multiworld, name)[player]
-
-    return player_option.value
diff --git a/worlds/sc2wol/PoolFilter.py b/worlds/sc2wol/PoolFilter.py
deleted file mode 100644
index 23422a3d..00000000
--- a/worlds/sc2wol/PoolFilter.py
+++ /dev/null
@@ -1,367 +0,0 @@
-from typing import Callable, Dict, List, Set
-from BaseClasses import MultiWorld, ItemClassification, Item, Location
-from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, filler_items, \
-    progressive_if_nco
-from .MissionTables import no_build_regions_list, easy_regions_list, medium_regions_list, hard_regions_list,\
-    mission_orders, MissionInfo, alt_final_mission_locations, MissionPools
-from .Options import get_option_value, MissionOrder, FinalMap, MissionProgressLocations, LocationInclusion
-from .LogicMixin import SC2WoLLogic
-
-# Items with associated upgrades
-UPGRADABLE_ITEMS = [
-    "Marine", "Medic", "Firebat", "Marauder", "Reaper", "Ghost", "Spectre",
-    "Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator", "Widow Mine", "Cyclone",
-    "Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Raven", "Science Vessel", "Liberator", "Valkyrie",
-    "Bunker", "Missile Turret"
-]
-
-BARRACKS_UNITS = {"Marine", "Medic", "Firebat", "Marauder", "Reaper", "Ghost", "Spectre"}
-FACTORY_UNITS = {"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator", "Widow Mine", "Cyclone"}
-STARPORT_UNITS = {"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Hercules", "Science Vessel", "Raven", "Liberator", "Valkyrie"}
-
-PROTOSS_REGIONS = {"A Sinister Turn", "Echoes of the Future", "In Utter Darkness"}
-
-
-def filter_missions(multiworld: MultiWorld, player: int) -> Dict[int, List[str]]:
-    """
-    Returns a semi-randomly pruned tuple of no-build, easy, medium, and hard mission sets
-    """
-
-    mission_order_type = get_option_value(multiworld, player, "mission_order")
-    shuffle_no_build = get_option_value(multiworld, player, "shuffle_no_build")
-    shuffle_protoss = get_option_value(multiworld, player, "shuffle_protoss")
-    excluded_missions = get_option_value(multiworld, player, "excluded_missions")
-    final_map = get_option_value(multiworld, player, "final_map")
-    mission_pools = {
-        MissionPools.STARTER: no_build_regions_list[:],
-        MissionPools.EASY: easy_regions_list[:],
-        MissionPools.MEDIUM: medium_regions_list[:],
-        MissionPools.HARD: hard_regions_list[:],
-        MissionPools.FINAL: []
-    }
-    if mission_order_type == MissionOrder.option_vanilla:
-        # Vanilla uses the entire mission pool
-        mission_pools[MissionPools.FINAL] = ['All-In']
-        return mission_pools
-    # Omitting No-Build missions if not shuffling no-build
-    if not shuffle_no_build:
-        excluded_missions = excluded_missions.union(no_build_regions_list)
-    # Omitting Protoss missions if not shuffling protoss
-    if not shuffle_protoss:
-        excluded_missions = excluded_missions.union(PROTOSS_REGIONS)
-    # Replacing All-In with alternate ending depending on option
-    if final_map == FinalMap.option_random_hard:
-        final_mission = multiworld.random.choice([mission for mission in alt_final_mission_locations.keys() if mission not in excluded_missions])
-        excluded_missions.add(final_mission)
-    else:
-        final_mission = 'All-In'
-    # Excluding missions
-    for difficulty, mission_pool in mission_pools.items():
-        mission_pools[difficulty] = [mission for mission in mission_pool if mission not in excluded_missions]
-    mission_pools[MissionPools.FINAL].append(final_mission)
-    # Mission pool changes on Build-Only
-    if not get_option_value(multiworld, player, 'shuffle_no_build'):
-        def move_mission(mission_name, current_pool, new_pool):
-            if mission_name in mission_pools[current_pool]:
-                mission_pools[current_pool].remove(mission_name)
-                mission_pools[new_pool].append(mission_name)
-        # Replacing No Build missions with Easy missions
-        move_mission("Zero Hour", MissionPools.EASY, MissionPools.STARTER)
-        move_mission("Evacuation", MissionPools.EASY, MissionPools.STARTER)
-        move_mission("Devil's Playground", MissionPools.EASY, MissionPools.STARTER)
-        # Pushing Outbreak to Normal, as it cannot be placed as the second mission on Build-Only
-        move_mission("Outbreak", MissionPools.EASY, MissionPools.MEDIUM)
-        # Pushing extra Normal missions to Easy
-        move_mission("The Great Train Robbery", MissionPools.MEDIUM, MissionPools.EASY)
-        move_mission("Echoes of the Future", MissionPools.MEDIUM, MissionPools.EASY)
-        move_mission("Cutthroat", MissionPools.MEDIUM, MissionPools.EASY)
-        # Additional changes on Advanced Tactics
-        if get_option_value(multiworld, player, "required_tactics") > 0:
-            move_mission("The Great Train Robbery", MissionPools.EASY, MissionPools.STARTER)
-            move_mission("Smash and Grab", MissionPools.EASY, MissionPools.STARTER)
-            move_mission("Moebius Factor", MissionPools.MEDIUM, MissionPools.EASY)
-            move_mission("Welcome to the Jungle", MissionPools.MEDIUM, MissionPools.EASY)
-            move_mission("Engine of Destruction", MissionPools.HARD, MissionPools.MEDIUM)
-
-    return mission_pools
-
-
-def get_item_upgrades(inventory: List[Item], parent_item: Item or str):
-    item_name = parent_item.name if isinstance(parent_item, Item) else parent_item
-    return [
-        inv_item for inv_item in inventory
-        if get_full_item_list()[inv_item.name].parent_item == item_name
-    ]
-
-
-def get_item_quantity(item: Item, multiworld: MultiWorld, player: int):
-    if (not get_option_value(multiworld, player, "nco_items")) \
-            and item.name in progressive_if_nco:
-        return 1
-    return get_full_item_list()[item.name].quantity
-
-
-def copy_item(item: Item):
-    return Item(item.name, item.classification, item.code, item.player)
-
-
-class ValidInventory:
-
-    def has(self, item: str, player: int):
-        return item in self.logical_inventory
-
-    def has_any(self, items: Set[str], player: int):
-        return any(item in self.logical_inventory for item in items)
-
-    def has_all(self, items: Set[str], player: int):
-        return all(item in self.logical_inventory for item in items)
-
-    def has_units_per_structure(self) -> bool:
-        return len(BARRACKS_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \
-            len(FACTORY_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \
-            len(STARPORT_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure
-
-    def generate_reduced_inventory(self, inventory_size: int, mission_requirements: List[Callable]) -> List[Item]:
-        """Attempts to generate a reduced inventory that can fulfill the mission requirements."""
-        inventory = list(self.item_pool)
-        locked_items = list(self.locked_items)
-        self.logical_inventory = {
-            item.name for item in inventory + locked_items + self.existing_items
-            if item.classification in (ItemClassification.progression, ItemClassification.progression_skip_balancing)
-        }
-        requirements = mission_requirements
-        cascade_keys = self.cascade_removal_map.keys()
-        units_always_have_upgrades = get_option_value(self.multiworld, self.player, "units_always_have_upgrades")
-
-        def attempt_removal(item: Item) -> bool:
-            # If item can be removed and has associated items, remove them as well
-            inventory.remove(item)
-            # Only run logic checks when removing logic items
-            if item.name in self.logical_inventory:
-                self.logical_inventory.remove(item.name)
-                if not all(requirement(self) for requirement in requirements):
-                    # If item cannot be removed, lock or revert
-                    self.logical_inventory.add(item.name)
-                    for _ in range(get_item_quantity(item, self.multiworld, self.player)):
-                        locked_items.append(copy_item(item))
-                    return False
-            return True
-
-        # Limit the maximum number of upgrades 
-        maxUpgrad = get_option_value(self.multiworld, self.player,
-                            "max_number_of_upgrades")
-        if maxUpgrad != -1:
-            unit_avail_upgrades = {}
-            # Needed to take into account locked/existing items
-            unit_nb_upgrades = {}
-            for item in inventory:
-                cItem = get_full_item_list()[item.name]
-                if cItem.type in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades:
-                    unit_avail_upgrades[item.name] = []
-                    unit_nb_upgrades[item.name] = 0
-                elif cItem.parent_item is not None:
-                    if cItem.parent_item not in unit_avail_upgrades:
-                        unit_avail_upgrades[cItem.parent_item] = [item]
-                        unit_nb_upgrades[cItem.parent_item] = 1
-                    else:
-                        unit_avail_upgrades[cItem.parent_item].append(item)
-                        unit_nb_upgrades[cItem.parent_item] += 1
-            # For those two categories, we count them but dont include them in removal
-            for item in locked_items + self.existing_items:
-                cItem = get_full_item_list()[item.name]
-                if cItem.type in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades:
-                    unit_avail_upgrades[item.name] = []
-                    unit_nb_upgrades[item.name] = 0
-                elif cItem.parent_item is not None:
-                    if cItem.parent_item not in unit_avail_upgrades:
-                        unit_nb_upgrades[cItem.parent_item] = 1
-                    else:
-                        unit_nb_upgrades[cItem.parent_item] += 1
-            # Making sure that the upgrades being removed is random 
-            # Currently, only for combat shield vs Stabilizer Medpacks...
-            shuffled_unit_upgrade_list = list(unit_avail_upgrades.keys())
-            self.multiworld.random.shuffle(shuffled_unit_upgrade_list)
-            for unit in shuffled_unit_upgrade_list:
-                while (unit_nb_upgrades[unit] > maxUpgrad) \
-                         and (len(unit_avail_upgrades[unit]) > 0):
-                    itemCandidate = self.multiworld.random.choice(unit_avail_upgrades[unit])
-                    _ = attempt_removal(itemCandidate)
-                    # Whatever it succeed to remove the iventory or it fails and thus 
-                    # lock it, the upgrade is no longer available for removal
-                    unit_avail_upgrades[unit].remove(itemCandidate)
-                    unit_nb_upgrades[unit] -= 1
-
-        # Locking associated items for items that have already been placed when units_always_have_upgrades is on
-        if units_always_have_upgrades:
-            existing_items = set(self.existing_items[:] + locked_items)
-            while existing_items:
-                existing_item = existing_items.pop()
-                items_to_lock = self.cascade_removal_map.get(existing_item, [existing_item])
-                if get_full_item_list()[existing_item.name].type != "Upgrade":
-                    # Don't process general upgrades, they may have been pre-locked per-level
-                    for item in items_to_lock:
-                        if item in inventory:
-                            item_quantity = inventory.count(item)
-                            # Unit upgrades, lock all levels
-                            for _ in range(item_quantity):
-                                inventory.remove(item)
-                            if item not in locked_items:
-                                # Lock all the associated items if not already locked
-                                for _ in range(item_quantity):
-                                    locked_items.append(copy_item(item))
-                        if item in existing_items:
-                            existing_items.remove(item)
-
-        if self.min_units_per_structure > 0 and self.has_units_per_structure():
-            requirements.append(lambda state: state.has_units_per_structure())
-
-        # Determining if the full-size inventory can complete campaign
-        if not all(requirement(self) for requirement in requirements):
-            raise Exception("Too many items excluded - campaign is impossible to complete.")
-
-        while len(inventory) + len(locked_items) > inventory_size:
-            if len(inventory) == 0:
-                # There are more items than locations and all of them are already locked due to YAML or logic.
-                # Random items from locked ones will go to starting items
-                self.multiworld.random.shuffle(locked_items)
-                while len(locked_items) > inventory_size:
-                    item: Item = locked_items.pop()
-                    self.multiworld.push_precollected(item)
-                break
-            # Select random item from removable items
-            item = self.multiworld.random.choice(inventory)
-            # Cascade removals to associated items
-            if item in cascade_keys:
-                items_to_remove = self.cascade_removal_map[item]
-                transient_items = []
-                cascade_failure = False
-                while len(items_to_remove) > 0:
-                    item_to_remove = items_to_remove.pop()
-                    transient_items.append(item_to_remove)
-                    if item_to_remove not in inventory:
-                        if units_always_have_upgrades and item_to_remove in locked_items:
-                            cascade_failure = True
-                            break
-                        else:
-                            continue
-                    success = attempt_removal(item_to_remove)
-                    if not success and units_always_have_upgrades:
-                        cascade_failure = True
-                        transient_items += items_to_remove
-                        break
-                # Lock all associated items if any of them cannot be removed on Units Always Have Upgrades
-                if cascade_failure:
-                    for transient_item in transient_items:
-                        if transient_item in inventory:
-                            for _ in range(inventory.count(transient_item)):
-                                inventory.remove(transient_item)
-                        if transient_item not in locked_items:
-                            for _ in range(get_item_quantity(transient_item, self.multiworld, self.player)):
-                                locked_items.append(copy_item(transient_item))
-                        if transient_item.classification in (ItemClassification.progression, ItemClassification.progression_skip_balancing):
-                            self.logical_inventory.add(transient_item.name)
-            else:
-                attempt_removal(item)
-
-        if not spider_mine_sources & self.logical_inventory:
-            inventory = [item for item in inventory if not item.name.endswith("(Spider Mine)")]
-        if not BARRACKS_UNITS & self.logical_inventory:
-            inventory = [item for item in inventory if
-                         not (item.name.startswith("Progressive Infantry") or item.name == "Orbital Strike")]
-        if not FACTORY_UNITS & self.logical_inventory:
-            inventory = [item for item in inventory if not item.name.startswith("Progressive Vehicle")]
-        if not STARPORT_UNITS & self.logical_inventory:
-            inventory = [item for item in inventory if not item.name.startswith("Progressive Ship")]
-
-        # Cull finished, adding locked items back into inventory
-        inventory += locked_items
-
-        # Replacing empty space with generically useful items
-        replacement_items = [item for item in self.item_pool
-                             if (item not in inventory
-                                 and item not in self.locked_items
-                                 and item.name in second_pass_placeable_items)]
-        self.multiworld.random.shuffle(replacement_items)
-        while len(inventory) < inventory_size and len(replacement_items) > 0:
-            item = replacement_items.pop()
-            inventory.append(item)
-
-        return inventory
-
-    def _read_logic(self):
-        self._sc2wol_has_common_unit = lambda world, player: SC2WoLLogic._sc2wol_has_common_unit(self, world, player)
-        self._sc2wol_has_air = lambda world, player: SC2WoLLogic._sc2wol_has_air(self, world, player)
-        self._sc2wol_has_air_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_air_anti_air(self, world, player)
-        self._sc2wol_has_competent_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_competent_anti_air(self, world, player)
-        self._sc2wol_has_competent_ground_to_air = lambda world, player: SC2WoLLogic._sc2wol_has_competent_ground_to_air(self, world, player)
-        self._sc2wol_has_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_anti_air(self, world, player)
-        self._sc2wol_defense_rating = lambda world, player, zerg_enemy, air_enemy=False: SC2WoLLogic._sc2wol_defense_rating(self, world, player, zerg_enemy, air_enemy)
-        self._sc2wol_has_competent_comp = lambda world, player: SC2WoLLogic._sc2wol_has_competent_comp(self, world, player)
-        self._sc2wol_has_train_killers = lambda world, player: SC2WoLLogic._sc2wol_has_train_killers(self, world, player)
-        self._sc2wol_able_to_rescue = lambda world, player: SC2WoLLogic._sc2wol_able_to_rescue(self, world, player)
-        self._sc2wol_beats_protoss_deathball = lambda world, player: SC2WoLLogic._sc2wol_beats_protoss_deathball(self, world, player)
-        self._sc2wol_survives_rip_field = lambda world, player: SC2WoLLogic._sc2wol_survives_rip_field(self, world, player)
-        self._sc2wol_has_protoss_common_units = lambda world, player: SC2WoLLogic._sc2wol_has_protoss_common_units(self, world, player)
-        self._sc2wol_has_protoss_medium_units = lambda world, player: SC2WoLLogic._sc2wol_has_protoss_medium_units(self, world, player)
-        self._sc2wol_has_mm_upgrade = lambda world, player: SC2WoLLogic._sc2wol_has_mm_upgrade(self, world, player)
-        self._sc2wol_welcome_to_the_jungle_requirement = lambda world, player: SC2WoLLogic._sc2wol_welcome_to_the_jungle_requirement(self, world, player)
-        self._sc2wol_can_respond_to_colony_infestations = lambda world, player: SC2WoLLogic._sc2wol_can_respond_to_colony_infestations(self, world, player)
-        self._sc2wol_final_mission_requirements = lambda world, player: SC2WoLLogic._sc2wol_final_mission_requirements(self, world, player)
-
-    def __init__(self, multiworld: MultiWorld, player: int,
-                 item_pool: List[Item], existing_items: List[Item], locked_items: List[Item],
-                 has_protoss: bool):
-        self.multiworld = multiworld
-        self.player = player
-        self.logical_inventory = set()
-        self.locked_items = locked_items[:]
-        self.existing_items = existing_items
-        self._read_logic()
-        # Initial filter of item pool
-        self.item_pool = []
-        item_quantities: dict[str, int] = dict()
-        # Inventory restrictiveness based on number of missions with checks
-        mission_order_type = get_option_value(self.multiworld, self.player, "mission_order")
-        mission_count = len(mission_orders[mission_order_type]) - 1
-        self.min_units_per_structure = int(mission_count / 7)
-        min_upgrades = 1 if mission_count < 10 else 2
-        for item in item_pool:
-            item_info = get_full_item_list()[item.name]
-            if item_info.type == "Upgrade":
-                # Locking upgrades based on mission duration
-                if item.name not in item_quantities:
-                    item_quantities[item.name] = 0
-                item_quantities[item.name] += 1
-                if item_quantities[item.name] < min_upgrades:
-                    self.locked_items.append(item)
-                else:
-                    self.item_pool.append(item)
-            elif item_info.type == "Goal":
-                locked_items.append(item)
-            elif item_info.type != "Protoss" or has_protoss:
-                self.item_pool.append(item)
-        self.cascade_removal_map: Dict[Item, List[Item]] = dict()
-        for item in self.item_pool + locked_items + existing_items:
-            if item.name in UPGRADABLE_ITEMS:
-                upgrades = get_item_upgrades(self.item_pool, item)
-                associated_items = [*upgrades, item]
-                self.cascade_removal_map[item] = associated_items
-                if get_option_value(multiworld, player, "units_always_have_upgrades"):
-                    for upgrade in upgrades:
-                        self.cascade_removal_map[upgrade] = associated_items
-
-
-def filter_items(multiworld: MultiWorld, player: int, mission_req_table: Dict[str, MissionInfo], location_cache: List[Location],
-                 item_pool: List[Item], existing_items: List[Item], locked_items: List[Item]) -> List[Item]:
-    """
-    Returns a semi-randomly pruned set of items based on number of available locations.
-    The returned inventory must be capable of logically accessing every location in the world.
-    """
-    open_locations = [location for location in location_cache if location.item is None]
-    inventory_size = len(open_locations)
-    has_protoss = bool(PROTOSS_REGIONS.intersection(mission_req_table.keys()))
-    mission_requirements = [location.access_rule for location in location_cache]
-    valid_inventory = ValidInventory(multiworld, player, item_pool, existing_items, locked_items, has_protoss)
-
-    valid_items = valid_inventory.generate_reduced_inventory(inventory_size, mission_requirements)
-    return valid_items
diff --git a/worlds/sc2wol/Regions.py b/worlds/sc2wol/Regions.py
deleted file mode 100644
index f588ce7e..00000000
--- a/worlds/sc2wol/Regions.py
+++ /dev/null
@@ -1,313 +0,0 @@
-from typing import List, Set, Dict, Tuple, Optional, Callable
-from BaseClasses import MultiWorld, Region, Entrance, Location
-from .Locations import LocationData
-from .Options import get_option_value, MissionOrder
-from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, alt_final_mission_locations, \
-    MissionPools, vanilla_shuffle_order
-from .PoolFilter import filter_missions
-
-PROPHECY_CHAIN_MISSION_COUNT = 4
-
-VANILLA_SHUFFLED_FIRST_PROPHECY_MISSION = 21
-
-def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[LocationData, ...], location_cache: List[Location])\
-        -> Tuple[Dict[str, MissionInfo], int, str]:
-    locations_per_region = get_locations_per_region(locations)
-
-    mission_order_type = get_option_value(multiworld, player, "mission_order")
-    mission_order = mission_orders[mission_order_type]
-
-    mission_pools = filter_missions(multiworld, player)
-
-    regions = [create_region(multiworld, player, locations_per_region, location_cache, "Menu")]
-
-    names: Dict[str, int] = {}
-
-    if mission_order_type == MissionOrder.option_vanilla:
-
-        # Generating all regions and locations
-        for region_name in vanilla_mission_req_table.keys():
-            regions.append(create_region(multiworld, player, locations_per_region, location_cache, region_name))
-        multiworld.regions += regions
-
-        connect(multiworld, player, names, 'Menu', 'Liberation Day'),
-        connect(multiworld, player, names, 'Liberation Day', 'The Outlaws',
-                lambda state: state.has("Beat Liberation Day", player)),
-        connect(multiworld, player, names, 'The Outlaws', 'Zero Hour',
-                lambda state: state.has("Beat The Outlaws", player)),
-        connect(multiworld, player, names, 'Zero Hour', 'Evacuation',
-                lambda state: state.has("Beat Zero Hour", player)),
-        connect(multiworld, player, names, 'Evacuation', 'Outbreak',
-                lambda state: state.has("Beat Evacuation", player)),
-        connect(multiworld, player, names, "Outbreak", "Safe Haven",
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 7) and
-                              state.has("Beat Outbreak", player)),
-        connect(multiworld, player, names, "Outbreak", "Haven's Fall",
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 7) and
-                              state.has("Beat Outbreak", player)),
-        connect(multiworld, player, names, 'Zero Hour', 'Smash and Grab',
-                lambda state: state.has("Beat Zero Hour", player)),
-        connect(multiworld, player, names, 'Smash and Grab', 'The Dig',
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 8) and
-                              state.has("Beat Smash and Grab", player)),
-        connect(multiworld, player, names, 'The Dig', 'The Moebius Factor',
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 11) and
-                              state.has("Beat The Dig", player)),
-        connect(multiworld, player, names, 'The Moebius Factor', 'Supernova',
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 14) and
-                              state.has("Beat The Moebius Factor", player)),
-        connect(multiworld, player, names, 'Supernova', 'Maw of the Void',
-                lambda state: state.has("Beat Supernova", player)),
-        connect(multiworld, player, names, 'Zero Hour', "Devil's Playground",
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 4) and
-                              state.has("Beat Zero Hour", player)),
-        connect(multiworld, player, names, "Devil's Playground", 'Welcome to the Jungle',
-                lambda state: state.has("Beat Devil's Playground", player)),
-        connect(multiworld, player, names, "Welcome to the Jungle", 'Breakout',
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 8) and
-                              state.has("Beat Welcome to the Jungle", player)),
-        connect(multiworld, player, names, "Welcome to the Jungle", 'Ghost of a Chance',
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 8) and
-                              state.has("Beat Welcome to the Jungle", player)),
-        connect(multiworld, player, names, "Zero Hour", 'The Great Train Robbery',
-                lambda state: state._sc2wol_cleared_missions(multiworld, player, 6) and
-                              state.has("Beat Zero Hour", player)),
-        connect(multiworld, player, names, 'The Great Train Robbery', 'Cutthroat',
-                lambda state: state.has("Beat The Great Train Robbery", player)),
-        connect(multiworld, player, names, 'Cutthroat', 'Engine of Destruction',
-                lambda state: state.has("Beat Cutthroat", player)),
-        connect(multiworld, player, names, 'Engine of Destruction', 'Media Blitz',
-                lambda state: state.has("Beat Engine of Destruction", player)),
-        connect(multiworld, player, names, 'Media Blitz', 'Piercing the Shroud',
-                lambda state: state.has("Beat Media Blitz", player)),
-        connect(multiworld, player, names, 'The Dig', 'Whispers of Doom',
-                lambda state: state.has("Beat The Dig", player)),
-        connect(multiworld, player, names, 'Whispers of Doom', 'A Sinister Turn',
-                lambda state: state.has("Beat Whispers of Doom", player)),
-        connect(multiworld, player, names, 'A Sinister Turn', 'Echoes of the Future',
-                lambda state: state.has("Beat A Sinister Turn", player)),
-        connect(multiworld, player, names, 'Echoes of the Future', 'In Utter Darkness',
-                lambda state: state.has("Beat Echoes of the Future", player)),
-        connect(multiworld, player, names, 'Maw of the Void', 'Gates of Hell',
-                lambda state: state.has("Beat Maw of the Void", player)),
-        connect(multiworld, player, names, 'Gates of Hell', 'Belly of the Beast',
-                lambda state: state.has("Beat Gates of Hell", player)),
-        connect(multiworld, player, names, 'Gates of Hell', 'Shatter the Sky',
-                lambda state: state.has("Beat Gates of Hell", player)),
-        connect(multiworld, player, names, 'Gates of Hell', 'All-In',
-                lambda state: state.has('Beat Gates of Hell', player) and (
-                        state.has('Beat Shatter the Sky', player) or state.has('Beat Belly of the Beast', player)))
-
-        return vanilla_mission_req_table, 29, 'All-In: Victory'
-
-    else:
-        missions = []
-
-        remove_prophecy = mission_order_type == 1 and not get_option_value(multiworld, player, "shuffle_protoss")
-
-        final_mission = mission_pools[MissionPools.FINAL][0]
-
-        # Determining if missions must be removed
-        mission_pool_size = sum(len(mission_pool) for mission_pool in mission_pools.values())
-        removals = len(mission_order) - mission_pool_size
-        # Removing entire Prophecy chain on vanilla shuffled when not shuffling protoss
-        if remove_prophecy:
-            removals -= PROPHECY_CHAIN_MISSION_COUNT
-
-        # Initial fill out of mission list and marking all-in mission
-        for mission in mission_order:
-            # Removing extra missions if mission pool is too small
-            # Also handle lower removal priority than Prophecy
-            if 0 < mission.removal_priority <= removals or mission.category == 'Prophecy' and remove_prophecy \
-                    or (remove_prophecy and mission_order_type == MissionOrder.option_vanilla_shuffled
-                        and mission.removal_priority > vanilla_shuffle_order[
-                            VANILLA_SHUFFLED_FIRST_PROPHECY_MISSION].removal_priority
-                        and 0 < mission.removal_priority <= removals + PROPHECY_CHAIN_MISSION_COUNT):
-                missions.append(None)
-            elif mission.type == MissionPools.FINAL:
-                missions.append(final_mission)
-            else:
-                missions.append(mission.type)
-
-        no_build_slots = []
-        easy_slots = []
-        medium_slots = []
-        hard_slots = []
-
-        # Search through missions to find slots needed to fill
-        for i in range(len(missions)):
-            if missions[i] is None:
-                continue
-            if missions[i] == MissionPools.STARTER:
-                no_build_slots.append(i)
-            elif missions[i] == MissionPools.EASY:
-                easy_slots.append(i)
-            elif missions[i] == MissionPools.MEDIUM:
-                medium_slots.append(i)
-            elif missions[i] == MissionPools.HARD:
-                hard_slots.append(i)
-
-        # Add no_build missions to the pool and fill in no_build slots
-        missions_to_add = mission_pools[MissionPools.STARTER]
-        if len(no_build_slots) > len(missions_to_add):
-            raise Exception("There are no valid No-Build missions.  Please exclude fewer missions.")
-        for slot in no_build_slots:
-            filler = multiworld.random.randint(0, len(missions_to_add) - 1)
-
-            missions[slot] = missions_to_add.pop(filler)
-
-        # Add easy missions into pool and fill in easy slots
-        missions_to_add = missions_to_add + mission_pools[MissionPools.EASY]
-        if len(easy_slots) > len(missions_to_add):
-            raise Exception("There are not enough Easy missions to fill the campaign.  Please exclude fewer missions.")
-        for slot in easy_slots:
-            filler = multiworld.random.randint(0, len(missions_to_add) - 1)
-
-            missions[slot] = missions_to_add.pop(filler)
-
-        # Add medium missions into pool and fill in medium slots
-        missions_to_add = missions_to_add + mission_pools[MissionPools.MEDIUM]
-        if len(medium_slots) > len(missions_to_add):
-            raise Exception("There are not enough Easy and Medium missions to fill the campaign.  Please exclude fewer missions.")
-        for slot in medium_slots:
-            filler = multiworld.random.randint(0, len(missions_to_add) - 1)
-
-            missions[slot] = missions_to_add.pop(filler)
-
-        # Add hard missions into pool and fill in hard slots
-        missions_to_add = missions_to_add + mission_pools[MissionPools.HARD]
-        if len(hard_slots) > len(missions_to_add):
-            raise Exception("There are not enough missions to fill the campaign.  Please exclude fewer missions.")
-        for slot in hard_slots:
-            filler = multiworld.random.randint(0, len(missions_to_add) - 1)
-
-            missions[slot] = missions_to_add.pop(filler)
-
-        # Generating regions and locations from selected missions
-        for region_name in missions:
-            regions.append(create_region(multiworld, player, locations_per_region, location_cache, region_name))
-        multiworld.regions += regions
-
-        # Mapping original mission slots to shifted mission slots when missions are removed
-        slot_map = []
-        slot_offset = 0
-        for position, mission in enumerate(missions):
-            slot_map.append(position - slot_offset + 1)
-            if mission is None:
-                slot_offset += 1
-
-        # Loop through missions to create requirements table and connect regions
-        # TODO: Handle 'and' connections
-        mission_req_table = {}
-
-        def build_connection_rule(mission_names: List[str], missions_req: int) -> Callable:
-            if len(mission_names) > 1:
-                return lambda state: state.has_all({f"Beat {name}" for name in mission_names}, player) and \
-                                     state._sc2wol_cleared_missions(multiworld, player, missions_req)
-            else:
-                return lambda state: state.has(f"Beat {mission_names[0]}", player) and \
-                                     state._sc2wol_cleared_missions(multiworld, player, missions_req)
-
-        for i, mission in enumerate(missions):
-            if mission is None:
-                continue
-            connections = []
-            all_connections = []
-            for connection in mission_order[i].connect_to:
-                if connection == -1:
-                    continue
-                while missions[connection] is None:
-                    connection -= 1
-                all_connections.append(missions[connection])
-            for connection in mission_order[i].connect_to:
-                required_mission = missions[connection]
-                if connection == -1:
-                    connect(multiworld, player, names, "Menu", mission)
-                else:
-                    if required_mission is None and not mission_order[i].completion_critical:  # Drop non-critical null slots
-                        continue
-                    while required_mission is None:  # Substituting null slot with prior slot
-                        connection -= 1
-                        required_mission = missions[connection]
-                    required_missions = [required_mission] if mission_order[i].or_requirements else all_connections
-                    connect(multiworld, player, names, required_mission, mission,
-                            build_connection_rule(required_missions, mission_order[i].number))
-                    connections.append(slot_map[connection])
-
-            mission_req_table.update({mission: MissionInfo(
-                vanilla_mission_req_table[mission].id, connections, mission_order[i].category,
-                number=mission_order[i].number,
-                completion_critical=mission_order[i].completion_critical,
-                or_requirements=mission_order[i].or_requirements)})
-
-        final_mission_id = vanilla_mission_req_table[final_mission].id
-
-        # Changing the completion condition for alternate final missions into an event
-        if final_mission != 'All-In':
-            final_location = alt_final_mission_locations[final_mission]
-            # Final location should be near the end of the cache
-            for i in range(len(location_cache) - 1, -1, -1):
-                if location_cache[i].name == final_location:
-                    location_cache[i].locked = True
-                    location_cache[i].event = True
-                    location_cache[i].address = None
-                    break
-        else:
-            final_location = 'All-In: Victory'
-
-        return mission_req_table, final_mission_id, final_location
-
-def create_location(player: int, location_data: LocationData, region: Region,
-                    location_cache: List[Location]) -> Location:
-    location = Location(player, location_data.name, location_data.code, region)
-    location.access_rule = location_data.rule
-
-    if id is None:
-        location.event = True
-        location.locked = True
-
-    location_cache.append(location)
-
-    return location
-
-
-def create_region(multiworld: MultiWorld, player: int, locations_per_region: Dict[str, List[LocationData]],
-                  location_cache: List[Location], name: str) -> Region:
-    region = Region(name, player, multiworld)
-
-    if name in locations_per_region:
-        for location_data in locations_per_region[name]:
-            location = create_location(player, location_data, region, location_cache)
-            region.locations.append(location)
-
-    return region
-
-
-def connect(world: MultiWorld, player: int, used_names: Dict[str, int], source: str, target: str,
-            rule: Optional[Callable] = None):
-    sourceRegion = world.get_region(source, player)
-    targetRegion = world.get_region(target, player)
-
-    if target not in used_names:
-        used_names[target] = 1
-        name = target
-    else:
-        used_names[target] += 1
-        name = target + (' ' * used_names[target])
-
-    connection = Entrance(player, name, sourceRegion)
-
-    if rule:
-        connection.access_rule = rule
-
-    sourceRegion.exits.append(connection)
-    connection.connect(targetRegion)
-
-
-def get_locations_per_region(locations: Tuple[LocationData, ...]) -> Dict[str, List[LocationData]]:
-    per_region: Dict[str, List[LocationData]] = {}
-
-    for location in locations:
-        per_region.setdefault(location.region, []).append(location)
-
-    return per_region
diff --git a/worlds/sc2wol/Starcraft2.kv b/worlds/sc2wol/Starcraft2.kv
deleted file mode 100644
index f0785b89..00000000
--- a/worlds/sc2wol/Starcraft2.kv
+++ /dev/null
@@ -1,16 +0,0 @@
-<MissionLayout>:
-    rows: 1
-
-<MissionCategory>:
-    cols: 1
-    padding: [10,5,10,5]
-    spacing: [0,5]
-
-<MissionButton>:
-    text_size: self.size
-    markup: True
-    halign: 'center'
-    valign: 'middle'
-    padding: [5,0,5,0]
-    markup: True
-    outline_width: 1
diff --git a/worlds/sc2wol/__init__.py b/worlds/sc2wol/__init__.py
deleted file mode 100644
index 5c487f8f..00000000
--- a/worlds/sc2wol/__init__.py
+++ /dev/null
@@ -1,324 +0,0 @@
-import typing
-
-from typing import List, Set, Tuple, Dict
-from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification
-from worlds.AutoWorld import WebWorld, World
-from .Items import StarcraftWoLItem, filler_items, item_name_groups, get_item_table, get_full_item_list, \
-    get_basic_units, ItemData, upgrade_included_names, progressive_if_nco
-from .Locations import get_locations, LocationType
-from .Regions import create_regions
-from .Options import sc2wol_options, get_option_value, LocationInclusion
-from .LogicMixin import SC2WoLLogic
-from .PoolFilter import filter_missions, filter_items, get_item_upgrades
-from .MissionTables import starting_mission_locations, MissionInfo
-
-
-class Starcraft2WoLWebWorld(WebWorld):
-    setup = Tutorial(
-        "Multiworld Setup Guide",
-        "A guide to setting up the Starcraft 2 randomizer connected to an Archipelago Multiworld",
-        "English",
-        "setup_en.md",
-        "setup/en",
-        ["TheCondor"]
-    )
-
-    tutorials = [setup]
-
-
-class SC2WoLWorld(World):
-    """
-    StarCraft II: Wings of Liberty is a science fiction real-time strategy video game developed and published by Blizzard Entertainment.
-    Command Raynor's Raiders in collecting pieces of the Keystone in order to stop the zerg threat posed by the Queen of Blades.
-    """
-
-    game = "Starcraft 2 Wings of Liberty"
-    web = Starcraft2WoLWebWorld()
-    data_version = 5
-
-    item_name_to_id = {name: data.code for name, data in get_full_item_list().items()}
-    location_name_to_id = {location.name: location.code for location in get_locations(None, None)}
-    option_definitions = sc2wol_options
-
-    item_name_groups = item_name_groups
-    locked_locations: typing.List[str]
-    location_cache: typing.List[Location]
-    mission_req_table = {}
-    final_mission_id: int
-    victory_item: str
-    required_client_version = 0, 4, 3
-
-    def __init__(self, multiworld: MultiWorld, player: int):
-        super(SC2WoLWorld, self).__init__(multiworld, player)
-        self.location_cache = []
-        self.locked_locations = []
-
-    def create_item(self, name: str) -> Item:
-        data = get_full_item_list()[name]
-        return StarcraftWoLItem(name, data.classification, data.code, self.player)
-
-    def create_regions(self):
-        self.mission_req_table, self.final_mission_id, self.victory_item = create_regions(
-            self.multiworld, self.player, get_locations(self.multiworld, self.player), self.location_cache
-        )
-
-    def create_items(self):
-        setup_events(self.player, self.locked_locations, self.location_cache)
-
-        excluded_items = get_excluded_items(self.multiworld, self.player)
-
-        starter_items = assign_starter_items(self.multiworld, self.player, excluded_items, self.locked_locations)
-
-        filter_locations(self.multiworld, self.player, self.locked_locations, self.location_cache)
-
-        pool = get_item_pool(self.multiworld, self.player, self.mission_req_table, starter_items, excluded_items, self.location_cache)
-
-        fill_item_pool_with_dummy_items(self, self.multiworld, self.player, self.locked_locations, self.location_cache, pool)
-
-        self.multiworld.itempool += pool
-
-    def set_rules(self):
-        self.multiworld.completion_condition[self.player] = lambda state: state.has(self.victory_item, self.player)
-
-    def get_filler_item_name(self) -> str:
-        return self.multiworld.random.choice(filler_items)
-
-    def fill_slot_data(self):
-        slot_data = {}
-        for option_name in sc2wol_options:
-            option = getattr(self.multiworld, option_name)[self.player]
-            if type(option.value) in {str, int}:
-                slot_data[option_name] = int(option.value)
-        slot_req_table = {}
-        for mission in self.mission_req_table:
-            slot_req_table[mission] = self.mission_req_table[mission]._asdict()
-
-        slot_data["mission_req"] = slot_req_table
-        slot_data["final_mission"] = self.final_mission_id
-        return slot_data
-
-
-def setup_events(player: int, locked_locations: typing.List[str], location_cache: typing.List[Location]):
-    for location in location_cache:
-        if location.address is None:
-            item = Item(location.name, ItemClassification.progression, None, player)
-
-            locked_locations.append(location.name)
-
-            location.place_locked_item(item)
-
-
-def get_excluded_items(multiworld: MultiWorld, player: int) -> Set[str]:
-    excluded_items: Set[str] = set()
-
-    for item in multiworld.precollected_items[player]:
-        excluded_items.add(item.name)
-
-    excluded_items_option = getattr(multiworld, 'excluded_items', [])
-
-    excluded_items.update(excluded_items_option[player].value)
-
-    return excluded_items
-
-
-def assign_starter_items(multiworld: MultiWorld, player: int, excluded_items: Set[str], locked_locations: List[str]) -> List[Item]:
-    non_local_items = multiworld.non_local_items[player].value
-    if get_option_value(multiworld, player, "early_unit"):
-        local_basic_unit = sorted(item for item in get_basic_units(multiworld, player) if item not in non_local_items and item not in excluded_items)
-        if not local_basic_unit:
-            raise Exception("At least one basic unit must be local")
-
-        # The first world should also be the starting world
-        first_mission = list(multiworld.worlds[player].mission_req_table)[0]
-        if first_mission in starting_mission_locations:
-            first_location = starting_mission_locations[first_mission]
-        elif first_mission == "In Utter Darkness":
-            first_location = first_mission + ": Defeat"
-        else:
-            first_location = first_mission + ": Victory"
-
-        return [assign_starter_item(multiworld, player, excluded_items, locked_locations, first_location, local_basic_unit)]
-    else:
-        return []
-
-
-def assign_starter_item(multiworld: MultiWorld, player: int, excluded_items: Set[str], locked_locations: List[str],
-                        location: str, item_list: Tuple[str, ...]) -> Item:
-
-    item_name = multiworld.random.choice(item_list)
-
-    excluded_items.add(item_name)
-
-    item = create_item_with_correct_settings(player, item_name)
-
-    multiworld.get_location(location, player).place_locked_item(item)
-
-    locked_locations.append(location)
-
-    return item
-
-
-def get_item_pool(multiworld: MultiWorld, player: int, mission_req_table: Dict[str, MissionInfo],
-                  starter_items: List[Item], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]:
-    pool: List[Item] = []
-
-    # For the future: goal items like Artifact Shards go here
-    locked_items = []
-
-    # YAML items
-    yaml_locked_items = get_option_value(multiworld, player, 'locked_items')
-
-    # Adjust generic upgrade availability based on options
-    include_upgrades = get_option_value(multiworld, player, 'generic_upgrade_missions') == 0
-    upgrade_items = get_option_value(multiworld, player, 'generic_upgrade_items')
-
-    # Include items from outside Wings of Liberty
-    item_sets = {'wol'}
-    if get_option_value(multiworld, player, 'nco_items'):
-        item_sets.add('nco')
-    if get_option_value(multiworld, player, 'bw_items'):
-        item_sets.add('bw')
-    if get_option_value(multiworld, player, 'ext_items'):
-        item_sets.add('ext')
-
-    def allowed_quantity(name: str, data: ItemData) -> int:
-        if name in excluded_items \
-                or data.type == "Upgrade" and (not include_upgrades or name not in upgrade_included_names[upgrade_items]) \
-                or not data.origin.intersection(item_sets):
-            return 0
-        elif name in progressive_if_nco and 'nco' not in item_sets:
-            return 1
-        else:
-            return data.quantity
-
-    for name, data in get_item_table(multiworld, player).items():
-        for i in range(allowed_quantity(name, data)):
-            item = create_item_with_correct_settings(player, name)
-            if name in yaml_locked_items:
-                locked_items.append(item)
-            else:
-                pool.append(item)
-
-    existing_items = starter_items + [item for item in multiworld.precollected_items[player]]
-    existing_names = [item.name for item in existing_items]
-
-    # Check the parent item integrity, exclude items
-    pool[:] = [item for item in pool if pool_contains_parent(item, pool + locked_items + existing_items)]
-
-    # Removing upgrades for excluded items
-    for item_name in excluded_items:
-        if item_name in existing_names:
-            continue
-        invalid_upgrades = get_item_upgrades(pool, item_name)
-        for invalid_upgrade in invalid_upgrades:
-            pool.remove(invalid_upgrade)
-
-    filtered_pool = filter_items(multiworld, player, mission_req_table, location_cache, pool, existing_items, locked_items)
-    return filtered_pool
-
-
-def fill_item_pool_with_dummy_items(self: SC2WoLWorld, multiworld: MultiWorld, player: int, locked_locations: List[str],
-                                    location_cache: List[Location], pool: List[Item]):
-    for _ in range(len(location_cache) - len(locked_locations) - len(pool)):
-        item = create_item_with_correct_settings(player, self.get_filler_item_name())
-        pool.append(item)
-
-
-def create_item_with_correct_settings(player: int, name: str) -> Item:
-    data = get_full_item_list()[name]
-
-    item = Item(name, data.classification, data.code, player)
-
-    return item
-
-
-def pool_contains_parent(item: Item, pool: [Item]):
-    item_data = get_full_item_list().get(item.name)
-    if item_data.parent_item is None:
-        # The item has not associated parent, the item is valid
-        return True
-    parent_item = item_data.parent_item
-    # Check if the pool contains the parent item
-    return parent_item in [pool_item.name for pool_item in pool]
-
-
-def filter_locations(multiworld: MultiWorld, player, locked_locations: List[str], location_cache: List[Location]):
-    """
-    Filters the locations in the world using a trash or Nothing item
-    :param multiworld:
-    :param player:
-    :param locked_locations:
-    :param location_cache:
-    :return:
-    """
-    open_locations = [location for location in location_cache if location.item is None]
-    plando_locations = get_plando_locations(multiworld, player)
-    mission_progress_locations = get_option_value(multiworld, player, "mission_progress_locations")
-    bonus_locations = get_option_value(multiworld, player, "bonus_locations")
-    challenge_locations = get_option_value(multiworld, player, "challenge_locations")
-    optional_boss_locations = get_option_value(multiworld, player, "optional_boss_locations")
-    location_data = get_locations(multiworld, player)
-    for location in open_locations:
-        # Go through the locations that aren't locked yet (early unit, etc)
-        if location.name not in plando_locations:
-            # The location is not plando'd
-            sc2_location = [sc2_location for sc2_location in location_data if sc2_location.name == location.name][0]
-            location_type = sc2_location.type
-
-            if location_type == LocationType.MISSION_PROGRESS \
-                    and mission_progress_locations != LocationInclusion.option_enabled:
-                item_name = get_exclusion_item(multiworld, mission_progress_locations)
-                place_exclusion_item(item_name, location, locked_locations, player)
-
-            if location_type == LocationType.BONUS \
-                    and bonus_locations != LocationInclusion.option_enabled:
-                item_name = get_exclusion_item(multiworld, bonus_locations)
-                place_exclusion_item(item_name, location, locked_locations, player)
-
-            if location_type == LocationType.CHALLENGE \
-                    and challenge_locations != LocationInclusion.option_enabled:
-                item_name = get_exclusion_item(multiworld, challenge_locations)
-                place_exclusion_item(item_name, location, locked_locations, player)
-
-            if location_type == LocationType.OPTIONAL_BOSS \
-                    and optional_boss_locations != LocationInclusion.option_enabled:
-                item_name = get_exclusion_item(multiworld, optional_boss_locations)
-                place_exclusion_item(item_name, location, locked_locations, player)
-
-
-def place_exclusion_item(item_name, location, locked_locations, player):
-    item = create_item_with_correct_settings(player, item_name)
-    location.place_locked_item(item)
-    locked_locations.append(location.name)
-
-
-def get_exclusion_item(multiworld: MultiWorld, option) -> str:
-    """
-    Gets the exclusion item according to settings (trash/nothing)
-    :param multiworld:
-    :param option:
-    :return: Item used for location exclusion
-    """
-    if option == LocationInclusion.option_nothing:
-        return "Nothing"
-    elif option == LocationInclusion.option_trash:
-        index = multiworld.random.randint(0, len(filler_items) - 1)
-        return filler_items[index]
-    raise Exception(f"Unsupported option type: {option}")
-
-
-def get_plando_locations(multiworld: MultiWorld, player) -> List[str]:
-    """
-
-    :param multiworld:
-    :param player:
-    :return: A list of locations affected by a plando in a world
-    """
-    plando_locations = []
-    for plando_setting in multiworld.plando_items[player]:
-        plando_locations += plando_setting.get("locations", [])
-        plando_setting_location = plando_setting.get("location", None)
-        if plando_setting_location is not None:
-            plando_locations.append(plando_setting_location)
-
-    return plando_locations
diff --git a/worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md b/worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md
deleted file mode 100644
index 18bda647..00000000
--- a/worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md	
+++ /dev/null
@@ -1,54 +0,0 @@
-# Starcraft 2 Wings of Liberty
-
-## What does randomization do to this game?
-
-The following unlocks are randomized as items:
-1. Your ability to build any non-worker unit (including Marines!).
-2. Your ability to upgrade infantry weapons, infantry armor, vehicle weapons, etc.
-3. All armory upgrades
-4. All laboratory upgrades
-5. All mercenaries
-6. Small boosts to your starting mineral and vespene gas totals on each mission
-
-You find items by making progress in bonus objectives (like by rescuing allies in 'Zero Hour') and by completing
-missions. When you receive items, they will immediately become available, even during a mission, and you will be
-notified via a text box in the top-right corner of the game screen. (The text client for StarCraft 2 also records all
-items in all worlds.)
-
-Missions are launched only through the text client. The Hyperion is never visited. Additionally, credits are not used.
-
-## What is the goal of this game when randomized?
-
-The goal is to beat the final mission: 'All In'. The config file determines which variant you must complete.
-
-## What non-randomized changes are there from vanilla Starcraft 2?
-
-1. Some missions have more vespene geysers available to allow a wider variety of units.
-2. Starports no longer require Factories in order to be built.
-3. In 'A Sinister Turn' and 'Echoes of the Future', you can research Protoss air weapon/armor upgrades.
-
-## Which of my items can be in another player's world?
-
-By default, any of StarCraft 2's items (specified above) can be in another player's world. See the
-[Advanced YAML Guide](https://archipelago.gg/tutorial/Archipelago/advanced_settings/en)
-for more information on how to change this.
-
-## Unique Local Commands
-
-The following commands are only available when using the Starcraft 2 Client to play with Archipelago.
-
-- `/difficulty [difficulty]` Overrides the difficulty set for the world.
-  - Options: casual, normal, hard, brutal
-- `/game_speed [game_speed]` Overrides the game speed for the world
-  - Options: default, slower, slow, normal, fast, faster
-- `/color [color]` Changes your color (Currently has no effect)
-  - Options: white, red, blue, teal, purple, yellow, orange, green, lightpink, violet, lightgrey, darkgreen, brown,
-    lightgreen, darkgrey, pink, rainbow, random, default
-- `/disable_mission_check` Disables the check to see if a mission is available to play. Meant for co-op runs where one
-  player can play the next mission in a chain the other player is doing.
-- `/play [mission_id]` Starts a Starcraft 2 mission based off of the mission_id provided
-- `/available` Get what missions are currently available to play
-- `/unfinished` Get what missions are currently available to play and have not had all locations checked
-- `/set_path [path]` Menually set the SC2 install directory (if the automatic detection fails)
-- `/download_data` Download the most recent release of the necassry files for playing SC2 with Archipelago. Will
-  overwrite existing files