diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index a677f1135..6bb6cf6e1 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -3238,13 +3238,13 @@ do -- SET_STATIC self:F3( { Event } ) if Event.IniObjectCategory == Object.Category.STATIC then - if not self.Database[Event.IniDCSStaticName] then - self.Database[Event.IniDCSStaticName] = STATIC:Register( Event.IniDCSStaticName ) - self:T3( self.Database[Event.IniDCSStaticName] ) + if not self.Database[Event.IniDCSUnitName] then + self.Database[Event.IniDCSUnitName] = STATIC:Register( Event.IniDCSUnitName ) + self:T3( self.Database[Event.IniDCSUnitName] ) end end - return Event.IniDCSStaticName, self.Database[Event.IniDCSStaticName] + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end --- Handles the Database to check on any event that Object exists in the Database. @@ -3254,10 +3254,10 @@ do -- SET_STATIC -- @return #string The name of the STATIC -- @return #table The STATIC function SET_STATIC:FindInDatabase( Event ) - self:F2( { Event.IniDCSStaticName, self.Set[Event.IniDCSStaticName], Event } ) + self:F2( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) - return Event.IniDCSStaticName, self.Set[Event.IniDCSStaticName] + return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] end diff --git a/Moose Development/Moose/Ops/ATIS.lua b/Moose Development/Moose/Ops/ATIS.lua index 23b0c014e..15e37ed47 100644 --- a/Moose Development/Moose/Ops/ATIS.lua +++ b/Moose Development/Moose/Ops/ATIS.lua @@ -67,8 +67,10 @@ -- @field #number subduration Duration how long subtitles are displayed in seconds. -- @field #boolean metric If true, use metric units. If false, use imperial (default). -- @field #boolean PmmHg If true, give pressure in millimeters of Mercury. Default is inHg for imperial and hecto Pascal (=mili Bars) for metric units. +-- @field #boolean qnhonly If true, suppresses reporting QFE. Default is to report both QNH and QFE. -- @field #boolean TDegF If true, give temperature in degrees Fahrenheit. Default is in degrees Celsius independent of chosen unit system. -- @field #number zuludiff Time difference local vs. zulu in hours. +-- @field #boolean zulutimeonly If true, suppresses report of local time, sunrise, and sunset. -- @field #number magvar Magnetic declination/variation at the airport in degrees. -- @field #table ils Table of ILS frequencies (can be runway specific). -- @field #table ndbinner Table of inner NDB frequencies (can be runway specific). @@ -302,8 +304,10 @@ ATIS = { subduration = nil, metric = nil, PmmHg = nil, + qnhonly = false, TDegF = nil, zuludiff = nil, + zulutimeonly = false, magvar = nil, ils = {}, ndbinner = {}, @@ -362,11 +366,32 @@ ATIS.Alphabet = { -- @field #number Nevada +12° (East). -- @field #number Normandy -10° (West). -- @field #number PersianGulf +2° (East). +-- @field #number TheChannel -10° (West). +-- @field #number Syria +5° (East). ATIS.RunwayM2T={ Caucasus=0, Nevada=12, - Normany=-10, + Normandy=-10, PersianGulf=2, + TheChannel=-10, + Syria=5, +} + +--- Whether ICAO phraseology is used for ATIS broadcasts. +-- @type ATIS.ICAOPhraseology +-- @field #boolean Caucasus true. +-- @field #boolean Nevada false. +-- @field #boolean Normandy true. +-- @field #boolean PersianGulf true. +-- @field #boolean TheChannel true. +-- @field #boolean Syria true. +ATIS.ICAOPhraseology={ + Caucasus=true, + Nevada=false, + Normandy=true, + PersianGulf=true, + TheChannel=true, + Syria=true, } --- Nav point data. @@ -415,6 +440,7 @@ ATIS.RunwayM2T={ -- @field #ATIS.Soundfile MegaHertz -- @field #ATIS.Soundfile Meters -- @field #ATIS.Soundfile MetersPerSecond +-- @field #ATIS.Soundfile Miles -- @field #ATIS.Soundfile MillimetersOfMercury -- @field #ATIS.Soundfile N0 -- @field #ATIS.Soundfile N1 @@ -487,6 +513,7 @@ ATIS.Sound = { MegaHertz={filename="MegaHertz.ogg", duration=0.87}, Meters={filename="Meters.ogg", duration=0.59}, MetersPerSecond={filename="MetersPerSecond.ogg", duration=1.14}, + Miles={filename="Miles.ogg", duration=1.04}, MillimetersOfMercury={filename="MillimetersOfMercury.ogg", duration=1.53}, Minus={filename="Minus.ogg", duration=0.64}, N0={filename="N-0.ogg", duration=0.55}, @@ -535,7 +562,7 @@ _ATIS={} --- ATIS class version. -- @field #string version -ATIS.version="0.8.0" +ATIS.version="0.9.0" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -898,6 +925,14 @@ function ATIS:SetAltimeterQNH(switch) return self end +-- Suppresses QFE readout. Default is to report both QNH and QFE. +-- @param #ATIS self +-- @return #ATIS self +function ATIS:ReportQNHOnly() + self.qnhonly=true + return self +end + --- Set magnetic declination/variation at the airport. -- -- Default is per map: @@ -960,6 +995,14 @@ function ATIS:SetZuluTimeDifference(delta) return self end +-- Suppresses local time, sunrise, and sunset. Default is to report all these times. +-- @param #ATIS self +-- @return #ATIS self +function ATIS:ReportZuluTimeOnly() + self.zulutimeonly=true + return self +end + --- Add ILS station. Note that this can be runway specific. -- @param #ATIS self -- @param #number frequency ILS frequency in MHz. @@ -1354,13 +1397,24 @@ function ATIS:onafterBroadcast(From, Event, To) visibilitymin=dust end end + + local VISIBILITY="" - -- Visibility in NM. - local VISIBILITY=string.format("%d", UTILS.Round(UTILS.MetersToNM(visibilitymin))) - - -- Visibility in km. if self.metric then - VISIBILITY=string.format("%d", UTILS.Round(visibilitymin/1000)) + -- Visibility in km. + local reportedviz=UTILS.Round(visibilitymin/1000) + -- max reported visibility 9999 m + if reportedviz > 10 then + reportedviz=10 + end + VISIBILITY=string.format("%d", reportedviz) + else + -- max reported visibility 10 NM + local reportedviz=UTILS.Round(UTILS.MetersToSM(visibilitymin)) + if reportedviz > 10 then + reportedviz=10 + end + VISIBILITY=string.format("%d", reportedviz) end -------------- @@ -1450,72 +1504,63 @@ function ATIS:onafterBroadcast(From, Event, To) self.radioqueue:Number2Transmission(ZULU, nil, 0.5) self:Transmission(ATIS.Sound.TimeZulu, 0.2, subtitle) alltext=alltext..";\n"..subtitle + + if not self.zulutimeonly then - -- Sunrise Time - subtitle=string.format("Sunrise at %s local time", SUNRISE) - self:Transmission(ATIS.Sound.SunriseAt, 0.5, subtitle) - self.radioqueue:Number2Transmission(SUNRISE, nil, 0.2) - self:Transmission(ATIS.Sound.TimeLocal, 0.2) - alltext=alltext..";\n"..subtitle - - -- Sunset Time - subtitle=string.format("Sunset at %s local time", SUNSET) - self:Transmission(ATIS.Sound.SunsetAt, 0.5, subtitle) - self.radioqueue:Number2Transmission(SUNSET, nil, 0.5) - self:Transmission(ATIS.Sound.TimeLocal, 0.2) + -- Sunrise Time + subtitle=string.format("Sunrise at %s local time", SUNRISE) + self:Transmission(ATIS.Sound.SunriseAt, 0.5, subtitle) + self.radioqueue:Number2Transmission(SUNRISE, nil, 0.2) + self:Transmission(ATIS.Sound.TimeLocal, 0.2) + alltext=alltext..";\n"..subtitle + + -- Sunset Time + subtitle=string.format("Sunset at %s local time", SUNSET) + self:Transmission(ATIS.Sound.SunsetAt, 0.5, subtitle) + self.radioqueue:Number2Transmission(SUNSET, nil, 0.5) + self:Transmission(ATIS.Sound.TimeLocal, 0.2) + alltext=alltext..";\n"..subtitle + end + + -- Wind + if self.metric then + subtitle=string.format("Wind from %s at %s m/s", WINDFROM, WINDSPEED) + else + subtitle=string.format("Wind from %s at %s knots", WINDFROM, WINDSPEED) + end + if turbulence>0 then + subtitle=subtitle..", gusting" + end + local _WIND=subtitle + self:Transmission(ATIS.Sound.WindFrom, 1.0, subtitle) + self.radioqueue:Number2Transmission(WINDFROM) + self:Transmission(ATIS.Sound.At, 0.2) + self.radioqueue:Number2Transmission(WINDSPEED) + if self.metric then + self:Transmission(ATIS.Sound.MetersPerSecond, 0.2) + else + self:Transmission(ATIS.Sound.Knots, 0.2) + end + if turbulence>0 then + self:Transmission(ATIS.Sound.Gusting, 0.2) + end alltext=alltext..";\n"..subtitle -- Visibility if self.metric then subtitle=string.format("Visibility %s km", VISIBILITY) else - subtitle=string.format("Visibility %s NM", VISIBILITY) + subtitle=string.format("Visibility %s SM", VISIBILITY) end self:Transmission(ATIS.Sound.Visibilty, 1.0, subtitle) self.radioqueue:Number2Transmission(VISIBILITY) if self.metric then self:Transmission(ATIS.Sound.Kilometers, 0.2) else - self:Transmission(ATIS.Sound.NauticalMiles, 0.2) + self:Transmission(ATIS.Sound.Miles, 0.2) end alltext=alltext..";\n"..subtitle - - -- Cloud base - self:Transmission(CloudCover, 1.0, CLOUDSsub) - if CLOUDBASE and static then - -- Base - if self.metric then - subtitle=string.format("Cloudbase %s, ceiling %s meters", CLOUDBASE, CLOUDCEIL) - else - subtitle=string.format("Cloudbase %s, ceiling %s ft", CLOUDBASE, CLOUDCEIL) - end - self:Transmission(ATIS.Sound.CloudBase, 1.0, subtitle) - if tonumber(CLOUDBASE1000)>0 then - self.radioqueue:Number2Transmission(CLOUDBASE1000) - self:Transmission(ATIS.Sound.Thousand, 0.1) - end - if tonumber(CLOUDBASE0100)>0 then - self.radioqueue:Number2Transmission(CLOUDBASE0100) - self:Transmission(ATIS.Sound.Hundred, 0.1) - end - -- Ceiling - self:Transmission(ATIS.Sound.CloudCeiling, 0.5) - if tonumber(CLOUDCEIL1000)>0 then - self.radioqueue:Number2Transmission(CLOUDCEIL1000) - self:Transmission(ATIS.Sound.Thousand, 0.1) - end - if tonumber(CLOUDCEIL0100)>0 then - self.radioqueue:Number2Transmission(CLOUDCEIL0100) - self:Transmission(ATIS.Sound.Hundred, 0.1) - end - if self.metric then - self:Transmission(ATIS.Sound.Meters, 0.1) - else - self:Transmission(ATIS.Sound.Feet, 0.1) - end - end - alltext=alltext..";\n"..subtitle - + -- Weather phenomena local wp=false local wpsub="" @@ -1571,37 +1616,42 @@ function ATIS:onafterBroadcast(From, Event, To) alltext=alltext..";\n"..subtitle end - -- Altimeter QNH/QFE. - if self.PmmHg then - subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s mmHg", QNH[1], QNH[2], QFE[1], QFE[2]) - else + -- Cloud base + self:Transmission(CloudCover, 1.0, CLOUDSsub) + if CLOUDBASE and static then + -- Base if self.metric then - subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s hPa", QNH[1], QNH[2], QFE[1], QFE[2]) + subtitle=string.format("Cloudbase %s, ceiling %s meters", CLOUDBASE, CLOUDCEIL) else - subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s inHg", QNH[1], QNH[2], QFE[1], QFE[2]) + subtitle=string.format("Cloudbase %s, ceiling %s ft", CLOUDBASE, CLOUDCEIL) + end + self:Transmission(ATIS.Sound.CloudBase, 1.0, subtitle) + if tonumber(CLOUDBASE1000)>0 then + self.radioqueue:Number2Transmission(CLOUDBASE1000) + self:Transmission(ATIS.Sound.Thousand, 0.1) + end + if tonumber(CLOUDBASE0100)>0 then + self.radioqueue:Number2Transmission(CLOUDBASE0100) + self:Transmission(ATIS.Sound.Hundred, 0.1) + end + -- Ceiling + self:Transmission(ATIS.Sound.CloudCeiling, 0.5) + if tonumber(CLOUDCEIL1000)>0 then + self.radioqueue:Number2Transmission(CLOUDCEIL1000) + self:Transmission(ATIS.Sound.Thousand, 0.1) + end + if tonumber(CLOUDCEIL0100)>0 then + self.radioqueue:Number2Transmission(CLOUDCEIL0100) + self:Transmission(ATIS.Sound.Hundred, 0.1) end - end - local _ALTIMETER=subtitle - self:Transmission(ATIS.Sound.Altimeter, 1.0, subtitle) - self:Transmission(ATIS.Sound.QNH, 0.5) - self.radioqueue:Number2Transmission(QNH[1]) - self:Transmission(ATIS.Sound.Decimal, 0.2) - self.radioqueue:Number2Transmission(QNH[2]) - self:Transmission(ATIS.Sound.QFE, 0.75) - self.radioqueue:Number2Transmission(QFE[1]) - self:Transmission(ATIS.Sound.Decimal, 0.2) - self.radioqueue:Number2Transmission(QFE[2]) - if self.PmmHg then - self:Transmission(ATIS.Sound.MillimetersOfMercury, 0.1) - else if self.metric then - self:Transmission(ATIS.Sound.HectoPascal, 0.1) + self:Transmission(ATIS.Sound.Meters, 0.1) else - self:Transmission(ATIS.Sound.InchesOfMercury, 0.1) + self:Transmission(ATIS.Sound.Feet, 0.1) end end alltext=alltext..";\n"..subtitle - + -- Temperature if self.TDegF then if temperature<0 then @@ -1628,7 +1678,7 @@ function ATIS:onafterBroadcast(From, Event, To) self:Transmission(ATIS.Sound.DegreesCelsius, 0.2) end alltext=alltext..";\n"..subtitle - + -- Dew point if self.TDegF then if dewpoint<0 then @@ -1656,27 +1706,57 @@ function ATIS:onafterBroadcast(From, Event, To) end alltext=alltext..";\n"..subtitle - -- Wind - if self.metric then - subtitle=string.format("Wind from %s at %s m/s", WINDFROM, WINDSPEED) + -- Altimeter QNH/QFE. + if self.PmmHg then + if self.qnhonly then + subtitle=string.format("Altimeter %s.%s mmHg", QNH[1], QNH[2]) + else + subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s mmHg", QNH[1], QNH[2], QFE[1], QFE[2]) + end else - subtitle=string.format("Wind from %s at %s knots", WINDFROM, WINDSPEED) + if self.metric then + if self.qnhonly then + subtitle=string.format("Altimeter %s.%s hPa", QNH[1], QNH[2]) + else + subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s hPa", QNH[1], QNH[2], QFE[1], QFE[2]) + end + else + if self.qnhonly then + subtitle=string.format("Altimeter %s.%s inHg", QNH[1], QNH[2]) + else + subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s inHg", QNH[1], QNH[2], QFE[1], QFE[2]) + end + end end - if turbulence>0 then - subtitle=subtitle..", gusting" + local _ALTIMETER=subtitle + self:Transmission(ATIS.Sound.Altimeter, 1.0, subtitle) + if not self.qnhonly then + self:Transmission(ATIS.Sound.QNH, 0.5) end - local _WIND=subtitle - self:Transmission(ATIS.Sound.WindFrom, 1.0, subtitle) - self.radioqueue:Number2Transmission(WINDFROM) - self:Transmission(ATIS.Sound.At, 0.2) - self.radioqueue:Number2Transmission(WINDSPEED) - if self.metric then - self:Transmission(ATIS.Sound.MetersPerSecond, 0.2) + self.radioqueue:Number2Transmission(QNH[1]) + + if ATIS.ICAOPhraseology[UTILS.GetDCSMap()] then + self:Transmission(ATIS.Sound.Decimal, 0.2) + end + self.radioqueue:Number2Transmission(QNH[2]) + + if not self.qnhonly then + self:Transmission(ATIS.Sound.QFE, 0.75) + self.radioqueue:Number2Transmission(QFE[1]) + if ATIS.ICAOPhraseology[UTILS.GetDCSMap()] then + self:Transmission(ATIS.Sound.Decimal, 0.2) + end + self.radioqueue:Number2Transmission(QFE[2]) + end + + if self.PmmHg then + self:Transmission(ATIS.Sound.MillimetersOfMercury, 0.1) else - self:Transmission(ATIS.Sound.Knots, 0.2) - end - if turbulence>0 then - self:Transmission(ATIS.Sound.Gusting, 0.2) + if self.metric then + self:Transmission(ATIS.Sound.HectoPascal, 0.1) + else + self:Transmission(ATIS.Sound.InchesOfMercury, 0.1) + end end alltext=alltext..";\n"..subtitle diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index ece8a111b..354a89221 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -49,12 +49,14 @@ BIGSMOKEPRESET = { -- @field #string NTTR Nevada Test and Training Range map. -- @field #string PersianGulf Persian Gulf map. -- @field #string TheChannel The Channel map. +-- @field #string Syria Syria map. DCSMAP = { Caucasus="Caucasus", NTTR="Nevada", Normandy="Normandy", PersianGulf="PersianGulf", TheChannel="TheChannel", + Syria="Syria", } @@ -313,6 +315,10 @@ UTILS.MetersToNM = function(meters) return meters/1852 end +UTILS.MetersToSM = function(meters) + return meters/1609.34 +end + UTILS.MetersToFeet = function(meters) return meters/0.3048 end @@ -1117,7 +1123,9 @@ function UTILS.GetMagneticDeclination(map) elseif map==DCSMAP.PersianGulf then declination=2 elseif map==DCSMAP.TheChannel then - declination=-10 + declination=-10 + elseif map==DCSMAP.Syria then + declination=5 else declination=0 end @@ -1244,6 +1252,8 @@ function UTILS.GMTToLocalTimeDifference() return 0 -- Calais UTC+1 hour elseif theatre==DCSMAP.TheChannel then return 2 -- This map currently needs +2 + elseif theatre==DCSMAP.Syria then + return 3 -- Damascus is UTC+3 hours else BASE:E(string.format("ERROR: Unknown Map %s in UTILS.GMTToLocal function. Returning 0", tostring(theatre))) return 0 diff --git a/Moose Development/Moose/Wrapper/Airbase.lua b/Moose Development/Moose/Wrapper/Airbase.lua index 9c5675c53..234a92533 100644 --- a/Moose Development/Moose/Wrapper/Airbase.lua +++ b/Moose Development/Moose/Wrapper/Airbase.lua @@ -315,6 +315,80 @@ AIRBASE.TheChannel = { ["High_Halden"] = "High Halden", } +--- Airbases of Syria +-- +-- * AIRBASE.Syria.Kuweires +-- * AIRBASE.Syria.Marj_Ruhayyil +-- * AIRBASE.Syria.Kiryat_Shmona +-- * AIRBASE.Syria.Marj_as_Sultan_North +-- * AIRBASE.Syria.Eyn_Shemer +-- * AIRBASE.Syria.Incirlik +-- * AIRBASE.Syria.Damascus +-- * AIRBASE.Syria.Bassel_Al_Assad +-- * AIRBASE.Syria.Aleppo +-- * AIRBASE.Syria.Qabr_as_Sitt +-- * AIRBASE.Syria.Wujah_Al_Hajar +-- * AIRBASE.Syria.Al_Dumayr +-- * AIRBASE.Syria.Hatay +-- * AIRBASE.Syria.Haifa +-- * AIRBASE.Syria.Khalkhalah +-- * AIRBASE.Syria.Megiddo +-- * AIRBASE.Syria.Rayak +-- * AIRBASE.Syria.Mezzeh +-- * AIRBASE.Syria.King_Hussein_Air_College +-- * AIRBASE.Syria.Jirah +-- * AIRBASE.Syria.Taftanaz +-- * AIRBASE.Syria.Rene_Mouawad +-- * AIRBASE.Syria.Ramat_David +-- * AIRBASE.Syria.Minakh +-- * AIRBASE.Syria.Adana_Sakirpasa +-- * AIRBASE.Syria.Marj_as_Sultan_South +-- * AIRBASE.Syria.Hama +-- * AIRBASE.Syria.Al_Qusayr +-- * AIRBASE.Syria.Palmyra +-- * AIRBASE.Syria.Tabqa +-- * AIRBASE.Syria.Beirut_Rafic_Hariri +-- * AIRBASE.Syria.An_Nasiriyah +-- * AIRBASE.Syria.Abu_al_Duhur +-- +-- @field Syria +AIRBASE.Syria={ + ["Kuweires"]="Kuweires", + ["Marj_Ruhayyil"]="Marj Ruhayyil", + ["Kiryat_Shmona"]="Kiryat Shmona", + ["Marj_as_Sultan_North"]="Marj as Sultan North", + ["Eyn_Shemer"]="Eyn Shemer", + ["Incirlik"]="Incirlik", + ["Damascus"]="Damascus", + ["Bassel_Al_Assad"]="Bassel Al-Assad", + ["Aleppo"]="Aleppo", + ["Qabr_as_Sitt"]="Qabr as Sitt", + ["Wujah_Al_Hajar"]="Wujah Al Hajar", + ["Al_Dumayr"]="Al-Dumayr", + ["Hatay"]="Hatay", + ["Haifa"]="Haifa", + ["Khalkhalah"]="Khalkhalah", + ["Megiddo"]="Megiddo", + ["Rayak"]="Rayak", + ["Mezzeh"]="Mezzeh", + ["King_Hussein_Air_College"]="King Hussein Air College", + ["Jirah"]="Jirah", + ["Taftanaz"]="Taftanaz", + ["Rene_Mouawad"]="Rene Mouawad", + ["Ramat_David"]="Ramat David", + ["Minakh"]="Minakh", + ["Adana_Sakirpasa"]="Adana Sakirpasa", + ["Marj_as_Sultan_South"]="Marj as Sultan South", + ["Hama"]="Hama", + ["Al_Qusayr"]="Al Qusayr", + ["Palmyra"]="Palmyra", + ["Tabqa"]="Tabqa", + ["Beirut_Rafic_Hariri"]="Beirut-Rafic Hariri", + ["An_Nasiriyah"]="An Nasiriyah", + ["Abu_al_Duhur"]="Abu al-Duhur", +} + + --- AIRBASE.ParkingSpot ".Coordinate, ".TerminalID", ".TerminalType", ".TOAC", ".Free", ".TerminalID0", ".DistToRwy". -- @type AIRBASE.ParkingSpot -- @field Core.Point#COORDINATE Coordinate Coordinate of the parking spot. diff --git a/README.md b/README.md index de1c7817f..7ba71d91c 100644 --- a/README.md +++ b/README.md @@ -73,19 +73,7 @@ MOOSE has a living (chat and video) community of users, beta testers and contrib - -# [Please DONATE ...](https://donorbox.org/fund-github-subscriptionfor-moose) - -If you appreciate this development, please support to extend the framework. The development of this framework takes a lot of time. -A small gift would help me to buy a new small laptop that I can use to extend this framework while commuting to and from work ... -Also, your donations will be saved and spent wisely to the advantage of the community! - -If everyone helps with a small amount, it would be really great! - -Donate - - Kind regards, FlightControl (FC) - \ No newline at end of file +