UNPKG

@armyc2.c5isr.renderer/mil-sym-ts

Version:

MIL-STD-2525 D/E symbol rendering TypeScript library

2,897 lines (2,892 loc) 9.53 MB
let canvas = require("canvas"); //#region src/main/ts/armyc2/c5isr/renderer/utilities/LogLevel.ts /** * Port of java.util.logging.Level class */ var LogLevel = class LogLevel { /** * OFF is a special level that can be used to turn off logging. * This level is initialized to <CODE>Integer.MAX_VALUE</CODE>. */ static OFF = new LogLevel("OFF", Number.MAX_VALUE); /** * SEVERE is a message level indicating a serious failure. * <p> * In general SEVERE messages should describe events that are * of considerable importance and which will prevent normal * program execution. They should be reasonably intelligible * to end users and to system administrators. * This level is initialized to <CODE>1000</CODE>. */ static SEVERE = new LogLevel("SEVERE", 1e3); /** * WARNING is a message level indicating a potential problem. * <p> * In general WARNING messages should describe events that will * be of interest to end users or system managers, or which * indicate potential problems. * This level is initialized to <CODE>900</CODE>. */ static WARNING = new LogLevel("WARNING", 900); /** * INFO is a message level for informational messages. * <p> * Typically INFO messages will be written to the console * or its equivalent. So the INFO level should only be * used for reasonably significant messages that will * make sense to end users and system administrators. * This level is initialized to <CODE>800</CODE>. */ static INFO = new LogLevel("INFO", 800); /** * CONFIG is a message level for static configuration messages. * <p> * CONFIG messages are intended to provide a variety of static * configuration information, to assist in debugging problems * that may be associated with particular configurations. * For example, CONFIG message might include the CPU type, * the graphics depth, the GUI look-and-feel, etc. * This level is initialized to <CODE>700</CODE>. */ static CONFIG = new LogLevel("CONFIG", 700); /** * FINE is a message level providing tracing information. * <p> * All of FINE, FINER, and FINEST are intended for relatively * detailed tracing. The exact meaning of the three levels will * vary between subsystems, but in general, FINEST should be used * for the most voluminous detailed output, FINER for somewhat * less detailed output, and FINE for the lowest volume (and * most important) messages. * <p> * In general the FINE level should be used for information * that will be broadly interesting to developers who do not have * a specialized interest in the specific subsystem. * <p> * FINE messages might include things like minor (recoverable) * failures. Issues indicating potential performance problems * are also worth logging as FINE. * This level is initialized to <CODE>500</CODE>. */ static FINE = new LogLevel("FINE", 500); /** * FINER indicates a fairly detailed tracing message. * By default logging calls for entering, returning, or throwing * an exception are traced at this level. * This level is initialized to <CODE>400</CODE>. */ static FINER = new LogLevel("FINER", 400); /** * FINEST indicates a highly detailed tracing message. * This level is initialized to <CODE>300</CODE>. */ static FINEST = new LogLevel("FINEST", 300); /** * ALL indicates that all messages should be logged. * This level is initialized to <CODE>Integer.MIN_VALUE</CODE>. */ static ALL = new LogLevel("ALL", Number.MIN_VALUE); name; value = 0; constructor(name, value) { this.name = name; this.value = value; } intValue() { return this.value; } getName() { return this.name; } toString() { return this.name; } }; //#endregion //#region src/main/ts/armyc2/c5isr/renderer/utilities/ErrorLogger.ts /** * Error Logging class for Renderer * */ var ErrorLogger = class ErrorLogger { static LoggerName = "ErrorLogger"; static _level = LogLevel.INFO; static _LoggingEnabled = false; static dateFormatOptions = { year: "numeric", month: "short", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric" }; /** * True if logging is enabled * @return {@link Boolean} */ static getLoggingStatus() { return ErrorLogger._LoggingEnabled; } /** * Takes a throwable and puts it's stacktrace into a string. * @param error {@link Error} * @return {@link String} */ static getStackTrace(error) { try { return error.stack; } catch (exc) { if (exc instanceof Error) { ErrorLogger.LogException("ErrorLogger", "getStackTrace", exc); return "Error - couldn't retrieve stack trace"; } else throw exc; } } /** * TRUE: Creates a file handler that will log message to a file. * FALSE: logging just goes to console. * @param enable {@link Boolean} */ static EnableLogging(enable) { ErrorLogger._LoggingEnabled = enable; } /** * Folder location to store the log file. * Defaults to "System.getProperty("user.dir")" * @param path {@link String} * @deprecated */ static setLoggingPath(path) {} /** * clears log files that are beyond a passed number of days old * @param DaysOld {@link Integer} * @deprecated */ static CleanupOldFiles(DaysOld) {} static setLevel(...args) { switch (args.length) { case 1: { const [newLevel] = args; ErrorLogger.setLevel(newLevel, false); break; } case 2: { const [newLevel, setConsoleHandler] = args; ErrorLogger._level = newLevel; break; } default: throw Error(`Invalid number of arguments`); } } /** * Specify whether or not this logger should send its output * to it's parent Logger. This means that any LogRecords will * also be written to the parent's Handlers, and potentially * to its parent, recursively up the namespace. * Defaults to true; * * @param useParentHandlers true if output is to be sent to the * logger's parent. */ static setUseParentHandlers(useParentHandlers) {} /** * Gets the java.util.logging.Level that the logger is set to. * @return {@link Level} */ static getLevel() { return ErrorLogger._level; } /** * * @return {@link String} * @deprecated */ static getFileName() { return ""; } static Entering(...args) { if (console) switch (args.length) { case 2: { const [sourceClass, sourceMethod] = args; if (ErrorLogger._level.intValue() <= LogLevel.FINER.intValue()) console.log("Entering: " + sourceClass + "." + sourceMethod); break; } case 3: if (args[2] instanceof Array) { const [sourceClass, sourceMethod, params] = args; if (ErrorLogger._level.intValue() <= LogLevel.FINER.intValue()) { console.log("Entering: " + sourceClass + "." + sourceMethod + "with params:"); if (params != null) for (let param of params) console.log(param.toString()); } } else { const [sourceClass, sourceMethod, param1] = args; if (ErrorLogger._level.intValue() <= LogLevel.FINER.intValue()) console.log("Entering: " + sourceClass + "." + sourceMethod + " - " + param1.toString()); } break; default: throw Error(`Invalid number of arguments`); } } static Exiting(...args) { if (console) switch (args.length) { case 2: { const [sourceClass, sourceMethod] = args; if (ErrorLogger._level.intValue() <= LogLevel.FINER.intValue()) console.log("Exiting: " + sourceClass + "." + sourceMethod); break; } case 3: { const [sourceClass, sourceMethod, result] = args; if (ErrorLogger._level.intValue() <= LogLevel.FINER.intValue()) console.log("Entering: " + sourceClass + "." + sourceMethod + " - " + result.toString()); break; } default: throw Error(`Invalid number of arguments`); } } static LogMessage(...args) { if (console) switch (args.length) { case 1: { const [message] = args; ErrorLogger.LogMessage(message, LogLevel.INFO, false); break; } case 2: { const [message, showMessageBox] = args; ErrorLogger.LogMessage(message, LogLevel.INFO, showMessageBox); break; } case 3: if (typeof args[2] === "boolean") { const [message, lvl, showMessageBox] = args; if (lvl.intValue() >= ErrorLogger._level.intValue()) { console.log((/* @__PURE__ */ new Date()).toLocaleString("en-US", this.dateFormatOptions) + " " + ErrorLogger.LoggerName); console.log("INFO: " + message); } } else { const [sourceClass, sourceMethod, message] = args; ErrorLogger.LogMessage(sourceClass, sourceMethod, message, LogLevel.INFO, false); } break; case 4: if (typeof args[3] === "boolean") { const [sourceClass, sourceMethod, message, showMessageBox] = args; ErrorLogger.LogMessage(sourceClass, sourceMethod, message, LogLevel.INFO, showMessageBox); } else { const [sourceClass, sourceMethod, message, lvl] = args; ErrorLogger.LogMessage(sourceClass, sourceMethod, message, lvl, false); } break; case 5: { const [sourceClass, sourceMethod, message, lvl, showMessageBox] = args; if (lvl.intValue() >= ErrorLogger._level.intValue()) { console.log((/* @__PURE__ */ new Date()).toLocaleString("en-US", this.dateFormatOptions) + sourceClass + "." + sourceMethod); console.log(lvl.toString() + ": " + message); } break; } case 6: if (Array.isArray(args[4])) { const [sourceClass, sourceMethod, message, lvl, params, showMessageBox] = args; if (lvl.intValue() >= ErrorLogger._level.intValue()) { console.log((/* @__PURE__ */ new Date()).toLocaleString("en-US", this.dateFormatOptions) + sourceClass + "." + sourceMethod); console.log(lvl.toString() + ": " + message); for (let param of params) console.log(param.toString()); } } else { const [sourceClass, sourceMethod, message, lvl, param1, showMessageBox] = args; let params = new Array(1); params[0] = param1; ErrorLogger.LogMessage(sourceClass, sourceMethod, message, lvl, params, showMessageBox); } break; default: throw Error(`Invalid number of arguments`); } } static LogException(...args) { switch (args.length) { case 3: { const [sourceClass, sourceMethod, exc] = args; ErrorLogger.LogException(sourceClass, sourceMethod, exc, LogLevel.INFO, false); break; } case 4: if (typeof args[3] === "boolean") { const [sourceClass, sourceMethod, exc, showMessageBox] = args; ErrorLogger.LogException(sourceClass, sourceMethod, exc, LogLevel.INFO, showMessageBox); } else { const [sourceClass, sourceMethod, exc, lvl] = args; ErrorLogger.LogException(sourceClass, sourceMethod, exc, lvl, false); } break; case 5: { const [sourceClass, sourceMethod, exc, lvl, showMessageBox] = args; if (lvl.intValue() >= ErrorLogger._level.intValue()) if (console) { console.error((/* @__PURE__ */ new Date()).toLocaleString("en-US", this.dateFormatOptions) + sourceClass + "." + sourceMethod); console.error(lvl.toString() + ": " + exc.message); console.error(ErrorLogger.getStackTrace(exc)); } else throw exc; break; } default: throw Error(`Invalid number of arguments`); } } static PrintList(list) { let message = ""; for (let item of list) message += item.toString() + "\n"; return message; } static PrintObjectMap(map) { let message = ""; if (map != null) for (let [key, val] of map) message += key + " : " + val + "\n"; return message; } static PrintStringMap(map) { let message = ""; if (map != null) for (let [key, val] of map) message += key + " : " + val + "\n"; return message; } }; //#endregion //#region src/main/ts/armyc2/c5isr/data/genc.json var genc_default = { genc: { "countries": [ { "2char": "AF", "3char": "AFG", "numeric": "4", "name": "AFGHANISTAN" }, { "2char": "QZ", "3char": "XQZ", "numeric": "900", "name": "AKROTIRI" }, { "2char": "AL", "3char": "ALB", "numeric": "8", "name": "ALBANIA" }, { "2char": "DZ", "3char": "DZA", "numeric": "12", "name": "ALGERIA" }, { "2char": "AS", "3char": "ASM", "numeric": "16", "name": "AMERICAN SAMOA" }, { "2char": "AD", "3char": "AND", "numeric": "20", "name": "ANDORRA" }, { "2char": "AO", "3char": "AGO", "numeric": "24", "name": "ANGOLA" }, { "2char": "AI", "3char": "AIA", "numeric": "660", "name": "ANGUILLA" }, { "2char": "AQ", "3char": "ATA", "numeric": "10", "name": "ANTARCTICA" }, { "2char": "AG", "3char": "ATG", "numeric": "28", "name": "ANTIGUA AND BARBUDA" }, { "2char": "AR", "3char": "ARG", "numeric": "32", "name": "ARGENTINA" }, { "2char": "AM", "3char": "ARM", "numeric": "51", "name": "ARMENIA" }, { "2char": "AW", "3char": "ABW", "numeric": "533", "name": "ARUBA" }, { "2char": "XA", "3char": "XAC", "numeric": "902", "name": "ASHMORE AND CARTIER ISLANDS" }, { "2char": "AU", "3char": "AUS", "numeric": "36", "name": "AUSTRALIA" }, { "2char": "AT", "3char": "AUT", "numeric": "40", "name": "AUSTRIA" }, { "2char": "AZ", "3char": "AZE", "numeric": "31", "name": "AZERBAIJAN" }, { "2char": "BS", "3char": "BHS", "numeric": "44", "name": "BAHAMAS, THE" }, { "2char": "BH", "3char": "BHR", "numeric": "48", "name": "BAHRAIN" }, { "2char": "XB", "3char": "XBK", "numeric": "903", "name": "BAKER ISLAND" }, { "2char": "BD", "3char": "BGD", "numeric": "50", "name": "BANGLADESH" }, { "2char": "BB", "3char": "BRB", "numeric": "52", "name": "BARBADOS" }, { "2char": "QS", "3char": "XBI", "numeric": "904", "name": "BASSAS DA INDIA" }, { "2char": "BY", "3char": "BLR", "numeric": "112", "name": "BELARUS" }, { "2char": "BE", "3char": "BEL", "numeric": "56", "name": "BELGIUM" }, { "2char": "BZ", "3char": "BLZ", "numeric": "84", "name": "BELIZE" }, { "2char": "BJ", "3char": "BEN", "numeric": "204", "name": "BENIN" }, { "2char": "BM", "3char": "BMU", "numeric": "60", "name": "BERMUDA" }, { "2char": "BT", "3char": "BTN", "numeric": "64", "name": "BHUTAN" }, { "2char": "BO", "3char": "BOL", "numeric": "68", "name": "BOLIVIA" }, { "2char": "BQ", "3char": "BES", "numeric": "535", "name": "BONAIRE, SINT EUSTATIUS, AND SABA" }, { "2char": "BA", "3char": "BIH", "numeric": "70", "name": "BOSNIA AND HERZEGOVINA" }, { "2char": "BW", "3char": "BWA", "numeric": "72", "name": "BOTSWANA" }, { "2char": "BV", "3char": "BVT", "numeric": "74", "name": "BOUVET ISLAND" }, { "2char": "BR", "3char": "BRA", "numeric": "76", "name": "BRAZIL" }, { "2char": "IO", "3char": "IOT", "numeric": "86", "name": "BRITISH INDIAN OCEAN TERRITORY" }, { "2char": "BN", "3char": "BRN", "numeric": "96", "name": "BRUNEI" }, { "2char": "BG", "3char": "BGR", "numeric": "100", "name": "BULGARIA" }, { "2char": "BF", "3char": "BFA", "numeric": "854", "name": "BURKINA FASO" }, { "2char": "MM", "3char": "MMR", "numeric": "104", "name": "BURMA" }, { "2char": "BI", "3char": "BDI", "numeric": "108", "name": "BURUNDI" }, { "2char": "CV", "3char": "CPV", "numeric": "132", "name": "CABO VERDE" }, { "2char": "KH", "3char": "KHM", "numeric": "116", "name": "CAMBODIA" }, { "2char": "CM", "3char": "CMR", "numeric": "120", "name": "CAMEROON" }, { "2char": "CA", "3char": "CAN", "numeric": "124", "name": "CANADA" }, { "2char": "KY", "3char": "CYM", "numeric": "136", "name": "CAYMAN ISLANDS" }, { "2char": "CF", "3char": "CAF", "numeric": "140", "name": "CENTRAL AFRICAN REPUBLIC" }, { "2char": "TD", "3char": "TCD", "numeric": "148", "name": "CHAD" }, { "2char": "CL", "3char": "CHL", "numeric": "152", "name": "CHILE" }, { "2char": "CN", "3char": "CHN", "numeric": "156", "name": "CHINA" }, { "2char": "CX", "3char": "CXR", "numeric": "162", "name": "CHRISTMAS ISLAND" }, { "2char": "CP", "3char": "CPT", "numeric": "905", "name": "CLIPPERTON ISLAND" }, { "2char": "CC", "3char": "CCK", "numeric": "166", "name": "COCOS (KEELING) ISLANDS" }, { "2char": "CO", "3char": "COL", "numeric": "170", "name": "COLOMBIA" }, { "2char": "KM", "3char": "COM", "numeric": "174", "name": "COMOROS" }, { "2char": "CG", "3char": "COG", "numeric": "178", "name": "CONGO (BRAZZAVILLE)" }, { "2char": "CD", "3char": "COD", "numeric": "180", "name": "CONGO (KINSHASA)" }, { "2char": "CK", "3char": "COK", "numeric": "184", "name": "COOK ISLANDS" }, { "2char": "XC", "3char": "XCS", "numeric": "906", "name": "CORAL SEA ISLANDS" }, { "2char": "CR", "3char": "CRI", "numeric": "188", "name": "COSTA RICA" }, { "2char": "CI", "3char": "CIV", "numeric": "384", "name": "CÔTE D’IVOIRE" }, { "2char": "HR", "3char": "HRV", "numeric": "191", "name": "CROATIA" }, { "2char": "CU", "3char": "CUB", "numeric": "192", "name": "CUBA" }, { "2char": "CW", "3char": "CUW", "numeric": "531", "name": "CURAÇAO" }, { "2char": "CY", "3char": "CYP", "numeric": "196", "name": "CYPRUS" }, { "2char": "CZ", "3char": "CZE", "numeric": "203", "name": "CZECHIA" }, { "2char": "DK", "3char": "DNK", "numeric": "208", "name": "DENMARK" }, { "2char": "XD", "3char": "XXD", "numeric": "907", "name": "DHEKELIA" }, { "2char": "DG", "3char": "DGA", "numeric": "908", "name": "DIEGO GARCIA" }, { "2char": "DJ", "3char": "DJI", "numeric": "262", "name": "DJIBOUTI" }, { "2char": "DM", "3char": "DMA", "numeric": "212", "name": "DOMINICA" }, { "2char": "DO", "3char": "DOM", "numeric": "214", "name": "DOMINICAN REPUBLIC" }, { "2char": "EC", "3char": "ECU", "numeric": "218", "name": "ECUADOR" }, { "2char": "EG", "3char": "EGY", "numeric": "818", "name": "EGYPT" }, { "2char": "SV", "3char": "SLV", "numeric": "222", "name": "EL SALVADOR" }, { "2char": "[None Assigned]", "3char": "XAZ", "numeric": "909", "name": "ENTITY 1" }, { "2char": "[None Assigned]", "3char": "XCR", "numeric": "910", "name": "ENTITY 2" }, { "2char": "[None Assigned]", "3char": "XCY", "numeric": "911", "name": "ENTITY 3" }, { "2char": "[None Assigned]", "3char": "XKM", "numeric": "912", "name": "ENTITY 4" }, { "2char": "[None Assigned]", "3char": "XKN", "numeric": "913", "name": "ENTITY 5" }, { "2char": "A3", "3char": "AX3", "numeric": "914", "name": "ENTITY 6" }, { "2char": "GQ", "3char": "GNQ", "numeric": "226", "name": "EQUATORIAL GUINEA" }, { "2char": "ER", "3char": "ERI", "numeric": "232", "name": "ERITREA" }, { "2char": "EE", "3char": "EST", "numeric": "233", "name": "ESTONIA" }, { "2char": "SZ", "3char": "SWZ", "numeric": "748", "name": "ESWATINI" }, { "2char": "ET", "3char": "ETH", "numeric": "231", "name": "ETHIOPIA" }, { "2char": "XE", "3char": "XEU", "numeric": "915", "name": "EUROPA ISLAND" }, { "2char": "FK", "3char": "FLK", "numeric": "238", "name": "FALKLAND ISLANDS (ISLAS MALVINAS)" }, { "2char": "FO", "3char": "FRO", "numeric": "234", "name": "FAROE ISLANDS" }, { "2char": "FJ", "3char": "FJI", "numeric": "242", "name": "FIJI" }, { "2char": "FI", "3char": "FIN", "numeric": "246", "name": "FINLAND" }, { "2char": "FR", "3char": "FRA", "numeric": "250", "name": "FRANCE" }, { "2char": "GF", "3char": "GUF", "numeric": "254", "name": "FRENCH GUIANA" }, { "2char": "PF", "3char": "PYF", "numeric": "258", "name": "FRENCH POLYNESIA" }, { "2char": "TF", "3char": "ATF", "numeric": "260", "name": "FRENCH SOUTHERN AND ANTARCTIC LANDS" }, { "2char": "GA", "3char": "GAB", "numeric": "266", "name": "GABON" }, { "2char": "GM", "3char": "GMB", "numeric": "270", "name": "GAMBIA, THE" }, { "2char": "XG", "3char": "XGZ", "numeric": "916", "name": "GAZA STRIP" }, { "2char": "GE", "3char": "GEO", "numeric": "268", "name": "GEORGIA" }, { "2char": "DE", "3char": "DEU", "numeric": "276", "name": "GERMANY" }, { "2char": "GH", "3char": "GHA", "numeric": "288", "name": "GHANA" }, { "2char": "GI", "3char": "GIB", "numeric": "292", "name": "GIBRALTAR" }, { "2char": "QX", "3char": "XGL", "numeric": "917", "name": "GLORIOSO ISLANDS" }, { "2char": "GR", "3char": "GRC", "numeric": "300", "name": "GREECE" }, { "2char": "GL", "3char": "GRL", "numeric": "304", "name": "GREENLAND" }, { "2char": "GD", "3char": "GRD", "numeric": "308", "name": "GRENADA" }, { "2char": "GP", "3char": "GLP", "numeric": "312", "name": "GUADELOUPE" }, { "2char": "GU", "3char": "GUM", "numeric": "316", "name": "GUAM" }, { "2char": "A2", "3char": "AX2", "numeric": "918", "name": "GUANTANAMO BAY NAVAL BASE" }, { "2char": "GT", "3char": "GTM", "numeric": "320", "name": "GUATEMALA" }, { "2char": "GG", "3char": "GGY", "numeric": "831", "name": "GUERNSEY" }, { "2char": "GN", "3char": "GIN", "numeric": "324", "name": "GUINEA" }, { "2char": "GW", "3char": "GNB", "numeric": "624", "name": "GUINEA-BISSAU" }, { "2char": "GY", "3char": "GUY", "numeric": "328", "name": "GUYANA" }, { "2char": "HT", "3char": "HTI", "numeric": "332", "name": "HAITI" }, { "2char": "HM", "3char": "HMD", "numeric": "334", "name": "HEARD ISLAND AND MCDONALD ISLANDS" }, { "2char": "HN", "3char": "HND", "numeric": "340", "name": "HONDURAS" }, { "2char": "HK", "3char": "HKG", "numeric": "344", "name": "HONG KONG" }, { "2char": "XH", "3char": "XHO", "numeric": "919", "name": "HOWLAND ISLAND" }, { "2char": "HU", "3char": "HUN", "numeric": "348", "name": "HUNGARY" }, { "2char": "IS", "3char": "ISL", "numeric": "352", "name": "ICELAND" }, { "2char": "IN", "3char": "IND", "numeric": "356", "name": "INDIA" }, { "2char": "ID", "3char": "IDN", "numeric": "360", "name": "INDONESIA" }, { "2char": "IR", "3char": "IRN", "numeric": "364", "name": "IRAN" }, { "2char": "IQ", "3char": "IRQ", "numeric": "368", "name": "IRAQ" }, { "2char": "IE", "3char": "IRL", "numeric": "372", "name": "IRELAND" }, { "2char": "IM", "3char": "IMN", "numeric": "833", "name": "ISLE OF MAN" }, { "2char": "IL", "3char": "ISR", "numeric": "376", "name": "ISRAEL" }, { "2char": "IT", "3char": "ITA", "numeric": "380", "name": "ITALY" }, { "2char": "JM", "3char": "JAM", "numeric": "388", "name": "JAMAICA" }, { "2char": "XJ", "3char": "XJM", "numeric": "920", "name": "JAN MAYEN" }, { "2char": "JP", "3char": "JPN", "numeric": "392", "name": "JAPAN" }, { "2char": "XQ", "3char": "XJV", "numeric": "921", "name": "JARVIS ISLAND" }, { "2char": "JE", "3char": "JEY", "numeric": "832", "name": "JERSEY" }, { "2char": "XU", "3char": "XJA", "numeric": "922", "name": "JOHNSTON ATOLL" }, { "2char": "JO", "3char": "JOR", "numeric": "400", "name": "JORDAN" }, { "2char": "QU", "3char": "XJN", "numeric": "923", "name": "JUAN DE NOVA ISLAND" }, { "2char": "KZ", "3char": "KAZ", "numeric": "398", "name": "KAZAKHSTAN" }, { "2char": "KE", "3char": "KEN", "numeric": "404", "name": "KENYA" }, { "2char": "XM", "3char": "XKR", "numeric": "924", "name": "KINGMAN REEF" }, { "2char": "KI", "3char": "KIR", "numeric": "296", "name": "KIRIBATI" }, { "2char": "KP", "3char": "PRK", "numeric": "408", "name": "KOREA, NORTH" }, { "2char": "KR", "3char": "KOR", "numeric": "410", "name": "KOREA, SOUTH" }, { "2char": "XK", "3char": "XKS", "numeric": "901", "name": "KOSOVO" }, { "2char": "KW", "3char": "KWT", "numeric": "414", "name": "KUWAIT" }, { "2char": "KG", "3char": "KGZ", "numeric": "417", "name": "KYRGYZSTAN" }, { "2char": "LA", "3char": "LAO", "numeric": "418", "name": "LAOS" }, { "2char": "LV", "3char": "LVA", "numeric": "428", "name": "LATVIA" }, { "2char": "LB", "3char": "LBN", "numeric": "422", "name": "LEBANON" }, { "2char": "LS", "3char": "LSO", "numeric": "426", "name": "LESOTHO" }, { "2char": "LR", "3char": "LBR", "numeric": "430", "name": "LIBERIA" }, { "2char": "LY", "3char": "LBY", "numeric": "434", "name": "LIBYA" }, { "2char": "LI", "3char": "LIE", "numeric": "438", "name": "LIECHTENSTEIN" }, { "2char": "LT", "3char": "LTU", "numeric": "440", "name": "LITHUANIA" }, { "2char": "LU", "3char": "LUX", "numeric": "442", "name": "LUXEMBOURG" }, { "2char": "MO", "3char": "MAC", "numeric": "446", "name": "MACAU" }, { "2char": "MG", "3char": "MDG", "numeric": "450", "name": "MADAGASCAR" }, { "2char": "MW", "3char": "MWI", "numeric": "454", "name": "MALAWI" }, { "2char": "MY", "3char": "MYS", "numeric": "458", "name": "MALAYSIA" }, { "2char": "MV", "3char": "MDV", "numeric": "462", "name": "MALDIVES" }, { "2char": "ML", "3char": "MLI", "numeric": "466", "name": "MALI" }, { "2char": "MT", "3char": "MLT", "numeric": "470", "name": "MALTA" }, { "2char": "MH", "3char": "MHL", "numeric": "584", "name": "MARSHALL ISLANDS" }, { "2char": "MQ", "3char": "MTQ", "numeric": "474", "name": "MARTINIQUE" }, { "2char": "MR", "3char": "MRT", "numeric": "478", "name": "MAURITANIA" }, { "2char": "MU", "3char": "MUS", "numeric": "480", "name": "MAURITIUS" }, { "2char": "YT", "3char": "MYT", "numeric": "175", "name": "MAYOTTE" }, { "2char": "MX", "3char": "MEX", "numeric": "484", "name": "MEXICO" }, { "2char": "FM", "3char": "FSM", "numeric": "583", "name": "MICRONESIA, FEDERATED STATES OF" }, { "2char": "QM", "3char": "XMW", "numeric": "925", "name": "MIDWAY ISLANDS" }, { "2char": "MD", "3char": "MDA", "numeric": "498", "name": "MOLDOVA" }, { "2char": "MC", "3char": "MCO", "numeric": "492", "name": "MONACO" }, { "2char": "MN", "3char": "MNG", "numeric": "496", "name": "MONGOLIA" }, { "2char": "ME", "3char": "MNE", "numeric": "499", "name": "MONTENEGRO" }, { "2char": "MS", "3char": "MSR", "numeric": "500", "name": "MONTSERRAT" }, { "2char": "MA", "3char": "MAR", "numeric": "504", "name": "MOROCCO" }, { "2char": "MZ", "3char": "MOZ", "numeric": "508", "name": "MOZAMBIQUE" }, { "2char": "NA", "3char": "NAM", "numeric": "516", "name": "NAMIBIA" }, { "2char": "NR", "3char": "NRU", "numeric": "520", "name": "NAURU" }, { "2char": "XV", "3char": "XNV", "numeric": "926", "name": "NAVASSA ISLAND" }, { "2char": "NP", "3char": "NPL", "numeric": "524", "name": "NEPAL" }, { "2char": "NL", "3char": "NLD", "numeric": "528", "name": "NETHERLANDS" }, { "2char": "NC", "3char": "NCL", "numeric": "540", "name": "NEW CALEDONIA" }, { "2char": "NZ", "3char": "NZL", "numeric": "554", "name": "NEW ZEALAND" }, { "2char": "NI", "3char": "NIC", "numeric": "558", "name": "NICARAGUA" }, { "2char": "NE", "3char": "NER", "numeric": "562", "name": "NIGER" }, { "2char": "NG", "3char": "NGA", "numeric": "566", "name": "NIGERIA" }, { "2char": "NU", "3char": "NIU", "numeric": "570", "name": "NIUE" }, { "2char": "NF", "3char": "NFK", "numeric": "574", "name": "NORFOLK ISLAND" }, { "2char": "MK", "3char": "MKD", "numeric": "807", "name": "NORTH MACEDONIA" }, { "2char": "MP", "3char": "MNP", "numeric": "580", "name": "NORTHERN MARIANA ISLANDS" }, { "2char": "NO", "3char": "NOR", "numeric": "578", "name": "NORWAY" }, { "2char": "OM", "3char": "OMN", "numeric": "512", "name": "OMAN" }, { "2char": "PK", "3char": "PAK", "numeric": "586", "name": "PAKISTAN" }, { "2char": "PW", "3char": "PLW", "numeric": "585", "name": "PALAU" }, { "2char": "XL", "3char": "XPL", "numeric": "927", "name": "PALMYRA ATOLL" }, { "2char": "PA", "3char": "PAN", "numeric": "591", "name": "PANAMA" }, { "2char": "PG", "3char": "PNG", "numeric": "598", "name": "PAPUA NEW GUINEA" }, { "2char": "XP", "3char": "XPR", "numeric": "928", "name": "PARACEL ISLANDS" }, { "2char": "PY", "3char": "PRY", "numeric": "600", "name": "PARAGUAY" }, { "2char": "PE", "3char": "PER", "numeric": "604", "name": "PERU" }, { "2char": "PH", "3char": "PHL", "numeric": "608", "name": "PHILIPPINES" }, { "2char": "PN", "3char": "PCN", "numeric": "612", "name": "PITCAIRN ISLANDS" }, { "2char": "PL", "3char": "POL", "numeric": "616", "name": "POLAND" }, { "2char": "PT", "3char": "PRT", "numeric": "620", "name": "PORTUGAL" }, { "2char": "PR", "3char": "PRI", "numeric": "630", "name": "PUERTO RICO" }, { "2char": "QA", "3char": "QAT", "numeric": "634", "name": "QATAR" }, { "2char": "RE", "3char": "REU", "numeric": "638", "name": "REUNION" }, { "2char": "RO", "3char": "ROU", "numeric": "642", "name": "ROMANIA" }, { "2char": "RU", "3char": "RUS", "numeric": "643", "name": "RUSSIA" }, { "2char": "RW", "3char": "RWA", "numeric": "646", "name": "RWANDA" }, { "2char": "BL", "3char": "BLM", "numeric": "652", "name": "SAINT BARTHELEMY" }, { "2char": "SH", "3char": "SHN", "numeric": "654", "name": "SAINT HELENA, ASCENSION, AND TRISTAN DA CUNHA" }, { "2char": "KN", "3char": "KNA", "numeric": "659", "name": "SAINT KITTS AND NEVIS" }, { "2char": "LC", "3char": "LCA", "numeric": "662", "name": "SAINT LUCIA" }, { "2char": "MF", "3char": "MAF", "numeric": "663", "name": "SAINT MARTIN" }, { "2char": "PM", "3char": "SPM", "numeric": "666", "name": "SAINT PIERRE AND MIQUELON" }, { "2char": "VC", "3char": "VCT", "numeric": "670", "name": "SAINT VINCENT AND THE GRENADINES" }, { "2char": "WS", "3char": "WSM", "numeric": "882", "name": "SAMOA" }, { "2char": "SM", "3char": "SMR", "numeric": "674", "name": "SAN MARINO" }, { "2char": "ST", "3char": "STP", "numeric": "678", "name": "SAO TOME AND PRINCIPE" }, { "2char": "SA", "3char": "SAU", "numeric": "682", "name": "SAUDI ARABIA" }, { "2char": "SN", "3char": "SEN", "numeric": "686", "name": "SENEGAL" }, { "2char": "RS", "3char": "SRB", "numeric": "688", "name": "SERBIA" }, { "2char": "SC", "3char": "SYC", "numeric": "690", "name": "SEYCHELLES" }, { "2char": "SL", "3char": "SLE", "numeric": "694", "name": "SIERRA LEONE" }, { "2char": "SG", "3char": "SGP", "numeric": "702", "name": "SINGAPORE" }, { "2char": "SX", "3char": "SXM", "numeric": "534", "name": "SINT MAARTEN" }, { "2char": "SK", "3char": "SVK", "numeric": "703", "name": "SLOVAKIA" }, { "2char": "SI", "3char": "SVN", "numeric": "705", "name": "SLOVENIA" }, { "2char": "SB", "3char": "SLB", "numeric": "90", "name": "SOLOMON ISLANDS" }, { "2char": "SO", "3char": "SOM", "numeric": "706", "name": "SOMALIA" }, { "2char": "ZA", "3char": "ZAF", "numeric": "710", "name": "SOUTH AFRICA" }, { "2char": "GS", "3char": "SGS", "numeric": "239", "name": "SOUTH GEORGIA AND SOUTH SANDWICH ISLANDS" }, { "2char": "SS", "3char": "SSD", "numeric": "728", "name": "SOUTH SUDAN" }, { "2char": "ES", "3char": "ESP", "numeric": "724", "name": "SPAIN" }, { "2char": "XS", "3char": "XSP", "numeric": "929", "name": "SPRATLY ISLANDS" }, { "2char": "LK", "3char": "LKA", "numeric": "144", "name": "SRI LANKA" }, { "2char": "SD", "3char": "SDN", "numeric": "729", "name": "SUDAN" }, { "2char": "SR", "3char": "SUR", "numeric": "740", "name": "SURINAME" }, { "2char": "XR", "3char": "XSV", "numeric": "930", "name": "SVALBARD" }, { "2char": "SE", "3char": "SWE", "numeric": "752", "name": "SWEDEN" }, { "2char": "CH", "3char": "CHE", "numeric": "756", "name": "SWITZERLAND" }, { "2char": "SY", "3char": "SYR", "numeric": "760", "name": "SYRIA" }, { "2char": "TW", "3char": "TWN", "numeric": "158", "name": "TAIWAN" }, { "2char": "TJ", "3char": "TJK", "numeric": "762", "name": "TAJIKISTAN" }, { "2char": "TZ", "3char": "TZA", "numeric": "834", "name": "TANZANIA" }, { "2char": "TH", "3char": "THA", "numeric": "764", "name": "THAILAND" }, { "2char": "TL", "3char": "TLS", "numeric": "626", "name": "TIMOR-LESTE" }, { "2char": "TG", "3char": "TGO", "numeric": "768", "name": "TOGO" }, { "2char": "TK", "3char": "TKL", "numeric": "772", "name": "TOKELAU" }, { "2char": "TO", "3char": "TON", "numeric": "776", "name": "TONGA" }, { "2char": "TT", "3char": "TTO", "numeric": "780", "name": "TRINIDAD AND TOBAGO" }, { "2char": "XT", "3char": "XTR", "numeric": "931", "name": "TROMELIN ISLAND" }, { "2char": "TN", "3char": "TUN", "numeric": "788", "name": "TUNISIA" }, { "2char": "TR", "3char": "TUR", "numeric": "792", "name": "TURKEY" }, { "2char": "TM", "3char": "TKM", "numeric": "795", "name": "TURKMENISTAN" }, { "2char": "TC", "3char": "TCA", "numeric": "796", "name": "TURKS AND CAICOS ISLANDS" }, { "2char": "TV", "3char": "TUV", "numeric": "798", "name": "TUVALU" }, { "2char": "UG", "3char": "UGA", "numeric": "800", "name": "UGANDA" }, { "2char": "UA", "3char": "UKR", "numeric": "804", "name": "UKRAINE" }, { "2char": "AE", "3char": "ARE", "numeric": "784", "name": "UNITED ARAB EMIRATES" }, { "2char": "GB", "3char": "GBR", "numeric": "826", "name": "UNITED KINGDOM" }, { "2char": "US", "3char": "USA", "numeric": "840", "name": "UNITED STATES" }, { "2char": "A1", "3char": "AX1", "numeric": "932", "name": "UNKNOWN" }, { "2char": "UY", "3char": "URY", "numeric": "858", "name": "URUGUAY" }, { "2char": "UZ", "3char": "UZB", "numeric": "860", "name": "UZBEKISTAN" }, { "2char": "VU", "3char": "VUT", "numeric": "548", "name": "VANUATU" }, { "2char": "VA", "3char": "VAT", "numeric": "336", "name": "VATICAN CITY" }, { "2char": "VE", "3char": "VEN", "numeric": "862", "name": "VENEZUELA" }, { "2char": "VN", "3char": "VNM", "numeric": "704", "name": "VIETNAM" }, { "2char": "VG", "3char": "VGB", "numeric": "92", "name": "VIRGIN ISLANDS, BRITISH" }, { "2char": "VI", "3char": "VIR", "numeric": "850", "name": "VIRGIN ISLANDS, U.S." }, { "2char": "QW", "3char": "XWK", "numeric": "933", "name": "WAKE ISLAND" }, { "2char": "WF", "3char": "WLF", "numeric": "876", "name": "WALLIS AND FUTUNA" }, { "2char": "XW", "3char": "XWB", "numeric": "934", "name": "WEST BANK" }, { "2char": "EH", "3char": "ESH", "numeric": "732", "name": "WESTERN SAHARA" }, { "2char": "YE", "3char": "YEM", "numeric": "887", "name": "YEMEN" }, { "2char": "ZM", "3char": "ZMB", "numeric": "894", "name": "ZAMBIA" }, { "2char": "ZW", "3char": "ZWE", "numeric": "716", "name": "ZIMBABWE" } ] } }; //#endregion //#region src/main/ts/armyc2/c5isr/renderer/utilities/GENCLookup.ts /** * Utility class that takes the 3 digit country code from the symbol ID and returns the 3 character string representation * of that country. For example, 840 turns into "USA" for the United States. */ var GENCLookup = class GENCLookup { static gencJSON = "/genc.json"; static _instance; static _initCalled = false; static _isReady = false; static _GENCLookup; static genc; /** * * @param url * @deprecated */ static async setData(url) {} constructor() { this.init(); } static getInstance() { if (!GENCLookup._instance) GENCLookup._instance = new GENCLookup(); return GENCLookup._instance; } isReady() { return GENCLookup._isReady; } init() { if (typeof genc_default === "object") GENCLookup.genc = genc_default; if (GENCLookup._initCalled === false) { GENCLookup._initCalled = true; GENCLookup._GENCLookup = /* @__PURE__ */ new Map(); try { let gencJSON = GENCLookup.genc["genc"]["countries"]; for (let countryJSON of gencJSON) { GENCLookup._GENCLookup.set(countryJSON["numeric"], countryJSON["3char"]); if (countryJSON["2char"].length === 2) GENCLookup._GENCLookup.set(countryJSON["2char"], countryJSON["numeric"]); } } catch (e) { if (console && e instanceof Error) console.log(e.message); else throw e; } } if (GENCLookup._GENCLookup && GENCLookup._GENCLookup.size > 0) GENCLookup._isReady = true; } /** * * @param id 3 digit code from 2525D+ symbol code * @return */ get3CharCode(id) { if (GENCLookup._GENCLookup && GENCLookup._GENCLookup.has(String(id))) return GENCLookup._GENCLookup.get(String(id)); return ""; } /** * * @param id 2 char string from 2525C symbol code * @return */ get3DigitCode(id) { if (GENCLookup._GENCLookup && GENCLookup._GENCLookup.has(id)) { let code = GENCLookup._GENCLookup.get(id); while (code.length < 3) code = "0" + code; return code; } return "000"; } }; //#endregion //#region src/main/ts/armyc2/c5isr/data/c2d.json var c2d_default = { c2d: { "symbols": [ { "basic": "S*A*M-----*****", "ss": "01", "ec": "110000", "s1": "00", "s2": "00", "e": "Military" }, { "basic": "S*A*MF----*****", "ss": "01", "ec": "110100", "s1": "00", "s2": "00", "e": "", "et": "Fixed Wing" }, { "basic": "S*A*MFO---*****", "ss": "01", "ec": "110101", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Medical Evacuation (MEDEVAC)" }, { "basic": "S*A*MFA---*****", "ss": "01", "ec": "110102", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Attack/Strike" }, { "basic": "S*A*MFB---*****", "ss": "01", "ec": "110103", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Bomber" }, { "basic": "S*A*MFF---*****", "ss": "01", "ec": "110104", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Fighter" }, { "basic": "S*A*MFC---*****", "ss": "01", "ec": "110107", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Cargo" }, { "basic": "S*A*MFCL--*****", "ss": "01", "ec": "110107", "s1": "00", "s2": "03", "e": "", "et": "", "est": "Cargo, Light" }, { "basic": "S*A*MFCM--*****", "ss": "01", "ec": "110107", "s1": "00", "s2": "02", "e": "", "et": "", "est": "Cargo, Medium" }, { "basic": "S*A*MFCH--*****", "ss": "01", "ec": "110107", "s1": "00", "s2": "01", "e": "", "et": "", "est": "Cargo, Heavy" }, { "basic": "S*A*MFJ---*****", "ss": "01", "ec": "110108", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Electronic Combat (EC)/Jammer" }, { "basic": "S*A*MFK---*****", "ss": "01", "ec": "110109", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Tanker" }, { "basic": "S*A*MFKB--*****", "ss": "01", "ec": "110109", "s1": "00", "s2": "04", "e": "", "et": "", "est": "Tanker, Boom Only", "__parsed_extra": ["", "Location of MOD is switch betweens versions"] }, { "basic": "S*A*MFKD--*****", "ss": "01", "ec": "110109", "s1": "00", "s2": "05", "e": "", "et": "", "est": "Tanker, Drogue Only", "__parsed_extra": ["", "Location of MOD is switch betweens versions"] }, { "basic": "S*A*MFP---*****", "ss": "01", "ec": "110110", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Patrol" }, { "basic": "S*A*MFR---*****", "ss": "01", "ec": "110111", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Reconnaissance" }, { "basic": "S*A*MFT---*****", "ss": "01", "ec": "110112", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Trainer" }, { "basic": "S*A*MFU---*****", "ss": "01", "ec": "110113", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Utility" }, { "basic": "S*A*MFUL--*****", "ss": "01", "ec": "110113", "s1": "00", "s2": "03", "e": "", "et": "", "est": "Utility, Light" }, { "basic": "S*A*MFUM--*****", "ss": "01", "ec": "110113", "s1": "00", "s2": "02", "e": "", "et": "", "est": "Utility, Medium" }, { "basic": "S*A*MFUH--*****", "ss": "01", "ec": "110113", "s1": "00", "s2": "01", "e": "", "et": "", "est": "Utility, Heavy" }, { "basic": "S*A*MFL---*****", "ss": "01", "ec": "110114", "s1": "00", "s2": "00", "e": "", "et": "", "est": "VSTOL", "__parsed_extra": ["", "Symbols are different between versions"] }, { "basic": "S*A*MFD---*****", "ss": "01", "ec": "110115", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Airborne Command Post (ACP)" }, { "basic": "S*A*MFRW--*****", "ss": "01", "ec": "110116", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Airborne Early Warning (AEW)" }, { "basic": "S*A*MFPN--*****", "ss": "01", "ec": "110117", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Antisurface Warfare" }, { "basic": "S*A*MFS---*****", "ss": "01", "ec": "110118", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Antisubmarine Warfare", "__parsed_extra": ["", "Listed as Antisubmarine Warfare (ASW), Carrier Based"] }, { "basic": "S*A*MFY---*****", "ss": "01", "ec": "110119", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Communications" }, { "basic": "S*A*MFH---*****", "ss": "01", "ec": "110120", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Combat Search and Rescue (CSAR)" }, { "basic": "S*A*MFRZ--*****", "ss": "01", "ec": "110121", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Electronic Support (ES)", "__parsed_extra": ["", "Listed as Electronic Surveillance Measures"] }, { "basic": "S*A*MFPM--*****", "ss": "01", "ec": "110123", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Mine Countermeasures (MCM)" }, { "basic": "S*A*MFM---*****", "ss": "01", "ec": "110126", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Special Operations Forces" }, { "basic": "S*A*MFRX--*****", "ss": "01", "ec": "110128", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Photographic Reconnaissance" }, { "basic": "S*A*MV----*****", "ss": "01", "ec": "110129", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Very Important Person (VIP)" }, { "basic": "S*A*ME----*****", "ss": "01", "ec": "110132", "s1": "00", "s2": "00", "e": "", "et": "", "est": "Escort" }, { "basic": "S*A*MH----*****", "ss": "01", "ec": "110200", "s1": "00", "s2": "00", "e": "", "et": "Rotary Wing" }, { "basic": "S*A*MHA---*****", "ss": "01", "ec": "110200", "s1": "01", "s2": "00", "e": "", "et": "", "est": "Attack" }, { "basic": "S*A*MHS---*****", "ss": "01", "ec": "110200", "s1": "32", "s2": "00", "e": "", "et": "", "est": "Antisubmarine Warfare" }, { "basic": "S*A*MHU---*****", "ss": "01", "ec": "110200", "s1": "07", "s2": "00", "e": "", "et": "", "est": "Utility" }, { "basic": "S*A*MHUL--*****", "ss": "01", "ec": "110200", "s1": "07", "s2": "03", "e": "", "et": "", "est": "Utility, Light" }, { "basic": "S*A*MHUM--*****", "ss": "01", "ec": "110200", "s1": "07", "s2": "02", "e": "", "et": "", "est": "Utility, Medium" }, { "basic": "S*A*MHUH--*****", "ss": "01", "ec": "110200", "s1": "07", "s2": "01", "e": "", "et": "", "est": "Utility, Heavy" }, { "basic": "S*A*MHI---*****", "ss": "01", "ec": "110200", "s1": "25", "s2": "00", "e": "", "et": "", "est": "Mine Countermeasures (MCM)" }, { "basic": "S*A*MHH---*****", "ss": "01", "ec": "110200", "s1": "30", "s2": "00", "e": "", "et": "", "est": "Combat Search and Rescue (CSAR)" }, { "basic": "S*A*MHR---*****", "ss": "01", "ec": "110200", "s1": "18", "s2": "00", "e": "", "et": "", "est": "Reconnaissance" }, { "basic": "S*A*MHC---*****", "ss": "01", "ec": "110200", "s1": "03", "s2": "00", "e": "", "et": "", "est": "Cargo" }, { "basic": "S*A*MHCL--*****", "ss": "01", "ec": "110200", "s1": "03", "s2": "03", "e": "", "et": "", "est": "Cargo, Light" }, { "basic": "S*A*MHCM--*****", "ss": "01", "ec": "110200", "s1": "03", "s2": "02", "e": "", "et": "", "est": "Cargo, Medium" }, { "basic": "S*A*MHCH--*****", "ss": "01", "ec": "110200", "s1": "03", "s2": "01", "e": "", "et": "", "est": "Cargo, Heavy" }, { "basic": "S*A*MHT---*****", "ss": "01", "ec": "110200", "s1": "19", "s2": "00", "e": "", "et": "", "est": "Trainer" }, { "basic": "S*A*MHO---*****", "ss": "01", "ec": "110200", "s1": "14", "s2": "00", "e": "", "et": "", "est": "Medical Evacuation (MEDEVAC)" }, { "basic": "S*A*MHM---*****", "ss": "01", "ec": "110200", "s1": "27", "s2": "00", "e": "", "et": "", "est": "Special Operations Forces" }, { "basic": "S*A*MHD---*****", "ss": "01", "ec": "110200", "s1": "11", "s2": "00", "e": "", "et": "", "est": "Airborne Command Post (ACP)" }, { "basic": "S*A*MHK---*****", "ss": "01", "ec": "110200", "s1": "06", "s2": "00", "e": "", "et": "", "est": "Tanker" }, { "basic": "S*A*MHJ---*****", "ss": "01", "ec": "110200", "s1": "16", "s2": "00", "e": "", "et": "", "est": "Electronic Combat (EC)/Jammer" }, { "basic": "S*A*MFQ---*****", "ss": "01", "ec": "110300", "s1": "00", "s2": "00", "e": "", "et": "Unmanned Aircraft (UA) / Unmanned Aerial Vehicle (UAV) / Unmanned Aircraft System (UAS) / Remotely Piloted Vehicle (RPV)", "est": "", "__parsed_extra": ["", "Listed as DRONE (RPV/UA)"] }, { "basic": "S*A*MFQA--*****", "ss": "01", "ec": "110300", "s1": "01", "s2": "00", "e": "", "et": "", "est": "Attack/Strike" }, { "basic": "S*A*MFQB--*****", "ss": "01", "ec": "110300", "s1": "02", "s2": "00", "e": "", "et": "", "est": "Bomber" }, { "basic": "S*A*MFQC--*****", "ss": "01", "ec": "110300", "s1": "03", "s2": "00", "e": "", "et": "", "est": "Cargo" }, { "basic": "S*A*MFQD--*****", "ss": "01", "ec": "110300", "s1": "11", "s2": "00", "e": "", "et": "", "est": "Airborne Command Post (ACP)" }, { "basic": "S*A*MFQRW-*****", "ss": "01", "ec": "110300", "s1": "12", "s2": "00", "e": "", "et": "", "est": "Airborne Early Warning (AEW)", "__parsed_extra": ["", "Symbol is displayed differently between versions"] }, { "basic": "S*A*MFQF--*****", "ss": "01", "ec": "110300", "s1": "04", "s2": "00", "e": "", "et": "", "est": "Fighter" }, { "basic": "S*A*MFQH--*****", "ss": "01", "ec": "110300", "s1": "30", "s2": "00", "e": "", "et": "", "est": "Combat Search and Rescue (CSAR)" }, { "basic": "S*A*MFQJ--*****", "ss": "01", "ec": "110300", "s1": "16", "s2": "00", "e": "", "et": "", "est": "Electronic Combat (EC)/Jammer" }, { "basic": "S*A*MFQRZ-*****", "ss": "01", "ec": "110300", "s1": "24", "s2": "00", "e": "", "et": "", "est": "Electronic Support (ES)", "__parsed_extra": ["", "Symbol is displayed differently between versions. Name changed between versions"] }, { "basic": "S*A*MFQK--*****", "ss": "01", "ec": "110300", "s1": "06", "s2": "00", "e": "", "et": "", "est": "Tanker" }, { "basic": "S*A*MFQL--*****", "ss": "01", "ec": "110300", "s1": "08", "s2": "00", "e": "", "et": "", "est": "VSTOL/VTOL" }, { "basic": "S*A*MFQM--*****", "ss": "01", "ec": "110300", "s1": "27", "s2": "00", "e": "", "et": "", "est": "Special Operations Forces" }, { "basic": "S*A*MFQI--*****", "ss": "01", "ec": "110300", "s1": "25", "s2": "00", "e": "", "et": "", "est": "Mine Countermeasures (MCM)" }, { "basic": "S*A*MFQN--*****", "ss": "01", "ec": "110300", "s1": "32", "s2": "00", "e": "", "et": "", "est": "Antisurface Warfare" }, { "basic": "S*A*MFQP--*****", "ss": "01", "ec": "110300", "s1": "17", "s2": "00", "e": "", "et": "", "est": "Patrol" }, { "basic": "S*A*MFQR--*****", "ss": "01", "ec": "110300", "s1": "18", "s2": "00", "e": "", "et": "", "est": "Reconnaissance" }, { "basic": "S*A*MFQRX-*****", "ss": "01", "ec": "110300", "s1": "20", "s2": "00", "e": "", "et": "", "est": "Photographic (Reconnaissance)", "__parsed_extra": ["", "Symbol is displayed differently between versions"] }, { "basic": "S*A*MFQS--*****", "ss": "01", "ec": "110300", "s1": "22", "s2": "00", "e": "", "et": "", "est": "Antisubmarine Warfare" }, { "basic": "S*A*MFQT--*****", "ss": "01", "ec": "110300", "s1": "19", "s2": "00", "e": "", "et": "", "est": "Trainer" }, { "basic": "S*A*MFQU--*****", "ss": "01", "ec": "110300", "s1": "07", "s2": "00", "e": "", "et": "", "est": "Utility" }, { "basic": "S*A*MFQY--*****", "ss": "01", "ec": "110300", "s1": "23", "s2": "00", "e": "", "et": "", "est": "Communications" }, { "basic": "S*A*MFQO--*****", "ss": "01", "ec": "110300", "s1": "14", "s2": "00", "e": "", "et": "", "est": "Medical Evacuation (MEDEVAC)" }, { "basic": "S*A*MHQ---*****", "ss": "01", "ec": "110400", "s1": "00", "s2": "00", "e": "", "et": "Vertical-Takeoff UAV (VT-UAV)" }, { "basic": "S*A*ML----*****", "ss": "01", "ec": "110500", "s