/// <summary>
        /// Loads and applies the configuration.
        /// </summary>
        private IConfigurationStorage LoadConfiguration()
        {
            var result        = Factory.Singleton.Resolve <IConfigurationStorage>().Singleton;
            var configuration = result.Load();

            var unusedServers = new List <IRebroadcastServer>(RebroadcastServers);

            foreach (var rebroadcastSettings in configuration.RebroadcastSettings)
            {
                if (rebroadcastSettings.Enabled)
                {
                    int indexExistingServer = unusedServers.FindIndex(r => r.Format == rebroadcastSettings.Format && r.BroadcastProvider.Port == rebroadcastSettings.Port);
                    if (indexExistingServer != -1)
                    {
                        unusedServers.RemoveAt(indexExistingServer);
                    }
                    else
                    {
                        var server = Factory.Singleton.Resolve <IRebroadcastServer>();
                        server.Listener                              = Listener;
                        server.BroadcastProvider                     = Factory.Singleton.Resolve <IBroadcastProvider>();
                        server.BroadcastProvider.Port                = rebroadcastSettings.Port;
                        server.BroadcastProvider.BroadcastSent      += BroadcastProvider_BroadcastSent;
                        server.BroadcastProvider.ClientConnected    += BroadcastProvider_ClientConnected;
                        server.BroadcastProvider.ClientDisconnected += BroadcastProvider_ClientDisconnected;
                        server.BroadcastProvider.ExceptionCaught    += BroadcastProvider_ExceptionCaught;
                        server.Format = rebroadcastSettings.Format;

                        RebroadcastServers.Add(server);
                        server.Initialise();

                        if (Online)
                        {
                            server.Online = true;
                        }
                    }
                }
            }

            foreach (var unusedServer in unusedServers)
            {
                RebroadcastServers.Remove(unusedServer);
                ReleaseServer(unusedServer);
            }

            return(result);
        }
        /// <summary>
        /// Finalises or disposes of the object.
        /// </summary>
        /// <param name="disposing"></param>
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_HookedConfigurationChanged)
                {
                    Factory.Singleton.Resolve <IConfigurationStorage>().Singleton.ConfigurationChanged -= ConfigurationStorage_ConfigurationChanged;
                    _HookedConfigurationChanged = false;
                }

                foreach (var server in RebroadcastServers)
                {
                    ReleaseServer(server);
                }
                RebroadcastServers.Clear();
            }
        }
        /// <summary>
        /// Loads and applies the configuration.
        /// </summary>
        private IConfigurationStorage LoadConfiguration()
        {
            var result        = Factory.Singleton.ResolveSingleton <IConfigurationStorage>();
            var configuration = result.Load();

            var feedManager = Factory.Singleton.ResolveSingleton <IFeedManager>();

            var unusedServers = new List <IRebroadcastServer>(RebroadcastServers);
            var newServers    = new List <RebroadcastSettings>();

            foreach (var rebroadcastSettings in configuration.RebroadcastSettings)
            {
                var feed = feedManager.GetByUniqueId(rebroadcastSettings.ReceiverId, ignoreInvisibleFeeds: false);
                if (feed != null && rebroadcastSettings.Enabled)
                {
                    var server = RebroadcastServers.FirstOrDefault(r => r.UniqueId == rebroadcastSettings.UniqueId);
                    if (server != null)
                    {
                        if (server.SendIntervalMilliseconds != rebroadcastSettings.SendIntervalMilliseconds)
                        {
                            server.SendIntervalMilliseconds = rebroadcastSettings.SendIntervalMilliseconds;
                        }
                    }
                    if (server != null && server.Connector != null)
                    {
                        var milliseconds = rebroadcastSettings.StaleSeconds * 1000;
                        if (server.Connector.StaleMessageTimeout != milliseconds)
                        {
                            server.Connector.StaleMessageTimeout = milliseconds;
                        }
                    }

                    int indexExistingServer = unusedServers.FindIndex(r =>
                                                                      r.Format == rebroadcastSettings.Format &&
                                                                      r.Connector.Port == rebroadcastSettings.Port &&
                                                                      r.UniqueId == rebroadcastSettings.UniqueId &&
                                                                      r.Feed.UniqueId == feed.UniqueId &&
                                                                      r.Connector.IsPassive == !rebroadcastSettings.IsTransmitter &&
                                                                      (!rebroadcastSettings.IsTransmitter || r.Connector.Address == rebroadcastSettings.TransmitAddress) &&
                                                                      (rebroadcastSettings.IsTransmitter || Object.Equals(r.Connector.Access, rebroadcastSettings.Access)) &&
                                                                      r.Connector.UseKeepAlive == rebroadcastSettings.UseKeepAlive &&
                                                                      (r.Connector.UseKeepAlive || r.Connector.IdleTimeout == rebroadcastSettings.IdleTimeoutMilliseconds)
                                                                      );
                    if (indexExistingServer == -1)
                    {
                        newServers.Add(rebroadcastSettings);
                    }
                    else
                    {
                        var existingServer = unusedServers[indexExistingServer];
                        existingServer.Name = rebroadcastSettings.Name;
                        ConfigureAuthentication(rebroadcastSettings, existingServer);

                        unusedServers.RemoveAt(indexExistingServer);
                    }
                }
            }

            foreach (var unusedServer in unusedServers)
            {
                RebroadcastServers.Remove(unusedServer);
                ReleaseServer(unusedServer);
            }

            foreach (var rebroadcastSettings in newServers)
            {
                var feed   = feedManager.GetByUniqueId(rebroadcastSettings.ReceiverId, ignoreInvisibleFeeds: false);
                var server = Factory.Singleton.Resolve <IRebroadcastServer>();
                server.UniqueId       = rebroadcastSettings.UniqueId;
                server.Name           = rebroadcastSettings.Name;
                server.Feed           = feed;
                server.Connector      = Factory.Singleton.Resolve <INetworkConnector>();
                server.Connector.Name = rebroadcastSettings.Name;
                server.Connector.Port = rebroadcastSettings.Port;
                server.Connector.StaleMessageTimeout = rebroadcastSettings.StaleSeconds * 1000;
                server.Connector.Access = rebroadcastSettings.Access;
                server.Connector.ConnectionEstablished += Connector_ClientConnected;
                server.Connector.ConnectionClosed      += Connector_ClientDisconnected;
                server.Connector.UseKeepAlive           = rebroadcastSettings.UseKeepAlive;
                server.Format = rebroadcastSettings.Format;
                server.SendIntervalMilliseconds = rebroadcastSettings.SendIntervalMilliseconds;

                ConfigureAuthentication(rebroadcastSettings, server);

                if (!rebroadcastSettings.UseKeepAlive)
                {
                    server.Connector.IdleTimeout = rebroadcastSettings.IdleTimeoutMilliseconds;
                }

                if (!rebroadcastSettings.IsTransmitter)
                {
                    server.Connector.IsPassive          = true;
                    server.Connector.IsSingleConnection = false;
                }
                else
                {
                    server.Connector.IsPassive          = false;
                    server.Connector.IsSingleConnection = true;
                    server.Connector.Address            = rebroadcastSettings.TransmitAddress;
                }

                RebroadcastServers.Add(server);
                server.Initialise();

                if (Online)
                {
                    server.Online = true;
                }
            }

            return(result);
        }