@airframes/acars-decoder 1.8.6 → 1.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,85 +1,87 @@
1
1
  // lib/IcaoDecoder.ts
2
- var IcaoDecoder = class {
2
+ var IcaoDecoder = class _IcaoDecoder {
3
3
  name;
4
4
  icao;
5
+ // Military ICAO address ranges (as [start, end] tuples, inclusive)
6
+ static MILITARY_RANGES = [
7
+ [65648, 65679],
8
+ // Egypt
9
+ [671744, 675839],
10
+ // Algeria
11
+ [3407616, 3407871],
12
+ // Italy
13
+ [3473408, 3670015],
14
+ // Spain
15
+ [3842048, 3866623],
16
+ // France 1
17
+ [3895296, 3932159],
18
+ // France 2
19
+ [4104192, 4112383],
20
+ // Germany 1
21
+ [4145152, 4177919],
22
+ // Germany 2
23
+ [4194304, 4194367],
24
+ // UK 1
25
+ [4440064, 4444159],
26
+ // UK 2
27
+ [4472832, 4485119],
28
+ // Austria
29
+ [4517888, 4521983],
30
+ // Belgium
31
+ [4550656, 4554751],
32
+ // Bulgaria
33
+ [4584448, 4584703],
34
+ // Denmark
35
+ [4620288, 4621311],
36
+ // Greece
37
+ [4668416, 4668431],
38
+ // Hungary
39
+ [4686080, 4686335],
40
+ // Norway
41
+ [4718592, 4722687],
42
+ // Netherlands
43
+ [4773888, 4774015],
44
+ // Poland
45
+ [4815872, 4816127],
46
+ // Portugal
47
+ [4817952, 4817967],
48
+ // Czech
49
+ [4943872, 4947967],
50
+ // Switzerland
51
+ [4948480, 4948735],
52
+ // Turkey
53
+ [7389296, 7389311],
54
+ // Oman
55
+ [7406168, 7406223],
56
+ // Saudi 1
57
+ [7406464, 7406495],
58
+ // Saudi 2
59
+ [7571968, 7572223],
60
+ // Israel
61
+ [8189952, 8190719],
62
+ // Australia
63
+ [8389120, 8389375],
64
+ // India
65
+ [11401160, 11534335],
66
+ // USA
67
+ [12713984, 12845055],
68
+ // Canada
69
+ [14942208, 14950399]
70
+ // Brazil
71
+ ];
5
72
  constructor(icao) {
6
73
  this.name = "icao-decoder-typescript";
7
74
  this.icao = icao;
8
75
  }
9
76
  isMilitary() {
10
- let i = this.icao;
11
- return i.match(/^adf[7-9]/) || i.match(/^adf[a-f]/) || i.match(/^a(e|f)/) || i.match(/^0100(7|8)/) || i.match(/^0a4/) || i.match(/^33ff/) || i >= "350000" && i <= "37ffff" || i.match(/^3a(8|9|[a-f])/) || i.match(/^3b/) || i.match(/^3e(a|b)/) || i.match(/^3f([4-9]|[a-b])/) || i.match(/^4000[0-3]/) || i.match(/^43c/) || i.match(/^44[4-7]/) && i != "447ac7" || i.match(/^44f/) || i.match(/^457/) || i.match(/^45f4/) || i.match(/^468[0-3]/) || i.match(/^473c0/) || i.match(/^4781/) || i.match(/^480/) || i.match(/^48d8[0-7]/) || i.match(/^497c/) || i.match(/^49842/) || i.match(/^4b7/) || i.match(/^4b82/) || i.match(/^506f/) || i.match(/^70c07/) || i.match(/^7102[5-8]/) || i.match(/^7103[8-9]/) || i.match(/^738a/) || i.match(/^7c8([2-4]|8)/) || i >= "7c9000" && i <= "7cbfff" || i.match(/^7[d-f]/) || i.match(/^8002/) || i.match(/^c[2-3]/) || i.match(/^e4[0-1]/) || i.match(/^e806/);
12
- }
13
- };
14
-
15
- // lib/DateTimeUtils.ts
16
- var DateTimeUtils = class {
17
- // Expects a four digit UTC time string (HHMM)
18
- static UTCToString(UTCString) {
19
- let utcDate = /* @__PURE__ */ new Date();
20
- utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
21
- return utcDate.toTimeString();
22
- }
23
- // Expects a six digit date string and a four digit UTC time string
24
- // (DDMMYY) (HHMM)
25
- static UTCDateTimeToString(dateString, timeString) {
26
- let utcDate = /* @__PURE__ */ new Date();
27
- utcDate.setUTCDate(+dateString.substr(0, 2));
28
- utcDate.setUTCMonth(+dateString.substr(2, 2));
29
- if (dateString.length === 6) {
30
- utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
31
- }
32
- if (timeString.length === 6) {
33
- utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));
34
- } else {
35
- utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
36
- }
37
- return utcDate.toUTCString();
38
- }
39
- /**
40
- *
41
- * @param time HHMMSS or HHMM
42
- * @returns seconds since midnight
43
- */
44
- static convertHHMMSSToTod(time) {
45
- if (time.length === 4) {
46
- time += "00";
47
- }
48
- const h = Number(time.substring(0, 2));
49
- const m = Number(time.substring(2, 4));
50
- const s = Number(time.substring(4, 6));
51
- const tod = h * 3600 + m * 60 + s;
52
- return tod;
53
- }
54
- /**
55
- *
56
- * @param time HHMMSS
57
- * @param date MMDDYY or MMDDYYYY
58
- * @returns seconds since epoch
59
- */
60
- static convertDateTimeToEpoch(time, date) {
61
- if (date.length === 6) {
62
- date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
63
- }
64
- const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;
65
- const millis = Date.parse(timestamp);
66
- return millis / 1e3;
67
- }
68
- /**
69
- * Converts a timestamp to a string
70
- *
71
- * ISO-8601 format for 'epoch'
72
- * HH:MM:SS for 'tod'
73
- * @param time
74
- * @param format
75
- * @returns
76
- */
77
- static timestampToString(time, format) {
78
- const date = new Date(time * 1e3);
79
- if (format == "tod") {
80
- return date.toISOString().slice(11, 19);
77
+ const i = this.icao;
78
+ const n = parseInt(i, 16);
79
+ for (const [start, end] of _IcaoDecoder.MILITARY_RANGES) {
80
+ if (start <= n && n <= end) {
81
+ return true;
82
+ }
81
83
  }
82
- return date.toISOString().slice(0, -5) + "Z";
84
+ return false;
83
85
  }
84
86
  };
85
87
 
@@ -109,7 +111,9 @@ var DecoderPlugin = class {
109
111
  this.options = options;
110
112
  }
111
113
  id() {
112
- console.log("DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!");
114
+ console.log(
115
+ "DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!"
116
+ );
113
117
  return "abstract_decoder_plugin";
114
118
  }
115
119
  meetsStateRequirements() {
@@ -136,7 +140,7 @@ var CoordinateUtils = class _CoordinateUtils {
136
140
  /**
137
141
  * Decode a string of coordinates into an object with latitude and longitude in millidegrees
138
142
  * @param stringCoords - The string of coordinates to decode
139
- *
143
+ *
140
144
  * @returns An object with latitude and longitude properties
141
145
  */
142
146
  static decodeStringCoordinates(stringCoords) {
@@ -156,11 +160,11 @@ var CoordinateUtils = class _CoordinateUtils {
156
160
  return void 0;
157
161
  }
158
162
  /**
159
- * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
160
- * @param stringCoords - The string of coordinates to decode
161
- *
162
- * @returns An object with latitude and longitude properties
163
- */
163
+ * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
164
+ * @param stringCoords - The string of coordinates to decode
165
+ *
166
+ * @returns An object with latitude and longitude properties
167
+ */
164
168
  static decodeStringCoordinatesDecimalMinutes(stringCoords) {
165
169
  const firstChar = stringCoords.substring(0, 1);
166
170
  let middleChar = stringCoords.substring(6, 7);
@@ -199,6 +203,85 @@ var CoordinateUtils = class _CoordinateUtils {
199
203
  }
200
204
  };
201
205
 
206
+ // lib/DateTimeUtils.ts
207
+ var DateTimeUtils = class {
208
+ // Expects a four digit UTC time string (HHMM)
209
+ static UTCToString(UTCString) {
210
+ let utcDate = /* @__PURE__ */ new Date();
211
+ utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
212
+ return utcDate.toTimeString();
213
+ }
214
+ // Expects a six digit date string and a four digit UTC time string
215
+ // (DDMMYY) (HHMM)
216
+ static UTCDateTimeToString(dateString, timeString) {
217
+ let utcDate = /* @__PURE__ */ new Date();
218
+ utcDate.setUTCDate(+dateString.substr(0, 2));
219
+ utcDate.setUTCMonth(+dateString.substr(2, 2));
220
+ if (dateString.length === 6) {
221
+ utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
222
+ }
223
+ if (timeString.length === 6) {
224
+ utcDate.setUTCHours(
225
+ +timeString.substr(0, 2),
226
+ +timeString.substr(2, 2),
227
+ +timeString.substr(4, 2)
228
+ );
229
+ } else {
230
+ utcDate.setUTCHours(
231
+ +timeString.substr(0, 2),
232
+ +timeString.substr(2, 2),
233
+ 0
234
+ );
235
+ }
236
+ return utcDate.toUTCString();
237
+ }
238
+ /**
239
+ *
240
+ * @param time HHMMSS or HHMM
241
+ * @returns seconds since midnight
242
+ */
243
+ static convertHHMMSSToTod(time) {
244
+ if (time.length === 4) {
245
+ time += "00";
246
+ }
247
+ const h = Number(time.substring(0, 2));
248
+ const m = Number(time.substring(2, 4));
249
+ const s = Number(time.substring(4, 6));
250
+ const tod = h * 3600 + m * 60 + s;
251
+ return tod;
252
+ }
253
+ /**
254
+ *
255
+ * @param time HHMMSS
256
+ * @param date MMDDYY or MMDDYYYY
257
+ * @returns seconds since epoch
258
+ */
259
+ static convertDateTimeToEpoch(time, date) {
260
+ if (date.length === 6) {
261
+ date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
262
+ }
263
+ const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;
264
+ const millis = Date.parse(timestamp);
265
+ return millis / 1e3;
266
+ }
267
+ /**
268
+ * Converts a timestamp to a string
269
+ *
270
+ * ISO-8601 format for 'epoch'
271
+ * HH:MM:SS for 'tod'
272
+ * @param time
273
+ * @param format
274
+ * @returns
275
+ */
276
+ static timestampToString(time, format) {
277
+ const date = new Date(time * 1e3);
278
+ if (format == "tod") {
279
+ return date.toISOString().slice(11, 19);
280
+ }
281
+ return date.toISOString().slice(0, -5) + "Z";
282
+ }
283
+ };
284
+
202
285
  // lib/utils/route_utils.ts
203
286
  var RouteUtils = class _RouteUtils {
204
287
  static formatFlightState(state) {
@@ -253,20 +336,36 @@ var RouteUtils = class _RouteUtils {
253
336
  static getWaypoint(leg) {
254
337
  const regex = leg.match(/^([A-Z]+)(\d{3})-(\d{4})$/);
255
338
  if (regex?.length == 4) {
256
- return { name: regex[1], offset: { bearing: parseInt(regex[2]), distance: parseInt(regex[3]) / 10 } };
339
+ return {
340
+ name: regex[1],
341
+ offset: {
342
+ bearing: parseInt(regex[2]),
343
+ distance: parseInt(regex[3]) / 10
344
+ }
345
+ };
257
346
  }
258
347
  const waypoint = leg.split(",");
259
348
  if (waypoint.length == 2) {
260
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(waypoint[1]);
349
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
350
+ waypoint[1]
351
+ );
261
352
  if (position) {
262
- return { name: waypoint[0], latitude: position.latitude, longitude: position.longitude };
353
+ return {
354
+ name: waypoint[0],
355
+ latitude: position.latitude,
356
+ longitude: position.longitude
357
+ };
263
358
  }
264
359
  }
265
360
  if (leg.length == 13 || leg.length == 14) {
266
361
  const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);
267
362
  const name = waypoint.length == 2 ? waypoint[0] : "";
268
363
  if (position) {
269
- return { name, latitude: position.latitude, longitude: position.longitude };
364
+ return {
365
+ name,
366
+ latitude: position.latitude,
367
+ longitude: position.longitude
368
+ };
270
369
  }
271
370
  }
272
371
  return { name: leg };
@@ -531,7 +630,9 @@ var ResultFormatter = class {
531
630
  if (value.length === 0) {
532
631
  return;
533
632
  }
534
- decodeResult.raw.outside_air_temperature = Number(value.replace("M", "-").replace("P", "+"));
633
+ decodeResult.raw.outside_air_temperature = Number(
634
+ value.replace("M", "-").replace("P", "+")
635
+ );
535
636
  decodeResult.formatted.items.push({
536
637
  type: "outside_air_temperature",
537
638
  code: "OATEMP",
@@ -748,17 +849,112 @@ var ResultFormatter = class {
748
849
  value: `${decodeResult.raw.sublabel}`
749
850
  });
750
851
  }
852
+ static requestedAltitudes(decodeResult, values) {
853
+ decodeResult.raw.requested_alts = values;
854
+ decodeResult.formatted.items.push({
855
+ type: "requested_altitudes",
856
+ code: "REQ_ALTS",
857
+ label: "Requested Altitudes",
858
+ value: `${decodeResult.raw.requested_alts.join(", ")}`
859
+ });
860
+ }
861
+ static desiredAltitude(decodeResult, value) {
862
+ decodeResult.raw.desired_alt = value;
863
+ decodeResult.formatted.items.push({
864
+ type: "desired_altitude",
865
+ code: "DES_ALT",
866
+ label: "Desired Altitude",
867
+ value: `${decodeResult.raw.desired_alt}`
868
+ });
869
+ }
870
+ static startPoint(decodeResult, value) {
871
+ decodeResult.raw.start_point = value;
872
+ decodeResult.formatted.items.push({
873
+ type: "start_point",
874
+ code: "START",
875
+ label: "Start Point",
876
+ value: `${decodeResult.raw.start_point}`
877
+ });
878
+ }
879
+ static routeNumber(decodeResult, value) {
880
+ decodeResult.raw.route_number = value;
881
+ decodeResult.formatted.items.push({
882
+ type: "route_number",
883
+ code: "RTE_NUM",
884
+ label: "Route Number",
885
+ value: `${decodeResult.raw.route_number}`
886
+ });
887
+ }
888
+ static flightPlan(decodeResult, value) {
889
+ decodeResult.raw.flight_plan = value;
890
+ decodeResult.formatted.items.push({
891
+ type: "flight_plan",
892
+ code: "FPN",
893
+ label: "Flight Plan",
894
+ value: `${decodeResult.raw.flight_plan}`
895
+ });
896
+ }
897
+ static groundAddress(decodeResult, value) {
898
+ decodeResult.raw.ground_address = value;
899
+ decodeResult.formatted.items.push({
900
+ type: "ground_address",
901
+ code: "GND_ADDR",
902
+ label: "Ground Address",
903
+ value: `${decodeResult.raw.ground_address}`
904
+ });
905
+ }
751
906
  static unknown(decodeResult, value, sep = ",") {
752
- if (!decodeResult.remaining.text)
753
- decodeResult.remaining.text = value;
754
- else
755
- decodeResult.remaining.text += sep + value;
907
+ if (!decodeResult.remaining.text) decodeResult.remaining.text = value;
908
+ else decodeResult.remaining.text += sep + value;
756
909
  }
757
910
  static unknownArr(decodeResult, value, sep = ",") {
758
911
  this.unknown(decodeResult, value.join(sep), sep);
759
912
  }
760
913
  };
761
914
 
915
+ // lib/plugins/CBand.ts
916
+ var CBand = class extends DecoderPlugin {
917
+ name = "c-band";
918
+ qualifiers() {
919
+ return {
920
+ labels: ["*"]
921
+ };
922
+ }
923
+ decode(message, options = {}) {
924
+ let decodeResult = this.defaultResult();
925
+ decodeResult.decoder.name = this.name;
926
+ decodeResult.message = message;
927
+ let cband = message.text.match(
928
+ /^(?<msgno>[A-Z]\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/
929
+ );
930
+ if (cband?.groups) {
931
+ const messageText = message.text.substring(10);
932
+ const decoded = this.decoder.decode(
933
+ {
934
+ label: message.label,
935
+ sublabel: message.sublabel,
936
+ text: messageText
937
+ },
938
+ options
939
+ );
940
+ if (decoded.decoded) {
941
+ ResultFormatter.flightNumber(
942
+ decodeResult,
943
+ cband.groups.airline + Number(cband.groups.number)
944
+ );
945
+ decodeResult.decoded = true;
946
+ decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
947
+ decodeResult.decoder.name = this.name + "-" + decoded.decoder.name;
948
+ decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
949
+ decodeResult.formatted.description = decoded.formatted.description;
950
+ decodeResult.formatted.items.push(...decoded.formatted.items);
951
+ decodeResult.remaining = decoded.remaining;
952
+ }
953
+ }
954
+ return decodeResult;
955
+ }
956
+ };
957
+
762
958
  // lib/plugins/Label_5Z_Slash.ts
763
959
  var Label_5Z_Slash = class extends DecoderPlugin {
764
960
  name = "label-5z-slash";
@@ -829,12 +1025,23 @@ var Label_5Z_Slash = class extends DecoderPlugin {
829
1025
  ResultFormatter.departureAirport(decodeResult, info[1]);
830
1026
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
831
1027
  decodeResult.raw.day = Number(info[3]);
832
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
1028
+ ResultFormatter.time_of_day(
1029
+ decodeResult,
1030
+ DateTimeUtils.convertHHMMSSToTod(info[4])
1031
+ );
833
1032
  ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));
834
1033
  ResultFormatter.unknownArr(decodeResult, data.slice(3), "/");
835
1034
  } else if (type === "B3") {
836
- ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), "IATA");
837
- ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), "IATA");
1035
+ ResultFormatter.departureAirport(
1036
+ decodeResult,
1037
+ header[1].substring(0, 3),
1038
+ "IATA"
1039
+ );
1040
+ ResultFormatter.arrivalAirport(
1041
+ decodeResult,
1042
+ header[1].substring(3),
1043
+ "IATA"
1044
+ );
838
1045
  decodeResult.raw.day = Number(header[2]);
839
1046
  ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));
