SynchronizationContext & New pokestop/trainer icon

Brian [2016-08-16 15:20:31]
SynchronizationContext & New pokestop/trainer icon
Filename
PokemonGo.RocketBot.Window/App.config
PokemonGo.RocketBot.Window/Forms/MainForm.cs
PokemonGo.RocketBot.Window/Images/Pokestop_Inrange.png
PokemonGo.RocketBot.Window/Images/Trainer.png
PokemonGo.RocketBot.Window/Models/GMapMarkerPokestops.cs
PokemonGo.RocketBot.Window/Models/GMapMarkerTrainer.cs
PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
PokemonGo.RocketBot.Window/Properties/Resources.Designer.cs
PokemonGo.RocketBot.Window/Properties/Resources.resx
PokemonGo.RocketBot.Window/packages.config
RocketBot.sln
diff --git a/PokemonGo.RocketBot.Window/App.config b/PokemonGo.RocketBot.Window/App.config
index d1e0a4c..7dc6eeb 100644
--- a/PokemonGo.RocketBot.Window/App.config
+++ b/PokemonGo.RocketBot.Window/App.config
@@ -2,14 +2,9 @@

 <configuration>
   <configSections>
-    <sectionGroup name="userSettings"
-                  type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-      <section name="PokemonGo.RocketBot.Window.UserSettings"
-               type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
-               allowExeDefinition="MachineToLocalUser" requirePermission="false" />
-      <section name="PokemonGo.RocketBot.Window.Settings"
-               type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
-               allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+      <section name="PokemonGo.RocketBot.Window.UserSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+      <section name="PokemonGo.RocketBot.Window.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
     </sectionGroup>
   </configSections>
   <startup>
@@ -32,7 +27,6 @@
     </assemblyBinding>
   </runtime>
   <connectionStrings>
-    <add name="Pogo"
-         connectionString="DatasetId = YOUR_DATASET_ID; CertificateFilePath = C:\Path\To\Your\Certificate\File-privatekey.p12; ServiceAccountId = your-service-account-email@developer.gserviceaccount.com; CertificatePassword = notasecret" />
+    <add name="Pogo" connectionString="DatasetId = YOUR_DATASET_ID; CertificateFilePath = C:\Path\To\Your\Certificate\File-privatekey.p12; ServiceAccountId = your-service-account-email@developer.gserviceaccount.com; CertificatePassword = notasecret" />
   </connectionStrings>
 </configuration>
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/Forms/MainForm.cs b/PokemonGo.RocketBot.Window/Forms/MainForm.cs
index 7aa3ea0..842a373 100644
--- a/PokemonGo.RocketBot.Window/Forms/MainForm.cs
+++ b/PokemonGo.RocketBot.Window/Forms/MainForm.cs
@@ -34,17 +34,21 @@ using POGOProtos.Inventory;
 using POGOProtos.Inventory.Item;
 using POGOProtos.Map.Fort;
 using POGOProtos.Networking.Responses;
+using PokemonGo.RocketAPI.Extensions;
+using PokemonGo.RocketBot.Window.Models;

 namespace PokemonGo.RocketBot.Window.Forms
 {
     public partial class MainForm : Form
     {
         public static MainForm Instance;
+        public static SynchronizationContext SynchronizationContext;
+
         private static readonly ManualResetEvent QuitEvent = new ManualResetEvent(false);
         private static readonly string subPath = "";
         private static Session _session;
         public static bool BoolNeedsSetup;
-        private static GMarkerGoogle _playerMarker;
+        private static GMapMarker _playerMarker;
         private readonly List<PointLatLng> _playerLocations = new List<PointLatLng>();

         private readonly GMapOverlay _playerOverlay = new GMapOverlay("players");
@@ -59,6 +63,7 @@ namespace PokemonGo.RocketBot.Window.Forms
         public MainForm()
         {
             InitializeComponent();
+            SynchronizationContext = SynchronizationContext.Current;
             Instance = this;
         }

@@ -94,9 +99,7 @@ namespace PokemonGo.RocketBot.Window.Forms
             gMapControl1.Overlays.Add(_pokemonsOverlay);
             gMapControl1.Overlays.Add(_playerOverlay);

-            _playerMarker =
-                new GMarkerGoogle(new PointLatLng(lat, lng),
-                    GMarkerGoogleType.orange_small);
+            _playerMarker = new GMapMarkerTrainer(new PointLatLng(lat, lng), (Image)Properties.Resources.ResourceManager.GetObject("Trainer"));
             _playerOverlay.Markers.Add(_playerMarker);
             _playerMarker.Position = new PointLatLng(lat, lng);
             _searchAreaOverlay.Polygons.Clear();
@@ -207,12 +210,12 @@ namespace PokemonGo.RocketBot.Window.Forms
             Logger.SetLoggerContext(_session);

             _session.Navigation.UpdatePositionEvent +=
-                (lat, lng) => _session.EventDispatcher.Send(new UpdatePositionEvent {Latitude = lat, Longitude = lng});
+                (lat, lng) => _session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = lat, Longitude = lng });
             _session.Navigation.UpdatePositionEvent += Navigation_UpdatePositionEvent;

             RouteOptimizeUtil.RouteOptimizeEvent +=
                 optimizedroute =>
