@airframes/acars-decoder 1.8.2 → 1.8.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/IcaoDecoder.ts","../lib/DateTimeUtils.ts","../lib/DecoderPlugin.ts","../lib/utils/coordinate_utils.ts","../lib/utils/route_utils.ts","../lib/utils/result_formatter.ts","../lib/plugins/Label_5Z_Slash.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_12_POS.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_Honeywell.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_16_POSA1.ts","../lib/plugins/Label_16_TOD.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/h1_helper.ts","../lib/plugins/Label_1J_2J_FTX.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_1L_3-line.ts","../lib/plugins/Label_1L_070.ts","../lib/plugins/Label_1L_660.ts","../lib/plugins/Label_1L_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.ts","../lib/plugins/Label_22_OFF.ts","../lib/plugins/Label_22_POS.ts","../lib/plugins/Label_2P_FM3.ts","../lib/plugins/Label_2P_FM4.ts","../lib/plugins/Label_2P_FM5.ts","../lib/plugins/Label_2P_POS.ts","../lib/plugins/Label_24_Slash.ts","../lib/plugins/Label_30_Slash_EA.ts","../lib/plugins/Label_44_ETA.ts","../lib/plugins/Label_44_IN.ts","../lib/plugins/Label_44_OFF.ts","../lib/plugins/Label_44_ON.ts","../lib/plugins/Label_44_POS.ts","../lib/plugins/Label_44_Slash.ts","../lib/plugins/Label_4A.ts","../lib/plugins/Label_4A_01.ts","../lib/plugins/Label_4A_DIS.ts","../lib/plugins/Label_4A_DOOR.ts","../lib/plugins/Label_4A_Slash_01.ts","../lib/plugins/Label_4J_POS.ts","../lib/plugins/Label_4N.ts","../lib/plugins/Label_4T_AGFSR.ts","../lib/plugins/Label_58.ts","../lib/plugins/Label_4T_ETA.ts","../lib/plugins/Label_80.ts","../lib/plugins/Label_83.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H1.ts","../lib/plugins/Label_H2_02E.ts","../lib/plugins/Label_H1_FLR.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/plugins/Label_H1_Slash.ts","../lib/plugins/Label_H1_StarPOS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.ts","../lib/plugins/Label_SQ.ts","../lib/plugins/Label_QR.ts","../lib/plugins/Label_QP.ts","../lib/plugins/Label_QS.ts","../lib/plugins/Label_QQ.ts","../lib/utils/miam.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export class IcaoDecoder {\n name : string;\n icao : string;\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary() {\n let i = this.icao;\n return (\n false\n // us military\n //adf7c8-adf7cf = united states mil_5(uf)\n //adf7d0-adf7df = united states mil_4(uf)\n //adf7e0-adf7ff = united states mil_3(uf)\n //adf800-adffff = united states mil_2(uf)\n || i.match(/^adf[7-9]/)\n || i.match(/^adf[a-f]/)\n //ae0000-afffff = united states mil_1(uf)\n || i.match(/^a(e|f)/)\n\n //010070-01008f = egypt_mil\n || i.match(/^0100(7|8)/)\n\n //0a4000-0a4fff = algeria mil(ap)\n || i.match(/^0a4/)\n\n //33ff00-33ffff = italy mil(iy)\n || i.match(/^33ff/)\n\n //350000-37ffff = spain mil(sp)\n || (i >= '350000' && i <= '37ffff')\n\n //3a8000-3affff = france mil_1(fs)\n || i.match(/^3a(8|9|[a-f])/)\n //3b0000-3bffff = france mil_2(fs)\n || i.match(/^3b/)\n\n //3e8000-3ebfff = germany mil_1(df)\n // remove 8 and 9 from mil arnge\n || i.match(/^3e(a|b)/)\n //3f4000-3f7fff = germany mil_2(df)\n //3f8000-3fbfff = germany mil_3(df)\n || i.match(/^3f([4-9]|[a-b])/)\n\n //400000-40003f = united kingdom mil_1(ra)\n || i.match(/^4000[0-3]/)\n //43c000-43cfff = united kingdom mil(ra)\n || i.match(/^43c/)\n\n //444000-447fff = austria mil(aq)\n || (i.match(/^44[4-7]/) && i != '447ac7')\n\n //44f000-44ffff = belgium mil(bc)\n || i.match(/^44f/)\n\n //457000-457fff = bulgaria mil(bu)\n || i.match(/^457/)\n\n //45f400-45f4ff = denmark mil(dg)\n || i.match(/^45f4/)\n\n //468000-4683ff = greece mil(gc)\n || i.match(/^468[0-3]/)\n\n //473c00-473c0f = hungary mil(hm)\n || i.match(/^473c0/)\n\n //478100-4781ff = norway mil(nn)\n || i.match(/^4781/)\n //480000-480fff = netherlands mil(nm)\n || i.match(/^480/)\n //48d800-48d87f = poland mil(po)\n || i.match(/^48d8[0-7]/)\n //497c00-497cff = portugal mil(pu)\n || i.match(/^497c/)\n //498420-49842f = czech republic mil(ct)\n || i.match(/^49842/)\n\n //4b7000-4b7fff = switzerland mil(su)\n || i.match(/^4b7/)\n //4b8200-4b82ff = turkey mil(tq)\n || i.match(/^4b82/)\n\n //506f00-506fff = slovenia mil(sj)\n || i.match(/^506f/)\n\n //70c070-70c07f = oman mil(on)\n || i.match(/^70c07/)\n\n //710258-71025f = saudi arabia mil_1(sx)\n //710260-71027f = saudi arabia mil_2(sx)\n //710280-71028f = saudi arabia mil_3(sx)\n //710380-71039f = saudi arabia mil_4(sx)\n || i.match(/^7102[5-8]/)\n || i.match(/^7103[8-9]/)\n\n //738a00-738aff = israel mil(iz)\n || i.match(/^738a/)\n\n //7c822e-7c822f = australia mil_1(av)\n //7c8230-7c823f = australia mil_2(av)\n //7c8240-7c827f = australia mil_3(av)\n //7c8280-7c82ff = australia mil_4(av)\n //7c8300-7c83ff = australia mil_5(av)\n //7c8400-7c87ff = australia mil_6(av)\n //7c8800-7c8fff = australia mil_7(av)\n || i.match(/^7c8([2-4]|8)/)\n //7c9000-7c9fff = australia mil_8(av)\n //7ca000-7cbfff = australia mil_9(av)\n || (i >= '7c9000' && i <= '7cbfff')\n //7cc000-7cffff = australia mil_10(av) 7cc409 not mil, remove this range\n //7d0000-7dffff = australia mil_11(av)\n //7e0000-7fffff = australia mil_12(av)\n || i.match(/^7[d-f]/)\n\n //800200-8002ff = india mil(im)\n || i.match(/^8002/)\n\n //c20000-c3ffff = canada mil(cb)\n || i.match(/^c[2-3]/)\n\n //e40000-e41fff = brazil mil(bq)\n || i.match(/^e4[0-1]/)\n\n //e80600-e806ff = chile mil(cq)\n || i.match(/^e806/)\n );\n }\n\n}\n\nexport default {\n};\n","export class DateTimeUtils {\n\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n let utcDate = new Date();\n utcDate.setUTCDate(+dateString.substr(0, 2));\n utcDate.setUTCMonth(+dateString.substr(2, 2));\n if (dateString.length === 6) {\n utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));\n }\n if (timeString.length === 6) {\n utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));\n } else {\n utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);\n }\n return utcDate.toUTCString();\n }\n\n /**\n * \n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if(time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = (h * 3600) + (m * 60) + s;\n return tod;\n }\n\n /**\n * \n * @param time HHMMSS\n * @param date MMDDYY or MMDDYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n 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`\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n * \n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time \n * @param format \n * @returns \n */\n public static timestampToString(time: number, format: 'tod' | 'epoch'): string {\n const date = new Date(time * 1000); if (format == 'tod') {\n return date.toISOString().slice(11, 19);\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + \"Z\";\n }\n}","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: any;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n };\n\n options: Object;\n\n constructor(decoder : any, options : Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id() : string { // eslint-disable-line class-methods-use-this\n console.log('DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!');\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements() : boolean { // eslint-disable-line class-methods-use-this\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers() : any { // eslint-disable-line class-methods-use-this\n const labels : Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message) : DecodeResult { // eslint-disable-line class-methods-use-this\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n\nexport default {};\n","export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n * \n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n var results : any = {};\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n results.latitude = (Number(stringCoords.substring(1, 6)) / 1000) * CoordinateUtils.getDirection(firstChar);\n results.longitude = (Number(longitudeChars) / 1000) * CoordinateUtils.getDirection(middleChar);\n } else {\n return;\n }\n\n return results;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n * \n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n var results : any = {};\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar ==' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n const latDeg = Math.trunc(Number(stringCoords.substring(1, 6)) / 1000);\n const latMin = (Number(stringCoords.substring(1, 6)) % 1000) / 10;\n const lonDeg = Math.trunc(Number(longitudeChars) / 1000);\n const lonMin = (Number(longitudeChars) % 1000) / 10;\n\n if ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n results.latitude = (latDeg + (latMin / 60)) * CoordinateUtils.getDirection(firstChar);\n results.longitude = (lonDeg + (lonMin / 60)) * CoordinateUtils.getDirection(middleChar);\n } else {\n return;\n }\n\n return results;\n }\n public static coordinateString(coords: {latitude: number, longitude: number}) : string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string):number {\n if(coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if(coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(degrees: number, minutes: number, seconds: number ) : number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { Route } from \"../types/route\";\nimport { Waypoint } from \"../types/waypoint\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\n\nexport class RouteUtils {\n\n public static formatFlightState(state: string): string {\n switch (state) {\n case \"TO\": return \"Takeoff\";\n case \"IC\": return \"Initial Climb\";\n case \"CL\": return \"Climb\";\n case \"ER\": return \"En Route\";\n case \"DC\": return \"Descent\";\n case \"AP\": return \"Approach\";\n default: return `Unknown ${state}`;\n }\n }\n \n public static routeToString(route: Route): string {\n let str = '';\n if(route.name) {\n str += route.name;\n }\n if(route.runway) {\n str += `(${route.runway})`;\n }\n if(str.length!==0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at '\n }\n else if(str.length!==0 && route.waypoints) {\n str += ': ';\n }\n\n if(route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n } \n \n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if(waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({latitude:waypoint.latitude, longitude: waypoint.longitude})})`;\n }\n if(waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if(waypoint.time && waypoint.timeFormat) {\n s +=`@${DateTimeUtils.timestampToString(waypoint.time, waypoint.timeFormat)}`;\n }\n return s;\n }\n \n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if(regex?.length == 4) {\n return {name: regex[1], offset: {bearing: parseInt(regex[2]), distance: parseInt(regex[3])/10}};\n }\n\n const waypoint = leg.split(',');\n if(waypoint.length ==2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(waypoint[1]);\n if(position) {\n return {name: waypoint[0], latitude: position.latitude, longitude: position.longitude};\n }\n }\n if(leg.length == 13 || leg.length == 14) { //looks like coordinates\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if(position) {\n return {name: name, latitude: position.latitude, longitude: position.longitude};\n }\n }\n return {name: leg};\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints.map((x) => RouteUtils.waypointToString(x)).join( ' > ').replaceAll('> >', '>>');\n if(str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { decode } from \"punycode\";\nimport { DecodeResult } from \"../DecoderPluginInterface\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\nimport { DateTimeUtils } from \"../DateTimeUtils\";\nimport { RouteUtils } from \"./route_utils\";\nimport { Route } from \"../types/route\";\nimport { Wind } from \"../types/wind\";\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n };\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static freetext(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.freetext = value;\n decodeResult.formatted.items.push({\n type: 'freetext',\n code: 'FREE_TEXT',\n label: 'Free Text',\n value: value,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(decodeResult: DecodeResult, value: { latitude: number, longitude: number } | undefined) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if(isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if(value.length === 0 ) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n };\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n };\n\n static departureAirport(decodeResult: DecodeResult, value: string, type: 'IATA' | 'ICAO' = 'ICAO') {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n };\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(decodeResult: DecodeResult, value: string, type: 'IATA' | 'ICAO' = 'ICAO') {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n };\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n };\n\n static eta(decodeResult: DecodeResult, time: number, type: 'tod' | 'epoch' = 'tod') {\n if (type === 'tod') {\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.eta_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n };\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n };\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n };\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n };\n\n\n static checksum(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum = Number(\"0x\" + value);\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value: '0x' + ('0000' + decodeResult.raw.checksum.toString(16)).slice(-4),\n });\n };\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if(value.length === 0 ) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(value.replace(\"M\", \"-\").replace(\"P\", \"+\"));\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: \"TAIL\",\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number, type: 'tod' | 'epoch' = 'tod') {\n if (type === 'tod') {\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.off_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static time_of_day(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.time_of_day = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'MSG_TOD',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for(const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text)\n decodeResult.remaining.text = value;\n else\n decodeResult.remaining.text += sep + value;\n };\n\n static unknownArr(decodeResult: DecodeResult, value: string[], sep: string = ',') {\n this.unknown(decodeResult, value.join(sep), sep);\n };\n\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['5Z'],\n preambles: ['/']\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') { // not UA, but starts with `/`\n ResultFormatter.text(decodeResult, lines.slice(1).join('\\r\\n'));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), 'IATA');\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), 'IATA');\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4]));\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]));\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text ? 'partial' : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-ldr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n }\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]].filter((r) => r != \"\").join(\",\");\n if (altRwy != \"\") {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [...parts.slice(0,5), ...parts.slice(15)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())/100,\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())/100,\n }\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [parts[0], ...parts.slice(3,7), ...parts.slice(8)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_10_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n }\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100*Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]));\n const waypoints: Waypoint[] = [{\n name: parts[11],\n },{\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n timeFormat: 'tod',\n },{\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n timeFormat: 'tod',\n },];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if(parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(decodeResult, [parts[3], parts[4], ...parts.slice(9,11), ...parts.slice(17)], '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"12\"],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex)\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 12 N : results`);\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n });\n\n const altitude = results.groups.alt == 'GRD' || results.groups.alt == '***' ? 0 : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2, results.groups.unkwn3]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),\n longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8))),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim())); // strip FOB\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim())); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_13Through18_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-13-18-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if ((labelNumber !== 18 && parts.length !== 4) || (labelNumber === 18 && parts.length !== 7)) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4])\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = { latitude: Number(location[0]), longitude: Number(location[1]) };\n } else {\n position = {\n 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))),\n 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))),\n }\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], \"\\r\\n\");\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text ? 'partial' : 'full';\n return decodeResult;\n }\n}\n\nexport default {};\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report'\n }\n if (labelNumber === 14) {\n return 'Takeoff Report'\n }\n if (labelNumber === 15) {\n return 'On Ground Report'\n }\n if (labelNumber === 16) {\n return 'In Gate Report'\n }\n if (labelNumber === 17) {\n return 'Post Report'\n }\n if (labelNumber === 18) {\n return 'Post Times Report'\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13)));\n if (between.length === 25) { // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(\" \", \"0\"));\n } else if(between.substring(13,16) === 'OFF') { // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if(ddmmyy != '------') {\n const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);\n ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm+'00', mmddyy), 'epoch');\n } else {\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), 'tod');\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 15 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13)\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar= stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n const lat = (Number(stringCoords.substring(1, 7)) / 10000) * (firstChar === 'S' ? -1 : 1);\n const lon = (Number(stringCoords.substring(8, 15)) / 10000) * (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, {latitude: lat, longitude: lon});\n ResultFormatter.altitude(decodeResult, Number(stringCoords.substring(15)) * 100);\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5,9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9,13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from \"../DecoderPlugin\";\nimport { DecodeResult, Message, Options } from \"../DecoderPluginInterface\";\nimport { CoordinateUtils } from \"../utils/coordinate_utils\";\nimport { ResultFormatter } from \"../utils/result_formatter\";\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = \"label-16-honeywell\";\n\n qualifiers() {\n // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: [\"(2\"],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = \"Position Report\";\n decodeResult.message = message;\n\n if (message.text.startsWith(\"(2\") && message.text.endsWith(\"(Z\") && message.text.length >= 29) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), \"\"); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === \"-\") {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n \"\",\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = \"partial\";\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n let pos = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude = results.groups.alt == 'GRD' || results.groups.alt == '***' ? 0 : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude)\n\n ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult\n }\n \n results = message.text.match(variant2Regex)\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n let pos = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n } \n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(5))); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3])*100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {waypoints: [\n {name: waypoint, time: time, timeFormat: 'tod'},\n {name: nextWaypoint, time: nextTime, timeFormat: 'tod'}\n ]});\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0])\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.time_of_day(decodeResult, time);\n if(fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude: CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n\n if(temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecodeResult } from \"../DecoderPluginInterface\";\nimport { ResultFormatter } from \"./result_formatter\";\nimport { RouteUtils } from \"./route_utils\";\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n * \n * Expected format is [header, key1, val1, ... keyN, valN]\n * \n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const key = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (key) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${key}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(decodeResult: DecodeResult, header: string): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n decodeResult.raw.route_status = header;\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false\n }\n return allKnownFields;\n };\n\n\npublic static addProcedure(decodeResult: DecodeResult, value: string, type: string) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: `procedure`,\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n};\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n};\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n};\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n};\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, { waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)) });\n};\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(')'));\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n};\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecodeResult } from \"../DecoderPluginInterface\";\nimport { Waypoint } from \"../types/waypoint\";\nimport { Wind } from \"../types/wind\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\nimport { FlightPlanUtils } from \"./flight_plan_utils\";\nimport { ResultFormatter } from \"./result_formatter\";\nimport { RouteUtils } from \"./route_utils\";\n\nexport class H1Helper {\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n const checksum = message.slice(-4);\n const data = message.slice(0, message.length - 4);\n\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n\n for (let i = 1; i < fields.length; ++i) {\n if (fields[i].startsWith('FN')) {\n decodeResult.raw.flight_number = fields[i].substring(2); // Strip off 'FN'\n } else if (fields[i].startsWith('SN')) {\n decodeResult.raw.serial_number = fields[i].substring(2); // Strip off 'SN'\n } else if (fields[i].startsWith('DC')) {\n processDC(decodeResult, fields[i].substring(2).split(',')); // Strip off 'DC'\n } else if (fields[i].startsWith('TS')) {\n H1Helper.processTS(decodeResult, fields[i].substring(2).split(',')); // Strip off PS\n } else if (fields[i].startsWith('PS')) {\n H1Helper.processPS(decodeResult, fields[i].substring(2).split(',')); // Strip off PS\n } else if (fields[i].startsWith('DT')) {\n const data = fields[i].substring(2).split(','); // Strip off DT\n processDT(decodeResult, data);\n } else if (fields[i].startsWith('ID')) {\n processIdentification(decodeResult, fields[i].substring(2).split(',')); // Strip off ID\n } else if (fields[i].startsWith('LR')) {\n const data = fields[i].substring(2).split(','); // Strip off LR\n processLR(decodeResult, data);\n } else if (fields[i].startsWith('RI') || fields[i].startsWith('RF') || fields[i].startsWith('RP')) {\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n } else if (fields[i].startsWith('PR')) {\n // process PR data\n // data[8] is temperature\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n } else if (fields[i].startsWith('AF')) {\n processAirField(decodeResult, fields[i].substring(2).split(',')); // Strip off AF\n } else if (fields[i].startsWith('TD')) {\n processTimeOfDeparture(decodeResult, fields[i].substring(2).split(',')); // Strip off TD\n } else if (fields[i].startsWith('FX')) {\n ResultFormatter.freetext(decodeResult, fields[i].substring(2));\n } else if (fields[i].startsWith('ET')) {\n if (fields[i].length === 7) { // 1 digit day\n ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 3)));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3)));\n } else if (fields[i].length === 8) { // 2 digit day\n ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 4)));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4)));\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n } else if (fields[i].startsWith('WD')) {\n processWindData(decodeResult, fields[i].substring(2)); // Strip off WD\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n if (decodeResult.formatted.items.length > 0) {\n ResultFormatter.checksum(decodeResult, checksum);\n }\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n }\n if (data.length === 9) { // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) { // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) { // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) { // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTS(decodeResult: DecodeResult, data: string[]) {\n let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);\n\n if (Number.isNaN(time)) { // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_date = data[1];\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.plannedDepartureTime = data[0]; //DDHHMM\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: \"ptd\",\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.plannedDepartureTime = data[1]; //HHMM\n decodeResult.formatted.items.push({\n type: 'etd',\n code: \"etd\",\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0])\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) { //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n } else if (decodeResult.raw.arrival_icao != data[0]) {\n ResultFormatter.unknownArr(decodeResult, data);\n } // else duplicate - don't do anything\n\n\n if (data.length > 1) {\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n }\n if (data.length > 2) {\n ResultFormatter.currentFuel(decodeResult, Number(data[2]));\n }\n if (data.length > 3) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[3]));\n }\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n if (data.length > 5) {//TODO: figure out what this is\n ResultFormatter.unknownArr(decodeResult, data);\n }\n};\n\nfunction processLR(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n};\n\n\nfunction parseMessageType(decodeResult: DecodeResult, messageType: string): boolean {\n const parts = messageType.split('#');\n if (parts.length == 1) {\n if (parts[0].startsWith('POS')) {\n H1Helper.processPosition(decodeResult, parts[0].substring(3).split(','));\n return processMessageType(decodeResult, 'POS');\n } else if(parts[0].length === 13) {\n if(processMessageType(decodeResult, parts[0].substring(10))) {\n ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, parts[0].slice(4, 10));\n return true;\n }\n }\n return processMessageType(decodeResult, parts[0].substring(0,3));\n } else if (parts.length == 2) {\n if (parts[0].length > 0) {\n ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));\n ResultFormatter.unknown(decodeResult, parts[1].length == 5 ? parts[1].substring(0, 2) : parts[1].substring(0, 3), '#');\n }\n // TODO - see if there's a better way to determine the type\n const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);\n if (parts[1].substring(3, 6) === 'POS' && parts[1].length > 6) {\n H1Helper.processPosition(decodeResult, parts[1].substring(6).split(','));\n }\n return processMessageType(decodeResult, type);\n }\n else {\n ResultFormatter.unknown(decodeResult, messageType);\n return false;\n }\n}\n\nfunction processMessageType(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Flight Plan Initial Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Weather Report';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processDC(decodeResult: DecodeResult, data: string[]) {\n decodeResult.raw.message_date = data[0]; // DDMMYYYY;\n\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date = data[0].substring(2, 4) + data[0].substring(0, 2) + data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processRoute(decodeResult: DecodeResult, last: string, time: string, next: string, eta: string, then?: string, date?: string) {\n const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);\n const timeFormat = date ? 'epoch' : 'tod';\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n lastWaypoint.timeFormat = timeFormat;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n nextWaypoint.timeFormat = timeFormat;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n decodeResult.raw.route = { waypoints: waypoints };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n}\n\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n const data = field.split(',');\n const waypoint = {name: data[0]};\n const windData = data[1];\n const windDirection = Number(windData.slice(0, 3));\n const windSpeed = Number(windData.slice(3));\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees = Number(tempString.substring(1)) * (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees\n },\n });\n\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1J_2J_FTX extends DecoderPlugin {\n name = 'label-1j-2j-ftx';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1J', '2J'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1J/2J message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"1M\"],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log(`Label 1M ETA: results`);\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(decodeResult, results[8].replace(results[4], \"\")); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertDateTimeToEpoch(results[7]+'00', yymmdd.substring(2,4)+yymmdd.substring(4,6)+yymmdd.substring(0,2)), 'epoch')\n \n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-3-line';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp = (Date.parse(day + ' GMT+0000') / 1000) + DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-070';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),\n longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1)),\n });\n\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-660';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(parts[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmmss));\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-1-line';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n }\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(utc));\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n // N38160W077075,,211733,360,OTT,212041,,N42,19689,40,544\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 1 detected`);\n }\n // Field 1: Coordinates\n const rawCoords = fields[0];\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(rawCoords));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else if (fields.length == 5) {\n // N38160W077075,,211733,360,OTT\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 2 detected`);\n }\n // Field 1: Coordinates\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.altitude( decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, \"\"));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[7]));\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], fields[4], fields[5]]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if(options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if(value.length !== 16 && value[0] !== 'N' && value[0] !== 'S' && value[8] !== 'W' && value[8] !== 'E') {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position ={\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n \n ResultFormatter.position(decodeResult, position);\n}\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Takeoff Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('OFF01')) { // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2))); // departure day\n ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2,4))); // arrival day\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)));\n ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12));\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16,22)));\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else if (message.text.startsWith('OFF02\\r\\n')) { // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else if (message.text.startsWith('OFF02')) { // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(fields[1].substring(0, 14));\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20) ));\n ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24));\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)));\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36,40)));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n\n } else {\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation.`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if(parts.length === 7){\n\n const header = parts[0].split('FM3 ');\n if(header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if(header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0,4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n console.log(header[1]);\n if(header[1].length === 4) {\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));\n } else {\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));\n }\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[1]));\n const lat = parts[2].replaceAll(' ','');\n const lon = parts[3].replaceAll(' ','');\n if(lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {latitude: Number(lat), longitude: Number(lon)});\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if(parts.length === 10){\n const header = parts[0].split('FM4');\n if(header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if(header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0,4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0,2)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));\n ResultFormatter.position(decodeResult, {latitude: Number(parts[4].replaceAll(' ','')), longitude: Number(parts[5].replaceAll(' ',''))});\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if(parts.length === 12){\n\n const header = parts[0].split('FM5 ');\n if(header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));\n ResultFormatter.position(decodeResult, {latitude: Number(parts[4].replaceAll(' ','')), longitude: Number(parts[5].replaceAll(' ',''))});\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_POS extends DecoderPlugin {\n name = 'label-2p-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') { // begin and ends with `/`\n const mmddyy = fields[1].substring(4,6) + fields[1].substring(2,4) + fields[1].substring(0,2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(hhmmss,mmddyy);\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if(options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"30\"],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log(`Label 30 EA: results`);\n console.log(results);\n }\n }\n\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));\n\n if (results[1].substring(0,2) === \"DS\") {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, \"/\".concat(results[2]));\n } else {\n ResultFormatter.unknown(decodeResult, \"/\".concat(results[1], \"/\", results[2]));\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 9) {\n if (options.debug) {\n console.log(`Label 44 ETA Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n\n ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(decodeResult, data.slice(9));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_IN extends DecoderPlugin {\n name = 'label-44-in';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'In Air Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log(`Label 44 In Air Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Off Runway Report\nexport class Label_44_OFF extends DecoderPlugin {\n name = 'label-44-off';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Off Runway Report';\n decodeResult.message = message;\n\n\n const data = message.text.split(',');\n if (data.length >= 8) {\n if (options.debug) {\n console.log(`Label 44 Off Runway Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));\n const fuel = Number(data[7]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 8) {\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// On Runway Report\nexport class Label_44_ON extends DecoderPlugin {\n name = 'label-44-on';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'On Runway Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log(`Label 44 On Runway Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,unknown\n const regex = /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 44 Position Report: groups`);\n console.log(results.groups);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));\n const flight_level = results.groups.flight_level_or_ground == 'GRD' || results.groups.flight_level_or_ground == '***' ? 0 : Number(results.groups.flight_level_or_ground);\n\n\n ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'));\n\n // TODO: ETA month and Day\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'));\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecoderPlugin } from \"../DecoderPlugin\";\nimport { DecodeResult, Message, Options } from \"../DecoderPluginInterface\";\nimport { FlightPlanUtils } from \"../utils/flight_plan_utils\";\nimport { ResultFormatter } from \"../utils/result_formatter\";\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = \"label-44-slash\";\n\n qualifiers() {\n // eslint-disable-line class-methods-use-this\n return {\n labels: [\"44\"],\n preambles: [\" /FB\"],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = \"Flight Briefing\";\n decodeResult.message = message;\n\n const fields = message.text.split(\"/\");\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), \"/\"); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(\",\");\n if (data.length >= 6) {\n if (options.debug) {\n console.log(`Label 44 Slash: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === \"S\" ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === \"W\" ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), \",\"); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), \",\");\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], \"arrival\");\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), \",\");\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = \"partial\";\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n\n // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n const fields = text.split(\",\");\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));\n ResultFormatter.tail(decodeResult, fields[2].replace(\".\", \"\"));\n if (fields[3])\n ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n const alt = text.substring(48, 51);\n if(alt !== '') {\n ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n if (fields[0].match(/^[NS]/)) {\n // variant 2\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n timeFormat: 'tod',\n };\n ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n timeFormat: 'tod',\n };\n ResultFormatter.route(decodeResult, {waypoints: [wp1, wp2]});\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4]+fields[5]).replace(/[ \\.]/g, \"\")));\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n 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)/);\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + \"00\"));\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, \"\")));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, \"\"));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(\",\");\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + \"00\"));\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.freetext(decodeResult, fields.slice(3).join(\"\"));\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(\" \");\n if (fields.length === 3) {\n ResultFormatter.door_event(decodeResult, fields[0].split(\"/\")[1], fields[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + \"00\"));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0,4) === \"/01-\") {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4J_POS extends DecoderPlugin {\n name = 'label-4j-pos';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4J'],\n preambles: ['POS/'],\n };\n }\n\n // copied from Label_H1.ts since i don't really want to have to have\n // something named like that decode more than 1 type\n // if we figure out a good name, i'll combine them\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n const fields = text.split(\",\");\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, \"$1\")));\n ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);\n ResultFormatter.unknownArr(decodeResult, [text.substring(2, 4), text.substring(19, 29)], \" \");\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === \"B\") {\n ResultFormatter.position(decodeResult, {latitude: Number(fields[4]), longitude: Number(fields[5])});\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split(\"/\")[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split(\"/\")[0]);\n }\n ResultFormatter.checksum(decodeResult, fields[32]);\n ResultFormatter.unknownArr(decodeResult, [...fields.slice(1,3), fields[7], ...fields.slice(13, 32)].filter((f) => f != \"\"));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if(!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(decodeResult, data[3].substring(0,3), 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0,4))); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0,7);\n const lon = data[6].substring(7,15);\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0,2)) + Number(lat.substring(2,6))/60,\n longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0,3)) + Number(lon.substring(3, 7))/60\n });\n ResultFormatter.altitude(decodeResult, 100* Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)), \n longitude:CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if(!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0,4)));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Defined Position Report';\n\n const lines = message.text.split(/\\r?\\n/);\n if(lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for(let i=0; i<headerParts.length-1; i++) {\n const moreFields = headerParts[i].split('/');\n for(const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(headerParts[headerParts.length-1].trim(), decodeResult);\n\n for(let i=1; i<lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text === undefined ? 'full' : 'partial';\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: any) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if(fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(/\\s+/);\n if(msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0,2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(/\\s+/);\n if(otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(/\\s+/);\n if(otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if(fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(/\\s+/)\n if(kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS':\n // don't use decodeStringCoordinates because of different position format\n const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = val.match(posRegex);\n const lat = Number(posResult?.groups?.lat) * (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon = Number(posResult?.groups?.lng) * (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(results, parseInt(val.replace(/\\D/g, ''), 10));\n break;\n case 'UTC':\n ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(val));\n break;\n case 'ETA':\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n const header = csvParts[0].trim().split(/\\s+/);\n ResultFormatter.unknown(results,header[0], ' ');\n ResultFormatter.unknown(results,header[1], ' ');\n ResultFormatter.position(results, CoordinateUtils.decodeStringCoordinates(header[2]));\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(csvParts[2]));\n ResultFormatter.unknownArr(results, csvParts.slice(4,6), ',');\n ResultFormatter.temperature(results, ((csvParts[6].charAt(0) === 'M' ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString());\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel( results, parseInt( csvParts[8], 10));\n }\n}","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n if (text.substring(0, 10) === \"4DH3 ETAT2\") {\n // variant 2\n const fields = text.split(/\\s+/);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split(\"/\");\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(/\\./g, \"\"));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[6] + \"00\"));\n } else if (text.substring(0, 5) === \"001PR\") {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\\./g, \"\"))\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(/\\s/g, \"\").split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0,2);\n decodeResult.raw.time = fields[2].substring(2);\n ResultFormatter.position(decodeResult,\n {\n latitude: Number(fields[3].replace(/\\s/g, \"\")),\n longitude: Number(fields[4].replace(/\\s/g, \"\")),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"8E\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 8E ETA: groups`);\n console.log(results.groups);\n }\n\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta));\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'CPDLC Message';\n decodeResult.message = message;\n\n if (options.debug) {\n console.log(\"CPDLC: \" + message);\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description = 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ'\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1 extends DecoderPlugin {\n name = 'label-h1';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecoderPlugin } from \"../DecoderPlugin\";\nimport { DecodeResult, Message, Options } from \"../DecoderPluginInterface\";\nimport { Wind } from \"../types/wind\";\nimport { CoordinateUtils } from \"../utils/coordinate_utils\";\nimport { ResultFormatter } from \"../utils/result_formatter\";\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = \"label-h2-02e\";\n\n qualifiers() {\n // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H2\"],\n preambles: [\"02E\"],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = \"Weather Report\";\n decodeResult.message = message;\n\n const parts = message.text.split(\" \");\n\n if (parts[parts.length - 1] !== \"Q\") {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = \"\";\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? \" \" : \"\") + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== \"Q\") {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? \" \" : \"\") + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? \" \" : \"\") + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? \"full\" : \"partial\";\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === \"M\" ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== \"G\") {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n timeFormat: \"tod\",\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Fault Log Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/FR');\n\n if(parts.length > 1){\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for(let i=1; i<fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0,20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0,12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nimport * as zlib from \"minizlib\";\nimport { Buffer } from 'node:buffer';\n\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = Buffer.from(data, 'base64');\n const decompress = new zlib.Inflate({windowBits: 15});\n decompress.write(compressedBuffer);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n const result = decompress.read();\n const jsonText = result.toString();\n \n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA' ,\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_H1_Slash extends DecoderPlugin {\n name = 'label-h1-slash';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n preambles: ['/']\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n \n const checksum = message.text.slice(-4);\n const data = message.text.slice(0, message.text.length - 4);\n\n const fields = data.split('/');\n\n if(fields[0] !== '') {\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const headerData = fields[1].split('.');\n ResultFormatter.unknown(decodeResult, headerData[0]);\n if(headerData[1] === 'POS' && fields[2].startsWith('TS') && fields[2].length > 15) {\n // variant 3 hack\n // rip out the timestamp and process the rest\n H1Helper.processPosition(decodeResult, fields[2].substring(15).split(','));\n } else if(headerData[1] === 'POS') {\n // do nothing\n } else if(headerData[1].startsWith('POS')) {\n H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(','));\n } else {\n ResultFormatter.unknown(decodeResult, headerData[1], '.');\n }\n\n for(let i=2; i<fields.length; i++) {\n const field = fields[i];\n if(field.startsWith('TS')) {\n H1Helper.processTS(decodeResult, field.substring(2,15).split(','));\n } else if(field.startsWith('PS')) {\n H1Helper.processPS(decodeResult, field.substring(2).split(','));\n } else {\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n }\n\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.checksum(decodeResult, checksum);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)));\n ResultFormatter.position(decodeResult, { // Deg Min, no sec\n latitude: CoordinateUtils.getDirection(msg.substring(12,13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17))/60), \n longitude: CoordinateUtils.getDirection(msg.substring(17,18)) * (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23))/60)\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Warning Message';\n decodeResult.message = message;\n\n const parts = message.text.split('/WN');\n\n if(parts.length > 1){\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0,20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0,12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === \"LOCATION\") {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin/60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin/60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === \"43\") {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = message.text.substring(1, 2);\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === '2') {\n const regex = /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude: (Number(result.groups.lat) / 100) * (result.groups.latd === 'S' ? -1 : 1),\n longitude: (Number(result.groups.lng) / 100) * (result.groups.lngd === 'W' ? -1 : 1)\n }\n }\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n decodeResult.formatted.description = 'Ground Station Squitter';\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: decodeResult.raw.version,\n }\n ];\n\n if (decodeResult.raw.groundStation) {\n if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`\n });\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text) \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text) \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text)\n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n \n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === \"\\r\\n001FE\") {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin/60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin/60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n if (decodeResult.remaining.text !== \"---\") {\n ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + \"00\"));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import * as Base85 from 'base85';\nimport * as zlib from \"minizlib\";\nimport { Buffer } from 'node:buffer';\n\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreV1App {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nenum MIAMCoreV2App {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string,\n label: string,\n sublabel?: string,\n mfi?: string,\n text?: string,\n}\n\ninterface PduNonACARSData {\n appId?: string,\n text?: string,\n}\n\ninterface Pdu {\n version: number,\n crc: number,\n crcOk: boolean,\n complete: boolean,\n compression: number,\n encoding: number,\n msgNum: number,\n ackOptions: number,\n acars?: PduACARSData,\n non_acars?: PduNonACARSData,\n}\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: any = {\n 1: {\n [MIAMCoreV1App.ACARS2Char]: 2,\n [MIAMCoreV1App.ACARS4Char]: 4,\n [MIAMCoreV1App.ACARS6Char]: 6,\n [MIAMCoreV1App.NonACARS6Char]: 6,\n },\n 2: {\n [MIAMCoreV2App.ACARS2Char]: 2,\n [MIAMCoreV2App.ACARS4Char]: 4,\n [MIAMCoreV2App.ACARS6Char]: 6,\n [MIAMCoreV2App.NonACARS6Char]: 6,\n },\n }\n\n static FidHandlerTable: any = {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0]\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: 'Invalid body padding value: \\'' + bpad + '\\'',\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: 'Invalid header padding value: \\'' + txt[1] + '\\'',\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|')\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = Base85.decode('<~' + rawHdr + '~>', 'ascii85');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Buffer | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n body = Base85.decode('<~' + rawBody + '~>', 'ascii85') || undefined;\n if (body && body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = Buffer.from(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr.readUInt8(0) & 0xf;\n const pduType = (hdr.readUInt8(0) >> 4) & 0xf;\n\n const versionPduHandler = this.VersionPduHandlerTable[version][pduType];\n if (versionPduHandler === undefined) {\n return {\n decoded: false,\n error: 'Invalid version and PDU type combination: v=' + version + ', pdu=' + pduType,\n };\n }\n\n return versionPduHandler(hdr, body);\n },\n [MIAMFid.FileTransferRequest]: undefined,\n [MIAMFid.FileTransferAccept]: undefined,\n [MIAMFid.FileSegment]: undefined,\n [MIAMFid.FileTransferAbort]: undefined,\n [MIAMFid.XOFFIndication]: undefined,\n [MIAMFid.XONIndication]: undefined,\n }\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\n 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\n 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\n 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\n 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,\n 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,\n 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\n 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\n 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\n 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\n 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\n 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\n 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\n 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc = (((crc << 8) >>> 0) ^ crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>> 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Buffer, seed?: number) {\n const crctable = [\n 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,\n 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,\n 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,\n 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,\n 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,\n 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,\n 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,\n 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,\n 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,\n 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,\n 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,\n 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,\n 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,\n 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,\n 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,\n 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,\n 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,\n 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,\n 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,\n 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,\n 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,\n 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,\n 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,\n 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,\n 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,\n 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,\n 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,\n 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,\n 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,\n 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,\n 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,\n 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,\n 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,\n 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,\n 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,\n 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,\n 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,\n 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,\n 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,\n 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,\n 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,\n 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,\n 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,\n 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,\n 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,\n 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,\n 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,\n 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,\n 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,\n 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,\n 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,\n 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,\n 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,\n 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,\n 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,\n 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,\n 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,\n 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,\n 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,\n 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,\n 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,\n 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,\n 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,\n 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc = (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string) {\n const fidType = txt[0];\n\n const handler = this.FidHandlerTable[fidType];\n if (handler === undefined) {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n\n return handler(txt.substring(1));\n }\n\n private static corePduDataHandler(version: number, minHdrSize: number, crcLen: number, hdr: Buffer, body?: Buffer) {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error: 'v' + version + ' header size too short; expected >= ' + minHdrSize + ', got ' + hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Buffer | undefined = undefined;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === 1) {\n pduSize = (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3);\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push('v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize);\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === 2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr.readUInt8(0) >> 1) & 0x7f;\n ackOptions = hdr.readUInt8(0) & 1;\n hdr = hdr.subarray(1);\n\n pduCompression = ((hdr.readUInt8(0) << 2) | ((hdr.readUInt8(1) >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr.readUInt8(1) >> 4) & 0x3;\n pduAppType = hdr.readUInt8(1) & 0xf;\n hdr = hdr.subarray(2)\n\n let appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n if (appIdLen === undefined) {\n if (version === 2 && (pduAppType & 0x8) !== 0 && pduAppType !== 0xd) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS = ([\n MIAMCoreV1App.ACARS2Char, MIAMCoreV1App.ACARS4Char, MIAMCoreV1App.ACARS6Char,\n MIAMCoreV2App.ACARS2Char, MIAMCoreV2App.ACARS4Char, MIAMCoreV2App.ACARS6Char].indexOf(pduAppType) >= 0);\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = hdr.subarray(0, appIdLen).toString('ascii')\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc = (hdr.readUInt8(0) << 24) | (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3); // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr.readUInt8(0) << 8) | hdr.readUInt8(1); // crc\n }\n hdr = hdr.subarray(crcLen)\n\n if (body !== undefined && body.length > 0) {\n if ([MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(pduCompression) >= 0) {\n try {\n const decompress = new zlib.InflateRaw({windowBits: 15});\n decompress.write(body);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n pduData = decompress.read();\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if ([MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(pduCompression) >= 0) {\n pduData = body;\n } else {\n pduErrors.push('Unsupported v' + version + ' compression type: ' + pduCompression)\n }\n\n if (pduData !== undefined) {\n const crcAlgoHandlerByVersion: any = {\n 1: (buf: Buffer, seed?: number) => { return ~this.arinc665Crc32(buf, seed); },\n 2: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n errors: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push('Body failed CRC check: provided=' + pduCrc + ', generated=' + crcCheck);\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n }\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = (appIdLen >= 4) ? pduAppId.substring(2, 4) : undefined;\n const mfi = (appIdLen >= 6) ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n }\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n }\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: any = {\n 1: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(1, 20, MIAMCoreV1CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: undefined,\n [MIAMCorePdu.Aloha]: undefined,\n [MIAMCorePdu.AlohaReply]: undefined,\n },\n 2: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(2, 7, MIAMCoreV2CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: undefined,\n [MIAMCorePdu.Aloha]: undefined,\n [MIAMCorePdu.AlohaReply]: undefined,\n }\n }\n}\n\nexport default {};\n","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface'; // eslint-disable-line import/no-cycle\n\nimport * as Plugins from './plugins/official';\nimport { MIAMCoreUtils } from './utils/miam';\n\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n this.registerPlugin(new Plugins.Label_ColonComma(this));\n this.registerPlugin(new Plugins.Label_5Z_Slash(this));\n this.registerPlugin(new Plugins.Label_10_LDR(this));\n this.registerPlugin(new Plugins.Label_10_POS(this));\n this.registerPlugin(new Plugins.Label_10_Slash(this));\n this.registerPlugin(new Plugins.Label_12_N_Space(this));\n this.registerPlugin(new Plugins.Label_12_POS(this));\n this.registerPlugin(new Plugins.Label_13Through18_Slash(this));\n this.registerPlugin(new Plugins.Label_15(this));\n this.registerPlugin(new Plugins.Label_15_FST(this));\n this.registerPlugin(new Plugins.Label_16_Honeywell(this));\n this.registerPlugin(new Plugins.Label_16_N_Space(this));\n this.registerPlugin(new Plugins.Label_16_POSA1(this));\n this.registerPlugin(new Plugins.Label_16_TOD(this));\n this.registerPlugin(new Plugins.Label_1J_2J_FTX(this));\n this.registerPlugin(new Plugins.Label_1L_3Line(this));\n this.registerPlugin(new Plugins.Label_1L_070(this));\n this.registerPlugin(new Plugins.Label_1L_660(this));\n this.registerPlugin(new Plugins.Label_1L_Slash(this));\n this.registerPlugin(new Plugins.Label_20_POS(this));\n this.registerPlugin(new Plugins.Label_21_POS(this));\n this.registerPlugin(new Plugins.Label_22_OFF(this));\n this.registerPlugin(new Plugins.Label_22_POS(this));\n this.registerPlugin(new Plugins.Label_24_Slash(this));\n this.registerPlugin(new Plugins.Label_2P_FM3(this));\n this.registerPlugin(new Plugins.Label_2P_FM4(this));\n this.registerPlugin(new Plugins.Label_2P_FM5(this));\n this.registerPlugin(new Plugins.Label_2P_POS(this));\n this.registerPlugin(new Plugins.Label_30_Slash_EA(this));\n this.registerPlugin(new Plugins.Label_44_ETA(this));\n this.registerPlugin(new Plugins.Label_44_IN(this));\n this.registerPlugin(new Plugins.Label_44_OFF(this));\n this.registerPlugin(new Plugins.Label_44_ON(this));\n this.registerPlugin(new Plugins.Label_44_POS(this));\n this.registerPlugin(new Plugins.Label_44_Slash(this));\n this.registerPlugin(new Plugins.Label_4A(this));\n this.registerPlugin(new Plugins.Label_4A_01(this));\n this.registerPlugin(new Plugins.Label_4A_DIS(this));\n this.registerPlugin(new Plugins.Label_4A_DOOR(this));\n this.registerPlugin(new Plugins.Label_4A_Slash_01(this));\n this.registerPlugin(new Plugins.Label_4J_POS(this));\n this.registerPlugin(new Plugins.Label_4N(this));\n this.registerPlugin(new Plugins.Label_4T_AGFSR(this));\n this.registerPlugin(new Plugins.Label_4T_ETA(this));\n this.registerPlugin(new Plugins.Label_B6_Forwardslash(this));\n this.registerPlugin(new Plugins.Label_H2_02E(this));\n this.registerPlugin(new Plugins.Label_H1_FLR(this));\n this.registerPlugin(new Plugins.Label_H1_OHMA(this));\n this.registerPlugin(new Plugins.Label_H1_WRN(this));\n this.registerPlugin(new Plugins.Label_H1(this));\n this.registerPlugin(new Plugins.Label_H1_Slash(this));\n this.registerPlugin(new Plugins.Label_H1_StarPOS(this));\n this.registerPlugin(new Plugins.Label_HX(this));\n this.registerPlugin(new Plugins.Label_58(this));\n this.registerPlugin(new Plugins.Label_80(this));\n this.registerPlugin(new Plugins.Label_83(this));\n this.registerPlugin(new Plugins.Label_8E(this));\n this.registerPlugin(new Plugins.Label_1M_Slash(this));\n this.registerPlugin(new Plugins.Label_SQ(this));\n this.registerPlugin(new Plugins.Label_QP(this));\n this.registerPlugin(new Plugins.Label_QQ(this));\n this.registerPlugin(new Plugins.Label_QR(this));\n this.registerPlugin(new Plugins.Label_QS(this));\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n const pluginInstance = plugin;\n // plugin.onRegister(this.store);\n this.plugins.push(plugin);\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n if (message.label === 'MA') {\n const decodeResult = MIAMCoreUtils.parse(message.text);\n\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (decodeResult.decoded &&\n decodeResult.message.data !== undefined &&\n decodeResult.message.data.crcOk &&\n decodeResult.message.data.complete &&\n decodeResult.message.data.acars !== undefined) {\n message = {\n ...message,\n label: decodeResult.message.data.acars.label,\n ...(decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {}),\n ...(decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {}),\n ...(decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}),\n }\n }\n }\n\n // console.log('All plugins');\n // console.log(this.plugins);\n const usablePlugins = this.plugins.filter((plugin) => {\n const qualifiers: any = plugin.qualifiers();\n\n if (qualifiers.labels.includes(message.label)) {\n if (qualifiers.preambles && qualifiers.preambles.length > 0) {\n const matching = qualifiers.preambles.filter((preamble: string) => { // eslint-disable-line arrow-body-style,max-len\n // console.log(message.text.substring(0, preamble.length));\n // console.log(preamble);\n return message.text.substring(0, preamble.length) === preamble;\n });\n // console.log(matching);\n return matching.length >= 1;\n } else { // eslint-disable-line no-else-return\n return true;\n }\n }\n\n return false;\n });\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(usablePlugins);\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: message.text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n // for-in is not happy. doing it the old way\n for (let i = 0; i < usablePlugins.length; i++) {\n const plugin = usablePlugins[i];\n result = plugin.decode(message);\n if (result.decoded) {\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n\n lookupAirportByIata(iata: string): any {\n const airportsArray: Array<any> = []; // = this.store.state.acarsData.airports;\n // console.log(airportsArray);\n const airport = airportsArray.filter((e: any) => e.iata === iata);\n\n return airport;\n }\n}\n\nexport default {\n};\n"],"mappings":"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AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1D;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aAAS,OAAO,MAAO,IAAK,UAAY,QAAQ,IAAK,IAAI,UAAU,CAAC,OAAO,IAAK,GAAI,OAAO;AAAA,IAC7F;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAa,MAAe;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA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","names":["data","zlib","Buffer","Buffer"]}
1
+ {"version":3,"sources":["../lib/IcaoDecoder.ts","../lib/DateTimeUtils.ts","../lib/DecoderPlugin.ts","../lib/utils/coordinate_utils.ts","../lib/utils/route_utils.ts","../lib/utils/result_formatter.ts","../lib/plugins/Label_5Z_Slash.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_12_POS.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_Honeywell.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_16_POSA1.ts","../lib/plugins/Label_16_TOD.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/h1_helper.ts","../lib/plugins/Label_1J_2J_FTX.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_1L_3-line.ts","../lib/plugins/Label_1L_070.ts","../lib/plugins/Label_1L_660.ts","../lib/plugins/Label_1L_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.ts","../lib/plugins/Label_22_OFF.ts","../lib/plugins/Label_22_POS.ts","../lib/plugins/Label_2P_FM3.ts","../lib/plugins/Label_2P_FM4.ts","../lib/plugins/Label_2P_FM5.ts","../lib/plugins/Label_2P_POS.ts","../lib/plugins/Label_24_Slash.ts","../lib/plugins/Label_30_Slash_EA.ts","../lib/plugins/Label_44_ETA.ts","../lib/plugins/Label_44_IN.ts","../lib/plugins/Label_44_OFF.ts","../lib/plugins/Label_44_ON.ts","../lib/plugins/Label_44_POS.ts","../lib/plugins/Label_44_Slash.ts","../lib/plugins/Label_4A.ts","../lib/plugins/Label_4A_01.ts","../lib/plugins/Label_4A_DIS.ts","../lib/plugins/Label_4A_DOOR.ts","../lib/plugins/Label_4A_Slash_01.ts","../lib/plugins/Label_4J_POS.ts","../lib/plugins/Label_4N.ts","../lib/plugins/Label_4T_AGFSR.ts","../lib/plugins/Label_58.ts","../lib/plugins/Label_4T_ETA.ts","../lib/plugins/Label_80.ts","../lib/plugins/Label_83.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H1.ts","../lib/plugins/Label_H2_02E.ts","../lib/plugins/Label_H1_FLR.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/plugins/Label_H1_Slash.ts","../lib/plugins/Label_H1_StarPOS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.ts","../lib/utils/miam.ts","../lib/plugins/Label_MA.ts","../lib/plugins/Label_SQ.ts","../lib/plugins/Label_QR.ts","../lib/plugins/Label_QP.ts","../lib/plugins/Label_QS.ts","../lib/plugins/Label_QQ.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export class IcaoDecoder {\n name : string;\n icao : string;\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary() {\n let i = this.icao;\n return (\n false\n // us military\n //adf7c8-adf7cf = united states mil_5(uf)\n //adf7d0-adf7df = united states mil_4(uf)\n //adf7e0-adf7ff = united states mil_3(uf)\n //adf800-adffff = united states mil_2(uf)\n || i.match(/^adf[7-9]/)\n || i.match(/^adf[a-f]/)\n //ae0000-afffff = united states mil_1(uf)\n || i.match(/^a(e|f)/)\n\n //010070-01008f = egypt_mil\n || i.match(/^0100(7|8)/)\n\n //0a4000-0a4fff = algeria mil(ap)\n || i.match(/^0a4/)\n\n //33ff00-33ffff = italy mil(iy)\n || i.match(/^33ff/)\n\n //350000-37ffff = spain mil(sp)\n || (i >= '350000' && i <= '37ffff')\n\n //3a8000-3affff = france mil_1(fs)\n || i.match(/^3a(8|9|[a-f])/)\n //3b0000-3bffff = france mil_2(fs)\n || i.match(/^3b/)\n\n //3e8000-3ebfff = germany mil_1(df)\n // remove 8 and 9 from mil arnge\n || i.match(/^3e(a|b)/)\n //3f4000-3f7fff = germany mil_2(df)\n //3f8000-3fbfff = germany mil_3(df)\n || i.match(/^3f([4-9]|[a-b])/)\n\n //400000-40003f = united kingdom mil_1(ra)\n || i.match(/^4000[0-3]/)\n //43c000-43cfff = united kingdom mil(ra)\n || i.match(/^43c/)\n\n //444000-447fff = austria mil(aq)\n || (i.match(/^44[4-7]/) && i != '447ac7')\n\n //44f000-44ffff = belgium mil(bc)\n || i.match(/^44f/)\n\n //457000-457fff = bulgaria mil(bu)\n || i.match(/^457/)\n\n //45f400-45f4ff = denmark mil(dg)\n || i.match(/^45f4/)\n\n //468000-4683ff = greece mil(gc)\n || i.match(/^468[0-3]/)\n\n //473c00-473c0f = hungary mil(hm)\n || i.match(/^473c0/)\n\n //478100-4781ff = norway mil(nn)\n || i.match(/^4781/)\n //480000-480fff = netherlands mil(nm)\n || i.match(/^480/)\n //48d800-48d87f = poland mil(po)\n || i.match(/^48d8[0-7]/)\n //497c00-497cff = portugal mil(pu)\n || i.match(/^497c/)\n //498420-49842f = czech republic mil(ct)\n || i.match(/^49842/)\n\n //4b7000-4b7fff = switzerland mil(su)\n || i.match(/^4b7/)\n //4b8200-4b82ff = turkey mil(tq)\n || i.match(/^4b82/)\n\n //506f00-506fff = slovenia mil(sj)\n || i.match(/^506f/)\n\n //70c070-70c07f = oman mil(on)\n || i.match(/^70c07/)\n\n //710258-71025f = saudi arabia mil_1(sx)\n //710260-71027f = saudi arabia mil_2(sx)\n //710280-71028f = saudi arabia mil_3(sx)\n //710380-71039f = saudi arabia mil_4(sx)\n || i.match(/^7102[5-8]/)\n || i.match(/^7103[8-9]/)\n\n //738a00-738aff = israel mil(iz)\n || i.match(/^738a/)\n\n //7c822e-7c822f = australia mil_1(av)\n //7c8230-7c823f = australia mil_2(av)\n //7c8240-7c827f = australia mil_3(av)\n //7c8280-7c82ff = australia mil_4(av)\n //7c8300-7c83ff = australia mil_5(av)\n //7c8400-7c87ff = australia mil_6(av)\n //7c8800-7c8fff = australia mil_7(av)\n || i.match(/^7c8([2-4]|8)/)\n //7c9000-7c9fff = australia mil_8(av)\n //7ca000-7cbfff = australia mil_9(av)\n || (i >= '7c9000' && i <= '7cbfff')\n //7cc000-7cffff = australia mil_10(av) 7cc409 not mil, remove this range\n //7d0000-7dffff = australia mil_11(av)\n //7e0000-7fffff = australia mil_12(av)\n || i.match(/^7[d-f]/)\n\n //800200-8002ff = india mil(im)\n || i.match(/^8002/)\n\n //c20000-c3ffff = canada mil(cb)\n || i.match(/^c[2-3]/)\n\n //e40000-e41fff = brazil mil(bq)\n || i.match(/^e4[0-1]/)\n\n //e80600-e806ff = chile mil(cq)\n || i.match(/^e806/)\n );\n }\n\n}\n","export class DateTimeUtils {\n\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n let utcDate = new Date();\n utcDate.setUTCDate(+dateString.substr(0, 2));\n utcDate.setUTCMonth(+dateString.substr(2, 2));\n if (dateString.length === 6) {\n utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));\n }\n if (timeString.length === 6) {\n utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));\n } else {\n utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);\n }\n return utcDate.toUTCString();\n }\n\n /**\n * \n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if(time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = (h * 3600) + (m * 60) + s;\n return tod;\n }\n\n /**\n * \n * @param time HHMMSS\n * @param date MMDDYY or MMDDYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n 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`\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n * \n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time \n * @param format \n * @returns \n */\n public static timestampToString(time: number, format: 'tod' | 'epoch'): string {\n const date = new Date(time * 1000); if (format == 'tod') {\n return date.toISOString().slice(11, 19);\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + \"Z\";\n }\n}","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n };\n\n options: Object;\n\n constructor(decoder : MessageDecoder, options : Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id() : string { // eslint-disable-line class-methods-use-this\n console.log('DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!');\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements() : boolean { // eslint-disable-line class-methods-use-this\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers() : any { // eslint-disable-line class-methods-use-this\n const labels : Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message) : DecodeResult { // eslint-disable-line class-methods-use-this\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n\n","export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n * \n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n return {\n latitude: (Number(stringCoords.substring(1, 6)) / 1000) * CoordinateUtils.getDirection(firstChar),\n longitude: (Number(longitudeChars) / 1000) * CoordinateUtils.getDirection(middleChar)\n };\n } \n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n * \n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar ==' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n const latDeg = Math.trunc(Number(stringCoords.substring(1, 6)) / 1000);\n const latMin = (Number(stringCoords.substring(1, 6)) % 1000) / 10;\n const lonDeg = Math.trunc(Number(longitudeChars) / 1000);\n const lonMin = (Number(longitudeChars) % 1000) / 10;\n\n if ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n return {\n latitude: (latDeg + (latMin / 60)) * CoordinateUtils.getDirection(firstChar),\n longitude: (lonDeg + (lonMin / 60)) * CoordinateUtils.getDirection(middleChar)\n };\n } \n return undefined;\n }\n public static coordinateString(coords: {latitude: number, longitude: number}) : string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string):number {\n if(coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if(coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(degrees: number, minutes: number, seconds: number ) : number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { Route } from \"../types/route\";\nimport { Waypoint } from \"../types/waypoint\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\n\nexport class RouteUtils {\n\n public static formatFlightState(state: string): string {\n switch (state) {\n case \"TO\": return \"Takeoff\";\n case \"IC\": return \"Initial Climb\";\n case \"CL\": return \"Climb\";\n case \"ER\": return \"En Route\";\n case \"DC\": return \"Descent\";\n case \"AP\": return \"Approach\";\n default: return `Unknown ${state}`;\n }\n }\n \n public static routeToString(route: Route): string {\n let str = '';\n if(route.name) {\n str += route.name;\n }\n if(route.runway) {\n str += `(${route.runway})`;\n }\n if(str.length!==0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at '\n }\n else if(str.length!==0 && route.waypoints) {\n str += ': ';\n }\n\n if(route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n } \n \n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if(waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({latitude:waypoint.latitude, longitude: waypoint.longitude})})`;\n }\n if(waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if(waypoint.time && waypoint.timeFormat) {\n s +=`@${DateTimeUtils.timestampToString(waypoint.time, waypoint.timeFormat)}`;\n }\n return s;\n }\n \n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if(regex?.length == 4) {\n return {name: regex[1], offset: {bearing: parseInt(regex[2]), distance: parseInt(regex[3])/10}};\n }\n\n const waypoint = leg.split(',');\n if(waypoint.length ==2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(waypoint[1]);\n if(position) {\n return {name: waypoint[0], latitude: position.latitude, longitude: position.longitude};\n }\n }\n if(leg.length == 13 || leg.length == 14) { //looks like coordinates\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if(position) {\n return {name: name, latitude: position.latitude, longitude: position.longitude};\n }\n }\n return {name: leg};\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints.map((x) => RouteUtils.waypointToString(x)).join( ' > ').replaceAll('> >', '>>');\n if(str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from \"../DecoderPluginInterface\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\nimport { DateTimeUtils } from \"../DateTimeUtils\";\nimport { RouteUtils } from \"./route_utils\";\nimport { Route } from \"../types/route\";\nimport { Wind } from \"../types/wind\";\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n };\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static freetext(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.freetext = value;\n decodeResult.formatted.items.push({\n type: 'freetext',\n code: 'FREE_TEXT',\n label: 'Free Text',\n value: value,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(decodeResult: DecodeResult, value: { latitude: number, longitude: number } | undefined) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if(isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if(value.length === 0 ) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n };\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n };\n\n static departureAirport(decodeResult: DecodeResult, value: string, type: 'IATA' | 'ICAO' = 'ICAO') {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n };\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(decodeResult: DecodeResult, value: string, type: 'IATA' | 'ICAO' = 'ICAO') {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n };\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n };\n\n static eta(decodeResult: DecodeResult, time: number, type: 'tod' | 'epoch' = 'tod') {\n if (type === 'tod') {\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.eta_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n };\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n };\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n };\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n };\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n };\n\n\n static checksum(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum = Number(\"0x\" + value);\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value: '0x' + ('0000' + decodeResult.raw.checksum.toString(16)).slice(-4),\n });\n };\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if(value.length === 0 ) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(value.replace(\"M\", \"-\").replace(\"P\", \"+\"));\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: \"TAIL\",\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number, type: 'tod' | 'epoch' = 'tod') {\n if (type === 'tod') {\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.off_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static time_of_day(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.time_of_day = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'MSG_TOD',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for(const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(decodeResult: DecodeResult, value: number, type: \"center\" | \"lower\" | \"upper\" = \"center\") {\n switch(type) {\n case \"center\":\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: \"center_of_gravity\",\n code: \"CG\",\n label: \"Center of Gravity\",\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case \"lower\":\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: \"cg_lower_limit\",\n code: \"CG_LOWER\",\n label: \"Center of Gravity Lower Limit\",\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case \"upper\":\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: \"cg_upper_limit\",\n code: \"CG_UPPER\",\n label: \"Center of Gravity Upper Limit\",\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: \"version\",\n code: \"VERSION\",\n label: \"Message Version\",\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: \"label\",\n code: \"LABEL\",\n label: \"Message Label\",\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: \"sublabel\",\n code: \"SUBLABEL\",\n label: \"Message Sublabel\",\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text)\n decodeResult.remaining.text = value;\n else\n decodeResult.remaining.text += sep + value;\n };\n\n static unknownArr(decodeResult: DecodeResult, value: string[], sep: string = ',') {\n this.unknown(decodeResult, value.join(sep), sep);\n };\n\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['5Z'],\n preambles: ['/']\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') { // not UA, but starts with `/`\n ResultFormatter.text(decodeResult, lines.slice(1).join('\\r\\n'));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), 'IATA');\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), 'IATA');\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4]));\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]));\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text ? 'partial' : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-ldr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n }\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]].filter((r) => r != \"\").join(\",\");\n if (altRwy != \"\") {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [...parts.slice(0,5), ...parts.slice(15)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())/100,\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())/100,\n }\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [parts[0], ...parts.slice(3,7), ...parts.slice(8)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_10_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n }\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100*Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]));\n const waypoints: Waypoint[] = [{\n name: parts[11],\n },{\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n timeFormat: 'tod',\n },{\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n timeFormat: 'tod',\n },];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if(parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(decodeResult, [parts[3], parts[4], ...parts.slice(9,11), ...parts.slice(17)], '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"12\"],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex)\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 12 N : results`);\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n });\n\n const altitude = results.groups.alt == 'GRD' || results.groups.alt == '***' ? 0 : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2, results.groups.unkwn3]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),\n longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8))),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim())); // strip FOB\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim())); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_13Through18_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-13-18-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if ((labelNumber !== 18 && parts.length !== 4) || (labelNumber === 18 && parts.length !== 7)) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4])\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = { latitude: Number(location[0]), longitude: Number(location[1]) };\n } else {\n position = {\n 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))),\n 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))),\n }\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], \"\\r\\n\");\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text ? 'partial' : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report'\n }\n if (labelNumber === 14) {\n return 'Takeoff Report'\n }\n if (labelNumber === 15) {\n return 'On Ground Report'\n }\n if (labelNumber === 16) {\n return 'In Gate Report'\n }\n if (labelNumber === 17) {\n return 'Post Report'\n }\n if (labelNumber === 18) {\n return 'Post Times Report'\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13)));\n if (between.length === 25) { // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(\" \", \"0\"));\n } else if(between.substring(13,16) === 'OFF') { // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if(ddmmyy != '------') {\n const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);\n ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm+'00', mmddyy), 'epoch');\n } else {\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), 'tod');\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 15 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13)\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar= stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n const lat = (Number(stringCoords.substring(1, 7)) / 10000) * (firstChar === 'S' ? -1 : 1);\n const lon = (Number(stringCoords.substring(8, 15)) / 10000) * (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, {latitude: lat, longitude: lon});\n ResultFormatter.altitude(decodeResult, Number(stringCoords.substring(15)) * 100);\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5,9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9,13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from \"../DecoderPlugin\";\nimport { DecodeResult, Message, Options } from \"../DecoderPluginInterface\";\nimport { CoordinateUtils } from \"../utils/coordinate_utils\";\nimport { ResultFormatter } from \"../utils/result_formatter\";\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = \"label-16-honeywell\";\n\n qualifiers() {\n // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: [\"(2\"],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = \"Position Report\";\n decodeResult.message = message;\n\n if (message.text.startsWith(\"(2\") && message.text.endsWith(\"(Z\") && message.text.length >= 29) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), \"\"); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === \"-\") {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n \"\",\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = \"partial\";\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n let pos = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude = results.groups.alt == 'GRD' || results.groups.alt == '***' ? 0 : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude)\n\n ResultFormatter.unknownArr(decodeResult, [results.groups.unkwn1, results.groups.unkwn2]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult\n }\n \n results = message.text.match(variant2Regex)\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n let pos = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n } \n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(5))); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3])*100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {waypoints: [\n {name: waypoint, time: time, timeFormat: 'tod'},\n {name: nextWaypoint, time: nextTime, timeFormat: 'tod'}\n ]});\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0])\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.time_of_day(decodeResult, time);\n if(fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude: CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n\n if(temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n\n return decodeResult;\n }\n}\n","import { DecodeResult } from \"../DecoderPluginInterface\";\nimport { ResultFormatter } from \"./result_formatter\";\nimport { RouteUtils } from \"./route_utils\";\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n * \n * Expected format is [header, key1, val1, ... keyN, valN]\n * \n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const key = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (key) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${key}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(decodeResult: DecodeResult, header: string): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n decodeResult.raw.route_status = header;\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false\n }\n return allKnownFields;\n };\n\n\npublic static addProcedure(decodeResult: DecodeResult, value: string, type: string) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: `procedure`,\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n};\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n};\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n};\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n};\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, { waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)) });\n};\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(')'));\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n};\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecodeResult } from \"../DecoderPluginInterface\";\nimport { Waypoint } from \"../types/waypoint\";\nimport { Wind } from \"../types/wind\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\nimport { FlightPlanUtils } from \"./flight_plan_utils\";\nimport { ResultFormatter } from \"./result_formatter\";\nimport { RouteUtils } from \"./route_utils\";\n\nexport class H1Helper {\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n const checksum = message.slice(-4);\n const data = message.slice(0, message.length - 4);\n if(calculateChecksum(data) !== checksum) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return false;\n }\n\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n\n for (let i = 1; i < fields.length; ++i) {\n const key = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (key) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.freetext(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'PR':\n // TODO: decode /PR fields\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n break;\n case 'PS': // Position\n H1Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TS':\n H1Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10)/10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n }\n if (data.length === 9) { // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) { // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) { // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) { // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);\n\n if (Number.isNaN(time)) { // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(data: string, decodeResult: DecodeResult, fields: string[], i: number) {\n if (data.length === 5) { // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data.substring(1)));\n } else if (data.length === 6) { // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data.substring(2)));\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.plannedDepartureTime = data[0]; //DDHHMM\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: \"ptd\",\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.plannedDepartureTime = data[1]; //HHMM\n decodeResult.formatted.items.push({\n type: 'etd',\n code: \"etd\",\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0])\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) { //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n } else if (decodeResult.raw.arrival_icao != data[0]) {\n ResultFormatter.unknownArr(decodeResult, data);\n } // else duplicate - don't do anything\n\n\n if (data.length > 1) {\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n }\n if (data.length > 2) {\n ResultFormatter.currentFuel(decodeResult, Number(data[2]));\n }\n if (data.length > 3) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[3]));\n }\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n if (data.length > 5) {//TODO: figure out what this is\n ResultFormatter.unknownArr(decodeResult, data);\n }\n};\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n};\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if(data.length === 1) {\n if(data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if(data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if(data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if(data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n};\n\n\nfunction parseMessageType(decodeResult: DecodeResult, messageType: string): boolean {\n\n if (messageType.startsWith('POS')) {\n H1Helper.processPosition(decodeResult, messageType.substring(3).split(','));\n return processMessageType(decodeResult, 'POS');\n } else if(messageType.length === 13) {\n if(processMessageType(decodeResult, messageType.substring(10))) {\n ResultFormatter.unknown(decodeResult, messageType.substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, messageType.slice(4, 10));\n return true;\n }\n }\n return processMessageType(decodeResult, messageType.substring(0,3));\n}\n\nfunction processMessageType(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Flight Plan Initial Report';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n decodeResult.raw.message_date = data[0]; // DDMMYYYY;\n\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date = data[0].substring(2, 4) + data[0].substring(0, 2) + data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processRoute(decodeResult: DecodeResult, last: string, time: string, next: string, eta: string, then?: string, date?: string) {\n const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);\n const timeFormat = date ? 'epoch' : 'tod';\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n lastWaypoint.timeFormat = timeFormat;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n nextWaypoint.timeFormat = timeFormat;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n decodeResult.raw.route = { waypoints: waypoints };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n}\n\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n const data = field.split(',');\n const waypoint = {name: data[0]};\n const windData = data[1];\n const windDirection = Number(windData.slice(0, 3));\n const windSpeed = Number(windData.slice(3));\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees = Number(tempString.substring(1)) * (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees\n },\n });\n\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction calculateChecksum(data: string): string {\n let crc = 0xFFFF;\n const bytes = Buffer.from(data, 'ascii');\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = (crc >>> 1);\n }\n }\n }\n crc = (crc ^ 0xFFFF) & 0xFFFF;\n\n const nibble1 = (crc >> 12) & 0xF;\n const nibble2 = (crc >> 8) & 0xF;\n const nibble3 = (crc >> 4) & 0xF;\n const nibble4 = crc & 0xF;\n\nreturn `${nibble4.toString(16)}${nibble3.toString(16)}${nibble2.toString(16)}${nibble1.toString(16)}`.toUpperCase();\n}\n\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1J_2J_FTX extends DecoderPlugin {\n name = 'label-1j-2j-ftx';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1J', '2J'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const parts = msg.split('/');\n let decoded = false;\n if (parts[0].length > 3) {\n decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length - 3));\n // flight number is already decoded in other fields\n decodeResult.remaining.text = parts[0].slice(0,3) + '/' + decodeResult.remaining.text;\n } else {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1J/2J message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"1M\"],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log(`Label 1M ETA: results`);\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(decodeResult, results[8].replace(results[4], \"\")); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertDateTimeToEpoch(results[7]+'00', yymmdd.substring(2,4)+yymmdd.substring(4,6)+yymmdd.substring(0,2)), 'epoch')\n \n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-3-line';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp = (Date.parse(day + ' GMT+0000') / 1000) + DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-070';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),\n longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1)),\n });\n\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-660';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(parts[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmmss));\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-1l-1-line';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n }\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(utc));\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n // N38160W077075,,211733,360,OTT,212041,,N42,19689,40,544\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 1 detected`);\n }\n // Field 1: Coordinates\n const rawCoords = fields[0];\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(rawCoords));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else if (fields.length == 5) {\n // N38160W077075,,211733,360,OTT\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 2 detected`);\n }\n // Field 1: Coordinates\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.altitude( decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, \"\"));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[7]));\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], fields[4], fields[5]]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if(options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if(value.length !== 16 && value[0] !== 'N' && value[0] !== 'S' && value[8] !== 'W' && value[8] !== 'E') {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position ={\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n \n ResultFormatter.position(decodeResult, position);\n}\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Takeoff Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('OFF01')) { // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2))); // departure day\n ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2,4))); // arrival day\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)));\n ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12));\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16,22)));\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else if (message.text.startsWith('OFF02\\r\\n')) { // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else if (message.text.startsWith('OFF02')) { // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(fields[1].substring(0, 14));\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20) ));\n ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24));\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)));\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36,40)));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n\n } else {\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation.`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if(parts.length === 7){\n\n const header = parts[0].split('FM3 ');\n if(header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if(header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0,4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if(header[1].length === 4) {\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));\n } else {\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));\n }\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[1]));\n const lat = parts[2].replaceAll(' ','');\n const lon = parts[3].replaceAll(' ','');\n if(lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {latitude: Number(lat), longitude: Number(lon)});\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if(parts.length === 10){\n const header = parts[0].split('FM4');\n if(header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if(header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0,4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0,2)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));\n ResultFormatter.position(decodeResult, {latitude: Number(parts[4].replaceAll(' ','')), longitude: Number(parts[5].replaceAll(' ',''))});\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if(parts.length === 12){\n\n const header = parts[0].split('FM5 ');\n if(header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));\n ResultFormatter.position(decodeResult, {latitude: Number(parts[4].replaceAll(' ','')), longitude: Number(parts[5].replaceAll(' ',''))});\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_POS extends DecoderPlugin {\n name = 'label-2p-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"2P\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const parts = msg.split('/');\n let decoded = false;\n if (parts[0].length > 3) {\n decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length - 3));\n // flight number is already decoded in other fields\n decodeResult.remaining.text = parts[0].slice(0,3) + '/' + decodeResult.remaining.text;\n } else {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') { // begin and ends with `/`\n const mmddyy = fields[1].substring(4,6) + fields[1].substring(2,4) + fields[1].substring(0,2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(hhmmss,mmddyy);\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if(options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"30\"],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log(`Label 30 EA: results`);\n console.log(results);\n }\n }\n\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));\n\n if (results[1].substring(0,2) === \"DS\") {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, \"/\".concat(results[2]));\n } else {\n ResultFormatter.unknown(decodeResult, \"/\".concat(results[1], \"/\", results[2]));\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 9) {\n if (options.debug) {\n console.log(`Label 44 ETA Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n\n ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(decodeResult, data.slice(9));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_IN extends DecoderPlugin {\n name = 'label-44-in';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'In Air Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log(`Label 44 In Air Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Off Runway Report\nexport class Label_44_OFF extends DecoderPlugin {\n name = 'label-44-off';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Off Runway Report';\n decodeResult.message = message;\n\n\n const data = message.text.split(',');\n if (data.length >= 8) {\n if (options.debug) {\n console.log(`Label 44 Off Runway Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));\n const fuel = Number(data[7]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 8) {\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// On Runway Report\nexport class Label_44_ON extends DecoderPlugin {\n name = 'label-44-on';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'On Runway Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log(`Label 44 On Runway Report: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,unknown\n const regex = /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 44 Position Report: groups`);\n console.log(results.groups);\n }\n\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));\n const flight_level = results.groups.flight_level_or_ground == 'GRD' || results.groups.flight_level_or_ground == '***' ? 0 : Number(results.groups.flight_level_or_ground);\n\n\n ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'));\n\n // TODO: ETA month and Day\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'));\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecoderPlugin } from \"../DecoderPlugin\";\nimport { DecodeResult, Message, Options } from \"../DecoderPluginInterface\";\nimport { FlightPlanUtils } from \"../utils/flight_plan_utils\";\nimport { ResultFormatter } from \"../utils/result_formatter\";\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = \"label-44-slash\";\n\n qualifiers() {\n // eslint-disable-line class-methods-use-this\n return {\n labels: [\"44\"],\n preambles: [\" /FB\"],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = \"Flight Briefing\";\n decodeResult.message = message;\n\n const fields = message.text.split(\"/\");\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), \"/\"); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(\",\");\n if (data.length >= 6) {\n if (options.debug) {\n console.log(`Label 44 Slash: groups`);\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === \"S\" ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === \"W\" ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), \",\"); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), \",\");\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], \"arrival\");\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), \",\");\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = \"partial\";\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n\n // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n const fields = text.split(\",\");\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));\n ResultFormatter.tail(decodeResult, fields[2].replace(\".\", \"\"));\n if (fields[3])\n ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n const alt = text.substring(48, 51);\n if(alt !== '') {\n ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n if (fields[0].match(/^[NS]/)) {\n // variant 2\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n timeFormat: 'tod',\n };\n ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n timeFormat: 'tod',\n };\n ResultFormatter.route(decodeResult, {waypoints: [wp1, wp2]});\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4]+fields[5]).replace(/[ \\.]/g, \"\")));\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n 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)/);\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + \"00\"));\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, \"\")));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, \"\"));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(\",\");\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + \"00\"));\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.freetext(decodeResult, fields.slice(3).join(\"\"));\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(\" \");\n if (fields.length === 3) {\n ResultFormatter.door_event(decodeResult, fields[0].split(\"/\")[1], fields[1]);\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + \"00\"));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0,4) === \"/01-\") {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4J_POS extends DecoderPlugin {\n name = 'label-4j-pos';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4J'],\n preambles: ['POS/'],\n };\n }\n\n // copied from Label_H1.ts since i don't really want to have to have\n // something named like that decode more than 1 type\n // if we figure out a good name, i'll combine them\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n const fields = text.split(\",\");\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, \"$1\")));\n ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);\n ResultFormatter.unknownArr(decodeResult, [text.substring(2, 4), text.substring(19, 29)], \" \");\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === \"B\") {\n ResultFormatter.position(decodeResult, {latitude: Number(fields[4]), longitude: Number(fields[5])});\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split(\"/\")[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split(\"/\")[0]);\n }\n ResultFormatter.checksum(decodeResult, fields[32]);\n ResultFormatter.unknownArr(decodeResult, [...fields.slice(1,3), fields[7], ...fields.slice(13, 32)].filter((f) => f != \"\"));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if(!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(decodeResult, data[3].substring(0,3), 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0,4))); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0,7);\n const lon = data[6].substring(7,15);\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0,2)) + Number(lat.substring(2,6))/60,\n longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0,3)) + Number(lon.substring(3, 7))/60\n });\n ResultFormatter.altitude(decodeResult, 100* Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)), \n longitude:CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if(!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0,4)));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Defined Position Report';\n\n const lines = message.text.split(/\\r?\\n/);\n if(lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for(let i=0; i<headerParts.length-1; i++) {\n const moreFields = headerParts[i].split('/');\n for(const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(headerParts[headerParts.length-1].trim(), decodeResult);\n\n for(let i=1; i<lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text === undefined ? 'full' : 'partial';\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if(fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(/\\s+/);\n if(msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0,2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(/\\s+/);\n if(otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(/\\s+/);\n if(otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if(fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(/\\s+/)\n if(kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS':\n // don't use decodeStringCoordinates because of different position format\n const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = val.match(posRegex);\n const lat = Number(posResult?.groups?.lat) * (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon = Number(posResult?.groups?.lng) * (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(results, parseInt(val.replace(/\\D/g, ''), 10));\n break;\n case 'UTC':\n ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(val));\n break;\n case 'ETA':\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n const header = csvParts[0].trim().split(/\\s+/);\n ResultFormatter.unknown(results,header[0], ' ');\n ResultFormatter.unknown(results,header[1], ' ');\n ResultFormatter.position(results, CoordinateUtils.decodeStringCoordinates(header[2]));\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.time_of_day(results, DateTimeUtils.convertHHMMSSToTod(csvParts[2]));\n ResultFormatter.unknownArr(results, csvParts.slice(4,6), ',');\n ResultFormatter.temperature(results, ((csvParts[6].charAt(0) === 'M' ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString());\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel( results, parseInt( csvParts[8], 10));\n }\n}","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n if (text.substring(0, 10) === \"4DH3 ETAT2\") {\n // variant 2\n const fields = text.split(/\\s+/);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split(\"/\");\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(/\\./g, \"\"));\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[6] + \"00\"));\n } else if (text.substring(0, 5) === \"001PR\") {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\\./g, \"\"))\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(/\\s/g, \"\").split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0,2);\n decodeResult.raw.time = fields[2].substring(2);\n ResultFormatter.position(decodeResult,\n {\n latitude: Number(fields[3].replace(/\\s/g, \"\")),\n longitude: Number(fields[4].replace(/\\s/g, \"\")),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"8E\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log(`Label 8E ETA: groups`);\n console.log(results.groups);\n }\n\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta));\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'CPDLC Message';\n decodeResult.message = message;\n\n if (options.debug) {\n console.log(\"CPDLC: \" + message);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description = 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ'\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1 extends DecoderPlugin {\n name = 'label-h1';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const parts = msg.split('#');\n let decoded = false;\n if(parts.length === 1) {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n } else if (parts.length == 2) {\n const offset = isNaN(parseInt(parts[1][1])) ? 3: 4;\n decoded = H1Helper.decodeH1Message(decodeResult, msg.slice(parts[0].length + offset)); // skip up to # and then a little more\n if (decoded && parts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, parts[1].length == 5 ? parts[1].substring(0, 2) : parts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text = parts[0].substring(0, 4) + '#' + parts[1].substring(0, offset -1) + '/' + decodeResult.remaining.text;\n }\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecoderPlugin } from \"../DecoderPlugin\";\nimport { DecodeResult, Message, Options } from \"../DecoderPluginInterface\";\nimport { Wind } from \"../types/wind\";\nimport { CoordinateUtils } from \"../utils/coordinate_utils\";\nimport { ResultFormatter } from \"../utils/result_formatter\";\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = \"label-h2-02e\";\n\n qualifiers() {\n // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H2\"],\n preambles: [\"02E\"],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = \"Weather Report\";\n decodeResult.message = message;\n\n const parts = message.text.split(\" \");\n\n if (parts[parts.length - 1] !== \"Q\") {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = \"none\";\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = \"\";\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? \" \" : \"\") + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== \"Q\") {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? \" \" : \"\") + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? \" \" : \"\") + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? \"full\" : \"partial\";\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === \"M\" ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== \"G\") {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n timeFormat: \"tod\",\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Fault Log Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/FR');\n\n if(parts.length > 1){\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for(let i=1; i<fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0,20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0,12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nimport * as zlib from \"minizlib\";\nimport { Buffer } from 'node:buffer';\n\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = Buffer.from(data, 'base64');\n const decompress = new zlib.Inflate({});\n decompress.write(compressedBuffer);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n const result = decompress.read();\n const jsonText = result?.toString() || '';\n \n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA' ,\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_H1_Slash extends DecoderPlugin {\n name = 'label-h1-slash';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n preambles: ['/']\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n \n const checksum = message.text.slice(-4);\n const data = message.text.slice(0, message.text.length - 4);\n\n const fields = data.split('/');\n\n if(fields[0] !== '') {\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const headerData = fields[1].split('.');\n ResultFormatter.unknown(decodeResult, headerData[0]);\n if(headerData[1] === 'POS' && fields[2].startsWith('TS') && fields[2].length > 15) {\n // variant 3 hack\n // rip out the timestamp and process the rest\n H1Helper.processPosition(decodeResult, fields[2].substring(15).split(','));\n } else if(headerData[1] === 'POS') {\n // do nothing\n } else if(headerData[1].startsWith('POS')) {\n H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(','));\n } else {\n ResultFormatter.unknown(decodeResult, headerData[1], '.');\n }\n\n for(let i=2; i<fields.length; i++) {\n const field = fields[i];\n if(field.startsWith('TS')) {\n H1Helper.processTimeStamp(decodeResult, field.substring(2,15).split(','));\n } else if(field.startsWith('PS')) {\n H1Helper.processPS(decodeResult, field.substring(2).split(','));\n } else {\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n }\n\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.checksum(decodeResult, checksum);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? 'full' : 'partial';\n return decodeResult;\n }\n}","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)));\n ResultFormatter.position(decodeResult, { // Deg Min, no sec\n latitude: CoordinateUtils.getDirection(msg.substring(12,13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17))/60), \n longitude: CoordinateUtils.getDirection(msg.substring(17,18)) * (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23))/60)\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Warning Message';\n decodeResult.message = message;\n\n const parts = message.text.split('/WN');\n\n if(parts.length > 1){\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0,20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0,12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === \"LOCATION\") {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin/60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin/60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === \"43\") {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import * as Base85 from 'base85';\nimport * as zlib from \"minizlib\";\nimport { Buffer } from 'node:buffer';\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string,\n label: string,\n sublabel?: string,\n mfi?: string,\n text?: string,\n}\n\ninterface PduNonACARSData {\n appId?: string,\n text?: string,\n}\n\ninterface Pdu {\n version: MIAMVersion,\n crc: number,\n crcOk: boolean,\n complete: boolean,\n compression: number,\n encoding: number,\n msgNum: number,\n ackOptions: number,\n acars?: PduACARSData,\n non_acars?: PduNonACARSData,\n}\nconst isMIAMVersion= (x: number): x is MIAMVersion => Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid= (x: string): x is MIAMFid => Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp= (x: number): x is MIAMCoreApp => Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu= (x: number): x is MIAMCorePdu => Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<MIAMVersion, Record<MIAMCoreApp, number>> = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n }\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> = {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0]\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: 'Invalid body padding value: \\'' + bpad + '\\'',\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: 'Invalid header padding value: \\'' + txt[1] + '\\'',\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|')\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = Base85.decode('<~' + rawHdr + '~>', 'ascii85');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Buffer | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n body = Base85.decode('<~' + rawBody + '~>', 'ascii85') || undefined;\n if (body && body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = Buffer.from(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr.readUInt8(0) & 0xf;\n const pduType = (hdr.readUInt8(0) >> 4) & 0xf;\n\n if(isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler = this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error: 'Invalid version and PDU type combination: v=' + version + ', pdu=' + pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {return {decoded: false, error: 'File Transfer Request not implemented'}},\n [MIAMFid.FileTransferAccept]: () => {return {decoded: false, error: 'File Transfer Accept not implemented'}},\n [MIAMFid.FileSegment]: () => {return {decoded: false, error: 'File Segment not implemented'}},\n [MIAMFid.FileTransferAbort]: () => {return {decoded: false, error: 'File Transfer Abort not implemented'}},\n [MIAMFid.XOFFIndication]: () => {return {decoded: false, error: 'XOFF Indication not implemented'}},\n [MIAMFid.XONIndication]: () => {return {decoded: false, error: 'XON Indication not implemented'}},\n }\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\n 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\n 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\n 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\n 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,\n 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,\n 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\n 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\n 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\n 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\n 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\n 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\n 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\n 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc = (((crc << 8) >>> 0) ^ crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>> 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Buffer, seed?: number) {\n const crctable = [\n 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,\n 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,\n 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,\n 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,\n 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,\n 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,\n 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,\n 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,\n 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,\n 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,\n 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,\n 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,\n 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,\n 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,\n 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,\n 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,\n 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,\n 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,\n 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,\n 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,\n 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,\n 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,\n 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,\n 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,\n 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,\n 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,\n 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,\n 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,\n 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,\n 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,\n 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,\n 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,\n 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,\n 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,\n 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,\n 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,\n 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,\n 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,\n 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,\n 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,\n 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,\n 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,\n 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,\n 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,\n 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,\n 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,\n 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,\n 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,\n 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,\n 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,\n 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,\n 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,\n 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,\n 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,\n 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,\n 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,\n 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,\n 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,\n 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,\n 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,\n 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,\n 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,\n 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,\n 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc = (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if(isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n }else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n\n }\n\n private static corePduDataHandler(version: MIAMVersion, minHdrSize: number, crcLen: number, hdr: Buffer, body?: Buffer): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error: 'v' + version + ' header size too short; expected >= ' + minHdrSize + ', got ' + hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Buffer | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize = (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3);\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push('v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize);\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr.readUInt8(0) >> 1) & 0x7f;\n ackOptions = hdr.readUInt8(0) & 1;\n hdr = hdr.subarray(1);\n\n pduCompression = ((hdr.readUInt8(0) << 2) | ((hdr.readUInt8(1) >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr.readUInt8(1) >> 4) & 0x3;\n pduAppType = hdr.readUInt8(1) & 0xf;\n hdr = hdr.subarray(2)\n\n let appIdLen;\n if(isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (version === MIAMVersion.V2 && (pduAppType & 0x8) !== 0 && pduAppType !== 0xd) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS = ([\n MIAMCoreApp.ACARS2Char, MIAMCoreApp.ACARS4Char, MIAMCoreApp.ACARS6Char\n ].indexOf(pduAppType) >= 0);\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = hdr.subarray(0, appIdLen).toString('ascii')\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc = (hdr.readUInt8(0) << 24) | (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3); // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr.readUInt8(0) << 8) | hdr.readUInt8(1); // crc\n }\n hdr = hdr.subarray(crcLen)\n\n if (body !== undefined && body.length > 0) {\n if ([MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(pduCompression) >= 0) {\n try {\n const decompress = new zlib.InflateRaw({});\n decompress.write(body);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n pduData = decompress.read();\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if ([MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(pduCompression) >= 0) {\n pduData = body;\n } else {\n pduErrors.push('Unsupported v' + version + ' compression type: ' + pduCompression)\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<MIAMVersion, (buf: Buffer, seed?: number) => number> = {\n [MIAMVersion.V1]: (buf: Buffer, seed?: number) => { return ~this.arinc665Crc32(buf, seed); },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push('Body failed CRC check: provided=' + pduCrc + ', generated=' + crcCheck);\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n }\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = (appIdLen >= 4) ? pduAppId.substring(2, 4) : undefined;\n const mfi = (appIdLen >= 6) ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n }\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n }\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<MIAMVersion, Record<MIAMCorePdu, ((hdr: Buffer, body?: Buffer) => PduDecodingResult)>> = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(MIAMVersion.V1, 20, MIAMCoreV1CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: () => {return {decoded: false, error: 'v1 Ack PDU not implemented'}},\n [MIAMCorePdu.Aloha]: () => { return {decoded: false, error: 'v1 Aloha PDU not implemented'}},\n [MIAMCorePdu.AlohaReply]: () => {return {decoded: false, error: 'v1 AlohaReply PDU not implemented'}},\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(MIAMVersion.V2, 7, MIAMCoreV2CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: () => {return {decoded: false, error: 'v2 Ack PDU not implemented'}},\n [MIAMCorePdu.Aloha]: () => {return {decoded: false, error: 'v2 Aloha PDU not implemented'}},\n [MIAMCorePdu.AlohaReply]: () => {return {decoded: false, error: 'v2 Aloha reply PDU not implemented'}},\n }\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (miamResult.decoded &&\n miamResult.message.data !== undefined &&\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n miamResult.message.data.acars !== undefined) {\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if(miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);\n }\n if(miamResult.message.data.acars.tail) {\n ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);\n }\n\n const messageText = miamResult.message.data.acars.text;\n if(messageText) {\n const decoded = this.decoder.decode({\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n }, options);\n\n if(decoded.decoded) {\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = {...decodeResult.raw, ...decoded.raw};\n decodeResult.formatted.items.push(...decoded.formatted.items);\n } else {\n ResultFormatter.text(decodeResult, messageText);\n }\n // for existing unit tetsts - do we want to do this?\n message.text = messageText\n }\n\n // This is for the existing unit test, i don't know if we actually want to do this\n message.label = miamResult.message.data.acars.label;\n message.sublabel = miamResult.message.data.acars.sublabel;\n\n return decodeResult;\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = message.text.substring(1, 2);\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === '2') {\n const regex = /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude: (Number(result.groups.lat) / 100) * (result.groups.latd === 'S' ? -1 : 1),\n longitude: (Number(result.groups.lng) / 100) * (result.groups.lngd === 'W' ? -1 : 1)\n }\n }\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n decodeResult.formatted.description = 'Ground Station Squitter';\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: decodeResult.raw.version,\n }\n ];\n\n if (decodeResult.raw.groundStation) {\n if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`\n });\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text) \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text) \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text)\n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n \n ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === \"\\r\\n001FE\") {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin/60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin/60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n if (decodeResult.remaining.text !== \"---\") {\n ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + \"00\"));\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if(!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface'; // eslint-disable-line import/no-cycle\n\nimport * as Plugins from './plugins/official';\nimport { MIAMCoreUtils } from './utils/miam';\n\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n this.registerPlugin(new Plugins.Label_ColonComma(this));\n this.registerPlugin(new Plugins.Label_5Z_Slash(this));\n this.registerPlugin(new Plugins.Label_10_LDR(this));\n this.registerPlugin(new Plugins.Label_10_POS(this));\n this.registerPlugin(new Plugins.Label_10_Slash(this));\n this.registerPlugin(new Plugins.Label_12_N_Space(this));\n this.registerPlugin(new Plugins.Label_12_POS(this));\n this.registerPlugin(new Plugins.Label_13Through18_Slash(this));\n this.registerPlugin(new Plugins.Label_15(this));\n this.registerPlugin(new Plugins.Label_15_FST(this));\n this.registerPlugin(new Plugins.Label_16_Honeywell(this));\n this.registerPlugin(new Plugins.Label_16_N_Space(this));\n this.registerPlugin(new Plugins.Label_16_POSA1(this));\n this.registerPlugin(new Plugins.Label_16_TOD(this));\n this.registerPlugin(new Plugins.Label_1J_2J_FTX(this));\n this.registerPlugin(new Plugins.Label_1L_3Line(this));\n this.registerPlugin(new Plugins.Label_1L_070(this));\n this.registerPlugin(new Plugins.Label_1L_660(this));\n this.registerPlugin(new Plugins.Label_1L_Slash(this));\n this.registerPlugin(new Plugins.Label_20_POS(this));\n this.registerPlugin(new Plugins.Label_21_POS(this));\n this.registerPlugin(new Plugins.Label_22_OFF(this));\n this.registerPlugin(new Plugins.Label_22_POS(this));\n this.registerPlugin(new Plugins.Label_24_Slash(this));\n this.registerPlugin(new Plugins.Label_2P_FM3(this));\n this.registerPlugin(new Plugins.Label_2P_FM4(this));\n this.registerPlugin(new Plugins.Label_2P_FM5(this));\n this.registerPlugin(new Plugins.Label_2P_POS(this));\n this.registerPlugin(new Plugins.Label_30_Slash_EA(this));\n this.registerPlugin(new Plugins.Label_44_ETA(this));\n this.registerPlugin(new Plugins.Label_44_IN(this));\n this.registerPlugin(new Plugins.Label_44_OFF(this));\n this.registerPlugin(new Plugins.Label_44_ON(this));\n this.registerPlugin(new Plugins.Label_44_POS(this));\n this.registerPlugin(new Plugins.Label_44_Slash(this));\n this.registerPlugin(new Plugins.Label_4A(this));\n this.registerPlugin(new Plugins.Label_4A_01(this));\n this.registerPlugin(new Plugins.Label_4A_DIS(this));\n this.registerPlugin(new Plugins.Label_4A_DOOR(this));\n this.registerPlugin(new Plugins.Label_4A_Slash_01(this));\n this.registerPlugin(new Plugins.Label_4J_POS(this));\n this.registerPlugin(new Plugins.Label_4N(this));\n this.registerPlugin(new Plugins.Label_4T_AGFSR(this));\n this.registerPlugin(new Plugins.Label_4T_ETA(this));\n this.registerPlugin(new Plugins.Label_B6_Forwardslash(this));\n this.registerPlugin(new Plugins.Label_H2_02E(this));\n this.registerPlugin(new Plugins.Label_H1_FLR(this));\n this.registerPlugin(new Plugins.Label_H1_OHMA(this));\n this.registerPlugin(new Plugins.Label_H1_WRN(this));\n this.registerPlugin(new Plugins.Label_H1(this));\n this.registerPlugin(new Plugins.Label_H1_Slash(this));\n this.registerPlugin(new Plugins.Label_H1_StarPOS(this));\n this.registerPlugin(new Plugins.Label_HX(this));\n this.registerPlugin(new Plugins.Label_58(this));\n this.registerPlugin(new Plugins.Label_80(this));\n this.registerPlugin(new Plugins.Label_83(this));\n this.registerPlugin(new Plugins.Label_8E(this));\n this.registerPlugin(new Plugins.Label_1M_Slash(this));\n this.registerPlugin(new Plugins.Label_MA(this));\n this.registerPlugin(new Plugins.Label_SQ(this));\n this.registerPlugin(new Plugins.Label_QP(this));\n this.registerPlugin(new Plugins.Label_QQ(this));\n this.registerPlugin(new Plugins.Label_QR(this));\n this.registerPlugin(new Plugins.Label_QS(this));\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n const pluginInstance = plugin;\n // plugin.onRegister(this.store);\n this.plugins.push(plugin);\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n // console.log('All plugins');\n // console.log(this.plugins);\n const usablePlugins = this.plugins.filter((plugin) => {\n const qualifiers = plugin.qualifiers();\n\n if (qualifiers.labels.includes(message.label)) {\n if (qualifiers.preambles && qualifiers.preambles.length > 0) {\n const matching = qualifiers.preambles.filter((preamble: string) => { // eslint-disable-line arrow-body-style,max-len\n // console.log(message.text.substring(0, preamble.length));\n // console.log(preamble);\n return message.text.substring(0, preamble.length) === preamble;\n });\n // console.log(matching);\n return matching.length >= 1;\n } else { // eslint-disable-line no-else-return\n return true;\n }\n }\n\n return false;\n });\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(usablePlugins);\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: message.text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n // for-in is not happy. doing it the old way\n for (let i = 0; i < usablePlugins.length; i++) {\n const plugin = usablePlugins[i];\n result = plugin.decode(message);\n if (result.decoded) {\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n}\n"],"mappings":"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MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1D;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aAAS,OAAO,MAAO,IAAK,UAAY,QAAQ,IAAK,IAAI,UAAU,CAAC,OAAO,IAAK,GAAI,OAAO;AAAA,IAC7F;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAa,MAAe;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA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","names":["data","Buffer","zlib","Buffer","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp","Buffer"]}