From ae4ffa75be378497d8db210c6864cde40f7c75f9 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Thu, 21 Feb 2013 01:02:10 -0500 Subject: [PATCH] isolated weather and moved drawing classes up to the controller project --- MediaBrowser.Api/MediaBrowser.Api.csproj | 4 - MediaBrowser.Api/packages.config | 1 - MediaBrowser.Common/Kernel/BaseKernel.cs | 3 +- .../MediaBrowser.Common.csproj | 4 - .../Drawing/ImageExtensions.cs | 2 +- .../Drawing/ImageHeader.cs | 2 +- .../Drawing/ImageManager.cs | 4 +- MediaBrowser.Controller/Kernel.cs | 4 +- .../MediaBrowser.Controller.csproj | 5 +- .../Plugins/PluginSecurityManager.cs | 39 +++++++++- .../Weather/BaseWeatherProvider.cs | 37 ---------- .../Weather/IWeatherProvider.cs | 20 +++++ MediaBrowser.IsoMounter/PismoIsoManager.cs | 16 ++-- MediaBrowser.IsoMounter/PismoMount.cs | 16 ++-- ...iaBrowser.Server.WorldWeatherOnline.csproj | 74 +++++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 +++++++++ .../WeatherProvider.cs | 42 ++++++++--- MediaBrowser.ServerApplication/App.xaml.cs | 3 +- .../MediaBrowser.ServerApplication.csproj | 3 + MediaBrowser.UI/App.xaml.cs | 2 +- MediaBrowser.sln | 16 ++++ 21 files changed, 252 insertions(+), 81 deletions(-) rename {MediaBrowser.Common => MediaBrowser.Controller}/Drawing/ImageExtensions.cs (99%) rename {MediaBrowser.Common => MediaBrowser.Controller}/Drawing/ImageHeader.cs (99%) delete mode 100644 MediaBrowser.Controller/Weather/BaseWeatherProvider.cs create mode 100644 MediaBrowser.Controller/Weather/IWeatherProvider.cs create mode 100644 MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj create mode 100644 MediaBrowser.Server.WorldWeatherOnline/Properties/AssemblyInfo.cs rename {MediaBrowser.Controller/Weather => MediaBrowser.Server.WorldWeatherOnline}/WeatherProvider.cs (89%) diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 5fbd751cd3..546cf44928 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -39,10 +39,6 @@ ..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll - - False - ..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll - ..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.dll diff --git a/MediaBrowser.Api/packages.config b/MediaBrowser.Api/packages.config index c8efad540b..ee47118adc 100644 --- a/MediaBrowser.Api/packages.config +++ b/MediaBrowser.Api/packages.config @@ -1,7 +1,6 @@  - diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 95e6d05d6b..088acbedda 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -441,7 +441,7 @@ namespace MediaBrowser.Common.Kernel AddLogTarget(logFile, "ApplicationLogFile"); - Logging.Logger.LoggerInstance = Logging.LogManager.GetLogger("Global"); + Logging.Logger.LoggerInstance = Logging.LogManager.GetLogger("App"); OnLoggerLoaded(); } @@ -484,6 +484,7 @@ namespace MediaBrowser.Common.Kernel CompositionContainer = MefUtils.GetSafeCompositionContainer(Assemblies.Select(i => new AssemblyCatalog(i))); CompositionContainer.ComposeExportedValue("kernel", this); + CompositionContainer.ComposeExportedValue("logger", Logging.LogManager.GetLogger("App")); CompositionContainer.ComposeParts(this); diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 21502f5c5b..8929f4bd5a 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -95,7 +95,6 @@ - @@ -118,7 +117,6 @@ - @@ -129,8 +127,6 @@ - - diff --git a/MediaBrowser.Common/Drawing/ImageExtensions.cs b/MediaBrowser.Controller/Drawing/ImageExtensions.cs similarity index 99% rename from MediaBrowser.Common/Drawing/ImageExtensions.cs rename to MediaBrowser.Controller/Drawing/ImageExtensions.cs index 02c0f93dd6..cecbfe74aa 100644 --- a/MediaBrowser.Common/Drawing/ImageExtensions.cs +++ b/MediaBrowser.Controller/Drawing/ImageExtensions.cs @@ -5,7 +5,7 @@ using System.Drawing.Imaging; using System.IO; using System.Linq; -namespace MediaBrowser.Common.Drawing +namespace MediaBrowser.Controller.Drawing { /// /// Class ImageExtensions diff --git a/MediaBrowser.Common/Drawing/ImageHeader.cs b/MediaBrowser.Controller/Drawing/ImageHeader.cs similarity index 99% rename from MediaBrowser.Common/Drawing/ImageHeader.cs rename to MediaBrowser.Controller/Drawing/ImageHeader.cs index 97121cbc8c..7cc63eee9f 100644 --- a/MediaBrowser.Common/Drawing/ImageHeader.cs +++ b/MediaBrowser.Controller/Drawing/ImageHeader.cs @@ -5,7 +5,7 @@ using System.Drawing; using System.IO; using System.Linq; -namespace MediaBrowser.Common.Drawing +namespace MediaBrowser.Controller.Drawing { /// /// Taken from http://stackoverflow.com/questions/111345/getting-image-dimensions-without-reading-the-entire-file/111349 diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs index b493a97afe..6dd641cba6 100644 --- a/MediaBrowser.Controller/Drawing/ImageManager.cs +++ b/MediaBrowser.Controller/Drawing/ImageManager.cs @@ -1,10 +1,8 @@ -using MediaBrowser.Common.Drawing; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Kernel; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 22c241fd4f..f8f48d8de9 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -192,8 +192,8 @@ namespace MediaBrowser.Controller /// Gets the list of currently registered weather prvoiders /// /// The weather providers. - [ImportMany(typeof(BaseWeatherProvider))] - public IEnumerable WeatherProviders { get; private set; } + [ImportMany(typeof(IWeatherProvider))] + public IEnumerable WeatherProviders { get; private set; } /// /// Gets the list of currently registered metadata prvoiders diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index f911f190df..da2bc23e81 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -76,6 +76,8 @@ + + @@ -197,8 +199,7 @@ - - + diff --git a/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs b/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs index 341e3582bb..5dbd6cbc62 100644 --- a/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs +++ b/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs @@ -6,12 +6,28 @@ using System.Threading.Tasks; namespace MediaBrowser.Controller.Plugins { + /// + /// Class PluginSecurityManager + /// public class PluginSecurityManager : BaseManager { + /// + /// The _is MB supporter + /// private bool? _isMBSupporter; + /// + /// The _is MB supporter initialized + /// private bool _isMBSupporterInitialized; + /// + /// The _is MB supporter sync lock + /// private object _isMBSupporterSyncLock = new object(); - + + /// + /// Gets a value indicating whether this instance is MB supporter. + /// + /// true if this instance is MB supporter; otherwise, false. public bool IsMBSupporter { get @@ -21,15 +37,29 @@ namespace MediaBrowser.Controller.Plugins } } + /// + /// Initializes a new instance of the class. + /// + /// The kernel. public PluginSecurityManager(Kernel kernel) : base(kernel) { } + /// + /// Gets the registration status. + /// + /// The feature. + /// The MB2 equivalent. + /// Task{MBRegistrationRecord}. public async Task GetRegistrationStatus(string feature, string mb2Equivalent = null) { return await MBRegistration.GetRegistrationStatus(feature, mb2Equivalent).ConfigureAwait(false); } + /// + /// Gets or sets the supporter key. + /// + /// The supporter key. public string SupporterKey { get { return MBRegistration.SupporterKey; } @@ -46,6 +76,10 @@ namespace MediaBrowser.Controller.Plugins } } + /// + /// Gets or sets the legacy key. + /// + /// The legacy key. public string LegacyKey { get { return MBRegistration.LegacyKey; } @@ -56,6 +90,9 @@ namespace MediaBrowser.Controller.Plugins } } + /// + /// Resets the supporter info. + /// private void ResetSupporterInfo() { _isMBSupporter = null; diff --git a/MediaBrowser.Controller/Weather/BaseWeatherProvider.cs b/MediaBrowser.Controller/Weather/BaseWeatherProvider.cs deleted file mode 100644 index 4ae7a3991c..0000000000 --- a/MediaBrowser.Controller/Weather/BaseWeatherProvider.cs +++ /dev/null @@ -1,37 +0,0 @@ -using MediaBrowser.Model.Weather; -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Weather -{ - /// - /// Class BaseWeatherProvider - /// - public abstract class BaseWeatherProvider : IDisposable - { - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool dispose) - { - } - - /// - /// Gets the weather info async. - /// - /// The location. - /// Task{WeatherInfo}. - public abstract Task GetWeatherInfoAsync(string location, CancellationToken cancellationToken); - } -} diff --git a/MediaBrowser.Controller/Weather/IWeatherProvider.cs b/MediaBrowser.Controller/Weather/IWeatherProvider.cs new file mode 100644 index 0000000000..9060e5b9cd --- /dev/null +++ b/MediaBrowser.Controller/Weather/IWeatherProvider.cs @@ -0,0 +1,20 @@ +using MediaBrowser.Model.Weather; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Weather +{ + /// + /// Interface IWeatherProvider + /// + public interface IWeatherProvider + { + /// + /// Gets the weather info async. + /// + /// The location. + /// The cancellation token. + /// Task{WeatherInfo}. + Task GetWeatherInfoAsync(string location, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.IsoMounter/PismoIsoManager.cs b/MediaBrowser.IsoMounter/PismoIsoManager.cs index b3a1889f01..3ad3a413ec 100644 --- a/MediaBrowser.IsoMounter/PismoIsoManager.cs +++ b/MediaBrowser.IsoMounter/PismoIsoManager.cs @@ -1,10 +1,9 @@ using MediaBrowser.Common.IO; +using MediaBrowser.Model.Logging; using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.Logging; -using MediaBrowser.Model.Logging; namespace MediaBrowser.IsoMounter { @@ -13,8 +12,6 @@ namespace MediaBrowser.IsoMounter /// public class PismoIsoManager : IIsoManager { - private ILogger Logger = LogManager.GetLogger("IsoManager"); - /// /// The mount semaphore - limit to four at a time. /// @@ -69,8 +66,15 @@ namespace MediaBrowser.IsoMounter /// private bool _hasInitialized; - public PismoIsoManager() + /// + /// Gets or sets the logger. + /// + /// The logger. + private ILogger Logger { get; set; } + + public PismoIsoManager(ILogger logger) { + Logger = logger; } /// @@ -144,7 +148,7 @@ namespace MediaBrowser.IsoMounter throw new IOException("Unable to start mount for " + isoPath); } - return new PismoMount(mount, isoPath, this); + return new PismoMount(mount, isoPath, this, Logger); } public void Dispose() diff --git a/MediaBrowser.IsoMounter/PismoMount.cs b/MediaBrowser.IsoMounter/PismoMount.cs index 1e3dbb881e..f63db8dcfb 100644 --- a/MediaBrowser.IsoMounter/PismoMount.cs +++ b/MediaBrowser.IsoMounter/PismoMount.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.IO; -using MediaBrowser.Common.Logging; using MediaBrowser.Model.Logging; using System; @@ -10,11 +9,6 @@ namespace MediaBrowser.IsoMounter /// internal class PismoMount : IIsoMount { - /// - /// The logger - /// - private static readonly ILogger Logger = LogManager.GetLogger("IsoMount"); - /// /// Gets or sets the iso path. /// @@ -37,17 +31,25 @@ namespace MediaBrowser.IsoMounter /// private readonly PismoIsoManager _isoManager; + /// + /// Gets or sets the logger. + /// + /// The logger. + private ILogger Logger { get; set; } + /// /// Prevents a default instance of the class from being created. /// /// The mount. /// The iso path. /// The iso manager. - internal PismoMount(PfmFileMount mount, string isoPath, PismoIsoManager isoManager) + /// The logger. + internal PismoMount(PfmFileMount mount, string isoPath, PismoIsoManager isoManager, ILogger logger) { _pfmFileMount = mount; IsoPath = isoPath; _isoManager = isoManager; + Logger = logger; MountedPath = mount.GetMount().GetUncName(); } diff --git a/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj b/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj new file mode 100644 index 0000000000..9416667709 --- /dev/null +++ b/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj @@ -0,0 +1,74 @@ + + + + + Debug + AnyCPU + {973CA45C-8362-490B-8327-C68098FD4891} + Library + Properties + MediaBrowser.Server.WorldWeatherOnline + MediaBrowser.Server.WorldWeatherOnline + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Always + + + + + + + + + + + + + + + + + + {9142eefa-7570-41e1-bfcc-468bb571af2f} + MediaBrowser.Common + + + {17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2} + MediaBrowser.Controller + + + {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} + MediaBrowser.Model + + + + + xcopy "$(TargetPath)" "$(SolutionDir)\MediaBrowser.ServerApplication\CorePlugins\" /y + + + \ No newline at end of file diff --git a/MediaBrowser.Server.WorldWeatherOnline/Properties/AssemblyInfo.cs b/MediaBrowser.Server.WorldWeatherOnline/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..97f2ae6e11 --- /dev/null +++ b/MediaBrowser.Server.WorldWeatherOnline/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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("MediaBrowser.Server.WorldWeatherOnline")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MediaBrowser.Server.WorldWeatherOnline")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[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("c7b294dc-b3fd-4925-9ac3-8dd16803200c")] + +// 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("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MediaBrowser.Controller/Weather/WeatherProvider.cs b/MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs similarity index 89% rename from MediaBrowser.Controller/Weather/WeatherProvider.cs rename to MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs index 1560aa92c6..257249793e 100644 --- a/MediaBrowser.Controller/Weather/WeatherProvider.cs +++ b/MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs @@ -1,5 +1,7 @@ -using MediaBrowser.Common.Logging; -using MediaBrowser.Common.Serialization; +using MediaBrowser.Common.Serialization; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Weather; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Weather; using System; using System.ComponentModel.Composition; @@ -7,15 +9,37 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace MediaBrowser.Controller.Weather +namespace MediaBrowser.Server.WorldWeatherOnline { /// /// Based on http://www.worldweatheronline.com/free-weather-feed.aspx /// The classes in this file are a reproduction of the json output, which will then be converted to our weather model classes /// - [Export(typeof(BaseWeatherProvider))] - public class WeatherProvider : BaseWeatherProvider + [Export(typeof(IWeatherProvider))] + public class WeatherProvider : IWeatherProvider { + /// + /// Gets or sets the logger. + /// + /// The logger. + private ILogger Logger { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// The logger. + /// logger + [ImportingConstructor] + public WeatherProvider([Import("logger")] ILogger logger) + { + if (logger == null) + { + throw new ArgumentNullException("logger"); + } + + Logger = logger; + } + /// /// The _weather semaphore /// @@ -28,7 +52,7 @@ namespace MediaBrowser.Controller.Weather /// The cancellation token. /// Task{WeatherInfo}. /// location - public override async Task GetWeatherInfoAsync(string location, CancellationToken cancellationToken) + public async Task GetWeatherInfoAsync(string location, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(location)) { @@ -39,13 +63,13 @@ namespace MediaBrowser.Controller.Weather { throw new ArgumentNullException("cancellationToken"); } - + const int numDays = 5; const string apiKey = "24902f60f1231941120109"; var url = "http://free.worldweatheronline.com/feed/weather.ashx?q=" + location + "&format=json&num_of_days=" + numDays + "&key=" + apiKey; - Logger.LogInfo("Accessing weather from " + url); + Logger.Info("Accessing weather from " + url); using (var stream = await Kernel.Instance.HttpManager.Get(url, _weatherSemaphore, cancellationToken).ConfigureAwait(false)) { @@ -308,4 +332,4 @@ namespace MediaBrowser.Controller.Weather } } } -} +} \ No newline at end of file diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs index e503704444..b06c8f04e2 100644 --- a/MediaBrowser.ServerApplication/App.xaml.cs +++ b/MediaBrowser.ServerApplication/App.xaml.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Logging; using MediaBrowser.Common.UI; using MediaBrowser.Controller; using MediaBrowser.IsoMounter; @@ -169,7 +170,7 @@ namespace MediaBrowser.ServerApplication /// IKernel. protected override IKernel InstantiateKernel() { - return new Kernel(new PismoIsoManager(), new DotNetZipClient()); + return new Kernel(new PismoIsoManager(LogManager.GetLogger("PismoIsoManager")), new DotNetZipClient()); } /// diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index 86ad7dcaf6..cfd37904e3 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -328,6 +328,9 @@ Always + + Always + Always diff --git a/MediaBrowser.UI/App.xaml.cs b/MediaBrowser.UI/App.xaml.cs index bae133ab77..bc68df234f 100644 --- a/MediaBrowser.UI/App.xaml.cs +++ b/MediaBrowser.UI/App.xaml.cs @@ -244,7 +244,7 @@ namespace MediaBrowser.UI /// IKernel. protected override IKernel InstantiateKernel() { - return new UIKernel(new PismoIsoManager()); + return new UIKernel(new PismoIsoManager(LogManager.GetLogger("PismoIsoManager"))); } /// diff --git a/MediaBrowser.sln b/MediaBrowser.sln index 9e35fdc9ed..f9d2816afa 100644 --- a/MediaBrowser.sln +++ b/MediaBrowser.sln @@ -47,6 +47,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Installer", "M EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Sqlite", "MediaBrowser.Server.Sqlite\MediaBrowser.Server.Sqlite.csproj", "{8649ED6B-8504-4D00-BFA5-B8C73CC744DB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.WorldWeatherOnline", "MediaBrowser.Server.WorldWeatherOnline\MediaBrowser.Server.WorldWeatherOnline.csproj", "{973CA45C-8362-490B-8327-C68098FD4891}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -303,6 +305,20 @@ Global {8649ED6B-8504-4D00-BFA5-B8C73CC744DB}.Release|Win32.ActiveCfg = Release|Any CPU {8649ED6B-8504-4D00-BFA5-B8C73CC744DB}.Release|x64.ActiveCfg = Release|Any CPU {8649ED6B-8504-4D00-BFA5-B8C73CC744DB}.Release|x86.ActiveCfg = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|Any CPU.Build.0 = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|Win32.ActiveCfg = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|x64.ActiveCfg = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Debug|x86.ActiveCfg = Debug|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|Any CPU.ActiveCfg = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|Any CPU.Build.0 = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|Win32.ActiveCfg = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|x64.ActiveCfg = Release|Any CPU + {973CA45C-8362-490B-8327-C68098FD4891}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE