private ComputeSoap ProviderComputeSoap()
        {
            IAuthenticatingMessageInspector authenticatingMessageInspector = new AuthenticatingMessageInspector
            {
                HttpRequestMessageProperty = new HttpRequestMessageProperty()
            };

            authenticatingMessageInspector.HttpRequestMessageProperty.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + LoginManager.RefreshServiceTicket());
            authenticatingMessageInspector.HttpRequestMessageProperty.Headers.Set("X-Grant", LoginManager.XGrant);

            LoggingMessageInspector loggingMessageInspector = new LoggingMessageInspector();

            ICallbackMessageInspector callbackMessageInspector = new CallbackMessageInspector();

            callbackMessageInspector.RequestCallbacks.Add(message => Logger.LogEvent("REQUEST " + message));
            callbackMessageInspector.ResponseCallbacks.Add(message => Logger.LogEvent("RESPONSE"));
            ICollection <IClientMessageInspector> inspectors = new Collection <IClientMessageInspector>()
            {
                authenticatingMessageInspector, loggingMessageInspector, callbackMessageInspector
            };
            ICollection <Action <HttpWebResponse> > handlers = new Collection <Action <HttpWebResponse> >()
            {
                HttpWebReponseHandler
            };
            ICollection <Action <FaultException> > faultHandlers = new Collection <Action <FaultException> >()
            {
                FaultHandler
            };
            ICollection <Action <Exception> > exceptionHandlers = new Collection <Action <Exception> >()
            {
                ExceptionHandler
            };

            return(ClientBaseUtils.InitClientBase <ComputeSoap, ComputeSoapClient>(new EndpointAddress(configuration.AppSettings.Settings[OPTOPLUS_API_ENDPOINT].Value + "/optoplus-services-web/ComputeSoap"), inspectors, handlers, faultHandlers, exceptionHandlers));
        }
        protected override void OnStart(string[] args)
        {
            if (args.Length >= 2)
            {
                CredentialManager.SaveCredentials(ServiceName, new NetworkCredential(args[0], args[1]));
                Logger.LogEvent("Credential changed to " + args[0], eventType: EventTypes.Configuration);
                RecursiveSave(args.Skip(2), new List <string>()
                {
                    CAS_API_ENDPOINT, OPTOPLUS_API_ENDPOINT, INPUT_PATH, OUTPUT_PATH, PROCESSED_PATH, ERROR_PATH, SURFACE_PATH, ANALYSIS_PATH, OUTPUT_FORMAT, GAX, LAPGAX
                });
            }

            string defaultPath         = Path.Combine(Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)), ServiceName);
            string defaultFallbackPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), ServiceName);

            string chosenDefaultPath = null;

            string[] attemptedPaths = { defaultPath, defaultFallbackPath };
            foreach (string attemptedPath in attemptedPaths)
            {
                try
                {
                    Directory.CreateDirectory(attemptedPath);
                    chosenDefaultPath = attemptedPath;
                    break;
                }
                catch (Exception e)
                {
                    Logger.LogEvent("Unable to use " + attemptedPath + " as default directory" + Environment.NewLine + e.StackTrace, EventLogEntryType.Warning);
                }
            }

            new List <string>()
            {
                INPUT_PATH, OUTPUT_PATH, PROCESSED_PATH, ERROR_PATH, SURFACE_PATH, ANALYSIS_PATH
            }.FindAll(key => configuration.AppSettings.Settings[key] is null || string.IsNullOrWhiteSpace(configuration.AppSettings.Settings[key].Value)).ForEach(
                key => {
                if (chosenDefaultPath != null)
                {
                    SaveSetting(key, Path.Combine(chosenDefaultPath, key));
                }
                else
                {
                    string error = key + ": unable to find a writable default path. Please check the previous Application warnings emitted by " + ServiceName + " or manually specify a writable path for " + key;
                    Logger.LogEvent(error, EventLogEntryType.Warning);
                    throw new Exception(error);
                }
            }
                );

            new List <string>()
            {
                INPUT_PATH, OUTPUT_PATH, PROCESSED_PATH, ERROR_PATH, SURFACE_PATH, ANALYSIS_PATH
            }.ForEach(key => Directory.CreateDirectory(configuration.AppSettings.Settings[key].Value));

            if (configuration.AppSettings.Settings[OUTPUT_FORMAT] is null)
            {
                SaveSetting(OUTPUT_FORMAT, OutputFormat.sdf.ToString());
            }

            Logger.LogEvent(configuration.AppSettings.Settings.AllKeys.Select(key => key + " " + configuration.AppSettings.Settings[key].Value).Aggregate((v1, v2) => string.Join(Environment.NewLine, new List <string> {
                v1, v2
            })));

            NetworkCredential NetworkCredential = CredentialManager.GetCredentials(ServiceName);

            if (!new List <string>()
            {
                CAS_API_ENDPOINT, OPTOPLUS_API_ENDPOINT
            }.All(key => configuration.AppSettings.Settings.AllKeys.Contains(key)) || NetworkCredential is null)
            {
                Environment.FailFast("Missing Parameter");
            }

            SDFWriter      = new SDFWriter(configuration.AppSettings.Settings[SURFACE_PATH].Value);
            HMFWriter      = new HMFWriter(configuration.AppSettings.Settings[SURFACE_PATH].Value);
            XYZWriter      = new XYZWriter(configuration.AppSettings.Settings[SURFACE_PATH].Value);
            OmaWriter      = new OmaWriter(configuration.AppSettings.Settings[OUTPUT_PATH].Value, configuration.AppSettings.Settings[GAX].Value, configuration.AppSettings.Settings[LAPGAX].Value);
            AnalysisWriter = new AnalysisWriter(configuration.AppSettings.Settings[ANALYSIS_PATH].Value);

            IAuthenticatingMessageInspector authenticatingMessageInspector = new AuthenticatingMessageInspector {
                HttpRequestMessageProperty = new HttpRequestMessageProperty()
            };

            LoggingMessageInspector   loggingMessageInspector  = new LoggingMessageInspector();
            ICallbackMessageInspector callbackMessageInspector = new CallbackMessageInspector();

            callbackMessageInspector.RequestCallbacks.Add(message => Logger.LogEvent("REQUEST " + message));
            callbackMessageInspector.ResponseCallbacks.Add(message => Logger.LogEvent("RESPONSE"));
            ICollection <IClientMessageInspector> inspectors = new Collection <IClientMessageInspector>()
            {
                authenticatingMessageInspector, loggingMessageInspector, callbackMessageInspector
            };
            ICollection <Action <HttpWebResponse> > handlers = new Collection <Action <HttpWebResponse> >()
            {
                HttpWebReponseHandler
            };
            ICollection <Action <FaultException> > faultHandlers = new Collection <Action <FaultException> >()
            {
                FaultHandler
            };
            ICollection <Action <Exception> > exceptionHandlers = new Collection <Action <Exception> >()
            {
                ExceptionHandler
            };

            IProvider <HttpClientHandler> HttpClientHandlerProvider = new HttpClientHandlerProvider();
            IProvider <HttpClient>        HttpClientProvider        = new HttpClientProvider(HttpClientHandlerProvider);
            IAuthenticationService        authenticationService     = new AuthenticationService(new Uri(new Uri(configuration.AppSettings.Settings[CAS_API_ENDPOINT].Value), "cas/v1/tickets/"), "optoplus", HttpClientProvider);
            CredentialSoap         credentialSoap         = ClientBaseUtils.InitClientBase <CredentialSoap, CredentialSoapClient>(new EndpointAddress(configuration.AppSettings.Settings[OPTOPLUS_API_ENDPOINT].Value + "/optoplus-services-web/CredentialSoap"), inspectors, handlers, faultHandlers, exceptionHandlers);
            CredentialGroupingSoap credentialGroupingSoap = ClientBaseUtils.InitClientBase <CredentialGroupingSoap, CredentialGroupingSoapClient>(new EndpointAddress(configuration.AppSettings.Settings[OPTOPLUS_API_ENDPOINT].Value + "/optoplus-services-web/CredentialGroupingSoap"), inspectors, handlers, faultHandlers, exceptionHandlers);
            LogoutSoap             logoutSoap             = ClientBaseUtils.InitClientBase <LogoutSoap, LogoutSoapClient>(new EndpointAddress(configuration.AppSettings.Settings[OPTOPLUS_API_ENDPOINT].Value + "/optoplus-services-web/LogoutSoap"), inspectors, handlers, faultHandlers, exceptionHandlers);

            SharedServiceProvider.Reset();
            SharedServiceProvider.Services.Clear();
            SharedServiceProvider.Services.AddSingleton(serviceProvider => HttpClientHandlerProvider);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => HttpClientProvider);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => authenticatingMessageInspector);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => loggingMessageInspector);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => callbackMessageInspector);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => authenticationService);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => credentialSoap);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => credentialGroupingSoap);
            SharedServiceProvider.Services.AddSingleton(serviceProvider => logoutSoap);

            RequestBuilder = new RequestBuilder(ProviderComputeSoap);

            Watcher          = new FileSystemWatcher(configuration.AppSettings.Settings[INPUT_PATH].Value, "*" + LdsFileExtension);
            Watcher.Created += Watcher_Created;
            Watcher.Renamed += Watcher_Renamed;

            LoginManager = new LoginManager(Logger, ServiceName, authenticationService, authenticatingMessageInspector, credentialSoap, credentialGroupingSoap);
            LoginManager.Login(10000, LoggedIn);
        }