-                    _session.EventDispatcher.Send(new OptimizeRouteEvent {OptimizedRoute = optimizedroute});
+                    _session.EventDispatcher.Send(new OptimizeRouteEvent { OptimizedRoute = optimizedroute });
             RouteOptimizeUtil.RouteOptimizeEvent += Visualize;
         }

@@ -232,46 +235,46 @@ namespace PokemonGo.RocketBot.Window.Forms

         private async void Visualize(List<FortData> pokeStops)
         {
+            Logger.Write("Visualize call");
+
             lock (_pokestopsOverlay)
             {
                 _pokeStops = pokeStops;
                 _pokestopsOverlay.Markers.Clear();
                 var routePoint =
                     (from pokeStop in pokeStops
-                        where pokeStop != null
-                        select new PointLatLng(pokeStop.Latitude, pokeStop.Longitude)).ToList();
+                     where pokeStop != null
+                     select new PointLatLng(pokeStop.Latitude, pokeStop.Longitude)).ToList();
                 _pokestopsOverlay.Routes.Clear();
-                var r = new GMapRoute(routePoint, "Walking Path");
-                _pokestopsOverlay.Routes.Add(r);
+                var route = new GMapRoute(routePoint, "Walking Path");
+                route.Stroke = new Pen(Color.FromArgb(128, 0, 179, 253), 4);
+                _pokestopsOverlay.Routes.Add(route);
             }
-            await Update();
+            Update();
         }

-        private new async Task Update()
+        private new void Update()
         {
-            lock (_pokestopsOverlay)
+            SynchronizationContext.Post(o =>
             {
                 _pokestopsOverlay.Markers.Clear();
                 foreach (var pokeStop in _pokeStops)
                 {
-                    var type = GMarkerGoogleType.blue_small;
                     var pokeStopLoc = new PointLatLng(pokeStop.Latitude, pokeStop.Longitude);
-                    var pokestopMarker = new GMarkerGoogle(pokeStopLoc, type);
+                    var pokestopMarker = new GMapMarkerPokestops(pokeStopLoc, (Image)Properties.Resources.ResourceManager.GetObject("Pokestop_Inrange"));
                     //pokestopMarker.ToolTipMode = MarkerTooltipMode.OnMouseOver;
                     //pokestopMarker.ToolTip = new GMapBaloonToolTip(pokestopMarker);
                     _pokestopsOverlay.Markers.Add(pokestopMarker);
                 }
-            }

-            lock (_playerOverlay)
-            {
                 var route = new GMapRoute(_playerLocations, "step");
-                route.Stroke = new Pen(Color.Blue, 1);
+                route.Stroke = new Pen(Color.FromArgb(175, 175, 175), 2);
                 route.Stroke.DashStyle = DashStyle.Dot;
                 _playerOverlay.Routes.Add(route);
                 _playerOverlay.Routes.Clear();
                 _playerOverlay.Routes.Add(route);
-            }
+            }, null);
+
         }

         private async void Navigation_UpdatePositionEvent(double lat, double lng)