840
1047
  if (header.length > 4) {
@@ -845,19 +1052,36 @@ var Label_5Z_Slash = class extends DecoderPlugin {
845
1052
  ResultFormatter.departureAirport(decodeResult, info[1]);
846
1053
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
847
1054
  decodeResult.raw.day = Number(info[3]);
848
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
1055
+ ResultFormatter.time_of_day(
1056
+ decodeResult,
1057
+ DateTimeUtils.convertHHMMSSToTod(info[4])
1058
+ );
849
1059
  ResultFormatter.unknownArr(decodeResult, info.slice(5), " ");
850
1060
  } else if (type === "C3") {
851
- ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), "IATA");
852
- ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), "IATA");
1061
+ ResultFormatter.departureAirport(
1062
+ decodeResult,
1063
+ header[1].substring(0, 3),
1064
+ "IATA"
1065
+ );
1066
+ ResultFormatter.arrivalAirport(
1067
+ decodeResult,
1068
+ header[1].substring(3),
1069
+ "IATA"
1070
+ );
853
1071
  } else if (type === "ET") {
854
1072
  const airports = data[2].split(" ");
855
1073
  ResultFormatter.departureAirport(decodeResult, airports[1]);
856
1074
  ResultFormatter.arrivalAirport(decodeResult, airports[2]);
857
1075
  decodeResult.raw.day = Number(airports[3]);
858
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4]));
1076
+ ResultFormatter.time_of_day(
1077
+ decodeResult,
1078
+ DateTimeUtils.convertHHMMSSToTod(airports[4])
1079
+ );
859
1080
  const estimates = data[3].split(" ");
860
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]));
1081
+ ResultFormatter.eta(
1082
+ decodeResult,
1083
+ DateTimeUtils.convertHHMMSSToTod(estimates[1])
1084
+ );
861
1085
  ResultFormatter.unknown(decodeResult, estimates[2]);
862
1086
  } else {
863
1087
  if (options.debug) {
@@ -880,7 +1104,6 @@ var Label_5Z_Slash = class extends DecoderPlugin {
880
1104
 
881
1105
  // lib/plugins/Label_10_LDR.ts
882
1106
  var Label_10_LDR = class extends DecoderPlugin {
883
- // eslint-disable-line camelcase
884
1107
  name = "label-10-ldr";
885
1108
  qualifiers() {
886
1109
  return {
@@ -919,7 +1142,10 @@ var Label_10_LDR = class extends DecoderPlugin {
919
1142
  if (altRwy != "") {
920
1143
  ResultFormatter.alternateRunway(decodeResult, altRwy);
921
1144
  }
922
- ResultFormatter.unknownArr(decodeResult, [...parts.slice(0, 5), ...parts.slice(15)]);
1145
+ ResultFormatter.unknownArr(decodeResult, [
1146
+ ...parts.slice(0, 5),
1147
+ ...parts.slice(15)
1148
+ ]);
923
1149
  decodeResult.decoded = true;
924
1150
  decodeResult.decoder.decodeLevel = "partial";
925
1151
  return decodeResult;
@@ -928,7 +1154,6 @@ var Label_10_LDR = class extends DecoderPlugin {
928
1154
 
929
1155
  // lib/plugins/Label_10_POS.ts
930
1156
  var Label_10_POS = class extends DecoderPlugin {
931
- // eslint-disable-line camelcase
932
1157
  name = "label-10-pos";
933
1158
  qualifiers() {
934
1159
  return {
@@ -959,7 +1184,11 @@ var Label_10_POS = class extends DecoderPlugin {
959
1184
  };
960
1185
  ResultFormatter.position(decodeResult, position);
961
1186
  ResultFormatter.altitude(decodeResult, Number(parts[7]));
962
- ResultFormatter.unknownArr(decodeResult, [parts[0], ...parts.slice(3, 7), ...parts.slice(8)]);
1187
+ ResultFormatter.unknownArr(decodeResult, [
1188
+ parts[0],
1189
+ ...parts.slice(3, 7),
1190
+ ...parts.slice(8)
1191
+ ]);
963
1192
  decodeResult.decoded = true;
964
1193
  decodeResult.decoder.decodeLevel = "partial";
965
1194
  return decodeResult;
@@ -968,7 +1197,6 @@ var Label_10_POS = class extends DecoderPlugin {
968
1197
 
969
1198
  // lib/plugins/Label_10_Slash.ts
970
1199
  var Label_10_Slash = class extends DecoderPlugin {
971
- // eslint-disable-line camelcase
972
1200
  name = "label-10-slash";
973
1201
  qualifiers() {
974
1202
  return {
@@ -1001,23 +1229,34 @@ var Label_10_Slash = class extends DecoderPlugin {
1001
1229
  ResultFormatter.heading(decodeResult, Number(parts[5]));
1002
1230
  ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));
1003
1231
  ResultFormatter.arrivalAirport(decodeResult, parts[7]);
1004
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]));
1005
- const waypoints = [{
1006
- name: parts[11]
1007
- }, {
1008
- name: parts[12],
1009
- time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
1010
- timeFormat: "tod"
1011
- }, {
1012
- name: parts[14],
1013
- time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
1014
- timeFormat: "tod"
1015
- }];
1232
+ ResultFormatter.eta(
1233
+ decodeResult,
1234
+ DateTimeUtils.convertHHMMSSToTod(parts[8])
1235
+ );
1236
+ const waypoints = [
1237
+ {
1238
+ name: parts[11]
1239
+ },
1240
+ {
1241
+ name: parts[12],
1242
+ time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
1243
+ timeFormat: "tod"
1244
+ },
1245
+ {
1246
+ name: parts[14],
1247
+ time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
1248
+ timeFormat: "tod"
1249
+ }
1250
+ ];
1016
1251
  ResultFormatter.route(decodeResult, { waypoints });
1017
1252
  if (parts[16]) {
1018
1253
  ResultFormatter.departureAirport(decodeResult, parts[16]);
1019
1254
  }
1020
- ResultFormatter.unknownArr(decodeResult, [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)], "/");
1255
+ ResultFormatter.unknownArr(
1256
+ decodeResult,
1257
+ [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],
1258
+ "/"
1259
+ );
1021
1260
  decodeResult.decoded = true;
1022
1261
  decodeResult.decoder.decodeLevel = "partial";
1023
1262
  return decodeResult;
@@ -1042,7 +1281,7 @@ var Label_12_N_Space = class extends DecoderPlugin {
1042
1281
  let results = message.text.match(variant1Regex);
1043
1282
  if (results?.groups) {
1044
1283
  if (options.debug) {
1045
- console.log(`Label 12 N : results`);
1284
+ console.log("Label 12 N : results");
1046
1285
  console.log(results);
1047
1286
  }
1048
1287
  ResultFormatter.position(decodeResult, {
@@ -1051,7 +1290,11 @@ var Label_12_N_Space = class extends DecoderPlugin {
1051
1290
  });
1052
1291
  const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
1053
1292
  ResultFormatter.altitude(decodeResult, altitude);
1054
- ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2, results.groups.unkwn3]);
1293
+ ResultFormatter.unknownArr(decodeResult, [
1294
+ results.groups.unkwn1,
1295
+ results.groups.unkwn2,
1296
+ results.groups.unkwn3
1297
+ ]);
1055
1298
  decodeResult.decoded = true;
1056
1299
  decodeResult.decoder.decodeLevel = "partial";
1057
1300
  return decodeResult;
@@ -1093,15 +1336,32 @@ var Label_12_POS = class extends DecoderPlugin {
1093
1336
  const lat = data[0].substring(0, 8);
1094
1337
  const lon = data[0].substring(8);
1095
1338
  ResultFormatter.position(decodeResult, {
1096
- latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),
1097
- longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8)))
1339
+ latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(
1340
+ Number(lat.substring(1, 4)),
1341
+ Number(lat.substring(4, 6)),
1342
+ Number(lat.substring(6, 8))
1343
+ ),
1344
+ longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(
1345
+ Number(lon.substring(1, 4)),
1346
+ Number(lon.substring(4, 6)),
1347
+ Number(lon.substring(6, 8))
1348
+ )
1098
1349
  });
1099
1350
  ResultFormatter.unknown(decodeResult, data[1]);
1100
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
1351
+ ResultFormatter.time_of_day(
1352
+ decodeResult,
1353
+ DateTimeUtils.convertHHMMSSToTod(data[2])
1354
+ );
1101
1355
  ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
1102
1356
  ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
1103
- ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim()));
1104
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()));
1357
+ ResultFormatter.currentFuel(
1358
+ decodeResult,
1359
+ Number(data[7].substring(3).trim())
1360
+ );
1361
+ ResultFormatter.eta(
1362
+ decodeResult,
1363
+ DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim())
1364
+ );
1105
1365
  ResultFormatter.departureAirport(decodeResult, data[9]);
1106
1366
  ResultFormatter.arrivalAirport(decodeResult, data[10]);
1107
1367
  ResultFormatter.unknown(decodeResult, data[11]);
@@ -1113,7 +1373,6 @@ var Label_12_POS = class extends DecoderPlugin {
1113
1373
 
1114
1374
  // lib/plugins/Label_13Through18_Slash.ts
1115
1375
  var Label_13Through18_Slash = class extends DecoderPlugin {
1116
- // eslint-disable-line camelcase
1117
1376
  name = "label-13-18-slash";
1118
1377
  qualifiers() {
1119
1378
  return {
@@ -1160,11 +1419,22 @@ var Label_13Through18_Slash = class extends DecoderPlugin {
1160
1419
  const location = lines[i].substring(5).split(",");
1161
1420
  let position;
1162
1421
  if (location[0].startsWith("+") || location[0].startsWith("-")) {
1163
- position = { latitude: Number(location[0]), longitude: Number(location[1]) };
1422
+ position = {
1423
+ latitude: Number(location[0]),
1424
+ longitude: Number(location[1])
1425
+ };
1164
1426
  } else {
1165
1427
  position = {
1166
- latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(Number(location[0].substring(1, 3)), Number(location[0].substring(3, 5)), Number(location[0].substring(5, 7))),
1167
- longitude: CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(Number(location[1].substring(1, 4)), Number(location[1].substring(4, 6)), Number(location[1].substring(6, 8)))
1428
+ latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(
1429
+ Number(location[0].substring(1, 3)),
1430
+ Number(location[0].substring(3, 5)),
1431
+ Number(location[0].substring(5, 7))
1432
+ ),
1433
+ longitude: CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(
1434
+ Number(location[1].substring(1, 4)),
1435
+ Number(location[1].substring(4, 6)),
1436
+ Number(location[1].substring(6, 8))
1437
+ )
1168
1438
  };
1169
1439
  }
1170
1440
  ResultFormatter.position(decodeResult, position);
@@ -1215,22 +1485,38 @@ var Label_15 = class extends DecoderPlugin {
1215
1485
  decodeResult.message = message;
1216
1486
  if (message.text.startsWith("(2") && message.text.endsWith("(Z")) {
1217
1487
  const between = message.text.substring(2, message.text.length - 2);
1218
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13)));
1488
+ ResultFormatter.position(
1489
+ decodeResult,
1490
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
1491
+ between.substring(0, 13)
1492
+ )
1493
+ );
1219
1494
  if (between.length === 25) {
1220
1495
  ResultFormatter.unknown(decodeResult, between.substring(13, 19));
1221
1496
  const alt = between.substring(19, 22);
1222
1497
  if (alt != "---") {
1223
1498
  ResultFormatter.altitude(decodeResult, 100 * Number(alt));
1224
1499
  }
1225
- ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(" ", "0"));
1500
+ ResultFormatter.temperature(
1501
+ decodeResult,
1502
+ between.substring(22).replaceAll(" ", "0")
1503
+ );
1226
1504
  } else if (between.substring(13, 16) === "OFF") {
1227
1505
  const ddmmyy = between.substring(16, 22);
1228
1506
  const hhmm = between.substring(22, 26);
1229
1507
  if (ddmmyy != "------") {
1230
1508
  const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
1231
- ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy), "epoch");
1509
+ ResultFormatter.off(
1510
+ decodeResult,
1511
+ DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy),
1512
+ "epoch"
1513
+ );
1232
1514
  } else {
1233
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), "tod");
1515
+ ResultFormatter.off(
1516
+ decodeResult,
1517
+ DateTimeUtils.convertHHMMSSToTod(hhmm),
1518
+ "tod"
1519
+ );
1234
1520
  }
1235
1521
  ResultFormatter.unknown(decodeResult, between.substring(26));
1236
1522
  } else {
@@ -1275,7 +1561,10 @@ var Label_15_FST = class extends DecoderPlugin {
1275
1561
  const lat = Number(stringCoords.substring(1, 7)) / 1e4 * (firstChar === "S" ? -1 : 1);
1276
1562
  const lon = Number(stringCoords.substring(8, 15)) / 1e4 * (middleChar === "W" ? -1 : 1);
1277
1563
  ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });
