diff --git a/ModSim.sln b/ModSim.sln new file mode 100644 index 0000000..86b6676 --- /dev/null +++ b/ModSim.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34616.47 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModSim", "Source\ModSim.csproj", "{38E5D197-82BB-42DE-83F8-9D550D09BCDC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6433F537-FF66-4873-9EF1-DD21CA75C863} + EndGlobalSection +EndGlobal diff --git a/Source/App.config b/Source/App.config new file mode 100644 index 0000000..f3ccc49 --- /dev/null +++ b/Source/App.config @@ -0,0 +1,87 @@ + + + + +
+ + + + + + + + + True + + + 29999 + + + 28888 + + + True + + + 0 + + + 0 + + + en + + + Default + + + 0 + + + 0 + + + + + + False + + + False + + + True + + + True + + + True + + + 192 + + + 168 + + + 1 + + + 127 + + + 255 + + + 255 + + + 255 + + + + + + + diff --git a/Source/Classes/CGLM.cs b/Source/Classes/CGLM.cs new file mode 100644 index 0000000..5880977 --- /dev/null +++ b/Source/Classes/CGLM.cs @@ -0,0 +1,233 @@ +using System; +using System.Windows.Forms; + +namespace AgTwo +{ + public static class NudChk + { + public static bool CheckValue(this NumericUpDown numericUpDown, ref decimal value) + { + if (value < numericUpDown.Minimum) + { + value = numericUpDown.Minimum; + MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name + + " \n\rMinimum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File", + "Critical Settings Warning", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return true; + } + else if (value > numericUpDown.Maximum) + { + value = numericUpDown.Maximum; + MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name + + " \n\rMaximum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File", + "Critical Settings Warning", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return true; + } + + //value is ok + return false; + } + + public static bool CheckValueCm(this NumericUpDown numericUpDown, ref double value) + { + //convert to cm + value *= 100; + bool isChanged = false; + + if (value < (double)numericUpDown.Minimum) + { + value = (double)numericUpDown.Minimum / 2.4; + MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name + + " \n\rMinimum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File", + "Critical Settings Warning", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + isChanged = true; + } + else if (value > (double)numericUpDown.Maximum) + { + value = (double)numericUpDown.Maximum / 2.6; + MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name + + " \n\rMaximum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File", + "Critical Settings Warning", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + isChanged = true; + } + + //revert back to meters + value *= 0.01; + + //value is ok + return isChanged; + } + } + + public static class glm + { + public static byte[] Combine(byte[] first, byte[] second) + { + byte[] ret = new byte[first.Length + second.Length]; + Buffer.BlockCopy(first, 0, ret, 0, first.Length); + Buffer.BlockCopy(second, 0, ret, first.Length, second.Length); + return ret; + } + + //Regex file expression + public const string fileRegex = "(^(PRN|AUX|NUL|CON|COM[1-9]|LPT[1-9]|(\\.+)$)(\\..*)?$)|(([\\x00-\\x1f\\\\?*:\";‌​|/<>])+)|([\\.]+)"; + + //inches to meters + public const double in2m = 0.0254; + + //meters to inches + public const double m2in = 39.3701; + + //meters to feet + public const double m2ft = 3.28084; + + //Hectare to Acres + public const double ha2ac = 2.47105; + + //Acres to Hectare + public const double ac2ha = 0.404686; + + //Meters to Acres + public const double m2ac = 0.000247105; + + //Meters to Hectare + public const double m2ha = 0.0001; + + // liters per hectare to us gal per acre + public const double galAc2Lha = 9.35396; + + //us gal per acre to liters per hectare + public const double LHa2galAc = 0.106907; + + //Liters to Gallons + public const double L2Gal = 0.264172; + + //Gallons to Liters + public const double Gal2L = 3.785412534258; + + //the pi's + public const double twoPI = 6.28318530717958647692; + + public const double PIBy2 = 1.57079632679489661923; + + + + + //Degrees Radians Conversions + public static double toDegrees(double radians) + { + return radians * 57.295779513082325225835265587528; + } + + public static double toRadians(double degrees) + { + return degrees * 0.01745329251994329576923690768489; + } + + //Distance calcs of all kinds + public static double Distance(double east1, double north1, double east2, double north2) + { + return Math.Sqrt( + Math.Pow(east1 - east2, 2) + + Math.Pow(north1 - north2, 2)); + } + + public static double DistanceLonLat(double lon1, double lat1, double lon2, double lat2) + { + const int EarthMeanRadius = 6371; + + double dlon = toRadians(lon2 - lon1); + double dlat = toRadians(lat2 - lat1); + + double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(toRadians(lat1)) * Math.Cos(toRadians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2)); + double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); + return angle * EarthMeanRadius; + } + + //float functions + public static float acos(float x) + { + return (float)Math.Acos(x); + } + + public static float acosh(float x) + { + if (x < 1f) return 0f; + return (float)Math.Log(x + Math.Sqrt((x * x) - 1f)); + } + + public static float asin(float x) + { + return (float)Math.Asin(x); + } + + public static float asinh(float x) + { + return (x < 0f ? -1f : (x > 0f ? 1f : 0f)) * (float)Math.Log(Math.Abs(x) + Math.Sqrt(1f + (x * x))); + } + + public static float atan(float y, float x) + { + return (float)Math.Atan2(y, x); + } + + public static float atan(float y_over_x) + { + return (float)Math.Atan(y_over_x); + } + + public static float atanh(float x) + { + if (Math.Abs(x) >= 1f) return 0; + return 0.5f * (float)Math.Log((1f + x) / (1f - x)); + } + + public static float cos(float angle) + { + return (float)Math.Cos(angle); + } + + public static float cosh(float angle) + { + return (float)Math.Cosh(angle); + } + + public static float toDegrees(float radians) + { + return radians * 57.295779513082325225835265587528f; + } + + public static float toRadians(float degrees) + { + return degrees * 0.01745329251994329576923690766743f; + } + + public static float sin(float angle) + { + return (float)Math.Sin(angle); + } + + public static float sinh(float angle) + { + return (float)Math.Sinh(angle); + } + + public static float tan(float angle) + { + return (float)Math.Tan(angle); + } + + public static float tanh(float angle) + { + return (float)Math.Tanh(angle); + } + } +} \ No newline at end of file diff --git a/Source/Classes/CSettings.cs b/Source/Classes/CSettings.cs new file mode 100644 index 0000000..6546918 --- /dev/null +++ b/Source/Classes/CSettings.cs @@ -0,0 +1,61 @@ +using System; +using System.Configuration; +using System.IO; +using System.Linq; +using System.Xml.Linq; +using System.Xml.XPath; + + +namespace AgTwo +{ + public static class SettingsIO + { + /// + /// Import an XML and save to 1 section of user.config + /// + /// Either Settings or Vehicle or Tools + /// Usually Documents.Drive.Folder + internal static void ImportSettings(string settingsFilePath) + { + if (!File.Exists(settingsFilePath)) + { + throw new FileNotFoundException(); + } + + //var appSettings = Properties.Settings.Default; + try + { + Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); + + string sectionName = ""; + + sectionName = Properties.Settings.Default.Context["GroupName"].ToString(); + + XDocument document = XDocument.Load(Path.Combine(settingsFilePath)); + string settingsSection = document.XPathSelectElements($"//{sectionName}").Single().ToString(); + config.GetSectionGroup("userSettings").Sections[sectionName].SectionInformation.SetRawXml(settingsSection); + config.Save(ConfigurationSaveMode.Modified); + + { + Properties.Settings.Default.Reload(); + } + } + catch (Exception) // Should make this more specific + { + // Could not import settings. + { + Properties.Settings.Default.Reload(); + } + } + } + + internal static void ExportSettings(string settingsFilePath) + { + Properties.Settings.Default.Save(); + + //Export the entire settings as an xml + Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); + config.SaveAs(settingsFilePath); + } + } +} diff --git a/Source/Forms/Controls.Designer.cs b/Source/Forms/Controls.Designer.cs new file mode 100644 index 0000000..403929f --- /dev/null +++ b/Source/Forms/Controls.Designer.cs @@ -0,0 +1,454 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; +using System.Globalization; + +namespace AgTwo +{ + public partial class FormLoop + { + private string TimeNow = ""; + + //Our two new nmea strings + private readonly StringBuilder sbOGI = new StringBuilder(); + private readonly StringBuilder sbNDA = new StringBuilder(); + + private readonly StringBuilder sbHDT = new StringBuilder(); + private readonly StringBuilder sbRMC = new StringBuilder(); + + private readonly StringBuilder sbGGA = new StringBuilder(); + private readonly StringBuilder sbVTG = new StringBuilder(); + private readonly StringBuilder sbAVR = new StringBuilder(); + private readonly StringBuilder sbKSXT = new StringBuilder(); + + //The entire string to send out + private readonly StringBuilder sbSendText = new StringBuilder(); + + //GPS related properties + private readonly int fixQuality = 8, sats = 12; + + private readonly double HDOP = 0.9; + public double altitude = 300; + private char EW = 'W'; + private char NS = 'N'; + + public double latitude, longitude; + + private double latDeg, latMinu, longDeg, longMinu, latNMEA, longNMEA; + public double speed = 0.6, headingTrue, stepDistance = 0.05, steerAngle; + private double degrees, roll = 0; + + private int rollIMU = 1, headingIMU = 0, pitchIMU = 0; + + private const double ToRadians = 0.01745329251994329576923690768489, ToDegrees = 57.295779513082325225835265587528; + + //The checksum of an NMEA line + private string sumStr = ""; + + private void simTimer_Tick(object sender, EventArgs e) + { + stepDistance = tbarSpeed.Value * 0.027777777777 * (0.1); + + steerAngle = tbarSteerAngleWAS.Value * 0.01; + + double temp = (stepDistance * Math.Tan(steerAngle * 0.02) / 2.5); + headingTrue += temp; + + if (headingTrue > (2.0 * Math.PI)) headingTrue -= (2.0 * Math.PI); + if (headingTrue < 0) headingTrue += (2.0 * Math.PI); + + //Calculate the next Lat Long based on heading and distance + degrees = ToDegrees * headingTrue; + + headingIMU = (int)(degrees*10); + + CalculateNewPostionFromBearingDistance(ToRadians * latitude, ToRadians * longitude, headingTrue, stepDistance / 1000.0); + + //calc the speed + speed = Math.Round(1.944 * stepDistance * 1.0 / (0.1), 1); + + + TimeNow = DateTime.UtcNow.ToString("HHmmss.fff,", CultureInfo.InvariantCulture); + + if (cboxVTG.Checked) + { + BuildVTG(); + sbSendText.Append(sbVTG.ToString()); + SendUDPMessage(sbVTG.ToString()); + } + if (cboxAVR.Checked) + { + BuildAVR(); + sbSendText.Append(sbAVR.ToString()); + SendUDPMessage(sbAVR.ToString()); + } + if (cboxHDT.Checked) + { + BuildHDT(); + sbSendText.Append(sbHDT.ToString()); + SendUDPMessage(sbHDT.ToString()); + } + if (cboxGGA.Checked) + { + BuildGGA(); + sbSendText.Append(sbGGA.ToString()); + SendUDPMessage(sbGGA.ToString()); + } + if (cboxRMC.Checked) + { + BuildRMC(); + sbSendText.Append(sbRMC.ToString()); + SendUDPMessage(sbRMC.ToString()); + } + if (cboxOGI.Checked) + { + BuildOGI(); + sbSendText.Append(sbOGI.ToString()); + SendUDPMessage(sbOGI.ToString()); + } + + if (cboxNDA.Checked) + { + BuildNDA(); + sbSendText.Append(sbNDA.ToString()); + SendUDPMessage(sbNDA.ToString()); + } + + if (cboxKSXT.Checked) + { + BuildKSXT(); + sbSendText.Append(sbKSXT.ToString()); + SendUDPMessage(sbKSXT.ToString()); + } + + sbSendText.Clear(); + } + + public void CalculateNewPostionFromBearingDistance(double lat, double lng, double bearing, double distance) + { + double R = distance / 6371.0; // Earth Radius in Km + + double lat2 = Math.Asin((Math.Sin(lat) * Math.Cos(R)) + (Math.Cos(lat) * Math.Sin(R) * Math.Cos(bearing))); + double lon2 = lng + Math.Atan2(Math.Sin(bearing) * Math.Sin(R) * Math.Cos(lat), Math.Cos(R) - (Math.Sin(lat) * Math.Sin(lat2))); + + latitude = ToDegrees * lat2; + longitude = ToDegrees * lon2; + + //convert to DMS from Degrees + latMinu = latitude; + longMinu = longitude; + + latDeg = (int)latitude; + longDeg = (int)longitude; + + latMinu -= latDeg; + longMinu -= longDeg; + + latMinu = Math.Round(latMinu * 60.0, 7); + longMinu = Math.Round(longMinu * 60.0, 7); + + latDeg *= 100.0; + longDeg *= 100.0; + + latNMEA = latMinu + latDeg; + longNMEA = longMinu + longDeg; + + if (latitude >= 0) NS = 'N'; + else NS = 'S'; + if (longitude >= 0) EW = 'E'; + else EW = 'W'; + } + + //calculate the NMEA checksum to stuff at the end + public void CalculateChecksum(string Sentence) + { + int sum = 0, inx; + char[] sentence_chars = Sentence.ToCharArray(); + char tmp; + // All character xor:ed results in the trailing hex checksum + // The checksum calc starts after '$' and ends before '*' + for (inx = 1; ; inx++) + { + tmp = sentence_chars[inx]; + // Indicates end of data and start of checksum + if (tmp == '*') + break; + sum ^= tmp; // Build checksum + } + // Calculated checksum converted to a 2 digit hex string + sumStr = String.Format("{0:X2}", sum); + } + + private void BuildGGA() + { + sbGGA.Clear(); + sbGGA.Append("$GPGGA,"); + sbGGA.Append(TimeNow); + sbGGA.Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(','); + sbGGA.Append(Math.Abs(longNMEA).ToString("00000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(','); + sbGGA.Append(fixQuality.ToString(CultureInfo.InvariantCulture)).Append(',').Append(sats.ToString(CultureInfo.InvariantCulture)).Append(',').Append(HDOP.ToString(CultureInfo.InvariantCulture)).Append(',').Append("1000"); + sbGGA.Append(",M,46.9,M,37.1,,*"); + + CalculateChecksum(sbGGA.ToString()); + sbGGA.Append(sumStr); + sbGGA.Append("\r\n"); + } + + private void BuildVTG() + { + sbVTG.Clear(); + sbVTG.Append("$GPVTG,"); + sbVTG.Append(degrees.ToString("N5", CultureInfo.InvariantCulture)); + sbVTG.Append(",T,034.4,M,"); + sbVTG.Append(speed.ToString(CultureInfo.InvariantCulture)); + sbVTG.Append(",N,"); + sbVTG.Append((speed * 1.852).ToString(CultureInfo.InvariantCulture)); + sbVTG.Append(",K*"); + + CalculateChecksum(sbVTG.ToString()); + sbVTG.Append(sumStr); + sbVTG.Append("\r\n"); + } + + private void BuildHDT() + { + sbHDT.Clear(); + sbHDT.Append("$GNHDT,"); + sbHDT.Append(degrees.ToString("N5", CultureInfo.InvariantCulture)); + sbHDT.Append(",T*"); + + CalculateChecksum(sbHDT.ToString()); + sbHDT.Append(sumStr); + sbHDT.Append("\r\n"); + } + + private void BuildAVR() + { + sbAVR.Clear(); + sbAVR.Append("$PTNL,AVR,"); + sbAVR.Append(TimeNow); + sbAVR.Append(degrees.ToString("N5", CultureInfo.InvariantCulture)); //field 2 + + sbAVR.Append(",Yaw,-2.1,Tilt,"); //field 3,4,5 + + sbAVR.Append(roll.ToString() + ",Roll,"); //field 6,7 + + sbAVR.Append("444.232,3,1.2,17*"); //field 8 thru 12 + + CalculateChecksum(sbAVR.ToString()); + sbAVR.Append(sumStr); + sbAVR.Append("\r\n"); + } + + private void BuildOGI() + { + + sbOGI.Clear(); + sbOGI.Append("$PAOGI,"); + + sbOGI.Append(TimeNow); + sbOGI.Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(','); + sbOGI.Append(Math.Abs(longNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(','); + + sbOGI.Append(fixQuality.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(sats.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(HDOP.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append("1000,3.2,") //10 + .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(degrees.ToString("N5", CultureInfo.InvariantCulture)).Append(',') + .Append(roll.ToString(CultureInfo.InvariantCulture)).Append(",0.12,359.9,T*"); + + CalculateChecksum(sbOGI.ToString()); + sbOGI.Append(sumStr); + sbOGI.Append("\r\n"); + } + + private void BuildNDA() + { + + sbNDA.Clear(); + sbNDA.Append("$PANDA,"); + + sbNDA.Append(TimeNow); + sbNDA.Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(','); + sbNDA.Append(Math.Abs(longNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(','); + + sbNDA.Append(fixQuality.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(sats.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(HDOP.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append("1000,3.2,") //10 + .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append((headingIMU).ToString(CultureInfo.InvariantCulture)).Append(',') + .Append((rollIMU).ToString(CultureInfo.InvariantCulture)).Append(",32,298").Append("*"); + + CalculateChecksum(sbNDA.ToString()); + sbNDA.Append(sumStr); + sbNDA.Append("\r\n"); + } + + private void BuildKSXT() + { + sbKSXT.Clear(); + sbKSXT.Append("$KSXT,"); //1 + + sbKSXT.Append(TimeNow); + sbKSXT.Append(Math.Abs(longitude).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(','); + sbKSXT.Append(Math.Abs(latitude).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(','); + + sbKSXT.Append(altitude.ToString(CultureInfo.InvariantCulture)).Append(',') //altitude + .Append(degrees.ToString("N5", CultureInfo.InvariantCulture)) //true heading + .Append(",22,35,") // Pitch, SpeedAngle + .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(roll.ToString(CultureInfo.InvariantCulture)).Append(",3,3,13,-1075,-98,-8,,,,37,13,,") + .Append("*3FCF0C9B"); + + //sbKSXT.Append(sumStr); + sbKSXT.Append("\r\n"); + } + + /* + $KSXT $KSXT Log header + + 2 20191219093115.00 YYYYMMDDhhmmss.ss Satellite time in format of yyyymmddhhmmss.ss, + e.g. 2016040106284180 means + 2016(year)4(month)1(day)06(hour)28(mins)41.80(secs) + + 3 112.87713062 x1 Longitude(°) + + 4 28.23315515 x2 Latitude(°) + + 5 65.5618 x3 Height (m) + + 6 0.00 x4 Yaw, the angle between the line connecting two + antennas and True North (primary antenna + positioning and secondary antenna heading) (0° + 360°) + + 7 0.00 x5 Pitch (-90° 90°) + + 8 336.65 x6 Speed angle, the angle between vehicle traveling + direction and True North (0° 360°) + + 9 0.010 x7 Speed in vehicle traveling direction (km/h) + + 10 x8 Roll (-90° 90°) + + 11 3 x9 Positioning status: 0-invalid solution; 1-single point solution; + 2-RTK floating point; 3-RTK fixed point + + 12 0 x10 Heading status: 0-invalid solution; 1-single point solution; + 2-RTK floating point; 3-RTK fixed point + + 13 0 x11 Number of satellites used in heading + + 14 23 x12 Number of satellites used in positioning (primary antenna) + + 15 -1075.146 x13 East position under geographic coordinates with + the base station as the origin (m) (empty if none) + + 16 -98.462 x14 North position under geographic coordinates with + the base station as the origin (m) (empty if none) + + 17 -8.618 x15 Up position under geographic coordinates with + the base station as the origin (m) (empty if none) + + 18 -0.004 x16 East speed under geographic coordinates (km/h) + (empty if none) + + 19 0.009 x17 North speed under geographic coordinates (km/h) + (empty if none) + + 20 0.004 x18 Up speed under geographic coordinates (km/h) + (empty if none) + + 21 1.0 x19 Age of differential + + 22 30 x20 Number of satellites tracked in base station + + 23 x23 Reserved + + 23 Parity 3FCF0C9B XOR check sum (Hex string, check from the + beginning of the frame) + + + */ + + private void BuildRMC() + { + sbRMC.Clear(); + sbRMC.Append("$GPRMC,") + .Append(TimeNow).Append("A,") + .Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(',') + .Append(Math.Abs(longNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(',') + .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',') + .Append(degrees.ToString("N5", CultureInfo.InvariantCulture)) + .Append(",230394,359.9*"); + + CalculateChecksum(sbRMC.ToString()); + sbRMC.Append(sumStr); + sbRMC.Append("\r\n"); + } + + + private void lblWAS_Click(object sender, EventArgs e) + { + tbarSteerAngleWAS.Value = 0; + } + + private void tbarSteerAngleWAS_Scroll(object sender, EventArgs e) + { + steerAngleActual = tbarSteerAngleWAS.Value * 0.01; + lblWAS.Text = "Steer Angle: " + (steerAngleActual).ToString("N2") + "°"; + } + + private void tbarSpeed_Scroll(object sender, EventArgs e) + { + if (tbarSpeed.Value < 0) Kmh.BackColor = Color.Salmon; + else Kmh.BackColor = Color.LightGreen; + + Kmh.Text = "Kmh: " + (tbarSpeed.Value * 0.1).ToString("N1"); + mSec.Text = "M/Sec: " + (tbarSpeed.Value * 0.027777777777).ToString("N1"); + } + + private void tbarHeading_Scroll(object sender, EventArgs e) + { + //Heading.Text = "Heading: " + (headingTrue*ToDegrees).ToString() + "°"; + } + + private void btnRemoteAutoSteer_Click(object sender, EventArgs e) + { + if (steerSwitch > 0) steerSwitch = 0; + else steerSwitch = 1; + } + + private void btnWorkSwitch_Click(object sender, EventArgs e) + { + if (workSwitch > 0) workSwitch = 0; + else workSwitch = 1; + } + + + public void TimedMessageBox(int timeout, string title, string message) + { + var form = new FormTimedMessage(timeout, title, message); + form.Show(); + } + + public void YesMessageBox(string s1) + { + var form = new FormYes(s1); + form.ShowDialog(this); + } + + private ToolStripDropDownButton toolStripDropDownButton1; + private ToolStripMenuItem deviceManagerToolStripMenuItem; + } +} + + diff --git a/Source/Forms/FormGPSData.Designer.cs b/Source/Forms/FormGPSData.Designer.cs new file mode 100644 index 0000000..526f7bf --- /dev/null +++ b/Source/Forms/FormGPSData.Designer.cs @@ -0,0 +1,778 @@ +namespace AgTwo +{ + partial class FormGPSData + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.lblFixQuality = new System.Windows.Forms.Label(); + this.lblSatsTracked = new System.Windows.Forms.Label(); + this.lblAltitude = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.lblHDOP = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.lblSpeed = new System.Windows.Forms.Label(); + this.lblRoll = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.lblGPSHeading = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label29 = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.lblLongitude = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.lblLatitude = new System.Windows.Forms.Label(); + this.tboxVTG = new System.Windows.Forms.TextBox(); + this.tboxGGA = new System.Windows.Forms.TextBox(); + this.tboxHDT = new System.Windows.Forms.TextBox(); + this.tboxAVR = new System.Windows.Forms.TextBox(); + this.tboxPAOGI = new System.Windows.Forms.TextBox(); + this.tboxHPD = new System.Windows.Forms.TextBox(); + this.lblDualHeading = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.lblAge = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.tboxPANDA = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.lblIMUYawRate = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.lblIMUPitch = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.lblIMUHeading = new System.Windows.Forms.Label(); + this.label22 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.lblIMURoll = new System.Windows.Forms.Label(); + this.tboxKSXT = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // timer1 + // + this.timer1.Enabled = true; + this.timer1.Interval = 250; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.Black; + this.label2.Location = new System.Drawing.Point(2, 79); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(52, 18); + this.label2.TabIndex = 8; + this.label2.Text = "Quality"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.Black; + this.label3.Location = new System.Drawing.Point(180, 30); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(52, 18); + this.label3.TabIndex = 9; + this.label3.Text = "# Sats"; + // + // lblFixQuality + // + this.lblFixQuality.AutoSize = true; + this.lblFixQuality.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblFixQuality.Location = new System.Drawing.Point(52, 79); + this.lblFixQuality.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblFixQuality.Name = "lblFixQuality"; + this.lblFixQuality.Size = new System.Drawing.Size(66, 18); + this.lblFixQuality.TabIndex = 2; + this.lblFixQuality.Text = "FixQual"; + this.lblFixQuality.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblSatsTracked + // + this.lblSatsTracked.AutoSize = true; + this.lblSatsTracked.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblSatsTracked.Location = new System.Drawing.Point(231, 31); + this.lblSatsTracked.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblSatsTracked.Name = "lblSatsTracked"; + this.lblSatsTracked.Size = new System.Drawing.Size(41, 18); + this.lblSatsTracked.TabIndex = 4; + this.lblSatsTracked.Text = "Sats"; + this.lblSatsTracked.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblAltitude + // + this.lblAltitude.AutoSize = true; + this.lblAltitude.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblAltitude.Location = new System.Drawing.Point(231, 55); + this.lblAltitude.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblAltitude.Name = "lblAltitude"; + this.lblAltitude.Size = new System.Drawing.Size(67, 18); + this.lblAltitude.TabIndex = 14; + this.lblAltitude.Text = "Altitude"; + this.lblAltitude.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label8.ForeColor = System.Drawing.Color.Black; + this.label8.Location = new System.Drawing.Point(198, 54); + this.label8.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(34, 18); + this.label8.TabIndex = 16; + this.label8.Text = "Elev"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label9.ForeColor = System.Drawing.Color.Black; + this.label9.Location = new System.Drawing.Point(185, 6); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(47, 18); + this.label9.TabIndex = 18; + this.label9.Text = "HDOP"; + // + // lblHDOP + // + this.lblHDOP.AutoSize = true; + this.lblHDOP.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblHDOP.Location = new System.Drawing.Point(231, 7); + this.lblHDOP.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblHDOP.Name = "lblHDOP"; + this.lblHDOP.Size = new System.Drawing.Size(52, 18); + this.lblHDOP.TabIndex = 17; + this.lblHDOP.Text = "HDOP"; + this.lblHDOP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label17.ForeColor = System.Drawing.Color.Black; + this.label17.Location = new System.Drawing.Point(6, 55); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(48, 18); + this.label17.TabIndex = 116; + this.label17.Text = "Speed"; + // + // lblSpeed + // + this.lblSpeed.AutoSize = true; + this.lblSpeed.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblSpeed.Location = new System.Drawing.Point(52, 55); + this.lblSpeed.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblSpeed.Name = "lblSpeed"; + this.lblSpeed.Size = new System.Drawing.Size(54, 18); + this.lblSpeed.TabIndex = 115; + this.lblSpeed.Text = "Speed"; + this.lblSpeed.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblRoll + // + this.lblRoll.AutoSize = true; + this.lblRoll.BackColor = System.Drawing.Color.Transparent; + this.lblRoll.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblRoll.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblRoll.Location = new System.Drawing.Point(356, 55); + this.lblRoll.Name = "lblRoll"; + this.lblRoll.Size = new System.Drawing.Size(49, 18); + this.lblRoll.TabIndex = 463; + this.lblRoll.Text = "-11.2"; + this.lblRoll.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.BackColor = System.Drawing.Color.Transparent; + this.label15.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label15.ForeColor = System.Drawing.Color.Black; + this.label15.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label15.Location = new System.Drawing.Point(448, 31); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(29, 18); + this.label15.TabIndex = 460; + this.label15.Text = "Roll"; + // + // lblGPSHeading + // + this.lblGPSHeading.AutoSize = true; + this.lblGPSHeading.BackColor = System.Drawing.Color.Transparent; + this.lblGPSHeading.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblGPSHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblGPSHeading.Location = new System.Drawing.Point(356, 6); + this.lblGPSHeading.Name = "lblGPSHeading"; + this.lblGPSHeading.Size = new System.Drawing.Size(54, 19); + this.lblGPSHeading.TabIndex = 462; + this.lblGPSHeading.Text = "359.3"; + this.lblGPSHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.BackColor = System.Drawing.Color.Transparent; + this.label16.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label16.ForeColor = System.Drawing.Color.Black; + this.label16.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label16.Location = new System.Drawing.Point(317, 6); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(40, 19); + this.label16.TabIndex = 458; + this.label16.Text = "VTG"; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.BackColor = System.Drawing.Color.Transparent; + this.label29.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label29.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label29.Location = new System.Drawing.Point(4, 267); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(30, 13); + this.label29.TabIndex = 496; + this.label29.Text = "AVR"; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.BackColor = System.Drawing.Color.Transparent; + this.label19.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label19.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label19.Location = new System.Drawing.Point(3, 112); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(31, 13); + this.label19.TabIndex = 501; + this.label19.Text = "GGA"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.BackColor = System.Drawing.Color.Transparent; + this.label11.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label11.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label11.Location = new System.Drawing.Point(5, 205); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(28, 13); + this.label11.TabIndex = 502; + this.label11.Text = "OGI"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.BackColor = System.Drawing.Color.Transparent; + this.label26.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label26.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label26.Location = new System.Drawing.Point(5, 143); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(29, 13); + this.label26.TabIndex = 503; + this.label26.Text = "VTG"; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.BackColor = System.Drawing.Color.Transparent; + this.label30.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label30.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label30.Location = new System.Drawing.Point(4, 236); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(30, 13); + this.label30.TabIndex = 505; + this.label30.Text = "HDT"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.BackColor = System.Drawing.Color.Transparent; + this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label4.Location = new System.Drawing.Point(4, 297); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(30, 13); + this.label4.TabIndex = 509; + this.label4.Text = "HPD"; + // + // lblLongitude + // + this.lblLongitude.AutoSize = true; + this.lblLongitude.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblLongitude.Location = new System.Drawing.Point(36, 5); + this.lblLongitude.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblLongitude.Name = "lblLongitude"; + this.lblLongitude.Size = new System.Drawing.Size(82, 18); + this.lblLongitude.TabIndex = 13; + this.lblLongitude.Text = "Longitude"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label7.ForeColor = System.Drawing.Color.Black; + this.label7.Location = new System.Drawing.Point(6, 5); + this.label7.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(31, 18); + this.label7.TabIndex = 15; + this.label7.Text = "Lon"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label6.ForeColor = System.Drawing.Color.Black; + this.label6.Location = new System.Drawing.Point(9, 29); + this.label6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(28, 18); + this.label6.TabIndex = 5; + this.label6.Text = "Lat"; + // + // lblLatitude + // + this.lblLatitude.AutoSize = true; + this.lblLatitude.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblLatitude.Location = new System.Drawing.Point(36, 29); + this.lblLatitude.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblLatitude.Name = "lblLatitude"; + this.lblLatitude.Size = new System.Drawing.Size(70, 18); + this.lblLatitude.TabIndex = 12; + this.lblLatitude.Text = "Latitude"; + // + // tboxVTG + // + this.tboxVTG.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxVTG.BackColor = System.Drawing.SystemColors.Window; + this.tboxVTG.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxVTG.Location = new System.Drawing.Point(35, 139); + this.tboxVTG.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxVTG.Name = "tboxVTG"; + this.tboxVTG.ReadOnly = true; + this.tboxVTG.Size = new System.Drawing.Size(398, 21); + this.tboxVTG.TabIndex = 497; + this.tboxVTG.Text = "$GPVTG,0,T,034.4,M,1,N,1.852,K"; + // + // tboxGGA + // + this.tboxGGA.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxGGA.BackColor = System.Drawing.SystemColors.Window; + this.tboxGGA.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxGGA.Location = new System.Drawing.Point(35, 108); + this.tboxGGA.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxGGA.Name = "tboxGGA"; + this.tboxGGA.ReadOnly = true; + this.tboxGGA.Size = new System.Drawing.Size(493, 21); + this.tboxGGA.TabIndex = 498; + this.tboxGGA.Text = "$GPGGA,055129.00,5326.1729618,N,111,09.6028200,W,4,12,0.9,300,M,46.9,M,,,"; + // + // tboxHDT + // + this.tboxHDT.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxHDT.BackColor = System.Drawing.SystemColors.Window; + this.tboxHDT.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxHDT.Location = new System.Drawing.Point(35, 232); + this.tboxHDT.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxHDT.Name = "tboxHDT"; + this.tboxHDT.ReadOnly = true; + this.tboxHDT.Size = new System.Drawing.Size(398, 21); + this.tboxHDT.TabIndex = 499; + this.tboxHDT.Text = "$GNHDT,123.456,T * 00"; + // + // tboxAVR + // + this.tboxAVR.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxAVR.BackColor = System.Drawing.SystemColors.Window; + this.tboxAVR.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxAVR.Location = new System.Drawing.Point(35, 263); + this.tboxAVR.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxAVR.Name = "tboxAVR"; + this.tboxAVR.ReadOnly = true; + this.tboxAVR.Size = new System.Drawing.Size(493, 21); + this.tboxAVR.TabIndex = 500; + this.tboxAVR.Text = "$PTNL,AVR,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03"; + // + // tboxPAOGI + // + this.tboxPAOGI.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxPAOGI.BackColor = System.Drawing.SystemColors.Window; + this.tboxPAOGI.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxPAOGI.Location = new System.Drawing.Point(35, 201); + this.tboxPAOGI.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxPAOGI.Name = "tboxPAOGI"; + this.tboxPAOGI.ReadOnly = true; + this.tboxPAOGI.Size = new System.Drawing.Size(493, 21); + this.tboxPAOGI.TabIndex = 504; + this.tboxPAOGI.Text = "$PAOGI,055129.00,5326.1729618,N,111,09.6028200,W,4,12,0.9,300,M,46.9,M,,,"; + // + // tboxHPD + // + this.tboxHPD.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxHPD.BackColor = System.Drawing.SystemColors.Window; + this.tboxHPD.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxHPD.Location = new System.Drawing.Point(35, 294); + this.tboxHPD.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxHPD.Name = "tboxHPD"; + this.tboxHPD.ReadOnly = true; + this.tboxHPD.Size = new System.Drawing.Size(493, 21); + this.tboxHPD.TabIndex = 510; + this.tboxHPD.Text = "$PTNL,AVR,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03"; + // + // lblDualHeading + // + this.lblDualHeading.AutoSize = true; + this.lblDualHeading.BackColor = System.Drawing.Color.Transparent; + this.lblDualHeading.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblDualHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblDualHeading.Location = new System.Drawing.Point(356, 29); + this.lblDualHeading.Name = "lblDualHeading"; + this.lblDualHeading.Size = new System.Drawing.Size(54, 19); + this.lblDualHeading.TabIndex = 514; + this.lblDualHeading.Text = "359.3"; + this.lblDualHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.BackColor = System.Drawing.Color.Transparent; + this.label10.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label10.ForeColor = System.Drawing.Color.Black; + this.label10.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label10.Location = new System.Drawing.Point(316, 29); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(41, 19); + this.label10.TabIndex = 513; + this.label10.Text = "Dual"; + // + // lblAge + // + this.lblAge.AutoSize = true; + this.lblAge.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblAge.Location = new System.Drawing.Point(231, 79); + this.lblAge.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.lblAge.Name = "lblAge"; + this.lblAge.Size = new System.Drawing.Size(67, 18); + this.lblAge.TabIndex = 515; + this.lblAge.Text = "Altitude"; + this.lblAge.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label12.ForeColor = System.Drawing.Color.Black; + this.label12.Location = new System.Drawing.Point(199, 78); + this.label12.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(33, 18); + this.label12.TabIndex = 516; + this.label12.Text = "Age"; + // + // tboxPANDA + // + this.tboxPANDA.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxPANDA.BackColor = System.Drawing.SystemColors.Window; + this.tboxPANDA.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxPANDA.Location = new System.Drawing.Point(36, 170); + this.tboxPANDA.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxPANDA.Name = "tboxPANDA"; + this.tboxPANDA.ReadOnly = true; + this.tboxPANDA.Size = new System.Drawing.Size(493, 21); + this.tboxPANDA.TabIndex = 518; + this.tboxPANDA.Text = "$PANDA,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.BackColor = System.Drawing.Color.Transparent; + this.label5.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label5.Location = new System.Drawing.Point(5, 173); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(30, 13); + this.label5.TabIndex = 517; + this.label5.Text = "NDA"; + // + // lblIMUYawRate + // + this.lblIMUYawRate.AutoSize = true; + this.lblIMUYawRate.BackColor = System.Drawing.Color.Transparent; + this.lblIMUYawRate.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblIMUYawRate.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblIMUYawRate.Location = new System.Drawing.Point(475, 77); + this.lblIMUYawRate.Name = "lblIMUYawRate"; + this.lblIMUYawRate.Size = new System.Drawing.Size(49, 18); + this.lblIMUYawRate.TabIndex = 520; + this.lblIMUYawRate.Text = "-11.2"; + this.lblIMUYawRate.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.BackColor = System.Drawing.Color.Transparent; + this.label14.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label14.ForeColor = System.Drawing.Color.Black; + this.label14.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label14.Location = new System.Drawing.Point(413, 77); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(66, 18); + this.label14.TabIndex = 519; + this.label14.Text = "YawRate"; + // + // lblIMUPitch + // + this.lblIMUPitch.AutoSize = true; + this.lblIMUPitch.BackColor = System.Drawing.Color.Transparent; + this.lblIMUPitch.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblIMUPitch.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblIMUPitch.Location = new System.Drawing.Point(475, 54); + this.lblIMUPitch.Name = "lblIMUPitch"; + this.lblIMUPitch.Size = new System.Drawing.Size(49, 18); + this.lblIMUPitch.TabIndex = 522; + this.lblIMUPitch.Text = "-11.2"; + this.lblIMUPitch.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.BackColor = System.Drawing.Color.Transparent; + this.label20.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label20.ForeColor = System.Drawing.Color.Black; + this.label20.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label20.Location = new System.Drawing.Point(443, 54); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(38, 18); + this.label20.TabIndex = 521; + this.label20.Text = "Pitch"; + // + // lblIMUHeading + // + this.lblIMUHeading.AutoSize = true; + this.lblIMUHeading.BackColor = System.Drawing.Color.Transparent; + this.lblIMUHeading.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblIMUHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblIMUHeading.Location = new System.Drawing.Point(475, 8); + this.lblIMUHeading.Name = "lblIMUHeading"; + this.lblIMUHeading.Size = new System.Drawing.Size(49, 18); + this.lblIMUHeading.TabIndex = 524; + this.lblIMUHeading.Text = "-11.2"; + this.lblIMUHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.BackColor = System.Drawing.Color.Transparent; + this.label22.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label22.ForeColor = System.Drawing.Color.Black; + this.label22.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label22.Location = new System.Drawing.Point(443, 8); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(36, 18); + this.label22.TabIndex = 523; + this.label22.Text = "Yaw"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.Black; + this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label1.Location = new System.Drawing.Point(328, 55); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(29, 18); + this.label1.TabIndex = 525; + this.label1.Text = "Roll"; + // + // lblIMURoll + // + this.lblIMURoll.AutoSize = true; + this.lblIMURoll.BackColor = System.Drawing.Color.Transparent; + this.lblIMURoll.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblIMURoll.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblIMURoll.Location = new System.Drawing.Point(475, 31); + this.lblIMURoll.Name = "lblIMURoll"; + this.lblIMURoll.Size = new System.Drawing.Size(49, 18); + this.lblIMURoll.TabIndex = 526; + this.lblIMURoll.Text = "-11.2"; + this.lblIMURoll.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // tboxKSXT + // + this.tboxKSXT.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tboxKSXT.BackColor = System.Drawing.SystemColors.Window; + this.tboxKSXT.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tboxKSXT.Location = new System.Drawing.Point(35, 327); + this.tboxKSXT.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tboxKSXT.Name = "tboxKSXT"; + this.tboxKSXT.ReadOnly = true; + this.tboxKSXT.Size = new System.Drawing.Size(493, 21); + this.tboxKSXT.TabIndex = 528; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.BackColor = System.Drawing.Color.Transparent; + this.label13.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label13.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label13.Location = new System.Drawing.Point(4, 330); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(28, 13); + this.label13.TabIndex = 527; + this.label13.Text = "SXT"; + // + // FormGPSData + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.ClientSize = new System.Drawing.Size(541, 357); + this.Controls.Add(this.tboxKSXT); + this.Controls.Add(this.label13); + this.Controls.Add(this.lblIMURoll); + this.Controls.Add(this.label1); + this.Controls.Add(this.lblIMUHeading); + this.Controls.Add(this.label22); + this.Controls.Add(this.lblIMUPitch); + this.Controls.Add(this.label20); + this.Controls.Add(this.lblIMUYawRate); + this.Controls.Add(this.label14); + this.Controls.Add(this.tboxPANDA); + this.Controls.Add(this.label5); + this.Controls.Add(this.lblAge); + this.Controls.Add(this.label12); + this.Controls.Add(this.lblDualHeading); + this.Controls.Add(this.label10); + this.Controls.Add(this.tboxHPD); + this.Controls.Add(this.label4); + this.Controls.Add(this.lblLatitude); + this.Controls.Add(this.label6); + this.Controls.Add(this.tboxPAOGI); + this.Controls.Add(this.label7); + this.Controls.Add(this.tboxAVR); + this.Controls.Add(this.lblLongitude); + this.Controls.Add(this.tboxHDT); + this.Controls.Add(this.tboxGGA); + this.Controls.Add(this.tboxVTG); + this.Controls.Add(this.label30); + this.Controls.Add(this.label26); + this.Controls.Add(this.label11); + this.Controls.Add(this.label19); + this.Controls.Add(this.label29); + this.Controls.Add(this.lblRoll); + this.Controls.Add(this.label15); + this.Controls.Add(this.lblGPSHeading); + this.Controls.Add(this.label17); + this.Controls.Add(this.lblSpeed); + this.Controls.Add(this.label9); + this.Controls.Add(this.lblHDOP); + this.Controls.Add(this.lblAltitude); + this.Controls.Add(this.label2); + this.Controls.Add(this.lblSatsTracked); + this.Controls.Add(this.lblFixQuality); + this.Controls.Add(this.label3); + this.Controls.Add(this.label16); + this.Controls.Add(this.label8); + this.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FormGPSData"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "System Data"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormGPSData_FormClosing); + this.Load += new System.EventHandler(this.FormGPSData_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label lblFixQuality; + private System.Windows.Forms.Label lblSatsTracked; + private System.Windows.Forms.Label lblAltitude; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label lblHDOP; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label lblSpeed; + private System.Windows.Forms.Label lblRoll; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label lblGPSHeading; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label lblLongitude; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label lblLatitude; + private System.Windows.Forms.TextBox tboxVTG; + private System.Windows.Forms.TextBox tboxGGA; + private System.Windows.Forms.TextBox tboxHDT; + private System.Windows.Forms.TextBox tboxAVR; + private System.Windows.Forms.TextBox tboxPAOGI; + private System.Windows.Forms.TextBox tboxHPD; + private System.Windows.Forms.Label lblDualHeading; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label lblAge; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.TextBox tboxPANDA; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label lblIMUYawRate; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label lblIMUPitch; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label lblIMUHeading; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblIMURoll; + private System.Windows.Forms.TextBox tboxKSXT; + private System.Windows.Forms.Label label13; + } +} \ No newline at end of file diff --git a/Source/Forms/FormGPSData.cs b/Source/Forms/FormGPSData.cs new file mode 100644 index 0000000..ae83244 --- /dev/null +++ b/Source/Forms/FormGPSData.cs @@ -0,0 +1,69 @@ +//Please, if you use this give me some credit +//Copyright BrianTee, copy right out of it. + +using System; +using System.Windows.Forms; + +namespace AgTwo +{ + public partial class FormGPSData : Form + { + private readonly FormLoop mf = null; + + public FormGPSData(Form callingForm) + { + mf = callingForm as FormLoop; + InitializeComponent(); + } + + private void timer1_Tick(object sender, EventArgs e) + { + //lblLatitude.Text = mf.latitude.ToString("N7"); + //lblLongitude.Text = mf.longitude.ToString("N7"); + + ////other sat and GPS info + //lblFixQuality.Text = mf.FixQuality; + //lblSatsTracked.Text = mf.satellitesData.ToString(); + //lblHDOP.Text = mf.hdopData.ToString(); + //lblSpeed.Text = mf.speedData.ToString("N1"); + + //lblRoll.Text = mf.rollData.ToString("N2"); + //lblIMURoll.Text = mf.imuRollData.ToString(); + //lblIMUPitch.Text = mf.imuPitchData.ToString(); + //lblIMUYawRate.Text = mf.imuYawRateData.ToString(); + //lblIMUHeading.Text = mf.imuHeadingData.ToString(); + + //lblAge.Text = mf.ageData.ToString("N1"); + + //lblGPSHeading.Text = mf.headingTrueData.ToString("N2"); + //lblDualHeading.Text = mf.headingTrueDualData.ToString("N2"); + + //lblAltitude.Text = mf.altitudeData.ToString("N1"); + + //tboxVTG.Text = mf.vtgSentence; + //tboxGGA.Text = mf.ggaSentence; + //tboxPAOGI.Text = mf.paogiSentence; + //tboxAVR.Text = mf.avrSentence; + //tboxHDT.Text = mf.hdtSentence; + //tboxHPD.Text = mf.hpdSentence; + //tboxPANDA.Text = mf.pandaSentence; + //tboxKSXT.Text = mf.ksxtSentence; + } + + private void FormGPSData_Load(object sender, EventArgs e) + { + tboxGGA.Text = ""; + tboxVTG.Text = ""; + tboxHDT.Text = ""; + tboxAVR.Text = ""; + tboxPAOGI.Text = ""; + tboxHPD.Text = ""; + tboxPANDA.Text = ""; + tboxKSXT.Text = ""; + } + + private void FormGPSData_FormClosing(object sender, FormClosingEventArgs e) + { + } + } +} \ No newline at end of file diff --git a/Source/Forms/FormGPSData.resx b/Source/Forms/FormGPSData.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Source/Forms/FormGPSData.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/Forms/FormLoop.Designer.cs b/Source/Forms/FormLoop.Designer.cs new file mode 100644 index 0000000..dd1b638 --- /dev/null +++ b/Source/Forms/FormLoop.Designer.cs @@ -0,0 +1,659 @@ + +namespace AgTwo +{ + partial class FormLoop + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormLoop)); + this.label6 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.lblCurentLon = new System.Windows.Forms.Label(); + this.lblCurrentLat = new System.Windows.Forms.Label(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); + this.toolStripEthernet = new System.Windows.Forms.ToolStripMenuItem(); + this.deviceManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lblIP = new System.Windows.Forms.Label(); + this.lblWASCounts = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.lblSwitchStatus = new System.Windows.Forms.Label(); + this.lblWorkSwitchStatus = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.lbl1To8 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.lbl9To16 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.btnExit = new System.Windows.Forms.Button(); + this.btnRemoteAutoSteer = new System.Windows.Forms.Button(); + this.btnWorkSwitch = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.cboxKSXT = new System.Windows.Forms.CheckBox(); + this.cboxNDA = new System.Windows.Forms.CheckBox(); + this.lblWAS = new System.Windows.Forms.Label(); + this.tbarSteerAngleWAS = new System.Windows.Forms.TrackBar(); + this.Heading = new System.Windows.Forms.Label(); + this.cboxOGI = new System.Windows.Forms.CheckBox(); + this.cboxRMC = new System.Windows.Forms.CheckBox(); + this.cboxGGA = new System.Windows.Forms.CheckBox(); + this.Kmh = new System.Windows.Forms.Label(); + this.mSec = new System.Windows.Forms.Label(); + this.cboxHDT = new System.Windows.Forms.CheckBox(); + this.cboxAVR = new System.Windows.Forms.CheckBox(); + this.cboxVTG = new System.Windows.Forms.CheckBox(); + this.tbarSpeed = new System.Windows.Forms.TrackBar(); + this.simTimer = new System.Windows.Forms.Timer(this.components); + this.statusStrip1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbarSteerAngleWAS)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbarSpeed)).BeginInit(); + this.SuspendLayout(); + // + // label6 + // + this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label6.AutoSize = true; + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label6.ForeColor = System.Drawing.Color.Black; + this.label6.Location = new System.Drawing.Point(478, 330); + this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(24, 16); + this.label6.TabIndex = 151; + this.label6.Text = "Lat"; + // + // label8 + // + this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label8.AutoSize = true; + this.label8.BackColor = System.Drawing.Color.Transparent; + this.label8.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label8.ForeColor = System.Drawing.Color.Black; + this.label8.Location = new System.Drawing.Point(475, 352); + this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(27, 16); + this.label8.TabIndex = 152; + this.label8.Text = "Lon"; + // + // lblCurentLon + // + this.lblCurentLon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblCurentLon.AutoSize = true; + this.lblCurentLon.BackColor = System.Drawing.Color.Transparent; + this.lblCurentLon.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblCurentLon.ForeColor = System.Drawing.Color.Black; + this.lblCurentLon.Location = new System.Drawing.Point(502, 351); + this.lblCurentLon.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCurentLon.Name = "lblCurentLon"; + this.lblCurentLon.Size = new System.Drawing.Size(119, 18); + this.lblCurentLon.TabIndex = 154; + this.lblCurentLon.Text = "-888.8888888"; + // + // lblCurrentLat + // + this.lblCurrentLat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblCurrentLat.AutoSize = true; + this.lblCurrentLat.BackColor = System.Drawing.Color.Transparent; + this.lblCurrentLat.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblCurrentLat.ForeColor = System.Drawing.Color.Black; + this.lblCurrentLat.Location = new System.Drawing.Point(502, 329); + this.lblCurrentLat.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCurrentLat.Name = "lblCurrentLat"; + this.lblCurrentLat.Size = new System.Drawing.Size(109, 18); + this.lblCurrentLat.TabIndex = 153; + this.lblCurrentLat.Text = "-53.1234567"; + // + // statusStrip1 + // + this.statusStrip1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.statusStrip1.AutoSize = false; + this.statusStrip1.BackColor = System.Drawing.Color.Transparent; + this.statusStrip1.Dock = System.Windows.Forms.DockStyle.None; + this.statusStrip1.ImageScalingSize = new System.Drawing.Size(64, 64); + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton1}); + this.statusStrip1.Location = new System.Drawing.Point(471, 382); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 11, 0); + this.statusStrip1.Size = new System.Drawing.Size(106, 70); + this.statusStrip1.SizingGrip = false; + this.statusStrip1.TabIndex = 149; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripDropDownButton1 + // + this.toolStripDropDownButton1.AutoSize = false; + this.toolStripDropDownButton1.BackColor = System.Drawing.Color.Transparent; + this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripEthernet, + this.deviceManagerToolStripMenuItem}); + this.toolStripDropDownButton1.Image = global::AgTwo.Properties.Resources.Settings48; + this.toolStripDropDownButton1.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; + this.toolStripDropDownButton1.ShowDropDownArrow = false; + this.toolStripDropDownButton1.Size = new System.Drawing.Size(90, 68); + // + // toolStripEthernet + // + this.toolStripEthernet.Name = "toolStripEthernet"; + this.toolStripEthernet.Size = new System.Drawing.Size(296, 70); + // + // deviceManagerToolStripMenuItem + // + this.deviceManagerToolStripMenuItem.Font = new System.Drawing.Font("Tahoma", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.deviceManagerToolStripMenuItem.Image = global::AgTwo.Properties.Resources.DeviceManager; + this.deviceManagerToolStripMenuItem.Name = "deviceManagerToolStripMenuItem"; + this.deviceManagerToolStripMenuItem.Size = new System.Drawing.Size(296, 70); + this.deviceManagerToolStripMenuItem.Text = "Device Manager"; + this.deviceManagerToolStripMenuItem.Click += new System.EventHandler(this.deviceManagerToolStripMenuItem_Click); + // + // lblIP + // + this.lblIP.BackColor = System.Drawing.Color.Transparent; + this.lblIP.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblIP.ForeColor = System.Drawing.Color.Black; + this.lblIP.Location = new System.Drawing.Point(8, 4); + this.lblIP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblIP.Name = "lblIP"; + this.lblIP.Size = new System.Drawing.Size(144, 56); + this.lblIP.TabIndex = 464; + this.lblIP.Text = "288.288.288.288"; + this.lblIP.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.lblIP.Click += new System.EventHandler(this.lblIP_Click); + // + // lblWASCounts + // + this.lblWASCounts.AutoSize = true; + this.lblWASCounts.BackColor = System.Drawing.Color.Transparent; + this.lblWASCounts.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblWASCounts.ForeColor = System.Drawing.Color.Black; + this.lblWASCounts.Location = new System.Drawing.Point(90, 135); + this.lblWASCounts.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblWASCounts.Name = "lblWASCounts"; + this.lblWASCounts.Size = new System.Drawing.Size(43, 18); + this.lblWASCounts.TabIndex = 476; + this.lblWASCounts.Text = "Only"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.Black; + this.label3.Location = new System.Drawing.Point(37, 111); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(56, 19); + this.label3.TabIndex = 477; + this.label3.Text = "Angle:"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.BackColor = System.Drawing.Color.Transparent; + this.label4.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.ForeColor = System.Drawing.Color.Black; + this.label4.Location = new System.Drawing.Point(29, 134); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(64, 19); + this.label4.TabIndex = 478; + this.label4.Text = "Counts:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.Black; + this.label2.Location = new System.Drawing.Point(29, 169); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(61, 19); + this.label2.TabIndex = 481; + this.label2.Text = "Switch:"; + // + // lblSwitchStatus + // + this.lblSwitchStatus.AutoSize = true; + this.lblSwitchStatus.BackColor = System.Drawing.Color.Transparent; + this.lblSwitchStatus.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblSwitchStatus.ForeColor = System.Drawing.Color.Black; + this.lblSwitchStatus.Location = new System.Drawing.Point(90, 170); + this.lblSwitchStatus.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblSwitchStatus.Name = "lblSwitchStatus"; + this.lblSwitchStatus.Size = new System.Drawing.Size(18, 18); + this.lblSwitchStatus.TabIndex = 482; + this.lblSwitchStatus.Text = "*"; + // + // lblWorkSwitchStatus + // + this.lblWorkSwitchStatus.AutoSize = true; + this.lblWorkSwitchStatus.BackColor = System.Drawing.Color.Transparent; + this.lblWorkSwitchStatus.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblWorkSwitchStatus.ForeColor = System.Drawing.Color.Black; + this.lblWorkSwitchStatus.Location = new System.Drawing.Point(90, 193); + this.lblWorkSwitchStatus.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblWorkSwitchStatus.Name = "lblWorkSwitchStatus"; + this.lblWorkSwitchStatus.Size = new System.Drawing.Size(18, 18); + this.lblWorkSwitchStatus.TabIndex = 484; + this.lblWorkSwitchStatus.Text = "*"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.BackColor = System.Drawing.Color.Transparent; + this.label9.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label9.ForeColor = System.Drawing.Color.Black; + this.label9.Location = new System.Drawing.Point(38, 192); + this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(52, 19); + this.label9.TabIndex = 483; + this.label9.Text = "Work:"; + // + // lbl1To8 + // + this.lbl1To8.AutoSize = true; + this.lbl1To8.BackColor = System.Drawing.Color.Transparent; + this.lbl1To8.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbl1To8.ForeColor = System.Drawing.Color.Black; + this.lbl1To8.Location = new System.Drawing.Point(27, 255); + this.lbl1To8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl1To8.Name = "lbl1To8"; + this.lbl1To8.Size = new System.Drawing.Size(106, 23); + this.lbl1To8.TabIndex = 500; + this.lbl1To8.Text = "00000000"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.BackColor = System.Drawing.Color.Transparent; + this.label10.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label10.ForeColor = System.Drawing.Color.Black; + this.label10.Location = new System.Drawing.Point(27, 235); + this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(106, 19); + this.label10.TabIndex = 499; + this.label10.Text = "8 << 1"; + // + // lbl9To16 + // + this.lbl9To16.AutoSize = true; + this.lbl9To16.BackColor = System.Drawing.Color.Transparent; + this.lbl9To16.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbl9To16.ForeColor = System.Drawing.Color.Black; + this.lbl9To16.Location = new System.Drawing.Point(27, 307); + this.lbl9To16.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl9To16.Name = "lbl9To16"; + this.lbl9To16.Size = new System.Drawing.Size(106, 23); + this.lbl9To16.TabIndex = 502; + this.lbl9To16.Text = "00000000"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.BackColor = System.Drawing.Color.Transparent; + this.label12.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label12.ForeColor = System.Drawing.Color.Black; + this.label12.Location = new System.Drawing.Point(27, 286); + this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(105, 19); + this.label12.TabIndex = 501; + this.label12.Text = "16 << 9"; + // + // btnExit + // + this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnExit.BackColor = System.Drawing.Color.Transparent; + this.btnExit.FlatAppearance.BorderColor = System.Drawing.SystemColors.HotTrack; + this.btnExit.FlatAppearance.BorderSize = 0; + this.btnExit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnExit.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnExit.ForeColor = System.Drawing.Color.White; + this.btnExit.Image = global::AgTwo.Properties.Resources.Cancel64; + this.btnExit.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.btnExit.Location = new System.Drawing.Point(583, 389); + this.btnExit.Margin = new System.Windows.Forms.Padding(4); + this.btnExit.Name = "btnExit"; + this.btnExit.Size = new System.Drawing.Size(63, 58); + this.btnExit.TabIndex = 192; + this.btnExit.UseVisualStyleBackColor = false; + this.btnExit.Click += new System.EventHandler(this.btnExit_Click); + // + // btnRemoteAutoSteer + // + this.btnRemoteAutoSteer.Location = new System.Drawing.Point(29, 29); + this.btnRemoteAutoSteer.Name = "btnRemoteAutoSteer"; + this.btnRemoteAutoSteer.Size = new System.Drawing.Size(61, 45); + this.btnRemoteAutoSteer.TabIndex = 514; + this.btnRemoteAutoSteer.Text = "Steer"; + this.btnRemoteAutoSteer.UseVisualStyleBackColor = true; + this.btnRemoteAutoSteer.Click += new System.EventHandler(this.btnRemoteAutoSteer_Click); + // + // btnWorkSwitch + // + this.btnWorkSwitch.Location = new System.Drawing.Point(113, 29); + this.btnWorkSwitch.Name = "btnWorkSwitch"; + this.btnWorkSwitch.Size = new System.Drawing.Size(55, 45); + this.btnWorkSwitch.TabIndex = 515; + this.btnWorkSwitch.Text = "Work"; + this.btnWorkSwitch.UseVisualStyleBackColor = true; + this.btnWorkSwitch.Click += new System.EventHandler(this.btnWorkSwitch_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btnRemoteAutoSteer); + this.groupBox1.Controls.Add(this.btnWorkSwitch); + this.groupBox1.Controls.Add(this.label9); + this.groupBox1.Controls.Add(this.label12); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.lblWASCounts); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.lblSwitchStatus); + this.groupBox1.Controls.Add(this.lblWorkSwitchStatus); + this.groupBox1.Controls.Add(this.label10); + this.groupBox1.Controls.Add(this.lbl1To8); + this.groupBox1.Controls.Add(this.lbl9To16); + this.groupBox1.Location = new System.Drawing.Point(223, 9); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(183, 359); + this.groupBox1.TabIndex = 516; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Steer Module"; + // + // cboxKSXT + // + this.cboxKSXT.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxKSXT.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxKSXT.Location = new System.Drawing.Point(562, 288); + this.cboxKSXT.Name = "cboxKSXT"; + this.cboxKSXT.Size = new System.Drawing.Size(80, 24); + this.cboxKSXT.TabIndex = 537; + this.cboxKSXT.Text = "KSXT"; + this.cboxKSXT.UseVisualStyleBackColor = true; + // + // cboxNDA + // + this.cboxNDA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxNDA.Checked = true; + this.cboxNDA.CheckState = System.Windows.Forms.CheckState.Checked; + this.cboxNDA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxNDA.Location = new System.Drawing.Point(460, 288); + this.cboxNDA.Name = "cboxNDA"; + this.cboxNDA.Size = new System.Drawing.Size(69, 24); + this.cboxNDA.TabIndex = 536; + this.cboxNDA.Text = "NDA"; + this.cboxNDA.UseVisualStyleBackColor = true; + // + // lblWAS + // + this.lblWAS.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblWAS.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblWAS.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblWAS.Location = new System.Drawing.Point(424, 21); + this.lblWAS.Name = "lblWAS"; + this.lblWAS.Size = new System.Drawing.Size(206, 26); + this.lblWAS.TabIndex = 535; + this.lblWAS.Text = "Steer Angle: 0°"; + this.lblWAS.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lblWAS.Click += new System.EventHandler(this.lblWAS_Click); + // + // tbarSteerAngleWAS + // + this.tbarSteerAngleWAS.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.tbarSteerAngleWAS.LargeChange = 1; + this.tbarSteerAngleWAS.Location = new System.Drawing.Point(413, 56); + this.tbarSteerAngleWAS.Maximum = 6000; + this.tbarSteerAngleWAS.Minimum = -6000; + this.tbarSteerAngleWAS.Name = "tbarSteerAngleWAS"; + this.tbarSteerAngleWAS.Size = new System.Drawing.Size(229, 45); + this.tbarSteerAngleWAS.TabIndex = 534; + this.tbarSteerAngleWAS.TickFrequency = 100; + this.tbarSteerAngleWAS.Scroll += new System.EventHandler(this.tbarSteerAngleWAS_Scroll); + // + // Heading + // + this.Heading.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.Heading.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Heading.Location = new System.Drawing.Point(464, 99); + this.Heading.Name = "Heading"; + this.Heading.Size = new System.Drawing.Size(127, 20); + this.Heading.TabIndex = 524; + this.Heading.Text = "Heading: 112°"; + this.Heading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // cboxOGI + // + this.cboxOGI.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxOGI.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxOGI.Location = new System.Drawing.Point(460, 260); + this.cboxOGI.Name = "cboxOGI"; + this.cboxOGI.Size = new System.Drawing.Size(69, 24); + this.cboxOGI.TabIndex = 532; + this.cboxOGI.Text = "OGI"; + this.cboxOGI.UseVisualStyleBackColor = true; + // + // cboxRMC + // + this.cboxRMC.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxRMC.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxRMC.Location = new System.Drawing.Point(562, 259); + this.cboxRMC.Name = "cboxRMC"; + this.cboxRMC.Size = new System.Drawing.Size(69, 24); + this.cboxRMC.TabIndex = 531; + this.cboxRMC.Text = "RMC"; + this.cboxRMC.UseVisualStyleBackColor = true; + // + // cboxGGA + // + this.cboxGGA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxGGA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxGGA.Location = new System.Drawing.Point(460, 201); + this.cboxGGA.Name = "cboxGGA"; + this.cboxGGA.Size = new System.Drawing.Size(69, 24); + this.cboxGGA.TabIndex = 530; + this.cboxGGA.Text = "GGA"; + this.cboxGGA.UseVisualStyleBackColor = true; + // + // Kmh + // + this.Kmh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.Kmh.AutoSize = true; + this.Kmh.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Kmh.Location = new System.Drawing.Point(421, 132); + this.Kmh.Name = "Kmh"; + this.Kmh.Size = new System.Drawing.Size(79, 20); + this.Kmh.TabIndex = 529; + this.Kmh.Text = "Kmh: 0.0"; + // + // mSec + // + this.mSec.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.mSec.AutoSize = true; + this.mSec.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.mSec.Location = new System.Drawing.Point(543, 134); + this.mSec.Name = "mSec"; + this.mSec.Size = new System.Drawing.Size(79, 16); + this.mSec.TabIndex = 528; + this.mSec.Text = "M/Sec: 0.0"; + // + // cboxHDT + // + this.cboxHDT.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxHDT.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxHDT.Location = new System.Drawing.Point(562, 230); + this.cboxHDT.Name = "cboxHDT"; + this.cboxHDT.Size = new System.Drawing.Size(69, 24); + this.cboxHDT.TabIndex = 527; + this.cboxHDT.Text = "HDT"; + this.cboxHDT.UseVisualStyleBackColor = true; + // + // cboxAVR + // + this.cboxAVR.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxAVR.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxAVR.Location = new System.Drawing.Point(562, 201); + this.cboxAVR.Name = "cboxAVR"; + this.cboxAVR.Size = new System.Drawing.Size(69, 24); + this.cboxAVR.TabIndex = 526; + this.cboxAVR.Text = "AVR"; + this.cboxAVR.UseVisualStyleBackColor = true; + // + // cboxVTG + // + this.cboxVTG.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboxVTG.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cboxVTG.Location = new System.Drawing.Point(460, 230); + this.cboxVTG.Name = "cboxVTG"; + this.cboxVTG.Size = new System.Drawing.Size(69, 24); + this.cboxVTG.TabIndex = 525; + this.cboxVTG.Text = "VTG"; + this.cboxVTG.UseVisualStyleBackColor = true; + // + // tbarSpeed + // + this.tbarSpeed.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.tbarSpeed.LargeChange = 10; + this.tbarSpeed.Location = new System.Drawing.Point(414, 151); + this.tbarSpeed.Maximum = 500; + this.tbarSpeed.Minimum = -200; + this.tbarSpeed.Name = "tbarSpeed"; + this.tbarSpeed.Size = new System.Drawing.Size(229, 45); + this.tbarSpeed.TabIndex = 519; + this.tbarSpeed.TickFrequency = 50; + this.tbarSpeed.Scroll += new System.EventHandler(this.tbarSpeed_Scroll); + // + // simTimer + // + this.simTimer.Enabled = true; + this.simTimer.Tick += new System.EventHandler(this.simTimer_Tick); + // + // FormLoop + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.ClientSize = new System.Drawing.Size(654, 455); + this.Controls.Add(this.cboxKSXT); + this.Controls.Add(this.cboxNDA); + this.Controls.Add(this.lblWAS); + this.Controls.Add(this.tbarSteerAngleWAS); + this.Controls.Add(this.Heading); + this.Controls.Add(this.cboxOGI); + this.Controls.Add(this.cboxRMC); + this.Controls.Add(this.cboxGGA); + this.Controls.Add(this.Kmh); + this.Controls.Add(this.mSec); + this.Controls.Add(this.cboxHDT); + this.Controls.Add(this.cboxAVR); + this.Controls.Add(this.cboxVTG); + this.Controls.Add(this.tbarSpeed); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.label8); + this.Controls.Add(this.label6); + this.Controls.Add(this.btnExit); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.lblCurentLon); + this.Controls.Add(this.lblCurrentLat); + this.Controls.Add(this.lblIP); + this.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimumSize = new System.Drawing.Size(50, 50); + this.Name = "FormLoop"; + this.Padding = new System.Windows.Forms.Padding(4); + this.Text = "AgTwo"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormLoop_FormClosing); + this.Load += new System.EventHandler(this.FormLoop_Load); + this.Resize += new System.EventHandler(this.FormLoop_Resize); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbarSteerAngleWAS)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbarSpeed)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label lblCurentLon; + private System.Windows.Forms.Label lblCurrentLat; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.Button btnExit; + private System.Windows.Forms.Label lblIP; + private System.Windows.Forms.Label lblWASCounts; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lblSwitchStatus; + private System.Windows.Forms.Label lblWorkSwitchStatus; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label lbl1To8; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label lbl9To16; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.ToolStripMenuItem toolStripEthernet; + private System.Windows.Forms.Button btnRemoteAutoSteer; + private System.Windows.Forms.Button btnWorkSwitch; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox cboxKSXT; + private System.Windows.Forms.CheckBox cboxNDA; + private System.Windows.Forms.Label lblWAS; + private System.Windows.Forms.TrackBar tbarSteerAngleWAS; + private System.Windows.Forms.Label Heading; + private System.Windows.Forms.CheckBox cboxOGI; + private System.Windows.Forms.CheckBox cboxRMC; + private System.Windows.Forms.CheckBox cboxGGA; + private System.Windows.Forms.Label Kmh; + private System.Windows.Forms.Label mSec; + private System.Windows.Forms.CheckBox cboxHDT; + private System.Windows.Forms.CheckBox cboxAVR; + private System.Windows.Forms.CheckBox cboxVTG; + private System.Windows.Forms.TrackBar tbarSpeed; + private System.Windows.Forms.Timer simTimer; + } +} + diff --git a/Source/Forms/FormLoop.cs b/Source/Forms/FormLoop.cs new file mode 100644 index 0000000..c78beee --- /dev/null +++ b/Source/Forms/FormLoop.cs @@ -0,0 +1,133 @@ +using AgTwo.Properties; +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Windows.Forms; + +namespace AgTwo +{ + public partial class FormLoop : Form + { + //timer variables + public double secondsSinceStart, twoSecondTimer, tenSecondTimer, threeMinuteTimer; + + public string lastSentence; + + public bool isPluginUsed; + + //usually 256 - send ntrip to serial in chunks + public int packetSizeNTRIP; + + public bool lastHelloGPS, lastHelloAutoSteer, lastHelloMachine, lastHelloNav; + public bool isConnectedNav, isConnectedSteer, isConnectedMachine; + + //is the fly out displayed + public bool isViewAdvanced = false; + + //used to hide the window and not update text fields and most counters + public bool isAppInFocus = true, isLostFocus; + public int focusSkipCounter = 121; + + //The base directory where Drive will be stored and fields and vehicles branch from + public string baseDirectory; + + + public FormLoop() + { + InitializeComponent(); + } + + //First run + private void FormLoop_Load(object sender, EventArgs e) + { + if (Settings.Default.setF_workingDirectory == "Default") + baseDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\AgOpenGPS\\"; + else baseDirectory = Settings.Default.setF_workingDirectory + "\\AgOpenGPS\\"; + + if (Settings.Default.setUDP_isOn) + { + LoadUDPNetwork(); + } + else + { + label2.Visible = false; + label3.Visible = false; + label4.Visible = false; + label9.Visible = false; + + lblWASCounts.Visible = false; + lblSwitchStatus.Visible = false; + lblWorkSwitchStatus.Visible = false; + + label10.Visible = false; + label12.Visible = false; + lbl1To8.Visible = false; + lbl9To16.Visible = false; + + lblIP.Text = "Off"; + } + + latitude = 53.4360564; + longitude = -111.160047; + } + + private void FormLoop_FormClosing(object sender, FormClosingEventArgs e) + { + Settings.Default.Save(); + + if (UDPSocket != null) + { + try + { + UDPSocket.Shutdown(SocketShutdown.Both); + } + finally { UDPSocket.Close(); } + } + } + + private void FormLoop_Resize(object sender, EventArgs e) + { + } + + + + private void deviceManagerToolStripMenuItem_Click(object sender, EventArgs e) + { + Process.Start("devmgmt.msc"); + } + + private void btnResetTimer_Click(object sender, EventArgs e) + { + threeMinuteTimer = secondsSinceStart; + } + + private void btnRelayTest_Click(object sender, EventArgs e) + { + helloFromAgIO[7] = 1; + } + + private void lblIP_Click(object sender, EventArgs e) + { + lblIP.Text = ""; + foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) + { + if (IPA.AddressFamily == AddressFamily.InterNetwork) + { + _ = IPA.ToString(); + lblIP.Text += IPA.ToString() + "\r\n"; + } + } + } + + private void btnExit_Click(object sender, EventArgs e) + { + Close(); + } + } +} + diff --git a/Source/Forms/FormLoop.resx b/Source/Forms/FormLoop.resx new file mode 100644 index 0000000..3b06d4f --- /dev/null +++ b/Source/Forms/FormLoop.resx @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 208, 18 + + + 341, 18 + + + 47 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAMMOAADDDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAI65gQCOuYEAjrmBAo65gQSOuYEHjrmBCI65gQmOuYEJjrmBCI65gQWOuYEDjrmBAY65 + gQCOuYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAASY40AEmONABJjjQAR40yAESLLgA+hycAW5pIAIm2fAGNuIAGjrmADo65 + gRaOuYEcjrmBH465gR6OuYEZjrmBEY25gAqMuH8EiLV6AV6bTABRkz4AVZZCAFaXQwBXl0QAV5dEAFeX + RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJjjQASY40AEmO + NABHjTIBRIsuAT6HJwI6hSQCa6NaBYOydRCJtnwii7d+NIy4f0GMuH9IjLh/R4y3fjyKt30qh7V5GH+w + cAtmoFUES482AlGTPgFVlkIBVpdDAVeXRABXl0QAV5dEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEmONABJjjQASY40AkeNMgRDiy4GPYcnBzeDIAhTlT8OdaplIoKy + dEKHtHliibV7eYm2fIWJtnyDiLV6cIWzd099r28wbqVdGFOUPwxJjjQIUZM+B1WWQgVWl0MDV5dEAVeX + RABXl0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASY40AEmO + NAFJjjQGR40yDkOLLhY9hycbNYIeHj+IKSZfnExAdKlkbH2ubpaBsXO2g7J1xoOxdMOAsHGpeaxpfmyk + W1NYl0Q0RYwwI0iNMx1Rkz0ZVZVCEVaWQwpXl0QEV5dEAVeXRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFaWQwBWlkMAVpZDAFaWQwBRkz0ASo81BEmONBFHjTInQ4ouOz2HJ0o0gR1SM4AbWkaM + MHNdmkqba6NawnKnYt91qWXvdalk7G+mX9Rkn1KsU5U/hEOLLWc+iChYR40yUFCTPERVlUEvVpZDG1eX + RAtZmEYDZ6BVAHOoYgBzqGIAc6hiAHOoYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVpZDAFaWQwBWlkMBVpZDA1WW + QgVPkjsPS482KEeNMk5Dii5xPYcnijSBHZUufRaZNoIfp0eNMr5WlkLWX5tM6GOeUfFinVDwW5lI4U+R + OslBiSqxOIQhoTuGJJpGjDCUT5I7gFSVQF1Xl0Q4XJpJG2WgUwpxp2ADc6hiAXOoYgBzqGIAc6hiAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABWlkMAVpZDAVaWQwVWlkMMVpZCGFKUPyxNkDlOSI0ze0OKLqE9hye2NYIeui19 + FbQvfheyPIUluUiNM8NRkjzKVZVBzlSVQM1NkDjHQokrvjeDILc0gRy2OYQivUOKLcJMkDeyUpM+jFiX + RWBhnU87a6NaH3KnYQ5zqGIFc6hiAXOoYgBzqGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOUQABTlEACU5RAC1OU + QBxTlD83UZM9WU2QOYBIjTOkQ4ouvD2HKMI2gx+1Ln0Wni19FY43gh+LQoksjUqONZBOkTmRTZA4kUaM + MY88hiWNNIEckjOAG585hCK3QYkrzkmOM85Rkjy0WZhGjmKeUGZqo1hAbqVdH2+lXQtvpV0Db6VeAW+l + XQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACJtHwAibR8AIm0fACJtHwAibR8AIm0fACJtHwAibR8AIm0fACKtH0AirR9AIq0fQCLtX8AjbaBAJG5 + hQCUu4kAlryLAJe9jACXvYwAl72MAJe9jACXvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATZE5AE2ROQRNkTkRTZE5LE2ROVZMkDiGSo41rEaMMcBCiizDPYcotjiE + IZgwfxlzLX0VWjSBHVI+hyhSRowxUkqPNVJJjjRSQ4otUjqEIlQ0gR1fN4Ifdz6HJ59Fiy/JS4823VKT + PdJZl0W3X5tMkWSeUWFmoFMxZqBUEWegVQVnoFUBZ6BVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIm0fACJtHwAibR8AIm0fACJtHwAibR8AYm0 + fAGJtHwBibR8AYq0fQGKtH0BirR9AYu1fwGNtoEBkbmFAZS7iQGWvIsBl72MAZe9jACXvYwAl72MAJe9 + jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjC8ARYwvBUWM + LxZFjC85RYwvbkWLL6hDiy7IQoosxz+IKrQ9hyeXOYUjcDOBHEcufhcsM4AcJD2GJiJEiy4iSI0zIkeN + MiJBiSsiO4UkJj6GJzVGizBUTZA4h1KTPcBUlEDjVpVC5leWQ9RYl0SwWJhEe1mYRT9amEYWW5lHBluZ + RwFbmUcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAibR8AIm0fACJtHwAibR8AYm0fAKJtHwDibR8BYm0fAWJtHwGirR9Boq0fQaKtH0Gi7V/Bo22 + gQaRuYUGlLuJBpa8iwWXvYwDl72MAZe9jAGXvYwAl72MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADmEIgA5hCIFOYQiGTmEIkA5hCJ8OYQiuDmEIs46hSO5OoUkkzqF + JGw6hSRFOIQhJDOBHBA0gR0JPIYmCESLLgdIjTMHR40yB0KKLAhMkDcMXppLHGegVT9roll3aqJZt2Wf + U+JcmUnuVJRA4k2QOMFIjjOIR40xR0eNMRlIjTIHSI0yAUiNMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJtHwAibR8AIm0fAGJtHwCibR8B4m0 + fA6JtHwTibR8F4m0fBmKtH0ZirR9GYq0fRmLtX8ZjbaBGZG5hRmUu4kXlryLE5e9jAyXvYwGl72MApe9 + jAGXvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3wTACt8 + EwYrfBMaK3wTQit8E38sfBO6LH0Uxi59FZ8wfxhrNIEdQDiEISE6hiQOOoUkBDmEIgE8hiYARIsuAEiN + MwBHjTIAXZpKAIe0eAWKtn0Ui7Z+NYu2fmqGs3iod6pn1WKdUOZOkTrgP4gpwzaCHowygBpJMoAaGjKA + GgcygBoBMoAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKHBlwChwZcAocGXAKHBlwChwZcAnL6SAJK4hQCBrnIAa6FaAFOT + QAA/hykAMX8aACt7EwBSkz4BdahlAoOxdgeHs3oViLN7KYi0ezuJtHtGibR8S4m0fEyJtHxMirR9TIu1 + fkyNtoBMkLiES5O7iEeVvIo6lryLJpW8iRSRuoYIgbBzAjOBHAAvfhcAQIgqAE+ROwBal0YAYJtNAGOd + UQBjnVEAY51RAAAAAAAAAAAAAAAAAAAAAAAjdwkAI3cJBiN3CRojdwlCI3cJfyN3Cbgjdwm9I3cKjCV4 + C1Eoeg8lLn4WDDmFIwM7hiUBO4YlADuGJQA7hiUAAAAAAAAAAAChxJYAocSWA6HElg+hxJYpoMOVUpe+ + ioV+r2+wX5tNykWLL9AzgRu8KHoPiiR4C0kkdwoaJHcKByR3CwEkdwsAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAocGXAKHB + lwChwZcAocGXAaHBlwOcvpIGkriFCIGucglroVoKU5NACj+HKQoxfxoKKHoQCih6EAo4gyENWpdHFnOn + Yy99rW5VgK9ydoGvc4qCsHSTg7B1loOwdZaDsHWWhLF3loayeZaJtHyUjLZ/jIy2gHSItHtPfa1vLWWf + VBg8hiUNJXgMCi9+FwpAiCoKT5E7CVqXRgdgm00FY51RAmOdUQBjnVEAAAAAAAAAAAAAAAAAAAAAACB1 + BgAgdQYGIHUGGiB1BkIgdQZ/IHUGuCB1BrsgdQaHIHUGSiB1Bh4hdgcHKHoQADuGJQA7hiUAO4YlADuG + JQAAAAAAAAAAAKjJngCoyZ4CqMmeCajJnhinyJ0wl76LUnOoY3tPkjuiOIQhuSp7ErMjdwmIIHUGSSB1 + BhogdQYHIHUGASB1BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAOoQjADqEIwBYlUQAjraCAJm8jgKev5MFn8CVDpu+kRqRt4UkgK1yKmuh + WixTkz8tP4cpLTF/Gi0oehAtJHcLLih5DzA5hCI7U5RAWWWeVIVto12rcKVgwnKmYs5zpmPRc6Zj0XOm + Y9F0p2TRdqhm0Hiqac95q2vFdqlnqWyjXH5Zl0ZXP4gpPSl6EDEkdwstL34XLUCIKixPkTooWZdGIV+b + TRVhnE8KXppMAkWLMABFizAATZA5AFKTPwBVlUIAInYJACB1BgYgdQYaIHUGQiB1Bn8gdQa4IHUGuyB1 + BocgdQZKIHUGHiF2BwctfRUAcaZgAHGmYABxpmAAcaZgAAAAAAAAAAAAqcmfAKnJnwGpyZ8EqcmfCqbH + nBWGs3gqV5dEUTqFI4MsfBOnJXgLqyF2B4YgdQZJIHUGGiB1BgcgdQYBIHUGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6hCMAOoQjAD2G + JwFVlEICbaJcBoOvdQ+Qt4QjkriHPYu0flN7qm1gZ59WZ1CRPWg9hidoMH4ZaCh5D2gjdwppI3cKayp7 + EnQ6hSSMSo42sFSUQNBYl0XjWphI7VuYSO9cmEjvXJlJ71yZSe9dmkvvX5tN7V+bTeVamEjOTpA6qj2G + J4otfRV1I3cKayN3CmgufRZoPocoZkyPOF1VlUJNWZdGNFaVQhpFizAKOoUjBUWLMAVNkDkEUpM/A1WV + QgE9hycAIHUGBiB1BhogdQZCIHUGfyB1BrghdQe8InYIiSR3Ck0oeg8hN4MgCWSeUgJxpmAAcaZgAHGm + YABxpmAAAAAAAAAAAACawI8AmsCPAJrAjwKawI8Flr2KCmagVRk9hyc/LHwUdSV4DJ8idgmoIXYHhiF1 + B0khdQcaIXUHByF1BwEhdQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJG3 + hgCRt4YAkbeGAI61gwCKsn4AgK1yAFGRPQA7hCQBO4UkA0SKLglRkj0SZZ1UI3mpakKCr3RpfqxwiXKl + Ypxgmk6lTI43pzqEJKcvfRanJ3kOpyN3CaghdgipJHcLryx8FL42gh/UPYYm6EGJK/RCii36Q4ot/EOK + LfxDii38RIou/ESLL/tFizD6RIsv9UCIKuc3gyDQLX0VvCZ4DK8hdgipI3cJpyx8FKc7hSSkR4wymE6R + On9PkTpcRowwNjeDIB85hCIYRYswFk2QORJSkz8MVZVCBU2QOQEhdggGIXYHGiF2B0Ihdgd/IXYIuSN3 + CsAneQ6SL34WWTyGJi1VlUASbqRcBnGmYAJwpl8Ab6VeAGmhVwBjnlEAZJ5SAHOoZAB3q2gBd6toAner + aAZ1qWUNWZhGHTuGJUQtfRR5J3kOoSR4C6kjdwmGIncJSSJ3CRojdwkHI3cJASN3CQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkbeGAJG3hgCRt4YAjrWDAIqyfgCArXIBZp5VAT+H + KQM6hCMJPYYnF0SKLipQkTxFYZtPa2yiW5ZsoVu5Y5xRzlWUQdhEii/aNoIf2ix8E9omeAzaInYI2yF1 + B9shdgjeJHgL5Ch6D+4sfBP2Ln0V/C9+Fv4vfhf/L34X/y9+F/8vfhf/MH4X/zB+GP4vfhf8LX0V9il6 + EOwleAvkInYI3iB1B9sidgnaKnsS2jaCH9dAiCrJRIsur0KJLIk4gyFgMX8ZRziEIj9Eiy85TJA4L1GT + Ph9TlEAOTZA5BCR4CwYjdwoaI3cKQiN3Cn8keAu7KHoPyDB/GKM+hydxUJI7RmOdUCZvpV0Qb6VeBWyj + WwFpoVcAZJ9SAGOeUQBknlIAZ6BWAG6lXgFvpl8GcKZgD2+mXx5inlA2S482XjmEIowvfhesKnsRrSd6 + DocmeQ1IJnkNGid5DgcneQ4BJ3kOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACRt4YAkbeGAJG3hgCOtYMBirN+AoCtcgNqoFkDRIkuBzmDIhQ5hCMtPIUlT0GIK3VKjTWdUpI+wlOT + P91OkDntRIov9TmDIvcvfhf3KHoP9yR3Cvcidgj3IHUG9yB1Bvghdgf5InYI+yJ3Cf0jdwn+I3cK/yN3 + Cv8jdwr/I3cK/yN3Cv8jdwr/I3cK/yN3Cv4jdwn9InYI+yF2B/kgdQb4IHUG9yJ2CPcneQ73L34X9DWC + Huo3gyDVM4EcuC19FJgtfRWEOIMhfESKLnJLjzdeUJI8P1CSPB5IjTMJKnsRCCd5DhomeQ5CJnkOfyl6 + EL0vfhfVO4Ylv0uPNphbmUhvaKBWRm6kXCFto1sLaaFXA2agVAFjnlEAY55RAGSeUgBln1MBa6JaBG2k + XQ1upV4fbqVePGehVmJYl0WLR40xrTuFJL4zgRuzL34Why19FEgtfRUZLX0VBy19FQEtfRUAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJG3hgCRt4YBkbeGA462gweKs34MgK1zEGyh + WxNLjjYZOIMhLDWBHk82gh99N4IgqzmDIs86hCPlOYMi8jaBHvoxfxn+K3wT/yd5Dv8kdwr/InYI/yF1 + B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yN3Cv8neQ79KXsR+Cp7Ee8oeg/hJngN0it7Esg2gh/CQYgrs0eN + M5VKjjZpRowyOTqFJBgufRYQLXwVHy18FUQtfBWAL34YwTeDIONEiy7eUpM+xV2aSqBln1JwZ6BVPmaf + VBxkn1INY55SBmOeUQJjnlEBZJ5SAWSeUgRln1QMZ6BWHWihVzpooVdlZZ9TllyaSbxQkjvNRIsuyzyG + JbI2gx+BNIIdQzSCHRg1gh0GNYIdATWCHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdvJMAnbyTAJ28 + kwCdvJMAmLqNAJG3hgKRt4UKjrWDGIqzfimArXM5bKFcQk6QOko3giBdMH4Yfy99F6ovfhfULn0W7yt7 + EvkoeQ/8JngM/iR3Cv8jdgn/InYI/yF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yJ2 + CP8idgj+InYI+yJ2CPgidgn1KHoP8zF/Gu45hCPgPocowz6HKJg5hCJnMX8aPy59FisygBstNoIfSjeC + IIE5gyLDPoco7EaMMfNOkTrlVZVByFqYR51emktsYJxORGKdTyhinVAVYJxOCVmYRgJdmkoDYp1QDmKd + UCJgnE4/XptMZFyaSZNZmEbAVJVB106ROdJGjDC7QIkpmDuGJGg5hSI1OYUiEzmFIgU5hSIBOYUiAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ28kwCdvJMAnbyTAJ28kwGcvJIDlLiJCo61ghuJsn03hK93WHuq + bHdon1eJTI84kjaBHp4rexO0KHoQ0Ch5D+oneQ76JXcL/yJ2CP8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8leAv+K3sS/C9+ + F/MygBrgMoAaxC9+F6AsfBR4LXwUVjKAG0g7hSVYP4gqh0GJK8VCiS3vRIou+kaMMfNKjjXiT5I7x1aW + QqRbmUh8XJlJVFeXRDJLkDcZNIEcDTuFJA9UlEAjW5lIRluYSG5XlkOVUJI8ukqONdNFjDDSQoost0CJ + KpA+hydoPIYlQTuGJCA7hiQLO4YkAzuGJAE7hiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnLySAJy8 + kgCcvJICnLySBZy7kg6VuIoei7J+OYGtdF95qWqJbqNer12ZS8VGizDNMoAb0yh5D90kdwvpJHcK9iN2 + Cf0idgj/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUH/yJ2CP8leAv+J3kO+Sl6EPEqexHkKnsRzyl6EawpehGELn0VbTaC + H3M+hyiZQokszUOKLfJCiSz8Q4ot+UaMMPJLjzblUpM+0VWVQa9Rkz2DR40yWzeDID4neQ4vK3wSMUGJ + K0pPkjtyU5RAmlGSPblJjjTKP4gpyjiEIbQ2gh6NNoMfYjeEID05hSIhO4YkDzuGJAU7hiQBO4YkADuG + JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXuYwAl7mMAZe5jASXuYwNlriMIJG1hT+Fr3hkd6dojGqg + WbNdmUvUTY855zyFJe0tfRXvJXgM8yJ2CPchdgf8IXUH/iF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yJ2 + CP8jdwn9JHcL+iV4DPUmeA3qJngN0SZ4Da8oeQ+aLn0WmzWCHrU7hSXaP4gp9EOKLftGjDH6So419k2Q + OPFPkTrmTZA4zkWMMKo6hSOILX0UbyN3CmImeAxlNYIdeUSLLppLjze2TJA4xEaMMcA7hSSqMX8ZiC19 + FWEtfRU8MH8YIDWCHg46hiMFO4YkAjuGJAA7hiQAO4YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyy + gACMsoABjLKABoyygBWLsn81hq96YnupbJBroFu1W5dI1EuONus9hif4MX8Z+yh6D/wjdwn8IXUH/SB1 + Bv4gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8idgj+I3YJ/SN3CvgkdwrpI3cK0yR3 + C8UneQ7ELX0U0zOAG+g7hST1RIsv9EyQOO9Rkj3qUZI9502QOOJGjDDUPIYlvTGAGacoeg+XInYIjyN3 + CpAufhadO4YlsUWLL71IjTO6RYswozqFJH0ufhZXKHoPOSZ5DSAneg4PLn4VBTmFIgE7hiQAO4YkADuG + JAA7hiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeqhsAHqobAJ6qGwJeqhsHHqobEZ2pmeAa6BbtFyX + StZLjjbsOoQk+C59Fv0neQ7/I3cK/yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yF1B/8hdgf/IXYI/SF2CPchdgjtInYI5yR3C+YoeQ7sLX0V8zeDIPBFizDjUpM+1ViW + RcpVlUHFS482wkCIKbw1gh6yLHwTqCV4DKEhdgedInYJnip7EqQ2gh6rP4gpqkWLMJpFizB6PocoUDGA + Gi4oeg8ZI3cKDSF2BwUidggBLn4VADuGJAA7hiQAO4YkADuGJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARYowAEWK + MABSkT4AXJdKAl2YSwpemEwgXphMUFuXSZFUk0DISIwz6DuEJPgufRX9JXgL/yJ2CP8hdQf/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/SF1 + B/sidgj6JHcK+id5DvstfBT4NoIe5kSKLsdSkz+oW5lIk1iWRYhKjjWEPIYlgzF/GYEpexB+JHcKfSF2 + B3widgh8KHoPfTKAG308hSV3QootZ0aMMEtEii4qO4YlEjB/GAgoeg4DIXUHASB1BgAgdQYAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFijAARYowAEWKMAJCiC0HQIcqEj+GKSo+hidbPIUlmziD + IdAygBvuLHwT+yV4DP8hdgf/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yJ2CP8ldwv/KXoQ/y9+F/c3gh/aQYkrq06R + On1bmEhbXJlJR02QOD88hSQ9MH4XPCh6Dzsjdwo7IXUHOyJ2CDsoeQ87MX8ZOjqFJDZBiSwuRowxIEeN + MhBHjDEGQ4ouAT2HJwAoeg8AIHUGACB1BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApL+cAKS/nACkv5wApL+cAH6q + cQBNjjkCR4syCUOJLRc+higsOIIhTDB+GHkqexKvJ3kO2SV4C/Ejdwn8IXYH/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/InYI/yV3C/8pehD/L34X9zeCINpDiS2rUpM+eWWeU1BypmIxa6JaHE6QORI1gR0OKXsQDSN3 + Cg0hdQcNInYIDSh5Dw0xfxkNOoQjDEGJKwpGjDEHSI0zBEiNMwFIjTMASI0zAEiNMwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACkv5wApL+cAKS/nACkv5wBn7yWA3emaQlZlUYaSo02NkKILVk7hCSBMn8aqSl6 + Ec0kdwvoIXYI9yB1Bv0gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdgf/I3cJ/yZ4Df8rexP6NoEe50eL + McVal0edbaNcdHyrbUmDr3Uiga5yCnKmYgJPkToBJngMACF1BwAidggAKHkPADF/GQA6hCMAQYkrAEaM + MQBIjTMASI0zAEiNMwBIjTMASI0zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKS/nACkv5wApL+cAqS/ + nAaivpoOjbKCHW6hXzhWk0ReR4oyiTyEJbIyfxvSKnoR5yR3C/Qhdgj7IHUG/iB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yF1B/8hdgj/I3cJ/yd5DvwzgBvzRYsv4FiWRcNnn1abcqViZneoZzF4qWgOeapqA3mq + agF5qmoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAob2YAKG9mAGhvZgEob2YDaC9lyCUtok+e6htYmCZT4pKjTayOoQk1S9+ + GOwoeg/2I3cK+yF2B/4gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8hdgf/JHcL/i59 + Fvs+hijwTY852VmWRrJgm054ZJ1SOWWeUxFnn1UDZ59WAWefVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbupIAm7qSAZu6 + kgebupIWmrmRNZK1h2J/qnGPZZtUtEyNONM4giHrK3sT+CV4DP0idgn+IXUH/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8idgn/KXoR/jWBHfg/hynjR4wyvEyPN4BOkDo9T5E7ElCS + PANRkj0BUZI9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJK0hwCStIcCkrSHCZK0hx2RtIZIi7B/gnuobbVkm1PWS4036zWB + HvgneQ79InYJ/yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2 + B/8leAz/K3sT+jF/GeY1gR6+N4MhgjmEIj45hCMSOoUjAzuFJAE7hSQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgat0AIGr + dAKBq3QLgqt0IoGrdFN8qG6UcKFgylyWSulGijH4MX4Z/SR3C/8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUH/yJ2CP8kdwv6J3kO5ih6EL8pexGCKnsSPyt8 + ExIvfhcEN4MgAVuYSABuo14AbqNeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrnlsAa55bAmueWwtrnlsja55bVmecV5lel0zQT4877j2F + J/stfBX/I3cJ/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IXUH/yF2CPoidgnnJHcKwiZ5DYgtfBRHPYYmG1aVQwpjnVIFbaJdAm6jXgBuo14AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSS + QgBUkkICVJJCC1WSQiNVkkJWUpE/mUuNN9BBhyvuNIAd+yl6EP8idgj/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH+yJ2CewmeA3NLn0Wnj+H + KWhXlUQ9Zp5VI2uhWxJuo14HbqNeAm6jXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQogtAEKILQJCiC0LQ4guI0OILVZBhyyZPYUm0DaB + H+4tfBX7JngN/yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8hdQf8JHcK8yt7Et85gyLBTY85m2CaTnFpoFhJa6FaKGyiXBBsolwDbKJcAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqsCkAKrA + pABLjDgAN4EhAjaBHws1gR8jNYEeVjSAHZoxfxrQLXwV7ih6D/skdwr/IXUH/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/4leAz5Ln0W7z6G + KOBSkj7IYJpOn2aeVWton1c7aKBYGGmgWAVpoFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqwKQAqsCkAJm3kAFYk0YEP4YqDTSAHSYvfRdYLHwUmyp6 + EdEneQ7vJHgL+yJ2CP8gdQf/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IXYH/iZ4Df0vfhf5P4cp81CRPONcmEq7YZtPgGKcUEZjnFEcY5xRBmOc + UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrA + pACqwKQBpr6fA4SreQhimVIVR4oyLzSAHWAqexKgJngN0yR3C+8idgn8IXYH/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdgf/JXgM/i59 + Fv48hSb8S4438FWUQslZl0aJWpdHS1qXSB5al0gHWpdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqsCkAKrApAKov6IImbeRFIKqdydkmlVFRYkxdDF+ + Ga0neQ7ZI3cJ8SF2B/wgdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8leAv/LHwT/ziDIP5Eii70TI84zE+RO4xQkTxNUJI8H1CS + PAdQkjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACqwKQAqsCkBKnAoxGiu5splLSLSX6ocW9dlkyaPoUpxCx7FOQkdwv1IXYH/SB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yN3 + Cv8pehD/MX8Z/zuFJPRBiCvMQ4otjEOKLk1Dii4fQ4ouB0OKLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrApACqwKQGqcCjHKW9nkOcuJRyi6+BoW6f + YMhMjTjhM38c8SZ4Dfohdgj+IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/InYI/yZ4DP8rexL/MX8Z9DWBHsw2gh+MNoIgTTaC + IB82giAHNoIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAqr+jAKq/owipv6Mjpr2fVJ65l46QsofEdqNo51OQQPY3gSD7KHkP/SJ2CP8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8hdgf/I3cJ/yZ4Df8qehH0LHwTzCx8FIwtfBRNLHwUHyx8FAcsfBQBOIMhAEiMMwBXlUQAYpxRAGqg + WQBtol0AbaJdAG2iXQBtol0AbaJdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG+kXwBvpF8Ab6RfAG6k + XgBuo10AbKJbAGmgWABon1cAb6NeAHysbgCLtX8AmL2NAKDClgCkxJoApMSaAKTEmgCkxJoApMSaAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpv6MAqb+jCKm+oialvZ5an7mXmJKy + iNF4pGvzVZFD/TiCIv4pehD/InYI/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8idgj/I3cK/yV4DPQmeQ3OJ3kOjyZ5 + DlImeQ0mJnkODix8FAg4gyEISIwzCFeVRAdinFEGaqBZBG2iXQJtol0BbaJdAG2iXQBtol0AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAb6RfAG+kXwBvpF8BbqReA26jXQVsolsHaaBYB2ifVwhvo14IfKxuCIu1 + fweYvY0GoMKWBaTEmgOkxJoBpMSaAKTEmgCkxJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKm+ogCpvqIIqL6hJ6W8nlyeuJaakbGI03ika/VWkUP+OYIi/yl6EP8idgj/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yF1B/8idgj/I3cK9SR3C9MkdwucJHcKZSR3Cz4meA0pLHwUJDiDIiNIjDMjV5VEIGKc + URtpoFkTbKFcCmqhWgNknVMBU5M/AD6HKABPkTsAZp1UAHioaQCCrnQAg691AHmqagBmnlQAbKJbAm6j + XgZuo14PbaNdF2yiWx5poFgiaJ9XI2+jXiN8rG4ji7V/IZi9jR2gwpYVo8OZDKPDmQWiw5gCn8GVAIy2 + gAB8rG4AfKxuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqL2hAKi9oQiovaEmpbudW564 + lpmRsYfSd6Nq9FWRQ/04giL+KXoQ/yJ2CP8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yJ2Cf8kdwr3JXcL3CR3 + C7EkdwqGJXcLaCh5D1gvfhdVOoQkVUmNNVRXlUROYZtPQ2aeVS9lnVQaWJZFC0GIKwU1gR4DPIUmA0+R + OwNmnVQDeKhpA4KudAODr3UDeapqA2KcUANamEgGZZ5UEmqhWSVrols5a6FaSmmgWFNon1dVbqNeVXur + bFSIs3tQlLqIRpu/kDSdwJIemr6PDpS6iAWLtX4Cfq1wAHysbgB8rG4AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACovaEAqL2hCKe9oSWku51XnbeVk4+whsp2o2jsU5BB+TeBIfwoeQ/+InYI/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yF1B/8idgj/JHcL/yd4DfooeQ7nJ3gNyCZ4DasneQ6YK3sTkDOAHJA/hymTTI83kVeV + RIlfmk12YZtPV1qXRzNGizEbM4AbETF/GQ88hSUOT5E7DmadVA54qGkOgq50DoOvdQ55qWoOYpxQD1CS + PBRZl0YnY51SRmegV2dpoFiBaJ9XkGefV5Rtol2UeKlpkoOwdouNtoB7k7mHXpO5hzqOt4IeiLN7DoKw + dAZ9rG8CfKxuAHysbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKe9oQCnvaEHp72hIKO7 + nE2btpOCja+DtnGgY9pPjjztNYAe9yd5Dvwidgj+IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXYI/yR3Cv8oeQ//LHsT+y18 + FO0rexLXKnoRxCt7E7oyfxu7PIUmxUaMMc1QkTzNV5VFwluXSatZlkaETI44WTeDITssfBQvMH4YLDyF + JStPkTsrZZ1UK3ioaCuCrnQrg691K3mpaitinE8sSo41Mk2QOElZl0dwYZxQmWWeVLlmn1XMZ59W0Guh + WtFypmPOe6tsxYGvc7GFsXeNhbF3YIKwdDp/rnIhfa1wEXysbgZ8rG4BfKxuAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAp72hAKe9oQWnvaAXobqaOJe0j2KFq3qNZ5tXtkaJMdYwfRjsJXgM+CF2 + B/4gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yF1B/8idgn/JnkN/y18Ff8zgBz6NoEe6TOAG84yfxq6NoIftEGILMFOkDrZVZRC61iW + RfBYlkXnVZRC00yOOLI9hSeMLX0Wcil6EWgvfhdmPIUmZU+RO2VlnVNld6hoZYGuc2WDr3RlealpZWGb + T2ZHjDJrQoksf02QOKBYlkXEYJtO4GSdU/BmnlX0Z59W9GmgWPJrolrrbaNd2XCkYLpzp2SQd6loZ3mq + a0N7q20lfKxtD3ysbgN8rG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnvaEAp72hA6a8 + oAyct5UejK6COHKgZFpRjz6IN4EguSl5EN8jdgn0IXUH/SB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yR3Cv8qexH/M4Ac/z2F + JvdCiCvcQYcqs0GIK5NLjjaMXJhJoWefVshon1jlYptR7lmWRutOjzrgQYgrzjJ/G7kqehGtK3sTqjOA + HKxAiCqtUZI9r2SdU690pmSvfatur32sbq90pmSvX5pMr0aLMLI8hSW7Q4kty0+RO9tZl0fpYZtP8WSd + U/NjnVL1XppM9lmXRvVYlkTtW5hJ3WSeU8Jto12bcqZibXSnZT92qGcadqhnBnaoZwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKe9oQCnvaEBpLueBIyvggxunmAbT448NjaBH2cpeRCkI3cJ1SF1 + B/AgdQb8IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8hdgf/JXgM/y18FP85gyL/Rosx9U6POdJQkDycVJNAcGOcUWF2p2d0fatvnHeo + aLtqoFnFWZZHxkmNNcM6hCS8Ln0Wtyx8FLo0gB3FP4cp0kqONtxWlUPiYpxR42yhW+NwpGDjcKRf42if + VuNZlkXjR4sx4j6GJ95BiCvYSo420VWUQsxemk3KZJ1Ty2GcUNNamEjeU5RA6lCSPPJTk0DxWphI42Cb + T8BjnVKKZZ5UUWafVSJmn1UHZp9VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp72hAKe9 + oQCduJUBZppWBUSIMA8yfhooKHkPWiR3CpwidgjSIXYH7yF1B/wgdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8meA3/L34Y/z6G + KP9OkDr0WZZGzl2YSpFim1BdcaRhQ4SvdkqHsXplfqxwe22iXYNZlkeFR4wzhDeCIYIvfheFNYEflUWK + MLBRkj7MWZdH4l6ZTO1gmk7xYJpO8l6ZTPRbmEj1VpVD9U+QO/RIjDPuRIov3kaLMcRMjjepVJRBlF6a + TIlknlOKZZ5UmmGcT7RcmUrQWJdG51WVQvRSkz/uUJI8zU+RPJVPkTtYT5E7JU+ROwhPkTsAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnvaEAp72hAIOqdwA+hSgDMH0YDCt6EiQoeRBXJ3kOmiZ4 + DdEkdwvuI3YJ+yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/InYI/yd5Dv8ygBv/RIov/1iVRfRlnVPNaqBZjm6iXVR3qGgxibJ7KYy0 + fzWBrXNBbqJeRVmWR0ZHizJGN4IgRjOAHExFizFiWpdIh2WdVKxon1jJZZ1U2F2ZS95UlEHiTY856keM + M/BFii/yRYsw7kiMM+BLjjbFTY85n1CRPHlVlEJbXZlLS2afVU1so1xhbaNdhWqhWqxjnVLOV5ZE5UqO + NelAiCvOPIYmlzqEJFk5hCImOYQiCDmEIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKe9 + oQCnvaEAPIMmADN+HAIyfhsLMn4bIzJ+GlYxfhmaLnwX0Ct7E+4neQ77I3cJ/yF1B/8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8idgj/KXoQ/zaC + H/5Mjjj9Y5xS8nOlY8p5qGqLe6ptToCsciWLs34UjrWBFYKudBpvo18bWZdHHEaLMRw3giAcPYYnIlyY + SjdwpGFbdqdnf3OmZJtqoFqqW5hIsUuONr0/hynPOIMh3jeCIOM8hSbaRoswwk6QOp5Tkz91VZRCTliW + RTBemkwha6JaInepaTZ6q2xadadlg2igWKpVlELLQYkr2zSBHcgufRaWLHwTWSp7EiYqexEIKnsRAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABChi0AQoYtAkKGLQtChi0jQoYsVkCF + K5k8gyXQNYAe7i18FfsmeA3/IXYH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yJ2Cf8qexH+OoQj/FOSQPhvol/rgq10w4mxfYWLs39KjLSAH461 + ggmOtYIFgq51Bm+jXwZZl0cGRosxBjiDIgZWlUMKealrGoOvdzOCr3ZNe6ptYW2iXWxYlkV1QoksiTSB + HakufRbFLn0WzzSBHcFBiCueTpA5dVWUQk9ZlkYuWpdIFl6aTAp2qGcLhbF3G4KwdTh3qWhcZZ5Tg02P + OKw3gyDJK3sTwSZ4DZMkdwpZI3cJJiN3CQgjdwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFaQRABWkEQCVpBEC1aQRCNWkENWU49AmUyLONBBhizuNX8e+yl6EP8idgj/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/I3YJ/it7 + Evs8hSb1V5VF63enadiOtIKwl7qNd5q7kEGbvJEam7yRBpa5igCCrnUAb6NfAFmXRwBGizEATY85AImy + fAKQtoUJj7aDFYmyfSF/rXIqbqNfL1OTQDk6hCNWL34XhSx8FK0tfBS/MX8ZrzuFJIVGizFaTpA6OFKT + Px9VlEEMWJZFA4GucgSCsHUQeqprJmuhWkRXlURqQYgrlzB+GL0oeQ68JHcLkiJ3CVkidggmIXYICCF2 + CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZxeAG2cXgJtnF4LbJxdI2yb + XVZomViZXpRN0E+NPO4+hCj7LXsV/yN2Cf8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8kdwr9K3sS9jqDI+dUk0HQd6dosJO3iIegvpZZo8CaMKXC + nBOlwpwEpcKcAAAAAAAAAAAAAAAAAAAAAACTuIgAk7iIAJO4iAKQtoQFibN9B3+tcgltol0LSIwyFTeC + IDg0gR1vNIEcojWBHr04gyG1PYYmkUKJLGZFizBCR40yJUiNMw9HjTIEa6FZBXCkXxNroVotYJtOT1KS + PnZAiCqiMn8awyp7Eb4neQ6SJXgMWSR4CyYkeAsIJHgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACBpnUAgaZ1AoGmdQuApnUif6Z0UnqjbpNunF/JW5NK6EWIMPcwfRn9JHcL/yB1 + B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQf/InYJ/yZ4 + DfssexTuNoEf1EmNNaxpn1l8jbOBUaC/lzGmwp0aqMSgCqnEoQKpxKEAAAAAAAAAAAAAAAAAAAAAAJO4 + iACTuIgAk7iIAJC2hACJs30Af61yAFiWRgFCiCsKQYgqLUGIKmZBiCudQYgrwkGJLMpCiS24Q4otlEOK + LWlBiSxBPocnITWCHhBEii0SWphHJ2CbTkxemUt3VZVCoEeMMsE5hCLRMH4Xvyt8E48pexFVKHoPJCh6 + Dwgoeg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2thACNrYQCja2ECY2t + gxyMrIJFhal7fHahaa5flU/QR4kz6DJ+G/YmeA39InYI/yF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8leAz/LHwU+jSAHOk8hCXGRooxkVmVRlV5qGsql7mNFKLA + mQqoxKAEqcShAanEoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS441AEuO + NQhKjjUmSo01VkmNNIpHjDOzRYswzEOJLdFAiCq8PocnljqFI201gh1LMH8XOTSBHDpEii5RT5E6eFKT + P6JQkjzCSI0z0DyGJskzgBurLn4Weyx8FEgrfBIeKnwSByp8EgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAk7CLAJOwiwGTsIsGk7CKE5KviS+Jq35XdaBog1yUTKtGiDLONYAe6yp6 + Evsldwz/InYJ/yF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdQf/I3cJ/yp7 + Ev02gR/3Qogs40uNNr1SkT+DWpZIQ2qfWhiHsHoImbqPA6fDnwGpxKEAqcShAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPkTsAT5E7Bk+QOxpOkDk8S443ZEeMM4xDiS2xPocoyzuF + JM05gyG4N4IfnDWBHYU0gRx4NYEdeTqEI4lAiCqkQ4ouvUSKLspBiCvCOoQjpjOAHIAvfhdYLX0VMix8 + FBUsfBQFLHwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWsY0AlrGNAZax + jQOVsY0KlLGMGoeqfDNvnWFYWZJHhkiJNLY8gyfgM38c+Ct6E/8ldwz/InYI/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IXYH/yJ2CP8meA3+MH4Y+D+GKexOjjrTWpVHq2KaUHRmnFY4a59bEXin + agSIsHwBo8GbAKnEoQCpxKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFKS + PQBSkj0DUZI9Dk6QOiJJjTQ+Q4ouYD2GJ4g5gyKwOIMgxjmEIsc8hSXAPoYnuT+HKLQ/hyi1PYYnujyF + JcI6hSTFOYQivDeDIKE0gR15MX8ZUi9+FzQtfRUcLX0VCy19FQItfRUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeyjwCXso8Al7KPAZeyjwSVsY0KgaZ1GmqaWzpck0trU49Bo0uL + OddBhiz1NH8d/il6Ef8kdwr/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8jdgn+JXgM/ip7 + Evo1gB7uRYkw1laTQ7Zkm1OObqFfXXOkZCx0pGUNdqVnAnemaQCGr3oAqcShAKnEoQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU5M/AFOTPwFSkz4GTI83D0SKLiA8hiY5N4IfXjWB + Hoc6hCKpQYgrwEmMM85OjznYUJE83U+QOt1KjTXWQ4ktyjuFJLc0gRydL34XeC19FU4tfRQtLX0VGC19 + FQwtfRUFLX0VAS19FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl7KPAJey + jwCXso8Al7KPAZKviQN7o24McZ5kKW2bX1pomVqWYZZRzVOPQe9AhSv6MH0Z/Sd4Dv4idgn/IXUH/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQf/InYI/iV4C/wpehD6MH4Y8TmDI9tHizK3V5RFjmidWGV1pWc+fKlvHH2p + cAh+qnACfqpwAH6qcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABTkz8AU5M/AFGSPQFEii4FOYQiDTSAHBwxfxk2NoEeV0OJLX1Skj+jXplMxGScU91mnVXqZJxT6V6Z + TNlUk0G6R4syljiDIXArexJLJngMKiZ5DRQoeg8JKnsSAy19FQEtfRUALX0VAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXso8Al7KPAJeyjwCXso8Ai6uBAIipfQeHqH0hhad6ToCl + dYZ3oWq7ZZhW306MO/A5gSP4LXsV/SZ4Df4idgj/IHUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/4jdwr7J3kO9i18 + Fe01gR7dPYUnvEaKMY5SkT9gYppROnSkZh6Aq3MNgqx1BIKsdQGCrHUAgqx1AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOTPwBTkz8AQ4otADF+GQEufRYELnwVCy99 + FhY/hykqW5dITG+jYHh6qWyjf6xxxX+scdd9qm/WeKdpv2+iX5dhm1BqTI44QjJ/GiQidggRIXUHByF2 + BwIidgkBKXsQAC19FQAtfRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZsZEAmbGRBZmxkBmWsI07kK2HZ4Woe5VynmS8WpJJ2keIM+05gSP4LnwW/SZ4 + Df8hdgj/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8hdQf/InYJ/SR3C/YpehDoL30X0jiCIbQ/hiqMRIkvYEmMNThTkT8bZpxVCn6q + cQOCrHUBgqx1AIKsdQCCrHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAtfBQALXwUAC18FAEtfBQCMn8aBV+ZTQ6ArXMmjbSCTJK3h3KSt4eRkbaGoo60 + g6CLs3+Lh7B7Z4Ctc0BypGMfUZE9DCV4DAQgdQYBIHUGACB1BgAgdQYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKC1mACgtZgDn7WYDpuz + lCKVr4w+ial/YHiha4pmmFe2V5BF2EiINO05gSP4LXsV/SV3C/8idgj/IXUH/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUH/yJ2Cf8leAz7KHkQ7yx8 + FNUxfhqtOIIifj+GKlRDiC40RIkvHEWKMAtJjDQDZZxUAIKsdQCCrHUAgqx1AIKsdQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC18FAAtfBQALXwUAC18 + FABemEwAlrmMBJy9khGcvZMnnL2SPpq8kFCYuo5albiKWZO3iE2St4c3kbaGII+1hA6Jsn0DU5I/ACB1 + BgAgdQYAIHUGACB1BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAoLWZAKC1mQGftZgGmrKSDpKuiR2GqHw0eqJuWm+cYopjllS0VY9D00aI + Mug4gSL2LnwW/Sh5D/8kdwr/IXYI/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8hdgj/JngN/y18FfozfxzpOIIixjuEJpE+hSlWQYcsK0OILhZEiS8LRIkvBESJ + LwFEiS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6+lQCevpUBnr6VB52+lBCdvZMZm7yRIJm6 + jiSWuYsklLeJH5O3iBaSt4cNkreHBZK3hwGSt4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgtZkAoLWZAJ+0 + mAKXsI4FjauEDISmeRp8o3E2dZ9oXGuaXYVflE+qU45By0iJNOc9gyf3Mn4b/Cl6Ef4kdwv/InYI/yF1 + B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yF2B/8hdgf/IXYI/yR3Cv8rexP/OIIh+kOI + LuZLjDfAUI89hVGPPkNNjjoYSIszCEWKMAREiS8BRIkvAESJLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAnr6VAJ6+lQCevpUCnb6UBZ29kwibvJEKmbqOC5a5iwuUt4kKk7eIB5K3hwSSt4cCkreHAJK3 + hwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKC1mQCgtZkAnrSWAJCthwKHqH0FgaV2DH6jchx4oWw1cJ1jVmiY + WX1glVCmV5BGzEyLOeU/hCrzNH8d+Sx7FP0neA7+JHcK/yJ2CP8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2 + CP8jdwn/JXcL/yZ4DP8meA3/KXoQ/zN/HP9DiC75UZA/5VuWSr1imVGAZJpUPWGZURFYk0UDT487AUWK + MQBEiS8ARIkvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACevpUAnr6VAJ6+lQCdvpQBnb2TApu8 + kQKZuo4ClrmLApS3iQKTt4gBkreHAZK3hwCSt4cAkreHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoLWZAKC1 + mQCSrokAgqZ4AICldQF/pHQEf6RzC3uibxh1n2kwcJ1jUmuaXntll1alW5JKx06LO99Dhi7vOYEj+DF9 + GfwqehH+JXcM/iJ2Cf4hdQf/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8hdgj/JHcK/yh5D/4sexP+LnwW/jB9GP4zfxz/PYQn/0yN + OPlZlEjlY5pTvGmdWn9sn107bJ9dD2qeWwJonVgAWZRHAESJLwBEiS8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJ6+lQCevpUAnr6VAJ2+lACdvZMAm7yRAJm6jgCWuYsAlLeJAJO3iACSt4cAkreHAJK3 + hwCSt4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+kdAB/pHQAf6R0AH+kdAF/pHQCfKNwCHqi + bhZ4oWwudZ9pTnGdZHNpmVubYZRRwVaPRd1LijfuPoQp9jJ+G/gqehH6JngN/CR3Cv0jdgn+InYI/yF2 + B/8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yF2B/8idgj/I3YJ/yR3 + C/8pehD9MH0Y/DaBIPo7gyX6PoUp/EGHLP1IijT+UpA/+VqVSOVgmFC8ZJtUf2acVjtmnFYPZptVAmab + VQBmm1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAf6R0AH+kdAB/pHQAf6R0AH6kcwB+pHMCfqRyCH2jchR8o3Eme6JvQXmhbWl1n2mZbJpev16T + TdZNizrhPIIm5jF9GestexXyK3oS+Sl5EP0neA3+JHcL/yJ2Cf8hdgf/IHUH/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yF2B/8jdgn/JXgM/yh5D/8qehL/LnwW/jR/Hfk8hCbyRIgw7UuMN+1Rjz3yVJFB+VWS + Q/1WkkP5VpJD5VWSQ7xVkkN/VZJDO1aTQw9Xk0QCV5RFAFeURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfqRzAH6k + cwB+pHMCgaV3BYSmeg2HqH4diaiAPoanfGl8onCNa5pdo1eQRa5EhjC3O4IlxjuCJds7giXtOIEi+DN+ + G/0texT/KHkP/yR3C/8idgj/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1 + Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdQf/JHcK/yl6EP8vfRf/NoEg/z6E + KP5FiDH7S4s37U+OPNpVkUPMXZVLzGWaVdlpnFrtZZpV+luUSflRjz3lSYs1vUWJMH9DiC47RIgvEEmL + NAJQjzwAZ5xXAHGhYgBxoWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+pHMAfqRzAISnegCPq4cBkayJBJKtigySrIofjaqEOoKl + d1BwnGJeXJJLZ0yKOXRLijiPUY0/tVKOQNVNizrpQ4cv8jiBIvUvfBf1KHkP9SR3C/Yjdgn4I3cK+iR3 + C/0kdwv/JHcL/yR3Cv8kdwr/I3cK/yN3Cv8jdwr/I3cK/yN3Cv8kdwr/JHcK/yR3C/8kdwv/JHcL/yR3 + C/4kdwr8I3YJ+SN2CfcneQ/1MX4a9T2EJ/VKizb1WJJH9GWZVe5rnFzWapxbs2udW5txoGObe6Zusn+o + ctZ1ombvYJdP9E2NOeNAhiu+OoMjgzqDJEJIijMXYJhPB2udWwNwoWEBcaFiAHGhYgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAk62LAJOtiwCTrYsBk62LBZOtiw2OqoUYgqV3InGcYylfk04vWJBGPWCUUFtomFmHZphXrF2T + TcNQjT7NQYUs0DR/HdAsexPSKXkQ1ip6Ed8ufBbqM34b9jR/Hf0zfhz/MX0a/zB9Gf8wfRj/MH0Y/zB9 + GP8wfRj/MH0Y/zB9Gf8xfRn/Mn4a/zN/HP80fx3+NH8d+TF+GvEsexTmKHkP2it7E9I3gSHQR4oz0FmT + SNBsnV7QfaZxyYWqeq2FqnmFgql2aYare2mPsISEjrCErn2mcNFhmFDhSos23D2EJ8M6gySVRYkwXFuV + STFrnlwbb6BgDnChYQVxoWIBcaFiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTrYsAk62LAJOtiwCTrYsCk62LBI6q + hQiCpXcLcZxkDmSWVRJml1cdcp1kNnagaVlxnWR3ZphXiVeQRZFGiDGUN4AglC98F5cwfRihOIEitEOG + Ls1MijjmTYs69UqKN/lGiDL5RIcw+UOGLvlDhi75Q4Yu+UOGLvlDhy/5RIcw+UWIMflHiTT5S4o3+U6M + OvdOjDrtSYo13D+FKsMyfhuoL30XmDqDJZRNjTqUYZdRlHejapOKrYCNlbOMd5azjVeUsopBl7SNQZy3 + k1aVtIt8fKZvo12VS8JIijPRQIYqzEOILrFSjz6IYplSXmudWztsnl0gbZ9eDW2fXgNtn14AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJOtiwCTrYsAk62LAJOtiwCTrYsBjqqFAoKldwJ0nmcDb5xhBXegagx/pHMbf6R0MXih + bENrml1OW5JKU0iJNFU5gSJVM34bWTyDJmdOizqCXZNMpmeYV8lnmFjfYZVR5VuTS+VXkUblVpBE5VaQ + ROVWkETlVpBE5VeQReVYkUflWpJJ5V2UTeVillLlZ5lY4WmaWtRlmFW7WZJIl0SHL3I1gB5bPYQnVVCO + PVVmmlZVfaZxVJKxiFGeuJZDobmaL6C5mSKiupoipLucMJWzi0tzomV0VpJEokiKNMZFiTDVS4w3z1aS + RLZgmE+MZZpUXGabVTJmm1YUZptWBGicWACRsYgAkbGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk62LAJOtiwCTrYsAk62LAJOt + iwCOqoUAg6V4AIGldgCFp3oBh6h9BIiofgqFp3oUfKNwG26cYCBdk0wiSoo2IzqCIyM6giQnUo4/N2qZ + W1N5oWx5f6Rzn32jcbZ0n2i8bZtfvGiZWbxmmFe8ZphWvGaYVrxmmFe8Z5lYvGmaWrxrm128b51hvHag + aLx8pHC4gaZ1qoCmdJB3ompqYJZPQkCFKyo+hSkjUo8/I2ibWSOAqHQjlrONIaO6nBynvaETqL2hDam+ + og2nvaATiq5/JmaaVk9TkEGJTY05vEyNOdxQjzznVZFC2lmUR7FblUl3W5VKQVyWSxpfl04GdqNoAJGx + iACRsYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJqX8Aial/AImpfwCJqX8Bial/AoWn + egR8o3AGb5xgB12TTAhKijYIO4IlCFCNPQt3oGkXial/LZCsh0qRrYhni6qCeIKmd315oWx9c59mfXGe + Y31wnWN9cZ1jfXGdY31ynmR9dJ9nfXehan18o3B9g6d4fYusgXqRr4hvlLGLW5KwiT6FqXkgXZVMDUCG + KwhSjz8IaJtZCIGodQiWtI4Ho7udBqi9ogSpvqIDqb6jA6K7mgVzoWURX5dPOlmUSHlXkkW1VJFC3lGP + PvJOjjvtTI05xkyNOYdOjjtLUZA/IF2WTAiEqnkBkbGIAJGxiACRsYgAkbGIAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAImpfwCJqX8Aial/AImpfwCJqX8Ahad6AHyjcABvnGAAXZNMAEqKNgBLijcAjquEApqy + kwecs5USnLKVIJmxki2SrYo1iKh+OH6kczh4oWw4dqBpOHWgaDh1oGg4dqBpOHehajh5om04fKRwOIGm + djiJqn84kq+JNpmzkTGetpYoobeaGqG3mQyYs48DV5FFAFKPPwBom1kAgah1AJa0jgCju50AqL2iAKm+ + ogCpvqMAfKZvAWudXAtqnFowZ5tYbWKYUqlalEnUT4487USIMO8+hSnOP4Yqk0aKMlhVkUMsb59iEY2v + hAWRsYgBkbGIAJGxiACRsYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+0mACftJgAn7SYAp60lwSds5YHmrGTCpOuigyIqX4MfqRzDHmi + bAx2oGkMdqBpDHagaQx2oGkMd6FrDHmibQx9pHEMgqd3DImrfwySr4kMmrOSC5+2mAmiuJsGpLmdA6S5 + nQGkuZ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1o2gAdaNoCHWiZyZxoGJXZ5tYiVqU + SLRJizXVOoMk5TWAH9U+hSmoUY8+dmicWUuBqHUpj7CGEpGxiAWRsYgBkbGIAJGxiAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn7SYAJ+0 + mACftJgAnrSXAJ2zlgCasZMAk66KAIipfgB+pHMAeaJsAHagaQB2oGkAdqBpAHagaQB3oWsAeaJtAH2k + cQCCp3cAiat/AJKviQCas5IAn7aYAKK4mwCkuZ0ApLmdAKS5nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHqlbQB6pW0FeaRsFnGgYzZjmFJcUY8+hj6FKbIzfxzXNoEg30eKM8helk2jc6FmeoSq + eU2MroIkjK+DCoyuggKMroIAjK6CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeqVtAHqlbQJ4pGsKapxaG1WR + QzdEiC9gN4EhljN/Hcw8hCboTo074mKYUshyoGSgfaZxaoKpdjKCqXcPgql2A4KpdgGCqXYAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB6pW0AeqVtAXajaQRelk0NS4s3JEGGLEw8gyaHPIMnxkSIMOxRjz/wX5ZO22mb + WrRvn2F5cqFkOnKhZRFyoWQDcqFkAXKhZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHqlbQB6pW0Ab59hAVSQ + QgdNjDocS4s4REqLN4FLizjETo087lOQQfZYk0fjXJVLvF+WToBgl089YJdPEmCXTwNgl1ABZ5tYAHij + awB7pW4AgKd0AIirfQCQr4cAlrOOAJq1kgCctpQAnLaUAJy2lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAeqVtAHqlbQBil1EAX5VOBl6VThpelU5CXpVOf12VTcNak0ruVpFE91KP + P+VPjTu+TY05gkyMOD5NjDkST448BFmTRwFyoGQAeKNrAHulbgCAp3QAiKt9AJCvhwCWs44AmrWSAJy2 + lACctpQAnLaUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHWh + aAB1oWgGdaFoGXWhaEF1oWh/cZ9kwmiaWe1ak0j2TIw55UKHLb88hCaDOoMjQD2EJxRLizcFYphSA3Sh + ZgJ4o2sCe6VuAoCndAKIq30CkK+GApazjgKatZIBnLaUAZy2lACctpQAnLaUAJy2lAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiat+AImrfgWJq34Yiat+PoirfneDqHi3c6Bm4l2U + TO5IijTiOoIjwDJ+GokzfxxLQ4cuIl2VSxRsnV0RdaJnEXikaxF7pW4RgKd0EYirfRCQr4YPlrONDZq1 + kgmctpQFnLaUAZy2lACctpQAnLaUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACUsYwAlLGMBJSxjBOUsYwxlLCLX4ysgpR3omq/W5NJ1USHL9g3gSDHNH8doD2EJ29Rjz9PY5hTRG6e + X0J1omdBeKNrQXqlbUF/p3NBiKt9QI+vhjyVso0ymbSRI5q1khKYtI8GkbCIAoSpeABUkEEAQoctAEKH + LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiykACYspADmLKQDJiykCCXso8/i6yBZXCe + Yo9Tj0C0QIUrzTmCItI7gyXCRokxp1WRQ5NimFKMa51ci3KgZIt1omiLd6Nqi3ylb4uDqHeIiax+gI2u + g22Or4RPiKx9LHijaxNil1EIUY8+A0SILwFChy0AQoctAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSu + iwCUrosAk6+KAJOvigKTr4oKk6+KGZKviTCEqHpQZ5lYeU2MOaY+hCjKOoIj3j2EJuBGiDHVUY8/zFyU + S8llmVXJa5xcyW+eYMlwn2LJc6BlyHejasZ7pG67fKVvpHija39tnV1TW5NJME2MORtGiTIOQoctBUGH + LAE8hCYANoEgADaBIAA2gSAANoEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlK6LAJSuiwCTrooBjqyFBYurgg6KqoEhiap/PH6l + c2BmmFeJTYw6sj6EKdM4gSLoOYIj70CFK+xKijbpVJBB51yUS+djmFLnZplW52eaV+dnmljnaJpY5Gia + WNtlmVXIYJZPqVaRQ4JLizdbRYgwPEKHLSJAhisQPIQnBTeBIQE2gSAANoEgADaBIAA2gSAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACUrosAlK6LAZOuigSOq4QNh6h9HYOmeDd/pXRceKFrhmaYV61QjT7MQIUr4jiBIe42gB/wOoIk7EGG + LOdLizfmU49B5lmSSOZdlEvmXZRM5luTSuZYkkbkVJBB4FCOPdVMizjFR4kyrUSHLoxBhixkQIYqQD2E + KCI5gyQPNoEgBjaBIAI2gSABNoEgADaBIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSuiwCUrosDk66KDI6rhB6Fp3s5faNxW3Wg + aYZtnF+zYZZR1VKOQOZFhzDtO4Mm6zaAIOE1gB/TOoIkyUKGLcZLijfFUY4+xVSPQcVUj0HFUI08xUmK + NMVDhi3HP4QpyT6EKM0/hSnLQIUqtz+FKpA9hShmO4MlQTiCIiQ2gSARNoEgBjaBIAI2gSAANoEgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAlK6LAJSuiwaTrooZjquEO4SmeWN3oGuLaZpbtF2UTdlVkEPwUI099kuLOPBGiDLfQIUrwzmC + I6M3gSCPPYMniEWHMIZLijeGTow6hk2MOYZHiTOGPoQoiDeAIJA1fx6gOIEhuT2DJ9E/hSnTPoUoujuE + JpY5gyNuN4IhRjeBISM4giIMPIQnA0WJMQFvnmEAhKl5AISpeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNq4QAjauECY2rgyiIqH5cf6RzkXGd + Y7xelE7cTYs68EeJM/hMizn0U45B5FaQRMVUj0KZSYo2aTyDJ0k8gyY/QoYtPUiJMz1Lizc9Soo2PUSH + Lz06giNANH8dTDaAHmY6giSQPoQovj6FKdc8hCfVOoMkwTmCI6A6gyRyQIYrQE+OPB1jmFMMdKFnBYKo + dwKEqXkAhKl5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAma+TAJmv + kwCZr5MAma+TAISmegF9onALfKJwMnmhbHJynWSuZ5hX2leQRfJIiTT5RIcv8U2LOd9ZkUjCY5dTnGeZ + WGtjl1M6Uo4/GkKGLRBDhi4OSIkzDUuKNw1KijYNQ4cuDTuCJBE5giMdPIMmNz+FKWE/hSqTPYQouzqD + JNA5giPTOoMkw0GHLJ5Rjz5tZppXQ3aiaSd+pnMVg6l4CISpeQKEqXkAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZr5MAma+TAJmvkwGZr5MClK2NBXWeaBJnmFg7YpVSfF6T + TbhZkUjhU45A9E2LOfJMizjdU45Aul2TTJJnmVhpcJ1iQXOfZh5xnmQJZphXAlSPQgFJiTQBS4o3AEqK + NgBDhi4BQIUqA0CGKwtBhiwcQYYsOT+FKl48gyaIOYIjrjmCI8k+hSnSSos2xF2VTKJwnmF4eqNtUH6m + ciyAp3USgKd1BICndQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmv + kwCZr5MBma+TBJmvkwuXrpEVgaR3KWSWVVJUjkKLTYs6vkyKOdxOizvlUY0/2VWPRLpakkmOYJVQYmiZ + WT5wnWIidaBnDnWgaAR1oGgBdaBoAHWgaAAAAAAAAAAAAEGGLABBhiwBQYYsBUGGLA5BhiwbP4UqMzyD + Jlo7gyWNPYQou0SIMNhQjj7eYZdRzG6dYKZ1oWdyd6JqQHmjbBp5o2wGeaNsAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAma+TAJmvkwKZr5MKma+TGZiukjCKqIJQbZpgelON + QaZFhzHHQoUt1EeIM8xRjT6xW5JKi2CUUGFjllQ8aJlZIG+cYQ50oGcFdaBoAXWgaAB1oGgAdaBoAAAA + AAAAAAAAQYYsAEGGLABBhiwCQYYsBUGGLApChi0ZQ4cuQESHMHpHiTSyTYw621WQRO5gllDmaJpZwGuc + XYdtnV5MbZ1fH26dXwdunV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACYrpIAmK6SBJiukhCYrpIqmK6SUY6qhn52nmqoWI9HxkOGL9M6giXLPYMnrUqKN4JbkkpZY5ZUOGaX + VyBomVoObZteBXSfZwF1oGgAdaBoAHWgaAB1oGgAAAAAAAAAAABBhiwAQYYsAEGGLABBhiwBRIcvA0+N + PA5Sjj80U49BcVWQQq5WkUXdWZJI9VyUTPFflU/MYJZQkGCWUFJhl1EiYZdRB2GXUQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiukgCYrpIFmK6SFpiukjmYrpJukKqJqHug + cNJdkk3jRIYw3TV/H8MxfRqTO4IlWVGNPy5jllMZZ5hXDWmZWgVqmVsBb5xhAHWgaAB1oGgAdaBoAHWg + aAAAAAAAAAAAAEGGLABBhiwAQYYsAEGGLABdlEwAY5ZSC2OWUjBillJuYZZRrV+VTt5clEv3WZJH9FaR + RdBVkEOSVZBDU1WQQyJVkEMIVZBDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAmK6SAJiukgaYrpIamK6SQpiukX6RqonAfaFy62CTUPRFhjHjM34cvil5EIMoeRBCN4AgFlSO + QgdhlVADaJlZAWmZWgBpmVoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG6c + XwBunF8LbpxfMGybXW5qmlqtZZhW3l+VTvdXkUX0UY4/0E+NPJJOjDtTTYw6Ik2MOghNjDoAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYrZIAmK2SBpitkhuYrZJEmK2Rg5Gq + isd+oXPxYZNR+EWGMuUyfRu9JngNfyF1BzshdgcQJngNAjB9GQBXkEUAaZlaAGmZWgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcp5kAHKeZAtxnWQwcJ1ibm2bXq1omVneYJVP91aQ + RfRQjT3QTYw6kkyLOVNLizgiS4s4CEuLOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJqtkwCarZMGmq2TG5qtk0WZrZODkqqLx3+hdPFhk1L4RoYy5TJ9G70meA1/IXUHOyF1 + BxAkdwoCKnoRAESGMABSjEAAUoxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABwnWIAcJ1iC3CcYTBunGBua5pdrWaYV95flE73VpBE9E+NPNBNjDmSTIs4U0uLOCJLizgIS4s4AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm66WAJuulgabrpYam66WQpuu + lX+Uqo3BgKF17GKTU/RGhjLkM30cvih4D4IldwxBLnwWFUKFLQZLiTgDUYw/AVKMQABSjEAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmZWQBpmVkLaZlZMGeYWG5ll1WtYZVR3lyT + SvdVj0L0UI090E6MOpJNjDpTTYw5Ik2MOQhNjDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACdrpgAna6YBZ2umBedrpg7na6XcJWqjqx/oHXWYJJQ5kWGMd40fh7CLXsVkDF9 + GlVBhCsqTYo6FVCLPgtSjEAEU4xBAVuQSgBllVYAZZVWAGWVVgBllVYApLSfAKS0nwCktJ8AoLKaAJeu + kACJp4AAY5ZSAV2TTAtdk0wwXZNMblyTS61akkneWJFG91aQQ/RUj0HQU49AklOPQFNSj0AiUo9ACFKP + QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+vmgCfr5oEn6+aEp+v + mi2erplWlKqNhnuecLBbkEvMQ4Uv1Td/Ick1fh6oPYInekiHNFFPijwyUYw/HFSNQgxZj0gEY5RUAWWV + VgBllVYAZZVWAGWVVgCktJ8ApLSfAKS0nwGgspoBl66QAomngANwm2IEUo1ADk+MPDNQjDxwUY0+rlOO + QN1Vj0P2WJFG8luSSc1ck0qRXJNLUlyTSyJck0sHXJNLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAn6+aAJ+vmgKfr5oLn6+aHJ+umTaRqIlYcppmglSNQ6xChS7JO4Em0zyC + J8ZDhS6pSog2gk6KO1lRiz42VY5EHF2RTQtklVUEZZVWAWWVVgBllVYAZZVWAKS0nwCktJ8BpLSfA6Cy + mgeXrpALiaeADnKdZhBRjD4aRIYvPUOGLndGhzGxS4o33FOOQPBck0vqY5ZTxGaYV4pnmVhOaJlZIGiZ + WQdomVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgr5sAoK+bAaCv + mwWgr5sMnq6ZF4ejfS1klFZWT4o9jkaGM79DhS/bQ4Uv40WGMdVHhzSzS4k4hlCLPlpXj0Y2X5JPHGSV + VQtllVYDZZVWAGWVVgBllVYApLSfAKS0nwKktJ8JoLKaFJeukCCJp4Aoc51mLVSOQjdAhCpVO4Ilhz6D + KLhEhzDZUI095F+UT9VrmlyucJ1jeXKeZUV0nmccdJ9nBnSfZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCvmwCgr5sAoK+bAaCvmwOarJQFcppmE16RTzxXjkd8U4xCuE6K + PeFJhzb0Q4Uv8UKELdlHhzOyT4s9iFiPSF9gk1A5ZJRUGmKUUghZj0gCS4k4AUKELQBckUwBm7CUBaGz + nBWesZkvlq6PSYinf1xznWZmV5BGb0KFLoU7giWoO4IlxkGEK9NMijnKXpNNrW6bYIR2oGpZeaFuMnui + cBR8onAEfKJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoK+bAKCv + mwCgr5sAoK+bAH2fcwFvmGILbphhM2uWXnJllFevXJBM20+KPfNChC34PoIo7kSFMNhOijy5Vo5FkluQ + SmNYj0Y1Sok3GD6DKA4/gykNQYQsDESFLwxklVUThqZ9LJCqiFaNqYR/gqR4nm+bYq5XkEa1RYcxvz6D + Kcs9gyfQP4QqxUeIM6ZWkEV4aZlaTnWfaTB7om8afqRzCn+kdAJ/pHQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfp90AH6fdAl+n3Qqep1vX3Ka + ZpVmlFjAVo1G3keGNPBChC72RoYy70yJOdxPijy9TYo6kUWGMGI6gSRDOYEjOT6DKDdBhC03QoQuN0uJ + OD5ilFJZcpxlhHaearBxm2TQZJVV4VONQeRGhzLgQYQs1j+EKsM/hCqlQ4YuekuKOElbkkslbJpeE3eg + awl+pHMDf6R0AX+kdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACFonwAhaJ8BoWifBuAoHdAeJxtam2XYJNgkVG6VYxE3E6JPO9LiDjxSIc16EWG + MdVAhCu4OoEkmDeAIIQ7gSV9QYQse0SFMHtEhTB7RoYygU2KO5RWj0WzW5FL0VuRSudVjkPyTYo670aH + Mt1DhS6/QYQsnECEK3ZBhSxORIYwKU2LOxFdk00HbZtfA32jcgF/pHQAf6R0AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIejfwCHo38Dh6N/DoKh + eSN6nXBAcplmZGqWXY9jklS5Wo5K01CKPtpHhjPYQIMr0zyBJss7gSXCPYIovEKFLrtHhzO6SYg2ukqI + N7pJhza9Sog2x0yJOddNijvmTYo77UyJOexJiDXeRocywkSGMJlDhS9vQYUtSUCELCpBhS0URocyB1CM + PgJflFABeqFuAH+kdAB/pHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAiaSBAImkgQGIpIAGg6F6EHyeciJ3m2w9c5pnY26XYYpjklSjVIxDq0eG + M7BAgyu5QIMrxkSFMNRJiDbdTYk64FCLPuFRiz/hUYs/4VCLPuJPij3mT4o97E+KPe1OijzmTIk51kqI + N7tHhzSXRoczbkWGMUdDhi8oQYUsEz+EKghAhCsDQYUsAUWHMQBhlVIAf6R0AH+kdAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJpIEAiaSBAIik + gAGCoXgFfp9zDnyecSB6nXA5dptqVWmVXGZXjUZuSoc2eUeGMoxMiTmqVIxCzFiOSOJaj0rqW49K61uP + S+xaj0rsWo9J7FqPSe1bj0vsXJBL5FuQStJYjke0UoxAjUyKOmVJiDZDR4g0J0aHMhJDhi8GQIQrAj+E + KgE/hCoAP4QqAD+EKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAImkgQCJpIEAhKJ7AH+fdgF/n3UFf591DH6fdBh6nW8kbJZfLVqO + STJSi0A/V41GWWCSUYBnlVmsaZZbyWiVWtNmlFjVZZRW1WSTVdVkk1XVZpRY1WqWXNJtmGDHb5lisGyY + X4lklFZbWI9HNk+LPR9KiTgQSIg1BkeINAFDhi8AP4QqAD+EKgA/hCoAP4QqAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB/n3UAf591AH+fdQF/n3UDf591BXqdbwhtl18KYZFRDWWTVxlumGEvdJpoUneba3l1m2qScplmm26Y + Ypxsl1+ca5ZdnGuWXpxvmGKcdptqmnuecZB/oHV7gKF2WXyfcTJwmWMWX5JQCVONQQRJiTYBSIg1AEiI + NQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+fdQB/n3UAf591AH+fdQB/n3UAep1vAG+Y + YwB4nG0CfJ5yCH6ecxV+n3QpfZ5zP3udcE12m2pScpllU2+YYlNtl2BTbphhU3OaZ1N6nW9RgaF3TIaj + fkCKpYEti6WCF4mlgQiEo3sCep5vAFaORQBIiDUASIg1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf591AH+fdQF/n3UDf591B3+fdQ9+n3QXe51wHHab + ax5ymWYeb5hiHm2XYR5umGIec5pnHnqdcB2CoXgbh6R+F4qlghCMpoQIjKaEA4ymhAGMpoQAjKaEAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB/n3UAf591AH+fdQF/n3UCf591BH6fdAZ7nXAIdptrCHKZZghvmGIIbZdhCG6YYghzmmcIep1wCIKh + eAeHpH4GiqWCBIymhAKMpoQBjKaEAIymhACMpoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+fdQB/n3UAf591AH+fdQB/n3UBfp90AXud + cAJ2m2sCcplmAm+YYgJtl2ECbphiAnOaZwJ6nXACgqF4AoekfgGKpYIBjKaEAIymhACMpoQAjKaEAIym + hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAf591AH+fdQB/n3UAf591AH+fdQB+n3QAe51wAHabawBymWYAb5hiAG2XYQBumGIAc5pnAHqd + cACCoXgAh6R+AIqlggCMpoQAjKaEAIymhACMpoQAjKaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/////////////gB///////////////////wAP//////////////////A + AAP/////////////////gAAB/////////////////wAAAP////////////////8AAAD///////////// + ///4AAAAP///////////////8AAAAB////////////////AAAAAP///////////////wAAAAD/////// + ///8AB//8AAAAA//////////8AAH//AAAAAP/////////+AAA//wAHwAD//////////AAAP/8AD8AA// + //////8AAAAAB/AD/AAP///////+AAAAAAPwA/wAD///////+AAAAAAAEAH+AA////////AAAAAAAAAA + /AAP///////AAAAAAAAAAHwAD///////AAAAAAAAAAA4AA///////AAAAAAAAAAAAAAP//////wAAAAA + AAAAAAAAD//////wAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAf/////8AAAAAAAAAAAAAAP//////A + AAAAAAAAAAAAAH//////wAAAAAAAAAAAAAD//////8AAAAAAAAAAAAAB//////+AAAAAAAAAAAAAB/// + ////AAAAAAAAAAAAAA///////AAAAAAAAAAAAD////////gAAAAAAAAAAAA////////wAAAAAAAAAAAA + P///////8AAAAAAAAAAAAD////////AAAAAAAAAAAAA////////wAAAAAAAAAAAAP///////8AAAAAAA + AAAAAB////////AAAAAAAAAAAAAP///////wAAAAAAAAAAAAD///////8AAAAAAAAAAAAA///////+AA + AAAAAAAAAAAP///////AAAAAAAAAAAAAD///////wAAAAAAAAAAAAA///////8AAAAAAAAAAAAAP//// + ///AAAAAAAAAAAAAD///////wAAAAAAAAAAAAAf//////8AAAAAAAAAAAAAAD/4AD//AAAAAAAAAAAAA + AAf8AAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAD/wAAAAAAA + AAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAA//AA + AAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAPwAAA + AP/wAAAAAAAAAAAAD+AAAAD/8AAAAAAAAAAAAA/+AAAA//AAAAAAAAAAAAAP/wAAAP/wAAAAAAAAAAAA + H/8AAAD/8AAAAAAAAAAAAD//AAAA//gAAAAAAAAAAAB//wAAAP/8AAAAAAAAAAAAf/+AAAH//wAAAAAA + AAAAAH//wAAD//8AAAAAAAAAAAD//+AAD///AAAAAAAAAAAD///8AD///wAAAAAAAAAAA////AA///+A + AAAAAAAAAAf///4Af///wAAAAAAAAAAP////AP///+AAAAAAAAAAH//////////wAAAAAAAAAB////// + /////AAAAAAAAAAf//////////4AAAAAAAAAH///////////AAAAAAAAAAf//////////4AAAAAAAAAD + ///////////AAAAAAAAAA///////////4AAAAAAAAAP///////////4AAAAAAAAD////////////AAAA + AAAAAf////////////8AAAD/gAD/////////////gAAA/8AAf//////////////////AAH////////// + ////////wAA//////////////////8AAP//////////////////gAD//////////////////8AA///// + //////////////AAAB/////////////////wAAAP////////////////8AAAB/////////////////AA + AAH////////////////wAAAA////////////////4AAAAH///////////////8AAAAAf//////////// + ///AAAAAH///////////////wAAAAA///////////////8AAAAAH//////////////+AAAAAA/////// + ///////+AAAYAAP//////////////AAAfAAD//////////////wAAP4AA//////////////8AAH/AAP/ + /////////////AAD/8AD//////////////wAB//AA//////////////8AB//wAP//////////////AAf + /8AD//////////////wAB//AA//////////////8AAP/gAP//////////////AAB+AAD//////////// + //wAAPAAA//////////////8AADwAAP//////////////gAAIAAD//////////////+AAAAAA/////// + ////////wAAAAAP//////////////8AAAAAH///////////////AAAAAD///////////////wAAAAB// + /////////////+AAAAA////////////////wAAAA////////////////+AAAAf/////////////////A + AAf/////////////////wAAH/////////////////+AAD//////////////////4AD////////////// + //////////////////////////////////8= + + + \ No newline at end of file diff --git a/Source/Forms/FormPGN.cs b/Source/Forms/FormPGN.cs new file mode 100644 index 0000000..4ab2901 --- /dev/null +++ b/Source/Forms/FormPGN.cs @@ -0,0 +1,18 @@ +using System; +using System.Windows.Forms; + +namespace AgTwo +{ + public partial class FormPGN: Form + { + public FormPGN() + { + InitializeComponent(); + } + + private void btnSerialOK_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/Source/Forms/FormPGN.designer.cs b/Source/Forms/FormPGN.designer.cs new file mode 100644 index 0000000..14448e2 --- /dev/null +++ b/Source/Forms/FormPGN.designer.cs @@ -0,0 +1,135 @@ +namespace AgTwo +{ + partial class FormPGN + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormPGN)); + this.lblMessage2 = new System.Windows.Forms.Label(); + this.btnSerialOK = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblMessage2 + // + this.lblMessage2.AutoSize = true; + this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblMessage2.ForeColor = System.Drawing.Color.White; + this.lblMessage2.Location = new System.Drawing.Point(12, 9); + this.lblMessage2.Name = "lblMessage2"; + this.lblMessage2.Size = new System.Drawing.Size(40, 19); + this.lblMessage2.TabIndex = 1; + this.lblMessage2.Text = "PGN"; + // + // btnSerialOK + // + this.btnSerialOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnSerialOK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.btnSerialOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnSerialOK.FlatAppearance.BorderSize = 0; + this.btnSerialOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnSerialOK.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSerialOK.ForeColor = System.Drawing.SystemColors.ControlText; + this.btnSerialOK.Image = global::AgTwo.Properties.Resources.OK64; + this.btnSerialOK.Location = new System.Drawing.Point(234, 446); + this.btnSerialOK.Name = "btnSerialOK"; + this.btnSerialOK.Size = new System.Drawing.Size(57, 64); + this.btnSerialOK.TabIndex = 96; + this.btnSerialOK.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.btnSerialOK.UseVisualStyleBackColor = true; + this.btnSerialOK.Click += new System.EventHandler(this.btnSerialOK_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(71, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(88, 19); + this.label1.TabIndex = 97; + this.label1.Text = "Description"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(12, 42); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(36, 475); + this.label2.TabIndex = 98; + this.label2.Text = "254\r\n253\r\n252\r\n251\r\n250\r\n\r\n239\r\n238\r\n237\r\n236\r\n235\r\n234\r\n229\r\n\r\n203\r\n202\r\n201\r\n\r\n" + + "200\r\n126\r\n123\r\n121\r\n120\r\n\r\n\r\n"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(56, 41); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(181, 437); + this.label3.TabIndex = 99; + this.label3.Text = resources.GetString("label3.Text"); + // + // FormPGN + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Black; + this.ClientSize = new System.Drawing.Size(287, 506); + this.ControlBox = false; + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.btnSerialOK); + this.Controls.Add(this.lblMessage2); + this.Font = new System.Drawing.Font("Tahoma", 14.25F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Margin = new System.Windows.Forms.Padding(6); + this.Name = "FormPGN"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "PGN Guide"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label lblMessage2; + private System.Windows.Forms.Button btnSerialOK; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + } +} \ No newline at end of file diff --git a/Source/Forms/FormPGN.resx b/Source/Forms/FormPGN.resx new file mode 100644 index 0000000..d342296 --- /dev/null +++ b/Source/Forms/FormPGN.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Steer Data +From AutoSteer Module +Steer Settings +Steer Config +From AutoSteer Sensors + +Machine Data +Machine Config +From Machine Module +Pin Config +Section Dimensions +Matt Switch Module +64 Section On Off + +Subnet Scan Reply +Scan Request +Set Subnet + +Hello Sent To All +Hello Steer Reply +Hello Machine Reply +Hello IMU Reply +Hello GPS Reply + + \ No newline at end of file diff --git a/Source/Forms/FormSteerGraph.Designer.cs b/Source/Forms/FormSteerGraph.Designer.cs new file mode 100644 index 0000000..769018c --- /dev/null +++ b/Source/Forms/FormSteerGraph.Designer.cs @@ -0,0 +1,247 @@ +namespace Drive +{ + partial class FormSteerGraph + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.unoChart = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.label5 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.lblPWM = new System.Windows.Forms.Label(); + this.lblSteerAng = new System.Windows.Forms.Label(); + this.btnAuto = new System.Windows.Forms.Button(); + this.btnMinus = new System.Windows.Forms.Button(); + this.btnPlus = new System.Windows.Forms.Button(); + this.lblGain = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.unoChart)).BeginInit(); + this.SuspendLayout(); + // + // timer1 + // + this.timer1.Enabled = true; + this.timer1.Interval = 200; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // unoChart + // + this.unoChart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.unoChart.AntiAliasing = System.Windows.Forms.DataVisualization.Charting.AntiAliasingStyles.None; + this.unoChart.BackColor = System.Drawing.Color.Black; + chartArea1.AxisX.LabelAutoFitMaxFontSize = 8; + chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.DimGray; + chartArea1.AxisY.LineWidth = 2; + chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.DimGray; + chartArea1.BackColor = System.Drawing.Color.Black; + chartArea1.BorderWidth = 0; + chartArea1.Name = "ChartArea1"; + chartArea1.Position.Auto = false; + chartArea1.Position.Height = 100F; + chartArea1.Position.Width = 100F; + this.unoChart.ChartAreas.Add(chartArea1); + this.unoChart.Location = new System.Drawing.Point(3, 3); + this.unoChart.Margin = new System.Windows.Forms.Padding(0); + this.unoChart.Name = "unoChart"; + this.unoChart.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + series1.BackSecondaryColor = System.Drawing.Color.White; + series1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + series1.BorderWidth = 2; + series1.ChartArea = "ChartArea1"; + series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine; + series1.Color = System.Drawing.Color.OrangeRed; + series1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + series1.Legend = "Legend1"; + series1.Name = "S"; + series2.BorderWidth = 2; + series2.ChartArea = "ChartArea1"; + series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine; + series2.Color = System.Drawing.Color.Lime; + series2.IsVisibleInLegend = false; + series2.Legend = "Legend1"; + series2.Name = "PWM"; + this.unoChart.Series.Add(series1); + this.unoChart.Series.Add(series2); + this.unoChart.Size = new System.Drawing.Size(648, 182); + this.unoChart.TabIndex = 180; + this.unoChart.TextAntiAliasingQuality = System.Windows.Forms.DataVisualization.Charting.TextAntiAliasingQuality.SystemDefault; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label5.AutoEllipsis = true; + this.label5.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.label5.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.ForeColor = System.Drawing.SystemColors.ButtonHighlight; + this.label5.Location = new System.Drawing.Point(107, 185); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(122, 23); + this.label5.TabIndex = 196; + this.label5.Text = "SetPoint"; + this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoEllipsis = true; + this.label1.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.label1.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.SystemColors.ButtonHighlight; + this.label1.Location = new System.Drawing.Point(310, 185); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(105, 23); + this.label1.TabIndex = 195; + this.label1.Text = "Actual"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // lblPWM + // + this.lblPWM.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lblPWM.AutoSize = true; + this.lblPWM.BackColor = System.Drawing.SystemColors.ControlText; + this.lblPWM.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPWM.ForeColor = System.Drawing.Color.Lime; + this.lblPWM.Location = new System.Drawing.Point(230, 185); + this.lblPWM.Name = "lblPWM"; + this.lblPWM.Size = new System.Drawing.Size(68, 23); + this.lblPWM.TabIndex = 194; + this.lblPWM.Text = "label5"; + this.lblPWM.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblSteerAng + // + this.lblSteerAng.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lblSteerAng.AutoSize = true; + this.lblSteerAng.BackColor = System.Drawing.SystemColors.ControlText; + this.lblSteerAng.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblSteerAng.ForeColor = System.Drawing.Color.OrangeRed; + this.lblSteerAng.Location = new System.Drawing.Point(421, 185); + this.lblSteerAng.Name = "lblSteerAng"; + this.lblSteerAng.Size = new System.Drawing.Size(68, 23); + this.lblSteerAng.TabIndex = 193; + this.lblSteerAng.Text = "label1"; + this.lblSteerAng.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // btnAuto + // + this.btnAuto.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.btnAuto.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnAuto.Location = new System.Drawing.Point(3, 69); + this.btnAuto.Name = "btnAuto"; + this.btnAuto.Size = new System.Drawing.Size(41, 70); + this.btnAuto.TabIndex = 237; + this.btnAuto.Text = "A\r\nu\r\nt\r\no"; + this.btnAuto.UseVisualStyleBackColor = true; + this.btnAuto.Click += new System.EventHandler(this.btnAuto_Click); + // + // btnMinus + // + this.btnMinus.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.btnMinus.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnMinus.Location = new System.Drawing.Point(3, 145); + this.btnMinus.Name = "btnMinus"; + this.btnMinus.Size = new System.Drawing.Size(41, 61); + this.btnMinus.TabIndex = 236; + this.btnMinus.Text = "-"; + this.btnMinus.UseVisualStyleBackColor = true; + this.btnMinus.Click += new System.EventHandler(this.btnMinus_Click); + // + // btnPlus + // + this.btnPlus.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.btnPlus.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnPlus.Location = new System.Drawing.Point(3, 2); + this.btnPlus.Name = "btnPlus"; + this.btnPlus.Size = new System.Drawing.Size(41, 61); + this.btnPlus.TabIndex = 235; + this.btnPlus.Text = "+"; + this.btnPlus.UseVisualStyleBackColor = true; + this.btnPlus.Click += new System.EventHandler(this.btnPlus_Click); + // + // lblGain + // + this.lblGain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lblGain.AutoEllipsis = true; + this.lblGain.AutoSize = true; + this.lblGain.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.lblGain.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblGain.ForeColor = System.Drawing.SystemColors.ButtonHighlight; + this.lblGain.Location = new System.Drawing.Point(51, 185); + this.lblGain.Name = "lblGain"; + this.lblGain.Size = new System.Drawing.Size(40, 23); + this.lblGain.TabIndex = 239; + this.lblGain.Text = "215"; + this.lblGain.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // FormSteerGraph + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.ClientSize = new System.Drawing.Size(656, 211); + this.Controls.Add(this.lblGain); + this.Controls.Add(this.btnAuto); + this.Controls.Add(this.btnMinus); + this.Controls.Add(this.btnPlus); + this.Controls.Add(this.lblPWM); + this.Controls.Add(this.lblSteerAng); + this.Controls.Add(this.label5); + this.Controls.Add(this.label1); + this.Controls.Add(this.unoChart); + this.Location = new System.Drawing.Point(30, 30); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FormSteerGraph"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "AutoSteer Graph"; + this.TopMost = true; + this.Load += new System.EventHandler(this.FormSteerGraph_Load); + ((System.ComponentModel.ISupportInitialize)(this.unoChart)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.DataVisualization.Charting.Chart unoChart; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblPWM; + private System.Windows.Forms.Label lblSteerAng; + private System.Windows.Forms.Button btnAuto; + private System.Windows.Forms.Button btnMinus; + private System.Windows.Forms.Button btnPlus; + private System.Windows.Forms.Label lblGain; + } +} \ No newline at end of file diff --git a/Source/Forms/FormSteerGraph.cs b/Source/Forms/FormSteerGraph.cs new file mode 100644 index 0000000..d6dbe78 --- /dev/null +++ b/Source/Forms/FormSteerGraph.cs @@ -0,0 +1,126 @@ +using System; +using System.Globalization; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace Drive +{ + public partial class FormSteerGraph : Form + { + private readonly FormGPS mf = null; + + //chart data + private string dataSteerAngle = "0"; + + private string dataPWM = "-1"; + + public FormSteerGraph(Form callingForm) + { + mf = callingForm as FormGPS; + InitializeComponent(); + + this.label5.Text = gStr.gsSetPoint; + this.label1.Text = gStr.gsActual; + + this.Text = gStr.gsSteerChart; + } + + private void timer1_Tick(object sender, EventArgs e) + { + DrawChart(); + } + + private void DrawChart() + { + { + //word 0 - steerangle, 1 - pwmDisplay + dataSteerAngle = mf.mc.actualSteerAngleChart.ToString(); + dataPWM = mf.guidanceLineSteerAngle.ToString(); + + lblSteerAng.Text = mf.ActualSteerAngle; + lblPWM.Text = mf.SetSteerAngle; + } + + //chart data + Series s = unoChart.Series["S"]; + Series w = unoChart.Series["PWM"]; + double nextX = 1; + double nextX5 = 1; + + if (s.Points.Count > 0) nextX = s.Points[s.Points.Count - 1].XValue + 1; + if (w.Points.Count > 0) nextX5 = w.Points[w.Points.Count - 1].XValue + 1; + + unoChart.Series["S"].Points.AddXY(nextX, dataSteerAngle); + unoChart.Series["PWM"].Points.AddXY(nextX5, dataPWM); + + //if (isScroll) + { + while (s.Points.Count > 50) + { + s.Points.RemoveAt(0); + } + while (w.Points.Count > 50) + { + w.Points.RemoveAt(0); + } + unoChart.ChartAreas[0].RecalculateAxesScale(); + } + + lblGain.Text = ((int)(Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum*0.01) + Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum*0.01))).ToString(); + } + + private void FormSteerGraph_Load(object sender, EventArgs e) + { + timer1.Interval = (int)((1 / (double)mf.fixUpdateHz) * 1000); + } + + private void button1_Click(object sender, EventArgs e) + { + Close(); + } + + private void btnAuto_Click(object sender, EventArgs e) + { + unoChart.ChartAreas[0].AxisY.Maximum = Double.NaN; + unoChart.ChartAreas[0].AxisY.Minimum = Double.NaN; + unoChart.ChartAreas[0].RecalculateAxesScale(); + unoChart.ResetAutoValues(); + } + + private void btnPlus_Click(object sender, EventArgs e) + { + if (Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum) > Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum)) + unoChart.ChartAreas[0].AxisY.Maximum = Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum); + else unoChart.ChartAreas[0].AxisY.Minimum = Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum) * -1; + unoChart.ChartAreas[0].AxisY.Minimum *=1.5; + unoChart.ChartAreas[0].AxisY.Maximum *=1.5; + + unoChart.ChartAreas[0].AxisY.Minimum = (int)unoChart.ChartAreas[0].AxisY.Minimum; + unoChart.ChartAreas[0].AxisY.Maximum = (int)unoChart.ChartAreas[0].AxisY.Maximum; + + unoChart.ResetAutoValues(); + + } + + private void btnMinus_Click(object sender, EventArgs e) + { + if (Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum) > Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum)) + unoChart.ChartAreas[0].AxisY.Maximum = Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum); + else unoChart.ChartAreas[0].AxisY.Minimum = Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum) * -1; + + unoChart.ChartAreas[0].AxisY.Minimum *=0.75; + unoChart.ChartAreas[0].AxisY.Maximum *=0.75; + + if (unoChart.ChartAreas[0].AxisY.Maximum <=100) + { + unoChart.ChartAreas[0].AxisY.Maximum = 100; + unoChart.ChartAreas[0].AxisY.Minimum = -100; + } + + unoChart.ChartAreas[0].AxisY.Minimum = (int)unoChart.ChartAreas[0].AxisY.Minimum; + unoChart.ChartAreas[0].AxisY.Maximum = (int)unoChart.ChartAreas[0].AxisY.Maximum; + + unoChart.ResetAutoValues(); + } + } +} \ No newline at end of file diff --git a/Source/Forms/FormSteerGraph.resx b/Source/Forms/FormSteerGraph.resx new file mode 100644 index 0000000..1f666f2 --- /dev/null +++ b/Source/Forms/FormSteerGraph.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Source/Forms/FormTimedMessage.Designer.cs b/Source/Forms/FormTimedMessage.Designer.cs new file mode 100644 index 0000000..419c298 --- /dev/null +++ b/Source/Forms/FormTimedMessage.Designer.cs @@ -0,0 +1,92 @@ +namespace AgTwo +{ + partial class FormTimedMessage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.lblTitle = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.lblMessage2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblMessage + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(12, 20); + this.lblTitle.Name = "lblMessage"; + this.lblTitle.Size = new System.Drawing.Size(115, 29); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Message"; + // + // timer1 + // + this.timer1.Enabled = true; + this.timer1.Interval = 3000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // lblMessage2 + // + this.lblMessage2.AutoSize = true; + this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 18F); + this.lblMessage2.Location = new System.Drawing.Point(75, 71); + this.lblMessage2.Name = "lblMessage2"; + this.lblMessage2.Size = new System.Drawing.Size(127, 29); + this.lblMessage2.TabIndex = 1; + this.lblMessage2.Text = "Message 2"; + // + // FormTimedMessage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.LightSalmon; + this.ClientSize = new System.Drawing.Size(272, 151); + this.ControlBox = false; + this.Controls.Add(this.lblMessage2); + this.Controls.Add(this.lblTitle); + this.Font = new System.Drawing.Font("Tahoma", 14.25F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Margin = new System.Windows.Forms.Padding(6); + this.Name = "FormTimedMessage"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "AgTwo Message"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label lblMessage2; + } +} \ No newline at end of file diff --git a/Source/Forms/FormTimedMessage.cs b/Source/Forms/FormTimedMessage.cs new file mode 100644 index 0000000..f3e9fce --- /dev/null +++ b/Source/Forms/FormTimedMessage.cs @@ -0,0 +1,29 @@ +using System; +using System.Windows.Forms; + +namespace AgTwo +{ + public partial class FormTimedMessage : Form + { + public FormTimedMessage(int timeInMsec, string titleStr, string messageStr) + { + InitializeComponent(); + + lblTitle.Text = titleStr; + lblMessage2.Text = messageStr; + + timer1.Interval = timeInMsec; + + int messWidth = messageStr.Length; + Width = messWidth * 15 + 120; + } + + private void timer1_Tick(object sender, EventArgs e) + { + timer1.Enabled = false; + timer1.Dispose(); + Dispose(); + Close(); + } + } +} \ No newline at end of file diff --git a/Source/Forms/FormYes.cs b/Source/Forms/FormYes.cs new file mode 100644 index 0000000..4a67ac9 --- /dev/null +++ b/Source/Forms/FormYes.cs @@ -0,0 +1,18 @@ +using System; +using System.Windows.Forms; + +namespace AgTwo +{ + public partial class FormYes : Form + { + public FormYes(string messageStr) + { + InitializeComponent(); + + lblMessage2.Text = messageStr; + + int messWidth = messageStr.Length; + Width = messWidth * 15 + 180; + } + } +} \ No newline at end of file diff --git a/Source/Forms/FormYes.designer.cs b/Source/Forms/FormYes.designer.cs new file mode 100644 index 0000000..bd7b1d7 --- /dev/null +++ b/Source/Forms/FormYes.designer.cs @@ -0,0 +1,89 @@ +namespace AgTwo +{ + partial class FormYes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblMessage2 = new System.Windows.Forms.Label(); + this.btnSerialOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblMessage2 + // + this.lblMessage2.AutoSize = true; + this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Bold); + this.lblMessage2.Location = new System.Drawing.Point(46, 71); + this.lblMessage2.Name = "lblMessage2"; + this.lblMessage2.Size = new System.Drawing.Size(137, 29); + this.lblMessage2.TabIndex = 1; + this.lblMessage2.Text = "Message 2"; + // + // btnSerialOK + // + this.btnSerialOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnSerialOK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.btnSerialOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnSerialOK.FlatAppearance.BorderSize = 0; + this.btnSerialOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnSerialOK.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSerialOK.ForeColor = System.Drawing.SystemColors.ControlText; + this.btnSerialOK.Image = global::AgTwo.Properties.Resources.OK64; + this.btnSerialOK.Location = new System.Drawing.Point(136, 161); + this.btnSerialOK.Name = "btnSerialOK"; + this.btnSerialOK.Size = new System.Drawing.Size(105, 64); + this.btnSerialOK.TabIndex = 96; + this.btnSerialOK.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.btnSerialOK.UseVisualStyleBackColor = true; + // + // FormYes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.ClientSize = new System.Drawing.Size(245, 229); + this.ControlBox = false; + this.Controls.Add(this.btnSerialOK); + this.Controls.Add(this.lblMessage2); + this.Font = new System.Drawing.Font("Tahoma", 14.25F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Margin = new System.Windows.Forms.Padding(6); + this.Name = "FormYes"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "AgTwo Message"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label lblMessage2; + private System.Windows.Forms.Button btnSerialOK; + } +} \ No newline at end of file diff --git a/Source/Forms/FormYes.resx b/Source/Forms/FormYes.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Source/Forms/FormYes.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/Forms/FormYesNo.cs b/Source/Forms/FormYesNo.cs new file mode 100644 index 0000000..89a49cc --- /dev/null +++ b/Source/Forms/FormYesNo.cs @@ -0,0 +1,26 @@ +using System; +using System.Windows.Forms; + +namespace AgTwo +{ + public partial class FormYesNo : Form + { + public FormYesNo(string messageStr) + { + InitializeComponent(); + + lblMessage2.Text = messageStr; + + int messWidth = messageStr.Length; + Width = messWidth * 15 + 180; + } + + private void timer1_Tick(object sender, EventArgs e) + { + timer1.Enabled = false; + timer1.Dispose(); + Dispose(); + Close(); + } + } +} \ No newline at end of file diff --git a/Source/Forms/FormYesNo.designer.cs b/Source/Forms/FormYesNo.designer.cs new file mode 100644 index 0000000..a3486e0 --- /dev/null +++ b/Source/Forms/FormYesNo.designer.cs @@ -0,0 +1,116 @@ +namespace AgTwo +{ + partial class FormYesNo + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.lblMessage2 = new System.Windows.Forms.Label(); + this.btnSerialCancel = new System.Windows.Forms.Button(); + this.btnSerialOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // timer1 + // + this.timer1.Enabled = true; + this.timer1.Interval = 3000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // lblMessage2 + // + this.lblMessage2.AutoSize = true; + this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Bold); + this.lblMessage2.Location = new System.Drawing.Point(46, 71); + this.lblMessage2.Name = "lblMessage2"; + this.lblMessage2.Size = new System.Drawing.Size(137, 29); + this.lblMessage2.TabIndex = 1; + this.lblMessage2.Text = "Message 2"; + // + // btnSerialCancel + // + this.btnSerialCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnSerialCancel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.btnSerialCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnSerialCancel.FlatAppearance.BorderSize = 0; + this.btnSerialCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnSerialCancel.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSerialCancel.Image = global::AgTwo.Properties.Resources.Cancel64; + this.btnSerialCancel.Location = new System.Drawing.Point(8, 161); + this.btnSerialCancel.Name = "btnSerialCancel"; + this.btnSerialCancel.Size = new System.Drawing.Size(105, 64); + this.btnSerialCancel.TabIndex = 97; + this.btnSerialCancel.UseVisualStyleBackColor = true; + // + // btnSerialOK + // + this.btnSerialOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnSerialOK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.btnSerialOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnSerialOK.FlatAppearance.BorderSize = 0; + this.btnSerialOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnSerialOK.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSerialOK.ForeColor = System.Drawing.SystemColors.ControlText; + this.btnSerialOK.Image = global::AgTwo.Properties.Resources.OK64; + this.btnSerialOK.Location = new System.Drawing.Point(136, 161); + this.btnSerialOK.Name = "btnSerialOK"; + this.btnSerialOK.Size = new System.Drawing.Size(105, 64); + this.btnSerialOK.TabIndex = 96; + this.btnSerialOK.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.btnSerialOK.UseVisualStyleBackColor = true; + // + // FormYesNo + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.ClientSize = new System.Drawing.Size(253, 237); + this.ControlBox = false; + this.Controls.Add(this.btnSerialCancel); + this.Controls.Add(this.btnSerialOK); + this.Controls.Add(this.lblMessage2); + this.Font = new System.Drawing.Font("Tahoma", 14.25F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Margin = new System.Windows.Forms.Padding(6); + this.Name = "FormYesNo"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "AgTwo Message"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label lblMessage2; + private System.Windows.Forms.Button btnSerialCancel; + private System.Windows.Forms.Button btnSerialOK; + } +} \ No newline at end of file diff --git a/Source/Forms/FormYesNo.resx b/Source/Forms/FormYesNo.resx new file mode 100644 index 0000000..1f666f2 --- /dev/null +++ b/Source/Forms/FormYesNo.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Source/Forms/FormtimedMessage.resx b/Source/Forms/FormtimedMessage.resx new file mode 100644 index 0000000..1f666f2 --- /dev/null +++ b/Source/Forms/FormtimedMessage.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Source/Forms/NMEA.Designer.cs b/Source/Forms/NMEA.Designer.cs new file mode 100644 index 0000000..213a388 --- /dev/null +++ b/Source/Forms/NMEA.Designer.cs @@ -0,0 +1,998 @@ +using System; +using System.Globalization; + +namespace AgTwo +{ + public partial class FormLoop + { + private string rawBuffer = ""; + private string[] words; + private string nextNMEASentence = ""; + + private bool isNMEAToSend = false; + + public string ggaSentence, vtgSentence, hdtSentence, avrSentence, paogiSentence, + hpdSentence, rmcSentence, pandaSentence, ksxtSentence; + + public float hdopData, altitude = float.MaxValue, headingTrue = float.MaxValue, + headingTrueDual = float.MaxValue, speed = float.MaxValue, roll = float.MaxValue; + public float altitudeData, speedData, rollData, headingTrueData, headingTrueDualData, ageData; + + public double latitudeSend = double.MaxValue, longitudeSend = double.MaxValue, latitude, longitude; + + public ushort satellitesData, satellitesTracked = ushort.MaxValue, hdopX100 = ushort.MaxValue, + ageX100 = ushort.MaxValue; + + //imu data + public ushort imuHeadingData, imuHeading = ushort.MaxValue; + public short imuRollData, imuRoll = short.MaxValue, imuPitchData, imuPitch = short.MaxValue, + imuYawRateData, imuYawRate = short.MaxValue; + + public byte fixQualityData, fixQuality = byte.MaxValue; + + private float rollK, Pc, G, Xp, Zp, XeRoll, P = 1.0f; + private readonly float varRoll = 0.1f, varProcess = 0.0003f; + + double LastUpdateUTC = 0; + + //Convert Fix value to Text + public string FixQuality + { + get + { + if (fixQualityData == 0) return "Invalid: "; + else if (fixQualityData == 1) return "GPS 1: "; + else if (fixQualityData == 2) return "DGPS : "; + else if (fixQualityData == 3) return "PPS : "; + else if (fixQualityData == 4) return "RTK fix: "; + else if (fixQualityData == 5) return "Float: "; + else if (fixQualityData == 6) return "Estimate: "; + else if (fixQualityData == 7) return "Man IP: "; + else if (fixQualityData == 8) return "Sim: "; + else return "Unknown: "; + } + } + + public string Parse(ref string buffer) + { + string sentence; + do + { + //double check for valid sentence + // Find start of next sentence + int start = buffer.IndexOf("$", StringComparison.Ordinal); + if (start == -1) return null; + buffer = buffer.Substring(start); + + // Find end of sentence + int end = buffer.IndexOf("\r", StringComparison.Ordinal); + if (end == -1) return null; + + //the NMEA sentence to be parsed + sentence = buffer.Substring(0, end + 1); + + //remove the processed sentence from the rawBuffer + buffer = buffer.Substring(end + 1); + } + + //if sentence has valid checksum, its all good + while (!ValidateChecksum(sentence)); + + // Remove trailing checksum and \r\n and return + sentence = sentence.Substring(0, sentence.IndexOf("*", StringComparison.Ordinal)); + + return sentence; + } + + public void ParseNMEA(ref string buffer) + { + if (rawBuffer == null) return; + + //find end of a sentence + int cr = rawBuffer.IndexOf("\r", StringComparison.Ordinal); + if (cr == -1) return; // No end found, wait for more data + + // Find start of next sentence + int dollar = rawBuffer.IndexOf("$", StringComparison.Ordinal); + if (dollar == -1) return; + + //if the $ isn't first, get rid of the tail of corrupt sentence + if (dollar >= cr) rawBuffer = rawBuffer.Substring(dollar); + + cr = rawBuffer.IndexOf("\r", StringComparison.Ordinal); + if (cr == -1) return; // No end found, wait for more data + dollar = rawBuffer.IndexOf("$", StringComparison.Ordinal); + if (dollar == -1) return; + + //if the $ isn't first, get rid of the tail of corrupt sentence + if (dollar >= cr) rawBuffer = rawBuffer.Substring(dollar); + + cr = rawBuffer.IndexOf("\r", StringComparison.Ordinal); + dollar = rawBuffer.IndexOf("$", StringComparison.Ordinal); + if (cr == -1 || dollar == -1) return; + + if (rawBuffer.Length > 301) + { + if (isLogNMEA) + { + logNMEASentence.Append("\r\n" + + DateTime.UtcNow.ToString(" ->> mm:ss.fff ", CultureInfo.InvariantCulture) + "\r\n" + rawBuffer + "\r\n"); + } + + rawBuffer = ""; + return; + } + + if (isLogMonitorOn) + { + logMonitorSentence.Append(DateTime.UtcNow.ToString("mm:ss.fff ", CultureInfo.InvariantCulture)+rawBuffer); + } + + + //now we have a complete sentence or more somewhere in the portData + while (true) + { + //extract the next NMEA single sentence + nextNMEASentence = Parse(ref buffer); + if (nextNMEASentence == null) break; + + words = nextNMEASentence.Split(','); + + //parse them accordingly + if (words.Length < 3) break; + + if (words[0] == "$PANDA" && words.Length > 14) + { + ParsePANDA(); + if (isGPSSentencesOn) pandaSentence = nextNMEASentence; + } + + else if (words[0] == "$PAOGI" && words.Length > 14) + { + ParseOGI(); + if (isGPSSentencesOn) paogiSentence = nextNMEASentence; + } + + else if ((words[0] == "$GPGGA" || words[0] == "$GNGGA") && words.Length > 13) + { + ParseGGA(); + if (isGPSSentencesOn) ggaSentence = nextNMEASentence; + } + + else if ((words[0] == "$GPVTG" || words[0] == "$GNVTG") && words.Length > 7) + { + ParseVTG(); + if (isGPSSentencesOn) vtgSentence = nextNMEASentence; + } + + //else if (words[0] == "$GPRMC" || words[0] == "$GNRMC") + //{ + // ParseRMC(); + // if (isGPSSentencesOn) rmcSentence = nextNMEASentence; + //} + + else if (words[0] == "$KSXT") + { + ParseKSXT(); + if (isGPSSentencesOn) ksxtSentence = nextNMEASentence; + } + + else if (words[0] == "$GPHPD") + { + ParseHPD(); + if (isGPSSentencesOn) hpdSentence = nextNMEASentence; + } + + else if (words[0] == "$GPHDT" || words[0] == "$GNHDT") + { + ParseHDT(); + if (isGPSSentencesOn) hdtSentence = nextNMEASentence; + } + + else if (words[0] == "$PTNL" && words.Length > 8) + { + ParseAVR(); + if (isGPSSentencesOn) avrSentence = nextNMEASentence; + } + + else if (words[0] == "$GNTRA") + { + ParseTRA(); + } + + else if (words[0] == "$PSTI" && words[1] == "032") + { + ParseSTI032(); //there is also an $PSTI,030,... wich contains different data! + } + + if (isLogNMEA) + { + string timNow = DateTime.UtcNow.ToString("HHmmss.fff ", CultureInfo.InvariantCulture); + logNMEASentence.Append(timNow + " " + nextNMEASentence + "\r\n"); + + //double timD = Convert.ToDouble(timNow); + //double timS = Convert.ToDouble(words[1]); + + //logNMEASentence.Append((timD-timS).ToString("N3", CultureInfo.InvariantCulture) + " ") + // .Append(timNow + " " + nextNMEASentence + "\r\n"); + + } + + }// while still data + + if (isNMEAToSend) + { + isNMEAToSend = false; + + byte[] nmeaPGN = new byte[57]; + + nmeaPGN[0] = 0x80; + nmeaPGN[1] = 0x81; + nmeaPGN[2] = 0x7C; + nmeaPGN[3] = 0xD6; + nmeaPGN[4] = 0x33; // nmea total array count minus 6 + + //longitude + Buffer.BlockCopy(BitConverter.GetBytes(longitudeSend), 0, nmeaPGN, 5, 8); + longitudeSend = double.MaxValue; + + //latitude + Buffer.BlockCopy(BitConverter.GetBytes(latitudeSend), 0, nmeaPGN, 13, 8); + latitudeSend = double.MaxValue; + + //the different dual antenna headings + Buffer.BlockCopy(BitConverter.GetBytes(headingTrueDual), 0, nmeaPGN, 21, 4); + headingTrueDual = float.MaxValue; + + //single antenna heading in degrees + Buffer.BlockCopy(BitConverter.GetBytes(headingTrue), 0, nmeaPGN, 25, 4); + headingTrue = float.MaxValue; + + //speed converted to kmh from knots + Buffer.BlockCopy(BitConverter.GetBytes(speed), 0, nmeaPGN, 29, 4); + speed = float.MaxValue; + + //roll value in degrees + Buffer.BlockCopy(BitConverter.GetBytes(roll), 0, nmeaPGN, 33, 4); + this.roll = float.MaxValue; + + //altitude in meters + Buffer.BlockCopy(BitConverter.GetBytes(altitude), 0, nmeaPGN, 37, 4); + this.altitude = float.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(satellitesTracked), 0, nmeaPGN, 41, 2); + satellitesTracked = ushort.MaxValue; + + nmeaPGN[43] = (byte)fixQuality; + fixQuality = byte.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(hdopX100), 0, nmeaPGN, 44, 2); + hdopX100 = ushort.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(ageX100), 0, nmeaPGN, 46, 2); + ageX100 = ushort.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(imuHeading), 0, nmeaPGN, 48, 2); + imuHeading = ushort.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(imuRoll), 0, nmeaPGN, 50, 2); + imuRoll = short.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(imuPitch), 0, nmeaPGN, 52, 2); + imuPitch = short.MaxValue; + + Buffer.BlockCopy(BitConverter.GetBytes(imuYawRate), 0, nmeaPGN, 54, 2); + imuYawRate = short.MaxValue; + + + int CK_A = 0; + for (int j = 2; j < nmeaPGN.Length; j++) + { + CK_A += nmeaPGN[j]; + } + + //checksum + nmeaPGN[56] = (byte)CK_A; + + //Send nmea to AgOpenGPS + SendToLoopBackMessageAOG(nmeaPGN); + + //Send nmea to autosteer module 8888 + if (isSendNMEAToUDP) SendUDPMessage(nmeaPGN, epModule); + } + } + + private void ParseKSXT() + { + if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3]) + && !string.IsNullOrEmpty(words[4]) && !string.IsNullOrEmpty(words[5])) + { + double.TryParse(words[2], NumberStyles.Float, CultureInfo.InvariantCulture, out longitude); + longitudeSend = longitude; + + double.TryParse(words[3], NumberStyles.Float, CultureInfo.InvariantCulture, out latitude); + latitudeSend = latitude; + + float.TryParse(words[4], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude); + altitudeData = altitude; + + float.TryParse(words[5], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual); + headingTrueDualData = headingTrueDual; + + float.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK); + + float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out speed); + speedData = speed; + + byte.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality); + if (fixQuality == 0) fixQualityData = 0; + else if (fixQuality == 1) fixQualityData = 1; + else if (fixQuality == 2) fixQualityData = 5; + else if (fixQuality == 3) fixQualityData = 4; + + fixQuality = fixQualityData; + + int headingQuality; + + int.TryParse(words[11], NumberStyles.Float, CultureInfo.InvariantCulture, out headingQuality); + + if (headingQuality == 3) // roll only when rtk + { + roll = (float)(rollK); + rollData = rollK; + } + else + { + roll = float.MinValue; + rollData = 0; + } + + ushort.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked); + satellitesData = satellitesTracked; + + + float.TryParse(words[20], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData); + ageX100 = (ushort)(ageData * 100.0); + + isNMEAToSend = true; + } + } + + private void ParseGGA() + { + #region GGA Message + //$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M , ,*47 + + //GGA Global Positioning System Fix Data + //123519 Fix taken at 12:35:19 UTC + //4807.038,N Latitude 48 deg 07.038' N + //01131.000,E Longitude 11 deg 31.000' E + //1 Fix quality: 0 = invalid + // 1 = GPS fix (SPS) + // 2 = DGPS fix + // 3 = PPS fix + // 4 = Real Time Kinematic + // 5 = Float RTK + // 6 = estimated (dead reckoning) (2.3 feature) + // 7 = Manual input mode + // 8 = Simulation mode + //08 Number of satellites being tracked + //0.9 Horizontal dilution of position + //545.4,M Altitude, Meters, above mean sea level + //46.9,M Height of geoid (mean sea level) above WGS84 ellipsoid + //(empty field) time in seconds since last DGPS update + //(empty field) DGPS station ID number + //*47 the checksum data, always begins with * + #endregion GGA Message + + if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3]) + && !string.IsNullOrEmpty(words[4]) && !string.IsNullOrEmpty(words[5])) + { + //double.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double UTC); + //if ((UTC < LastUpdateUTC ? 240000 + UTC : UTC) - LastUpdateUTC > 0.045) + //{ + + //FixQuality + byte.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality); + fixQualityData = fixQuality; + + //satellites tracked + ushort.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked); + satellitesData = satellitesTracked; + + //hdop + float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out hdopData); + hdopX100 = (ushort)(hdopData * 100.0); + + //altitude + float.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude); + altitudeData = altitude; + + //age + float.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData); + ageX100 = (ushort)(ageData*100.0); + + //LastUpdateUTC = UTC; + + //get latitude and convert to decimal degrees + int decim = words[2].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[2] += ".00"; + decim = words[2].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[2].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude); + double.TryParse(words[2].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp); + temp *= 0.01666666666667; + latitude += temp; + if (words[3] == "S") + latitude *= -1; + latitudeSend = latitude; + + //get longitude and convert to decimal degrees + decim = words[4].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[4] += ".00"; + decim = words[4].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[4].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude); + double.TryParse(words[4].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp); + longitude += temp * 0.0166666666667; + + { if (words[5] == "W") longitude *= -1; } + longitudeSend = longitude; + + isNMEAToSend = true; + } + } + + private void ParseVTG() + { + #region VTG Message + //$GPVTG,054.7,T,034.4,M,005.5,N,010.2,K*48 + + //VTG Track made good and ground speed + //054.7,T True track made good (degrees) + //034.4,M Magnetic track made good + //005.5,N Ground speed, knots + //010.2,K Ground speed, Kilometers per hour + //*48 Checksum + #endregion VTG Message + + + if (!string.IsNullOrEmpty(words[7])) + { + //kph for speed + float.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out speed); + speedData = speed; + } + else + { + speed = speedData = 0; + } + + if (!string.IsNullOrEmpty(words[1])) + { + //True heading + float.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrue); + headingTrueData = headingTrue; + } + } + + private void ParseAVR() + { + #region AVR Message + // $PTNL,AVR,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03 + + //0 Message ID $PTNL,AVR + //1 UTC of vector fix + //2 Yaw angle, in degrees + //3 Yaw + //4 Tilt angle, in degrees + //5 Tilt + //6 Roll angle, in degrees + //7 Roll + //8 Range, in meters + //9 GPS quality indicator: + // 0: Fix not available or invalid + // 1: Autonomous GPS fix + // 2: Differential carrier phase solution RTK(Float) + // 3: Differential carrier phase solution RTK(Fix) + // 4: Differential code-based solution, DGPS + //10 PDOP + //11 Number of satellites used in solution + //12 The checksum data, always begins with * + #endregion AVR Message + + if (!string.IsNullOrEmpty(words[1])) + { + float.TryParse(words[8] == "Roll" ? words[7] : words[5], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK); + + //Kalman filter + Pc = P + varProcess; + G = Pc / (Pc + varRoll); + P = (1 - G) * Pc; + Xp = XeRoll; + Zp = Xp; + XeRoll = (G * (rollK - Zp)) + Xp; + rollData = XeRoll; + + roll = (float)(XeRoll); + } + } + + private void ParseHPD() + { + if (!string.IsNullOrEmpty(words[1])) + { + //Dual heading + float.TryParse(words[3], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual); + headingTrueDualData = headingTrueDual; + + float.TryParse(words[4], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK); + + double.TryParse(words[18], NumberStyles.Float, CultureInfo.InvariantCulture, out double baseline); + + //int.TryParse(words[21], NumberStyles.Float, CultureInfo.InvariantCulture, out int solheading); + + if (baseline > 0) // roll only when rtk and baseline + { + roll = (float)(rollK); + rollData = rollK; + } + else + { + roll = float.MinValue; + rollData = 0; + } + } + } + + private void ParseOGI() + { + #region PAOGI Message + /* + $PAOGI + (1) 123519 Fix taken at 1219 UTC + + Roll corrected position + (2,3) 4807.038,N Latitude 48 deg 07.038' N + (4,5) 01131.000,E Longitude 11 deg 31.000' E + + (6) 1 Fix quality: + 0 = invalid + 1 = GPS fix(SPS) + 2 = DGPS fix + 3 = PPS fix + 4 = Real Time Kinematic + 5 = Float RTK + 6 = estimated(dead reckoning)(2.3 feature) + 7 = Manual input mode + 8 = Simulation mode + (7) Number of satellites being tracked + (8) 0.9 Horizontal dilution of position + (9) 545.4 Altitude (ALWAYS in Meters, above mean sea level) + (10) 1.2 time in seconds since last DGPS update + + (11) 022.4 Speed over the ground in knots - can be positive or negative + + FROM AHRS: + (12) Heading in degrees + (13) Roll angle in degrees(positive roll = right leaning - right down, left up) + (14) Pitch angle in degrees(Positive pitch = nose up) + (15) Yaw Rate in Degrees / second + + * CHKSUM + */ + #endregion PAOGI Message + + if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3]) + && !string.IsNullOrEmpty(words[4]) && !string.IsNullOrEmpty(words[5])) + { + //double.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double UTC); + //if ((UTC < LastUpdateUTC ? 240000 + UTC : UTC) - LastUpdateUTC > 0.045) + //{ + + //FixQuality + byte.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality); + fixQualityData = fixQuality; + + //satellites tracked + ushort.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked); + satellitesData = satellitesTracked; + + //hdop + float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out hdopData); + hdopX100 = (ushort)(hdopData * 100.0); + + //altitude + float.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude); + altitudeData = altitude; + + //kph for speed - knots read + float.TryParse(words[11], NumberStyles.Float, CultureInfo.InvariantCulture, out speed); + speed *= 1.852f; + speedData = speed; + + //Dual antenna derived heading + float.TryParse(words[12], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual); + headingTrueDualData = headingTrueDual; + + //roll + float.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out roll); + rollData = roll; + + //get latitude and convert to decimal degrees + int decim = words[2].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[2] += ".00"; + decim = words[2].IndexOf(".", StringComparison.Ordinal); + } + + //age + float.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData); + ageX100 = (ushort)(ageData * 100.0); + + decim -= 2; + double.TryParse(words[2].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude); + double.TryParse(words[2].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp); + temp *= 0.01666666666666666666666666666667; + latitude += temp; + if (words[3] == "S") + latitude *= -1; + + latitudeSend = latitude; + + //get longitude and convert to decimal degrees + decim = words[4].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[4] += ".00"; + decim = words[4].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[4].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude); + double.TryParse(words[4].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp); + longitude += temp * 0.01666666666666666666666666666667; + + { if (words[5] == "W") longitude *= -1; } + longitudeSend = longitude; + + //always send because its probably the only one. + isNMEAToSend = true; + } + } + + private void ParsePANDA() + { + #region PANDA Message + /* + $PANDA + (1) Time of fix + + position + (2,3) 4807.038,N Latitude 48 deg 07.038' N + (4,5) 01131.000,E Longitude 11 deg 31.000' E + + (6) 1 Fix quality: + 0 = invalid + 1 = GPS fix(SPS) + 2 = DGPS fix + 3 = PPS fix + 4 = Real Time Kinematic + 5 = Float RTK + 6 = estimated(dead reckoning)(2.3 feature) + 7 = Manual input mode + 8 = Simulation mode + (7) Number of satellites being tracked + (8) 0.9 Horizontal dilution of position + (9) 545.4 Altitude (ALWAYS in Meters, above mean sea level) + (10) 1.2 time in seconds since last DGPS update + (11) Speed in knots + + FROM IMU: + (12) Heading in degrees + (13) Roll angle in degrees(positive roll = right leaning - right down, left up) + + (14) Pitch angle in degrees(Positive pitch = nose up) + (15) Yaw Rate in Degrees / second + + * CHKSUM + */ + #endregion PANDA Message + + if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3]) + && !string.IsNullOrEmpty(words[3]) && !string.IsNullOrEmpty(words[0])) + { + + //get latitude and convert to decimal degrees + int decim = words[2].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[2] += ".00"; + decim = words[2].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[2].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude); + double.TryParse(words[2].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp); + temp *= 0.01666666666666666666666666666667; + latitude += temp; + if (words[3] == "S") + latitude *= -1; + + latitudeSend = latitude; + + //get longitude and convert to decimal degrees + decim = words[4].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[4] += ".00"; + decim = words[4].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[4].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude); + double.TryParse(words[4].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp); + longitude += temp * 0.01666666666666666666666666666667; + + { if (words[5] == "W") longitude *= -1; } + longitudeSend = longitude; + + //FixQuality + byte.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality); + fixQualityData = fixQuality; + + //satellites tracked + ushort.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked); + satellitesData = satellitesTracked; + + //hdop + float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out hdopData); + hdopX100 = (ushort)(hdopData * 100.0); + + //altitude + float.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude); + altitudeData = altitude; + + //age + float.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData); + ageX100 = (ushort)(ageData * 100.0); + + //kph for speed - knots read + float.TryParse(words[11], NumberStyles.Float, CultureInfo.InvariantCulture, out speed); + speed *= 1.852f; + speedData = speed; + + //imu heading + ushort.TryParse(words[12], NumberStyles.Float, CultureInfo.InvariantCulture, out imuHeading); + imuHeadingData = imuHeading; + + //roll + short.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out imuRoll); + imuRollData = imuRoll; + + //Pitch + short.TryParse(words[14], NumberStyles.Float, CultureInfo.InvariantCulture, out imuPitch); + imuPitchData = imuPitch; + + //YawRate + short.TryParse(words[15], NumberStyles.Float, CultureInfo.InvariantCulture, out imuYawRate); + imuYawRateData = imuYawRate; + + //always send because its probably the only one. + isNMEAToSend = true; + //} + } + } + + private void ParseHDT() + { + #region HDT Message + //$GNHDT,123.456,T * 00 + + //(0) Message ID $GNHDT + //(1) Heading in degrees + //(2) T: Indicates heading relative to True North + //(3) The checksum data, always begins with * + #endregion HDT Message + + if (!string.IsNullOrEmpty(words[1])) + { + //True heading + float.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual); + headingTrueDualData = headingTrueDual; + } + } + + private void ParseSTI032() //heading and roll from SkyTraQ receiver + { + #region STI0 Message + //$PSTI,032,033010.000,111219,A,R,‐4.968,‐10.817,‐1.849,12.046,204.67,,,,,*39 + + //(1) 032 Baseline Data indicator + //(2) UTC time hhmmss.sss + //(3) UTC date ddmmyy + //(4) Status: + // V = Void + // A = Active + //(5) Mode Indicator: + // F = Float RTK + // R = fixed RTK + //(6) East-projection of baseline, meters + //(7) North-projection of baseline, meters + //(8) Up-projection of baseline, meters + //(9) Baseline length, meters + //(10) Baseline course: angle between baseline vector and north direction, degrees + //(11) - (15) Reserved + //(16) * Checksum + #endregion STI0 Message + + if (!string.IsNullOrEmpty(words[10])) + { + //baselineCourse: angle between baseline vector (from kinematic base to rover) and north direction, degrees + float.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out float baselineCourse); + headingTrueDual = ((baselineCourse < 270.0f) ? (baselineCourse + 90.0f) : (baselineCourse - 270.0f)); //Rover Antenna on the left, kinematic base on the right!!! + } + + if (!string.IsNullOrEmpty(words[8]) && !string.IsNullOrEmpty(words[9])) + { + double.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double upProjection); //difference in hight of both antennas (rover - kinematic base) + double.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out double baselineLength); //distance between kinematic base and rover + rollK = (float)glm.toDegrees(Math.Atan(upProjection / baselineLength)); //roll to the right is positiv (rover left, kinematic base right!) + + //Kalman filter + Pc = P + varProcess; + G = Pc / (Pc + varRoll); + P = (1 - G) * Pc; + Xp = XeRoll; + Zp = Xp; + XeRoll = (G * (rollK - Zp)) + Xp; + rollData = XeRoll; + + roll = (float)(XeRoll); + } + } + + private void ParseTRA() //tra contains hdt and roll for the ub482 receiver + { + if (!string.IsNullOrEmpty(words[1])) + { + float.TryParse(words[2], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual); + headingTrueDualData = headingTrueDual; + + // Console.WriteLine(HeadingForced); + float.TryParse(words[3], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK); + // Console.WriteLine(nRoll); + + int.TryParse(words[5], NumberStyles.Float, CultureInfo.InvariantCulture, out int trasolution); + if (trasolution != 4) rollK = 0; + rollData = rollK; + roll = (float)(rollK); + } + } + + private void ParseRMC() + { + #region RMC Message + //$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A + + //RMC Recommended Minimum sentence C + //123519 Fix taken at 12:35:19 UTC + //A Status A=active or V=Void. + //4807.038,N Latitude 48 deg 07.038' N + //01131.000,E Longitude 11 deg 31.000' E + //022.4 Speed over the ground in knots + //084.4 Track angle in degrees True + //230394 Date - 23rd of March 1994 + //003.1,W Magnetic Variation + //*6A * Checksum + #endregion RMC Message + + if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[3]) && !string.IsNullOrEmpty(words[4]) + && !string.IsNullOrEmpty(words[5]) && !string.IsNullOrEmpty(words[6])) + { + //Convert from knots to kph for speed + float.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out speed); + speed *= 1.852f; + speedData = speed; + + //True heading + float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual); + headingTrueDualData = headingTrueDual; + + double.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double UTC); + if ((UTC < LastUpdateUTC ? 240000 + UTC : UTC) - LastUpdateUTC > 0.045) + { + LastUpdateUTC = UTC; + + //get latitude and convert to decimal degrees + int decim = words[3].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[3] += ".00"; + decim = words[3].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[3].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude); + double.TryParse(words[3].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp); + latitude += temp * 0.01666666666666666666666666666667; + + if (words[4] == "S") + latitude *= -1; + latitudeSend = latitude; + + //get longitude and convert to decimal degrees + decim = words[5].IndexOf(".", StringComparison.Ordinal); + if (decim == -1) + { + words[5] += ".00"; + decim = words[5].IndexOf(".", StringComparison.Ordinal); + } + + decim -= 2; + double.TryParse(words[5].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude); + double.TryParse(words[5].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp); + longitude += temp * 0.01666666666666666666666666666667; + + if (words[6] == "W") longitude *= -1; + longitudeSend = longitude; + + isNMEAToSend = true; + } + } + } + + public bool ValidateChecksum(string Sentence) + { + int sum = 0; + try + { + char[] sentenceChars = Sentence.ToCharArray(); + // All character xor:ed results in the trailing hex checksum + // The checksum calc starts after '$' and ends before '*' + + int inx = Sentence.IndexOf("*", StringComparison.Ordinal); + + if (sentenceChars.Length - inx == 4) + { + + for (inx = 1; ; inx++) + { + if (inx >= sentenceChars.Length) // No checksum found + return false; + var tmp = sentenceChars[inx]; + // Indicates end of data and start of checksum + if (tmp == '*') break; + sum ^= tmp; // Build checksum + } + + // Calculated checksum converted to a 2 digit hex string + string sumStr = string.Format("{0:X2}", sum); + + // Compare to checksum in sentence + return sumStr.Equals(Sentence.Substring(inx + 1, 2)); + } + else + { + //CRC code goes here - return true for now if $KS + if(sentenceChars[0] == 36 && sentenceChars[1] == 75 && sentenceChars[2] == 83) return true; + else return false; + } + } + catch (Exception) + { + //mf.WriteErrorLog("Validate Checksum" + e); + return false; + } + } + } +} diff --git a/Source/Forms/UDP.designer.cs b/Source/Forms/UDP.designer.cs new file mode 100644 index 0000000..057a49a --- /dev/null +++ b/Source/Forms/UDP.designer.cs @@ -0,0 +1,312 @@ +using System; +using System.Drawing; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace AgTwo +{ + public partial class FormLoop + { + // UDP Sockets + public Socket UDPSocket; + private EndPoint endPointUDP = new IPEndPoint(IPAddress.Any, 0); + + public bool isUDPNetworkConnected; + + //UDP Endpoints + public IPEndPoint epAgIO = new IPEndPoint(IPAddress.Parse( + Properties.Settings.Default.etIP_SubnetOne.ToString() + "." + + Properties.Settings.Default.etIP_SubnetTwo.ToString() + "." + + Properties.Settings.Default.etIP_SubnetThree.ToString() + ".255"), 9999); + + // Data stream + private byte[] buffer = new byte[1024]; + + //used to send communication check pgn= C8 or 200 + private byte[] helloFromAgIO = { 0x80, 0x81, 0x7F, 200, 3, 56, 0, 0, 0x47 }; + + public IPAddress ipCurrent; + + //initialize udp network + public void LoadUDPNetwork() + { + helloFromAgIO[5] = 56; + + lblIP.Text = ""; + try //udp network + { + string bob = Dns.GetHostName(); + foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) + { + if (IPA.AddressFamily == AddressFamily.InterNetwork) + { + string data = IPA.ToString(); + lblIP.Text += IPA.ToString().Trim() + "\r\n"; + } + } + + // Initialise the socket + UDPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + UDPSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); + UDPSocket.Bind(new IPEndPoint(IPAddress.Any, 8888)); + UDPSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endPointUDP, + new AsyncCallback(ReceiveDataUDPAsync), null); + + isUDPNetworkConnected = true; + + //if (!isFound) + //{ + // MessageBox.Show("Network Address of Modules -> " + Properties.Settings.Default.setIP_localAOG+"[2 - 254] May not exist. \r\n" + // + "Are you sure ethernet is connected?\r\n" + "Go to UDP Settings to fix.\r\n\r\n", "Network Connection Error", + // MessageBoxButtons.OK, MessageBoxIcon.Error); + // //btnUDP.BackColor = Color.Red; + // lblIP.Text = "Not Connected"; + //} + } + catch (Exception e) + { + //WriteErrorLog("UDP Server" + e); + MessageBox.Show(e.Message, "Serious Network Connection Error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + lblIP.Text = "Error"; + } + } + + #region Send UDP + + public void SendUDPMessage(byte[] byteData) + { + if (isUDPNetworkConnected) + { + try + { + // Send packet to the zero + if (byteData.Length != 0) + { + UDPSocket.BeginSendTo(byteData, 0, byteData.Length, SocketFlags.None, + epAgIO, new AsyncCallback(SendDataUDPAsync), null); + } + } + catch (Exception) + { + //WriteErrorLog("Sending UDP Message" + e.ToString()); + //MessageBox.Show("Send Error: " + e.Message, "UDP Client", MessageBoxButtons.OK, + //MessageBoxIcon.Error); + } + } + } + + public void SendUDPMessage(string message) + { + if (isUDPNetworkConnected) + { + try + { + // Get packet as byte array to send + byte[] byteData = Encoding.ASCII.GetBytes(message); + if (byteData.Length != 0) + UDPSocket.BeginSendTo(byteData, 0, byteData.Length, SocketFlags.None, + epAgIO, new AsyncCallback(SendDataUDPAsync), null); + } + catch (Exception) + { + } + } + } + + + private void SendDataUDPAsync(IAsyncResult asyncResult) + { + try + { + UDPSocket.EndSend(asyncResult); + } + catch (Exception) + { + //WriteErrorLog(" UDP Send Data" + e.ToString()); + //MessageBox.Show("SendData Error: " + e.Message, "UDP Server", MessageBoxButtons.OK, + //MessageBoxIcon.Error); + } + } + + #endregion + + #region Receive UDP + + private void ReceiveDataUDPAsync(IAsyncResult asyncResult) + { + try + { + // Receive all data + int msgLen = UDPSocket.EndReceiveFrom(asyncResult, ref endPointUDP); + + byte[] localMsg = new byte[msgLen]; + Array.Copy(buffer, localMsg, msgLen); + + // Listen for more connections again... + UDPSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endPointUDP, + new AsyncCallback(ReceiveDataUDPAsync), null); + + BeginInvoke((MethodInvoker)(() => ReceiveFromUDP(localMsg))); + + } + catch (Exception) + { + //WriteErrorLog("UDP Recv data " + e.ToString()); + //MessageBox.Show("ReceiveData Error: " + e.Message, "UDP Server", MessageBoxButtons.OK, + //MessageBoxIcon.Error); + } + } + + + static byte [] PGN_253 = { 128, 129, 126, 253, 8, 0, 0, 0, 0, 0, 0, 0, 0, 12 }; + int PGN_253_Size = PGN_253.Length - 1; + + //Heart beat hello AgIO + static byte [] helloFromAutoSteer = { 128, 129, 126, 126, 5, 0, 0, 0, 0, 0, 71 }; + short helloSteerPosition = 0; + + + //Relays + bool isRelayActiveHigh = true; + byte relay = 0, relayHi = 0, uTurn = 0; + byte xte = 0; + + //Switches + int remoteSwitch = 0, workSwitch = 0, steerSwitch = 1, switchByte = 0; + + //On Off + byte guidanceStatus = 0; + byte prevGuidanceStatus = 0; + bool guidanceStatusChanged = false; + + //speed sent as *10 + double gpsSpeed = 0; + + //steering variables + double steerAngleActual = 8.8; + double steerAngleSetPoint = 0; //the desired angle from AgOpen + int steeringPosition = 0; //from steering sensor + double steerAngleError = 0; //setpoint - actual + + private void ReceiveFromUDP(byte[] data) + { + try + { + //Hello and scan reply + if (data[0] == 0x80 && data[1] == 0x81) + { + switch (data[3]) + { + case 126: + { + //traffic.helloFromAutoSteer = 0; + if (isViewAdvanced) + { + double actualSteerAngle = (Int16)((data[6] << 8) + data[5]); + lblWAS.Text = (actualSteerAngle * 0.01).ToString("N1"); + lblWASCounts.Text = ((Int16)((data[8] << 8) + data[7])).ToString(); + + lblSwitchStatus.Text = ((data[9] & 2) == 2).ToString(); + lblWorkSwitchStatus.Text = ((data[9] & 1) == 1).ToString(); + } + break; + } + + case 254: + { + gpsSpeed = ((double)(data[5] | data[6] << 8)) * 0.1; + + prevGuidanceStatus = guidanceStatus; + + guidanceStatus = data[7]; + guidanceStatusChanged = (guidanceStatus != prevGuidanceStatus); + + //Bit 8,9 set point steer angle * 100 is sent + steerAngleSetPoint = ((float)(data[8] | data[9] << 8)) * 0.01; //high low bytes + + //Bit 10 Tram + xte = data[10]; + + //Bit 11 + relay = data[11]; + + //Bit 12 + relayHi = data[12]; + + //---------------------------------------------------------------------------- + //Serial Send to agopenGPS + + int sa = (int)(steerAngleActual * 100); + + PGN_253[5] = unchecked((byte)((int)(sa))); + PGN_253[6] = unchecked((byte)((int)(sa) >> 8)); + + //heading + PGN_253[7] = unchecked((byte)((int)(9999))); + PGN_253[8] = unchecked((byte)((int)(9999) >> 8)); + + //roll + PGN_253[9] = unchecked((byte)((int)(8888))); + PGN_253[10] = unchecked((byte)((int)(8888) >> 8)); + + switchByte = 0; + switchByte |= ((int)remoteSwitch << 2); //put remote in bit 2 + switchByte |= (steerSwitch << 1); //put steerswitch status in bit 1 position + switchByte |= workSwitch; + + PGN_253[11] = (byte)switchByte; + PGN_253[12] = 44; //(uint8_t)pwmDisplay; + + //checksum + int CK_A = 0; + for (int i = 2; i < PGN_253_Size; i++) + CK_A = (CK_A + PGN_253[i]); + + PGN_253[PGN_253_Size] = unchecked((byte)((int)(CK_A))); + + SendUDPMessage(PGN_253); + + break; + } + + case 200: // Hello from AgIO + { + int sa = (int)(steerAngleActual * 100); + + helloFromAutoSteer[5] = unchecked((byte)((int)(sa))); + helloFromAutoSteer[6] = unchecked((byte)((int)(sa) >> 8)); + + helloFromAutoSteer[7] = 0; + helloFromAutoSteer[8] = 0; + helloFromAutoSteer[9] = (byte)switchByte; + + SendUDPMessage(helloFromAutoSteer); + + break; + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + default: + { + //module return via udp sent to AOG + //SendToLoopBackMessageAOG(data); + + break; + } + } + } // end of pgns + } + catch + { + + } + } + + #endregion + } +} diff --git a/Source/GlobalSuppressions.cs b/Source/GlobalSuppressions.cs new file mode 100644 index 0000000..45cefd4 --- /dev/null +++ b/Source/GlobalSuppressions.cs @@ -0,0 +1,15 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormGPSData.timer1_Tick(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.btnRelayTest_Click(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.btnResetTimer_Click(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.btnUDP_Click(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.deviceManagerToolStripMenuItem_Click(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.lblIP_Click(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.oneSecondLoopTimer_Tick(System.Object,System.EventArgs)")] +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.toolStripEthernet_Click(System.Object,System.EventArgs)")] diff --git a/Source/ModSim.csproj b/Source/ModSim.csproj new file mode 100644 index 0000000..defbb1b --- /dev/null +++ b/Source/ModSim.csproj @@ -0,0 +1,257 @@ + + + + + Debug + AnyCPU + {38E5D197-82BB-42DE-83F8-9D550D09BCDC} + WinExe + AgTwo + AgTwo + v4.8 + 512 + true + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + ..\..\..\AgOpenGPS_v5\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + none + true + ..\..\..\AgOpenGPS_v5\ + TRACE + prompt + 4 + + + ModSim_ico.ico + + + + + + + + + + + + + + + Form + + + FormGPSData.cs + + + Form + + + FormLoop.cs + + + Form + + + FormPGN.cs + + + Form + + + FormYes.cs + + + Form + + + FormYesNo.cs + + + Form + + + FormTimedMessage.cs + + + + + + FormGPSData.cs + Designer + + + FormLoop.cs + + + FormPGN.cs + + + FormYes.cs + + + FormYesNo.cs + + + FormTimedMessage.cs + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + ResXFileCodeGenerator + gStr.Designer.cs + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + True + gStr.resx + + + Form + FormLoop.cs + + + Form + FormLoop.cs + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.6 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/Source/ModSim_ico.ico b/Source/ModSim_ico.ico new file mode 100644 index 0000000..16c67ba Binary files /dev/null and b/Source/ModSim_ico.ico differ diff --git a/Source/Program.cs b/Source/Program.cs new file mode 100644 index 0000000..357633c --- /dev/null +++ b/Source/Program.cs @@ -0,0 +1,49 @@ +using Microsoft.Win32; +using System; +using System.Threading; +using System.Windows.Forms; + +namespace AgTwo +{ + internal static class Program + { + private static readonly Mutex Mutex = new Mutex(true, "{8F6F0AC4-B9A1-55fd-A8CF-72F04E6BDE82}"); + + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main() + { + ////opening the subkey + RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\AgOpenGPS"); + + ////create default keys if not existing + if (regKey == null) + { + RegistryKey Key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\AgOpenGPS"); + + //storing the values + Key.SetValue("Language", "en"); + Key.Close(); + + Properties.Settings.Default.setF_culture = "en"; + Properties.Settings.Default.Save(); + } + else + { + Properties.Settings.Default.setF_culture = regKey.GetValue("Language").ToString(); + Properties.Settings.Default.Save(); + regKey.Close(); + } + + if (Mutex.WaitOne(TimeSpan.Zero, true)) + { + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormLoop()); + } + } + } +} diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a4c5da0 --- /dev/null +++ b/Source/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AgTwo")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AgTwo")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c88a8244-47f5-4275-aa35-54cc884e9ede")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("5.8.9")] +[assembly: AssemblyFileVersion("5.8.9")] +[assembly: NeutralResourcesLanguage("en-CA")] diff --git a/Source/Properties/Resources.Designer.cs b/Source/Properties/Resources.Designer.cs new file mode 100644 index 0000000..672c85d --- /dev/null +++ b/Source/Properties/Resources.Designer.cs @@ -0,0 +1,503 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AgTwo.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AgTwo.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AddNew { + get { + object obj = ResourceManager.GetObject("AddNew", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AgIO_First { + get { + object obj = ResourceManager.GetObject("AgIO_First", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AgIOBtn { + get { + object obj = ResourceManager.GetObject("AgIOBtn", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowGrnLeft { + get { + object obj = ResourceManager.GetObject("ArrowGrnLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowGrnRight { + get { + object obj = ResourceManager.GetObject("ArrowGrnRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowLeft { + get { + object obj = ResourceManager.GetObject("ArrowLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowRight { + get { + object obj = ResourceManager.GetObject("ArrowRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B_Autosteer { + get { + object obj = ResourceManager.GetObject("B_Autosteer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B_GPS { + get { + object obj = ResourceManager.GetObject("B_GPS", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B_IMU { + get { + object obj = ResourceManager.GetObject("B_IMU", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B_Machine { + get { + object obj = ResourceManager.GetObject("B_Machine", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B_UDP { + get { + object obj = ResourceManager.GetObject("B_UDP", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap back_button { + get { + object obj = ResourceManager.GetObject("back_button", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Cancel64 { + get { + object obj = ResourceManager.GetObject("Cancel64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ConSt_Mandatory { + get { + object obj = ResourceManager.GetObject("ConSt_Mandatory", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DeviceManager { + get { + object obj = ResourceManager.GetObject("DeviceManager", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DnArrow64 { + get { + object obj = ResourceManager.GetObject("DnArrow64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Edit { + get { + object obj = ResourceManager.GetObject("Edit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap EthernetSetup { + get { + object obj = ResourceManager.GetObject("EthernetSetup", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Help { + get { + object obj = ResourceManager.GetObject("Help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap LogNMEA { + get { + object obj = ResourceManager.GetObject("LogNMEA", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Nav { + get { + object obj = ResourceManager.GetObject("Nav", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Nmea { + get { + object obj = ResourceManager.GetObject("Nmea", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap NTRIP_Serial { + get { + object obj = ResourceManager.GetObject("NTRIP_Serial", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap NtripSettings { + get { + object obj = ResourceManager.GetObject("NtripSettings", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap OK64 { + get { + object obj = ResourceManager.GetObject("OK64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Pause { + get { + object obj = ResourceManager.GetObject("Pause", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap PGN { + get { + object obj = ResourceManager.GetObject("PGN", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Play { + get { + object obj = ResourceManager.GetObject("Play", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ResetTimer { + get { + object obj = ResourceManager.GetObject("ResetTimer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ScanNetwork { + get { + object obj = ResourceManager.GetObject("ScanNetwork", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ScanPorts { + get { + object obj = ResourceManager.GetObject("ScanPorts", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SerialMonitor { + get { + object obj = ResourceManager.GetObject("SerialMonitor", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Settings48 { + get { + object obj = ResourceManager.GetObject("Settings48", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Sort { + get { + object obj = ResourceManager.GetObject("Sort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SubnetSend { + get { + object obj = ResourceManager.GetObject("SubnetSend", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SwitchOff { + get { + object obj = ResourceManager.GetObject("SwitchOff", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TestRelays { + get { + object obj = ResourceManager.GetObject("TestRelays", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Trash { + get { + object obj = ResourceManager.GetObject("Trash", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap UpArrow64 { + get { + object obj = ResourceManager.GetObject("UpArrow64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap VehFileLoad { + get { + object obj = ResourceManager.GetObject("VehFileLoad", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap VehFileSave { + get { + object obj = ResourceManager.GetObject("VehFileSave", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap WindowsShutDown { + get { + object obj = ResourceManager.GetObject("WindowsShutDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap www { + get { + object obj = ResourceManager.GetObject("www", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Source/Properties/Resources.resx b/Source/Properties/Resources.resx new file mode 100644 index 0000000..817cced --- /dev/null +++ b/Source/Properties/Resources.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\btnImages\www.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\VehFileLoad.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ConSt_Mandatory.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ArrowGrnRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\DeviceManager.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\TestRelays.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ScanNetwork.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\B_Machine.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\NTRIP_Serial.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\VehFileSave.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\B_GPS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnimages\trash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\AgIOBtn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\B_IMU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\AddNew.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Pause.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\back-button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Nmea.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\B_UDP.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Settings48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\DnArrow64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\WindowsShutDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ResetTimer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ArrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\SubnetSend.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Sort.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\EthernetSetup.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ArrowGrnLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\B_Autosteer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\UpArrow64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Cancel64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\LogNMEA.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\AgIO_First.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\PGN.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\SwitchOff.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ScanPorts.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\ArrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\SerialMonitor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\NtripSettings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\OK64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\btnImages\Nav.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Source/Properties/Settings.Designer.cs b/Source/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e04a837 --- /dev/null +++ b/Source/Properties/Settings.Designer.cs @@ -0,0 +1,314 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AgTwo.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool setUDP_isOn { + get { + return ((bool)(this["setUDP_isOn"])); + } + set { + this["setUDP_isOn"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("29999")] + public int setIP_thisPort { + get { + return ((int)(this["setIP_thisPort"])); + } + set { + this["setIP_thisPort"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("28888")] + public int setIP_autoSteerPort { + get { + return ((int)(this["setIP_autoSteerPort"])); + } + set { + this["setIP_autoSteerPort"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool setPgm_isFirstRun { + get { + return ((bool)(this["setPgm_isFirstRun"])); + } + set { + this["setPgm_isFirstRun"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public double setPgm_defaultLat { + get { + return ((double)(this["setPgm_defaultLat"])); + } + set { + this["setPgm_defaultLat"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public double setPgm_defaultLon { + get { + return ((double)(this["setPgm_defaultLon"])); + } + set { + this["setPgm_defaultLon"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("en")] + public string setF_culture { + get { + return ((string)(this["setF_culture"])); + } + set { + this["setF_culture"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Default")] + public string setF_workingDirectory { + get { + return ((string)(this["setF_workingDirectory"])); + } + set { + this["setF_workingDirectory"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public double setGPS_SimLatitude { + get { + return ((double)(this["setGPS_SimLatitude"])); + } + set { + this["setGPS_SimLatitude"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public double setGPS_SimLongitude { + get { + return ((double)(this["setGPS_SimLongitude"])); + } + set { + this["setGPS_SimLongitude"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string setComm_commName { + get { + return ((string)(this["setComm_commName"])); + } + set { + this["setComm_commName"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool setUDP_isSendNMEAToUDP { + get { + return ((bool)(this["setUDP_isSendNMEAToUDP"])); + } + set { + this["setUDP_isSendNMEAToUDP"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool setUDP_isUsePluginApp { + get { + return ((bool)(this["setUDP_isUsePluginApp"])); + } + set { + this["setUDP_isUsePluginApp"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool setMod_isNavConnected { + get { + return ((bool)(this["setMod_isNavConnected"])); + } + set { + this["setMod_isNavConnected"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool setMod_isMachineConnected { + get { + return ((bool)(this["setMod_isMachineConnected"])); + } + set { + this["setMod_isMachineConnected"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool setMod_isSteerConnected { + get { + return ((bool)(this["setMod_isSteerConnected"])); + } + set { + this["setMod_isSteerConnected"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("192")] + public byte etIP_SubnetOne { + get { + return ((byte)(this["etIP_SubnetOne"])); + } + set { + this["etIP_SubnetOne"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("168")] + public byte etIP_SubnetTwo { + get { + return ((byte)(this["etIP_SubnetTwo"])); + } + set { + this["etIP_SubnetTwo"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public byte etIP_SubnetThree { + get { + return ((byte)(this["etIP_SubnetThree"])); + } + set { + this["etIP_SubnetThree"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("127")] + public byte eth_loopOne { + get { + return ((byte)(this["eth_loopOne"])); + } + set { + this["eth_loopOne"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("255")] + public byte eth_loopTwo { + get { + return ((byte)(this["eth_loopTwo"])); + } + set { + this["eth_loopTwo"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("255")] + public byte eth_loopThree { + get { + return ((byte)(this["eth_loopThree"])); + } + set { + this["eth_loopThree"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("255")] + public byte eth_loopFour { + get { + return ((byte)(this["eth_loopFour"])); + } + set { + this["eth_loopFour"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string Setting { + get { + return ((string)(this["Setting"])); + } + set { + this["Setting"] = value; + } + } + } +} diff --git a/Source/Properties/Settings.settings b/Source/Properties/Settings.settings new file mode 100644 index 0000000..4041789 --- /dev/null +++ b/Source/Properties/Settings.settings @@ -0,0 +1,78 @@ + + + + + + True + + + 29999 + + + 28888 + + + True + + + 0 + + + 0 + + + en + + + Default + + + 0 + + + 0 + + + + + + False + + + False + + + True + + + True + + + True + + + 192 + + + 168 + + + 1 + + + 127 + + + 255 + + + 255 + + + 255 + + + + + + \ No newline at end of file diff --git a/Source/Settings.cs b/Source/Settings.cs new file mode 100644 index 0000000..bb4df3a --- /dev/null +++ b/Source/Settings.cs @@ -0,0 +1,28 @@ +namespace AgIO.Properties { + + + // This class allows you to handle specific events on the settings class: + // The SettingChanging event is raised before a setting's value is changed. + // The PropertyChanged event is raised after a setting's value is changed. + // The SettingsLoaded event is raised after the setting values are loaded. + // The SettingsSaving event is raised before the setting values are saved. + internal sealed partial class Settings { + + public Settings() { + // // To add event handlers for saving and changing settings, uncomment the lines below: + // + // this.SettingChanging += this.SettingChangingEventHandler; + // + // this.SettingsSaving += this.SettingsSavingEventHandler; + // + } + + private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { + // Add code to handle the SettingChangingEvent event here. + } + + private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { + // Add code to handle the SettingsSaving event here. + } + } +} diff --git a/Source/btnImages/AddNew.png b/Source/btnImages/AddNew.png new file mode 100644 index 0000000..ac5d7d0 Binary files /dev/null and b/Source/btnImages/AddNew.png differ diff --git a/Source/btnImages/AgIOAoG.png b/Source/btnImages/AgIOAoG.png new file mode 100644 index 0000000..bc41cb5 Binary files /dev/null and b/Source/btnImages/AgIOAoG.png differ diff --git a/Source/btnImages/AgIOBtn.png b/Source/btnImages/AgIOBtn.png new file mode 100644 index 0000000..ade651c Binary files /dev/null and b/Source/btnImages/AgIOBtn.png differ diff --git a/Source/btnImages/AgIO_First.gif b/Source/btnImages/AgIO_First.gif new file mode 100644 index 0000000..fbbf338 Binary files /dev/null and b/Source/btnImages/AgIO_First.gif differ diff --git a/Source/btnImages/ArrowGrnLeft.png b/Source/btnImages/ArrowGrnLeft.png new file mode 100644 index 0000000..d015f25 Binary files /dev/null and b/Source/btnImages/ArrowGrnLeft.png differ diff --git a/Source/btnImages/ArrowGrnRight.png b/Source/btnImages/ArrowGrnRight.png new file mode 100644 index 0000000..d3f3dd2 Binary files /dev/null and b/Source/btnImages/ArrowGrnRight.png differ diff --git a/Source/btnImages/ArrowLeft.png b/Source/btnImages/ArrowLeft.png new file mode 100644 index 0000000..8f9fd3b Binary files /dev/null and b/Source/btnImages/ArrowLeft.png differ diff --git a/Source/btnImages/ArrowRight.png b/Source/btnImages/ArrowRight.png new file mode 100644 index 0000000..aa803e9 Binary files /dev/null and b/Source/btnImages/ArrowRight.png differ diff --git a/Source/btnImages/B_Autosteer.png b/Source/btnImages/B_Autosteer.png new file mode 100644 index 0000000..0a8af7a Binary files /dev/null and b/Source/btnImages/B_Autosteer.png differ diff --git a/Source/btnImages/B_GPS.png b/Source/btnImages/B_GPS.png new file mode 100644 index 0000000..86340df Binary files /dev/null and b/Source/btnImages/B_GPS.png differ diff --git a/Source/btnImages/B_IMU.png b/Source/btnImages/B_IMU.png new file mode 100644 index 0000000..70d7e06 Binary files /dev/null and b/Source/btnImages/B_IMU.png differ diff --git a/Source/btnImages/B_Machine.png b/Source/btnImages/B_Machine.png new file mode 100644 index 0000000..c01f5e2 Binary files /dev/null and b/Source/btnImages/B_Machine.png differ diff --git a/Source/btnImages/B_UDP.png b/Source/btnImages/B_UDP.png new file mode 100644 index 0000000..a22c8c4 Binary files /dev/null and b/Source/btnImages/B_UDP.png differ diff --git a/Source/btnImages/Cancel64.png b/Source/btnImages/Cancel64.png new file mode 100644 index 0000000..a8092c6 Binary files /dev/null and b/Source/btnImages/Cancel64.png differ diff --git a/Source/btnImages/ConSt_Mandatory.png b/Source/btnImages/ConSt_Mandatory.png new file mode 100644 index 0000000..ec8af16 Binary files /dev/null and b/Source/btnImages/ConSt_Mandatory.png differ diff --git a/Source/btnImages/DeviceManager.png b/Source/btnImages/DeviceManager.png new file mode 100644 index 0000000..8e0c3bb Binary files /dev/null and b/Source/btnImages/DeviceManager.png differ diff --git a/Source/btnImages/DnArrow64.png b/Source/btnImages/DnArrow64.png new file mode 100644 index 0000000..695618d Binary files /dev/null and b/Source/btnImages/DnArrow64.png differ diff --git a/Source/btnImages/Edit.png b/Source/btnImages/Edit.png new file mode 100644 index 0000000..f8b72bf Binary files /dev/null and b/Source/btnImages/Edit.png differ diff --git a/Source/btnImages/EthernetSetup.png b/Source/btnImages/EthernetSetup.png new file mode 100644 index 0000000..6dc7aae Binary files /dev/null and b/Source/btnImages/EthernetSetup.png differ diff --git a/Source/btnImages/Help.png b/Source/btnImages/Help.png new file mode 100644 index 0000000..901ac04 Binary files /dev/null and b/Source/btnImages/Help.png differ diff --git a/Source/btnImages/LogNMEA.png b/Source/btnImages/LogNMEA.png new file mode 100644 index 0000000..fc04fda Binary files /dev/null and b/Source/btnImages/LogNMEA.png differ diff --git a/Source/btnImages/NTRIP_Serial.png b/Source/btnImages/NTRIP_Serial.png new file mode 100644 index 0000000..16b970c Binary files /dev/null and b/Source/btnImages/NTRIP_Serial.png differ diff --git a/Source/btnImages/Nav.png b/Source/btnImages/Nav.png new file mode 100644 index 0000000..e5358bd Binary files /dev/null and b/Source/btnImages/Nav.png differ diff --git a/Source/btnImages/Nmea.png b/Source/btnImages/Nmea.png new file mode 100644 index 0000000..0bb31f7 Binary files /dev/null and b/Source/btnImages/Nmea.png differ diff --git a/Source/btnImages/NtripSettings.png b/Source/btnImages/NtripSettings.png new file mode 100644 index 0000000..38929bc Binary files /dev/null and b/Source/btnImages/NtripSettings.png differ diff --git a/Source/btnImages/OK64.png b/Source/btnImages/OK64.png new file mode 100644 index 0000000..68f7f1b Binary files /dev/null and b/Source/btnImages/OK64.png differ diff --git a/Source/btnImages/PGN.png b/Source/btnImages/PGN.png new file mode 100644 index 0000000..7acbaaa Binary files /dev/null and b/Source/btnImages/PGN.png differ diff --git a/Source/btnImages/Pause.png b/Source/btnImages/Pause.png new file mode 100644 index 0000000..dcea989 Binary files /dev/null and b/Source/btnImages/Pause.png differ diff --git a/Source/btnImages/Play.png b/Source/btnImages/Play.png new file mode 100644 index 0000000..7b3c8be Binary files /dev/null and b/Source/btnImages/Play.png differ diff --git a/Source/btnImages/ResetTimer.png b/Source/btnImages/ResetTimer.png new file mode 100644 index 0000000..6fa4e2e Binary files /dev/null and b/Source/btnImages/ResetTimer.png differ diff --git a/Source/btnImages/ScanNetwork.png b/Source/btnImages/ScanNetwork.png new file mode 100644 index 0000000..92ee76f Binary files /dev/null and b/Source/btnImages/ScanNetwork.png differ diff --git a/Source/btnImages/ScanPorts.png b/Source/btnImages/ScanPorts.png new file mode 100644 index 0000000..5638d88 Binary files /dev/null and b/Source/btnImages/ScanPorts.png differ diff --git a/Source/btnImages/SerialMonitor.png b/Source/btnImages/SerialMonitor.png new file mode 100644 index 0000000..b6d2d65 Binary files /dev/null and b/Source/btnImages/SerialMonitor.png differ diff --git a/Source/btnImages/Settings48.png b/Source/btnImages/Settings48.png new file mode 100644 index 0000000..acf6721 Binary files /dev/null and b/Source/btnImages/Settings48.png differ diff --git a/Source/btnImages/Sort.png b/Source/btnImages/Sort.png new file mode 100644 index 0000000..690b900 Binary files /dev/null and b/Source/btnImages/Sort.png differ diff --git a/Source/btnImages/SubnetSend.png b/Source/btnImages/SubnetSend.png new file mode 100644 index 0000000..eb7a084 Binary files /dev/null and b/Source/btnImages/SubnetSend.png differ diff --git a/Source/btnImages/SwitchOff.png b/Source/btnImages/SwitchOff.png new file mode 100644 index 0000000..ac656f6 Binary files /dev/null and b/Source/btnImages/SwitchOff.png differ diff --git a/Source/btnImages/TestRelays.png b/Source/btnImages/TestRelays.png new file mode 100644 index 0000000..dcc8395 Binary files /dev/null and b/Source/btnImages/TestRelays.png differ diff --git a/Source/btnImages/UpArrow64.png b/Source/btnImages/UpArrow64.png new file mode 100644 index 0000000..5a4d6db Binary files /dev/null and b/Source/btnImages/UpArrow64.png differ diff --git a/Source/btnImages/VehFileLoad.png b/Source/btnImages/VehFileLoad.png new file mode 100644 index 0000000..b119ca6 Binary files /dev/null and b/Source/btnImages/VehFileLoad.png differ diff --git a/Source/btnImages/VehFileSave.png b/Source/btnImages/VehFileSave.png new file mode 100644 index 0000000..8bdcbb2 Binary files /dev/null and b/Source/btnImages/VehFileSave.png differ diff --git a/Source/btnImages/WindowsShutDown.png b/Source/btnImages/WindowsShutDown.png new file mode 100644 index 0000000..2e8a0e7 Binary files /dev/null and b/Source/btnImages/WindowsShutDown.png differ diff --git a/Source/btnImages/back-button.png b/Source/btnImages/back-button.png new file mode 100644 index 0000000..3331597 Binary files /dev/null and b/Source/btnImages/back-button.png differ diff --git a/Source/btnImages/trash.png b/Source/btnImages/trash.png new file mode 100644 index 0000000..4b70184 Binary files /dev/null and b/Source/btnImages/trash.png differ diff --git a/Source/btnImages/www.png b/Source/btnImages/www.png new file mode 100644 index 0000000..780bf02 Binary files /dev/null and b/Source/btnImages/www.png differ diff --git a/Source/gStr.Designer.cs b/Source/gStr.Designer.cs new file mode 100644 index 0000000..a8f43f4 --- /dev/null +++ b/Source/gStr.Designer.cs @@ -0,0 +1,153 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AgTwo { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class gStr { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal gStr() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AgTwo.gStr", typeof(gStr).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/03.-AgTwo-Orientation. + /// + internal static string gsAgIOHelp { + get { + return ResourceManager.GetString("gsAgIOHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authourizing. + /// + internal static string gsAuthourizing { + get { + return ResourceManager.GetString("gsAuthourizing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/05.-Ethernet-Setup. + /// + internal static string gsEthernetHelp { + get { + return ResourceManager.GetString("gsEthernetHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Listening. + /// + internal static string gsListening { + get { + return ResourceManager.GetString("gsListening", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NTRIP. + /// + internal static string gsNTRIP { + get { + return ResourceManager.GetString("gsNTRIP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/04.-RTK-Setup. + /// + internal static string gsNTRIP_Help { + get { + return ResourceManager.GetString("gsNTRIP_Help", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save And Return. + /// + internal static string gsSaveAndReturn { + get { + return ResourceManager.GetString("gsSaveAndReturn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save Comms. + /// + internal static string gsSaveComms { + get { + return ResourceManager.GetString("gsSaveComms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/06.-Serial-Monitor. + /// + internal static string gsSerialMonHelp { + get { + return ResourceManager.GetString("gsSerialMonHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waiting. + /// + internal static string gsWaiting { + get { + return ResourceManager.GetString("gsWaiting", resourceCulture); + } + } + } +} diff --git a/Source/gStr.resx b/Source/gStr.resx new file mode 100644 index 0000000..963a596 --- /dev/null +++ b/Source/gStr.resx @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + https://github.com/farmerbriantee/AgOpenGPS/wiki/03.-AgTwo-Orientation + + + Authourizing + + + https://github.com/farmerbriantee/AgOpenGPS/wiki/05.-Ethernet-Setup + + + Listening + + + NTRIP + + + https://github.com/farmerbriantee/AgOpenGPS/wiki/04.-RTK-Setup + + + Save And Return + + + Save Comms + + + https://github.com/farmerbriantee/AgOpenGPS/wiki/06.-Serial-Monitor + + + Waiting + + \ No newline at end of file