@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
JavaScript
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