1278
- ResultFormatter.altitude(decodeResult, Number(stringCoords.substring(15)) * 100);
1564
+ ResultFormatter.altitude(
1565
+ decodeResult,
1566
+ Number(stringCoords.substring(15)) * 100
1567
+ );
1279
1568
  } else {
1280
1569
  decodeResult.decoded = false;
1281
1570
  decodeResult.decoder.decodeLevel = "none";
@@ -1371,7 +1660,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
1371
1660
  let results = message.text.match(variant1Regex);
1372
1661
  if (results?.groups) {
1373
1662
  if (options.debug) {
1374
- console.log(`Label 16 N : results`);
1663
+ console.log("Label 16 N : results");
1375
1664
  console.log(results);
1376
1665
  }
1377
1666
  let pos = {
@@ -1381,7 +1670,10 @@ var Label_16_N_Space = class extends DecoderPlugin {
1381
1670
  const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
1382
1671
  ResultFormatter.position(decodeResult, pos);
1383
1672
  ResultFormatter.altitude(decodeResult, altitude);
1384
- ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2]);
1673
+ ResultFormatter.unknownArr(decodeResult, [
1674
+ results.groups.unkwn1,
1675
+ results.groups.unkwn2
1676
+ ]);
1385
1677
  decodeResult.decoded = true;
1386
1678
  decodeResult.decoder.decodeLevel = "partial";
1387
1679
  return decodeResult;
@@ -1389,7 +1681,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
1389
1681
  results = message.text.match(variant2Regex);
1390
1682
  if (results?.groups) {
1391
1683
  if (options.debug) {
1392
- console.log(`Label 16 N : results`);
1684
+ console.log("Label 16 N : results");
1393
1685
  console.log(results);
1394
1686
  }
1395
1687
  let pos = {
@@ -1435,17 +1727,22 @@ var Label_16_POSA1 = class extends DecoderPlugin {
1435
1727
  decodeResult.decoder.decodeLevel = "none";
1436
1728
  return decodeResult;
1437
1729
  }
1438
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)));
1730
+ ResultFormatter.position(
1731
+ decodeResult,
1732
+ CoordinateUtils.decodeStringCoordinates(fields[0].substring(5))
1733
+ );
1439
1734
  const waypoint = fields[1].trim();
1440
1735
  const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);
1441
1736
  ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);
1442
1737
  const nextWaypoint = fields[4].trim();
1443
1738
  const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);
1444
1739
  ResultFormatter.unknownArr(decodeResult, fields.slice(6), ",");
1445
- ResultFormatter.route(decodeResult, { waypoints: [
1446
- { name: waypoint, time, timeFormat: "tod" },
1447
- { name: nextWaypoint, time: nextTime, timeFormat: "tod" }
1448
- ] });
1740
+ ResultFormatter.route(decodeResult, {
1741
+ waypoints: [
1742
+ { name: waypoint, time, timeFormat: "tod" },
1743
+ { name: nextWaypoint, time: nextTime, timeFormat: "tod" }
1744
+ ]
1745
+ });
1449
1746
  decodeResult.decoded = true;
1450
1747
  decodeResult.decoder.decodeLevel = "partial";
1451
1748
  return decodeResult;
