Luke Pulverenti 10 роки тому
батько
коміт
999ad78a0d
31 змінених файлів з 274 додано та 200 видалено
  1. 18 18
      MediaBrowser.Api/Images/ImageService.cs
  2. 2 2
      MediaBrowser.Controller/Dlna/DlnaIconResponse.cs
  3. 1 1
      MediaBrowser.Controller/Drawing/IImageProcessor.cs
  4. 0 11
      MediaBrowser.Controller/Drawing/ImageFormat.cs
  5. 1 1
      MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
  6. 28 0
      MediaBrowser.Controller/Drawing/ImageStream.cs
  7. 2 2
      MediaBrowser.Controller/LiveTv/StreamResponseInfo.cs
  8. 1 3
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  9. 3 3
      MediaBrowser.Controller/Providers/IImageEnhancer.cs
  10. 2 2
      MediaBrowser.Controller/Providers/IImageSaver.cs
  11. 2 2
      MediaBrowser.Controller/Providers/ILocalImageProvider.cs
  12. 1 1
      MediaBrowser.Dlna/DlnaManager.cs
  13. 3 3
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  14. 3 3
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  15. 1 1
      MediaBrowser.Model/Drawing/ImageFormat.cs
  16. 1 1
      MediaBrowser.Model/Dto/ImageOptions.cs
  17. 1 1
      MediaBrowser.Model/MediaBrowser.Model.csproj
  18. 1 1
      MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs
  19. 1 1
      MediaBrowser.Server.Implementations/Drawing/ImageExtensions.cs
  20. 50 33
      MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
  21. 12 15
      MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
  22. 45 5
      MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
  23. 5 1
      MediaBrowser.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs
  24. 9 8
      MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
  25. 5 1
      MediaBrowser.Server.Implementations/Library/Resolvers/PlaylistResolver.cs
  26. 5 1
      MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
  27. 1 0
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
  28. 1 1
      MediaBrowser.ServerApplication/App.config
  29. 2 2
      MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs
  30. 66 71
      MediaBrowser.sln
  31. 1 5
      SharedVersion.cs

+ 18 - 18
MediaBrowser.Api/Images/ImageService.cs

@@ -567,7 +567,7 @@ namespace MediaBrowser.Api.Images
         private async Task<object> GetImageResult(IHasImages item,
             ImageRequest request,
             ItemImageInfo image,
-            ImageOutputFormat format,
+            ImageFormat format,
             List<IImageEnhancer> enhancers,
             string contentType,
             TimeSpan? cacheDuration,
@@ -612,11 +612,11 @@ namespace MediaBrowser.Api.Images
             });
         }
 
