From 42dc1d36235292786322d28340a81c6cb3fd46c0 Mon Sep 17 00:00:00 2001
From: hurter
Date: Wed, 31 Aug 2011 16:25:05 +0000
Subject:
---
Data/AircraftPosition.cs | 73 +
Data/AircraftsList.cs | 120 +
Data/AppDatabase.cs | 79 +
Data/Beacon.cs | 140 +
Data/BeaconsXML.cs | 104 +
Data/Config.cs | 51 +
Data/Data.csproj | 82 +
Data/Horloge.cs | 49 +
Data/IAircraftView.cs | 12 +
Data/MathCautra.cs | 53 +
Data/MathTools.cs | 19 +
Data/Program.cs | 73 +
Data/Properties/AssemblyInfo.cs | 36 +
Data/Route.cs | 117 +
Data/RoutesXML.cs | 73 +
Data/Sector.cs | 215 ++
Data/SectorsXML.cs | 294 ++
Data/app.config | 3 +
Data/balises.xml | 1949 ++++++++++++++
Data/bin/Debug/Data.exe | Bin 0 -> 23040 bytes
Data/bin/Debug/Data.exe.config | 3 +
Data/bin/Debug/Data.pdb | Bin 0 -> 71168 bytes
Data/bin/Debug/Data.vshost.exe | Bin 0 -> 11600 bytes
Data/bin/Debug/Data.vshost.exe.manifest | 11 +
Data/bin/Debug/Ivy.dll | Bin 0 -> 65536 bytes
Data/bin/Debug/IvyBus.IvyControl.dll | Bin 0 -> 13312 bytes
Data/bin/Debug/balises.xml | 1949 ++++++++++++++
Data/bin/Debug/routes.xml | 39 +
Data/bin/Debug/sectors.xml | 2824 ++++++++++++++++++++
.../obj/x86/Debug/Data.csproj.FileListAbsolute.txt | 34 +
Data/obj/x86/Debug/Data.exe | Bin 0 -> 23040 bytes
Data/obj/x86/Debug/Data.pdb | Bin 0 -> 71168 bytes
.../DesignTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 5938 bytes
Data/obj/x86/Debug/ResolveAssemblyReference.cache | Bin 0 -> 7754 bytes
.../x86/Release/Data.csproj.FileListAbsolute.txt | 1 +
.../DesignTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 5866 bytes
Data/obj/x86/Release/build.force | 0
Data/routes.xml | 39 +
Data/sectors.xml | 2824 ++++++++++++++++++++
39 files changed, 11266 insertions(+)
create mode 100644 Data/AircraftPosition.cs
create mode 100644 Data/AircraftsList.cs
create mode 100644 Data/AppDatabase.cs
create mode 100644 Data/Beacon.cs
create mode 100644 Data/BeaconsXML.cs
create mode 100644 Data/Config.cs
create mode 100644 Data/Data.csproj
create mode 100644 Data/Horloge.cs
create mode 100644 Data/IAircraftView.cs
create mode 100644 Data/MathCautra.cs
create mode 100644 Data/MathTools.cs
create mode 100644 Data/Program.cs
create mode 100644 Data/Properties/AssemblyInfo.cs
create mode 100644 Data/Route.cs
create mode 100644 Data/RoutesXML.cs
create mode 100644 Data/Sector.cs
create mode 100644 Data/SectorsXML.cs
create mode 100644 Data/app.config
create mode 100644 Data/balises.xml
create mode 100644 Data/bin/Debug/Data.exe
create mode 100644 Data/bin/Debug/Data.exe.config
create mode 100644 Data/bin/Debug/Data.pdb
create mode 100644 Data/bin/Debug/Data.vshost.exe
create mode 100644 Data/bin/Debug/Data.vshost.exe.manifest
create mode 100644 Data/bin/Debug/Ivy.dll
create mode 100644 Data/bin/Debug/IvyBus.IvyControl.dll
create mode 100644 Data/bin/Debug/balises.xml
create mode 100644 Data/bin/Debug/routes.xml
create mode 100644 Data/bin/Debug/sectors.xml
create mode 100644 Data/obj/x86/Debug/Data.csproj.FileListAbsolute.txt
create mode 100644 Data/obj/x86/Debug/Data.exe
create mode 100644 Data/obj/x86/Debug/Data.pdb
create mode 100644 Data/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
create mode 100644 Data/obj/x86/Debug/ResolveAssemblyReference.cache
create mode 100644 Data/obj/x86/Release/Data.csproj.FileListAbsolute.txt
create mode 100644 Data/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache
create mode 100644 Data/obj/x86/Release/build.force
create mode 100644 Data/routes.xml
create mode 100644 Data/sectors.xml
(limited to 'Data')
diff --git a/Data/AircraftPosition.cs b/Data/AircraftPosition.cs
new file mode 100644
index 0000000..a80ada2
--- /dev/null
+++ b/Data/AircraftPosition.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Data
+{
+ public class AircraftPosition
+ {
+ #region Attributes
+
+ public string Flight;
+ public string CallSign;
+
+ ///
+ /// SSR Code
+ ///
+ public string Ssr;
+
+ public string Sector;
+ public string Layers;
+
+ public double X;
+ public double Y;
+
+
+ public double GroundSpeed;
+ public int Heading;
+ public double Vx;
+ public double Vy;
+
+ ///
+ /// Flight level
+ ///
+ public int AFL;
+
+ ///
+ /// fts/min
+ ///
+ public int Rate;
+
+ ///
+ /// O : Stable
+ /// 1 : climb
+ /// -1 : Descent
+ /// -2 : unknown
+ ///
+ public int Tendency;
+
+ ///
+ /// HH:MM:SS
+ ///
+ public int Time_Of_Plot;
+
+ ///
+ /// The minimum séparation with another aircraft
+ /// existe if the vertical separation is below 1000ft
+ ///
+ public double MinSeparation;
+
+ ///
+ /// the closest aircraft
+ ///
+ public string MinSeparationCallSign;
+
+ ///
+ /// The speed alteration given with Erasmus -100% -> +100%
+ ///
+ public double ErasmusDeltaGroundSpeed;
+
+ #endregion
+ }
+}
diff --git a/Data/AircraftsList.cs b/Data/AircraftsList.cs
new file mode 100644
index 0000000..78ccbc2
--- /dev/null
+++ b/Data/AircraftsList.cs
@@ -0,0 +1,120 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using IvyBus;
+using System.Timers;
+
+namespace Data
+{
+ public class AircraftsList
+ {
+ private Dictionary> listOfAircrafts;
+ private IvyBus.IvyControl TheIvyBus;
+ private List aircraftViews;
+ private Timer t_endWaitingForUpdate;
+
+ #region Constructeur
+ public AircraftsList(IvyBus.IvyControl TheIvyBus)
+ {
+ this.TheIvyBus = TheIvyBus;
+ listOfAircrafts = new Dictionary>();
+ aircraftViews = new List();
+
+ t_endWaitingForUpdate = new Timer();
+ t_endWaitingForUpdate.Elapsed += new ElapsedEventHandler(HandleEndWaitingEvent);
+ t_endWaitingForUpdate.Interval = 4000;
+ t_endWaitingForUpdate.Start();
+
+ TheIvyBus.BindMsg(@"^TrackMovedEvent Flight=([0-9]+) CallSign=([a-zA-Z0-9_-]+) Ssr=([0-9]*)[ ]+Sector=(.*) Layers=(.*) X=(.+) Y=(.+) Vx=(.+) Vy=(.+) Afl=([0-9]+) Rate=(-?[0-9]+) Heading=([-\.0-9]+) GroundSpeed=([0-9]+) Tendency=(-?[0-9]) Time=([0-9]+:[0-9]+:[0-9]+)",
+ UpdateFlight, null);
+ }
+ #endregion
+
+ #region listGestion
+ private void AddAircraftPosition(AircraftPosition pos)
+ {
+ if (!listOfAircrafts.ContainsKey(pos.CallSign))
+ {
+ //New radar Track
+ listOfAircrafts[pos.CallSign] = new List();
+ }
+ //Test if no more than CometLength Item
+ if (listOfAircrafts[pos.CallSign].Count > Config.aircraftCometLength)
+ listOfAircrafts[pos.CallSign].RemoveAt(0);
+
+ listOfAircrafts[pos.CallSign].Add(pos);
+ }
+
+ public Dictionary> getAircraftList()
+ {
+ return listOfAircrafts;
+ }
+ #endregion
+
+ #region MVCAircraftViews
+ public void addAircraftView(IAircraftView view)
+ {
+ aircraftViews.Add(view);
+ }
+
+ public void removeAircraftView(IAircraftView view)
+ {
+ aircraftViews.Remove(view);
+ }
+
+ private void notifyAircraftViews()
+ {
+ foreach (IAircraftView view in aircraftViews)
+ {
+ view.updateView(listOfAircrafts);
+ }
+ }
+
+ #endregion
+
+ #region IvyGestion
+ private void UpdateFlight(object sender, IvyMessageEventArgs e)
+ {
+ //Create new aircraft and store it
+ AircraftPosition pos = new AircraftPosition();
+
+ pos.Flight = e[0];
+ pos.CallSign = e[1];
+ pos.Ssr = e[2];
+ pos.Sector = e[3];
+ pos.Layers = e[4];
+ pos.X = double.Parse(e[5], TheIvyBus.Culture);
+ pos.Y = double.Parse(e[6], TheIvyBus.Culture);
+ pos.Vx = double.Parse(e[7], TheIvyBus.Culture);
+ pos.Vy = double.Parse(e[8], TheIvyBus.Culture);
+ pos.AFL = int.Parse(e[9], TheIvyBus.Culture);
+ pos.Rate = int.Parse(e[10], TheIvyBus.Culture);
+ pos.Heading = int.Parse(e[11], TheIvyBus.Culture);
+ pos.GroundSpeed = double.Parse(e[12], TheIvyBus.Culture);
+ pos.Tendency = int.Parse(e[13], TheIvyBus.Culture);
+ //Parse the time
+ string sTime = e[14];
+ string[] time = sTime.Split(':');
+
+ pos.Time_Of_Plot = Convert.ToInt32(time[2]) +
+ Convert.ToInt32(time[1]) * 60 +
+ Convert.ToInt32(time[0]) * 3600;
+
+ AddAircraftPosition(pos);
+ notifyAircraftViews();
+ t_endWaitingForUpdate.Stop();
+ t_endWaitingForUpdate.Start();
+ }
+ #endregion
+
+ #region TimerGestion
+ public void HandleEndWaitingEvent(object source, ElapsedEventArgs e)
+ {
+ Console.WriteLine("Vue forcée");
+ TheIvyBus.SendMsg("GetRadarRefresh");
+ t_endWaitingForUpdate.Start();
+ }
+ #endregion
+ }
+}
diff --git a/Data/AppDatabase.cs b/Data/AppDatabase.cs
new file mode 100644
index 0000000..f3897b2
--- /dev/null
+++ b/Data/AppDatabase.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using IvyBus;
+
+namespace Data
+{
+ public class AppDatabase
+ {
+ private AircraftsList listOfAircrafts;
+ private Beacon[] listOfBeacons;
+ private Route[] listOfRoutes;
+ private Sector[] listOfSectors;
+ private Horloge horloge;
+
+ #region Constructor
+
+ public AppDatabase(IvyControl IvyBus)
+ {
+ this.listOfAircrafts = new AircraftsList(IvyBus);
+ this.listOfBeacons = Beacon.LoadBeaconsFile(@Config.beaconsXmlFilePath);
+ this.listOfRoutes = Route.LoadRoutesFile(@Config.routesXmlFilePath, this);
+ this.listOfSectors = Sector.LoadSectorsFile(@Config.sectorsXmlFilePath);
+
+ this.horloge = new Horloge(IvyBus);
+ }
+ #endregion
+
+ #region Getter
+ public Sector[] getSectors()
+ {
+ return listOfSectors;
+ }
+
+ public Route[] getRoutes()
+ {
+ return listOfRoutes;
+ }
+
+ public Beacon[] getBeacons()
+ {
+ return listOfBeacons;
+ }
+
+ public int getHour()
+ {
+ return horloge.getHour();
+ }
+
+ public int getMinute()
+ {
+ return horloge.getMinute();
+ }
+
+ public int getSecond()
+ {
+ return horloge.getSecond();
+ }
+
+ public Dictionary> getAircraftList()
+ {
+ return listOfAircrafts.getAircraftList();
+ }
+ #endregion
+
+ #region AddViewFuntions
+ public void addAircraftView(IAircraftView view)
+ {
+ listOfAircrafts.addAircraftView(view);
+ }
+
+ public void removeAircraftView(IAircraftView view)
+ {
+ listOfAircrafts.removeAircraftView(view);
+ }
+ #endregion
+ }
+}
diff --git a/Data/Beacon.cs b/Data/Beacon.cs
new file mode 100644
index 0000000..fe9314a
--- /dev/null
+++ b/Data/Beacon.cs
@@ -0,0 +1,140 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using System.Xml.Serialization;
+using System.IO;
+
+namespace Data
+{
+ public class Beacon
+ {
+ #region Attributes
+
+ public static float Ratio = Config.coordinatesRatio;
+
+ private string _code;
+ private string _type;
+ private double _lat;
+ private double _lon;
+ private bool _isSelected = false;
+
+ #endregion
+
+ #region Constructor
+
+ public Beacon(pointsPoint beacon)
+ {
+ this._code = beacon.code;
+ this._type = beacon.type;
+ this._lat = beacon.lat;
+ this._lon = beacon.lon;
+ }
+
+ #endregion
+
+ #region Methods
+
+ public void Draw(Graphics g)
+ {
+ //Pen drawBeaconsPen = new Pen(Config.drawBeaconCodeColor, 0.1f);
+ SolidBrush drawBeaconBrush = new SolidBrush(Config.drawBeaconColor);
+ SolidBrush drawBeaconCodeBrush = new SolidBrush(Config.drawBeaconCodeColor);
+ Font beaconsCodesFont = Config.unselectedBeaconsCodesFont;
+
+ if (this._isSelected)
+ {
+ //drawBeaconsPen = new Pen(Config.drawSelectedBeaconCodeColor, 0.1f);
+ drawBeaconBrush = new SolidBrush(Config.drawSelectedBeaconColor);
+ drawBeaconCodeBrush = new SolidBrush(Config.drawSelectedBeaconCodeColor);
+ beaconsCodesFont = Config.selectedBeaconsCodesFont;
+ }
+
+ PointF locationPointF = this.toPointF();
+ if (this.Type != "unpublished")
+ {
+ //g.DrawEllipse(drawBeaconsPen, (float)PanAndZoomX(locationPointF.X / Ratio), (float)PanAndZoomY(locationPointF.Y / Ratio), Config.beaconsCirclesSize, Config.beaconsCirclesSize);
+ g.FillEllipse(drawBeaconBrush, (float)PanAndZoomX(locationPointF.X / Ratio), (float)PanAndZoomY(locationPointF.Y / Ratio), Config.beaconsCirclesSize, Config.beaconsCirclesSize);
+ g.DrawString(this.Code, beaconsCodesFont, drawBeaconCodeBrush, new PointF((float)PanAndZoomX(locationPointF.X / Ratio) + 5, (float)PanAndZoomY(locationPointF.Y / Ratio) + 5));
+ }
+ }
+
+ public PointF toPointF()
+ {
+ return MathCautra.ToCautra4(this._lat, this._lon);
+ }
+
+ #endregion
+
+ #region Getters and Setters
+
+ public string Code
+ {
+ get { return _code; }
+ set { _code = value; }
+ }
+
+ public string Type
+ {
+ get { return _type; }
+ set { _type = value; }
+ }
+
+ public double Lat
+ {
+ get { return _lat; }
+ set { _lat = value; }
+ }
+
+ public double Lon
+ {
+ get { return _lon; }
+ set { _lon = value; }
+ }
+
+ public bool isBeaconSelected
+ {
+ get { return _isSelected; }
+ set { _isSelected = value; }
+ }
+
+ #endregion
+
+ #region Delegate Pan And Zoom
+
+ public delegate double PanAndZoom(double input);
+
+ [NonSerialized]
+ static public PanAndZoom PanAndZoomX;
+ [NonSerialized]
+ static public PanAndZoom PanAndZoomY;
+
+ #endregion
+
+ #region createList
+
+ public static Beacon[] LoadBeaconsFile(string fileName)
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(points));
+ TextReader reader = new StreamReader(fileName);
+
+ Beacon[] Beacons = null;
+ if (reader != null)
+ {
+ points beaconsXml = (points)serializer.Deserialize(reader);
+ reader.Close();
+ Beacons = new Beacon[beaconsXml.Items.Length];
+ int indexSec = 0;
+ foreach (pointsPoint s in beaconsXml.Items)
+ {
+ Beacons[indexSec++] = new Beacon(s);
+ //Console.WriteLine("Balise : " + s.code + " --> lat : " + s.lat + " & lon : " + s.lon);
+ }
+ //Console.WriteLine("Beacons : " + beaconsXml.Items.Length);
+ }
+ return Beacons;
+ }
+ #endregion
+ }
+}
diff --git a/Data/BeaconsXML.cs b/Data/BeaconsXML.cs
new file mode 100644
index 0000000..c08afe3
--- /dev/null
+++ b/Data/BeaconsXML.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Serialization;
+
+namespace Data
+{
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
+ public partial class points
+ {
+ private pointsPoint[] itemsField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute("point", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public pointsPoint[] Items
+ {
+ get
+ {
+ return this.itemsField;
+ }
+ set
+ {
+ this.itemsField = value;
+ }
+ }
+ }
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ public partial class pointsPoint
+ {
+
+ private string codeField;
+ private string typeField;
+ private double lattitudeField;
+ private double longitudeField;
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public string code
+ {
+ get
+ {
+ return this.codeField;
+ }
+ set
+ {
+ this.codeField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public string type
+ {
+ get
+ {
+ return this.typeField;
+ }
+ set
+ {
+ this.typeField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public double lat
+ {
+ get
+ {
+ return this.lattitudeField;
+ }
+ set
+ {
+ this.lattitudeField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public double lon
+ {
+ get
+ {
+ return this.longitudeField;
+ }
+ set
+ {
+ this.longitudeField = value;
+ }
+ }
+ }
+}
diff --git a/Data/Config.cs b/Data/Config.cs
new file mode 100644
index 0000000..1aa97ba
--- /dev/null
+++ b/Data/Config.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+
+namespace Data
+{
+ class Config
+ {
+ #region Route
+
+ public static float coordinatesRatio = 8f;
+
+ public static string sectorsXmlFilePath = "sectors.xml";
+ public static string beaconsXmlFilePath = "balises.xml";
+ public static string routesXmlFilePath = "routes.xml";
+
+ public static Pen drawRoutesPen = new Pen(Color.FromArgb(60, Color.White), 1.0f);
+
+ #endregion
+
+ #region Beacon
+
+ public static Font unselectedBeaconsCodesFont = new Font("Arial", 8, FontStyle.Regular);
+ public static Color drawBeaconColor = Color.FromArgb(100, Color.Black);
+ public static Color drawBeaconCodeColor = Color.FromArgb(80, Color.Black);
+ public static Color drawSelectedBeaconColor = Color.FromArgb(100, Color.White);
+ public static Color drawSelectedBeaconCodeColor = Color.FromArgb(80, Color.White);
+ public static Font selectedBeaconsCodesFont = new Font("Arial", 8, FontStyle.Bold);
+
+ public static int beaconsCirclesSize = 5;
+ #endregion
+
+ #region Sector
+ public static int sectorHighFloorValue = 195;
+ public static Color sectorLinesColor = Color.FromArgb(40, Color.Black);
+ //public static Color sectorSelectedFillColor = Color.FromArgb(250, Color.DarkSlateGray);
+ public static Color sectorSelectedFillColor = Color.FromArgb(250, ColorTranslator.FromHtml("#616360"));
+ //public static Color sectorFillColor = Color.FromArgb(0, Color.DarkSlateGray);
+ public static Color sectorFillColor = Color.FromArgb(200, ColorTranslator.FromHtml("#7a797c"));
+ public static Color sectorNameColor = Color.FromArgb(255, Color.Black);
+ public static Font sectorNameFont = new Font("Arial", 8);
+ #endregion
+
+ #region Aircraft
+ static public int aircraftCometLength = 5;
+ #endregion
+
+ }
+}
diff --git a/Data/Data.csproj b/Data/Data.csproj
new file mode 100644
index 0000000..4133730
--- /dev/null
+++ b/Data/Data.csproj
@@ -0,0 +1,82 @@
+
+
+
+ Debug
+ x86
+ 8.0.30703
+ 2.0
+ {2C32E701-5024-4F4B-AB35-1D5DD0049A8E}
+ Exe
+ Properties
+ Data
+ Data
+ v4.0
+
+
+ 512
+
+
+ x86
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ x86
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\lib\Ivy.dll
+
+
+ ..\lib\IvyBus.IvyControl.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Data/Horloge.cs b/Data/Horloge.cs
new file mode 100644
index 0000000..c4e6bea
--- /dev/null
+++ b/Data/Horloge.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using IvyBus;
+
+namespace Data
+{
+ public class Horloge
+ {
+ private IvyBus.IvyControl TheIvyBus;
+ private int hour, minute, second;
+
+ public Horloge(IvyBus.IvyControl TheIvyBus)
+ {
+ this.TheIvyBus = TheIvyBus;
+ hour = 0;
+ minute = 0;
+ second = 0;
+ TheIvyBus.ivy.BindMsg(@"^ClockEvent Time=([0-9]+):([0-9]+):([0-9]+) Rate=.* Bs=.*",
+ UpdateClock, null);
+ }
+
+ public int getHour()
+ {
+ return this.hour;
+ }
+
+ public int getMinute()
+ {
+ return this.minute;
+ }
+
+ public int getSecond()
+ {
+ return this.second;
+ }
+ private void UpdateClock(object sender, IvyMessageEventArgs e)
+ {
+ int new_hour = Int32.Parse(e[0]);
+ int new_minute = Int32.Parse(e[1]);
+ int new_second = Int32.Parse(e[2]);
+
+ hour = new_hour;
+ minute = new_minute;
+ second = new_second;
+ }
+ }
+}
diff --git a/Data/IAircraftView.cs b/Data/IAircraftView.cs
new file mode 100644
index 0000000..0a85a0e
--- /dev/null
+++ b/Data/IAircraftView.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Data
+{
+ public interface IAircraftView
+ {
+ void updateView(Dictionary> listOfAircrafts);
+ }
+}
diff --git a/Data/MathCautra.cs b/Data/MathCautra.cs
new file mode 100644
index 0000000..f0cb10a
--- /dev/null
+++ b/Data/MathCautra.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+
+namespace Data
+{
+ public class MathCautra
+ {
+ /// CRadarGeo message handlers
+ static double PI = 3.1415926535;
+
+ /* conversion degres_radian */
+ static double degres_radian = PI / 180.0;
+
+ /* translation coordonees Cautra 3 Cautra 4 */
+ //static int translationC3 = 4096;
+
+ /* Transformation LAMBERT */
+ static double sin_lt = Math.Sin(47.0 * degres_radian);
+ /* sinus de la latitude de tangeance */
+ static double inv_sin_lt = 1.0 / sin_lt;
+
+ /* rayon LAMBERT a l'equateur */
+ static double re = 6327.721;
+ /* rayon LAMBERT au 47 N */
+ static double rt = 3201.39922;
+
+ ///
+ /// Convertion de coordonnees lat,long en 1/8 nm Cautra4
+ ///
+ ///
+ ///
+ ///
+ public static PointF ToCautra4(double latitude, double longitude)
+ {
+ double a0; /* Angle de convergence */
+ double r0; /* rayon LAMBERT */
+ double sin_a0, cos_a0;
+ double xx;
+
+ a0 = longitude * sin_lt * degres_radian;
+ xx = Math.Tan(PI / 4 - (latitude * degres_radian) / 2.0);
+ r0 = re * Math.Pow(xx, sin_lt);
+ sin_a0 = Math.Sin(a0);
+ cos_a0 = Math.Cos(a0);
+ return new PointF(
+ (float)(8.0 * r0 * sin_a0),
+ (float)(8.0 * (rt - (r0 * cos_a0))));
+ }
+ }
+}
diff --git a/Data/MathTools.cs b/Data/MathTools.cs
new file mode 100644
index 0000000..adbe90a
--- /dev/null
+++ b/Data/MathTools.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Data
+{
+ public class MathTools
+ {
+
+ static public float GenericScaleF(float input, float i1, float o1, float i2, float o2)
+ {
+ if (i2 == i1) return ((o2 + o1) / 2.0f);
+ float a = (o2 - o1) / (i2 - i1);
+ float b = o1 - a * i1;
+ return (a * input + b);
+ }
+ }
+}
diff --git a/Data/Program.cs b/Data/Program.cs
new file mode 100644
index 0000000..0b7b3cc
--- /dev/null
+++ b/Data/Program.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using IvyBus;
+
+namespace Data
+{
+ class Program
+ {
+
+ private const string ivy_domain = "127.255.255.255:2010";
+
+ static void Main(string[] args)
+ {
+ IvyControl TheIvyBus = new IvyControl();
+ //
+ // TheIvyBus
+ //
+ TheIvyBus.AppName = "AppDatabase";
+ TheIvyBus.Culture = new System.Globalization.CultureInfo("en-US");
+ TheIvyBus.ivy.Start(ivy_domain);
+ //TheIvyDomain.DomainChanged += new EventHandler(TheIvyDomain_DomainChanged);
+ AppDatabase database = new AppDatabase(TheIvyBus);
+
+ database.addAircraftView(new ConsoleAircraftView(database));
+
+
+
+ /** Console.WriteLine("Affichage de la liste des beacons : ");
+ Beacon[] beacons = database.getBeacons();
+ foreach (Beacon b in beacons)
+ {
+ Console.WriteLine(b.Code + " : " + b.Lat + " " + b.Lon);
+ }
+
+ Console.WriteLine("\n\nAffichage des secteurs : ");
+ Sector[] sectors = database.getSectors();
+ foreach (Sector s in sectors)
+ {
+ Console.WriteLine(s.Name);
+ }
+
+ Console.WriteLine("\n\nAffichage des Routes : ");
+ Route[] routes = database.getRoutes();
+ foreach (Route r in routes)
+ {
+ Console.WriteLine(r.B1 + " -> " + r.B2);
+ }
+ * */
+ }
+ }
+
+ class ConsoleAircraftView : IAircraftView
+ {
+ private int count;
+ private AppDatabase app;
+ public ConsoleAircraftView(AppDatabase app)
+ {
+ count = 0;
+ this.app = app;
+ }
+ public void updateView(Dictionary> listOfAircrafts)
+ {
+ count++;
+ Console.WriteLine("Vue updatee pour la " + count + "ème fois");
+ if ((count % 100) == 0)
+ {
+ Console.WriteLine("Hour : " + app.getHour() + ":" + app.getMinute() + ":" + app.getSecond());
+ }
+ }
+ }
+}
diff --git a/Data/Properties/AssemblyInfo.cs b/Data/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e9dfbe5
--- /dev/null
+++ b/Data/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Les informations générales relatives à un assembly dépendent de
+// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations
+// associées à un assembly.
+[assembly: AssemblyTitle("Data")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Data")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly
+// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de
+// COM, affectez la valeur true à l'attribut ComVisible sur ce type.
+[assembly: ComVisible(false)]
+
+// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM
+[assembly: Guid("131f0135-f2f2-4ccf-ab69-befbb024187a")]
+
+// Les informations de version pour un assembly se composent des quatre valeurs suivantes :
+//
+// Version principale
+// Version secondaire
+// Numéro de build
+// Révision
+//
+// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
+// en utilisant '*', comme indiqué ci-dessous :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Data/Route.cs b/Data/Route.cs
new file mode 100644
index 0000000..6a8cbf6
--- /dev/null
+++ b/Data/Route.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using System.Xml.Serialization;
+using System.IO;
+
+namespace Data
+{
+ public class Route
+ {
+ #region Attributes
+
+ public static float Ratio = Config.coordinatesRatio;
+
+ private string _b1;
+ private string _b2;
+
+ private AppDatabase app;
+
+ #endregion
+
+ #region Constructor
+
+ public Route(routesRoute route, AppDatabase app1)
+ {
+ this._b1 = route.b1;
+ this._b2 = route.b2;
+ this.app = app1;
+ }
+
+ #endregion
+
+ #region Methods
+
+ public void Draw(Graphics g)
+ {
+ Beacon startBeacon = getCorrespondingBeacon(this.B1);
+ Beacon endBeacon = getCorrespondingBeacon(this.B2);
+
+ if ((startBeacon != null) && (endBeacon != null))
+ {
+ PointF locationPointB1 = startBeacon.toPointF();
+ PointF locationPointB2 = endBeacon.toPointF();
+ g.DrawLine(Config.drawRoutesPen, (float)PanAndZoomX(locationPointB1.X / Ratio), (float)PanAndZoomY(locationPointB1.Y / Ratio), (float)PanAndZoomX(locationPointB2.X / Ratio), (float)PanAndZoomY(locationPointB2.Y / Ratio));
+ }
+ }
+
+ public Beacon getCorrespondingBeacon(string bCode)
+ {
+ Beacon correspondingBeacon = null;
+ foreach (Beacon b in app.getBeacons())
+ {
+ if (b.Code == bCode)
+ {
+ correspondingBeacon = b;
+ break;
+ }
+ }
+ return correspondingBeacon;
+ }
+
+ #endregion
+
+ #region Getters and Setters
+
+ public string B1
+ {
+ get { return _b1; }
+ set { _b1 = value; }
+ }
+
+ public string B2
+ {
+ get { return _b2; }
+ set { _b2 = value; }
+ }
+
+ #endregion
+
+ #region Delegate Pan And Zoom
+
+ public delegate double PanAndZoom(double input);
+
+ [NonSerialized]
+ static public PanAndZoom PanAndZoomX;
+ [NonSerialized]
+ static public PanAndZoom PanAndZoomY;
+
+ #endregion
+
+ #region createList
+ public static Route[] LoadRoutesFile(string fileName, AppDatabase app)
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(routes));
+ TextReader reader = new StreamReader(fileName);
+
+ Route[] Routes = null;
+ if (reader != null)
+ {
+ routes routesXml = (routes)serializer.Deserialize(reader);
+ reader.Close();
+ Routes = new Route[routesXml.Items.Length];
+ int indexSec = 0;
+ foreach (routesRoute r in routesXml.Items)
+ {
+ Routes[indexSec++] = new Route(r, app);
+ //Console.WriteLine("Route : " + r.b1 + " / " + r.b2);
+ }
+ //Console.WriteLine("Routes : " + routesXml.Items.Length);
+ }
+ return Routes;
+ }
+ #endregion
+ }
+}
diff --git a/Data/RoutesXML.cs b/Data/RoutesXML.cs
new file mode 100644
index 0000000..2ec7ea5
--- /dev/null
+++ b/Data/RoutesXML.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Data
+{
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
+ public partial class routes
+ {
+ private routesRoute[] itemsField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute("route", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public routesRoute[] Items
+ {
+ get
+ {
+ return this.itemsField;
+ }
+ set
+ {
+ this.itemsField = value;
+ }
+ }
+ }
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ public partial class routesRoute
+ {
+
+ private string _b1;
+ private string _b2;
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public string b1
+ {
+ get
+ {
+ return this._b1;
+ }
+ set
+ {
+ this._b1 = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public string b2
+ {
+ get
+ {
+ return this._b2;
+ }
+ set
+ {
+ this._b2 = value;
+ }
+ }
+ }
+}
diff --git a/Data/Sector.cs b/Data/Sector.cs
new file mode 100644
index 0000000..82c3825
--- /dev/null
+++ b/Data/Sector.cs
@@ -0,0 +1,215 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using System.Xml.Serialization;
+using System.IO;
+
+namespace Data
+{
+ public class Sector
+ {
+ #region Attributes and structure
+
+ public static float Ratio = Config.coordinatesRatio;
+
+ private bool _isSelected = false;
+ private string _Name;
+ public Slice[] Slices;
+
+ public struct Slice
+ {
+ public int Floor;
+ public int Ceiling;
+ public PointF[] Points;
+ }
+
+ #endregion
+
+ #region Constructor
+
+ public Sector(sectorsSector raw)
+ {
+ _Name = raw.name;
+ Slices = new Slice[raw.slice.Length];
+ this._isSelected = false;
+ int indexSlice = 0;
+ foreach (sectorsSectorSlice s in raw.slice)
+ {
+ Slices[indexSlice].Floor = s.floor;
+ Slices[indexSlice].Ceiling = s.ceiling;
+
+ Slices[indexSlice].Points = new PointF[s.vertex.Length];
+ int indexVextex = 0;
+ foreach (sectorsSectorSliceVertex v in s.vertex)
+ {
+ Slices[indexSlice].Points[indexVextex] = MathCautra.ToCautra4(v.lat, v.lon);
+ indexVextex++;
+ }
+ indexSlice++;
+ }
+ }
+
+ #endregion
+
+ #region Methods
+
+ static public bool PointInPolygon(PointF p, Sector sect)
+ {
+ PointF p1, p2;
+
+ bool inside = false;
+
+ foreach (Slice slice in sect.Slices)
+ {
+ PointF[] poly = slice.Points;
+
+ if (poly.Length < 3)
+ {
+ return inside;
+ }
+
+ PointF oldPoint = new PointF(
+
+ poly[poly.Length - 1].X, poly[poly.Length - 1].Y);
+
+ for (int i = 0; i < poly.Length; i++)
+ {
+ PointF newPoint = new PointF(poly[i].X, poly[i].Y);
+
+ if (newPoint.X > oldPoint.X)
+ {
+ p1 = oldPoint;
+ p2 = newPoint;
+ }
+ else
+ {
+ p1 = newPoint;
+ p2 = oldPoint;
+ }
+
+ if ((newPoint.X < p.X) == (p.X <= oldPoint.X) && ((long)p.Y - (long)p1.Y) * (long)(p2.X - p1.X)
+ < ((long)p2.Y - (long)p1.Y) * (long)(p.X - p1.X))
+ {
+ inside = !inside;
+ }
+ oldPoint = newPoint;
+ }
+ if (inside == true) break;
+ }
+ return inside;
+ }
+
+ public override string ToString()
+ {
+ return _Name;
+ }
+
+ public void Draw(Graphics g, Boolean drawSectorsNames)
+ {
+ Pen drawLinesPen = new Pen(Config.sectorLinesColor, 0.5f);
+
+ SolidBrush fillPolygonBrush = null;
+ if (this.isSectorSelected)
+ {
+ fillPolygonBrush = new SolidBrush(Config.sectorSelectedFillColor);
+ }
+ else
+ {
+ fillPolygonBrush = new SolidBrush(Config.sectorFillColor);
+ }
+
+ //PointF p1, p2;
+ PointF pCurr = new PointF(0, 0), pSuiv = new PointF(0, 0), pTransf = new PointF(0, 0);
+ PointF[] tabPoints;
+
+ int sliceCeiling;
+
+ foreach (Slice s in Slices)
+ {
+ sliceCeiling = s.Ceiling;
+ if (sliceCeiling > Config.sectorHighFloorValue)
+ {
+ if (drawSectorsNames)
+ {
+ PointF sectorNamePos = s.Points[0];
+ SolidBrush sectorNameBrush = new SolidBrush(Config.sectorNameColor);
+ g.DrawString(this.Name, Config.sectorNameFont, sectorNameBrush, new PointF((float)PanAndZoomX(sectorNamePos.X / Ratio), (float)PanAndZoomY(sectorNamePos.Y / Ratio)));
+ }
+
+ tabPoints = new PointF[s.Points.Length-1 ];
+ for (int i = 0; i < (s.Points.Length-1 ); i++)
+ {
+ //p1 = s.Points[i] ;
+ //p2 = s.Points[i + 1];
+ //g.DrawLine(p, (float)PanAndZoomX(p1.X / Ratio), (float)PanAndZoomY(p1.Y / Ratio), (float)PanAndZoomX(p2.X / Ratio), (float)PanAndZoomY(p2.Y / Ratio));
+
+ pCurr = s.Points[i];
+ pSuiv = s.Points[i + 1];
+ g.DrawLine(drawLinesPen, (float)PanAndZoomX(pCurr.X / Ratio), (float)PanAndZoomY(pCurr.Y / Ratio), (float)PanAndZoomX(pSuiv.X / Ratio), (float)PanAndZoomY(pSuiv.Y / Ratio));
+ pTransf = new PointF((float)PanAndZoomX(pCurr.X / Ratio), (float)PanAndZoomY(pCurr.Y / Ratio));
+ tabPoints[i] = pTransf;
+ }
+ //pSuiv = s.Points[0];
+ //g.DrawLine(drawLinesPen, (float)PanAndZoomX(pCurr.X / Ratio), (float)PanAndZoomY(pCurr.Y / Ratio), (float)PanAndZoomX(pSuiv.X / Ratio), (float)PanAndZoomY(pSuiv.Y / Ratio));
+
+ g.FillPolygon(fillPolygonBrush, tabPoints, System.Drawing.Drawing2D.FillMode.Alternate);
+ }
+ }
+ }
+
+ #endregion
+
+ #region Getters and Setters
+
+ public bool isSectorSelected
+ {
+ get { return _isSelected; }
+ set { _isSelected = value; }
+ }
+
+ public string Name
+ {
+ get { return _Name; }
+ set { _Name = value; }
+ }
+
+ #endregion
+
+ #region Delegate Pan And Zoom
+
+ public delegate double PanAndZoom(double input);
+
+ [NonSerialized]
+ static public PanAndZoom PanAndZoomX;
+ [NonSerialized]
+ static public PanAndZoom PanAndZoomY;
+
+ #endregion
+
+ #region createList
+ public static Sector[] LoadSectorsFile(string fileName)
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(sectors));
+ TextReader reader = new StreamReader(fileName);
+
+ Sector[] Sectors = null;
+ if (reader != null)
+ {
+ sectors sectorsXml = (sectors)serializer.Deserialize(reader);
+ reader.Close();
+
+ //Sectors = sectorsXml.GetPointList();
+ Sectors = new Sector[sectorsXml.Items.Length];
+ int indexSec = 0;
+ foreach (sectorsSector s in sectorsXml.Items)
+ {
+ Sectors[indexSec++] = new Sector(s);
+ }
+ }
+ return Sectors;
+ }
+ #endregion
+ }
+}
diff --git a/Data/SectorsXML.cs b/Data/SectorsXML.cs
new file mode 100644
index 0000000..e32e95c
--- /dev/null
+++ b/Data/SectorsXML.cs
@@ -0,0 +1,294 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Serialization;
+
+namespace Data
+{
+ //------------------------------------------------------------------------------
+ //
+ // Ce code a été généré par un outil.
+ // Version du runtime :2.0.50727.312
+ //
+ // Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
+ // le code est régénéré.
+ //
+ //------------------------------------------------------------------------------
+ //
+ // This source code was auto-generated by xsd, Version=2.0.50727.42.
+ //
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
+ public partial class sectors
+ {
+ private sectorsSector[] itemsField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute("sector", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public sectorsSector[] Items
+ {
+ get
+ {
+ return this.itemsField;
+ }
+ set
+ {
+ this.itemsField = value;
+ }
+ }
+ }
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ public partial class sectorsSector
+ {
+
+ private sectorsSectorSlice[] sliceField;
+
+ private string nameField;
+
+ private string accField;
+
+ private int floorField;
+
+ private int ceilingField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute("slice", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public sectorsSectorSlice[] slice
+ {
+ get
+ {
+ return this.sliceField;
+ }
+ set
+ {
+ this.sliceField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public string name
+ {
+ get
+ {
+ return this.nameField;
+ }
+ set
+ {
+ this.nameField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public string acc
+ {
+ get
+ {
+ return this.accField;
+ }
+ set
+ {
+ this.accField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public int floor
+ {
+ get
+ {
+ return this.floorField;
+ }
+ set
+ {
+ this.floorField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public int ceiling
+ {
+ get
+ {
+ return this.ceilingField;
+ }
+ set
+ {
+ this.ceilingField = value;
+ }
+ }
+ }
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ public partial class sectorsSectorSlice
+ {
+
+ private sectorsSectorSliceCentre[] centreField;
+
+ private sectorsSectorSliceVertex[] vertexField;
+
+ private int floorField;
+
+ private int ceilingField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute("centre", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public sectorsSectorSliceCentre[] centre
+ {
+ get
+ {
+ return this.centreField;
+ }
+ set
+ {
+ this.centreField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute("vertex", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public sectorsSectorSliceVertex[] vertex
+ {
+ get
+ {
+ return this.vertexField;
+ }
+ set
+ {
+ this.vertexField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public int floor
+ {
+ get
+ {
+ return this.floorField;
+ }
+ set
+ {
+ this.floorField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public int ceiling
+ {
+ get
+ {
+ return this.ceilingField;
+ }
+ set
+ {
+ this.ceilingField = value;
+ }
+ }
+ }
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ public partial class sectorsSectorSliceCentre
+ {
+
+ private double latField;
+
+ private double lonField;
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public double lat
+ {
+ get
+ {
+ return this.latField;
+ }
+ set
+ {
+ this.latField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public double lon
+ {
+ get
+ {
+ return this.lonField;
+ }
+ set
+ {
+ this.lonField = value;
+ }
+ }
+ }
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
+ [System.SerializableAttribute()]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+ public partial class sectorsSectorSliceVertex
+ {
+
+ private double latField;
+
+ private double lonField;
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public double lat
+ {
+ get
+ {
+ return this.latField;
+ }
+ set
+ {
+ this.latField = value;
+ }
+ }
+
+ ///
+ [System.Xml.Serialization.XmlAttributeAttribute()]
+ public double lon
+ {
+ get
+ {
+ return this.lonField;
+ }
+ set
+ {
+ this.lonField = value;
+ }
+ }
+ }
+}
diff --git a/Data/app.config b/Data/app.config
new file mode 100644
index 0000000..cb2586b
--- /dev/null
+++ b/Data/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Data/balises.xml b/Data/balises.xml
new file mode 100644
index 0000000..daf6324
--- /dev/null
+++ b/Data/balises.xml
@@ -0,0 +1,1949 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Data/bin/Debug/Data.exe b/Data/bin/Debug/Data.exe
new file mode 100644
index 0000000..9f0369d
Binary files /dev/null and b/Data/bin/Debug/Data.exe differ
diff --git a/Data/bin/Debug/Data.exe.config b/Data/bin/Debug/Data.exe.config
new file mode 100644
index 0000000..cb2586b
--- /dev/null
+++ b/Data/bin/Debug/Data.exe.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Data/bin/Debug/Data.pdb b/Data/bin/Debug/Data.pdb
new file mode 100644
index 0000000..baa3186
Binary files /dev/null and b/Data/bin/Debug/Data.pdb differ
diff --git a/Data/bin/Debug/Data.vshost.exe b/Data/bin/Debug/Data.vshost.exe
new file mode 100644
index 0000000..bb84a51
Binary files /dev/null and b/Data/bin/Debug/Data.vshost.exe differ
diff --git a/Data/bin/Debug/Data.vshost.exe.manifest b/Data/bin/Debug/Data.vshost.exe.manifest
new file mode 100644
index 0000000..f96b1d6
--- /dev/null
+++ b/Data/bin/Debug/Data.vshost.exe.manifest
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/bin/Debug/Ivy.dll b/Data/bin/Debug/Ivy.dll
new file mode 100644
index 0000000..e98260d
Binary files /dev/null and b/Data/bin/Debug/Ivy.dll differ
diff --git a/Data/bin/Debug/IvyBus.IvyControl.dll b/Data/bin/Debug/IvyBus.IvyControl.dll
new file mode 100644
index 0000000..1cb27aa
Binary files /dev/null and b/Data/bin/Debug/IvyBus.IvyControl.dll differ
diff --git a/Data/bin/Debug/balises.xml b/Data/bin/Debug/balises.xml
new file mode 100644
index 0000000..daf6324
--- /dev/null
+++ b/Data/bin/Debug/balises.xml
@@ -0,0 +1,1949 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Data/bin/Debug/routes.xml b/Data/bin/Debug/routes.xml
new file mode 100644
index 0000000..43c8a5d
--- /dev/null
+++ b/Data/bin/Debug/routes.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/bin/Debug/sectors.xml b/Data/bin/Debug/sectors.xml
new file mode 100644
index 0000000..49ccab9
--- /dev/null
+++ b/Data/bin/Debug/sectors.xml
@@ -0,0 +1,2824 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/obj/x86/Debug/Data.csproj.FileListAbsolute.txt b/Data/obj/x86/Debug/Data.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..52111c9
--- /dev/null
+++ b/Data/obj/x86/Debug/Data.csproj.FileListAbsolute.txt
@@ -0,0 +1,34 @@
+C:\Users\Utilisateur\Desktop\Programmation projet\ProtoFinal\ProtoAnotoFinal\Data\bin\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\Programmation projet\ProtoFinal\ProtoAnotoFinal\Data\bin\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\Programmation projet\ProtoFinal\ProtoAnotoFinal\Data\obj\x86\Debug\ResolveAssemblyReference.cache
+C:\Users\Utilisateur\Desktop\Programmation projet\ProtoFinal\ProtoAnotoFinal\Data\obj\x86\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\Programmation projet\ProtoFinal\ProtoAnotoFinal\Data\obj\x86\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\ProtoAnotoFinal\Data\bin\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\ProtoAnotoFinal\Data\bin\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\ProtoAnotoFinal\Data\obj\x86\Debug\ResolveAssemblyReference.cache
+C:\Users\Utilisateur\Desktop\ProtoAnotoFinal\Data\obj\x86\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\ProtoAnotoFinal\Data\obj\x86\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\V1.3\ProtoAnotoFinal\Data\bin\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\V1.3\ProtoAnotoFinal\Data\bin\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\V1.3\ProtoAnotoFinal\Data\obj\x86\Debug\ResolveAssemblyReference.cache
+C:\Users\Utilisateur\Desktop\V1.3\ProtoAnotoFinal\Data\obj\x86\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\V1.3\ProtoAnotoFinal\Data\obj\x86\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\obj\x86\Debug\ResolveAssemblyReference.cache
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\obj\x86\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\obj\x86\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\bin\Debug\Data.exe
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\bin\Debug\Data.pdb
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\bin\Debug\Ivy.dll
+C:\Users\Utilisateur\Desktop\V1.5\ProtoAnotoFinal\Data\bin\Debug\IvyBus.IvyControl.dll
+E:\SaveData\Projects\Anoto\Data\bin\Debug\Data.exe
+E:\SaveData\Projects\Anoto\Data\bin\Debug\Data.pdb
+E:\SaveData\Projects\Anoto\Data\obj\x86\Debug\ResolveAssemblyReference.cache
+E:\SaveData\Projects\Anoto\Data\obj\x86\Debug\Data.exe
+E:\SaveData\Projects\Anoto\Data\obj\x86\Debug\Data.pdb
+C:\Anoto\Anoto\Data\bin\Debug\Data.exe
+C:\Anoto\Anoto\Data\bin\Debug\Data.pdb
+C:\Anoto\Anoto\Data\obj\x86\Debug\ResolveAssemblyReference.cache
+C:\Anoto\Anoto\Data\obj\x86\Debug\Data.exe
+C:\Anoto\Anoto\Data\obj\x86\Debug\Data.pdb
+E:\SaveData\Projects\Anoto\Data\bin\Debug\Data.exe.config
+C:\Anoto\Anoto\Data\bin\Debug\Data.exe.config
diff --git a/Data/obj/x86/Debug/Data.exe b/Data/obj/x86/Debug/Data.exe
new file mode 100644
index 0000000..9f0369d
Binary files /dev/null and b/Data/obj/x86/Debug/Data.exe differ
diff --git a/Data/obj/x86/Debug/Data.pdb b/Data/obj/x86/Debug/Data.pdb
new file mode 100644
index 0000000..baa3186
Binary files /dev/null and b/Data/obj/x86/Debug/Data.pdb differ
diff --git a/Data/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/Data/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..967145b
Binary files /dev/null and b/Data/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/Data/obj/x86/Debug/ResolveAssemblyReference.cache b/Data/obj/x86/Debug/ResolveAssemblyReference.cache
new file mode 100644
index 0000000..e6d5afa
Binary files /dev/null and b/Data/obj/x86/Debug/ResolveAssemblyReference.cache differ
diff --git a/Data/obj/x86/Release/Data.csproj.FileListAbsolute.txt b/Data/obj/x86/Release/Data.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..ec0a76c
--- /dev/null
+++ b/Data/obj/x86/Release/Data.csproj.FileListAbsolute.txt
@@ -0,0 +1 @@
+C:\Anoto\Anoto\Data\obj\x86\Release\ResolveAssemblyReference.cache
diff --git a/Data/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache b/Data/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..5f972b8
Binary files /dev/null and b/Data/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/Data/obj/x86/Release/build.force b/Data/obj/x86/Release/build.force
new file mode 100644
index 0000000..e69de29
diff --git a/Data/routes.xml b/Data/routes.xml
new file mode 100644
index 0000000..43c8a5d
--- /dev/null
+++ b/Data/routes.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/sectors.xml b/Data/sectors.xml
new file mode 100644
index 0000000..49ccab9
--- /dev/null
+++ b/Data/sectors.xml
@@ -0,0 +1,2824 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.1