@@ -1480,7 +1777,10 @@ var Label_16_TOD = class extends DecoderPlugin {
1480
1777
  if (fields[1] !== "") {
1481
1778
  ResultFormatter.altitude(decodeResult, Number(fields[1]));
1482
1779
  }
1483
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
1780
+ ResultFormatter.eta(
1781
+ decodeResult,
1782
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
1783
+ );
1484
1784
  ResultFormatter.unknown(decodeResult, fields[3]);
1485
1785
  const temp = fields[4].split("/");
1486
1786
  const posFields = temp[0].split(" ");
@@ -1501,9 +1801,9 @@ var Label_16_TOD = class extends DecoderPlugin {
1501
1801
  var FlightPlanUtils = class _FlightPlanUtils {
1502
1802
  /**
1503
1803
  * Processes flight plan data
1504
- *
1804
+ *
1505
1805
  * Expected format is [header, key1, val1, ... keyN, valN]
1506
- *
1806
+ *
1507
1807
  * @param decodeResult - results
1508
1808
  * @param data - original message split by ':'
1509
1809
  * @returns whether all fields were processed or not
@@ -1535,6 +1835,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
1535
1835
  case "F":
1536
1836
  addRoute(decodeResult, value);
1537
1837
  break;
1838
+ case "FP":
1839
+ ResultFormatter.flightPlan(decodeResult, value.trim());
1840
+ break;
1538
1841
  case "R":
1539
1842
  addRunway(decodeResult, value);
1540
1843
  break;
@@ -1589,6 +1892,14 @@ var FlightPlanUtils = class _FlightPlanUtils {
1589
1892
  label: "Route Status",
1590
1893
  value: "Route Mapped"
1591
1894
  });
1895
+ } else if (header.startsWith("RS")) {
1896
+ decodeResult.raw.route_status = "RS";
1897
+ decodeResult.formatted.items.push({
1898
+ type: "status",
1899
+ code: "ROUTE_STATUS",
1900
+ label: "Route Status",
1901
+ value: "Route Saved"
1902
+ });
1592
1903
  } else {
1593
1904
  decodeResult.remaining.text += header;
1594
1905
  allKnownFields = false;
@@ -1608,7 +1919,7 @@ var FlightPlanUtils = class _FlightPlanUtils {
1608
1919
  decodeResult.raw.procedures.push({ type, route });
1609
1920
  const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);
1610
1921
  decodeResult.formatted.items.push({
1611
- type: `procedure`,
1922
+ type: "procedure",
1612
1923
  code: "proc",
1613
1924
  label: `${procedureName} Procedure`,
1614
1925
  value: RouteUtils.routeToString(route)
@@ -1629,7 +1940,9 @@ function addRunway(decodeResult, value) {
1629
1940
  }
1630
1941
  function addRoute(decodeResult, value) {
1631
1942
  const route = value.split(".");
1632
- ResultFormatter.route(decodeResult, { waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)) });
1943
+ ResultFormatter.route(decodeResult, {
1944
+ waypoints: route.map((leg) => RouteUtils.getWaypoint(leg))
1945
+ });
1633
1946
  }
1634
1947
  function addCompanyRoute(decodeResult, value) {
1635
1948
  const segments = value.split(".");
@@ -1683,15 +1996,27 @@ var H1Helper = class _H1Helper {
1683
1996
  case "AF":
1684
1997
  processAirField(decodeResult, data2.split(","));
1685
1998
  break;
1999
+ case "AK":
2000
+ ResultFormatter.unknown(decodeResult, fields[i], "/");
2001
+ break;
1686
2002
  case "CG":
1687
2003
  processCenterOfGravity(decodeResult, data2.split(","));
1688
2004
  break;
1689
2005
  case "DC":
1690
2006
  processDateCode(decodeResult, data2.split(","));
1691
2007
  break;
2008
+ case "DI":
2009
+ ResultFormatter.unknown(decodeResult, fields[i], "/");
2010
+ break;
1692
2011
  case "DT":
1693
2012
  processDT(decodeResult, data2.split(","));
1694
2013
  break;
2014
+ case "DQ":
2015
+ ResultFormatter.desiredAltitude(
2016
+ decodeResult,
2017
+ parseInt(data2, 10) * 100
2018
+ );
2019
+ break;
1695
2020
  case "ET":
1696
2021
  processETA(data2, decodeResult, fields, i);
1697
2022
  break;
@@ -1704,6 +2029,9 @@ var H1Helper = class _H1Helper {
1704
2029
  case "FX":
1705
2030
  ResultFormatter.freetext(decodeResult, data2);
1706
2031
  break;
2032
+ case "GA":
2033
+ ResultFormatter.groundAddress(decodeResult, data2);
2034
+ break;
1707
2035
  case "ID":
1708
2036
  processIdentification(decodeResult, data2.split(","));
1709
2037
  break;
@@ -1720,11 +2048,18 @@ var H1Helper = class _H1Helper {
1720
2048
  case "RI":
1721
2049
  case "RM":
1722
2050
  case "RP":
2051
+ case "RS":
1723
2052
  FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(":"));
1724
2053
  break;
2054
+ case "RN":
2055
+ ResultFormatter.routeNumber(decodeResult, data2);
2056
+ break;
1725
2057
  case "SN":
1726
2058
  decodeResult.raw.serial_number = data2;
1727
2059
  break;
2060
+ case "SP":
2061
+ ResultFormatter.startPoint(decodeResult, data2);
2062
+ break;
1728
2063
  case "TD":
1729
2064
  processTimeOfDeparture(decodeResult, data2.split(","));
1730
2065
  break;
@@ -1737,6 +2072,9 @@ var H1Helper = class _H1Helper {
1737
2072
  case "WD":
1738
2073
  processWindData(decodeResult, data2);
1739
2074
  break;
2075
+ case "WQ":
2076
+ processWeatherQuery(decodeResult, data2.split(":"));
2077
+ break;
1740
2078
  default:
1741
2079
  ResultFormatter.unknown(decodeResult, fields[i], "/");
1742
2080
  }
@@ -1745,15 +2083,11 @@ var H1Helper = class _H1Helper {
1745
2083
  return true;
1746
2084
  }
1747
2085
  static processPS(decodeResult, data) {
1748
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2086
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2087
+ data[0]
2088
+ );
1749
2089
  if (position) {
1750
- decodeResult.raw.position = position;
1751
- decodeResult.formatted.items.push({
1752
- type: "aircraft_position",
1753
- code: "POS",
1754
- label: "Aircraft Position",
1755
- value: CoordinateUtils.coordinateString(position)
1756
- });
2090
+ ResultFormatter.position(decodeResult, position);
1757
2091
  }
1758
2092
  if (data.length === 9) {
1759
2093
  processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
@@ -1770,7 +2104,9 @@ var H1Helper = class _H1Helper {
1770
2104
  }
1771
2105
  }
1772
2106
  static processPosition(decodeResult, data) {
1773
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2107
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2108
+ data[0]
2109
+ );
1774
2110
  if (position) {
1775
2111
  ResultFormatter.position(decodeResult, position);
1776
2112
  }
@@ -1786,7 +2122,15 @@ var H1Helper = class _H1Helper {
1786
2122
  }
1787
2123
  }
1788
2124
  static processTimeStamp(decodeResult, data) {
1789
- let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);
2125
+ if (data.length > 2) {
2126
+ const positionData = data.slice(1);
2127
+ positionData[0] = positionData[0].substring(6);
2128
+ this.processPosition(decodeResult, positionData);
2129
+ }
2130
+ let time = DateTimeUtils.convertDateTimeToEpoch(
2131
+ data[0],
2132
+ data[1].substring(0, 6)
2133
+ );
1790
2134
  if (Number.isNaN(time)) {
1791
2135
  const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
1792
2136
  time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
@@ -1797,10 +2141,16 @@ var H1Helper = class _H1Helper {
1797
2141
  function processETA(data, decodeResult, fields, i) {
1798
2142
  if (data.length === 5) {
1799
2143
  ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));
1800
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data.substring(1)));
2144
+ ResultFormatter.eta(
2145
+ decodeResult,
2146
+ DateTimeUtils.convertHHMMSSToTod(data.substring(1))
2147
+ );
1801
2148
  } else if (data.length === 6) {
1802
2149
  ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));
1803
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data.substring(2)));
2150
+ ResultFormatter.eta(
2151
+ decodeResult,
2152
+ DateTimeUtils.convertHHMMSSToTod(data.substring(2))
2153
+ );
1804
2154
  } else {
1805
2155
  ResultFormatter.unknown(decodeResult, fields[i], "/");
1806
2156
  }
@@ -1855,7 +2205,10 @@ function processDT(decodeResult, data) {
1855
2205
  ResultFormatter.currentFuel(decodeResult, Number(data[2]));
1856
2206
  }
1857
2207
  if (data.length > 3) {
1858
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[3]));
2208
+ ResultFormatter.eta(
2209
+ decodeResult,
2210
+ DateTimeUtils.convertHHMMSSToTod(data[3])
2211
+ );
1859
2212
  }
1860
2213
  if (data.length > 4) {
1861
2214
  ResultFormatter.remainingFuel(decodeResult, Number(data[4]));
@@ -1895,18 +2248,30 @@ function processCenterOfGravity(decodeResult, data) {
1895
2248
  ResultFormatter.unknown(decodeResult, data.join(","));
1896
2249
  }
1897
2250
  }
1898
- function parseMessageType(decodeResult, messageType) {
2251
+ function parseMessageType(decodeResult, messagePart) {
2252
+ const messageParts = messagePart.split(",");
2253
+ const messageType = messageParts[0];
1899
2254
  if (messageType.startsWith("POS")) {
1900
- H1Helper.processPosition(decodeResult, messageType.substring(3).split(","));
2255
+ H1Helper.processPosition(decodeResult, messagePart.substring(3).split(","));
1901
2256
  return processMessageType(decodeResult, "POS");
1902
- } else if (messageType.length === 13) {
1903
- if (processMessageType(decodeResult, messageType.substring(10))) {
1904
- ResultFormatter.unknown(decodeResult, messageType.substring(0, 4));
1905
- ResultFormatter.flightNumber(decodeResult, messageType.slice(4, 10));
1906
- return true;
2257
+ } else if (messageType.length === 6) {
2258
+ const part1 = processMessageType(decodeResult, messageType.substring(0, 3));
2259
+ const description = decodeResult.formatted.description;
2260
+ const part2 = processMessageType(decodeResult, messageType.substring(3, 6));
2261
+ decodeResult.formatted.description = description + " for " + decodeResult.formatted.description;
2262
+ if (messageParts.length > 1) {
2263
+ ResultFormatter.unknown(
2264
+ decodeResult,
2265
+ messageParts.slice(1).join(","),
2266
+ "/"
2267
+ );
1907
2268
  }
2269
+ return part1 && part2;
1908
2270
  }
1909
- return processMessageType(decodeResult, messageType.substring(0, 3));
2271
+ if (messageParts.length > 1) {
2272
+ ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(","), "/");
2273
+ }
2274
+ return processMessageType(decodeResult, messageType);
1910
2275
  }
1911
2276
  function processMessageType(decodeResult, type) {
1912
2277
  if (type === "FPN") {
@@ -1923,6 +2288,12 @@ function processMessageType(decodeResult, type) {
1923
2288
  decodeResult.formatted.description = "Progress Report";
1924
2289
  } else if (type === "PWI") {
1925
2290
  decodeResult.formatted.description = "Pilot Weather Information";
2291
+ } else if (type === "REJ") {
2292
+ decodeResult.formatted.description = "Reject";
2293
+ } else if (type === "REQ") {
2294
+ decodeResult.formatted.description = "Request";
2295
+ } else if (type === "RES") {
2296
+ decodeResult.formatted.description = "Response";
1926
2297
  } else {
1927
2298
  decodeResult.formatted.description = "Unknown H1 Message";
1928
2299
  return false;
@@ -1938,6 +2309,22 @@ function processDateCode(decodeResult, data) {
1938
2309
  decodeResult.raw.message_timestamp = time;
1939
2310
  }
1940
2311
  }
2312
+ function processWeatherQuery(decodeResult, data) {
2313
+ if (data.length !== 2) {
2314
+ ResultFormatter.unknown(decodeResult, data.join(":"), "WQ/");
2315
+ return;
2316
+ }
2317
+ const alts = data[0].split(".");
2318
+ const route = data[1].split(".");
2319
+ ResultFormatter.requestedAltitudes(
2320
+ decodeResult,
2321
+ alts.map((a) => parseInt(a, 10) * 100)
2322
+ );
2323
+ const waypoints = route.map((wp) => {
2324
+ return { name: wp };
2325
+ });
2326
+ ResultFormatter.route(decodeResult, { waypoints });
2327
+ }
1941
2328
  function processRoute(decodeResult, last, time, next, eta, then, date) {
1942
2329
  const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
1943
2330
  const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
@@ -1950,13 +2337,7 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
1950
2337
  nextWaypoint.timeFormat = timeFormat;
1951
2338
  const thenWaypoint = RouteUtils.getWaypoint(then || "?");
1952
2339
  const waypoints = [lastWaypoint, nextWaypoint, thenWaypoint];
1953
- decodeResult.raw.route = { waypoints };
1954
- decodeResult.formatted.items.push({
1955
- type: "aircraft_route",
1956
- code: "ROUTE",
1957
- label: "Aircraft Route",
1958
- value: RouteUtils.routeToString(decodeResult.raw.route)
1959
- });
2340
+ ResultFormatter.route(decodeResult, { waypoints });
1960
2341
  }
1961
2342
  function processWindData(decodeResult, message) {
1962
2343
  const wind = [];
@@ -2031,7 +2412,10 @@ var Label_1J_2J_FTX = class extends DecoderPlugin {
2031
2412
  const parts = msg.split("/");
2032
2413
  let decoded = false;
2033
2414
  if (parts[0].length > 3) {
2034
- decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length - 3));
2415
+ decoded = H1Helper.decodeH1Message(
2416
+ decodeResult,
2417
+ msg.slice(parts[0].length - 3)
2418
+ );
2035
2419
  decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
2036
2420
  } else {
2037
2421
  decoded = H1Helper.decodeH1Message(decodeResult, msg);
@@ -2067,16 +2451,26 @@ var Label_1M_Slash = class extends DecoderPlugin {
2067
2451
  const results = message.text.split(/\n|\//).slice(1);
2068
2452
  if (results) {
2069
2453
  if (options.debug) {
2070
- console.log(`Label 1M ETA: results`);
2454
+ console.log("Label 1M ETA: results");
2071
2455
  console.log(results);
2072
2456
  }
2073
2457
  decodeResult.raw.flight_number = results[0];
2074
2458
  ResultFormatter.departureAirport(decodeResult, results[3]);
2075
2459
  ResultFormatter.arrivalAirport(decodeResult, results[4]);
2076
2460
  ResultFormatter.alternateAirport(decodeResult, results[5]);
2077
- ResultFormatter.arrivalRunway(decodeResult, results[8].replace(results[4], ""));
2461
+ ResultFormatter.arrivalRunway(
2462
+ decodeResult,
2463
+ results[8].replace(results[4], "")
2464
+ );
2078
2465
  const yymmdd = results[2];
2079
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertDateTimeToEpoch(results[7] + "00", yymmdd.substring(2, 4) + yymmdd.substring(4, 6) + yymmdd.substring(0, 2)), "epoch");
2466
+ ResultFormatter.eta(
2467
+ decodeResult,
2468
+ DateTimeUtils.convertDateTimeToEpoch(
2469
+ results[7] + "00",
2470
+ yymmdd.substring(2, 4) + yymmdd.substring(4, 6) + yymmdd.substring(0, 2)
2471
+ ),
2472
+ "epoch"
2473
+ );
2080
2474
  }
2081
2475
  decodeResult.decoded = true;
2082
2476
  decodeResult.decoder.decodeLevel = "partial";
@@ -2086,7 +2480,6 @@ var Label_1M_Slash = class extends DecoderPlugin {
2086
2480
 
2087
2481
  // lib/plugins/Label_1L_3-line.ts
2088
2482
  var Label_1L_3Line = class extends DecoderPlugin {
2089
- // eslint-disable-line camelcase
2090
2483
  name = "label-1l-3-line";
2091
2484
  qualifiers() {
2092
2485
  return {
@@ -2174,7 +2567,6 @@ var Label_1L_3Line = class extends DecoderPlugin {
2174
2567
 
2175
2568
  // lib/plugins/Label_1L_070.ts
2176
2569
  var Label_1L_070 = class extends DecoderPlugin {
2177
- // eslint-disable-line camelcase
2178
2570
  name = "label-1l-070";
2179
2571
  qualifiers() {
2180
2572
  return {
@@ -2208,8 +2600,14 @@ var Label_1L_070 = class extends DecoderPlugin {
2208
2600
  }
2209
2601
  ResultFormatter.departureAirport(decodeResult, parts[0]);
2210
2602
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
2211
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
2212
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
2603
+ ResultFormatter.time_of_day(
2604
+ decodeResult,
2605
+ DateTimeUtils.convertHHMMSSToTod(parts[2])
2606
+ );
2607
+ ResultFormatter.eta(
2608
+ decodeResult,
2609
+ DateTimeUtils.convertHHMMSSToTod(parts[3])
2610
+ );
2213
2611
  ResultFormatter.position(decodeResult, {
2214
2612
  latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),
2215
2613
  longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1))
@@ -2223,7 +2621,6 @@ var Label_1L_070 = class extends DecoderPlugin {
2223
2621
 
2224
2622
  // lib/plugins/Label_1L_660.ts
2225
2623
  var Label_1L_660 = class extends DecoderPlugin {
2226
- // eslint-disable-line camelcase
2227
2624
  name = "label-1l-660";
2228
2625
  qualifiers() {
2229
2626
  return {
@@ -2255,12 +2652,17 @@ var Label_1L_660 = class extends DecoderPlugin {
2255
2652
  decodeResult.decoder.decodeLevel = "none";
2256
2653
  return decodeResult;
2257
2654
  }
2258
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(parts[0]);
2655
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2656
+ parts[0]
2657
+ );
2259
2658
  if (position) {
2260
2659
  ResultFormatter.position(decodeResult, position);
2261
2660
  }
2262
2661
  const hhmmss = parts[1].substring(0, 6);
2263
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmmss));
2662
+ ResultFormatter.time_of_day(
2663
+ decodeResult,
2664
+ DateTimeUtils.convertHHMMSSToTod(hhmmss)
2665
+ );
2264
2666
  const fl = parts[1].substring(6, 9);
2265
2667
  ResultFormatter.altitude(decodeResult, Number(fl) * 100);
2266
2668
  const next = parts[1].substring(9);
@@ -2274,7 +2676,6 @@ var Label_1L_660 = class extends DecoderPlugin {
2274
2676
 
2275
2677
  // lib/plugins/Label_1L_Slash.ts
2276
2678
  var Label_1L_Slash = class extends DecoderPlugin {
2277
- // eslint-disable-line camelcase
2278
2679
  name = "label-1l-1-line";
2279
2680
  qualifiers() {
2280
2681
  return {
@@ -2313,7 +2714,10 @@ var Label_1L_Slash = class extends DecoderPlugin {
2313
2714
  ResultFormatter.position(decodeResult, position);
2314
2715
  const utc = data.get("UTC");
2315
2716
  if (utc) {
2316
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(utc));
2717
+ ResultFormatter.time_of_day(
2718
+ decodeResult,
2719
+ DateTimeUtils.convertHHMMSSToTod(utc)
2720
+ );
2317
2721
  data.delete("UTC");
2318
2722
  }
2319
2723
  const alt = data.get("ALT");
@@ -2364,7 +2768,10 @@ var Label_20_POS = class extends DecoderPlugin {
2364
2768
  console.log(`DEBUG: ${this.name}: Variation 1 detected`);
2365
2769
  }
2366
2770
  const rawCoords = fields[0];
2367
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(rawCoords));
2771
+ ResultFormatter.position(
2772
+ decodeResult,
2773
+ CoordinateUtils.decodeStringCoordinates(rawCoords)
2774
+ );
2368
2775
  decodeResult.decoded = true;
2369
2776
  decodeResult.decoder.decodeLevel = "full";
2370
2777
  } else if (fields.length == 5) {
@@ -2379,7 +2786,9 @@ var Label_20_POS = class extends DecoderPlugin {
2379
2786
  decodeResult.decoder.decodeLevel = "full";
2380
2787
  } else {
2381
2788
  if (options.debug) {
2382
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);
2789
+ console.log(
2790
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
2791
+ );
2383
2792
  }
2384
2793
  decodeResult.decoded = false;
2385
2794
  decodeResult.decoder.decodeLevel = "none";
@@ -2407,17 +2816,29 @@ var Label_21_POS = class extends DecoderPlugin {
2407
2816
  const fields = content.split(",");
2408
2817
  if (fields.length == 9) {
2409
2818
  processPosition(decodeResult, fields[0].trim());
2410
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
2819
+ ResultFormatter.time_of_day(
2820
+ decodeResult,
2821
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
2822
+ );
2411
2823
  ResultFormatter.altitude(decodeResult, Number(fields[3]));
2412
2824
  ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ""));
2413
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[7]));
2825
+ ResultFormatter.eta(
2826
+ decodeResult,
2827
+ DateTimeUtils.convertHHMMSSToTod(fields[7])
2828
+ );
2414
2829
  ResultFormatter.arrivalAirport(decodeResult, fields[8]);
2415
- ResultFormatter.unknownArr(decodeResult, [fields[1], fields[4], fields[5]]);
2830
+ ResultFormatter.unknownArr(decodeResult, [
2831
+ fields[1],
2832
+ fields[4],
2833
+ fields[5]
2834
+ ]);
2416
2835
  decodeResult.decoded = true;
2417
2836
  decodeResult.decoder.decodeLevel = "partial";
2418
2837
  } else {
2419
2838
  if (options.debug) {
2420
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);
2839
+ console.log(
2840
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
2841
+ );
2421
2842
  }
2422
2843
  decodeResult.decoded = false;
2423
2844
  decodeResult.decoder.decodeLevel = "none";
@@ -2460,12 +2881,27 @@ var Label_22_OFF = class extends DecoderPlugin {
2460
2881
  return decodeResult;
2461
2882
  }
2462
2883
  ResultFormatter.flightNumber(decodeResult, fields[0]);
2463
- ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2)));
2464
- ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2, 4)));
2465
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)));
2466
- ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12));
2884
+ ResultFormatter.departureDay(
2885
+ decodeResult,
2886
+ Number(fields[1].substring(0, 2))
2887
+ );
2888
+ ResultFormatter.arrivalDay(
2889
+ decodeResult,
2890
+ Number(fields[1].substring(2, 4))
2891
+ );
2892
+ ResultFormatter.time_of_day(
2893
+ decodeResult,
2894
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8))
2895
+ );
2896
+ ResultFormatter.departureAirport(
2897
+ decodeResult,
2898
+ fields[1].substring(8, 12)
2899
+ );
2467
2900
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));
2468
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)));
2901
+ ResultFormatter.off(
2902
+ decodeResult,
2903
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22))
2904
+ );
2469
2905
  ResultFormatter.unknown(decodeResult, fields[1].substring(22));
2470
2906
  decodeResult.decoded = true;
2471
2907
  decodeResult.decoder.decodeLevel = "partial";
@@ -2478,7 +2914,10 @@ var Label_22_OFF = class extends DecoderPlugin {
2478
2914
  }
2479
2915
  ResultFormatter.departureAirport(decodeResult, fields[0]);
2480
2916
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
2481
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
2917
+ ResultFormatter.off(
2918
+ decodeResult,
2919
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
2920
+ );
2482
2921
  ResultFormatter.unknown(decodeResult, fields[3]);
2483
2922
  decodeResult.decoded = true;
2484
2923
  decodeResult.decoder.decodeLevel = "partial";
@@ -2490,17 +2929,31 @@ var Label_22_OFF = class extends DecoderPlugin {
2490
2929
  return decodeResult;
2491
2930
  }
2492
2931
  ResultFormatter.flightNumber(decodeResult, fields[0]);
2493
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(fields[1].substring(0, 14));
2932
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
2933
+ fields[1].substring(0, 14)
2934
+ );
2494
2935
  if (position) {
2495
2936
  ResultFormatter.position(decodeResult, position);
2496
2937
  }
2497
2938
  ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));
2498
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)));
2499
- ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24));
2939
+ ResultFormatter.time_of_day(
2940
+ decodeResult,
2941
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20))
2942
+ );
2943
+ ResultFormatter.departureAirport(
2944
+ decodeResult,
2945
+ fields[1].substring(20, 24)
2946
+ );
2500
2947
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));
2501
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)));
2948
+ ResultFormatter.off(
2949
+ decodeResult,
2950
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32))
2951
+ );
2502
2952
  ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));
2503
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)));
2953
+ ResultFormatter.eta(
2954
+ decodeResult,
2955
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40))
2956
+ );
2504
2957
  decodeResult.decoded = true;
2505
2958
  decodeResult.decoder.decodeLevel = "partial";
2506
2959
  } else {
@@ -2531,7 +2984,9 @@ var Label_22_POS = class extends DecoderPlugin {
2531
2984
  const fields = message.text.split(",");
2532
2985
  if (fields.length !== 11) {
2533
2986
  if (options.debug) {
2534
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(",")}`);
2987
+ console.log(
2988
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(",")}`
2989
+ );
2535
2990
  }
2536
2991
  decodeResult.decoded = false;
2537
2992
  decodeResult.decoder.decodeLevel = "none";
@@ -2545,7 +3000,10 @@ var Label_22_POS = class extends DecoderPlugin {
2545
3000
  latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,
2546
3001
  longitude: CoordinateUtils.getDirection(fields[0][8]) * lon
2547
3002
  });
2548
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
3003
+ ResultFormatter.time_of_day(
3004
+ decodeResult,
3005
+ DateTimeUtils.convertHHMMSSToTod(fields[2])
3006
+ );
2549
3007
  ResultFormatter.altitude(decodeResult, Number(fields[3]));
2550
3008
  ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);
2551
3009
  decodeResult.decoded = true;
@@ -2581,11 +3039,20 @@ var Label_2P_FM3 = class extends DecoderPlugin {
2581
3039
  ResultFormatter.flightNumber(decodeResult, header[0].substring(4));
2582
3040
  }
2583
3041
  if (header[1].length === 4) {
2584
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));
3042
+ ResultFormatter.time_of_day(
3043
+ decodeResult,
3044
+ DateTimeUtils.convertHHMMSSToTod(header[1])
3045
+ );
2585
3046
  } else {
2586
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));
3047
+ ResultFormatter.time_of_day(
3048
+ decodeResult,
3049
+ DateTimeUtils.convertHHMMSSToTod(header[1])
3050
+ );
2587
3051
  }
2588
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[1]));
3052
+ ResultFormatter.eta(
3053
+ decodeResult,
3054
+ DateTimeUtils.convertHHMMSSToTod(parts[1])
3055
+ );
2589
3056
  const lat = parts[2].replaceAll(" ", "");
2590
3057
  const lon = parts[3].replaceAll(" ", "");
2591
3058
  if (lat[0] === "N" || lat[0] === "S") {
@@ -2594,7 +3061,10 @@ var Label_2P_FM3 = class extends DecoderPlugin {
2594
3061
  longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
2595
3062
  });
2596
3063
  } else {
2597
- ResultFormatter.position(decodeResult, { latitude: Number(lat), longitude: Number(lon) });
3064
+ ResultFormatter.position(decodeResult, {
3065
+ latitude: Number(lat),
3066
+ longitude: Number(lon)
3067
+ });
2598
3068
  }
2599
3069
  ResultFormatter.altitude(decodeResult, Number(parts[4]));
2600
3070
  ResultFormatter.unknown(decodeResult, parts[5]);
@@ -2642,9 +3112,18 @@ var Label_2P_FM4 = class extends DecoderPlugin {
2642
3112
  ResultFormatter.departureAirport(decodeResult, header[1]);
2643
3113
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
2644
3114
  ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));
2645
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)));
2646
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
2647
- ResultFormatter.position(decodeResult, { latitude: Number(parts[4].replaceAll(" ", "")), longitude: Number(parts[5].replaceAll(" ", "")) });
3115
+ ResultFormatter.time_of_day(
3116
+ decodeResult,
3117
+ DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2))
3118
+ );
3119
+ ResultFormatter.eta(
3120
+ decodeResult,
3121
+ DateTimeUtils.convertHHMMSSToTod(parts[3])
3122
+ );
3123
+ ResultFormatter.position(decodeResult, {
3124
+ latitude: Number(parts[4].replaceAll(" ", "")),
3125
+ longitude: Number(parts[5].replaceAll(" ", ""))
3126
+ });
2648
3127
  ResultFormatter.altitude(decodeResult, Number(parts[6]));
2649
3128
  ResultFormatter.heading(decodeResult, Number(parts[7]));
2650
3129
  ResultFormatter.unknown(decodeResult, parts[8]);
@@ -2687,9 +3166,18 @@ var Label_2P_FM5 = class extends DecoderPlugin {
2687
3166
  }
2688
3167
  ResultFormatter.departureAirport(decodeResult, header[1]);
2689
3168
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
2690
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
2691
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
2692
- ResultFormatter.position(decodeResult, { latitude: Number(parts[4].replaceAll(" ", "")), longitude: Number(parts[5].replaceAll(" ", "")) });
3169
+ ResultFormatter.time_of_day(
3170
+ decodeResult,
3171
+ DateTimeUtils.convertHHMMSSToTod(parts[2])
3172
+ );
3173
+ ResultFormatter.eta(
3174
+ decodeResult,
3175
+ DateTimeUtils.convertHHMMSSToTod(parts[3])
3176
+ );
3177
+ ResultFormatter.position(decodeResult, {
3178
+ latitude: Number(parts[4].replaceAll(" ", "")),
3179
+ longitude: Number(parts[5].replaceAll(" ", ""))
3180
+ });
2693
3181
  ResultFormatter.altitude(decodeResult, Number(parts[6]));
2694
3182
  ResultFormatter.unknown(decodeResult, parts[7]);
2695
3183
  ResultFormatter.unknown(decodeResult, parts[8]);
@@ -2726,7 +3214,10 @@ var Label_2P_POS = class extends DecoderPlugin {
2726
3214
  const parts = msg.split("/");
2727
3215
  let decoded = false;
2728
3216
  if (parts[0].length > 3) {
2729
- decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length - 3));
3217
+ decoded = H1Helper.decodeH1Message(
3218
+ decodeResult,
3219
+ msg.slice(parts[0].length - 3)
3220
+ );
2730
3221
  decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
2731
3222
  } else {
2732
3223
  decoded = H1Helper.decodeH1Message(decodeResult, msg);
@@ -2763,7 +3254,10 @@ var Label_24_Slash = class extends DecoderPlugin {
2763
3254
  if (fields.length == 10 && fields[0] == "" && fields[9] == "") {
2764
3255
  const mmddyy = fields[1].substring(4, 6) + fields[1].substring(2, 4) + fields[1].substring(0, 2);
2765
3256
  const hhmmss = fields[2] + "00";
2766
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(hhmmss, mmddyy);
3257
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
3258
+ hhmmss,
3259
+ mmddyy
3260
+ );
2767
3261
  ResultFormatter.flightNumber(decodeResult, fields[3]);
2768
3262
  ResultFormatter.altitude(decodeResult, Number(fields[4]));
2769
3263
  const lat = fields[5];
@@ -2773,13 +3267,18 @@ var Label_24_Slash = class extends DecoderPlugin {
2773
3267
  longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
2774
3268
  };
2775
3269
  ResultFormatter.position(decodeResult, position);
2776
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));
3270
+ ResultFormatter.eta(
3271
+ decodeResult,
3272
+ DateTimeUtils.convertHHMMSSToTod(fields[8])
3273
+ );
2777
3274
  ResultFormatter.unknown(decodeResult, fields[7]);
2778
3275
  decodeResult.decoded = true;
2779
3276
  decodeResult.decoder.decodeLevel = "partial";
2780
3277
  } else {
2781
3278
  if (options.debug) {
2782
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`);
3279
+ console.log(
3280
+ `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`
3281
+ );
2783
3282
  }
2784
3283
  decodeResult.decoded = false;
2785
3284
  decodeResult.decoder.decodeLevel = "none";
@@ -2805,16 +3304,22 @@ var Label_30_Slash_EA = class extends DecoderPlugin {
2805
3304
  const results = message.text.split(/\n|\//).slice(1);
2806
3305
  if (results) {
2807
3306
  if (options.debug) {
2808
- console.log(`Label 30 EA: results`);
3307
+ console.log("Label 30 EA: results");
2809
3308
  console.log(results);
2810
3309
  }
2811
3310
  }
2812
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));
3311
+ ResultFormatter.eta(
3312
+ decodeResult,
3313
+ DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4))
3314
+ );
2813
3315
  if (results[1].substring(0, 2) === "DS") {
2814
3316
  ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
2815
3317
  ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
2816
3318
  } else {
2817
- ResultFormatter.unknown(decodeResult, "/".concat(results[1], "/", results[2]));
3319
+ ResultFormatter.unknown(
3320
+ decodeResult,
3321
+ "/".concat(results[1], "/", results[2])
3322
+ );
2818
3323
  }
2819
3324
  decodeResult.decoded = true;
2820
3325
  decodeResult.decoder.decodeLevel = "partial";
@@ -2839,17 +3344,26 @@ var Label_44_ETA = class extends DecoderPlugin {
2839
3344
  const data = message.text.split(",");
2840
3345
  if (data.length >= 9) {
2841
3346
  if (options.debug) {
2842
- console.log(`Label 44 ETA Report: groups`);
3347
+ console.log("Label 44 ETA Report: groups");
2843
3348
  console.log(data);
2844
3349
  }
2845
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3350
+ ResultFormatter.position(
3351
+ decodeResult,
3352
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3353
+ );
2846
3354
  ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
2847
3355
  ResultFormatter.departureAirport(decodeResult, data[3]);
2848
3356
  ResultFormatter.arrivalAirport(decodeResult, data[4]);
2849
3357
  ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
2850
3358
  ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
2851
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
2852
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));
3359
+ ResultFormatter.time_of_day(
3360
+ decodeResult,
3361
+ DateTimeUtils.convertHHMMSSToTod(data[6])
3362
+ );
3363
+ ResultFormatter.eta(
3364
+ decodeResult,
3365
+ DateTimeUtils.convertHHMMSSToTod(data[7])
3366
+ );
2853
3367
  const fuel = Number(data[8]);
2854
3368
  if (!isNaN(fuel)) {
2855
3369
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -2889,15 +3403,21 @@ var Label_44_IN = class extends DecoderPlugin {
2889
3403
  const data = message.text.split(",");
2890
3404
  if (data.length >= 7) {
2891
3405
  if (options.debug) {
2892
- console.log(`Label 44 In Air Report: groups`);
3406
+ console.log("Label 44 In Air Report: groups");
2893
3407
  console.log(data);
2894
3408
  }
2895
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3409
+ ResultFormatter.position(
3410
+ decodeResult,
3411
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3412
+ );
2896
3413
  ResultFormatter.departureAirport(decodeResult, data[2]);
2897
3414
  ResultFormatter.arrivalAirport(decodeResult, data[3]);
2898
3415
  ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2899
3416
  ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2900
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
3417
+ ResultFormatter.in(
3418
+ decodeResult,
3419
+ DateTimeUtils.convertHHMMSSToTod(data[5])
3420
+ );
2901
3421
  const fuel = Number(data[6]);
2902
3422
  if (!isNaN(fuel)) {
2903
3423
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -2937,16 +3457,25 @@ var Label_44_OFF = class extends DecoderPlugin {
2937
3457
  const data = message.text.split(",");
2938
3458
  if (data.length >= 8) {
2939
3459
  if (options.debug) {
2940
- console.log(`Label 44 Off Runway Report: groups`);
3460
+ console.log("Label 44 Off Runway Report: groups");
2941
3461
  console.log(data);
2942
3462
  }
2943
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3463
+ ResultFormatter.position(
3464
+ decodeResult,
3465
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3466
+ );
2944
3467
  ResultFormatter.departureAirport(decodeResult, data[2]);
2945
3468
  ResultFormatter.arrivalAirport(decodeResult, data[3]);
2946
3469
  ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2947
3470
  ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2948
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
2949
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
3471
+ ResultFormatter.off(
3472
+ decodeResult,
3473
+ DateTimeUtils.convertHHMMSSToTod(data[5])
3474
+ );
3475
+ ResultFormatter.eta(
3476
+ decodeResult,
3477
+ DateTimeUtils.convertHHMMSSToTod(data[6])
3478
+ );
2950
3479
  const fuel = Number(data[7]);
2951
3480
  if (!isNaN(fuel)) {
2952
3481
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -2986,15 +3515,21 @@ var Label_44_ON = class extends DecoderPlugin {
2986
3515
  const data = message.text.split(",");
2987
3516
  if (data.length >= 7) {
2988
3517
  if (options.debug) {
2989
- console.log(`Label 44 On Runway Report: groups`);
3518
+ console.log("Label 44 On Runway Report: groups");
2990
3519
  console.log(data);
2991
3520
  }
2992
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
3521
+ ResultFormatter.position(
3522
+ decodeResult,
3523
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
3524
+ );
2993
3525
  ResultFormatter.departureAirport(decodeResult, data[2]);
2994
3526
  ResultFormatter.arrivalAirport(decodeResult, data[3]);
2995
3527
  ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2996
3528
  ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2997
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
3529
+ ResultFormatter.on(
3530
+ decodeResult,
3531
+ DateTimeUtils.convertHHMMSSToTod(data[5])
3532
+ );
2998
3533
  const fuel = Number(data[6]);
2999
3534
  if (!isNaN(fuel)) {
3000
3535
  ResultFormatter.remainingFuel(decodeResult, Number(fuel));
@@ -3035,19 +3570,39 @@ var Label_44_POS = class extends DecoderPlugin {
3035
3570
  const results = message.text.match(regex);
3036
3571
  if (results?.groups) {
3037
3572
  if (options.debug) {
3038
- console.log(`Label 44 Position Report: groups`);
3573
+ console.log("Label 44 Position Report: groups");
3039
3574
  console.log(results.groups);
3040
3575
  }
3041
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
3576
+ ResultFormatter.position(
3577
+ decodeResult,
3578
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
3579
+ results.groups.unsplit_coords
3580
+ )
3581
+ );
3042
3582
  const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
3043
- ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
3044
- ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
3045
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
3046
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
3583
+ ResultFormatter.month(
3584
+ decodeResult,
3585
+ Number(results.groups.current_date.substring(0, 2))
3586
+ );
3587
+ ResultFormatter.day(
3588
+ decodeResult,
3589
+ Number(results.groups.current_date.substring(2, 4))
3590
+ );
3591
+ ResultFormatter.time_of_day(
3592
+ decodeResult,
3593
+ DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00")
3594
+ );
3595
+ ResultFormatter.eta(
3596
+ decodeResult,
3597
+ DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00")
3598
+ );
3047
3599
  if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
3048
3600
  decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
3049
3601
  }
3050
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
3602
+ ResultFormatter.departureAirport(
3603
+ decodeResult,
3604
+ results.groups.departure_icao
3605
+ );
3051
3606
  ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
3052
3607
  ResultFormatter.altitude(decodeResult, flight_level * 100);
3053
3608
  }
@@ -3085,7 +3640,7 @@ var Label_44_Slash = class extends DecoderPlugin {
3085
3640
  const data = fields[3].split(",");
3086
3641
  if (data.length >= 6) {
3087
3642
  if (options.debug) {
3088
- console.log(`Label 44 Slash: groups`);
3643
+ console.log("Label 44 Slash: groups");
3089
3644
  console.log(data);
3090
3645
  }
3091
3646
  ResultFormatter.position(decodeResult, {
@@ -3135,34 +3690,33 @@ var Label_4A = class extends DecoderPlugin {
3135
3690
  decodeResult.decoder.name = this.name;
3136
3691
  decodeResult.message = message;
3137
3692
  decodeResult.formatted.description = "Latest New Format";
3138
- let text = message.text;
3139
- if (text.match(/^M\d{2}A\w{6}/)) {
3140
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
3141
- text = text.substring(10);
3142
- }
3143
3693
  decodeResult.decoded = true;
3144
- const fields = text.split(",");
3694
+ const fields = message.text.split(",");
3145
3695
  if (fields.length === 11) {
3146
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
3696
+ ResultFormatter.time_of_day(
3697
+ decodeResult,
3698
+ DateTimeUtils.convertHHMMSSToTod(fields[0])
3699
+ );
3147
3700
  ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
3148
- if (fields[3])
3149
- ResultFormatter.callsign(decodeResult, fields[3]);
3701
+ if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);
3150
3702
  ResultFormatter.departureAirport(decodeResult, fields[4]);
3151
3703
  ResultFormatter.arrivalAirport(decodeResult, fields[5]);
3152
- const alt = text.substring(48, 51);
3153
- if (alt !== "") {
3154
- ResultFormatter.altitude(decodeResult, Number(alt) * 100);
3155
- }
3156
3704
  ResultFormatter.unknownArr(decodeResult, fields.slice(8));
3157
3705
  } else if (fields.length === 6) {
3158
3706
  if (fields[0].match(/^[NS]/)) {
3159
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));
3707
+ ResultFormatter.position(
3708
+ decodeResult,
3709
+ CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13))
3710
+ );
3160
3711
  let wp1 = {
3161
3712
  name: fields[0].substring(13).trim(),
3162
3713
  time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
3163
3714
  timeFormat: "tod"
3164
3715
  };
3165
- ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);
3716
+ ResultFormatter.altitude(
3717
+ decodeResult,
3718
+ Number(fields[1].substring(6, 9)) * 100
3719
+ );
3166
3720
  let wp2 = {
3167
3721
  name: fields[1].substring(9).trim(),
3168
3722
  time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
@@ -3172,21 +3726,31 @@ var Label_4A = class extends DecoderPlugin {
3172
3726
  ResultFormatter.temperature(decodeResult, fields[3]);
3173
3727
  ResultFormatter.unknownArr(decodeResult, fields.slice(4));
3174
3728
  } else {
3175
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
3176
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));
3729
+ ResultFormatter.time_of_day(
3730
+ decodeResult,
3731
+ DateTimeUtils.convertHHMMSSToTod(fields[0])
3732
+ );
3733
+ ResultFormatter.eta(
3734
+ decodeResult,
3735
+ DateTimeUtils.convertHHMMSSToTod(fields[1])
3736
+ );
3177
3737
  ResultFormatter.unknown(decodeResult, fields[2]);
3178
3738
  ResultFormatter.altitude(decodeResult, Number(fields[3]));
3179
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4] + fields[5]).replace(/[ \.]/g, "")));
3739
+ ResultFormatter.position(
3740
+ decodeResult,
3741
+ CoordinateUtils.decodeStringCoordinates(
3742
+ (fields[4] + fields[5]).replace(/[ \.]/g, "")
3743
+ )
3744
+ );
3180
3745
  }
3181
3746
  } else {
3182
3747
  decodeResult.decoded = false;
3183
- ResultFormatter.unknown(decodeResult, text);
3748
+ ResultFormatter.unknown(decodeResult, message.text);
3184
3749
  }
3185
3750
  if (decodeResult.decoded) {
3186
3751
  if (!decodeResult.remaining.text)
3187
3752
  decodeResult.decoder.decodeLevel = "full";
3188
- else
3189
- decodeResult.decoder.decodeLevel = "partial";
3753
+ else decodeResult.decoder.decodeLevel = "partial";
3190
3754
  } else {
3191
3755
  decodeResult.decoder.decodeLevel = "none";
3192
3756
  }
@@ -3209,11 +3773,16 @@ var Label_4A_01 = class extends DecoderPlugin {
3209
3773
  decodeResult.message = message;
3210
3774
  decodeResult.formatted.description = "Latest New Format";
3211
3775
  decodeResult.decoded = true;
3212
- let rgx = message.text.match(/^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/);
3776
+ let rgx = message.text.match(
3777
+ /^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/
3778
+ );
3213
3779
  if (rgx) {
3214
3780
  ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
3215
3781
  ResultFormatter.callsign(decodeResult, rgx[3]);
3216
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00"));
3782
+ ResultFormatter.time_of_day(
3783
+ decodeResult,
3784
+ DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00")
3785
+ );
3217
3786
  ResultFormatter.departureAirport(decodeResult, rgx[5]);
3218
3787
  ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
3219
3788
  ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
@@ -3226,8 +3795,7 @@ var Label_4A_01 = class extends DecoderPlugin {
3226
3795
  if (decodeResult.decoded) {
3227
3796
  if (!decodeResult.remaining.text)
3228
3797
  decodeResult.decoder.decodeLevel = "full";
3229
- else
3230
- decodeResult.decoder.decodeLevel = "partial";
3798
+ else decodeResult.decoder.decodeLevel = "partial";
3231
3799
  } else {
3232
3800
  decodeResult.decoder.decodeLevel = "none";
3233
3801
  }
@@ -3251,14 +3819,16 @@ var Label_4A_DIS = class extends DecoderPlugin {
3251
3819
  decodeResult.formatted.description = "Latest New Format";
3252
3820
  decodeResult.decoded = true;
3253
3821
  const fields = message.text.split(",");
3254
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00"));
3822
+ ResultFormatter.time_of_day(
3823
+ decodeResult,
3824
+ DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
3825
+ );
3255
3826
  ResultFormatter.callsign(decodeResult, fields[2]);
3256
3827
  ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
3257
3828
  if (decodeResult.decoded) {
3258
3829
  if (!decodeResult.remaining.text)
3259
3830
  decodeResult.decoder.decodeLevel = "full";
3260
- else
3261
- decodeResult.decoder.decodeLevel = "partial";
3831
+ else decodeResult.decoder.decodeLevel = "partial";
3262
3832
  } else {
3263
3833
  decodeResult.decoder.decodeLevel = "none";
3264
3834
  }
@@ -3283,8 +3853,15 @@ var Label_4A_DOOR = class extends DecoderPlugin {
3283
3853
  decodeResult.decoded = true;
3284
3854
  const fields = message.text.split(" ");
3285
3855
  if (fields.length === 3) {
3286
- ResultFormatter.door_event(decodeResult, fields[0].split("/")[1], fields[1]);
3287
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
3856
+ ResultFormatter.door_event(
3857
+ decodeResult,
3858
+ fields[0].split("/")[1],
3859
+ fields[1]
3860
+ );
3861
+ ResultFormatter.time_of_day(
3862
+ decodeResult,
3863
+ DateTimeUtils.convertHHMMSSToTod(fields[2] + "00")
3864
+ );
3288
3865
  } else {
3289
3866
  decodeResult.decoded = false;
3290
3867
  ResultFormatter.unknown(decodeResult, message.text);
@@ -3292,8 +3869,7 @@ var Label_4A_DOOR = class extends DecoderPlugin {
3292
3869
  if (decodeResult.decoded) {
3293
3870
  if (!decodeResult.remaining.text)
3294
3871
  decodeResult.decoder.decodeLevel = "full";
3295
- else
3296
- decodeResult.decoder.decodeLevel = "partial";
3872
+ else decodeResult.decoder.decodeLevel = "partial";
3297
3873
  } else {
3298
3874
  decodeResult.decoder.decodeLevel = "none";
3299
3875
  }
@@ -3325,8 +3901,7 @@ var Label_4A_Slash_01 = class extends DecoderPlugin {
3325
3901
  if (decodeResult.decoded) {
3326
3902
  if (!decodeResult.remaining.text)
3327
3903
  decodeResult.decoder.decodeLevel = "full";
3328
- else
3329
- decodeResult.decoder.decodeLevel = "partial";
3904
+ else decodeResult.decoder.decodeLevel = "partial";
3330
3905
  } else {
3331
3906
  decodeResult.decoder.decodeLevel = "none";
3332
3907
  }
@@ -3379,24 +3954,35 @@ var Label_4N = class extends DecoderPlugin {
3379
3954
  decodeResult.decoder.name = this.name;
3380
3955
  decodeResult.message = message;
3381
3956
  decodeResult.formatted.description = "Airline Defined";
3382
- let text = message.text;
3383
- if (text.match(/^M\d{2}A\w{6}/)) {
3384
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
3385
- text = text.substring(10);
3386
- }
3387
3957
  decodeResult.decoded = true;
3958
+ const text = message.text;
3388
3959
  const fields = text.split(",");
3389
3960
  if (text.length === 51) {
3390
3961
  decodeResult.raw.day = text.substring(0, 2);
3391
3962
  ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
3392
3963
  ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
3393
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, "$1")));
3394
- ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);
3395
- ResultFormatter.unknownArr(decodeResult, [text.substring(2, 4), text.substring(19, 29)], " ");
3964
+ ResultFormatter.position(
3965
+ decodeResult,
3966
+ CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
3967
+ text.substring(30, 45).replace(/^(.)0/, "$1")
3968
+ )
3969
+ );
3970
+ ResultFormatter.altitude(
3971
+ decodeResult,
3972
+ Number(text.substring(48, 51)) * 100
3973
+ );
3974
+ ResultFormatter.unknownArr(
3975
+ decodeResult,
3976
+ [text.substring(2, 4), text.substring(19, 29)],
3977
+ " "
3978
+ );
3396
3979
  } else if (fields.length === 33) {
3397
3980
  decodeResult.raw.date = fields[3];
3398
3981
  if (fields[1] === "B") {
3399
- ResultFormatter.position(decodeResult, { latitude: Number(fields[4]), longitude: Number(fields[5]) });
3982
+ ResultFormatter.position(decodeResult, {
3983
+ latitude: Number(fields[4]),
3984
+ longitude: Number(fields[5])
3985
+ });
3400
3986
  ResultFormatter.altitude(decodeResult, Number(fields[6]));
3401
3987
  }
3402
3988
  ResultFormatter.departureAirport(decodeResult, fields[8]);
@@ -3407,7 +3993,12 @@ var Label_4N = class extends DecoderPlugin {
3407
3993
  ResultFormatter.alternateRunway(decodeResult, fields[12].split("/")[0]);
3408
3994
  }
3409
3995
  ResultFormatter.checksum(decodeResult, fields[32]);
3410
- ResultFormatter.unknownArr(decodeResult, [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter((f) => f != ""));
3996
+ ResultFormatter.unknownArr(
3997
+ decodeResult,
3998
+ [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(
3999
+ (f) => f != ""
4000
+ )
4001
+ );
3411
4002
  } else {
3412
4003
  decodeResult.decoded = false;
3413
4004
  ResultFormatter.unknown(decodeResult, text);
@@ -3415,8 +4006,7 @@ var Label_4N = class extends DecoderPlugin {
3415
4006
  if (decodeResult.decoded) {
3416
4007
  if (!decodeResult.remaining.text)
3417
4008
  decodeResult.decoder.decodeLevel = "full";
3418
- else
3419
- decodeResult.decoder.decodeLevel = "partial";
4009
+ else decodeResult.decoder.decodeLevel = "partial";
3420
4010
  } else {
3421
4011
  decodeResult.decoder.decodeLevel = "none";
3422
4012
  }
@@ -3451,9 +4041,16 @@ var Label_4T_AGFSR = class extends DecoderPlugin {
3451
4041
  ResultFormatter.flightNumber(decodeResult, data[0].trim());
3452
4042
  ResultFormatter.departureDay(decodeResult, Number(data[1]));
3453
4043
  ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
3454
- ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
4044
+ ResultFormatter.departureAirport(
4045
+ decodeResult,
4046
+ data[3].substring(0, 3),
4047
+ "IATA"
4048
+ );
3455
4049
  ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
3456
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
4050
+ ResultFormatter.time_of_day(
4051
+ decodeResult,
4052
+ DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4))
4053
+ );
3457
4054
  ResultFormatter.unknown(decodeResult, data[5], "/");
3458
4055
  const lat = data[6].substring(0, 7);
3459
4056
  const lon = data[6].substring(7, 15);
@@ -3486,7 +4083,10 @@ var Label_58 = class extends DecoderPlugin {
3486
4083
  if (data.length === 8) {
3487
4084
  ResultFormatter.flightNumber(decodeResult, data[0]);
3488
4085
  ResultFormatter.day(decodeResult, Number(data[1]));
3489
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
4086
+ ResultFormatter.time_of_day(
4087
+ decodeResult,
4088
+ DateTimeUtils.convertHHMMSSToTod(data[2])
4089
+ );
3490
4090
  const lat = data[3];
3491
4091
  const lon = data[4];
3492
4092
  ResultFormatter.position(decodeResult, {
@@ -3540,7 +4140,10 @@ var Label_4T_ETA = class extends DecoderPlugin {
3540
4140
  const etaData = data[2].split(" ");
3541
4141
  ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
3542
4142
  ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
3543
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
4143
+ ResultFormatter.eta(
4144
+ decodeResult,
4145
+ DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4))
4146
+ );
3544
4147
  decodeResult.decoded = true;
3545
4148
  decodeResult.decoder.decodeLevel = "full";
3546
4149
  return decodeResult;
@@ -3572,7 +4175,10 @@ var Label_80 = class extends DecoderPlugin {
3572
4175
  this.parseTags(more.trim(), decodeResult);
3573
4176
  }
3574
4177
  }
3575
- this.parseHeader(headerParts[headerParts.length - 1].trim(), decodeResult);
4178
+ this.parseHeader(
4179
+ headerParts[headerParts.length - 1].trim(),
4180
+ decodeResult
4181
+ );
3576
4182
  for (let i = 1; i < lines.length; i++) {
3577
4183
  const line = lines[i];
3578
4184
  const parts = line.split("/");
@@ -3660,10 +4266,16 @@ var Label_80 = class extends DecoderPlugin {
3660
4266
  case "FB":
3661
4267
  break;
3662
4268
  case "FOB":
3663
- ResultFormatter.currentFuel(results, parseInt(val.replace(/\D/g, ""), 10));
4269
+ ResultFormatter.currentFuel(
4270
+ results,
4271
+ parseInt(val.replace(/\D/g, ""), 10)
4272
+ );
3664
4273
  break;
3665
4274
  case "UTC":
3666
- ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(val));
4275
+ ResultFormatter.time_of_day(
4276
+ results,
4277
+ DateTimeUtils.convertHHMMSSToTod(val)
4278
+ );
3667
4279
  break;
3668
4280
  case "ETA":
3669
4281
  const hhmm = val.split(".")[0].replace(":", "");
@@ -3692,11 +4304,20 @@ var Label_80 = class extends DecoderPlugin {
3692
4304
  const header = csvParts[0].trim().split(/\s+/);
3693
4305
  ResultFormatter.unknown(results, header[0], " ");
3694
4306
  ResultFormatter.unknown(results, header[1], " ");
3695
- ResultFormatter.position(results, CoordinateUtils.decodeStringCoordinates(header[2]));
4307
+ ResultFormatter.position(
4308
+ results,
4309
+ CoordinateUtils.decodeStringCoordinates(header[2])
4310
+ );
3696
4311
  ResultFormatter.unknown(results, csvParts[1]);
3697
- ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(csvParts[2]));
4312
+ ResultFormatter.time_of_day(
4313
+ results,
4314
+ DateTimeUtils.convertHHMMSSToTod(csvParts[2])
4315
+ );
3698
4316
  ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ",");
3699
- ResultFormatter.temperature(results, ((csvParts[6].charAt(0) === "M" ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString());
4317
+ ResultFormatter.temperature(
4318
+ results,
4319
+ ((csvParts[6].charAt(0) === "M" ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString()
4320
+ );
3700
4321
  ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));
3701
4322
  ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));
3702
4323
  }
@@ -3715,12 +4336,8 @@ var Label_83 = class extends DecoderPlugin {
3715
4336
  decodeResult.decoder.name = this.name;
3716
4337
  decodeResult.message = message;
3717
4338
  decodeResult.formatted.description = "Airline Defined";
3718
- let text = message.text;
3719
- if (text.match(/^M\d{2}A\w{6}/)) {
3720
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
3721
- text = text.substring(10);
3722
- }
3723
4339
  decodeResult.decoded = true;
4340
+ const text = message.text;
3724
4341
  if (text.substring(0, 10) === "4DH3 ETAT2") {
3725
4342
  const fields = text.split(/\s+/);
3726
4343
  if (fields[2].length > 5) {
@@ -3731,10 +4348,15 @@ var Label_83 = class extends DecoderPlugin {
3731
4348
  ResultFormatter.departureAirport(decodeResult, subfields[0]);
3732
4349
  ResultFormatter.arrivalAirport(decodeResult, subfields[1]);
3733
4350
  ResultFormatter.tail(decodeResult, fields[4].replace(/\./g, ""));
3734
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[6] + "00"));
4351
+ ResultFormatter.eta(
4352
+ decodeResult,
4353
+ DateTimeUtils.convertHHMMSSToTod(fields[6] + "00")
4354
+ );
3735
4355
  } else if (text.substring(0, 5) === "001PR") {
3736
4356
  decodeResult.raw.day = text.substring(5, 7);
3737
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\./g, ""));
4357
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
4358
+ text.substring(13, 28).replace(/\./g, "")
4359
+ );
3738
4360
  if (position) {
3739
4361
  ResultFormatter.position(decodeResult, position);
3740
4362
  }
@@ -3747,27 +4369,23 @@ var Label_83 = class extends DecoderPlugin {
3747
4369
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
3748
4370
  decodeResult.raw.day = fields[2].substring(0, 2);
3749
4371
  decodeResult.raw.time = fields[2].substring(2);
3750
- ResultFormatter.position(
3751
- decodeResult,
3752
- {
3753
- latitude: Number(fields[3].replace(/\s/g, "")),
3754
- longitude: Number(fields[4].replace(/\s/g, ""))
3755
- }
3756
- );
4372
+ ResultFormatter.position(decodeResult, {
4373
+ latitude: Number(fields[3].replace(/\s/g, "")),
4374
+ longitude: Number(fields[4].replace(/\s/g, ""))
4375
+ });
3757
4376
  ResultFormatter.altitude(decodeResult, Number(fields[5]));
3758
4377
  ResultFormatter.groundspeed(decodeResult, Number(fields[6]));
3759
4378
  ResultFormatter.heading(decodeResult, Number(fields[7]));
3760
4379
  ResultFormatter.unknown(decodeResult, fields[8]);
3761
4380
  } else {
3762
4381
  decodeResult.decoded = false;
3763
- ResultFormatter.unknown(decodeResult, message.text);
4382
+ ResultFormatter.unknown(decodeResult, text);
3764
4383
  }
3765
4384
  }
3766
4385
  if (decodeResult.decoded) {
3767
4386
  if (!decodeResult.remaining.text)
3768
4387
  decodeResult.decoder.decodeLevel = "full";
3769
- else
3770
- decodeResult.decoder.decodeLevel = "partial";
4388
+ else decodeResult.decoder.decodeLevel = "partial";
3771
4389
  } else {
3772
4390
  decodeResult.decoder.decodeLevel = "none";
3773
4391
  }
@@ -3792,10 +4410,13 @@ var Label_8E = class extends DecoderPlugin {
3792
4410
  const results = message.text.match(regex);
3793
4411
  if (results?.groups) {
3794
4412
  if (options.debug) {
3795
- console.log(`Label 8E ETA: groups`);
4413
+ console.log("Label 8E ETA: groups");
3796
4414
  console.log(results.groups);
3797
4415
  }
3798
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta));
4416
+ ResultFormatter.eta(
4417
+ decodeResult,
4418
+ DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta)
4419
+ );
3799
4420
  ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
3800
4421
  }
3801
4422
  decodeResult.decoded = true;
@@ -3865,11 +4486,26 @@ var Label_H1 = class extends DecoderPlugin {
3865
4486
  const msg = message.text.replace(/\n|\r/g, "");
3866
4487
  const parts = msg.split("#");
3867
4488
  let decoded = false;
3868
- if (parts.length === 1) {
4489
+ if (msg.startsWith("/")) {
4490
+ const headerData = msg.split(".");
4491
+ const decoded2 = H1Helper.decodeH1Message(
4492
+ decodeResult,
4493
+ headerData.slice(1).join(".")
4494
+ );
4495
+ if (decoded2) {
4496
+ decodeResult.remaining.text = headerData[0] + "." + decodeResult.remaining.text;
4497
+ decodeResult.decoded = decoded2;
4498
+ decodeResult.decoder.decodeLevel = "partial";
4499
+ }
4500
+ return decodeResult;
4501
+ } else if (parts.length === 1) {
3869
4502
  decoded = H1Helper.decodeH1Message(decodeResult, msg);
3870
4503
  } else if (parts.length == 2) {
3871
4504
  const offset = isNaN(parseInt(parts[1][1])) ? 3 : 4;
3872
- decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length + offset));
4505
+ decoded = H1Helper.decodeH1Message(
4506
+ decodeResult,
4507
+ msg.slice(parts[0].length + offset)
4508
+ );
3873
4509
  if (decoded && parts[0].length > 0) {
3874
4510
  ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));
3875
4511
  decodeResult.remaining.text = parts[0].substring(0, 4) + "#" + parts[1].substring(0, offset - 1) + "/" + decodeResult.remaining.text;
@@ -4003,7 +4639,10 @@ var Label_H1_FLR = class extends DecoderPlugin {
4003
4639
  const datetime = data.substring(0, 12);
4004
4640
  const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
4005
4641
  ResultFormatter.unknown(decodeResult, data.substring(12), "/");
4006
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);
4642
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
4643
+ datetime.substring(6),
4644
+ date
4645
+ );
4007
4646
  decodeResult.raw.fault_message = msg;
4008
4647
  decodeResult.formatted.items.push({
4009
4648
  type: "fault",
@@ -4083,65 +4722,6 @@ var Label_H1_OHMA = class extends DecoderPlugin {
4083
4722
  }
4084
4723
  };
4085
4724
 
4086
- // lib/plugins/Label_H1_Slash.ts
4087
- var Label_H1_Slash = class extends DecoderPlugin {
4088
- name = "label-h1-slash";
4089
- qualifiers() {
4090
- return {
4091
- labels: ["H1"],
4092
- preambles: ["/"]
4093
- };
4094
- }
4095
- decode(message, options = {}) {
4096
- let decodeResult = this.defaultResult();
4097
- decodeResult.decoder.name = this.name;
4098
- decodeResult.formatted.description = "Position Report";
4099
- decodeResult.message = message;
4100
- const checksum = message.text.slice(-4);
4101
- const data = message.text.slice(0, message.text.length - 4);
4102
- const fields = data.split("/");
4103
- if (fields[0] !== "") {
4104
- ResultFormatter.unknown(decodeResult, message.text);
4105
- decodeResult.decoded = false;
4106
- decodeResult.decoder.decodeLevel = "none";
4107
- return decodeResult;
4108
- }
4109
- const headerData = fields[1].split(".");
4110
- ResultFormatter.unknown(decodeResult, headerData[0]);
4111
- if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
4112
- H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
4113
- } else if (headerData[1] === "POS") {
4114
- } else if (headerData[1].startsWith("POS")) {
4115
- H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
4116
- } else {
4117
- ResultFormatter.unknown(decodeResult, headerData[1], ".");
4118
- }
4119
- for (let i = 2; i < fields.length; i++) {
4120
- const field = fields[i];
4121
- if (field.startsWith("TS")) {
4122
- H1Helper.processTimeStamp(decodeResult, field.substring(2, 15).split(","));
4123
- } else if (field.startsWith("PS")) {
4124
- H1Helper.processPS(decodeResult, field.substring(2).split(","));
4125
- } else {
4126
- ResultFormatter.unknown(decodeResult, field, "/");
4127
- }
4128
- }
4129
- if (decodeResult.formatted.items.length === 0) {
4130
- if (options.debug) {
4131
- console.log(`Decoder: Unknown H1 message: ${message.text}`);
4132
- }
4133
- ResultFormatter.unknown(decodeResult, message.text);
4134
- decodeResult.decoded = false;
4135
- decodeResult.decoder.decodeLevel = "none";
4136
- return decodeResult;
4137
- }
4138
- ResultFormatter.checksum(decodeResult, checksum);
4139
- decodeResult.decoded = true;
4140
- decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
4141
- return decodeResult;
4142
- }
4143
- };
4144
-
4145
4725
  // lib/plugins/Label_H1_StarPOS.ts
4146
4726
  var Label_H1_StarPOS = class extends DecoderPlugin {
4147
4727
  name = "label-h1-star-pos";
@@ -4168,7 +4748,10 @@ var Label_H1_StarPOS = class extends DecoderPlugin {
4168
4748
  }
4169
4749
  ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));
4170
4750
  ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));
4171
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)));
4751
+ ResultFormatter.time_of_day(
4752
+ decodeResult,
4753
+ DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12))
4754
+ );
4172
4755
  ResultFormatter.position(decodeResult, {
4173
4756
  // Deg Min, no sec
4174
4757
  latitude: CoordinateUtils.getDirection(msg.substring(12, 13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),
@@ -4205,7 +4788,10 @@ var Label_H1_WRN = class extends DecoderPlugin {
4205
4788
  const datetime = data.substring(0, 12);
4206
4789
  const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
4207
4790
  ResultFormatter.unknown(decodeResult, data.substring(12), "/");
4208
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);
4791
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
4792
+ datetime.substring(6),
4793
+ date
4794
+ );
4209
4795
  decodeResult.raw.warning_message = msg;
4210
4796
  decodeResult.formatted.items.push({
4211
4797
  type: "warning",
@@ -4265,8 +4851,7 @@ var Label_HX = class extends DecoderPlugin {
4265
4851
  if (decodeResult.decoded) {
4266
4852
  if (!decodeResult.remaining.text)
4267
4853
  decodeResult.decoder.decodeLevel = "full";
4268
- else
4269
- decodeResult.decoder.decodeLevel = "partial";
4854
+ else decodeResult.decoder.decodeLevel = "partial";
4270
4855
  } else {
4271
4856
  decodeResult.decoder.decodeLevel = "none";
4272
4857
  }
@@ -4398,10 +4983,16 @@ var MIAMCoreUtils = class {
4398
4983
  }
4399
4984
  },
4400
4985
  ["F" /* FileTransferRequest */]: () => {
4401
- return { decoded: false, error: "File Transfer Request not implemented" };
4986
+ return {
4987
+ decoded: false,
4988
+ error: "File Transfer Request not implemented"
4989
+ };
4402
4990
  },
4403
4991
  ["K" /* FileTransferAccept */]: () => {
4404
- return { decoded: false, error: "File Transfer Accept not implemented" };
4992
+ return {
4993
+ decoded: false,
4994
+ error: "File Transfer Accept not implemented"
4995
+ };
4405
4996
  },
4406
4997
  ["S" /* FileSegment */]: () => {
4407
4998
  return { decoded: false, error: "File Segment not implemented" };
@@ -4983,7 +5574,9 @@ var MIAMCoreUtils = class {
4983
5574
  const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
4984
5575
  if (pduSize > msgSize) {
4985
5576
  pduIsComplete = false;
4986
- pduErrors.push("v1 PDU truncated: expecting " + pduSize + ", got " + msgSize);
5577
+ pduErrors.push(
5578
+ "v1 PDU truncated: expecting " + pduSize + ", got " + msgSize
5579
+ );
4987
5580
  }
4988
5581
  hdr = hdr.subarray(4);
4989
5582
  tail = hdr.subarray(0, 7).toString("ascii");
@@ -5031,7 +5624,9 @@ var MIAMCoreUtils = class {
5031
5624
  }
5032
5625
  hdr = hdr.subarray(crcLen);
5033
5626
  if (body !== void 0 && body.length > 0) {
5034
- if ([1 /* Deflate */, 1 /* Deflate */].indexOf(pduCompression) >= 0) {
5627
+ if ([1 /* Deflate */, 1 /* Deflate */].indexOf(
5628
+ pduCompression
5629
+ ) >= 0) {
5035
5630
  try {
5036
5631
  const decompress = new zlib2.InflateRaw({});
5037
5632
  decompress.write(body);
@@ -5040,10 +5635,14 @@ var MIAMCoreUtils = class {
5040
5635
  } catch (e) {
5041
5636
  pduErrors.push("Inflation failed for body: " + e);
5042
5637
  }
5043
- } else if ([0 /* None */, 0 /* None */].indexOf(pduCompression) >= 0) {
5638
+ } else if ([0 /* None */, 0 /* None */].indexOf(
5639
+ pduCompression
5640
+ ) >= 0) {
5044
5641
  pduData = body;
5045
5642
  } else {
5046
- pduErrors.push("Unsupported v" + version + " compression type: " + pduCompression);
5643
+ pduErrors.push(
5644
+ "Unsupported v" + version + " compression type: " + pduCompression
5645
+ );
5047
5646
  }
5048
5647
  if (pduData !== null) {
5049
5648
  const crcAlgoHandlerByVersion = {
@@ -5063,7 +5662,9 @@ var MIAMCoreUtils = class {
5063
5662
  if (crcCheck === pduCrc) {
5064
5663
  pduCrcIsOk = true;
5065
5664
  } else {
5066
- pduErrors.push("Body failed CRC check: provided=" + pduCrc + ", generated=" + crcCheck);
5665
+ pduErrors.push(
5666
+ "Body failed CRC check: provided=" + pduCrc + ", generated=" + crcCheck
5667
+ );
5067
5668
  }
5068
5669
  }
5069
5670
  } else {
@@ -5106,7 +5707,13 @@ var MIAMCoreUtils = class {
5106
5707
  static VersionPduHandlerTable = {
5107
5708
  [1 /* V1 */]: {
5108
5709
  [0 /* Data */]: (hdr, body) => {
5109
- return this.corePduDataHandler(1 /* V1 */, 20, MIAMCoreV1CRCLength, hdr, body);
5710
+ return this.corePduDataHandler(
5711
+ 1 /* V1 */,
5712
+ 20,
5713
+ MIAMCoreV1CRCLength,
5714
+ hdr,
5715
+ body
5716
+ );
5110
5717
  },
5111
5718
  [1 /* Ack */]: () => {
5112
5719
  return { decoded: false, error: "v1 Ack PDU not implemented" };
@@ -5120,7 +5727,13 @@ var MIAMCoreUtils = class {
5120
5727
  },
5121
5728
  [2 /* V2 */]: {
5122
5729
  [0 /* Data */]: (hdr, body) => {
5123
- return this.corePduDataHandler(2 /* V2 */, 7, MIAMCoreV2CRCLength, hdr, body);
5730
+ return this.corePduDataHandler(
5731
+ 2 /* V2 */,
5732
+ 7,
5733
+ MIAMCoreV2CRCLength,
5734
+ hdr,
5735
+ body
5736
+ );
5124
5737
  },
5125
5738
  [1 /* Ack */]: () => {
5126
5739
  return { decoded: false, error: "v2 Ack PDU not implemented" };
@@ -5152,28 +5765,39 @@ var Label_MA = class extends DecoderPlugin {
5152
5765
  decodeResult.decoded = true;
5153
5766
  ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
5154
5767
  if (miamResult.message.data.acars.sublabel) {
5155
- ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);
5768
+ ResultFormatter.sublabel(
5769
+ decodeResult,
5770
+ miamResult.message.data.acars.sublabel
5771
+ );
5156
5772
  }
5157
5773
  if (miamResult.message.data.acars.tail) {
5158
- ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);
5774
+ ResultFormatter.tail(
5775
+ decodeResult,
5776
+ miamResult.message.data.acars.tail.replace(".", "")
5777
+ );
5159
5778
  }
5160
5779
  const messageText = miamResult.message.data.acars.text;
5161
5780
  if (miamResult.message.data.crcOk && miamResult.message.data.complete && messageText) {
5162
5781
  decodeResult.decoder.decodeLevel = "full";
5163
- const decoded = this.decoder.decode({
5164
- label: miamResult.message.data.acars.label,
5165
- sublabel: miamResult.message.data.acars.sublabel,
5166
- text: messageText
5167
- }, options);
5782
+ const decoded = this.decoder.decode(
5783
+ {
5784
+ label: miamResult.message.data.acars.label,
5785
+ sublabel: miamResult.message.data.acars.sublabel,
5786
+ text: messageText
5787
+ },
5788
+ options
5789
+ );
5168
5790
  if (decoded.decoded) {
5169
5791
  decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
5170
5792
  decodeResult.formatted.items.push(...decoded.formatted.items);
5793
+ decodeResult.remaining = decoded.remaining;
5171
5794
  } else {
5172
5795
  ResultFormatter.text(decodeResult, messageText);
5796
+ decodeResult.remaining = { text: messageText };
5173
5797
  }
5174
5798
  } else if (messageText) {
5175
5799
  decodeResult.decoder.decodeLevel = "partial";
5176
- ResultFormatter.text(decodeResult, messageText);
5800
+ decodeResult.remaining = { text: messageText };
5177
5801
  } else {
5178
5802
  decodeResult.decoder.decodeLevel = "partial";
5179
5803
  }
@@ -5301,15 +5925,19 @@ var Label_QR = class extends DecoderPlugin {
5301
5925
  const decodeResult = this.defaultResult();
5302
5926
  decodeResult.decoder.name = this.name;
5303
5927
  decodeResult.formatted.description = "ON Report";
5304
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5928
+ ResultFormatter.departureAirport(
5929
+ decodeResult,
5930
+ message.text.substring(0, 4)
5931
+ );
5305
5932
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5306
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5933
+ ResultFormatter.on(
5934
+ decodeResult,
5935
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
5936
+ );
5307
5937
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5308
5938
  decodeResult.decoded = true;
5309
- if (!decodeResult.remaining.text)
5310
- decodeResult.decoder.decodeLevel = "full";
5311
- else
5312
- decodeResult.decoder.decodeLevel = "partial";
5939
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
5940
+ else decodeResult.decoder.decodeLevel = "partial";
5313
5941
  return decodeResult;
5314
5942
  }
5315
5943
  };
@@ -5326,15 +5954,19 @@ var Label_QP = class extends DecoderPlugin {
5326
5954
  const decodeResult = this.defaultResult();
5327
5955
  decodeResult.decoder.name = this.name;
5328
5956
  decodeResult.formatted.description = "OUT Report";
5329
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5957
+ ResultFormatter.departureAirport(
5958
+ decodeResult,
5959
+ message.text.substring(0, 4)
5960
+ );
5330
5961
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5331
- ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5962
+ ResultFormatter.out(
5963
+ decodeResult,
5964
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
5965
+ );
5332
5966
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5333
5967
  decodeResult.decoded = true;
5334
- if (!decodeResult.remaining.text)
5335
- decodeResult.decoder.decodeLevel = "full";
5336
- else
5337
- decodeResult.decoder.decodeLevel = "partial";
5968
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
5969
+ else decodeResult.decoder.decodeLevel = "partial";
5338
5970
  return decodeResult;
5339
5971
  }
5340
5972
  };
@@ -5351,15 +5983,19 @@ var Label_QS = class extends DecoderPlugin {
5351
5983
  const decodeResult = this.defaultResult();
5352
5984
  decodeResult.decoder.name = this.name;
5353
5985
  decodeResult.formatted.description = "IN Report";
5354
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5986
+ ResultFormatter.departureAirport(
5987
+ decodeResult,
5988
+ message.text.substring(0, 4)
5989
+ );
5355
5990
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5356
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5991
+ ResultFormatter.in(
5992
+ decodeResult,
5993
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
5994
+ );
5357
5995
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5358
5996
  decodeResult.decoded = true;
5359
- if (!decodeResult.remaining.text)
5360
- decodeResult.decoder.decodeLevel = "full";
5361
- else
5362
- decodeResult.decoder.decodeLevel = "partial";
5997
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
5998
+ else decodeResult.decoder.decodeLevel = "partial";
5363
5999
  return decodeResult;
5364
6000
  }
5365
6001
  };
@@ -5377,11 +6013,17 @@ var Label_QQ = class extends DecoderPlugin {
5377
6013
  decodeResult.decoder.name = this.name;
5378
6014
  decodeResult.message = message;
5379
6015
  decodeResult.formatted.description = "OFF Report";
5380
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
6016
+ ResultFormatter.departureAirport(
6017
+ decodeResult,
6018
+ message.text.substring(0, 4)
6019
+ );
5381
6020
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5382
6021
  if (message.text.substring(12, 19) === "\r\n001FE") {
5383
6022
  decodeResult.raw.day = message.text.substring(19, 21);
5384
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
6023
+ ResultFormatter.off(
6024
+ decodeResult,
6025
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27))
6026
+ );
5385
6027
  let latdir = message.text.substring(27, 28);
5386
6028
  let latdeg = Number(message.text.substring(28, 30));
5387
6029
  let latmin = Number(message.text.substring(30, 34));
@@ -5395,20 +6037,24 @@ var Label_QQ = class extends DecoderPlugin {
5395
6037
  ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
5396
6038
  ResultFormatter.position(decodeResult, pos);
5397
6039
  if (decodeResult.remaining.text !== "---") {
5398
- ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
6040
+ ResultFormatter.groundspeed(
6041
+ decodeResult,
6042
+ Number(message.text.substring(45, 48))
6043
+ );
5399
6044
  } else {
5400
6045
  ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
5401
6046
  }
5402
6047
  ResultFormatter.unknown(decodeResult, message.text.substring(48));
5403
6048
  } else {
5404
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
6049
+ ResultFormatter.off(
6050
+ decodeResult,
6051
+ DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00")
6052
+ );
5405
6053
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
5406
6054
  }
5407
6055
  decodeResult.decoded = true;
5408
- if (!decodeResult.remaining.text)
5409
- decodeResult.decoder.decodeLevel = "full";
5410
- else
5411
- decodeResult.decoder.decodeLevel = "partial";
6056
+ if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
6057
+ else decodeResult.decoder.decodeLevel = "partial";
5412
6058
  return decodeResult;
5413
6059
  }
5414
6060
  };
@@ -5422,6 +6068,7 @@ var MessageDecoder = class {
5422
6068
  this.name = "acars-decoder-typescript";
5423
6069
  this.plugins = [];
5424
6070
  this.debug = false;
6071
+ this.registerPlugin(new CBand(this));
5425
6072
  this.registerPlugin(new Label_ColonComma(this));
5426
6073
  this.registerPlugin(new Label_5Z_Slash(this));
5427
6074
  this.registerPlugin(new Label_10_LDR(this));
@@ -5472,7 +6119,6 @@ var MessageDecoder = class {
5472
6119
  this.registerPlugin(new Label_H1_OHMA(this));
5473
6120
  this.registerPlugin(new Label_H1_WRN(this));
5474
6121
  this.registerPlugin(new Label_H1(this));
5475
- this.registerPlugin(new Label_H1_Slash(this));
5476
6122
  this.registerPlugin(new Label_H1_StarPOS(this));
5477
6123
  this.registerPlugin(new Label_HX(this));
5478
6124
  this.registerPlugin(new Label_58(this));
@@ -5488,14 +6134,13 @@ var MessageDecoder = class {
5488
6134
  this.registerPlugin(new Label_QS(this));
5489
6135
  }
5490
6136
  registerPlugin(plugin) {
5491
- const pluginInstance = plugin;
5492
6137
  this.plugins.push(plugin);
5493
6138
  return true;
5494
6139
  }
5495
6140
  decode(message, options = {}) {
5496
6141
  const usablePlugins = this.plugins.filter((plugin) => {
5497
6142
  const qualifiers = plugin.qualifiers();
5498
- if (qualifiers.labels.includes(message.label)) {
6143
+ if (qualifiers.labels.includes(message.label) || qualifiers.labels.length === 1 && qualifiers.labels[0] === "*") {
5499
6144
  if (qualifiers.preambles && qualifiers.preambles.length > 0) {
5500
6145
  const matching = qualifiers.preambles.filter((preamble) => {
5501
6146
  return message.text.substring(0, preamble.length) === preamble;