From c477dcd065d8d1ed3cf361de98f1f1604fe08d47 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Wed, 29 May 2024 15:49:37 +0200 Subject: [PATCH] Updated python scripts --- scripts/python/.vscode/launch.json | 63 +- scripts/python/addLiveries.py | 4 +- scripts/python/addLoadouts.py | 5 +- scripts/python/addMissingUnits.py | 6 +- scripts/python/addRanges.py | 4 +- scripts/python/convertTags.py | 35 - scripts/python/generatePayloadTables.py | 4 +- scripts/python/http_example.py | 23 - .../python/map_generator/convert_to_jpg.py | 98 -- scripts/python/mod_ac_loadout_puller.py | 69 -- scripts/python/payloadRoles.json | 1089 ++++++++++++++++- scripts/python/requirements.txt | Bin 0 -> 288 bytes 12 files changed, 1155 insertions(+), 245 deletions(-) delete mode 100644 scripts/python/convertTags.py delete mode 100644 scripts/python/http_example.py delete mode 100644 scripts/python/map_generator/convert_to_jpg.py delete mode 100644 scripts/python/mod_ac_loadout_puller.py create mode 100644 scripts/python/requirements.txt diff --git a/scripts/python/.vscode/launch.json b/scripts/python/.vscode/launch.json index 306f58eb..af246bbb 100644 --- a/scripts/python/.vscode/launch.json +++ b/scripts/python/.vscode/launch.json @@ -5,12 +5,71 @@ "version": "0.2.0", "configurations": [ { - "name": "Python: Current File", + "name": "Add missing units", "type": "python", "request": "launch", - "program": "${file}", + "program": "addMissingUnits.py", "console": "integratedTerminal", + "args": ["${input:unitType}", "${input:searchFolder}"], + "justMyCode": true + }, + { + "name": "Add liveries", + "type": "python", + "request": "launch", + "program": "addLiveries.py", + "console": "integratedTerminal", + "args": ["${input:unitType}", "${input:searchFolder}"], + "justMyCode": true + }, + { + "name": "Generate payload tables", + "type": "python", + "request": "launch", + "program": "generatePayloadTables.py", + "console": "integratedTerminal", + "args": ["${input:searchFolder}"], + "justMyCode": true + }, + { + "name": "Add loadouts", + "type": "python", + "request": "launch", + "program": "addLoadouts.py", + "console": "integratedTerminal", + "args": ["${input:unitType}", "${input:searchFolder}"], + "justMyCode": true + }, + { + "name": "Add ranges", + "type": "python", + "request": "launch", + "program": "addRanges.py", + "console": "integratedTerminal", + "args": ["${input:unitType}", "${input:searchFolder}"], "justMyCode": true } + ], + "inputs": [ + { + "id": "unitType", + "type": "command", + "command": "extension.commandvariable.promptStringRemember", + "args": { + "key": "type", + "description": "Unit type (aircraft, helicopter, groundunit, navyunit)", + "default": "aircraft" + } + }, + { + "id": "searchFolder", + "type": "command", + "command": "extension.commandvariable.promptStringRemember", + "args": { + "key": "folder", + "description": "DCS folder location", + "default": "E:\\Eagle Dynamics\\DCS World (Open Beta)" + } + } ] } \ No newline at end of file diff --git a/scripts/python/addLiveries.py b/scripts/python/addLiveries.py index 37af1026..86a57420 100644 --- a/scripts/python/addLiveries.py +++ b/scripts/python/addLiveries.py @@ -4,9 +4,7 @@ import inspect import difflib from slpp import slpp as lua -SEARCH_FOLDER = "D:\\Eagle Dynamics\\DCS World OpenBeta" - -sys.path.append("..\\..\\..\\dcs-master\\dcs-master") +SEARCH_FOLDER = sys.argv[2] from dcs.weapons_data import Weapons from dcs.planes import * diff --git a/scripts/python/addLoadouts.py b/scripts/python/addLoadouts.py index 1f19c592..705657ad 100644 --- a/scripts/python/addLoadouts.py +++ b/scripts/python/addLoadouts.py @@ -4,15 +4,12 @@ import inspect import difflib from slpp import slpp as lua -SEARCH_FOLDER = "D:\\Eagle Dynamics\\DCS World OpenBeta" - -sys.path.append("..\..\..\dcs-master\dcs-master") +SEARCH_FOLDER = sys.argv[2] from dcs.weapons_data import Weapons from dcs.planes import * from dcs.helicopters import * - clsid_conversion = { 'ExtFuelTankID' : "{EFT_230GAL}" , 'InternalFuelTank100' : "{IAFS_ComboPak_100}" , diff --git a/scripts/python/addMissingUnits.py b/scripts/python/addMissingUnits.py index f9eb5a34..0e7eff22 100644 --- a/scripts/python/addMissingUnits.py +++ b/scripts/python/addMissingUnits.py @@ -4,7 +4,7 @@ import inspect import difflib from slpp import slpp as lua -SEARCH_FOLDER = "D:\\Eagle Dynamics\\DCS World OpenBeta" +SEARCH_FOLDER = sys.argv[2] from dcs.vehicles import * from dcs.ships import * @@ -36,8 +36,8 @@ if len(sys.argv) > 1: "name": unit.id, "coalition": "", "era": "", - "label": unit.name, - "shortLabel": unit.name, + "label": unit.livery_name, + "shortLabel": unit.livery_name, "type": unit.__qualname__.split(".")[0], "enabled": False, "liveries": {} diff --git a/scripts/python/addRanges.py b/scripts/python/addRanges.py index a7fe0c68..9edc74bd 100644 --- a/scripts/python/addRanges.py +++ b/scripts/python/addRanges.py @@ -4,9 +4,7 @@ import inspect import difflib from slpp import slpp as lua -SEARCH_FOLDER = "D:\\Eagle Dynamics\\DCS World OpenBeta" - -sys.path.append("..\..\..\dcs-master\dcs-master") +SEARCH_FOLDER = sys.argv[2] from dcs.vehicles import * from dcs.ships import * diff --git a/scripts/python/convertTags.py b/scripts/python/convertTags.py deleted file mode 100644 index c13d0e7d..00000000 --- a/scripts/python/convertTags.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys -import json -import re - - -# The database file on which to operate is the first standard argument of the call -if len(sys.argv) > 1: - if (sys.argv[1] == "aircraft"): - filename = '..\\..\\databases\\units\\aircraftdatabase.json' - elif (sys.argv[1] == "helicopter"): - filename = '..\\..\\databases\\units\\helicopterdatabase.json' - elif (sys.argv[1] == "groundunit"): - filename = '..\\..\\databases\\units\\groundunitdatabase.json' - elif (sys.argv[1] == "navyunit"): - filename = '..\\..\\databases\\units\\navyunitdatabase.json' - - # Loads the database - with open(filename) as f: - database = json.load(f) - - for name in database: - label = database[name]['label'] - print(label) - res = re.findall("\((.*?)\)", label) - for tag in res: - label = label.replace(f"({tag})", "") - label = database[name]['label'] = label - if len(res) > 0: - database[name]["tags"] = "".join([f'{tag}{", " if i < len(res) - 1 else ""}' for i, tag in enumerate(res)]) - - # Dump everything in the database - with open(filename, "w") as f: - json.dump(database, f, indent=2) - -print("Done!") \ No newline at end of file diff --git a/scripts/python/generatePayloadTables.py b/scripts/python/generatePayloadTables.py index 36e3a6f5..69cad34d 100644 --- a/scripts/python/generatePayloadTables.py +++ b/scripts/python/generatePayloadTables.py @@ -4,9 +4,7 @@ import os import json import logging -sys.path.append("..\..\..\dcs-master\dcs-master") - -SEARCH_FOLDER = "D:\\Eagle Dynamics\\DCS World OpenBeta" +SEARCH_FOLDER = sys.argv[1] clsid_conversion = { 'ExtFuelTankID' : "{EFT_230GAL}" , diff --git a/scripts/python/http_example.py b/scripts/python/http_example.py deleted file mode 100644 index 5b857886..00000000 --- a/scripts/python/http_example.py +++ /dev/null @@ -1,23 +0,0 @@ -import socket -from email.utils import formatdate - -sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -sock.bind(('127.0.0.1', 3003)) -sock.listen(5) - -count = 0 -while True: - connection, address = sock.accept() - buf = connection.recv(1024) - print(buf.decode("utf-8")) - if "OPTIONS" in buf.decode("utf-8"): - resp = (f"""HTTP/1.1 200 OK\r\nDate: {formatdate(timeval=None, localtime=False, usegmt=True)}\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Methods: PUT, GET, OPTIONS\r\nAccess-Control-Allow-Headers: *\r\nAccess-Control-Max-Age: 86400\r\nVary: Accept-Encoding, Origin\r\nKeep-Alive: timeout=2, max=100\r\nConnection: Keep-Alive\r\n""".encode("utf-8")) - connection.send(resp) - if not "PUT" in buf.decode("utf-8"): - connection.close() - else: - resp = (f"""HTTP/1.1 200 OK\r\nDate: {formatdate(timeval=None, localtime=False, usegmt=True)}\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Methods: PUT, GET, OPTIONS\r\nAccess-Control-Allow-Headers: *\r\nAccess-Control-Max-Age: 86400\r\nVary: Accept-Encoding, Origin\r\nKeep-Alive: timeout=2, max=100\r\nConnection: Keep-Alive\r\n\r\n{{"Hi": "Wirts!"}}\r\n""".encode("utf-8")) - connection.send(resp) - connection.close() - - count += 1 \ No newline at end of file diff --git a/scripts/python/map_generator/convert_to_jpg.py b/scripts/python/map_generator/convert_to_jpg.py deleted file mode 100644 index 0d3dbefb..00000000 --- a/scripts/python/map_generator/convert_to_jpg.py +++ /dev/null @@ -1,98 +0,0 @@ -import sys -import os -import numpy - -from PIL import Image -from concurrent import futures -from os import listdir -from os.path import isfile, isdir, join - -# global counters -fut_counter = 0 -tot_futs = 0 - -def printProgressBar(iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"): - percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) - filledLength = int(length * iteration // total) - bar = fill * filledLength + '-' * (length - filledLength) - print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd) - # Print New Line on Complete - if iteration == total: - print() - -def done_callback(fut): - global fut_counter, tot_futs - fut_counter += 1 - printProgressBar(fut_counter, tot_futs) - -def remove_black_areas(im): - data = numpy.array(im) - red, green, blue = data.T - - # If present, remove any "black" areas - background_areas = (red < 10) & (blue < 10) & (green < 10) - data[..., :][background_areas.T] = (221, 221, 221) - - return Image.fromarray(data) - -def convert_tiles(source, dest, tile): - zoom = tile[0] - X = tile[1] - Y = tile[2] - - if not os.path.exists(os.path.join(dest, str(zoom))): - try: - os.mkdir(os.path.join(dest, str(zoom))) - except FileExistsError: - # Ignore this error, it means one other thread has already created the folder - pass - except Exception as e: - raise e - - if not os.path.exists(os.path.join(dest, str(zoom), str(X))): - try: - os.mkdir(os.path.join(dest, str(zoom), str(X))) - except FileExistsError: - # Ignore this error, it means one other thread has already created the folder - pass - except Exception as e: - raise e - - remove_black_areas(Image.open(os.path.join(source, str(zoom), str(X), f"{Y}.png")).convert('RGB')).save(os.path.join(dest, str(zoom), str(X), f"{Y}.jpg")) - -if len(sys.argv) < 3: - print("Please provide a source and a destination folder") -else: - source = sys.argv[1] - dest = sys.argv[2] - - if not os.path.exists(dest): - try: - os.mkdir(dest) - except FileExistsError: - # Ignore this error, it means one other thread has already created the folder - pass - except Exception as e: - raise e - - print(f"Listing source tiles...") - existing_tiles = [] - zooms = [int(f) for f in listdir(source) if isdir(join(source, f))] - for zoom in zooms: - Xs = [int(f) for f in listdir(join(source, str(zoom))) if isdir(join(source, str(zoom), f))] - for X in Xs: - Ys = [int(f.removesuffix(".png")) for f in listdir(os.path.join(source, str(zoom), str(X))) if isfile(join(source, str(zoom), str(X), f))] - for Y in Ys: - existing_tiles.append((zoom, X, Y)) - - print(f"{len(existing_tiles)} tiles will be converted") - - # Merge the tiles with parallel thread execution - with futures.ThreadPoolExecutor() as executor: - print(f"Converting tiles to jpg...") - print(f"Initializing exectuion pool") - futs = [executor.submit(convert_tiles, source, dest, tile) for tile in existing_tiles] - tot_futs = len(futs) - fut_counter = 0 - [fut.add_done_callback(done_callback) for fut in futs] - [fut.result() for fut in futures.as_completed(futs)] diff --git a/scripts/python/mod_ac_loadout_puller.py b/scripts/python/mod_ac_loadout_puller.py deleted file mode 100644 index 7124e473..00000000 --- a/scripts/python/mod_ac_loadout_puller.py +++ /dev/null @@ -1,69 +0,0 @@ -import os - -# save DCS.openbeta\\mods\\aircraft path as variable -path = f"{os.environ['UserProfile']}\\Saved Games\\DCS.openbeta\\Mods\\aircraft" - -# write everything to a working file - to be deleted after getting rid of unnecessary trailing commas -with open('working_file.lua', mode='w') as payload_file: - - payload_file.write('Olympus.unitPayloads = {\n') - - # iterate through everything in mod aircraft path - for f in os.listdir(path): - - # modders are inconsistent with the lua filename, so grab that first file in the correct directory - try: - unitpayload_lua_dir = f"{path}\\{f}\\UnitPayloads" - try: - lua_filename = os.listdir(unitpayload_lua_dir)[0] - except IndexError: - pass - unitpayload_lua_path = f"{unitpayload_lua_dir}\\{lua_filename}" - - # read the aircraft's payloads and write the relevant material into the working file - with open(unitpayload_lua_path) as payload_lua_file: - lines = payload_lua_file.readlines() - for line in lines: - if line.startswith(' ["name"]'): - ac_type = line.replace(' ["name"] = "', '').replace('",', '').rstrip() - ac_type = f'["{ac_type}"] =' + r' {' - payload_file.write(ac_type + '\n') - elif line.startswith(' ["name"]'): - loadout_name = line.replace(' ["name"] = "', '').replace('",', '').rstrip() - loadout_name = f'["{loadout_name}"] =' + r' {' - payload_file.write(loadout_name + '\n') - elif line.startswith(' ["CLSID"]'): - clsid = line.replace(' ', '').replace(',', '').rstrip() - clsid = r'{' + f'{clsid}' + r'}' + ',' - elif line.startswith(' ["num"]'): - pylon = line.replace(' ["num"] = ', '').replace(',', '').rstrip() - pylon = f'[{pylon}] = ' - payload_file.write(pylon + clsid + '\n') - elif line.startswith(' },'): - payload_file.write('},\n') - elif line.startswith('}'): - payload_file.write('},\n') - - # skip directory if no directory or no file in directory - except FileNotFoundError: - pass - - payload_file.write('}') - -# parse the working file, get rid of trailing commas when next line starts with a '}'. -with open("working_file.lua") as working_file: - lines = working_file.readlines() - prev_line = '' - with open("payloads.lua", mode="w") as payload_file: - for ind, line in enumerate(lines): - try: - if lines[ind + 1].startswith('}') and line.endswith('},\n'): - new_line = line.replace(',', '') - payload_file.write(f'{new_line}') - else: - payload_file.write(line) - except IndexError: - payload_file.write(line) - -# delete the working file -os.remove("working_file.lua") diff --git a/scripts/python/payloadRoles.json b/scripts/python/payloadRoles.json index 792a2565..e1209339 100644 --- a/scripts/python/payloadRoles.json +++ b/scripts/python/payloadRoles.json @@ -1523,6 +1523,1091 @@ "1": 16 } }, + "F-4E-45MC": { + "IRON: Mk-83*4, Mk-83*3 (Ripple), Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-65A*6, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD: AGM-45A*4, Aim-7E2*3, Aim-9L*4, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "_AFAC: LAU-3 pod - 19x2.75 FFAR, M156 WP*6, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60), Sgt Fl 600 GAL*1": { + "1": 16, + "2": 17 + }, + "_AFAC: LAU-3 19x 2.75 FFAR, M156 WP*2, LAU-68 7x .75, M156 WP*2, Aim-7E2*3, Aim-9P*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60), Sgt Fl 600 GAL*1": { + "1": 16, + "2": 17 + }, + "_A2A HEATERS: Aim-9M*4, ALE-40 (30-60)*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "ATGM: AGM-62 Walleye I*2, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD + GUIDED: AGM-45A*2, GBU-12*2, Aim-7F*3, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "SEAD + ATGM: AGM-45A*2, AGM-65A*2, Aim-7F*3, Aim-9L*4, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "ATGM + GUIDED: AGM-65B*4, GBU-12*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-12*4, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-82 Snakeye*24, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-12*6, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_A2A HEATERS: Aim-9L*4, ALE-40 (30-60)*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "ATGM + GUIDED: AGM-65A*4, GBU-12*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + ROCKETS: SUU-23*2, LAU-3 19x 2.75 FFAR, Mk-5 HEAT*9, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-65B*4, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: Mk-20*12, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ROCKETS: LAU-3 19x 2.75 FFAR, Mk-5 HEAT*3, LAU-68 7x 2.75 FFAR, MK-5 HEAT*6, Aim-7E2*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ROCKETS: LAU-3 19x 2.75 FFAR, Mk-5 HEAT*9, LAU-68 7x 2.75 FFAR, MK-5 HEAT*2, Aim-7E2*4, AIM-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A MEDIUM RANGE: Aim-7F*4, Aim-9P*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "IRON: Mk-82 (LD)*18, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-24*2, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-82 Snakeye*12, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD: AGM-45A*2, Aim-7F*3, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 370 Gal*2": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "_AFAC: LAU-3 19x 2.75 FFAR, M156 WP*4, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60), Sgt Fl 600 GAL*1": { + "1": 16, + "2": 17 + }, + "CONRETE PIERCING: BLU-107/B Durandal*12, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD: SUU-23*3, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-8 HOBOS*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-62 Walleye I*2, GBU-10*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CONRETE PIERCING: BLU-107/B Durandal*12, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_AFAC: LAU-3 pod - 19x2.75 FFAR, M156 WP*5, SUU-23*2, Aim-7E2*4, ALE-40 (30-60)": { + "1": 16, + "2": 17 + }, + "CLUSTER: CBU-87*8, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-52B*4, Aim-7E2*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-65D*4, GBU-12*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD + ATGM: AGM-45A*2, AGM-65D*2, Aim-7F*3, Aim-9L*4, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "CLUSTER: CBU-87*6, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-87*14, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A SHORT RANGE: Aim-7M*4, Aim-9M*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "ATGM: AGM-65D*6, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD: SUU-23*2, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ROCKETS: LAU-3 19x 2.75 FFAR, Mk-5 HEAT*15, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-62 Walleye II*2, GBU-12*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ROCKETS: LAU-3 19x 2.75 FFAR, Mk-5 HEAT*7, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A MEDIUM RANGE: Aim-7M*4, Aim-9M*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "A2A LONG RANGE: Aim-7E*4, Aim-9J*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "GUIDED: GBU-12*4, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: M-117*12, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-82 (LD)*12, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD + ATGM: AGM-45A*2, AGM-65B*2, Aim-7F*3, Aim-9L*4, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "_Z_Clean": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + }, + "GUIDED: GBU-10*2, GBU-12*4, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-8 HOBOS*2, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-65D*4, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CONRETE PIERCING: BLU-107/B Durandal*6, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-52B*4, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + ROCKETS: SUU-23*1, LAU-3 19x 2.75 FFAR, Mk-5 HEAT*4, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-10*2, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A LONG RANGE: Aim-7F*4, Aim-9P*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "_AFAC: LAU-3 19x 2.75 FFAR, M156 WP*4, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60), Sgt Fl 600 GAL*1": { + "1": 16, + "2": 17 + }, + "A2A ECM: Aim-7E*3, Aim-9J*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "A2A LONG RANGE: Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "_A2A HEATERS: Aim-9P*4, ALE-40 (30-60)*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "GUIDED: GBU-24*2, GBU-12*4, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-83*6, Mk-83*3 (Ripple), Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_AFAC: LAU-3 pod - 19x2.75 FFAR, M156 WP*2, SUU-23*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60), Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 16, + "2": 17 + }, + "CLUSTER: Mk-20*10, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A SHORT RANGE: Aim-7E*4, Aim-9J*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "IRON: Mk-84*3, Mk-82 (LD)*4, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + IRON: SUU-23*2, Mk-82 (LD)*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A MEDIUM RANGE: Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "GUIDED: GBU-8 HOBOS*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: M-117*8, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-82 Snakeye*18, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-62 Walleye II*2, GBU-24*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-62 Walleye II*2, GBU-10*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-12A Bullpup*2, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + ROCKETS: SUU-23*3, LAU-68 7x 2.75 FFAR, Mk-5 HEAT*6, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD + ATGM: AGM-45A*2, GBU-8 HOBOS*2, Aim-7F*3, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "CONRETE PIERCING: BLU-107/B Durandal*12, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-65A*2, GBU-24*2, Aim-7E2*3, AIM-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-24*4, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-84*2, Mk-82 (LD)*4, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_A2A HEATERS: Aim-9Juli*4, ALE-40 (30-60)*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "_Z_Clean, Sargent Fletcher Fuel Tank 600 gallons*1": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + }, + "IRON: M-117*6, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_A2A HEATERS: Aim-9B*4, ALE-40 (30-60)*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "ATGM: AGM-12B Bullpup*2, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD + ATGM: AGM-45A*2, AGM-62 Walleye I*2, Aim-7F*3, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "IRON: Mk-84*2, Mk-82 (LD)*6, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-12*2, Aim-7E2*3, Aim-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_A2A TRAINING: Captive Aim-9M for ACM*2, ALQ-131 ECM*1, ALE-40 (empty)*1 ": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "IRON: Mk-84*3, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_Z_Clean, Sargent Fletcher Fuel Tank 370 gallons*2": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + }, + "GUIDED: GBU-12*4, CBU-87*4, Aim-7E2*3, Aim-9L, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A SHORT RANGE: Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "_AFAC: LAU-3 19x 2.75 FFAR, M156 WP*2, LAU-68 7x .75, M156 WP*2, Aim-7E2*3, Aim-9P*4, ALQ-131 ECM*1, ALE-40 (30-60), Sgt Fl 600 GAL*1": { + "1": 16, + "2": 17 + }, + "IRON: Mk-83*10, Mk-83*3 (Ripple), Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1,": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-10*4, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-65B*2, GBU-24*2, Aim-7E2*3, AIM-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A SHORT RANGE: Aim-7F*4, Aim-9P*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "ATGM: AGM-65B*6, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "IRON: Mk-82 (LD)*24, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A ECM: Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "SEAD + ATGM: AGM-45A*2, AGM-62 Walleye II*2, Aim-7F*3, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "IRON: Mk-82 (LD)*10, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A LONG RANGE: Aim-7M*4, Aim-9M*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "IRON: Mk-82 Snakeye*10, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-65D*2, GBU-24*2, Aim-7E2*3, AIM-9L*4, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-65A*4, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + IRON: SUU-23*2, Mk-82 Snakeye*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-52B*10, Aim-7E2*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + Cluster: SUU-23*2, CBU-87*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-52B*10, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_AFAC: LAU-3 pod - 19x2.75 FFAR, M156 WP*6, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60), Sgt Fl 600 GAL*1": { + "1": 16, + "2": 17 + }, + "CLUSTER + IRON: Mk-20*6, Mk-82 (LD)*4 Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM + GUIDED: AGM-62 Walleye I*2, GBU-12*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-62 Walleye II*2, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-8 HOBOS*4, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "SEAD: AGM-45A*2, Aim-7F*3, Aim-9L*4, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 370 Gal*2": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "SEAD: AGM-45A*4, Aim-7E2*3, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1, Sargent Fl. Fuel Tank 370 Gal*2": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "A2A ECM: Aim-7M*3, Aim-9M*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "_A2A HEATERS: Aim-9J*4, ALE-40 (30-60)*1": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "CONRETE PIERCING: BLU-107/B Durandal*6, Aim-7E2*3, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A MEDIUM RANGE: Aim-7E*4, Aim-9J*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "ATGM + GUIDED: AGM-62 Walleye I*2, GBU-24*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "GUIDED: GBU-8 HOBOS*2, GBU-24*2, Aim-7E2*3, AN/AVQ-23 Pave Spike*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + Cluster: SUU-23*2, CBU-52B*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-52B*6, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: Mk-20*6, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-87*12, Aim-7E2*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-52B*6, Aim-7E2*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-87*10, Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER + IRON: Mk-20*6, Mk-82 Snakeye*4 Aim-7E2*3, Aim-9L*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + Cluster: SUU-23*2, Mk-20*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_GUNPOD + ROCKETS: SUU-23*1, LAU-3 19x 2.75 FFAR, Mk-5 HEAT*6, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "A2A ECM: Aim-7F*3, Aim-9P*4, ALQ-131 ECM*1, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "SEAD + GUIDED: AGM-45A*2, GBU-12*2, Aim-7F*3, Aim-9L*4, ALQ-131*1, ALE-40 (30-60)*1, Sargent Fl. Fuel Tank 600 Gal*1": { + "1": 29, + "2": 31, + "3": 32, + "4": 33, + "5": 34, + "6": 30 + }, + "_A2A Refueling Practice: Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 370 GAL*2 empty": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "_A2A Refueling Practice: Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL*1, Sargent Fletcher Fuel Tank 370 GAL*2 empty": { + "1": 11, + "2": 18, + "3": 19, + "4": 10 + }, + "IRON: M-117*17, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-12C Bullpup*2, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "ATGM: AGM-12C Bullpup*4, Aim-7E2*3, ALQ-131 ECM*1, ALE-40 (30-60)*1, Srgt Fletcher Fl. Tank 370 GAL*2": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-1A/A (BLU-4B*513)*5, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-2A/A (BLU-3*361)*5, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-2B/A (BLU-3B*418)*5, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-1A/A (BLU-4B*513)*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-2A/A (BLU-3*361)*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "CLUSTER: CBU-2B/A (BLU-3B*418)*4, Aim-7E2*4, Aim-9L*4, ALE-40 (30-60)*1, Sargent Fletcher Fuel Tank 600 GAL": { + "1": 31, + "2": 32, + "3": 33, + "4": 34, + "5": 30 + }, + "_Z_Clean, Sargent Fletcher Fuel Tank 600 gallons*1, Sargent Fletcher Fuel Tank 370 gallons*2": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + }, + "_Z_Clean, Sargent Fletcher Fuel Tank 370 gallons*2 empty": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + }, + "_Z_Clean, Sargent Fletcher Fuel Tank 600 gallons*1 empty": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + }, + "_Z_Clean, Sargent Fletcher Fuel Tank 600 gallons*1, Sargent Fletcher Fuel Tank 370 gallons*2 empty": { + "1": 11, + "2": 18, + "3": 19, + "5": 10, + "6": 31, + "7": 32, + "8": 33, + "9": 34, + "10": 16, + "11": 30, + "12": 17, + "13": 29 + } + }, "F-5E-3": { "Mk-82LD*4,AIM-9P*2,Fuel 275": { "1": 31, @@ -1810,13 +2895,13 @@ "120gal Fuel*2, 200gal Fuel*2": { "1": 11 }, - "GAR-8*2": { + "AIM-9B*2": { "1": 10, "2": 11, "3": 18, "4": 19 }, - "120gal Fuel*2, GAR-8*2": { + "120gal Fuel*2, AIM-9B*2": { "1": 10, "2": 11, "3": 18, diff --git a/scripts/python/requirements.txt b/scripts/python/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..4fd705ae6023db24a698f317dddafdd6366a3908 GIT binary patch literal 288 zcmYk1T?)c55QOJh@D9EUHZ_`{AoKt}2%bP=YZau$R?y3(0JY3g$X; z$F7oHMjmyk9arT17qVoYDW1P44{#NFuQ`lGYg4a76aKDjantCWoLFvfAWt4TZoVfz VPh6~+RM~2+4H4bPTJ&vG