@@ -279,7 +282,7 @@ namespace PokemonGo.RocketBot.Window.Forms
             var latlng = new PointLatLng(lat, lng);
             _playerLocations.Add(latlng);
             _playerMarker.Position = latlng;
-            await Update();
+            await Task.Run(() => Update());
             SaveLocationToDisk(lat, lng);
         }

@@ -390,20 +393,20 @@ namespace PokemonGo.RocketBot.Window.Forms
         {
             //olvPokemonList.ButtonClick += PokemonListButton_Click;

-            pkmnName.ImageGetter = delegate(object rowObject)
+            pkmnName.ImageGetter = delegate (object rowObject)
             {
                 var pokemon = rowObject as PokemonObject;

                 var key = pokemon.PokemonId.ToString();
                 if (!olvPokemonList.SmallImageList.Images.ContainsKey(key))
                 {
-                    var img = GetPokemonImage((int) pokemon.PokemonId);
+                    var img = GetPokemonImage((int)pokemon.PokemonId);
                     olvPokemonList.SmallImageList.Images.Add(key, img);
                 }
                 return key;
             };

-            olvPokemonList.FormatRow += delegate(object sender, FormatRowEventArgs e)
+            olvPokemonList.FormatRow += delegate (object sender, FormatRowEventArgs e)
             {
                 var pok = e.Model as PokemonObject;
                 if (olvPokemonList.Objects.Cast<PokemonObject>()
@@ -421,7 +424,7 @@ namespace PokemonGo.RocketBot.Window.Forms
                 }
             };

-            cmsPokemonList.Opening += delegate(object sender, CancelEventArgs e)
+            cmsPokemonList.Opening += delegate (object sender, CancelEventArgs e)
             {
                 e.Cancel = false;
                 cmsPokemonList.Items.Clear();
@@ -677,7 +680,7 @@ namespace PokemonGo.RocketBot.Window.Forms

         private Image GetPokemonImage(int pokemonId)
         {
-            return (Image) Properties.Resources.ResourceManager.GetObject("Pokemon_" + pokemonId);
+            return (Image)Properties.Resources.ResourceManager.GetObject("Pokemon_" + pokemonId);
         }

         private async Task ReloadPokemonList()
@@ -722,7 +725,7 @@ namespace PokemonGo.RocketBot.Window.Forms
                 {
                     var pokemonObject = new PokemonObject(pokemon);
                     var family =
-                        _families.Where(i => (int) i.FamilyId <= (int) pokemon.PokemonId)
+                        _families.Where(i => (int)i.FamilyId <= (int)pokemon.PokemonId)
                             .First();
                     pokemonObject.Candy = family.Candy_;
                     pokemonObjects.Add(pokemonObject);
@@ -776,7 +779,7 @@ namespace PokemonGo.RocketBot.Window.Forms

         private async void ItemBox_ItemClick(object sender, EventArgs e)
         {
-            var item = (ItemData) sender;
+            var item = (ItemData)sender;

             using (var form = new ItemForm(item))
             {
diff --git a/PokemonGo.RocketBot.Window/Images/Pokestop_Inrange.png b/PokemonGo.RocketBot.Window/Images/Pokestop_Inrange.png
new file mode 100644
index 0000000..f537b5d
Binary files /dev/null and b/PokemonGo.RocketBot.Window/Images/Pokestop_Inrange.png differ
diff --git a/PokemonGo.RocketBot.Window/Images/Trainer.png b/PokemonGo.RocketBot.Window/Images/Trainer.png
new file mode 100644
index 0000000..f081aa0
Binary files /dev/null and b/PokemonGo.RocketBot.Window/Images/Trainer.png differ
diff --git a/PokemonGo.RocketBot.Window/Models/GMapMarkerPokestops.cs b/PokemonGo.RocketBot.Window/Models/GMapMarkerPokestops.cs
new file mode 100644
index 0000000..e6c1364
--- /dev/null
+++ b/PokemonGo.RocketBot.Window/Models/GMapMarkerPokestops.cs
@@ -0,0 +1,42 @@
+using System.Drawing;
+using GMap.NET;
+
+namespace PokemonGo.RocketBot.Window.Models
+{
+    public class GMapMarkerPokestops : GMap.NET.WindowsForms.GMapMarker
+    {
+        private Image img;
+
+        /// <summary>
+        /// The image to display as a marker.
+        /// </summary>
+        public Image MarkerImage
+        {
+            get
+            {
+                return img;
+            }
+            set
+            {
+                img = value;
+            }
+        }
+
+        /// <summary>
+        /// Constructor
+        /// </summary>
+        /// <param name="p">The position of the marker</param>
+        public GMapMarkerPokestops(PointLatLng p, Image image)
+            : base(p)
+        {
+            img = image;
+            Size = img.Size;
+            Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height);
+        }
+
+        public override void OnRender(Graphics g)
+        {
+            g.DrawImage(img, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/Models/GMapMarkerTrainer.cs b/PokemonGo.RocketBot.Window/Models/GMapMarkerTrainer.cs
new file mode 100644
index 0000000..f16e9d6
--- /dev/null
+++ b/PokemonGo.RocketBot.Window/Models/GMapMarkerTrainer.cs
@@ -0,0 +1,42 @@
+using System.Drawing;
+using GMap.NET;
+
+namespace PokemonGo.RocketBot.Window.Models
+{
+    public class GMapMarkerTrainer : GMap.NET.WindowsForms.GMapMarker
+    {
+        private Image img;
+
+        /// <summary>
+        /// The image to display as a marker.
+        /// </summary>
+        public Image MarkerImage
+        {
+            get
+            {
+                return img;
+            }
+            set
+            {
+                img = value;
+            }
+        }
+
+        /// <summary>
+        /// Constructor
+        /// </summary>
+        /// <param name="p">The position of the marker</param>
+        public GMapMarkerTrainer(PointLatLng p, Image image)
+            : base(p)
+        {
+            img = image;
+            Size = img.Size;
+            Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2);
+        }
+
+        public override void OnRender(Graphics g)
+        {
+            g.DrawImage(img, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj b/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
index 51c16d6..a5f7fe9 100644
--- a/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
+++ b/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
@@ -150,6 +150,8 @@
       <DependentUpon>MainForm.cs</DependentUpon>
     </Compile>
     <Compile Include="Helpers\S2GMapDrawer.cs" />
+    <Compile Include="Models\GMapMarkerPokestops.cs" />
+    <Compile Include="Models\GMapMarkerTrainer.cs" />
     <Compile Include="Models\LoggingStrings.cs" />
     <Compile Include="Forms\NicknamePokemonForm.cs">
       <SubType>Form</SubType>
@@ -474,6 +476,8 @@
     <Content Include="Images\Pokemon\Pokemon_97.png" />
     <Content Include="Images\Pokemon\Pokemon_98.png" />
     <Content Include="Images\Pokemon\Pokemon_99.png" />
+    <None Include="Images\Pokestop_Inrange.png" />
+    <None Include="Images\Trainer.png" />
     <Content Include="Resources\encrypt.dll">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
diff --git a/PokemonGo.RocketBot.Window/Properties/Resources.Designer.cs b/PokemonGo.RocketBot.Window/Properties/Resources.Designer.cs
index 4cb8acc..8d068ee 100644
--- a/PokemonGo.RocketBot.Window/Properties/Resources.Designer.cs
+++ b/PokemonGo.RocketBot.Window/Properties/Resources.Designer.cs
@@ -1809,5 +1809,25 @@ namespace PokemonGo.RocketBot.Window.Properties {
                 return ((System.Drawing.Bitmap)(obj));
             }
         }
+
+        /// <summary>
+        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        /// </summary>
+        internal static System.Drawing.Bitmap Pokestop_Inrange {
+            get {
+                object obj = ResourceManager.GetObject("Pokestop_Inrange", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+
+        /// <summary>
+        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        /// </summary>
+        internal static System.Drawing.Bitmap Trainer {
+            get {
+                object obj = ResourceManager.GetObject("Trainer", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
     }
 }
diff --git a/PokemonGo.RocketBot.Window/Properties/Resources.resx b/PokemonGo.RocketBot.Window/Properties/Resources.resx
index 2f4cc9f..84b84bc 100644
--- a/PokemonGo.RocketBot.Window/Properties/Resources.resx
+++ b/PokemonGo.RocketBot.Window/Properties/Resources.resx
@@ -1984,4 +1984,10 @@
   <data name="Pokemon_99" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Images\Pokemon\Pokemon_99.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="Pokestop_Inrange" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Images\Pokestop_Inrange.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Trainer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Images\Trainer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/packages.config b/PokemonGo.RocketBot.Window/packages.config
index 7fd6988..51bda38 100644
--- a/PokemonGo.RocketBot.Window/packages.config
+++ b/PokemonGo.RocketBot.Window/packages.config
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <packages>
   <package id="C5" version="2.4.5947.17249" targetFramework="net452" />
   <package id="Costura.Fody" version="1.3.3.0" targetFramework="net45" developmentDependency="true" />
diff --git a/RocketBot.sln b/RocketBot.sln
index c3c9b91..16e958f 100644
--- a/RocketBot.sln
+++ b/RocketBot.sln
@@ -28,6 +28,10 @@ Global
 		Debug|x86 = Debug|x86
 		Release|Any CPU = Release|Any CPU
 		Release|x86 = Release|x86
+		v4.0-Debug|Any CPU = v4.0-Debug|Any CPU
+		v4.0-Debug|x86 = v4.0-Debug|x86
+		v4.0-Release|Any CPU = v4.0-Release|Any CPU
+		v4.0-Release|x86 = v4.0-Release|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -38,6 +42,14 @@ Global
 		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.Release|Any CPU.Build.0 = Release|Any CPU
 		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.Release|x86.ActiveCfg = Release|x86
 		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.Release|x86.Build.0 = Release|x86
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Debug|x86.ActiveCfg = Debug|x86
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Debug|x86.Build.0 = Debug|x86
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Release|Any CPU.Build.0 = Release|Any CPU
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Release|x86.ActiveCfg = Release|x86
+		{0739E40D-C589-4AEB-93E5-EE8CD6773C60}.v4.0-Release|x86.Build.0 = Release|x86
 		{1FEA147E-F704-497B-A538-00B053B5F672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{1FEA147E-F704-497B-A538-00B053B5F672}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{1FEA147E-F704-497B-A538-00B053B5F672}.Debug|x86.ActiveCfg = Debug|x86
@@ -46,6 +58,14 @@ Global
 		{1FEA147E-F704-497B-A538-00B053B5F672}.Release|Any CPU.Build.0 = Release|Any CPU
 		{1FEA147E-F704-497B-A538-00B053B5F672}.Release|x86.ActiveCfg = Release|x86
 		{1FEA147E-F704-497B-A538-00B053B5F672}.Release|x86.Build.0 = Release|x86
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Debug|x86.ActiveCfg = Debug|x86
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Debug|x86.Build.0 = Debug|x86
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Release|Any CPU.Build.0 = Release|Any CPU
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Release|x86.ActiveCfg = Release|x86
+		{1FEA147E-F704-497B-A538-00B053B5F672}.v4.0-Release|x86.Build.0 = Release|x86
 		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|x86.ActiveCfg = Debug|x86
@@ -54,6 +74,14 @@ Global
 		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|Any CPU.Build.0 = Release|Any CPU
 		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|x86.ActiveCfg = Release|x86
 		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|x86.Build.0 = Release|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Debug|Any CPU.Build.0 = Debug|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Debug|x86.ActiveCfg = Debug|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Debug|x86.Build.0 = Debug|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Release|Any CPU.ActiveCfg = Release|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Release|Any CPU.Build.0 = Release|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Release|x86.ActiveCfg = Release|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.v4.0-Release|x86.Build.0 = Release|x86
 		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|x86.ActiveCfg = Debug|x86
@@ -62,6 +90,14 @@ Global
 		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|Any CPU.Build.0 = Release|Any CPU
 		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|x86.ActiveCfg = Release|x86
 		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|x86.Build.0 = Release|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Debug|x86.ActiveCfg = Debug|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Debug|x86.Build.0 = Debug|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Release|Any CPU.Build.0 = Release|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Release|x86.ActiveCfg = Release|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.v4.0-Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
You may download the files in Public Git.