         return progress
     }
 
-    public func lookupContent(for link: Link) -> LinkContentLookupResult? {
+    func lookupContent(for link: Link) -> LinkContentLookupResult? {
         guard let urlString = link.contents as? String, let url = URL(string: urlString) else { return nil }
 
         if let scheme = url.scheme, scheme == "https" || scheme == "http" {

        return .externalURL(url)
    }

    public func add(_ observer: AnnouncementsServiceObserver) {
        announcements.add(observer)
    }

    public func openAnnouncement(identifier: Announcement.Identifier, completionHandler: @escaping (Announcement) -> Void) {
        announcements.openAnnouncement(identifier: identifier, completionHandler: completionHandler)
    }

    public func fetchAnnouncementImage(identifier: Announcement.Identifier, completionHandler: @escaping (Data?) -> Void) {
        announcements.fetchAnnouncementImage(identifier: identifier, completionHandler: completionHandler)
    }

    public func add(_ observer: ConventionCountdownServiceObserver) {
        conventionCountdownController.observeDaysUntilConvention(using: observer)
    }

    public func add(_ observer: AuthenticationStateObserver) {
        authenticationCoordinator.add(observer)
    }


    }

    private var refreshObservers = [RefreshServiceObserver]()
    func add(_ observer: RefreshServiceObserver) {
        refreshObservers.append(observer)
    }

    func determineSessionState(completionHandler: @escaping (EurofurenceSessionState) -> Void) {
        let shouldPerformForceRefresh: Bool = forceRefreshRequired.isForceRefreshRequired
        let state: EurofurenceSessionState = {
            guard dataStore.getLastRefreshDate() != nil else { return .uninitialized }
