aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.ServerApplication
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.ServerApplication')
-rw-r--r--MediaBrowser.ServerApplication/App.config85
-rw-r--r--MediaBrowser.ServerApplication/ApplicationPathHelper.cs51
-rw-r--r--MediaBrowser.ServerApplication/BackgroundService.cs45
-rw-r--r--MediaBrowser.ServerApplication/BackgroundServiceInstaller.cs65
-rw-r--r--MediaBrowser.ServerApplication/Icon.icobin26694 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/ImageEncoderHelper.cs36
-rw-r--r--MediaBrowser.ServerApplication/MainStartup.cs800
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj279
-rw-r--r--MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs332
-rw-r--r--MediaBrowser.ServerApplication/Native/LoopUtil.cs293
-rw-r--r--MediaBrowser.ServerApplication/Native/PowerManagement.cs17
-rw-r--r--MediaBrowser.ServerApplication/Native/RegisterServer.bat34
-rw-r--r--MediaBrowser.ServerApplication/Native/ServerAuthorization.cs54
-rw-r--r--MediaBrowser.ServerApplication/Native/Standby.cs48
-rw-r--r--MediaBrowser.ServerApplication/Networking/NativeMethods.cs226
-rw-r--r--MediaBrowser.ServerApplication/Networking/NetworkManager.cs175
-rw-r--r--MediaBrowser.ServerApplication/Networking/NetworkShares.cs643
-rw-r--r--MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs30
-rw-r--r--MediaBrowser.ServerApplication/Properties/Resources.Designer.cs63
-rw-r--r--MediaBrowser.ServerApplication/Properties/Resources.resx120
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/mb3logo800.pngbin3983 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/ServerNotifyIcon.cs223
-rw-r--r--MediaBrowser.ServerApplication/Splash/SplashForm.Designer.cs188
-rw-r--r--MediaBrowser.ServerApplication/Splash/SplashForm.cs45
-rw-r--r--MediaBrowser.ServerApplication/Splash/SplashForm.resx666
-rw-r--r--MediaBrowser.ServerApplication/SplashLogo2.pngbin5479 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Updates/ApplicationUpdater.cs65
-rw-r--r--MediaBrowser.ServerApplication/WindowsAppHost.cs124
-rw-r--r--MediaBrowser.ServerApplication/app.manifest51
-rw-r--r--MediaBrowser.ServerApplication/packages.config9
30 files changed, 0 insertions, 4767 deletions
diff --git a/MediaBrowser.ServerApplication/App.config b/MediaBrowser.ServerApplication/App.config
deleted file mode 100644
index d7f4380c4..000000000
--- a/MediaBrowser.ServerApplication/App.config
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <configSections>
- <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
-
- <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
- </configSections>
- <system.diagnostics>
- <assert assertuienabled="false" />
- </system.diagnostics>
- <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <targets async="true"></targets>
- </nlog>
- <appSettings>
- <add key="DebugProgramDataPath" value="..\..\..\ProgramData-Server" />
- <add key="ReleaseProgramDataPath" value=".." />
- <add key="ClientSettingsProvider.ServiceUri" value="" />
- </appSettings>
- <startup useLegacyV2RuntimeActivationPolicy="true">
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
- </startup>
- <runtime>
- <gcAllowVeryLargeObjects enabled="true" />
- <gcServer enabled="true" />
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <dependentAssembly>
- <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Reactive.Core" publicKeyToken="f300afd708cefcd3" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-2.0.20823.0" newVersion="2.0.20823.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Reactive.Interfaces" publicKeyToken="f300afd708cefcd3" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-2.0.20823.0" newVersion="2.0.20823.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-1.5.11.0" newVersion="1.5.11.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-1.5.11.0" newVersion="1.5.11.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-1.0.94.0" newVersion="1.0.94.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
- </dependentAssembly>
- </assemblyBinding>
- <enforceFIPSPolicy enabled="false" />
- </runtime>
- <system.web>
- <membership defaultProvider="ClientAuthenticationMembershipProvider">
- <providers>
- <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
- </providers>
- </membership>
- <roleManager defaultProvider="ClientRoleProvider" enabled="true">
- <providers>
- <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
- </providers>
- </roleManager>
- </system.web>
- <entityFramework>
- <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
- <parameters>
- <parameter value="v11.0" />
- </parameters>
- </defaultConnectionFactory>
- <providers>
- <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
- <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
- </providers>
- </entityFramework>
-
-</configuration>
diff --git a/MediaBrowser.ServerApplication/ApplicationPathHelper.cs b/MediaBrowser.ServerApplication/ApplicationPathHelper.cs
deleted file mode 100644
index e8dad6213..000000000
--- a/MediaBrowser.ServerApplication/ApplicationPathHelper.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-using System.Configuration;
-using System.IO;
-
-namespace MediaBrowser.ServerApplication
-{
- public static class ApplicationPathHelper
- {
- /// <summary>
- /// Gets the path to the application's ProgramDataFolder
- /// </summary>
- /// <returns>System.String.</returns>
- public static string GetProgramDataPath(string applicationPath)
- {
- var useDebugPath = false;
-
-#if DEBUG
- useDebugPath = true;
-#endif
-
- var programDataPath = useDebugPath ?
- ConfigurationManager.AppSettings["DebugProgramDataPath"] :
- ConfigurationManager.AppSettings["ReleaseProgramDataPath"];
-
- programDataPath = programDataPath.Replace("%ApplicationData%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
-
- programDataPath = programDataPath
- .Replace('/', Path.DirectorySeparatorChar)
- .Replace('\\', Path.DirectorySeparatorChar);
-
- // If it's a relative path, e.g. "..\"
- if (!Path.IsPathRooted(programDataPath))
- {
- var path = Path.GetDirectoryName(applicationPath);
-
- if (string.IsNullOrEmpty(path))
- {
- throw new ApplicationException("Unable to determine running assembly location");
- }
-
- programDataPath = Path.Combine(path, programDataPath);
-
- programDataPath = Path.GetFullPath(programDataPath);
- }
-
- Directory.CreateDirectory(programDataPath);
-
- return programDataPath;
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/BackgroundService.cs b/MediaBrowser.ServerApplication/BackgroundService.cs
deleted file mode 100644
index e90251ae6..000000000
--- a/MediaBrowser.ServerApplication/BackgroundService.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using MediaBrowser.Model.Logging;
-using System.ServiceProcess;
-
-namespace MediaBrowser.ServerApplication
-{
- /// <summary>
- /// Class BackgroundService
- /// </summary>
- public class BackgroundService : ServiceBase
- {
- public static string Name = "Emby";
- public static string DisplayName = "Emby Server";
-
- public static string GetExistingServiceName()
- {
- return Name;
- }
-
- private readonly ILogger _logger;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="BackgroundService"/> class.
- /// </summary>
- public BackgroundService(ILogger logger)
- {
- _logger = logger;
-
- CanPauseAndContinue = false;
-
- CanStop = true;
-
- ServiceName = GetExistingServiceName();
- }
-
- /// <summary>
- /// When implemented in a derived class, executes when a Stop command is sent to the service by the Service Control Manager (SCM). Specifies actions to take when a service stops running.
- /// </summary>
- protected override void OnStop()
- {
- _logger.Info("Stop command received");
-
- base.OnStop();
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/BackgroundServiceInstaller.cs b/MediaBrowser.ServerApplication/BackgroundServiceInstaller.cs
deleted file mode 100644
index be381fe96..000000000
--- a/MediaBrowser.ServerApplication/BackgroundServiceInstaller.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System.Collections;
-using System.ComponentModel;
-using System.ServiceProcess;
-
-namespace MediaBrowser.ServerApplication
-{
- [RunInstaller(true)]
- public class BackgroundServiceInstaller : System.Configuration.Install.Installer
- {
- public BackgroundServiceInstaller()
- {
- var process = new ServiceProcessInstaller
- {
- Account = ServiceAccount.LocalSystem
- };
-
- var serviceAdmin = new ServiceInstaller
- {
- StartType = ServiceStartMode.Manual,
- ServiceName = BackgroundService.Name,
- DisplayName = BackgroundService.DisplayName,
-
- DelayedAutoStart = true,
-
- Description = "The windows background service for Emby Server.",
-
- // Will ensure the network is available
- ServicesDependedOn = new[] { "LanmanServer", "EventLog", "Tcpip", "http" }
- };
-
- // Microsoft didn't add the ability to add a
- // description for the services we are going to install
- // To work around this we'll have to add the
- // information directly to the registry but I'll leave
- // this exercise for later.
-
- // now just add the installers that we created to our
- // parents container, the documentation
- // states that there is not any order that you need to
- // worry about here but I'll still
- // go ahead and add them in the order that makes sense.
- Installers.Add(process);
- Installers.Add(serviceAdmin);
- }
-
- protected override void OnBeforeInstall(IDictionary savedState)
- {
- Context.Parameters["assemblypath"] = "\"" +
- Context.Parameters["assemblypath"] + "\" " + GetStartArgs();
- base.OnBeforeInstall(savedState);
- }
-
- protected override void OnBeforeUninstall(IDictionary savedState)
- {
- Context.Parameters["assemblypath"] = "\"" +
- Context.Parameters["assemblypath"] + "\" " + GetStartArgs();
- base.OnBeforeUninstall(savedState);
- }
-
- private string GetStartArgs()
- {
- return "-service";
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Icon.ico b/MediaBrowser.ServerApplication/Icon.ico
deleted file mode 100644
index 0abd554f4..000000000
--- a/MediaBrowser.ServerApplication/Icon.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/ImageEncoderHelper.cs b/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
deleted file mode 100644
index 7c95a25de..000000000
--- a/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using Emby.Drawing;
-using Emby.Drawing.Skia;
-using Emby.Server.Implementations;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Globalization;
-
-namespace MediaBrowser.Server.Startup.Common
-{
- public class ImageEncoderHelper
- {
- public static IImageEncoder GetImageEncoder(ILogger logger,
- ILogManager logManager,
- IFileSystem fileSystem,
- StartupOptions startupOptions,
- Func<IHttpClient> httpClient,
- IApplicationPaths appPaths,
- ILocalizationManager localizationManager)
- {
- try
- {
- return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem, localizationManager);
- }
- catch
- {
- logger.Error("Skia not available. Will try next image processor.");
- }
-
- return new NullImageEncoder();
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs
deleted file mode 100644
index 91a949921..000000000
--- a/MediaBrowser.ServerApplication/MainStartup.cs
+++ /dev/null
@@ -1,800 +0,0 @@
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Server.Startup.Common;
-using MediaBrowser.ServerApplication.Native;
-using MediaBrowser.ServerApplication.Splash;
-using MediaBrowser.ServerApplication.Updates;
-using Microsoft.Win32;
-using System;
-using System.Configuration.Install;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Management;
-using System.Runtime.InteropServices;
-using System.ServiceProcess;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using Emby.Drawing;
-using Emby.Server.Implementations;
-using Emby.Server.Implementations.Browser;
-using Emby.Server.Implementations.EnvironmentInfo;
-using Emby.Server.Implementations.IO;
-using Emby.Server.Implementations.Logging;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
-using MediaBrowser.Model.IO;
-using SystemEvents = Emby.Server.Implementations.SystemEvents;
-
-namespace MediaBrowser.ServerApplication
-{
- public class MainStartup
- {
- private static IServerApplicationPaths _appPaths;
- private static ILogManager _logManager;
-
- private static ILogger _logger;
-
- public static bool IsRunningAsService = false;
-
- [DllImport("kernel32.dll", SetLastError = true)]
- static extern bool SetDllDirectory(string lpPathName);
-
- public static string ApplicationPath;
-
- private static IFileSystem FileSystem;
- private static bool _restartOnShutdown;
-
- /// <summary>
- /// Defines the entry point of the application.
- /// </summary>
- [STAThread]
- public static void Main()
- {
- var options = new StartupOptions(Environment.GetCommandLineArgs());
- IsRunningAsService = options.ContainsOption("-service");
-
- var currentProcess = Process.GetCurrentProcess();
-
- ApplicationPath = currentProcess.MainModule.FileName;
- var architecturePath = Path.Combine(Path.GetDirectoryName(ApplicationPath), Environment.Is64BitProcess ? "x64" : "x86");
-
- var success = SetDllDirectory(architecturePath);
-
- SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
-
- var appPaths = CreateApplicationPaths(ApplicationPath, IsRunningAsService);
- _appPaths = appPaths;
-
- using (var logManager = new SimpleLogManager(appPaths.LogDirectoryPath, "server"))
- {
- _logManager = logManager;
-
- logManager.ReloadLogger(LogSeverity.Debug);
- logManager.AddConsoleOutput();
-
- var logger = _logger = logManager.GetLogger("Main");
-
- ApplicationHost.LogEnvironmentInfo(logger, appPaths, true);
-
- // Uninstall directly
- if (options.ContainsOption("-uninstallservice"))
- {
- logger.Info("Performing service uninstallation");
- UninstallService(ApplicationPath, logger);
- return;
- }
-
- // Restart with admin rights, then uninstall
- if (options.ContainsOption("-uninstallserviceasadmin"))
- {
- logger.Info("Performing service uninstallation");
- RunServiceUninstallation(ApplicationPath);
- return;
- }
-
- AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
-
- if (IsAlreadyRunning(ApplicationPath, currentProcess))
- {
- logger.Info("Shutting down because another instance of Emby Server is already running.");
- return;
- }
-
- if (PerformUpdateIfNeeded(appPaths, logger))
- {
- logger.Info("Exiting to perform application update.");
- return;
- }
-
- RunApplication(appPaths, logManager, IsRunningAsService, options);
-
- logger.Info("Shutdown complete");
-
- if (_restartOnShutdown)
- {
- logger.Info("Starting new server process");
- var restartCommandLine = GetRestartCommandLine();
-
- Process.Start(restartCommandLine.Item1, restartCommandLine.Item2);
- }
- }
- }
-
- public static Tuple<string, string> GetRestartCommandLine()
- {
- var currentProcess = Process.GetCurrentProcess();
- var processModulePath = currentProcess.MainModule.FileName;
-
- return new Tuple<string, string>(processModulePath, Environment.CommandLine);
- }
-
- private static bool IsServiceInstalled()
- {
- try
- {
- var serviceName = BackgroundService.GetExistingServiceName();
- var ctl = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == serviceName);
-
- return ctl != null;
- }
- catch
- {
- return false;
- }
- }
-
- /// <summary>
- /// Determines whether [is already running] [the specified current process].
- /// </summary>
- /// <param name="applicationPath">The application path.</param>
- /// <param name="currentProcess">The current process.</param>
- /// <returns><c>true</c> if [is already running] [the specified current process]; otherwise, <c>false</c>.</returns>
- private static bool IsAlreadyRunning(string applicationPath, Process currentProcess)
- {
- var duplicate = Process.GetProcesses().FirstOrDefault(i =>
- {
- try
- {
- if (currentProcess.Id == i.Id)
- {
- return false;
- }
- }
- catch (Exception)
- {
- return false;
- }
-
- try
- {
- //_logger.Info("Module: {0}", i.MainModule.FileName);
- if (string.Equals(applicationPath, i.MainModule.FileName, StringComparison.OrdinalIgnoreCase))
- {
- return true;
- }
- return false;
- }
- catch (Exception)
- {
- return false;
- }
- });
-
- if (duplicate != null)
- {
- _logger.Info("Found a duplicate process. Giving it time to exit.");
-
- if (!duplicate.WaitForExit(40000))
- {
- _logger.Info("The duplicate process did not exit.");
- return true;
- }
- }
-
- if (!IsRunningAsService)
- {
- return IsAlreadyRunningAsService(applicationPath);
- }
-
- return false;
- }
-
- private static bool IsAlreadyRunningAsService(string applicationPath)
- {
- try
- {
- var serviceName = BackgroundService.GetExistingServiceName();
-
- WqlObjectQuery wqlObjectQuery = new WqlObjectQuery(string.Format("SELECT * FROM Win32_Service WHERE State = 'Running' AND Name = '{0}'", serviceName));
- ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(wqlObjectQuery);
- ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();
-
- foreach (ManagementObject managementObject in managementObjectCollection)
- {
- var obj = managementObject.GetPropertyValue("PathName");
- if (obj == null)
- {
- continue;
- }
- var path = obj.ToString();
-
- _logger.Info("Service path: {0}", path);
- // Need to use indexOf instead of equality because the path will have the full service command line
- if (path.IndexOf(applicationPath, StringComparison.OrdinalIgnoreCase) != -1)
- {
- _logger.Info("The windows service is already running");
- MessageBox.Show("Emby Server is already running as a Windows Service. Only one instance is allowed at a time. To run as a tray icon, shut down the Windows Service.");
- return true;
- }
- }
- }
- catch (COMException)
- {
- // Catch errors thrown due to WMI not being initialized
- }
-
- return false;
- }
-
- /// <summary>
- /// Creates the application paths.
- /// </summary>
- /// <param name="applicationPath">The application path.</param>
- /// <param name="runAsService">if set to <c>true</c> [run as service].</param>
- /// <returns>ServerApplicationPaths.</returns>
- private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, bool runAsService)
- {
- var appFolderPath = Path.GetDirectoryName(applicationPath);
-
- var resourcesPath = Path.GetDirectoryName(applicationPath);
-
- if (runAsService && IsServiceInstalled())
- {
- var systemPath = Path.GetDirectoryName(applicationPath);
-
- var programDataPath = Path.GetDirectoryName(systemPath);
-
- return new ServerApplicationPaths(programDataPath, appFolderPath, resourcesPath);
- }
-
- return new ServerApplicationPaths(ApplicationPathHelper.GetProgramDataPath(applicationPath), appFolderPath, resourcesPath);
- }
-
- /// <summary>
- /// Gets a value indicating whether this instance can self restart.
- /// </summary>
- /// <value><c>true</c> if this instance can self restart; otherwise, <c>false</c>.</value>
- public static bool CanSelfRestart
- {
- get
- {
- if (IsRunningAsService)
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- }
-
- /// <summary>
- /// Gets a value indicating whether this instance can self update.
- /// </summary>
- /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value>
- public static bool CanSelfUpdate
- {
- get
- {
-#if DEBUG
- return false;
-#endif
-
- if (IsRunningAsService)
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- }
-
- private static string UpdatePackageFileName
- {
- get
- {
- if (Environment.Is64BitOperatingSystem)
- {
- return "embyserver-win-x64-{version}.zip";
- }
-
- return "embyserver-win-x86-{version}.zip";
- }
- }
-
- /// <summary>
- /// Runs the application.
- /// </summary>
- /// <param name="appPaths">The app paths.</param>
- /// <param name="logManager">The log manager.</param>
- /// <param name="runService">if set to <c>true</c> [run service].</param>
- /// <param name="options">The options.</param>
- private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options)
- {
- var environmentInfo = new EnvironmentInfo();
-
- var fileSystem = new ManagedFileSystem(logManager.GetLogger("FileSystem"), environmentInfo, appPaths.TempDirectory);
-
- FileSystem = fileSystem;
-
- using (var appHost = new WindowsAppHost(appPaths,
- logManager,
- options,
- fileSystem,
- new PowerManagement(),
- UpdatePackageFileName,
- environmentInfo,
- new NullImageEncoder(),
- new SystemEvents(logManager.GetLogger("SystemEvents")),
- new Networking.NetworkManager(logManager.GetLogger("NetworkManager"))))
- {
- var initProgress = new Progress<double>();
-
- if (!runService)
- {
- if (!options.ContainsOption("-nosplash")) ShowSplashScreen(appHost.ApplicationVersion, initProgress, logManager.GetLogger("Splash"));
-
- // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes
- SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT |
- ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
- }
-
- var task = appHost.Init(initProgress);
- Task.WaitAll(task);
-
- if (!runService)
- {
- task = InstallVcredist2013IfNeeded(appHost.HttpClient, _logger);
- Task.WaitAll(task);
-
- // needed by skia
- task = InstallVcredist2015IfNeeded(appHost.HttpClient, _logger);
- Task.WaitAll(task);
- }
-
- // set image encoder here
- appHost.ImageProcessor.ImageEncoder = ImageEncoderHelper.GetImageEncoder(_logger, logManager, fileSystem, options, () => appHost.HttpClient, appPaths, appHost.LocalizationManager);
-
- task = task.ContinueWith(new Action<Task>(a => appHost.RunStartupTasks()), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent);
-
- if (runService && IsServiceInstalled())
- {
- StartService(logManager);
- }
- else
- {
- Task.WaitAll(task);
-
- HideSplashScreen();
-
- ShowTrayIcon(appHost);
- }
- }
- }
-
- private static ServerNotifyIcon _serverNotifyIcon;
- private static TaskScheduler _mainTaskScheduler;
- private static void ShowTrayIcon(ApplicationHost appHost)
- {
- //Application.EnableVisualStyles();
- //Application.SetCompatibleTextRenderingDefault(false);
- _serverNotifyIcon = new ServerNotifyIcon(appHost.LogManager, appHost, appHost.ServerConfigurationManager, appHost.LocalizationManager);
- _mainTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
- Application.Run();
- }
-
- internal static SplashForm _splash;
- private static Thread _splashThread;
- private static void ShowSplashScreen(Version appVersion, Progress<double> progress, ILogger logger)
- {
- var thread = new Thread(() =>
- {
- _splash = new SplashForm(appVersion, progress);
-
- _splash.ShowDialog();
- });
-
- thread.SetApartmentState(ApartmentState.STA);
- thread.IsBackground = true;
- thread.Start();
-
- _splashThread = thread;
- }
-
- private static void HideSplashScreen()
- {
- if (_splash != null)
- {
- Action act = () =>
- {
- _splash.Close();
- _splashThread = null;
- };
-
- _splash.Invoke(act);
- }
- }
-
- public static void Invoke(Action action)
- {
- if (IsRunningAsService)
- {
- action();
- }
- else
- {
- Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, _mainTaskScheduler ?? TaskScheduler.Current);
- }
- }
-
- /// <summary>
- /// Starts the service.
- /// </summary>
- private static void StartService(ILogManager logManager)
- {
- var service = new BackgroundService(logManager.GetLogger("Service"));
-
- ServiceBase.Run(service);
- }
-
- /// <summary>
- /// Uninstalls the service.
- /// </summary>
- private static void UninstallService(string applicationPath, ILogger logger)
- {
- try
- {
- ManagedInstallerClass.InstallHelper(new[] { "/u", applicationPath });
-
- logger.Info("Service uninstallation succeeded");
- }
- catch (Exception ex)
- {
- logger.ErrorException("Uninstall failed", ex);
- }
- }
-
- /// <summary>
- /// Runs the service uninstallation.
- /// </summary>
- private static void RunServiceUninstallation(string applicationPath)
- {
- var startInfo = new ProcessStartInfo
- {
- FileName = applicationPath,
-
- Arguments = "-uninstallservice",
-
- CreateNoWindow = true,
- WindowStyle = ProcessWindowStyle.Hidden,
- Verb = "runas",
- ErrorDialog = false
- };
-
- using (var process = Process.Start(startInfo))
- {
- process.WaitForExit();
- }
- }
-
- /// <summary>
- /// Handles the UnhandledException event of the CurrentDomain control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
- static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- var exception = (Exception)e.ExceptionObject;
-
- new UnhandledExceptionWriter(_appPaths, _logger, _logManager, FileSystem, new ConsoleLogger()).Log(exception);
-
- if (!IsRunningAsService)
- {
- MessageBox.Show("Unhandled exception: " + exception.Message);
- }
-
- if (!Debugger.IsAttached)
- {
- Environment.Exit(Marshal.GetHRForException(exception));
- }
- }
-
- /// <summary>
- /// Performs the update if needed.
- /// </summary>
- /// <param name="appPaths">The app paths.</param>
- /// <param name="logger">The logger.</param>
- /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
- private static bool PerformUpdateIfNeeded(ServerApplicationPaths appPaths, ILogger logger)
- {
- // Not supported
- if (IsRunningAsService)
- {
- return false;
- }
-
- // Look for the existence of an update archive
- var updateArchive = Path.Combine(appPaths.TempUpdatePath, "MBServer" + ".zip");
- if (File.Exists(updateArchive))
- {
- logger.Info("An update is available from {0}", updateArchive);
-
- // Update is there - execute update
- try
- {
- var serviceName = IsRunningAsService ? BackgroundService.GetExistingServiceName() : string.Empty;
- new ApplicationUpdater().UpdateApplication(appPaths, updateArchive, logger, serviceName);
-
- // And just let the app exit so it can update
- return true;
- }
- catch (Exception e)
- {
- logger.ErrorException("Error starting updater.", e);
-
- MessageBox.Show(string.Format("Error attempting to update application.\n\n{0}\n\n{1}", e.GetType().Name, e.Message));
- }
- }
-
- return false;
- }
-
- public static void Shutdown()
- {
- if (IsRunningAsService && IsServiceInstalled())
- {
- ShutdownWindowsService();
- }
- else
- {
- ShutdownWindowsApplication();
- }
- }
-
- public static void Restart()
- {
- if (IsRunningAsService)
- {
- }
- else
- {
- _restartOnShutdown = true;
- ShutdownWindowsApplication();
- }
- }
-
- private static void ShutdownWindowsApplication()
- {
- if (_serverNotifyIcon != null)
- {
- _serverNotifyIcon.Dispose();
- _serverNotifyIcon = null;
- }
-
- _logger.Info("Calling Application.Exit");
- Application.Exit();
- }
-
- private static void ShutdownWindowsService()
- {
- _logger.Info("Stopping background service");
- var service = new ServiceController(BackgroundService.GetExistingServiceName());
-
- service.Refresh();
-
- if (service.Status == ServiceControllerStatus.Running)
- {
- service.Stop();
- }
- }
-
- private static async Task InstallVcredist2013IfNeeded(IHttpClient httpClient, ILogger logger)
- {
- // Reference
- // http://stackoverflow.com/questions/12206314/detect-if-visual-c-redistributable-for-visual-studio-2012-is-installed
-
- try
- {
- var subkey = Environment.Is64BitProcess
- ? "SOFTWARE\\WOW6432Node\\Microsoft\\VisualStudio\\12.0\\VC\\Runtimes\\x64"
- : "SOFTWARE\\Microsoft\\VisualStudio\\12.0\\VC\\Runtimes\\x86";
-
- using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)
- .OpenSubKey(subkey))
- {
- if (ndpKey != null && ndpKey.GetValue("Version") != null)
- {
- var installedVersion = ((string)ndpKey.GetValue("Version")).TrimStart('v');
- if (installedVersion.StartsWith("12", StringComparison.OrdinalIgnoreCase))
- {
- return;
- }
- }
- }
- }
- catch (Exception ex)
- {
- logger.ErrorException("Error getting .NET Framework version", ex);
- return;
- }
-
- try
- {
- await InstallVcredist(GetVcredist2013Url(), httpClient).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- logger.ErrorException("Error installing Visual Studio C++ runtime", ex);
- }
- }
-
- private static string GetVcredist2013Url()
- {
- if (Environment.Is64BitProcess)
- {
- return "https://github.com/MediaBrowser/Emby.Resources/raw/master/vcredist2013/vcredist_x64.exe";
- }
-
- // TODO: ARM url - https://github.com/MediaBrowser/Emby.Resources/raw/master/vcredist2013/vcredist_arm.exe
-
- return "https://github.com/MediaBrowser/Emby.Resources/raw/master/vcredist2013/vcredist_x86.exe";
- }
-
- private static async Task InstallVcredist2015IfNeeded(IHttpClient httpClient, ILogger logger)
- {
- // Reference
- // http://stackoverflow.com/questions/12206314/detect-if-visual-c-redistributable-for-visual-studio-2012-is-installed
-
- try
- {
- RegistryKey key;
-
- if (Environment.Is64BitProcess)
- {
- key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)
- .OpenSubKey("SOFTWARE\\Classes\\Installer\\Dependencies\\{d992c12e-cab2-426f-bde3-fb8c53950b0d}");
-
- if (key == null)
- {
- key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)
- .OpenSubKey("SOFTWARE\\WOW6432Node\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x64");
- }
- }
- else
- {
- key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)
- .OpenSubKey("SOFTWARE\\Classes\\Installer\\Dependencies\\{e2803110-78b3-4664-a479-3611a381656a}");
-
- if (key == null)
- {
- key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)
- .OpenSubKey("SOFTWARE\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x86");
- }
- }
-
- if (key != null)
- {
- using (key)
- {
- var version = key.GetValue("Version");
- if (version != null)
- {
- var installedVersion = ((string)version).TrimStart('v');
- if (installedVersion.StartsWith("14", StringComparison.OrdinalIgnoreCase))
- {
- return;
- }
- }
- }
- }
- }
- catch (Exception ex)
- {
- logger.ErrorException("Error getting .NET Framework version", ex);
- return;
- }
-
- try
- {
- await InstallVcredist(GetVcredist2015Url(), httpClient).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- logger.ErrorException("Error installing Visual Studio C++ runtime", ex);
- }
- }
-
- private static string GetVcredist2015Url()
- {
- if (Environment.Is64BitProcess)
- {
- return "https://github.com/MediaBrowser/Emby.Resources/raw/master/vcredist2015/vc_redist.x64.exe";
- }
-
- // TODO: ARM url - https://github.com/MediaBrowser/Emby.Resources/raw/master/vcredist2015/vcredist_arm.exe
-
- return "https://github.com/MediaBrowser/Emby.Resources/raw/master/vcredist2015/vc_redist.x86.exe";
- }
-
- private async static Task InstallVcredist(string url, IHttpClient httpClient)
- {
- var tmp = await httpClient.GetTempFile(new HttpRequestOptions
- {
- Url = url,
- Progress = new Progress<double>()
-
- }).ConfigureAwait(false);
-
- var exePath = Path.ChangeExtension(tmp, ".exe");
- File.Copy(tmp, exePath);
-
- var startInfo = new ProcessStartInfo
- {
- FileName = exePath,
-
- CreateNoWindow = true,
- WindowStyle = ProcessWindowStyle.Hidden,
- Verb = "runas",
- ErrorDialog = false
- };
-
- _logger.Info("Running {0}", startInfo.FileName);
-
- using (var process = Process.Start(startInfo))
- {
- process.WaitForExit();
- }
- }
-
- /// <summary>
- /// Sets the error mode.
- /// </summary>
- /// <param name="uMode">The u mode.</param>
- /// <returns>ErrorModes.</returns>
- [DllImport("kernel32.dll")]
- static extern ErrorModes SetErrorMode(ErrorModes uMode);
-
- /// <summary>
- /// Enum ErrorModes
- /// </summary>
- [Flags]
- public enum ErrorModes : uint
- {
- /// <summary>
- /// The SYSTE m_ DEFAULT
- /// </summary>
- SYSTEM_DEFAULT = 0x0,
- /// <summary>
- /// The SE m_ FAILCRITICALERRORS
- /// </summary>
- SEM_FAILCRITICALERRORS = 0x0001,
- /// <summary>
- /// The SE m_ NOALIGNMENTFAULTEXCEPT
- /// </summary>
- SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
- /// <summary>
- /// The SE m_ NOGPFAULTERRORBOX
- /// </summary>
- SEM_NOGPFAULTERRORBOX = 0x0002,
- /// <summary>
- /// The SE m_ NOOPENFILEERRORBOX
- /// </summary>
- SEM_NOOPENFILEERRORBOX = 0x8000
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
deleted file mode 100644
index f479db46f..000000000
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ /dev/null
@@ -1,279 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProjectGuid>{94ADE4D3-B7EC-45CD-A200-CC469433072B}</ProjectGuid>
- <OutputType>WinExe</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>MediaBrowser.ServerApplication</RootNamespace>
- <AssemblyName>MediaBrowser.ServerApplication</AssemblyName>
- <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
- <TargetFrameworkProfile />
- <NuGetPackageImportStamp>
- </NuGetPackageImportStamp>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <PlatformTarget>AnyCPU</PlatformTarget>
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <Prefer32Bit>false</Prefer32Bit>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <PlatformTarget>AnyCPU</PlatformTarget>
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <Prefer32Bit>false</Prefer32Bit>
- </PropertyGroup>
- <PropertyGroup>
- <StartupObject>MediaBrowser.ServerApplication.MainStartup</StartupObject>
- </PropertyGroup>
- <PropertyGroup>
- <ApplicationIcon>Icon.ico</ApplicationIcon>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
- <DebugSymbols>true</DebugSymbols>
- <OutputPath>bin\x86\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <DebugType>full</DebugType>
- <PlatformTarget>x86</PlatformTarget>
- <ErrorReport>prompt</ErrorReport>
- <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
- <Prefer32Bit>true</Prefer32Bit>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
- <OutputPath>bin\x86\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <Optimize>true</Optimize>
- <DebugType>none</DebugType>
- <PlatformTarget>x86</PlatformTarget>
- <ErrorReport>prompt</ErrorReport>
- <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
- <Prefer32Bit>true</Prefer32Bit>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="Emby.Server.CinemaMode">
- <HintPath>..\ThirdParty\emby\Emby.Server.CinemaMode.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.Connect">
- <HintPath>..\ThirdParty\emby\Emby.Server.Connect.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.Sync">
- <HintPath>..\ThirdParty\emby\Emby.Server.Sync.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
- <Private>True</Private>
- </Reference>
- <Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
- <HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath>
- </Reference>
- <Reference Include="SimpleInjector, Version=4.0.12.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.4.0.12\lib\net45\SimpleInjector.dll</HintPath>
- </Reference>
- <Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
- <HintPath>..\packages\SkiaSharp.1.58.1\lib\net45\SkiaSharp.dll</HintPath>
- </Reference>
- <Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
- <HintPath>..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath>
- </Reference>
- <Reference Include="SQLitePCLRaw.provider.sqlite3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=62684c7b4f184e3f, processorArchitecture=MSIL">
- <HintPath>..\packages\SQLitePCLRaw.provider.sqlite3.net45.1.1.8\lib\net45\SQLitePCLRaw.provider.sqlite3.dll</HintPath>
- </Reference>
- <Reference Include="System" />
- <Reference Include="System.Configuration" />
- <Reference Include="System.Configuration.Install" />
- <Reference Include="System.Core" />
- <Reference Include="System.Drawing" />
- <Reference Include="System.IO.Compression" />
- <Reference Include="System.Management" />
- <Reference Include="System.Runtime.Serialization" />
- <Reference Include="System.ServiceProcess" />
- <Reference Include="System.Windows.Forms" />
- <Reference Include="System.Xml.Linq" />
- <Reference Include="System.Data.DataSetExtensions" />
- <Reference Include="Microsoft.CSharp" />
- <Reference Include="System.Data" />
- <Reference Include="System.Xml" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="..\SharedVersion.cs">
- <Link>Properties\SharedVersion.cs</Link>
- </Compile>
- <Compile Include="ApplicationPathHelper.cs" />
- <Compile Include="BackgroundService.cs">
- <SubType>Component</SubType>
- </Compile>
- <Compile Include="BackgroundServiceInstaller.cs">
- <SubType>Component</SubType>
- </Compile>
- <Compile Include="ImageEncoderHelper.cs" />
- <Compile Include="MainStartup.cs" />
- <Compile Include="Native\LnkShortcutHandler.cs" />
- <Compile Include="Native\LoopUtil.cs" />
- <Compile Include="Native\PowerManagement.cs" />
- <Compile Include="Native\Standby.cs" />
- <Compile Include="Native\ServerAuthorization.cs" />
- <Compile Include="Networking\NativeMethods.cs" />
- <Compile Include="Networking\NetworkManager.cs" />
- <Compile Include="Networking\NetworkShares.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- <Compile Include="Properties\Resources.Designer.cs">
- <AutoGen>True</AutoGen>
- <DesignTime>True</DesignTime>
- <DependentUpon>Resources.resx</DependentUpon>
- </Compile>
- <Compile Include="ServerNotifyIcon.cs" />
- <Compile Include="Splash\SplashForm.cs">
- <SubType>Form</SubType>
- </Compile>
- <Compile Include="Splash\SplashForm.Designer.cs">
- <DependentUpon>SplashForm.cs</DependentUpon>
- </Compile>
- <Compile Include="Updates\ApplicationUpdater.cs" />
- <Compile Include="WindowsAppHost.cs" />
- </ItemGroup>
- <ItemGroup>
- <None Include="App.config" />
- <None Include="app.manifest" />
- <EmbeddedResource Include="Native\RegisterServer.bat" />
- <None Include="packages.config" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Properties\Resources.resx">
- <Generator>ResXFileCodeGenerator</Generator>
- <LastGenOutput>Resources.Designer.cs</LastGenOutput>
- </EmbeddedResource>
- <EmbeddedResource Include="Splash\SplashForm.resx">
- <DependentUpon>SplashForm.cs</DependentUpon>
- </EmbeddedResource>
- </ItemGroup>
- <ItemGroup>
- <Content Include="..\packages\SkiaSharp.1.58.1\runtimes\win7-x64\native\libSkiaSharp.dll">
- <Link>x64\libSkiaSharp.dll</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\packages\SkiaSharp.1.58.1\runtimes\win7-x86\native\libSkiaSharp.dll">
- <Link>x86\libSkiaSharp.dll</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\Tools\Installation\MediaBrowser.InstallUtil.dll">
- <Link>MediaBrowser.InstallUtil.dll</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\Tools\Installation\MediaBrowser.Uninstaller.exe">
- <Link>MediaBrowser.Uninstaller.exe</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\Tools\Installation\MediaBrowser.Updater.exe">
- <Link>MediaBrowser.Updater.exe</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="x64\sqlite3.dll">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <EmbeddedResource Include="Icon.ico" />
- <Content Include="Resources\Images\mb3logo800.png" />
- <Content Include="x86\sqlite3.dll">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\BDInfo\BDInfo.csproj">
- <Project>{88ae38df-19d7-406f-a6a9-09527719a21e}</Project>
- <Name>BDInfo</Name>
- </ProjectReference>
- <ProjectReference Include="..\DvdLib\DvdLib.csproj">
- <Project>{713f42b5-878e-499d-a878-e4c652b1d5e8}</Project>
- <Name>DvdLib</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Dlna\Emby.Dlna.csproj">
- <Project>{805844ab-e92f-45e6-9d99-4f6d48d129a5}</Project>
- <Name>Emby.Dlna</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Drawing.Skia\Emby.Drawing.Skia.csproj">
- <Project>{2312da6d-ff86-4597-9777-bceec32d96dd}</Project>
- <Name>Emby.Drawing.Skia</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj">
- <Project>{08fff49b-f175-4807-a2b5-73b0ebd9f716}</Project>
- <Name>Emby.Drawing</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Photos\Emby.Photos.csproj">
- <Project>{89ab4548-770d-41fd-a891-8daff44f452c}</Project>
- <Name>Emby.Photos</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj">
- <Project>{e383961b-9356-4d5d-8233-9a1079d03055}</Project>
- <Name>Emby.Server.Implementations</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Api\MediaBrowser.Api.csproj">
- <Project>{4fd51ac5-2c16-4308-a993-c3a84f3b4582}</Project>
- <Name>MediaBrowser.Api</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
- <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
- <Name>MediaBrowser.Common</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
- <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
- <Name>MediaBrowser.Controller</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj">
- <Project>{7ef9f3e0-697d-42f3-a08f-19deb5f84392}</Project>
- <Name>MediaBrowser.LocalMetadata</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
- <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
- <Name>MediaBrowser.Model</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Providers\MediaBrowser.Providers.csproj">
- <Project>{442b5058-dcaf-4263-bb6a-f21e31120a1b}</Project>
- <Name>MediaBrowser.Providers</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj">
- <Project>{5624b7b5-b5a7-41d8-9f10-cc5611109619}</Project>
- <Name>MediaBrowser.WebDashboard</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj">
- <Project>{23499896-b135-4527-8574-c26e926ea99e}</Project>
- <Name>MediaBrowser.XbmcMetadata</Name>
- </ProjectReference>
- <ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
- <Project>{cb7f2326-6497-4a3d-ba03-48513b17a7be}</Project>
- <Name>Mono.Nat</Name>
- </ProjectReference>
- <ProjectReference Include="..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj">
- <Project>{4a4402d4-e910-443b-b8fc-2c18286a2ca0}</Project>
- <Name>OpenSubtitlesHandler</Name>
- </ProjectReference>
- <ProjectReference Include="..\RSSDP\RSSDP.csproj">
- <Project>{21002819-c39a-4d3e-be83-2a276a77fb1f}</Project>
- <Name>RSSDP</Name>
- </ProjectReference>
- </ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <PropertyGroup>
- <PostBuildEvent>
- </PostBuildEvent>
- </PropertyGroup>
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
- <Target Name="BeforeBuild">
- </Target>
- <Target Name="AfterBuild">
- </Target>
- -->
-</Project> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs b/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs
deleted file mode 100644
index e53a79670..000000000
--- a/MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs
+++ /dev/null
@@ -1,332 +0,0 @@
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Runtime.InteropServices.ComTypes;
-using System.Text;
-using MediaBrowser.Model.IO;
-
-namespace MediaBrowser.ServerApplication.Native
-{
- public class LnkShortcutHandler :IShortcutHandler
- {
- public string Extension
- {
- get { return ".lnk"; }
- }
-
- public string Resolve(string shortcutPath)
- {
- var link = new ShellLink();
- ((IPersistFile)link).Load(shortcutPath, NativeMethods.STGM_READ);
- // ((IShellLinkW)link).Resolve(hwnd, 0)
- var sb = new StringBuilder(NativeMethods.MAX_PATH);
- WIN32_FIND_DATA data;
- ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0);
- return sb.ToString();
- }
-
- public void Create(string shortcutPath, string targetPath)
- {
- throw new NotImplementedException();
- }
- }
-
- /// <summary>
- /// Class NativeMethods
- /// </summary>
- public static class NativeMethods
- {
- /// <summary>
- /// The MA x_ PATH
- /// </summary>
- public const int MAX_PATH = 260;
- /// <summary>
- /// The MA x_ ALTERNATE
- /// </summary>
- public const int MAX_ALTERNATE = 14;
- /// <summary>
- /// The INVALI d_ HANDL e_ VALUE
- /// </summary>
- public static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
- /// <summary>
- /// The STG m_ READ
- /// </summary>
- public const int STGM_READ = 0;
- }
-
- /// <summary>
- /// Struct FILETIME
- /// </summary>
- [StructLayout(LayoutKind.Sequential)]
- public struct FILETIME
- {
- /// <summary>
- /// The dw low date time
- /// </summary>
- public uint dwLowDateTime;
- /// <summary>
- /// The dw high date time
- /// </summary>
- public uint dwHighDateTime;
- }
-
- /// <summary>
- /// Struct WIN32_FIND_DATA
- /// </summary>
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
- public struct WIN32_FIND_DATA
- {
- /// <summary>
- /// The dw file attributes
- /// </summary>
- public FileAttributes dwFileAttributes;
- /// <summary>
- /// The ft creation time
- /// </summary>
- public FILETIME ftCreationTime;
- /// <summary>
- /// The ft last access time
- /// </summary>
- public FILETIME ftLastAccessTime;
- /// <summary>
- /// The ft last write time
- /// </summary>
- public FILETIME ftLastWriteTime;
- /// <summary>
- /// The n file size high
- /// </summary>
- public int nFileSizeHigh;
- /// <summary>
- /// The n file size low
- /// </summary>
- public int nFileSizeLow;
- /// <summary>
- /// The dw reserved0
- /// </summary>
- public int dwReserved0;
- /// <summary>
- /// The dw reserved1
- /// </summary>
- public int dwReserved1;
-
- /// <summary>
- /// The c file name
- /// </summary>
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.MAX_PATH)]
- public string cFileName;
-
- /// <summary>
- /// This will always be null when FINDEX_INFO_LEVELS = basic
- /// </summary>
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.MAX_ALTERNATE)]
- public string cAlternate;
-
- /// <summary>
- /// Gets or sets the path.
- /// </summary>
- /// <value>The path.</value>
- public string Path { get; set; }
-
- /// <summary>
- /// Returns a <see cref="System.String" /> that represents this instance.
- /// </summary>
- /// <returns>A <see cref="System.String" /> that represents this instance.</returns>
- public override string ToString()
- {
- return Path ?? string.Empty;
- }
- }
-
- /// <summary>
- /// Enum SLGP_FLAGS
- /// </summary>
- [Flags]
- public enum SLGP_FLAGS
- {
- /// <summary>
- /// Retrieves the standard short (8.3 format) file name
- /// </summary>
- SLGP_SHORTPATH = 0x1,
- /// <summary>
- /// Retrieves the Universal Naming Convention (UNC) path name of the file
- /// </summary>
- SLGP_UNCPRIORITY = 0x2,
- /// <summary>
- /// Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded
- /// </summary>
- SLGP_RAWPATH = 0x4
- }
- /// <summary>
- /// Enum SLR_FLAGS
- /// </summary>
- [Flags]
- public enum SLR_FLAGS
- {
- /// <summary>
- /// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set,
- /// the high-order word of fFlags can be set to a time-out value that specifies the
- /// maximum amount of time to be spent resolving the link. The function returns if the
- /// link cannot be resolved within the time-out duration. If the high-order word is set
- /// to zero, the time-out duration will be set to the default value of 3,000 milliseconds
- /// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out
- /// duration, in milliseconds.
- /// </summary>
- SLR_NO_UI = 0x1,
- /// <summary>
- /// Obsolete and no longer used
- /// </summary>
- SLR_ANY_MATCH = 0x2,
- /// <summary>
- /// If the link object has changed, update its path and list of identifiers.
- /// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine
- /// whether or not the link object has changed.
- /// </summary>
- SLR_UPDATE = 0x4,
- /// <summary>
- /// Do not update the link information
- /// </summary>
- SLR_NOUPDATE = 0x8,
- /// <summary>
- /// Do not execute the search heuristics
- /// </summary>
- SLR_NOSEARCH = 0x10,
- /// <summary>
- /// Do not use distributed link tracking
- /// </summary>
- SLR_NOTRACK = 0x20,
- /// <summary>
- /// Disable distributed link tracking. By default, distributed link tracking tracks
- /// removable media across multiple devices based on the volume name. It also uses the
- /// Universal Naming Convention (UNC) path to track remote file systems whose drive letter
- /// has changed. Setting SLR_NOLINKINFO disables both types of tracking.
- /// </summary>
- SLR_NOLINKINFO = 0x40,
- /// <summary>
- /// Call the Microsoft Windows Installer
- /// </summary>
- SLR_INVOKE_MSI = 0x80
- }
-
- /// <summary>
- /// The IShellLink interface allows Shell links to be created, modified, and resolved
- /// </summary>
- [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")]
- public interface IShellLinkW
- {
- /// <summary>
- /// Retrieves the path and file name of a Shell link object
- /// </summary>
- /// <param name="pszFile">The PSZ file.</param>
- /// <param name="cchMaxPath">The CCH max path.</param>
- /// <param name="pfd">The PFD.</param>
- /// <param name="fFlags">The f flags.</param>
- void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out WIN32_FIND_DATA pfd, SLGP_FLAGS fFlags);
- /// <summary>
- /// Retrieves the list of item identifiers for a Shell link object
- /// </summary>
- /// <param name="ppidl">The ppidl.</param>
- void GetIDList(out IntPtr ppidl);
- /// <summary>
- /// Sets the pointer to an item identifier list (PIDL) for a Shell link object.
- /// </summary>
- /// <param name="pidl">The pidl.</param>
- void SetIDList(IntPtr pidl);
- /// <summary>
- /// Retrieves the description string for a Shell link object
- /// </summary>
- /// <param name="pszName">Name of the PSZ.</param>
- /// <param name="cchMaxName">Name of the CCH max.</param>
- void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
- /// <summary>
- /// Sets the description for a Shell link object. The description can be any application-defined string
- /// </summary>
- /// <param name="pszName">Name of the PSZ.</param>
- void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
- /// <summary>
- /// Retrieves the name of the working directory for a Shell link object
- /// </summary>
- /// <param name="pszDir">The PSZ dir.</param>
- /// <param name="cchMaxPath">The CCH max path.</param>
- void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
- /// <summary>
- /// Sets the name of the working directory for a Shell link object
- /// </summary>
- /// <param name="pszDir">The PSZ dir.</param>
- void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
- /// <summary>
- /// Retrieves the command-line arguments associated with a Shell link object
- /// </summary>
- /// <param name="pszArgs">The PSZ args.</param>
- /// <param name="cchMaxPath">The CCH max path.</param>
- void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
- /// <summary>
- /// Sets the command-line arguments for a Shell link object
- /// </summary>
- /// <param name="pszArgs">The PSZ args.</param>
- void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
- /// <summary>
- /// Retrieves the hot key for a Shell link object
- /// </summary>
- /// <param name="pwHotkey">The pw hotkey.</param>
- void GetHotkey(out short pwHotkey);
- /// <summary>
- /// Sets a hot key for a Shell link object
- /// </summary>
- /// <param name="wHotkey">The w hotkey.</param>
- void SetHotkey(short wHotkey);
- /// <summary>
- /// Retrieves the show command for a Shell link object
- /// </summary>
- /// <param name="piShowCmd">The pi show CMD.</param>
- void GetShowCmd(out int piShowCmd);
- /// <summary>
- /// Sets the show command for a Shell link object. The show command sets the initial show state of the window.
- /// </summary>
- /// <param name="iShowCmd">The i show CMD.</param>
- void SetShowCmd(int iShowCmd);
- /// <summary>
- /// Retrieves the location (path and index) of the icon for a Shell link object
- /// </summary>
- /// <param name="pszIconPath">The PSZ icon path.</param>
- /// <param name="cchIconPath">The CCH icon path.</param>
- /// <param name="piIcon">The pi icon.</param>
- void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
- int cchIconPath, out int piIcon);
- /// <summary>
- /// Sets the location (path and index) of the icon for a Shell link object
- /// </summary>
- /// <param name="pszIconPath">The PSZ icon path.</param>
- /// <param name="iIcon">The i icon.</param>
- void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
- /// <summary>
- /// Sets the relative path to the Shell link object
- /// </summary>
- /// <param name="pszPathRel">The PSZ path rel.</param>
- /// <param name="dwReserved">The dw reserved.</param>
- void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
- /// <summary>
- /// Attempts to find the target of a Shell link, even if it has been moved or renamed
- /// </summary>
- /// <param name="hwnd">The HWND.</param>
- /// <param name="fFlags">The f flags.</param>
- void Resolve(IntPtr hwnd, SLR_FLAGS fFlags);
- /// <summary>
- /// Sets the path and file name of a Shell link object
- /// </summary>
- /// <param name="pszFile">The PSZ file.</param>
- void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
-
- }
-
- // CLSID_ShellLink from ShlGuid.h
- /// <summary>
- /// Class ShellLink
- /// </summary>
- [
- ComImport,
- Guid("00021401-0000-0000-C000-000000000046")
- ]
- public class ShellLink
- {
- }
-}
diff --git a/MediaBrowser.ServerApplication/Native/LoopUtil.cs b/MediaBrowser.ServerApplication/Native/LoopUtil.cs
deleted file mode 100644
index 0efdba389..000000000
--- a/MediaBrowser.ServerApplication/Native/LoopUtil.cs
+++ /dev/null
@@ -1,293 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading.Tasks;
-
-/*
- * Important - Even though this will compile in the shared projects, it will cause build failures within the mono runtime
- */
-namespace MediaBrowser.ServerApplication.Native
-{
- /// <summary>
- /// http://blogs.msdn.com/b/fiddler/archive/2011/12/10/fiddler-windows-8-apps-enable-LoopUtil-network-isolation-exemption.aspx
- /// </summary>
- public class LoopUtil
- {
- //http://msdn.microsoft.com/en-us/library/windows/desktop/aa379595(v=vs.85).aspx
- [StructLayout(LayoutKind.Sequential)]
- internal struct SID_AND_ATTRIBUTES
- {
- public IntPtr Sid;
- public uint Attributes;
- }
-
- [StructLayoutAttribute(LayoutKind.Sequential)]
- internal struct INET_FIREWALL_AC_CAPABILITIES
- {
- public uint count;
- public IntPtr capabilities; //SID_AND_ATTRIBUTES
- }
-
- [StructLayoutAttribute(LayoutKind.Sequential)]
- internal struct INET_FIREWALL_AC_BINARIES
- {
- public uint count;
- public IntPtr binaries;
- }
-
- [StructLayoutAttribute(LayoutKind.Sequential)]
- internal struct INET_FIREWALL_APP_CONTAINER
- {
- internal IntPtr appContainerSid;
- internal IntPtr userSid;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string appContainerName;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string displayName;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string description;
- internal INET_FIREWALL_AC_CAPABILITIES capabilities;
- internal INET_FIREWALL_AC_BINARIES binaries;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string workingDirectory;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string packageFullName;
- }
-
-
- // Call this API to load the current list of LoopUtil-enabled AppContainers
- [DllImport("FirewallAPI.dll")]
- internal static extern uint NetworkIsolationGetAppContainerConfig(out uint pdwCntACs, out IntPtr appContainerSids);
-
- // Call this API to set the LoopUtil-exemption list
- [DllImport("FirewallAPI.dll")]
- private static extern uint NetworkIsolationSetAppContainerConfig(uint pdwCntACs, SID_AND_ATTRIBUTES[] appContainerSids);
-
- // Use this API to convert a string SID into an actual SID
- [DllImport("advapi32.dll", SetLastError = true)]
- internal static extern bool ConvertStringSidToSid(string strSid, out IntPtr pSid);
-
- [DllImport("advapi32", /*CharSet = CharSet.Auto,*/ SetLastError = true)]
- static extern bool ConvertSidToStringSid(IntPtr pSid, out string strSid);
-
- // Call this API to enumerate all of the AppContainers on the system
- [DllImport("FirewallAPI.dll")]
- internal static extern uint NetworkIsolationEnumAppContainers(uint Flags, out uint pdwCntPublicACs, out IntPtr ppACs);
- // DWORD NetworkIsolationEnumAppContainers(
- // _In_ DWORD Flags,
- // _Out_ DWORD *pdwNumPublicAppCs,
- // _Out_ PINET_FIREWALL_APP_CONTAINER *ppPublicAppCs
- //);
-
- //http://msdn.microsoft.com/en-gb/library/windows/desktop/hh968116.aspx
- enum NETISO_FLAG
- {
- NETISO_FLAG_FORCE_COMPUTE_BINARIES = 0x1,
- NETISO_FLAG_MAX = 0x2
- }
-
-
- public class AppContainer
- {
- public String appContainerName { get; set; }
- public String displayName { get; set; }
- public String workingDirectory { get; set; }
- public String StringSid { get; set; }
- public List<uint> capabilities { get; set; }
- public bool LoopUtil { get; set; }
-
- public AppContainer(String _appContainerName, String _displayName, String _workingDirectory, IntPtr _sid)
- {
- this.appContainerName = _appContainerName;
- this.displayName = _displayName;
- this.workingDirectory = _workingDirectory;
- String tempSid;
- ConvertSidToStringSid(_sid, out tempSid);
- this.StringSid = tempSid;
- }
- }
-
- internal List<LoopUtil.INET_FIREWALL_APP_CONTAINER> _AppList;
- internal List<LoopUtil.SID_AND_ATTRIBUTES> _AppListConfig;
- public List<AppContainer> Apps = new List<AppContainer>();
- internal IntPtr _pACs;
-
- public LoopUtil()
- {
- LoadApps();
- }
-
- public void LoadApps()
- {
- Apps.Clear();
- _pACs = IntPtr.Zero;
- //Full List of Apps
- _AppList = PI_NetworkIsolationEnumAppContainers();
- //List of Apps that have LoopUtil enabled.
- _AppListConfig = PI_NetworkIsolationGetAppContainerConfig();
- foreach (var PI_app in _AppList)
- {
- AppContainer app = new AppContainer(PI_app.appContainerName, PI_app.displayName, PI_app.workingDirectory, PI_app.appContainerSid);
-
- app.LoopUtil = CheckLoopback(PI_app.appContainerSid);
- Apps.Add(app);
- }
- }
- private bool CheckLoopback(IntPtr intPtr)
- {
- foreach (SID_AND_ATTRIBUTES item in _AppListConfig)
- {
- string left, right;
- ConvertSidToStringSid(item.Sid, out left);
- ConvertSidToStringSid(intPtr, out right);
-
- if (left == right)
- {
- return true;
- }
- }
- return false;
- }
-
- private bool CreateExcemptions(string appName)
- {
- var hasChanges = false;
-
- foreach (var app in Apps)
- {
- if ((app.appContainerName ?? string.Empty).IndexOf(appName, StringComparison.OrdinalIgnoreCase) != -1 ||
- (app.displayName ?? string.Empty).IndexOf(appName, StringComparison.OrdinalIgnoreCase) != -1)
- {
- if (!app.LoopUtil)
- {
- app.LoopUtil = true;
- hasChanges = true;
- }
- }
- }
-
- return hasChanges;
- }
-
- public static void Run(string appName)
- {
- var util = new LoopUtil();
- util.LoadApps();
-
- var hasChanges = util.CreateExcemptions(appName);
-
- if (hasChanges)
- {
- util.SaveLoopbackState();
- }
- }
-
- private static List<SID_AND_ATTRIBUTES> PI_NetworkIsolationGetAppContainerConfig()
- {
-
- IntPtr arrayValue = IntPtr.Zero;
- uint size = 0;
- var list = new List<SID_AND_ATTRIBUTES>();
-
- // Pin down variables
- GCHandle handle_pdwCntPublicACs = GCHandle.Alloc(size, GCHandleType.Pinned);
- GCHandle handle_ppACs = GCHandle.Alloc(arrayValue, GCHandleType.Pinned);
-
- uint retval = NetworkIsolationGetAppContainerConfig(out size, out arrayValue);
-
- var structSize = Marshal.SizeOf(typeof(SID_AND_ATTRIBUTES));
- for (var i = 0; i < size; i++)
- {
- var cur = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure(arrayValue, typeof(SID_AND_ATTRIBUTES));
- list.Add(cur);
- arrayValue = new IntPtr((long)(arrayValue) + (long)(structSize));
- }
-
- //release pinned variables.
- handle_pdwCntPublicACs.Free();
- handle_ppACs.Free();
-
- return list;
-
-
- }
-
- private List<INET_FIREWALL_APP_CONTAINER> PI_NetworkIsolationEnumAppContainers()
- {
-
- IntPtr arrayValue = IntPtr.Zero;
- uint size = 0;
- var list = new List<INET_FIREWALL_APP_CONTAINER>();
-
- // Pin down variables
- GCHandle handle_pdwCntPublicACs = GCHandle.Alloc(size, GCHandleType.Pinned);
- GCHandle handle_ppACs = GCHandle.Alloc(arrayValue, GCHandleType.Pinned);
-
- //uint retval2 = NetworkIsolationGetAppContainerConfig( out size, out arrayValue);
-
- uint retval = NetworkIsolationEnumAppContainers((Int32)NETISO_FLAG.NETISO_FLAG_MAX, out size, out arrayValue);
- _pACs = arrayValue; //store the pointer so it can be freed when we close the form
-
- var structSize = Marshal.SizeOf(typeof(INET_FIREWALL_APP_CONTAINER));
- for (var i = 0; i < size; i++)
- {
- var cur = (INET_FIREWALL_APP_CONTAINER)Marshal.PtrToStructure(arrayValue, typeof(INET_FIREWALL_APP_CONTAINER));
- list.Add(cur);
- arrayValue = new IntPtr((long)(arrayValue) + (long)(structSize));
- }
-
- //release pinned variables.
- handle_pdwCntPublicACs.Free();
- handle_ppACs.Free();
-
- return list;
-
-
- }
-
- public bool SaveLoopbackState()
- {
- var countEnabled = CountEnabledLoopUtil();
- SID_AND_ATTRIBUTES[] arr = new SID_AND_ATTRIBUTES[countEnabled];
- int count = 0;
-
- for (int i = 0; i < Apps.Count; i++)
- {
- if (Apps[i].LoopUtil)
- {
- arr[count].Attributes = 0;
- //TO DO:
- IntPtr ptr;
- ConvertStringSidToSid(Apps[i].StringSid, out ptr);
- arr[count].Sid = ptr;
- count++;
- }
-
- }
-
-
- if (NetworkIsolationSetAppContainerConfig((uint)countEnabled, arr) == 0)
- {
- return true;
- }
- else
- { return false; }
-
- }
-
- private int CountEnabledLoopUtil()
- {
- var count = 0;
- for (int i = 0; i < Apps.Count; i++)
- {
- if (Apps[i].LoopUtil)
- {
- count++;
- }
-
- }
- return count;
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Native/PowerManagement.cs b/MediaBrowser.ServerApplication/Native/PowerManagement.cs
deleted file mode 100644
index 0bd3db1da..000000000
--- a/MediaBrowser.ServerApplication/Native/PowerManagement.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using MediaBrowser.Model.System;
-
-namespace MediaBrowser.ServerApplication.Native
-{
- public class PowerManagement : IPowerManagement
- {
- public void PreventSystemStandby()
- {
- MainStartup.Invoke(Standby.PreventSleep);
- }
-
- public void AllowSystemStandby()
- {
- MainStartup.Invoke(Standby.AllowSleep);
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Native/RegisterServer.bat b/MediaBrowser.ServerApplication/Native/RegisterServer.bat
deleted file mode 100644
index 504df2199..000000000
--- a/MediaBrowser.ServerApplication/Native/RegisterServer.bat
+++ /dev/null
@@ -1,34 +0,0 @@
-rem %1 = udp server port
-rem %2 = http server port
-rem %3 = https server port
-rem %4 = exe path
-
-if [%1]==[] GOTO DONE
-
-netsh advfirewall firewall delete rule name="Port %1" protocol=UDP localport=%1
-netsh advfirewall firewall add rule name="Port %1" dir=in action=allow protocol=UDP localport=%1
-
-if [%2]==[] GOTO DONE
-
-netsh advfirewall firewall delete rule name="Port %2" protocol=TCP localport=%2
-netsh advfirewall firewall add rule name="Port %2" dir=in action=allow protocol=TCP localport=%2
-
-if [%3]==[] GOTO DONE
-
-netsh advfirewall firewall delete rule name="Port %3" protocol=TCP localport=%3
-netsh advfirewall firewall add rule name="Port %3" dir=in action=allow protocol=TCP localport=%3
-
-if [%4]==[] GOTO DONE
-
-netsh advfirewall firewall delete rule name="mediabrowser.serverapplication.exe"
-netsh advfirewall firewall delete rule name="Emby Server"
-
-netsh advfirewall firewall add rule name="Emby Server" dir=in action=allow protocol=TCP program=%4 enable=yes
-netsh advfirewall firewall add rule name="Emby Server" dir=in action=allow protocol=UDP program=%4 enable=yes
-
-netsh advfirewall firewall add rule name="mediabrowser.serverapplication.exe" dir=in action=allow protocol=TCP program=%4 enable=yes
-netsh advfirewall firewall add rule name="mediabrowser.serverapplication.exe" dir=in action=allow protocol=UDP program=%4 enable=yes
-
-
-:DONE
-Exit \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs b/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs
deleted file mode 100644
index 70444ad9f..000000000
--- a/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Reflection;
-
-namespace MediaBrowser.ServerApplication.Native
-{
- /// <summary>
- /// Class Authorization
- /// </summary>
- public static class ServerAuthorization
- {
- /// <summary>
- /// Authorizes the server.
- /// </summary>
- /// <param name="udpPort">The UDP port.</param>
- /// <param name="httpServerPort">The HTTP server port.</param>
- /// <param name="httpsServerPort">The HTTPS server port.</param>
- /// <param name="tempDirectory">The temp directory.</param>
- public static void AuthorizeServer(int udpPort, int httpServerPort, int httpsServerPort, string applicationPath, string tempDirectory)
- {
- Directory.CreateDirectory(tempDirectory);
-
- // Create a temp file path to extract the bat file to
- var tmpFile = Path.Combine(tempDirectory, Guid.NewGuid() + ".bat");
-
- // Extract the bat file
- using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(typeof(ServerAuthorization).Namespace + ".RegisterServer.bat"))
- {
- using (var fileStream = File.Create(tmpFile))
- {
- stream.CopyTo(fileStream);
- }
- }
-
- var startInfo = new ProcessStartInfo
- {
- FileName = tmpFile,
-
- Arguments = string.Format("{0} {1} {2} \"{3}\"", udpPort, httpServerPort, httpsServerPort, applicationPath),
-
- CreateNoWindow = true,
- WindowStyle = ProcessWindowStyle.Hidden,
- Verb = "runas",
- ErrorDialog = false
- };
-
- using (var process = Process.Start(startInfo))
- {
- process.WaitForExit();
- }
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Native/Standby.cs b/MediaBrowser.ServerApplication/Native/Standby.cs
deleted file mode 100644
index 919709538..000000000
--- a/MediaBrowser.ServerApplication/Native/Standby.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System;
-using System.Runtime.InteropServices;
-
-namespace MediaBrowser.ServerApplication.Native
-{
- /// <summary>
- /// Class NativeApp
- /// </summary>
- public static class Standby
- {
- public static void PreventSleepAndMonitorOff()
- {
- NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED | NativeMethods.ES_DISPLAY_REQUIRED);
- }
-
- public static void PreventSleep()
- {
- NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
- }
-
- // Clear EXECUTION_STATE flags to allow the system to sleep and turn off monitor normally
- public static void AllowSleep()
- {
- NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS);
- }
-
- internal static class NativeMethods
- {
- // Import SetThreadExecutionState Win32 API and necessary flags
- [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- public static extern uint SetThreadExecutionState(uint esFlags);
- public const uint ES_CONTINUOUS = 0x80000000;
- public const uint ES_SYSTEM_REQUIRED = 0x00000001;
- public const uint ES_DISPLAY_REQUIRED = 0x00000002;
- }
-
- [Flags]
- internal enum EXECUTION_STATE : uint
- {
- ES_NONE = 0,
- ES_SYSTEM_REQUIRED = 0x00000001,
- ES_DISPLAY_REQUIRED = 0x00000002,
- ES_USER_PRESENT = 0x00000004,
- ES_AWAYMODE_REQUIRED = 0x00000040,
- ES_CONTINUOUS = 0x80000000
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Networking/NativeMethods.cs b/MediaBrowser.ServerApplication/Networking/NativeMethods.cs
deleted file mode 100644
index 037b1f75b..000000000
--- a/MediaBrowser.ServerApplication/Networking/NativeMethods.cs
+++ /dev/null
@@ -1,226 +0,0 @@
-using System;
-using System.Runtime.InteropServices;
-using System.Security;
-
-namespace MediaBrowser.ServerApplication.Networking
-{
- /// <summary>
- /// Class NativeMethods
- /// </summary>
- [SuppressUnmanagedCodeSecurity]
- public static class NativeMethods
- {
- //declare the Netapi32 : NetServerEnum method import
- /// <summary>
- /// Nets the server enum.
- /// </summary>
- /// <param name="ServerName">Name of the server.</param>
- /// <param name="dwLevel">The dw level.</param>
- /// <param name="pBuf">The p buf.</param>
- /// <param name="dwPrefMaxLen">The dw pref max len.</param>
- /// <param name="dwEntriesRead">The dw entries read.</param>
- /// <param name="dwTotalEntries">The dw total entries.</param>
- /// <param name="dwServerType">Type of the dw server.</param>
- /// <param name="domain">The domain.</param>
- /// <param name="dwResumeHandle">The dw resume handle.</param>
- /// <returns>System.Int32.</returns>
- [DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true),
- SuppressUnmanagedCodeSecurity]
-
- public static extern int NetServerEnum(
- string ServerName, // must be null
- int dwLevel,
- ref IntPtr pBuf,
- int dwPrefMaxLen,
- out int dwEntriesRead,
- out int dwTotalEntries,
- int dwServerType,
- string domain, // null for login domain
- out int dwResumeHandle
- );
-
- //declare the Netapi32 : NetApiBufferFree method import
- /// <summary>
- /// Nets the API buffer free.
- /// </summary>
- /// <param name="pBuf">The p buf.</param>
- /// <returns>System.Int32.</returns>
- [DllImport("Netapi32", SetLastError = true),
- SuppressUnmanagedCodeSecurity]
- public static extern int NetApiBufferFree(
- IntPtr pBuf);
-
- [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool FileTimeToSystemTime(
- [In] ref long fileTime,
- out SystemTime systemTime);
-
- [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CryptAcquireContextW(
- out IntPtr providerContext,
- [MarshalAs(UnmanagedType.LPWStr)] string container,
- [MarshalAs(UnmanagedType.LPWStr)] string provider,
- int providerType,
- int flags);
-
- [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CryptReleaseContext(
- IntPtr providerContext,
- int flags);
-
- [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CryptGenKey(
- IntPtr providerContext,
- int algorithmId,
- int flags,
- out IntPtr cryptKeyHandle);
-
- [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CryptDestroyKey(
- IntPtr cryptKeyHandle);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CertStrToNameW(
- int certificateEncodingType,
- IntPtr x500,
- int strType,
- IntPtr reserved,
- [MarshalAs(UnmanagedType.LPArray)] [Out] byte[] encoded,
- ref int encodedLength,
- out IntPtr errorString);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- public static extern IntPtr CertCreateSelfSignCertificate(
- IntPtr providerHandle,
- [In] ref CryptoApiBlob subjectIssuerBlob,
- int flags,
- [In] ref CryptKeyProviderInformation keyProviderInformation,
- [In] ref CryptAlgorithmIdentifier algorithmIdentifier,
- [In] ref SystemTime startTime,
- [In] ref SystemTime endTime,
- IntPtr extensions);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CertFreeCertificateContext(
- IntPtr certificateContext);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- public static extern IntPtr CertOpenStore(
- [MarshalAs(UnmanagedType.LPStr)] string storeProvider,
- int messageAndCertificateEncodingType,
- IntPtr cryptProvHandle,
- int flags,
- IntPtr parameters);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CertCloseStore(
- IntPtr certificateStoreHandle,
- int flags);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CertAddCertificateContextToStore(
- IntPtr certificateStoreHandle,
- IntPtr certificateContext,
- int addDisposition,
- out IntPtr storeContextPtr);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CertSetCertificateContextProperty(
- IntPtr certificateContext,
- int propertyId,
- int flags,
- [In] ref CryptKeyProviderInformation data);
-
- [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool PFXExportCertStoreEx(
- IntPtr certificateStoreHandle,
- ref CryptoApiBlob pfxBlob,
- IntPtr password,
- IntPtr reserved,
- int flags);
- }
-
- //create a _SERVER_INFO_100 STRUCTURE
- /// <summary>
- /// Struct _SERVER_INFO_100
- /// </summary>
- [StructLayout(LayoutKind.Sequential)]
- public struct _SERVER_INFO_100
- {
- /// <summary>
- /// The sv100_platform_id
- /// </summary>
- internal int sv100_platform_id;
- /// <summary>
- /// The sv100_name
- /// </summary>
- [MarshalAs(UnmanagedType.LPWStr)]
- internal string sv100_name;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct SystemTime
- {
- public short Year;
- public short Month;
- public short DayOfWeek;
- public short Day;
- public short Hour;
- public short Minute;
- public short Second;
- public short Milliseconds;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct CryptObjIdBlob
- {
- public uint cbData;
- public IntPtr pbData;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct CryptAlgorithmIdentifier
- {
- [MarshalAs(UnmanagedType.LPStr)]
- public String pszObjId;
- public CryptObjIdBlob Parameters;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct CryptoApiBlob
- {
- public int DataLength;
- public IntPtr Data;
-
- public CryptoApiBlob(int dataLength, IntPtr data)
- {
- this.DataLength = dataLength;
- this.Data = data;
- }
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct CryptKeyProviderInformation
- {
- [MarshalAs(UnmanagedType.LPWStr)]
- public string ContainerName;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string ProviderName;
- public int ProviderType;
- public int Flags;
- public int ProviderParameterCount;
- public IntPtr ProviderParameters; // PCRYPT_KEY_PROV_PARAM
- public int KeySpec;
- }
-}
diff --git a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs
deleted file mode 100644
index 8933a5760..000000000
--- a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs
+++ /dev/null
@@ -1,175 +0,0 @@
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Net;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices;
-
-namespace MediaBrowser.ServerApplication.Networking
-{
- /// <summary>
- /// Class NetUtils
- /// </summary>
- public class NetworkManager : Emby.Server.Implementations.Networking.NetworkManager
- {
- public NetworkManager(ILogger logger)
- : base(logger)
- {
- }
-
- /// <summary>
- /// Gets the network shares.
- /// </summary>
- /// <param name="path">The path.</param>
- /// <returns>IEnumerable{NetworkShare}.</returns>
- public override IEnumerable<NetworkShare> GetNetworkShares(string path)
- {
- Logger.Info("Getting network shares from {0}", path);
- return new ShareCollection(path).OfType<Share>().Select(ToNetworkShare);
- }
-
- /// <summary>
- /// To the network share.
- /// </summary>
- /// <param name="share">The share.</param>
- /// <returns>NetworkShare.</returns>
- private NetworkShare ToNetworkShare(Share share)
- {
- return new NetworkShare
- {
- Name = share.NetName,
- Path = share.Path,
- Remark = share.Remark,
- Server = share.Server,
- ShareType = ToNetworkShareType(share.ShareType)
- };
- }
-
- /// <summary>
- /// To the type of the network share.
- /// </summary>
- /// <param name="shareType">Type of the share.</param>
- /// <returns>NetworkShareType.</returns>
- /// <exception cref="System.ArgumentException">Unknown share type</exception>
- private NetworkShareType ToNetworkShareType(ShareType shareType)
- {
- if (shareType.HasFlag(ShareType.Special))
- {
- return NetworkShareType.Special;
- }
- if (shareType.HasFlag(ShareType.Device))
- {
- return NetworkShareType.Device;
- }
- if (shareType.HasFlag(ShareType.Disk))
- {
- return NetworkShareType.Disk;
- }
- if (shareType.HasFlag(ShareType.IPC))
- {
- return NetworkShareType.Ipc;
- }
- if (shareType.HasFlag(ShareType.Printer))
- {
- return NetworkShareType.Printer;
- }
- throw new ArgumentException("Unknown share type");
- }
-
- /// <summary>
- /// Uses the DllImport : NetServerEnum with all its required parameters
- /// (see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp
- /// for full details or method signature) to retrieve a list of domain SV_TYPE_WORKSTATION
- /// and SV_TYPE_SERVER PC's
- /// </summary>
- /// <returns>Arraylist that represents all the SV_TYPE_WORKSTATION and SV_TYPE_SERVER
- /// PC's in the Domain</returns>
- private List<string> GetNetworkDevicesInternal()
- {
- //local fields
- const int MAX_PREFERRED_LENGTH = -1;
- var SV_TYPE_WORKSTATION = 1;
- var SV_TYPE_SERVER = 2;
- IntPtr buffer = IntPtr.Zero;
- IntPtr tmpBuffer = IntPtr.Zero;
- var entriesRead = 0;
- var totalEntries = 0;
- var resHandle = 0;
- var sizeofINFO = Marshal.SizeOf(typeof(_SERVER_INFO_100));
-
- var returnList = new List<string>();
-
- try
- {
- //call the DllImport : NetServerEnum with all its required parameters
- //see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp
- //for full details of method signature
- var ret = NativeMethods.NetServerEnum(null, 100, ref buffer, MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out resHandle);
-
- //if the returned with a NERR_Success (C++ term), =0 for C#
- if (ret == 0)
- {
- //loop through all SV_TYPE_WORKSTATION and SV_TYPE_SERVER PC's
- for (var i = 0; i < totalEntries; i++)
- {
- //get pointer to, Pointer to the buffer that received the data from
- //the call to NetServerEnum. Must ensure to use correct size of
- //STRUCTURE to ensure correct location in memory is pointed to
- tmpBuffer = new IntPtr((Int64)buffer + (i * sizeofINFO));
- //Have now got a pointer to the list of SV_TYPE_WORKSTATION and
- //SV_TYPE_SERVER PC's, which is unmanaged memory
- //Needs to Marshal data from an unmanaged block of memory to a
- //managed object, again using STRUCTURE to ensure the correct data
- //is marshalled
- var svrInfo = (_SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(_SERVER_INFO_100));
-
- //add the PC names to the ArrayList
- if (!string.IsNullOrEmpty(svrInfo.sv100_name))
- {
- returnList.Add(svrInfo.sv100_name);
- }
- }
- }
- }
- finally
- {
- //The NetApiBufferFree function frees
- //the memory that the NetApiBufferAllocate function allocates
- NativeMethods.NetApiBufferFree(buffer);
- }
-
- return returnList;
- }
-
- /// <summary>
- /// Gets available devices within the domain
- /// </summary>
- /// <returns>PC's in the Domain</returns>
- public override IEnumerable<FileSystemEntryInfo> GetNetworkDevices()
- {
- return GetNetworkDevicesInternal().Select(c => new FileSystemEntryInfo
- {
- Name = c,
- Path = NetworkPrefix + c,
- Type = FileSystemEntryType.NetworkComputer
- });
- }
-
- /// <summary>
- /// Gets the network prefix.
- /// </summary>
- /// <value>The network prefix.</value>
- private string NetworkPrefix
- {
- get
- {
- var separator = Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture);
- return separator + separator;
- }
- }
- }
-
-}
diff --git a/MediaBrowser.ServerApplication/Networking/NetworkShares.cs b/MediaBrowser.ServerApplication/Networking/NetworkShares.cs
deleted file mode 100644
index f9a59203d..000000000
--- a/MediaBrowser.ServerApplication/Networking/NetworkShares.cs
+++ /dev/null
@@ -1,643 +0,0 @@
-using System;
-using System.IO;
-using System.Collections;
-using System.Runtime.InteropServices;
-
-namespace MediaBrowser.ServerApplication.Networking
-{
- /// <summary>
- /// Type of share
- /// </summary>
- [Flags]
- public enum ShareType
- {
- /// <summary>Disk share</summary>
- Disk = 0,
- /// <summary>Printer share</summary>
- Printer = 1,
- /// <summary>Device share</summary>
- Device = 2,
- /// <summary>IPC share</summary>
- IPC = 3,
- /// <summary>Special share</summary>
- Special = -2147483648, // 0x80000000,
- }
-
- #region Share
-
- /// <summary>
- /// Information about a local share
- /// </summary>
- public class Share
- {
- #region Private data
-
- private string _server;
- private string _netName;
- private string _path;
- private ShareType _shareType;
- private string _remark;
-
- #endregion
-
- #region Constructor
-
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="server">The server.</param>
- /// <param name="netName">Name of the net.</param>
- /// <param name="path">The path.</param>
- /// <param name="shareType">Type of the share.</param>
- /// <param name="remark">The remark.</param>
- public Share(string server, string netName, string path, ShareType shareType, string remark)
- {
- if (ShareType.Special == shareType && "IPC$" == netName)
- {
- shareType |= ShareType.IPC;
- }
-
- _server = server;
- _netName = netName;
- _path = path;
- _shareType = shareType;
- _remark = remark;
- }
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// The name of the computer that this share belongs to
- /// </summary>
- public string Server
- {
- get { return _server; }
- }
-
- /// <summary>
- /// Share name
- /// </summary>
- public string NetName
- {
- get { return _netName; }
- }
-
- /// <summary>
- /// Local path
- /// </summary>
- public string Path
- {
- get { return _path; }
- }
-
- /// <summary>
- /// Share type
- /// </summary>
- public ShareType ShareType
- {
- get { return _shareType; }
- }
-
- /// <summary>
- /// Comment
- /// </summary>
- public string Remark
- {
- get { return _remark; }
- }
-
- /// <summary>
- /// Returns true if this is a file system share
- /// </summary>
- public bool IsFileSystem
- {
- get
- {
- // Shared device
- if (0 != (_shareType & ShareType.Device)) return false;
- // IPC share
- if (0 != (_shareType & ShareType.IPC)) return false;
- // Shared printer
- if (0 != (_shareType & ShareType.Printer)) return false;
-
- // Standard disk share
- if (0 == (_shareType & ShareType.Special)) return true;
-
- // Special disk share (e.g. C$)
- return ShareType.Special == _shareType && !string.IsNullOrEmpty(_netName);
- }
- }
-
- /// <summary>
- /// Get the root of a disk-based share
- /// </summary>
- public DirectoryInfo Root
- {
- get
- {
- if (IsFileSystem)
- {
- if (string.IsNullOrEmpty(_server))
- if (string.IsNullOrEmpty(_path))
- return new DirectoryInfo(ToString());
- else
- return new DirectoryInfo(_path);
- return new DirectoryInfo(ToString());
- }
- return null;
- }
- }
-
- #endregion
-
- /// <summary>
- /// Returns the path to this share
- /// </summary>
- /// <returns></returns>
- public override string ToString()
- {
- if (string.IsNullOrEmpty(_server))
- {
- return string.Format(@"\\{0}\{1}", Environment.MachineName, _netName);
- }
- return string.Format(@"\\{0}\{1}", _server, _netName);
- }
-
- /// <summary>
- /// Returns true if this share matches the local path
- /// </summary>
- /// <param name="path"></param>
- /// <returns></returns>
- public bool MatchesPath(string path)
- {
- if (!IsFileSystem) return false;
- if (string.IsNullOrEmpty(path)) return true;
-
- return path.ToLower().StartsWith(_path.ToLower());
- }
- }
-
- #endregion
-
- /// <summary>
- /// A collection of shares
- /// </summary>
- public class ShareCollection : ReadOnlyCollectionBase
- {
- #region Platform
-
- /// <summary>
- /// Is this an NT platform?
- /// </summary>
- protected static bool IsNT
- {
- get { return (PlatformID.Win32NT == Environment.OSVersion.Platform); }
- }
-
- /// <summary>
- /// Returns true if this is Windows 2000 or higher
- /// </summary>
- protected static bool IsW2KUp
- {
- get
- {
- OperatingSystem os = Environment.OSVersion;
- if (PlatformID.Win32NT == os.Platform && os.Version.Major >= 5)
- return true;
- else
- return false;
- }
- }
-
- #endregion
-
- #region Interop
-
- #region Constants
-
- /// <summary>Maximum path length</summary>
- protected const int MAX_PATH = 260;
- /// <summary>No error</summary>
- protected const int NO_ERROR = 0;
- /// <summary>Access denied</summary>
- protected const int ERROR_ACCESS_DENIED = 5;
- /// <summary>Access denied</summary>
- protected const int ERROR_WRONG_LEVEL = 124;
- /// <summary>More data available</summary>
- protected const int ERROR_MORE_DATA = 234;
- /// <summary>Not connected</summary>
- protected const int ERROR_NOT_CONNECTED = 2250;
- /// <summary>Level 1</summary>
- protected const int UNIVERSAL_NAME_INFO_LEVEL = 1;
- /// <summary>Max extries (9x)</summary>
- protected const int MAX_SI50_ENTRIES = 20;
-
- #endregion
-
- #region Structures
-
- /// <summary>Unc name</summary>
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- protected struct UNIVERSAL_NAME_INFO
- {
- [MarshalAs(UnmanagedType.LPTStr)]
- public string lpUniversalName;
- }
-
- /// <summary>Share information, NT, level 2</summary>
- /// <remarks>
- /// Requires admin rights to work.
- /// </remarks>
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
- protected struct SHARE_INFO_2
- {
- [MarshalAs(UnmanagedType.LPWStr)]
- public string NetName;
- public ShareType ShareType;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string Remark;
- public int Permissions;
- public int MaxUsers;
- public int CurrentUsers;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string Path;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string Password;
- }
-
- /// <summary>Share information, NT, level 1</summary>
- /// <remarks>
- /// Fallback when no admin rights.
- /// </remarks>
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
- protected struct SHARE_INFO_1
- {
- [MarshalAs(UnmanagedType.LPWStr)]
- public string NetName;
- public ShareType ShareType;
- [MarshalAs(UnmanagedType.LPWStr)]
- public string Remark;
- }
-
- /// <summary>Share information, Win9x</summary>
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
- protected struct SHARE_INFO_50
- {
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
- public string NetName;
-
- public byte bShareType;
- public ushort Flags;
-
- [MarshalAs(UnmanagedType.LPTStr)]
- public string Remark;
- [MarshalAs(UnmanagedType.LPTStr)]
- public string Path;
-
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
- public string PasswordRW;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
- public string PasswordRO;
-
- public ShareType ShareType
- {
- get { return (ShareType)((int)bShareType & 0x7F); }
- }
- }
-
- /// <summary>Share information level 1, Win9x</summary>
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
- protected struct SHARE_INFO_1_9x
- {
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
- public string NetName;
- public byte Padding;
-
- public ushort bShareType;
-
- [MarshalAs(UnmanagedType.LPTStr)]
- public string Remark;
-
- public ShareType ShareType
- {
- get { return (ShareType)((int)bShareType & 0x7FFF); }
- }
- }
-
- #endregion
-
- #region Functions
-
- /// <summary>Get a UNC name</summary>
- [DllImport("mpr", CharSet = CharSet.Auto)]
- protected static extern int WNetGetUniversalName(string lpLocalPath,
- int dwInfoLevel, ref UNIVERSAL_NAME_INFO lpBuffer, ref int lpBufferSize);
-
- /// <summary>Get a UNC name</summary>
- [DllImport("mpr", CharSet = CharSet.Auto)]
- protected static extern int WNetGetUniversalName(string lpLocalPath,
- int dwInfoLevel, IntPtr lpBuffer, ref int lpBufferSize);
-
- /// <summary>Enumerate shares (NT)</summary>
- [DllImport("netapi32", CharSet = CharSet.Unicode)]
- protected static extern int NetShareEnum(string lpServerName, int dwLevel,
- out IntPtr lpBuffer, int dwPrefMaxLen, out int entriesRead,
- out int totalEntries, ref int hResume);
-
- /// <summary>Enumerate shares (9x)</summary>
- [DllImport("svrapi", CharSet = CharSet.Ansi)]
- protected static extern int NetShareEnum(
- [MarshalAs(UnmanagedType.LPTStr)] string lpServerName, int dwLevel,
- IntPtr lpBuffer, ushort cbBuffer, out ushort entriesRead,
- out ushort totalEntries);
-
- /// <summary>Free the buffer (NT)</summary>
- [DllImport("netapi32")]
- protected static extern int NetApiBufferFree(IntPtr lpBuffer);
-
- #endregion
-
- #region Enumerate shares
-
- /// <summary>
- /// Enumerates the shares on Windows NT
- /// </summary>
- /// <param name="server">The server name</param>
- /// <param name="shares">The ShareCollection</param>
- protected static void EnumerateSharesNT(string server, ShareCollection shares)
- {
- int level = 2;
- int entriesRead, totalEntries, nRet, hResume = 0;
- IntPtr pBuffer = IntPtr.Zero;
-
- try
- {
- nRet = NetShareEnum(server, level, out pBuffer, -1,
- out entriesRead, out totalEntries, ref hResume);
-
- if (ERROR_ACCESS_DENIED == nRet)
- {
- //Need admin for level 2, drop to level 1
- level = 1;
- nRet = NetShareEnum(server, level, out pBuffer, -1,
- out entriesRead, out totalEntries, ref hResume);
- }
-
- if (NO_ERROR == nRet && entriesRead > 0)
- {
- Type t = (2 == level) ? typeof(SHARE_INFO_2) : typeof(SHARE_INFO_1);
- int offset = Marshal.SizeOf(t);
-
- var lpItem = pBuffer.ToInt64();
-
- for (int i = 0; i < entriesRead; i++, lpItem += offset)
- {
- IntPtr pItem = new IntPtr(lpItem);
- if (1 == level)
- {
- SHARE_INFO_1 si = (SHARE_INFO_1)Marshal.PtrToStructure(pItem, t);
- shares.Add(si.NetName, string.Empty, si.ShareType, si.Remark);
- }
- else
- {
- SHARE_INFO_2 si = (SHARE_INFO_2)Marshal.PtrToStructure(pItem, t);
- shares.Add(si.NetName, si.Path, si.ShareType, si.Remark);
- }
- }
- }
-
- }
- finally
- {
- // Clean up buffer allocated by system
- if (IntPtr.Zero != pBuffer)
- NetApiBufferFree(pBuffer);
- }
- }
-
- /// <summary>
- /// Enumerates the shares on Windows 9x
- /// </summary>
- /// <param name="server">The server name</param>
- /// <param name="shares">The ShareCollection</param>
- protected static void EnumerateShares9x(string server, ShareCollection shares)
- {
- int level = 50;
- int nRet = 0;
- ushort entriesRead, totalEntries;
-
- var t = typeof(SHARE_INFO_50);
- var size = Marshal.SizeOf(t);
- var cbBuffer = (ushort)(MAX_SI50_ENTRIES * size);
- //On Win9x, must allocate buffer before calling API
- IntPtr pBuffer = Marshal.AllocHGlobal(cbBuffer);
-
- try
- {
- nRet = NetShareEnum(server, level, pBuffer, cbBuffer,
- out entriesRead, out totalEntries);
-
- if (ERROR_WRONG_LEVEL == nRet)
- {
- level = 1;
- t = typeof(SHARE_INFO_1_9x);
- size = Marshal.SizeOf(t);
-
- nRet = NetShareEnum(server, level, pBuffer, cbBuffer,
- out entriesRead, out totalEntries);
- }
-
- if (NO_ERROR == nRet || ERROR_MORE_DATA == nRet)
- {
- for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += size)
- {
- var pItem = new IntPtr(lpItem);
-
- if (1 == level)
- {
- var si = (SHARE_INFO_1_9x)Marshal.PtrToStructure(pItem, t);
- shares.Add(si.NetName, string.Empty, si.ShareType, si.Remark);
- }
- else
- {
- var si = (SHARE_INFO_50)Marshal.PtrToStructure(pItem, t);
- shares.Add(si.NetName, si.Path, si.ShareType, si.Remark);
- }
- }
- }
- else
- Console.WriteLine(nRet);
-
- }
- finally
- {
- //Clean up buffer
- Marshal.FreeHGlobal(pBuffer);
- }
- }
-
- /// <summary>
- /// Enumerates the shares
- /// </summary>
- /// <param name="server">The server name</param>
- /// <param name="shares">The ShareCollection</param>
- protected static void EnumerateShares(string server, ShareCollection shares)
- {
- if (null != server && 0 != server.Length && !IsW2KUp)
- {
- server = server.ToUpper();
-
- // On NT4, 9x and Me, server has to start with "\\"
- if (!('\\' == server[0] && '\\' == server[1]))
- server = @"\\" + server;
- }
-
- if (IsNT)
- EnumerateSharesNT(server, shares);
- else
- EnumerateShares9x(server, shares);
- }
-
- #endregion
-
- #endregion
-
- #region Static methods
-
- /// <summary>
- /// Returns true if fileName is a valid local file-name of the form:
- /// X:\, where X is a drive letter from A-Z
- /// </summary>
- /// <param name="fileName">The filename to check</param>
- /// <returns></returns>
- public static bool IsValidFilePath(string fileName)
- {
- if (null == fileName || 0 == fileName.Length) return false;
-
- char drive = char.ToUpper(fileName[0]);
- if ('A' > drive || drive > 'Z')
- return false;
-
- else if (Path.VolumeSeparatorChar != fileName[1])
- return false;
- else if (Path.DirectorySeparatorChar != fileName[2])
- return false;
- else
- return true;
- }
-
- #endregion
-
- /// <summary>The name of the server this collection represents</summary>
- private string _server;
-
- #region Constructor
-
- /// <summary>
- /// Default constructor - local machine
- /// </summary>
- public ShareCollection()
- {
- _server = string.Empty;
- EnumerateShares(_server, this);
- }
-
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="server">The server.</param>
- public ShareCollection(string server)
- {
- _server = server;
- EnumerateShares(_server, this);
- }
-
- #endregion
-
- #region Add
-
- protected void Add(Share share)
- {
- InnerList.Add(share);
- }
-
- protected void Add(string netName, string path, ShareType shareType, string remark)
- {
- InnerList.Add(new Share(_server, netName, path, shareType, remark));
- }
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Returns the name of the server this collection represents
- /// </summary>
- public string Server
- {
- get { return _server; }
- }
-
- /// <summary>
- /// Returns the <see cref="Share"/> at the specified index.
- /// </summary>
- public Share this[int index]
- {
- get { return (Share)InnerList[index]; }
- }
-
- /// <summary>
- /// Returns the <see cref="Share"/> which matches a given local path
- /// </summary>
- /// <param name="path">The path to match</param>
- public Share this[string path]
- {
- get
- {
- if (null == path || 0 == path.Length) return null;
-
- path = Path.GetFullPath(path);
- if (!IsValidFilePath(path)) return null;
-
- Share match = null;
-
- foreach (object t in InnerList)
- {
- var s = (Share)t;
-
- if (s.IsFileSystem && s.MatchesPath(path))
- {
- //Store first match
- if (null == match)
- match = s;
-
- // If this has a longer path,
- // and this is a disk share or match is a special share,
- // then this is a better match
- else if (match.Path.Length < s.Path.Length)
- {
- if (ShareType.Disk == s.ShareType || ShareType.Disk != match.ShareType)
- match = s;
- }
- }
- }
-
- return match;
- }
- }
-
- #endregion
-
- /// <summary>
- /// Copy this collection to an array
- /// </summary>
- /// <param name="array"></param>
- /// <param name="index"></param>
- public void CopyTo(Share[] array, int index)
- {
- InnerList.CopyTo(array, index);
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs b/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs
deleted file mode 100644
index 95113e0ed..000000000
--- a/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System.Reflection;
-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("Emby Server")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby Server")]
-[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("a5a1e61f-da85-4fd6-9d6d-bcf2bf09c1f8")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-// \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Properties/Resources.Designer.cs b/MediaBrowser.ServerApplication/Properties/Resources.Designer.cs
deleted file mode 100644
index e166f35d0..000000000
--- a/MediaBrowser.ServerApplication/Properties/Resources.Designer.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// <auto-generated>
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.42000
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace MediaBrowser.ServerApplication.Properties {
- using System;
-
-
- /// <summary>
- /// A strongly-typed resource class, for looking up localized strings, etc.
- /// </summary>
- // This class was auto-generated by the StronglyTypedResourceBuilder
- // class via a tool like ResGen or Visual Studio.
- // To add or remove a member, edit your .ResX file then rerun ResGen
- // with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Resources {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal Resources() {
- }
-
- /// <summary>
- /// Returns the cached ResourceManager instance used by this class.
- /// </summary>
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager {
- get {
- if (object.ReferenceEquals(resourceMan, null)) {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MediaBrowser.ServerApplication.Properties.Resources", typeof(Resources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- /// <summary>
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- /// </summary>
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture {
- get {
- return resourceCulture;
- }
- set {
- resourceCulture = value;
- }
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Properties/Resources.resx b/MediaBrowser.ServerApplication/Properties/Resources.resx
deleted file mode 100644
index 29dcb1b3a..000000000
--- a/MediaBrowser.ServerApplication/Properties/Resources.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
- <!--
- Microsoft ResX Schema
-
- Version 2.0
-
- The primary goals of this format is to allow a simple XML format
- that is mostly human readable. The generation and parsing of the
- various data types are done through the TypeConverter classes
- associated with the data types.
-
- Example:
-
- ... ado.net/XML headers & schema ...
- <resheader name="resmimetype">text/microsoft-resx</resheader>
- <resheader name="version">2.0</resheader>
- <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
- <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
- <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
- <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
- <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
- <value>[base64 mime encoded serialized .NET Framework object]</value>
- </data>
- <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
- <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
- <comment>This is a comment</comment>
- </data>
-
- There are any number of "resheader" rows that contain simple
- name/value pairs.
-
- Each data row contains a name, and value. The row also contains a
- type or mimetype. Type corresponds to a .NET class that support
- text/value conversion through the TypeConverter architecture.
- Classes that don't support this are serialized and stored with the
- mimetype set.
-
- The mimetype is used for serialized objects, and tells the
- ResXResourceReader how to depersist the object. This is currently not
- extensible. For a given mimetype the value must be set accordingly:
-
- Note - application/x-microsoft.net.object.binary.base64 is the format
- that the ResXResourceWriter will generate, however the reader can
- read any of the formats listed below.
-
- mimetype: application/x-microsoft.net.object.binary.base64
- value : The object must be serialized with
- : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
- : and then encoded with base64 encoding.
-
- mimetype: application/x-microsoft.net.object.soap.base64
- value : The object must be serialized with
- : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
- : and then encoded with base64 encoding.
-
- mimetype: application/x-microsoft.net.object.bytearray.base64
- value : The object must be serialized into a byte array
- : using a System.ComponentModel.TypeConverter
- : and then encoded with base64 encoding.
- -->
- <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
- <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
- <xsd:element name="root" msdata:IsDataSet="true">
- <xsd:complexType>
- <xsd:choice maxOccurs="unbounded">
- <xsd:element name="metadata">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="value" type="xsd:string" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="name" use="required" type="xsd:string" />
- <xsd:attribute name="type" type="xsd:string" />
- <xsd:attribute name="mimetype" type="xsd:string" />
- <xsd:attribute ref="xml:space" />
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="assembly">
- <xsd:complexType>
- <xsd:attribute name="alias" type="xsd:string" />
- <xsd:attribute name="name" type="xsd:string" />
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="data">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
- <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
- <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
- <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
- <xsd:attribute ref="xml:space" />
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="resheader">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required" />
- </xsd:complexType>
- </xsd:element>
- </xsd:choice>
- </xsd:complexType>
- </xsd:element>
- </xsd:schema>
- <resheader name="resmimetype">
- <value>text/microsoft-resx</value>
- </resheader>
- <resheader name="version">
- <value>2.0</value>
- </resheader>
- <resheader name="reader">
- <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </resheader>
- <resheader name="writer">
- <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </resheader>
-</root> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Resources/Images/mb3logo800.png b/MediaBrowser.ServerApplication/Resources/Images/mb3logo800.png
deleted file mode 100644
index 20c3b9c83..000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/mb3logo800.png
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/ServerNotifyIcon.cs b/MediaBrowser.ServerApplication/ServerNotifyIcon.cs
deleted file mode 100644
index a8c36e4e8..000000000
--- a/MediaBrowser.ServerApplication/ServerNotifyIcon.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Model.Logging;
-using System;
-using System.ComponentModel;
-using System.Windows.Forms;
-using Emby.Server.Implementations.Browser;
-using MediaBrowser.Model.Globalization;
-
-namespace MediaBrowser.ServerApplication
-{
- public class ServerNotifyIcon : IDisposable
- {
- private NotifyIcon notifyIcon1;
- private ContextMenuStrip contextMenuStrip1;
- private ToolStripMenuItem cmdExit;
- private ToolStripMenuItem cmdBrowse;
- private ToolStripMenuItem cmdConfigure;
- private ToolStripSeparator toolStripSeparator2;
- private ToolStripMenuItem cmdRestart;
- private ToolStripSeparator toolStripSeparator1;
- private ToolStripMenuItem cmdCommunity;
- private ToolStripMenuItem cmdPremiere;
- private Container components;
-
- private readonly ILogger _logger;
- private readonly IServerApplicationHost _appHost;
- private readonly IServerConfigurationManager _configurationManager;
- private readonly ILocalizationManager _localization;
-
- public void Invoke(Action action)
- {
- contextMenuStrip1.Invoke(action);
- }
-
- public ServerNotifyIcon(ILogManager logManager,
- IServerApplicationHost appHost,
- IServerConfigurationManager configurationManager,
- ILocalizationManager localization)
- {
- _logger = logManager.GetLogger("MainWindow");
- _localization = localization;
- _appHost = appHost;
- _configurationManager = configurationManager;
-
- components = new System.ComponentModel.Container();
-
- contextMenuStrip1 = new ContextMenuStrip(components);
- notifyIcon1 = new NotifyIcon(components);
-
- cmdExit = new ToolStripMenuItem();
- cmdCommunity = new ToolStripMenuItem();
- cmdPremiere = new ToolStripMenuItem();
- toolStripSeparator1 = new ToolStripSeparator();
- cmdRestart = new ToolStripMenuItem();
- toolStripSeparator2 = new ToolStripSeparator();
- cmdConfigure = new ToolStripMenuItem();
- cmdBrowse = new ToolStripMenuItem();
-
- //
- // notifyIcon1
- //
- notifyIcon1.ContextMenuStrip = contextMenuStrip1;
- notifyIcon1.Icon = new System.Drawing.Icon(GetType().Assembly.GetManifestResourceStream(GetType().Namespace + ".Icon.ico"));
- notifyIcon1.Text = "Emby";
- notifyIcon1.Visible = true;
- //
- // contextMenuStrip1
- //
- contextMenuStrip1.Items.AddRange(new ToolStripItem[] {
- cmdBrowse,
- cmdConfigure,
- cmdPremiere,
- toolStripSeparator2,
- cmdRestart,
- toolStripSeparator1,
- cmdCommunity,
- cmdExit});
- contextMenuStrip1.Name = "contextMenuStrip1";
- contextMenuStrip1.ShowCheckMargin = true;
- contextMenuStrip1.ShowImageMargin = false;
- contextMenuStrip1.Size = new System.Drawing.Size(209, 214);
- //
- // cmdExit
- //
- cmdExit.Name = "cmdExit";
- cmdExit.Size = new System.Drawing.Size(208, 22);
- //
- // cmdCommunity
- //
- cmdCommunity.Name = "cmdCommunity";
- cmdCommunity.Size = new System.Drawing.Size(208, 22);
- //
- // cmdPremiere
- //
- cmdPremiere.Name = "cmdPremiere";
- cmdPremiere.Size = new System.Drawing.Size(208, 22);
- //
- // toolStripSeparator1
- //
- toolStripSeparator1.Name = "toolStripSeparator1";
- toolStripSeparator1.Size = new System.Drawing.Size(205, 6);
- //
- // cmdRestart
- //
- cmdRestart.Name = "cmdRestart";
- cmdRestart.Size = new System.Drawing.Size(208, 22);
- //
- // toolStripSeparator2
- //
- toolStripSeparator2.Name = "toolStripSeparator2";
- toolStripSeparator2.Size = new System.Drawing.Size(205, 6);
- //
- // cmdConfigure
- //
- cmdConfigure.Name = "cmdConfigure";
- cmdConfigure.Size = new System.Drawing.Size(208, 22);
- //
- // cmdBrowse
- //
- cmdBrowse.Name = "cmdBrowse";
- cmdBrowse.Size = new System.Drawing.Size(208, 22);
-
- cmdExit.Click += cmdExit_Click;
- cmdRestart.Click += cmdRestart_Click;
- cmdConfigure.Click += cmdConfigure_Click;
- cmdCommunity.Click += cmdCommunity_Click;
- cmdPremiere.Click += cmdPremiere_Click;
- cmdBrowse.Click += cmdBrowse_Click;
-
- _configurationManager.ConfigurationUpdated += Instance_ConfigurationUpdated;
-
- LocalizeText();
-
- notifyIcon1.DoubleClick += notifyIcon1_DoubleClick;
- }
-
- void notifyIcon1_DoubleClick(object sender, EventArgs e)
- {
- BrowserLauncher.OpenDashboard(_appHost);
- }
-
- private void LocalizeText()
- {
- _uiCulture = _configurationManager.Configuration.UICulture;
-
- cmdExit.Text = "Exit";
- cmdCommunity.Text = "Visit Emby Community";
- cmdPremiere.Text = "Emby Premiere";
- cmdBrowse.Text = "Browse Library";
- cmdConfigure.Text = "Configure Emby Server";
- cmdRestart.Text = "Restart Emby Server";
- }
-
- private string _uiCulture;
- /// <summary>
- /// Handles the ConfigurationUpdated event of the Instance control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
- void Instance_ConfigurationUpdated(object sender, EventArgs e)
- {
- if (!string.Equals(_configurationManager.Configuration.UICulture, _uiCulture,
- StringComparison.OrdinalIgnoreCase))
- {
- LocalizeText();
- }
- }
-
- void cmdBrowse_Click(object sender, EventArgs e)
- {
- BrowserLauncher.OpenWebClient(_appHost);
- }
-
- void cmdPremiere_Click(object sender, EventArgs e)
- {
- BrowserLauncher.OpenEmbyPremiere(_appHost);
- }
-
- void cmdCommunity_Click(object sender, EventArgs e)
- {
- BrowserLauncher.OpenCommunity(_appHost);
- }
-
- void cmdConfigure_Click(object sender, EventArgs e)
- {
- BrowserLauncher.OpenDashboard(_appHost);
- }
-
- void cmdRestart_Click(object sender, EventArgs e)
- {
- _appHost.Restart();
- }
-
- void cmdExit_Click(object sender, EventArgs e)
- {
- _appHost.Shutdown();
- }
-
- public void Dispose()
- {
- Dispose(true);
- }
-
- protected virtual void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (notifyIcon1 != null)
- {
- notifyIcon1.Visible = false;
- notifyIcon1.Dispose();
- notifyIcon1 = null;
- }
-
- if (components != null)
- {
- components.Dispose();
- }
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Splash/SplashForm.Designer.cs b/MediaBrowser.ServerApplication/Splash/SplashForm.Designer.cs
deleted file mode 100644
index 9e6086dc2..000000000
--- a/MediaBrowser.ServerApplication/Splash/SplashForm.Designer.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-namespace MediaBrowser.ServerApplication.Splash
-{
- partial class SplashForm
- {
- /// <summary>
- /// Required designer variable.
- /// </summary>
- private System.ComponentModel.IContainer components = null;
-
- /// <summary>
- /// Clean up any resources being used.
- /// </summary>
- /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- /// <summary>
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- /// </summary>
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashForm));
- this.panelMainContainer = new System.Windows.Forms.Panel();
- this.panel3 = new System.Windows.Forms.Panel();
- this.panel2 = new System.Windows.Forms.Panel();
- this.panelProgress = new System.Windows.Forms.Panel();
- this.panel4 = new System.Windows.Forms.Panel();
- this.lblVersion = new System.Windows.Forms.Label();
- this.lblStatus = new System.Windows.Forms.Label();
- this.panel1 = new System.Windows.Forms.Panel();
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.panelMainContainer.SuspendLayout();
- this.panel2.SuspendLayout();
- this.panel1.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.SuspendLayout();
- //
- // panelMainContainer
- //
- this.panelMainContainer.BackColor = System.Drawing.Color.Gray;
- this.panelMainContainer.Controls.Add(this.panel3);
- this.panelMainContainer.Controls.Add(this.panel2);
- this.panelMainContainer.Controls.Add(this.panel1);
- this.panelMainContainer.Dock = System.Windows.Forms.DockStyle.Fill;
- this.panelMainContainer.Location = new System.Drawing.Point(0, 0);
- this.panelMainContainer.Name = "panelMainContainer";
- this.panelMainContainer.Padding = new System.Windows.Forms.Padding(1);
- this.panelMainContainer.Size = new System.Drawing.Size(648, 347);
- this.panelMainContainer.TabIndex = 0;
- this.panelMainContainer.UseWaitCursor = true;
- //
- // panel3
- //
- this.panel3.BackColor = System.Drawing.Color.White;
- this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom;
- this.panel3.Location = new System.Drawing.Point(1, 277);
- this.panel3.Name = "panel3";
- this.panel3.Size = new System.Drawing.Size(646, 69);
- this.panel3.TabIndex = 2;
- this.panel3.UseWaitCursor = true;
- //
- // panel2
- //
- this.panel2.BackColor = System.Drawing.Color.Gray;
- this.panel2.Controls.Add(this.panelProgress);
- this.panel2.Controls.Add(this.panel4);
- this.panel2.Controls.Add(this.lblVersion);
- this.panel2.Controls.Add(this.lblStatus);
- this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.panel2.Location = new System.Drawing.Point(1, 141);
- this.panel2.Name = "panel2";
- this.panel2.Size = new System.Drawing.Size(646, 205);
- this.panel2.TabIndex = 1;
- this.panel2.UseWaitCursor = true;
- //
- // panelProgress
- //
- this.panelProgress.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(82)))), ((int)(((byte)(181)))), ((int)(((byte)(75)))));
- this.panelProgress.Location = new System.Drawing.Point(0, 125);
- this.panelProgress.Name = "panelProgress";
- this.panelProgress.Size = new System.Drawing.Size(0, 13);
- this.panelProgress.TabIndex = 3;
- this.panelProgress.UseWaitCursor = true;
- //
- // panel4
- //
- this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(73)))), ((int)(((byte)(73)))));
- this.panel4.Location = new System.Drawing.Point(0, 125);
- this.panel4.Name = "panel4";
- this.panel4.Size = new System.Drawing.Size(648, 13);
- this.panel4.TabIndex = 2;
- this.panel4.UseWaitCursor = true;
- //
- // lblVersion
- //
- this.lblVersion.AutoSize = true;
- this.lblVersion.Font = new System.Drawing.Font("Segoe UI", 32F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.lblVersion.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(215)))), ((int)(((byte)(215)))));
- this.lblVersion.Location = new System.Drawing.Point(3, 59);
- this.lblVersion.MaximumSize = new System.Drawing.Size(0, 100);
- this.lblVersion.Name = "lblVersion";
- this.lblVersion.Size = new System.Drawing.Size(267, 59);
- this.lblVersion.TabIndex = 1;
- this.lblVersion.Text = "Version 1234";
- this.lblVersion.UseWaitCursor = true;
- //
- // lblStatus
- //
- this.lblStatus.AutoSize = true;
- this.lblStatus.Font = new System.Drawing.Font("Segoe UI", 32F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.lblStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(215)))), ((int)(((byte)(215)))));
- this.lblStatus.Location = new System.Drawing.Point(3, 0);
- this.lblStatus.MaximumSize = new System.Drawing.Size(0, 100);
- this.lblStatus.Name = "lblStatus";
- this.lblStatus.Size = new System.Drawing.Size(423, 59);
- this.lblStatus.TabIndex = 0;
- this.lblStatus.Text = "Loading Emby Server";
- this.lblStatus.UseWaitCursor = true;
- //
- // panel1
- //
- this.panel1.BackColor = System.Drawing.Color.White;
- this.panel1.Controls.Add(this.pictureBox1);
- this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
- this.panel1.Location = new System.Drawing.Point(1, 1);
- this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(646, 140);
- this.panel1.TabIndex = 0;
- this.panel1.UseWaitCursor = true;
- //
- // pictureBox1
- //
- this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
- this.pictureBox1.Location = new System.Drawing.Point(0, 0);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(646, 140);
- this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.pictureBox1.TabIndex = 0;
- this.pictureBox1.TabStop = false;
- this.pictureBox1.UseWaitCursor = true;
- //
- // SplashForm
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(648, 347);
- this.ControlBox = false;
- this.Controls.Add(this.panelMainContainer);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.Name = "SplashForm";
- this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "Emby";
- this.UseWaitCursor = true;
- this.panelMainContainer.ResumeLayout(false);
- this.panel2.ResumeLayout(false);
- this.panel2.PerformLayout();
- this.panel1.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.Panel panelMainContainer;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Panel panel3;
- private System.Windows.Forms.Label lblStatus;
- private System.Windows.Forms.Label lblVersion;
- private System.Windows.Forms.Panel panel4;
- private System.Windows.Forms.Panel panelProgress;
- private System.Windows.Forms.PictureBox pictureBox1;
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Splash/SplashForm.cs b/MediaBrowser.ServerApplication/Splash/SplashForm.cs
deleted file mode 100644
index 1260c3405..000000000
--- a/MediaBrowser.ServerApplication/Splash/SplashForm.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace MediaBrowser.ServerApplication.Splash
-{
- public partial class SplashForm : Form
- {
- private readonly TaskScheduler _uiThread;
-
- private readonly Progress<double> _progress;
-
- public SplashForm(Version version, Progress<double> progress)
- {
- InitializeComponent();
-
- lblVersion.Text = string.Format("Version {0}...", version);
-
- _progress = progress;
-
- progress.ProgressChanged += progress_ProgressChanged;
- _uiThread = TaskScheduler.FromCurrentSynchronizationContext();
- }
-
- async void progress_ProgressChanged(object sender, double e)
- {
- await Task.Factory.StartNew(() =>
- {
- var width = e * 6.48;
-
- panelProgress.Width = Convert.ToInt32(width);
-
- }, CancellationToken.None, TaskCreationOptions.None, _uiThread);
- }
-
- protected override void OnClosing(CancelEventArgs e)
- {
- _progress.ProgressChanged += progress_ProgressChanged;
-
- base.OnClosing(e);
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/Splash/SplashForm.resx b/MediaBrowser.ServerApplication/Splash/SplashForm.resx
deleted file mode 100644
index 99fcc8b74..000000000
--- a/MediaBrowser.ServerApplication/Splash/SplashForm.resx
+++ /dev/null
@@ -1,666 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
- <!--
- Microsoft ResX Schema
-
- Version 2.0
-
- The primary goals of this format is to allow a simple XML format
- that is mostly human readable. The generation and parsing of the
- various data types are done through the TypeConverter classes
- associated with the data types.
-
- Example:
-
- ... ado.net/XML headers & schema ...
- <resheader name="resmimetype">text/microsoft-resx</resheader>
- <resheader name="version">2.0</resheader>
- <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
- <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
- <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
- <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
- <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
- <value>[base64 mime encoded serialized .NET Framework object]</value>
- </data>
- <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
- <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
- <comment>This is a comment</comment>
- </data>
-
- There are any number of "resheader" rows that contain simple
- name/value pairs.
-
- Each data row contains a name, and value. The row also contains a
- type or mimetype. Type corresponds to a .NET class that support
- text/value conversion through the TypeConverter architecture.
- Classes that don't support this are serialized and stored with the
- mimetype set.
-
- The mimetype is used for serialized objects, and tells the
- ResXResourceReader how to depersist the object. This is currently not
- extensible. For a given mimetype the value must be set accordingly:
-
- Note - application/x-microsoft.net.object.binary.base64 is the format
- that the ResXResourceWriter will generate, however the reader can
- read any of the formats listed below.
-
- mimetype: application/x-microsoft.net.object.binary.base64
- value : The object must be serialized with
- : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
- : and then encoded with base64 encoding.
-
- mimetype: application/x-microsoft.net.object.soap.base64
- value : The object must be serialized with
- : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
- : and then encoded with base64 encoding.
-
- mimetype: application/x-microsoft.net.object.bytearray.base64
- value : The object must be serialized into a byte array
- : using a System.ComponentModel.TypeConverter
- : and then encoded with base64 encoding.
- -->
- <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
- <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
- <xsd:element name="root" msdata:IsDataSet="true">
- <xsd:complexType>
- <xsd:choice maxOccurs="unbounded">
- <xsd:element name="metadata">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="value" type="xsd:string" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="name" use="required" type="xsd:string" />
- <xsd:attribute name="type" type="xsd:string" />
- <xsd:attribute name="mimetype" type="xsd:string" />
- <xsd:attribute ref="xml:space" />
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="assembly">
- <xsd:complexType>
- <xsd:attribute name="alias" type="xsd:string" />
- <xsd:attribute name="name" type="xsd:string" />
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="data">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
- <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
- <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
- <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
- <xsd:attribute ref="xml:space" />
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="resheader">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required" />
- </xsd:complexType>
- </xsd:element>
- </xsd:choice>
- </xsd:complexType>
- </xsd:element>
- </xsd:schema>
- <resheader name="resmimetype">
- <value>text/microsoft-resx</value>
- </resheader>
- <resheader name="version">
- <value>2.0</value>
- </resheader>
- <resheader name="reader">
- <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </resheader>
- <resheader name="writer">
- <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </resheader>
- <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
- <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
- <value>
- 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
- TkSuQmCC
-</value>
- </data>
- <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
- <value>
- AAABAAgAMDAAAAEAIACoJQAAhgAAADAwAAABAAgAqA4AAC4mAAAgIAAAAQAgAKgQAADWNAAAICAAAAEA
- CACoCAAAfkUAABgYAAABACAAiAkAACZOAAAYGAAAAQAIAMgGAACuVwAAEBAAAAEAIABoBAAAdl4AABAQ
- AAABAAgAaAUAAN5iAAAoAAAAMAAAAGAAAAABACAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu2UkpItlMxAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7RQM0u1Uv9LtVL/S7NSJQAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKtFIfS7VS/0u1
- Uv9LtVL/S7VS/0i2SAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEuz
- Uz1LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9ItkgHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAS7NRTku1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7NSJQAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLs1FOS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0i2
- UzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEuzUz1LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv/OtgAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASrRSH0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/xsYACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtFAzS7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqAAMAAAAAAAAAAEu2UkpLtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv/atgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv/MuwAPTLVSUEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/0rwAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/9K8ABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv/atgAOAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/8Dkwf9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////bsBk/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS//////////////////////9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////
- /////////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////
- ///////////////////////////////////d6sP/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/////////////////////////////////////////////////0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////////////////////////////////////
- ////////S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////////////////////
- //////////////////////////////////9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////
- ////////////////////////////////////////////////////////0uOr/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAA/wABS7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////
- ////////////////////////////////////////////////////////////////////////V7lZ/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/////////////////////////////////////////////////////////////////7Dd
- rP9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////////////////////////////////////
- ////////S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9ItlMxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////////////////////
- /////////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0uzUiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////
- //////////////////9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/SLZIBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAD/AAFLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////
- ////////////////////////+fff/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9ItkgHAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS//////////////////////9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/9S4ABIAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/1L8AGAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/1q6Xf9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv/OtgAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/8bGAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv/atgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/9K8ABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtFHOAAAAAEu1Uv9LtVL/0rwAFwAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0q0UdQAAAAAAAAAAAAAAADatgAOAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/SrVS7AAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0q0
- UuIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/SrVS0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9KtVLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0q0UuIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9KtVLsAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEq0UdQAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///+f//8AAP///w///wAA///+B///
- AAD///wD//8AAP//+AH//wAA///wAP//AAD//+AAf/8AAP//wAA//wAA//+AAB//AAD/8wAAD/8AAP/g
- AAAH/wAA/8AAAAP/AAD/gAAAA/8AAP8AAAAH/wAA/gAAAAP/AAD8AAAAAf8AAPgAAAAA/wAA8AAAAAB/
- AADgAAAAAD8AAMAAAAAAHwAAgAAAAAAPAACAAAAAAAcAAMAAAAAAAwAA4AAAAAABAADwAAAAAAAAAPgA
- AAAAAQAA/AAAAAADAAD+AAAAAAcAAP8AAAAADwAA/4AAAAAfAAD/wAAAAD8AAP/gAAAAfwAA/+AAAAD/
- AAD/wAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/8AAAT/8AAP/4AAD//wAA//wAAf//AAD//gAD//8AAP//
- AAf//wAA//+AD///AAD//8Af//8AAP//4D///wAA///wf///AAD///j///8AAP///f///wAAKAAAADAA
- AABgAAAAAQAIAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAP9vtzz/cLc8/1+2Rv9RtU//S7VS/0y1
- Uf9NtVH/TrVQ/0+1UP9NtlP/TbZU/062VP9Rt1f/VLla/1W5W/9WuVz/Y7ZD/2C2Rf9htkX/YrZE/2O2
- RP9otkD/Yb5m/2S/aP9mv2j/aMBq/3jHef95x3z/e8h8/3zIfP9+yX//f8qD/4PMiP+R0ZL/ktGS/5TS
- lP+V0pX/mdSY/6jaqP+s3Kv/r92t/7Ddrv/G5sL/xufF/8jnxv/L6cj/3fDb/9/x3f/g8d3/4/Pg/+/4
- 7f/x+e//8vnv//r8+P/7/fn//v/+/////v8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAABQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUFAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQUFBQAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAUFBQUFBQUFBQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUF
- BQUFBQUFBQUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBQMA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUFBQUFBQUFBQUFBQYDAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAUFBQUFBQUFBQUFBQUFBQUGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAUEgAABQUFBQUFBQUFBQUFBQUFBQUFBgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUHBhIFBQUFBQUF
- BQUFBQUFBQUFBQUFBQYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQcFBQYFBQUFBQUFBQUFBQUFBQUFBQUF
- BQUGAwAAAAAAAAAAAAAAAAAAAAAAAAAVBwUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBhIAAAAAAAAA
- AAAAAAAAAAAAABUHBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCBUAAAAAAAAAAAAAAAAAAAAAFQcF
- BQUFBQUFBQUGBQUFBQUFBQUFBQUFBQUFBQUFEwAAAAAAAAAAAAAAAAAAAAAVBwUFBQUFBQUFBQUgKg8F
- BQUFBQUFBQUFBQUFBQUFBQUAAAAAAAAAAAAAAAAAABUHBQUFBQUFBQUFBQUhOTUkDAUFBQUFBQUFBQUF
- BQUFBQUFAAAAAAAAAAAAAAAAFQcFBQUFBQUFBQUFBQUhOTk5MR4FBQUFBQUFBQUFBQUFBQUFBQAAAAAA
- AAAAAAASBwUFBQUFBQUFBQUFBQUhOTk5OTgsGAUFBQUFBQUFBQUFBQUFBQUAAAAAAAAAAAUFBQUFBQUF
- BQUFBQUFBQUhOTk5OTk5NygOBQUFBQUFBQUFBQUFBQUFAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUhOTk5
- OTk5OTkzIwsFBQUFBQUFBQUFBQUFBQAAAAAFBQUFBQUFBQUFBQUFBQUFBQUhOTk5OTk5OTk5OS8bBQUF
- BQUFBQUFBQUFBQUAAAAFBQUFBQUFBQUFBQUFBQUFBQUhOTk5OTk5OTk5OTk4KxcFBQUFBQUFBQUFBQUF
- AAAABQUFBQUFBQUFBQUFBQUFBQUhOTk5OTk5OTk5OTk5OTYnDQUFBQUFBQUFBQUFBQAAAAUFBQUFBQUF
- BQUFBQUFBQUhOTk5OTk5OTk5OTk5OTMiCwUFBQUFBQUFBQUFBQUAAAAFBQUFBQUFBQUFBQUFBQUhOTk5
- OTk5OTk5OTk2KQ4FBQUFBQUFBQUFBQUFBQUAAAAABQUFBQUFBQUFBQUFBQUhOTk5OTk5OTk5OS0ZBQUF
- BQUFBQUFBQUFBQUFBQUAAAAAAAUFBQUFBQUFBQUFBQUhOTk5OTk5OTkwHQUFBQUFBQUFBQUFBQUFBQUF
- BQAAAAAAAAAFBQUFBQUFBQUFBQUhOTk5OTk5NCUKBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAAAAAABQUF
- BQUFBQUFBQUhOTk5OTcpEAUFBQUFBQUFBQUFBQUFBQUFBQUAAAAAAAAAAAAAAAUFBQUFBQUFBQUhOTk5
- LhoFBQUFBQUFBQUFBQUFBQUFBQUGAwAAAAAAAAAAAAAAAAAFBQUFBQUFBQUhOTIfBQUFBQUFBQUFBQUF
- BQUFBQUFBQYDAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUcJgsFBQUFBQUFBQUFBQUFBQUFBQUFBgMAAAAA
- AAAAAAAAAAAAAAAAFgcFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUGAwAAAAAAAAAAAAAAAAAAAAAW
- CQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQYDAAAAAAAAAAAAAAAAAAAAAAARBwUFBQUFBQUFBQUF
- BQUFBQUFBQUFBQUFBQUFBgMAAAAAAAAAAAAAAAAAAAAAAAAAFQcFBQUFBQUFBQUFBQUFBQUFBQUFBQUH
- BQUGAwAAAAAAAAAAAAAAAAAAAAAAAAAAABUHBQUFBQUFBQUFBQUFBQUFBQUFBQUBBAYDAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAUBwUFBQUFBQUFBQUFBQUFBQUFBQUAAhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAFAcFBQUFBQUFBQUFBQUFBQUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQHBQUFBQUF
- BQUFBQUFBQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVBwUFBQUFBQUFBQUFBQUAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQcFBQUFBQUFBQUFBQAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAABQHBQUFBQUFBQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAVBwUFBQUFBQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQcF
- BQUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUHBQUFAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVBwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAD///////8AAP///5///wAA////D///AAD///4H//8AAP///AP//wAA///4Af//AAD///AA//8AAP//
- 4AB//wAA///AAD//AAD//4AAH/8AAP/zAAAP/wAA/+AAAAf/AAD/wAAAA/8AAP+AAAAD/wAA/wAAAAf/
- AAD+AAAAA/8AAPwAAAAB/wAA+AAAAAD/AADwAAAAAH8AAOAAAAAAPwAAwAAAAAAfAACAAAAAAA8AAIAA
- AAAABwAAwAAAAAADAADgAAAAAAEAAPAAAAAAAAAA+AAAAAABAAD8AAAAAAMAAP4AAAAABwAA/wAAAAAP
- AAD/gAAAAB8AAP/AAAAAPwAA/+AAAAB/AAD/4AAAAP8AAP/AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/w
- AABP/wAA//gAAP//AAD//AAB//8AAP/+AAP//wAA//8AB///AAD//4AP//8AAP//wB///wAA///gP///
- AAD///B///8AAP//+P///wAA///9////AAAoAAAAIAAAAEAAAAABACAAAAAAAAAgAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/AAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtFH+S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv/8/fz/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS//z9/P///////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVH/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL//P38//////////////////////9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv/8/fz/////////////////////////
- ///q8dP/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS//z9/P//////////////
- ////////////////////////S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL//P38////
- /////////////////////////////////////////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv/8/fz/////////////////////////////////////////////////S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS//z9/P//////////////////////////////////////S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL//P38////////////////////////////mspu/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv/8/fz//////////////////v7+/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS//z9/P///////////0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL//P38/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAEu1
- Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu0Uf5LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uf9LtVL/S7VS/0u1
- Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//v////x////4P///8B///+AP///AB//9gAP/+AAB//AAAP/gA
- AH/wAAB/4AAAP8AAAB+AAAAPAAAAB4AAAAPAAAAB4AAAAPAAAAH4AAAD/AAAB/4AAA/+AAAf/AAAP/4A
- AH//AAb//4AP///AH///4D////B////4/////f//KAAAACAAAABAAAAAAQAIAAAAAAAACAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAP95tzb/erc2/3u3Nf9wtzz/VrZL/1C1T/9RtU7/UrVO/1O1Tf9VtUz/VbZM/0u1
- Uv9NtVH/TrVQ/0+1UP9NtlT/ULdW/1a5W/9gtkb/Y7ZE/2i2QP9bu2D/Zb9p/2vCb/9vw3L/d8d6/33J
- fv+NuCr/jrgq/4+4Kf+SuSf/k7kn/5C5Kf+SuSj/hcyG/4fNif+U0pX/l9OY/5bUmf+e15//n9eh/63d
- rv+s3bD/uOG5/8jox//Q68//0+zS/97x3f/h8t//5vTl//D47//1+/T/+/36//3+/f//////AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAADAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAYCAAAAAAAAAAAAAAAAAAAA
- AAAAAAAMDAwMDAwMDAwMDAcBAAAAAAAAAAAAAAAAAAAAIAsTDAwMDAwMDAwMDAwMDAcDAAAAAAAAAAAA
- AAAAACAJDA4MDAwMDAwMDAwMDAwMDAcDAAAAAAAAAAAAAAAdCQwMDAwMDAwMDAwMDAwMDAwMDAoAAAAA
- AAAAAAAAHgkMDAwMDAwMDAwMDAwMDAwMDAwNFAAAAAAAAAAAACAJDAwMDAwMDCkmEAwMDAwMDAwMDAwM
- AAAAAAAAAAAhCQwMDAwMDAwMKzcxGwwMDAwMDAwMDAwMAAAAAAAADAcMDAwMDAwMDAwrNzc3LRcMDAwM
- DAwMDAwMAAAAAAwMDAwMDAwMDAwMDCs3Nzc3NSoSDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMKzc3Nzc3
- NzMlEAwMDAwMDAwMAAAMDAwMDAwMDAwMDAwrNzc3Nzc3NzcwGgwMDAwMDAwMAAAMDAwMDAwMDAwMDCs3
- Nzc3Nzc3Ny4YDAwMDAwMDAwMAAAMDAwMDAwMDAwMKzc3Nzc3NzIjDAwMDAwMDAwMDAwAAAAMDAwMDAwM
- DAwrNzc3NzQoEQwMDAwMDAwMDAwMDAAAAAAMDAwMDAwMDCs3NzYsFgwMDAwMDAwMDAwMDAwAAAAAAAAM
- DAwMDAwMKzcvGQwMDAwMDAwMDAwMDAcCAAAAAAAAAAAMDAwMDAwnJAwMDAwMDAwMDAwMDAwHAwAAAAAA
- AAAAABUPDAwMDAwMDAwMDAwMDAwMDAwMBwIAAAAAAAAAAAAABQwMDAwMDAwMDAwMDAwMDAwMDAcBAAAA
- AAAAAAAAAAAfCQwMDAwMDAwMDAwMDAwMDwwHAgAAAAAAAAAAAAAAAAAfCQwMDAwMDAwMDAwMDAwEBQIA
- AAAAAAAAAAAAAAAAAAAcCQwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAeCQwMDAwMDAwMDAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAgCQwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCQwMDAwM
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdCQwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi
- CAwAAAAAAAAAAAAAAAAAAAAA//+/////H////g////wH///4A///8AH//2AA//4AAH/8AAA/+AAAf/AA
- AH/gAAA/wAAAH4AAAA8AAAAHgAAAA8AAAAHgAAAA8AAAAfgAAAP8AAAH/gAAD/4AAB/8AAA//gAAf/8A
- Bv//gA///8Af///gP///8H////j////9//8oAAAAGAAAADAAAAABACAAAAAAAAASAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASrRSQUm1
- Ty0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJtU8tS7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEuz
- UVFLtVL/S7VS/0u1Uv9LtVL/SbVPLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASbVPLUu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/8+/
- ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AABKtFJBS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv/UqgAGAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/2S1QV5LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/1L8AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL///////////9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL//////////////////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/////////////////////////
- ///29+b/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL//////////////////////////////////////0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/////////
- /////////////////////////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL///////////////////////////+l1ZP/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9JtU8tAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL//////////////////////0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/wAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL///////////9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/0LkAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv/PvwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/9SqAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u0
- UtJLtVL/1L8AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/SrVR3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9KtVLyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u0Uc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1
- Uv9LtVL/SrVS8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKtVHeAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP/z/wD/4f8A/8D/AP+AfwD9AD8A+AAfAPAA
- HwDgAA8AwAAHAIAAAwCAAAEAwAAAAOAAAQDwAAMA+AAHAPwADwD4AB8A/AA/AP4A/wD/Af8A/4P/AP/H
- /wD/7/8AKAAAABgAAAAwAAAAAQAIAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9UtUz/VbZM/0u1
- Uv9MtVH/TbVR/061UP9PtVD/TLZT/062VP9SuFj/Vrlc/2W2Qv9htkX/Xr1j/2XAav9qwW7/ccR1/3LF
- dv99yYD/iM6L/5PSlv+j2aX/r92w/73kvv/B5sP/yejJ/9ju1//h8uD/6vbp//H58P/3/Pb/+/36//7+
- /v//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAA
- AAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAAAAAAAA
- AAAAAAAAAAAAAAADAwMDAwMDAQAAAAAAAAAAAAAAAAANAAMDAwMDAwMDAwEAAAAAAAAAAAAAAAIEBgMD
- AwMDAwMDAwMBAAAAAAAAAAAAAgQDAwMDAwMDAwMDAwMEDQAAAAAAAAACBAMDAwMRCQMDAwMDAwMFAwAA
- AAAAAAIEAwMDAwMZHBMDAwMDAwMDAwMAAAAABwQDAwMDAwMZIiIaDwMDAwMDAwMDAAADAwMDAwMDAwMZ
- IiIiIBcLAwMDAwMDAwADAwMDAwMDAwMZIiIiIiIeFQgDAwMDAwMAAwMDAwMDAwMZIiIiIiIdFAMDAwMD
- AwMAAAMDAwMDAwMZIiIiHxYKAwMDAwMDAwMAAAADAwMDAwMZIiEYDgMDAwMDAwMDAwAAAAAAAwMDAwMZ
- GxIDAwMDAwMDAwMBAAAAAAAAAAYDAwMQBAMDAwMDAwMDAwEAAAAAAAAADAUDAwMDAwMDAwMDAwMDAQAA
- AAAAAAAAAAIEAwMDAwMDAwMDBQUBAAAAAAAAAAAAAAACBAMDAwMDAwMDAwwAAAAAAAAAAAAAAAAAAgQD
- AwMDAwMDAAAAAAAAAAAAAAAAAAAAAAIEAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAACBAMDAwAAAAAAAAAA
- AAAAAAAAAAAAAAAAAgQDAAAAAAAAAAAAAAD///8A//P/AP/h/wD/wP8A/4B/AP0APwD4AB8A8AAfAOAA
- DwDAAAcAgAADAIAAAQDAAAAA4AABAPAAAwD4AAcA/AAPAPgAHwD8AD8A/gD/AP8B/wD/g/8A/8f/AP/v
- /wAoAAAAEAAAACAAAAABACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv//////S7VS/0u1Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAA
- AAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/////////////////S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv8AAAAAAAAAAEu1Uv9LtVL/S7VS/0u1Uv9LtVL/S7VS////////////////////////////S7VS/0u1
- Uv9LtVL/S7VS/wAAAAAAAAAAS7VS/0u1Uv9LtVL/S7VS/0u1Uv//////////////////////sN2s/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/////////////////S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS//////9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAABLtVL/S7VS/0u1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEu1Uv9LtVL/S7VS/0u1
- Uv9LtVL/S7VS/0u1Uv9LtVL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS7VS/0u1
- Uv9LtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AABLtVL/S7VS/0u1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAEu1Uv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9/AAD+PwAA/B8AAPAP
- AADgBwAAwAcAAIADAAAAAQAAgAAAAMABAADgAwAA4AcAAPAPAAD4PwAA/H8AAP7/AAAoAAAAEAAAACAA
- AAABAAgAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA/0+1T/9QtU//VLVM/1W2TP9LtVL/TLVR/021
- Uf9PtVD/U7hZ/1a5XP9hvmb/ZsBr/3bGev99yYH/qNuq/6/esf+y37T/uOK6/8Lmw//K6cr/1u7X//n8
- +f/7/fv////+/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
- AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAFBQUAAAAAAAAAAAAAAAAFBQUF
- BQAAAAAAAAAAAAAFBQUFBQYDAAAAAAAAAAQBBQUFBQUFBgMAAAAAAAQGBQUFBQUFBQUIAAAAAAQGBQUF
- Eg4FBQUFBQUAAAUGBQUFBRUYFAwFBQUFBQAFBQUFBQUVGBgXEAoFBQUFBQUFBQUFFRgYFg8JBQUFBQAF
- BQUFBRUYEwsFBQUFBQUAAAUFBQURDQUFBQUFBgMAAAAAAgUFBQUFBQUFBgMAAAAAAAQGBQUFBQUFAQMA
- AAAAAAAABAYFBQUFBQAAAAAAAAAAAAAEBgUFBQAAAAAAAAAAAAAAAAQHBQAAAAAAAAD/fwAA/j8AAPwf
- AADwDwAA4AcAAMAHAACAAwAAAAEAAIAAAADAAQAA4AMAAOAHAADwDwAA+D8AAPx/AAD+/wAA
-</value>
- </data>
-</root> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/SplashLogo2.png b/MediaBrowser.ServerApplication/SplashLogo2.png
deleted file mode 100644
index abb73577e..000000000
--- a/MediaBrowser.ServerApplication/SplashLogo2.png
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Updates/ApplicationUpdater.cs b/MediaBrowser.ServerApplication/Updates/ApplicationUpdater.cs
deleted file mode 100644
index aa8679bd5..000000000
--- a/MediaBrowser.ServerApplication/Updates/ApplicationUpdater.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Model.Logging;
-using System.Diagnostics;
-using System.IO;
-
-namespace MediaBrowser.ServerApplication.Updates
-{
- /// <summary>
- /// Update the specified application using the specified archive
- /// </summary>
- public class ApplicationUpdater
- {
- private const string UpdaterExe = "Mediabrowser.Updater.exe";
- private const string UpdaterDll = "Mediabrowser.InstallUtil.dll";
- public void UpdateApplication(IApplicationPaths appPaths, string archive, ILogger logger, string restartServiceName)
- {
- // First see if there is a version file and read that in
- var version = "Unknown";
- if (File.Exists(archive + ".ver"))
- {
- version = File.ReadAllText(archive + ".ver");
- }
-
- var systemPath = appPaths.ProgramSystemPath;
- var tempPath = Path.GetTempPath();
-
- // Use our installer passing it the specific archive
- // We need to copy to a temp directory and execute it there
- var source = Path.Combine(systemPath, UpdaterExe);
-
- logger.Info("Copying updater to temporary location");
- var tempUpdater = Path.Combine(tempPath, UpdaterExe);
- File.Copy(source, tempUpdater, true);
- source = Path.Combine(systemPath, UpdaterDll);
- var tempUpdaterDll = Path.Combine(tempPath, UpdaterDll);
-
- logger.Info("Copying updater dependencies to temporary location");
- File.Copy(source, tempUpdaterDll, true);
- var product = "server";
-
- logger.Info("Starting updater process.");
-
- // installpath = program data folder
- // startpath = executable to launch
- // systempath = folder containing installation
- var args = string.Format("product={0} archive=\"{1}\" caller={2} pismo=false version={3} service={4} installpath=\"{5}\" startpath=\"{6}\" systempath=\"{7}\"",
- product, archive, Process.GetCurrentProcess().Id, version, restartServiceName ?? string.Empty, appPaths.ProgramDataPath, MainStartup.ApplicationPath, systemPath);
-
- logger.Info("Args: {0}", args);
-
- Process.Start(new ProcessStartInfo
- {
- FileName = tempUpdater,
- Arguments = args,
- UseShellExecute = false,
- CreateNoWindow = true,
- ErrorDialog = false,
- WindowStyle = ProcessWindowStyle.Hidden,
- WorkingDirectory = Path.GetDirectoryName(tempUpdater)
- });
-
- // That's it. The installer will do the work once we exit
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/WindowsAppHost.cs b/MediaBrowser.ServerApplication/WindowsAppHost.cs
deleted file mode 100644
index 9896b75e3..000000000
--- a/MediaBrowser.ServerApplication/WindowsAppHost.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Reflection;
-using System.Runtime.InteropServices.ComTypes;
-using Emby.Server.CinemaMode;
-using Emby.Server.Connect;
-using Emby.Server.Implementations;
-using Emby.Server.Implementations.EntryPoints;
-using Emby.Server.Implementations.FFMpeg;
-using Emby.Server.Implementations.IO;
-using Emby.Server.Sync;
-using MediaBrowser.Controller.Connect;
-using MediaBrowser.Controller.Sync;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.System;
-using MediaBrowser.Model.Updates;
-using MediaBrowser.Server.Startup.Common;
-using MediaBrowser.ServerApplication.Native;
-
-namespace MediaBrowser.ServerApplication
-{
- public class WindowsAppHost : ApplicationHost
- {
- public WindowsAppHost(ServerApplicationPaths applicationPaths, ILogManager logManager, StartupOptions options, IFileSystem fileSystem, IPowerManagement powerManagement, string releaseAssetFilename, IEnvironmentInfo environmentInfo, MediaBrowser.Controller.Drawing.IImageEncoder imageEncoder, ISystemEvents systemEvents, MediaBrowser.Common.Net.INetworkManager networkManager)
- : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, networkManager)
- {
- fileSystem.AddShortcutHandler(new LnkShortcutHandler());
- }
-
- protected override IConnectManager CreateConnectManager()
- {
- return new ConnectManager();
- }
-
- protected override ISyncManager CreateSyncManager()
- {
- return new SyncManager();
- }
-
- protected override void RestartInternal()
- {
- MainStartup.Restart();
- }
-
- public override void EnableLoopback(string appName)
- {
- LoopUtil.Run(appName);
- }
-
- protected override List<Assembly> GetAssembliesWithPartsInternal()
- {
- var list = new List<Assembly>();
-
- list.Add(typeof(DefaultIntroProvider).Assembly);
- list.Add(typeof(ConnectManager).Assembly);
- list.Add(typeof(SyncManager).Assembly);
- list.Add(GetType().Assembly);
-
- return list;
- }
-
- protected override void ShutdownInternal()
- {
- MainStartup.Shutdown();
- }
-
- protected override void AuthorizeServer()
- {
- ServerAuthorization.AuthorizeServer(UdpServerEntryPoint.PortNumber,
- ServerConfigurationManager.Configuration.HttpServerPortNumber,
- ServerConfigurationManager.Configuration.HttpsPortNumber,
- MainStartup.ApplicationPath,
- ConfigurationManager.CommonApplicationPaths.TempDirectory);
- }
-
- protected override void ConfigureAutoRunInternal(bool autorun)
- {
- var startupPath = Environment.GetFolderPath(System.Environment.SpecialFolder.Startup);
-
- if (autorun && !MainStartup.IsRunningAsService)
- {
- //Copy our shortut into the startup folder for this user
- var targetPath = Path.Combine(startupPath, "Emby Server.lnk");
-
- IShellLinkW link = (IShellLinkW)new ShellLink();
-
- var appPath = Process.GetCurrentProcess().MainModule.FileName;
-
- // setup shortcut information
- link.SetDescription(Name);
- link.SetPath(appPath);
- link.SetWorkingDirectory(Path.GetDirectoryName(appPath));
-
- // save it
- IPersistFile file = (IPersistFile)link;
- file.Save(targetPath, true);
- }
- else
- {
- //Remove our shortcut from the startup folder for this user
- FileSystemManager.DeleteFile(Path.Combine(startupPath, "Emby Server.lnk"));
- }
- }
-
- public override bool CanSelfRestart
- {
- get
- {
- return MainStartup.CanSelfRestart;
- }
- }
-
- public override bool CanSelfUpdate
- {
- get
- {
- return MainStartup.CanSelfUpdate;
- }
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/app.manifest b/MediaBrowser.ServerApplication/app.manifest
deleted file mode 100644
index d040f5fb9..000000000
--- a/MediaBrowser.ServerApplication/app.manifest
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
- <security>
- <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
- <!-- UAC Manifest Options
- If you want to change the Windows User Account Control level replace the
- requestedExecutionLevel node with one of the following.
-
- <requestedExecutionLevel level="asInvoker" uiAccess="false" />
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
- <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
-
- Specifying requestedExecutionLevel node will disable file and registry virtualization.
- If you want to utilize File and Registry Virtualization for backward
- compatibility then delete the requestedExecutionLevel node.
- -->
- </requestedPrivileges>
- <applicationRequestMinimum>
- <defaultAssemblyRequest permissionSetReference="Custom" />
- <PermissionSet ID="Custom" SameSite="site" Unrestricted="true" />
- </applicationRequestMinimum>
- </security>
- </trustInfo>
- <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
- <application>
- <!-- A list of all Windows versions that this application is designed to work with.
- Windows will automatically select the most compatible environment.-->
- <!-- If your application is designed to work with Windows Vista, uncomment the following supportedOS node-->
- <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->
- <!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node-->
- <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
- <!-- If your application is designed to work with Windows 8, uncomment the following supportedOS node-->
- <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->
- </application>
- </compatibility>
- <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
- <!-- <dependency>
- <dependentAssembly>
- <assemblyIdentity
- type="win32"
- name="Microsoft.Windows.Common-Controls"
- version="6.0.0.0"
- processorArchitecture="*"
- publicKeyToken="6595b64144ccf1df"
- language="*"
- />
- </dependentAssembly>
- </dependency>-->
-</asmv1:assembly> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
deleted file mode 100644
index e40a3ab15..000000000
--- a/MediaBrowser.ServerApplication/packages.config
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
- <package id="SharpCompress" version="0.18.2" targetFramework="net462" />
- <package id="SimpleInjector" version="4.0.12" targetFramework="net462" />
- <package id="SkiaSharp" version="1.58.1" targetFramework="net462" />
- <package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net462" />
- <package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.8" targetFramework="net462" />
-</packages> \ No newline at end of file