-        private ImageOutputFormat GetOutputFormat(ImageRequest request, ItemImageInfo image, List<IImageEnhancer> enhancers)
+        private ImageFormat GetOutputFormat(ImageRequest request, ItemImageInfo image, List<IImageEnhancer> enhancers)
         {
             if (!string.IsNullOrWhiteSpace(request.Format))
             {
-                ImageOutputFormat format;
+                ImageFormat format;
                 if (Enum.TryParse(request.Format, true, out format))
                 {
                     return format;
@@ -627,28 +627,28 @@ namespace MediaBrowser.Api.Images
 
             var clientFormats = GetClientSupportedFormats();
 
-            if (serverFormats.Contains(ImageOutputFormat.Webp) &&
-                clientFormats.Contains(ImageOutputFormat.Webp))
+            if (serverFormats.Contains(ImageFormat.Webp) &&
+                clientFormats.Contains(ImageFormat.Webp))
             {
-                return ImageOutputFormat.Webp;
+                return ImageFormat.Webp;
             }
 
             if (enhancers.Count > 0)
             {
-                return ImageOutputFormat.Png;
+                return ImageFormat.Png;
             }
 
             if (string.Equals(Path.GetExtension(image.Path), ".jpg", StringComparison.OrdinalIgnoreCase) ||
                 string.Equals(Path.GetExtension(image.Path), ".jpeg", StringComparison.OrdinalIgnoreCase))
             {
-                return ImageOutputFormat.Jpg;
+                return ImageFormat.Jpg;
             }
 
             // We can't predict if there will be transparency or not, so play it safe
-            return ImageOutputFormat.Png;
+            return ImageFormat.Png;
         }
 
-        private ImageOutputFormat[] GetClientSupportedFormats()
+        private ImageFormat[] GetClientSupportedFormats()
         {
             if ((Request.AcceptTypes ?? new string[] { }).Contains("image/webp", StringComparer.OrdinalIgnoreCase))
             {
@@ -657,32 +657,32 @@ namespace MediaBrowser.Api.Images
                 // Not displaying properly on iOS
                 if (userAgent.IndexOf("cfnetwork", StringComparison.OrdinalIgnoreCase) == -1)
                 {
-                    return new[] { ImageOutputFormat.Webp, ImageOutputFormat.Jpg, ImageOutputFormat.Png };
+                    return new[] { ImageFormat.Webp, ImageFormat.Jpg, ImageFormat.Png };
                 }
             }
 
-            return new[] { ImageOutputFormat.Jpg, ImageOutputFormat.Png };
+            return new[] { ImageFormat.Jpg, ImageFormat.Png };
         }
 
-        private string GetMimeType(ImageOutputFormat format, string path)
+        private string GetMimeType(ImageFormat format, string path)
         {
-            if (format == ImageOutputFormat.Bmp)
+            if (format == ImageFormat.Bmp)
             {
                 return Common.Net.MimeTypes.GetMimeType("i.bmp");
             }
-            if (format == ImageOutputFormat.Gif)
+            if (format == ImageFormat.Gif)
             {
                 return Common.Net.MimeTypes.GetMimeType("i.gif");
             }
-            if (format == ImageOutputFormat.Jpg)
+            if (format == ImageFormat.Jpg)
             {
                 return Common.Net.MimeTypes.GetMimeType("i.jpg");
             }
-            if (format == ImageOutputFormat.Png)
+            if (format == ImageFormat.Png)
             {
                 return Common.Net.MimeTypes.GetMimeType("i.png");
             }
-            if (format == ImageOutputFormat.Webp)
+            if (format == ImageFormat.Webp)
             {
                 return Common.Net.MimeTypes.GetMimeType("i.webp");
             }

+ 2 - 2
MediaBrowser.Controller/Dlna/DlnaIconResponse.cs

@@ -1,6 +1,6 @@
-using MediaBrowser.Controller.Drawing;
-using System;
+using System;
 using System.IO;
+using MediaBrowser.Model.Drawing;
 
 namespace MediaBrowser.Controller.Dlna
 {

+ 1 - 1
MediaBrowser.Controller/Drawing/IImageProcessor.cs

@@ -94,6 +94,6 @@ namespace MediaBrowser.Controller.Drawing
         /// Gets the supported image output formats.
         /// </summary>
         /// <returns>ImageOutputFormat[].</returns>
-        ImageOutputFormat[] GetSupportedImageOutputFormats();
+        ImageFormat[] GetSupportedImageOutputFormats();
     }
 }

+ 0 - 11
MediaBrowser.Controller/Drawing/ImageFormat.cs

@@ -1,11 +0,0 @@
-
-namespace MediaBrowser.Controller.Drawing
-{
-    public enum ImageFormat
-    {
-        Jpg,
-        Png,
-        Gif,
-        Bmp
-    }
-}

+ 1 - 1
MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs

@@ -29,7 +29,7 @@ namespace MediaBrowser.Controller.Drawing
 
         public List<IImageEnhancer> Enhancers { get; set; }
 
-        public ImageOutputFormat OutputFormat { get; set; }
+        public ImageFormat OutputFormat { get; set; }
 
         public bool AddPlayedIndicator { get; set; }
 

+ 28 - 0
MediaBrowser.Controller/Drawing/ImageStream.cs

@@ -0,0 +1,28 @@
+using MediaBrowser.Model.Drawing;
+using System;
+using System.IO;
+
+namespace MediaBrowser.Controller.Drawing
+{
+    public class ImageStream : IDisposable
+    {
+        /// <summary>
+        /// Gets or sets the stream.
+        /// </summary>
+        /// <value>The stream.</value>
+        public Stream Stream { get; set; }
+        /// <summary>
+        /// Gets or sets the format.
+        /// </summary>
+        /// <value>The format.</value>
+        public ImageFormat Format { get; set; }
+
+        public void Dispose()
+        {
+            if (Stream != null)
+            {
+                Stream.Dispose();
+            }
+        }
+    }
+}

+ 2 - 2
MediaBrowser.Controller/LiveTv/StreamResponseInfo.cs

@@ -1,5 +1,5 @@
-using MediaBrowser.Controller.Drawing;
-using System.IO;
+using System.IO;
+using MediaBrowser.Model.Drawing;
 
 namespace MediaBrowser.Controller.LiveTv
 {

+ 1 - 3
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -55,7 +55,6 @@
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Data" />
-    <Reference Include="System.Drawing" />
     <Reference Include="System.Net" />
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="Microsoft.CSharp" />
@@ -114,9 +113,9 @@
     <Compile Include="Dlna\IEventManager.cs" />
     <Compile Include="Dlna\IUpnpService.cs" />
     <Compile Include="Drawing\IImageProcessor.cs" />
-    <Compile Include="Drawing\ImageFormat.cs" />
     <Compile Include="Drawing\ImageProcessingOptions.cs" />
     <Compile Include="Drawing\ImageProcessorExtensions.cs" />
+    <Compile Include="Drawing\ImageStream.cs" />
     <Compile Include="Dto\IDtoService.cs" />
     <Compile Include="Entities\AdultVideo.cs" />
     <Compile Include="Entities\Audio\IHasAlbumArtist.cs" />
@@ -270,7 +269,6 @@
     <Compile Include="Providers\MetadataStatus.cs" />
     <Compile Include="Providers\ISeriesOrderManager.cs" />
     <Compile Include="Session\ISessionManager.cs" />
-    <Compile Include="Drawing\ImageExtensions.cs" />
     <Compile Include="Entities\AggregateFolder.cs" />
     <Compile Include="Entities\Audio\Audio.cs" />
     <Compile Include="Entities\Audio\MusicAlbum.cs" />

+ 3 - 3
MediaBrowser.Controller/Providers/IImageEnhancer.cs

@@ -1,7 +1,7 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
-using System.Drawing;
 using System.Threading.Tasks;
 
 namespace MediaBrowser.Controller.Providers
@@ -49,6 +49,6 @@ namespace MediaBrowser.Controller.Providers
         /// <param name="imageIndex">Index of the image.</param>
         /// <returns>Task{Image}.</returns>
         /// <exception cref="System.ArgumentNullException"></exception>
-        Task<Image> EnhanceImageAsync(IHasImages item, Image originalImage, ImageType imageType, int imageIndex);
+        Task<ImageStream> EnhanceImageAsync(IHasImages item, ImageStream originalImage, ImageType imageType, int imageIndex);
     }
 }

+ 2 - 2
MediaBrowser.Controller/Providers/IImageSaver.cs

@@ -1,5 +1,5 @@
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
 using System.Collections.Generic;
 

+ 2 - 2
MediaBrowser.Controller/Providers/ILocalImageProvider.cs

@@ -1,5 +1,5 @@
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
 using System;
 using System.Collections.Generic;

+ 1 - 1
MediaBrowser.Dlna/DlnaManager.cs

@@ -2,12 +2,12 @@
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Dlna;
-using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Dlna.Profiles;
 using MediaBrowser.Dlna.Server;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Dlna.Profiles;
+using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using System;

+ 3 - 3
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -404,12 +404,12 @@
     <Compile Include="..\MediaBrowser.Model\Drawing\DrawingUtils.cs">
       <Link>Drawing\DrawingUtils.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Drawing\ImageFormat.cs">
+      <Link>Drawing\ImageFormat.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Drawing\ImageOrientation.cs">
       <Link>Drawing\ImageOrientation.cs</Link>
     </Compile>
-    <Compile Include="..\MediaBrowser.Model\Drawing\ImageOutputFormat.cs">
-      <Link>Drawing\ImageOutputFormat.cs</Link>
-    </Compile>
     <Compile Include="..\MediaBrowser.Model\Drawing\ImageSize.cs">
       <Link>Drawing\ImageSize.cs</Link>
     </Compile>

+ 3 - 3
MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj

@@ -369,12 +369,12 @@
     <Compile Include="..\MediaBrowser.Model\Drawing\DrawingUtils.cs">
       <Link>Drawing\DrawingUtils.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Drawing\ImageFormat.cs">
+      <Link>Drawing\ImageFormat.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Drawing\ImageOrientation.cs">
       <Link>Drawing\ImageOrientation.cs</Link>
     </Compile>
-    <Compile Include="..\MediaBrowser.Model\Drawing\ImageOutputFormat.cs">
-      <Link>Drawing\ImageOutputFormat.cs</Link>
-    </Compile>
     <Compile Include="..\MediaBrowser.Model\Drawing\ImageSize.cs">
       <Link>Drawing\ImageSize.cs</Link>
     </Compile>

+ 1 - 1
MediaBrowser.Model/Drawing/ImageOutputFormat.cs → MediaBrowser.Model/Drawing/ImageFormat.cs

@@ -4,7 +4,7 @@ namespace MediaBrowser.Model.Drawing
     /// <summary>
     /// Enum ImageOutputFormat
     /// </summary>
-    public enum ImageOutputFormat
+    public enum ImageFormat
     {
         /// <summary>
         /// The BMP

+ 1 - 1
MediaBrowser.Model/Dto/ImageOptions.cs

@@ -73,7 +73,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the format.
         /// </summary>
         /// <value>The format.</value>
-        public ImageOutputFormat? Format { get; set; }
+        public ImageFormat? Format { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether [add played indicator].

+ 1 - 1
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -191,7 +191,7 @@
     <Compile Include="Dlna\TranscodingProfile.cs" />
     <Compile Include="Dlna\VideoOptions.cs" />
     <Compile Include="Dlna\XmlAttribute.cs" />
-    <Compile Include="Drawing\ImageOutputFormat.cs" />
+    <Compile Include="Drawing\ImageFormat.cs" />
     <Compile Include="Drawing\ImageSize.cs" />
     <Compile Include="Dto\BaseItemPerson.cs" />
     <Compile Include="Dto\ChapterInfoDto.cs" />

+ 1 - 1
MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs

@@ -1,8 +1,8 @@
 using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.MediaInfo;

+ 1 - 1
MediaBrowser.Controller/Drawing/ImageExtensions.cs → MediaBrowser.Server.Implementations/Drawing/ImageExtensions.cs

@@ -4,7 +4,7 @@ using System.Drawing.Drawing2D;
 using System.Drawing.Imaging;
 using System.IO;
 
-namespace MediaBrowser.Controller.Drawing
+namespace MediaBrowser.Server.Implementations.Drawing
 {
     /// <summary>
     /// Class ImageExtensions

+ 50 - 33
MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs

@@ -129,13 +129,13 @@ namespace MediaBrowser.Server.Implementations.Drawing
             }
         }
 
-        public ImageOutputFormat[] GetSupportedImageOutputFormats()
+        public Model.Drawing.ImageFormat[] GetSupportedImageOutputFormats()
         {
             if (_webpAvailable)
             {
-                return new[] { ImageOutputFormat.Webp, ImageOutputFormat.Gif, ImageOutputFormat.Jpg, ImageOutputFormat.Png };
+                return new[] { Model.Drawing.ImageFormat.Webp, Model.Drawing.ImageFormat.Gif, Model.Drawing.ImageFormat.Jpg, Model.Drawing.ImageFormat.Png };
             }
-            return new[] { ImageOutputFormat.Gif, ImageOutputFormat.Jpg, ImageOutputFormat.Png };
+            return new[] { Model.Drawing.ImageFormat.Gif, Model.Drawing.ImageFormat.Jpg, Model.Drawing.ImageFormat.Png };
         }
 
         public async Task<string> ProcessImage(ImageProcessingOptions options)
@@ -227,7 +227,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
 
                             // Graphics.FromImage will throw an exception if the PixelFormat is Indexed, so we need to handle that here
                             // Also, Webp only supports Format32bppArgb and Format32bppRgb
-                            var pixelFormat = selectedOutputFormat == ImageOutputFormat.Webp
+                            var pixelFormat = selectedOutputFormat == Model.Drawing.ImageFormat.Webp
                                 ? PixelFormat.Format32bppArgb
                                 : PixelFormat.Format32bppPArgb;
 
@@ -263,7 +263,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
                                     // Save to the cache location
                                     using (var cacheFileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, false))
                                     {
-                                        if (selectedOutputFormat == ImageOutputFormat.Webp)
+                                        if (selectedOutputFormat == Model.Drawing.ImageFormat.Webp)
                                         {
                                             SaveToWebP(thumbnail, cacheFileStream, quality);
                                         }
@@ -381,17 +381,17 @@ namespace MediaBrowser.Server.Implementations.Drawing
         /// <param name="image">The image.</param>
         /// <param name="outputFormat">The output format.</param>
         /// <returns>ImageFormat.</returns>
-        private System.Drawing.Imaging.ImageFormat GetOutputFormat(Image image, ImageOutputFormat outputFormat)
+        private System.Drawing.Imaging.ImageFormat GetOutputFormat(Image image, Model.Drawing.ImageFormat outputFormat)
         {
             switch (outputFormat)
             {
-                case ImageOutputFormat.Bmp:
+                case Model.Drawing.ImageFormat.Bmp:
                     return System.Drawing.Imaging.ImageFormat.Bmp;
-                case ImageOutputFormat.Gif:
+                case Model.Drawing.ImageFormat.Gif:
                     return System.Drawing.Imaging.ImageFormat.Gif;
-                case ImageOutputFormat.Jpg:
+                case Model.Drawing.ImageFormat.Jpg:
                     return System.Drawing.Imaging.ImageFormat.Jpeg;
-                case ImageOutputFormat.Png:
+                case Model.Drawing.ImageFormat.Png:
                     return System.Drawing.Imaging.ImageFormat.Png;
                 default:
                     return image.RawFormat;
@@ -471,7 +471,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
         /// <summary>
         /// Gets the cache file path based on a set of parameters
         /// </summary>
-        private string GetCacheFilePath(string originalPath, ImageSize outputSize, int quality, DateTime dateModified, ImageOutputFormat format, bool addPlayedIndicator, double percentPlayed, int? unwatchedCount, string backgroundColor)
+        private string GetCacheFilePath(string originalPath, ImageSize outputSize, int quality, DateTime dateModified, Model.Drawing.ImageFormat format, bool addPlayedIndicator, double percentPlayed, int? unwatchedCount, string backgroundColor)
         {
             var filename = originalPath;
 
@@ -772,15 +772,23 @@ namespace MediaBrowser.Server.Implementations.Drawing
                     {
                         await fileStream.CopyToAsync(memoryStream).ConfigureAwait(false);
 
-                        using (var originalImage = Image.FromStream(memoryStream, true, false))
+                        memoryStream.Position = 0;
+
+                        var imageStream = new ImageStream
                         {
-                            //Pass the image through registered enhancers
-                            using (var newImage = await ExecuteImageEnhancers(supportedEnhancers, originalImage, item, imageType, imageIndex).ConfigureAwait(false))
-                            {
-                                var parentDirectory = Path.GetDirectoryName(enhancedImagePath);
+                            Stream = memoryStream,
+                            Format = GetFormat(originalImagePath)
+                        };
+
+                        //Pass the image through registered enhancers
+                        using (var newImageStream = await ExecuteImageEnhancers(supportedEnhancers, imageStream, item, imageType, imageIndex).ConfigureAwait(false))
+                        {
+                            var parentDirectory = Path.GetDirectoryName(enhancedImagePath);
 
-                                Directory.CreateDirectory(parentDirectory);
+                            Directory.CreateDirectory(parentDirectory);
 
+                            using (var newImage = Image.FromStream(newImageStream.Stream, true, false))
+                            {
                                 //And then save it in the cache
                                 using (var outputStream = _fileSystem.GetFileStream(enhancedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read, false))
                                 {
@@ -799,6 +807,30 @@ namespace MediaBrowser.Server.Implementations.Drawing
             return enhancedImagePath;
         }
 
+        private Model.Drawing.ImageFormat GetFormat(string path)
+        {
+            var extension = Path.GetExtension(path);
+
+            if (string.Equals(extension, ".png", StringComparison.OrdinalIgnoreCase))
+            {
+                return Model.Drawing.ImageFormat.Png;
+            }
+            if (string.Equals(extension, ".gif", StringComparison.OrdinalIgnoreCase))
+            {
+                return Model.Drawing.ImageFormat.Gif;
+            }
+            if (string.Equals(extension, ".webp", StringComparison.OrdinalIgnoreCase))
+            {
+                return Model.Drawing.ImageFormat.Webp;
+            }
+            if (string.Equals(extension, ".bmp", StringComparison.OrdinalIgnoreCase))
+            {
+                return Model.Drawing.ImageFormat.Bmp;
+            }
+
+            return Model.Drawing.ImageFormat.Jpg;
+        }
+
         /// <summary>
         /// Executes the image enhancers.
         /// </summary>
@@ -808,7 +840,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
         /// <param name="imageType">Type of the image.</param>
         /// <param name="imageIndex">Index of the image.</param>
         /// <returns>Task{EnhancedImage}.</returns>
-        private async Task<Image> ExecuteImageEnhancers(IEnumerable<IImageEnhancer> imageEnhancers, Image originalImage, IHasImages item, ImageType imageType, int imageIndex)
+        private async Task<ImageStream> ExecuteImageEnhancers(IEnumerable<IImageEnhancer> imageEnhancers, ImageStream originalImage, IHasImages item, ImageType imageType, int imageIndex)
         {
             var result = originalImage;
 
@@ -832,21 +864,6 @@ namespace MediaBrowser.Server.Implementations.Drawing
             return result;
         }
 
-        /// <summary>
-        /// The _semaphoreLocks
-        /// </summary>
-        private readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
-
-        /// <summary>
-        /// Gets the lock.
-        /// </summary>
-        /// <param name="filename">The filename.</param>
-        /// <returns>System.Object.</returns>
-        private object GetObjectLock(string filename)
-        {
-            return _locks.GetOrAdd(filename, key => new object());
-        }
-
         /// <summary>
         /// The _semaphoreLocks
         /// </summary>

+ 12 - 15
MediaBrowser.Server.Implementations/Library/ResolverHelper.cs

@@ -56,43 +56,40 @@ namespace MediaBrowser.Server.Implementations.Library
         /// Ensures the name.
         /// </summary>
         /// <param name="item">The item.</param>
+        /// <param name="args">The arguments.</param>
         private static void EnsureName(BaseItem item, ItemResolveArgs args)
         {
             // If the subclass didn't supply a name, add it here
             if (string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(item.Path))
             {
                 //we use our resolve args name here to get the name of the containg folder, not actual video file
-                item.Name = GetMbName(args.FileInfo.Name, (args.FileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory);
+                item.Name = GetDisplayName(args.FileInfo.Name, (args.FileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory);
             }
         }
 
         /// <summary>
-        /// The MB name regex
-        /// </summary>
-        private static readonly Regex MbNameRegex = new Regex(@"(\[.*?\])", RegexOptions.Compiled);
-
-        /// <summary>
-        /// Strip out attribute items and return just the name we will use for items
+        /// Gets the display name.
         /// </summary>
-        /// <param name="path">Assumed to be a file or directory path</param>
+        /// <param name="path">The path.</param>
         /// <param name="isDirectory">if set to <c>true</c> [is directory].</param>
-        /// <returns>The cleaned name</returns>
-        private static string GetMbName(string path, bool isDirectory)
+        /// <returns>System.String.</returns>
+        private static string GetDisplayName(string path, bool isDirectory)
         {
             //first just get the file or directory name
             var fn = isDirectory ? Path.GetFileName(path) : Path.GetFileNameWithoutExtension(path);
 
-            //now - strip out anything inside brackets
-            fn = StripBrackets(fn);
-
             return fn;
         }
 
-        private static string StripBrackets(string inputString)
+        /// <summary>
+        /// The MB name regex
+        /// </summary>
+        private static readonly Regex MbNameRegex = new Regex(@"(\[.*?\])", RegexOptions.Compiled);
+
+        internal static string StripBrackets(string inputString)
         {
             var output = MbNameRegex.Replace(inputString, string.Empty).Trim();
             return Regex.Replace(output, @"\s+", " ");
         }
-
     }
 }

+ 45 - 5
MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs

@@ -1,10 +1,9 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Naming.Audio;
 using MediaBrowser.Naming.Common;
-using MediaBrowser.Naming.Video;
 using System;
+using System.IO;
 
 namespace MediaBrowser.Server.Implementations.Library.Resolvers
 {
@@ -29,7 +28,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
         /// <returns>`0.</returns>
         protected override T Resolve(ItemResolveArgs args)
         {
-            return ResolveVideo<T>(args);
+            return ResolveVideo<T>(args, true);
         }
 
         /// <summary>
@@ -37,8 +36,9 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
         /// </summary>
         /// <typeparam name="TVideoType">The type of the T video type.</typeparam>
         /// <param name="args">The args.</param>
+        /// <param name="parseName">if set to <c>true</c> [parse name].</param>
         /// <returns>``0.</returns>
-        protected TVideoType ResolveVideo<TVideoType>(ItemResolveArgs args)
+        protected TVideoType ResolveVideo<TVideoType>(ItemResolveArgs args, bool parseName)
               where TVideoType : Video, new()
         {
             // If the path is a file check for a matching extensions
@@ -69,10 +69,18 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
                         IsInMixedFolder = true,
                         IsPlaceHolder = videoInfo.IsStub,
                         IsShortcut = isShortcut,
-                        Name = videoInfo.Name,
                         ProductionYear = videoInfo.Year
                     };
 
+                    if (parseName)
+                    {
+                        video.Name = videoInfo.Name;
+                    }
+                    else
+                    {
+                        video.Name = Path.GetFileNameWithoutExtension(path);
+                    }
+
                     if (videoInfo.IsStub)
                     {
                         if (string.Equals(videoInfo.StubType, "dvd", StringComparison.OrdinalIgnoreCase))
@@ -89,6 +97,38 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
                         }
                     }
 
+                    if (videoInfo.Is3D)
+                    {
+                        if (string.Equals(videoInfo.Format3D, "fsbs", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.FullSideBySide;
+                        }
+                        else if (string.Equals(videoInfo.Format3D, "ftab", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.FullTopAndBottom;
+                        }
+                        else if (string.Equals(videoInfo.Format3D, "hsbs", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.HalfSideBySide;
+                        }
+                        else if (string.Equals(videoInfo.Format3D, "htab", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
+                        }
+                        else if (string.Equals(videoInfo.Format3D, "sbs", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.HalfSideBySide;
+                        }
+                        else if (string.Equals(videoInfo.Format3D, "sbs3d", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.HalfSideBySide;
+                        }
+                        else if (string.Equals(videoInfo.Format3D, "tab", StringComparison.OrdinalIgnoreCase))
+                        {
+                            video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
+                        }
+                    }
+
                     return video;
                 }
             }

+ 5 - 1
MediaBrowser.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs

@@ -40,7 +40,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
                 
                 if (filename.IndexOf("[boxset]", StringComparison.OrdinalIgnoreCase) != -1 || args.ContainsFileSystemEntryByName("collection.xml"))
                 {
-                    return new BoxSet { Path = args.Path };
+                    return new BoxSet
+                    {
+                        Path = args.Path,
+                        Name = ResolverHelper.StripBrackets(Path.GetFileName(args.Path))
+                    };
                 }
             }
 

+ 9 - 8
MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs

@@ -8,13 +8,12 @@ using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Resolvers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
+using MediaBrowser.Naming.Common;
+using MediaBrowser.Naming.Video;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using MediaBrowser.Naming.Audio;
-using MediaBrowser.Naming.Common;
-using MediaBrowser.Naming.Video;
 
 namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
 {
@@ -116,14 +115,14 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
             // Find movies that are mixed in the same folder
             if (string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase))
             {
-                return ResolveVideo<Trailer>(args);
+                return ResolveVideo<Trailer>(args, true);
             }
 
             Video item = null;
 
             if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase))
             {
-                item = ResolveVideo<MusicVideo>(args);
+                item = ResolveVideo<MusicVideo>(args, true);
             }
 
             // To find a movie file, the collection type must be movies or boxsets
@@ -131,7 +130,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
             if (string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase) ||
                 string.Equals(collectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase))
             {
-                item = ResolveVideo<Movie>(args);
+                item = ResolveVideo<Movie>(args, true);
             }
 
             if (item != null)
@@ -180,8 +179,10 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
         /// <param name="fileSystemEntries">The file system entries.</param>
         /// <param name="directoryService">The directory service.</param>
         /// <param name="supportMultiFileItems">if set to <c>true</c> [support multi file items].</param>
+        /// <param name="supportsMultipleSources">if set to <c>true</c> [supports multiple sources].</param>
+        /// <param name="collectionType">Type of the collection.</param>
         /// <returns>Movie.</returns>
-        private T FindMovie<T>(string path, Folder parent, List<FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsMultipleSources, string collectionType)
+        private T FindMovie<T>(string path, Folder parent, IEnumerable<FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsMultipleSources, string collectionType)
             where T : Video, new()
         {
             var movies = new List<T>();
@@ -231,7 +232,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
                     CollectionType = collectionType
                 };
 
-                var item = ResolveVideo<T>(childArgs);
+                var item = ResolveVideo<T>(childArgs, true);
 
                 if (item != null)
                 {

+ 5 - 1
MediaBrowser.Server.Implementations/Library/Resolvers/PlaylistResolver.cs

@@ -28,7 +28,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
 
                 if (filename.IndexOf("[playlist]", StringComparison.OrdinalIgnoreCase) != -1)
                 {
-                    return new Playlist { Path = args.Path };
+                    return new Playlist
+                    {
+                        Path = args.Path,
+                        Name = ResolverHelper.StripBrackets(Path.GetFileName(args.Path))
+                    };
                 }
             }
 

+ 5 - 1
MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs

@@ -81,7 +81,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
 
                 if (IsSeriesFolder(args.Path, isTvShowsFolder, args.FileSystemChildren, args.DirectoryService, _fileSystem, _logger, _libraryManager))
                 {
-                    return new Series();
+                    return new Series
+                    {
+                        Path = args.Path,
+                        Name = ResolverHelper.StripBrackets(Path.GetFileName(args.Path))
+                    };
                 }
             }
 

+ 1 - 0
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -121,6 +121,7 @@
     <Compile Include="Devices\DeviceManager.cs" />
     <Compile Include="Devices\DeviceRepository.cs" />
     <Compile Include="Devices\CameraUploadsFolder.cs" />
+    <Compile Include="Drawing\ImageExtensions.cs" />
     <Compile Include="Drawing\ImageHeader.cs" />
     <Compile Include="Drawing\PercentPlayedDrawer.cs" />
     <Compile Include="Drawing\PlayedIndicatorDrawer.cs" />

+ 1 - 1
MediaBrowser.ServerApplication/App.config

@@ -12,7 +12,7 @@
     <targets async="true"></targets>
   </nlog>
   <appSettings>
-    <add key="DebugProgramDataPath" value="..\..\..\..\ProgramData-Server" />
+    <add key="DebugProgramDataPath" value="..\..\..\ProgramData-Server" />
     <add key="ReleaseProgramDataPath" value="%ApplicationData%\MediaBrowser-Server" />
     <add key="ClientSettingsProvider.ServiceUri" value="" />
   </appSettings>

+ 2 - 2
MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs

@@ -1,8 +1,8 @@
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
 using System;
 using System.Collections.Generic;

+ 66 - 71
MediaBrowser.sln

@@ -103,15 +103,15 @@ Global
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -140,15 +140,15 @@ Global
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.Build.0 = Debug|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -177,15 +177,15 @@ Global
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.Build.0 = Debug|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -214,15 +214,15 @@ Global
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.Build.0 = Debug|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -251,15 +251,15 @@ Global
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.Build.0 = Debug|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -287,15 +287,15 @@ Global
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -322,15 +322,15 @@ Global
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -427,15 +427,15 @@ Global
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -483,23 +483,22 @@ Global
 		{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release|x86.ActiveCfg = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Any CPU.ActiveCfg = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Any CPU.Build.0 = Debug|Any CPU
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Mixed Platforms.ActiveCfg = Debug|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Mixed Platforms.Build.0 = Debug|x86
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Mixed Platforms.Build.0 = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Win32.ActiveCfg = Debug|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|Win32.Build.0 = Debug|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|x64.ActiveCfg = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|x86.ActiveCfg = Debug|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug_Ubuntu|x86.Build.0 = Debug|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Any CPU.ActiveCfg = Debug|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Any CPU.Build.0 = Debug|x86
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Win32.ActiveCfg = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.ActiveCfg = Release|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.Build.0 = Release|x86
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.ActiveCfg = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.Build.0 = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x64.ActiveCfg = Release|Any CPU
@@ -507,17 +506,17 @@ Global
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x86.Build.0 = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|x86
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Win32.ActiveCfg = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Win32.Build.0 = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|x64.ActiveCfg = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|x86.ActiveCfg = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|x86.Build.0 = Release|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Any CPU.ActiveCfg = Release|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Any CPU.Build.0 = Release|x86
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
-		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Mixed Platforms.Build.0 = Release|x86
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Win32.ActiveCfg = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|x64.ActiveCfg = Release|Any CPU
 		{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|x86.ActiveCfg = Release|Any CPU
@@ -537,15 +536,15 @@ Global
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -572,15 +571,15 @@ Global
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -607,15 +606,15 @@ Global
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release|Any CPU
-		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
-		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
+		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Mixed Platforms.Build.0 = Release|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|x86.ActiveCfg = Release Mono|Any CPU
@@ -733,17 +732,17 @@ Global
 		{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release|x86.ActiveCfg = Release|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Any CPU.ActiveCfg = Debug|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Any CPU.Build.0 = Debug|Any CPU
-		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Mixed Platforms.ActiveCfg = Debug|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Mixed Platforms.Build.0 = Debug|x86
+		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Mixed Platforms.Build.0 = Debug|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Win32.ActiveCfg = Debug|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Win32.Build.0 = Debug|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|x64.ActiveCfg = Debug|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|x86.ActiveCfg = Debug|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|x86.Build.0 = Debug|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.ActiveCfg = Debug|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.Build.0 = Debug|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.Build.0 = Debug|x86
+		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.ActiveCfg = Debug|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.Build.0 = Debug|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -751,8 +750,8 @@ Global
 		{175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.Build.0 = Debug|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
-		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.Build.0 = Release Mono|x86
+		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.ActiveCfg = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.Build.0 = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
@@ -760,16 +759,15 @@ Global
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.Build.0 = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
-		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|x86
+		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Win32.Build.0 = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|x86.ActiveCfg = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|x86.Build.0 = Release Mono|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.ActiveCfg = Release|x86
-		{175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.Build.0 = Release|x86
+		{175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.ActiveCfg = Release|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.Build.0 = Release|x86
 		{175A9388-F352-4586-A6B4-070DED62B644}.Release|x64.ActiveCfg = Release|Any CPU
@@ -814,7 +812,4 @@ Global
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
-	GlobalSection(Performance) = preSolution
-		HasPerformanceSessions = true
-	EndGlobalSection
 EndGlobal

+ 1 - 5
SharedVersion.cs

@@ -1,8 +1,4 @@
 using System.Reflection;
 
-#if (DEBUG)
 [assembly: AssemblyVersion("3.0.*")]
-#else
-//[assembly: AssemblyVersion("3.0.*")]
-[assembly: AssemblyVersion("3.0.5445.5")]
-#endif
+//[assembly: AssemblyVersion("3.0.5445.5")]